Auto merge of #145997 - matthiaskrgr:rollup-tsgylre, r=matthiaskrgr
Rollup of 4 pull requests Successful merges: - rust-lang/rust#145675 (Rehome 30 `tests/ui/issues/` tests to other subdirectories under `tests/ui/` [rust-lang/rust#1 of Batch rust-lang/rust#2]) - rust-lang/rust#145676 (Rehome 30 `tests/ui/issues/` tests to other subdirectories under `tests/ui/` [rust-lang/rust#2 of Batch rust-lang/rust#2]) - rust-lang/rust#145982 (compiletest: Reduce the number of `println!` calls that don't have access to `TestCx`) - rust-lang/rust#145984 (`TokenStream` cleanups) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
@@ -3,15 +3,6 @@
|
||||
//! `TokenStream`s represent syntactic objects before they are converted into ASTs.
|
||||
//! A `TokenStream` is, roughly speaking, a sequence of [`TokenTree`]s,
|
||||
//! which are themselves a single [`Token`] or a `Delimited` subsequence of tokens.
|
||||
//!
|
||||
//! ## Ownership
|
||||
//!
|
||||
//! `TokenStream`s are persistent data structures constructed as ropes with reference
|
||||
//! counted-children. In general, this means that calling an operation on a `TokenStream`
|
||||
//! (such as `slice`) produces an entirely new `TokenStream` from the borrowed reference to
|
||||
//! the original. This essentially coerces `TokenStream`s into "views" of their subparts,
|
||||
//! and a borrowed `TokenStream` is sufficient to build an owned `TokenStream` without taking
|
||||
//! ownership of the original.
|
||||
|
||||
use std::borrow::Cow;
|
||||
use std::ops::Range;
|
||||
@@ -99,17 +90,6 @@ impl TokenTree {
|
||||
}
|
||||
}
|
||||
|
||||
impl<CTX> HashStable<CTX> for TokenStream
|
||||
where
|
||||
CTX: crate::HashStableContext,
|
||||
{
|
||||
fn hash_stable(&self, hcx: &mut CTX, hasher: &mut StableHasher) {
|
||||
for sub_tt in self.iter() {
|
||||
sub_tt.hash_stable(hcx, hasher);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// A lazy version of [`AttrTokenStream`], which defers creation of an actual
|
||||
/// `AttrTokenStream` until it is needed.
|
||||
#[derive(Clone)]
|
||||
@@ -556,10 +536,6 @@ pub struct AttrsTarget {
|
||||
pub tokens: LazyAttrTokenStream,
|
||||
}
|
||||
|
||||
/// A `TokenStream` is an abstract sequence of tokens, organized into [`TokenTree`]s.
|
||||
#[derive(Clone, Debug, Default, Encodable, Decodable)]
|
||||
pub struct TokenStream(pub(crate) Arc<Vec<TokenTree>>);
|
||||
|
||||
/// Indicates whether a token can join with the following token to form a
|
||||
/// compound token. Used for conversions to `proc_macro::Spacing`. Also used to
|
||||
/// guide pretty-printing, which is where the `JointHidden` value (which isn't
|
||||
@@ -620,58 +596,9 @@ pub enum Spacing {
|
||||
JointHidden,
|
||||
}
|
||||
|
||||
impl TokenStream {
|
||||
/// Given a `TokenStream` with a `Stream` of only two arguments, return a new `TokenStream`
|
||||
/// separating the two arguments with a comma for diagnostic suggestions.
|
||||
pub fn add_comma(&self) -> Option<(TokenStream, Span)> {
|
||||
// Used to suggest if a user writes `foo!(a b);`
|
||||
let mut suggestion = None;
|
||||
let mut iter = self.0.iter().enumerate().peekable();
|
||||
while let Some((pos, ts)) = iter.next() {
|
||||
if let Some((_, next)) = iter.peek() {
|
||||
let sp = match (&ts, &next) {
|
||||
(_, TokenTree::Token(Token { kind: token::Comma, .. }, _)) => continue,
|
||||
(
|
||||
TokenTree::Token(token_left, Spacing::Alone),
|
||||
TokenTree::Token(token_right, _),
|
||||
) if (token_left.is_non_reserved_ident() || token_left.is_lit())
|
||||
&& (token_right.is_non_reserved_ident() || token_right.is_lit()) =>
|
||||
{
|
||||
token_left.span
|
||||
}
|
||||
(TokenTree::Delimited(sp, ..), _) => sp.entire(),
|
||||
_ => continue,
|
||||
};
|
||||
let sp = sp.shrink_to_hi();
|
||||
let comma = TokenTree::token_alone(token::Comma, sp);
|
||||
suggestion = Some((pos, comma, sp));
|
||||
}
|
||||
}
|
||||
if let Some((pos, comma, sp)) = suggestion {
|
||||
let mut new_stream = Vec::with_capacity(self.0.len() + 1);
|
||||
let parts = self.0.split_at(pos + 1);
|
||||
new_stream.extend_from_slice(parts.0);
|
||||
new_stream.push(comma);
|
||||
new_stream.extend_from_slice(parts.1);
|
||||
return Some((TokenStream::new(new_stream), sp));
|
||||
}
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
impl FromIterator<TokenTree> for TokenStream {
|
||||
fn from_iter<I: IntoIterator<Item = TokenTree>>(iter: I) -> Self {
|
||||
TokenStream::new(iter.into_iter().collect::<Vec<TokenTree>>())
|
||||
}
|
||||
}
|
||||
|
||||
impl Eq for TokenStream {}
|
||||
|
||||
impl PartialEq<TokenStream> for TokenStream {
|
||||
fn eq(&self, other: &TokenStream) -> bool {
|
||||
self.iter().eq(other.iter())
|
||||
}
|
||||
}
|
||||
/// A `TokenStream` is an abstract sequence of tokens, organized into [`TokenTree`]s.
|
||||
#[derive(Clone, Debug, Default, Encodable, Decodable)]
|
||||
pub struct TokenStream(pub(crate) Arc<Vec<TokenTree>>);
|
||||
|
||||
impl TokenStream {
|
||||
pub fn new(tts: Vec<TokenTree>) -> TokenStream {
|
||||
@@ -847,6 +774,68 @@ impl TokenStream {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Given a `TokenStream` with a `Stream` of only two arguments, return a new `TokenStream`
|
||||
/// separating the two arguments with a comma for diagnostic suggestions.
|
||||
pub fn add_comma(&self) -> Option<(TokenStream, Span)> {
|
||||
// Used to suggest if a user writes `foo!(a b);`
|
||||
let mut suggestion = None;
|
||||
let mut iter = self.0.iter().enumerate().peekable();
|
||||
while let Some((pos, ts)) = iter.next() {
|
||||
if let Some((_, next)) = iter.peek() {
|
||||
let sp = match (&ts, &next) {
|
||||
(_, TokenTree::Token(Token { kind: token::Comma, .. }, _)) => continue,
|
||||
(
|
||||
TokenTree::Token(token_left, Spacing::Alone),
|
||||
TokenTree::Token(token_right, _),
|
||||
) if (token_left.is_non_reserved_ident() || token_left.is_lit())
|
||||
&& (token_right.is_non_reserved_ident() || token_right.is_lit()) =>
|
||||
{
|
||||
token_left.span
|
||||
}
|
||||
(TokenTree::Delimited(sp, ..), _) => sp.entire(),
|
||||
_ => continue,
|
||||
};
|
||||
let sp = sp.shrink_to_hi();
|
||||
let comma = TokenTree::token_alone(token::Comma, sp);
|
||||
suggestion = Some((pos, comma, sp));
|
||||
}
|
||||
}
|
||||
if let Some((pos, comma, sp)) = suggestion {
|
||||
let mut new_stream = Vec::with_capacity(self.0.len() + 1);
|
||||
let parts = self.0.split_at(pos + 1);
|
||||
new_stream.extend_from_slice(parts.0);
|
||||
new_stream.push(comma);
|
||||
new_stream.extend_from_slice(parts.1);
|
||||
return Some((TokenStream::new(new_stream), sp));
|
||||
}
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialEq<TokenStream> for TokenStream {
|
||||
fn eq(&self, other: &TokenStream) -> bool {
|
||||
self.iter().eq(other.iter())
|
||||
}
|
||||
}
|
||||
|
||||
impl Eq for TokenStream {}
|
||||
|
||||
impl FromIterator<TokenTree> for TokenStream {
|
||||
fn from_iter<I: IntoIterator<Item = TokenTree>>(iter: I) -> Self {
|
||||
TokenStream::new(iter.into_iter().collect::<Vec<TokenTree>>())
|
||||
}
|
||||
}
|
||||
|
||||
impl<CTX> HashStable<CTX> for TokenStream
|
||||
where
|
||||
CTX: crate::HashStableContext,
|
||||
{
|
||||
fn hash_stable(&self, hcx: &mut CTX, hasher: &mut StableHasher) {
|
||||
for sub_tt in self.iter() {
|
||||
sub_tt.hash_stable(hcx, hasher);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
|
||||
@@ -2,7 +2,7 @@ use std::env;
|
||||
use std::io::IsTerminal;
|
||||
use std::sync::Arc;
|
||||
|
||||
use compiletest::{early_config_check, log_config, parse_config, run_tests};
|
||||
use compiletest::{early_config_check, parse_config, run_tests};
|
||||
|
||||
fn main() {
|
||||
tracing_subscriber::fmt::init();
|
||||
@@ -19,6 +19,5 @@ fn main() {
|
||||
|
||||
early_config_check(&config);
|
||||
|
||||
log_config(&config);
|
||||
run_tests(config);
|
||||
}
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
mod tests;
|
||||
|
||||
pub mod common;
|
||||
pub mod compute_diff;
|
||||
mod debuggers;
|
||||
pub mod diagnostics;
|
||||
pub mod directives;
|
||||
@@ -44,7 +43,6 @@ use crate::common::{
|
||||
};
|
||||
use crate::directives::DirectivesCache;
|
||||
use crate::executor::{CollectedTest, ColorConfig};
|
||||
use crate::util::logv;
|
||||
|
||||
/// Creates the `Config` instance for this invocation of compiletest.
|
||||
///
|
||||
@@ -477,51 +475,6 @@ pub fn parse_config(args: Vec<String>) -> Config {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn log_config(config: &Config) {
|
||||
let c = config;
|
||||
logv(c, "configuration:".to_string());
|
||||
logv(c, format!("compile_lib_path: {}", config.compile_lib_path));
|
||||
logv(c, format!("run_lib_path: {}", config.run_lib_path));
|
||||
logv(c, format!("rustc_path: {}", config.rustc_path));
|
||||
logv(c, format!("cargo_path: {:?}", config.cargo_path));
|
||||
logv(c, format!("rustdoc_path: {:?}", config.rustdoc_path));
|
||||
|
||||
logv(c, format!("src_root: {}", config.src_root));
|
||||
logv(c, format!("src_test_suite_root: {}", config.src_test_suite_root));
|
||||
|
||||
logv(c, format!("build_root: {}", config.build_root));
|
||||
logv(c, format!("build_test_suite_root: {}", config.build_test_suite_root));
|
||||
|
||||
logv(c, format!("sysroot_base: {}", config.sysroot_base));
|
||||
|
||||
logv(c, format!("stage: {}", config.stage));
|
||||
logv(c, format!("stage_id: {}", config.stage_id));
|
||||
logv(c, format!("mode: {}", config.mode));
|
||||
logv(c, format!("run_ignored: {}", config.run_ignored));
|
||||
logv(c, format!("filters: {:?}", config.filters));
|
||||
logv(c, format!("skip: {:?}", config.skip));
|
||||
logv(c, format!("filter_exact: {}", config.filter_exact));
|
||||
logv(
|
||||
c,
|
||||
format!("force_pass_mode: {}", opt_str(&config.force_pass_mode.map(|m| format!("{}", m))),),
|
||||
);
|
||||
logv(c, format!("runner: {}", opt_str(&config.runner)));
|
||||
logv(c, format!("host-rustcflags: {:?}", config.host_rustcflags));
|
||||
logv(c, format!("target-rustcflags: {:?}", config.target_rustcflags));
|
||||
logv(c, format!("target: {}", config.target));
|
||||
logv(c, format!("host: {}", config.host));
|
||||
logv(c, format!("android-cross-path: {}", config.android_cross_path));
|
||||
logv(c, format!("adb_path: {}", config.adb_path));
|
||||
logv(c, format!("adb_test_dir: {}", config.adb_test_dir));
|
||||
logv(c, format!("adb_device_status: {}", config.adb_device_status));
|
||||
logv(c, format!("ar: {}", config.ar));
|
||||
logv(c, format!("target-linker: {:?}", config.target_linker));
|
||||
logv(c, format!("host-linker: {:?}", config.host_linker));
|
||||
logv(c, format!("verbose: {}", config.verbose));
|
||||
logv(c, format!("minicore_path: {}", config.minicore_path));
|
||||
logv(c, "\n".to_string());
|
||||
}
|
||||
|
||||
pub fn opt_str(maybestr: &Option<String>) -> &str {
|
||||
match *maybestr {
|
||||
None => "(none)",
|
||||
@@ -538,6 +491,8 @@ pub fn opt_str2(maybestr: Option<String>) -> String {
|
||||
|
||||
/// Called by `main` after the config has been parsed.
|
||||
pub fn run_tests(config: Arc<Config>) {
|
||||
debug!(?config, "run_tests");
|
||||
|
||||
// If we want to collect rustfix coverage information,
|
||||
// we first make sure that the coverage file does not exist.
|
||||
// It will be created later on.
|
||||
|
||||
@@ -7,7 +7,7 @@ use std::io::prelude::*;
|
||||
use std::io::{self, BufReader};
|
||||
use std::process::{Child, Command, ExitStatus, Output, Stdio};
|
||||
use std::sync::Arc;
|
||||
use std::{env, iter, str};
|
||||
use std::{env, fmt, iter, str};
|
||||
|
||||
use build_helper::fs::remove_and_create_dir_all;
|
||||
use camino::{Utf8Path, Utf8PathBuf};
|
||||
@@ -21,15 +21,13 @@ use crate::common::{
|
||||
UI_WINDOWS_SVG, expected_output_path, incremental_dir, output_base_dir, output_base_name,
|
||||
output_testname_unique,
|
||||
};
|
||||
use crate::compute_diff::{DiffLine, make_diff, write_diff, write_filtered_diff};
|
||||
use crate::directives::TestProps;
|
||||
use crate::errors::{Error, ErrorKind, load_errors};
|
||||
use crate::read2::{Truncated, read2_abbreviated};
|
||||
use crate::util::{Utf8PathBufExt, add_dylib_path, logv, static_regex};
|
||||
use crate::runtest::compute_diff::{DiffLine, make_diff, write_diff, write_filtered_diff};
|
||||
use crate::util::{Utf8PathBufExt, add_dylib_path, static_regex};
|
||||
use crate::{ColorConfig, help, json, stamp_file_path, warning};
|
||||
|
||||
mod debugger;
|
||||
|
||||
// Helper modules that implement test running logic for each test suite.
|
||||
// tidy-alphabetical-start
|
||||
mod assembly;
|
||||
@@ -48,6 +46,8 @@ mod rustdoc_json;
|
||||
mod ui;
|
||||
// tidy-alphabetical-end
|
||||
|
||||
mod compute_diff;
|
||||
mod debugger;
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
||||
@@ -1459,7 +1459,7 @@ impl<'test> TestCx<'test> {
|
||||
) -> ProcRes {
|
||||
let cmdline = {
|
||||
let cmdline = self.make_cmdline(&command, lib_path);
|
||||
logv(self.config, format!("executing {}", cmdline));
|
||||
self.logv(format_args!("executing {cmdline}"));
|
||||
cmdline
|
||||
};
|
||||
|
||||
@@ -2006,6 +2006,18 @@ impl<'test> TestCx<'test> {
|
||||
output_base_name(self.config, self.testpaths, self.safe_revision())
|
||||
}
|
||||
|
||||
/// Prints a message to (captured) stdout if `config.verbose` is true.
|
||||
/// The message is also logged to `tracing::debug!` regardles of verbosity.
|
||||
///
|
||||
/// Use `format_args!` as the argument to perform formatting if required.
|
||||
fn logv(&self, message: impl fmt::Display) {
|
||||
debug!("{message}");
|
||||
if self.config.verbose {
|
||||
// Note: `./x test ... --verbose --no-capture` is needed to see this print.
|
||||
println!("{message}");
|
||||
}
|
||||
}
|
||||
|
||||
/// Prefix to print before error messages. Normally just `error`, but also
|
||||
/// includes the revision name for tests that use revisions.
|
||||
#[must_use]
|
||||
@@ -2666,8 +2678,8 @@ impl<'test> TestCx<'test> {
|
||||
//
|
||||
// It's not possible to detect paths in the error messages generally, but this is a
|
||||
// decent enough heuristic.
|
||||
static_regex!(
|
||||
r#"(?x)
|
||||
let re = static_regex!(
|
||||
r#"(?x)
|
||||
(?:
|
||||
# Match paths that don't include spaces.
|
||||
(?:\\[\pL\pN\.\-_']+)+\.\pL+
|
||||
@@ -2675,11 +2687,8 @@ impl<'test> TestCx<'test> {
|
||||
# If the path starts with a well-known root, then allow spaces and no file extension.
|
||||
\$(?:DIR|SRC_DIR|TEST_BUILD_DIR|BUILD_DIR|LIB_DIR)(?:\\[\pL\pN\.\-_'\ ]+)+
|
||||
)"#
|
||||
)
|
||||
.replace_all(&output, |caps: &Captures<'_>| {
|
||||
println!("{}", &caps[0]);
|
||||
caps[0].replace(r"\", "/")
|
||||
})
|
||||
);
|
||||
re.replace_all(&output, |caps: &Captures<'_>| caps[0].replace(r"\", "/"))
|
||||
.replace("\r\n", "\n")
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,6 @@ use super::debugger::DebuggerCommands;
|
||||
use super::{Debugger, Emit, ProcRes, TestCx, Truncated, WillExecute};
|
||||
use crate::common::Config;
|
||||
use crate::debuggers::{extract_gdb_version, is_android_gdb_target};
|
||||
use crate::util::logv;
|
||||
|
||||
impl TestCx<'_> {
|
||||
pub(super) fn run_debuginfo_test(&self) {
|
||||
@@ -234,7 +233,7 @@ impl TestCx<'_> {
|
||||
gdb.args(debugger_opts);
|
||||
// FIXME(jieyouxu): don't pass an empty Path
|
||||
let cmdline = self.make_cmdline(&gdb, Utf8Path::new(""));
|
||||
logv(self.config, format!("executing {}", cmdline));
|
||||
self.logv(format_args!("executing {cmdline}"));
|
||||
cmdline
|
||||
};
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ use miropt_test_tools::{MiroptTest, MiroptTestFile, files_for_miropt_test};
|
||||
use tracing::debug;
|
||||
|
||||
use super::{Emit, TestCx, WillExecute};
|
||||
use crate::compute_diff::write_diff;
|
||||
use crate::runtest::compute_diff::write_diff;
|
||||
|
||||
impl TestCx<'_> {
|
||||
pub(super) fn run_mir_opt_test(&self) {
|
||||
|
||||
@@ -1,14 +1,13 @@
|
||||
use std::fs;
|
||||
|
||||
use super::{ProcRes, ReadFrom, TestCx};
|
||||
use crate::util::logv;
|
||||
|
||||
impl TestCx<'_> {
|
||||
pub(super) fn run_pretty_test(&self) {
|
||||
if self.props.pp_exact.is_some() {
|
||||
logv(self.config, "testing for exact pretty-printing".to_owned());
|
||||
self.logv("testing for exact pretty-printing");
|
||||
} else {
|
||||
logv(self.config, "testing for converging pretty-printing".to_owned());
|
||||
self.logv("testing for converging pretty-printing");
|
||||
}
|
||||
|
||||
let rounds = match self.props.pp_exact {
|
||||
@@ -21,10 +20,7 @@ impl TestCx<'_> {
|
||||
|
||||
let mut round = 0;
|
||||
while round < rounds {
|
||||
logv(
|
||||
self.config,
|
||||
format!("pretty-printing round {} revision {:?}", round, self.revision),
|
||||
);
|
||||
self.logv(format_args!("pretty-printing round {round} revision {:?}", self.revision));
|
||||
let read_from =
|
||||
if round == 0 { ReadFrom::Path } else { ReadFrom::Stdin(srcs[round].to_owned()) };
|
||||
|
||||
|
||||
@@ -2,9 +2,6 @@ use std::env;
|
||||
use std::process::Command;
|
||||
|
||||
use camino::{Utf8Path, Utf8PathBuf};
|
||||
use tracing::*;
|
||||
|
||||
use crate::common::Config;
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
@@ -26,14 +23,6 @@ fn path_div() -> &'static str {
|
||||
";"
|
||||
}
|
||||
|
||||
pub fn logv(config: &Config, s: String) {
|
||||
debug!("{}", s);
|
||||
if config.verbose {
|
||||
// Note: `./x test ... --verbose --no-capture` is needed to see this print.
|
||||
println!("{}", s);
|
||||
}
|
||||
}
|
||||
|
||||
pub trait Utf8PathBufExt {
|
||||
/// Append an extension to the path, even if it already has one.
|
||||
fn with_extra_extension(&self, extension: &str) -> Utf8PathBuf;
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/7092
|
||||
enum Whatever {
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/issue-7092.rs:6:9
|
||||
--> $DIR/method-call-nonsensical-pattern-binding-7092.rs:7:9
|
||||
|
|
||||
LL | match x {
|
||||
| - this expression has type `Whatever`
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/6738
|
||||
struct Foo<T> {
|
||||
x: T,
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
error[E0368]: binary assignment operation `+=` cannot be applied to type `T`
|
||||
--> $DIR/issue-6738.rs:6:9
|
||||
--> $DIR/struct-field-generic-type-binary-assignment-error-6738.rs:7:9
|
||||
|
|
||||
LL | self.x += v.x;
|
||||
| ------^^^^^^^
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/5884
|
||||
//@ build-pass
|
||||
#![allow(dead_code)]
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/5550
|
||||
//@ run-pass
|
||||
#![allow(unused_assignments)]
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/5708
|
||||
//@ run-pass
|
||||
#![allow(unused_variables)]
|
||||
/*
|
||||
@@ -10,7 +11,6 @@ This does not occur with concrete types, only with references
|
||||
to traits.
|
||||
*/
|
||||
|
||||
|
||||
// original
|
||||
trait Inner {
|
||||
fn print(&self);
|
||||
@@ -38,7 +38,6 @@ pub fn main() {
|
||||
outer.inner.print();
|
||||
}
|
||||
|
||||
|
||||
// minimal
|
||||
pub trait MyTrait<T> {
|
||||
fn dummy(&self, t: T) -> T { panic!() }
|
||||
@@ -0,0 +1,7 @@
|
||||
// https://github.com/rust-lang/rust/issues/5518
|
||||
//@ run-pass
|
||||
//@ aux-build:aux-5518.rs
|
||||
|
||||
extern crate aux_5518 as other;
|
||||
|
||||
fn main() {}
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/6557
|
||||
//@ check-pass
|
||||
#![allow(dead_code)]
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/54094
|
||||
//@ check-pass
|
||||
trait Zoo {
|
||||
type X;
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/6318
|
||||
//@ run-pass
|
||||
|
||||
pub enum Thing {
|
||||
@@ -1,6 +1,6 @@
|
||||
// https://github.com/rust-lang/rust/issues/6153
|
||||
//@ run-pass
|
||||
|
||||
|
||||
fn swap<F>(f: F) -> Vec<isize> where F: FnOnce(Vec<isize>) -> Vec<isize> {
|
||||
let x = vec![1, 2, 3];
|
||||
f(x)
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/54462
|
||||
//@ run-pass
|
||||
//
|
||||
//@ compile-flags: -Ccodegen-units=1 -O
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/7012
|
||||
//@ run-pass
|
||||
#![allow(non_camel_case_types)]
|
||||
#![allow(non_upper_case_globals)]
|
||||
@@ -1,5 +1,5 @@
|
||||
warning: method `dummy` is never used
|
||||
--> $DIR/mut-trait-coercion-8248.rs:5:8
|
||||
--> $DIR/coerce-mut-trait-object-8248.rs:5:8
|
||||
|
|
||||
LL | trait A {
|
||||
| - method in this trait
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/54477
|
||||
//@ run-pass
|
||||
// rust-lang/rust#54477: runtime bug in the VecDeque library that was
|
||||
// exposed by this test case, derived from test suite of crates.io
|
||||
@@ -0,0 +1,9 @@
|
||||
// https://github.com/rust-lang/rust/issues/7178
|
||||
//@ run-pass
|
||||
//@ aux-build:aux-7178.rs
|
||||
|
||||
extern crate aux_7178 as cross_crate_self;
|
||||
|
||||
pub fn main() {
|
||||
let _ = cross_crate_self::Foo::new(&1);
|
||||
}
|
||||
10
tests/ui/cross-crate/tuple-struct-cross-crate-7899.rs
Normal file
10
tests/ui/cross-crate/tuple-struct-cross-crate-7899.rs
Normal file
@@ -0,0 +1,10 @@
|
||||
// https://github.com/rust-lang/rust/issues/7899
|
||||
//@ run-pass
|
||||
#![allow(unused_variables)]
|
||||
//@ aux-build:aux-7899.rs
|
||||
|
||||
extern crate aux_7899 as testcrate;
|
||||
|
||||
fn main() {
|
||||
let f = testcrate::V2(1.0f32, 2.0f32);
|
||||
}
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/5900
|
||||
//@ check-pass
|
||||
#![allow(dead_code)]
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/5997
|
||||
//@ run-pass
|
||||
#![allow(dead_code)]
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/6117
|
||||
//@ run-pass
|
||||
#![allow(dead_code)]
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/54696
|
||||
//@ run-pass
|
||||
|
||||
#![allow(unpredictable_function_pointer_comparisons)]
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/5997
|
||||
fn f<Z>() -> bool {
|
||||
enum E { V(Z) }
|
||||
//~^ ERROR can't use generic parameters from outer item
|
||||
@@ -1,5 +1,5 @@
|
||||
error[E0401]: can't use generic parameters from outer item
|
||||
--> $DIR/issue-5997-enum.rs:2:16
|
||||
--> $DIR/enum-definition-with-outer-generic-parameter-5997.rs:3:16
|
||||
|
|
||||
LL | fn f<Z>() -> bool {
|
||||
| - type parameter from outer item
|
||||
@@ -1,8 +0,0 @@
|
||||
extern "C" {
|
||||
pub static mut symbol: [i8];
|
||||
//~^ ERROR the size for values of type `[i8]` cannot be known at compilation time
|
||||
}
|
||||
|
||||
fn main() {
|
||||
println!("{:p}", unsafe { &symbol });
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
error[E0277]: the size for values of type `[i8]` cannot be known at compilation time
|
||||
--> $DIR/issue-54410.rs:2:5
|
||||
|
|
||||
LL | pub static mut symbol: [i8];
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[i8]`
|
||||
= note: statics and constants must have a statically known size
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
@@ -1,7 +0,0 @@
|
||||
//@ run-pass
|
||||
//@ aux-build:issue-5518.rs
|
||||
|
||||
|
||||
extern crate issue_5518 as other;
|
||||
|
||||
fn main() {}
|
||||
@@ -1,7 +0,0 @@
|
||||
//@aux-build:issue-5844-aux.rs
|
||||
|
||||
extern crate issue_5844_aux;
|
||||
|
||||
fn main() {
|
||||
issue_5844_aux::rand(); //~ ERROR: requires unsafe
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
fn f<T>() -> bool {
|
||||
struct S(T); //~ ERROR can't use generic parameters from outer item
|
||||
|
||||
true
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let b = f::<isize>();
|
||||
assert!(b);
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
error[E0401]: can't use generic parameters from outer item
|
||||
--> $DIR/issue-5997-struct.rs:2:14
|
||||
|
|
||||
LL | fn f<T>() -> bool {
|
||||
| - type parameter from outer item
|
||||
LL | struct S(T);
|
||||
| -^ use of generic parameter from outer item
|
||||
| |
|
||||
| help: try introducing a local generic parameter here: `<T>`
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0401`.
|
||||
@@ -1,18 +0,0 @@
|
||||
//@ run-pass
|
||||
#![allow(non_shorthand_field_patterns)]
|
||||
|
||||
struct A { x: usize }
|
||||
|
||||
impl Drop for A {
|
||||
fn drop(&mut self) {}
|
||||
}
|
||||
|
||||
pub fn main() {
|
||||
let a = A { x: 0 };
|
||||
|
||||
match a {
|
||||
A { x : ref x } => {
|
||||
println!("{}", x)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
//@ run-pass
|
||||
//@ aux-build:issue-7178.rs
|
||||
|
||||
|
||||
extern crate issue_7178 as cross_crate_self;
|
||||
|
||||
pub fn main() {
|
||||
let _ = cross_crate_self::Foo::new(&1);
|
||||
}
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/53419
|
||||
//@ check-pass
|
||||
|
||||
struct Foo {
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/7268
|
||||
//@ check-pass
|
||||
#![allow(dead_code)]
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/5741
|
||||
//@ run-pass
|
||||
#![allow(while_true)]
|
||||
#![allow(unreachable_code)]
|
||||
@@ -1,7 +1,7 @@
|
||||
// https://github.com/rust-lang/rust/issues/5554
|
||||
//@ run-pass
|
||||
#![allow(dead_code)]
|
||||
|
||||
|
||||
pub struct X<T> {
|
||||
a: T,
|
||||
}
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/5718
|
||||
//@ run-pass
|
||||
|
||||
struct Element;
|
||||
@@ -1,8 +1,13 @@
|
||||
enum Either<T, U> { Left(T), Right(U) }
|
||||
// https://github.com/rust-lang/rust/issues/5358
|
||||
enum Either<T, U> {
|
||||
Left(T),
|
||||
Right(U),
|
||||
}
|
||||
struct S(Either<usize, usize>);
|
||||
|
||||
fn main() {
|
||||
match S(Either::Left(5)) { //~ NOTE this expression has type `S`
|
||||
match S(Either::Left(5)) {
|
||||
//~^ NOTE this expression has type `S`
|
||||
Either::Right(_) => {}
|
||||
//~^ ERROR mismatched types
|
||||
//~| NOTE expected `S`, found `Either<_, _>`
|
||||
@@ -1,8 +1,9 @@
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/issue-5358-1.rs:6:9
|
||||
--> $DIR/mismatched-types-in-match-5358.rs:11:9
|
||||
|
|
||||
LL | match S(Either::Left(5)) {
|
||||
| ------------------ this expression has type `S`
|
||||
LL |
|
||||
LL | Either::Right(_) => {}
|
||||
| ^^^^^^^^^^^^^^^^ expected `S`, found `Either<_, _>`
|
||||
|
|
||||
@@ -1,5 +1,5 @@
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/mismatched-types-in-match-pattern-7867.rs:10:9
|
||||
--> $DIR/mismatched-types-in-match-7867.rs:10:9
|
||||
|
|
||||
LL | enum A { B, C }
|
||||
| - unit variant defined here
|
||||
@@ -1,5 +1,5 @@
|
||||
warning: trait `Foo` is never used
|
||||
--> $DIR/trait-method-self-param-error-7575.rs:4:7
|
||||
--> $DIR/trait-method-resolution-7575.rs:4:7
|
||||
|
|
||||
LL | trait Foo {
|
||||
| ^^^
|
||||
@@ -1,6 +1,6 @@
|
||||
// https://github.com/rust-lang/rust/issues/5950
|
||||
//@ check-pass
|
||||
|
||||
|
||||
pub use local as local_alias;
|
||||
|
||||
pub mod local { }
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/6130
|
||||
//@ run-pass
|
||||
|
||||
pub fn main() {
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/5572
|
||||
//@ check-pass
|
||||
#![allow(dead_code)]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// https://github.com/rust-lang/rust/issues/6919
|
||||
//@ run-pass
|
||||
#![allow(unused_attributes)]
|
||||
//@ aux-build:iss.rs
|
||||
|
||||
//@ aux-build:iss-6919.rs
|
||||
|
||||
extern crate issue6919_3;
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/55376
|
||||
//@ run-pass
|
||||
// Tests that paths in `pub(...)` don't fail HIR verification.
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/53728
|
||||
//@ run-pass
|
||||
|
||||
#![allow(dead_code)]
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/6936
|
||||
struct T;
|
||||
|
||||
mod t1 {
|
||||
@@ -30,5 +31,4 @@ mod t6 {
|
||||
impl Foo {} // ok
|
||||
}
|
||||
|
||||
|
||||
fn main() {}
|
||||
@@ -1,5 +1,5 @@
|
||||
error[E0428]: the name `Foo` is defined multiple times
|
||||
--> $DIR/issue-6936.rs:5:5
|
||||
--> $DIR/duplicate-name-in-module-6936.rs:6:5
|
||||
|
|
||||
LL | type Foo = crate::T;
|
||||
| -------------------- previous definition of the type `Foo` here
|
||||
@@ -9,7 +9,7 @@ LL | mod Foo {}
|
||||
= note: `Foo` must be defined only once in the type namespace of this module
|
||||
|
||||
error[E0428]: the name `Foo` is defined multiple times
|
||||
--> $DIR/issue-6936.rs:10:5
|
||||
--> $DIR/duplicate-name-in-module-6936.rs:11:5
|
||||
|
|
||||
LL | type Foo = crate::T;
|
||||
| -------------------- previous definition of the type `Foo` here
|
||||
@@ -19,7 +19,7 @@ LL | struct Foo;
|
||||
= note: `Foo` must be defined only once in the type namespace of this module
|
||||
|
||||
error[E0428]: the name `Foo` is defined multiple times
|
||||
--> $DIR/issue-6936.rs:15:5
|
||||
--> $DIR/duplicate-name-in-module-6936.rs:16:5
|
||||
|
|
||||
LL | type Foo = crate::T;
|
||||
| -------------------- previous definition of the type `Foo` here
|
||||
@@ -29,7 +29,7 @@ LL | enum Foo {}
|
||||
= note: `Foo` must be defined only once in the type namespace of this module
|
||||
|
||||
error[E0428]: the name `Bar` is defined multiple times
|
||||
--> $DIR/issue-6936.rs:25:5
|
||||
--> $DIR/duplicate-name-in-module-6936.rs:26:5
|
||||
|
|
||||
LL | type Bar<T> = T;
|
||||
| ---------------- previous definition of the type `Bar` here
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/7044
|
||||
static X: isize = 0;
|
||||
struct X; //~ ERROR the name `X` is defined multiple times
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
error[E0428]: the name `X` is defined multiple times
|
||||
--> $DIR/issue-7044.rs:2:1
|
||||
--> $DIR/unit-like-struct-masks-constant-7044.rs:3:1
|
||||
|
|
||||
LL | static X: isize = 0;
|
||||
| -------------------- previous definition of the value `X` here
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/55380
|
||||
//@ run-pass
|
||||
#![feature(specialization)]
|
||||
//~^ WARN the feature `specialization` is incomplete
|
||||
@@ -1,5 +1,5 @@
|
||||
warning: the feature `specialization` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
--> $DIR/issue-55380.rs:2:12
|
||||
--> $DIR/trait-specialization-default-methods-55380.rs:3:12
|
||||
|
|
||||
LL | #![feature(specialization)]
|
||||
| ^^^^^^^^^^^^^^
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/7364
|
||||
use std::cell::RefCell;
|
||||
|
||||
// Regression test for issue 7364
|
||||
@@ -1,5 +1,5 @@
|
||||
error[E0277]: `RefCell<isize>` cannot be shared between threads safely
|
||||
--> $DIR/issue-7364.rs:4:15
|
||||
--> $DIR/global-variable-promotion-error-7364.rs:5:15
|
||||
|
|
||||
LL | static boxed: Box<RefCell<isize>> = Box::new(RefCell::new(0));
|
||||
| ^^^^^^^^^^^^^^^^^^^ `RefCell<isize>` cannot be shared between threads safely
|
||||
@@ -12,7 +12,7 @@ note: required because it appears within the type `Box<RefCell<isize>>`
|
||||
= note: shared static variables must have a type that implements `Sync`
|
||||
|
||||
error[E0015]: cannot call non-const associated function `Box::<RefCell<isize>>::new` in statics
|
||||
--> $DIR/issue-7364.rs:4:37
|
||||
--> $DIR/global-variable-promotion-error-7364.rs:5:37
|
||||
|
|
||||
LL | static boxed: Box<RefCell<isize>> = Box::new(RefCell::new(0));
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/5917
|
||||
//@ run-pass
|
||||
#![allow(non_upper_case_globals)]
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/5688
|
||||
//@ run-pass
|
||||
/*
|
||||
# Corrupted initialization in the static struct
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/6344
|
||||
//@ run-pass
|
||||
#![allow(non_shorthand_field_patterns)]
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/5439
|
||||
struct Foo {
|
||||
foo: isize,
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
error[E0560]: struct `Foo` has no field named `nonexistent`
|
||||
--> $DIR/issue-5439.rs:11:31
|
||||
--> $DIR/nonexistent-struct-field-error-5439.rs:12:31
|
||||
|
|
||||
LL | return Box::new(Foo { nonexistent: self, foo: i });
|
||||
| ^^^^^^^^^^^ `Foo` does not have this field
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/5666
|
||||
//@ run-pass
|
||||
|
||||
struct Dog {
|
||||
@@ -14,7 +15,6 @@ impl Barks for Dog {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
pub fn main() {
|
||||
let snoopy = Box::new(Dog{name: "snoopy".to_string()});
|
||||
let bubbles = Box::new(Dog{name: "bubbles".to_string()});
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/53568
|
||||
// Regression test for an NLL-related ICE (#53568) -- we failed to
|
||||
// resolve inference variables in "custom type-ops".
|
||||
//
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/5883
|
||||
trait A {}
|
||||
|
||||
struct Struct {
|
||||
@@ -1,19 +1,19 @@
|
||||
error[E0277]: the size for values of type `(dyn A + 'static)` cannot be known at compilation time
|
||||
--> $DIR/issue-5883.rs:9:6
|
||||
--> $DIR/opaque-trait-size-error-5883.rs:10:6
|
||||
|
|
||||
LL | ) -> Struct {
|
||||
| ^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: within `Struct`, the trait `Sized` is not implemented for `(dyn A + 'static)`
|
||||
note: required because it appears within the type `Struct`
|
||||
--> $DIR/issue-5883.rs:3:8
|
||||
--> $DIR/opaque-trait-size-error-5883.rs:4:8
|
||||
|
|
||||
LL | struct Struct {
|
||||
| ^^^^^^
|
||||
= note: the return type of a function must have a statically known size
|
||||
|
||||
error[E0277]: the size for values of type `(dyn A + 'static)` cannot be known at compilation time
|
||||
--> $DIR/issue-5883.rs:8:8
|
||||
--> $DIR/opaque-trait-size-error-5883.rs:9:8
|
||||
|
|
||||
LL | r: dyn A + 'static
|
||||
| ^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/6898
|
||||
//@ check-pass
|
||||
|
||||
use std::mem;
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/5988
|
||||
//@ run-pass
|
||||
|
||||
trait B {
|
||||
@@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/7344
|
||||
//@ run-pass
|
||||
#![allow(unused_must_use)]
|
||||
|
||||
8
tests/ui/unsafe/extern-function-requires-unsafe-5844.rs
Normal file
8
tests/ui/unsafe/extern-function-requires-unsafe-5844.rs
Normal file
@@ -0,0 +1,8 @@
|
||||
// https://github.com/rust-lang/rust/issues/5844
|
||||
//@aux-build:aux-5844.rs
|
||||
|
||||
extern crate aux_5844;
|
||||
|
||||
fn main() {
|
||||
aux_5844::rand(); //~ ERROR: requires unsafe
|
||||
}
|
||||
@@ -1,8 +1,8 @@
|
||||
error[E0133]: call to unsafe function `rand` is unsafe and requires unsafe function or block
|
||||
--> $DIR/issue-5844.rs:6:5
|
||||
--> $DIR/extern-function-requires-unsafe-5844.rs:7:5
|
||||
|
|
||||
LL | issue_5844_aux::rand();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^ call to unsafe function
|
||||
LL | aux_5844::rand();
|
||||
| ^^^^^^^^^^^^^^^^ call to unsafe function
|
||||
|
|
||||
= note: consult the function's documentation for information on how to avoid undefined behavior
|
||||
|
||||
Reference in New Issue
Block a user