Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rollup of 22 pull requests #52882

Closed
wants to merge 63 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
4c2e314
added DerefOption and DerefResult + tests to std
Xandkeeper Apr 26, 2018
6c7ea4c
refactored to implement without trait
Xandkeeper Apr 27, 2018
527e84f
cleaned up #[unstable] attributes
Xandkeeper Apr 27, 2018
b812d44
added #![feature(inner_deref)] to enable inner_deref-related unit tests
Xandkeeper Apr 27, 2018
2bf9fbc
separated inner_deref Result impls
Xandkeeper Apr 27, 2018
8aa049e
moved #![feature(inner_deref) to from libcore crate to libcore tests …
Xandkeeper Apr 27, 2018
1712448
fixed inner_deref test case for None
Xandkeeper Apr 27, 2018
c025fde
fixed some and added more tests
Xandkeeper Apr 30, 2018
e1d5509
Added comments providing justification for support of calling deref_*…
Xandkeeper May 3, 2018
6a78c0a
resolved conflict with upstream commit
Xandkeeper May 6, 2018
acdafa0
Document From conversions for OsString and OsStr
cypher Jul 11, 2018
b81ee0b
Document From conversions for CString and CStr
cypher Jul 11, 2018
d70bc8f
AMDGPU call abi info.
DiamondLovesYou Jul 19, 2018
9d3ba6e
Actually enable the amdgpu component if present.
DiamondLovesYou Jul 19, 2018
3170507
AMDGPU ignores `noinline` when it slaps `alwaysinline` everywhere.
DiamondLovesYou Jul 19, 2018
d992a94
Fix an AMDGPU related load bit range metadata assertion.
DiamondLovesYou Jul 19, 2018
ed5edcb
Seperate summaries from rest of the comment
cypher Jul 23, 2018
7fb0a52
Update clippy to latest master
cmdln Jul 26, 2018
922bf1d
Clarify thread::park semantics
matklad Jul 27, 2018
5f87f78
Fix ws
matklad Jul 27, 2018
b6d3143
pretty print for std::collections::vecdeque
fukatani Jul 29, 2018
ea25cf1
Fix From<LocalWaker>
MajorBreakfast Jul 29, 2018
9ccd7ee
Fix -Wpessimizing-move warnings in rustllvm/PassWrapper
varkor Jul 29, 2018
90165b8
Make sure #47772 does not regress
RalfJung Jul 29, 2018
9845ee0
fix coding style
fukatani Jul 29, 2018
2b25ee0
update comment
toidiu Jul 30, 2018
2994b27
Add timeout to use of `curl` in bootstrap.py.
kennytm Jul 30, 2018
56016cb
resolved upstream merge conflicts
Xandkeeper Jul 30, 2018
c57deb9
Remove references to AUTHORS.txt file
dsciarra Jul 29, 2018
f162438
Revert "Stabilize to_bytes and from_bytes for integers."
SimonSapin Jul 30, 2018
f8d1dc8
improve --stage documentation
RalfJung Jul 30, 2018
aa7d7d0
improve test stage documentation
RalfJung Jul 30, 2018
ca762ba
rustc: Disallow machine applicability in foreign macros
alexcrichton Jul 26, 2018
7a86938
update books for new release
steveklabnik Jul 30, 2018
d933174
releases.md: fix 2 typos
matthiaskrgr Jul 30, 2018
b6b025b
Fix wrong issue number in the test name
Jul 30, 2018
d8b3c83
Remove the unstable std_unicode crate, deprecated since 1.27
SimonSapin Jul 26, 2018
4ca77f7
Remove unstable and deprecated APIs
SimonSapin Jul 26, 2018
cbbcecb
Implement Unpin for FutureObj and LocalFutureObj
cramertj Jul 30, 2018
d5f1f70
Fix Alias intra doc ICE
GuillaumeGomez Jul 29, 2018
620c4fd
Delete unused code in rustdoc
Mark-Simulacrum Jul 22, 2018
c180736
Rollup merge of #50267 - humanenginuity:master, r=alexcrichton
Mark-Simulacrum Jul 30, 2018
e427459
Rollup merge of #52340 - cypher:document-from-trait-in-ffi, r=stevekl…
Mark-Simulacrum Jul 30, 2018
2d4e714
Rollup merge of #52514 - DiamondLovesYou:amdgpu-fixes, r=nagisa
Mark-Simulacrum Jul 30, 2018
a928975
Rollup merge of #52630 - Mark-Simulacrum:rustdoc-cleanup-2, r=QuietMi…
Mark-Simulacrum Jul 30, 2018
0b8f644
Rollup merge of #52732 - SimonSapin:spring, r=Mark-Simulacrum
Mark-Simulacrum Jul 30, 2018
a3304e7
Rollup merge of #52745 - commandline:master, r=oli-obk
Mark-Simulacrum Jul 30, 2018
a46fc0b
Rollup merge of #52756 - alexcrichton:cap-applicable, r=oli-obk
Mark-Simulacrum Jul 30, 2018
1ffee37
Rollup merge of #52771 - matklad:patch-1, r=kennytm
Mark-Simulacrum Jul 30, 2018
f56f07a
Rollup merge of #52821 - fukatani:gdb-vecdeque-print, r=michaelwoerister
Mark-Simulacrum Jul 30, 2018
30f0ab5
Rollup merge of #52822 - MajorBreakfast:fix-from-local-waker, r=cramertj
Mark-Simulacrum Jul 30, 2018
6e56dcd
Rollup merge of #52824 - varkor:fix-llvm-ret-move-warnings, r=rkruppe
Mark-Simulacrum Jul 30, 2018
0fa7c12
Rollup merge of #52825 - RalfJung:codegen, r=alexcrichton
Mark-Simulacrum Jul 30, 2018
1443991
Rollup merge of #52831 - dsciarra:rm-ref-to-author-file, r=alexcrichton
Mark-Simulacrum Jul 30, 2018
9c10b79
Rollup merge of #52835 - GuillaumeGomez:ice-rustdoc-links, r=varkor
Mark-Simulacrum Jul 30, 2018
406c7f5
Rollup merge of #52842 - toidiu:ak-commentUpdate, r=estebank
Mark-Simulacrum Jul 30, 2018
074127c
Rollup merge of #52846 - kennytm:bootstrap-curl-timeout, r=Mark-Simul…
Mark-Simulacrum Jul 30, 2018
92c3e40
Rollup merge of #52850 - SimonSapin:unstablize, r=alexcrichton
Mark-Simulacrum Jul 30, 2018
cc107c7
Rollup merge of #52853 - RalfJung:bootstrap-help, r=alexcrichton
Mark-Simulacrum Jul 30, 2018
b5c3dbc
Rollup merge of #52863 - steveklabnik:update-books, r=Mark-Simulacrum
Mark-Simulacrum Jul 30, 2018
97cb818
Rollup merge of #52867 - matthiaskrgr:release_typos, r=Mark-Simulacrum
Mark-Simulacrum Jul 30, 2018
415cc0d
Rollup merge of #52870 - cramertj:unpin-futureobj, r=aturon
Mark-Simulacrum Jul 30, 2018
baf6b76
Rollup merge of #52878 - mikhail-m1:master, r=kennytm
Mark-Simulacrum Jul 30, 2018
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions COPYRIGHT
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ Copyrights in the Rust project are retained by their contributors. No
copyright assignment is required to contribute to the Rust project.

