1. Make sure you have installed the dependencies:
* `g++` 4.7 or `clang++` 3.x
* `python` 2.6 or later (but not 3.x)
- * `perl` 5.0 or later
* GNU `make` 3.81 or later
* `curl`
* `git`
opt libcpp 1 "build with llvm with libc++ instead of libstdc++ when using clang"
opt llvm-assertions 1 "build LLVM with assertions"
opt debug 1 "build with extra debug fun"
-opt ratchet-bench 0 "ratchet benchmarks"
opt fast-make 0 "use .gitmodules as timestamp for submodule deps"
opt ccache 0 "invoke gcc/clang via ccache to reuse object files between builds"
opt local-rust 0 "use an installed rustc rather than downloading a snapshot"
step_msg "looking for build programs"
-probe_need CFG_PERL perl
probe_need CFG_CURLORWGET curl wget
probe_need CFG_PYTHON python2.7 python2.6 python2 python
done
# Munge any paths that appear in config.mk back to posix-y
-perl -i.bak -p -e 's@ ([a-zA-Z]):[/\\]@ /\1/@go;' config.tmp
+sed -i.bak -e 's@ \([a-zA-Z]\):[/\\]@ /\1/@g;' config.tmp
rm -f config.tmp.bak
msg
--- /dev/null
+# aarch64-linux-android configuration
+# CROSS_PREFIX_aarch64-linux-android-
+CC_aarch64-linux-android=$(CFG_ANDROID_CROSS_PATH)/bin/aarch64-linux-android-gcc
+CXX_aarch64-linux-android=$(CFG_ANDROID_CROSS_PATH)/bin/aarch64-linux-android-g++
+CPP_aarch64-linux-android=$(CFG_ANDROID_CROSS_PATH)/bin/aarch64-linux-android-gcc -E
+AR_aarch64-linux-android=$(CFG_ANDROID_CROSS_PATH)/bin/aarch64-linux-android-ar
+CFG_LIB_NAME_aarch64-linux-android=lib$(1).so
+CFG_STATIC_LIB_NAME_aarch64-linux-android=lib$(1).a
+CFG_LIB_GLOB_aarch64-linux-android=lib$(1)-*.so
+CFG_LIB_DSYM_GLOB_aarch64-linux-android=lib$(1)-*.dylib.dSYM
+CFG_JEMALLOC_CFLAGS_aarch64-linux-android := -D__aarch64__ -DANDROID -D__ANDROID__ $(CFLAGS)
+CFG_GCCISH_CFLAGS_aarch64-linux-android := -Wall -g -fPIC -D__aarch64__ -DANDROID -D__ANDROID__ $(CFLAGS)
+CFG_GCCISH_CXXFLAGS_aarch64-linux-android := -fno-rtti $(CXXFLAGS)
+CFG_GCCISH_LINK_FLAGS_aarch64-linux-android := -shared -fPIC -ldl -g -lm -lsupc++
+CFG_GCCISH_DEF_FLAG_aarch64-linux-android := -Wl,--export-dynamic,--dynamic-list=
+CFG_GCCISH_PRE_LIB_FLAGS_aarch64-linux-android := -Wl,-whole-archive
+CFG_GCCISH_POST_LIB_FLAGS_aarch64-linux-android := -Wl,-no-whole-archive
+CFG_DEF_SUFFIX_aarch64-linux-android := .android.def
+CFG_LLC_FLAGS_aarch64-linux-android :=
+CFG_INSTALL_NAME_aarch64-linux-android =
+CFG_EXE_SUFFIX_aarch64-linux-android :=
+CFG_WINDOWSY_aarch64-linux-android :=
+CFG_UNIXY_aarch64-linux-android := 1
+CFG_PATH_MUNGE_aarch64-linux-android := true
+CFG_LDPATH_aarch64-linux-android :=
+CFG_RUN_aarch64-linux-android=
+CFG_RUN_TARG_aarch64-linux-android=
+RUSTC_FLAGS_aarch64-linux-android :=
+RUSTC_CROSS_FLAGS_aarch64-linux-android :=
+CFG_GNU_TRIPLE_aarch64-linux-android := aarch64-linux-android
JEMALLOC_ARGS_$(1) := --disable-tls
else ifeq ($(OSTYPE_$(1)), linux-androideabi)
JEMALLOC_ARGS_$(1) := --disable-tls
+else ifeq ($(OSTYPE_$(1)), linux-android)
+ JEMALLOC_ARGS_$(1) := --disable-tls
endif
################################################################################
| grep '^$(S)src/libbacktrace' -v \
| grep '^$(S)src/rust-installer' -v \
| xargs $(CFG_PYTHON) $(S)src/etc/check-binaries.py
+ $(Q) $(CFG_PYTHON) $(S)src/etc/errorck.py $(S)src/
endif
use std::str::FromStr;
use regex::Regex;
-#[derive(Clone, PartialEq)]
+#[derive(Clone, PartialEq, Debug)]
pub enum Mode {
CompileFail,
RunFail,
}
}
-impl fmt::String for Mode {
+impl fmt::Display for Mode {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt(match *self {
+ fmt::Display::fmt(match *self {
CompileFail => "compile-fail",
RunFail => "run-fail",
RunPass => "run-pass",
}
}
-impl fmt::Show for Mode {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt(self, f)
- }
-}
-
#[derive(Clone)]
pub struct Config {
// The library paths required for running the compiler
// Write out a parseable log of tests that were run
pub logfile: Option<Path>,
- // Write out a json file containing any metrics of the run
- pub save_metrics: Option<Path>,
-
- // Write and ratchet a metrics file
- pub ratchet_metrics: Option<Path>,
-
- // Percent change in metrics to consider noise
- pub ratchet_noise_percent: Option<f64>,
-
- // "Shard" of the testsuite to pub run: this has the form of
- // two numbers (a,b), and causes only those tests with
- // positional order equal to a mod b to run.
- pub test_shard: Option<(uint,uint)>,
-
// A command line to prefix program execution with,
// for running under valgrind
pub runtool: Option<String>,
optopt("", "target-rustcflags", "flags to pass to rustc for target", "FLAGS"),
optflag("", "verbose", "run tests verbosely, showing all output"),
optopt("", "logfile", "file to log test execution to", "FILE"),
- optopt("", "save-metrics", "file to save metrics to", "FILE"),
- optopt("", "ratchet-metrics", "file to ratchet metrics against", "FILE"),
- optopt("", "ratchet-noise-percent",
- "percent change in metrics to consider noise", "N"),
optflag("", "jit", "run tests under the JIT"),
optopt("", "target", "the target to build for", "TARGET"),
optopt("", "host", "the host to build for", "HOST"),
optopt("", "adb-path", "path to the android debugger", "PATH"),
optopt("", "adb-test-dir", "path to tests for the android debugger", "PATH"),
optopt("", "lldb-python-dir", "directory containing LLDB's python module", "PATH"),
- optopt("", "test-shard", "run shard A, of B shards, worth of the testsuite", "A.B"),
optflag("h", "help", "show this message"));
assert!(!args.is_empty());
filter: filter,
cfail_regex: Regex::new(errors::EXPECTED_PATTERN).unwrap(),
logfile: matches.opt_str("logfile").map(|s| Path::new(s)),
- save_metrics: matches.opt_str("save-metrics").map(|s| Path::new(s)),
- ratchet_metrics:
- matches.opt_str("ratchet-metrics").map(|s| Path::new(s)),
- ratchet_noise_percent:
- matches.opt_str("ratchet-noise-percent")
- .and_then(|s| s.as_slice().parse::<f64>()),
runtool: matches.opt_str("runtool"),
host_rustcflags: matches.opt_str("host-rustcflags"),
target_rustcflags: matches.opt_str("target-rustcflags"),
opt_str2(matches.opt_str("adb-test-dir")).as_slice() &&
!opt_str2(matches.opt_str("adb-test-dir")).is_empty(),
lldb_python_dir: matches.opt_str("lldb-python-dir"),
- test_shard: test::opt_shard(matches.opt_str("test-shard")),
verbose: matches.opt_present("verbose"),
}
}
logv(c, format!("adb_test_dir: {:?}", config.adb_test_dir));
logv(c, format!("adb_device_status: {}",
config.adb_device_status));
- match config.test_shard {
- None => logv(c, "test_shard: (all)".to_string()),
- Some((a,b)) => logv(c, format!("test_shard: {}.{}", a, b))
- }
logv(c, format!("verbose: {}", config.verbose));
logv(c, format!("\n"));
}
logfile: config.logfile.clone(),
run_tests: true,
run_benchmarks: true,
- ratchet_metrics: config.ratchet_metrics.clone(),
- ratchet_noise_percent: config.ratchet_noise_percent.clone(),
- save_metrics: config.save_metrics.clone(),
- test_shard: config.test_shard.clone(),
nocapture: false,
color: test::AutoColor,
- show_boxplot: false,
- boxplot_width: 50,
- show_all_stats: false,
}
}
let aux_dir = aux_output_dir_name(config, testfile);
// FIXME (#9639): This needs to handle non-utf8 paths
let mut args = vec!("-".to_string(),
+ "-Zunstable-options".to_string(),
"--pretty".to_string(),
pretty_type,
format!("--target={}", config.target),
};
// FIXME (#9639): This needs to handle non-utf8 paths
let mut args = vec!("-".to_string(),
- "--no-trans".to_string(),
+ "-Zno-trans".to_string(),
"--crate-type=lib".to_string(),
format!("--target={}", target),
"-L".to_string(),
// Add line breakpoints
for line in breakpoint_lines.iter() {
- script_str.push_str(&format!("break '{:?}':{}\n",
+ script_str.push_str(&format!("break '{}':{}\n",
testfile.filename_display(),
*line)[]);
}
status: status,
stdout: out,
stderr: err,
- cmdline: format!("{}", cmd)
+ cmdline: format!("{:?}", cmd)
};
}
}
}
let prefixes = expected_errors.iter().map(|ee| {
- format!("{:?}:{}:", testfile.display(), ee.line)
+ format!("{}:{}:", testfile.display(), ee.line)
}).collect::<Vec<String> >();
#[cfg(windows)]
: ___Needs filling in___
* `no_copy_bound`
: This type does not implement "copy", even if eligible.
-* `no_send_bound`
- : This type does not implement "send", even if eligible.
-* `no_sync_bound`
- : This type does not implement "sync", even if eligible.
* `eh_personality`
: ___Needs filling in___
* `exchange_free`
(This is "Sayōnara", if you're curious.)
-Now that we have our some functionality in our crate, let's try to use it from
+Now that we have some functionality in our crate, let's try to use it from
another crate.
# Importing External Crates
-% `if`
+% If
Rust's take on `if` is not particularly complex, but it's much more like the
`if` you'll find in a dynamically typed language than in a more traditional
various kinds; lang items `send`, `sync` and `copy`.
- the marker types and variance indicators found in
`std::marker`; lang items `covariant_type`,
- `contravariant_lifetime`, `no_sync_bound`, etc.
+ `contravariant_lifetime`, etc.
Lang items are loaded lazily by the compiler; e.g. if one never uses
`Box` then there is no need to define functions for `exchange_malloc`
+++ /dev/null
-#!/usr/bin/perl -w
-# Copyright 2014 The Rust Project Developers. See the COPYRIGHT
-# file at the top-level directory of this distribution and at
-# http://rust-lang.org/COPYRIGHT.
-#
-# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-# option. This file may not be copied, modified, or distributed
-# except according to those terms.
-
-my $file = $ARGV[0];
-
-my @lines = <>;
-
-my $anchors = {};
-
-my $i = 0;
-for $line (@lines) {
- $i++;
- if ($line =~ m/id="([^"]+)"/) {
- $anchors->{$1} = $i;
- }
-}
-
-$i = 0;
-for $line (@lines) {
- $i++;
- while ($line =~ m/href="#([^"]+)"/g) {
- if (! exists($anchors->{$1})) {
- print "$file:$i: $1 referenced\n";
- }
- }
-}
:type 'integer
:group 'rust-mode)
+(defcustom rust-indent-method-chain nil
+ "Indent Rust method chains, aligned by the '.' operators"
+ :type 'boolean
+ :group 'rust-mode)
+
(defun rust-paren-level () (nth 0 (syntax-ppss)))
(defun rust-in-str-or-cmnt () (nth 8 (syntax-ppss)))
(defun rust-rewind-past-str-cmnt () (goto-char (nth 8 (syntax-ppss))))
;; open bracket ends the line
(when (not (looking-at "[[:blank:]]*\\(?://.*\\)?$"))
(when (looking-at "[[:space:]]")
- (forward-word 1)
- (backward-word 1))
+ (forward-word 1)
+ (backward-word 1))
(current-column))))
+(defun rust-align-to-method-chain ()
+ (save-excursion
+ (previous-line)
+ (end-of-line)
+ (backward-word 1)
+ (backward-char)
+ (when (looking-at "\\..+\(.*\)\n")
+ (- (current-column) rust-indent-offset))))
+
(defun rust-rewind-to-beginning-of-current-level-expr ()
(let ((current-level (rust-paren-level)))
(back-to-indentation)
;; the inside of it correctly relative to the outside.
(if (= 0 level)
0
+ (or
+ (when rust-indent-method-chain
+ (rust-align-to-method-chain))
(save-excursion
(backward-up-list)
(rust-rewind-to-beginning-of-current-level-expr)
- (+ (current-column) rust-indent-offset)))))
+ (+ (current-column) rust-indent-offset))))))
(cond
;; A function return type is indented to the corresponding function arguments
((looking-at "->")
;; A closing brace is 1 level unindended
((looking-at "}") (- baseline rust-indent-offset))
+ ;;Line up method chains by their .'s
+ ((when (and rust-indent-method-chain
+ (looking-at "\..+\(.*\);?\n"))
+ (or
+ (let ((method-indent (rust-align-to-method-chain)))
+ (when method-indent
+ (+ method-indent rust-indent-offset)))
+ (+ baseline rust-indent-offset))))
+
+
;; Doc comments in /** style with leading * indent to line up the *s
((and (nth 4 (syntax-ppss)) (looking-at "*"))
(+ 1 baseline))
--- /dev/null
+# Copyright 2015 The Rust Project Developers. See the COPYRIGHT
+# file at the top-level directory of this distribution and at
+# http://rust-lang.org/COPYRIGHT.
+#
+# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+# option. This file may not be copied, modified, or distributed
+# except according to those terms.
+
+# Digs error codes out of files named 'diagnostics.rs' across
+# the tree, and ensures thare are no duplicates.
+
+import sys, os, re
+
+src_dir = sys.argv[1]
+
+errcode_map = { }
+
+for (dirpath, dirnames, filenames) in os.walk(src_dir):
+
+ if "src/test" in dirpath or "src/llvm" in dirpath:
+ # Short circuit for fast
+ continue
+
+ for filename in filenames:
+ if filename != "diagnostics.rs":
+ continue
+
+ path = os.path.join(dirpath, filename)
+ line_num = 1
+ with open(path, 'r') as f:
+ for line in f:
+
+ p = re.compile("(E\d\d\d\d)")
+ m = p.search(line)
+ if not m is None:
+ errcode = m.group(1)
+
+ new_record = [(errcode, path, line_num, line)]
+ existing = errcode_map.get(errcode)
+ if existing is not None:
+ # This is a dupe
+ errcode_map[errcode] = existing + new_record
+ else:
+ errcode_map[errcode] = new_record
+
+ line_num += 1
+
+errors = False
+all_errors = []
+for errcode in errcode_map:
+ entries = errcode_map[errcode]
+ all_errors += [entries[0][0]]
+ if len(entries) > 1:
+ print "error: duplicate error code " + errcode
+ for entry in entries:
+ print entry[1] + ": " + str(entry[2])
+ print entry[3]
+ errors = True
+
+print str(len(errcode_map)) + " error codes"
+
+all_errors.sort()
+all_errors.reverse()
+
+print "highest error code: " + all_errors[0]
+
+if errors:
+ sys.exit(1)
-#!/usr/bin/perl
-use strict;
-use warnings;
+#!/usr/bin/env python
+import re
+import sys
-my $indent = 0;
-while (<>) {
- if (/^rust: ~">>/) {
- $indent += 1;
- }
+indent = 0
+more_re = re.compile(r"^rust: ~\">>")
+less_re = re.compile(r"^rust: ~\"<<")
+while True:
+ line = sys.stdin.readline()
+ if not line:
+ break
- printf "%03d %s%s", $indent, (" " x $indent), $_;
+ if more_re.match(line):
+ indent += 1
- if (/^rust: ~"<</) {
- $indent -= 1;
- }
-}
+ print "%03d %s%s" % (indent, " " * indent, line.strip())
+
+ if less_re.match(line):
+ indent -= 1
|| mktemp -d -t 'rustup-tmp-install' 2>/dev/null \
|| create_tmp_dir)
-# If we're saving nightlies and we didn't specify which one, grab todays.
-# Otherwise we'll use the latest version.
+# If we're saving nightlies and we didn't specify which one, grab the latest
+# verison from the perspective of the server. Buildbot has typically finished
+# building and uploading by ~8UTC, but we want to include a little buffer.
+#
+# FIXME It would be better to use the known most recent nightly that has been
+# built. This is waiting on a change to have buildbot publish metadata that
+# can be queried.
if [ -n "${CFG_SAVE}" -a -z "${CFG_DATE}" ];
then
- CFG_DATE=`date "+%Y-%m-%d"`
+ CFG_DATE=`TZ=Etc/UTC+9 date "+%Y-%m-%d"`
fi
RUST_URL="https://static.rust-lang.org/dist"
RUST_URL="${RUST_URL}/${CFG_DATE}"
fi
-verify_hash() {
- remote_sha256="$1"
- local_file="$2"
-
+download_hash() {
msg "Downloading ${remote_sha256}"
remote_sha256=`"${CFG_CURL}" -f "${remote_sha256}"`
+ if [ -n "${CFG_SAVE}" ]; then
+ echo "${remote_sha256}" > "${local_sha_file}"
+ fi
if [ "$?" -ne 0 ]; then
rm -Rf "${CFG_TMP_DIR}"
err "Failed to download ${remote_url}"
fi
+}
+
+verify_hash() {
+ remote_sha256="$1"
+ local_file="$2"
+ local_sha_file="${local_file}.sha256"
+
+ if [ -n "${CFG_SAVE}" ]; then
+ if [ -f "${local_sha_file}" ]; then
+ msg "Local ${local_sha_file} exists, treating as remote hash"
+ remote_sha256=`cat "${local_sha_file}"`
+ else
+ download_hash
+ fi
+ else
+ download_hash
+ fi
msg "Verifying hash"
local_sha256=$(calculate_hash "${local_file}")
use core::atomic;
use core::atomic::Ordering::{Relaxed, Release, Acquire, SeqCst};
use core::borrow::BorrowFrom;
-use core::fmt::{self, Show};
+use core::fmt;
use core::cmp::{Ordering};
use core::default::Default;
use core::mem::{min_align_of, size_of};
#[stable]
impl<T: Eq> Eq for Arc<T> {}
-impl<T: fmt::Show> fmt::Show for Arc<T> {
+#[stable]
+impl<T: fmt::Display> fmt::Display for Arc<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "Arc({:?})", (**self))
+ fmt::Display::fmt(&**self, f)
}
}
#[stable]
-impl<T: fmt::String> fmt::String for Arc<T> {
+impl<T: fmt::Debug> fmt::Debug for Arc<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt(&**self, f)
+ fmt::Debug::fmt(&**self, f)
}
}
#[test]
fn show_arc() {
let a = Arc::new(5u32);
- assert!(format!("{:?}", a) == "Arc(5u32)")
+ assert_eq!(format!("{:?}", a), "5");
}
// Make sure deriving works with Arc<T>
use core::clone::Clone;
use core::cmp::{PartialEq, PartialOrd, Eq, Ord, Ordering};
use core::default::Default;
+use core::error::{Error, FromError};
use core::fmt;
use core::hash::{self, Hash};
+use core::iter::Iterator;
use core::marker::Sized;
use core::mem;
+use core::ops::{Deref, DerefMut};
use core::option::Option;
use core::ptr::Unique;
use core::raw::TraitObject;
-use core::result::Result;
use core::result::Result::{Ok, Err};
-use core::ops::{Deref, DerefMut};
+use core::result::Result;
/// A value that represents the global exchange heap. This is the default
/// place that the `box` keyword allocates into when no place is supplied.
}
}
-impl<T: ?Sized + fmt::Show> fmt::Show for Box<T> {
+#[stable]
+impl<T: fmt::Display + ?Sized> fmt::Display for Box<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "Box({:?})", &**self)
+ fmt::Display::fmt(&**self, f)
}
}
#[stable]
-impl<T: ?Sized + fmt::String> fmt::String for Box<T> {
+impl<T: fmt::Debug + ?Sized> fmt::Debug for Box<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt(&**self, f)
+ fmt::Debug::fmt(&**self, f)
}
}
-impl fmt::Show for Box<Any> {
+#[stable]
+impl fmt::Debug for Box<Any> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.pad("Box<Any>")
}
fn deref_mut(&mut self) -> &mut T { &mut **self }
}
-#[cfg(test)]
-mod test {
- #[test]
- fn test_owned_clone() {
- let a = Box::new(5i);
- let b: Box<int> = a.clone();
- assert!(a == b);
- }
+// FIXME(#21363) remove `old_impl_check` when bug is fixed
+#[old_impl_check]
+impl<'a, T> Iterator for Box<Iterator<Item=T> + 'a> {
+ type Item = T;
- #[test]
- fn any_move() {
- let a = Box::new(8u) as Box<Any>;
- let b = Box::new(Test) as Box<Any>;
-
- match a.downcast::<uint>() {
- Ok(a) => { assert!(a == Box::new(8u)); }
- Err(..) => panic!()
- }
- match b.downcast::<Test>() {
- Ok(a) => { assert!(a == Box::new(Test)); }
- Err(..) => panic!()
- }
-
- let a = Box::new(8u) as Box<Any>;
- let b = Box::new(Test) as Box<Any>;
-
- assert!(a.downcast::<Box<Test>>().is_err());
- assert!(b.downcast::<Box<uint>>().is_err());
+ fn next(&mut self) -> Option<T> {
+ (**self).next()
}
- #[test]
- fn test_show() {
- let a = Box::new(8u) as Box<Any>;
- let b = Box::new(Test) as Box<Any>;
- let a_str = a.to_str();
- let b_str = b.to_str();
- assert_eq!(a_str, "Box<Any>");
- assert_eq!(b_str, "Box<Any>");
-
- let a = &8u as &Any;
- let b = &Test as &Any;
- let s = format!("{}", a);
- assert_eq!(s, "&Any");
- let s = format!("{}", b);
- assert_eq!(s, "&Any");
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ (**self).size_hint()
}
+}
- #[test]
- fn deref() {
- fn homura<T: Deref<Target=i32>>(_: T) { }
- homura(Box::new(765i32));
+impl<'a, E: Error + 'a> FromError<E> for Box<Error + 'a> {
+ fn from_error(err: E) -> Box<Error + 'a> {
+ Box::new(err)
}
}
--- /dev/null
+// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Test for `boxed` mod.
+
+use core::any::Any;
+use core::ops::Deref;
+use core::result::Result::{Ok, Err};
+use core::clone::Clone;
+
+use std::boxed::Box;
+use std::boxed::BoxAny;
+
+#[test]
+fn test_owned_clone() {
+ let a = Box::new(5i);
+ let b: Box<int> = a.clone();
+ assert!(a == b);
+}
+
+#[derive(PartialEq, Eq)]
+struct Test;
+
+#[test]
+fn any_move() {
+ let a = Box::new(8u) as Box<Any>;
+ let b = Box::new(Test) as Box<Any>;
+
+ match a.downcast::<uint>() {
+ Ok(a) => { assert!(a == Box::new(8u)); }
+ Err(..) => panic!()
+ }
+ match b.downcast::<Test>() {
+ Ok(a) => { assert!(a == Box::new(Test)); }
+ Err(..) => panic!()
+ }
+
+ let a = Box::new(8u) as Box<Any>;
+ let b = Box::new(Test) as Box<Any>;
+
+ assert!(a.downcast::<Box<Test>>().is_err());
+ assert!(b.downcast::<Box<uint>>().is_err());
+}
+
+#[test]
+fn test_show() {
+ let a = Box::new(8u) as Box<Any>;
+ let b = Box::new(Test) as Box<Any>;
+ let a_str = format!("{:?}", a);
+ let b_str = format!("{:?}", b);
+ assert_eq!(a_str, "Box<Any>");
+ assert_eq!(b_str, "Box<Any>");
+
+ static EIGHT: usize = 8us;
+ static TEST: Test = Test;
+ let a = &EIGHT as &Any;
+ let b = &TEST as &Any;
+ let s = format!("{:?}", a);
+ assert_eq!(s, "&Any");
+ let s = format!("{:?}", b);
+ assert_eq!(s, "&Any");
+}
+
+#[test]
+fn deref() {
+ fn homura<T: Deref<Target=i32>>(_: T) { }
+ homura(Box::new(765i32));
+}
if align <= MIN_ALIGN {
libc::malloc(size as libc::size_t) as *mut u8
} else {
- let mut out = 0 as *mut libc::c_void;
+ let mut out = ptr::null_mut();
let ret = posix_memalign(&mut out,
align as libc::size_t,
size as libc::size_t);
#![feature(lang_items, unsafe_destructor)]
#![feature(box_syntax)]
#![feature(optin_builtin_traits)]
+// FIXME(#21363) remove `old_impl_check` when bug is fixed
+#![feature(old_impl_check)]
#![allow(unknown_features)] #![feature(int_uint)]
#[macro_use]
#[cfg(not(test))]
pub mod boxed;
+#[cfg(test)]
+mod boxed_test;
pub mod arc;
pub mod rc;
use core::ptr::{self, PtrExt};
use core::result::Result;
use core::result::Result::{Ok, Err};
+use core::intrinsics::assume;
use heap::deallocate;
/// See the [module level documentation](../index.html) for more details.
#[unsafe_no_drop_flag]
#[stable]
-#[cfg(stage0)] // NOTE remove impl after next snapshot
pub struct Rc<T> {
// FIXME #12808: strange names to try to avoid interfering with field accesses of the contained
// type via Deref
_ptr: NonZero<*mut RcBox<T>>,
- _nosend: marker::NoSend,
- _noshare: marker::NoSync
}
-/// An immutable reference-counted pointer type.
-///
-/// See the [module level documentation](../index.html) for more details.
-#[unsafe_no_drop_flag]
-#[stable]
-#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
-pub struct Rc<T> {
- // FIXME #12808: strange names to try to avoid interfering with field accesses of the contained
- // type via Deref
- _ptr: NonZero<*mut RcBox<T>>,
-}
-
-#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
impl<T> !marker::Send for Rc<T> {}
-#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
impl<T> !marker::Sync for Rc<T> {}
impl<T> Rc<T> {
- /// Constructs a new `Rc<T>`.
- ///
- /// # Examples
- ///
- /// ```
- /// use std::rc::Rc;
- ///
- /// let five = Rc::new(5i);
- /// ```
- #[stable]
- #[cfg(stage0)] // NOTE remove after next snapshot
- pub fn new(value: T) -> Rc<T> {
- unsafe {
- Rc {
- // there is an implicit weak pointer owned by all the strong pointers, which
- // ensures that the weak destructor never frees the allocation while the strong
- // destructor is running, even if the weak pointer is stored inside the strong one.
- _ptr: NonZero::new(transmute(box RcBox {
- value: value,
- strong: Cell::new(1),
- weak: Cell::new(1)
- })),
- _nosend: marker::NoSend,
- _noshare: marker::NoSync
- }
- }
- }
/// Constructs a new `Rc<T>`.
///
/// let five = Rc::new(5i);
/// ```
#[stable]
- #[cfg(not(stage0))] // NOTE remove cfg after next snapshot
pub fn new(value: T) -> Rc<T> {
unsafe {
Rc {
///
/// let weak_five = five.downgrade();
/// ```
- #[cfg(stage0)] // NOTE remove after next snapshot
- #[unstable = "Weak pointers may not belong in this module"]
- pub fn downgrade(&self) -> Weak<T> {
- self.inc_weak();
- Weak {
- _ptr: self._ptr,
- _nosend: marker::NoSend,
- _noshare: marker::NoSync
- }
- }
-
- /// Downgrades the `Rc<T>` to a `Weak<T>` reference.
- ///
- /// # Examples
- ///
- /// ```
- /// use std::rc::Rc;
- ///
- /// let five = Rc::new(5i);
- ///
- /// let weak_five = five.downgrade();
- /// ```
- #[cfg(not(stage0))] // NOTE remove cfg after next snapshot
#[unstable = "Weak pointers may not belong in this module"]
pub fn downgrade(&self) -> Weak<T> {
self.inc_weak();
#[stable]
impl<T> Clone for Rc<T> {
- /// Makes a clone of the `Rc<T>`.
- ///
- /// This increases the strong reference count.
- ///
- /// # Examples
- ///
- /// ```
- /// use std::rc::Rc;
- ///
- /// let five = Rc::new(5i);
- ///
- /// five.clone();
- /// ```
- #[inline]
- #[cfg(stage0)] // NOTE remove after next snapshot
- fn clone(&self) -> Rc<T> {
- self.inc_strong();
- Rc { _ptr: self._ptr, _nosend: marker::NoSend, _noshare: marker::NoSync }
- }
/// Makes a clone of the `Rc<T>`.
///
/// five.clone();
/// ```
#[inline]
- #[cfg(not(stage0))] // NOTE remove cfg after next snapshot
fn clone(&self) -> Rc<T> {
self.inc_strong();
Rc { _ptr: self._ptr }
}
}
-#[unstable = "Show is experimental."]
-impl<T: fmt::Show> fmt::Show for Rc<T> {
+#[stable]
+impl<T: fmt::Display> fmt::Display for Rc<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "Rc({:?})", **self)
+ fmt::Display::fmt(&**self, f)
}
}
#[stable]
-impl<T: fmt::String> fmt::String for Rc<T> {
+impl<T: fmt::Debug> fmt::Debug for Rc<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt(&**self, f)
+ fmt::Debug::fmt(&**self, f)
}
}
/// See the [module level documentation](../index.html) for more.
#[unsafe_no_drop_flag]
#[unstable = "Weak pointers may not belong in this module."]
-#[cfg(stage0)] // NOTE remove impl after next snapshot
pub struct Weak<T> {
// FIXME #12808: strange names to try to avoid interfering with
// field accesses of the contained type via Deref
_ptr: NonZero<*mut RcBox<T>>,
- _nosend: marker::NoSend,
- _noshare: marker::NoSync
}
-/// A weak version of `Rc<T>`.
-///
-/// Weak references do not count when determining if the inner value should be dropped.
-///
-/// See the [module level documentation](../index.html) for more.
-#[unsafe_no_drop_flag]
-#[unstable = "Weak pointers may not belong in this module."]
-#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
-pub struct Weak<T> {
- // FIXME #12808: strange names to try to avoid interfering with
- // field accesses of the contained type via Deref
- _ptr: NonZero<*mut RcBox<T>>,
-}
-
-#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
#[allow(unstable)]
impl<T> !marker::Send for Weak<T> {}
-#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
#[allow(unstable)]
impl<T> !marker::Sync for Weak<T> {}
#[unstable = "Weak pointers may not belong in this module."]
impl<T> Weak<T> {
- /// Upgrades a weak reference to a strong reference.
- ///
- /// Upgrades the `Weak<T>` reference to an `Rc<T>`, if possible.
- ///
- /// Returns `None` if there were no strong references and the data was destroyed.
- ///
- /// # Examples
- ///
- /// ```
- /// use std::rc::Rc;
- ///
- /// let five = Rc::new(5i);
- ///
- /// let weak_five = five.downgrade();
- ///
- /// let strong_five: Option<Rc<_>> = weak_five.upgrade();
- /// ```
- #[cfg(stage0)] // NOTE remove after next snapshot
- pub fn upgrade(&self) -> Option<Rc<T>> {
- if self.strong() == 0 {
- None
- } else {
- self.inc_strong();
- Some(Rc { _ptr: self._ptr, _nosend: marker::NoSend, _noshare: marker::NoSync })
- }
- }
/// Upgrades a weak reference to a strong reference.
///
///
/// let strong_five: Option<Rc<_>> = weak_five.upgrade();
/// ```
- #[cfg(not(stage0))] // NOTE remove cfg after next snapshot
pub fn upgrade(&self) -> Option<Rc<T>> {
if self.strong() == 0 {
None
#[unstable = "Weak pointers may not belong in this module."]
impl<T> Clone for Weak<T> {
- /// Makes a clone of the `Weak<T>`.
- ///
- /// This increases the weak reference count.
- ///
- /// # Examples
- ///
- /// ```
- /// use std::rc::Rc;
- ///
- /// let weak_five = Rc::new(5i).downgrade();
- ///
- /// weak_five.clone();
- /// ```
- #[inline]
- #[cfg(stage0)] // NOTE remove after next snapshot
- fn clone(&self) -> Weak<T> {
- self.inc_weak();
- Weak { _ptr: self._ptr, _nosend: marker::NoSend, _noshare: marker::NoSync }
- }
/// Makes a clone of the `Weak<T>`.
///
/// weak_five.clone();
/// ```
#[inline]
- #[cfg(not(stage0))] // NOTE remove cfg after next snapshot
fn clone(&self) -> Weak<T> {
self.inc_weak();
Weak { _ptr: self._ptr }
}
}
-#[unstable = "Show is experimental."]
-impl<T: fmt::Show> fmt::Show for Weak<T> {
+#[stable]
+impl<T: fmt::Debug> fmt::Debug for Weak<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "(Weak)")
}
fn strong(&self) -> uint { self.inner().strong.get() }
#[inline]
- fn inc_strong(&self) { self.inner().strong.set(self.strong() + 1); }
+ fn inc_strong(&self) {
+ let strong = self.strong();
+ // The reference count is always at least one unless we're about to drop the type
+ // This allows the bulk of the destructor to be omitted in cases where we know that
+ // the reference count must be > 0.
+ unsafe { assume(strong > 0); }
+ self.inner().strong.set(strong + 1);
+ }
#[inline]
- fn dec_strong(&self) { self.inner().strong.set(self.strong() - 1); }
+ fn dec_strong(&self) {
+ let strong = self.strong();
+ // The reference count is always at least one unless we're about to drop the type
+ // This allows the bulk of the destructor to be omitted in cases where we know that
+ // the reference count must be > 0
+ unsafe { assume(strong > 0); }
+ self.inner().strong.set(strong - 1);
+ }
#[inline]
fn weak(&self) -> uint { self.inner().weak.get() }
impl<T> RcBoxPtr<T> for Rc<T> {
#[inline(always)]
- fn inner(&self) -> &RcBox<T> { unsafe { &(**self._ptr) } }
+ fn inner(&self) -> &RcBox<T> {
+ unsafe {
+ // Safe to assume this here, as if it weren't true, we'd be breaking
+ // the contract anyway.
+ // This allows the null check to be elided in the destructor if we
+ // manipulated the reference count in the same function.
+ assume(!self._ptr.is_null());
+ &(**self._ptr)
+ }
+ }
}
impl<T> RcBoxPtr<T> for Weak<T> {
#[inline(always)]
- fn inner(&self) -> &RcBox<T> { unsafe { &(**self._ptr) } }
+ fn inner(&self) -> &RcBox<T> {
+ unsafe {
+ // Safe to assume this here, as if it weren't true, we'd be breaking
+ // the contract anyway
+ // This allows the null check to be elided in the destructor if we
+ // manipulated the reference count in the same function.
+ assume(!self._ptr.is_null());
+ &(**self._ptr)
+ }
+ }
}
#[cfg(test)]
#[test]
fn test_show() {
let foo = Rc::new(75u);
- assert!(format!("{:?}", foo) == "Rc(75u)")
+ assert_eq!(format!("{:?}", foo), "75");
}
}
if extra_bytes > 0 {
let mut last_word = 0u32;
- for (i, &byte) in bytes[(complete_words*4)..].iter().enumerate() {
+ for (i, &byte) in bytes[complete_words*4..].iter().enumerate() {
last_word |= (reverse_bits(byte) as u32) << (i * 8);
}
bitv.storage.push(last_word);
}
#[stable]
-impl fmt::Show for Bitv {
+impl fmt::Debug for Bitv {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
for bit in self.iter() {
try!(write!(fmt, "{}", if bit { 1u32 } else { 0u32 }));
}
}
-impl fmt::Show for BitvSet {
+impl fmt::Debug for BitvSet {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
try!(write!(fmt, "BitvSet {{"));
let mut first = true;
s.insert(10);
s.insert(50);
s.insert(2);
- assert_eq!("BitvSet {1u, 2u, 10u, 50u}", format!("{:?}", s));
+ assert_eq!("BitvSet {1, 2, 10, 50}", format!("{:?}", s));
}
#[test]
use core::borrow::BorrowFrom;
use core::cmp::Ordering;
use core::default::Default;
-use core::fmt::Show;
+use core::fmt::Debug;
use core::hash::{Hash, Hasher};
use core::iter::{Map, FromIterator};
use core::ops::{Index, IndexMut};
}
#[stable]
-impl<K: Show, V: Show> Show for BTreeMap<K, V> {
+impl<K: Debug, V: Debug> Debug for BTreeMap<K, V> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
try!(write!(f, "BTreeMap {{"));
use core::borrow::BorrowFrom;
use core::cmp::Ordering::{self, Less, Greater, Equal};
use core::default::Default;
-use core::fmt::Show;
+use core::fmt::Debug;
use core::fmt;
-// NOTE(stage0) remove import after a snapshot
-#[cfg(stage0)]
-use core::hash::Hash;
use core::iter::{Peekable, Map, FromIterator};
use core::ops::{BitOr, BitAnd, BitXor, Sub};
}
#[stable]
-impl<T: Show> Show for BTreeSet<T> {
+impl<T: Debug> Debug for BTreeSet<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
try!(write!(f, "BTreeSet {{"));
let set_str = format!("{:?}", set);
- assert_eq!(set_str, "BTreeSet {1i, 2i}");
+ assert_eq!(set_str, "BTreeSet {1, 2}");
assert_eq!(format!("{:?}", empty), "BTreeSet {}");
}
}
}
#[stable]
-impl<A: fmt::Show> fmt::Show for DList<A> {
+impl<A: fmt::Debug> fmt::Debug for DList<A> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
try!(write!(f, "DList ["));
#[test]
fn test_show() {
let list: DList<int> = range(0i, 10).collect();
- assert_eq!(format!("{:?}", list), "DList [0i, 1i, 2i, 3i, 4i, 5i, 6i, 7i, 8i, 9i]");
+ assert_eq!(format!("{:?}", list), "DList [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]");
let list: DList<&str> = vec!["just", "one", "test", "more"].iter()
.map(|&s| s)
impl<E> Copy for EnumSet<E> {}
-impl<E:CLike+fmt::Show> fmt::Show for EnumSet<E> {
+impl<E:CLike + fmt::Debug> fmt::Debug for EnumSet<E> {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
try!(write!(fmt, "EnumSet {{"));
let mut first = true;
#[macro_export]
#[stable]
macro_rules! vec {
- ($x:expr; $y:expr) => ({
- let xs: $crate::boxed::Box<[_]> = $crate::boxed::Box::new([$x; $y]);
- $crate::slice::SliceExt::into_vec(xs)
- });
- ($($x:expr),*) => ({
- let xs: $crate::boxed::Box<[_]> = $crate::boxed::Box::new([$($x),*]);
- $crate::slice::SliceExt::into_vec(xs)
- });
+ ($x:expr; $y:expr) => (
+ <[_] as $crate::slice::SliceExt>::into_vec(
+ $crate::boxed::Box::new([$x; $y]))
+ );
+ ($($x:expr),*) => (
+ <[_] as $crate::slice::SliceExt>::into_vec(
+ $crate::boxed::Box::new([$($x),*]))
+ );
($($x:expr,)*) => (vec![$($x),*])
}
}
#[stable]
-impl<T: fmt::Show> fmt::Show for RingBuf<T> {
+impl<T: fmt::Debug> fmt::Debug for RingBuf<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
try!(write!(f, "RingBuf ["));
use self::Taggypar::*;
use prelude::*;
use core::iter;
- use std::fmt::Show;
+ use std::fmt::Debug;
use std::hash::{self, SipHasher};
use test::Bencher;
use test;
}
#[cfg(test)]
- fn test_parameterized<T:Clone + PartialEq + Show>(a: T, b: T, c: T, d: T) {
+ fn test_parameterized<T:Clone + PartialEq + Debug>(a: T, b: T, c: T, d: T) {
let mut deq = RingBuf::new();
assert_eq!(deq.len(), 0);
deq.push_front(a.clone());
#[test]
fn test_show() {
let ringbuf: RingBuf<int> = range(0i, 10).collect();
- assert_eq!(format!("{:?}", ringbuf), "RingBuf [0i, 1i, 2i, 3i, 4i, 5i, 6i, 7i, 8i, 9i]");
+ assert_eq!(format!("{:?}", ringbuf), "RingBuf [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]");
let ringbuf: RingBuf<&str> = vec!["just", "one", "test", "more"].iter()
.map(|&s| s)
#[test]
fn test_chunksator() {
+ use core::iter::ExactSizeIterator;
+
let v = &[1i,2,3,4,5];
+ assert_eq!(v.chunks(2).len(), 3);
+
let chunks: &[&[int]] = &[&[1i,2], &[3,4], &[5]];
assert_eq!(v.chunks(2).collect::<Vec<&[int]>>(), chunks);
let chunks: &[&[int]] = &[&[1i,2,3], &[4,5]];
}
let empty: Vec<int> = vec![];
test_show_vec!(empty, "[]");
- test_show_vec!(vec![1i], "[1i]");
- test_show_vec!(vec![1i, 2, 3], "[1i, 2i, 3i]");
+ test_show_vec!(vec![1i], "[1]");
+ test_show_vec!(vec![1i, 2, 3], "[1, 2, 3]");
test_show_vec!(vec![vec![], vec![1u], vec![1u, 1u]],
- "[[], [1u], [1u, 1u]]");
+ "[[], [1], [1, 1]]");
let empty_mut: &mut [int] = &mut[];
test_show_vec!(empty_mut, "[]");
let v: &mut[int] = &mut[1];
- test_show_vec!(v, "[1i]");
+ test_show_vec!(v, "[1]");
let v: &mut[int] = &mut[1, 2, 3];
- test_show_vec!(v, "[1i, 2i, 3i]");
+ test_show_vec!(v, "[1, 2, 3]");
let v: &mut [&mut[uint]] = &mut[&mut[], &mut[1u], &mut[1u, 1u]];
- test_show_vec!(v, "[[], [1u], [1u, 1u]]");
+ test_show_vec!(v, "[[], [1], [1, 1]]");
}
#[test]
#[test]
fn test_mut_chunks() {
+ use core::iter::ExactSizeIterator;
+
let mut v = [0u8, 1, 2, 3, 4, 5, 6];
+ assert_eq!(v.chunks_mut(2).len(), 4);
for (i, chunk) in v.chunks_mut(3).enumerate() {
for x in chunk.iter_mut() {
*x = i as u8;
use core::borrow::{Cow, IntoCow};
use core::default::Default;
+use core::error::Error;
use core::fmt;
use core::hash;
use core::iter::FromIterator;
/// A possible error value from the `String::from_utf8` function.
#[stable]
+#[derive(Show)]
pub struct FromUtf8Error {
bytes: Vec<u8>,
error: Utf8Error,
/// A possible error value from the `String::from_utf16` function.
#[stable]
#[allow(missing_copy_implementations)]
+#[derive(Show)]
pub struct FromUtf16Error(());
impl String {
pub fn utf8_error(&self) -> Utf8Error { self.error }
}
-impl fmt::Show for FromUtf8Error {
+#[stable]
+impl fmt::Display for FromUtf8Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt(self, f)
+ fmt::Display::fmt(&self.error, f)
}
}
#[stable]
-impl fmt::String for FromUtf8Error {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt(&self.error, f)
- }
+impl Error for FromUtf8Error {
+ fn description(&self) -> &str { "invalid utf-8" }
}
-impl fmt::Show for FromUtf16Error {
+#[stable]
+impl fmt::Display for FromUtf16Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt(self, f)
+ fmt::Display::fmt("invalid utf-16: lone surrogate found", f)
}
}
#[stable]
-impl fmt::String for FromUtf16Error {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt("invalid utf-16: lone surrogate found", f)
- }
+impl Error for FromUtf16Error {
+ fn description(&self) -> &str { "invalid utf-16" }
}
#[stable]
}
#[stable]
-impl fmt::String for String {
+impl fmt::Display for String {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt(&**self, f)
+ fmt::Display::fmt(&**self, f)
}
}
-#[unstable = "waiting on fmt stabilization"]
-impl fmt::Show for String {
+#[stable]
+impl fmt::Debug for String {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::Show::fmt(&**self, f)
+ fmt::Debug::fmt(&**self, f)
}
}
fn to_string(&self) -> String;
}
-impl<T: fmt::String + ?Sized> ToString for T {
+impl<T: fmt::Display + ?Sized> ToString for T {
#[inline]
fn to_string(&self) -> String {
use core::fmt::Writer;
fn test_vectors() {
let x: Vec<int> = vec![];
assert_eq!(format!("{:?}", x), "[]");
- assert_eq!(format!("{:?}", vec![1i]), "[1i]");
- assert_eq!(format!("{:?}", vec![1i, 2, 3]), "[1i, 2i, 3i]");
+ assert_eq!(format!("{:?}", vec![1i]), "[1]");
+ assert_eq!(format!("{:?}", vec![1i, 2, 3]), "[1, 2, 3]");
assert!(format!("{:?}", vec![vec![], vec![1i], vec![1i, 1]]) ==
- "[[], [1i], [1i, 1i]]");
+ "[[], [1], [1, 1]]");
}
#[test]
}
}
-#[unstable = "waiting on Show stability"]
-impl<T: fmt::Show> fmt::Show for Vec<T> {
+#[stable]
+impl<T: fmt::Debug> fmt::Debug for Vec<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::Show::fmt(self.as_slice(), f)
+ fmt::Debug::fmt(self.as_slice(), f)
}
}
#[should_fail]
fn test_slice_out_of_bounds_1() {
let x: Vec<int> = vec![1, 2, 3, 4, 5];
- &x[(-1)..];
+ &x[-1..];
}
#[test]
#[should_fail]
fn test_slice_out_of_bounds_3() {
let x: Vec<int> = vec![1, 2, 3, 4, 5];
- &x[(-1)..4];
+ &x[-1..4];
}
#[test]
}
#[stable]
-impl<V: fmt::Show> fmt::Show for VecMap<V> {
+impl<V: fmt::Debug> fmt::Debug for VecMap<V> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
try!(write!(f, "VecMap {{"));
map.insert(3, 4i);
let map_str = format!("{:?}", map);
- assert!(map_str == "VecMap {1: 2i, 3: 4i}" || map_str == "{3: 4i, 1: 2i}");
+ assert!(map_str == "VecMap {1: 2, 3: 4}" || map_str == "{3: 4, 1: 2}");
assert_eq!(format!("{:?}", empty), "VecMap {}");
}
//! use runtime reflection instead.
//!
//! ```rust
-//! use std::fmt::Show;
+//! use std::fmt::Debug;
//! use std::any::Any;
//!
-//! // Logger function for any type that implements Show.
-//! fn log<T: Any+Show>(value: &T) {
+//! // Logger function for any type that implements Debug.
+//! fn log<T: Any + Debug>(value: &T) {
//! let value_any = value as &Any;
//!
//! // try to convert our value to a String. If successful, we want to
//! }
//!
//! // This function wants to log its parameter out prior to doing work with it.
-//! fn do_work<T: Show+'static>(value: &T) {
+//! fn do_work<T: Debug + 'static>(value: &T) {
//! log(value);
//! // ...do some other work
//! }
use option::Option::{self, Some, None};
use raw::TraitObject;
use intrinsics;
-#[cfg(not(stage0))] use marker::Sized;
+use marker::Sized;
///////////////////////////////////////////////////////////////////////////////
// Any trait
impl TypeId {
/// Returns the `TypeId` of the type this generic function has been
/// instantiated with
- #[cfg(not(stage0))]
#[unstable = "may grow a `Reflect` bound soon via marker traits"]
pub fn of<T: ?Sized + 'static>() -> TypeId {
TypeId {
t: unsafe { intrinsics::type_id::<T>() },
}
}
-
- /// dox
- #[cfg(stage0)]
- pub fn of<T: 'static>() -> TypeId {
- unsafe { intrinsics::type_id::<T>() }
- }
}
}
}
- #[unstable = "waiting for Show to stabilize"]
- impl<T:fmt::Show> fmt::Show for [T; $N] {
+ #[stable]
+ impl<T: fmt::Debug> fmt::Debug for [T; $N] {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::Show::fmt(&&self[], f)
+ fmt::Debug::fmt(&&self[], f)
}
}
/// }
/// }
/// ```
-#[derive(Show)]
pub enum Cow<'a, T, B: ?Sized + 'a> where B: ToOwned<T> {
/// Borrowed data.
Borrowed(&'a B),
}
#[stable]
-impl<'a, T, B: ?Sized> fmt::String for Cow<'a, T, B> where
- B: fmt::String + ToOwned<T>,
- T: fmt::String,
+impl<'a, T, B: ?Sized> fmt::Debug for Cow<'a, T, B> where
+ B: fmt::Debug + ToOwned<T>,
+ T: fmt::Debug,
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
- Borrowed(ref b) => fmt::String::fmt(b, f),
- Owned(ref o) => fmt::String::fmt(o, f),
+ Borrowed(ref b) => fmt::Debug::fmt(b, f),
+ Owned(ref o) => fmt::Debug::fmt(o, f),
+ }
+ }
+}
+
+#[stable]
+impl<'a, T, B: ?Sized> fmt::Display for Cow<'a, T, B> where
+ B: fmt::Display + ToOwned<T>,
+ T: fmt::Display,
+{
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ match *self {
+ Borrowed(ref b) => fmt::Display::fmt(b, f),
+ Owned(ref o) => fmt::Display::fmt(o, f),
}
}
}
--- /dev/null
+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Traits for working with Errors.
+//!
+//! # The `Error` trait
+//!
+//! `Error` is a trait representing the basic expectations for error values,
+//! i.e. values of type `E` in `Result<T, E>`. At a minimum, errors must provide
+//! a description, but they may optionally provide additional detail (via
+//! `Display`) and cause chain information:
+//!
+//! ```
+//! use std::fmt::Display;
+//!
+//! trait Error: Display {
+//! fn description(&self) -> &str;
+//!
+//! fn cause(&self) -> Option<&Error> { None }
+//! }
+//! ```
+//!
+//! The `cause` method is generally used when errors cross "abstraction
+//! boundaries", i.e. when a one module must report an error that is "caused"
+//! by an error from a lower-level module. This setup makes it possible for the
+//! high-level module to provide its own errors that do not commit to any
+//! particular implementation, but also reveal some of its implementation for
+//! debugging via `cause` chains.
+//!
+//! # The `FromError` trait
+//!
+//! `FromError` is a simple trait that expresses conversions between different
+//! error types. To provide maximum flexibility, it does not require either of
+//! the types to actually implement the `Error` trait, although this will be the
+//! common case.
+//!
+//! The main use of this trait is in the `try!` macro, which uses it to
+//! automatically convert a given error to the error specified in a function's
+//! return type.
+//!
+//! For example,
+//!
+//! ```
+//! use std::error::FromError;
+//! use std::io::{File, IoError};
+//! use std::os::{MemoryMap, MapError};
+//! use std::path::Path;
+//!
+//! enum MyError {
+//! Io(IoError),
+//! Map(MapError)
+//! }
+//!
+//! impl FromError<IoError> for MyError {
+//! fn from_error(err: IoError) -> MyError {
+//! MyError::Io(err)
+//! }
+//! }
+//!
+//! impl FromError<MapError> for MyError {
+//! fn from_error(err: MapError) -> MyError {
+//! MyError::Map(err)
+//! }
+//! }
+//!
+//! #[allow(unused_variables)]
+//! fn open_and_map() -> Result<(), MyError> {
+//! let f = try!(File::open(&Path::new("foo.txt")));
+//! let m = try!(MemoryMap::new(0, &[]));
+//! // do something interesting here...
+//! Ok(())
+//! }
+//! ```
+
+#![stable]
+
+use prelude::*;
+use fmt::Display;
+
+/// Base functionality for all errors in Rust.
+#[unstable = "the exact API of this trait may change"]
+pub trait Error: Display {
+ /// A short description of the error; usually a static string.
+ fn description(&self) -> &str;
+
+ /// The lower-level cause of this error, if any.
+ fn cause(&self) -> Option<&Error> { None }
+}
+
+/// A trait for types that can be converted from a given error type `E`.
+#[stable]
+pub trait FromError<E> {
+ /// Perform the conversion.
+ fn from_error(err: E) -> Self;
+}
+
+// Any type is convertable from itself
+#[stable]
+impl<E> FromError<E> for E {
+ fn from_error(err: E) -> E {
+ err
+ }
+}
use result;
use slice::SliceExt;
use slice;
-use str::{self, StrExt, Utf8Error};
+use str::{self, StrExt};
pub use self::num::radix;
pub use self::num::Radix;
pub use self::num::RadixFmt;
+#[cfg(stage0)] pub use self::Debug as Show;
+#[cfg(stage0)] pub use self::Display as String;
+
mod num;
mod float;
pub mod rt;
/// occurred. Any extra information must be arranged to be transmitted through
/// some other means.
#[unstable = "core and I/O reconciliation may alter this definition"]
-#[derive(Copy)]
+#[derive(Copy, Show)]
pub struct Error;
/// A collection of methods that are required to format a message into a stream.
impl<'a> Argument<'a> {
#[inline(never)]
fn show_uint(x: &uint, f: &mut Formatter) -> Result {
- Show::fmt(x, f)
+ Display::fmt(x, f)
}
fn new<'b, T>(x: &'b T, f: fn(&T, &mut Formatter) -> Result) -> Argument<'b> {
args: &'a [Argument<'a>],
}
-impl<'a> Show for Arguments<'a> {
+#[stable]
+impl<'a> Debug for Arguments<'a> {
fn fmt(&self, fmt: &mut Formatter) -> Result {
- String::fmt(self, fmt)
+ Display::fmt(self, fmt)
}
}
#[stable]
-impl<'a> String for Arguments<'a> {
+impl<'a> Display for Arguments<'a> {
fn fmt(&self, fmt: &mut Formatter) -> Result {
write(fmt.buf, *self)
}
/// Format trait for the `:?` format. Useful for debugging, most all types
/// should implement this.
-#[unstable = "I/O and core have yet to be reconciled"]
+#[deprecated = "renamed to Debug"]
+#[cfg(not(stage0))]
pub trait Show {
/// Formats the value using the given formatter.
fn fmt(&self, &mut Formatter) -> Result;
}
+/// Format trait for the `:?` format. Useful for debugging, most all types
+/// should implement this.
+#[unstable = "I/O and core have yet to be reconciled"]
+pub trait Debug {
+ /// Formats the value using the given formatter.
+ fn fmt(&self, &mut Formatter) -> Result;
+}
+
+#[cfg(not(stage0))]
+impl<T: Show + ?Sized> Debug for T {
+ #[allow(deprecated)]
+ fn fmt(&self, f: &mut Formatter) -> Result { Show::fmt(self, f) }
+}
+
+/// When a value can be semantically expressed as a String, this trait may be
+/// used. It corresponds to the default format, `{}`.
+#[deprecated = "renamed to Display"]
+#[cfg(not(stage0))]
+pub trait String {
+ /// Formats the value using the given formatter.
+ fn fmt(&self, &mut Formatter) -> Result;
+}
+
/// When a value can be semantically expressed as a String, this trait may be
/// used. It corresponds to the default format, `{}`.
#[unstable = "I/O and core have yet to be reconciled"]
-pub trait String {
+pub trait Display {
/// Formats the value using the given formatter.
fn fmt(&self, &mut Formatter) -> Result;
}
+#[cfg(not(stage0))]
+impl<T: String + ?Sized> Display for T {
+ #[allow(deprecated)]
+ fn fmt(&self, f: &mut Formatter) -> Result { String::fmt(self, f) }
+}
/// Format trait for the `o` character
#[unstable = "I/O and core have yet to be reconciled"]
pub fn precision(&self) -> Option<uint> { self.precision }
}
-impl Show for Error {
+#[stable]
+impl Display for Error {
fn fmt(&self, f: &mut Formatter) -> Result {
- String::fmt("an error occurred when formatting an argument", f)
+ Display::fmt("an error occurred when formatting an argument", f)
}
}
macro_rules! fmt_refs {
($($tr:ident),*) => {
$(
+ #[stable]
impl<'a, T: ?Sized + $tr> $tr for &'a T {
fn fmt(&self, f: &mut Formatter) -> Result { $tr::fmt(&**self, f) }
}
+ #[stable]
impl<'a, T: ?Sized + $tr> $tr for &'a mut T {
fn fmt(&self, f: &mut Formatter) -> Result { $tr::fmt(&**self, f) }
}
}
}
-fmt_refs! { Show, String, Octal, Binary, LowerHex, UpperHex, LowerExp, UpperExp }
+fmt_refs! { Debug, Display, Octal, Binary, LowerHex, UpperHex, LowerExp, UpperExp }
-impl Show for bool {
+#[stable]
+impl Debug for bool {
fn fmt(&self, f: &mut Formatter) -> Result {
- String::fmt(self, f)
+ Display::fmt(self, f)
}
}
#[stable]
-impl String for bool {
+impl Display for bool {
fn fmt(&self, f: &mut Formatter) -> Result {
- String::fmt(if *self { "true" } else { "false" }, f)
+ Display::fmt(if *self { "true" } else { "false" }, f)
}
}
-impl Show for str {
+#[stable]
+impl Debug for str {
fn fmt(&self, f: &mut Formatter) -> Result {
try!(write!(f, "\""));
for c in self.chars().flat_map(|c| c.escape_default()) {
}
#[stable]
-impl String for str {
+impl Display for str {
fn fmt(&self, f: &mut Formatter) -> Result {
f.pad(self)
}
}
-impl Show for char {
+#[stable]
+impl Debug for char {
fn fmt(&self, f: &mut Formatter) -> Result {
use char::CharExt;
try!(write!(f, "'"));
}
#[stable]
-impl String for char {
+impl Display for char {
fn fmt(&self, f: &mut Formatter) -> Result {
let mut utf8 = [0u8; 4];
let amt = self.encode_utf8(&mut utf8).unwrap_or(0);
let s: &str = unsafe { mem::transmute(&utf8[..amt]) };
- String::fmt(s, f)
+ Display::fmt(s, f)
}
}
+#[stable]
impl<T> Pointer for *const T {
fn fmt(&self, f: &mut Formatter) -> Result {
f.flags |= 1 << (rt::FlagAlternate as uint);
}
}
+#[stable]
impl<T> Pointer for *mut T {
fn fmt(&self, f: &mut Formatter) -> Result {
Pointer::fmt(&(*self as *const T), f)
}
}
+#[stable]
impl<'a, T> Pointer for &'a T {
fn fmt(&self, f: &mut Formatter) -> Result {
Pointer::fmt(&(*self as *const T), f)
}
}
+#[stable]
impl<'a, T> Pointer for &'a mut T {
fn fmt(&self, f: &mut Formatter) -> Result {
Pointer::fmt(&(&**self as *const T), f)
macro_rules! floating { ($ty:ident) => {
- impl Show for $ty {
+ #[stable]
+ impl Debug for $ty {
fn fmt(&self, fmt: &mut Formatter) -> Result {
- try!(String::fmt(self, fmt));
- fmt.write_str(stringify!($ty))
+ Display::fmt(self, fmt)
}
}
#[stable]
- impl String for $ty {
+ impl Display for $ty {
fn fmt(&self, fmt: &mut Formatter) -> Result {
use num::Float;
}
}
+ #[stable]
impl LowerExp for $ty {
fn fmt(&self, fmt: &mut Formatter) -> Result {
use num::Float;
}
}
+ #[stable]
impl UpperExp for $ty {
fn fmt(&self, fmt: &mut Formatter) -> Result {
use num::Float;
floating! { f32 }
floating! { f64 }
-// Implementation of Show for various core types
+// Implementation of Display/Debug for various core types
-impl<T> Show for *const T {
+#[stable]
+impl<T> Debug for *const T {
fn fmt(&self, f: &mut Formatter) -> Result { Pointer::fmt(self, f) }
}
-impl<T> Show for *mut T {
+#[stable]
+impl<T> Debug for *mut T {
fn fmt(&self, f: &mut Formatter) -> Result { Pointer::fmt(self, f) }
}
macro_rules! tuple {
() => ();
( $($name:ident,)+ ) => (
- impl<$($name:Show),*> Show for ($($name,)*) {
+ #[stable]
+ impl<$($name:Debug),*> Debug for ($($name,)*) {
#[allow(non_snake_case, unused_assignments)]
fn fmt(&self, f: &mut Formatter) -> Result {
try!(write!(f, "("));
tuple! { T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, }
-impl<'a> Show for &'a (any::Any+'a) {
+#[stable]
+impl<'a> Debug for &'a (any::Any+'a) {
fn fmt(&self, f: &mut Formatter) -> Result { f.pad("&Any") }
}
-impl<T: Show> Show for [T] {
+#[stable]
+impl<T: Debug> Debug for [T] {
fn fmt(&self, f: &mut Formatter) -> Result {
if f.flags & (1 << (rt::FlagAlternate as uint)) == 0 {
try!(write!(f, "["));
}
}
-impl Show for () {
+#[stable]
+impl Debug for () {
fn fmt(&self, f: &mut Formatter) -> Result {
f.pad("()")
}
}
-impl<T: Copy + Show> Show for Cell<T> {
+#[stable]
+impl<T: Copy + Debug> Debug for Cell<T> {
fn fmt(&self, f: &mut Formatter) -> Result {
write!(f, "Cell {{ value: {:?} }}", self.get())
}
}
-#[unstable]
-impl<T: Show> Show for RefCell<T> {
+#[stable]
+impl<T: Debug> Debug for RefCell<T> {
fn fmt(&self, f: &mut Formatter) -> Result {
match self.try_borrow() {
Some(val) => write!(f, "RefCell {{ value: {:?} }}", val),
}
}
-impl<'b, T: Show> Show for Ref<'b, T> {
- fn fmt(&self, f: &mut Formatter) -> Result {
- Show::fmt(&**self, f)
- }
-}
-
-impl<'b, T: Show> Show for RefMut<'b, T> {
+#[stable]
+impl<'b, T: Debug> Debug for Ref<'b, T> {
fn fmt(&self, f: &mut Formatter) -> Result {
- Show::fmt(&*(self.deref()), f)
+ Debug::fmt(&**self, f)
}
}
#[stable]
-impl String for Utf8Error {
+impl<'b, T: Debug> Debug for RefMut<'b, T> {
fn fmt(&self, f: &mut Formatter) -> Result {
- match *self {
- Utf8Error::InvalidByte(n) => {
- write!(f, "invalid utf-8: invalid byte at index {}", n)
- }
- Utf8Error::TooShort => {
- write!(f, "invalid utf-8: byte slice too short")
- }
- }
+ Debug::fmt(&*(self.deref()), f)
}
}
macro_rules! radix_fmt {
($T:ty as $U:ty, $fmt:ident, $S:expr) => {
- impl fmt::Show for RadixFmt<$T, Radix> {
+ #[stable]
+ impl fmt::Debug for RadixFmt<$T, Radix> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- try!(fmt::String::fmt(self, f));
- f.write_str($S)
+ fmt::Display::fmt(self, f)
}
}
- impl fmt::String for RadixFmt<$T, Radix> {
+ #[stable]
+ impl fmt::Display for RadixFmt<$T, Radix> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self { RadixFmt(ref x, radix) => radix.$fmt(*x as $U, f) }
}
}
macro_rules! int_base {
($Trait:ident for $T:ident as $U:ident -> $Radix:ident) => {
+ #[stable]
impl fmt::$Trait for $T {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
$Radix.fmt_int(*self as $U, f)
macro_rules! show {
($T:ident with $S:expr) => {
- impl fmt::Show for $T {
+ #[stable]
+ impl fmt::Debug for $T {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- try!(fmt::String::fmt(self, f));
- f.write_str($S)
+ fmt::Display::fmt(self, f)
}
}
}
integer! { $Int, $Uint, stringify!($Int), stringify!($Uint) }
};
($Int:ident, $Uint:ident, $SI:expr, $SU:expr) => {
- int_base! { String for $Int as $Int -> Decimal }
+ int_base! { Display for $Int as $Int -> Decimal }
int_base! { Binary for $Int as $Uint -> Binary }
int_base! { Octal for $Int as $Uint -> Octal }
int_base! { LowerHex for $Int as $Uint -> LowerHex }
radix_fmt! { $Int as $Int, fmt_int, $SI }
show! { $Int with $SI }
- int_base! { String for $Uint as $Uint -> Decimal }
+ int_base! { Display for $Uint as $Uint -> Decimal }
int_base! { Binary for $Uint as $Uint -> Binary }
int_base! { Octal for $Uint as $Uint -> Octal }
int_base! { LowerHex for $Uint as $Uint -> LowerHex }
use marker::Sized;
-#[cfg(stage0)] use any::TypeId;
-
pub type GlueFn = extern "Rust" fn(*const i8);
#[lang="ty_desc"]
/// Gets an identifier which is globally unique to the specified type. This
/// function will return the same value for a type regardless of whichever
/// crate it is invoked in.
- #[cfg(not(stage0))]
pub fn type_id<T: ?Sized + 'static>() -> u64;
- #[cfg(stage0)]
- pub fn type_id<T: ?Sized + 'static>() -> TypeId;
-
/// Create a value initialized to zero.
///
/// `init` is unsafe because it returns a zeroed-out datum,
fn size_hint(&self) -> (uint, Option<uint>) { (0, None) }
}
+// FIXME(#21363) remove `old_impl_check` when bug is fixed
+#[old_impl_check]
+impl<'a, T> Iterator for &'a mut (Iterator<Item=T> + 'a) {
+ type Item = T;
+
+ fn next(&mut self) -> Option<T> {
+ (**self).next()
+ }
+
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ (**self).size_hint()
+ }
+}
+
/// Conversion from an `Iterator`
#[stable]
#[rustc_on_unimplemented="a collection of type `{Self}` cannot be \
#![feature(unboxed_closures)]
#![allow(unknown_features)] #![feature(int_uint)]
#![feature(on_unimplemented)]
+// FIXME(#21363) remove `old_impl_check` when bug is fixed
+#![feature(old_impl_check)]
#![deny(missing_docs)]
#[macro_use]
pub mod str;
pub mod hash;
pub mod fmt;
+pub mod error;
// note: does not need to be public
mod tuple;
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub struct InvariantLifetime<'a>;
-/// A type which is considered "not sendable", meaning that it cannot
-/// be safely sent between tasks, even if it is owned. This is
-/// typically embedded in other types, such as `Gc`, to ensure that
-/// their instances remain thread-local.
-#[unstable = "likely to change with new variance strategy"]
-#[lang="no_send_bound"]
-#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
-#[cfg(stage0)] // NOTE remove impl after next snapshot
-pub struct NoSend;
-
/// A type which is considered "not POD", meaning that it is not
/// implicitly copyable. This is typically embedded in other types to
/// ensure that they are never copied, even if they lack a destructor.
#[allow(missing_copy_implementations)]
pub struct NoCopy;
-/// A type which is considered "not sync", meaning that
-/// its contents are not threadsafe, hence they cannot be
-/// shared between tasks.
-#[unstable = "likely to change with new variance strategy"]
-#[lang="no_sync_bound"]
-#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
-#[cfg(stage0)] // NOTE remove impl after next snapshot
-pub struct NoSync;
-
/// A type which is considered managed by the GC. This is typically
/// embedded in other types.
#[unstable = "likely to change with new variance strategy"]
//! Implementing these traits allows you to get an effect similar to
//! overloading operators.
//!
-//! The values for the right hand side of an operator are automatically
-//! borrowed, so `a + b` is sugar for `a.add(&b)`.
-//!
-//! All of these traits are imported by the prelude, so they are available in
+//! Some of these traits are imported by the prelude, so they are available in
//! every Rust program.
//!
+//! Many of the operators take their operands by value. In non-generic
+//! contexts involving built-in types, this is usually not a problem.
+//! However, using these operators in generic code, requires some
+//! attention if values have to be reused as opposed to letting the operators
+//! consume them. One option is to occasionally use `clone()`.
+//! Another option is to rely on the types involved providing additional
+//! operator implementations for references. For example, for a user-defined
+//! type `T` which is supposed to support addition, it is probably a good
+//! idea to have both `T` and `&T` implement the traits `Add<T>` and `Add<&T>`
+//! so that generic code can be written without unnecessary cloning.
+//!
//! # Example
//!
//! This example creates a `Point` struct that implements `Add` and `Sub`, and then
//! demonstrates adding and subtracting two `Point`s.
//!
//! ```rust
-//! #![feature(associated_types)]
-//!
//! use std::ops::{Add, Sub};
//!
//! #[derive(Show)]
fn drop(&mut self);
}
+// implements the unary operator "op &T"
+// based on "op T" where T is expected to be `Copy`able
+macro_rules! forward_ref_unop {
+ (impl $imp:ident, $method:ident for $t:ty) => {
+ #[unstable = "recently added, waiting for dust to settle"]
+ impl<'a> $imp for &'a $t {
+ type Output = <$t as $imp>::Output;
+
+ #[inline]
+ fn $method(self) -> <$t as $imp>::Output {
+ $imp::$method(*self)
+ }
+ }
+ }
+}
+
+// implements binary operators "&T op U", "T op &U", "&T op &U"
+// based on "T op U" where T and U are expected to be `Copy`able
+macro_rules! forward_ref_binop {
+ (impl $imp:ident, $method:ident for $t:ty, $u:ty) => {
+ #[unstable = "recently added, waiting for dust to settle"]
+ impl<'a> $imp<$u> for &'a $t {
+ type Output = <$t as $imp<$u>>::Output;
+
+ #[inline]
+ fn $method(self, other: $u) -> <$t as $imp<$u>>::Output {
+ $imp::$method(*self, other)
+ }
+ }
+
+ #[unstable = "recently added, waiting for dust to settle"]
+ impl<'a> $imp<&'a $u> for $t {
+ type Output = <$t as $imp<$u>>::Output;
+
+ #[inline]
+ fn $method(self, other: &'a $u) -> <$t as $imp<$u>>::Output {
+ $imp::$method(self, *other)
+ }
+ }
+
+ #[unstable = "recently added, waiting for dust to settle"]
+ impl<'a, 'b> $imp<&'a $u> for &'b $t {
+ type Output = <$t as $imp<$u>>::Output;
+
+ #[inline]
+ fn $method(self, other: &'a $u) -> <$t as $imp<$u>>::Output {
+ $imp::$method(*self, *other)
+ }
+ }
+ }
+}
+
/// The `Add` trait is used to specify the functionality of `+`.
///
/// # Example
/// calling `add`, and therefore, `main` prints `Adding!`.
///
/// ```rust
-/// #![feature(associated_types)]
-///
/// use std::ops::Add;
///
/// #[derive(Copy)]
#[inline]
fn add(self, other: $t) -> $t { self + other }
}
+
+ forward_ref_binop! { impl Add, add for $t, $t }
)*)
}
/// calling `sub`, and therefore, `main` prints `Subtracting!`.
///
/// ```rust
-/// #![feature(associated_types)]
-///
/// use std::ops::Sub;
///
/// #[derive(Copy)]
#[inline]
fn sub(self, other: $t) -> $t { self - other }
}
+
+ forward_ref_binop! { impl Sub, sub for $t, $t }
)*)
}
/// calling `mul`, and therefore, `main` prints `Multiplying!`.
///
/// ```rust
-/// #![feature(associated_types)]
-///
/// use std::ops::Mul;
///
/// #[derive(Copy)]
#[inline]
fn mul(self, other: $t) -> $t { self * other }
}
+
+ forward_ref_binop! { impl Mul, mul for $t, $t }
)*)
}
/// calling `div`, and therefore, `main` prints `Dividing!`.
///
/// ```
-/// #![feature(associated_types)]
-///
/// use std::ops::Div;
///
/// #[derive(Copy)]
#[inline]
fn div(self, other: $t) -> $t { self / other }
}
+
+ forward_ref_binop! { impl Div, div for $t, $t }
)*)
}
/// calling `rem`, and therefore, `main` prints `Remainder-ing!`.
///
/// ```
-/// #![feature(associated_types)]
-///
/// use std::ops::Rem;
///
/// #[derive(Copy)]
#[inline]
fn rem(self, other: $t) -> $t { self % other }
}
+
+ forward_ref_binop! { impl Rem, rem for $t, $t }
)*)
}
unsafe { $fmod(self, other) }
}
}
+
+ forward_ref_binop! { impl Rem, rem for $t, $t }
}
}
/// `neg`, and therefore, `main` prints `Negating!`.
///
/// ```
-/// #![feature(associated_types)]
-///
/// use std::ops::Neg;
///
/// struct Foo;
#[stable]
fn neg(self) -> $t { -self }
}
+
+ forward_ref_unop! { impl Neg, neg for $t }
)*)
}
#[inline]
fn neg(self) -> $t { -(self as $t_signed) as $t }
}
+
+ forward_ref_unop! { impl Neg, neg for $t }
}
}
/// `not`, and therefore, `main` prints `Not-ing!`.
///
/// ```
-/// #![feature(associated_types)]
-///
/// use std::ops::Not;
///
/// struct Foo;
#[inline]
fn not(self) -> $t { !self }
}
+
+ forward_ref_unop! { impl Not, not for $t }
)*)
}
/// calling `bitand`, and therefore, `main` prints `Bitwise And-ing!`.
///
/// ```
-/// #![feature(associated_types)]
-///
/// use std::ops::BitAnd;
///
/// #[derive(Copy)]
#[inline]
fn bitand(self, rhs: $t) -> $t { self & rhs }
}
+
+ forward_ref_binop! { impl BitAnd, bitand for $t, $t }
)*)
}
/// calling `bitor`, and therefore, `main` prints `Bitwise Or-ing!`.
///
/// ```
-/// #![feature(associated_types)]
-///
/// use std::ops::BitOr;
///
/// #[derive(Copy)]
#[inline]
fn bitor(self, rhs: $t) -> $t { self | rhs }
}
+
+ forward_ref_binop! { impl BitOr, bitor for $t, $t }
)*)
}
/// calling `bitxor`, and therefore, `main` prints `Bitwise Xor-ing!`.
///
/// ```
-/// #![feature(associated_types)]
-///
/// use std::ops::BitXor;
///
/// #[derive(Copy)]
#[inline]
fn bitxor(self, other: $t) -> $t { self ^ other }
}
+
+ forward_ref_binop! { impl BitXor, bitxor for $t, $t }
)*)
}
/// calling `shl`, and therefore, `main` prints `Shifting left!`.
///
/// ```
-/// #![feature(associated_types)]
-///
/// use std::ops::Shl;
///
/// #[derive(Copy)]
self << other
}
}
+
+ forward_ref_binop! { impl Shl, shl for $t, $f }
)
}
/// calling `shr`, and therefore, `main` prints `Shifting right!`.
///
/// ```
-/// #![feature(associated_types)]
-///
/// use std::ops::Shr;
///
/// #[derive(Copy)]
self >> other
}
}
+
+ forward_ref_binop! { impl Shr, shr for $t, $f }
)
}
#[unstable = "API still in development"]
pub struct FullRange;
-#[unstable = "API still in development"]
-impl fmt::Show for FullRange {
+#[stable]
+impl fmt::Debug for FullRange {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
- fmt::Show::fmt("..", fmt)
+ fmt::Debug::fmt("..", fmt)
}
}
#[unstable = "API still in development"]
impl<Idx: Clone + Step> ExactSizeIterator for Range<Idx> {}
-#[unstable = "API still in development"]
-impl<Idx: fmt::Show> fmt::Show for Range<Idx> {
+#[stable]
+impl<Idx: fmt::Debug> fmt::Debug for Range<Idx> {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
write!(fmt, "{:?}..{:?}", self.start, self.end)
}
}
}
-#[unstable = "API still in development"]
-impl<Idx: fmt::Show> fmt::Show for RangeFrom<Idx> {
+#[stable]
+impl<Idx: fmt::Debug> fmt::Debug for RangeFrom<Idx> {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
write!(fmt, "{:?}..", self.start)
}
pub end: Idx,
}
-#[unstable = "API still in development"]
-impl<Idx: fmt::Show> fmt::Show for RangeTo<Idx> {
+#[stable]
+impl<Idx: fmt::Debug> fmt::Debug for RangeTo<Idx> {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
write!(fmt, "..{:?}", self.end)
}
/// struct.
///
/// ```
-/// #![feature(associated_types)]
-///
/// use std::ops::Deref;
///
/// struct DerefExample<T> {
/// struct.
///
/// ```
-/// #![feature(associated_types)]
-///
/// use std::ops::{Deref, DerefMut};
///
/// struct DerefMutExample<T> {
use self::Result::{Ok, Err};
use clone::Clone;
-use fmt::Show;
+use fmt::Display;
use iter::{Iterator, IteratorExt, DoubleEndedIterator, FromIterator, ExactSizeIterator};
use ops::{FnMut, FnOnce};
use option::Option::{self, None, Some};
}
#[stable]
-impl<T, E: Show> Result<T, E> {
+impl<T, E: Display> Result<T, E> {
/// Unwraps a result, yielding the content of an `Ok`.
///
/// # Panics
match self {
Ok(t) => t,
Err(e) =>
- panic!("called `Result::unwrap()` on an `Err` value: {:?}", e)
+ panic!("called `Result::unwrap()` on an `Err` value: {}", e)
}
}
}
#[stable]
-impl<T: Show, E> Result<T, E> {
+impl<T: Display, E> Result<T, E> {
/// Unwraps a result, yielding the content of an `Err`.
///
/// # Panics
pub fn unwrap_err(self) -> E {
match self {
Ok(t) =>
- panic!("called `Result::unwrap_err()` on an `Ok` value: {:?}", t),
+ panic!("called `Result::unwrap_err()` on an `Ok` value: {}", t),
Err(e) => e
}
}
#[inline]
fn init(&self) -> &[T] {
- &self[..(self.len() - 1)]
+ &self[..self.len() - 1]
}
#[inline]
#[inline]
fn ends_with(&self, needle: &[T]) -> bool where T: PartialEq {
let (m, n) = (self.len(), needle.len());
- m >= n && needle == &self[(m-n)..]
+ m >= n && needle == &self[m-n..]
}
#[unstable]
None => self.finish(),
Some(idx) => {
let ret = Some(&self.v[..idx]);
- self.v = &self.v[(idx + 1)..];
+ self.v = &self.v[idx + 1..];
ret
}
}
match self.v.iter().rposition(|x| (self.pred)(x)) {
None => self.finish(),
Some(idx) => {
- let ret = Some(&self.v[(idx + 1)..]);
+ let ret = Some(&self.v[idx + 1..]);
self.v = &self.v[..idx];
ret
}
}
}
+#[stable]
+impl<'a, T> ExactSizeIterator for Chunks<'a, T> {}
+
#[unstable = "trait is experimental"]
impl<'a, T> RandomAccessIterator for Chunks<'a, T> {
#[inline]
}
}
+#[stable]
+impl<'a, T> ExactSizeIterator for ChunksMut<'a, T> {}
//
// Free functions
use cmp::{self, Eq};
use default::Default;
-use iter::range;
+use error::Error;
+use fmt;
use iter::ExactSizeIterator;
+use iter::range;
use iter::{Map, Iterator, IteratorExt, DoubleEndedIterator};
use marker::Sized;
use mem;
}
}
+#[stable]
+impl Error for Utf8Error {
+ fn description(&self) -> &str {
+ match *self {
+ Utf8Error::TooShort => "invalid utf-8: not enough bytes",
+ Utf8Error::InvalidByte(..) => "invalid utf-8: corrupt contents",
+ }
+ }
+}
+
+#[stable]
+impl fmt::Display for Utf8Error {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ match *self {
+ Utf8Error::InvalidByte(n) => {
+ write!(f, "invalid utf-8: invalid byte at index {}", n)
+ }
+ Utf8Error::TooShort => {
+ write!(f, "invalid utf-8: byte slice too short")
+ }
+ }
+ }
+}
+
/*
Section: Iterators
*/
/// Any string that can be represented as a slice
#[unstable = "Instead of taking this bound generically, this trait will be \
- replaced with one of slicing syntax, deref coercions, or \
+ replaced with one of slicing syntax (&foo[]), deref coercions, or \
a more generic conversion trait"]
pub trait Str {
/// Work with `self` as a slice.
#[inline]
fn ends_with(&self, needle: &str) -> bool {
let (m, n) = (self.len(), needle.len());
- m >= n && needle.as_bytes() == &self.as_bytes()[(m-n)..]
+ m >= n && needle.as_bytes() == &self.as_bytes()[m-n..]
}
#[inline]
// option. This file may not be copied, modified, or distributed
// except according to those terms.
+#![allow(deprecated)]
+
use core::finally::{try_finally, Finally};
use std::thread::Thread;
assert!(format!("{}", -1i16) == "-1");
assert!(format!("{}", -1i32) == "-1");
assert!(format!("{}", -1i64) == "-1");
- assert!(format!("{:?}", 1i) == "1i");
- assert!(format!("{:?}", 1i8) == "1i8");
- assert!(format!("{:?}", 1i16) == "1i16");
- assert!(format!("{:?}", 1i32) == "1i32");
- assert!(format!("{:?}", 1i64) == "1i64");
+ assert!(format!("{:?}", 1i) == "1");
+ assert!(format!("{:?}", 1i8) == "1");
+ assert!(format!("{:?}", 1i16) == "1");
+ assert!(format!("{:?}", 1i32) == "1");
+ assert!(format!("{:?}", 1i64) == "1");
assert!(format!("{:b}", 1i) == "1");
assert!(format!("{:b}", 1i8) == "1");
assert!(format!("{:b}", 1i16) == "1");
assert!(format!("{}", 1u16) == "1");
assert!(format!("{}", 1u32) == "1");
assert!(format!("{}", 1u64) == "1");
- assert!(format!("{:?}", 1u) == "1u");
- assert!(format!("{:?}", 1u8) == "1u8");
- assert!(format!("{:?}", 1u16) == "1u16");
- assert!(format!("{:?}", 1u32) == "1u32");
- assert!(format!("{:?}", 1u64) == "1u64");
+ assert!(format!("{:?}", 1u) == "1");
+ assert!(format!("{:?}", 1u8) == "1");
+ assert!(format!("{:?}", 1u16) == "1");
+ assert!(format!("{:?}", 1u32) == "1");
+ assert!(format!("{:?}", 1u64) == "1");
assert!(format!("{:b}", 1u) == "1");
assert!(format!("{:b}", 1u8) == "1");
assert!(format!("{:b}", 1u16) == "1");
#[test]
fn test_format_int_zero() {
assert!(format!("{}", 0i) == "0");
- assert!(format!("{:?}", 0i) == "0i");
+ assert!(format!("{:?}", 0i) == "0");
assert!(format!("{:b}", 0i) == "0");
assert!(format!("{:o}", 0i) == "0");
assert!(format!("{:x}", 0i) == "0");
assert!(format!("{:X}", 0i) == "0");
assert!(format!("{}", 0u) == "0");
- assert!(format!("{:?}", 0u) == "0u");
+ assert!(format!("{:?}", 0u) == "0");
assert!(format!("{:b}", 0u) == "0");
assert!(format!("{:o}", 0u) == "0");
assert!(format!("{:x}", 0u) == "0");
fn test_double_ended_flat_map() {
let u = [0u,1];
let v = [5u,6,7,8];
- let mut it = u.iter().flat_map(|x| v[(*x)..v.len()].iter());
+ let mut it = u.iter().flat_map(|x| v[*x..v.len()].iter());
assert_eq!(it.next_back().unwrap(), &8);
assert_eq!(it.next().unwrap(), &5);
assert_eq!(it.next_back().unwrap(), &7);
// except according to those terms.
use core::cmp::PartialEq;
-use core::fmt::Show;
+use core::fmt::Debug;
use core::num::{NumCast, cast};
use core::ops::{Add, Sub, Mul, Div, Rem};
use core::marker::Copy;
T: PartialEq + NumCast
+ Add<Output=T> + Sub<Output=T>
+ Mul<Output=T> + Div<Output=T>
- + Rem<Output=T> + Show
+ + Rem<Output=T> + Debug
+ Copy
{
assert_eq!(ten.add(two), cast(12i).unwrap());
#[test]
pub fn test_and() {
assert_eq!(op1().and(Ok(667i)).unwrap(), 667);
- assert_eq!(op1().and(Err::<(), &'static str>("bad")).unwrap_err(),
+ assert_eq!(op1().and(Err::<i32, &'static str>("bad")).unwrap_err(),
"bad");
assert_eq!(op2().and(Ok(667i)).unwrap_err(), "sadface");
- assert_eq!(op2().and(Err::<(),&'static str>("bad")).unwrap_err(),
+ assert_eq!(op2().and(Err::<i32,&'static str>("bad")).unwrap_err(),
"sadface");
}
let err: Result<int, &'static str> = Err("Err");
let s = format!("{:?}", ok);
- assert_eq!(s, "Ok(100i)");
+ assert_eq!(s, "Ok(100)");
let s = format!("{:?}", err);
assert_eq!(s, "Err(\"Err\")");
}
#[test]
fn test_show() {
let s = format!("{:?}", (1i,));
- assert_eq!(s, "(1i,)");
+ assert_eq!(s, "(1,)");
let s = format!("{:?}", (1i, true));
- assert_eq!(s, "(1i, true)");
+ assert_eq!(s, "(1, true)");
let s = format!("{:?}", (1i, "hi", true));
- assert_eq!(s, "(1i, \"hi\", true)");
+ assert_eq!(s, "(1, \"hi\", true)");
}
}
}
-impl fmt::String for Fail {
+impl fmt::Display for Fail {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
ArgumentMissing(ref nm) => {
(B, Cr, UnderLim) => { B }
(B, Cr, OverLim) if (i - last_start + 1) > lim
=> panic!("word starting with {} longer than limit!",
- &ss[last_start..(i + 1)]),
+ &ss[last_start..i + 1]),
(B, Cr, OverLim) => {
*cont = it(&ss[slice_start..last_end]);
slice_start = last_start;
///
/// Passing an invalid string (containing spaces, brackets,
/// quotes, ...) will return an empty `Err` value.
- pub fn new<Name: IntoCow<'a, String, str>>(name: Name) -> Result<Id<'a>, ()> {
+ pub fn new<Name: IntoCow<'a, String, str>>(name: Name) -> Option<Id<'a>> {
let name = name.into_cow();
{
let mut chars = name.chars();
match chars.next() {
Some(c) if is_letter_or_underscore(c) => { ; },
- _ => return Err(())
+ _ => return None
}
if !chars.all(is_constituent) {
- return Err(());
+ return None
}
}
- return Ok(Id{ name: name });
+ return Some(Id{ name: name });
fn is_letter_or_underscore(c: char) -> bool {
in_range('a', c, 'z') || in_range('A', c, 'Z') || c == '_'
fn simple_id_construction() {
let id1 = Id::new("hello");
match id1 {
- Ok(_) => {;},
- Err(_) => panic!("'hello' is not a valid value for id anymore")
+ Some(_) => {;},
+ None => panic!("'hello' is not a valid value for id anymore")
}
}
fn badly_formatted_id() {
let id2 = Id::new("Weird { struct : ure } !!!");
match id2 {
- Ok(_) => panic!("graphviz id suddenly allows spaces, brackets and stuff"),
- Err(_) => {;}
+ Some(_) => panic!("graphviz id suddenly allows spaces, brackets and stuff"),
+ None => {;}
}
}
}
}
}
-impl<'a,T:fmt::Show> fmt::Show for MaybeOwnedVector<'a,T> {
+impl<'a,T:fmt::Debug> fmt::Debug for MaybeOwnedVector<'a,T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
self.as_slice().fmt(f)
}
use types::os::arch::c95::c_int;
use types::os::common::posix01::sighandler_t;
- #[cfg(not(target_os = "android"))]
+ #[cfg(not(all(target_os = "android", target_arch = "arm")))]
extern {
pub fn signal(signum: c_int,
handler: sighandler_t) -> sighandler_t;
}
- #[cfg(target_os = "android")]
+ #[cfg(all(target_os = "android", target_arch = "arm"))]
extern {
#[link_name = "bsd_signal"]
pub fn signal(signum: c_int,
use std::io;
use std::mem;
use std::os;
+use std::ptr;
use std::rt;
use std::slice;
use std::sync::{Once, ONCE_INIT};
}
/// Wraps the log level with fmt implementations.
-#[derive(Copy, PartialEq, PartialOrd)]
+#[derive(Copy, PartialEq, PartialOrd, Show)]
pub struct LogLevel(pub u32);
-impl fmt::Show for LogLevel {
- fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt(self, fmt)
- }
-}
-
-impl fmt::String for LogLevel {
+impl fmt::Display for LogLevel {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
let LogLevel(level) = *self;
match LOG_LEVEL_NAMES.get(level as uint - 1) {
- Some(ref name) => fmt::String::fmt(name, fmt),
- None => fmt::String::fmt(&level, fmt)
+ Some(ref name) => fmt::Display::fmt(name, fmt),
+ None => fmt::Display::fmt(&level, fmt)
}
}
}
assert!(!DIRECTIVES.is_null());
let _directives: Box<Vec<directive::LogDirective>> =
mem::transmute(DIRECTIVES);
- DIRECTIVES = 0 as *const Vec<directive::LogDirective>;
+ DIRECTIVES = ptr::null();
if !FILTER.is_null() {
let _filter: Box<Regex> = mem::transmute(FILTER);
- FILTER = 0 as *const _;
+ FILTER = ptr::null();
}
});
}
pub use self::Error::*;
use std::str;
+use std::fmt;
pub mod io;
IoError(std::io::IoError),
ApplicationError(String)
}
+
+impl fmt::Display for Error {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ // FIXME: this should be a more useful display form
+ fmt::Debug::fmt(self, f)
+ }
+}
// --------------------------------------
pub mod reader {
///
/// (Once an expression is compiled, it is not possible to produce an error
/// via searching, splitting or replacing.)
+#[derive(Show)]
pub struct Error {
/// The *approximate* character index of where the error occurred.
pub pos: uint,
pub msg: String,
}
-impl fmt::Show for Error {
+impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Regex syntax error near position {}: {:?}",
self.pos, self.msg)
};
self.chari = closer;
let greed = try!(self.get_next_greedy());
- let inner = self.chars[(start+1)..closer].iter().cloned()
+ let inner = self.chars[start+1..closer].iter().cloned()
.collect::<String>();
// Parse the min and max values from the regex.
}
}
-impl fmt::String for Regex {
+impl fmt::Display for Regex {
/// Shows the original regular expression.
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt(self.as_str(), f)
+ fmt::Display::fmt(self.as_str(), f)
}
}
#![allow(non_snake_case)]
-register_diagnostic! { E0001, r##"
+register_long_diagnostics! {
+ E0001: r##"
This error suggests that the expression arm corresponding to the noted pattern
will never be reached as for all possible values of the expression being matched,
one of the preceeding patterns will match.
This means that perhaps some of the preceeding patterns are too general, this
one is too specific or the ordering is incorrect.
-"## }
+"##,
+
+ E0003: r##"
+ Not-a-Number (NaN) values can not be compared for equality and hence can never match
+ the input to a match expression. To match against NaN values, you should instead use
+ the `is_nan` method in a guard, as in: x if x.is_nan() => ...
+"##,
+
+ E0004: r##"
+ This error indicates that the compiler can not guarantee a matching pattern for one
+ or more possible inputs to a match expression. Guaranteed matches are required in order
+ to assign values to match expressions, or alternatively, determine the flow of execution.
+
+ If you encounter this error you must alter your patterns so that every possible value of
+ the input type is matched. For types with a small number of variants (like enums) you
+ should probably cover all cases explicitly. Alternatively, the underscore `_` wildcard
+ pattern can be added after all other patterns to match "anything else".
+"##,
+
+ // FIXME: Remove duplication here?
+ E0005: r##"
+ Patterns used to bind names must be irrefutable, that is, they must guarantee that a
+ name will be extracted in all cases. If you encounter this error you probably need
+ to use a `match` or `if let` to deal with the possibility of failure.
+"##,
+
+ E0006: r##"
+ Patterns used to bind names must be irrefutable, that is, they must guarantee that a
+ name will be extracted in all cases. If you encounter this error you probably need
+ to use a `match` or `if let` to deal with the possibility of failure.
+"##
+}
register_diagnostics! {
E0002,
- E0003,
- E0004,
- E0005,
- E0006,
E0007,
E0008,
E0009,
E0010,
E0011,
E0012,
- E0013,
E0014,
E0015,
E0016,
E0137,
E0138,
E0139,
- E0140,
E0152,
- E0153,
- E0157,
E0158,
E0161,
E0162,
E0165,
- E0166,
- E0167,
- E0168,
- E0169,
E0170,
- E0171,
- E0172,
- E0173,
- E0174,
- E0177,
- E0178,
- E0179
+ E0261, // use of undeclared lifetime name
+ E0262, // illegal lifetime parameter name
+ E0263, // lifetime name declared twice in same scope
+ E0264, // unknown external lang item
+ E0265, // recursive constant
+ E0266, // expected item
+ E0267, // thing inside of a closure
+ E0268, // thing outside of a loop
+ E0269, // not all control paths return a value
+ E0270, // computation may converge in a function marked as diverging
+ E0271, // type mismatch resolving
+ E0272, // rustc_on_unimplemented attribute refers to non-existent type parameter
+ E0273, // rustc_on_unimplemented must have named format arguments
+ E0274, // rustc_on_unimplemented must have a value
+ E0275, // overflow evaluating requirement
+ E0276, // requirement appears on impl method but not on corresponding trait method
+ E0277, // trait is not implemented for type
+ E0278, // requirement is not satisfied
+ E0279, // requirement is not satisfied
+ E0280, // requirement is not satisfied
+ E0281, // type implements trait but other trait is required
+ E0282, // unable to infer enough type information about
+ E0283, // cannot resolve type
+ E0284, // cannot resolve type
+ E0285, // overflow evaluation builtin bounds
+ E0296, // malformed recursion limit attribute
+ E0297, // refutable pattern in for loop binding
+ E0298, // mismatched types between arms
+ E0299, // mismatched types between arms
+ E0300, // unexpanded macro
+ E0301, // cannot mutable borrow in a pattern guard
+ E0302, // cannot assign in a pattern guard
+ E0303, // pattern bindings are not allowed after an `@`
+ E0304, // expected signed integer constant
+ E0305, // expected constant
+ E0306, // expected positive integer for repeat count
+ E0307, // expected constant integer for repeat count
+ E0308,
+ E0309, // thing may not live long enough
+ E0310, // thing may not live long enough
+ E0311, // thing may not live long enough
+ E0312, // lifetime of reference outlives lifetime of borrowed content
+ E0313, // lifetime of borrowed pointer outlives lifetime of captured variable
+ E0314, // closure outlives stack frame
+ E0315 // cannot invoke closure outside of its lifetime
}
+
+__build_diagnostic_array! { DIAGNOSTICS }
+
pub use rustc_llvm as llvm;
-mod diagnostics;
+// NB: This module needs to be declared first so diagnostics are
+// registered before they are used.
+pub mod diagnostics;
pub mod back {
pub use rustc_back::abi;
pub use llvm;
}
-__build_diagnostic_array! { DIAGNOSTICS }
-
// A private module so that macro-expanded idents like
// `::rustc::lint::Lint` will also work in `rustc` itself.
//
let ident = path1.node;
if let ast::BindByValue(ast::MutMutable) = mode {
if !token::get_ident(ident).get().starts_with("_") {
- match mutables.entry(ident.name.uint()) {
+ match mutables.entry(ident.name.usize()) {
Vacant(entry) => { entry.insert(vec![id]); },
Occupied(mut entry) => { entry.get_mut().push(id); },
}
// We have one lint pass defined in this module.
self.register_pass(sess, false, box GatherNodeLevels as LintPassObject);
- // Insert temporary renamings for a one-time deprecation (#16545)
- self.register_renamed("unnecessary_typecast", "unused_typecasts");
- self.register_renamed("unsigned_negate", "unsigned_negation");
- self.register_renamed("type_limits", "unused_comparisons");
- self.register_renamed("type_overflow", "overflowing_literals");
- self.register_renamed("ctypes", "improper_ctypes");
- self.register_renamed("owned_heap_memory", "box_pointers");
- self.register_renamed("unused_attribute", "unused_attributes");
- self.register_renamed("path_statement", "path_statements");
- self.register_renamed("unused_result", "unused_results");
- self.register_renamed("non_uppercase_statics", "non_upper_case_globals");
- self.register_renamed("unnecessary_parens", "unused_parens");
- self.register_renamed("unnecessary_import_braces", "unused_import_braces");
- self.register_renamed("unsafe_block", "unsafe_blocks");
- self.register_renamed("unnecessary_allocation", "unused_allocation");
- self.register_renamed("missing_doc", "missing_docs");
- self.register_renamed("unused_extern_crate", "unused_extern_crates");
- self.register_renamed("unnecessary_qualification", "unused_qualifications");
- self.register_renamed("unrecognized_lint", "unknown_lints");
- self.register_renamed("unused_variable", "unused_variables");
- self.register_renamed("dead_assignment", "unused_assignments");
- self.register_renamed("unknown_crate_type", "unknown_crate_types");
- self.register_renamed("variant_size_difference", "variant_size_differences");
- self.register_renamed("transmute_fat_ptr", "fat_ptr_transmutes");
+ // Insert temporary renamings for a one-time deprecation
self.register_renamed("raw_pointer_deriving", "raw_pointer_derive");
}
let mut ret = None;
reader::tagged_docs(tagged_doc.doc, belt, |elt| {
let pos = u64_from_be_bytes(elt.data, elt.start, 4) as uint;
- if eq_fn(&elt.data[(elt.start + 4) .. elt.end]) {
+ if eq_fn(&elt.data[elt.start + 4 .. elt.end]) {
ret = Some(reader::doc_at(d.data, pos).unwrap().doc);
false
} else {
}
}
-fn parse_trait_store_<F>(st: &mut PState, conv: &mut F) -> ty::TraitStore where
- F: FnMut(DefIdSource, ast::DefId) -> ast::DefId,
-{
- match next(st) {
- '~' => ty::UniqTraitStore,
- '&' => ty::RegionTraitStore(parse_region_(st, conv), parse_mutability(st)),
- c => {
- st.tcx.sess.bug(&format!("parse_trait_store(): bad input '{}'",
- c)[])
- }
- }
-}
-
fn parse_vec_per_param_space<'a, 'tcx, T, F>(st: &mut PState<'a, 'tcx>,
mut f: F)
-> VecPerParamSpace<T> where
})
}
-fn parse_onceness(c: char) -> ast::Onceness {
- match c {
- 'o' => ast::Once,
- 'm' => ast::Many,
- _ => panic!("parse_onceness: bad onceness")
- }
-}
-
fn parse_closure_ty<'a, 'tcx, F>(st: &mut PState<'a, 'tcx>,
mut conv: F) -> ty::ClosureTy<'tcx> where
F: FnMut(DefIdSource, ast::DefId) -> ast::DefId,
F: FnMut(DefIdSource, ast::DefId) -> ast::DefId,
{
let unsafety = parse_unsafety(next(st));
- let onceness = parse_onceness(next(st));
- let store = parse_trait_store_(st, conv);
- let bounds = parse_existential_bounds_(st, conv);
let sig = parse_sig_(st, conv);
let abi = parse_abi_set(st);
ty::ClosureTy {
unsafety: unsafety,
- onceness: onceness,
- store: store,
- bounds: bounds,
sig: sig,
abi: abi,
}
}
let crate_part = &buf[0u..colon_idx];
- let def_part = &buf[(colon_idx + 1u)..len];
+ let def_part = &buf[colon_idx + 1u..len];
let crate_num = match str::from_utf8(crate_part).ok().and_then(|s| s.parse::<uint>()) {
Some(cn) => cn as ast::CrateNum,
enc_substs(w, cx, s.substs);
}
-pub fn enc_trait_store(w: &mut SeekableMemWriter, cx: &ctxt, s: ty::TraitStore) {
- match s {
- ty::UniqTraitStore => mywrite!(w, "~"),
- ty::RegionTraitStore(re, m) => {
- mywrite!(w, "&");
- enc_region(w, cx, re);
- enc_mutability(w, m);
- }
- }
-}
-
fn enc_unsafety(w: &mut SeekableMemWriter, p: ast::Unsafety) {
match p {
ast::Unsafety::Normal => mywrite!(w, "n"),
mywrite!(w, "]")
}
-fn enc_onceness(w: &mut SeekableMemWriter, o: ast::Onceness) {
- match o {
- ast::Once => mywrite!(w, "o"),
- ast::Many => mywrite!(w, "m")
- }
-}
-
pub fn enc_bare_fn_ty<'a, 'tcx>(w: &mut SeekableMemWriter, cx: &ctxt<'a, 'tcx>,
ft: &ty::BareFnTy<'tcx>) {
enc_unsafety(w, ft.unsafety);
pub fn enc_closure_ty<'a, 'tcx>(w: &mut SeekableMemWriter, cx: &ctxt<'a, 'tcx>,
ft: &ty::ClosureTy<'tcx>) {
enc_unsafety(w, ft.unsafety);
- enc_onceness(w, ft.onceness);
- enc_trait_store(w, cx, ft.store);
- enc_existential_bounds(w, cx, &ft.bounds);
enc_fn_sig(w, cx, &ft.sig);
enc_abi(w, ft.abi);
}
}
}
-impl tr for ty::TraitStore {
- fn tr(&self, dcx: &DecodeContext) -> ty::TraitStore {
- match *self {
- ty::RegionTraitStore(r, m) => {
- ty::RegionTraitStore(r.tr(dcx), m)
- }
- ty::UniqTraitStore => ty::UniqTraitStore
- }
- }
-}
-
// ______________________________________________________________________
// Encoding and decoding of freevar information
match self.cx {
Loop => {}
Closure => {
- self.sess.span_err(span,
- &format!("`{}` inside of a closure", name)[]);
+ span_err!(self.sess, span, E0267,
+ "`{}` inside of a closure", name);
}
Normal => {
- self.sess.span_err(span,
- &format!("`{}` outside of loop", name)[]);
+ span_err!(self.sess, span, E0268,
+ "`{}` outside of loop", name);
}
}
}
/// ++++++++++++++++++++++++++
/// + _ + [_, _, ..tail] +
/// ++++++++++++++++++++++++++
-impl<'a> fmt::Show for Matrix<'a> {
+impl<'a> fmt::Debug for Matrix<'a> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
try!(write!(f, "\n"));
ast::ExprForLoop(ref pat, _, _, _) => {
let mut static_inliner = StaticInliner::new(cx.tcx);
is_refutable(cx, &*static_inliner.fold_pat((*pat).clone()), |uncovered_pat| {
- cx.tcx.sess.span_err(
- pat.span,
- &format!("refutable pattern in `for` loop binding: \
+ span_err!(cx.tcx.sess, pat.span, E0297,
+ "refutable pattern in `for` loop binding: \
`{}` not covered",
- pat_to_string(uncovered_pat))[]);
+ pat_to_string(uncovered_pat));
});
// Check legality of move bindings.
Some(true) => Some(vec![]),
Some(false) => None,
None => {
- cx.tcx.sess.span_err(pat_span, "mismatched types between arms");
+ span_err!(cx.tcx.sess, pat_span, E0298, "mismatched types between arms");
None
}
}
Some(true) => Some(vec![]),
Some(false) => None,
None => {
- cx.tcx.sess.span_err(pat_span, "mismatched types between arms");
+ span_err!(cx.tcx.sess, pat_span, E0299, "mismatched types between arms");
None
}
}
}
ast::PatMac(_) => {
- cx.tcx.sess.span_err(pat_span, "unexpanded macro");
+ span_err!(cx.tcx.sess, pat_span, E0300, "unexpanded macro");
None
}
};
head.map(|mut head| {
head.push_all(&r[..col]);
- head.push_all(&r[(col + 1)..]);
+ head.push_all(&r[col + 1..]);
head
})
}
_: LoanCause) {
match kind {
MutBorrow => {
- self.cx
- .tcx
- .sess
- .span_err(span,
- "cannot mutably borrow in a pattern guard")
+ span_err!(self.cx.tcx.sess, span, E0301,
+ "cannot mutably borrow in a pattern guard")
}
ImmBorrow | UniqueImmBorrow => {}
}
fn mutate(&mut self, _: NodeId, span: Span, _: cmt, mode: MutateMode) {
match mode {
JustWrite | WriteAndRead => {
- self.cx
- .tcx
- .sess
- .span_err(span, "cannot assign in a pattern guard")
+ span_err!(self.cx.tcx.sess, span, E0302, "cannot assign in a pattern guard")
}
Init => {}
}
impl<'a, 'b, 'tcx, 'v> Visitor<'v> for AtBindingPatternVisitor<'a, 'b, 'tcx> {
fn visit_pat(&mut self, pat: &Pat) {
if !self.bindings_allowed && pat_is_binding(&self.cx.tcx.def_map, pat) {
- self.cx.tcx.sess.span_err(pat.span,
+ span_err!(self.cx.tcx.sess, pat.span, E0303,
"pattern bindings are not allowed \
after an `@`");
}
impl<'a, 'ast, 'v> Visitor<'v> for CheckItemRecursionVisitor<'a, 'ast> {
fn visit_item(&mut self, it: &ast::Item) {
if self.idstack.iter().any(|x| x == &(it.id)) {
- self.sess.span_err(self.root_it.span, "recursive constant");
+ span_err!(self.sess, self.root_it.span, E0265, "recursive constant");
return;
}
self.idstack.push(it.id);
self.visit_item(item),
ast_map::NodeForeignItem(_) => {},
_ => {
- self.sess.span_err(e.span,
- &format!("expected item, found {}",
- self.ast_map.node_to_string(def_id.node))[]);
+ span_err!(self.sess, e.span, E0266,
+ "expected item, found {}",
+ self.ast_map.node_to_string(def_id.node));
return;
},
}
#![allow(dead_code)] // still WIP
-use std::fmt::{Formatter, Error, Show};
+use std::fmt::{Formatter, Error, Debug};
use std::uint;
use std::collections::BitvSet;
pub data: E,
}
-impl<E: Show> Show for Edge<E> {
+impl<E: Debug> Debug for Edge<E> {
fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
write!(f, "Edge {{ next_edge: [{:?}, {:?}], source: {:?}, target: {:?}, data: {:?} }}",
self.next_edge[0], self.next_edge[1], self.source,
#[cfg(test)]
mod test {
use middle::graph::*;
- use std::fmt::Show;
+ use std::fmt::Debug;
type TestNode = Node<&'static str>;
type TestEdge = Edge<&'static str>;
});
}
- fn test_adjacent_edges<N:PartialEq+Show,E:PartialEq+Show>(graph: &Graph<N,E>,
+ fn test_adjacent_edges<N:PartialEq+Debug,E:PartialEq+Debug>(graph: &Graph<N,E>,
start_index: NodeIndex,
start_data: N,
expected_incoming: &[(E,N)],
sig: sig})
}
- fn closure_tys(&self, a: &ty::ClosureTy<'tcx>,
- b: &ty::ClosureTy<'tcx>) -> cres<'tcx, ty::ClosureTy<'tcx>> {
-
- let store = match (a.store, b.store) {
- (ty::RegionTraitStore(a_r, a_m),
- ty::RegionTraitStore(b_r, b_m)) if a_m == b_m => {
- let r = try!(self.contraregions(a_r, b_r));
- ty::RegionTraitStore(r, a_m)
- }
-
- _ if a.store == b.store => {
- a.store
- }
-
- _ => {
- return Err(ty::terr_sigil_mismatch(expected_found(self, a.store, b.store)))
- }
- };
- let unsafety = try!(self.unsafeties(a.unsafety, b.unsafety));
- let onceness = try!(self.oncenesses(a.onceness, b.onceness));
- let bounds = try!(self.existential_bounds(&a.bounds, &b.bounds));
- let sig = try!(self.binders(&a.sig, &b.sig));
- let abi = try!(self.abi(a.abi, b.abi));
- Ok(ty::ClosureTy {
- unsafety: unsafety,
- onceness: onceness,
- store: store,
- bounds: bounds,
- sig: sig,
- abi: abi,
- })
- }
-
fn fn_sigs(&self, a: &ty::FnSig<'tcx>, b: &ty::FnSig<'tcx>) -> cres<'tcx, ty::FnSig<'tcx>> {
if a.variadic != b.variadic {
return Err(ty::terr_variadic_mismatch(expected_found(self, a.variadic, b.variadic)));
fn regions(&self, a: ty::Region, b: ty::Region) -> cres<'tcx, ty::Region>;
- fn trait_stores(&self,
- vk: ty::terr_vstore_kind,
- a: ty::TraitStore,
- b: ty::TraitStore)
- -> cres<'tcx, ty::TraitStore> {
- debug!("{}.trait_stores(a={:?}, b={:?})", self.tag(), a, b);
-
- match (a, b) {
- (ty::RegionTraitStore(a_r, a_m),
- ty::RegionTraitStore(b_r, b_m)) if a_m == b_m => {
- self.contraregions(a_r, b_r).and_then(|r| {
- Ok(ty::RegionTraitStore(r, a_m))
- })
- }
-
- _ if a == b => {
- Ok(a)
- }
-
- _ => {
- Err(ty::terr_trait_stores_differ(vk, expected_found(self, a, b)))
- }
- }
- }
-
fn trait_refs(&self,
a: &ty::TraitRef<'tcx>,
b: &ty::TraitRef<'tcx>)
infer::EquatePredicate(_) => "equality predicate not satisfied",
};
- self.tcx.sess.span_err(
- trace.origin.span(),
- &format!("{}: {} ({})",
+ span_err!(self.tcx.sess, trace.origin.span(), E0308,
+ "{}: {} ({})",
message_root_str,
expected_found_str,
- ty::type_err_to_str(self.tcx, terr))[]);
+ ty::type_err_to_str(self.tcx, terr));
match trace.origin {
infer::MatchExpressionArm(_, arm_span) =>
match sub {
ty::ReFree(ty::FreeRegion {bound_region: ty::BrNamed(..), ..}) => {
// Does the required lifetime have a nice name we can print?
- self.tcx.sess.span_err(
- origin.span(),
- &format!("{} may not live long enough", labeled_user_string)[]);
+ span_err!(self.tcx.sess, origin.span(), E0309,
+ "{} may not live long enough", labeled_user_string);
self.tcx.sess.span_help(
origin.span(),
&format!(
ty::ReStatic => {
// Does the required lifetime have a nice name we can print?
- self.tcx.sess.span_err(
- origin.span(),
- &format!("{} may not live long enough", labeled_user_string)[]);
+ span_err!(self.tcx.sess, origin.span(), E0310,
+ "{} may not live long enough", labeled_user_string);
self.tcx.sess.span_help(
origin.span(),
&format!(
_ => {
// If not, be less specific.
- self.tcx.sess.span_err(
- origin.span(),
- &format!(
+ span_err!(self.tcx.sess, origin.span(), E0311,
"{} may not live long enough",
- labeled_user_string)[]);
+ labeled_user_string);
self.tcx.sess.span_help(
origin.span(),
&format!(
self.report_and_explain_type_error(trace, &terr);
}
infer::Reborrow(span) => {
- self.tcx.sess.span_err(
- span,
+ span_err!(self.tcx.sess, span, E0312,
"lifetime of reference outlines \
lifetime of borrowed content...");
note_and_explain_region(
"");
}
infer::ReborrowUpvar(span, ref upvar_id) => {
- self.tcx.sess.span_err(
- span,
- &format!("lifetime of borrowed pointer outlives \
+ span_err!(self.tcx.sess, span, E0313,
+ "lifetime of borrowed pointer outlives \
lifetime of captured variable `{}`...",
ty::local_var_name_str(self.tcx,
upvar_id.var_id)
.get()
- .to_string())[]);
+ .to_string());
note_and_explain_region(
self.tcx,
"...the borrowed pointer is valid for ",
"");
}
infer::InfStackClosure(span) => {
- self.tcx.sess.span_err(
- span,
+ span_err!(self.tcx.sess, span, E0314,
"closure outlives stack frame");
note_and_explain_region(
self.tcx,
"");
}
infer::InvokeClosure(span) => {
- self.tcx.sess.span_err(
- span,
+ span_err!(self.tcx.sess, span, E0315,
"cannot invoke closure outside of its lifetime");
note_and_explain_region(
self.tcx,
use middle::infer::{uok, ures};
use middle::infer::InferCtxt;
use std::cell::RefCell;
-use std::fmt::Show;
+use std::fmt::Debug;
use syntax::ast;
use util::ppaux::Repr;
use util::snapshot_vec as sv;
/// (possibly not yet known) sort of integer.
///
/// Implementations of this trait are at the end of this file.
-pub trait UnifyKey<'tcx, V> : Clone + Show + PartialEq + Repr<'tcx> {
+pub trait UnifyKey<'tcx, V> : Clone + Debug + PartialEq + Repr<'tcx> {
fn index(&self) -> uint;
fn from_index(u: uint) -> Self;
ContravariantLifetimeItem, "contravariant_lifetime", contravariant_lifetime;
InvariantLifetimeItem, "invariant_lifetime", invariant_lifetime;
- NoSendItem, "no_send_bound", no_send_bound;
NoCopyItem, "no_copy_bound", no_copy_bound;
- NoSyncItem, "no_sync_bound", no_sync_bound;
ManagedItem, "managed_bound", managed_bound;
NonZeroItem, "non_zero", non_zero;
tcx.sess.abort_if_errors();
}
-impl fmt::Show for LiveNode {
+impl fmt::Debug for LiveNode {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "ln({})", self.get())
}
}
-impl fmt::Show for Variable {
+impl fmt::Debug for Variable {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "v({})", self.get())
}
},
_ => false
};
- self.ir.tcx.sess.span_err(
- sp, "not all control paths return a value");
+ span_err!(self.ir.tcx.sess, sp, E0269, "not all control paths return a value");
if ends_with_stmt {
let last_stmt = body.stmts.first().unwrap();
let original_span = original_sp(self.ir.tcx.sess.codemap(),
}
ty::FnDiverging
if self.live_on_entry(entry_ln, self.s.clean_exit_var).is_some() => {
- self.ir.tcx.sess.span_err(sp,
+ span_err!(self.ir.tcx.sess, sp, E0270,
"computation may converge in a function marked as diverging");
}
}
}
- sess.span_err(attr.span, "malformed recursion limit attribute, \
+ span_err!(sess, attr.span, E0296, "malformed recursion limit attribute, \
expected #![recursion_limit=\"N\"]");
}
}
use util::common::can_reach;
use std::cell::RefCell;
-// NOTE(stage0) remove import after a snapshot
-#[cfg(stage0)]
-use std::hash::{Hash};
use syntax::codemap::Span;
use syntax::{ast, visit};
use syntax::ast::{Block, Item, FnDecl, NodeId, Arm, Pat, Stmt, Expr, Local};
}
fn unresolved_lifetime_ref(&self, lifetime_ref: &ast::Lifetime) {
- self.sess.span_err(
- lifetime_ref.span,
- &format!("use of undeclared lifetime name `{}`",
- token::get_name(lifetime_ref.name))[]);
+ span_err!(self.sess, lifetime_ref.span, E0261,
+ "use of undeclared lifetime name `{}`",
+ token::get_name(lifetime_ref.name));
}
fn check_lifetime_defs(&mut self, old_scope: Scope, lifetimes: &Vec<ast::LifetimeDef>) {
let special_idents = [special_idents::static_lifetime];
for lifetime in lifetimes.iter() {
if special_idents.iter().any(|&i| i.name == lifetime.lifetime.name) {
- self.sess.span_err(
- lifetime.lifetime.span,
- &format!("illegal lifetime parameter name: `{}`",
- token::get_name(lifetime.lifetime.name))
- []);
+ span_err!(self.sess, lifetime.lifetime.span, E0262,
+ "illegal lifetime parameter name: `{}`",
+ token::get_name(lifetime.lifetime.name));
}
}
let lifetime_j = &lifetimes[j];
if lifetime_i.lifetime.name == lifetime_j.lifetime.name {
- self.sess.span_err(
- lifetime_j.lifetime.span,
- &format!("lifetime name `{}` declared twice in \
+ span_err!(self.sess, lifetime_j.lifetime.span, E0263,
+ "lifetime name `{}` declared twice in \
the same scope",
- token::get_name(lifetime_j.lifetime.name))
- []);
+ token::get_name(lifetime_j.lifetime.name));
}
}
format!("lifetime name `{}` shadows another \
lifetime name that is already in scope",
token::get_name(lifetime.name)).as_slice());
- self.sess.span_help(
+ self.sess.span_note(
lifetime_def.span,
format!("shadowed lifetime `{}` declared here",
token::get_name(lifetime.name)).as_slice());
- self.sess.span_help(
+ self.sess.span_note(
lifetime.span,
"shadowed lifetimes are deprecated \
and will become a hard error before 1.0");
}
}
-impl<'a> fmt::Show for ScopeChain<'a> {
+impl<'a> fmt::Debug for ScopeChain<'a> {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
match *self {
EarlyScope(space, defs, _) => write!(fmt, "EarlyScope({:?}, {:?})", space, defs),
pub fns: Vec<T>,
}
-impl<T:fmt::Show> fmt::Show for VecPerParamSpace<T> {
+impl<T: fmt::Debug> fmt::Debug for VecPerParamSpace<T> {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
try!(write!(fmt, "VecPerParamSpace {{"));
for space in ParamSpace::all().iter() {
let predicate =
infcx.resolve_type_vars_if_possible(&obligation.predicate);
if !predicate.references_error() {
- infcx.tcx.sess.span_err(
- obligation.cause.span,
- format!(
+ span_err!(infcx.tcx.sess, obligation.cause.span, E0271,
"type mismatch resolving `{}`: {}",
predicate.user_string(infcx.tcx),
- ty::type_err_to_str(infcx.tcx, &error.err)).as_slice());
+ ty::type_err_to_str(infcx.tcx, &error.err));
note_obligation_cause(infcx, obligation);
}
}
Position::ArgumentNamed(s) => match generic_map.get(s) {
Some(val) => Some(val.as_slice()),
None => {
- infcx.tcx.sess
- .span_err(err_sp,
- format!("the #[rustc_on_unimplemented] \
+ span_err!(infcx.tcx.sess, err_sp, E0272,
+ "the #[rustc_on_unimplemented] \
attribute on \
trait definition for {} refers to \
non-existent type parameter {}",
- trait_str, s)
- .as_slice());
+ trait_str, s);
errored = true;
None
}
},
_ => {
- infcx.tcx.sess
- .span_err(err_sp,
- format!("the #[rustc_on_unimplemented] \
+ span_err!(infcx.tcx.sess, err_sp, E0273,
+ "the #[rustc_on_unimplemented] \
attribute on \
trait definition for {} must have named \
format arguments, \
eg `#[rustc_on_unimplemented = \
\"foo {{T}}\"]`",
- trait_str).as_slice());
+ trait_str);
errored = true;
None
}
report = Some(err);
}
} else {
- infcx.tcx.sess.span_err(err_sp,
- format!("the #[rustc_on_unimplemented] attribute on \
+ span_err!(infcx.tcx.sess, err_sp, E0274,
+ "the #[rustc_on_unimplemented] attribute on \
trait definition for {} must have a value, \
eg `#[rustc_on_unimplemented = \"foo\"]`",
- trait_str).as_slice());
+ trait_str);
}
break;
}
// We could track the stack here more precisely if we wanted, I imagine.
let predicate =
infcx.resolve_type_vars_if_possible(&obligation.predicate);
- infcx.tcx.sess.span_err(
- obligation.cause.span,
- format!(
+ span_err!(infcx.tcx.sess, obligation.cause.span, E0275,
"overflow evaluating the requirement `{}`",
- predicate.user_string(infcx.tcx)).as_slice());
+ predicate.user_string(infcx.tcx));
suggest_new_overflow_limit(infcx.tcx, obligation.cause.span);
SelectionError::Unimplemented => {
match &obligation.cause.code {
&ObligationCauseCode::CompareImplMethodObligation => {
- infcx.tcx.sess.span_err(
- obligation.cause.span,
- format!(
+ span_err!(infcx.tcx.sess, obligation.cause.span, E0276,
"the requirement `{}` appears on the impl \
method but not on the corresponding trait method",
- obligation.predicate.user_string(infcx.tcx)).as_slice());
+ obligation.predicate.user_string(infcx.tcx));;
}
_ => {
match obligation.predicate {
if !trait_predicate.references_error() {
let trait_ref = trait_predicate.to_poly_trait_ref();
- infcx.tcx.sess.span_err(
- obligation.cause.span,
- format!(
+ span_err!(infcx.tcx.sess, obligation.cause.span, E0277,
"the trait `{}` is not implemented for the type `{}`",
trait_ref.user_string(infcx.tcx),
- trait_ref.self_ty().user_string(infcx.tcx)).as_slice());
+ trait_ref.self_ty().user_string(infcx.tcx));
// Check if it has a custom "#[rustc_on_unimplemented]"
// error message, report with that message if it does
let custom_note = report_on_unimplemented(infcx, &*trait_ref.0,
ty::Predicate::Equate(ref predicate) => {
let predicate = infcx.resolve_type_vars_if_possible(predicate);
let err = infcx.equality_predicate(obligation.cause.span,
- &predicate).unwrap_err();
- infcx.tcx.sess.span_err(
- obligation.cause.span,
- format!(
+ &predicate).err().unwrap();
+ span_err!(infcx.tcx.sess, obligation.cause.span, E0278,
"the requirement `{}` is not satisfied (`{}`)",
predicate.user_string(infcx.tcx),
- ty::type_err_to_str(infcx.tcx, &err)).as_slice());
+ ty::type_err_to_str(infcx.tcx, &err));
}
ty::Predicate::RegionOutlives(ref predicate) => {
let predicate = infcx.resolve_type_vars_if_possible(predicate);
let err = infcx.region_outlives_predicate(obligation.cause.span,
- &predicate).unwrap_err();
- infcx.tcx.sess.span_err(
- obligation.cause.span,
- format!(
+ &predicate).err().unwrap();
+ span_err!(infcx.tcx.sess, obligation.cause.span, E0279,
"the requirement `{}` is not satisfied (`{}`)",
predicate.user_string(infcx.tcx),
- ty::type_err_to_str(infcx.tcx, &err)).as_slice());
+ ty::type_err_to_str(infcx.tcx, &err));
}
ty::Predicate::Projection(..) | ty::Predicate::TypeOutlives(..) => {
let predicate =
infcx.resolve_type_vars_if_possible(&obligation.predicate);
- infcx.tcx.sess.span_err(
- obligation.cause.span,
- format!(
+ span_err!(infcx.tcx.sess, obligation.cause.span, E0280,
"the requirement `{}` is not satisfied",
- predicate.user_string(infcx.tcx)).as_slice());
+ predicate.user_string(infcx.tcx));
}
}
}
let expected_trait_ref = infcx.resolve_type_vars_if_possible(&*expected_trait_ref);
let actual_trait_ref = infcx.resolve_type_vars_if_possible(&*actual_trait_ref);
if !ty::type_is_error(actual_trait_ref.self_ty()) {
- infcx.tcx.sess.span_err(
- obligation.cause.span,
- format!(
+ span_err!(infcx.tcx.sess, obligation.cause.span, E0281,
"type mismatch: the type `{}` implements the trait `{}`, \
but the trait `{}` is required ({})",
expected_trait_ref.self_ty().user_string(infcx.tcx),
expected_trait_ref.user_string(infcx.tcx),
actual_trait_ref.user_string(infcx.tcx),
- ty::type_err_to_str(infcx.tcx, e)).as_slice());
+ ty::type_err_to_str(infcx.tcx, e));
note_obligation_cause(infcx, obligation);
}
}
infcx.tcx.lang_items.sized_trait()
.map_or(false, |sized_id| sized_id == trait_ref.def_id())
{
- infcx.tcx.sess.span_err(
- obligation.cause.span,
- format!(
+ span_err!(infcx.tcx.sess, obligation.cause.span, E0282,
"unable to infer enough type information about `{}`; \
type annotations required",
- self_ty.user_string(infcx.tcx)).as_slice());
+ self_ty.user_string(infcx.tcx));
} else {
- infcx.tcx.sess.span_err(
- obligation.cause.span,
- format!(
+ span_err!(infcx.tcx.sess, obligation.cause.span, E0283,
"type annotations required: cannot resolve `{}`",
- predicate.user_string(infcx.tcx)).as_slice());
+ predicate.user_string(infcx.tcx));;
note_obligation_cause(infcx, obligation);
}
}
_ => {
if !infcx.tcx.sess.has_errors() {
- infcx.tcx.sess.span_err(
- obligation.cause.span,
- format!(
+ span_err!(infcx.tcx.sess, obligation.cause.span, E0284,
"type annotations required: cannot resolve `{}`",
- predicate.user_string(infcx.tcx)).as_slice());
+ predicate.user_string(infcx.tcx));;
note_obligation_cause(infcx, obligation);
}
}
false
}
Err(Overflow) => {
- infcx.tcx.sess.span_err(
- span,
- format!("overflow evaluating whether `{}` is `{}`",
- ty.user_string(infcx.tcx),
- bound.user_string(infcx.tcx)).as_slice());
+ span_err!(infcx.tcx.sess, span, E0285,
+ "overflow evaluating whether `{}` is `{}`",
+ ty.user_string(infcx.tcx),
+ bound.user_string(infcx.tcx));
suggest_new_overflow_limit(infcx.tcx, span);
false
}
let tcx = this.tcx();
match bound {
ty::BoundSend => {
- if
- Some(def_id) == tcx.lang_items.no_send_bound() ||
- Some(def_id) == tcx.lang_items.managed_bound()
- {
+ if Some(def_id) == tcx.lang_items.managed_bound() {
return Err(Unimplemented)
}
}
ty::BoundSync => {
if
- Some(def_id) == tcx.lang_items.no_sync_bound() ||
Some(def_id) == tcx.lang_items.managed_bound() ||
Some(def_id) == tcx.lang_items.unsafe_type()
{
infcx.fresh_substs_for_generics(span, &impl_generics)
}
-impl<'tcx, N> fmt::Show for VtableImplData<'tcx, N> {
+impl<'tcx, N> fmt::Debug for VtableImplData<'tcx, N> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "VtableImpl({:?})", self.impl_def_id)
}
}
-impl<'tcx> fmt::Show for super::VtableObjectData<'tcx> {
+impl<'tcx> fmt::Debug for super::VtableObjectData<'tcx> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "VtableObject(...)")
}
}
}
-impl<'tcx> fmt::Show for super::FulfillmentErrorCode<'tcx> {
+impl<'tcx> fmt::Debug for super::FulfillmentErrorCode<'tcx> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
super::CodeSelectionError(ref e) => write!(f, "{:?}", e),
}
}
-impl<'tcx> fmt::Show for super::MismatchedProjectionTypes<'tcx> {
+impl<'tcx> fmt::Debug for super::MismatchedProjectionTypes<'tcx> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "MismatchedProjectionTypes(..)")
}
pub use self::InferRegion::*;
pub use self::ImplOrTraitItemId::*;
pub use self::UnboxedClosureKind::*;
-pub use self::TraitStore::*;
pub use self::ast_ty_to_ty_cache_entry::*;
pub use self::Variance::*;
pub use self::AutoAdjustment::*;
use middle::ty_fold::{self, TypeFoldable, TypeFolder};
use middle::ty_walk::TypeWalker;
use util::ppaux::{note_and_explain_region, bound_region_ptr_to_string};
-use util::ppaux::{trait_store_to_string, ty_to_string};
+use util::ppaux::ty_to_string;
use util::ppaux::{Repr, UserString};
use util::common::{memoized, ErrorReported};
use util::nodemap::{NodeMap, NodeSet, DefIdMap, DefIdSet};
use arena::TypedArena;
use std::borrow::{BorrowFrom, Cow};
use std::cell::{Cell, RefCell};
-use std::cmp::{self, Ordering};
+use std::cmp;
use std::fmt::{self, Show};
use std::hash::{Hash, Writer, SipHasher, Hasher};
use std::mem;
pub mutbl: ast::Mutability,
}
-#[derive(Clone, Copy, PartialEq, Eq, Hash, RustcEncodable, RustcDecodable, Show)]
-pub enum TraitStore {
- /// Box<Trait>
- UniqTraitStore,
- /// &Trait and &mut Trait
- RegionTraitStore(Region, ast::Mutability),
-}
-
#[derive(Clone, Copy, Show)]
pub struct field_ty {
pub name: Name,
region_depth: u32,
}
-impl fmt::Show for TypeFlags {
+impl fmt::Debug for TypeFlags {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.bits)
}
#[derive(Clone, PartialEq, Eq, Hash, Show)]
pub struct ClosureTy<'tcx> {
pub unsafety: ast::Unsafety,
- pub onceness: ast::Onceness,
- pub store: TraitStore,
- pub bounds: ExistentialBounds<'tcx>,
- pub sig: PolyFnSig<'tcx>,
pub abi: abi::Abi,
+ pub sig: PolyFnSig<'tcx>,
}
#[derive(Clone, Copy, PartialEq, Eq, Hash, Show)]
terr_onceness_mismatch(expected_found<Onceness>),
terr_abi_mismatch(expected_found<abi::Abi>),
terr_mutability,
- terr_sigil_mismatch(expected_found<TraitStore>),
terr_box_mutability,
terr_ptr_mutability,
terr_ref_mutability,
terr_regions_no_overlap(Region, Region),
terr_regions_insufficiently_polymorphic(BoundRegion, Region),
terr_regions_overly_polymorphic(BoundRegion, Region),
- terr_trait_stores_differ(terr_vstore_kind, expected_found<TraitStore>),
terr_sorts(expected_found<Ty<'tcx>>),
terr_integer_as_char,
terr_int_mismatch(expected_found<IntVarValue>),
}
}
-impl fmt::Show for TyVid {
+impl fmt::Debug for TyVid {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result{
write!(f, "_#{}t", self.index)
}
}
-impl fmt::Show for IntVid {
+impl fmt::Debug for IntVid {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "_#{}i", self.index)
}
}
-impl fmt::Show for FloatVid {
+impl fmt::Debug for FloatVid {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "_#{}f", self.index)
}
}
-impl fmt::Show for RegionVid {
+impl fmt::Debug for RegionVid {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "'_#{}r", self.index)
}
}
-impl<'tcx> fmt::Show for FnSig<'tcx> {
+impl<'tcx> fmt::Debug for FnSig<'tcx> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "({:?}; variadic: {})->{:?}", self.inputs, self.variadic, self.output)
}
}
-impl fmt::Show for InferTy {
+impl fmt::Debug for InferTy {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
TyVar(ref v) => v.fmt(f),
}
}
-impl fmt::Show for IntVarValue {
+impl fmt::Debug for IntVarValue {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
IntType(ref v) => v.fmt(f),
}
}
-impl fmt::Show for TypeContents {
+impl fmt::Debug for TypeContents {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "TypeContents({:b})", self.bits)
}
ty_fn_sig(fty).inputs()
}
-pub fn ty_closure_store(fty: Ty) -> TraitStore {
- match fty.sty {
- ty_unboxed_closure(..) => {
- // Close enough for the purposes of all the callers of this
- // function (which is soon to be deprecated anyhow).
- UniqTraitStore
- }
- ref s => {
- panic!("ty_closure_store() called on non-closure type: {:?}", s)
- }
- }
-}
-
pub fn ty_fn_ret<'tcx>(fty: Ty<'tcx>) -> Binder<FnOutput<'tcx>> {
match fty.sty {
ty_bare_fn(_, ref f) => f.sig.output(),
/// afterwards to present additional details, particularly when it comes to lifetime-related
/// errors.
pub fn type_err_to_str<'tcx>(cx: &ctxt<'tcx>, err: &type_err<'tcx>) -> String {
- fn tstore_to_closure(s: &TraitStore) -> String {
- match s {
- &UniqTraitStore => "proc".to_string(),
- &RegionTraitStore(..) => "closure".to_string()
- }
- }
-
match *err {
terr_cyclic_ty => "cyclic type of infinite size".to_string(),
terr_mismatch => "types differ".to_string(),
values.expected,
values.found)
}
- terr_sigil_mismatch(values) => {
- format!("expected {}, found {}",
- tstore_to_closure(&values.expected),
- tstore_to_closure(&values.found))
- }
terr_mutability => "values differ in mutability".to_string(),
terr_box_mutability => {
"boxed values differ in mutability".to_string()
found bound lifetime parameter {}",
bound_region_ptr_to_string(cx, br))
}
- terr_trait_stores_differ(_, ref values) => {
- format!("trait storage differs: expected `{}`, found `{}`",
- trait_store_to_string(cx, (*values).expected),
- trait_store_to_string(cx, (*values).found))
- }
terr_sorts(values) => {
// A naive approach to making sure that we're not reporting silly errors such as:
// (expected closure, found closure).
cx.sess.bug("couldn't find associated type parameter index")
}
-#[derive(Copy, PartialEq, Eq)]
-pub struct AssociatedTypeInfo {
- pub def_id: ast::DefId,
- pub index: uint,
- pub name: ast::Name,
-}
-
-impl PartialOrd for AssociatedTypeInfo {
- fn partial_cmp(&self, other: &AssociatedTypeInfo) -> Option<Ordering> {
- Some(self.index.cmp(&other.index))
- }
-}
-
-impl Ord for AssociatedTypeInfo {
- fn cmp(&self, other: &AssociatedTypeInfo) -> Ordering {
- self.index.cmp(&other.index)
- }
-}
-
pub fn trait_item_def_ids(cx: &ctxt, id: ast::DefId)
-> Rc<Vec<ImplOrTraitItemId>> {
lookup_locally_or_in_crate_store("trait_item_def_ids",
discriminant = val as Disr
}
Ok(_) => {
- cx.sess
- .span_err(e.span,
+ span_err!(cx.sess, e.span, E0304,
"expected signed integer constant");
}
Err(ref err) => {
- cx.sess
- .span_err(e.span,
- &format!("expected constant: {}",
- *err)[]);
+ span_err!(cx.sess, e.span, E0305,
+ "expected constant: {}",
+ *err);
}
},
None => {}
const_eval::const_binary(_) =>
"binary array"
};
- tcx.sess.span_err(count_expr.span, &format!(
+ span_err!(tcx.sess, count_expr.span, E0306,
"expected positive integer for repeat count, found {}",
- found)[]);
+ found);
}
Err(_) => {
let found = match count_expr.node {
_ =>
"non-constant expression"
};
- tcx.sess.span_err(count_expr.span, &format!(
+ span_err!(tcx.sess, count_expr.span, E0307,
"expected constant integer for repeat count, found {}",
- found)[]);
+ found);
}
}
0
impl<'tcx> Repr<'tcx> for ClosureTy<'tcx> {
fn repr(&self, tcx: &ctxt<'tcx>) -> String {
- format!("ClosureTy({},{},{:?},{},{},{})",
+ format!("ClosureTy({},{},{})",
self.unsafety,
- self.onceness,
- self.store,
- self.bounds.repr(tcx),
self.sig.repr(tcx),
self.abi)
}
self.free_substs.repr(tcx),
self.implicit_region_bound.repr(tcx),
self.caller_bounds.repr(tcx))
- }
}
+}
r
}
- fn fold_trait_store(&mut self, s: ty::TraitStore) -> ty::TraitStore {
- super_fold_trait_store(self, s)
- }
-
fn fold_existential_bounds(&mut self, s: &ty::ExistentialBounds<'tcx>)
-> ty::ExistentialBounds<'tcx> {
super_fold_existential_bounds(self, s)
}
}
-impl<'tcx> TypeFoldable<'tcx> for ty::TraitStore {
- fn fold_with<F: TypeFolder<'tcx>>(&self, folder: &mut F) -> ty::TraitStore {
- folder.fold_trait_store(*self)
- }
-}
-
impl<'tcx> TypeFoldable<'tcx> for Ty<'tcx> {
fn fold_with<F: TypeFolder<'tcx>>(&self, folder: &mut F) -> Ty<'tcx> {
folder.fold_ty(*self)
-> ty::ClosureTy<'tcx>
{
ty::ClosureTy {
- store: fty.store.fold_with(this),
sig: fty.sig.fold_with(this),
unsafety: fty.unsafety,
- onceness: fty.onceness,
- bounds: fty.bounds.fold_with(this),
abi: fty.abi,
}
}
mutbl: mt.mutbl}
}
-pub fn super_fold_trait_store<'tcx, T: TypeFolder<'tcx>>(this: &mut T,
- trait_store: ty::TraitStore)
- -> ty::TraitStore {
- match trait_store {
- ty::UniqTraitStore => ty::UniqTraitStore,
- ty::RegionTraitStore(r, m) => {
- ty::RegionTraitStore(r.fold_with(this), m)
- }
- }
-}
-
pub fn super_fold_existential_bounds<'tcx, T: TypeFolder<'tcx>>(
this: &mut T,
bounds: &ty::ExistentialBounds<'tcx>)
self.items.missing.push(lang_items::$item);
}
} else)* {
- self.sess.span_err(span,
- format!("unknown external lang item: `{}`",
- name).as_slice());
+ span_err!(self.sess, span, E0264,
+ "unknown external lang item: `{}`",
+ name);
}
}
}
EntryNone,
}
-#[derive(Copy, PartialEq, PartialOrd, Clone, Ord, Eq, Hash)]
+#[derive(Copy, PartialEq, PartialOrd, Clone, Ord, Eq, Hash, Show)]
pub enum CrateType {
CrateTypeExecutable,
CrateTypeDylib,
opt::multi("", "extern", "Specify where an external rust library is \
located",
"NAME=PATH"),
- opt::opt("", "opt-level", "Optimize with possible levels 0-3", "LEVEL"),
opt::opt("", "sysroot", "Override the system root", "PATH"),
opt::multi("Z", "", "Set internal debugging options", "FLAG"),
opt::opt("", "color", "Configure coloring of output:
always = always colorize output;
never = never colorize output", "auto|always|never"),
- // DEPRECATED
- opt::flag("", "print-crate-name", "Output the crate name and exit"),
- opt::flag("", "print-file-name", "Output the file(s) that would be \
- written if compilation \
- continued and exit"),
- opt::opt("", "debuginfo", "Emit DWARF debug info to the objects created:
- 0 = no debug info,
- 1 = line-tables only (for stacktraces and breakpoints),
- 2 = full debug info with variable and type information \
- (same as -g)", "LEVEL"),
- opt::flag("", "no-trans", "Run all passes except translation; no output"),
- opt::flag("", "no-analysis", "Parse and expand the source, but run no \
- analysis and produce no output"),
- opt::flag("", "parse-only", "Parse only; do not compile, assemble, \
- or link"),
- opt::flagopt("", "pretty",
+ opt::flagopt_u("", "pretty",
"Pretty-print the input instead of compiling;
valid types are: `normal` (un-annotated source),
`expanded` (crates expanded),
`everybody_loops` (all function bodies replaced with `loop {}`).",
"TYPE"),
opt::opt_u("", "show-span", "Show spans for compiler debugging", "expr|pat|ty"),
- opt::flagopt("", "dep-info",
- "Output dependency info to <filename> after compiling, \
- in a format suitable for use by Makefiles", "FILENAME"),
]);
opts
}
let debugging_opts = build_debugging_options(matches);
- let parse_only = if matches.opt_present("parse-only") {
- // FIXME(acrichto) remove this eventually
- early_warn("--parse-only is deprecated in favor of -Z parse-only");
- true
- } else {
- debugging_opts.parse_only
- };
- let no_trans = if matches.opt_present("no-trans") {
- // FIXME(acrichto) remove this eventually
- early_warn("--no-trans is deprecated in favor of -Z no-trans");
- true
- } else {
- debugging_opts.no_trans
- };
- let no_analysis = if matches.opt_present("no-analysis") {
- // FIXME(acrichto) remove this eventually
- early_warn("--no-analysis is deprecated in favor of -Z no-analysis");
- true
- } else {
- debugging_opts.no_analysis
- };
+ let parse_only = debugging_opts.parse_only;
+ let no_trans = debugging_opts.no_trans;
+ let no_analysis = debugging_opts.no_analysis;
if debugging_opts.debug_llvm {
unsafe { llvm::LLVMSetDebug(1); }
host_triple().to_string());
let opt_level = {
if matches.opt_present("O") {
- if matches.opt_present("opt-level") {
- early_error("-O and --opt-level both provided");
- }
if cg.opt_level.is_some() {
early_error("-O and -C opt-level both provided");
}
Default
- } else if matches.opt_present("opt-level") {
- // FIXME(acrichto) remove this eventually
- early_warn("--opt-level=N is deprecated in favor of -C opt-level=N");
- match matches.opt_str("opt-level").as_ref().map(|s| s.as_slice()) {
- None |
- Some("0") => No,
- Some("1") => Less,
- Some("2") => Default,
- Some("3") => Aggressive,
- Some(arg) => {
- early_error(&format!("optimization level needs to be \
- between 0-3 (instead was `{}`)",
- arg)[]);
- }
- }
} else {
match cg.opt_level {
None => No,
};
let gc = debugging_opts.gc;
let debuginfo = if matches.opt_present("g") {
- if matches.opt_present("debuginfo") {
- early_error("-g and --debuginfo both provided");
- }
if cg.debuginfo.is_some() {
early_error("-g and -C debuginfo both provided");
}
FullDebugInfo
- } else if matches.opt_present("debuginfo") {
- // FIXME(acrichto) remove this eventually
- early_warn("--debuginfo=N is deprecated in favor of -C debuginfo=N");
- match matches.opt_str("debuginfo").as_ref().map(|s| s.as_slice()) {
- Some("0") => NoDebugInfo,
- Some("1") => LimitedDebugInfo,
- None |
- Some("2") => FullDebugInfo,
- Some(arg) => {
- early_error(&format!("debug info level needs to be between \
- 0-2 (instead was `{}`)",
- arg)[]);
- }
- }
} else {
match cg.debuginfo {
None | Some(0) => NoDebugInfo,
let cfg = parse_cfgspecs(matches.opt_strs("cfg"));
let test = matches.opt_present("test");
- let write_dependency_info = if matches.opt_present("dep-info") {
- // FIXME(acrichto) remove this eventually
- early_warn("--dep-info has been deprecated in favor of --emit");
- (true, matches.opt_str("dep-info").map(|p| Path::new(p)))
- } else {
- (output_types.contains(&OutputTypeDepInfo), None)
- };
+ let write_dependency_info = (output_types.contains(&OutputTypeDepInfo), None);
- let mut prints = matches.opt_strs("print").into_iter().map(|s| {
+ let prints = matches.opt_strs("print").into_iter().map(|s| {
match s.as_slice() {
"crate-name" => PrintRequest::CrateName,
"file-names" => PrintRequest::FileNames,
}
}
}).collect::<Vec<_>>();
- if matches.opt_present("print-crate-name") {
- // FIXME(acrichto) remove this eventually
- early_warn("--print-crate-name has been deprecated in favor of \
- --print crate-name");
- prints.push(PrintRequest::CrateName);
- }
- if matches.opt_present("print-file-name") {
- // FIXME(acrichto) remove this eventually
- early_warn("--print-file-name has been deprecated in favor of \
- --print file-names");
- prints.push(PrintRequest::FileNames);
- }
if !cg.remark.is_empty() && debuginfo == NoDebugInfo {
early_warn("-C remark will not show source locations without \
return Ok(crate_types);
}
-impl fmt::Show for CrateType {
+impl fmt::Display for CrateType {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
CrateTypeExecutable => "bin".fmt(f),
pub fn span_fatal(&self, sp: Span, msg: &str) -> ! {
self.diagnostic().span_fatal(sp, msg)
}
+ pub fn span_fatal_with_code(&self, sp: Span, msg: &str, code: &str) -> ! {
+ self.diagnostic().span_fatal_with_code(sp, msg, code)
+ }
pub fn fatal(&self, msg: &str) -> ! {
self.diagnostic().handler().fatal(msg)
}
pub fn span_err(&self, sp: Span, msg: &str) {
- // Conditions for enabling multi-line errors:
- if !msg.contains("mismatched types") &&
- !msg.contains("type mismatch resolving") &&
- !msg.contains("if and else have incompatible types") &&
- !msg.contains("if may be missing an else clause") &&
- !msg.contains("match arms have incompatible types") &&
- !msg.contains("structure constructor specifies a structure of type") {
- return self.diagnostic().span_err(sp, msg);
+ match split_msg_into_multilines(msg) {
+ Some(msg) => self.diagnostic().span_err(sp, &msg[]),
+ None => self.diagnostic().span_err(sp, msg)
}
-
- let first = Regex::new(r"[( ]expected").unwrap();
- let second = Regex::new(r" found").unwrap();
- let third = Regex::new(
- r"\((values differ|lifetime|cyclic type of infinite size)").unwrap();
-
- let mut new_msg = String::new();
- let mut head = 0u;
-
- // Insert `\n` before expected and found.
- for (pos1, pos2) in first.find_iter(msg).zip(
- second.find_iter(msg)) {
- new_msg = new_msg +
- // A `(` may be preceded by a space and it should be trimmed
- msg[head..pos1.0].trim_right() + // prefix
- "\n" + // insert before first
- &msg[pos1.0..pos1.1] + // insert what first matched
- &msg[pos1.1..pos2.0] + // between matches
- "\n " + // insert before second
- // 123
- // `expected` is 3 char longer than `found`. To align the types, `found` gets
- // 3 spaces prepended.
- &msg[pos2.0..pos2.1]; // insert what second matched
-
- head = pos2.1;
- }
-
- let mut tail = &msg[head..];
- // Insert `\n` before any remaining messages which match.
- for pos in third.find_iter(tail).take(1) {
- // The end of the message may just be wrapped in `()` without `expected`/`found`.
- // Push this also to a new line and add the final tail after.
- new_msg = new_msg +
- // `(` is usually preceded by a space and should be trimmed.
- tail[..pos.0].trim_right() + // prefix
- "\n" + // insert before paren
- &tail[pos.0..]; // append the tail
-
- tail = "";
- }
-
- new_msg.push_str(tail);
- self.diagnostic().span_err(sp, &new_msg[])
}
pub fn span_err_with_code(&self, sp: Span, msg: &str, code: &str) {
- self.diagnostic().span_err_with_code(sp, msg, code)
+ match split_msg_into_multilines(msg) {
+ Some(msg) => self.diagnostic().span_err_with_code(sp, &msg[], code),
+ None => self.diagnostic().span_err_with_code(sp, msg, code)
+ }
}
pub fn err(&self, msg: &str) {
self.diagnostic().handler().err(msg)
}
}
+fn split_msg_into_multilines(msg: &str) -> Option<String> {
+ // Conditions for enabling multi-line errors:
+ if !msg.contains("mismatched types") &&
+ !msg.contains("type mismatch resolving") &&
+ !msg.contains("if and else have incompatible types") &&
+ !msg.contains("if may be missing an else clause") &&
+ !msg.contains("match arms have incompatible types") &&
+ !msg.contains("structure constructor specifies a structure of type") {
+ return None
+ }
+
+ let first = Regex::new(r"[( ]expected").unwrap();
+ let second = Regex::new(r" found").unwrap();
+ let third = Regex::new(
+ r"\((values differ|lifetime|cyclic type of infinite size)").unwrap();
+
+ let mut new_msg = String::new();
+ let mut head = 0u;
+
+ // Insert `\n` before expected and found.
+ for (pos1, pos2) in first.find_iter(msg).zip(
+ second.find_iter(msg)) {
+ new_msg = new_msg +
+ // A `(` may be preceded by a space and it should be trimmed
+ msg[head..pos1.0].trim_right() + // prefix
+ "\n" + // insert before first
+ &msg[pos1.0..pos1.1] + // insert what first matched
+ &msg[pos1.1..pos2.0] + // between matches
+ "\n " + // insert before second
+ // 123
+ // `expected` is 3 char longer than `found`. To align the types, `found` gets
+ // 3 spaces prepended.
+ &msg[pos2.0..pos2.1]; // insert what second matched
+
+ head = pos2.1;
+ }
+
+ let mut tail = &msg[head..];
+ // Insert `\n` before any remaining messages which match.
+ for pos in third.find_iter(tail).take(1) {
+ // The end of the message may just be wrapped in `()` without `expected`/`found`.
+ // Push this also to a new line and add the final tail after.
+ new_msg = new_msg +
+ // `(` is usually preceded by a space and should be trimmed.
+ tail[..pos.0].trim_right() + // prefix
+ "\n" + // insert before paren
+ &tail[pos.0..]; // append the tail
+
+ tail = "";
+ }
+
+ new_msg.push_str(tail);
+
+ return Some(new_msg)
+}
+
pub fn build_session(sopts: config::Options,
local_crate_source_file: Option<Path>,
registry: diagnostics::registry::Registry)
use std::cell::{RefCell, Cell};
use std::collections::HashMap;
-use std::fmt::Show;
+use std::fmt::Debug;
use std::hash::{Hash, Hasher};
use std::iter::repeat;
use std::time::Duration;
}
pub fn indent<R, F>(op: F) -> R where
- R: Show,
+ R: Debug,
F: FnOnce() -> R,
{
// Use in conjunction with the log post-processor like `src/etc/indenter`
fn explain_span(cx: &ctxt, heading: &str, span: Span)
-> (String, Option<Span>) {
let lo = cx.sess.codemap().lookup_char_pos_adj(span.lo);
- (format!("the {} at {}:{}", heading, lo.line, lo.col.to_uint()),
+ (format!("the {} at {}:{}", heading, lo.line, lo.col.to_usize()),
Some(span))
}
}
ty_to_string(cx, m.ty))
}
-pub fn trait_store_to_string(cx: &ctxt, s: ty::TraitStore) -> String {
- match s {
- ty::UniqTraitStore => "Box ".to_string(),
- ty::RegionTraitStore(r, m) => {
- format!("{}{}", region_ptr_to_string(cx, r), mutability_to_string(m))
- }
- }
-}
-
pub fn vec_map_to_string<T, F>(ts: &[T], f: F) -> String where
F: FnMut(&T) -> String,
{
_ => { }
}
- push_sig_to_string(cx, &mut s, '(', ')', sig, "");
+ push_sig_to_string(cx, &mut s, '(', ')', sig);
match opt_def_id {
Some(def_id) => {
fn closure_to_string<'tcx>(cx: &ctxt<'tcx>, cty: &ty::ClosureTy<'tcx>) -> String {
let mut s = String::new();
- match cty.store {
- ty::UniqTraitStore => {}
- ty::RegionTraitStore(region, _) => {
- s.push_str(®ion_to_string(cx, "", true, region)[]);
- }
- }
-
match cty.unsafety {
ast::Unsafety::Normal => {}
ast::Unsafety::Unsafe => {
}
};
- let bounds_str = cty.bounds.user_string(cx);
-
- match cty.store {
- ty::UniqTraitStore => {
- assert_eq!(cty.onceness, ast::Once);
- s.push_str("proc");
- push_sig_to_string(cx, &mut s, '(', ')', &cty.sig,
- &bounds_str[]);
- }
- ty::RegionTraitStore(..) => {
- match cty.onceness {
- ast::Many => {}
- ast::Once => s.push_str("once ")
- }
- push_sig_to_string(cx, &mut s, '|', '|', &cty.sig,
- &bounds_str[]);
- }
- }
+ push_sig_to_string(cx, &mut s, '|', '|', &cty.sig);
s
}
s: &mut String,
bra: char,
ket: char,
- sig: &ty::PolyFnSig<'tcx>,
- bounds: &str) {
+ sig: &ty::PolyFnSig<'tcx>) {
s.push(bra);
let strs = sig.0.inputs
.iter()
}
s.push(ket);
- if !bounds.is_empty() {
- s.push_str(":");
- s.push_str(bounds);
- }
-
match sig.0.output {
ty::FnConverging(t) => {
if !ty::type_is_nil(t) {
0
};
- for t in tps[..(tps.len() - num_defaults)].iter() {
+ for t in tps[..tps.len() - num_defaults].iter() {
strs.push(ty_to_string(cx, *t))
}
format!("{}({}){}",
base,
if strs[0].starts_with("(") && strs[0].ends_with(",)") {
- &strs[0][1 .. (strs[0].len() - 2)] // Remove '(' and ',)'
+ &strs[0][1 .. strs[0].len() - 2] // Remove '(' and ',)'
} else if strs[0].starts_with("(") && strs[0].ends_with(")") {
- &strs[0][1 .. (strs[0].len() - 1)] // Remove '(' and ')'
+ &strs[0][1 .. strs[0].len() - 1] // Remove '(' and ')'
} else {
&strs[0][]
},
}
}
-impl<'tcx> Repr<'tcx> for ty::TraitStore {
- fn repr(&self, tcx: &ctxt) -> String {
- trait_store_to_string(tcx, *self)
- }
-}
-
impl<'tcx> Repr<'tcx> for ty::BuiltinBound {
fn repr(&self, _tcx: &ctxt) -> String {
format!("{:?}", *self)
let mut cmd = Command::new(ar);
cmd.arg(args).args(paths);
- debug!("{}", cmd);
+ debug!("{:?}", cmd);
match cwd {
Some(p) => {
Ok(prog) => {
let o = prog.wait_with_output().unwrap();
if !o.status.success() {
- handler.err(&format!("{} failed with: {}",
- cmd,
- o.status)[]);
+ handler.err(&format!("{:?} failed with: {}", cmd, o.status)[]);
handler.note(&format!("stdout ---\n{}",
str::from_utf8(&o.output[]).unwrap())[]);
handler.note(&format!("stderr ---\n{}",
// While we have at least a full buffer size chunk's worth of data, process that data
// without copying it into the buffer
while input.len() - i >= size {
- func(&input[i..(i + size)]);
+ func(&input[i..i + size]);
i += size;
}
use syntax::ast;
use syntax::visit;
-#[derive(Clone, PartialEq)]
+#[derive(Clone, PartialEq, Show)]
pub struct Svh {
hash: String,
}
}
}
-impl fmt::Show for Svh {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "Svh {{ {} }}", self.as_str())
- }
-}
-
-impl fmt::String for Svh {
+impl fmt::Display for Svh {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.pad(self.as_str())
}
--- /dev/null
+// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use target::Target;
+
+pub fn target() -> Target {
+ let mut base = super::linux_base::opts();
+ base.pre_link_args.push("-Wl,--allow-multiple-definition".to_string());
+ base.position_independent_executables = true;
+ Target {
+ data_layout: "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-\
+ f32:32:32-f64:64:64-v64:64:64-v128:128:128-a:0:64-\
+ n32:64-S128".to_string(),
+ llvm_target: "aarch64-linux-android".to_string(),
+ target_endian: "little".to_string(),
+ target_pointer_width: "64".to_string(),
+ arch: "aarch64".to_string(),
+ target_os: "android".to_string(),
+ options: base,
+ }
+}
mod arm_unknown_linux_gnueabi;
mod arm_unknown_linux_gnueabihf;
mod aarch64_apple_ios;
+mod aarch64_linux_android;
mod aarch64_unknown_linux_gnu;
mod i686_apple_darwin;
mod i686_pc_windows_gnu;
i386_apple_ios,
x86_64_apple_ios,
aarch64_apple_ios,
+ aarch64_linux_android,
armv7_apple_ios,
armv7s_apple_ios,
if let ast::ExprAddrOf(mutbl, ref base) = ex.node {
let param_env = ty::empty_parameter_environment(self.bccx.tcx);
let mc = mc::MemCategorizationContext::new(¶m_env);
- let base_cmt = mc.cat_expr(&**base).unwrap();
+ let base_cmt = mc.cat_expr(&**base).ok().unwrap();
let borrow_kind = ty::BorrowKind::from_mutbl(mutbl);
// Check that we don't allow borrows of unsafe static items.
if check_aliasability(self.bccx, ex.span, euv::AddrOf,
use rustc::lint;
use rustc::metadata;
use rustc::metadata::creader::CrateOrString::Str;
-use rustc::DIAGNOSTICS;
use rustc::util::common::time;
use std::cmp::Ordering::Equal;
None => return
};
- let descriptions = diagnostics::registry::Registry::new(&DIAGNOSTICS);
+ let descriptions = diagnostics_registry();
match matches.opt_str("explain") {
Some(ref code) => {
match descriptions.find_description(&code[]) {
return
}
- let pretty = matches.opt_default("pretty", "normal").map(|a| {
- // stable pretty-print variants only
- pretty::parse_pretty(&sess, a.as_slice(), false)
- });
+ let pretty = if sess.opts.debugging_opts.unstable_options {
+ matches.opt_default("pretty", "normal").map(|a| {
+ // stable pretty-print variants only
+ pretty::parse_pretty(&sess, a.as_slice(), false)
+ })
+ } else {
+ None
+ };
let pretty = if pretty.is_none() &&
sess.unstable_options() {
matches.opt_str("xpretty").map(|a| {
}
}
+pub fn diagnostics_registry() -> diagnostics::registry::Registry {
+ use syntax::diagnostics::registry::Registry;
+
+ let all_errors = Vec::new() +
+ rustc::diagnostics::DIAGNOSTICS.as_slice() +
+ rustc_typeck::diagnostics::DIAGNOSTICS.as_slice() +
+ rustc_resolve::diagnostics::DIAGNOSTICS.as_slice();
+
+ Registry::new(&*all_errors)
+}
+
pub fn main() {
let args = std::os::args();
let result = run(args);
std::os::set_exit_status(result);
}
+
pub use self::Diagnostic::*;
use libc::c_char;
+use std::ptr;
use {ValueRef, TwineRef, DebugLocRef, DiagnosticInfoRef};
let mut opt = OptimizationDiagnostic {
kind: kind,
- pass_name: 0 as *const c_char,
- function: 0 as ValueRef,
- debug_loc: 0 as DebugLocRef,
- message: 0 as TwineRef,
+ pass_name: ptr::null(),
+ function: ptr::null_mut(),
+ debug_loc: ptr::null_mut(),
+ message: ptr::null_mut(),
};
super::LLVMUnpackOptimizationDiagnostic(di,
use std::ffi::CString;
use std::cell::RefCell;
-use std::{raw, mem};
+use std::{raw, mem, ptr};
use libc::{c_uint, c_ushort, uint64_t, c_int, size_t, c_char};
use libc::{c_longlong, c_ulonglong, c_void};
use debuginfo::{DIBuilderRef, DIDescriptor,
LLVMInitializePowerPCAsmPrinter();
LLVMInitializePowerPCAsmParser();
- LLVMRustSetLLVMOptions(0 as c_int,
- 0 as *const _);
+ LLVMRustSetLLVMOptions(0 as c_int, ptr::null());
- LLVMPassManagerBuilderPopulateModulePassManager(0 as *mut _, 0 as *mut _);
- LLVMPassManagerBuilderPopulateLTOPassManager(0 as *mut _, 0 as *mut _, False, False);
- LLVMPassManagerBuilderPopulateFunctionPassManager(0 as *mut _, 0 as *mut _);
- LLVMPassManagerBuilderSetOptLevel(0 as *mut _, 0 as c_uint);
- LLVMPassManagerBuilderUseInlinerWithThreshold(0 as *mut _, 0 as c_uint);
- LLVMWriteBitcodeToFile(0 as *mut _, 0 as *const _);
+ LLVMPassManagerBuilderPopulateModulePassManager(ptr::null_mut(), ptr::null_mut());
+ LLVMPassManagerBuilderPopulateLTOPassManager(ptr::null_mut(), ptr::null_mut(), False, False);
+ LLVMPassManagerBuilderPopulateFunctionPassManager(ptr::null_mut(), ptr::null_mut());
+ LLVMPassManagerBuilderSetOptLevel(ptr::null_mut(), 0 as c_uint);
+ LLVMPassManagerBuilderUseInlinerWithThreshold(ptr::null_mut(), 0 as c_uint);
+ LLVMWriteBitcodeToFile(ptr::null_mut(), ptr::null());
LLVMPassManagerBuilderCreate();
- LLVMPassManagerBuilderDispose(0 as *mut _);
+ LLVMPassManagerBuilderDispose(ptr::null_mut());
- LLVMRustLinkInExternalBitcode(0 as *mut _, 0 as *const _, 0 as size_t);
+ LLVMRustLinkInExternalBitcode(ptr::null_mut(), ptr::null(), 0 as size_t);
LLVMLinkInMCJIT();
LLVMLinkInInterpreter();
--- /dev/null
+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![allow(non_snake_case)]
+
+register_diagnostics! {
+ E0157,
+ E0153,
+ E0251, // a named type or value has already been imported in this module
+ E0252, // a named type or value has already been imported in this module
+ E0253, // not directly importable
+ E0254, // import conflicts with imported crate in this module
+ E0255, // import conflicts with value in this module
+ E0256, // import conflicts with type in this module
+ E0257, // inherent implementations are only allowen on types defined in the current module
+ E0258, // import conflicts with existing submodule
+ E0259, // an extern crate has already been imported into this module
+ E0260 // name conflicts with an external crate that has been imported into this module
+}
+
+__build_diagnostic_array! { DIAGNOSTICS }
use std::rc::{Rc, Weak};
use std::uint;
+// NB: This module needs to be declared first so diagnostics are
+// registered before they are used.
+pub mod diagnostics;
+
mod check_unused;
mod record_exports;
mod build_reduced_graph;
}
}
-impl fmt::Show for Module {
+impl fmt::Debug for Module {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?}, kind: {:?}, {}",
self.def_id,
in this module",
namespace_name,
token::get_name(name).get());
- self.session.span_err(import_directive.span, msg.as_slice());
+ span_err!(self.session, import_directive.span, E0251, "{}", msg.as_slice());
} else {
let target = Target::new(containing_module.clone(),
name_bindings.clone(),
ValueNS => "value",
},
token::get_name(name).get());
- self.session.span_err(import_span, &msg[]);
+ span_err!(self.session, import_span, E0252, "{}", &msg[]);
}
Some(_) | None => {}
}
if !name_bindings.defined_in_namespace_with(namespace, IMPORTABLE) {
let msg = format!("`{}` is not directly importable",
token::get_name(name));
- self.session.span_err(import_span, &msg[]);
+ span_err!(self.session, import_span, E0253, "{}", &msg[]);
}
}
crate in this module \
(maybe you meant `use {0}::*`?)",
token::get_name(name).get());
- self.session.span_err(import_span, &msg[]);
+ span_err!(self.session, import_span, E0254, "{}", &msg[]);
}
Some(_) | None => {}
}
let msg = format!("import `{}` conflicts with value \
in this module",
token::get_name(name).get());
- self.session.span_err(import_span, &msg[]);
+ span_err!(self.session, import_span, E0255, "{}", &msg[]);
if let Some(span) = value.value_span {
self.session.span_note(span,
"conflicting value here");
let msg = format!("import `{}` conflicts with type in \
this module",
token::get_name(name).get());
- self.session.span_err(import_span, &msg[]);
+ span_err!(self.session, import_span, E0256, "{}", &msg[]);
if let Some(span) = ty.type_span {
self.session.span_note(span,
"note conflicting type here")
let msg = format!("inherent implementations \
are only allowed on types \
defined in the current module");
- self.session.span_err(span, &msg[]);
+ span_err!(self.session, span, E0257, "{}", &msg[]);
self.session.span_note(import_span,
"import from other module here")
}
let msg = format!("import `{}` conflicts with existing \
submodule",
token::get_name(name).get());
- self.session.span_err(import_span, &msg[]);
+ span_err!(self.session, import_span, E0258, "{}", &msg[]);
if let Some(span) = ty.type_span {
self.session.span_note(span,
"note conflicting module here")
}
if module.external_module_children.borrow().contains_key(&name) {
- self.session
- .span_err(span,
- &format!("an external crate named `{}` has already \
+ span_err!(self.session, span, E0259,
+ "an external crate named `{}` has already \
been imported into this module",
- token::get_name(name).get())[]);
+ token::get_name(name).get());
}
}
}
if module.external_module_children.borrow().contains_key(&name) {
- self.session
- .span_err(span,
- &format!("the name `{}` conflicts with an external \
+ span_err!(self.session, span, E0260,
+ "the name `{}` conflicts with an external \
crate that has been imported into this \
module",
- token::get_name(name).get())[]);
+ token::get_name(name).get());
}
}
let module_name = self.module_to_string(&*search_module);
let mut span = span;
let msg = if "???" == &module_name[] {
- span.hi = span.lo + Pos::from_uint(segment_name.get().len());
+ span.hi = span.lo + Pos::from_usize(segment_name.get().len());
match search_parent_externals(name,
&self.current_module) {
let msg = format!("Could not find `{}` in `{}`",
// idx +- 1 to account for the
// colons on either side
- &mpath[(idx + 1)..],
- &mpath[..(idx - 1)]);
+ &mpath[idx + 1..],
+ &mpath[..idx - 1]);
return Failed(Some((span, msg)));
},
None => {
for (i, rib) in ribs.iter().enumerate().rev() {
match rib.bindings.get(&name).cloned() {
Some(def_like) => {
- return self.upvarify(&ribs[(i + 1)..], def_like, span);
+ return self.upvarify(&ribs[i + 1..], def_like, span);
}
None => {
// Continue.
}
if sess.opts.debugging_opts.print_link_args {
- println!("{}", &cmd);
+ println!("{:?}", &cmd);
}
// May have not found libraries in the right formats.
sess.abort_if_errors();
// Invoke the system linker
- debug!("{}", &cmd);
+ debug!("{:?}", &cmd);
let prog = time(sess.time_passes(), "running linker", (), |()| cmd.output());
match prog {
Ok(prog) => {
sess.err(&format!("linking with `{}` failed: {}",
pname,
prog.status)[]);
- sess.note(&format!("{}", &cmd)[]);
+ sess.note(&format!("{:?}", &cmd)[]);
let mut output = prog.error.clone();
output.push_all(&prog.output[]);
sess.note(str::from_utf8(&output[]).unwrap());
// against the archive.
if sess.lto() {
let name = cratepath.filename_str().unwrap();
- let name = &name[3..(name.len() - 5)]; // chop off lib/.rlib
+ let name = &name[3..name.len() - 5]; // chop off lib/.rlib
time(sess.time_passes(),
&format!("altering {}.rlib", name)[],
(), |()| {
let archive = ArchiveRO::open(&path).expect("wanted an rlib");
let file = path.filename_str().unwrap();
- let file = &file[3..(file.len() - 5)]; // chop off lib/.rlib
+ let file = &file[3..file.len() - 5]; // chop off lib/.rlib
debug!("reading {}", file);
for i in iter::count(0u, 1) {
let bc_encoded = time(sess.time_passes(),
}
fn read_from_le_bytes<T: Int>(bytes: &[u8], position_in_bytes: uint) -> T {
- let byte_data = &bytes[position_in_bytes..(position_in_bytes + mem::size_of::<T>())];
+ let byte_data = &bytes[position_in_bytes..position_in_bytes + mem::size_of::<T>()];
let data = unsafe {
*(byte_data.as_ptr() as *const T)
};
output: &Path,
file_type: llvm::FileType) {
unsafe {
- let output = CString::from_slice(output.as_vec());
+ let output_c = CString::from_slice(output.as_vec());
let result = llvm::LLVMRustWriteOutputFile(
- target, pm, m, output.as_ptr(), file_type);
+ target, pm, m, output_c.as_ptr(), file_type);
if !result {
- llvm_err(handler, "could not write output".to_string());
+ llvm_err(handler, format!("could not write output to {}", output.display()));
}
}
}
cmd.args(&sess.target.target.options.post_link_args[]);
if sess.opts.debugging_opts.print_link_args {
- println!("{}", &cmd);
+ println!("{:?}", &cmd);
}
cmd.stdin(::std::io::process::Ignored)
match cmd.status() {
Ok(status) => {
if !status.success() {
- sess.err(&format!("linking of {} with `{}` failed",
+ sess.err(&format!("linking of {} with `{:?}` failed",
output_path.display(), cmd)[]);
sess.abort_if_errors();
}
cmd.arg("-c").arg("-o").arg(outputs.path(config::OutputTypeObject))
.arg(outputs.temp_path(config::OutputTypeAssembly));
- debug!("{}", &cmd);
+ debug!("{:?}", &cmd);
match cmd.output() {
Ok(prog) => {
sess.err(&format!("linking with `{}` failed: {}",
pname,
prog.status)[]);
- sess.note(&format!("{}", &cmd)[]);
+ sess.note(&format!("{:?}", &cmd)[]);
let mut note = prog.error.clone();
note.push_all(&prog.output[]);
sess.note(str::from_utf8(¬e[]).unwrap());
if len <= 2 {
return;
}
- let sub_paths = &sub_paths[..(len-2)];
+ let sub_paths = &sub_paths[..len-2];
for &(ref span, ref qualname) in sub_paths.iter() {
self.fmt.sub_mod_ref_str(path.span,
*span,
format!("file_name,{},file_line,{},file_col,{},extent_start,{},extent_start_bytes,{},\
file_line_end,{},file_col_end,{},extent_end,{},extent_end_bytes,{}",
lo_loc.file.name,
- lo_loc.line, lo_loc.col.to_uint(), lo_pos.to_uint(), lo_pos_byte.to_uint(),
- hi_loc.line, hi_loc.col.to_uint(), hi_pos.to_uint(), hi_pos_byte.to_uint())
+ lo_loc.line, lo_loc.col.to_usize(), lo_pos.to_usize(), lo_pos_byte.to_usize(),
+ hi_loc.line, hi_loc.col.to_usize(), hi_pos.to_usize(), hi_pos_byte.to_usize())
}
// sub_span starts at span.lo, so we need to adjust the positions etc.
enter_match(bcx, dm, m, col, val, |pats| {
if pat_is_binding_or_wild(dm, &*pats[col]) {
let mut r = pats[..col].to_vec();
- r.push_all(&pats[(col + 1)..]);
+ r.push_all(&pats[col + 1..]);
Some(r)
} else {
None
let dm = &tcx.def_map;
let mut vals_left = vals[0u..col].to_vec();
- vals_left.push_all(&vals[(col + 1u)..]);
+ vals_left.push_all(&vals[col + 1u..]);
let ccx = bcx.fcx.ccx;
// Find a real id (we're adding placeholder wildcard patterns, but
}
}
-// Returns a pointer to the body for the box. The box may be an opaque
-// box. The result will be casted to the type of body_t, if it is statically
-// known.
-pub fn at_box_body<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
- body_t: Ty<'tcx>, boxptr: ValueRef) -> ValueRef {
- let _icx = push_ctxt("at_box_body");
- let ccx = bcx.ccx();
- let ty = Type::at_box(ccx, type_of(ccx, body_t));
- let boxptr = PointerCast(bcx, boxptr, ty.ptr_to());
- GEPi(bcx, boxptr, &[0u, abi::BOX_FIELD_BODY])
-}
-
fn require_alloc_fn<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
info_ty: Ty<'tcx>, it: LangItem) -> ast::DefId {
match bcx.tcx().lang_items.require(it) {
.map(|arg| node_id_type(bcx, arg.id))
.collect::<Vec<_>>();
let monomorphized_arg_types = match closure_env.kind {
- closure::NotClosure | closure::BoxedClosure(..) => {
+ closure::NotClosure => {
monomorphized_arg_types
}
};
bcx = match closure_env.kind {
- closure::NotClosure | closure::BoxedClosure(..) => {
+ closure::NotClosure => {
copy_args_to_allocas(bcx,
arg_scope,
&decl.inputs[],
}
_ => unreachable!(),
};
- let vec_len = llvec_len(&cls[(i + 1u)..]);
+ let vec_len = llvec_len(&cls[i + 1u..]);
let vec_ty = Type::vector(&elt_ty, vec_len as u64 * elts_per_word);
tys.push(vec_ty);
i += vec_len;
LoopScopeKind(ast::NodeId, [Block<'blk, 'tcx>; EXIT_MAX])
}
-impl<'blk, 'tcx: 'blk> fmt::Show for CleanupScopeKind<'blk, 'tcx> {
+impl<'blk, 'tcx: 'blk> fmt::Debug for CleanupScopeKind<'blk, 'tcx> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
CustomScopeKind => write!(f, "CustomScopeKind"),
pub use self::ClosureKind::*;
-use back::abi;
use back::link::mangle_internal_name_by_path_and_seq;
-use llvm::ValueRef;
use middle::mem_categorization::Typer;
use trans::adt;
use trans::base::*;
use trans::build::*;
use trans::cleanup::{CleanupMethods, ScopeId};
use trans::common::*;
-use trans::datum::{Datum, Lvalue, rvalue_scratch_datum};
+use trans::datum::{Datum, rvalue_scratch_datum};
use trans::datum::{Rvalue, ByValue};
use trans::debuginfo;
use trans::expr;
use trans::monomorphize::{self, MonoId};
use trans::type_of::*;
-use trans::type_::Type;
-use middle::ty::{self, Ty, UnboxedClosureTyper};
+use middle::ty::{self, UnboxedClosureTyper};
use middle::subst::{Substs};
use session::config::FullDebugInfo;
-use util::ppaux::ty_to_string;
use syntax::ast;
use syntax::ast_util;
-// ___Good to know (tm)__________________________________________________
-//
-// The layout of a closure environment in memory is
-// roughly as follows:
-//
-// struct rust_opaque_box { // see rust_internal.h
-// unsigned ref_count; // obsolete (part of @T's header)
-// fn(void*) *drop_glue; // destructor (for proc)
-// rust_opaque_box *prev; // obsolete (part of @T's header)
-// rust_opaque_box *next; // obsolete (part of @T's header)
-// struct closure_data {
-// upvar1_t upvar1;
-// ...
-// upvarN_t upvarN;
-// }
-// };
-//
-// Note that the closure is itself a rust_opaque_box. This is true
-// even for ~fn and ||, because we wish to keep binary compatibility
-// between all kinds of closures. The allocation strategy for this
-// closure depends on the closure type. For a sendfn, the closure
-// (and the referenced type descriptors) will be allocated in the
-// exchange heap. For a fn, the closure is allocated in the task heap
-// and is reference counted. For a block, the closure is allocated on
-// the stack.
-//
-// ## Opaque closures and the embedded type descriptor ##
-//
-// One interesting part of closures is that they encapsulate the data
-// that they close over. So when I have a ptr to a closure, I do not
-// know how many type descriptors it contains nor what upvars are
-// captured within. That means I do not know precisely how big it is
-// nor where its fields are located. This is called an "opaque
-// closure".
-//
-// Typically an opaque closure suffices because we only manipulate it
-// by ptr. The routine Type::at_box().ptr_to() returns an appropriate
-// type for such an opaque closure; it allows access to the box fields,
-// but not the closure_data itself.
-//
-// But sometimes, such as when cloning or freeing a closure, we need
-// to know the full information. That is where the type descriptor
-// that defines the closure comes in handy. We can use its take and
-// drop glue functions to allocate/free data as needed.
-//
-// ## Subtleties concerning alignment ##
-//
-// It is important that we be able to locate the closure data *without
-// knowing the kind of data that is being bound*. This can be tricky
-// because the alignment requirements of the bound data affects the
-// alignment requires of the closure_data struct as a whole. However,
-// right now this is a non-issue in any case, because the size of the
-// rust_opaque_box header is always a multiple of 16-bytes, which is
-// the maximum alignment requirement we ever have to worry about.
-//
-// The only reason alignment matters is that, in order to learn what data
-// is bound, we would normally first load the type descriptors: but their
-// location is ultimately depend on their content! There is, however, a
-// workaround. We can load the tydesc from the rust_opaque_box, which
-// describes the closure_data struct and has self-contained derived type
-// descriptors, and read the alignment from there. It's just annoying to
-// do. Hopefully should this ever become an issue we'll have monomorphized
-// and type descriptors will all be a bad dream.
-//
-// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-#[derive(Copy)]
-pub struct EnvValue<'tcx> {
- action: ast::CaptureClause,
- datum: Datum<'tcx, Lvalue>
-}
-
-impl<'tcx> EnvValue<'tcx> {
- pub fn to_string<'a>(&self, ccx: &CrateContext<'a, 'tcx>) -> String {
- format!("{:?}({})", self.action, self.datum.to_string(ccx))
- }
-}
-
-// Given a closure ty, emits a corresponding tuple ty
-pub fn mk_closure_tys<'tcx>(tcx: &ty::ctxt<'tcx>,
- bound_values: &[EnvValue<'tcx>])
- -> Ty<'tcx> {
- // determine the types of the values in the env. Note that this
- // is the actual types that will be stored in the map, not the
- // logical types as the user sees them, so by-ref upvars must be
- // converted to ptrs.
- let bound_tys = bound_values.iter().map(|bv| {
- match bv.action {
- ast::CaptureByValue => bv.datum.ty,
- ast::CaptureByRef => ty::mk_mut_ptr(tcx, bv.datum.ty)
- }
- }).collect();
- let cdata_ty = ty::mk_tup(tcx, bound_tys);
- debug!("cdata_ty={}", ty_to_string(tcx, cdata_ty));
- return cdata_ty;
-}
-
-fn tuplify_box_ty<'tcx>(tcx: &ty::ctxt<'tcx>, t: Ty<'tcx>) -> Ty<'tcx> {
- let ptr = ty::mk_imm_ptr(tcx, tcx.types.i8);
- ty::mk_tup(tcx, vec!(tcx.types.uint, ty::mk_nil_ptr(tcx), ptr, ptr, t))
-}
-
-pub struct ClosureResult<'blk, 'tcx: 'blk> {
- llbox: ValueRef, // llvalue of ptr to closure
- cdata_ty: Ty<'tcx>, // type of the closure data
- bcx: Block<'blk, 'tcx> // final bcx
-}
-
-// Given a block context and a list of tydescs and values to bind
-// construct a closure out of them. If copying is true, it is a
-// heap allocated closure that copies the upvars into environment.
-// Otherwise, it is stack allocated and copies pointers to the upvars.
-pub fn store_environment<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
- bound_values: Vec<EnvValue<'tcx>>)
- -> ClosureResult<'blk, 'tcx> {
- let _icx = push_ctxt("closure::store_environment");
- let ccx = bcx.ccx();
- let tcx = ccx.tcx();
-
- // compute the type of the closure
- let cdata_ty = mk_closure_tys(tcx, &bound_values[]);
-
- // cbox_ty has the form of a tuple: (a, b, c) we want a ptr to a
- // tuple. This could be a ptr in uniq or a box or on stack,
- // whatever.
- let cbox_ty = tuplify_box_ty(tcx, cdata_ty);
- let cboxptr_ty = ty::mk_ptr(tcx, ty::mt {ty:cbox_ty, mutbl:ast::MutImmutable});
- let llboxptr_ty = type_of(ccx, cboxptr_ty);
-
- // If there are no bound values, no point in allocating anything.
- if bound_values.is_empty() {
- return ClosureResult {llbox: C_null(llboxptr_ty),
- cdata_ty: cdata_ty,
- bcx: bcx};
- }
-
- // allocate closure in the heap
- let llbox = alloc_ty(bcx, cbox_ty, "__closure");
-
- let llbox = PointerCast(bcx, llbox, llboxptr_ty);
- debug!("tuplify_box_ty = {}", ty_to_string(tcx, cbox_ty));
-
- // Copy expr values into boxed bindings.
- let mut bcx = bcx;
- for (i, bv) in bound_values.into_iter().enumerate() {
- debug!("Copy {} into closure", bv.to_string(ccx));
-
- if ccx.sess().asm_comments() {
- add_comment(bcx, &format!("Copy {} into closure",
- bv.to_string(ccx))[]);
- }
-
- let bound_data = GEPi(bcx, llbox, &[0u, abi::BOX_FIELD_BODY, i]);
-
- match bv.action {
- ast::CaptureByValue => {
- bcx = bv.datum.store_to(bcx, bound_data);
- }
- ast::CaptureByRef => {
- Store(bcx, bv.datum.to_llref(), bound_data);
- }
- }
- }
-
- ClosureResult { llbox: llbox, cdata_ty: cdata_ty, bcx: bcx }
-}
-
-// Given a context and a list of upvars, build a closure. This just
-// collects the upvars and packages them up for store_environment.
-fn build_closure<'blk, 'tcx>(bcx0: Block<'blk, 'tcx>,
- freevar_mode: ast::CaptureClause,
- freevars: &Vec<ty::Freevar>)
- -> ClosureResult<'blk, 'tcx> {
- let _icx = push_ctxt("closure::build_closure");
-
- // If we need to, package up the iterator body to call
- let bcx = bcx0;
-
- // Package up the captured upvars
- let mut env_vals = Vec::new();
- for freevar in freevars.iter() {
- let datum = expr::trans_local_var(bcx, freevar.def);
- env_vals.push(EnvValue {action: freevar_mode, datum: datum});
- }
-
- store_environment(bcx, env_vals)
-}
-
-// Given an enclosing block context, a new function context, a closure type,
-// and a list of upvars, generate code to load and populate the environment
-// with the upvars and type descriptors.
-fn load_environment<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
- cdata_ty: Ty<'tcx>,
- freevars: &[ty::Freevar],
- store: ty::TraitStore)
- -> Block<'blk, 'tcx> {
- let _icx = push_ctxt("closure::load_environment");
-
- // Load a pointer to the closure data, skipping over the box header:
- let llcdata = at_box_body(bcx, cdata_ty, bcx.fcx.llenv.unwrap());
-
- // Store the pointer to closure data in an alloca for debug info because that's what the
- // llvm.dbg.declare intrinsic expects
- let env_pointer_alloca = if bcx.sess().opts.debuginfo == FullDebugInfo {
- let alloc = alloc_ty(bcx, ty::mk_mut_ptr(bcx.tcx(), cdata_ty), "__debuginfo_env_ptr");
- Store(bcx, llcdata, alloc);
- Some(alloc)
- } else {
- None
- };
-
- // Populate the upvars from the environment
- let mut i = 0u;
- for freevar in freevars.iter() {
- let mut upvarptr = GEPi(bcx, llcdata, &[0u, i]);
- let captured_by_ref = match store {
- ty::RegionTraitStore(..) => {
- upvarptr = Load(bcx, upvarptr);
- true
- }
- ty::UniqTraitStore => false
- };
- let def_id = freevar.def.def_id();
-
- bcx.fcx.llupvars.borrow_mut().insert(def_id.node, upvarptr);
- if let Some(env_pointer_alloca) = env_pointer_alloca {
- debuginfo::create_captured_var_metadata(
- bcx,
- def_id.node,
- env_pointer_alloca,
- i,
- captured_by_ref,
- freevar.span);
- }
-
- i += 1u;
- }
-
- bcx
-}
fn load_unboxed_closure_environment<'blk, 'tcx>(
bcx: Block<'blk, 'tcx>,
freevar_mode: ast::CaptureClause,
freevars: &[ty::Freevar])
-> Block<'blk, 'tcx> {
- let _icx = push_ctxt("closure::load_environment");
+ let _icx = push_ctxt("closure::load_unboxed_closure_environment");
// Special case for small by-value selfs.
let closure_id = ast_util::local_def(bcx.fcx.id);
bcx
}
-fn fill_fn_pair(bcx: Block, pair: ValueRef, llfn: ValueRef, llenvptr: ValueRef) {
- Store(bcx, llfn, GEPi(bcx, pair, &[0u, abi::FAT_PTR_ADDR]));
- let llenvptr = PointerCast(bcx, llenvptr, Type::i8p(bcx.ccx()));
- Store(bcx, llenvptr, GEPi(bcx, pair, &[0u, abi::FAT_PTR_EXTRA]));
-}
-
#[derive(PartialEq)]
pub enum ClosureKind<'tcx> {
NotClosure,
- // See load_environment.
- BoxedClosure(Ty<'tcx>, ty::TraitStore),
// See load_unboxed_closure_environment.
UnboxedClosure(ast::CaptureClause)
}
match self.kind {
NotClosure => bcx,
- BoxedClosure(cdata_ty, store) => {
- load_environment(bcx, cdata_ty, self.freevars, store)
- }
UnboxedClosure(freevar_mode) => {
load_unboxed_closure_environment(bcx, arg_scope, freevar_mode, self.freevars)
}
}
}
-/// Translates the body of a closure expression.
-///
-/// - `store`
-/// - `decl`
-/// - `body`
-/// - `id`: The id of the closure expression.
-/// - `cap_clause`: information about captured variables, if any.
-/// - `dest`: where to write the closure value, which must be a
-/// (fn ptr, env) pair
-pub fn trans_expr_fn<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
- store: ty::TraitStore,
- decl: &ast::FnDecl,
- body: &ast::Block,
- id: ast::NodeId,
- dest: expr::Dest)
- -> Block<'blk, 'tcx> {
- let _icx = push_ctxt("closure::trans_expr_fn");
-
- let dest_addr = match dest {
- expr::SaveIn(p) => p,
- expr::Ignore => {
- return bcx; // closure construction is non-side-effecting
- }
- };
-
- let ccx = bcx.ccx();
- let tcx = bcx.tcx();
- let fty = node_id_type(bcx, id);
- let s = tcx.map.with_path(id, |path| {
- mangle_internal_name_by_path_and_seq(path, "closure")
- });
- let llfn = decl_internal_rust_fn(ccx, fty, &s[]);
-
- // set an inline hint for all closures
- set_inline_hint(llfn);
-
- let freevar_mode = tcx.capture_mode(id);
- let freevars: Vec<ty::Freevar> =
- ty::with_freevars(tcx, id, |fv| fv.iter().map(|&fv| fv).collect());
-
- let ClosureResult {
- llbox,
- cdata_ty,
- bcx
- } = build_closure(bcx, freevar_mode, &freevars);
-
- trans_closure(ccx,
- decl,
- body,
- llfn,
- bcx.fcx.param_substs,
- id,
- &[],
- ty::erase_late_bound_regions(ccx.tcx(), &ty::ty_fn_ret(fty)),
- ty::ty_fn_abi(fty),
- ClosureEnv::new(&freevars[],
- BoxedClosure(cdata_ty, store)));
- fill_fn_pair(bcx, dest_addr, llfn, llbox);
- bcx
-}
-
/// Returns the LLVM function declaration for an unboxed closure, creating it
/// if necessary. If the ID does not correspond to a closure ID, returns None.
pub fn get_or_create_declaration_if_unboxed_closure<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>,
/// Generates a unique symbol based off the name given. This is used to create
/// unique symbols for things like closures.
pub fn gensym_name(name: &str) -> PathElem {
- let num = token::gensym(name).uint();
+ let num = token::gensym(name).usize();
// use one colon which will get translated to a period by the mangler, and
// we're guaranteed that `num` is globally unique for this crate.
PathName(token::gensym(&format!("{}:{}", name, num)[]))
!null_terminated as Bool);
let gsym = token::gensym("str");
- let buf = CString::from_vec(format!("str{}", gsym.uint()).into_bytes());
+ let buf = CString::from_vec(format!("str{}", gsym.usize()).into_bytes());
let g = llvm::LLVMAddGlobal(cx.llmod(), val_ty(sc).to_ref(), buf.as_ptr());
llvm::LLVMSetInitializer(g, sc);
llvm::LLVMSetGlobalConstant(g, True);
let lldata = C_bytes(cx, data);
let gsym = token::gensym("binary");
- let name = format!("binary{}", gsym.uint());
+ let name = format!("binary{}", gsym.usize());
let name = CString::from_vec(name.into_bytes());
let g = llvm::LLVMAddGlobal(cx.llmod(), val_ty(lldata).to_ref(),
name.as_ptr());
}
/// Generic methods applicable to any sort of datum.
-impl<'tcx, K: KindOps + fmt::Show> Datum<'tcx, K> {
+impl<'tcx, K: KindOps + fmt::Debug> Datum<'tcx, K> {
pub fn new(val: ValueRef, ty: Ty<'tcx>, kind: K) -> Datum<'tcx, K> {
Datum { val: val, ty: ty, kind: kind }
}
}
}
-impl<'blk, 'tcx, K: KindOps + fmt::Show> DatumBlock<'blk, 'tcx, K> {
+impl<'blk, 'tcx, K: KindOps + fmt::Debug> DatumBlock<'blk, 'tcx, K> {
pub fn to_expr_datumblock(self) -> DatumBlock<'blk, 'tcx, Expr> {
DatumBlock::new(self.bcx, self.datum.to_expr_datum())
}
closure_ty: ty::ClosureTy<'tcx>,
unique_type_id: &mut String) {
let ty::ClosureTy { unsafety,
- onceness,
- store,
- ref bounds,
ref sig,
abi: _ } = closure_ty;
+
if unsafety == ast::Unsafety::Unsafe {
unique_type_id.push_str("unsafe ");
}
- if onceness == ast::Once {
- unique_type_id.push_str("once ");
- }
-
- match store {
- ty::UniqTraitStore => unique_type_id.push_str("~|"),
- ty::RegionTraitStore(_, ast::MutMutable) => {
- unique_type_id.push_str("&mut|")
- }
- ty::RegionTraitStore(_, ast::MutImmutable) => {
- unique_type_id.push_str("&|")
- }
- };
+ unique_type_id.push_str("|");
let sig = ty::erase_late_bound_regions(cx.tcx(), sig);
unique_type_id.push_str("!");
}
}
-
- unique_type_id.push(':');
-
- for bound in bounds.builtin_bounds.iter() {
- match bound {
- ty::BoundSend => unique_type_id.push_str("Send"),
- ty::BoundSized => unique_type_id.push_str("Sized"),
- ty::BoundCopy => unique_type_id.push_str("Copy"),
- ty::BoundSync => unique_type_id.push_str("Sync"),
- };
- unique_type_id.push('+');
- }
}
// Get the UniqueTypeId for an enum variant. Enum variants are not really
if let Some(code_snippet) = code_snippet {
let bytes = code_snippet.as_bytes();
- if bytes.len() > 0 && &bytes[(bytes.len()-1)..] == b"}" {
+ if bytes.len() > 0 && &bytes[bytes.len()-1..] == b"}" {
cleanup_span = Span {
lo: node_span.hi - codemap::BytePos(1),
hi: node_span.hi,
set_debug_location(cx, InternalDebugLocation::new(scope,
loc.line,
- loc.col.to_uint()));
+ loc.col.to_usize()));
} else {
set_debug_location(cx, UnknownLocation);
}
set_debug_location(cx, InternalDebugLocation::new(scope_metadata,
loc.line,
- loc.col.to_uint()));
+ loc.col.to_usize()));
unsafe {
let instr = llvm::LLVMDIBuilderInsertDeclareAtEnd(
DIB(cx),
let work_dir = cx.sess().working_dir.as_str().unwrap();
let file_name =
if full_path.starts_with(work_dir) {
- &full_path[(work_dir.len() + 1u)..full_path.len()]
+ &full_path[work_dir.len() + 1u..full_path.len()]
} else {
full_path
};
parent_scope,
file_metadata,
loc.line as c_uint,
- loc.col.to_uint() as c_uint)
+ loc.col.to_usize() as c_uint)
};
scope_stack.push(ScopeStackEntry { scope_metadata: scope_metadata,
parent_scope,
file_metadata,
loc.line as c_uint,
- loc.col.to_uint() as c_uint)
+ loc.col.to_usize() as c_uint)
};
scope_stack.push(ScopeStackEntry {
use trans::type_::Type;
use syntax::{ast, ast_util, codemap};
-use syntax::print::pprust::{expr_to_string};
use syntax::ptr::P;
use syntax::parse::token;
use std::rc::Rc;
// closure or an older, legacy style closure. Store this
// into a variable to ensure the the RefCell-lock is
// released before we recurse.
- let is_unboxed_closure =
- bcx.tcx().unboxed_closures.borrow().contains_key(&ast_util::local_def(expr.id));
- if is_unboxed_closure {
- closure::trans_unboxed_closure(bcx, &**decl, &**body, expr.id, dest)
- } else {
- let expr_ty = expr_ty(bcx, expr);
- let store = ty::ty_closure_store(expr_ty);
- debug!("translating block function {} with type {}",
- expr_to_string(expr), expr_ty.repr(tcx));
- closure::trans_expr_fn(bcx, store, &**decl, &**body, expr.id, dest)
- }
+ closure::trans_unboxed_closure(bcx, &**decl, &**body, expr.id, dest)
}
ast::ExprCall(ref f, ref args) => {
if bcx.tcx().is_method_call(expr.id) {
unsafe {
let tbl = C_struct(ccx, &components[], false);
let sym = token::gensym("vtable");
- let buf = CString::from_vec(format!("vtable{}", sym.uint()).into_bytes());
+ let buf = CString::from_vec(format!("vtable{}", sym.usize()).into_bytes());
let vt_gvar = llvm::LLVMAddGlobal(ccx.llmod(), val_ty(tbl).to_ref(),
buf.as_ptr());
llvm::LLVMSetInitializer(vt_gvar, tbl);
use std::ffi::CString;
use std::mem;
+use std::ptr;
use std::cell::RefCell;
use std::iter::repeat;
Type::vec(ccx, &Type::i8(ccx))
}
- // The box pointed to by @T.
- pub fn at_box(ccx: &CrateContext, ty: Type) -> Type {
- Type::struct_(ccx, &[
- ccx.int_type(), Type::glue_fn(ccx, Type::i8p(ccx)).ptr_to(),
- Type::i8p(ccx), Type::i8p(ccx), ty
- ], false)
- }
-
pub fn vtable_ptr(ccx: &CrateContext) -> Type {
Type::glue_fn(ccx, Type::i8p(ccx)).ptr_to().ptr_to()
}
if n_elts == 0 {
return Vec::new();
}
- let mut elts: Vec<_> = repeat(Type { rf: 0 as TypeRef }).take(n_elts).collect();
+ let mut elts: Vec<_> = repeat(Type { rf: ptr::null_mut() }).take(n_elts).collect();
llvm::LLVMGetStructElementTypes(self.to_ref(),
elts.as_mut_ptr() as *mut TypeRef);
elts
pub fn func_params(&self) -> Vec<Type> {
unsafe {
let n_args = llvm::LLVMCountParamTypes(self.to_ref()) as uint;
- let mut args: Vec<_> = repeat(Type { rf: 0 as TypeRef }).take(n_args).collect();
+ let mut args: Vec<_> = repeat(Type { rf: ptr::null_mut() }).take(n_args).collect();
llvm::LLVMGetParamTypes(self.to_ref(),
args.as_mut_ptr() as *mut TypeRef);
args
-> Ty<'tcx>
{
if ty::binds_late_bound_regions(self.tcx(), &poly_trait_ref) {
- self.tcx().sess.span_err(
- span,
+ span_err!(self.tcx().sess, span, E0212,
"cannot extract an associated type from a higher-ranked trait bound \
in this context");
self.tcx().types.err
_item_name: ast::Name)
-> Ty<'tcx>
{
- self.tcx().sess.span_err(
- span,
+ span_err!(self.tcx().sess, span, E0213,
"associated types are not accepted in this context");
self.tcx().types.err
convert_angle_bracketed_parameters(this, rscope, data)
}
ast::ParenthesizedParameters(ref data) => {
- tcx.sess.span_err(
- path.span,
+ span_err!(tcx.sess, path.span, E0214,
"parenthesized parameters may only be used with a trait");
(Vec::new(), convert_parenthesized_parameters(this, data), Vec::new())
}
} else {
"expected"
};
- this.tcx().sess.span_fatal(span,
- &format!("wrong number of type arguments: {} {}, found {}",
+ span_fatal!(this.tcx().sess, span, E0243,
+ "wrong number of type arguments: {} {}, found {}",
expected,
required_ty_param_count,
- supplied_ty_param_count)[]);
+ supplied_ty_param_count);
} else if supplied_ty_param_count > formal_ty_param_count {
let expected = if required_ty_param_count < formal_ty_param_count {
"expected at most"
} else {
"expected"
};
- this.tcx().sess.span_fatal(span,
- &format!("wrong number of type arguments: {} {}, found {}",
+ span_fatal!(this.tcx().sess, span, E0244,
+ "wrong number of type arguments: {} {}, found {}",
expected,
formal_ty_param_count,
- supplied_ty_param_count)[]);
+ supplied_ty_param_count);
}
let mut substs = Substs::new_type(types, regions);
trait_ref
}
_ => {
- this.tcx().sess.span_fatal(
- ast_trait_ref.path.span,
- &format!("`{}` is not a trait",
- ast_trait_ref.path.user_string(this.tcx()))[]);
+ span_fatal!(this.tcx().sess, ast_trait_ref.path.span, E0245,
+ "`{}` is not a trait",
+ ast_trait_ref.path.user_string(this.tcx()));
}
}
}
if !this.tcx().sess.features.borrow().unboxed_closures &&
this.tcx().lang_items.fn_trait_kind(trait_def_id).is_some()
{
- this.tcx().sess.span_err(path.span,
+ span_err!(this.tcx().sess, path.span, E0215,
"angle-bracket notation is not stable when \
used with the `Fn` family of traits, use parentheses");
span_help!(this.tcx().sess, path.span,
if !this.tcx().sess.features.borrow().unboxed_closures &&
this.tcx().lang_items.fn_trait_kind(trait_def_id).is_none()
{
- this.tcx().sess.span_err(path.span,
+ span_err!(this.tcx().sess, path.span, E0216,
"parenthetical notation is only stable when \
used with the `Fn` family of traits");
span_help!(this.tcx().sess, path.span,
}
if candidates.len() > 1 {
- tcx.sess.span_err(
- binding.span,
- format!("ambiguous associated type: `{}` defined in multiple supertraits `{}`",
+ span_err!(tcx.sess, binding.span, E0217,
+ "ambiguous associated type: `{}` defined in multiple supertraits `{}`",
token::get_name(binding.item_name),
- candidates.user_string(tcx)).as_slice());
+ candidates.user_string(tcx));
return Err(ErrorReported);
}
let candidate = match candidates.pop() {
Some(c) => c,
None => {
- tcx.sess.span_err(
- binding.span,
- format!("no associated type `{}` defined in `{}`",
+ span_err!(tcx.sess, binding.span, E0218,
+ "no associated type `{}` defined in `{}`",
token::get_name(binding.item_name),
- trait_ref.user_string(tcx)).as_slice());
+ trait_ref.user_string(tcx));
return Err(ErrorReported);
}
};
if ty::binds_late_bound_regions(tcx, &candidate) {
- tcx.sess.span_err(
- binding.span,
- format!("associated type `{}` defined in higher-ranked supertrait `{}`",
+ span_err!(tcx.sess, binding.span, E0219,
+ "associated type `{}` defined in higher-ranked supertrait `{}`",
token::get_name(binding.item_name),
- candidate.user_string(tcx)).as_slice());
+ candidate.user_string(tcx));
return Err(ErrorReported);
}
pprust::ty_to_string(ty));
match ty.node {
ast::TyRptr(None, ref mut_ty) => {
- span_note!(this.tcx().sess, ty.span,
+ span_help!(this.tcx().sess, ty.span,
"perhaps you meant `&{}({} +{})`? (per RFC 438)",
ppaux::mutability_to_string(mut_ty.mutbl),
pprust::ty_to_string(&*mut_ty.ty),
pprust::bounds_to_string(bounds));
}
ast::TyRptr(Some(ref lt), ref mut_ty) => {
- span_note!(this.tcx().sess, ty.span,
+ span_help!(this.tcx().sess, ty.span,
"perhaps you meant `&{} {}({} +{})`? (per RFC 438)",
pprust::lifetime_to_string(lt),
ppaux::mutability_to_string(mut_ty.mutbl),
}
_ => {
- span_note!(this.tcx().sess, ty.span,
+ span_help!(this.tcx().sess, ty.span,
"perhaps you forgot parentheses? (per RFC 438)");
}
}
}
if suitable_bounds.len() == 0 {
- tcx.sess.span_err(ast_ty.span,
- format!("associated type `{}` not found for type parameter `{}`",
+ span_err!(tcx.sess, ast_ty.span, E0220,
+ "associated type `{}` not found for type parameter `{}`",
token::get_name(assoc_name),
- token::get_name(ty_param_name)).as_slice());
+ token::get_name(ty_param_name));
return this.tcx().types.err;
}
if suitable_bounds.len() > 1 {
- tcx.sess.span_err(ast_ty.span,
- format!("ambiguous associated type `{}` in bounds of `{}`",
+ span_err!(tcx.sess, ast_ty.span, E0221,
+ "ambiguous associated type `{}` in bounds of `{}`",
token::get_name(assoc_name),
- token::get_name(ty_param_name)).as_slice());
+ token::get_name(ty_param_name));
for suitable_bound in suitable_bounds.iter() {
span_note!(this.tcx().sess, ast_ty.span,
match ast_ty_to_ty_cache.get(&ast_ty.id) {
Some(&ty::atttce_resolved(ty)) => return ty,
Some(&ty::atttce_unresolved) => {
- tcx.sess.span_fatal(ast_ty.span,
+ span_fatal!(tcx.sess, ast_ty.span, E0246,
"illegal recursive type; insert an enum \
or struct in the cycle, if this is \
desired");
ast::TyParen(ref typ) => ast_ty_to_ty(this, rscope, &**typ),
ast::TyBareFn(ref bf) => {
if bf.decl.variadic && bf.abi != abi::C {
- tcx.sess.span_err(ast_ty.span,
+ span_err!(tcx.sess, ast_ty.span, E0222,
"variadic function must have C calling convention");
}
let bare_fn = ty_of_bare_fn(this, bf.unsafety, bf.abi, &*bf.decl);
ty::mk_self_type(tcx)
}
def::DefMod(id) => {
- tcx.sess.span_fatal(ast_ty.span,
- &format!("found module name used as a type: {}",
- tcx.map.node_to_string(id.node))[]);
+ span_fatal!(tcx.sess, ast_ty.span, E0247,
+ "found module name used as a type: {}",
+ tcx.map.node_to_string(id.node));
}
def::DefPrimTy(_) => {
panic!("DefPrimTy arm missed in previous ast_ty_to_prim_ty call");
def::DefAssociatedTy(trait_type_id) => {
let path_str = tcx.map.path_to_string(
tcx.map.get_parent(trait_type_id.node));
- tcx.sess.span_err(ast_ty.span,
- &format!("ambiguous associated \
+ span_err!(tcx.sess, ast_ty.span, E0223,
+ "ambiguous associated \
type; specify the type \
using the syntax `<Type \
as {}>::{}`",
.last()
.unwrap()
.identifier)
- .get())[]);
+ .get());
this.tcx().types.err
}
def::DefAssociatedPath(provenance, assoc_ident) => {
associated_path_def_to_ty(this, ast_ty, provenance, assoc_ident.name)
}
_ => {
- tcx.sess.span_fatal(ast_ty.span,
- &format!("found value name used \
+ span_fatal!(tcx.sess, ast_ty.span, E0248,
+ "found value name used \
as a type: {:?}",
- a_def)[]);
+ a_def);
}
}
}
ty::mk_vec(tcx, ast_ty_to_ty(this, rscope, &**ty),
Some(i as uint)),
_ => {
- tcx.sess.span_fatal(
- ast_ty.span, "expected constant expr for array length");
+ span_fatal!(tcx.sess, ast_ty.span, E0249,
+ "expected constant expr for array length");
}
}
}
Err(ref r) => {
- tcx.sess.span_fatal(
- ast_ty.span,
- &format!("expected constant expr for array \
+ span_fatal!(tcx.sess, ast_ty.span, E0250,
+ "expected constant expr for array \
length: {}",
- *r)[]);
+ *r);
}
}
}
pub fn ty_of_closure<'tcx>(
this: &AstConv<'tcx>,
unsafety: ast::Unsafety,
- onceness: ast::Onceness,
- bounds: ty::ExistentialBounds<'tcx>,
- store: ty::TraitStore,
decl: &ast::FnDecl,
abi: abi::Abi,
expected_sig: Option<ty::FnSig<'tcx>>)
ty::ClosureTy {
unsafety: unsafety,
- onceness: onceness,
- store: store,
- bounds: bounds,
abi: abi,
sig: ty::Binder(ty::FnSig {inputs: input_tys,
output: output_ty,
None,
&mut projection_bounds))
} else {
- this.tcx().sess.span_err(
- span,
+ span_err!(this.tcx().sess, span, E0224,
"at least one non-builtin trait is required for an object type");
None
};
if !trait_bounds.is_empty() {
let b = &trait_bounds[0];
- this.tcx().sess.span_err(
- b.trait_ref.path.span,
- &format!("only the builtin traits can be used \
- as closure or object bounds")[]);
+ span_err!(this.tcx().sess, b.trait_ref.path.span, E0225,
+ "only the builtin traits can be used \
+ as closure or object bounds");
}
let region_bound = compute_region_bound(this,
builtin_bounds.repr(tcx));
if explicit_region_bounds.len() > 1 {
- tcx.sess.span_err(
- explicit_region_bounds[1].span,
- format!("only a single explicit lifetime bound is permitted").as_slice());
+ span_err!(tcx.sess, explicit_region_bounds[1].span, E0226,
+ "only a single explicit lifetime bound is permitted");
}
if explicit_region_bounds.len() != 0 {
// error.
let r = derived_region_bounds[0];
if derived_region_bounds.slice_from(1).iter().any(|r1| r != *r1) {
- tcx.sess.span_err(
- span,
- &format!("ambiguous lifetime bound, \
- explicit lifetime bound required")[]);
+ span_err!(tcx.sess, span, E0227,
+ "ambiguous lifetime bound, \
+ explicit lifetime bound required");
}
return Some(r);
}
match rscope.default_region_bound(span) {
Some(r) => { r }
None => {
- this.tcx().sess.span_err(
- span,
- &format!("explicit lifetime bound required")[]);
+ span_err!(this.tcx().sess, span, E0228,
+ "explicit lifetime bound required");
ty::ReStatic
}
}
bindings: &[ConvertedBinding<'tcx>])
{
for binding in bindings.iter().take(1) {
- tcx.sess.span_err(
- binding.span,
+ span_err!(tcx.sess, binding.span, E0229,
"associated type bindings are not allowed here");
}
}
check_unboxed_closure(fcx, expr, kind, decl, body, None);
- fcx.ccx.tcx.sess.span_err(
- expr.span,
- "can't infer the \"kind\" of the closure, explicitly annotate it. e.g. \
- `|&:| {}`");
+ span_err!(fcx.ccx.tcx.sess, expr.span, E0187,
+ "can't infer the \"kind\" of the closure; explicitly annotate it; e.g. \
+ `|&:| {{}}`");
},
Some((sig, kind)) => {
check_unboxed_closure(fcx, expr, kind, decl, body, Some(sig));
let mut fn_ty = astconv::ty_of_closure(
fcx,
ast::Unsafety::Normal,
- ast::Many,
-
- // The `RegionTraitStore` and region_existential_bounds
- // are lies, but we ignore them so it doesn't matter.
- //
- // FIXME(pcwalton): Refactor this API.
- ty::region_existential_bound(ty::ReStatic),
- ty::RegionTraitStore(ty::ReStatic, ast::MutImmutable),
-
decl,
abi::RustCall,
expected_sig);
(&ty::StaticExplicitSelfCategory,
&ty::StaticExplicitSelfCategory) => {}
(&ty::StaticExplicitSelfCategory, _) => {
- tcx.sess.span_err(
- impl_m_span,
- format!("method `{}` has a `{}` declaration in the impl, \
+ span_err!(tcx.sess, impl_m_span, E0185,
+ "method `{}` has a `{}` declaration in the impl, \
but not in the trait",
token::get_name(trait_m.name),
ppaux::explicit_self_category_to_str(
- &impl_m.explicit_self)).as_slice());
+ &impl_m.explicit_self));
return;
}
(_, &ty::StaticExplicitSelfCategory) => {
- tcx.sess.span_err(
- impl_m_span,
- format!("method `{}` has a `{}` declaration in the trait, \
+ span_err!(tcx.sess, impl_m_span, E0186,
+ "method `{}` has a `{}` declaration in the trait, \
but not in the impl",
token::get_name(trait_m.name),
ppaux::explicit_self_category_to_str(
- &trait_m.explicit_self)).as_slice());
+ &trait_m.explicit_self));
return;
}
_ => {
// are zero. Since I don't quite know how to phrase things at
// the moment, give a kind of vague error message.
if trait_params.len() != impl_params.len() {
- tcx.sess.span_err(
- span,
- &format!("lifetime parameters or bounds on method `{}` do \
+ span_err!(tcx.sess, span, E0195,
+ "lifetime parameters or bounds on method `{}` do \
not match the trait declaration",
- token::get_name(impl_m.name))[]);
+ token::get_name(impl_m.name));
return false;
}
if !valid_out_of_scope_traits.is_empty() {
let mut candidates = valid_out_of_scope_traits;
candidates.sort();
+ candidates.dedup();
let msg = format!(
"methods from traits can only be called if the trait is in scope; \
the following {traits_are} implemented but not in scope, \
if candidates.len() > 0 {
// sort from most relevant to least relevant
candidates.sort_by(|a, b| a.cmp(b).reverse());
+ candidates.dedup();
let msg = format!(
"methods from traits can only be called if the trait is implemented and in scope; \
}) {
Some(_) => (),
None => {
- ccx.tcx.sess.span_err(attr.span,
- format!("there is no type parameter \
+ span_err!(ccx.tcx.sess, attr.span, E0230,
+ "there is no type parameter \
{} on trait {}",
- s, item.ident.as_str())
- .as_slice());
+ s, item.ident.as_str());
}
},
// `{:1}` and `{}` are not to be used
Position::ArgumentIs(_) | Position::ArgumentNext => {
- ccx.tcx.sess.span_err(attr.span,
+ span_err!(ccx.tcx.sess, attr.span, E0231,
"only named substitution \
parameters are allowed");
}
}
}
} else {
- ccx.tcx.sess.span_err(attr.span,
+ span_err!(ccx.tcx.sess, attr.span, E0232,
"this attribute must have a value, \
eg `#[rustc_on_unimplemented = \"foo\"]`")
}
let trait_did = match fcx.tcx().lang_items.require(IteratorItem) {
Ok(trait_did) => trait_did,
Err(ref err_string) => {
- fcx.tcx().sess.span_err(iterator_expr.span,
- &err_string[]);
+ span_err!(fcx.tcx().sess, iterator_expr.span, E0233,
+ "{}", &err_string[]);
return fcx.tcx().types.err
}
};
if !ty::type_is_error(true_expr_type) {
let ty_string = fcx.infcx().ty_to_string(true_expr_type);
- fcx.tcx().sess.span_err(iterator_expr.span,
- &format!("`for` loop expression has type `{}` which does \
+ span_err!(fcx.tcx().sess, iterator_expr.span, E0234,
+ "`for` loop expression has type `{}` which does \
not implement the `Iterator` trait; \
- maybe try .iter()",
- ty_string)[]);
+ maybe try .iter()", ty_string);
}
fcx.tcx().types.err
}
fcx.tcx().types.err
}
_ => {
- fcx.tcx().sess.span_err(iterator_expr.span,
- &format!("`next` method of the `Iterator` \
+ span_err!(fcx.tcx().sess, iterator_expr.span, E0239,
+ "`next` method of the `Iterator` \
trait has an unexpected type `{}`",
- fcx.infcx().ty_to_string(return_type))
- []);
+ fcx.infcx().ty_to_string(return_type));
fcx.tcx().types.err
}
}
Err(type_error) => {
let type_error_description =
ty::type_err_to_str(tcx, &type_error);
- fcx.tcx()
- .sess
- .span_err(path.span,
- &format!("structure constructor specifies a \
+ span_err!(fcx.tcx().sess, path.span, E0235,
+ "structure constructor specifies a \
structure of type `{}`, but this \
structure has type `{}`: {}",
fcx.infcx()
fcx.infcx()
.ty_to_string(
actual_structure_type),
- type_error_description)[]);
+ type_error_description);
ty::note_and_explain_type_err(tcx, &type_error);
}
}
ty::mk_struct(tcx, did, tcx.mk_substs(substs))
} else {
- tcx.sess.span_err(expr.span, "No lang item for range syntax");
+ span_err!(tcx.sess, expr.span, E0236, "no lang item for range syntax");
fcx.tcx().types.err
}
}
let substs = Substs::new_type(vec![], vec![]);
ty::mk_struct(tcx, did, tcx.mk_substs(substs))
} else {
- tcx.sess.span_err(expr.span, "No lang item for range syntax");
+ span_err!(tcx.sess, expr.span, E0237, "no lang item for range syntax");
fcx.tcx().types.err
}
}
}
ast::ParenthesizedParameters(ref data) => {
- fcx.tcx().sess.span_err(
- span,
+ span_err!(fcx.tcx().sess, span, E0238,
"parenthesized parameters may only be used with a trait");
push_explicit_parenthesized_parameters_from_segment_to_substs(
fcx, space, span, type_defs, data, substs);
"get_tydesc" => {
let tydesc_ty = match ty::get_tydesc_ty(ccx.tcx) {
Ok(t) => t,
- Err(s) => { tcx.sess.span_fatal(it.span, &s[]); }
+ Err(s) => { span_fatal!(tcx.sess, it.span, E0240, "{}", &s[]); }
};
let td_ptr = ty::mk_ptr(ccx.tcx, ty::mt {
ty: tydesc_ty,
{
let object_trait = object_trait(&object_trait_ty);
if !mutability_allowed(referent_mutbl, target_mutbl) {
- fcx.tcx().sess.span_err(source_expr.span,
+ span_err!(fcx.tcx().sess, source_expr.span, E0188,
"types differ in mutability");
} else {
// Ensure that if &'a T is cast to &'b Trait, then T : Trait
}
(_, &ty::ty_uniq(..)) => {
- fcx.ccx.tcx.sess.span_err(
- source_expr.span,
- &format!("can only cast an boxed pointer \
+ span_err!(fcx.ccx.tcx.sess, source_expr.span, E0189,
+ "can only cast a boxed pointer \
to a boxed object, not a {}",
- ty::ty_sort_string(fcx.tcx(), source_ty))[]);
+ ty::ty_sort_string(fcx.tcx(), source_ty));
}
(_, &ty::ty_rptr(..)) => {
- fcx.ccx.tcx.sess.span_err(
- source_expr.span,
- &format!("can only cast a &-pointer \
+ span_err!(fcx.ccx.tcx.sess, source_expr.span, E0190,
+ "can only cast a &-pointer \
to an &-object, not a {}",
- ty::ty_sort_string(fcx.tcx(), source_ty))[]);
+ ty::ty_sort_string(fcx.tcx(), source_ty));
}
_ => {
}
for (trait_def_id, name) in associated_types.into_iter() {
- tcx.sess.span_err(
- span,
- format!("the value of the associated type `{}` (from the trait `{}`) must be specified",
+ span_err!(tcx.sess, span, E0191,
+ "the value of the associated type `{}` (from the trait `{}`) must be specified",
name.user_string(tcx),
- ty::item_path_str(tcx, trait_def_id)).as_slice());
+ ty::item_path_str(tcx, trait_def_id));
}
}
match ccx.tcx.lang_items.to_builtin_kind(trait_ref.def_id) {
Some(ty::BoundSend) | Some(ty::BoundSync) => {}
Some(_) | None => {
- ccx.tcx.sess.span_err(
- item.span,
- format!("negative impls are currently \
- allowed just for `Send` and `Sync`").as_slice())
+ span_err!(ccx.tcx.sess, item.span, E0192,
+ "negative impls are currently \
+ allowed just for `Send` and `Sync`")
}
}
}
fn report_bound_error<'t>(tcx: &ty::ctxt<'t>,
span: Span,
bounded_ty: ty::Ty<'t>) {
- tcx.sess.span_err(
- span,
- format!("cannot bound type `{}`, where clause \
+ span_err!(tcx.sess, span, E0193,
+ "cannot bound type `{}`, where clause \
bounds may only be attached to types involving \
type parameters",
- bounded_ty.repr(tcx)).as_slice())
+ bounded_ty.repr(tcx))
}
fn is_ty_param(ty: ty::Ty) -> bool {
for method_param in generics.types.get_slice(subst::FnSpace).iter() {
if impl_params.contains(&method_param.name) {
- tcx.sess.span_err(
- span,
- &*format!("type parameter `{}` shadows another type parameter of the same name",
- token::get_name(method_param.name)));
+ span_err!(tcx.sess, span, E0194,
+ "type parameter `{}` shadows another type parameter of the same name",
+ token::get_name(method_param.name));
}
}
}
ResolvingUnboxedClosure(_) => {
let span = self.reason.span(self.tcx);
- self.tcx.sess.span_err(span,
+ span_err!(self.tcx.sess, span, E0196,
"cannot determine a type for this \
unboxed closure")
}
match trait_ref.self_ty().sty {
ty::ty_struct(..) | ty::ty_enum(..) => {}
_ => {
- self.tcx.sess.span_err(
- item.span,
- &format!("builtin traits can only be \
- implemented on structs or enums")[]);
+ span_err!(self.tcx.sess, item.span, E0209,
+ "builtin traits can only be \
+ implemented on structs or enums");
}
}
}
match ty::can_type_implement_copy(¶m_env, span, self_type) {
Ok(()) => {}
Err(ty::FieldDoesNotImplementCopy(name)) => {
- tcx.sess
- .span_err(span,
- &format!("the trait `Copy` may not be \
+ span_err!(tcx.sess, span, E0204,
+ "the trait `Copy` may not be \
implemented for this type; field \
`{}` does not implement `Copy`",
- token::get_name(name))[])
+ token::get_name(name))
}
Err(ty::VariantDoesNotImplementCopy(name)) => {
- tcx.sess
- .span_err(span,
- &format!("the trait `Copy` may not be \
+ span_err!(tcx.sess, span, E0205,
+ "the trait `Copy` may not be \
implemented for this type; variant \
`{}` does not implement `Copy`",
- token::get_name(name))[])
+ token::get_name(name))
}
Err(ty::TypeIsStructural) => {
- tcx.sess
- .span_err(span,
+ span_err!(tcx.sess, span, E0206,
"the trait `Copy` may not be implemented \
for this type; type is not a structure or \
enumeration")
}
Err(traits::OrphanCheckErr::UncoveredTy(param_ty)) => {
if !ty::has_attr(self.tcx, trait_def_id, "old_orphan_check") {
- self.tcx.sess.span_err(
- item.span,
- format!(
+ span_err!(self.tcx.sess, item.span, E0210,
"type parameter `{}` is not constrained by any local type; \
only traits defined in the current crate can be implemented \
for a type parameter",
- param_ty.user_string(self.tcx)).as_slice());
+ param_ty.user_string(self.tcx));
self.tcx.sess.span_note(
item.span,
format!("for a limited time, you can add \
match unsafety {
ast::Unsafety::Normal => { /* OK */ }
ast::Unsafety::Unsafe => {
- self.tcx.sess.span_err(
- item.span,
+ span_err!(self.tcx.sess, item.span, E0197,
"inherent impls cannot be declared as unsafe");
}
}
match (trait_def.unsafety, unsafety, polarity) {
(ast::Unsafety::Unsafe,
ast::Unsafety::Unsafe, ast::ImplPolarity::Negative) => {
- self.tcx.sess.span_err(
- item.span,
- format!("negative implementations are not unsafe").as_slice());
+ span_err!(self.tcx.sess, item.span, E0198,
+ "negative implementations are not unsafe");
}
(ast::Unsafety::Normal, ast::Unsafety::Unsafe, _) => {
- self.tcx.sess.span_err(
- item.span,
- format!("implementing the trait `{}` is not unsafe",
- trait_ref.user_string(self.tcx)).as_slice());
+ span_err!(self.tcx.sess, item.span, E0199,
+ "implementing the trait `{}` is not unsafe",
+ trait_ref.user_string(self.tcx));
}
(ast::Unsafety::Unsafe,
ast::Unsafety::Normal, ast::ImplPolarity::Positive) => {
- self.tcx.sess.span_err(
- item.span,
- format!("the trait `{}` requires an `unsafe impl` declaration",
- trait_ref.user_string(self.tcx)).as_slice());
+ span_err!(self.tcx.sess, item.span, E0200,
+ "the trait `{}` requires an `unsafe impl` declaration",
+ trait_ref.user_string(self.tcx));
}
(ast::Unsafety::Unsafe,
let mut seen_methods = FnvHashSet();
for m in ms {
if !seen_methods.insert(m.pe_ident().repr(tcx)) {
- tcx.sess.span_err(m.span, "duplicate method in trait impl");
+ span_err!(tcx.sess, m.span, E0201, "duplicate method in trait impl");
}
let m_def_id = local_def(m.id);
}
ast::TypeImplItem(ref typedef) => {
if opt_trait_ref.is_none() {
- tcx.sess.span_err(typedef.span,
+ span_err!(tcx.sess, typedef.span, E0202,
"associated items are not allowed in inherent impls");
}
assert!(ptr.bound_lifetimes.is_empty());
unbound = Some(ptr.trait_ref.clone());
} else {
- ccx.tcx.sess.span_err(span, "type parameter has more than one relaxed default \
+ span_err!(ccx.tcx.sess, span, E0203,
+ "type parameter has more than one relaxed default \
bound, only one is supported");
}
}
impl trait, self type, or predicates",
param_ty.user_string(tcx)).as_slice());
} else {
- tcx.sess.span_err(
- ty_param.span,
- format!("the type parameter `{}` is not constrained by the \
+ span_err!(tcx.sess, ty_param.span, E0207,
+ "the type parameter `{}` is not constrained by the \
impl trait, self type, or predicates",
- param_ty.user_string(tcx)).as_slice());
+ param_ty.user_string(tcx));
tcx.sess.span_help(
ty_param.span,
format!("you can temporarily opt out of this rule by placing \
#![allow(non_snake_case)]
-register_diagnostic! {
- E0001,
-r##"
- This error suggests that the expression arm corresponding to the noted pattern
- will never be reached as for all possible values of the expression being matched,
- one of the preceeding patterns will match.
-
- This means that perhaps some of the preceeding patterns are too general, this
- one is too specific or the ordering is incorrect.
-"## }
-
register_diagnostics! {
- E0002,
- E0003,
- E0004,
- E0005,
- E0006,
- E0007,
- E0008,
- E0009,
- E0010,
- E0011,
- E0012,
- E0013,
- E0014,
- E0015,
- E0016,
- E0017,
- E0018,
- E0019,
- E0020,
- E0022,
E0023,
E0024,
E0025,
E0046,
E0049,
E0050,
- E0051,
- E0052,
E0053,
E0054,
E0055,
- E0056,
E0057,
E0059,
E0060,
E0092,
E0093,
E0094,
- E0100,
E0101,
E0102,
E0103,
E0104,
E0106,
E0107,
- E0108,
- E0109,
- E0110,
E0116,
E0117,
E0118,
E0130,
E0131,
E0132,
- E0133,
- E0134,
- E0135,
- E0136,
- E0137,
- E0138,
- E0139,
- E0140,
E0141,
- E0152,
- E0153,
- E0157,
- E0158,
E0159,
- E0161,
- E0162,
E0163,
E0164,
- E0165,
E0166,
E0167,
E0168,
- E0169,
- E0171,
E0172,
E0173, // manual implementations of unboxed closure traits are experimental
E0174, // explicit use of unboxed closure methods are experimental
- E0177,
E0178,
- E0180,
- E0181,
E0182,
E0183,
- E0184
+ E0184,
+ E0185,
+ E0186,
+ E0187, // can't infer the kind of the closure
+ E0188, // types differ in mutability
+ E0189, // can only cast a boxed pointer to a boxed object
+ E0190, // can only cast a &-pointer to an &-object
+ E0191, // value of the associated type must be specified
+ E0192, // negative imples are allowed just fo `Send` and `Sync`
+ E0193, // cannot bound type where clause bounds may only be attached to types
+ // involving type parameters
+ E0194,
+ E0195, // lifetime parameters or bounds on method do not match the trait declaration
+ E0196, // cannot determine a type for this unboxed closure
+ E0197, // inherent impls cannot be declared as unsafe
+ E0198, // negative implementations are not unsafe
+ E0199, // implementing trait is not unsafe
+ E0200, // trait requires an `unsafe impl` declaration
+ E0201, // duplicate method in trait impl
+ E0202, // associated items are not allowed in inherint impls
+ E0203, // type parameter has more than one relaxed default bound,
+ // and only one is supported
+ E0204, // trait `Copy` may not be implemented for this type; field
+ // does not implement `Copy`
+ E0205, // trait `Copy` may not be implemented for this type; variant
+ // does not implement `copy`
+ E0206, // trait `Copy` may not be implemented for this type; type is
+ // not a structure or enumeration
+ E0207, // type parameter is not constrained by the impl trait, self type, or predicate
+ E0208,
+ E0209, // builtin traits can only be implemented on structs or enums
+ E0210, // type parameter is not constrained by any local type
+ E0211,
+ E0212, // cannot extract an associated type from a higher-ranked trait bound
+ E0213, // associated types are not accepted in this context
+ E0214, // parenthesized parameters may only be used with a trait
+ E0215, // angle-bracket notation is not stable with `Fn`
+ E0216, // parenthetical notation is only stable with `Fn`
+ E0217, // ambiguous associated type, defined in multiple supertraits
+ E0218, // no associated type defined
+ E0219, // associated type defined in higher-ranked supertrait
+ E0220, // associated type not found for type parameter
+ E0221, // ambiguous associated type in bounds
+ E0222, // variadic function must have C calling convention
+ E0223, // ambiguous associated type
+ E0224, // at least one non-builtin train is required for an object type
+ E0225, // only the builtin traits can be used as closure or object bounds
+ E0226, // only a single explicit lifetime bound is permitted
+ E0227, // ambiguous lifetime bound, explicit lifetime bound required
+ E0228, // explicit lifetime bound required
+ E0229, // associated type bindings are not allowed here
+ E0230, // there is no type parameter on trait
+ E0231, // only named substitution parameters are allowed
+ E0232, // this attribute must have a value
+ E0233,
+ E0234, // `for` loop expression has type which does not implement the `Iterator` trait
+ E0235, // structure constructor specifies a structure of type but
+ E0236, // no lang item for range syntax
+ E0237, // no lang item for range syntax
+ E0238, // parenthesized parameters may only be used with a trait
+ E0239, // `next` method of `Iterator` trait has unexpected type
+ E0240,
+ E0241,
+ E0242, // internal error looking up a definition
+ E0243, // wrong number of type arguments
+ E0244, // wrong number of type arguments
+ E0245, // not a trait
+ E0246, // illegal recursive type
+ E0247, // found module name used as a type
+ E0248, // found value name used as a type
+ E0249, // expected constant expr for array length
+ E0250 // expected constant expr for array length
}
+
+__build_diagnostic_array! { DIAGNOSTICS }
+
use std::cell::RefCell;
+// NB: This module needs to be declared first so diagnostics are
+// registered before they are used.
+pub mod diagnostics;
+
mod check;
mod rscope;
mod astconv;
match tcx.def_map.borrow().get(&id) {
Some(x) => x.clone(),
_ => {
- tcx.sess.span_fatal(sp, "internal error looking up a definition")
+ span_fatal!(tcx.sess, sp, E0242, "internal error looking up a definition")
}
}
}
match result {
Ok(_) => true,
Err(ref terr) => {
- tcx.sess.span_err(span,
- &format!("{}: {}",
+ span_err!(tcx.sess, span, E0211,
+ "{}: {}",
msg(),
ty::type_err_to_str(tcx,
- terr))[]);
+ terr));
ty::note_and_explain_type_err(tcx, terr);
false
}
InferredTerm(InferredIndex),
}
-impl<'a> fmt::Show for VarianceTerm<'a> {
+impl<'a> fmt::Debug for VarianceTerm<'a> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
ConstantTerm(c1) => write!(f, "{:?}", c1),
// attribute and report an error with various results if found.
if ty::has_attr(tcx, item_def_id, "rustc_variance") {
let found = item_variances.repr(tcx);
- tcx.sess.span_err(tcx.map.span(item_id), &found[]);
+ span_err!(tcx.sess, tcx.map.span(item_id), E0208, "{}", &found[]);
}
let newly_added = tcx.item_variance_map.borrow_mut()
pub fn build_external_trait(cx: &DocContext, tcx: &ty::ctxt,
did: ast::DefId) -> clean::Trait {
+ use clean::TraitMethod;
+
let def = ty::lookup_trait_def(tcx, did);
let trait_items = ty::trait_items(tcx, did).clean(cx);
let provided = ty::provided_trait_methods(tcx, did);
let items = trait_items.into_iter().map(|trait_item| {
- if provided.iter().any(|a| a.def_id == trait_item.def_id) {
- clean::ProvidedMethod(trait_item)
- } else {
- clean::RequiredMethod(trait_item)
+ match trait_item.inner {
+ clean::TyMethodItem(_) => {
+ if provided.iter().any(|a| a.def_id == trait_item.def_id) {
+ TraitMethod::ProvidedMethod(trait_item)
+ } else {
+ TraitMethod::RequiredMethod(trait_item)
+ }
+ },
+ clean::AssociatedTypeItem(_) => TraitMethod::TypeTraitItem(trait_item),
+ _ => unreachable!()
}
});
let trait_def = ty::lookup_trait_def(tcx, did);
};
Some(item)
}
- ty::TypeTraitItem(_) => {
- // FIXME(pcwalton): Implement.
- None
+ ty::TypeTraitItem(ref assoc_ty) => {
+ let did = assoc_ty.def_id;
+ let type_scheme = ty::lookup_item_type(tcx, did);
+ // Not sure the choice of ParamSpace actually matters here, because an
+ // associated type won't have generics on the LHS
+ let typedef = (type_scheme, subst::ParamSpace::TypeSpace).clean(cx);
+ Some(clean::Item {
+ name: Some(assoc_ty.name.clean(cx)),
+ inner: clean::TypedefItem(typedef),
+ source: clean::Span::empty(),
+ attrs: vec![],
+ visibility: None,
+ stability: stability::lookup(tcx, did).clean(cx),
+ def_id: did
+ })
}
}
}).collect();
+ let polarity = csearch::get_impl_polarity(tcx, did);
return Some(clean::Item {
inner: clean::ImplItem(clean::Impl {
derived: clean::detect_derived(attrs.as_slice()),
for_: ty.ty.clean(cx),
generics: (&ty.generics, subst::TypeSpace).clean(cx),
items: trait_items,
+ polarity: polarity.map(|p| { p.clean(cx) }),
}),
source: clean::Span::empty(),
name: None,
use rustc::middle::subst::{self, ParamSpace, VecPerParamSpace};
use rustc::middle::ty;
use rustc::middle::stability;
-use rustc::session::config;
use std::rc::Rc;
use std::u32;
}
}
-#[derive(Clone, RustcEncodable, RustcDecodable)]
+#[derive(Clone, RustcEncodable, RustcDecodable, Show)]
pub struct Crate {
pub name: String,
pub src: FsPath,
impl<'a, 'tcx> Clean<Crate> for visit_ast::RustdocVisitor<'a, 'tcx> {
fn clean(&self, cx: &DocContext) -> Crate {
+ use rustc::session::config::Input;
+
let mut externs = Vec::new();
cx.sess().cstore.iter_crate_data(|n, meta| {
externs.push((n, meta.clean(cx)));
externs.sort_by(|&(a, _), &(b, _)| a.cmp(&b));
// Figure out the name of this crate
- let input = config::Input::File(cx.src.clone());
- let name = link::find_crate_name(None, self.attrs.as_slice(), &input);
+ let input = &cx.input;
+ let name = link::find_crate_name(None, self.attrs.as_slice(), input);
// Clean the crate, translating the entire libsyntax AST to one that is
// understood by rustdoc.
m.items.extend(tmp.into_iter());
}
+ let src = match cx.input {
+ Input::File(ref path) => path.clone(),
+ Input::Str(_) => FsPath::new("") // FIXME: this is wrong
+ };
+
Crate {
name: name.to_string(),
- src: cx.src.clone(),
+ src: src,
module: Some(module),
externs: externs,
primitives: primitives,
}
}
-#[derive(Clone, RustcEncodable, RustcDecodable)]
+#[derive(Clone, RustcEncodable, RustcDecodable, Show)]
pub struct ExternalCrate {
pub name: String,
pub attrs: Vec<Attribute>,
/// Anything with a source location and set of attributes and, optionally, a
/// name. That is, anything that can be documented. This doesn't correspond
/// directly to the AST's concept of an item; it's a strict superset.
-#[derive(Clone, RustcEncodable, RustcDecodable)]
+#[derive(Clone, RustcEncodable, RustcDecodable, Show)]
pub struct Item {
/// Stringified span
pub source: Span,
}
}
-#[derive(Clone, RustcEncodable, RustcDecodable)]
+#[derive(Clone, RustcEncodable, RustcDecodable, Show)]
pub enum ItemEnum {
StructItem(Struct),
EnumItem(Enum),
AssociatedTypeItem(TyParam),
}
-#[derive(Clone, RustcEncodable, RustcDecodable)]
+#[derive(Clone, RustcEncodable, RustcDecodable, Show)]
pub struct Module {
pub items: Vec<Item>,
pub is_crate: bool,
}
}
-#[derive(Clone, RustcEncodable, RustcDecodable)]
+#[derive(Clone, RustcEncodable, RustcDecodable, Show)]
pub struct Method {
pub generics: Generics,
pub self_: SelfTy,
}
}
-#[derive(Clone, RustcEncodable, RustcDecodable)]
+#[derive(Clone, RustcEncodable, RustcDecodable, Show)]
pub struct TyMethod {
pub unsafety: ast::Unsafety,
pub decl: FnDecl,
}
}
-#[derive(Clone, RustcEncodable, RustcDecodable, PartialEq)]
+#[derive(Clone, RustcEncodable, RustcDecodable, PartialEq, Show)]
pub enum SelfTy {
SelfStatic,
SelfValue,
}
}
-#[derive(Clone, RustcEncodable, RustcDecodable)]
+#[derive(Clone, RustcEncodable, RustcDecodable, Show)]
pub struct Function {
pub decl: FnDecl,
pub generics: Generics,
}
}
-#[derive(Clone, RustcEncodable, RustcDecodable)]
+#[derive(Clone, RustcEncodable, RustcDecodable, Show)]
pub struct Trait {
pub unsafety: ast::Unsafety,
pub items: Vec<TraitMethod>,
/// An item belonging to a trait, whether a method or associated. Could be named
/// TraitItem except that's already taken by an exported enum variant.
-#[derive(Clone, RustcEncodable, RustcDecodable)]
+#[derive(Clone, RustcEncodable, RustcDecodable, Show)]
pub enum TraitMethod {
RequiredMethod(Item),
ProvidedMethod(Item),
- TypeTraitItem(Item),
+ TypeTraitItem(Item), // an associated type
}
impl TraitMethod {
}
}
-#[derive(Clone, RustcEncodable, RustcDecodable)]
+#[derive(Clone, RustcEncodable, RustcDecodable, Show)]
pub enum ImplMethod {
MethodImplItem(Item),
TypeImplItem(Item),
PrimitiveTuple,
}
-#[derive(Clone, RustcEncodable, RustcDecodable, Copy)]
+#[derive(Clone, RustcEncodable, RustcDecodable, Copy, Show)]
pub enum TypeKind {
TypeEnum,
TypeFunction,
}
}
-#[derive(Clone, RustcEncodable, RustcDecodable)]
+#[derive(Clone, RustcEncodable, RustcDecodable, Show)]
pub enum StructField {
HiddenStructField, // inserted later by strip passes
TypedStructField(Type),
}
}
-#[derive(Clone, RustcEncodable, RustcDecodable)]
+#[derive(Clone, RustcEncodable, RustcDecodable, Show)]
pub struct Struct {
pub struct_type: doctree::StructType,
pub generics: Generics,
/// This is a more limited form of the standard Struct, different in that
/// it lacks the things most items have (name, id, parameterization). Found
/// only as a variant in an enum.
-#[derive(Clone, RustcEncodable, RustcDecodable)]
+#[derive(Clone, RustcEncodable, RustcDecodable, Show)]
pub struct VariantStruct {
pub struct_type: doctree::StructType,
pub fields: Vec<Item>,
}
}
-#[derive(Clone, RustcEncodable, RustcDecodable)]
+#[derive(Clone, RustcEncodable, RustcDecodable, Show)]
pub struct Enum {
pub variants: Vec<Item>,
pub generics: Generics,
}
}
-#[derive(Clone, RustcEncodable, RustcDecodable)]
+#[derive(Clone, RustcEncodable, RustcDecodable, Show)]
pub struct Variant {
pub kind: VariantKind,
}
}
}
-#[derive(Clone, RustcEncodable, RustcDecodable)]
+#[derive(Clone, RustcEncodable, RustcDecodable, Show)]
pub enum VariantKind {
CLikeVariant,
TupleVariant(Vec<Type>),
Span {
filename: filename.to_string(),
loline: lo.line,
- locol: lo.col.to_uint(),
+ locol: lo.col.to_usize(),
hiline: hi.line,
- hicol: hi.col.to_uint(),
+ hicol: hi.col.to_usize(),
}
}
}
}
}
-#[derive(Clone, RustcEncodable, RustcDecodable)]
+#[derive(Clone, RustcEncodable, RustcDecodable, Show)]
pub struct Typedef {
pub type_: Type,
pub generics: Generics,
}
}
-#[derive(Clone, RustcEncodable, RustcDecodable)]
+#[derive(Clone, RustcEncodable, RustcDecodable, PartialEq, Copy, Show)]
+pub enum ImplPolarity {
+ Positive,
+ Negative,
+}
+
+impl Clean<ImplPolarity> for ast::ImplPolarity {
+ fn clean(&self, _: &DocContext) -> ImplPolarity {
+ match self {
+ &ast::ImplPolarity::Positive => ImplPolarity::Positive,
+ &ast::ImplPolarity::Negative => ImplPolarity::Negative,
+ }
+ }
+}
+
+#[derive(Clone, RustcEncodable, RustcDecodable, Show)]
pub struct Impl {
pub generics: Generics,
pub trait_: Option<Type>,
pub for_: Type,
pub items: Vec<Item>,
pub derived: bool,
+ pub polarity: Option<ImplPolarity>,
}
fn detect_derived<M: AttrMetaMethods>(attrs: &[M]) -> bool {
}
}).collect(),
derived: detect_derived(self.attrs.as_slice()),
+ polarity: Some(self.polarity.clean(cx)),
}),
}
}
}
-#[derive(Clone, RustcEncodable, RustcDecodable)]
+#[derive(Clone, RustcEncodable, RustcDecodable, Show)]
pub struct ViewItem {
pub inner: ViewItemInner,
}
}
}
-#[derive(Clone, RustcEncodable, RustcDecodable)]
+#[derive(Clone, RustcEncodable, RustcDecodable, Show)]
pub enum ViewItemInner {
ExternCrate(String, Option<String>, ast::NodeId),
Import(ViewPath)
}
}
-#[derive(Clone, RustcEncodable, RustcDecodable)]
+#[derive(Clone, RustcEncodable, RustcDecodable, Show)]
pub enum ViewPath {
// use source as str;
SimpleImport(String, ImportSource),
ImportList(ImportSource, Vec<ViewListIdent>),
}
-#[derive(Clone, RustcEncodable, RustcDecodable)]
+#[derive(Clone, RustcEncodable, RustcDecodable, Show)]
pub struct ImportSource {
pub path: Path,
pub did: Option<ast::DefId>,
}
}
-#[derive(Clone, RustcEncodable, RustcDecodable)]
+#[derive(Clone, RustcEncodable, RustcDecodable, Show)]
pub struct ViewListIdent {
pub name: String,
pub source: Option<ast::DefId>,
})
}
-#[derive(Clone, RustcEncodable, RustcDecodable)]
+#[derive(Clone, RustcEncodable, RustcDecodable, Show)]
pub struct Macro {
pub source: String,
}
}
}
-#[derive(Clone, RustcEncodable, RustcDecodable)]
+#[derive(Clone, RustcEncodable, RustcDecodable, Show)]
pub struct Stability {
pub level: attr::StabilityLevel,
pub text: String
source: DUMMY_SP.clean(cx),
name: Some(self.name.clean(cx)),
attrs: Vec::new(),
- // FIXME(#18048): this is wrong, but cross-crate associated types are broken
- // anyway, for the time being.
inner: AssociatedTypeItem(TyParam {
name: self.name.clean(cx),
did: ast::DefId {
krate: 0,
node: ast::DUMMY_NODE_ID
},
+ // FIXME(#20727): bounds are missing and need to be filled in from the
+ // predicates on the trait itself
bounds: vec![],
default: None,
}),
}
}
+impl<'a> Clean<Typedef> for (ty::TypeScheme<'a>, ParamSpace) {
+ fn clean(&self, cx: &DocContext) -> Typedef {
+ let (ref ty_scheme, ps) = *self;
+ Typedef {
+ type_: ty_scheme.ty.clean(cx),
+ generics: (&ty_scheme.generics, ps).clean(cx)
+ }
+ }
+}
+
fn lang_struct(cx: &DocContext, did: Option<ast::DefId>,
t: ty::Ty, name: &str,
fallback: fn(Box<Type>) -> Type) -> Type {
use rustc_driver::driver;
use rustc::session::{self, config};
use rustc::session::config::UnstableFeatures;
-use rustc::session::search_paths::SearchPaths;
use rustc::middle::{privacy, ty};
use rustc::lint;
use rustc_trans::back::link;
use clean;
use clean::Clean;
+pub use rustc::session::config::Input;
+pub use rustc::session::search_paths::SearchPaths;
+
/// Are we generating documentation (`Typed`) or tests (`NotTyped`)?
pub enum MaybeTyped<'tcx> {
Typed(ty::ctxt<'tcx>),
pub struct DocContext<'tcx> {
pub krate: &'tcx ast::Crate,
pub maybe_typed: MaybeTyped<'tcx>,
- pub src: Path,
+ pub input: Input,
pub external_paths: ExternalPaths,
pub external_traits: RefCell<Option<HashMap<ast::DefId, clean::Trait>>>,
pub external_typarams: RefCell<Option<HashMap<ast::DefId, String>>>,
pub type Externs = HashMap<String, Vec<String>>;
pub fn run_core(search_paths: SearchPaths, cfgs: Vec<String>, externs: Externs,
- cpath: &Path, triple: Option<String>)
+ input: Input, triple: Option<String>)
-> (clean::Crate, CrateAnalysis) {
// Parse, resolve, and typecheck the given crate.
- let input = config::Input::File(cpath.clone());
+ let cpath = match input {
+ Input::File(ref p) => Some(p.clone()),
+ _ => None
+ };
let warning_lint = lint::builtin::WARNINGS.name_lower();
let span_diagnostic_handler =
diagnostic::mk_span_handler(diagnostic_handler, codemap);
- let sess = session::build_session_(sessopts,
- Some(cpath.clone()),
+ let sess = session::build_session_(sessopts, cpath,
span_diagnostic_handler);
let cfg = config::build_configuration(&sess);
let ctxt = DocContext {
krate: ty_cx.map.krate(),
maybe_typed: Typed(ty_cx),
- src: cpath.clone(),
+ input: input,
external_traits: RefCell::new(Some(HashMap::new())),
external_typarams: RefCell::new(Some(HashMap::new())),
external_paths: RefCell::new(Some(HashMap::new())),
/// string when passed to a format string.
pub struct Escape<'a>(pub &'a str);
-impl<'a> fmt::String for Escape<'a> {
+impl<'a> fmt::Display for Escape<'a> {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
// Because the internet is always right, turns out there's not that many
// characters to escape: http://stackoverflow.com/questions/7381974
}
}
-impl<'a, T: fmt::String> fmt::String for CommaSep<'a, T> {
+impl<'a, T: fmt::Display> fmt::Display for CommaSep<'a, T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
for (i, item) in self.0.iter().enumerate() {
if i != 0 { try!(write!(f, ", ")); }
}
}
-impl<'a> fmt::String for TyParamBounds<'a> {
+impl<'a> fmt::Display for TyParamBounds<'a> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let &TyParamBounds(bounds) = self;
for (i, bound) in bounds.iter().enumerate() {
}
}
-impl fmt::String for clean::Generics {
+impl fmt::Display for clean::Generics {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if self.lifetimes.len() == 0 && self.type_params.len() == 0 { return Ok(()) }
try!(f.write_str("<"));
}
}
-impl<'a> fmt::String for WhereClause<'a> {
+impl<'a> fmt::Display for WhereClause<'a> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let &WhereClause(gens) = self;
if gens.where_predicates.len() == 0 {
}
}
-impl fmt::String for clean::Lifetime {
+impl fmt::Display for clean::Lifetime {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
try!(f.write_str(self.get_ref()));
Ok(())
}
}
-impl fmt::String for clean::PolyTrait {
+impl fmt::Display for clean::PolyTrait {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if self.lifetimes.len() > 0 {
try!(f.write_str("for<"));
}
}
-impl fmt::String for clean::TyParamBound {
+impl fmt::Display for clean::TyParamBound {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
clean::RegionBound(ref lt) => {
}
}
-impl fmt::String for clean::PathParameters {
+impl fmt::Display for clean::PathParameters {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
clean::PathParameters::AngleBracketed {
}
}
-impl fmt::String for clean::PathSegment {
+impl fmt::Display for clean::PathSegment {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
try!(f.write_str(self.name.as_slice()));
write!(f, "{}", self.params)
}
}
-impl fmt::String for clean::Path {
+impl fmt::Display for clean::Path {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if self.global {
try!(f.write_str("::"))
// This is a documented path, link to it!
Some((ref fqp, shortty)) if abs_root.is_some() => {
let mut url = String::from_str(abs_root.unwrap().as_slice());
- let to_link = &fqp[..(fqp.len() - 1)];
+ let to_link = &fqp[..fqp.len() - 1];
for component in to_link.iter() {
url.push_str(component.as_slice());
url.push_str("/");
}
}
-impl fmt::String for clean::Type {
+impl fmt::Display for clean::Type {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
clean::TyParamBinder(id) => {
}
}
-impl fmt::String for clean::Arguments {
+impl fmt::Display for clean::Arguments {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
for (i, input) in self.values.iter().enumerate() {
if i > 0 { try!(write!(f, ", ")); }
}
}
-impl fmt::String for clean::FunctionRetTy {
+impl fmt::Display for clean::FunctionRetTy {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
clean::Return(clean::Tuple(ref tys)) if tys.is_empty() => Ok(()),
}
}
-impl fmt::String for clean::FnDecl {
+impl fmt::Display for clean::FnDecl {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "({args}){arrow}", args = self.inputs, arrow = self.output)
}
}
-impl<'a> fmt::String for Method<'a> {
+impl<'a> fmt::Display for Method<'a> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let Method(selfty, d) = *self;
let mut args = String::new();
}
}
-impl fmt::String for VisSpace {
+impl fmt::Display for VisSpace {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self.get() {
Some(ast::Public) => write!(f, "pub "),
}
}
-impl fmt::String for UnsafetySpace {
+impl fmt::Display for UnsafetySpace {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self.get() {
ast::Unsafety::Unsafe => write!(f, "unsafe "),
}
}
-impl fmt::String for clean::ViewPath {
+impl fmt::Display for clean::ViewPath {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
clean::SimpleImport(ref name, ref src) => {
}
}
-impl fmt::String for clean::ImportSource {
+impl fmt::Display for clean::ImportSource {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self.did {
Some(did) => resolved_path(f, did, &self.path, true),
}
}
-impl fmt::String for clean::ViewListIdent {
+impl fmt::Display for clean::ViewListIdent {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self.source {
Some(did) => {
}
}
-impl fmt::String for clean::TypeBinding {
+impl fmt::Display for clean::TypeBinding {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}={}", self.name, self.ty)
}
}
-impl fmt::String for MutableSpace {
+impl fmt::Display for MutableSpace {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
MutableSpace(clean::Immutable) => Ok(()),
}
}
-impl fmt::String for RawMutableSpace {
+impl fmt::Display for RawMutableSpace {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
RawMutableSpace(clean::Immutable) => write!(f, "const "),
}
}
-impl<'a> fmt::String for Stability<'a> {
+impl<'a> fmt::Display for Stability<'a> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let Stability(stab) = *self;
match *stab {
}
}
-impl<'a> fmt::String for ConciseStability<'a> {
+impl<'a> fmt::Display for ConciseStability<'a> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let ConciseStability(stab) = *self;
match *stab {
}
}
-impl fmt::String for ModuleSummary {
+impl fmt::Display for ModuleSummary {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fn fmt_inner<'a>(f: &mut fmt::Formatter,
context: &mut Vec<&'a str>,
}
}
-impl fmt::String for ItemType {
+impl fmt::Display for ItemType {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
self.to_static_str().fmt(f)
}
pub keywords: &'a str
}
-pub fn render<T: fmt::String, S: fmt::String>(
+pub fn render<T: fmt::Display, S: fmt::Display>(
dst: &mut io::Writer, layout: &Layout, page: &Page, sidebar: &S, t: &T)
-> io::IoResult<()>
{
USED_HEADER_MAP.with(|s| s.borrow_mut().clear());
}
-impl<'a> fmt::String for Markdown<'a> {
+impl<'a> fmt::Display for Markdown<'a> {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
let Markdown(md) = *self;
// This is actually common enough to special-case
}
}
-impl<'a> fmt::String for MarkdownWithToc<'a> {
+impl<'a> fmt::Display for MarkdownWithToc<'a> {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
let MarkdownWithToc(md) = *self;
render(fmt, md.as_slice(), true)
search_index.push(IndexItem {
ty: shortty(item),
name: item.name.clone().unwrap(),
- path: fqp[..(fqp.len() - 1)].connect("::"),
+ path: fqp[..fqp.len() - 1].connect("::"),
desc: shorter(item.doc_value()).to_string(),
parent: Some(did),
});
};
let mut mydst = dst.clone();
- for part in remote_path[..(remote_path.len() - 1)].iter() {
+ for part in remote_path[..remote_path.len() - 1].iter() {
mydst.push(part.as_slice());
try!(mkdir(&mydst));
}
clean::StructFieldItem(..) |
clean::VariantItem(..) => {
((Some(*self.parent_stack.last().unwrap()),
- Some(&self.stack[..(self.stack.len() - 1)])),
+ Some(&self.stack[..self.stack.len() - 1])),
false)
}
clean::MethodItem(..) => {
let did = *last;
let path = match self.paths.get(&did) {
Some(&(_, ItemType::Trait)) =>
- Some(&self.stack[..(self.stack.len() - 1)]),
+ Some(&self.stack[..self.stack.len() - 1]),
// The current stack not necessarily has correlation for
// where the type was defined. On the other hand,
// `paths` always has the right information if present.
Some(&(ref fqp, ItemType::Struct)) |
Some(&(ref fqp, ItemType::Enum)) =>
- Some(&fqp[..(fqp.len() - 1)]),
+ Some(&fqp[..fqp.len() - 1]),
Some(..) => Some(self.stack.as_slice()),
None => None
};
.collect::<String>();
match cache().paths.get(&it.def_id) {
Some(&(ref names, _)) => {
- for name in (&names[..(names.len() - 1)]).iter() {
+ for name in (&names[..names.len() - 1]).iter() {
url.push_str(name.as_slice());
url.push_str("/");
}
}
-impl<'a> fmt::String for Item<'a> {
+impl<'a> fmt::Display for Item<'a> {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
// Write the breadcrumb trail header for the top
try!(write!(fmt, "\n<h1 class='fqn'><span class='in-band'>"));
struct Initializer<'a>(&'a str);
-impl<'a> fmt::String for Initializer<'a> {
+impl<'a> fmt::Display for Initializer<'a> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let Initializer(s) = *self;
if s.len() == 0 { return Ok(()); }
try!(write!(w, "<h3 class='impl'>{}<code>impl{} ",
ConciseStability(&i.stability),
i.impl_.generics));
+ match i.impl_.polarity {
+ Some(clean::ImplPolarity::Negative) => try!(write!(w, "!")),
+ _ => {}
+ }
match i.impl_.trait_ {
Some(ref ty) => try!(write!(w, "{} for ", *ty)),
None => {}
document(w, it)
}
-impl<'a> fmt::String for Sidebar<'a> {
+impl<'a> fmt::Display for Sidebar<'a> {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
let cx = self.cx;
let it = self.item;
}
}
-impl<'a> fmt::String for Source<'a> {
+impl<'a> fmt::Display for Source<'a> {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
let Source(s) = *self;
let lines = s.lines().count();
}
}
-impl fmt::Show for Toc {
+impl fmt::Debug for Toc {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt(self, f)
+ fmt::Display::fmt(self, f)
}
}
-impl fmt::String for Toc {
+impl fmt::Display for Toc {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
try!(write!(fmt, "<ul>"));
for entry in self.entries.iter() {
let res = std::thread::Builder::new().stack_size(STACK_SIZE).scoped(move || {
main_args(std::os::args().as_slice())
}).join();
- std::os::set_exit_status(res.map_err(|_| ()).unwrap());
+ std::os::set_exit_status(res.ok().unwrap());
}
pub fn opts() -> Vec<getopts::OptGroup> {
info!("starting to run rustc");
let (mut krate, analysis) = std::thread::Thread::scoped(move |:| {
+ use rustc::session::config::Input;
+
let cr = cr;
- core::run_core(paths, cfgs, externs, &cr, triple)
+ core::run_core(paths, cfgs, externs, Input::File(cr), triple)
}).join().map_err(|_| "rustc failed").unwrap();
info!("finished with rustc");
let mut analysis = Some(analysis);
let ctx = core::DocContext {
krate: &krate,
maybe_typed: core::NotTyped(sess),
- src: input_path,
+ input: input,
external_paths: RefCell::new(Some(HashMap::new())),
external_traits: RefCell::new(None),
external_typarams: RefCell::new(None),
}
/// Errors that can occur when decoding a base64 encoded string
-#[derive(Copy)]
+#[derive(Copy, Show)]
pub enum FromBase64Error {
/// The input contained a character not part of the base64 format
InvalidBase64Byte(u8, uint),
InvalidBase64Length,
}
-impl fmt::Show for FromBase64Error {
+impl fmt::Display for FromBase64Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
InvalidBase64Byte(ch, idx) =>
InvalidBase64Length => "invalid length",
}
}
-
- fn detail(&self) -> Option<String> {
- Some(format!("{:?}", self))
- }
}
impl FromBase64 for str {
}
/// Errors that can occur when decoding a hex encoded string
-#[derive(Copy)]
+#[derive(Copy, Show)]
pub enum FromHexError {
/// The input contained a character not part of the hex format
InvalidHexCharacter(char, uint),
InvalidHexLength,
}
-impl fmt::Show for FromHexError {
+impl fmt::Display for FromHexError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
InvalidHexCharacter(ch, idx) =>
InvalidHexLength => "invalid length",
}
}
-
- fn detail(&self) -> Option<String> {
- Some(format!("{:?}", self))
- }
}
pub struct AsPrettyJson<'a, T: 'a> { inner: &'a T, indent: Option<uint> }
/// The errors that can arise while parsing a JSON stream.
-#[derive(Clone, Copy, PartialEq)]
+#[derive(Clone, Copy, PartialEq, Show)]
pub enum ErrorCode {
InvalidSyntax,
InvalidNumber,
s
}
-impl fmt::Show for ErrorCode {
+impl fmt::Display for ErrorCode {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
error_str(*self).fmt(f)
}
IoError(io.kind, io.desc)
}
+impl fmt::Display for ParserError {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ // FIXME this should be a nicer error
+ fmt::Debug::fmt(self, f)
+ }
+}
+
+impl fmt::Display for DecoderError {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ // FIXME this should be a nicer error
+ fmt::Debug::fmt(self, f)
+ }
+}
+
impl std::error::Error for DecoderError {
fn description(&self) -> &str { "decoder error" }
- fn detail(&self) -> Option<std::string::String> { Some(format!("{:?}", self)) }
+}
+
+impl fmt::Display for EncoderError {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ // FIXME this should be a nicer error
+ fmt::Debug::fmt(self, f)
+ }
}
impl std::error::Error for EncoderError {
fn description(&self) -> &str { "encoder error" }
- fn detail(&self) -> Option<std::string::String> { Some(format!("{:?}", self)) }
}
impl std::error::FromError<fmt::Error> for EncoderError {
InternalIndex(i) => StackElement::Index(i),
InternalKey(start, size) => {
StackElement::Key(str::from_utf8(
- &self.str_buffer[(start as uint) .. (start as uint + size as uint)])
+ &self.str_buffer[start as uint .. start as uint + size as uint])
.unwrap())
}
}
Some(&InternalIndex(i)) => Some(StackElement::Index(i)),
Some(&InternalKey(start, size)) => {
Some(StackElement::Key(str::from_utf8(
- &self.str_buffer[(start as uint) .. (start+size) as uint]
+ &self.str_buffer[start as uint .. (start+size) as uint]
).unwrap()))
}
}
}
}
-impl fmt::String for Json {
+impl fmt::Display for Json {
/// Encodes a json value into a string
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let mut shim = FormatShim { inner: f };
}
}
-impl<'a> fmt::String for PrettyJson<'a> {
+impl<'a> fmt::Display for PrettyJson<'a> {
/// Encodes a json value into a string
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let mut shim = FormatShim { inner: f };
}
}
-impl<'a, T: Encodable> fmt::String for AsJson<'a, T> {
+impl<'a, T: Encodable> fmt::Display for AsJson<'a, T> {
/// Encodes a json value into a string
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let mut shim = FormatShim { inner: f };
}
}
-impl<'a, T: Encodable> fmt::String for AsPrettyJson<'a, T> {
+impl<'a, T: Encodable> fmt::Display for AsPrettyJson<'a, T> {
/// Encodes a json value into a string
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let mut shim = FormatShim { inner: f };
let mut mem_buf = Vec::new();
let mut encoder = Encoder::new(&mut mem_buf as &mut fmt::Writer);
let result = hm.encode(&mut encoder);
- match result.unwrap_err() {
+ match result.err().unwrap() {
EncoderError::BadHashmapKey => (),
_ => panic!("expected bad hash map key")
}
-// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+// Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
use clone::Clone;
use cmp::{max, Eq, PartialEq};
use default::Default;
-use fmt::{self, Show};
+use fmt::{self, Debug};
use hash::{self, Hash, SipHasher};
use iter::{self, Iterator, ExactSizeIterator, IteratorExt, FromIterator, Extend, Map};
use marker::Sized;
// min_capacity(size) must be smaller than the internal capacity,
// so that the map is not resized:
// `min_capacity(usable_capacity(x)) <= x`.
- // The lef-hand side can only be smaller due to flooring by integer
+ // The left-hand side can only be smaller due to flooring by integer
// division.
//
// This doesn't have to be checked for overflow since allocation size
/// ```
/// use std::collections::HashMap;
///
-/// #[derive(Hash, Eq, PartialEq, Show)]
+/// #[derive(Hash, Eq, PartialEq, Debug)]
/// struct Viking {
/// name: String,
/// country: String,
/// map.insert("b", 2);
/// map.insert("c", 3);
///
- /// for key in map.values() {
- /// println!("{}", key);
+ /// for val in map.values() {
+ /// println!("{}", val);
/// }
/// ```
#[stable]
search_entry_hashed(&mut self.table, hash, key)
}
- /// Return the number of elements in the map.
+ /// Returns the number of elements in the map.
///
/// # Example
///
#[stable]
pub fn len(&self) -> uint { self.table.size() }
- /// Return true if the map contains no elements.
+ /// Returns true if the map contains no elements.
///
/// # Example
///
{}
#[stable]
-impl<K, V, S, H> Show for HashMap<K, V, S>
- where K: Eq + Hash<H> + Show, V: Show,
+impl<K, V, S, H> Debug for HashMap<K, V, S>
+ where K: Eq + Hash<H> + Debug, V: Debug,
S: HashState<Hasher=H>,
H: hash::Hasher<Output=u64>
{
}
}
-/// HashMap iterator
+/// HashMap iterator.
#[stable]
pub struct Iter<'a, K: 'a, V: 'a> {
inner: table::Iter<'a, K, V>
}
}
-/// HashMap mutable values iterator
+/// HashMap mutable values iterator.
#[stable]
pub struct IterMut<'a, K: 'a, V: 'a> {
inner: table::IterMut<'a, K, V>
}
-/// HashMap move iterator
+/// HashMap move iterator.
#[stable]
pub struct IntoIter<K, V> {
inner: iter::Map<
>
}
-/// HashMap keys iterator
+/// HashMap keys iterator.
#[stable]
pub struct Keys<'a, K: 'a, V: 'a> {
inner: Map<(&'a K, &'a V), &'a K, Iter<'a, K, V>, fn((&'a K, &'a V)) -> &'a K>
}
}
-/// HashMap values iterator
+/// HashMap values iterator.
#[stable]
pub struct Values<'a, K: 'a, V: 'a> {
inner: Map<(&'a K, &'a V), &'a V, Iter<'a, K, V>, fn((&'a K, &'a V)) -> &'a V>
}
}
-/// HashMap drain iterator
+/// HashMap drain iterator.
#[unstable = "matches collection reform specification, waiting for dust to settle"]
pub struct Drain<'a, K: 'a, V: 'a> {
inner: iter::Map<
>
}
-/// A view into a single occupied location in a HashMap
+/// A view into a single occupied location in a HashMap.
#[unstable = "precise API still being fleshed out"]
pub struct OccupiedEntry<'a, K: 'a, V: 'a> {
elem: FullBucket<K, V, &'a mut RawTable<K, V>>,
}
-/// A view into a single empty location in a HashMap
+/// A view into a single empty location in a HashMap.
#[unstable = "precise API still being fleshed out"]
pub struct VacantEntry<'a, K: 'a, V: 'a> {
hash: SafeHash,
elem: VacantEntryState<K, V, &'a mut RawTable<K, V>>,
}
-/// A view into a single location in a map, which may be vacant or occupied
+/// A view into a single location in a map, which may be vacant or occupied.
#[unstable = "precise API still being fleshed out"]
pub enum Entry<'a, K: 'a, V: 'a> {
- /// An occupied Entry
+ /// An occupied Entry.
Occupied(OccupiedEntry<'a, K, V>),
- /// A vacant Entry
+ /// A vacant Entry.
Vacant(VacantEntry<'a, K, V>),
}
-/// Possible states of a VacantEntry
+/// Possible states of a VacantEntry.
enum VacantEntryState<K, V, M> {
/// The index is occupied, but the key to insert has precedence,
- /// and will kick the current one out on insertion
+ /// and will kick the current one out on insertion.
NeqElem(FullBucket<K, V, M>, uint),
- /// The index is genuinely vacant
+ /// The index is genuinely vacant.
NoElem(EmptyBucket<K, V, M>),
}
#[unstable = "matches collection reform v2 specification, waiting for dust to settle"]
impl<'a, K, V> Entry<'a, K, V> {
- /// Returns a mutable reference to the entry if occupied, or the VacantEntry if vacant
+ /// Returns a mutable reference to the entry if occupied, or the VacantEntry if vacant.
pub fn get(self) -> Result<&'a mut V, VacantEntry<'a, K, V>> {
match self {
Occupied(entry) => Ok(entry.into_mut()),
#[unstable = "matches collection reform v2 specification, waiting for dust to settle"]
impl<'a, K, V> OccupiedEntry<'a, K, V> {
- /// Gets a reference to the value in the entry
+ /// Gets a reference to the value in the entry.
pub fn get(&self) -> &V {
self.elem.read().1
}
- /// Gets a mutable reference to the value in the entry
+ /// Gets a mutable reference to the value in the entry.
pub fn get_mut(&mut self) -> &mut V {
self.elem.read_mut().1
}
let map_str = format!("{:?}", map);
- assert!(map_str == "HashMap {1i: 2i, 3i: 4i}" ||
- map_str == "HashMap {3i: 4i, 1i: 2i}");
+ assert!(map_str == "HashMap {1: 2, 3: 4}" ||
+ map_str == "HashMap {3: 4, 1: 2}");
assert_eq!(format!("{:?}", empty), "HashMap {}");
}
use cmp::{Eq, PartialEq};
use core::marker::Sized;
use default::Default;
-use fmt::Show;
+use fmt::Debug;
use fmt;
use hash::{self, Hash};
use iter::{Iterator, ExactSizeIterator, IteratorExt, FromIterator, Map, Chain, Extend};
///
/// ```
/// use std::collections::HashSet;
-/// #[derive(Hash, Eq, PartialEq, Show)]
+/// #[derive(Hash, Eq, PartialEq, Debug)]
/// struct Viking<'a> {
/// name: &'a str,
/// power: uint,
{}
#[stable]
-impl<T, S, H> fmt::Show for HashSet<T, S>
- where T: Eq + Hash<H> + fmt::Show,
+impl<T, S, H> fmt::Debug for HashSet<T, S>
+ where T: Eq + Hash<H> + fmt::Debug,
S: HashState<Hasher=H>,
H: hash::Hasher<Output=u64>
{
let set_str = format!("{:?}", set);
- assert!(set_str == "HashSet {1i, 2i}" || set_str == "HashSet {2i, 1i}");
+ assert!(set_str == "HashSet {1, 2}" || set_str == "HashSet {2, 1}");
assert_eq!(format!("{:?}", empty), "HashSet {}");
}
+++ /dev/null
-// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-//! Traits for working with Errors.
-//!
-//! # The `Error` trait
-//!
-//! `Error` is a trait representing the basic expectations for error values,
-//! i.e. values of type `E` in `Result<T, E>`. At a minimum, errors must provide
-//! a description, but they may optionally provide additional detail and cause
-//! chain information:
-//!
-//! ```
-//! trait Error {
-//! fn description(&self) -> &str;
-//!
-//! fn detail(&self) -> Option<String> { None }
-//! fn cause(&self) -> Option<&Error> { None }
-//! }
-//! ```
-//!
-//! The `cause` method is generally used when errors cross "abstraction
-//! boundaries", i.e. when a one module must report an error that is "caused"
-//! by an error from a lower-level module. This setup makes it possible for the
-//! high-level module to provide its own errors that do not commit to any
-//! particular implementation, but also reveal some of its implementation for
-//! debugging via `cause` chains.
-//!
-//! # The `FromError` trait
-//!
-//! `FromError` is a simple trait that expresses conversions between different
-//! error types. To provide maximum flexibility, it does not require either of
-//! the types to actually implement the `Error` trait, although this will be the
-//! common case.
-//!
-//! The main use of this trait is in the `try!` macro, which uses it to
-//! automatically convert a given error to the error specified in a function's
-//! return type.
-//!
-//! For example,
-//!
-//! ```
-//! use std::error::FromError;
-//! use std::io::{File, IoError};
-//! use std::os::{MemoryMap, MapError};
-//! use std::path::Path;
-//!
-//! enum MyError {
-//! Io(IoError),
-//! Map(MapError)
-//! }
-//!
-//! impl FromError<IoError> for MyError {
-//! fn from_error(err: IoError) -> MyError {
-//! MyError::Io(err)
-//! }
-//! }
-//!
-//! impl FromError<MapError> for MyError {
-//! fn from_error(err: MapError) -> MyError {
-//! MyError::Map(err)
-//! }
-//! }
-//!
-//! #[allow(unused_variables)]
-//! fn open_and_map() -> Result<(), MyError> {
-//! let f = try!(File::open(&Path::new("foo.txt")));
-//! let m = try!(MemoryMap::new(0, &[]));
-//! // do something interesting here...
-//! Ok(())
-//! }
-//! ```
-
-#![stable]
-
-use prelude::v1::*;
-
-use str::Utf8Error;
-use string::{FromUtf8Error, FromUtf16Error};
-
-/// Base functionality for all errors in Rust.
-#[unstable = "the exact API of this trait may change"]
-pub trait Error {
- /// A short description of the error; usually a static string.
- fn description(&self) -> &str;
-
- /// A detailed description of the error, usually including dynamic information.
- fn detail(&self) -> Option<String> { None }
-
- /// The lower-level cause of this error, if any.
- fn cause(&self) -> Option<&Error> { None }
-}
-
-/// A trait for types that can be converted from a given error type `E`.
-#[stable]
-pub trait FromError<E> {
- /// Perform the conversion.
- fn from_error(err: E) -> Self;
-}
-
-// Any type is convertable from itself
-#[stable]
-impl<E> FromError<E> for E {
- fn from_error(err: E) -> E {
- err
- }
-}
-
-#[stable]
-impl Error for Utf8Error {
- fn description(&self) -> &str {
- match *self {
- Utf8Error::TooShort => "invalid utf-8: not enough bytes",
- Utf8Error::InvalidByte(..) => "invalid utf-8: corrupt contents",
- }
- }
-
- fn detail(&self) -> Option<String> { Some(self.to_string()) }
-}
-
-#[stable]
-impl Error for FromUtf8Error {
- fn description(&self) -> &str { "invalid utf-8" }
- fn detail(&self) -> Option<String> { Some(self.to_string()) }
-}
-
-#[stable]
-impl Error for FromUtf16Error {
- fn description(&self) -> &str { "invalid utf-16" }
-}
}
}
-impl fmt::Show for CString {
+#[stable]
+impl fmt::Debug for CString {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
String::from_utf8_lossy(self.as_bytes()).fmt(f)
}
assert_eq!(s.as_bytes(), b"\0");
}
}
+
+ #[test]
+ fn formatted() {
+ let s = CString::from_slice(b"12");
+ assert_eq!(format!("{:?}", s), "\"12\"");
+ }
}
//! This allows multiple actual types to be formatted via `{:x}` (like `i8` as
//! well as `int`). The current mapping of types to traits is:
//!
-//! * *nothing* ⇒ `String`
-//! * `?` ⇒ `Show`
+//! * *nothing* ⇒ `Display`
+//! * `?` ⇒ `Debug`
//! * `o` ⇒ `Octal`
//! * `x` ⇒ `LowerHex`
//! * `X` ⇒ `UpperHex`
//! `std::fmt::Binary` trait can then be formatted with `{:b}`. Implementations
//! are provided for these traits for a number of primitive types by the
//! standard library as well. If no format is specified (as in `{}` or `{:6}`),
-//! then the format trait used is the `String` trait.
+//! then the format trait used is the `Display` trait.
//!
//! When implementing a format trait for your own type, you will have to
//! implement a method of the signature:
//! ```rust
//! # use std::fmt;
//! # struct Foo; // our custom type
-//! # impl fmt::Show for Foo {
+//! # impl fmt::Display for Foo {
//! fn fmt(&self, f: &mut std::fmt::Formatter) -> fmt::Result {
//! # write!(f, "testing, testing")
//! # } }
//! use std::f64;
//! use std::num::Float;
//!
-//! #[derive(Show)]
+//! #[derive(Debug)]
//! struct Vector2D {
//! x: int,
//! y: int,
//! }
//!
-//! impl fmt::String for Vector2D {
+//! impl fmt::Display for Vector2D {
//! fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
//! // The `f` value implements the `Writer` trait, which is what the
//! // write! macro is expecting. Note that this formatting ignores the
//! }
//! ```
//!
-//! #### fmt::String vs fmt::Show
+//! #### fmt::Display vs fmt::Debug
//!
//! These two formatting traits have distinct purposes:
//!
-//! - `fmt::String` implementations assert that the type can be faithfully
+//! - `fmt::Display` implementations assert that the type can be faithfully
//! represented as a UTF-8 string at all times. It is **not** expected that
-//! all types implement the `String` trait.
-//! - `fmt::Show` implementations should be implemented for **all** public types.
+//! all types implement the `Display` trait.
+//! - `fmt::Debug` implementations should be implemented for **all** public types.
//! Output will typically represent the internal state as faithfully as possible.
-//! The purpose of the `Show` trait is to facilitate debugging Rust code. In
-//! most cases, using `#[derive(Show)]` is sufficient and recommended.
+//! The purpose of the `Debug` trait is to facilitate debugging Rust code. In
+//! most cases, using `#[derive(Debug)]` is sufficient and recommended.
//!
//! Some examples of the output from both traits:
//!
//! ```
-//! assert_eq!(format!("{} {:?}", 3i32, 4i32), "3 4i32");
+//! assert_eq!(format!("{} {:?}", 3i32, 4i32), "3 4");
//! assert_eq!(format!("{} {:?}", 'a', 'b'), "a 'b'");
//! assert_eq!(format!("{} {:?}", "foo\n", "bar\n"), "foo\n \"bar\\n\"");
//! ```
pub use core::fmt::{Formatter, Result, Writer, rt};
pub use core::fmt::{Show, String, Octal, Binary};
+pub use core::fmt::{Display, Debug};
pub use core::fmt::{LowerHex, UpperHex, Pointer};
pub use core::fmt::{LowerExp, UpperExp};
pub use core::fmt::Error;
cap: uint,
}
-impl<R> fmt::Show for BufferedReader<R> where R: fmt::Show {
+#[stable]
+impl<R> fmt::Debug for BufferedReader<R> where R: fmt::Debug {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
write!(fmt, "BufferedReader {{ reader: {:?}, buffer: {}/{} }}",
self.inner, self.cap - self.pos, self.buf.len())
pos: uint
}
-impl<W> fmt::Show for BufferedWriter<W> where W: fmt::Show {
+#[stable]
+impl<W> fmt::Debug for BufferedWriter<W> where W: fmt::Debug {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
write!(fmt, "BufferedWriter {{ writer: {:?}, buffer: {}/{} }}",
self.inner.as_ref().unwrap(), self.pos, self.buf.len())
inner: BufferedWriter<W>,
}
-impl<W> fmt::Show for LineBufferedWriter<W> where W: fmt::Show {
+#[stable]
+impl<W> fmt::Debug for LineBufferedWriter<W> where W: fmt::Debug {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
write!(fmt, "LineBufferedWriter {{ writer: {:?}, buffer: {}/{} }}",
self.inner.inner, self.inner.pos, self.inner.buf.len())
fn write(&mut self, buf: &[u8]) -> IoResult<()> {
match buf.iter().rposition(|&b| b == b'\n') {
Some(i) => {
- try!(self.inner.write(&buf[..(i + 1)]));
+ try!(self.inner.write(&buf[..i + 1]));
try!(self.inner.flush());
- try!(self.inner.write(&buf[(i + 1)..]));
+ try!(self.inner.write(&buf[i + 1..]));
Ok(())
}
None => self.inner.write(buf),
inner: BufferedReader<InternalBufferedWriter<S>>
}
-impl<S> fmt::Show for BufferedStream<S> where S: fmt::Show {
+#[stable]
+impl<S> fmt::Debug for BufferedStream<S> where S: fmt::Debug {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
let reader = &self.inner;
let writer = &self.inner.inner.0;
})
}
}).update_err("couldn't open path as file", |e| {
- format!("{}; path={:?}; mode={}; access={}", e, path.display(),
+ format!("{}; path={}; mode={}; access={}", e, path.display(),
mode_string(mode), access_string(access))
})
}
pub fn fsync(&mut self) -> IoResult<()> {
self.fd.fsync()
.update_err("couldn't fsync file",
- |e| format!("{}; path={:?}", e, self.path.display()))
+ |e| format!("{}; path={}", e, self.path.display()))
}
/// This function is similar to `fsync`, except that it may not synchronize
pub fn datasync(&mut self) -> IoResult<()> {
self.fd.datasync()
.update_err("couldn't datasync file",
- |e| format!("{}; path={:?}", e, self.path.display()))
+ |e| format!("{}; path={}", e, self.path.display()))
}
/// Either truncates or extends the underlying file, updating the size of
pub fn truncate(&mut self, size: i64) -> IoResult<()> {
self.fd.truncate(size)
.update_err("couldn't truncate file", |e|
- format!("{}; path={:?}; size={:?}", e, self.path.display(), size))
+ format!("{}; path={}; size={}", e, self.path.display(), size))
}
/// Returns true if the stream has reached the end of the file.
pub fn stat(&self) -> IoResult<FileStat> {
self.fd.fstat()
.update_err("couldn't fstat file", |e|
- format!("{}; path={:?}", e, self.path.display()))
+ format!("{}; path={}", e, self.path.display()))
}
}
pub fn unlink(path: &Path) -> IoResult<()> {
fs_imp::unlink(path)
.update_err("couldn't unlink path", |e|
- format!("{}; path={:?}", e, path.display()))
+ format!("{}; path={}", e, path.display()))
}
/// Given a path, query the file system to get information about a file,
pub fn stat(path: &Path) -> IoResult<FileStat> {
fs_imp::stat(path)
.update_err("couldn't stat path", |e|
- format!("{}; path={:?}", e, path.display()))
+ format!("{}; path={}", e, path.display()))
}
/// Perform the same operation as the `stat` function, except that this
pub fn lstat(path: &Path) -> IoResult<FileStat> {
fs_imp::lstat(path)
.update_err("couldn't lstat path", |e|
- format!("{}; path={:?}", e, path.display()))
+ format!("{}; path={}", e, path.display()))
}
/// Rename a file or directory to a new name.
pub fn chmod(path: &Path, mode: io::FilePermission) -> IoResult<()> {
fs_imp::chmod(path, mode.bits() as uint)
.update_err("couldn't chmod path", |e|
- format!("{}; path={:?}; mode={:?}", e, path.display(), mode))
+ format!("{}; path={}; mode={:?}", e, path.display(), mode))
}
/// Change the user and group owners of a file at the specified path.
pub fn chown(path: &Path, uid: int, gid: int) -> IoResult<()> {
fs_imp::chown(path, uid, gid)
.update_err("couldn't chown path", |e|
- format!("{}; path={:?}; uid={}; gid={}", e, path.display(), uid, gid))
+ format!("{}; path={}; uid={}; gid={}", e, path.display(), uid, gid))
}
/// Creates a new hard link on the filesystem. The `dst` path will be a
pub fn readlink(path: &Path) -> IoResult<Path> {
fs_imp::readlink(path)
.update_err("couldn't resolve symlink for path", |e|
- format!("{}; path={:?}", e, path.display()))
+ format!("{}; path={}", e, path.display()))
}
/// Create a new, empty directory at the provided path
pub fn mkdir(path: &Path, mode: FilePermission) -> IoResult<()> {
fs_imp::mkdir(path, mode.bits() as uint)
.update_err("couldn't create directory", |e|
- format!("{}; path={:?}; mode={:?}", e, path.display(), mode))
+ format!("{}; path={}; mode={}", e, path.display(), mode))
}
/// Remove an existing, empty directory
pub fn rmdir(path: &Path) -> IoResult<()> {
fs_imp::rmdir(path)
.update_err("couldn't remove directory", |e|
- format!("{}; path={:?}", e, path.display()))
+ format!("{}; path={}", e, path.display()))
}
/// Retrieve a vector containing all entries within a provided directory
pub fn readdir(path: &Path) -> IoResult<Vec<Path>> {
fs_imp::readdir(path)
.update_err("couldn't read directory",
- |e| format!("{}; path={:?}", e, path.display()))
+ |e| format!("{}; path={}", e, path.display()))
}
/// Returns an iterator that will recursively walk the directory structure
pub fn walk_dir(path: &Path) -> IoResult<Directories> {
Ok(Directories {
stack: try!(readdir(path).update_err("couldn't walk directory",
- |e| format!("{}; path={:?}", e, path.display())))
+ |e| format!("{}; path={}", e, path.display())))
})
}
let result = mkdir(&curpath, mode)
.update_err("couldn't recursively mkdir",
- |e| format!("{}; path={:?}", e, path.display()));
+ |e| format!("{}; path={}", e, path.display()));
match result {
Err(mkdir_err) => {
rm_stack.push(path.clone());
fn rmdir_failed(err: &IoError, path: &Path) -> String {
- format!("rmdir_recursive failed; path={:?}; cause={}",
+ format!("rmdir_recursive failed; path={}; cause={}",
path.display(), err)
}
pub fn change_file_times(path: &Path, atime: u64, mtime: u64) -> IoResult<()> {
fs_imp::utime(path, atime, mtime)
.update_err("couldn't change_file_times", |e|
- format!("{}; path={:?}", e, path.display()))
+ format!("{}; path={}", e, path.display()))
}
impl Reader for File {
fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> {
fn update_err<T>(result: IoResult<T>, file: &File) -> IoResult<T> {
result.update_err("couldn't read file",
- |e| format!("{}; path={:?}",
+ |e| format!("{}; path={}",
e, file.path.display()))
}
fn write(&mut self, buf: &[u8]) -> IoResult<()> {
self.fd.write(buf)
.update_err("couldn't write to file",
- |e| format!("{}; path={:?}", e, self.path.display()))
+ |e| format!("{}; path={}", e, self.path.display()))
}
}
fn tell(&self) -> IoResult<u64> {
self.fd.tell()
.update_err("couldn't retrieve file cursor (`tell`)",
- |e| format!("{}; path={:?}", e, self.path.display()))
+ |e| format!("{}; path={}", e, self.path.display()))
}
fn seek(&mut self, pos: i64, style: SeekStyle) -> IoResult<()> {
Err(e) => Err(e),
};
err.update_err("couldn't seek in file",
- |e| format!("{}; path={:?}", e, self.path.display()))
+ |e| format!("{}; path={}", e, self.path.display()))
}
}
if cfg!(unix) {
error!(result, "no such file or directory");
}
- error!(result, format!("path={:?}; mode=open; access=read", filename.display()));
+ error!(result, format!("path={}; mode=open; access=read", filename.display()));
}
#[test]
if cfg!(unix) {
error!(result, "no such file or directory");
}
- error!(result, format!("path={:?}", filename.display()));
+ error!(result, format!("path={}", filename.display()));
}
#[test]
error!(result, "couldn't recursively mkdir");
error!(result, "couldn't create directory");
error!(result, "mode=0700");
- error!(result, format!("path={:?}", file.display()));
+ error!(result, format!("path={}", file.display()));
}
#[test]
let write_len = min(buf.len(), self.buf.len() - self.pos);
{
- let input = &self.buf[self.pos.. (self.pos + write_len)];
+ let input = &self.buf[self.pos.. self.pos + write_len];
let output = buf.slice_to_mut(write_len);
assert_eq!(input.len(), output.len());
slice::bytes::copy_memory(output, input);
let write_len = min(buf.len(), self.buf.len() - self.pos);
{
- let input = &self.buf[self.pos.. (self.pos + write_len)];
+ let input = &self.buf[self.pos.. self.pos + write_len];
let output = buf.slice_to_mut(write_len);
assert_eq!(input.len(), output.len());
slice::bytes::copy_memory(output, input);
writer.write(&[]).unwrap();
assert_eq!(writer.tell(), Ok(8));
- assert_eq!(writer.write(&[8, 9]).unwrap_err().kind, io::ShortWrite(1));
- assert_eq!(writer.write(&[10]).unwrap_err().kind, io::EndOfFile);
+ assert_eq!(writer.write(&[8, 9]).err().unwrap().kind, io::ShortWrite(1));
+ assert_eq!(writer.write(&[10]).err().unwrap().kind, io::EndOfFile);
}
let b: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8];
assert_eq!(buf, b);
pub use self::IoErrorKind::*;
use char::CharExt;
-use clone::Clone;
use default::Default;
-use error::{FromError, Error};
+use error::Error;
use fmt;
use int;
use iter::{Iterator, IteratorExt};
-use marker::{Sized, Send};
+use marker::Sized;
use mem::transmute;
use ops::FnOnce;
use option::Option;
}
}
-impl fmt::String for IoError {
+#[stable]
+impl fmt::Display for IoError {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
match *self {
IoError { kind: OtherIoError, desc: "unknown error", detail: Some(ref detail) } =>
}
impl Error for IoError {
- fn description(&self) -> &str {
- self.desc
- }
-
- fn detail(&self) -> Option<String> {
- self.detail.clone()
- }
-}
-
-impl FromError<IoError> for Box<Error + Send> {
- fn from_error(err: IoError) -> Box<Error + Send> {
- box err
- }
+ fn description(&self) -> &str { self.desc }
}
/// A list specifying general categories of I/O error.
fn read_until(&mut self, byte: u8) -> IoResult<Vec<u8>> {
let mut res = Vec::new();
- let mut used;
loop {
- {
+ let (done, used) = {
let available = match self.fill_buf() {
Ok(n) => n,
Err(ref e) if res.len() > 0 && e.kind == EndOfFile => {
- used = 0;
- break
+ return Ok(res);
}
Err(e) => return Err(e)
};
match available.iter().position(|&b| b == byte) {
Some(i) => {
- res.push_all(&available[..(i + 1)]);
- used = i + 1;
- break
+ res.push_all(&available[..i + 1]);
+ (true, i + 1)
}
None => {
res.push_all(available);
- used = available.len();
+ (false, available.len())
}
}
- }
+ };
self.consume(used);
+ if done {
+ return Ok(res);
+ }
}
- self.consume(used);
- Ok(res)
}
/// Reads the next utf8-encoded character from the underlying stream.
bitflags! {
/// A set of permissions for a file or directory is represented by a set of
/// flags which are or'd together.
+ #[derive(Show)]
flags FilePermission: u32 {
const USER_READ = 0o400,
const USER_WRITE = 0o200,
fn default() -> FilePermission { FilePermission::empty() }
}
-impl fmt::Show for FilePermission {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt(self, f)
- }
-}
-
-impl fmt::String for FilePermission {
+#[stable]
+impl fmt::Display for FilePermission {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:04o}", self.bits)
}
Ipv6Addr(u16, u16, u16, u16, u16, u16, u16, u16)
}
-impl fmt::String for IpAddr {
+#[stable]
+impl fmt::Display for IpAddr {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
match *self {
Ipv4Addr(a, b, c, d) =>
pub port: Port,
}
-impl fmt::String for SocketAddr {
+#[stable]
+impl fmt::Display for SocketAddr {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self.ip {
Ipv4Addr(..) => write!(f, "{}:{}", self.ip, self.port),
use collections::HashMap;
use ffi::CString;
use fmt;
-// NOTE(stage0) remove import after a snapshot
-#[cfg(stage0)]
-use hash::Hash;
use io::pipe::{PipeStream, PipePair};
use io::{IoResult, IoError};
use io;
}
}
-impl fmt::String for Command {
+impl fmt::Debug for Command {
/// Format the program and arguments of a Command for display. Any
/// non-utf8 data is lossily converted using the utf8 replacement
/// character.
/// Describes the result of a process after it has terminated.
/// Note that Windows have no signals, so the result is usually ExitStatus.
-#[derive(PartialEq, Eq, Clone, Copy)]
+#[derive(PartialEq, Eq, Clone, Copy, Show)]
pub enum ProcessExit {
/// Normal termination with an exit status.
ExitStatus(int),
ExitSignal(int),
}
-impl fmt::Show for ProcessExit {
- /// Format a ProcessExit enum, to nicely present the information.
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt(self, f)
- }
-}
-
-
-impl fmt::String for ProcessExit {
+#[stable]
+impl fmt::Display for ProcessExit {
/// Format a ProcessExit enum, to nicely present the information.
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
use option::Option;
use option::Option::{Some, None};
use ops::{Deref, DerefMut, FnOnce};
+use ptr;
use result::Result::{Ok, Err};
use rt;
use slice::SliceExt;
// Make sure to free it at exit
rt::at_exit(|| {
mem::transmute::<_, Box<StdinReader>>(STDIN);
- STDIN = 0 as *const _;
+ STDIN = ptr::null();
});
});
use thread::Thread;
use time::Duration;
+ #[test]
+ fn test_timer_send() {
+ let mut timer = Timer::new().unwrap();
+ Thread::spawn(move || timer.sleep(Duration::milliseconds(1)));
+ }
+
#[test]
fn test_io_timer_sleep_simple() {
let mut timer = Timer::new().unwrap();
pub use core::simd;
pub use core::result;
pub use core::option;
+pub use core::error;
#[cfg(not(test))] pub use alloc::boxed;
pub use alloc::rc;
/* Common traits */
-pub mod error;
pub mod num;
/* Runtime and platform support */
#![stable]
#![allow(missing_docs)]
-#[cfg(test)] use fmt::Show;
+#[cfg(test)] use fmt::Debug;
use ops::{Add, Sub, Mul, Div, Rem, Neg};
use marker::Copy;
T: PartialEq + NumCast
+ Add<Output=T> + Sub<Output=T>
+ Mul<Output=T> + Div<Output=T>
- + Rem<Output=T> + Show
+ + Rem<Output=T> + Debug
+ Copy
{
assert_eq!(ten.add(two), cast(12i).unwrap());
impl Copy for MapOption {}
/// Possible errors when creating a map.
-#[derive(Copy)]
+#[derive(Copy, Show)]
pub enum MapError {
/// # The following are POSIX-specific
///
ErrMapViewOfFile(uint)
}
-impl fmt::Show for MapError {
+#[stable]
+impl fmt::Display for MapError {
fn fmt(&self, out: &mut fmt::Formatter) -> fmt::Result {
let str = match *self {
ErrFdNotAvail => "fd not available for reading or writing",
impl Error for MapError {
fn description(&self) -> &str { "memory map error" }
- fn detail(&self) -> Option<String> { Some(format!("{:?}", self)) }
-}
-
-impl FromError<MapError> for Box<Error + Send> {
- fn from_error(err: MapError) -> Box<Error + Send> {
- box err
- }
}
// Round up `from` to be divisible by `to`
match name.rposition_elem(&dot) {
None | Some(0) => None,
Some(1) if name == b".." => None,
- Some(pos) => Some(&name[(pos+1)..])
+ Some(pos) => Some(&name[pos+1..])
}
}
}
filename: bool
}
-impl<'a, P: GenericPath> fmt::Show for Display<'a, P> {
+#[stable]
+impl<'a, P: GenericPath> fmt::Debug for Display<'a, P> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt(self, f)
+ fmt::Debug::fmt(&self.as_cow(), f)
}
}
-impl<'a, P: GenericPath> fmt::String for Display<'a, P> {
+#[stable]
+impl<'a, P: GenericPath> fmt::Display for Display<'a, P> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
self.as_cow().fmt(f)
}
c == SEP
}
-impl fmt::Show for Path {
+#[stable]
+impl fmt::Debug for Path {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::Show::fmt(&self.display(), f)
+ fmt::Debug::fmt(&self.display(), f)
}
}
None => {
self.repr = Path::normalize(filename);
}
- Some(idx) if &self.repr[(idx+1)..] == b".." => {
+ Some(idx) if &self.repr[idx+1..] == b".." => {
let mut v = Vec::with_capacity(self.repr.len() + 1 + filename.len());
v.push_all(self.repr.as_slice());
v.push(SEP_BYTE);
}
Some(idx) => {
let mut v = Vec::with_capacity(idx + 1 + filename.len());
- v.push_all(&self.repr[..(idx+1)]);
+ v.push_all(&self.repr[..idx+1]);
v.push_all(filename);
// FIXME: this is slow
self.repr = Path::normalize(v.as_slice());
None if b".." == self.repr => self.repr.as_slice(),
None => dot_static,
Some(0) => &self.repr[..1],
- Some(idx) if &self.repr[(idx+1)..] == b".." => self.repr.as_slice(),
+ Some(idx) if &self.repr[idx+1..] == b".." => self.repr.as_slice(),
Some(idx) => &self.repr[..idx]
}
}
None if b"." == self.repr ||
b".." == self.repr => None,
None => Some(self.repr.as_slice()),
- Some(idx) if &self.repr[(idx+1)..] == b".." => None,
+ Some(idx) if &self.repr[idx+1..] == b".." => None,
Some(0) if self.repr[1..].is_empty() => None,
- Some(idx) => Some(&self.repr[(idx+1)..])
+ Some(idx) => Some(&self.repr[idx+1..])
}
}
sepidx: Option<uint> // index of the final separator in the non-prefix portion of repr
}
-impl fmt::Show for Path {
+#[stable]
+impl fmt::Debug for Path {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::Show::fmt(&self.display(), f)
+ fmt::Debug::fmt(&self.display(), f)
}
}
if self.prefix.is_some() {
Some(Path::new(match self.prefix {
Some(DiskPrefix) if self.is_absolute() => {
- &self.repr[..(self.prefix_len()+1)]
+ &self.repr[..self.prefix_len()+1]
}
Some(VerbatimDiskPrefix) => {
- &self.repr[..(self.prefix_len()+1)]
+ &self.repr[..self.prefix_len()+1]
}
_ => &self.repr[..self.prefix_len()]
}))
Some(_) => {
let plen = self.prefix_len();
if repr.len() > plen && repr.as_bytes()[plen] == SEP_BYTE {
- &repr[(plen+1)..]
+ &repr[plen+1..]
} else { &repr[plen..] }
}
None if repr.as_bytes()[0] == SEP_BYTE => &repr[1..],
}
Some(UNCPrefix(a,b)) => {
s.push_str("\\\\");
- s.push_str(&prefix_[2..(a+2)]);
+ s.push_str(&prefix_[2..a+2]);
s.push(SEP);
- s.push_str(&prefix_[(3+a)..(3+a+b)]);
+ s.push_str(&prefix_[3+a..3+a+b]);
}
Some(_) => s.push_str(prefix_),
None => ()
fn update_sepidx(&mut self) {
let s = if self.has_nonsemantic_trailing_slash() {
- &self.repr[..(self.repr.len()-1)]
+ &self.repr[..self.repr.len()-1]
} else { &self.repr[] };
let sep_test: fn(char) -> bool = if !prefix_is_verbatim(self.prefix) {
is_sep
None => return None,
Some(x) => x
};
- path = &path[(idx_a+1)..];
+ path = &path[idx_a+1..];
let idx_b = path.find(f).unwrap_or(path.len());
Some((idx_a, idx_b))
}
use sync::atomic::{AtomicBool, ATOMIC_BOOL_INIT, Ordering};
use sync::Arc;
use marker::{Sync, Send};
-#[cfg(stage0)] // NOTE remove use after next snapshot
-use marker::{NoSend, NoSync};
use mem;
use clone::Clone;
inner: Arc<Inner>,
}
-#[cfg(stage0)] // NOTE remove impl after next snapshot
pub struct WaitToken {
inner: Arc<Inner>,
- no_send: NoSend,
- no_sync: NoSync,
}
-#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
-pub struct WaitToken {
- inner: Arc<Inner>,
-}
-
-#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
impl !Send for WaitToken {}
-#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
impl !Sync for WaitToken {}
-#[cfg(stage0)] // NOTE remove impl after next snapshot
-pub fn tokens() -> (WaitToken, SignalToken) {
- let inner = Arc::new(Inner {
- thread: Thread::current(),
- woken: ATOMIC_BOOL_INIT,
- });
- let wait_token = WaitToken {
- inner: inner.clone(),
- no_send: NoSend,
- no_sync: NoSync,
- };
- let signal_token = SignalToken {
- inner: inner
- };
- (wait_token, signal_token)
-}
-
-#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
pub fn tokens() -> (WaitToken, SignalToken) {
let inner = Arc::new(Inner {
thread: Thread::current(),
use sync::Arc;
use fmt;
-use marker;
use mem;
use cell::UnsafeCell;
/// The sending-half of Rust's synchronous channel type. This half can only be
/// owned by one task, but it can be cloned to send to other tasks.
#[stable]
-#[cfg(stage0)] // NOTE remove impl after next snapshot
pub struct SyncSender<T> {
- inner: Arc<RacyCell<sync::Packet<T>>>,
- // can't share in an arc
- _marker: marker::NoSync,
+ inner: Arc<UnsafeCell<sync::Packet<T>>>,
}
-/// The sending-half of Rust's synchronous channel type. This half can only be
-/// owned by one task, but it can be cloned to send to other tasks.
-#[stable]
-#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
-pub struct SyncSender<T> {
- inner: Arc<RacyCell<sync::Packet<T>>>,
-}
+unsafe impl<T:Send> Send for SyncSender<T> {}
-#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
-impl<T> !marker::Sync for SyncSender<T> {}
+impl<T> !Sync for SyncSender<T> {}
/// An error returned from the `send` function on channels.
///
/// A `send` operation can only fail if the receiving end of a channel is
/// disconnected, implying that the data could never be received. The error
/// contains the data being sent as a payload so it can be recovered.
-#[derive(PartialEq, Eq)]
+#[derive(PartialEq, Eq, Show)]
#[stable]
pub struct SendError<T>(pub T);
///
/// The `recv` operation can only fail if the sending half of a channel is
/// disconnected, implying that no further messages will ever be received.
-#[derive(PartialEq, Eq, Clone, Copy)]
+#[derive(PartialEq, Eq, Clone, Copy, Show)]
#[stable]
pub struct RecvError;
/// This enumeration is the list of the possible reasons that try_recv could not
/// return data when called.
-#[derive(PartialEq, Clone, Copy)]
+#[derive(PartialEq, Clone, Copy, Show)]
#[stable]
pub enum TryRecvError {
/// This channel is currently empty, but the sender(s) have not yet
/// This enumeration is the list of the possible error outcomes for the
/// `SyncSender::try_send` method.
-#[derive(PartialEq, Clone)]
+#[derive(PartialEq, Clone, Show)]
#[stable]
pub enum TrySendError<T> {
/// The data could not be sent on the channel because it would require that
}
enum Flavor<T> {
- Oneshot(Arc<RacyCell<oneshot::Packet<T>>>),
- Stream(Arc<RacyCell<stream::Packet<T>>>),
- Shared(Arc<RacyCell<shared::Packet<T>>>),
- Sync(Arc<RacyCell<sync::Packet<T>>>),
+ Oneshot(Arc<UnsafeCell<oneshot::Packet<T>>>),
+ Stream(Arc<UnsafeCell<stream::Packet<T>>>),
+ Shared(Arc<UnsafeCell<shared::Packet<T>>>),
+ Sync(Arc<UnsafeCell<sync::Packet<T>>>),
}
#[doc(hidden)]
/// ```
#[stable]
pub fn channel<T: Send>() -> (Sender<T>, Receiver<T>) {
- let a = Arc::new(RacyCell::new(oneshot::Packet::new()));
+ let a = Arc::new(UnsafeCell::new(oneshot::Packet::new()));
(Sender::new(Flavor::Oneshot(a.clone())), Receiver::new(Flavor::Oneshot(a)))
}
/// ```
#[stable]
pub fn sync_channel<T: Send>(bound: uint) -> (SyncSender<T>, Receiver<T>) {
- let a = Arc::new(RacyCell::new(sync::Packet::new(bound)));
+ let a = Arc::new(UnsafeCell::new(sync::Packet::new(bound)));
(SyncSender::new(a.clone()), Receiver::new(Flavor::Sync(a)))
}
return (*p).send(t).map_err(SendError);
} else {
let a =
- Arc::new(RacyCell::new(stream::Packet::new()));
+ Arc::new(UnsafeCell::new(stream::Packet::new()));
let rx = Receiver::new(Flavor::Stream(a.clone()));
match (*p).upgrade(rx) {
oneshot::UpSuccess => {
fn clone(&self) -> Sender<T> {
let (packet, sleeper, guard) = match *unsafe { self.inner() } {
Flavor::Oneshot(ref p) => {
- let a = Arc::new(RacyCell::new(shared::Packet::new()));
+ let a = Arc::new(UnsafeCell::new(shared::Packet::new()));
unsafe {
let guard = (*a.get()).postinit_lock();
let rx = Receiver::new(Flavor::Shared(a.clone()));
}
}
Flavor::Stream(ref p) => {
- let a = Arc::new(RacyCell::new(shared::Packet::new()));
+ let a = Arc::new(UnsafeCell::new(shared::Packet::new()));
unsafe {
let guard = (*a.get()).postinit_lock();
let rx = Receiver::new(Flavor::Shared(a.clone()));
////////////////////////////////////////////////////////////////////////////////
impl<T: Send> SyncSender<T> {
- #[cfg(stage0)] // NOTE remove impl after next snapshot
- fn new(inner: Arc<RacyCell<sync::Packet<T>>>) -> SyncSender<T> {
- SyncSender { inner: inner, _marker: marker::NoSync }
- }
-
- #[cfg(not(stage0))] // NOTE remove cfg after next snapshot
- fn new(inner: Arc<RacyCell<sync::Packet<T>>>) -> SyncSender<T> {
+ fn new(inner: Arc<UnsafeCell<sync::Packet<T>>>) -> SyncSender<T> {
SyncSender { inner: inner }
}
}
}
-/// A version of `UnsafeCell` intended for use in concurrent data
-/// structures (for example, you might put it in an `Arc`).
-struct RacyCell<T>(pub UnsafeCell<T>);
-
-impl<T> RacyCell<T> {
-
- fn new(value: T) -> RacyCell<T> {
- RacyCell(UnsafeCell { value: value })
- }
-
- unsafe fn get(&self) -> *mut T {
- self.0.get()
- }
-
-}
-
-unsafe impl<T:Send> Send for RacyCell<T> { }
-
-unsafe impl<T> Sync for RacyCell<T> { } // Oh dear
-
-impl<T> fmt::Show for SendError<T> {
+#[stable]
+impl<T> fmt::Display for SendError<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
"sending on a closed channel".fmt(f)
}
}
-impl<T> fmt::Show for TrySendError<T> {
+#[stable]
+impl<T> fmt::Display for TrySendError<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
TrySendError::Full(..) => {
}
}
-impl fmt::Show for RecvError {
+#[stable]
+impl fmt::Display for RecvError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
"receiving on a closed channel".fmt(f)
}
}
-impl fmt::Show for TryRecvError {
+#[stable]
+impl fmt::Display for TryRecvError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
TryRecvError::Empty => {
use alloc::boxed::Box;
use core::mem;
+use core::ptr;
use core::cell::UnsafeCell;
use sync::atomic::{AtomicPtr, Ordering};
impl<T> Node<T> {
unsafe fn new(v: Option<T>) -> *mut Node<T> {
mem::transmute(box Node {
- next: AtomicPtr::new(0 as *mut Node<T>),
+ next: AtomicPtr::new(ptr::null_mut()),
value: v,
})
}
use core::cell::Cell;
use core::marker;
use core::mem;
+use core::ptr;
use core::uint;
use sync::mpsc::{Receiver, RecvError};
/// The "receiver set" of the select interface. This structure is used to manage
/// a set of receivers which are being selected over.
-#[cfg(stage0)] // NOTE remove impl after next snapshot
pub struct Select {
head: *mut Handle<'static, ()>,
tail: *mut Handle<'static, ()>,
next_id: Cell<uint>,
- marker1: marker::NoSend,
}
-/// The "receiver set" of the select interface. This structure is used to manage
-/// a set of receivers which are being selected over.
-#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
-pub struct Select {
- head: *mut Handle<'static, ()>,
- tail: *mut Handle<'static, ()>,
- next_id: Cell<uint>,
-}
-
-#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
impl !marker::Send for Select {}
/// A handle to a receiver which is currently a member of a `Select` set of
///
/// Usage of this struct directly can sometimes be burdensome, and usage is
/// rather much easier through the `select!` macro.
- #[cfg(stage0)] // NOTE remove impl after next snapshot
- pub fn new() -> Select {
- Select {
- marker1: marker::NoSend,
- head: 0 as *mut Handle<'static, ()>,
- tail: 0 as *mut Handle<'static, ()>,
- next_id: Cell::new(1),
- }
- }
-
- /// Creates a new selection structure. This set is initially empty and
- /// `wait` will panic!() if called.
- ///
- /// Usage of this struct directly can sometimes be burdensome, and usage is
- /// rather much easier through the `select!` macro.
- #[cfg(not(stage0))] // NOTE remove cfg after next snapshot
pub fn new() -> Select {
Select {
- head: 0 as *mut Handle<'static, ()>,
- tail: 0 as *mut Handle<'static, ()>,
+ head: ptr::null_mut(),
+ tail: ptr::null_mut(),
next_id: Cell::new(1),
}
}
Handle {
id: id,
selector: self,
- next: 0 as *mut Handle<'static, ()>,
- prev: 0 as *mut Handle<'static, ()>,
+ next: ptr::null_mut(),
+ prev: ptr::null_mut(),
added: false,
rx: rx,
packet: rx,
(*self.next).prev = self.prev;
}
- self.next = 0 as *mut Handle<'static, ()>;
- self.prev = 0 as *mut Handle<'static, ()>;
+ self.next = ptr::null_mut();
+ self.prev = ptr::null_mut();
self.added = false;
}
use alloc::boxed::Box;
use core::mem;
+use core::ptr;
use core::cell::UnsafeCell;
use sync::atomic::{AtomicPtr, AtomicUsize, Ordering};
unsafe {
mem::transmute(box Node {
value: None,
- next: AtomicPtr::new(0 as *mut Node<T>),
+ next: AtomicPtr::new(ptr::null_mut::<Node<T>>()),
})
}
}
let n = self.alloc();
assert!((*n).value.is_none());
(*n).value = Some(t);
- (*n).next.store(0 as *mut Node<T>, Ordering::Relaxed);
+ (*n).next.store(ptr::null_mut(), Ordering::Relaxed);
(**self.head.get()).next.store(n, Ordering::Release);
*self.head.get() = n;
}
use vec::Vec;
use core::mem;
+use core::ptr;
use sync::atomic::{Ordering, AtomicUsize};
use sync::mpsc::blocking::{self, WaitToken, SignalToken};
cap: cap,
canceled: None,
queue: Queue {
- head: 0 as *mut Node,
- tail: 0 as *mut Node,
+ head: ptr::null_mut(),
+ tail: ptr::null_mut(),
},
buf: Buffer {
buf: range(0, cap + if cap == 0 {1} else {0}).map(|_| None).collect(),
// wait until a send slot is available, returning locked access to
// the channel state.
fn acquire_send_slot(&self) -> MutexGuard<State<T>> {
- let mut node = Node { token: None, next: 0 as *mut Node };
+ let mut node = Node { token: None, next: ptr::null_mut() };
loop {
let mut guard = self.lock.lock().unwrap();
// are we ready to go?
Vec::new()
};
let mut queue = mem::replace(&mut guard.queue, Queue {
- head: 0 as *mut Node,
- tail: 0 as *mut Node,
+ head: ptr::null_mut(),
+ tail: ptr::null_mut(),
});
let waiter = match mem::replace(&mut guard.blocker, NoneBlocked) {
fn enqueue(&mut self, node: &mut Node) -> WaitToken {
let (wait_token, signal_token) = blocking::tokens();
node.token = Some(signal_token);
- node.next = 0 as *mut Node;
+ node.next = ptr::null_mut();
if self.tail.is_null() {
self.head = node as *mut Node;
let node = self.head;
self.head = unsafe { (*node).next };
if self.head.is_null() {
- self.tail = 0 as *mut Node;
+ self.tail = ptr::null_mut();
}
unsafe {
- (*node).next = 0 as *mut Node;
+ (*node).next = ptr::null_mut();
Some((*node).token.take().unwrap())
}
}
/// Deref and DerefMut implementations
#[must_use]
#[stable]
-#[cfg(stage0)] // NOTE remove impl after next snapshot
pub struct MutexGuard<'a, T: 'a> {
// funny underscores due to how Deref/DerefMut currently work (they
// disregard field privacy).
__lock: &'a StaticMutex,
__data: &'a UnsafeCell<T>,
__poison: poison::Guard,
- __marker: marker::NoSend,
}
-/// An RAII implementation of a "scoped lock" of a mutex. When this structure is
-/// dropped (falls out of scope), the lock will be unlocked.
-///
-/// The data protected by the mutex can be access through this guard via its
-/// Deref and DerefMut implementations
-#[must_use]
-#[stable]
-#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
-pub struct MutexGuard<'a, T: 'a> {
- // funny underscores due to how Deref/DerefMut currently work (they
- // disregard field privacy).
- __lock: &'a StaticMutex,
- __data: &'a UnsafeCell<T>,
- __poison: poison::Guard,
-}
-
-#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
impl<'a, T> !marker::Send for MutexGuard<'a, T> {}
/// Static initialization of a mutex. This constant can be used to initialize
}
impl<'mutex, T> MutexGuard<'mutex, T> {
- #[cfg(stage0)] // NOTE remove afte next snapshot
- fn new(lock: &'mutex StaticMutex, data: &'mutex UnsafeCell<T>)
- -> LockResult<MutexGuard<'mutex, T>> {
- poison::map_result(lock.poison.borrow(), |guard| {
- MutexGuard {
- __lock: lock,
- __data: data,
- __poison: guard,
- __marker: marker::NoSend,
- }
- })
- }
- #[cfg(not(stage0))] // NOTE remove cfg afte next snapshot
fn new(lock: &'mutex StaticMutex, data: &'mutex UnsafeCell<T>)
-> LockResult<MutexGuard<'mutex, T>> {
poison::map_result(lock.poison.borrow(), |guard| {
/// is held. The precise semantics for when a lock is poisoned is documented on
/// each lock, but once a lock is poisoned then all future acquisitions will
/// return this error.
+#[derive(Show)]
#[stable]
pub struct PoisonError<T> {
guard: T,
/// An enumeration of possible errors which can occur while calling the
/// `try_lock` method.
+#[derive(Show)]
#[stable]
pub enum TryLockError<T> {
/// The lock could not be acquired because another task failed while holding
#[stable]
pub type TryLockResult<Guard> = Result<Guard, TryLockError<Guard>>;
-impl<T> fmt::Show for PoisonError<T> {
+#[stable]
+impl<T> fmt::Display for PoisonError<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
self.description().fmt(f)
}
}
}
-impl<T> fmt::Show for TryLockError<T> {
+#[stable]
+impl<T> fmt::Display for TryLockError<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
self.description().fmt(f)
}
/// dropped.
#[must_use]
#[stable]
-#[cfg(stage0)] // NOTE remove impl after next snapshot
pub struct RwLockReadGuard<'a, T: 'a> {
__lock: &'a StaticRwLock,
__data: &'a UnsafeCell<T>,
- __marker: marker::NoSend,
}
-/// RAII structure used to release the shared read access of a lock when
-/// dropped.
-#[must_use]
-#[stable]
-#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
-pub struct RwLockReadGuard<'a, T: 'a> {
- __lock: &'a StaticRwLock,
- __data: &'a UnsafeCell<T>,
-}
-
-#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
impl<'a, T> !marker::Send for RwLockReadGuard<'a, T> {}
/// RAII structure used to release the exclusive write access of a lock when
/// dropped.
#[must_use]
#[stable]
-#[cfg(stage0)] // NOTE remove impl after next snapshot
-pub struct RwLockWriteGuard<'a, T: 'a> {
- __lock: &'a StaticRwLock,
- __data: &'a UnsafeCell<T>,
- __poison: poison::Guard,
- __marker: marker::NoSend,
-}
-
-/// RAII structure used to release the exclusive write access of a lock when
-/// dropped.
-#[must_use]
-#[stable]
-#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
pub struct RwLockWriteGuard<'a, T: 'a> {
__lock: &'a StaticRwLock,
__data: &'a UnsafeCell<T>,
__poison: poison::Guard,
}
-#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
impl<'a, T> !marker::Send for RwLockWriteGuard<'a, T> {}
impl<T: Send + Sync> RwLock<T> {
}
impl<'rwlock, T> RwLockReadGuard<'rwlock, T> {
- #[cfg(stage0)] // NOTE remove impl after next snapshot
- fn new(lock: &'rwlock StaticRwLock, data: &'rwlock UnsafeCell<T>)
- -> LockResult<RwLockReadGuard<'rwlock, T>> {
- poison::map_result(lock.poison.borrow(), |_| {
- RwLockReadGuard {
- __lock: lock,
- __data: data,
- __marker: marker::NoSend,
- }
- })
- }
- #[cfg(not(stage0))] // NOTE remove cfg after next snapshot
fn new(lock: &'rwlock StaticRwLock, data: &'rwlock UnsafeCell<T>)
-> LockResult<RwLockReadGuard<'rwlock, T>> {
poison::map_result(lock.poison.borrow(), |_| {
}
}
impl<'rwlock, T> RwLockWriteGuard<'rwlock, T> {
- #[cfg(stage0)] // NOTE remove impl after next snapshot
- fn new(lock: &'rwlock StaticRwLock, data: &'rwlock UnsafeCell<T>)
- -> LockResult<RwLockWriteGuard<'rwlock, T>> {
- poison::map_result(lock.poison.borrow(), |guard| {
- RwLockWriteGuard {
- __lock: lock,
- __data: data,
- __poison: guard,
- __marker: marker::NoSend,
- }
- })
- }
- #[cfg(not(stage0))] // NOTE remove cfg after next snapshot
fn new(lock: &'rwlock StaticRwLock, data: &'rwlock UnsafeCell<T>)
-> LockResult<RwLockWriteGuard<'rwlock, T>> {
poison::map_result(lock.poison.borrow(), |guard| {
use cell::UnsafeCell;
use mem;
+use ptr;
use rt;
use sync::{StaticMutex, StaticCondvar};
use sync::mpsc::{channel, Sender, Receiver};
// Close the channel by destroying it
let chan: Box<Sender<M>> = mem::transmute(*self.chan.get());
- *self.chan.get() = 0 as *mut Sender<M>;
+ *self.chan.get() = ptr::null_mut();
drop(chan);
helper_signal::signal(*self.signal.get() as helper_signal::signal);
if state.is_null() {
return output(w, idx, addr, None)
}
- let mut data = 0 as *const libc::c_char;
+ let mut data = ptr::null();
let data_addr = &mut data as *mut *const libc::c_char;
let ret = unsafe {
backtrace_syminfo(state, addr as libc::uintptr_t,
trace_argument: *mut libc::c_void)
-> _Unwind_Reason_Code;
- #[cfg(all(not(target_os = "android"),
+ #[cfg(all(not(all(target_os = "android", target_arch = "arm")),
not(all(target_os = "linux", target_arch = "arm"))))]
pub fn _Unwind_GetIP(ctx: *mut _Unwind_Context) -> libc::uintptr_t;
// On android, the function _Unwind_GetIP is a macro, and this is the
// expansion of the macro. This is all copy/pasted directly from the
// header file with the definition of _Unwind_GetIP.
- #[cfg(any(target_os = "android",
+ #[cfg(any(all(target_os = "android", target_arch = "arm"),
all(target_os = "linux", target_arch = "arm")))]
pub unsafe fn _Unwind_GetIP(ctx: *mut _Unwind_Context) -> libc::uintptr_t {
#[repr(C)]
use cell::UnsafeCell;
use libc;
+use ptr;
use std::option::Option::{Some, None};
use sys::mutex::{self, Mutex};
use sys::time;
// time.
let mut sys_now = libc::timeval { tv_sec: 0, tv_usec: 0 };
let stable_now = time::SteadyTime::now();
- let r = ffi::gettimeofday(&mut sys_now, 0 as *mut _);
+ let r = ffi::gettimeofday(&mut sys_now, ptr::null_mut());
debug_assert_eq!(r, 0);
let seconds = NumCast::from(dur.num_seconds());
use io;
use libc::{self, c_int, c_void};
use mem;
+use ptr;
use sys::retry;
use sys_common::{keep_going, eof, mkerr_libc};
if dir_ptr as uint != 0 {
let mut paths = vec!();
- let mut entry_ptr = 0 as *mut dirent_t;
+ let mut entry_ptr = ptr::null_mut();
while unsafe { readdir_r(dir_ptr, ptr, &mut entry_ptr) == 0 } {
if entry_ptr.is_null() { break }
paths.push(unsafe {
os::last_os_error());
}
let mut result = Vec::new();
- while *environ != 0 as *const _ {
+ while *environ != ptr::null() {
let env_pair = ffi::c_str_to_bytes(&*environ).to_vec();
result.push(env_pair);
environ = environ.offset(1);
fn setgroups(ngroups: libc::c_int,
ptr: *const libc::c_void) -> libc::c_int;
}
- let _ = setgroups(0, 0 as *const libc::c_void);
+ let _ = setgroups(0, ptr::null());
if libc::setuid(u as libc::uid_t) != 0 {
fail(&mut output);
use ops::Drop;
use option::Option::{Some, None};
use path::Path;
+use ptr;
use result::Result::{Ok, Err};
use slice::SliceExt;
use str::{self, StrExt};
let image = arch::init_frame(&mut frame, &context);
// Initialize this process's symbols
- let ret = SymInitialize(process, 0 as *mut libc::c_void, libc::TRUE);
+ let ret = SymInitialize(process, ptr::null_mut(), libc::TRUE);
if ret != libc::TRUE { return Ok(()) }
let _c = Cleanup { handle: process, SymCleanup: SymCleanup };
let mut i = 0i;
try!(write!(w, "stack backtrace:\n"));
while StackWalk64(image, process, thread, &mut frame, &mut context,
- 0 as *mut libc::c_void,
- 0 as *mut libc::c_void,
- 0 as *mut libc::c_void,
- 0 as *mut libc::c_void) == libc::TRUE{
+ ptr::null_mut(),
+ ptr::null_mut(),
+ ptr::null_mut(),
+ ptr::null_mut()) == libc::TRUE{
let addr = frame.AddrPC.Offset;
if addr == frame.AddrReturn.Offset || addr == 0 ||
frame.AddrReturn.Offset == 0 { break }
let bytes = unsafe { ffi::c_str_to_bytes(&ptr) };
match str::from_utf8(bytes) {
Ok(s) => try!(demangle(w, s)),
- Err(..) => try!(w.write(&bytes[..(bytes.len()-1)])),
+ Err(..) => try!(w.write(&bytes[..bytes.len()-1])),
}
}
try!(w.write(&['\n' as u8]));
use libc::types::os::arch::extra::{DWORD, LPVOID, BOOL};
use mem;
+use ptr;
use rt;
use sys_common::mutex::{MUTEX_INIT, Mutex};
rt::at_exit(move|| {
DTOR_LOCK.lock();
let dtors = DTORS;
- DTORS = 0 as *mut _;
+ DTORS = ptr::null_mut();
mem::transmute::<_, Box<Vec<(Key, Dtor)>>>(dtors);
assert!(DTORS.is_null()); // can't re-init after destructing
DTOR_LOCK.unlock();
for &(key, dtor) in dtors.iter() {
let ptr = TlsGetValue(key);
if !ptr.is_null() {
- TlsSetValue(key, 0 as *mut _);
+ TlsSetValue(key, ptr::null_mut());
dtor(ptr as *mut _);
any_run = true;
}
RemoveTimer(libc::HANDLE, Sender<()>),
}
+unsafe impl Send for Timer {}
unsafe impl Send for Req {}
-
fn helper(input: libc::HANDLE, messages: Receiver<Req>, _: ()) {
let mut objs = vec![input];
let mut chans = vec![];
fn test_unnamed_thread() {
Thread::scoped(move|| {
assert!(Thread::current().name().is_none());
- }).join().map_err(|_| ()).unwrap();
+ }).join().ok().unwrap();
}
#[test]
fn test_named_thread() {
Builder::new().name("ada lovelace".to_string()).scoped(move|| {
assert!(Thread::current().name().unwrap() == "ada lovelace".to_string());
- }).join().map_err(|_| ()).unwrap();
+ }).join().ok().unwrap();
}
#[test]
Err(e) => {
type T = &'static str;
assert!(e.is::<T>());
- assert_eq!(*e.downcast::<T>().unwrap(), "static string");
+ assert_eq!(*e.downcast::<T>().ok().unwrap(), "static string");
}
Ok(()) => panic!()
}
Err(e) => {
type T = String;
assert!(e.is::<T>());
- assert_eq!(*e.downcast::<T>().unwrap(), "owned string".to_string());
+ assert_eq!(*e.downcast::<T>().ok().unwrap(), "owned string".to_string());
}
Ok(()) => panic!()
}
Err(e) => {
type T = Box<Any + Send>;
assert!(e.is::<T>());
- let any = e.downcast::<T>().unwrap();
+ let any = e.downcast::<T>().ok().unwrap();
assert!(any.is::<u16>());
- assert_eq!(*any.downcast::<u16>().unwrap(), 413u16);
+ assert_eq!(*any.downcast::<u16>().ok().unwrap(), 413u16);
}
Ok(()) => panic!()
}
dtor(ptr);
}
ptr = DTORS.get();
- DTORS.set(0 as *mut _);
+ DTORS.set(ptr::null_mut());
}
}
}
use cell::UnsafeCell;
use mem;
+ use ptr;
use sys_common::thread_local::StaticKey as OsStaticKey;
#[doc(hidden)]
let key = ptr.key;
key.os.set(1 as *mut u8);
drop(ptr);
- key.os.set(0 as *mut u8);
+ key.os.set(ptr::null_mut());
}
}
}
}
-impl fmt::String for Duration {
+#[stable]
+impl fmt::Display for Duration {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
// technically speaking, negative duration is not valid ISO 8601,
// but we need to print it anyway.
use std::fmt;
-#[derive(Copy, PartialEq)]
+#[derive(Copy, PartialEq, Eq, Show)]
pub enum Os {
OsWindows,
OsMacos,
OsDragonfly,
}
-#[derive(PartialEq, Eq, Hash, RustcEncodable, RustcDecodable, Clone, Copy)]
+#[derive(PartialEq, Eq, Hash, RustcEncodable, RustcDecodable, Clone, Copy, Show)]
pub enum Abi {
// NB: This ordering MUST match the AbiDatas array below.
// (This is ensured by the test indices_are_correct().)
impl Abi {
#[inline]
- pub fn index(&self) -> uint {
- *self as uint
+ pub fn index(&self) -> usize {
+ *self as usize
}
#[inline]
}
}
-impl fmt::Show for Abi {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt(self, f)
- }
-}
-
-impl fmt::String for Abi {
+impl fmt::Display for Abi {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "\"{}\"", self.name())
}
}
-impl fmt::Show for Os {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt(self, f)
- }
-}
-
-impl fmt::String for Os {
+impl fmt::Display for Os {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
OsLinux => "linux".fmt(f),
pub fn encode_with_hygiene(&self) -> String {
format!("\x00name_{},ctxt_{}\x00",
- self.name.uint(),
+ self.name.usize(),
self.ctxt)
}
}
-impl fmt::Show for Ident {
+impl fmt::Debug for Ident {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}#{}", self.name, self.ctxt)
}
}
-impl fmt::String for Ident {
+impl fmt::Display for Ident {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt(&self.name, f)
+ fmt::Display::fmt(&self.name, f)
}
}
-impl fmt::Show for Name {
+impl fmt::Debug for Name {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let Name(nm) = *self;
write!(f, "{:?}({})", token::get_name(*self).get(), nm)
}
}
-impl fmt::String for Name {
+impl fmt::Display for Name {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt(token::get_name(*self).get(), f)
+ fmt::Display::fmt(token::get_name(*self).get(), f)
}
}
/// A SyntaxContext represents a chain of macro-expandings
/// and renamings. Each macro expansion corresponds to
-/// a fresh uint
+/// a fresh usize
// I'm representing this syntax context as an index into
// a table, in order to work around a compiler bug
}
}
- pub fn uint(&self) -> uint {
+ pub fn usize(&self) -> usize {
let Name(nm) = *self;
- nm as uint
+ nm as usize
}
pub fn ident(&self) -> Ident {
ExprAssign(P<Expr>, P<Expr>),
ExprAssignOp(BinOp, P<Expr>, P<Expr>),
ExprField(P<Expr>, SpannedIdent),
- ExprTupField(P<Expr>, Spanned<uint>),
+ ExprTupField(P<Expr>, Spanned<usize>),
ExprIndex(P<Expr>, P<Expr>),
ExprRange(Option<P<Expr>>, Option<P<Expr>>),
/// Whether the sequence can be repeated zero (*), or one or more times (+)
pub op: KleeneOp,
/// The number of `MatchNt`s that appear in the sequence (and subsequences)
- pub num_captures: uint,
+ pub num_captures: usize,
}
/// A Kleene-style [repetition operator](http://en.wikipedia.org/wiki/Kleene_star)
}
impl TokenTree {
- pub fn len(&self) -> uint {
+ pub fn len(&self) -> usize {
match *self {
TtToken(_, token::DocComment(_)) => 2,
TtToken(_, token::SpecialVarNt(..)) => 2,
}
}
- pub fn get_tt(&self, index: uint) -> TokenTree {
+ pub fn get_tt(&self, index: usize) -> TokenTree {
match (self, index) {
(&TtToken(sp, token::DocComment(_)), 0) => {
TtToken(sp, token::Pound)
#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Show, Copy)]
pub enum StrStyle {
CookedStr,
- RawStr(uint)
+ RawStr(usize)
}
pub type Lit = Spanned<Lit_>;
}
impl LitIntType {
- pub fn suffix_len(&self) -> uint {
+ pub fn suffix_len(&self) -> usize {
match *self {
UnsuffixedIntLit(_) => 0,
SignedIntLit(s, _) => s.suffix_len(),
}
}
-impl fmt::Show for IntTy {
+impl fmt::Debug for IntTy {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt(self, f)
+ fmt::Display::fmt(self, f)
}
}
-impl fmt::String for IntTy {
+impl fmt::Display for IntTy {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", ast_util::int_ty_to_string(*self, None))
}
}
impl IntTy {
- pub fn suffix_len(&self) -> uint {
+ pub fn suffix_len(&self) -> usize {
match *self {
TyIs(true) /* i */ => 1,
TyIs(false) /* is */ | TyI8 => 2,
}
impl UintTy {
- pub fn suffix_len(&self) -> uint {
+ pub fn suffix_len(&self) -> usize {
match *self {
TyUs(true) /* u */ => 1,
TyUs(false) /* us */ | TyU8 => 2,
}
}
-impl fmt::Show for UintTy {
+impl fmt::Debug for UintTy {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt(self, f)
+ fmt::Display::fmt(self, f)
}
}
-impl fmt::String for UintTy {
+impl fmt::Display for UintTy {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", ast_util::uint_ty_to_string(*self, None))
}
TyF64,
}
-impl fmt::Show for FloatTy {
+impl fmt::Debug for FloatTy {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt(self, f)
+ fmt::Display::fmt(self, f)
}
}
-impl fmt::String for FloatTy {
+impl fmt::Display for FloatTy {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", ast_util::float_ty_to_string(*self))
}
}
impl FloatTy {
- pub fn suffix_len(&self) -> uint {
+ pub fn suffix_len(&self) -> usize {
match *self {
TyF32 | TyF64 => 3, // add F128 handling here
}
TyChar
}
-#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Copy)]
+#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Copy, Show)]
pub enum Onceness {
Once,
Many
}
-impl fmt::Show for Onceness {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt(match *self {
- Once => "once",
- Many => "many",
- }, f)
- }
-}
-
-impl fmt::String for Onceness {
+impl fmt::Display for Onceness {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt(match *self {
+ fmt::Display::fmt(match *self {
Once => "once",
Many => "many",
}, f)
TyPtr(MutTy),
/// A reference (`&'a T` or `&'a mut T`)
TyRptr(Option<Lifetime>, MutTy),
- /// A bare function (e.g. `fn(uint) -> bool`)
+ /// A bare function (e.g. `fn(usize) -> bool`)
TyBareFn(P<BareFnTy>),
/// A tuple (`(A, B, C, D,...)`)
TyTup(Vec<P<Ty>> ),
Normal,
}
-impl fmt::String for Unsafety {
+impl fmt::Display for Unsafety {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt(match *self {
+ fmt::Display::fmt(match *self {
Unsafety::Normal => "normal",
Unsafety::Unsafe => "unsafe",
}, f)
Negative,
}
-impl fmt::Show for ImplPolarity {
+impl fmt::Debug for ImplPolarity {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
ImplPolarity::Positive => "positive".fmt(f),
}
#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Show, Copy)]
-pub struct AttrId(pub uint);
+pub struct AttrId(pub usize);
/// Doc-comments are promoted to attributes that have is_sugared_doc = true
#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Show)]
}
}
-impl fmt::String for PathElem {
+impl fmt::Display for PathElem {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let slot = token::get_name(self.name());
write!(f, "{}", slot)
}
impl<'ast> Map<'ast> {
- fn entry_count(&self) -> uint {
+ fn entry_count(&self) -> usize {
self.map.borrow().len()
}
fn find_entry(&self, id: NodeId) -> Option<MapEntry<'ast>> {
- self.map.borrow().get(id as uint).map(|e| *e)
+ self.map.borrow().get(id as usize).map(|e| *e)
}
pub fn krate(&self) -> &'ast Crate {
NodesMatchingSuffix {
map: self,
item_name: parts.last().unwrap(),
- in_which: &parts[..(parts.len() - 1)],
+ in_which: &parts[..parts.len() - 1],
idx: 0,
}
}
fn next(&mut self) -> Option<NodeId> {
loop {
let idx = self.idx;
- if idx as uint >= self.map.entry_count() {
+ if idx as usize >= self.map.entry_count() {
return None;
}
self.idx += 1;
fn insert_entry(&mut self, id: NodeId, entry: MapEntry<'ast>) {
debug!("ast_map: {:?} => {:?}", id, entry);
let len = self.map.len();
- if id as uint >= len {
- self.map.extend(repeat(NotPresent).take(id as uint - len + 1));
+ if id as usize >= len {
+ self.map.extend(repeat(NotPresent).take(id as usize - len + 1));
}
- self.map[id as uint] = entry;
+ self.map[id as usize] = entry;
}
fn insert(&mut self, id: NodeId, node: Node<'ast>) {
}
/// Get a string representation of an unsigned int type, with its value.
-/// We want to avoid "42uint" in favor of "42u"
+/// We want to avoid "42u" in favor of "42us". "42uint" is right out.
pub fn uint_ty_to_string(t: UintTy, val: Option<u64>) -> String {
let s = match t {
TyUs(true) if val.is_some() => "u",
}
/// Maps a binary operator to its precedence
-pub fn operator_prec(op: ast::BinOp) -> uint {
+pub fn operator_prec(op: ast::BinOp) -> usize {
match op {
// 'as' sits here with 12
- BiMul | BiDiv | BiRem => 11u,
- BiAdd | BiSub => 10u,
- BiShl | BiShr => 9u,
- BiBitAnd => 8u,
- BiBitXor => 7u,
- BiBitOr => 6u,
- BiLt | BiLe | BiGe | BiGt | BiEq | BiNe => 3u,
- BiAnd => 2u,
- BiOr => 1u
+ BiMul | BiDiv | BiRem => 11us,
+ BiAdd | BiSub => 10us,
+ BiShl | BiShr => 9us,
+ BiBitAnd => 8us,
+ BiBitXor => 7us,
+ BiBitOr => 6us,
+ BiLt | BiLe | BiGe | BiGt | BiEq | BiNe => 3us,
+ BiAnd => 2us,
+ BiOr => 1us
}
}
/// Precedence of the `as` operator, which is a binary operator
/// not appearing in the prior table.
#[allow(non_upper_case_globals)]
-pub static as_prec: uint = 12u;
+pub static as_prec: usize = 12us;
pub fn empty_generics() -> Generics {
Generics {
P(dummy_spanned(MetaWord(name)))
}
-thread_local! { static NEXT_ATTR_ID: Cell<uint> = Cell::new(0) }
+thread_local! { static NEXT_ATTR_ID: Cell<usize> = Cell::new(0) }
pub fn mk_attr_id() -> AttrId {
let id = NEXT_ATTR_ID.with(|slot| {
Locked
}
-impl fmt::String for StabilityLevel {
+impl fmt::Display for StabilityLevel {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::Show::fmt(self, f)
+ fmt::Debug::fmt(self, f)
}
}
use serialize::{Encodable, Decodable, Encoder, Decoder};
pub trait Pos {
- fn from_uint(n: uint) -> Self;
- fn to_uint(&self) -> uint;
+ fn from_usize(n: usize) -> Self;
+ fn to_usize(&self) -> usize;
}
/// A byte offset. Keep this small (currently 32-bits), as AST contains
/// is not equivalent to a character offset. The CodeMap will convert BytePos
/// values to CharPos values as necessary.
#[derive(Copy, PartialEq, Hash, PartialOrd, Show)]
-pub struct CharPos(pub uint);
+pub struct CharPos(pub usize);
// FIXME: Lots of boilerplate in these impls, but so far my attempts to fix
// have been unsuccessful
impl Pos for BytePos {
- fn from_uint(n: uint) -> BytePos { BytePos(n as u32) }
- fn to_uint(&self) -> uint { let BytePos(n) = *self; n as uint }
+ fn from_usize(n: usize) -> BytePos { BytePos(n as u32) }
+ fn to_usize(&self) -> usize { let BytePos(n) = *self; n as usize }
}
impl Add for BytePos {
type Output = BytePos;
fn add(self, rhs: BytePos) -> BytePos {
- BytePos((self.to_uint() + rhs.to_uint()) as u32)
+ BytePos((self.to_usize() + rhs.to_usize()) as u32)
}
}
type Output = BytePos;
fn sub(self, rhs: BytePos) -> BytePos {
- BytePos((self.to_uint() - rhs.to_uint()) as u32)
+ BytePos((self.to_usize() - rhs.to_usize()) as u32)
}
}
impl Pos for CharPos {
- fn from_uint(n: uint) -> CharPos { CharPos(n) }
- fn to_uint(&self) -> uint { let CharPos(n) = *self; n }
+ fn from_usize(n: usize) -> CharPos { CharPos(n) }
+ fn to_usize(&self) -> usize { let CharPos(n) = *self; n }
}
impl Add for CharPos {
type Output = CharPos;
fn add(self, rhs: CharPos) -> CharPos {
- CharPos(self.to_uint() + rhs.to_uint())
+ CharPos(self.to_usize() + rhs.to_usize())
}
}
type Output = CharPos;
fn sub(self, rhs: CharPos) -> CharPos {
- CharPos(self.to_uint() - rhs.to_uint())
+ CharPos(self.to_usize() - rhs.to_usize())
}
}
/// Information about the original source
pub file: Rc<FileMap>,
/// The (1-based) line number
- pub line: uint,
+ pub line: usize,
/// The (0-based) column offset
pub col: CharPos
}
// perhaps they should just be removed.
pub struct LocWithOpt {
pub filename: FileName,
- pub line: uint,
+ pub line: usize,
pub col: CharPos,
pub file: Option<Rc<FileMap>>,
}
// used to be structural records. Better names, anyone?
-pub struct FileMapAndLine { pub fm: Rc<FileMap>, pub line: uint }
+pub struct FileMapAndLine { pub fm: Rc<FileMap>, pub line: usize }
pub struct FileMapAndBytePos { pub fm: Rc<FileMap>, pub pos: BytePos }
/// The syntax with which a macro was invoked.
pub struct FileLines {
pub file: Rc<FileMap>,
- pub lines: Vec<uint>
+ pub lines: Vec<usize>
}
/// Identifies an offset of a multi-byte character in a FileMap
/// The absolute offset of the character in the CodeMap
pub pos: BytePos,
/// The number of bytes, >=2
- pub bytes: uint,
+ pub bytes: usize,
}
/// A single source in the CodeMap
/// get a line from the list of pre-computed line-beginnings
///
- pub fn get_line(&self, line_number: uint) -> Option<String> {
+ pub fn get_line(&self, line_number: usize) -> Option<String> {
let lines = self.lines.borrow();
lines.get(line_number).map(|&line| {
let begin: BytePos = line - self.start_pos;
- let begin = begin.to_uint();
+ let begin = begin.to_usize();
let slice = &self.src[begin..];
match slice.find('\n') {
Some(e) => &slice[..e],
})
}
- pub fn record_multibyte_char(&self, pos: BytePos, bytes: uint) {
+ pub fn record_multibyte_char(&self, pos: BytePos, bytes: usize) {
assert!(bytes >=2 && bytes <= 4);
let mbc = MultiByteChar {
pos: pos,
let mut files = self.files.borrow_mut();
let start_pos = match files.last() {
None => 0,
- Some(last) => last.start_pos.to_uint() + last.src.len(),
+ Some(last) => last.start_pos.to_usize() + last.src.len(),
};
// Remove utf-8 BOM if any.
let filemap = Rc::new(FileMap {
name: filename,
src: src.to_string(),
- start_pos: Pos::from_uint(start_pos),
+ start_pos: Pos::from_usize(start_pos),
lines: RefCell::new(Vec::new()),
multibyte_chars: RefCell::new(Vec::new()),
});
(format!("<{}:{}:{}>",
pos.file.name,
pos.line,
- pos.col.to_uint() + 1)).to_string()
+ pos.col.to_usize() + 1)).to_string()
}
/// Lookup source information about a BytePos
return (format!("{}:{}:{}: {}:{}",
lo.filename,
lo.line,
- lo.col.to_uint() + 1,
+ lo.col.to_usize() + 1,
hi.line,
- hi.col.to_uint() + 1)).to_string()
+ hi.col.to_usize() + 1)).to_string()
}
pub fn span_to_filename(&self, sp: Span) -> FileName {
let lo = self.lookup_char_pos(sp.lo);
let hi = self.lookup_char_pos(sp.hi);
let mut lines = Vec::new();
- for i in range(lo.line - 1u, hi.line as uint) {
+ for i in range(lo.line - 1us, hi.line as usize) {
lines.push(i);
};
FileLines {file: lo.file, lines: lines}
if begin.fm.start_pos != end.fm.start_pos {
None
} else {
- Some((&begin.fm.src[begin.pos.to_uint()..end.pos.to_uint()]).to_string())
+ Some((&begin.fm.src[begin.pos.to_usize()..end.pos.to_usize()]).to_string())
}
}
total_extra_bytes += mbc.bytes - 1;
// We should never see a byte position in the middle of a
// character
- assert!(bpos.to_uint() >= mbc.pos.to_uint() + mbc.bytes);
+ assert!(bpos.to_usize() >= mbc.pos.to_usize() + mbc.bytes);
} else {
break;
}
}
- assert!(map.start_pos.to_uint() + total_extra_bytes <= bpos.to_uint());
- CharPos(bpos.to_uint() - map.start_pos.to_uint() - total_extra_bytes)
+ assert!(map.start_pos.to_usize() + total_extra_bytes <= bpos.to_usize());
+ CharPos(bpos.to_usize() - map.start_pos.to_usize() - total_extra_bytes)
}
- fn lookup_filemap_idx(&self, pos: BytePos) -> uint {
+ fn lookup_filemap_idx(&self, pos: BytePos) -> usize {
let files = self.files.borrow();
let files = &*files;
let len = files.len();
- let mut a = 0u;
+ let mut a = 0us;
let mut b = len;
- while b - a > 1u {
- let m = (a + b) / 2u;
+ while b - a > 1us {
+ let m = (a + b) / 2us;
if files[m].start_pos > pos {
b = m;
} else {
}
if a == 0 {
panic!("position {} does not resolve to a source location",
- pos.to_uint());
+ pos.to_usize());
}
a -= 1;
}
if a >= len {
panic!("position {} does not resolve to a source location",
- pos.to_uint())
+ pos.to_usize())
}
return a;
let files = self.files.borrow();
let f = (*files)[idx].clone();
- let mut a = 0u;
+ let mut a = 0us;
{
let lines = f.lines.borrow();
let mut b = lines.len();
- while b - a > 1u {
- let m = (a + b) / 2u;
+ while b - a > 1us {
+ let m = (a + b) / 2us;
if (*lines)[m] > pos { b = m; } else { a = m; }
}
}
fn lookup_pos(&self, pos: BytePos) -> Loc {
let FileMapAndLine {fm: f, line: a} = self.lookup_line(pos);
- let line = a + 1u; // Line numbers start at 1
+ let line = a + 1us; // Line numbers start at 1
let chpos = self.bytepos_to_file_charpos(pos);
let linebpos = (*f.lines.borrow())[a];
let linechpos = self.bytepos_to_file_charpos(linebpos);
{
match id {
NO_EXPANSION => f(None),
- ExpnId(i) => f(Some(&(*self.expansions.borrow())[i as uint]))
+ ExpnId(i) => f(Some(&(*self.expansions.borrow())[i as usize]))
}
}
assert_eq!(file_lines.file.name, "blork.rs");
assert_eq!(file_lines.lines.len(), 1);
- assert_eq!(file_lines.lines[0], 1u);
+ assert_eq!(file_lines.lines[0], 1us);
}
#[test]
use term;
/// maximum number of lines we will print for each error; arbitrary.
-static MAX_LINES: uint = 6u;
+static MAX_LINES: usize = 6us;
#[derive(Clone, Copy)]
pub enum RenderSpan {
self.handler.emit(Some((&self.cm, sp)), msg, Fatal);
panic!(FatalError);
}
+ pub fn span_fatal_with_code(&self, sp: Span, msg: &str, code: &str) -> ! {
+ self.handler.emit_with_code(Some((&self.cm, sp)), msg, code, Fatal);
+ panic!(FatalError);
+ }
pub fn span_err(&self, sp: Span, msg: &str) {
self.handler.emit(Some((&self.cm, sp)), msg, Error);
self.handler.bump_err_count();
/// (fatal, bug, unimpl) may cause immediate exit,
/// others log errors for later reporting.
pub struct Handler {
- err_count: Cell<uint>,
+ err_count: Cell<usize>,
emit: RefCell<Box<Emitter + Send>>,
}
self.bump_err_count();
}
pub fn bump_err_count(&self) {
- self.err_count.set(self.err_count.get() + 1u);
+ self.err_count.set(self.err_count.get() + 1us);
}
- pub fn err_count(&self) -> uint {
+ pub fn err_count(&self) -> usize {
self.err_count.get()
}
pub fn has_errors(&self) -> bool {
- self.err_count.get()> 0u
+ self.err_count.get() > 0us
}
pub fn abort_if_errors(&self) {
let s;
match self.err_count.get() {
- 0u => return,
- 1u => s = "aborting due to previous error".to_string(),
- _ => {
+ 0us => return,
+ 1us => s = "aborting due to previous error".to_string(),
+ _ => {
s = format!("aborting due to {} previous errors",
self.err_count.get());
}
Help,
}
-impl fmt::String for Level {
+impl fmt::Display for Level {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- use std::fmt::String;
+ use std::fmt::Display;
match *self {
Bug => "error: internal compiler error".fmt(f),
// to be miscolored. We assume this is rare enough that we don't
// have to worry about it.
if msg.ends_with("\n") {
- try!(t.write_str(&msg[..(msg.len()-1)]));
+ try!(t.write_str(&msg[..msg.len()-1]));
try!(t.reset());
try!(t.write_str("\n"));
} else {
let mut elided = false;
let mut display_lines = &lines.lines[];
if display_lines.len() > MAX_LINES {
- display_lines = &display_lines[0u..MAX_LINES];
+ display_lines = &display_lines[0us..MAX_LINES];
elided = true;
}
// Print the offending lines
}
}
if elided {
- let last_line = display_lines[display_lines.len() - 1u];
- let s = format!("{}:{} ", fm.name, last_line + 1u);
+ let last_line = display_lines[display_lines.len() - 1us];
+ let s = format!("{}:{} ", fm.name, last_line + 1us);
try!(write!(&mut err.dst, "{0:1$}...\n", "", s.len()));
}
// FIXME (#3260)
// If there's one line at fault we can easily point to the problem
- if lines.lines.len() == 1u {
+ if lines.lines.len() == 1us {
let lo = cm.lookup_char_pos(sp.lo);
- let mut digits = 0u;
- let mut num = (lines.lines[0] + 1u) / 10u;
+ let mut digits = 0us;
+ let mut num = (lines.lines[0] + 1us) / 10us;
// how many digits must be indent past?
- while num > 0u { num /= 10u; digits += 1u; }
+ while num > 0us { num /= 10us; digits += 1us; }
// indent past |name:## | and the 0-offset column location
- let left = fm.name.len() + digits + lo.col.to_uint() + 3u;
+ let left = fm.name.len() + digits + lo.col.to_usize() + 3us;
let mut s = String::new();
// Skip is the number of characters we need to skip because they are
// part of the 'filename:line ' part of the previous line.
- let skip = fm.name.len() + digits + 3u;
+ let skip = fm.name.len() + digits + 3us;
for _ in range(0, skip) {
s.push(' ');
}
if let Some(orig) = fm.get_line(lines.lines[0]) {
- for pos in range(0u, left - skip) {
+ for pos in range(0us, left - skip) {
let cur_char = orig.as_bytes()[pos] as char;
// Whenever a tab occurs on the previous line, we insert one on
// the error-point-squiggly-line as well (instead of a space).
let hi = cm.lookup_char_pos(sp.hi);
if hi.col != lo.col {
// the ^ already takes up one space
- let num_squigglies = hi.col.to_uint() - lo.col.to_uint() - 1u;
+ let num_squigglies = hi.col.to_usize() - lo.col.to_usize() - 1us;
for _ in range(0, num_squigglies) {
s.push('~');
}
let last_line_start = format!("{}:{} ", fm.name, lines[lines.len()-1]+1);
let hi = cm.lookup_char_pos(sp.hi);
// Span seems to use half-opened interval, so subtract 1
- let skip = last_line_start.len() + hi.col.to_uint() - 1;
+ let skip = last_line_start.len() + hi.col.to_usize() - 1;
let mut s = String::new();
for _ in range(0, skip) {
s.push(' ');
($code:tt) => (__register_diagnostic! { $code })
}
+#[macro_export]
+macro_rules! span_fatal {
+ ($session:expr, $span:expr, $code:ident, $($message:tt)*) => ({
+ __diagnostic_used!($code);
+ $session.span_fatal_with_code($span, format!($($message)*).as_slice(), stringify!($code))
+ })
+}
+
#[macro_export]
macro_rules! span_err {
($session:expr, $span:expr, $code:ident, $($message:tt)*) => ({
)
}
+#[macro_export]
+macro_rules! register_long_diagnostics {
+ ($($code:tt: $description:tt),*) => (
+ $(register_diagnostic! { $code, $description })*
+ )
+}
}
()
});
+ with_registered_diagnostics(|diagnostics| {
+ if !diagnostics.contains_key(&code.name) {
+ ecx.span_err(span, &format!(
+ "used diagnostic code {} not registered", token::get_ident(code).get()
+ )[]);
+ }
+ });
MacExpr::new(quote_expr!(ecx, ()))
}
pub exported_macros: Vec<ast::MacroDef>,
pub syntax_env: SyntaxEnv,
- pub recursion_count: uint,
+ pub recursion_count: usize,
}
impl<'a> ExtCtxt<'a> {
fn expr_mut_addr_of(&self, sp: Span, e: P<ast::Expr>) -> P<ast::Expr>;
fn expr_field_access(&self, span: Span, expr: P<ast::Expr>, ident: ast::Ident) -> P<ast::Expr>;
fn expr_tup_field_access(&self, sp: Span, expr: P<ast::Expr>,
- idx: uint) -> P<ast::Expr>;
+ idx: usize) -> P<ast::Expr>;
fn expr_call(&self, span: Span, expr: P<ast::Expr>, args: Vec<P<ast::Expr>>) -> P<ast::Expr>;
fn expr_call_ident(&self, span: Span, id: ast::Ident, args: Vec<P<ast::Expr>>) -> P<ast::Expr>;
fn expr_call_global(&self, sp: Span, fn_path: Vec<ast::Ident>,
fn expr_lit(&self, sp: Span, lit: ast::Lit_) -> P<ast::Expr>;
- fn expr_uint(&self, span: Span, i: uint) -> P<ast::Expr>;
- fn expr_int(&self, sp: Span, i: int) -> P<ast::Expr>;
+ fn expr_usize(&self, span: Span, i: usize) -> P<ast::Expr>;
+ fn expr_int(&self, sp: Span, i: isize) -> P<ast::Expr>;
fn expr_u8(&self, sp: Span, u: u8) -> P<ast::Expr>;
fn expr_bool(&self, sp: Span, value: bool) -> P<ast::Expr>;
fn expr_field_access(&self, sp: Span, expr: P<ast::Expr>, ident: ast::Ident) -> P<ast::Expr> {
let field_name = token::get_ident(ident);
let field_span = Span {
- lo: sp.lo - Pos::from_uint(field_name.get().len()),
+ lo: sp.lo - Pos::from_usize(field_name.get().len()),
hi: sp.hi,
expn_id: sp.expn_id,
};
let id = Spanned { node: ident, span: field_span };
self.expr(sp, ast::ExprField(expr, id))
}
- fn expr_tup_field_access(&self, sp: Span, expr: P<ast::Expr>, idx: uint) -> P<ast::Expr> {
+ fn expr_tup_field_access(&self, sp: Span, expr: P<ast::Expr>, idx: usize) -> P<ast::Expr> {
let field_span = Span {
- lo: sp.lo - Pos::from_uint(idx.to_string().len()),
+ lo: sp.lo - Pos::from_usize(idx.to_string().len()),
hi: sp.hi,
expn_id: sp.expn_id,
};
fn expr_lit(&self, sp: Span, lit: ast::Lit_) -> P<ast::Expr> {
self.expr(sp, ast::ExprLit(P(respan(sp, lit))))
}
- fn expr_uint(&self, span: Span, i: uint) -> P<ast::Expr> {
+ fn expr_usize(&self, span: Span, i: usize) -> P<ast::Expr> {
self.expr_lit(span, ast::LitInt(i as u64, ast::UnsignedIntLit(ast::TyUs(false))))
}
- fn expr_int(&self, sp: Span, i: int) -> P<ast::Expr> {
+ fn expr_int(&self, sp: Span, i: isize) -> P<ast::Expr> {
self.expr_lit(sp, ast::LitInt(i as u64, ast::SignedIntLit(ast::TyIs(false),
ast::Sign::new(i))))
}
let loc = self.codemap().lookup_char_pos(span.lo);
let expr_file = self.expr_str(span,
token::intern_and_get_ident(&loc.file.name[]));
- let expr_line = self.expr_uint(span, loc.line);
+ let expr_line = self.expr_usize(span, loc.line);
let expr_file_line_tuple = self.expr_tuple(span, vec!(expr_file, expr_line));
let expr_file_line_ptr = self.expr_addr_of(span, expr_file_line_tuple);
self.expr_call_global(
cx.expr_try(span,
cx.expr_method_call(span, blkdecoder.clone(), read_struct_field,
vec!(cx.expr_str(span, name),
- cx.expr_uint(span, field),
+ cx.expr_usize(span, field),
exprdecode.clone())))
});
let result = cx.expr_ok(trait_span, result);
cx.ident_of("read_struct"),
vec!(
cx.expr_str(trait_span, token::get_ident(substr.type_ident)),
- cx.expr_uint(trait_span, nfields),
+ cx.expr_usize(trait_span, nfields),
cx.lambda_expr_1(trait_span, result, blkarg)
))
}
path,
parts,
|cx, span, _, field| {
- let idx = cx.expr_uint(span, field);
+ let idx = cx.expr_usize(span, field);
cx.expr_try(span,
cx.expr_method_call(span, blkdecoder.clone(), rvariant_arg,
vec!(idx, exprdecode.clone())))
});
arms.push(cx.arm(v_span,
- vec!(cx.pat_lit(v_span, cx.expr_uint(v_span, i))),
+ vec!(cx.pat_lit(v_span, cx.expr_usize(v_span, i))),
decoded));
}
/// Create a decoder for a single enum variant/struct:
/// - `outer_pat_path` is the path to this enum variant/struct
-/// - `getarg` should retrieve the `uint`-th field with name `@str`.
+/// - `getarg` should retrieve the `usize`-th field with name `@str`.
fn decode_static_fields<F>(cx: &mut ExtCtxt,
trait_span: Span,
outer_pat_path: ast::Path,
fields: &StaticFields,
mut getarg: F)
-> P<Expr> where
- F: FnMut(&mut ExtCtxt, Span, InternedString, uint) -> P<Expr>,
+ F: FnMut(&mut ExtCtxt, Span, InternedString, usize) -> P<Expr>,
{
match *fields {
Unnamed(ref fields) => {
StaticEnum(..) => {
cx.span_err(trait_span, "`Default` cannot be derived for enums, only structs");
// let compilation continue
- cx.expr_uint(trait_span, 0)
+ cx.expr_usize(trait_span, 0)
}
_ => cx.span_bug(trait_span, "Non-static method in `derive(Default)`")
};
//!
//! ```ignore
//! #[derive(Encodable, Decodable)]
-//! struct Node { id: uint }
+//! struct Node { id: usize }
//! ```
//!
//! would generate two implementations like:
//! s.emit_struct("Node", 1, |this| {
//! this.emit_struct_field("id", 0, |this| {
//! Encodable::encode(&self.id, this)
-//! /* this.emit_uint(self.id) can also be used */
+//! /* this.emit_usize(self.id) can also be used */
//! })
//! })
//! }
let call = cx.expr_method_call(span, blkencoder.clone(),
emit_struct_field,
vec!(cx.expr_str(span, name),
- cx.expr_uint(span, i),
+ cx.expr_usize(span, i),
lambda));
// last call doesn't need a try!
cx.ident_of("emit_struct"),
vec!(
cx.expr_str(trait_span, token::get_ident(substr.type_ident)),
- cx.expr_uint(trait_span, fields.len()),
+ cx.expr_usize(trait_span, fields.len()),
blk
))
}
let lambda = cx.lambda_expr_1(span, enc, blkarg);
let call = cx.expr_method_call(span, blkencoder.clone(),
emit_variant_arg,
- vec!(cx.expr_uint(span, i),
+ vec!(cx.expr_usize(span, i),
lambda));
let call = if i != last {
cx.expr_try(span, call)
let call = cx.expr_method_call(trait_span, blkencoder,
cx.ident_of("emit_enum_variant"),
vec!(name,
- cx.expr_uint(trait_span, idx),
- cx.expr_uint(trait_span, fields.len()),
+ cx.expr_usize(trait_span, idx),
+ cx.expr_usize(trait_span, fields.len()),
blk));
let blk = cx.lambda_expr_1(trait_span, call, blkarg);
let ret = cx.expr_method_call(trait_span,
//! arguments:
//!
//! - `Struct`, when `Self` is a struct (including tuple structs, e.g
-//! `struct T(int, char)`).
+//! `struct T(i32, char)`).
//! - `EnumMatching`, when `Self` is an enum and all the arguments are the
//! same variant of the enum (e.g. `Some(1)`, `Some(3)` and `Some(4)`)
//! - `EnumNonMatchingCollapsed` when `Self` is an enum and the arguments
//! following snippet
//!
//! ```rust
-//! struct A { x : int }
+//! struct A { x : i32 }
//!
-//! struct B(int);
+//! struct B(i32);
//!
//! enum C {
-//! C0(int),
-//! C1 { x: int }
+//! C0(i32),
+//! C1 { x: i32 }
//! }
//! ```
//!
-//! The `int`s in `B` and `C0` don't have an identifier, so the
+//! The `i32`s in `B` and `C0` don't have an identifier, so the
//! `Option<ident>`s would be `None` for them.
//!
//! In the static cases, the structure is summarised, either into the just
//! trait PartialEq {
//! fn eq(&self, other: &Self);
//! }
-//! impl PartialEq for int {
-//! fn eq(&self, other: &int) -> bool {
+//! impl PartialEq for i32 {
+//! fn eq(&self, other: &i32) -> bool {
//! *self == *other
//! }
//! }
//!
//! ```{.text}
//! Struct(vec![FieldInfo {
-//! span: <span of `int`>,
+//! span: <span of `i32`>,
//! name: None,
//! self_: <expr for &a>
//! other: vec![<expr for &b>]
//! ```{.text}
//! EnumMatching(0, <ast::Variant for C0>,
//! vec![FieldInfo {
-//! span: <span of int>
+//! span: <span of i32>
//! name: None,
//! self_: <expr for &a>,
//! other: vec![<expr for &b>]
//! StaticStruct(<ast::StructDef of B>, Unnamed(vec![<span of x>]))
//!
//! StaticEnum(<ast::EnumDef of C>,
-//! vec![(<ident of C0>, <span of C0>, Unnamed(vec![<span of int>])),
+//! vec![(<ident of C0>, <span of C0>, Unnamed(vec![<span of i32>])),
//! (<ident of C1>, <span of C1>, Named(vec![(<ident of x>, <span of x>)]))])
//! ```
/// Matching variants of the enum: variant index, ast::Variant,
/// fields: the field name is only non-`None` in the case of a struct
/// variant.
- EnumMatching(uint, &'a ast::Variant, Vec<FieldInfo>),
+ EnumMatching(usize, &'a ast::Variant, Vec<FieldInfo>),
/// Non-matching variants of the enum, but with all state hidden from
/// the consequent code. The first component holds `Ident`s for all of
/// ```
/// #[derive(PartialEq)]
- /// struct A { x: int, y: int }
+ /// struct A { x: i32, y: i32 }
///
/// // equivalent to:
/// impl PartialEq for A {
let mut raw_fields = Vec::new(); // ~[[fields of self],
// [fields of next Self arg], [etc]]
let mut patterns = Vec::new();
- for i in range(0u, self_args.len()) {
+ for i in range(0us, self_args.len()) {
let struct_path= cx.path(DUMMY_SP, vec!( type_ident ));
let (pat, ident_expr) =
trait_.create_struct_pattern(cx,
/// #[derive(PartialEq)]
/// enum A {
/// A1,
- /// A2(int)
+ /// A2(i32)
/// }
///
/// // is equivalent to
/// (&A2(ref __self_0),
/// &A2(ref __arg_1_0)) => (*__self_0).eq(&(*__arg_1_0)),
/// _ => {
- /// let __self_vi = match *self { A1(..) => 0u, A2(..) => 1u };
- /// let __arg_1_vi = match *__arg_1 { A1(..) => 0u, A2(..) => 1u };
+ /// let __self_vi = match *self { A1(..) => 0us, A2(..) => 1us };
+ /// let __arg_1_vi = match *__arg_1 { A1(..) => 0us, A2(..) => 1us };
/// false
/// }
/// }
/// (Variant2, Variant2, Variant2) => ... // delegate Matching on Variant2
/// ...
/// _ => {
- /// let __this_vi = match this { Variant1 => 0u, Variant2 => 1u, ... };
- /// let __that_vi = match that { Variant1 => 0u, Variant2 => 1u, ... };
+ /// let __this_vi = match this { Variant1 => 0us, Variant2 => 1us, ... };
+ /// let __that_vi = match that { Variant1 => 0us, Variant2 => 1us, ... };
/// ... // catch-all remainder can inspect above variant index values.
/// }
/// }
.collect::<Vec<ast::Ident>>();
// The `vi_idents` will be bound, solely in the catch-all, to
- // a series of let statements mapping each self_arg to a uint
+ // a series of let statements mapping each self_arg to a usize
// corresponding to its variant index.
let vi_idents: Vec<ast::Ident> = self_arg_names.iter()
.map(|name| { let vi_suffix = format!("{}_vi", &name[]);
}).collect();
// Build a series of let statements mapping each self_arg
- // to a uint corresponding to its variant index.
+ // to a usize corresponding to its variant index.
// i.e. for `enum E<T> { A, B(1), C(T, T) }`, and a deriving
// with three Self args, builds three statements:
//
// ```
// let __self0_vi = match self {
- // A => 0u, B(..) => 1u, C(..) => 2u
+ // A => 0us, B(..) => 1us, C(..) => 2us
// };
// let __self1_vi = match __arg1 {
- // A => 0u, B(..) => 1u, C(..) => 2u
+ // A => 0us, B(..) => 1us, C(..) => 2us
// };
// let __self2_vi = match __arg2 {
- // A => 0u, B(..) => 1u, C(..) => 2u
+ // A => 0us, B(..) => 1us, C(..) => 2us
// };
// ```
let mut index_let_stmts: Vec<P<ast::Stmt>> = Vec::new();
Raw(ast::Mutability),
}
-/// A path, e.g. `::std::option::Option::<int>` (global). Has support
+/// A path, e.g. `::std::option::Option::<i32>` (global). Has support
/// for type parameters and a lifetime.
#[derive(Clone)]
pub struct Path<'a> {
/// &/Box/ Ty
Ptr(Box<Ty<'a>>, PtrTy<'a>),
/// mod::mod::Type<[lifetime], [Params...]>, including a plain type
- /// parameter, and things like `int`
+ /// parameter, and things like `i32`
Literal(Path<'a>),
/// includes unit
Tuple(Vec<Ty<'a>> )
// iteration function.
let discriminant = match variant.node.disr_expr {
Some(ref d) => d.clone(),
- None => cx.expr_uint(trait_span, index)
+ None => cx.expr_usize(trait_span, index)
};
stmts.push(call_hash(trait_span, discriminant));
"Rand" => expand!(rand::expand_deriving_rand),
+ // NOTE(stage0): remove "Show"
"Show" => expand!(show::expand_deriving_show),
+ "Debug" => expand!(show::expand_deriving_show),
"Default" => expand!(default::expand_deriving_default),
if variants.is_empty() {
cx.span_err(trait_span, "`Rand` cannot be derived for enums with no variants");
// let compilation continue
- return cx.expr_uint(trait_span, 0);
+ return cx.expr_usize(trait_span, 0);
}
- let variant_count = cx.expr_uint(trait_span, variants.len());
+ let variant_count = cx.expr_usize(trait_span, variants.len());
let rand_name = cx.path_all(trait_span,
true,
variant_count);
let mut arms = variants.iter().enumerate().map(|(i, &(ident, v_span, ref summary))| {
- let i_expr = cx.expr_uint(v_span, i);
+ let i_expr = cx.expr_usize(v_span, i);
let pat = cx.pat_lit(v_span, i_expr);
let path = cx.path(v_span, vec![substr.type_ident, ident]);
let trait_def = TraitDef {
span: span,
attributes: Vec::new(),
- path: Path::new(vec!("std", "fmt", "Show")),
+ path: Path::new(vec!("std", "fmt", "Debug")),
additional_bounds: Vec::new(),
generics: LifetimeBounds::empty(),
methods: vec!(
Struct(_) => substr.type_ident,
EnumMatching(_, v, _) => v.node.name,
EnumNonMatchingCollapsed(..) | StaticStruct(..) | StaticEnum(..) => {
- cx.span_bug(span, "nonsensical .fields in `#[derive(Show)]`")
+ cx.span_bug(span, "nonsensical .fields in `#[derive(Debug)]`")
}
};
let e = match os::getenv(var.get()) {
None => {
cx.span_err(sp, msg.get());
- cx.expr_uint(sp, 0)
+ cx.expr_usize(sp, 0)
}
Some(s) => cx.expr_str(sp, token::intern_and_get_ident(&s[]))
};
// in this file.
// Token-tree macros:
MacInvocTT(pth, tts, _) => {
- if pth.segments.len() > 1u {
+ if pth.segments.len() > 1us {
fld.cx.span_err(pth.span,
"expected macro name without module \
separators");
},
_ => unreachable!()
};
- if pth.segments.len() > 1u {
+ if pth.segments.len() > 1us {
fld.cx.span_err(pth.span, "expected macro name without module separators");
return DummyResult::raw_pat(span);
}
pub struct ExpansionConfig {
pub crate_name: String,
pub enable_quotes: bool,
- pub recursion_limit: uint,
+ pub recursion_limit: usize,
}
impl ExpansionConfig {
#[should_fail]
#[test] fn macros_cant_escape_fns_test () {
let src = "fn bogus() {macro_rules! z (() => (3+4));}\
- fn inty() -> int { z!() }".to_string();
+ fn inty() -> i32 { z!() }".to_string();
let sess = parse::new_parse_sess();
let crate_ast = parse::parse_crate_from_source_str(
"<test>".to_string(),
#[should_fail]
#[test] fn macros_cant_escape_mods_test () {
let src = "mod foo {macro_rules! z (() => (3+4));}\
- fn inty() -> int { z!() }".to_string();
+ fn inty() -> i32 { z!() }".to_string();
let sess = parse::new_parse_sess();
let crate_ast = parse::parse_crate_from_source_str(
"<test>".to_string(),
// macro_use modules should allow macros to escape
#[test] fn macros_can_escape_flattened_mods_test () {
let src = "#[macro_use] mod foo {macro_rules! z (() => (3+4));}\
- fn inty() -> int { z!() }".to_string();
+ fn inty() -> i32 { z!() }".to_string();
let sess = parse::new_parse_sess();
let crate_ast = parse::parse_crate_from_source_str(
"<test>".to_string(),
// should be able to use a bound identifier as a literal in a macro definition:
#[test] fn self_macro_parsing(){
expand_crate_str(
- "macro_rules! foo ((zz) => (287u;));
- fn f(zz : int) {foo!(zz);}".to_string()
+ "macro_rules! foo ((zz) => (287;));
+ fn f(zz: i32) {foo!(zz);}".to_string()
);
}
// in principle, you might want to control this boolean on a per-varref basis,
// but that would make things even harder to understand, and might not be
// necessary for thorough testing.
- type RenamingTest = (&'static str, Vec<Vec<uint>>, bool);
+ type RenamingTest = (&'static str, Vec<Vec<usize>>, bool);
#[test]
fn automatic_renaming () {
let tests: Vec<RenamingTest> =
vec!(// b & c should get new names throughout, in the expr too:
- ("fn a() -> int { let b = 13; let c = b; b+c }",
+ ("fn a() -> i32 { let b = 13; let c = b; b+c }",
vec!(vec!(0,1),vec!(2)), false),
// both x's should be renamed (how is this causing a bug?)
- ("fn main () {let x: int = 13;x;}",
+ ("fn main () {let x: i32 = 13;x;}",
vec!(vec!(0)), false),
// the use of b after the + should be renamed, the other one not:
- ("macro_rules! f (($x:ident) => (b + $x)); fn a() -> int { let b = 13; f!(b)}",
+ ("macro_rules! f (($x:ident) => (b + $x)); fn a() -> i32 { let b = 13; f!(b)}",
vec!(vec!(1)), false),
// the b before the plus should not be renamed (requires marks)
- ("macro_rules! f (($x:ident) => ({let b=9; ($x + b)})); fn a() -> int { f!(b)}",
+ ("macro_rules! f (($x:ident) => ({let b=9; ($x + b)})); fn a() -> i32 { f!(b)}",
vec!(vec!(1)), false),
// the marks going in and out of letty should cancel, allowing that $x to
// capture the one following the semicolon.
// this was an awesome test case, and caught a *lot* of bugs.
("macro_rules! letty(($x:ident) => (let $x = 15;));
macro_rules! user(($x:ident) => ({letty!($x); $x}));
- fn main() -> int {user!(z)}",
+ fn main() -> i32 {user!(z)}",
vec!(vec!(0)), false)
);
for (idx,s) in tests.iter().enumerate() {
// can't write this test case until we have macro-generating macros.
// method arg hygiene
- // method expands to fn get_x(&self_0, x_1:int) {self_0 + self_2 + x_3 + x_1}
+ // method expands to fn get_x(&self_0, x_1: i32) {self_0 + self_2 + x_3 + x_1}
#[test] fn method_arg_hygiene(){
run_renaming_test(
&("macro_rules! inject_x (()=>(x));
macro_rules! inject_self (()=>(self));
struct A;
- impl A{fn get_x(&self, x: int) {self + inject_self!() + inject_x!() + x;} }",
+ impl A{fn get_x(&self, x: i32) {self + inject_self!() + inject_x!() + x;} }",
vec!(vec!(0),vec!(3)),
true),
0)
}
// item fn hygiene
- // expands to fn q(x_1:int){fn g(x_2:int){x_2 + x_1};}
+ // expands to fn q(x_1: i32){fn g(x_2: i32){x_2 + x_1};}
#[test] fn issue_9383(){
run_renaming_test(
- &("macro_rules! bad_macro (($ex:expr) => (fn g(x:int){ x + $ex }));
- fn q(x:int) { bad_macro!(x); }",
+ &("macro_rules! bad_macro (($ex:expr) => (fn g(x: i32){ x + $ex }));
+ fn q(x: i32) { bad_macro!(x); }",
vec!(vec!(1),vec!(0)),true),
0)
}
// closure arg hygiene (ExprClosure)
- // expands to fn f(){(|x_1 : int| {(x_2 + x_1)})(3);}
+ // expands to fn f(){(|x_1 : i32| {(x_2 + x_1)})(3);}
#[test] fn closure_arg_hygiene(){
run_renaming_test(
&("macro_rules! inject_x (()=>(x));
- fn f(){(|x : int| {(inject_x!() + x)})(3);}",
+ fn f(){(|x : i32| {(inject_x!() + x)})(3);}",
vec!(vec!(1)),
true),
0)
// macro_rules in method position. Sadly, unimplemented.
#[test] fn macro_in_method_posn(){
expand_crate_str(
- "macro_rules! my_method (() => (fn thirteen(&self) -> int {13}));
+ "macro_rules! my_method (() => (fn thirteen(&self) -> i32 {13}));
struct A;
impl A{ my_method!(); }
fn f(){A.thirteen;}".to_string());
}
// run one of the renaming tests
- fn run_renaming_test(t: &RenamingTest, test_idx: uint) {
+ fn run_renaming_test(t: &RenamingTest, test_idx: usize) {
let invalid_name = token::special_idents::invalid.name;
let (teststr, bound_connections, bound_ident_check) = match *t {
(ref str,ref conns, bic) => (str.to_string(), conns.clone(), bic)
// it's the name of a 0-ary variant, and that 'i' appears twice in succession.
#[test]
fn crate_bindings_test(){
- let the_crate = string_to_crate("fn main (a : int) -> int {|b| {
+ let the_crate = string_to_crate("fn main (a: i32) -> i32 {|b| {
match 34 {None => 3, Some(i) | i => j, Foo{k:z,l:y} => \"banana\"}} }".to_string());
let idents = crate_bindings(&the_crate);
assert_eq!(idents, strs_to_idents(vec!("a","b","None","i","i","z","y")));
// test the IdentRenamer directly
#[test]
fn ident_renamer_test () {
- let the_crate = string_to_crate("fn f(x : int){let x = x; x}".to_string());
+ let the_crate = string_to_crate("fn f(x: i32){let x = x; x}".to_string());
let f_ident = token::str_to_ident("f");
let x_ident = token::str_to_ident("x");
- let int_ident = token::str_to_ident("int");
+ let int_ident = token::str_to_ident("i32");
let renames = vec!((x_ident,Name(16)));
let mut renamer = IdentRenamer{renames: &renames};
let renamed_crate = renamer.fold_crate(the_crate);
// test the PatIdentRenamer; only PatIdents get renamed
#[test]
fn pat_ident_renamer_test () {
- let the_crate = string_to_crate("fn f(x : int){let x = x; x}".to_string());
+ let the_crate = string_to_crate("fn f(x: i32){let x = x; x}".to_string());
let f_ident = token::str_to_ident("f");
let x_ident = token::str_to_ident("x");
- let int_ident = token::str_to_ident("int");
+ let int_ident = token::str_to_ident("i32");
let renames = vec!((x_ident,Name(16)));
let mut renamer = PatIdentRenamer{renames: &renames};
let renamed_crate = renamer.fold_crate(the_crate);
}
enum Position {
- Exact(uint),
+ Exact(usize),
Named(String),
}
/// Stays `true` if all formatting parameters are default (as in "{}{}").
all_pieces_simple: bool,
- name_positions: HashMap<String, uint>,
+ name_positions: HashMap<String, usize>,
/// Updated as arguments are consumed or methods are entered
- nest_level: uint,
- next_arg: uint,
+ nest_level: usize,
+ next_arg: usize,
}
/// Parses the arguments from the given list of tokens, returning None
match c {
parse::CountIs(i) => {
self.ecx.expr_call_global(sp, Context::rtpath(self.ecx, "CountIs"),
- vec!(self.ecx.expr_uint(sp, i)))
+ vec!(self.ecx.expr_usize(sp, i)))
}
parse::CountIsParam(i) => {
self.ecx.expr_call_global(sp, Context::rtpath(self.ecx, "CountIsParam"),
- vec!(self.ecx.expr_uint(sp, i)))
+ vec!(self.ecx.expr_usize(sp, i)))
}
parse::CountImplied => {
let path = self.ecx.path_global(sp, Context::rtpath(self.ecx,
};
let i = i + self.args.len();
self.ecx.expr_call_global(sp, Context::rtpath(self.ecx, "CountIsParam"),
- vec!(self.ecx.expr_uint(sp, i)))
+ vec!(self.ecx.expr_usize(sp, i)))
}
}
}
}
parse::ArgumentIs(i) => {
self.ecx.expr_call_global(sp, Context::rtpath(self.ecx, "ArgumentIs"),
- vec!(self.ecx.expr_uint(sp, i)))
+ vec!(self.ecx.expr_usize(sp, i)))
}
// Named arguments are converted to positional arguments at
// the end of the list of arguments
};
let i = i + self.args.len();
self.ecx.expr_call_global(sp, Context::rtpath(self.ecx, "ArgumentIs"),
- vec!(self.ecx.expr_uint(sp, i)))
+ vec!(self.ecx.expr_usize(sp, i)))
}
};
}
};
let align = self.ecx.expr_path(align);
- let flags = self.ecx.expr_uint(sp, arg.format.flags);
+ let flags = self.ecx.expr_usize(sp, arg.format.flags);
let prec = self.trans_count(arg.format.precision);
let width = self.trans_count(arg.format.width);
let path = self.ecx.path_global(sp, Context::rtpath(self.ecx, "FormatSpec"));
let trait_ = match *ty {
Known(ref tyname) => {
match &tyname[] {
- "" => "String",
- "?" => "Show",
+ "" => "Display",
+ "?" => "Debug",
"e" => "LowerExp",
"E" => "UpperExp",
"o" => "Octal",
}
let resolved = {
- let result = (*table.table.borrow())[id.ctxt as uint];
+ let result = (*table.table.borrow())[id.ctxt as usize];
match result {
EmptyCtxt => id.name,
// ignore marks here:
let mut result = Vec::new();
let mut loopvar = ctxt;
loop {
- let table_entry = (*table.table.borrow())[loopvar as uint];
+ let table_entry = (*table.table.borrow())[loopvar as usize];
match table_entry {
EmptyCtxt => {
return result;
/// FAILS when outside is not a mark.
pub fn outer_mark(ctxt: SyntaxContext) -> Mrk {
with_sctable(|sctable| {
- match (*sctable.table.borrow())[ctxt as uint] {
+ match (*sctable.table.borrow())[ctxt as usize] {
Mark(mrk, _) => mrk,
_ => panic!("can't retrieve outer mark when outside is not a mark")
}
let mut result = Vec::new();
loop {
let table = table.table.borrow();
- match (*table)[sc as uint] {
+ match (*table)[sc as usize] {
EmptyCtxt => {return result;},
Mark(mrk,tail) => {
result.push(M(mrk));
assert_eq! (marksof_internal (ans, stopname,&t), vec!(16));}
// rename where stop doesn't match:
{ let chain = vec!(M(9),
- R(id(name1.uint() as u32,
+ R(id(name1.usize() as u32,
apply_mark_internal (4, EMPTY_CTXT,&mut t)),
Name(100101102)),
M(14));
// rename where stop does match
{ let name1sc = apply_mark_internal(4, EMPTY_CTXT, &mut t);
let chain = vec!(M(9),
- R(id(name1.uint() as u32, name1sc),
+ R(id(name1.usize() as u32, name1sc),
stopname),
M(14));
let ans = unfold_test_sc(chain,EMPTY_CTXT,&mut t);
}
token::Literal(token::StrRaw(ident, n), suf) => {
- return mk_lit!("StrRaw", suf, mk_name(cx, sp, ident.ident()), cx.expr_uint(sp, n))
+ return mk_lit!("StrRaw", suf, mk_name(cx, sp, ident.ident()), cx.expr_usize(sp, n))
}
token::Ident(ident, style) => {
// try removing it when enough of them are gone.
let mut p = cx.new_parser_from_tts(tts);
- p.quote_depth += 1u;
+ p.quote_depth += 1us;
let cx_expr = p.parse_expr();
if !p.eat(&token::Comma) {
let topmost = cx.original_span_in_file();
let loc = cx.codemap().lookup_char_pos(topmost.lo);
- base::MacExpr::new(cx.expr_uint(topmost, loc.line))
+ base::MacExpr::new(cx.expr_usize(topmost, loc.line))
}
/* column!(): expands to the current column number */
let topmost = cx.original_span_in_file();
let loc = cx.codemap().lookup_char_pos(topmost.lo);
- base::MacExpr::new(cx.expr_uint(topmost, loc.col.to_uint()))
+ base::MacExpr::new(cx.expr_usize(topmost, loc.col.to_usize()))
}
/// file!(): expands to the current filename */
}
impl TokenTreeOrTokenTreeVec {
- fn len(&self) -> uint {
+ fn len(&self) -> usize {
match self {
&TtSeq(ref v) => v.len(),
&Tt(ref tt) => tt.len(),
}
}
- fn get_tt(&self, index: uint) -> TokenTree {
+ fn get_tt(&self, index: usize) -> TokenTree {
match self {
&TtSeq(ref v) => v[index].clone(),
&Tt(ref tt) => tt.get_tt(index),
#[derive(Clone)]
struct MatcherTtFrame {
elts: TokenTreeOrTokenTreeVec,
- idx: uint,
+ idx: usize,
}
#[derive(Clone)]
stack: Vec<MatcherTtFrame>,
top_elts: TokenTreeOrTokenTreeVec,
sep: Option<Token>,
- idx: uint,
+ idx: usize,
up: Option<Box<MatcherPos>>,
matches: Vec<Vec<Rc<NamedMatch>>>,
- match_lo: uint,
- match_cur: uint,
- match_hi: uint,
+ match_lo: usize,
+ match_cur: usize,
+ match_hi: usize,
sp_lo: BytePos,
}
-pub fn count_names(ms: &[TokenTree]) -> uint {
+pub fn count_names(ms: &[TokenTree]) -> usize {
ms.iter().fold(0, |count, elt| {
count + match elt {
&TtSequence(_, ref seq) => {
stack: vec![],
top_elts: TtSeq(ms),
sep: sep,
- idx: 0u,
+ idx: 0us,
up: None,
matches: matches,
- match_lo: 0u,
- match_cur: 0u,
+ match_lo: 0us,
+ match_cur: 0us,
match_hi: match_idx_hi,
sp_lo: lo
}
pub fn nameize(p_s: &ParseSess, ms: &[TokenTree], res: &[Rc<NamedMatch>])
-> HashMap<Ident, Rc<NamedMatch>> {
fn n_rec(p_s: &ParseSess, m: &TokenTree, res: &[Rc<NamedMatch>],
- ret_val: &mut HashMap<Ident, Rc<NamedMatch>>, idx: &mut uint) {
+ ret_val: &mut HashMap<Ident, Rc<NamedMatch>>, idx: &mut usize) {
match m {
&TtSequence(_, ref seq) => {
for next_m in seq.tts.iter() {
}
}
let mut ret_val = HashMap::new();
- let mut idx = 0u;
+ let mut idx = 0us;
for m in ms.iter() { n_rec(p_s, m, res, &mut ret_val, &mut idx) }
ret_val
}
if seq.op == ast::ZeroOrMore {
let mut new_ei = ei.clone();
new_ei.match_cur += seq.num_captures;
- new_ei.idx += 1u;
+ new_ei.idx += 1us;
//we specifically matched zero repeats.
for idx in range(ei.match_cur, ei.match_cur + seq.num_captures) {
(&mut new_ei.matches[idx]).push(Rc::new(MatchedSeq(vec![], sp)));
cur_eis.push(box MatcherPos {
stack: vec![],
sep: seq.separator.clone(),
- idx: 0u,
+ idx: 0us,
matches: matches,
match_lo: ei_t.match_cur,
match_cur: ei_t.match_cur,
/* error messages here could be improved with links to orig. rules */
if token_name_eq(&tok, &token::Eof) {
- if eof_eis.len() == 1u {
+ if eof_eis.len() == 1us {
let mut v = Vec::new();
for dv in (&mut eof_eis[0]).matches.iter_mut() {
v.push(dv.pop().unwrap());
}
return Success(nameize(sess, ms, &v[]));
- } else if eof_eis.len() > 1u {
+ } else if eof_eis.len() > 1us {
return Error(sp, "ambiguity: multiple successful parses".to_string());
} else {
return Failure(sp, "unexpected end of macro invocation".to_string());
}
} else {
- if (bb_eis.len() > 0u && next_eis.len() > 0u)
- || bb_eis.len() > 1u {
+ if (bb_eis.len() > 0us && next_eis.len() > 0us)
+ || bb_eis.len() > 1us {
let nts = bb_eis.iter().map(|ei| {
match ei.top_elts.get_tt(ei.idx) {
TtToken(_, MatchNt(bind, name, _, _)) => {
"local ambiguity: multiple parsing options: \
built-in NTs {} or {} other options.",
nts, next_eis.len()).to_string());
- } else if bb_eis.len() == 0u && next_eis.len() == 0u {
+ } else if bb_eis.len() == 0us && next_eis.len() == 0us {
return Failure(sp, format!("no rules expected the token `{}`",
pprust::token_to_string(&tok)).to_string());
- } else if next_eis.len() > 0u {
+ } else if next_eis.len() > 0us {
/* Now process the next token */
- while next_eis.len() > 0u {
+ while next_eis.len() > 0us {
cur_eis.push(next_eis.pop().unwrap());
}
rdr.next_token();
let match_cur = ei.match_cur;
(&mut ei.matches[match_cur]).push(Rc::new(MatchedNonterminal(
parse_nt(&mut rust_parser, name_string.get()))));
- ei.idx += 1u;
+ ei.idx += 1us;
ei.match_cur += 1;
}
_ => panic!()
}
}
- assert!(cur_eis.len() > 0u);
+ assert!(cur_eis.len() > 0us);
}
}
pub fn parse_nt(p: &mut Parser, name: &str) -> Nonterminal {
match name {
"tt" => {
- p.quote_depth += 1u; //but in theory, non-quoted tts might be useful
+ p.quote_depth += 1us; //but in theory, non-quoted tts might be useful
let res = token::NtTT(P(p.parse_token_tree()));
- p.quote_depth -= 1u;
+ p.quote_depth -= 1us;
return res;
}
_ => {}
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-use ast::{TokenTree, TtDelimited, TtSequence, TtToken};
-use ast;
+use ast::{self, TokenTree, TtDelimited, TtSequence, TtToken};
use codemap::{Span, DUMMY_SP};
use ext::base::{ExtCtxt, MacResult, SyntaxExtension};
use ext::base::{NormalTT, TTMacroExpander};
use parse::lexer::{new_tt_reader, new_tt_reader_with_doc_flag};
use parse::parser::Parser;
use parse::attr::ParserAttr;
-use parse::token::{special_idents, gensym_ident, NtTT, Token};
+use parse::token::{self, special_idents, gensym_ident, NtTT, Token};
use parse::token::Token::*;
-use parse::token;
use print;
use ptr::P;
let tok = if let TtToken(_, ref tok) = *token { tok } else { unreachable!() };
// If T' is in the set FOLLOW(NT), continue. Else, reject.
- match &next_token {
- &Eof => return Some((sp, tok.clone())),
- _ if is_in_follow(cx, &next_token, frag_spec.as_str()) => continue,
- next => {
+ match (&next_token, is_in_follow(cx, &next_token, frag_spec.as_str())) {
+ (&Eof, _) => return Some((sp, tok.clone())),
+ (_, Ok(true)) => continue,
+ (next, Ok(false)) => {
cx.span_err(sp, format!("`${0}:{1}` is followed by `{2}`, which \
is not allowed for `{1}` fragments",
name.as_str(), frag_spec.as_str(),
token_to_string(next)).as_slice());
continue
},
+ (_, Err(msg)) => {
+ cx.span_err(sp, msg.as_slice());
+ continue
+ }
}
},
TtSequence(sp, ref seq) => {
last
}
-fn is_in_follow(cx: &ExtCtxt, tok: &Token, frag: &str) -> bool {
+fn is_in_follow(_: &ExtCtxt, tok: &Token, frag: &str) -> Result<bool, String> {
if let &CloseDelim(_) = tok {
- return true;
- }
-
- match frag {
- "item" => {
- // since items *must* be followed by either a `;` or a `}`, we can
- // accept anything after them
- true
- },
- "block" => {
- // anything can follow block, the braces provide a easy boundary to
- // maintain
- true
- },
- "stmt" | "expr" => {
- match *tok {
- FatArrow | Comma | Semi => true,
- _ => false
- }
- },
- "pat" => {
- match *tok {
- FatArrow | Comma | Eq => true,
- _ => false
- }
- },
- "path" | "ty" => {
- match *tok {
- Comma | FatArrow | Colon | Eq | Gt => true,
- Ident(i, _) if i.as_str() == "as" => true,
- _ => false
- }
- },
- "ident" => {
- // being a single token, idents are harmless
- true
- },
- "meta" | "tt" => {
- // being either a single token or a delimited sequence, tt is
- // harmless
- true
- },
- _ => cx.bug(format!("unrecognized builtin nonterminal {}",
- frag).as_slice()),
+ Ok(true)
+ } else {
+ match frag {
+ "item" => {
+ // since items *must* be followed by either a `;` or a `}`, we can
+ // accept anything after them
+ Ok(true)
+ },
+ "block" => {
+ // anything can follow block, the braces provide a easy boundary to
+ // maintain
+ Ok(true)
+ },
+ "stmt" | "expr" => {
+ match *tok {
+ FatArrow | Comma | Semi => Ok(true),
+ _ => Ok(false)
+ }
+ },
+ "pat" => {
+ match *tok {
+ FatArrow | Comma | Eq => Ok(true),
+ _ => Ok(false)
+ }
+ },
+ "path" | "ty" => {
+ match *tok {
+ Comma | FatArrow | Colon | Eq | Gt => Ok(true),
+ Ident(i, _) if i.as_str() == "as" => Ok(true),
+ _ => Ok(false)
+ }
+ },
+ "ident" => {
+ // being a single token, idents are harmless
+ Ok(true)
+ },
+ "meta" | "tt" => {
+ // being either a single token or a delimited sequence, tt is
+ // harmless
+ Ok(true)
+ },
+ _ => Err(format!("unrecognized builtin nonterminal `{}`", frag))
+ }
}
}
#[derive(Clone)]
struct TtFrame {
forest: TokenTree,
- idx: uint,
+ idx: usize,
dotdotdoted: bool,
sep: Option<Token>,
}
// Some => return imported_from as the next token
crate_name_next: Option<Span>,
- repeat_idx: Vec<uint>,
- repeat_len: Vec<uint>,
+ repeat_idx: Vec<usize>,
+ repeat_len: Vec<usize>,
/* cached: */
pub cur_tok: Token,
pub cur_span: Span,
#[derive(Clone)]
enum LockstepIterSize {
LisUnconstrained,
- LisConstraint(uint, Ident),
+ LisConstraint(usize, Ident),
LisContradiction(String),
}
r.repeat_len.pop();
}
} else { /* repeat */
- *r.repeat_idx.last_mut().unwrap() += 1u;
+ *r.repeat_idx.last_mut().unwrap() += 1us;
r.stack.last_mut().unwrap().idx = 0;
match r.stack.last().unwrap().sep.clone() {
Some(tk) => {
noop_fold_ident(i, self)
}
- fn fold_uint(&mut self, i: uint) -> uint {
- noop_fold_uint(i, self)
+ fn fold_usize(&mut self, i: usize) -> usize {
+ noop_fold_usize(i, self)
}
fn fold_path(&mut self, p: Path) -> Path {
i
}
-pub fn noop_fold_uint<T: Folder>(i: uint, _: &mut T) -> uint {
+pub fn noop_fold_usize<T: Folder>(i: usize, _: &mut T) -> usize {
i
}
}
ExprTupField(el, ident) => {
ExprTupField(folder.fold_expr(el),
- respan(ident.span, folder.fold_uint(ident.node)))
+ respan(ident.span, folder.fold_usize(ident.node)))
}
ExprIndex(el, er) => {
ExprIndex(folder.fold_expr(el), folder.fold_expr(er))
data: Box<[T]>
}
-impl<T:fmt::Show> fmt::Show for OwnedSlice<T> {
+impl<T:fmt::Debug> fmt::Debug for OwnedSlice<T> {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
self.data.fmt(fmt)
}
use std::io;
use std::str;
use std::string::String;
-use std::uint;
+use std::usize;
#[derive(Clone, Copy, PartialEq)]
pub enum CommentStyle {
pub fn strip_doc_comment_decoration(comment: &str) -> String {
/// remove whitespace-only lines from the start/end of lines
fn vertical_trim(lines: Vec<String> ) -> Vec<String> {
- let mut i = 0u;
+ let mut i = 0us;
let mut j = lines.len();
// first line of all-stars should be omitted
if lines.len() > 0 &&
/// remove a "[ \t]*\*" block from each line, if possible
fn horizontal_trim(lines: Vec<String> ) -> Vec<String> {
- let mut i = uint::MAX;
+ let mut i = usize::MAX;
let mut can_trim = true;
let mut first = true;
for line in lines.iter() {
if can_trim {
lines.iter().map(|line| {
- (&line[(i + 1)..line.len()]).to_string()
+ (&line[i + 1..line.len()]).to_string()
}).collect()
} else {
lines
}
if comment.starts_with("/*") {
- let lines = comment[3u..(comment.len() - 2u)]
+ let lines = comment[3..comment.len() - 2]
.lines_any()
.map(|s| s.to_string())
.collect::<Vec<String> >();
fn consume_whitespace_counting_blank_lines(rdr: &mut StringReader,
comments: &mut Vec<Comment>) {
while is_whitespace(rdr.curr) && !rdr.is_eof() {
- if rdr.col == CharPos(0u) && rdr.curr_is('\n') {
+ if rdr.col == CharPos(0us) && rdr.curr_is('\n') {
push_blank_line_comment(rdr, &mut *comments);
}
rdr.bump();
/// Returns None if the first col chars of s contain a non-whitespace char.
/// Otherwise returns Some(k) where k is first char offset after that leading
/// whitespace. Note k may be outside bounds of s.
-fn all_whitespace(s: &str, col: CharPos) -> Option<uint> {
+fn all_whitespace(s: &str, col: CharPos) -> Option<usize> {
let len = s.len();
- let mut col = col.to_uint();
- let mut cursor: uint = 0;
+ let mut col = col.to_usize();
+ let mut cursor: usize = 0;
while col > 0 && cursor < len {
let r: str::CharRange = s.char_range_at(cursor);
if !r.ch.is_whitespace() {
assert!(!curr_line.contains_char('\n'));
lines.push(curr_line);
} else {
- let mut level: int = 1;
+ let mut level: isize = 1;
while level > 0 {
debug!("=== block comment level {}", level);
if rdr.is_eof() {
let mut style = if code_to_the_left { Trailing } else { Isolated };
rdr.consume_non_eol_whitespace();
- if !rdr.is_eof() && !rdr.curr_is('\n') && lines.len() == 1u {
+ if !rdr.is_eof() && !rdr.curr_is('\n') && lines.len() == 1us {
style = Mixed;
}
debug!("<<< block comment");
}
#[test] fn test_block_doc_comment_3() {
- let comment = "/**\n let a: *int;\n *a = 5;\n*/";
+ let comment = "/**\n let a: *i32;\n *a = 5;\n*/";
let stripped = strip_doc_comment_decoration(comment);
- assert_eq!(stripped, " let a: *int;\n *a = 5;");
+ assert_eq!(stripped, " let a: *i32;\n *a = 5;");
}
#[test] fn test_block_doc_comment_4() {
/// offending string to the error message
fn fatal_span_verbose(&self, from_pos: BytePos, to_pos: BytePos, mut m: String) -> ! {
m.push_str(": ");
- let from = self.byte_offset(from_pos).to_uint();
- let to = self.byte_offset(to_pos).to_uint();
+ let from = self.byte_offset(from_pos).to_usize();
+ let to = self.byte_offset(to_pos).to_usize();
m.push_str(&self.filemap.src[from..to]);
self.fatal_span_(from_pos, to_pos, &m[]);
}
F: FnOnce(&str) -> T,
{
f(self.filemap.src.slice(
- self.byte_offset(start).to_uint(),
- self.byte_offset(end).to_uint()))
+ self.byte_offset(start).to_usize(),
+ self.byte_offset(end).to_usize()))
}
/// Converts CRLF to LF in the given string, raising an error on bare CR.
fn translate_crlf<'b>(&self, start: BytePos,
s: &'b str, errmsg: &'b str) -> CowString<'b> {
- let mut i = 0u;
+ let mut i = 0us;
while i < s.len() {
let str::CharRange { ch, next } = s.char_range_at(i);
if ch == '\r' {
return s.into_cow();
fn translate_crlf_(rdr: &StringReader, start: BytePos,
- s: &str, errmsg: &str, mut i: uint) -> String {
+ s: &str, errmsg: &str, mut i: usize) -> String {
let mut buf = String::with_capacity(s.len());
let mut j = 0;
while i < s.len() {
/// discovered, add it to the FileMap's list of line start offsets.
pub fn bump(&mut self) {
self.last_pos = self.pos;
- let current_byte_offset = self.byte_offset(self.pos).to_uint();
+ let current_byte_offset = self.byte_offset(self.pos).to_usize();
if current_byte_offset < self.filemap.src.len() {
assert!(self.curr.is_some());
let last_char = self.curr.unwrap();
.src
.char_range_at(current_byte_offset);
let byte_offset_diff = next.next - current_byte_offset;
- self.pos = self.pos + Pos::from_uint(byte_offset_diff);
+ self.pos = self.pos + Pos::from_usize(byte_offset_diff);
self.curr = Some(next.ch);
- self.col = self.col + CharPos(1u);
+ self.col = self.col + CharPos(1us);
if last_char == '\n' {
self.filemap.next_line(self.last_pos);
- self.col = CharPos(0u);
+ self.col = CharPos(0us);
}
if byte_offset_diff > 1 {
}
pub fn nextch(&self) -> Option<char> {
- let offset = self.byte_offset(self.pos).to_uint();
+ let offset = self.byte_offset(self.pos).to_usize();
if offset < self.filemap.src.len() {
Some(self.filemap.src.char_at(offset))
} else {
}
pub fn nextnextch(&self) -> Option<char> {
- let offset = self.byte_offset(self.pos).to_uint();
+ let offset = self.byte_offset(self.pos).to_usize();
let s = self.filemap.src.as_slice();
if offset >= s.len() { return None }
let str::CharRange { next, .. } = s.char_range_at(offset);
cmap.files.borrow_mut().push(self.filemap.clone());
let loc = cmap.lookup_char_pos_adj(self.last_pos);
debug!("Skipping a shebang");
- if loc.line == 1u && loc.col == CharPos(0u) {
+ if loc.line == 1us && loc.col == CharPos(0us) {
// FIXME: Add shebang "token", return it
let start = self.last_pos;
while !self.curr_is('\n') && !self.is_eof() { self.bump(); }
let is_doc_comment = self.curr_is('*') || self.curr_is('!');
let start_bpos = self.last_pos - BytePos(2);
- let mut level: int = 1;
+ let mut level: isize = 1;
let mut has_cr = false;
while level > 0 {
if self.is_eof() {
/// `\x00` marker.
#[inline(never)]
fn scan_embedded_hygienic_ident(&mut self) -> ast::Ident {
- fn bump_expecting_char<'a,D:fmt::Show>(r: &mut StringReader<'a>,
- c: char,
- described_c: D,
- whence: &str) {
+ fn bump_expecting_char<'a,D:fmt::Debug>(r: &mut StringReader<'a>,
+ c: char,
+ described_c: D,
+ whence: &str) {
match r.curr {
Some(r_c) if r_c == c => r.bump(),
Some(r_c) => panic!("expected {:?}, hit {:?}, {}", described_c, r_c, whence),
/// Scan through any digits (base `radix`) or underscores, and return how
/// many digits there were.
- fn scan_digits(&mut self, radix: uint) -> uint {
- let mut len = 0u;
+ fn scan_digits(&mut self, radix: usize) -> usize {
+ let mut len = 0us;
loop {
let c = self.curr;
if c == Some('_') { debug!("skipping a _"); self.bump(); continue; }
/// Scan over `n_digits` hex digits, stopping at `delim`, reporting an
/// error if too many or too few digits are encountered.
fn scan_hex_digits(&mut self,
- n_digits: uint,
+ n_digits: usize,
delim: char,
below_0x7f_only: bool)
-> bool {
if self.curr == Some('{') {
self.scan_unicode_escape(delim)
} else {
- let res = self.scan_hex_digits(4u, delim, false);
+ let res = self.scan_hex_digits(4us, delim, false);
let sp = codemap::mk_sp(escaped_pos, self.last_pos);
self.old_escape_warning(sp);
res
}
}
'U' if !ascii_only => {
- let res = self.scan_hex_digits(8u, delim, false);
+ let res = self.scan_hex_digits(8us, delim, false);
let sp = codemap::mk_sp(escaped_pos, self.last_pos);
self.old_escape_warning(sp);
res
fn scan_unicode_escape(&mut self, delim: char) -> bool {
self.bump(); // past the {
let start_bpos = self.last_pos;
- let mut count: uint = 0;
+ let mut count = 0us;
let mut accum_int = 0;
while !self.curr_is('}') && count <= 6 {
/// Check that a base is valid for a floating literal, emitting a nice
/// error if it isn't.
- fn check_float_base(&mut self, start_bpos: BytePos, last_bpos: BytePos, base: uint) {
+ fn check_float_base(&mut self, start_bpos: BytePos, last_bpos: BytePos, base: usize) {
match base {
- 16u => self.err_span_(start_bpos, last_bpos, "hexadecimal float literal is not \
- supported"),
- 8u => self.err_span_(start_bpos, last_bpos, "octal float literal is not supported"),
- 2u => self.err_span_(start_bpos, last_bpos, "binary float literal is not supported"),
- _ => ()
+ 16us => self.err_span_(start_bpos, last_bpos, "hexadecimal float literal is not \
+ supported"),
+ 8us => self.err_span_(start_bpos, last_bpos, "octal float literal is not supported"),
+ 2us => self.err_span_(start_bpos, last_bpos, "binary float literal is not supported"),
+ _ => ()
}
}
'r' => {
let start_bpos = self.last_pos;
self.bump();
- let mut hash_count = 0u;
+ let mut hash_count = 0us;
while self.curr_is('#') {
self.bump();
hash_count += 1;
fn scan_raw_byte_string(&mut self) -> token::Lit {
let start_bpos = self.last_pos;
self.bump();
- let mut hash_count = 0u;
+ let mut hash_count = 0us;
while self.curr_is('#') {
self.bump();
hash_count += 1;
test!("1.0", Float, "1.0");
test!("1.0e10", Float, "1.0e10");
- assert_eq!(setup(&mk_sh(), "2u".to_string()).next_token().tok,
+ assert_eq!(setup(&mk_sh(), "2us".to_string()).next_token().tok,
token::Literal(token::Integer(token::intern("2")),
- Some(token::intern("u"))));
+ Some(token::intern("us"))));
assert_eq!(setup(&mk_sh(), "r###\"raw\"###suffix".to_string()).next_token().tok,
token::Literal(token::StrRaw(token::intern("raw"), 3),
Some(token::intern("suffix"))));
name,
source
);
- p.quote_depth += 1u;
+ p.quote_depth += 1us;
// right now this is re-creating the token trees from ... token trees.
maybe_aborted(p.parse_all_token_trees(),p)
}
name,
source
);
- p.quote_depth += 1u;
+ p.quote_depth += 1us;
// right now this is re-creating the token trees from ... token trees.
maybe_aborted(p.parse_all_token_trees(),p)
}
}
/// Abort if necessary
-pub fn maybe_aborted<T>(result: T, mut p: Parser) -> T {
+pub fn maybe_aborted<T>(result: T, p: Parser) -> T {
p.abort_if_errors();
result
}
/// Rather than just accepting/rejecting a given literal, unescapes it as
/// well. Can take any slice prefixed by a character escape. Returns the
/// character and the number of characters consumed.
-pub fn char_lit(lit: &str) -> (char, int) {
+pub fn char_lit(lit: &str) -> (char, isize) {
use std::{num, char};
let mut chars = lit.chars();
let msg = format!("lexer should have rejected a bad character escape {}", lit);
let msg2 = &msg[];
- fn esc(len: uint, lit: &str) -> Option<(char, int)> {
+ fn esc(len: usize, lit: &str) -> Option<(char, isize)> {
num::from_str_radix(&lit[2..len], 16)
.and_then(char::from_u32)
- .map(|x| (x, len as int))
+ .map(|x| (x, len as isize))
}
- let unicode_escape = |&: | -> Option<(char, int)>
+ let unicode_escape = |&: | -> Option<(char, isize)>
if lit.as_bytes()[2] == b'{' {
let idx = lit.find('}').expect(msg2);
let subslice = &lit[3..idx];
num::from_str_radix(subslice, 16)
.and_then(char::from_u32)
- .map(|x| (x, subslice.chars().count() as int + 4))
+ .map(|x| (x, subslice.chars().count() as isize + 4))
} else {
esc(6, lit)
};
let error = |&: i| format!("lexer should have rejected {} at {}", lit, i);
/// Eat everything up to a non-whitespace
- fn eat<'a>(it: &mut iter::Peekable<(uint, char), str::CharIndices<'a>>) {
+ fn eat<'a>(it: &mut iter::Peekable<(usize, char), str::CharIndices<'a>>) {
loop {
match it.peek().map(|x| x.1) {
Some(' ') | Some('\n') | Some('\r') | Some('\t') => {
}
/// Parse a string representing a byte literal into its final form. Similar to `char_lit`
-pub fn byte_lit(lit: &str) -> (u8, uint) {
+pub fn byte_lit(lit: &str) -> (u8, usize) {
let err = |&: i| format!("lexer accepted invalid byte literal {} step {}", lit, i);
if lit.len() == 1 {
(lit.as_bytes()[0], 1)
} else {
- assert!(lit.as_bytes()[0] == b'\\', err(0i));
+ assert!(lit.as_bytes()[0] == b'\\', err(0is));
let b = match lit.as_bytes()[1] {
b'"' => b'"',
b'n' => b'\n',
let error = |&: i| format!("lexer should have rejected {} at {}", lit, i);
/// Eat everything up to a non-whitespace
- fn eat<'a, I: Iterator<Item=(uint, u8)>>(it: &mut iter::Peekable<(uint, u8), I>) {
+ fn eat<'a, I: Iterator<Item=(usize, u8)>>(it: &mut iter::Peekable<(usize, u8), I>) {
loop {
match it.peek().map(|x| x.1) {
Some(b' ') | Some(b'\n') | Some(b'\r') | Some(b'\t') => {
match suffix {
Some(suf) if looks_like_width_suffix(&['f'], suf) => {
match base {
- 16u => sd.span_err(sp, "hexadecimal float literal is not supported"),
- 8u => sd.span_err(sp, "octal float literal is not supported"),
- 2u => sd.span_err(sp, "binary float literal is not supported"),
+ 16us => sd.span_err(sp, "hexadecimal float literal is not supported"),
+ 8us => sd.span_err(sp, "octal float literal is not supported"),
+ 2us => sd.span_err(sp, "binary float literal is not supported"),
_ => ()
}
let ident = token::intern_and_get_ident(&*s);
#[test]
fn string_to_tts_1 () {
- let tts = string_to_tts("fn a (b : int) { b; }".to_string());
+ let tts = string_to_tts("fn a (b : i32) { b; }".to_string());
assert_eq!(json::encode(&tts),
"[\
{\
{\
\"variant\":\"Ident\",\
\"fields\":[\
- \"int\",\
+ \"i32\",\
\"Plain\"\
]\
}\
// check the contents of the tt manually:
#[test] fn parse_fundecl () {
- // this test depends on the intern order of "fn" and "int"
- assert!(string_to_item("fn a (b : int) { b; }".to_string()) ==
+ // this test depends on the intern order of "fn" and "i32"
+ assert_eq!(string_to_item("fn a (b : i32) { b; }".to_string()),
Some(
P(ast::Item{ident:str_to_ident("a"),
attrs:Vec::new(),
segments: vec!(
ast::PathSegment {
identifier:
- str_to_ident("int"),
+ str_to_ident("i32"),
parameters: ast::PathParameters::none(),
}
),
#[test] fn span_of_self_arg_pat_idents_are_correct() {
- let srcs = ["impl z { fn a (&self, &myarg: int) {} }",
- "impl z { fn a (&mut self, &myarg: int) {} }",
- "impl z { fn a (&'a self, &myarg: int) {} }",
- "impl z { fn a (self, &myarg: int) {} }",
- "impl z { fn a (self: Foo, &myarg: int) {} }",
+ let srcs = ["impl z { fn a (&self, &myarg: i32) {} }",
+ "impl z { fn a (&mut self, &myarg: i32) {} }",
+ "impl z { fn a (&'a self, &myarg: i32) {} }",
+ "impl z { fn a (self, &myarg: i32) {} }",
+ "impl z { fn a (self: Foo, &myarg: i32) {} }",
];
for &src in srcs.iter() {
let spans = get_spans_of_pat_idents(src);
let Span{ lo, hi, .. } = spans[0];
- assert!("self" == &src[lo.to_uint()..hi.to_uint()],
+ assert!("self" == &src[lo.to_usize()..hi.to_usize()],
"\"{}\" != \"self\". src=\"{}\"",
- &src[lo.to_uint()..hi.to_uint()], src)
+ &src[lo.to_usize()..hi.to_usize()], src)
}
}
"use a `move ||` expression instead",
),
ObsoleteSyntax::ClosureType => (
- "`|uint| -> bool` closure type syntax",
+ "`|usize| -> bool` closure type syntax",
"use unboxed closures instead, no type annotation needed"
),
ObsoleteSyntax::Sized => (
/// the previous token or None (only stashed sometimes).
pub last_token: Option<Box<token::Token>>,
pub buffer: [TokenAndSpan; 4],
- pub buffer_start: int,
- pub buffer_end: int,
- pub tokens_consumed: uint,
+ pub buffer_start: isize,
+ pub buffer_end: isize,
+ pub tokens_consumed: usize,
pub restrictions: Restrictions,
- pub quote_depth: uint, // not (yet) related to the quasiquoter
+ pub quote_depth: usize, // not (yet) related to the quasiquoter
pub reader: Box<Reader+'a>,
pub interner: Rc<token::IdentInterner>,
/// The set of seen errors about obsolete syntax. Used to suppress
}
/// Convert the current token to a string using self's reader
- pub fn this_token_to_string(&mut self) -> String {
+ pub fn this_token_to_string(&self) -> String {
Parser::token_to_string(&self.token)
}
- pub fn unexpected_last(&mut self, t: &token::Token) -> ! {
+ pub fn unexpected_last(&self, t: &token::Token) -> ! {
let token_str = Parser::token_to_string(t);
let last_span = self.last_span;
self.span_fatal(last_span, &format!("unexpected token: `{}`",
token_str)[]);
}
- pub fn unexpected(&mut self) -> ! {
+ pub fn unexpected(&self) -> ! {
let this_token = self.this_token_to_string();
self.fatal(&format!("unexpected token: `{}`", this_token)[]);
}
}
}
- pub fn expect_no_suffix(&mut self, sp: Span, kind: &str, suffix: Option<ast::Name>) {
+ pub fn expect_no_suffix(&self, sp: Span, kind: &str, suffix: Option<ast::Name>) {
match suffix {
None => {/* everything ok */}
Some(suf) => {
// would encounter a `>` and stop. This lets the parser handle trailing
// commas in generic parameters, because it can stop either after
// parsing a type or after parsing a comma.
- for i in iter::count(0u, 1) {
+ for i in iter::count(0us, 1) {
if self.check(&token::Gt)
|| self.token == token::BinOp(token::Shr)
|| self.token == token::Ge
self.reader.real_token()
} else {
// Avoid token copies with `replace`.
- let buffer_start = self.buffer_start as uint;
- let next_index = (buffer_start + 1) & 3 as uint;
- self.buffer_start = next_index as int;
+ let buffer_start = self.buffer_start as usize;
+ let next_index = (buffer_start + 1) & 3 as usize;
+ self.buffer_start = next_index as isize;
let placeholder = TokenAndSpan {
tok: token::Underscore,
};
self.span = next.sp;
self.token = next.tok;
- self.tokens_consumed += 1u;
+ self.tokens_consumed += 1us;
self.expected_tokens.clear();
// check after each token
self.check_unknown_macro_variable();
self.token = next;
self.span = mk_sp(lo, hi);
}
- pub fn buffer_length(&mut self) -> int {
+ pub fn buffer_length(&mut self) -> isize {
if self.buffer_start <= self.buffer_end {
return self.buffer_end - self.buffer_start;
}
return (4 - self.buffer_start) + self.buffer_end;
}
- pub fn look_ahead<R, F>(&mut self, distance: uint, f: F) -> R where
+ pub fn look_ahead<R, F>(&mut self, distance: usize, f: F) -> R where
F: FnOnce(&token::Token) -> R,
{
- let dist = distance as int;
+ let dist = distance as isize;
while self.buffer_length() < dist {
- self.buffer[self.buffer_end as uint] = self.reader.real_token();
+ self.buffer[self.buffer_end as usize] = self.reader.real_token();
self.buffer_end = (self.buffer_end + 1) & 3;
}
- f(&self.buffer[((self.buffer_start + dist - 1) & 3) as uint].tok)
+ f(&self.buffer[((self.buffer_start + dist - 1) & 3) as usize].tok)
}
- pub fn fatal(&mut self, m: &str) -> ! {
+ pub fn fatal(&self, m: &str) -> ! {
self.sess.span_diagnostic.span_fatal(self.span, m)
}
- pub fn span_fatal(&mut self, sp: Span, m: &str) -> ! {
+ pub fn span_fatal(&self, sp: Span, m: &str) -> ! {
self.sess.span_diagnostic.span_fatal(sp, m)
}
- pub fn span_fatal_help(&mut self, sp: Span, m: &str, help: &str) -> ! {
+ pub fn span_fatal_help(&self, sp: Span, m: &str, help: &str) -> ! {
self.span_err(sp, m);
self.span_help(sp, help);
panic!(diagnostic::FatalError);
}
- pub fn span_note(&mut self, sp: Span, m: &str) {
+ pub fn span_note(&self, sp: Span, m: &str) {
self.sess.span_diagnostic.span_note(sp, m)
}
- pub fn span_help(&mut self, sp: Span, m: &str) {
+ pub fn span_help(&self, sp: Span, m: &str) {
self.sess.span_diagnostic.span_help(sp, m)
}
- pub fn bug(&mut self, m: &str) -> ! {
+ pub fn bug(&self, m: &str) -> ! {
self.sess.span_diagnostic.span_bug(self.span, m)
}
- pub fn warn(&mut self, m: &str) {
+ pub fn warn(&self, m: &str) {
self.sess.span_diagnostic.span_warn(self.span, m)
}
- pub fn span_warn(&mut self, sp: Span, m: &str) {
+ pub fn span_warn(&self, sp: Span, m: &str) {
self.sess.span_diagnostic.span_warn(sp, m)
}
- pub fn span_err(&mut self, sp: Span, m: &str) {
+ pub fn span_err(&self, sp: Span, m: &str) {
self.sess.span_diagnostic.span_err(sp, m)
}
- pub fn span_bug(&mut self, sp: Span, m: &str) -> ! {
+ pub fn span_bug(&self, sp: Span, m: &str) -> ! {
self.sess.span_diagnostic.span_bug(sp, m)
}
- pub fn abort_if_errors(&mut self) {
+ pub fn abort_if_errors(&self) {
self.sess.span_diagnostic.handler().abort_if_errors();
}
self.expect(&token::OpenDelim(token::Bracket));
let t = self.parse_ty_sum();
- // Parse the `; e` in `[ int; e ]`
+ // Parse the `; e` in `[ i32; e ]`
// where `e` is a const expression
let t = match self.maybe_parse_fixed_length_of_vec() {
None => TyVec(t),
}
/// Matches token_lit = LIT_INTEGER | ...
- pub fn lit_from_token(&mut self, tok: &token::Token) -> Lit_ {
+ pub fn lit_from_token(&self, tok: &token::Token) -> Lit_ {
match *tok {
token::Interpolated(token::NtExpr(ref v)) => {
match v.node {
ExprField(expr, ident)
}
- pub fn mk_tup_field(&mut self, expr: P<Expr>, idx: codemap::Spanned<uint>) -> ast::Expr_ {
+ pub fn mk_tup_field(&mut self, expr: P<Expr>, idx: codemap::Spanned<usize>) -> ast::Expr_ {
ExprTupField(expr, idx)
}
hi = self.span.hi;
self.bump();
- let index = n.as_str().parse::<uint>();
+ let index = n.as_str().parse::<usize>();
match index {
Some(n) => {
let id = spanned(dot, hi, n);
};
self.span_help(last_span,
&format!("try parenthesizing the first index; e.g., `(foo.{}){}`",
- float.trunc() as uint,
+ float.trunc() as usize,
&float.fract().to_string()[1..])[]);
}
self.abort_if_errors();
}
pub fn check_unknown_macro_variable(&mut self) {
- if self.quote_depth == 0u {
+ if self.quote_depth == 0us {
match self.token {
token::SubstNt(name, _) =>
self.fatal(&format!("unknown macro variable `{}`",
token_str)[])
},
/* we ought to allow different depths of unquotation */
- token::Dollar | token::SubstNt(..) if p.quote_depth > 0u => {
+ token::Dollar | token::SubstNt(..) if p.quote_depth > 0us => {
p.parse_unquoted()
}
_ => {
}
/// Parse an expression of binops of at least min_prec precedence
- pub fn parse_more_binops(&mut self, lhs: P<Expr>, min_prec: uint) -> P<Expr> {
+ pub fn parse_more_binops(&mut self, lhs: P<Expr>, min_prec: usize) -> P<Expr> {
if self.expr_is_complete(&*lhs) { return lhs; }
// Prevent dynamic borrow errors later on by limiting the
"Chained comparison operators require parentheses");
if op == BiLt && outer_op == BiGt {
self.span_help(op_span,
- "Use ::< instead of < if you meant to specify type arguments.");
+ "use ::< instead of < if you meant to specify type arguments");
}
}
_ => {}
Some(attrs))
}
- /// Parse a::B<String,int>
+ /// Parse a::B<String,i32>
fn parse_trait_ref(&mut self) -> TraitRef {
ast::TraitRef {
path: self.parse_path(LifetimeAndTypesWithoutColons),
}
}
- /// Parse for<'l> a::B<String,int>
+ /// Parse for<'l> a::B<String,i32>
fn parse_poly_trait_ref(&mut self) -> PolyTraitRef {
let lifetime_defs = self.parse_late_bound_lifetime_defs();
}
}
- if first && attrs_remaining_len > 0u {
+ if first && attrs_remaining_len > 0us {
// We parsed attributes for the first item but didn't find it
let last_span = self.last_span;
self.span_err(last_span,
return IoviItem(item);
}
if self.token.is_keyword(keywords::Unsafe) &&
- self.look_ahead(1u, |t| t.is_keyword(keywords::Trait))
+ self.look_ahead(1us, |t| t.is_keyword(keywords::Trait))
{
// UNSAFE TRAIT ITEM
self.expect_keyword(keywords::Unsafe);
return IoviItem(item);
}
if self.token.is_keyword(keywords::Unsafe) &&
- self.look_ahead(1u, |t| t.is_keyword(keywords::Impl))
+ self.look_ahead(1us, |t| t.is_keyword(keywords::Impl))
{
// IMPL ITEM
self.expect_keyword(keywords::Unsafe);
return IoviItem(item);
}
if self.token.is_keyword(keywords::Unsafe)
- && self.look_ahead(1u, |t| *t != token::OpenDelim(token::Brace)) {
+ && self.look_ahead(1us, |t| *t != token::OpenDelim(token::Brace)) {
// UNSAFE FUNCTION ITEM
self.bump();
let abi = if self.eat_keyword(keywords::Extern) {
}
}
}
- let mut rename_to = path[path.len() - 1u];
+ let mut rename_to = path[path.len() - 1us];
let path = ast::Path {
span: mk_sp(lo, self.last_span.hi),
global: false,
Integer(ast::Name),
Float(ast::Name),
Str_(ast::Name),
- StrRaw(ast::Name, uint), /* raw str delimited by n hash symbols */
+ StrRaw(ast::Name, usize), /* raw str delimited by n hash symbols */
Binary(ast::Name),
- BinaryRaw(ast::Name, uint), /* raw binary str delimited by n hash symbols */
+ BinaryRaw(ast::Name, usize), /* raw binary str delimited by n hash symbols */
}
impl Lit {
NtTT(P<ast::TokenTree>), // needs P'ed to break a circularity
}
-impl fmt::Show for Nonterminal {
+impl fmt::Debug for Nonterminal {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
NtItem(..) => f.pad("NtItem(..)"),
}
}
-impl fmt::Show for InternedString {
+impl fmt::Debug for InternedString {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt(self, f)
+ fmt::Debug::fmt(&self.string[], f)
}
}
-impl fmt::String for InternedString {
+impl fmt::Display for InternedString {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "{}", &self.string[])
+ fmt::Display::fmt(&self.string[], f)
}
}
get_ident_interner().intern(s)
}
-/// gensym's a new uint, using the current interner.
+/// gensym's a new usize, using the current interner.
#[inline]
pub fn gensym(s: &str) -> ast::Name {
get_ident_interner().gensym(s)
// create a fresh mark.
pub fn fresh_mark() -> ast::Mrk {
- gensym("mark").uint() as u32
+ gensym("mark").usize() as u32
}
#[cfg(test)]
//!
//! In particular you'll see a certain amount of churn related to INTEGER vs.
//! CARDINAL in the Mesa implementation. Mesa apparently interconverts the two
-//! somewhat readily? In any case, I've used uint for indices-in-buffers and
+//! somewhat readily? In any case, I've used usize for indices-in-buffers and
//! ints for character-sizes-and-indentation-offsets. This respects the need
//! for ints to "go negative" while carrying a pending-calculation balance, and
//! helps differentiate all the numbers flying around internally (slightly).
#[derive(Clone, Copy)]
pub struct BreakToken {
- offset: int,
- blank_space: int
+ offset: isize,
+ blank_space: isize
}
#[derive(Clone, Copy)]
pub struct BeginToken {
- offset: int,
+ offset: isize,
breaks: Breaks
}
#[derive(Clone)]
pub enum Token {
- String(String, int),
+ String(String, isize),
Break(BreakToken),
Begin(BeginToken),
End,
}
pub fn buf_str(toks: &[Token],
- szs: &[int],
- left: uint,
- right: uint,
- lim: uint)
+ szs: &[isize],
+ left: usize,
+ right: usize,
+ lim: usize)
-> String {
let n = toks.len();
assert_eq!(n, szs.len());
let mut i = left;
let mut l = lim;
let mut s = string::String::from_str("[");
- while i != right && l != 0u {
- l -= 1u;
+ while i != right && l != 0us {
+ l -= 1us;
if i != left {
s.push_str(", ");
}
s.push_str(&format!("{}={}",
szs[i],
tok_str(&toks[i]))[]);
- i += 1u;
+ i += 1us;
i %= n;
}
s.push(']');
#[derive(Copy)]
pub struct PrintStackElem {
- offset: int,
+ offset: isize,
pbreak: PrintStackBreak
}
-static SIZE_INFINITY: int = 0xffff;
+static SIZE_INFINITY: isize = 0xffff;
-pub fn mk_printer(out: Box<io::Writer+'static>, linewidth: uint) -> Printer {
+pub fn mk_printer(out: Box<io::Writer+'static>, linewidth: usize) -> Printer {
// Yes 3, it makes the ring buffers big enough to never
// fall behind.
- let n: uint = 3 * linewidth;
+ let n: usize = 3 * linewidth;
debug!("mk_printer {}", linewidth);
let token: Vec<Token> = repeat(Token::Eof).take(n).collect();
- let size: Vec<int> = repeat(0i).take(n).collect();
- let scan_stack: Vec<uint> = repeat(0u).take(n).collect();
+ let size: Vec<isize> = repeat(0is).take(n).collect();
+ let scan_stack: Vec<usize> = repeat(0us).take(n).collect();
Printer {
out: out,
buf_len: n,
- margin: linewidth as int,
- space: linewidth as int,
+ margin: linewidth as isize,
+ space: linewidth as isize,
left: 0,
right: 0,
token: token,
/// called 'print'.
pub struct Printer {
pub out: Box<io::Writer+'static>,
- buf_len: uint,
+ buf_len: usize,
/// Width of lines we're constrained to
- margin: int,
+ margin: isize,
/// Number of spaces left on line
- space: int,
+ space: isize,
/// Index of left side of input stream
- left: uint,
+ left: usize,
/// Index of right side of input stream
- right: uint,
+ right: usize,
/// Ring-buffer stream goes through
token: Vec<Token> ,
/// Ring-buffer of calculated sizes
- size: Vec<int> ,
+ size: Vec<isize> ,
/// Running size of stream "...left"
- left_total: int,
+ left_total: isize,
/// Running size of stream "...right"
- right_total: int,
+ right_total: isize,
/// Pseudo-stack, really a ring too. Holds the
/// primary-ring-buffers index of the Begin that started the
/// current block, possibly with the most recent Break after that
/// Begin (if there is any) on top of it. Stuff is flushed off the
/// bottom as it becomes irrelevant due to the primary ring-buffer
/// advancing.
- scan_stack: Vec<uint> ,
+ scan_stack: Vec<usize> ,
/// Top==bottom disambiguator
scan_stack_empty: bool,
/// Index of top of scan_stack
- top: uint,
+ top: usize,
/// Index of bottom of scan_stack
- bottom: uint,
+ bottom: usize,
/// Stack of blocks-in-progress being flushed by print
print_stack: Vec<PrintStackElem> ,
/// Buffered indentation to avoid writing trailing whitespace
- pending_indentation: int,
+ pending_indentation: isize,
}
impl Printer {
if self.scan_stack_empty {
self.left_total = 1;
self.right_total = 1;
- self.left = 0u;
- self.right = 0u;
+ self.left = 0us;
+ self.right = 0us;
} else { self.advance_right(); }
debug!("pp Begin({})/buffer ~[{},{}]",
b.offset, self.left, self.right);
if self.scan_stack_empty {
self.left_total = 1;
self.right_total = 1;
- self.left = 0u;
- self.right = 0u;
+ self.left = 0us;
+ self.right = 0us;
} else { self.advance_right(); }
debug!("pp Break({})/buffer ~[{},{}]",
b.offset, self.left, self.right);
}
Ok(())
}
- pub fn scan_push(&mut self, x: uint) {
+ pub fn scan_push(&mut self, x: usize) {
debug!("scan_push {}", x);
if self.scan_stack_empty {
self.scan_stack_empty = false;
} else {
- self.top += 1u;
+ self.top += 1us;
self.top %= self.buf_len;
assert!((self.top != self.bottom));
}
self.scan_stack[self.top] = x;
}
- pub fn scan_pop(&mut self) -> uint {
+ pub fn scan_pop(&mut self) -> usize {
assert!((!self.scan_stack_empty));
let x = self.scan_stack[self.top];
if self.top == self.bottom {
self.scan_stack_empty = true;
} else {
- self.top += self.buf_len - 1u; self.top %= self.buf_len;
+ self.top += self.buf_len - 1us; self.top %= self.buf_len;
}
return x;
}
- pub fn scan_top(&mut self) -> uint {
+ pub fn scan_top(&mut self) -> usize {
assert!((!self.scan_stack_empty));
return self.scan_stack[self.top];
}
- pub fn scan_pop_bottom(&mut self) -> uint {
+ pub fn scan_pop_bottom(&mut self) -> usize {
assert!((!self.scan_stack_empty));
let x = self.scan_stack[self.bottom];
if self.top == self.bottom {
self.scan_stack_empty = true;
} else {
- self.bottom += 1u; self.bottom %= self.buf_len;
+ self.bottom += 1us; self.bottom %= self.buf_len;
}
return x;
}
pub fn advance_right(&mut self) {
- self.right += 1u;
+ self.right += 1us;
self.right %= self.buf_len;
assert!((self.right != self.left));
}
break;
}
- self.left += 1u;
+ self.left += 1us;
self.left %= self.buf_len;
left_size = self.size[self.left];
Ok(())
}
- pub fn check_stack(&mut self, k: int) {
+ pub fn check_stack(&mut self, k: isize) {
if !self.scan_stack_empty {
let x = self.scan_top();
match self.token[x] {
}
}
}
- pub fn print_newline(&mut self, amount: int) -> io::IoResult<()> {
+ pub fn print_newline(&mut self, amount: isize) -> io::IoResult<()> {
debug!("NEWLINE {}", amount);
let ret = write!(self.out, "\n");
self.pending_indentation = 0;
self.indent(amount);
return ret;
}
- pub fn indent(&mut self, amount: int) {
+ pub fn indent(&mut self, amount: isize) {
debug!("INDENT {}", amount);
self.pending_indentation += amount;
}
pub fn get_top(&mut self) -> PrintStackElem {
let print_stack = &mut self.print_stack;
let n = print_stack.len();
- if n != 0u {
+ if n != 0us {
(*print_stack)[n - 1]
} else {
PrintStackElem {
}
write!(self.out, "{}", s)
}
- pub fn print(&mut self, token: Token, l: int) -> io::IoResult<()> {
+ pub fn print(&mut self, token: Token, l: isize) -> io::IoResult<()> {
debug!("print {} {} (remaining line space={})", tok_str(&token), l,
self.space);
debug!("{}", buf_str(&self.token[],
Token::End => {
debug!("print End -> pop End");
let print_stack = &mut self.print_stack;
- assert!((print_stack.len() != 0u));
+ assert!((print_stack.len() != 0us));
print_stack.pop().unwrap();
Ok(())
}
// Convenience functions to talk to the printer.
//
// "raw box"
-pub fn rbox(p: &mut Printer, indent: uint, b: Breaks) -> io::IoResult<()> {
+pub fn rbox(p: &mut Printer, indent: usize, b: Breaks) -> io::IoResult<()> {
p.pretty_print(Token::Begin(BeginToken {
- offset: indent as int,
+ offset: indent as isize,
breaks: b
}))
}
-pub fn ibox(p: &mut Printer, indent: uint) -> io::IoResult<()> {
+pub fn ibox(p: &mut Printer, indent: usize) -> io::IoResult<()> {
rbox(p, indent, Breaks::Inconsistent)
}
-pub fn cbox(p: &mut Printer, indent: uint) -> io::IoResult<()> {
+pub fn cbox(p: &mut Printer, indent: usize) -> io::IoResult<()> {
rbox(p, indent, Breaks::Consistent)
}
-pub fn break_offset(p: &mut Printer, n: uint, off: int) -> io::IoResult<()> {
+pub fn break_offset(p: &mut Printer, n: usize, off: isize) -> io::IoResult<()> {
p.pretty_print(Token::Break(BreakToken {
offset: off,
- blank_space: n as int
+ blank_space: n as isize
}))
}
}
pub fn word(p: &mut Printer, wrd: &str) -> io::IoResult<()> {
- p.pretty_print(Token::String(/* bad */ wrd.to_string(), wrd.len() as int))
+ p.pretty_print(Token::String(/* bad */ wrd.to_string(), wrd.len() as isize))
}
pub fn huge_word(p: &mut Printer, wrd: &str) -> io::IoResult<()> {
p.pretty_print(Token::String(/* bad */ wrd.to_string(), 0))
}
-pub fn spaces(p: &mut Printer, n: uint) -> io::IoResult<()> {
+pub fn spaces(p: &mut Printer, n: usize) -> io::IoResult<()> {
break_offset(p, n, 0)
}
pub fn zerobreak(p: &mut Printer) -> io::IoResult<()> {
- spaces(p, 0u)
+ spaces(p, 0us)
}
pub fn space(p: &mut Printer) -> io::IoResult<()> {
- spaces(p, 1u)
+ spaces(p, 1us)
}
pub fn hardbreak(p: &mut Printer) -> io::IoResult<()> {
- spaces(p, SIZE_INFINITY as uint)
+ spaces(p, SIZE_INFINITY as usize)
}
-pub fn hardbreak_tok_offset(off: int) -> Token {
+pub fn hardbreak_tok_offset(off: isize) -> Token {
Token::Break(BreakToken {offset: off, blank_space: SIZE_INFINITY})
}
#[derive(Copy)]
pub struct CurrentCommentAndLiteral {
- cur_cmnt: uint,
- cur_lit: uint,
+ cur_cmnt: usize,
+ cur_lit: usize,
}
pub struct State<'a> {
}
#[allow(non_upper_case_globals)]
-pub const indent_unit: uint = 4u;
+pub const indent_unit: usize = 4us;
#[allow(non_upper_case_globals)]
-pub const default_columns: uint = 78u;
+pub const default_columns: usize = 78us;
/// Requires you to pass an input filename and reader so that
/// it can scan the input text for comments and literals to
// containing cbox, will be closed by print-block at }
try!(s.cbox(indent_unit));
// head-ibox, will be closed by print-block after {
- try!(s.ibox(0u));
+ try!(s.ibox(0us));
s.print_block(blk)
})
}
}
impl<'a> State<'a> {
- pub fn ibox(&mut self, u: uint) -> IoResult<()> {
+ pub fn ibox(&mut self, u: usize) -> IoResult<()> {
self.boxes.push(pp::Breaks::Inconsistent);
pp::ibox(&mut self.s, u)
}
pp::end(&mut self.s)
}
- pub fn cbox(&mut self, u: uint) -> IoResult<()> {
+ pub fn cbox(&mut self, u: usize) -> IoResult<()> {
self.boxes.push(pp::Breaks::Consistent);
pp::cbox(&mut self.s, u)
}
// "raw box"
- pub fn rbox(&mut self, u: uint, b: pp::Breaks) -> IoResult<()> {
+ pub fn rbox(&mut self, u: usize, b: pp::Breaks) -> IoResult<()> {
self.boxes.push(b);
pp::rbox(&mut self.s, u, b)
}
}
pub fn bclose_(&mut self, span: codemap::Span,
- indented: uint) -> IoResult<()> {
+ indented: usize) -> IoResult<()> {
self.bclose_maybe_open(span, indented, true)
}
pub fn bclose_maybe_open (&mut self, span: codemap::Span,
- indented: uint, close_box: bool) -> IoResult<()> {
+ indented: usize, close_box: bool) -> IoResult<()> {
try!(self.maybe_print_comment(span.hi));
- try!(self.break_offset_if_not_bol(1u, -(indented as int)));
+ try!(self.break_offset_if_not_bol(1us, -(indented as isize)));
try!(word(&mut self.s, "}"));
if close_box {
try!(self.end()); // close the outer-box
if !self.is_bol() { try!(space(&mut self.s)); }
Ok(())
}
- pub fn break_offset_if_not_bol(&mut self, n: uint,
- off: int) -> IoResult<()> {
+ pub fn break_offset_if_not_bol(&mut self, n: usize,
+ off: isize) -> IoResult<()> {
if !self.is_bol() {
break_offset(&mut self.s, n, off)
} else {
pub fn commasep<T, F>(&mut self, b: Breaks, elts: &[T], mut op: F) -> IoResult<()> where
F: FnMut(&mut State, &T) -> IoResult<()>,
{
- try!(self.rbox(0u, b));
+ try!(self.rbox(0us, b));
let mut first = true;
for elt in elts.iter() {
if first { first = false; } else { try!(self.word_space(",")); }
F: FnMut(&mut State, &T) -> IoResult<()>,
G: FnMut(&T) -> codemap::Span,
{
- try!(self.rbox(0u, b));
+ try!(self.rbox(0us, b));
let len = elts.len();
- let mut i = 0u;
+ let mut i = 0us;
for elt in elts.iter() {
try!(self.maybe_print_comment(get_span(elt).hi));
try!(op(self, elt));
- i += 1u;
+ i += 1us;
if i < len {
try!(word(&mut self.s, ","));
try!(self.maybe_print_trailing_comment(get_span(elt),
pub fn print_type(&mut self, ty: &ast::Ty) -> IoResult<()> {
try!(self.maybe_print_comment(ty.span.lo));
- try!(self.ibox(0u));
+ try!(self.ibox(0us));
match ty.node {
ast::TyVec(ref ty) => {
try!(word(&mut self.s, "["));
}
ast::ItemTy(ref ty, ref params) => {
try!(self.ibox(indent_unit));
- try!(self.ibox(0u));
+ try!(self.ibox(0us));
try!(self.word_nbsp(&visibility_qualified(item.vis, "type")[]));
try!(self.print_ident(item.ident));
try!(self.print_generics(params));
pub fn print_outer_attributes(&mut self,
attrs: &[ast::Attribute]) -> IoResult<()> {
- let mut count = 0u;
+ let mut count = 0us;
for attr in attrs.iter() {
match attr.node.style {
ast::AttrOuter => {
pub fn print_inner_attributes(&mut self,
attrs: &[ast::Attribute]) -> IoResult<()> {
- let mut count = 0u;
+ let mut count = 0us;
for attr in attrs.iter() {
match attr.node.style {
ast::AttrInner => {
}
pub fn print_block_unclosed_indent(&mut self, blk: &ast::Block,
- indented: uint) -> IoResult<()> {
+ indented: usize) -> IoResult<()> {
self.print_block_maybe_unclosed(blk, indented, &[], false)
}
pub fn print_block_maybe_unclosed(&mut self,
blk: &ast::Block,
- indented: uint,
+ indented: usize,
attrs: &[ast::Attribute],
close_box: bool) -> IoResult<()> {
match blk.rules {
match _else.node {
// "another else-if"
ast::ExprIf(ref i, ref then, ref e) => {
- try!(self.cbox(indent_unit - 1u));
- try!(self.ibox(0u));
+ try!(self.cbox(indent_unit - 1us));
+ try!(self.ibox(0us));
try!(word(&mut self.s, " else if "));
try!(self.print_expr(&**i));
try!(space(&mut self.s));
}
// "another else-if-let"
ast::ExprIfLet(ref pat, ref expr, ref then, ref e) => {
- try!(self.cbox(indent_unit - 1u));
- try!(self.ibox(0u));
+ try!(self.cbox(indent_unit - 1us));
+ try!(self.ibox(0us));
try!(word(&mut self.s, " else if let "));
try!(self.print_pat(&**pat));
try!(space(&mut self.s));
}
// "final else"
ast::ExprBlock(ref b) => {
- try!(self.cbox(indent_unit - 1u));
- try!(self.ibox(0u));
+ try!(self.cbox(indent_unit - 1us));
+ try!(self.ibox(0us));
try!(word(&mut self.s, " else "));
self.print_block(&**b)
}
try!(self.print_expr(&*args[0]));
try!(word(&mut self.s, "."));
try!(self.print_ident(ident.node));
- if tys.len() > 0u {
+ if tys.len() > 0us {
try!(word(&mut self.s, "::<"));
try!(self.commasep(Inconsistent, tys,
|s, ty| s.print_type(&**ty)));
// containing cbox, will be closed by print-block at }
try!(self.cbox(indent_unit));
// head-box, will be closed by print-block after {
- try!(self.ibox(0u));
+ try!(self.ibox(0us));
try!(self.print_block(&**blk));
}
ast::ExprAssign(ref lhs, ref rhs) => {
ast::ExprTupField(ref expr, id) => {
try!(self.print_expr(&**expr));
try!(word(&mut self.s, "."));
- try!(self.print_uint(id.node));
+ try!(self.print_usize(id.node));
}
ast::ExprIndex(ref expr, ref index) => {
try!(self.print_expr(&**expr));
self.ann.post(self, NodeIdent(&ident))
}
- pub fn print_uint(&mut self, i: uint) -> IoResult<()> {
+ pub fn print_usize(&mut self, i: usize) -> IoResult<()> {
word(&mut self.s, &i.to_string()[])
}
},
|f| f.node.pat.span));
if etc {
- if fields.len() != 0u { try!(self.word_space(",")); }
+ if fields.len() != 0us { try!(self.word_space(",")); }
try!(word(&mut self.s, ".."));
}
try!(space(&mut self.s));
try!(space(&mut self.s));
}
try!(self.cbox(indent_unit));
- try!(self.ibox(0u));
+ try!(self.ibox(0us));
try!(self.print_outer_attributes(&arm.attrs[]));
let mut first = true;
for p in arm.pats.iter() {
-> IoResult<()> {
// It is unfortunate to duplicate the commasep logic, but we want the
// self type and the args all in the same box.
- try!(self.rbox(0u, Inconsistent));
+ try!(self.rbox(0us, Inconsistent));
let mut first = true;
for &explicit_self in opt_explicit_self.iter() {
let m = match explicit_self {
try!(word(&mut self.s, "<"));
let mut ints = Vec::new();
- for i in range(0u, total) {
+ for i in range(0us, total) {
ints.push(i);
}
if span.hi < (*cmnt).pos && (*cmnt).pos < next &&
span_line.line == comment_line.line {
try!(self.print_comment(cmnt));
- self.cur_cmnt_and_lit.cur_cmnt += 1u;
+ self.cur_cmnt_and_lit.cur_cmnt += 1us;
}
}
_ => ()
match self.next_comment() {
Some(ref cmnt) => {
try!(self.print_comment(cmnt));
- self.cur_cmnt_and_lit.cur_cmnt += 1u;
+ self.cur_cmnt_and_lit.cur_cmnt += 1us;
}
_ => break
}
while self.cur_cmnt_and_lit.cur_lit < lits.len() {
let ltrl = (*lits)[self.cur_cmnt_and_lit.cur_lit].clone();
if ltrl.pos > pos { return None; }
- self.cur_cmnt_and_lit.cur_lit += 1u;
+ self.cur_cmnt_and_lit.cur_lit += 1us;
if ltrl.pos == pos { return Some(ltrl); }
}
None
Some(ref cmnt) => {
if (*cmnt).pos < pos {
try!(self.print_comment(cmnt));
- self.cur_cmnt_and_lit.cur_cmnt += 1u;
+ self.cur_cmnt_and_lit.cur_cmnt += 1us;
} else { break; }
}
_ => break
cmnt: &comments::Comment) -> IoResult<()> {
match cmnt.style {
comments::Mixed => {
- assert_eq!(cmnt.lines.len(), 1u);
+ assert_eq!(cmnt.lines.len(), 1us);
try!(zerobreak(&mut self.s));
try!(word(&mut self.s, &cmnt.lines[0][]));
zerobreak(&mut self.s)
}
comments::Trailing => {
try!(word(&mut self.s, " "));
- if cmnt.lines.len() == 1u {
+ if cmnt.lines.len() == 1us {
try!(word(&mut self.s, &cmnt.lines[0][]));
hardbreak(&mut self.s)
} else {
- try!(self.ibox(0u));
+ try!(self.ibox(0us));
for line in cmnt.lines.iter() {
if !line.is_empty() {
try!(word(&mut self.s, &line[]));
}
}
-fn repeat(s: &str, n: uint) -> String { iter::repeat(s).take(n).collect() }
+fn repeat(s: &str, n: usize) -> String { iter::repeat(s).take(n).collect() }
#[cfg(test)]
mod test {
//! implementation changes (using a special thread-local heap, for example).
//! Moreover, a switch to, e.g. `P<'a, T>` would be easy and mostly automated.
-use std::fmt::{self, Show};
+use std::fmt::{self, Display, Debug};
use std::hash::{Hash, Hasher};
use std::ops::Deref;
use std::ptr;
impl<T: Eq> Eq for P<T> {}
-impl<T: Show> Show for P<T> {
+impl<T: Debug> Debug for P<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- (**self).fmt(f)
+ Debug::fmt(&**self, f)
+ }
+}
+impl<T: Display> Display for P<T> {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ Display::fmt(&**self, f)
}
}
let tparm_cnt = generics.ty_params.len();
// NB: inadequate check, but we're running
// well before resolve, can't get too deep.
- input_cnt == 1u
- && no_output && tparm_cnt == 0u
+ input_cnt == 1us
+ && no_output && tparm_cnt == 0us
}
_ => false
}
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-//! An "interner" is a data structure that associates values with uint tags and
+//! An "interner" is a data structure that associates values with usize tags and
//! allows bidirectional lookup; i.e. given a value, one can easily find the
//! type, and vice versa.
pub fn get(&self, idx: Name) -> T {
let vect = self.vect.borrow();
- (*vect)[idx.uint()].clone()
+ (*vect)[idx.usize()].clone()
}
- pub fn len(&self) -> uint {
+ pub fn len(&self) -> usize {
let vect = self.vect.borrow();
(*vect).len()
}
}
}
-impl fmt::Show for RcStr {
+impl fmt::Debug for RcStr {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- use std::fmt::Show;
+ use std::fmt::Debug;
+ self[].fmt(f)
+ }
+}
+
+impl fmt::Display for RcStr {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ use std::fmt::Display;
self[].fmt(f)
}
}
let new_idx = Name(self.len() as u32);
// leave out of map to avoid colliding
let mut vect = self.vect.borrow_mut();
- let existing = (*vect)[idx.uint()].clone();
+ let existing = (*vect)[idx.usize()].clone();
vect.push(existing);
new_idx
}
pub fn get(&self, idx: Name) -> RcStr {
- (*self.vect.borrow())[idx.uint()].clone()
+ (*self.vect.borrow())[idx.usize()].clone()
}
- pub fn len(&self) -> uint {
+ pub fn len(&self) -> usize {
self.vect.borrow().len()
}
}
}
-/// Given a string and an index, return the first uint >= idx
+/// Given a string and an index, return the first usize >= idx
/// that is a non-ws-char or is outside of the legal range of
/// the string.
-fn scan_for_non_ws_or_end(a : &str, idx: uint) -> uint {
+fn scan_for_non_ws_or_end(a : &str, idx: usize) -> usize {
let mut i = idx;
let len = a.len();
while (i < len) && (is_whitespace(a.char_at(i))) {
}
}
- pub fn get<'a>(&'a self, idx: uint) -> &'a T {
+ pub fn get<'a>(&'a self, idx: usize) -> &'a T {
match self.repr {
One(ref v) if idx == 0 => v,
Many(ref vs) => &vs[idx],
IntoIter { repr: repr }
}
- pub fn len(&self) -> uint {
+ pub fn len(&self) -> usize {
match self.repr {
Zero => 0,
One(..) => 1,
}
}
- fn size_hint(&self) -> (uint, Option<uint>) {
+ fn size_hint(&self) -> (usize, Option<usize>) {
match self.repr {
ZeroIterator => (0, Some(0)),
OneIterator(..) => (1, Some(1)),
#[test]
fn test_len() {
- let v: SmallVector<int> = SmallVector::zero();
+ let v: SmallVector<isize> = SmallVector::zero();
assert_eq!(0, v.len());
- assert_eq!(1, SmallVector::one(1i).len());
- assert_eq!(5, SmallVector::many(vec!(1i, 2, 3, 4, 5)).len());
+ assert_eq!(1, SmallVector::one(1is).len());
+ assert_eq!(5, SmallVector::many(vec!(1is, 2, 3, 4, 5)).len());
}
#[test]
fn test_push_get() {
let mut v = SmallVector::zero();
- v.push(1i);
+ v.push(1is);
assert_eq!(1, v.len());
assert_eq!(&1, v.get(0));
v.push(2);
#[test]
fn test_from_iter() {
- let v: SmallVector<int> = (vec!(1i, 2, 3)).into_iter().collect();
+ let v: SmallVector<isize> = (vec![1is, 2, 3]).into_iter().collect();
assert_eq!(3, v.len());
assert_eq!(&1, v.get(0));
assert_eq!(&2, v.get(1));
#[test]
fn test_move_iter() {
let v = SmallVector::zero();
- let v: Vec<int> = v.into_iter().collect();
+ let v: Vec<isize> = v.into_iter().collect();
assert_eq!(Vec::new(), v);
- let v = SmallVector::one(1i);
- assert_eq!(vec!(1i), v.into_iter().collect::<Vec<_>>());
+ let v = SmallVector::one(1is);
+ assert_eq!(vec!(1is), v.into_iter().collect::<Vec<_>>());
- let v = SmallVector::many(vec!(1i, 2i, 3i));
- assert_eq!(vec!(1i, 2i, 3i), v.into_iter().collect::<Vec<_>>());
+ let v = SmallVector::many(vec!(1is, 2is, 3is));
+ assert_eq!(vec!(1is, 2is, 3is), v.into_iter().collect::<Vec<_>>());
}
#[test]
#[should_fail]
fn test_expect_one_zero() {
- let _: int = SmallVector::zero().expect_one("");
+ let _: isize = SmallVector::zero().expect_one("");
}
#[test]
#[should_fail]
fn test_expect_one_many() {
- SmallVector::many(vec!(1i, 2)).expect_one("");
+ SmallVector::many(vec!(1is, 2)).expect_one("");
}
#[test]
fn test_expect_one_one() {
- assert_eq!(1i, SmallVector::one(1i).expect_one(""));
- assert_eq!(1i, SmallVector::many(vec!(1i)).expect_one(""));
+ assert_eq!(1is, SmallVector::one(1is).expect_one(""));
+ assert_eq!(1is, SmallVector::many(vec!(1is)).expect_one(""));
}
}
let mut file = entry.unwrap();
let ti = parse(&mut file, false);
if ti.is_err() {
- debug!("error parsing terminfo entry: {:?}", ti.unwrap_err());
+ debug!("error parsing terminfo entry: {:?}", ti.err().unwrap());
return None;
}
};
let res = get_res("%p1", cap, &[p], vars);
assert!(res.is_ok(),
- "Op {} failed with 1 stack entry: {}", cap, res.unwrap_err());
+ "Op {} failed with 1 stack entry: {}", cap, res.err().unwrap());
}
let caps = ["%+", "%-", "%*", "%/", "%m", "%&", "%|", "%A", "%O"];
for &cap in caps.iter() {
"Binop {} succeeded incorrectly with 1 stack entry", cap);
let res = get_res("%{1}%{2}", cap, &[], vars);
assert!(res.is_ok(),
- "Binop {} failed with 2 stack entries: {:?}", cap, res.unwrap_err());
+ "Binop {} failed with 2 stack entries: {:?}", cap, res.err().unwrap());
}
}
for &(op, bs) in v.iter() {
let s = format!("%{{1}}%{{2}}%{}%d", op);
let res = expand(s.as_bytes(), &[], &mut Variables::new());
- assert!(res.is_ok(), res.unwrap_err());
+ assert!(res.is_ok(), res.err().unwrap());
assert_eq!(res.unwrap(), vec!(b'0' + bs[0]));
let s = format!("%{{1}}%{{1}}%{}%d", op);
let res = expand(s.as_bytes(), &[], &mut Variables::new());
- assert!(res.is_ok(), res.unwrap_err());
+ assert!(res.is_ok(), res.err().unwrap());
assert_eq!(res.unwrap(), vec!(b'0' + bs[1]));
let s = format!("%{{2}}%{{1}}%{}%d", op);
let res = expand(s.as_bytes(), &[], &mut Variables::new());
- assert!(res.is_ok(), res.unwrap_err());
+ assert!(res.is_ok(), res.err().unwrap());
assert_eq!(res.unwrap(), vec!(b'0' + bs[2]));
}
}
let mut vars = Variables::new();
let s = b"\\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m";
let res = expand(s, &[Number(1)], &mut vars);
- assert!(res.is_ok(), res.unwrap_err());
+ assert!(res.is_ok(), res.err().unwrap());
assert_eq!(res.unwrap(),
"\\E[31m".bytes().collect::<Vec<_>>());
let res = expand(s, &[Number(8)], &mut vars);
- assert!(res.is_ok(), res.unwrap_err());
+ assert!(res.is_ok(), res.err().unwrap());
assert_eq!(res.unwrap(),
"\\E[90m".bytes().collect::<Vec<_>>());
let res = expand(s, &[Number(42)], &mut vars);
- assert!(res.is_ok(), res.unwrap_err());
+ assert!(res.is_ok(), res.err().unwrap());
assert_eq!(res.unwrap(),
"\\E[38;5;42m".bytes().collect::<Vec<_>>());
}
// Find the offset of the NUL we want to go to
- let nulpos = string_table[(offset as uint) .. (string_table_bytes as uint)]
+ let nulpos = string_table[offset as uint .. string_table_bytes as uint]
.iter().position(|&b| b == 0);
match nulpos {
Some(len) => {
string_map.insert(name.to_string(),
- string_table[(offset as uint) ..
+ string_table[offset as uint ..
(offset as uint + len)].to_vec())
},
None => {
extern crate term;
pub use self::TestFn::*;
-pub use self::MetricChange::*;
pub use self::ColorConfig::*;
pub use self::TestResult::*;
pub use self::TestName::*;
use std::any::Any;
use std::cmp;
use std::collections::BTreeMap;
-use std::f64;
-use std::fmt::Show;
use std::fmt;
use std::io::fs::PathExtensions;
use std::io::stdio::StdWriter;
pub mod test {
pub use {Bencher, TestName, TestResult, TestDesc,
TestDescAndFn, TestOpts, TrFailed, TrIgnored, TrOk,
- Metric, MetricMap, MetricAdded, MetricRemoved,
- MetricChange, Improvement, Regression, LikelyNoise,
+ Metric, MetricMap,
StaticTestFn, StaticTestName, DynTestName, DynTestFn,
run_test, test_main, test_main_static, filter_tests,
parse_opts, StaticBenchFn, ShouldFail};
}
}
}
-impl fmt::String for TestName {
+impl fmt::Display for TestName {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- fmt::String::fmt(self.as_slice(), f)
+ fmt::Display::fmt(self.as_slice(), f)
}
}
}
}
-impl fmt::Show for TestFn {
+impl fmt::Debug for TestFn {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str(match *self {
StaticTestFn(..) => "StaticTestFn(..)",
}
}
-/// Analysis of a single change in metric
-#[derive(Copy, PartialEq, Show)]
-pub enum MetricChange {
- LikelyNoise,
- MetricAdded,
- MetricRemoved,
- Improvement(f64),
- Regression(f64)
-}
-
-pub type MetricDiff = BTreeMap<String,MetricChange>;
-
// The default console test runner. It accepts the command line
// arguments and a vector of test_descs.
pub fn test_main(args: &[String], tests: Vec<TestDescAndFn> ) {
pub run_ignored: bool,
pub run_tests: bool,
pub run_benchmarks: bool,
- pub ratchet_metrics: Option<Path>,
- pub ratchet_noise_percent: Option<f64>,
- pub save_metrics: Option<Path>,
- pub test_shard: Option<(uint,uint)>,
pub logfile: Option<Path>,
pub nocapture: bool,
pub color: ColorConfig,
- pub show_boxplot: bool,
- pub boxplot_width: uint,
- pub show_all_stats: bool,
}
impl TestOpts {
run_ignored: false,
run_tests: false,
run_benchmarks: false,
- ratchet_metrics: None,
- ratchet_noise_percent: None,
- save_metrics: None,
- test_shard: None,
logfile: None,
nocapture: false,
color: AutoColor,
- show_boxplot: false,
- boxplot_width: 50,
- show_all_stats: false,
}
}
}
getopts::optflag("", "test", "Run tests and not benchmarks"),
getopts::optflag("", "bench", "Run benchmarks instead of tests"),
getopts::optflag("h", "help", "Display this message (longer with --help)"),
- getopts::optopt("", "save-metrics", "Location to save bench metrics",
- "PATH"),
- getopts::optopt("", "ratchet-metrics",
- "Location to load and save metrics from. The metrics \
- loaded are cause benchmarks to fail if they run too \
- slowly", "PATH"),
- getopts::optopt("", "ratchet-noise-percent",
- "Tests within N% of the recorded metrics will be \
- considered as passing", "PERCENTAGE"),
getopts::optopt("", "logfile", "Write logs to the specified file instead \
of stdout", "PATH"),
- getopts::optopt("", "test-shard", "run shard A, of B shards, worth of the testsuite",
- "A.B"),
getopts::optflag("", "nocapture", "don't capture stdout/stderr of each \
task, allow printing directly"),
getopts::optopt("", "color", "Configure coloring of output:
auto = colorize if stdout is a tty and tests are run on serially (default);
always = always colorize output;
- never = never colorize output;", "auto|always|never"),
- getopts::optflag("", "boxplot", "Display a boxplot of the benchmark statistics"),
- getopts::optopt("", "boxplot-width", "Set the boxplot width (default 50)", "WIDTH"),
- getopts::optflag("", "stats", "Display the benchmark min, max, and quartiles"))
+ never = never colorize output;", "auto|always|never"))
}
fn usage(binary: &str) {
let run_tests = ! run_benchmarks ||
matches.opt_present("test");
- let ratchet_metrics = matches.opt_str("ratchet-metrics");
- let ratchet_metrics = ratchet_metrics.map(|s| Path::new(s));
-
- let ratchet_noise_percent = matches.opt_str("ratchet-noise-percent");
- let ratchet_noise_percent =
- ratchet_noise_percent.map(|s| s.as_slice().parse::<f64>().unwrap());
-
- let save_metrics = matches.opt_str("save-metrics");
- let save_metrics = save_metrics.map(|s| Path::new(s));
-
- let test_shard = matches.opt_str("test-shard");
- let test_shard = opt_shard(test_shard);
-
let mut nocapture = matches.opt_present("nocapture");
if !nocapture {
nocapture = os::getenv("RUST_TEST_NOCAPTURE").is_some();
v))),
};
- let show_boxplot = matches.opt_present("boxplot");
- let boxplot_width = match matches.opt_str("boxplot-width") {
- Some(width) => {
- match FromStr::from_str(width.as_slice()) {
- Some(width) => width,
- None => {
- return Some(Err(format!("argument for --boxplot-width must be a uint")));
- }
- }
- }
- None => 50,
- };
-
- let show_all_stats = matches.opt_present("stats");
-
let test_opts = TestOpts {
filter: filter,
run_ignored: run_ignored,
run_tests: run_tests,
run_benchmarks: run_benchmarks,
- ratchet_metrics: ratchet_metrics,
- ratchet_noise_percent: ratchet_noise_percent,
- save_metrics: save_metrics,
- test_shard: test_shard,
logfile: logfile,
nocapture: nocapture,
color: color,
- show_boxplot: show_boxplot,
- boxplot_width: boxplot_width,
- show_all_stats: show_all_stats,
};
Some(Ok(test_opts))
}
-pub fn opt_shard(maybestr: Option<String>) -> Option<(uint,uint)> {
- match maybestr {
- None => None,
- Some(s) => {
- let mut it = s.split('.');
- match (it.next().and_then(|s| s.parse::<uint>()),
- it.next().and_then(|s| s.parse::<uint>()),
- it.next()) {
- (Some(a), Some(b), None) => {
- if a <= 0 || a > b {
- panic!("tried to run shard {a}.{b}, but {a} is out of bounds \
- (should be between 1 and {b}", a=a, b=b)
- }
- Some((a, b))
- }
- _ => None,
- }
- }
- }
-}
-
-
#[derive(Clone, PartialEq)]
pub struct BenchSamples {
ns_iter_summ: stats::Summary<f64>,
out: out,
log_out: log_out,
use_color: use_color(opts),
- show_boxplot: opts.show_boxplot,
- boxplot_width: opts.boxplot_width,
- show_all_stats: opts.show_all_stats,
+ show_boxplot: false,
+ boxplot_width: 50,
+ show_all_stats: false,
total: 0u,
passed: 0u,
failed: 0u,
self.write_pretty("bench", term::color::CYAN)
}
- pub fn write_added(&mut self) -> io::IoResult<()> {
- self.write_pretty("added", term::color::GREEN)
- }
-
- pub fn write_improved(&mut self) -> io::IoResult<()> {
- self.write_pretty("improved", term::color::GREEN)
- }
-
- pub fn write_removed(&mut self) -> io::IoResult<()> {
- self.write_pretty("removed", term::color::YELLOW)
- }
-
- pub fn write_regressed(&mut self) -> io::IoResult<()> {
- self.write_pretty("regressed", term::color::RED)
- }
-
pub fn write_pretty(&mut self,
word: &str,
color: term::color::Color) -> io::IoResult<()> {
Ok(())
}
- pub fn write_metric_diff(&mut self, diff: &MetricDiff) -> io::IoResult<()> {
- let mut noise = 0u;
- let mut improved = 0u;
- let mut regressed = 0u;
- let mut added = 0u;
- let mut removed = 0u;
-
- for (k, v) in diff.iter() {
- match *v {
- LikelyNoise => noise += 1,
- MetricAdded => {
- added += 1;
- try!(self.write_added());
- try!(self.write_plain(format!(": {}\n", *k).as_slice()));
- }
- MetricRemoved => {
- removed += 1;
- try!(self.write_removed());
- try!(self.write_plain(format!(": {}\n", *k).as_slice()));
- }
- Improvement(pct) => {
- improved += 1;
- try!(self.write_plain(format!(": {} ", *k).as_slice()));
- try!(self.write_improved());
- try!(self.write_plain(format!(" by {:.2}%\n",
- pct as f64).as_slice()));
- }
- Regression(pct) => {
- regressed += 1;
- try!(self.write_plain(format!(": {} ", *k).as_slice()));
- try!(self.write_regressed());
- try!(self.write_plain(format!(" by {:.2}%\n",
- pct as f64).as_slice()));
- }
- }
- }
- try!(self.write_plain(format!("result of ratchet: {} metrics added, \
- {} removed, {} improved, {} regressed, \
- {} noise\n",
- added, removed, improved, regressed,
- noise).as_slice()));
- if regressed == 0 {
- try!(self.write_plain("updated ratchet file\n"));
- } else {
- try!(self.write_plain("left ratchet file untouched\n"));
- }
- Ok(())
- }
-
pub fn write_run_finish(&mut self,
ratchet_metrics: &Option<Path>,
ratchet_pct: Option<f64>) -> io::IoResult<bool> {
forced to: {}%\n",
pct).as_slice()))
}
- let (diff, ok) = self.metrics.ratchet(pth, ratchet_pct);
- try!(self.write_metric_diff(&diff));
- ok
+ true
}
};
None => {}
}
try!(run_tests(opts, tests, |x| callback(&x, &mut st)));
- match opts.save_metrics {
- None => (),
- Some(ref pth) => {
- try!(st.metrics.save(pth));
- try!(st.write_plain(format!("\nmetrics saved to: {:?}",
- pth.display()).as_slice()));
- }
- }
- return st.write_run_finish(&opts.ratchet_metrics, opts.ratchet_noise_percent);
+ return st.write_run_finish(&None, None);
}
#[test]
// Sort the tests alphabetically
filtered.sort_by(|t1, t2| t1.desc.name.as_slice().cmp(t2.desc.name.as_slice()));
- // Shard the remaining tests, if sharding requested.
- match opts.test_shard {
- None => filtered,
- Some((a,b)) => {
- filtered.into_iter().enumerate()
- // note: using a - 1 so that the valid shards, for example, are
- // 1.2 and 2.2 instead of 0.2 and 1.2
- .filter(|&(i,_)| i % b == (a - 1))
- .map(|(_,t)| t)
- .collect()
- }
- }
+ filtered
}
pub fn run_test(opts: &TestOpts,
write!(&mut file, "{}", json::as_json(map))
}
- /// Compare against another MetricMap. Optionally compare all
- /// measurements in the maps using the provided `noise_pct` as a
- /// percentage of each value to consider noise. If `None`, each
- /// measurement's noise threshold is independently chosen as the
- /// maximum of that measurement's recorded noise quantity in either
- /// map.
- pub fn compare_to_old(&self, old: &MetricMap,
- noise_pct: Option<f64>) -> MetricDiff {
- let mut diff : MetricDiff = BTreeMap::new();
- let MetricMap(ref selfmap) = *self;
- let MetricMap(ref old) = *old;
- for (k, vold) in old.iter() {
- let r = match selfmap.get(k) {
- None => MetricRemoved,
- Some(v) => {
- let delta = v.value - vold.value;
- let noise = match noise_pct {
- None => vold.noise.abs().max(v.noise.abs()),
- Some(pct) => vold.value * pct / 100.0
- };
- if delta.abs() <= noise {
- LikelyNoise
- } else {
- let pct = delta.abs() / vold.value.max(f64::EPSILON) * 100.0;
- if vold.noise < 0.0 {
- // When 'noise' is negative, it means we want
- // to see deltas that go up over time, and can
- // only tolerate slight negative movement.
- if delta < 0.0 {
- Regression(pct)
- } else {
- Improvement(pct)
- }
- } else {
- // When 'noise' is positive, it means we want
- // to see deltas that go down over time, and
- // can only tolerate slight positive movements.
- if delta < 0.0 {
- Improvement(pct)
- } else {
- Regression(pct)
- }
- }
- }
- }
- };
- diff.insert((*k).clone(), r);
- }
- let MetricMap(ref map) = *self;
- for (k, _) in map.iter() {
- if !diff.contains_key(k) {
- diff.insert((*k).clone(), MetricAdded);
- }
- }
- diff
- }
-
/// Insert a named `value` (+/- `noise`) metric into the map. The value
/// must be non-negative. The `noise` indicates the uncertainty of the
/// metric, which doubles as the "noise range" of acceptable
let MetricMap(ref mut map) = *self;
map.insert(name.to_string(), m);
}
-
- /// Attempt to "ratchet" an external metric file. This involves loading
- /// metrics from a metric file (if it exists), comparing against
- /// the metrics in `self` using `compare_to_old`, and rewriting the
- /// file to contain the metrics in `self` if none of the
- /// `MetricChange`s are `Regression`. Returns the diff as well
- /// as a boolean indicating whether the ratchet succeeded.
- pub fn ratchet(&self, p: &Path, pct: Option<f64>) -> (MetricDiff, bool) {
- let old = if p.exists() {
- MetricMap::load(p)
- } else {
- MetricMap::new()
- };
-
- let diff : MetricDiff = self.compare_to_old(&old, pct);
- let ok = diff.iter().all(|(_, v)| {
- match *v {
- Regression(_) => false,
- _ => true
- }
- });
-
- if ok {
- self.save(p).unwrap();
- }
- return (diff, ok)
- }
}
mod tests {
use test::{TrFailed, TrIgnored, TrOk, filter_tests, parse_opts,
TestDesc, TestDescAndFn, TestOpts, run_test,
- Metric, MetricMap, MetricAdded, MetricRemoved,
- Improvement, Regression, LikelyNoise,
+ Metric, MetricMap,
StaticTestName, DynTestName, DynTestFn, ShouldFail};
use std::io::TempDir;
use std::thunk::Thunk;
m1.insert_metric("in-both-want-upwards-and-improved", 1000.0, -10.0);
m2.insert_metric("in-both-want-upwards-and-improved", 2000.0, -10.0);
-
- let diff1 = m2.compare_to_old(&m1, None);
-
- assert_eq!(*(diff1.get(&"in-both-noise".to_string()).unwrap()), LikelyNoise);
- assert_eq!(*(diff1.get(&"in-first-noise".to_string()).unwrap()), MetricRemoved);
- assert_eq!(*(diff1.get(&"in-second-noise".to_string()).unwrap()), MetricAdded);
- assert_eq!(*(diff1.get(&"in-both-want-downwards-but-regressed".to_string()).unwrap()),
- Regression(100.0));
- assert_eq!(*(diff1.get(&"in-both-want-downwards-and-improved".to_string()).unwrap()),
- Improvement(50.0));
- assert_eq!(*(diff1.get(&"in-both-want-upwards-but-regressed".to_string()).unwrap()),
- Regression(50.0));
- assert_eq!(*(diff1.get(&"in-both-want-upwards-and-improved".to_string()).unwrap()),
- Improvement(100.0));
- assert_eq!(diff1.len(), 7);
-
- let diff2 = m2.compare_to_old(&m1, Some(200.0));
-
- assert_eq!(*(diff2.get(&"in-both-noise".to_string()).unwrap()), LikelyNoise);
- assert_eq!(*(diff2.get(&"in-first-noise".to_string()).unwrap()), MetricRemoved);
- assert_eq!(*(diff2.get(&"in-second-noise".to_string()).unwrap()), MetricAdded);
- assert_eq!(*(diff2.get(&"in-both-want-downwards-but-regressed".to_string()).unwrap()),
- LikelyNoise);
- assert_eq!(*(diff2.get(&"in-both-want-downwards-and-improved".to_string()).unwrap()),
- LikelyNoise);
- assert_eq!(*(diff2.get(&"in-both-want-upwards-but-regressed".to_string()).unwrap()),
- LikelyNoise);
- assert_eq!(*(diff2.get(&"in-both-want-upwards-and-improved".to_string()).unwrap()),
- LikelyNoise);
- assert_eq!(diff2.len(), 7);
- }
-
- #[test]
- pub fn ratchet_test() {
-
- let dpth = TempDir::new("test-ratchet").ok().expect("missing test for ratchet");
- let pth = dpth.path().join("ratchet.json");
-
- let mut m1 = MetricMap::new();
- m1.insert_metric("runtime", 1000.0, 2.0);
- m1.insert_metric("throughput", 50.0, 2.0);
-
- let mut m2 = MetricMap::new();
- m2.insert_metric("runtime", 1100.0, 2.0);
- m2.insert_metric("throughput", 50.0, 2.0);
-
- m1.save(&pth).unwrap();
-
- // Ask for a ratchet that should fail to advance.
- let (diff1, ok1) = m2.ratchet(&pth, None);
- assert_eq!(ok1, false);
- assert_eq!(diff1.len(), 2);
- assert_eq!(*(diff1.get(&"runtime".to_string()).unwrap()), Regression(10.0));
- assert_eq!(*(diff1.get(&"throughput".to_string()).unwrap()), LikelyNoise);
-
- // Check that it was not rewritten.
- let m3 = MetricMap::load(&pth);
- let MetricMap(m3) = m3;
- assert_eq!(m3.len(), 2);
- assert_eq!(*(m3.get(&"runtime".to_string()).unwrap()), Metric::new(1000.0, 2.0));
- assert_eq!(*(m3.get(&"throughput".to_string()).unwrap()), Metric::new(50.0, 2.0));
-
- // Ask for a ratchet with an explicit noise-percentage override,
- // that should advance.
- let (diff2, ok2) = m2.ratchet(&pth, Some(10.0));
- assert_eq!(ok2, true);
- assert_eq!(diff2.len(), 2);
- assert_eq!(*(diff2.get(&"runtime".to_string()).unwrap()), LikelyNoise);
- assert_eq!(*(diff2.get(&"throughput".to_string()).unwrap()), LikelyNoise);
-
- // Check that it was rewritten.
- let m4 = MetricMap::load(&pth);
- let MetricMap(m4) = m4;
- assert_eq!(m4.len(), 2);
- assert_eq!(*(m4.get(&"runtime".to_string()).unwrap()), Metric::new(1100.0, 2.0));
- assert_eq!(*(m4.get(&"throughput".to_string()).unwrap()), Metric::new(50.0, 2.0));
}
}
}
/// Render writes the min, max and quartiles of the provided `Summary` to the provided `Writer`.
-pub fn write_5_number_summary<W: Writer, T: Float + fmt::String + fmt::Show>(w: &mut W,
+pub fn write_5_number_summary<W: Writer, T: Float + fmt::Display + fmt::Debug>(w: &mut W,
s: &Summary<T>) -> io::IoResult<()> {
let (q1,q2,q3) = s.quartiles;
write!(w, "(min={}, q1={}, med={}, q3={}, max={})",
/// ```{.ignore}
/// 10 | [--****#******----------] | 40
/// ```
-pub fn write_boxplot<W: Writer, T: Float + fmt::String + fmt::Show + FromPrimitive>(
+pub fn write_boxplot<W: Writer, T: Float + fmt::Display + fmt::Debug + FromPrimitive>(
w: &mut W,
s: &Summary<T>,
width_hint: uint)
//include valgrind.h after stdint.h so that uintptr_t is defined for msys2 w64
#include "valgrind/valgrind.h"
-#ifdef __ANDROID__
-time_t
-timegm(struct tm *tm)
-{
- time_t ret;
- char *tz;
-
- tz = getenv("TZ");
- if (tz)
- tz = strdup(tz);
- setenv("TZ", "", 1);
- tzset();
- ret = mktime(tm);
- if (tz) {
- setenv("TZ", tz, 1);
- free(tz);
- } else
- unsetenv("TZ");
- tzset();
- return ret;
-}
-#endif
-
#ifdef __APPLE__
#if (TARGET_OS_IPHONE)
extern char **environ;
}
#endif
-typedef struct {
- int32_t tm_sec;
- int32_t tm_min;
- int32_t tm_hour;
- int32_t tm_mday;
- int32_t tm_mon;
- int32_t tm_year;
- int32_t tm_wday;
- int32_t tm_yday;
- int32_t tm_isdst;
- int32_t tm_gmtoff;
- int32_t tm_nsec;
-} rust_tm;
-
-void rust_tm_to_tm(rust_tm* in_tm, struct tm* out_tm) {
- memset(out_tm, 0, sizeof(struct tm));
- out_tm->tm_sec = in_tm->tm_sec;
- out_tm->tm_min = in_tm->tm_min;
- out_tm->tm_hour = in_tm->tm_hour;
- out_tm->tm_mday = in_tm->tm_mday;
- out_tm->tm_mon = in_tm->tm_mon;
- out_tm->tm_year = in_tm->tm_year;
- out_tm->tm_wday = in_tm->tm_wday;
- out_tm->tm_yday = in_tm->tm_yday;
- out_tm->tm_isdst = in_tm->tm_isdst;
-}
-
-void tm_to_rust_tm(struct tm* in_tm,
- rust_tm* out_tm,
- int32_t gmtoff,
- int32_t nsec) {
- out_tm->tm_sec = in_tm->tm_sec;
- out_tm->tm_min = in_tm->tm_min;
- out_tm->tm_hour = in_tm->tm_hour;
- out_tm->tm_mday = in_tm->tm_mday;
- out_tm->tm_mon = in_tm->tm_mon;
- out_tm->tm_year = in_tm->tm_year;
- out_tm->tm_wday = in_tm->tm_wday;
- out_tm->tm_yday = in_tm->tm_yday;
- out_tm->tm_isdst = in_tm->tm_isdst;
- out_tm->tm_gmtoff = gmtoff;
- out_tm->tm_nsec = nsec;
-}
-
-#if defined(__WIN32__)
-#define TZSET() _tzset()
-#if defined(_MSC_VER) && (_MSC_VER >= 1400)
-#define GMTIME(clock, result) gmtime_s((result), (clock))
-#define LOCALTIME(clock, result) localtime_s((result), (clock))
-#define TIMEGM(result) _mkgmtime64(result)
-#else
-struct tm* GMTIME(const time_t *clock, struct tm *result) {
- struct tm* t = gmtime(clock);
- if (t == NULL || result == NULL) { return NULL; }
- *result = *t;
- return result;
-}
-struct tm* LOCALTIME(const time_t *clock, struct tm *result) {
- struct tm* t = localtime(clock);
- if (t == NULL || result == NULL) { return NULL; }
- *result = *t;
- return result;
-}
-#define TIMEGM(result) mktime((result)) - _timezone
-#endif
-#else
-#define TZSET() tzset()
-#define GMTIME(clock, result) gmtime_r((clock), (result))
-#define LOCALTIME(clock, result) localtime_r((clock), (result))
-#define TIMEGM(result) timegm(result)
-#endif
-
-void
-rust_tzset() {
- TZSET();
-}
-
-void
-rust_gmtime(int64_t sec, int32_t nsec, rust_tm *timeptr) {
- struct tm tm;
- time_t s = sec;
- GMTIME(&s, &tm);
-
- tm_to_rust_tm(&tm, timeptr, 0, nsec);
-}
-
-void
-rust_localtime(int64_t sec, int32_t nsec, rust_tm *timeptr) {
- struct tm tm;
- time_t s = sec;
- LOCALTIME(&s, &tm);
-
-#if defined(__WIN32__)
- int32_t gmtoff = -timezone;
-#else
- int32_t gmtoff = tm.tm_gmtoff;
-#endif
-
- tm_to_rust_tm(&tm, timeptr, gmtoff, nsec);
-}
-
-int64_t
-rust_timegm(rust_tm* timeptr) {
- struct tm t;
- rust_tm_to_tm(timeptr, &t);
- return TIMEGM(&t);
-}
-
-int64_t
-rust_mktime(rust_tm* timeptr) {
- struct tm t;
- rust_tm_to_tm(timeptr, &t);
- return mktime(&t);
-}
-
#ifndef _WIN32
DIR*
+S 2015-01-20 9006c3c
+ freebsd-x86_64 240b30b33263d175e30f925ed1e1e1a4e553a513
+ linux-i386 544c2063b8d5035342c705b881b8868244c1e9a1
+ linux-x86_64 eb41db80978210a013a8dcf8f4fe804969197337
+ macos-i386 3ed08c5ae66367e85b8f2b207615d45bfd9cf89d
+ macos-x86_64 d102760316b90b17d54b0bef02ca6dc35f82e6bd
+ winnt-i386 6940fef6caa2f64d158b8f5eb00afd5c8e0c71a5
+ winnt-x86_64 36b6f239fe1264bceb4b8202e692b7d49947eebe
+
S 2015-01-15 9ade482
freebsd-x86_64 eb8f52c6e8dc24a293456d5e4dc5d1072442e758
linux-i386 0197ad7179d74eba06a8b46432548caf226aa03d
use syntax::parse::token;
use syntax::ast::{TokenTree, TtToken};
use syntax::ext::base::{ExtCtxt, MacResult, DummyResult, MacExpr};
-use syntax::ext::build::AstBuilder; // trait for expr_uint
+use syntax::ext::build::AstBuilder; // trait for expr_usize
use rustc::plugin::Registry;
// WARNING WARNING WARNING WARNING WARNING
}
}
- MacExpr::new(cx.expr_uint(sp, total))
+ MacExpr::new(cx.expr_usize(sp, total))
}
#[plugin_registrar]
let d = idx / self.fact[i] as i32;
self.cnt[i] = d;
idx %= self.fact[i] as i32;
- for (place, val) in pp.iter_mut().zip(self.perm.p[..(i+1)].iter()) {
+ for (place, val) in pp.iter_mut().zip(self.perm.p[..i+1].iter()) {
*place = (*val) as u8
}
}
n -= nb;
line[nb] = '\n' as u8;
- try!(wr.write(&line[..(nb+1)]));
+ try!(wr.write(&line[..nb+1]));
}
Ok(())
}
let len = bb.len();
while ii < len - (nn - 1u) {
- it(&bb[ii..(ii+nn)]);
+ it(&bb[ii..ii+nn]);
ii += 1u;
}
- return bb[(len - (nn - 1u))..len].to_vec();
+ return bb[len - (nn - 1u)..len].to_vec();
}
fn make_sequence_processor(sz: uint,
// can't be used as rvalues
use std::ops::Index;
-use std::fmt::Show;
+use std::fmt::Debug;
struct S;
impl Copy for T {}
impl Index<usize> for T {
- type Output = Show + 'static;
+ type Output = Debug + 'static;
- fn index<'a>(&'a self, idx: &usize) -> &'a (Show + 'static) {
+ fn index<'a>(&'a self, idx: &usize) -> &'a (Debug + 'static) {
static x: usize = 42;
&x
}
struct Foo<'a> {
a: &'a Bar+'a,
//~^ ERROR E0178
- //~^^ NOTE perhaps you meant `&'a (Bar + 'a)`?
+ //~^^ HELP perhaps you meant `&'a (Bar + 'a)`?
b: &'a mut Bar+'a,
//~^ ERROR E0178
- //~^^ NOTE perhaps you meant `&'a mut (Bar + 'a)`?
+ //~^^ HELP perhaps you meant `&'a mut (Bar + 'a)`?
c: Box<Bar+'a>, // OK, no paren needed in this context
d: fn() -> Bar+'a,
//~^ ERROR E0178
- //~^^ NOTE perhaps you forgot parentheses
+ //~^^ HELP perhaps you forgot parentheses
//~^^^ WARN deprecated syntax
}
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-use std::fmt::Show;
+use std::fmt::Debug;
trait Str {}
trait Something {
- fn yay<T: Show>(_: Option<Self>, thing: &[T]);
+ fn yay<T: Debug>(_: Option<Self>, thing: &[T]);
}
struct X { data: u32 }
use std::{fmt, ops};
-struct Shower<T> {
+struct Debuger<T> {
x: T
}
-impl<T: fmt::Show> ops::Fn<(), ()> for Shower<T> {
+impl<T: fmt::Debug> ops::Fn<(), ()> for Debuger<T> {
fn call(&self, _args: ()) {
//~^ ERROR `call` has an incompatible type for trait: expected "rust-call" fn, found "Rust" fn
println!("{:?}", self.x);
}
}
-fn make_shower<T>(x: T) -> Shower<T> {
- Shower { x: x }
+fn make_shower<T>(x: T) -> Debuger<T> {
+ Debuger { x: x }
}
pub fn main() {
--- /dev/null
+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+macro_rules! test { ($wrong:t_ty ..) => () }
+ //~^ ERROR: unrecognized builtin nonterminal `t_ty`
+
+fn main() {}
+++ /dev/null
-// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-// Check that lint deprecation works
-
-#[deny(unused_variable)] //~ warning: lint unused_variable has been renamed to unused_variables
-pub fn main() {
- let x = 0u8; //~ error: unused variable:
-}
#![allow(dead_code)]
-// compile-flags: -D type-limits
+// compile-flags: -D unused-comparisons
fn main() { }
fn foo() {
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-fn send<T:Send + std::fmt::Show>(ch: _chan<T>, data: T) {
+fn send<T:Send + std::fmt::Debug>(ch: _chan<T>, data: T) {
println!("{:?}", ch);
println!("{:?}", data);
panic!();
}
-#[derive(Show)]
+#[derive(Debug)]
struct _chan<T>(isize);
// Tests that "log(debug, message);" is flagged as using
--- /dev/null
+// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// issue #21405
+
+fn foo<F>(f: F) where F: FnMut(usize) {}
+
+fn main() {
+ foo(|s| s.is_empty());
+ //~^ ERROR does not implement any method
+ //~^^ HELP #1: `core::slice::SliceExt`
+ //~^^^ HELP #2: `core::str::StrExt`
+ //~^^^^ HELP #3: `collections::slice::SliceExt`
+ //~^^^^^ HELP #4: `collections::str::StrExt`
+}
// Unsized type.
let arr: &[_] = &[1us, 2, 3];
- let range = (*arr)..;
+ let range = *arr..;
//~^ ERROR the trait `core::marker::Sized` is not implemented
}
pub fn main() {
let r = {
- (&42is)..&42
+ &42is..&42
//~^ ERROR borrowed value does not live long enough
//~^^ ERROR borrowed value does not live long enough
};
f<X>();
//~^ ERROR: Chained comparison operators require parentheses
- //~^^ HELP: Use ::< instead of < if you meant to specify type arguments.
+ //~^^ HELP: use ::< instead of < if you meant to specify type arguments
}
struct Foo<'a>(&'a isize);
impl<'a> Foo<'a> {
- //~^ HELP shadowed lifetime `'a` declared here
+ //~^ NOTE shadowed lifetime `'a` declared here
fn shadow_in_method<'a>(&'a self) -> &'a isize {
//~^ WARNING lifetime name `'a` shadows another lifetime name that is already in scope
- //~| HELP deprecated
+ //~| NOTE deprecated
self.0
}
fn shadow_in_type<'b>(&'b self) -> &'b isize {
- //~^ HELP shadowed lifetime `'b` declared here
+ //~^ NOTE shadowed lifetime `'b` declared here
let x: for<'b> fn(&'b isize) = panic!();
//~^ WARNING lifetime name `'b` shadows another lifetime name that is already in scope
- //~| HELP deprecated
+ //~| NOTE deprecated
self.0
}
f<type>();
//~^ ERROR expected identifier, found keyword `type`
//~^^ ERROR: Chained comparison operators require parentheses
- //~^^^ HELP: Use ::< instead of < if you meant to specify type arguments.
+ //~^^^ HELP: use ::< instead of < if you meant to specify type arguments
}
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-// compile-flags: -D path-statement
+// compile-flags: -D path-statements
fn main() {
let x = 10is;
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-// compile-flags:--debuginfo=1
+// compile-flags:-C debuginfo=1
// min-lldb-version: 310
pub trait TraitWithDefaultMethod : Sized {
// ignore-android: FIXME(#10381)
// min-lldb-version: 310
-// compile-flags:--debuginfo=1
+// compile-flags:-C debuginfo=1
// gdb-command:run
// lldb-command:run
// ignore-lldb
-// compile-flags:--debuginfo=1
+// compile-flags:-C debuginfo=1
// Make sure functions have proper names
// gdb-command:info functions
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-// error-pattern:assertion failed: `(left == right) && (right == left)` (left: `14i`, right: `15i`)
+// error-pattern:assertion failed: `(left == right) && (right == left)` (left: `14`, right: `15`)
fn main() {
assert_eq!(14i,15i);
-include ../tools.mk
all:
- [ `$(RUSTC) --print-crate-name crate.rs` = "foo" ]
- [ `$(RUSTC) --print-file-name crate.rs` = "$(call BIN,foo)" ]
- [ `$(RUSTC) --print-file-name --crate-type=lib \
+ [ `$(RUSTC) --print crate-name crate.rs` = "foo" ]
+ [ `$(RUSTC) --print file-names crate.rs` = "$(call BIN,foo)" ]
+ [ `$(RUSTC) --print file-names --crate-type=lib \
--test crate.rs` = "$(call BIN,foo)" ]
- [ `$(RUSTC) --print-file-name --test lib.rs` = "$(call BIN,mylib)" ]
- $(RUSTC) --print-file-name lib.rs
- $(RUSTC) --print-file-name rlib.rs
+ [ `$(RUSTC) --print file-names --test lib.rs` = "$(call BIN,mylib)" ]
+ $(RUSTC) --print file-names lib.rs
+ $(RUSTC) --print file-names rlib.rs
+++ /dev/null
--include ../tools.mk
-
-# FIXME: ignore freebsd/windows
-# (windows: see `../dep-info/Makefile`)
-ifneq ($(shell uname),FreeBSD)
-ifndef IS_WINDOWS
-all:
- $(RUSTC) --dep-info $(TMPDIR)/custom-deps-file.d --crate-type=lib lib.rs
- sleep 1
- touch foo.rs
- -rm -f $(TMPDIR)/done
- $(MAKE) -drf Makefile.foo
- rm $(TMPDIR)/done
- pwd
- $(MAKE) -drf Makefile.foo
- rm $(TMPDIR)/done && exit 1 || exit 0
-else
-all:
-
-endif
-
-else
-all:
-
-endif
+++ /dev/null
-LIB := $(shell $(RUSTC) --print file-names --crate-type=lib lib.rs)
-
-$(TMPDIR)/$(LIB):
- $(RUSTC) --dep-info $(TMPDIR)/custom-deps-file.d --crate-type=lib lib.rs
- touch $(TMPDIR)/done
-
--include $(TMPDIR)/custom-deps-file.d
+++ /dev/null
-// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-pub fn bar() {}
+++ /dev/null
-// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-pub fn foo() {}
+++ /dev/null
-// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-#![crate_name="foo"]
-
-pub mod foo;
-pub mod bar;
ifneq ($(shell uname),FreeBSD)
ifndef IS_WINDOWS
all:
- $(RUSTC) --dep-info $(TMPDIR)/custom-deps-file.d --crate-type=lib lib.rs
+ $(RUSTC) --emit link,dep-info --crate-type=lib lib.rs
sleep 1
touch 'foo foo.rs'
-rm -f $(TMPDIR)/done
-LIB := $(shell $(RUSTC) --print-file-name --crate-type=lib lib.rs)
+LIB := $(shell $(RUSTC) --print file-names --crate-type=lib lib.rs)
$(TMPDIR)/$(LIB):
- $(RUSTC) --dep-info $(TMPDIR)/custom-deps-file.d --crate-type=lib lib.rs
+ $(RUSTC) --emit link,dep-info --crate-type=lib lib.rs
touch $(TMPDIR)/done
--include $(TMPDIR)/custom-deps-file.d
+-include $(TMPDIR)/lib.d
ifneq ($(shell uname),FreeBSD)
ifndef IS_WINDOWS
all:
- $(RUSTC) --dep-info --crate-type=lib lib.rs
+ $(RUSTC) --emit dep-info,link --crate-type=lib lib.rs
sleep 2
touch foo.rs
-rm -f $(TMPDIR)/done
all:
# Let's get a nice error message
- $(RUSTC) foo.rs --dep-info foo/bar/baz 2>&1 | \
+ $(BARE_RUSTC) foo.rs --emit dep-info --out-dir foo/bar/baz 2>&1 | \
grep "error writing dependencies"
# Make sure the filename shows up
- $(RUSTC) foo.rs --dep-info foo/bar/baz 2>&1 | grep "baz"
+ $(BARE_RUSTC) foo.rs --emit dep-info --out-dir foo/bar/baz 2>&1 | grep "baz"
RUSTC_LIB=$(RUSTC) --crate-type=lib
define FIND_LAST_BLOCK
-LASTBLOCKNUM_$(1) := $(shell $(RUSTC_LIB) --pretty=expanded,identified $(1) \
+LASTBLOCKNUM_$(1) := $(shell $(RUSTC_LIB) -Z unstable-options --pretty=expanded,identified $(1) \
| grep block
| tail -1
| sed -e 's@.*/\* block \([0-9]*\) \*/.*@\1@')
opts.output_types = vec![OutputTypeExe];
opts.maybe_sysroot = Some(sysroot);
- let descriptions = Registry::new(&rustc::DIAGNOSTICS);
+ let descriptions = Registry::new(&rustc::diagnostics::DIAGNOSTICS);
let sess = build_session(opts, None, descriptions);
sess
}
REPLACEMENT := s/[0-9][0-9]*\#[0-9][0-9]*/$(shell date)/g
all:
- $(RUSTC) -o $(TMPDIR)/input.out --pretty expanded,hygiene input.rs
+ $(RUSTC) -o $(TMPDIR)/input.out -Z unstable-options \
+ --pretty expanded,hygiene input.rs
# the name/ctxt numbers are very internals-dependent and thus
# change relatively frequently, and testing for their exact values
-include ../tools.mk
all:
- $(RUSTC) -o $(TMPDIR)/input.expanded.rs --pretty=expanded input.rs
+ $(RUSTC) -o $(TMPDIR)/input.expanded.rs -Z unstable-options \
+ --pretty=expanded input.rs
-include ../tools.mk
all:
- $(RUSTC) -o $(TMPDIR)/foo.out --pretty normal=foo input.rs
- $(RUSTC) -o $(TMPDIR)/nest_foo.out --pretty normal=nest::foo input.rs
- $(RUSTC) -o $(TMPDIR)/foo_method.out --pretty normal=foo_method input.rs
+ $(RUSTC) -o $(TMPDIR)/foo.out -Z unstable-options --pretty normal=foo input.rs
+ $(RUSTC) -o $(TMPDIR)/nest_foo.out -Z unstable-options --pretty normal=nest::foo input.rs
+ $(RUSTC) -o $(TMPDIR)/foo_method.out -Z unstable-options --pretty normal=foo_method input.rs
diff -u $(TMPDIR)/foo.out foo.pp
diff -u $(TMPDIR)/nest_foo.out nest_foo.pp
diff -u $(TMPDIR)/foo_method.out foo_method.pp
-include ../tools.mk
all:
- $(RUSTC) -o $(TMPDIR)/input.out --pretty=normal input.rs
+ $(RUSTC) -o $(TMPDIR)/input.out --pretty=normal -Z unstable-options input.rs
diff -u $(TMPDIR)/input.out input.pp
--- /dev/null
+-include ../tools.mk
+
+all: foo.rs
+ $(HOST_RPATH_ENV) $(RUSTDOC) -w html -o $(TMPDIR)/doc foo.rs
+ $(HTMLDOCCK) $(TMPDIR)/doc foo.rs
+
--- /dev/null
+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![feature(optin_builtin_traits)]
+
+// @matches foo/struct.Alpha.html '//pre' "pub struct Alpha"
+pub struct Alpha;
+// @matches foo/struct.Bravo.html '//pre' "pub struct Bravo<B>"
+pub struct Bravo<B>;
+
+// @matches foo/struct.Alpha.html '//*[@class="impl"]//code' "impl !.*Send.* for .*Alpha"
+impl !Send for Alpha {}
+
+// @matches foo/struct.Bravo.html '//*[@class="impl"]//code' "impl<B> !.*Send.* for .*Bravo.*<B>"
+impl<B> !Send for Bravo<B> {}
+++ /dev/null
--include ../tools.mk
-
-all:
- # Running all the shards should hit every test
- $(RUSTC) --test main.rs
- $(call RUN,main) --test-shard 1.2 | grep "test_1 ... ok"
- $(call RUN,main) --test-shard 2.2 | grep "test_2 ... ok"
+++ /dev/null
-// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-#![crate_type = "lib"]
-
-#[test]
-fn test_1() { }
-#[test]
-fn test_2() { }
TARGET_RPATH_ENV = \
$(LD_LIB_PATH_ENVVAR)="$(TMPDIR):$(TARGET_RPATH_DIR):$($(LD_LIB_PATH_ENVVAR))"
-RUSTC := $(HOST_RPATH_ENV) $(RUSTC) --out-dir $(TMPDIR) -L $(TMPDIR)
+BARE_RUSTC := $(HOST_RPATH_ENV) $(RUSTC)
+RUSTC := $(BARE_RUSTC) --out-dir $(TMPDIR) -L $(TMPDIR)
CC := $(CC) -L $(TMPDIR)
HTMLDOCCK := $(PYTHON) $(S)/src/etc/htmldocck.py
// compile-flags:--cfg set1 --cfg set2
#![allow(dead_code)]
-use std::fmt::Show;
+use std::fmt::Debug;
-struct NotShowable;
+struct NotDebugable;
-#[cfg_attr(set1, derive(Show))]
+#[cfg_attr(set1, derive(Debug))]
struct Set1;
-#[cfg_attr(notset, derive(Show))]
-struct Notset(NotShowable);
+#[cfg_attr(notset, derive(Debug))]
+struct Notset(NotDebugable);
-#[cfg_attr(not(notset), derive(Show))]
+#[cfg_attr(not(notset), derive(Debug))]
struct NotNotset;
-#[cfg_attr(not(set1), derive(Show))]
-struct NotSet1(NotShowable);
+#[cfg_attr(not(set1), derive(Debug))]
+struct NotSet1(NotDebugable);
-#[cfg_attr(all(set1, set2), derive(Show))]
+#[cfg_attr(all(set1, set2), derive(Debug))]
struct AllSet1Set2;
-#[cfg_attr(all(set1, notset), derive(Show))]
-struct AllSet1Notset(NotShowable);
+#[cfg_attr(all(set1, notset), derive(Debug))]
+struct AllSet1Notset(NotDebugable);
-#[cfg_attr(any(set1, notset), derive(Show))]
+#[cfg_attr(any(set1, notset), derive(Debug))]
struct AnySet1Notset;
-#[cfg_attr(any(notset, notset2), derive(Show))]
-struct AnyNotsetNotset2(NotShowable);
+#[cfg_attr(any(notset, notset2), derive(Debug))]
+struct AnyNotsetNotset2(NotDebugable);
-#[cfg_attr(all(not(notset), any(set1, notset)), derive(Show))]
+#[cfg_attr(all(not(notset), any(set1, notset)), derive(Debug))]
struct Complex;
-#[cfg_attr(any(notset, not(any(set1, notset))), derive(Show))]
-struct ComplexNot(NotShowable);
+#[cfg_attr(any(notset, not(any(set1, notset))), derive(Debug))]
+struct ComplexNot(NotDebugable);
-#[cfg_attr(any(target_endian = "little", target_endian = "big"), derive(Show))]
+#[cfg_attr(any(target_endian = "little", target_endian = "big"), derive(Debug))]
struct KeyValue;
-fn is_show<T: Show>() {}
+fn is_show<T: Debug>() {}
fn main() {
is_show::<Set1>();
#![allow(unknown_features)]
#![feature(box_syntax)]
-use std::fmt::Show;
+use std::fmt::Debug;
// Check that coercions apply at the pointer level and don't cause
// rvalue expressions to be unsized. See #20169 for more information.
let _: Box<[int]> = box if true { [1, 2, 3] } else { [1, 3, 4] };
let _: Box<[int]> = box match true { true => [1, 2, 3], false => [1, 3, 4] };
let _: Box<Fn(int) -> _> = box { |x| (x as u8) };
- let _: Box<Show> = box if true { false } else { true };
- let _: Box<Show> = box match true { true => 'a', false => 'b' };
+ let _: Box<Debug> = box if true { false } else { true };
+ let _: Box<Debug> = box match true { true => 'a', false => 'b' };
let _: &[int] = &{ [1, 2, 3] };
let _: &[int] = &if true { [1, 2, 3] } else { [1, 3, 4] };
let _: &[int] = &match true { true => [1, 2, 3], false => [1, 3, 4] };
let _: &Fn(int) -> _ = &{ |x| (x as u8) };
- let _: &Show = &if true { false } else { true };
- let _: &Show = &match true { true => 'a', false => 'b' };
+ let _: &Debug = &if true { false } else { true };
+ let _: &Debug = &match true { true => 'a', false => 'b' };
let _: Box<[int]> = Box::new([1, 2, 3]);
let _: Box<Fn(int) -> _> = Box::new(|x| (x as u8));
+
+ let _: Vec<Box<Fn(int) -> _>> = vec![
+ Box::new(|x| (x as u8)),
+ box |x| (x as i16 as u8),
+ ];
}
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-use std::fmt::Show;
+use std::fmt::Debug;
use std::default::Default;
trait MyTrait {
}
}
-#[derive(Clone,Show,PartialEq)]
+#[derive(Clone,Debug,PartialEq)]
struct MyType {
dummy: uint
}
}
fn test_eq<M>(m: M, n: M)
-where M : MyTrait + Show + PartialEq
+where M : MyTrait + Debug + PartialEq
{
assert_eq!(m.get(), n);
}
use std::marker::Sync;
struct Foo {
- a: uint,
+ a: usize,
b: *const ()
}
a
}
-static BLOCK_INTEGRAL: uint = { 1 };
+static BLOCK_INTEGRAL: usize = { 1 };
static BLOCK_EXPLICIT_UNIT: () = { () };
static BLOCK_IMPLICIT_UNIT: () = { };
static BLOCK_FLOAT: f64 = { 1.0 };
-static BLOCK_ENUM: Option<uint> = { Some(100) };
+static BLOCK_ENUM: Option<usize> = { Some(100) };
static BLOCK_STRUCT: Foo = { Foo { a: 12, b: 0 as *const () } };
-static BLOCK_UNSAFE: uint = unsafe { 1000 };
+static BLOCK_UNSAFE: usize = unsafe { 1000 };
-// FIXME: #13970
-// static BLOCK_FN_INFERRED: fn(uint) -> uint = { foo };
+static BLOCK_FN_INFERRED: fn(usize) -> usize = { foo };
-// FIXME: #13971
-// static BLOCK_FN: fn(uint) -> uint = { foo::<uint> };
+static BLOCK_FN: fn(usize) -> usize = { foo::<usize> };
-// FIXME: #13972
-// static BLOCK_ENUM_CONSTRUCTOR: fn(uint) -> Option<uint> = { Some };
+static BLOCK_ENUM_CONSTRUCTOR: fn(usize) -> Option<usize> = { Some };
-// FIXME: #13973
-// static BLOCK_UNSAFE_SAFE_PTR: &'static int = unsafe { &*(0xdeadbeef as *int) };
-// static BLOCK_UNSAFE_SAFE_PTR_2: &'static int = unsafe {
-// static X: *int = 0xdeadbeef as *int;
+// FIXME #13972
+// static BLOCK_UNSAFE_SAFE_PTR: &'static isize = unsafe { &*(0xdeadbeef as *const isize) };
+// static BLOCK_UNSAFE_SAFE_PTR_2: &'static isize = unsafe {
+// const X: *const isize = 0xdeadbeef as *const isize;
// &*X
// };
assert_eq!(BLOCK_STRUCT.b, 0 as *const ());
assert_eq!(BLOCK_ENUM, Some(100));
assert_eq!(BLOCK_UNSAFE, 1000);
-
- // FIXME: #13970
- // assert_eq!(BLOCK_FN_INFERRED(300), 300);
-
- // FIXME: #13971
- // assert_eq!(BLOCK_FN(300), 300);
-
- // FIXME: #13972
- // assert_eq!(BLOCK_ENUM_CONSTRUCTOR(200), Some(200));
-
- // FIXME: #13973
- // assert_eq!(BLOCK_UNSAFE_SAFE_PTR as *int as uint, 0xdeadbeef_u);
- // assert_eq!(BLOCK_UNSAFE_SAFE_PTR_2 as *int as uint, 0xdeadbeef_u);
+ assert_eq!(BLOCK_FN_INFERRED(300), 300);
+ assert_eq!(BLOCK_FN(300), 300);
+ assert_eq!(BLOCK_ENUM_CONSTRUCTOR(200), Some(200));
+ // FIXME #13972
+ // assert_eq!(BLOCK_UNSAFE_SAFE_PTR as *const isize as usize, 0xdeadbeef_us);
+ // assert_eq!(BLOCK_UNSAFE_SAFE_PTR_2 as *const isize as usize, 0xdeadbeef_us);
}
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-// compile-flags:--crate-name crate-name-attr-used -F unused-attribute
+// compile-flags:--crate-name crate-name-attr-used -F unused-attributes
#![crate_name = "crate-name-attr-used"]
use std::fmt;
-#[derive(Show)]
+#[derive(Debug)]
enum A {}
-#[derive(Show)]
+#[derive(Debug)]
enum B { B1, B2, B3 }
-#[derive(Show)]
+#[derive(Debug)]
enum C { C1(int), C2(B), C3(String) }
-#[derive(Show)]
+#[derive(Debug)]
enum D { D1{ a: int } }
-#[derive(Show)]
+#[derive(Debug)]
struct E;
-#[derive(Show)]
+#[derive(Debug)]
struct F(int);
-#[derive(Show)]
+#[derive(Debug)]
struct G(int, int);
-#[derive(Show)]
+#[derive(Debug)]
struct H { a: int }
-#[derive(Show)]
+#[derive(Debug)]
struct I { a: int, b: int }
-#[derive(Show)]
+#[derive(Debug)]
struct J(Custom);
struct Custom;
-impl fmt::Show for Custom {
+impl fmt::Debug for Custom {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "yay")
}
}
-trait ToShow {
+trait ToDebug {
fn to_show(&self) -> String;
}
-impl<T: fmt::Show> ToShow for T {
+impl<T: fmt::Debug> ToDebug for T {
fn to_show(&self) -> String {
format!("{:?}", self)
}
pub fn main() {
assert_eq!(B::B1.to_show(), "B1".to_string());
assert_eq!(B::B2.to_show(), "B2".to_string());
- assert_eq!(C::C1(3).to_show(), "C1(3i)".to_string());
+ assert_eq!(C::C1(3).to_show(), "C1(3)".to_string());
assert_eq!(C::C2(B::B2).to_show(), "C2(B2)".to_string());
- assert_eq!(D::D1{ a: 2 }.to_show(), "D1 { a: 2i }".to_string());
+ assert_eq!(D::D1{ a: 2 }.to_show(), "D1 { a: 2 }".to_string());
assert_eq!(E.to_show(), "E".to_string());
- assert_eq!(F(3).to_show(), "F(3i)".to_string());
- assert_eq!(G(3, 4).to_show(), "G(3i, 4i)".to_string());
- assert_eq!(I{ a: 2, b: 4 }.to_show(), "I { a: 2i, b: 4i }".to_string());
+ assert_eq!(F(3).to_show(), "F(3)".to_string());
+ assert_eq!(G(3, 4).to_show(), "G(3, 4)".to_string());
+ assert_eq!(I{ a: 2, b: 4 }.to_show(), "I { a: 2, b: 4 }".to_string());
assert_eq!(J(Custom).to_show(), "J(yay)".to_string());
}
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#[derive(Show)]
+#[derive(Debug)]
struct Unit;
-#[derive(Show)]
+#[derive(Debug)]
struct Tuple(int, uint);
-#[derive(Show)]
+#[derive(Debug)]
struct Struct { x: int, y: uint }
-#[derive(Show)]
+#[derive(Debug)]
enum Enum {
Nullary,
Variant(int, uint),
pub fn main() {
t!(Unit, "Unit");
- t!(Tuple(1, 2), "Tuple(1i, 2u)");
- t!(Struct { x: 1, y: 2 }, "Struct { x: 1i, y: 2u }");
+ t!(Tuple(1, 2), "Tuple(1, 2)");
+ t!(Struct { x: 1, y: 2 }, "Struct { x: 1, y: 2 }");
t!(Enum::Nullary, "Nullary");
- t!(Enum::Variant(1, 2), "Variant(1i, 2u)");
- t!(Enum::StructVariant { x: 1, y: 2 }, "StructVariant { x: 1i, y: 2u }");
+ t!(Enum::Variant(1, 2), "Variant(1, 2)");
+ t!(Enum::StructVariant { x: 1, y: 2 }, "StructVariant { x: 1, y: 2 }");
}
// work and don't ICE.
use std::ops::Index;
-use std::fmt::Show;
+use std::fmt::Debug;
struct S;
struct T;
impl Index<uint> for T {
- type Output = Show + 'static;
+ type Output = Debug + 'static;
- fn index<'a>(&'a self, idx: &uint) -> &'a (Show + 'static) {
+ fn index<'a>(&'a self, idx: &uint) -> &'a (Debug + 'static) {
static X: uint = 42;
- &X as &(Show + 'static)
+ &X as &(Debug + 'static)
}
}
fn main() {
assert_eq!(&S[0], "hello");
&T[0];
- // let x = &x as &Show;
+ // let x = &x as &Debug;
}
f.write_str("adios")
}
}
-impl fmt::String for C {
+impl fmt::Display for C {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.pad_integral(true, "☃", "123")
}
t!(format!("{}", 10i), "10");
t!(format!("{}", 10u), "10");
t!(format!("{:?}", '☃'), "'\\u{2603}'");
- t!(format!("{:?}", 10i), "10i");
- t!(format!("{:?}", 10u), "10u");
+ t!(format!("{:?}", 10i), "10");
+ t!(format!("{:?}", 10u), "10");
t!(format!("{:?}", "true"), "\"true\"");
t!(format!("{:?}", "foo\nbar"), "\"foo\\nbar\"");
t!(format!("{:o}", 10u), "12");
t!(format!("{:X}", 10u), "A");
t!(format!("{}", "foo"), "foo");
t!(format!("{}", "foo".to_string()), "foo");
- t!(format!("{:p}", 0x1234 as *const int), "0x1234");
- t!(format!("{:p}", 0x1234 as *mut int), "0x1234");
+ t!(format!("{:p}", 0x1234 as *const isize), "0x1234");
+ t!(format!("{:p}", 0x1234 as *mut isize), "0x1234");
t!(format!("{:x}", A), "aloha");
t!(format!("{:X}", B), "adios");
t!(format!("foo {} ☃☃☃☃☃☃", "bar"), "foo bar ☃☃☃☃☃☃");
t!(format!("{1} {0}", 0i, 1i), "1 0");
- t!(format!("{foo} {bar}", foo=0i, bar=1i), "0 1");
- t!(format!("{foo} {1} {bar} {0}", 0i, 1i, foo=2i, bar=3i), "2 1 3 0");
+ t!(format!("{foo} {bar}", foo=0i, bar=1is), "0 1");
+ t!(format!("{foo} {1} {bar} {0}", 0is, 1is, foo=2is, bar=3is), "2 1 3 0");
t!(format!("{} {0}", "a"), "a a");
t!(format!("{foo_bar}", foo_bar=1i), "1");
t!(format!("{}", 5i + 5i), "10");
t!(format!("{:#4}", C), "☃123");
// FIXME(#20676)
- // let a: &fmt::Show = &1i;
- // t!(format!("{:?}", a), "1i");
+ // let a: &fmt::Debug = &1i;
+ // t!(format!("{:?}", a), "1");
// Formatting strings and their arguments
// make sure that format! doesn't cause spurious unused-unsafe warnings when
// it's inside of an outer unsafe block
unsafe {
- let a: int = ::std::mem::transmute(3u);
+ let a: isize = ::std::mem::transmute(3u);
format!("{}", a);
}
fn test_order() {
// Make sure format!() arguments are always evaluated in a left-to-right
// ordering
- fn foo() -> int {
- static mut FOO: int = 0;
+ fn foo() -> isize {
+ static mut FOO: isize = 0;
unsafe {
FOO += 1;
FOO
use std::fmt;
fn main() {
- let a: &fmt::Show = &1_i32;
+ let a: &fmt::Debug = &1_i32;
format!("{:?}", a);
}
--- /dev/null
+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+fn main() {
+ let mut shrinker: Box<Iterator<Item=i32>> = Box::new(vec![1].into_iter());
+ println!("{:?}", shrinker.next());
+ for v in shrinker { assert!(false); }
+
+ let mut shrinker: &mut Iterator<Item=i32> = &mut vec![1].into_iter();
+ println!("{:?}", shrinker.next());
+ for v in shrinker { assert!(false); }
+}
--- /dev/null
+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+fn main() {
+ let v = vec![1, 2, 3];
+ let boxed: Box<Iterator<Item=i32>> = Box::new(v.into_iter());
+ assert_eq!(boxed.max(), Some(3));
+
+ let v = vec![1, 2, 3];
+ let boxed: &mut Iterator<Item=i32> = &mut v.into_iter();
+ assert_eq!(boxed.max(), Some(3));
+}
let mut table = HashMap::new();
table.insert("one".to_string(), 1i);
table.insert("two".to_string(), 2i);
- assert!(check_strs(format!("{:?}", table).as_slice(), "HashMap {\"one\": 1i, \"two\": 2i}") ||
- check_strs(format!("{:?}", table).as_slice(), "HashMap {\"two\": 2i, \"one\": 1i}"));
+ assert!(check_strs(format!("{:?}", table).as_slice(), "HashMap {\"one\": 1, \"two\": 2}") ||
+ check_strs(format!("{:?}", table).as_slice(), "HashMap {\"two\": 2, \"one\": 1}"));
}
#![feature(unsafe_destructor)]
trait X {
- fn call<T: std::fmt::Show>(&self, x: &T);
- fn default_method<T: std::fmt::Show>(&self, x: &T) {
+ fn call<T: std::fmt::Debug>(&self, x: &T);
+ fn default_method<T: std::fmt::Debug>(&self, x: &T) {
println!("X::default_method {:?}", x);
}
}
-#[derive(Show)]
+#[derive(Debug)]
struct Y(int);
-#[derive(Show)]
+#[derive(Debug)]
struct Z<T> {
x: T
}
impl X for Y {
- fn call<T: std::fmt::Show>(&self, x: &T) {
+ fn call<T: std::fmt::Debug>(&self, x: &T) {
println!("X::call {:?} {:?}", self, x);
}
}
#[unsafe_destructor]
-impl<T: X + std::fmt::Show> Drop for Z<T> {
+impl<T: X + std::fmt::Debug> Drop for Z<T> {
fn drop(&mut self) {
// These statements used to cause an ICE.
self.x.call(self);
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-fn assert_repr_eq<T: std::fmt::Show>(obj : T, expected : String) {
+fn assert_repr_eq<T: std::fmt::Debug>(obj : T, expected : String) {
assert_eq!(expected, format!("{:?}", obj));
}
pub fn main() {
- let abc = [1i, 2, 3];
+ let abc = [1, 2, 3];
let tf = [true, false];
let x = [(), ()];
let slice = &x[..1];
- assert_repr_eq(&abc[], "[1i, 2i, 3i]".to_string());
+ assert_repr_eq(&abc[], "[1, 2, 3]".to_string());
assert_repr_eq(&tf[], "[true, false]".to_string());
assert_repr_eq(&x[], "[(), ()]".to_string());
assert_repr_eq(slice, "[()]".to_string());
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#[derive(Clone, Show)]
+#[derive(Clone, Debug)]
enum foo {
a(uint),
b(String),
}
-fn check_log<T: std::fmt::Show>(exp: String, v: T) {
+fn check_log<T: std::fmt::Debug>(exp: String, v: T) {
assert_eq!(exp, format!("{:?}", v));
}
pub fn main() {
- let mut x = Some(foo::a(22u));
- let exp = "Some(a(22u))".to_string();
+ let mut x = Some(foo::a(22));
+ let exp = "Some(a(22))".to_string();
let act = format!("{:?}", x);
assert_eq!(act, exp);
check_log(exp, x);
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#[derive(Show)]
+#[derive(Debug)]
enum foo {
- a(uint),
+ a(usize),
b(String),
c,
}
-#[derive(Show)]
+#[derive(Debug)]
enum bar {
d, e, f
}
pub fn main() {
- assert_eq!("a(22u)".to_string(), format!("{:?}", foo::a(22u)));
+ assert_eq!("a(22)".to_string(), format!("{:?}", foo::a(22)));
assert_eq!("c".to_string(), format!("{:?}", foo::c));
assert_eq!("d".to_string(), format!("{:?}", bar::d));
}
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-use std::fmt::Show;
+use std::fmt::Debug;
trait MyTrait<T> {
fn get(&self) -> T;
}
fn test_eq<T,M>(m: M, v: T)
-where T : Eq + Show,
+where T : Eq + Debug,
M : MyTrait<T>
{
assert_eq!(m.get(), v);
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-use std::fmt::Show;
+use std::fmt::Debug;
use std::default::Default;
trait MyTrait<T> {
}
fn test_eq<T,M>(m: M, v: T)
-where T : Eq + Show,
+where T : Eq + Debug,
M : MyTrait<T>
{
assert_eq!(m.get(), v);
Thread::scoped(move|| -> () {
let _a = A;
panic!();
- }).join().unwrap_err();
+ }).join().err().unwrap();
assert!(unsafe { !HIT });
}
}
}
-impl<K: PartialEq + std::fmt::Show, V:Clone> Index<K> for AssociationList<K,V> {
+impl<K: PartialEq + std::fmt::Debug, V:Clone> Index<K> for AssociationList<K,V> {
type Output = V;
fn index<'a>(&'a self, index: &K) -> &'a V {
}
// This is the type with the questionable alignment
-#[derive(Show)]
+#[derive(Debug)]
struct Inner {
c64: u32
}
// This is the type that contains the type with the
// questionable alignment, for testing
-#[derive(Show)]
+#[derive(Debug)]
struct Outer {
c8: u8,
t: Inner
// because `inner`s alignment was 4.
assert_eq!(mem::size_of::<Outer>(), m::size());
- assert_eq!(y, "Outer { c8: 22u8, t: Inner { c64: 44u32 } }".to_string());
+ assert_eq!(y, "Outer { c8: 22, t: Inner { c64: 44 } }".to_string());
}
}
}
// This is the type with the questionable alignment
-#[derive(Show)]
+#[derive(Debug)]
struct Inner {
c64: u64
}
// This is the type that contains the type with the
// questionable alignment, for testing
-#[derive(Show)]
+#[derive(Debug)]
struct Outer {
c8: u8,
t: Inner
// because `Inner`s alignment was 4.
assert_eq!(mem::size_of::<Outer>(), m::m::size());
- assert_eq!(y, "Outer { c8: 22u8, t: Inner { c64: 44u64 } }".to_string());
+ assert_eq!(y, "Outer { c8: 22, t: Inner { c64: 44 } }".to_string());
}
}
}
fn main() {
- Thread::scoped(move|| { ::b::g() }).join().unwrap_err();
+ Thread::scoped(move|| { ::b::g() }).join().err().unwrap();
}
#![allow(unknown_features)]
#![feature(box_syntax)]
-#[derive(Show)]
+#[derive(Debug)]
struct Foo(Box<[u8]>);
pub fn main() {
use std::mem::size_of;
-#[derive(PartialEq, Show)]
+#[derive(PartialEq, Debug)]
enum Either<T, U> { Left(T), Right(U) }
macro_rules! check {
pub fn main() {
check!(Option<u8>, 2,
None, "None",
- Some(129u8), "Some(129u8)");
+ Some(129u8), "Some(129)");
check!(Option<i16>, 4,
None, "None",
- Some(-20000i16), "Some(-20000i16)");
+ Some(-20000i16), "Some(-20000)");
check!(Either<u8, i8>, 2,
- Either::Left(132u8), "Left(132u8)",
- Either::Right(-32i8), "Right(-32i8)");
+ Either::Left(132u8), "Left(132)",
+ Either::Right(-32i8), "Right(-32)");
check!(Either<u8, i16>, 4,
- Either::Left(132u8), "Left(132u8)",
- Either::Right(-20000i16), "Right(-20000i16)");
+ Either::Left(132u8), "Left(132)",
+ Either::Right(-20000i16), "Right(-20000)");
}
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#[derive(Show)]
+#[derive(Debug)]
enum a_tag {
a_tag_var(u64)
}
-#[derive(Show)]
+#[derive(Debug)]
struct t_rec {
c8: u8,
t: a_tag
let x = t_rec {c8: 22u8, t: a_tag::a_tag_var(44u64)};
let y = format!("{:?}", x);
println!("y = {:?}", y);
- assert_eq!(y, "t_rec { c8: 22u8, t: a_tag_var(44u64) }".to_string());
+ assert_eq!(y, "t_rec { c8: 22, t: a_tag_var(44) }".to_string());
}
let _b = Foo;
}).join();
- let s = x.unwrap_err().downcast::<&'static str>().unwrap();
+ let s = x.err().unwrap().downcast::<&'static str>().ok().unwrap();
assert_eq!(s.as_slice(), "This panic should happen.");
}
--- /dev/null
+// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+fn one() -> i32 { 1 }
+
+// Make sure the vec![...] macro doesn't introduce hidden rvalue
+// scopes (such as blocks) around the element expressions.
+pub fn main() {
+ assert_eq!(vec![&one(), &one(), &2], vec![&1, &1, &(one()+one())]);
+ assert_eq!(vec![&one(); 2], vec![&1, &one()]);
+}
// except according to those terms.
pub fn main() {
- assert_eq!(format!("{:?}", vec!(0i, 1)), "[0i, 1i]".to_string());
+ assert_eq!(format!("{:?}", vec!(0i, 1)), "[0, 1]".to_string());
let foo = vec!(3i, 4);
let bar: &[int] = &[4, 5];
- assert_eq!(format!("{:?}", foo), "[3i, 4i]");
- assert_eq!(format!("{:?}", bar), "[4i, 5i]");
+ assert_eq!(format!("{:?}", foo), "[3, 4]");
+ assert_eq!(format!("{:?}", bar), "[4, 5]");
}
let _failures = range(0, 100).map(|_| {
let cmd = Command::new(too_long.as_slice());
let failed = cmd.spawn();
- assert!(failed.is_err(), "Make sure the command fails to spawn(): {}", cmd);
+ assert!(failed.is_err(), "Make sure the command fails to spawn(): {:?}", cmd);
failed
}).collect::<Vec<_>>();
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-// compile-flags:-D ctypes
+// compile-flags:-D improper-ctypes
-#![allow(ctypes)]
+#![allow(improper_ctypes)]
mod libc {
extern {