Some files include explicit copyright notices and/or license notices.
For full authorship information, see AUTHORS.txt and the version control
history.
For full authorship information, see the version control history or
https://thanks.rust-lang.org

Except as otherwise noted (below and/or in individual files), Rust is
licensed under the Apache License, Version 2.0 <LICENSE-APACHE> or
Expand Down
4 changes: 2 additions & 2 deletions RELEASES.md
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ Version 1.27.0 (2018-06-21)
Language
--------
- [Removed 'proc' from the reserved keywords list.][49699] This allows `proc` to
be used as an identifer.
be used as an identifier.
- [The dyn syntax is now available.][49968] This syntax is equivalent to the
bare `Trait` syntax, and should make it clearer when being used in tandem with
`impl Trait`. Since it is equivalent to the following syntax:
Expand Down Expand Up @@ -4795,7 +4795,7 @@ Language
--------

* Patterns with `ref mut` now correctly invoke [`DerefMut`] when
matching against dereferencable values.
matching against dereferenceable values.

Libraries
---------
Expand Down
9 changes: 0 additions & 9 deletions src/Cargo.lock
Original file line number Diff line number Diff line change
Expand Up @@ -2615,18 +2615,9 @@ dependencies = [
"rustc_lsan 0.0.0",
"rustc_msan 0.0.0",
"rustc_tsan 0.0.0",
"std_unicode 0.0.0",
"unwind 0.0.0",
]

[[package]]
name = "std_unicode"
version = "0.0.0"
dependencies = [
"compiler_builtins 0.0.0",
"core 0.0.0",
]

[[package]]
name = "string_cache"
version = "0.7.3"
Expand Down
5 changes: 4 additions & 1 deletion src/bootstrap/bootstrap.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,10 @@ def _download(path, url, probably_big, verbose, exception):
option = "-#"
else:
option = "-s"
run(["curl", option, "--retry", "3", "-Sf", "-o", path, url],
run(["curl", option,
"-y", "30", "-Y", "10", # timeout if speed is < 10 bytes/sec for > 30 seconds
"--connect-timeout", "30", # timeout if cannot connect within 30 seconds
"--retry", "3", "-Sf", "-o", path, url],
verbose=verbose,
exception=exception)

Expand Down
1 change: 0 additions & 1 deletion src/bootstrap/compile.rs
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,6 @@ pub fn std_cargo(builder: &Builder,
cargo.arg("--features").arg("c mem")
.args(&["-p", "alloc"])
.args(&["-p", "compiler_builtins"])
.args(&["-p", "std_unicode"])
.arg("--manifest-path")
.arg(builder.src.join("src/rustc/compiler_builtins_shim/Cargo.toml"));
} else {
Expand Down
1 change: 0 additions & 1 deletion src/bootstrap/dist.rs
Original file line number Diff line number Diff line change
Expand Up @@ -856,7 +856,6 @@ impl Step for Src {
"src/librustc_msan",
"src/librustc_tsan",
"src/libstd",
"src/libstd_unicode",
"src/libunwind",
"src/rustc/compiler_builtins_shim",
"src/rustc/libc_shim",
Expand Down
2 changes: 1 addition & 1 deletion src/bootstrap/doc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -489,7 +489,7 @@ impl Step for Std {
// Keep a whitelist so we do not build internal stdlib crates, these will be
// build by the rustc step later if enabled.
cargo.arg("--no-deps");
for krate in &["alloc", "core", "std", "std_unicode"] {
for krate in &["alloc", "core", "std"] {
cargo.arg("-p").arg(krate);
// Create all crate output directories first to make sure rustdoc uses
// relative links.
Expand Down
13 changes: 10 additions & 3 deletions src/bootstrap/flags.rs
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,10 @@ To learn more about a subcommand, run `./x.py <subcommand> -h`"
opts.optmulti("", "exclude", "build paths to exclude", "PATH");
opts.optopt("", "on-fail", "command to run on failure", "CMD");
opts.optflag("", "dry-run", "dry run; don't build anything");
opts.optopt("", "stage", "stage to build", "N");
opts.optopt("", "stage",
"stage to build (indicates compiler to use/test, e.g. stage 0 uses the \
bootstrap compiler, stage 1 the stage 0 rustc artifacts, etc.)",
"N");
opts.optmulti("", "keep-stage", "stage(s) to keep without recompiling", "N");
opts.optopt("", "src", "path to the root of the rust checkout", "DIR");
opts.optopt("j", "jobs", "number of jobs to run in parallel", "JOBS");
Expand Down Expand Up @@ -258,7 +261,7 @@ Arguments:

./x.py build --stage 1 src/libtest

This will first build everything once (like --stage 0 without further
This will first build everything once (like `--stage 0` without further
arguments would), and then use the compiler built in stage 0 to build
src/libtest and its dependencies.
Once this is done, build/$ARCH/stage1 contains a usable compiler.",
Expand Down Expand Up @@ -290,10 +293,14 @@ Arguments:

./x.py test src/test/run-pass
./x.py test src/libstd --test-args hash_map
./x.py test src/libstd --stage 0
./x.py test src/libstd --stage 0 --no-doc
./x.py test src/test/ui --bless
./x.py test src/test/ui --compare-mode nll

Note that `test src/test/* --stage N` does NOT depend on `build src/rustc --stage N`;
just like `build src/libstd --stage N` it tests the compiler produced by the previous
stage.

If no arguments are passed then the complete artifacts for that stage are
compiled and tested.

Expand Down
2 changes: 1 addition & 1 deletion src/doc/man/rustdoc.1
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ See <\fBhttps://github.com/rust\-lang/rust/issues\fR>
for issues.

.SH "AUTHOR"
See \fIAUTHORS.txt\fR in the Rust source distribution.
See the version control history or <\fBhttps://thanks.rust\-lang.org\fR>

.SH "COPYRIGHT"
This work is dual\[hy]licensed under Apache\ 2.0 and MIT terms.
Expand Down
2 changes: 1 addition & 1 deletion src/doc/nomicon
33 changes: 33 additions & 0 deletions src/etc/debugger_pretty_printers_common.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
TYPE_KIND_FIXED_SIZE_VEC = 16
TYPE_KIND_REGULAR_UNION = 17
TYPE_KIND_OS_STRING = 18
TYPE_KIND_STD_VECDEQUE = 19

ENCODED_ENUM_PREFIX = "RUST$ENCODED$ENUM$"
ENUM_DISR_FIELD_NAME = "RUST$ENUM$DISR"
Expand All @@ -62,6 +63,14 @@
STD_VEC_FIELD_NAMES = [STD_VEC_FIELD_NAME_BUF,
STD_VEC_FIELD_NAME_LENGTH]

# std::collections::VecDeque<> related constants
STD_VECDEQUE_FIELD_NAME_TAIL = "tail"
STD_VECDEQUE_FIELD_NAME_HEAD = "head"
STD_VECDEQUE_FIELD_NAME_BUF = "buf"
STD_VECDEQUE_FIELD_NAMES = [STD_VECDEQUE_FIELD_NAME_TAIL,
STD_VECDEQUE_FIELD_NAME_HEAD,
STD_VECDEQUE_FIELD_NAME_BUF]

# std::String related constants
STD_STRING_FIELD_NAMES = ["vec"]

Expand Down Expand Up @@ -161,6 +170,11 @@ def __classify_struct(self):
self.__conforms_to_field_layout(STD_VEC_FIELD_NAMES)):
return TYPE_KIND_STD_VEC

# STD COLLECTION VECDEQUE
if (unqualified_type_name.startswith("VecDeque<") and
self.__conforms_to_field_layout(STD_VECDEQUE_FIELD_NAMES)):
return TYPE_KIND_STD_VECDEQUE

# STD STRING
if (unqualified_type_name.startswith("String") and
self.__conforms_to_field_layout(STD_STRING_FIELD_NAMES)):
Expand Down Expand Up @@ -325,6 +339,25 @@ def extract_length_ptr_and_cap_from_std_vec(vec_val):
assert data_ptr.type.get_dwarf_type_kind() == DWARF_TYPE_CODE_PTR
return (length, data_ptr, capacity)


def extract_tail_head_ptr_and_cap_from_std_vecdeque(vec_val):
assert vec_val.type.get_type_kind() == TYPE_KIND_STD_VECDEQUE
tail_field_index = STD_VECDEQUE_FIELD_NAMES.index(STD_VECDEQUE_FIELD_NAME_TAIL)
head_field_index = STD_VECDEQUE_FIELD_NAMES.index(STD_VECDEQUE_FIELD_NAME_HEAD)
buf_field_index = STD_VECDEQUE_FIELD_NAMES.index(STD_VECDEQUE_FIELD_NAME_BUF)

tail = vec_val.get_child_at_index(tail_field_index).as_integer()
head = vec_val.get_child_at_index(head_field_index).as_integer()
buf = vec_val.get_child_at_index(buf_field_index)

vec_ptr_val = buf.get_child_at_index(0)
capacity = buf.get_child_at_index(1).as_integer()
unique_ptr_val = vec_ptr_val.get_child_at_index(0)
data_ptr = unique_ptr_val.get_child_at_index(0)
assert data_ptr.type.get_dwarf_type_kind() == DWARF_TYPE_CODE_PTR
return (tail, head, data_ptr, capacity)


def extract_length_and_ptr_from_slice(slice_val):
assert (slice_val.type.get_type_kind() == TYPE_KIND_SLICE or
slice_val.type.get_type_kind() == TYPE_KIND_STR_SLICE)
Expand Down
25 changes: 25 additions & 0 deletions src/etc/gdb_rust_pretty_printing.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,9 @@ def rust_pretty_printer_lookup_function(gdb_val):
if type_kind == rustpp.TYPE_KIND_STD_VEC:
return RustStdVecPrinter(val)

if type_kind == rustpp.TYPE_KIND_STD_VECDEQUE:
return RustStdVecDequePrinter(val)

if type_kind == rustpp.TYPE_KIND_STD_STRING:
return RustStdStringPrinter(val)

Expand Down Expand Up @@ -274,6 +277,28 @@ def children(self):
yield (str(index), (gdb_ptr + index).dereference())


class RustStdVecDequePrinter(object):
def __init__(self, val):
self.__val = val

@staticmethod
def display_hint():
return "array"

def to_string(self):
(tail, head, data_ptr, cap) = \
rustpp.extract_tail_head_ptr_and_cap_from_std_vecdeque(self.__val)
return (self.__val.type.get_unqualified_type_name() +
("(len: %i, cap: %i)" % (head - tail, cap)))

def children(self):
(tail, head, data_ptr, cap) = \
rustpp.extract_tail_head_ptr_and_cap_from_std_vecdeque(self.__val)
gdb_ptr = data_ptr.get_wrapped_value()
for index in xrange(tail, head):
yield (str(index), (gdb_ptr + index).dereference())


class RustStdStringPrinter(object):
def __init__(self, val):
self.__val = val
Expand Down
127 changes: 0 additions & 127 deletions src/libcore/char/decode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,135 +11,8 @@
//! UTF-8 and UTF-16 decoding iterators

use fmt;
use iter::FusedIterator;
use super::from_u32_unchecked;

/// An iterator over an iterator of bytes of the characters the bytes represent
/// as UTF-8
#[unstable(feature = "decode_utf8", issue = "33906")]
#[rustc_deprecated(since = "1.27.0", reason = "Use str::from_utf8 instead:
https://doc.rust-lang.org/nightly/std/str/struct.Utf8Error.html#examples")]
#[derive(Clone, Debug)]
#[allow(deprecated)]
pub struct DecodeUtf8<I: Iterator<Item = u8>>(::iter::Peekable<I>);

/// Decodes an `Iterator` of bytes as UTF-8.
#[unstable(feature = "decode_utf8", issue = "33906")]
#[rustc_deprecated(since = "1.27.0", reason = "Use str::from_utf8 instead:
https://doc.rust-lang.org/nightly/std/str/struct.Utf8Error.html#examples")]
#[allow(deprecated)]
#[inline]
pub fn decode_utf8<I: IntoIterator<Item = u8>>(i: I) -> DecodeUtf8<I::IntoIter> {
DecodeUtf8(i.into_iter().peekable())
}

/// `<DecodeUtf8 as Iterator>::next` returns this for an invalid input sequence.
#[unstable(feature = "decode_utf8", issue = "33906")]
#[rustc_deprecated(since = "1.27.0", reason = "Use str::from_utf8 instead:
https://doc.rust-lang.org/nightly/std/str/struct.Utf8Error.html#examples")]
#[derive(PartialEq, Eq, Debug)]
#[allow(deprecated)]
pub struct InvalidSequence(());

#[unstable(feature = "decode_utf8", issue = "33906")]
#[allow(deprecated)]
impl<I: Iterator<Item = u8>> Iterator for DecodeUtf8<I> {
type Item = Result<char, InvalidSequence>;
#[inline]

fn next(&mut self) -> Option<Result<char, InvalidSequence>> {
self.0.next().map(|first_byte| {
// Emit InvalidSequence according to
// Unicode §5.22 Best Practice for U+FFFD Substitution
// http://www.unicode.org/versions/Unicode9.0.0/ch05.pdf#G40630

// Roughly: consume at least one byte,
// then validate one byte at a time and stop before the first unexpected byte
// (which might be the valid start of the next byte sequence).

let mut code_point;
macro_rules! first_byte {
($mask: expr) => {
code_point = u32::from(first_byte & $mask)
}
}
macro_rules! continuation_byte {
() => { continuation_byte!(0x80..=0xBF) };
($range: pat) => {
match self.0.peek() {
Some(&byte @ $range) => {
code_point = (code_point << 6) | u32::from(byte & 0b0011_1111);
self.0.next();
}
_ => return Err(InvalidSequence(()))
}
}
}

match first_byte {
0x00..=0x7F => {
first_byte!(0b1111_1111);
}
0xC2..=0xDF => {
first_byte!(0b0001_1111);
continuation_byte!();
}
0xE0 => {
first_byte!(0b0000_1111);
continuation_byte!(0xA0..=0xBF); // 0x80..=0x9F here are overlong
continuation_byte!();
}
0xE1..=0xEC | 0xEE..=0xEF => {
first_byte!(0b0000_1111);
continuation_byte!();
continuation_byte!();
}
0xED => {
first_byte!(0b0000_1111);
continuation_byte!(0x80..=0x9F); // 0xA0..0xBF here are surrogates
continuation_byte!();
}
0xF0 => {
first_byte!(0b0000_0111);
continuation_byte!(0x90..=0xBF); // 0x80..0x8F here are overlong
continuation_byte!();
continuation_byte!();
}
0xF1..=0xF3 => {
first_byte!(0b0000_0111);
continuation_byte!();
continuation_byte!();
continuation_byte!();
}
0xF4 => {
first_byte!(0b0000_0111);
continuation_byte!(0x80..=0x8F); // 0x90..0xBF here are beyond char::MAX
continuation_byte!();
continuation_byte!();
}
_ => return Err(InvalidSequence(())) // Illegal first byte, overlong, or beyond MAX
}
unsafe {
Ok(from_u32_unchecked(code_point))
}
})
}

#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
let (lower, upper) = self.0.size_hint();

// A code point is at most 4 bytes long.
let min_code_points = lower / 4;

(min_code_points, upper)
}
}

#[unstable(feature = "decode_utf8", issue = "33906")]
#[allow(deprecated)]
impl<I: FusedIterator<Item = u8>> FusedIterator for DecodeUtf8<I> {}

/// An iterator that decodes UTF-16 encoded code points from an iterator of `u16`s.
#[stable(feature = "decode_utf16", since = "1.9.0")]
#[derive(Clone, Debug)]
Expand Down
5 changes: 0 additions & 5 deletions src/libcore/char/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,6 @@ pub use self::decode::{decode_utf16, DecodeUtf16, DecodeUtf16Error};
pub use unicode::tables::UNICODE_VERSION;
#[unstable(feature = "unicode_version", issue = "49726")]
pub use unicode::version::UnicodeVersion;
#[unstable(feature = "decode_utf8", issue = "33906")]
#[rustc_deprecated(since = "1.27.0", reason = "Use str::from_utf8 instead:
https://doc.rust-lang.org/nightly/std/str/struct.Utf8Error.html#examples")]
#[allow(deprecated)]
pub use self::decode::{decode_utf8, DecodeUtf8, InvalidSequence};

use fmt::{self, Write};
use iter::FusedIterator;
Expand Down
Loading