Auto merge of #104387 - Manishearth:rollup-9e551p5, r=Manishearth
Rollup of 9 pull requests Successful merges: - #103709 (ci: Upgrade dist-x86_64-netbsd to NetBSD 9.0) - #103744 (Upgrade cc for working is_flag_supported on cross-compiles) - #104105 (llvm: dwo only emitted when object code emitted) - #104158 (Return .efi extension for EFI executable) - #104181 (Add a few known-bug tests) - #104266 (Regression test for coercion of mut-ref to dyn-star) - #104300 (Document `Path::parent` behavior around relative paths) - #104304 (Enable profiler in dist-s390x-linux) - #104362 (Add `delay_span_bug` to `AttrWrapper::take_for_recovery`) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
96ddd32c4b
29 changed files with 680 additions and 55 deletions
|
@ -473,9 +473,9 @@ version = "0.1.0"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cc"
|
name = "cc"
|
||||||
version = "1.0.73"
|
version = "1.0.76"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11"
|
checksum = "76a284da2e6fe2092f2353e51713435363112dfd60030e22add80be333fb928f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"jobserver",
|
"jobserver",
|
||||||
]
|
]
|
||||||
|
|
|
@ -765,11 +765,21 @@ pub(crate) unsafe fn codegen(
|
||||||
drop(handlers);
|
drop(handlers);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// `.dwo` files are only emitted if:
|
||||||
|
//
|
||||||
|
// - Object files are being emitted (i.e. bitcode only or metadata only compilations will not
|
||||||
|
// produce dwarf objects, even if otherwise enabled)
|
||||||
|
// - Target supports Split DWARF
|
||||||
|
// - Split debuginfo is enabled
|
||||||
|
// - Split DWARF kind is `split` (i.e. debuginfo is split into `.dwo` files, not different
|
||||||
|
// sections in the `.o` files).
|
||||||
|
let dwarf_object_emitted = matches!(config.emit_obj, EmitObj::ObjectCode(_))
|
||||||
|
&& cgcx.target_can_use_split_dwarf
|
||||||
|
&& cgcx.split_debuginfo != SplitDebuginfo::Off
|
||||||
|
&& cgcx.split_dwarf_kind == SplitDwarfKind::Split;
|
||||||
Ok(module.into_compiled_module(
|
Ok(module.into_compiled_module(
|
||||||
config.emit_obj != EmitObj::None,
|
config.emit_obj != EmitObj::None,
|
||||||
cgcx.target_can_use_split_dwarf
|
dwarf_object_emitted,
|
||||||
&& cgcx.split_debuginfo != SplitDebuginfo::Off
|
|
||||||
&& cgcx.split_dwarf_kind == SplitDwarfKind::Split,
|
|
||||||
config.emit_bc,
|
config.emit_bc,
|
||||||
&cgcx.output_filenames,
|
&cgcx.output_filenames,
|
||||||
))
|
))
|
||||||
|
|
|
@ -334,7 +334,7 @@ fn main() {
|
||||||
"c++"
|
"c++"
|
||||||
} else if target.contains("netbsd") && llvm_static_stdcpp.is_some() {
|
} else if target.contains("netbsd") && llvm_static_stdcpp.is_some() {
|
||||||
// NetBSD uses a separate library when relocation is required
|
// NetBSD uses a separate library when relocation is required
|
||||||
"stdc++_pic"
|
"stdc++_p"
|
||||||
} else if llvm_use_libcxx.is_some() {
|
} else if llvm_use_libcxx.is_some() {
|
||||||
"c++"
|
"c++"
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -5,7 +5,8 @@ use rustc_ast::tokenstream::{AttrTokenTree, DelimSpan, LazyAttrTokenStream, Spac
|
||||||
use rustc_ast::{self as ast};
|
use rustc_ast::{self as ast};
|
||||||
use rustc_ast::{AttrVec, Attribute, HasAttrs, HasTokens};
|
use rustc_ast::{AttrVec, Attribute, HasAttrs, HasTokens};
|
||||||
use rustc_errors::PResult;
|
use rustc_errors::PResult;
|
||||||
use rustc_span::{sym, Span};
|
use rustc_session::parse::ParseSess;
|
||||||
|
use rustc_span::{sym, Span, DUMMY_SP};
|
||||||
|
|
||||||
use std::convert::TryInto;
|
use std::convert::TryInto;
|
||||||
use std::ops::Range;
|
use std::ops::Range;
|
||||||
|
@ -39,8 +40,13 @@ impl AttrWrapper {
|
||||||
pub fn empty() -> AttrWrapper {
|
pub fn empty() -> AttrWrapper {
|
||||||
AttrWrapper { attrs: AttrVec::new(), start_pos: usize::MAX }
|
AttrWrapper { attrs: AttrVec::new(), start_pos: usize::MAX }
|
||||||
}
|
}
|
||||||
// FIXME: Delay span bug here?
|
|
||||||
pub(crate) fn take_for_recovery(self) -> AttrVec {
|
pub(crate) fn take_for_recovery(self, sess: &ParseSess) -> AttrVec {
|
||||||
|
sess.span_diagnostic.delay_span_bug(
|
||||||
|
self.attrs.get(0).map(|attr| attr.span).unwrap_or(DUMMY_SP),
|
||||||
|
"AttrVec is taken for recovery but no error is produced",
|
||||||
|
);
|
||||||
|
|
||||||
self.attrs
|
self.attrs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2272,7 +2272,7 @@ impl<'a> Parser<'a> {
|
||||||
self.mk_block_err(cond_span.shrink_to_hi())
|
self.mk_block_err(cond_span.shrink_to_hi())
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let attrs = self.parse_outer_attributes()?.take_for_recovery(); // For recovery.
|
let attrs = self.parse_outer_attributes()?; // For recovery.
|
||||||
let block = if self.check(&token::OpenDelim(Delimiter::Brace)) {
|
let block = if self.check(&token::OpenDelim(Delimiter::Brace)) {
|
||||||
self.parse_block()?
|
self.parse_block()?
|
||||||
} else {
|
} else {
|
||||||
|
@ -2289,7 +2289,7 @@ impl<'a> Parser<'a> {
|
||||||
})?
|
})?
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
self.error_on_if_block_attrs(lo, false, block.span, &attrs);
|
self.error_on_if_block_attrs(lo, false, block.span, attrs);
|
||||||
block
|
block
|
||||||
};
|
};
|
||||||
let els = if self.eat_keyword(kw::Else) { Some(self.parse_else_expr()?) } else { None };
|
let els = if self.eat_keyword(kw::Else) { Some(self.parse_else_expr()?) } else { None };
|
||||||
|
@ -2350,7 +2350,7 @@ impl<'a> Parser<'a> {
|
||||||
/// Parses an `else { ... }` expression (`else` token already eaten).
|
/// Parses an `else { ... }` expression (`else` token already eaten).
|
||||||
fn parse_else_expr(&mut self) -> PResult<'a, P<Expr>> {
|
fn parse_else_expr(&mut self) -> PResult<'a, P<Expr>> {
|
||||||
let else_span = self.prev_token.span; // `else`
|
let else_span = self.prev_token.span; // `else`
|
||||||
let attrs = self.parse_outer_attributes()?.take_for_recovery(); // For recovery.
|
let attrs = self.parse_outer_attributes()?; // For recovery.
|
||||||
let expr = if self.eat_keyword(kw::If) {
|
let expr = if self.eat_keyword(kw::If) {
|
||||||
self.parse_if_expr()?
|
self.parse_if_expr()?
|
||||||
} else if self.check(&TokenKind::OpenDelim(Delimiter::Brace)) {
|
} else if self.check(&TokenKind::OpenDelim(Delimiter::Brace)) {
|
||||||
|
@ -2385,7 +2385,7 @@ impl<'a> Parser<'a> {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
self.error_on_if_block_attrs(else_span, true, expr.span, &attrs);
|
self.error_on_if_block_attrs(else_span, true, expr.span, attrs);
|
||||||
Ok(expr)
|
Ok(expr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2394,8 +2394,13 @@ impl<'a> Parser<'a> {
|
||||||
ctx_span: Span,
|
ctx_span: Span,
|
||||||
is_ctx_else: bool,
|
is_ctx_else: bool,
|
||||||
branch_span: Span,
|
branch_span: Span,
|
||||||
attrs: &[ast::Attribute],
|
attrs: AttrWrapper,
|
||||||
) {
|
) {
|
||||||
|
if attrs.is_empty() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let attrs: &[ast::Attribute] = &attrs.take_for_recovery(self.sess);
|
||||||
let (attributes, last) = match attrs {
|
let (attributes, last) = match attrs {
|
||||||
[] => return,
|
[] => return,
|
||||||
[x0 @ xn] | [x0, .., xn] => (x0.span.to(xn.span), xn.span),
|
[x0 @ xn] | [x0, .., xn] => (x0.span.to(xn.span), xn.span),
|
||||||
|
|
|
@ -19,7 +19,7 @@ use rustc_ast as ast;
|
||||||
use rustc_ast::ptr::P;
|
use rustc_ast::ptr::P;
|
||||||
use rustc_ast::token::{self, Delimiter, TokenKind};
|
use rustc_ast::token::{self, Delimiter, TokenKind};
|
||||||
use rustc_ast::util::classify;
|
use rustc_ast::util::classify;
|
||||||
use rustc_ast::{AttrStyle, AttrVec, Attribute, LocalKind, MacCall, MacCallStmt, MacStmtStyle};
|
use rustc_ast::{AttrStyle, AttrVec, LocalKind, MacCall, MacCallStmt, MacStmtStyle};
|
||||||
use rustc_ast::{Block, BlockCheckMode, Expr, ExprKind, HasAttrs, Local, Stmt};
|
use rustc_ast::{Block, BlockCheckMode, Expr, ExprKind, HasAttrs, Local, Stmt};
|
||||||
use rustc_ast::{StmtKind, DUMMY_NODE_ID};
|
use rustc_ast::{StmtKind, DUMMY_NODE_ID};
|
||||||
use rustc_errors::{Applicability, DiagnosticBuilder, ErrorGuaranteed, PResult};
|
use rustc_errors::{Applicability, DiagnosticBuilder, ErrorGuaranteed, PResult};
|
||||||
|
@ -101,7 +101,7 @@ impl<'a> Parser<'a> {
|
||||||
self.mk_stmt(lo.to(item.span), StmtKind::Item(P(item)))
|
self.mk_stmt(lo.to(item.span), StmtKind::Item(P(item)))
|
||||||
} else if self.eat(&token::Semi) {
|
} else if self.eat(&token::Semi) {
|
||||||
// Do not attempt to parse an expression if we're done here.
|
// Do not attempt to parse an expression if we're done here.
|
||||||
self.error_outer_attrs(&attrs.take_for_recovery());
|
self.error_outer_attrs(attrs);
|
||||||
self.mk_stmt(lo, StmtKind::Empty)
|
self.mk_stmt(lo, StmtKind::Empty)
|
||||||
} else if self.token != token::CloseDelim(Delimiter::Brace) {
|
} else if self.token != token::CloseDelim(Delimiter::Brace) {
|
||||||
// Remainder are line-expr stmts.
|
// Remainder are line-expr stmts.
|
||||||
|
@ -120,7 +120,7 @@ impl<'a> Parser<'a> {
|
||||||
}
|
}
|
||||||
self.mk_stmt(lo.to(e.span), StmtKind::Expr(e))
|
self.mk_stmt(lo.to(e.span), StmtKind::Expr(e))
|
||||||
} else {
|
} else {
|
||||||
self.error_outer_attrs(&attrs.take_for_recovery());
|
self.error_outer_attrs(attrs);
|
||||||
return Ok(None);
|
return Ok(None);
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
@ -199,8 +199,10 @@ impl<'a> Parser<'a> {
|
||||||
|
|
||||||
/// Error on outer attributes in this context.
|
/// Error on outer attributes in this context.
|
||||||
/// Also error if the previous token was a doc comment.
|
/// Also error if the previous token was a doc comment.
|
||||||
fn error_outer_attrs(&self, attrs: &[Attribute]) {
|
fn error_outer_attrs(&self, attrs: AttrWrapper) {
|
||||||
if let [.., last] = attrs {
|
if !attrs.is_empty()
|
||||||
|
&& let attrs = attrs.take_for_recovery(self.sess)
|
||||||
|
&& let attrs @ [.., last] = &*attrs {
|
||||||
if last.is_doc_comment() {
|
if last.is_doc_comment() {
|
||||||
self.sess.emit_err(DocCommentDoesNotDocumentAnything {
|
self.sess.emit_err(DocCommentDoesNotDocumentAnything {
|
||||||
span: last.span,
|
span: last.span,
|
||||||
|
|
|
@ -2142,7 +2142,10 @@ impl Path {
|
||||||
|
|
||||||
/// Returns the `Path` without its final component, if there is one.
|
/// Returns the `Path` without its final component, if there is one.
|
||||||
///
|
///
|
||||||
/// Returns [`None`] if the path terminates in a root or prefix.
|
/// This means it returns `Some("")` for relative paths with one component.
|
||||||
|
///
|
||||||
|
/// Returns [`None`] if the path terminates in a root or prefix, or if it's
|
||||||
|
/// the empty string.
|
||||||
///
|
///
|
||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
|
@ -2156,6 +2159,14 @@ impl Path {
|
||||||
/// let grand_parent = parent.parent().unwrap();
|
/// let grand_parent = parent.parent().unwrap();
|
||||||
/// assert_eq!(grand_parent, Path::new("/"));
|
/// assert_eq!(grand_parent, Path::new("/"));
|
||||||
/// assert_eq!(grand_parent.parent(), None);
|
/// assert_eq!(grand_parent.parent(), None);
|
||||||
|
///
|
||||||
|
/// let relative_path = Path::new("foo/bar");
|
||||||
|
/// let parent = relative_path.parent();
|
||||||
|
/// assert_eq!(parent, Some(Path::new("foo")));
|
||||||
|
/// let grand_parent = parent.and_then(Path::parent);
|
||||||
|
/// assert_eq!(grand_parent, Some(Path::new("")));
|
||||||
|
/// let great_grand_parent = grand_parent.and_then(Path::parent);
|
||||||
|
/// assert_eq!(great_grand_parent, None);
|
||||||
/// ```
|
/// ```
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
#[doc(alias = "dirname")]
|
#[doc(alias = "dirname")]
|
||||||
|
|
|
@ -20,7 +20,7 @@ compiler_builtins = "0.1.0"
|
||||||
cfg-if = "1.0"
|
cfg-if = "1.0"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
cc = "1.0.69"
|
cc = "1.0.76"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,13 @@ pub use t;
|
||||||
/// Given an executable called `name`, return the filename for the
|
/// Given an executable called `name`, return the filename for the
|
||||||
/// executable for a particular target.
|
/// executable for a particular target.
|
||||||
pub fn exe(name: &str, target: TargetSelection) -> String {
|
pub fn exe(name: &str, target: TargetSelection) -> String {
|
||||||
if target.contains("windows") { format!("{}.exe", name) } else { name.to_string() }
|
if target.contains("windows") {
|
||||||
|
format!("{}.exe", name)
|
||||||
|
} else if target.contains("uefi") {
|
||||||
|
format!("{}.efi", name)
|
||||||
|
} else {
|
||||||
|
name.to_string()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns `true` if the file name given looks like a dynamic library.
|
/// Returns `true` if the file name given looks like a dynamic library.
|
||||||
|
|
|
@ -28,5 +28,5 @@ ENV \
|
||||||
|
|
||||||
ENV HOSTS=s390x-unknown-linux-gnu
|
ENV HOSTS=s390x-unknown-linux-gnu
|
||||||
|
|
||||||
ENV RUST_CONFIGURE_ARGS --enable-extended --enable-lld --disable-docs
|
ENV RUST_CONFIGURE_ARGS --enable-extended --enable-lld --enable-profiler --disable-docs
|
||||||
ENV SCRIPT python3 ../x.py dist --host $HOSTS --target $HOSTS
|
ENV SCRIPT python3 ../x.py dist --host $HOSTS --target $HOSTS
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
FROM ubuntu:16.04
|
FROM ubuntu:20.04
|
||||||
|
|
||||||
COPY scripts/cross-apt-packages.sh /scripts/
|
COPY scripts/cross-apt-packages.sh /scripts/
|
||||||
RUN sh /scripts/cross-apt-packages.sh
|
RUN sh /scripts/cross-apt-packages.sh
|
||||||
|
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y zlib1g-dev
|
||||||
|
|
||||||
COPY host-x86_64/dist-x86_64-netbsd/build-netbsd-toolchain.sh /tmp/
|
COPY host-x86_64/dist-x86_64-netbsd/build-netbsd-toolchain.sh /tmp/
|
||||||
RUN /tmp/build-netbsd-toolchain.sh
|
RUN /tmp/build-netbsd-toolchain.sh
|
||||||
|
@ -9,9 +10,6 @@ RUN /tmp/build-netbsd-toolchain.sh
|
||||||
COPY scripts/sccache.sh /scripts/
|
COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
COPY scripts/cmake.sh /scripts/
|
|
||||||
RUN /scripts/cmake.sh
|
|
||||||
|
|
||||||
ENV PATH=$PATH:/x-tools/x86_64-unknown-netbsd/bin
|
ENV PATH=$PATH:/x-tools/x86_64-unknown-netbsd/bin
|
||||||
|
|
||||||
ENV \
|
ENV \
|
||||||
|
@ -21,6 +19,5 @@ ENV \
|
||||||
|
|
||||||
ENV HOSTS=x86_64-unknown-netbsd
|
ENV HOSTS=x86_64-unknown-netbsd
|
||||||
|
|
||||||
ENV RUST_CONFIGURE_ARGS --enable-extended --disable-docs \
|
ENV RUST_CONFIGURE_ARGS --enable-extended --disable-docs
|
||||||
--set llvm.allow-old-toolchain
|
|
||||||
ENV SCRIPT python3 ../x.py dist --host $HOSTS --target $HOSTS
|
ENV SCRIPT python3 ../x.py dist --host $HOSTS --target $HOSTS
|
||||||
|
|
|
@ -25,19 +25,19 @@ cd netbsd
|
||||||
|
|
||||||
mkdir -p /x-tools/x86_64-unknown-netbsd/sysroot
|
mkdir -p /x-tools/x86_64-unknown-netbsd/sysroot
|
||||||
|
|
||||||
URL=https://ci-mirrors.rust-lang.org/rustc
|
# URL=https://ci-mirrors.rust-lang.org/rustc
|
||||||
|
|
||||||
# Originally from ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-$BSD/source/sets/*.tgz
|
SOURCE_URL=https://cdn.netbsd.org/pub/NetBSD/NetBSD-9.0/source/sets
|
||||||
curl $URL/2018-03-01-netbsd-src.tgz | tar xzf -
|
curl $SOURCE_URL/src.tgz | tar xzf -
|
||||||
curl $URL/2018-03-01-netbsd-gnusrc.tgz | tar xzf -
|
curl $SOURCE_URL/gnusrc.tgz | tar xzf -
|
||||||
curl $URL/2018-03-01-netbsd-sharesrc.tgz | tar xzf -
|
curl $SOURCE_URL/sharesrc.tgz | tar xzf -
|
||||||
curl $URL/2018-03-01-netbsd-syssrc.tgz | tar xzf -
|
curl $SOURCE_URL/syssrc.tgz | tar xzf -
|
||||||
|
|
||||||
# Originally from ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-$BSD/amd64/binary/sets/*.tgz
|
BINARY_URL=https://cdn.netbsd.org/pub/NetBSD/NetBSD-9.0/amd64/binary/sets
|
||||||
curl $URL/2018-03-01-netbsd-base.tgz | \
|
curl $BINARY_URL/base.tar.xz | \
|
||||||
tar xzf - -C /x-tools/x86_64-unknown-netbsd/sysroot ./usr/include ./usr/lib ./lib
|
tar xJf - -C /x-tools/x86_64-unknown-netbsd/sysroot ./usr/include ./usr/lib ./lib
|
||||||
curl $URL/2018-03-01-netbsd-comp.tgz | \
|
curl $BINARY_URL/comp.tar.xz | \
|
||||||
tar xzf - -C /x-tools/x86_64-unknown-netbsd/sysroot ./usr/include ./usr/lib
|
tar xJf - -C /x-tools/x86_64-unknown-netbsd/sysroot ./usr/include ./usr/lib
|
||||||
|
|
||||||
cd usr/src
|
cd usr/src
|
||||||
|
|
||||||
|
|
31
src/test/incremental/issue-101518.rs
Normal file
31
src/test/incremental/issue-101518.rs
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
// revisions: cfail1
|
||||||
|
// should-ice
|
||||||
|
// error-pattern: forcing query
|
||||||
|
// known-bug: #101518
|
||||||
|
|
||||||
|
#[derive(PartialEq, Eq)]
|
||||||
|
struct Id<'a> {
|
||||||
|
ns: &'a str,
|
||||||
|
}
|
||||||
|
fn visit_struct() {
|
||||||
|
let id = Id { ns: "random1" };
|
||||||
|
const FLAG: Id<'static> = Id {
|
||||||
|
ns: "needs_to_be_the_same",
|
||||||
|
};
|
||||||
|
match id {
|
||||||
|
FLAG => {}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fn visit_struct2() {
|
||||||
|
let id = Id { ns: "random2" };
|
||||||
|
const FLAG: Id<'static> = Id {
|
||||||
|
ns: "needs_to_be_the_same",
|
||||||
|
};
|
||||||
|
match id {
|
||||||
|
FLAG => {}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -3,7 +3,7 @@ include ../tools.mk
|
||||||
all: off packed unpacked
|
all: off packed unpacked
|
||||||
|
|
||||||
ifeq ($(UNAME),Darwin)
|
ifeq ($(UNAME),Darwin)
|
||||||
# If disabled, don't run dsymutil
|
# If disabled, don't run `dsymutil`.
|
||||||
off:
|
off:
|
||||||
rm -rf $(TMPDIR)/*.dSYM
|
rm -rf $(TMPDIR)/*.dSYM
|
||||||
$(RUSTC) foo.rs -g -C split-debuginfo=off
|
$(RUSTC) foo.rs -g -C split-debuginfo=off
|
||||||
|
@ -29,98 +29,280 @@ unpacked:
|
||||||
[ ! -d $(TMPDIR)/foo.dSYM ]
|
[ ! -d $(TMPDIR)/foo.dSYM ]
|
||||||
else
|
else
|
||||||
ifdef IS_WINDOWS
|
ifdef IS_WINDOWS
|
||||||
# Windows only supports =packed
|
# Windows only supports packed debuginfo - nothing to test.
|
||||||
off:
|
off:
|
||||||
packed:
|
packed:
|
||||||
unpacked:
|
unpacked:
|
||||||
else
|
else
|
||||||
|
# Some non-Windows, non-Darwin platforms are not stable, and some are.
|
||||||
ifeq ($(UNAME),Linux)
|
ifeq ($(UNAME),Linux)
|
||||||
UNSTABLEOPTS :=
|
UNSTABLEOPTS :=
|
||||||
else
|
else
|
||||||
UNSTABLEOPTS := -Zunstable-options
|
UNSTABLEOPTS := -Zunstable-options
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# - Debuginfo in `.o` files
|
||||||
|
# - `.o` deleted
|
||||||
|
# - `.dwo` never created
|
||||||
|
# - `.dwp` never created
|
||||||
off:
|
off:
|
||||||
$(RUSTC) foo.rs -g -C $(UNSTABLEOPTS) split-debuginfo=off
|
$(RUSTC) foo.rs -g -C $(UNSTABLEOPTS) split-debuginfo=off
|
||||||
[ ! -f $(TMPDIR)/*.dwp ]
|
[ ! -f $(TMPDIR)/*.dwp ]
|
||||||
[ ! -f $(TMPDIR)/*.dwo ]
|
[ ! -f $(TMPDIR)/*.dwo ]
|
||||||
|
|
||||||
$(RUSTC) foo.rs -g
|
$(RUSTC) foo.rs -g
|
||||||
[ ! -f $(TMPDIR)/*.dwp ]
|
[ ! -f $(TMPDIR)/*.dwp ]
|
||||||
[ ! -f $(TMPDIR)/*.dwo ]
|
[ ! -f $(TMPDIR)/*.dwo ]
|
||||||
|
|
||||||
packed: packed-split packed-single
|
packed: packed-split packed-single packed-lto packed-remapped packed-crosscrate
|
||||||
|
|
||||||
|
# - Debuginfo in `.dwo` files
|
||||||
|
# - `.o` deleted
|
||||||
|
# - `.dwo` deleted
|
||||||
|
# - `.dwp` present
|
||||||
packed-split:
|
packed-split:
|
||||||
$(RUSTC) foo.rs -g $(UNSTABLEOPTS) -C split-debuginfo=packed -Zsplit-dwarf-kind=split
|
$(RUSTC) foo.rs -g $(UNSTABLEOPTS) -C split-debuginfo=packed -Zsplit-dwarf-kind=split
|
||||||
ls $(TMPDIR)/*.dwp
|
ls $(TMPDIR)/*.o && exit 1 || exit 0
|
||||||
rm -rf $(TMPDIR)/*.dwp $(TMPDIR)/*.dwo
|
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
|
||||||
|
rm $(TMPDIR)/foo.dwp
|
||||||
|
rm $(TMPDIR)/$(call BIN,foo)
|
||||||
|
|
||||||
|
# - Debuginfo in `.o` files
|
||||||
|
# - `.o` deleted
|
||||||
|
# - `.dwo` never created
|
||||||
|
# - `.dwp` present
|
||||||
packed-single:
|
packed-single:
|
||||||
$(RUSTC) foo.rs -g $(UNSTABLEOPTS) -C split-debuginfo=packed -Zsplit-dwarf-kind=single
|
$(RUSTC) foo.rs -g $(UNSTABLEOPTS) -C split-debuginfo=packed -Zsplit-dwarf-kind=single
|
||||||
ls $(TMPDIR)/*.dwp
|
ls $(TMPDIR)/*.o && exit 1 || exit 0
|
||||||
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
|
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
|
||||||
rm -rf $(TMPDIR)/*.dwp
|
rm $(TMPDIR)/foo.dwp
|
||||||
|
rm $(TMPDIR)/$(call BIN,foo)
|
||||||
|
|
||||||
|
packed-lto: packed-lto-split packed-lto-single
|
||||||
|
|
||||||
|
# - rmeta file added to rlib, no object files are generated and thus no debuginfo is generated
|
||||||
|
# - `.o` never created
|
||||||
|
# - `.dwo` never created
|
||||||
|
# - `.dwp` never created
|
||||||
|
packed-lto-split:
|
||||||
|
$(RUSTC) baz.rs -g $(UNSTABLEOPTS) -Csplit-debuginfo=packed -Zsplit-dwarf-kind=split \
|
||||||
|
--crate-type=rlib -Clinker-plugin-lto
|
||||||
|
ls $(TMPDIR)/*.o && exit 1 || exit 0
|
||||||
|
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
|
||||||
|
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
|
||||||
|
rm $(TMPDIR)/libbaz.rlib
|
||||||
|
|
||||||
|
# - rmeta file added to rlib, no object files are generated and thus no debuginfo is generated
|
||||||
|
# - `.o` never created
|
||||||
|
# - `.dwo` never created
|
||||||
|
# - `.dwp` never created
|
||||||
|
packed-lto-single:
|
||||||
|
$(RUSTC) baz.rs -g $(UNSTABLEOPTS) -Csplit-debuginfo=packed -Zsplit-dwarf-kind=single \
|
||||||
|
--crate-type=rlib -Clinker-plugin-lto
|
||||||
|
ls $(TMPDIR)/*.o && exit 1 || exit 0
|
||||||
|
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
|
||||||
|
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
|
||||||
|
rm $(TMPDIR)/libbaz.rlib
|
||||||
|
|
||||||
packed-remapped: packed-remapped-split packed-remapped-single
|
packed-remapped: packed-remapped-split packed-remapped-single
|
||||||
|
|
||||||
|
# - Debuginfo in `.dwo` files
|
||||||
|
# - `.o` and binary refer to remapped `.dwo` paths which do not exist
|
||||||
|
# - `.o` deleted
|
||||||
|
# - `.dwo` deleted
|
||||||
|
# - `.dwp` present
|
||||||
packed-remapped-split:
|
packed-remapped-split:
|
||||||
$(RUSTC) $(UNSTABLEOPTS) -C split-debuginfo=packed -C debuginfo=2 \
|
$(RUSTC) $(UNSTABLEOPTS) -C split-debuginfo=packed -C debuginfo=2 \
|
||||||
-Z split-dwarf-kind=split --remap-path-prefix $(TMPDIR)=/a foo.rs -g
|
-Z split-dwarf-kind=split --remap-path-prefix $(TMPDIR)=/a foo.rs -g
|
||||||
objdump -Wi $(TMPDIR)/foo | grep DW_AT_GNU_dwo_name | (! grep $(TMPDIR)) || exit 1
|
objdump -Wi $(TMPDIR)/foo | grep DW_AT_GNU_dwo_name | (! grep $(TMPDIR)) || exit 1
|
||||||
|
ls $(TMPDIR)/*.o && exit 1 || exit 0
|
||||||
|
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
|
||||||
|
rm $(TMPDIR)/foo.dwp
|
||||||
|
rm $(TMPDIR)/$(call BIN,foo)
|
||||||
|
|
||||||
|
# - Debuginfo in `.o` files
|
||||||
|
# - `.o` and binary refer to remapped `.o` paths which do not exist
|
||||||
|
# - `.o` deleted
|
||||||
|
# - `.dwo` never created
|
||||||
|
# - `.dwp` present
|
||||||
packed-remapped-single:
|
packed-remapped-single:
|
||||||
$(RUSTC) $(UNSTABLEOPTS) -C split-debuginfo=packed -C debuginfo=2 \
|
$(RUSTC) $(UNSTABLEOPTS) -C split-debuginfo=packed -C debuginfo=2 \
|
||||||
-Z split-dwarf-kind=single --remap-path-prefix $(TMPDIR)=/a foo.rs -g
|
-Z split-dwarf-kind=single --remap-path-prefix $(TMPDIR)=/a foo.rs -g
|
||||||
objdump -Wi $(TMPDIR)/foo | grep DW_AT_GNU_dwo_name | (! grep $(TMPDIR)) || exit 1
|
objdump -Wi $(TMPDIR)/foo | grep DW_AT_GNU_dwo_name | (! grep $(TMPDIR)) || exit 1
|
||||||
|
ls $(TMPDIR)/*.o && exit 1 || exit 0
|
||||||
|
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
|
||||||
|
rm $(TMPDIR)/foo.dwp
|
||||||
|
rm $(TMPDIR)/$(call BIN,foo)
|
||||||
|
|
||||||
packed-crosscrate: packed-crosscrate-split packed-crosscrate-single
|
packed-crosscrate: packed-crosscrate-split packed-crosscrate-single
|
||||||
|
|
||||||
|
# - Debuginfo in `.dwo` files
|
||||||
|
# - (bar) `.rlib` file created, contains `.dwo`
|
||||||
|
# - (bar) `.o` deleted
|
||||||
|
# - (bar) `.dwo` deleted
|
||||||
|
# - (bar) `.dwp` never created
|
||||||
|
# - (main) `.o` deleted
|
||||||
|
# - (main) `.dwo` deleted
|
||||||
|
# - (main) `.dwp` present
|
||||||
packed-crosscrate-split:
|
packed-crosscrate-split:
|
||||||
$(RUSTC) --crate-type lib $(UNSTABLEOPTS) -C split-debuginfo=packed \
|
$(RUSTC) --crate-type lib $(UNSTABLEOPTS) -C split-debuginfo=packed \
|
||||||
-Zsplit-dwarf-kind=split -C debuginfo=2 -g bar.rs
|
-Zsplit-dwarf-kind=split -C debuginfo=2 -g bar.rs
|
||||||
ls $(TMPDIR)/*.rlib
|
ls $(TMPDIR)/*.rlib
|
||||||
|
ls $(TMPDIR)/*.o && exit 1 || exit 0
|
||||||
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
|
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
|
||||||
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
|
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
|
||||||
$(RUSTC) --extern bar=$(TMPDIR)/libbar.rlib -Z unstable-options $(UNSTABLEOPTS) \
|
$(RUSTC) --extern bar=$(TMPDIR)/libbar.rlib $(UNSTABLEOPTS) \
|
||||||
-C split-debuginfo=packed -Zsplit-dwarf-kind=split -C debuginfo=2 -g main.rs
|
-C split-debuginfo=packed -Zsplit-dwarf-kind=split -C debuginfo=2 -g main.rs
|
||||||
rm $(TMPDIR)/*.dwo
|
ls $(TMPDIR)/*.o && exit 1 || exit 0
|
||||||
|
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
|
||||||
rm $(TMPDIR)/main.dwp
|
rm $(TMPDIR)/main.dwp
|
||||||
rm $(TMPDIR)/$(call BIN,main)
|
rm $(TMPDIR)/$(call BIN,main)
|
||||||
|
|
||||||
|
# - Debuginfo in `.o` files
|
||||||
|
# - (bar) `.rlib` file created, contains `.o`
|
||||||
|
# - (bar) `.o` deleted
|
||||||
|
# - (bar) `.dwo` never created
|
||||||
|
# - (bar) `.dwp` never created
|
||||||
|
# - (main) `.o` deleted
|
||||||
|
# - (main) `.dwo` never created
|
||||||
|
# - (main) `.dwp` present
|
||||||
packed-crosscrate-single:
|
packed-crosscrate-single:
|
||||||
$(RUSTC) --crate-type lib $(UNSTABLEOPTS) -C split-debuginfo=packed \
|
$(RUSTC) --crate-type lib $(UNSTABLEOPTS) -C split-debuginfo=packed \
|
||||||
-Zsplit-dwarf-kind=single -C debuginfo=2 -g bar.rs
|
-Zsplit-dwarf-kind=single -C debuginfo=2 -g bar.rs
|
||||||
ls $(TMPDIR)/*.rlib
|
ls $(TMPDIR)/*.rlib
|
||||||
|
ls $(TMPDIR)/*.o && exit 1 || exit 0
|
||||||
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
|
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
|
||||||
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
|
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
|
||||||
$(RUSTC) --extern bar=$(TMPDIR)/libbar.rlib -Z unstable-options $(UNSTABLEOPTS) \
|
$(RUSTC) --extern bar=$(TMPDIR)/libbar.rlib $(UNSTABLEOPTS) \
|
||||||
-C split-debuginfo=packed -Zsplit-dwarf-kind=single -C debuginfo=2 -g main.rs
|
-C split-debuginfo=packed -Zsplit-dwarf-kind=single -C debuginfo=2 -g main.rs
|
||||||
|
ls $(TMPDIR)/*.o && exit 1 || exit 0
|
||||||
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
|
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
|
||||||
rm $(TMPDIR)/main.dwp
|
rm $(TMPDIR)/main.dwp
|
||||||
rm $(TMPDIR)/$(call BIN,main)
|
rm $(TMPDIR)/$(call BIN,main)
|
||||||
|
|
||||||
unpacked: unpacked-split unpacked-single unpacked-remapped-split unpacked-remapped-single
|
unpacked: unpacked-split unpacked-single unpacked-lto unpacked-remapped unpacked-crosscrate
|
||||||
|
|
||||||
|
# - Debuginfo in `.dwo` files
|
||||||
|
# - `.o` deleted
|
||||||
|
# - `.dwo` present
|
||||||
|
# - `.dwp` never created
|
||||||
unpacked-split:
|
unpacked-split:
|
||||||
$(RUSTC) foo.rs -g $(UNSTABLEOPTS) -C split-debuginfo=unpacked -Zsplit-dwarf-kind=split
|
$(RUSTC) foo.rs -g $(UNSTABLEOPTS) -C split-debuginfo=unpacked -Zsplit-dwarf-kind=split
|
||||||
|
ls $(TMPDIR)/*.o && exit 1 || exit 0
|
||||||
|
rm $(TMPDIR)/*.dwo
|
||||||
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
|
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
|
||||||
ls $(TMPDIR)/*.dwo
|
rm $(TMPDIR)/$(call BIN,foo)
|
||||||
rm -rf $(TMPDIR)/*.dwp $(TMPDIR)/*.dwo
|
|
||||||
|
|
||||||
|
# - Debuginfo in `.o` files
|
||||||
|
# - `.o` present
|
||||||
|
# - `.dwo` never created
|
||||||
|
# - `.dwp` never created
|
||||||
unpacked-single:
|
unpacked-single:
|
||||||
$(RUSTC) foo.rs -g $(UNSTABLEOPTS) -C split-debuginfo=unpacked -Zsplit-dwarf-kind=single
|
$(RUSTC) foo.rs -g $(UNSTABLEOPTS) -C split-debuginfo=unpacked -Zsplit-dwarf-kind=single
|
||||||
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
|
ls $(TMPDIR)/*.o
|
||||||
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
|
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
|
||||||
|
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
|
||||||
|
rm $(TMPDIR)/$(call BIN,foo)
|
||||||
|
|
||||||
|
unpacked-lto: packed-lto-split packed-lto-single
|
||||||
|
|
||||||
|
# - rmeta file added to rlib, no object files are generated and thus no debuginfo is generated
|
||||||
|
# - `.o` never created
|
||||||
|
# - `.dwo` never created
|
||||||
|
# - `.dwp` never created
|
||||||
|
unpacked-lto-split:
|
||||||
|
$(RUSTC) baz.rs -g $(UNSTABLEOPTS) -Csplit-debuginfo=unpacked -Zsplit-dwarf-kind=split \
|
||||||
|
--crate-type=rlib -Clinker-plugin-lto
|
||||||
|
ls $(TMPDIR)/*.o && exit 1 || exit 0
|
||||||
|
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
|
||||||
|
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
|
||||||
|
rm $(TMPDIR)/libbaz.rlib
|
||||||
|
|
||||||
|
# - rmeta file added to rlib, no object files are generated and thus no debuginfo is generated
|
||||||
|
# - `.o` never created
|
||||||
|
# - `.dwo` never created
|
||||||
|
# - `.dwp` never created
|
||||||
|
unpacked-lto-single:
|
||||||
|
$(RUSTC) baz.rs -g $(UNSTABLEOPTS) -Csplit-debuginfo=unpacked -Zsplit-dwarf-kind=single \
|
||||||
|
--crate-type=rlib -Clinker-plugin-lto
|
||||||
|
ls $(TMPDIR)/*.o && exit 1 || exit 0
|
||||||
|
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
|
||||||
|
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
|
||||||
|
rm $(TMPDIR)/libbaz.rlib
|
||||||
|
|
||||||
|
unpacked-remapped: unpacked-remapped-split unpacked-remapped-single
|
||||||
|
|
||||||
|
# - Debuginfo in `.dwo` files
|
||||||
|
# - `.o` and binary refer to remapped `.dwo` paths which do not exist
|
||||||
|
# - `.o` deleted
|
||||||
|
# - `.dwo` present
|
||||||
|
# - `.dwp` never created
|
||||||
unpacked-remapped-split:
|
unpacked-remapped-split:
|
||||||
$(RUSTC) $(UNSTABLEOPTS) -C split-debuginfo=unpacked -C debuginfo=2 \
|
$(RUSTC) $(UNSTABLEOPTS) -C split-debuginfo=unpacked -C debuginfo=2 \
|
||||||
-Z split-dwarf-kind=split --remap-path-prefix $(TMPDIR)=/a foo.rs -g
|
-Z split-dwarf-kind=split --remap-path-prefix $(TMPDIR)=/a foo.rs -g
|
||||||
objdump -Wi $(TMPDIR)/foo | grep DW_AT_GNU_dwo_name | (! grep $(TMPDIR)) || exit 1
|
objdump -Wi $(TMPDIR)/foo | grep DW_AT_GNU_dwo_name | (! grep $(TMPDIR)) || exit 1
|
||||||
|
ls $(TMPDIR)/*.o && exit 1 || exit 0
|
||||||
|
rm $(TMPDIR)/*.dwo
|
||||||
|
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
|
||||||
|
rm $(TMPDIR)/$(call BIN,foo)
|
||||||
|
|
||||||
|
# - Debuginfo in `.o` files
|
||||||
|
# - `.o` and binary refer to remapped `.o` paths which do not exist
|
||||||
|
# - `.o` present
|
||||||
|
# - `.dwo` never created
|
||||||
|
# - `.dwp` never created
|
||||||
unpacked-remapped-single:
|
unpacked-remapped-single:
|
||||||
$(RUSTC) $(UNSTABLEOPTS) -C split-debuginfo=unpacked -C debuginfo=2 \
|
$(RUSTC) $(UNSTABLEOPTS) -C split-debuginfo=unpacked -C debuginfo=2 \
|
||||||
-Z split-dwarf-kind=single --remap-path-prefix $(TMPDIR)=/a foo.rs -g
|
-Z split-dwarf-kind=single --remap-path-prefix $(TMPDIR)=/a foo.rs -g
|
||||||
objdump -Wi $(TMPDIR)/foo | grep DW_AT_GNU_dwo_name | (! grep $(TMPDIR)) || exit 1
|
objdump -Wi $(TMPDIR)/foo | grep DW_AT_GNU_dwo_name | (! grep $(TMPDIR)) || exit 1
|
||||||
|
ls $(TMPDIR)/*.o
|
||||||
|
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
|
||||||
|
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
|
||||||
|
rm $(TMPDIR)/$(call BIN,foo)
|
||||||
|
|
||||||
|
unpacked-crosscrate: packed-crosscrate-split packed-crosscrate-single
|
||||||
|
|
||||||
|
# - Debuginfo in `.dwo` files
|
||||||
|
# - (bar) `.rlib` file created, contains `.dwo`
|
||||||
|
# - (bar) `.o` deleted
|
||||||
|
# - (bar) `.dwo` present
|
||||||
|
# - (bar) `.dwp` never created
|
||||||
|
# - (main) `.o` deleted
|
||||||
|
# - (main) `.dwo` present
|
||||||
|
# - (main) `.dwp` never created
|
||||||
|
unpacked-crosscrate-split:
|
||||||
|
$(RUSTC) --crate-type lib $(UNSTABLEOPTS) -C split-debuginfo=unpacked \
|
||||||
|
-Zsplit-dwarf-kind=split -C debuginfo=2 -g bar.rs
|
||||||
|
ls $(TMPDIR)/*.rlib
|
||||||
|
ls $(TMPDIR)/*.o && exit 1 || exit 0
|
||||||
|
ls $(TMPDIR)/*.dwo
|
||||||
|
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
|
||||||
|
$(RUSTC) --extern bar=$(TMPDIR)/libbar.rlib $(UNSTABLEOPTS) \
|
||||||
|
-C split-debuginfo=unpacked -Zsplit-dwarf-kind=split -C debuginfo=2 -g main.rs
|
||||||
|
ls $(TMPDIR)/*.o && exit 1 || exit 0
|
||||||
|
rm $(TMPDIR)/*.dwo
|
||||||
|
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
|
||||||
|
rm $(TMPDIR)/$(call BIN,main)
|
||||||
|
|
||||||
|
# - Debuginfo in `.o` files
|
||||||
|
# - (bar) `.rlib` file created, contains `.o`
|
||||||
|
# - (bar) `.o` present
|
||||||
|
# - (bar) `.dwo` never created
|
||||||
|
# - (bar) `.dwp` never created
|
||||||
|
# - (main) `.o` present
|
||||||
|
# - (main) `.dwo` never created
|
||||||
|
# - (main) `.dwp` never created
|
||||||
|
unpacked-crosscrate-single:
|
||||||
|
$(RUSTC) --crate-type lib $(UNSTABLEOPTS) -C split-debuginfo=unpacked \
|
||||||
|
-Zsplit-dwarf-kind=single -C debuginfo=2 -g bar.rs
|
||||||
|
ls $(TMPDIR)/*.rlib
|
||||||
|
ls $(TMPDIR)/*.o
|
||||||
|
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
|
||||||
|
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
|
||||||
|
$(RUSTC) --extern bar=$(TMPDIR)/libbar.rlib $(UNSTABLEOPTS) \
|
||||||
|
-C split-debuginfo=unpacked -Zsplit-dwarf-kind=single -C debuginfo=2 -g main.rs
|
||||||
|
ls $(TMPDIR)/*.o
|
||||||
|
ls $(TMPDIR)/*.dwo && exit 1 || exit 0
|
||||||
|
ls $(TMPDIR)/*.dwp && exit 1 || exit 0
|
||||||
|
rm $(TMPDIR)/$(call BIN,main)
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
1
src/test/run-make-fulldeps/split-debuginfo/baz.rs
Normal file
1
src/test/run-make-fulldeps/split-debuginfo/baz.rs
Normal file
|
@ -0,0 +1 @@
|
||||||
|
// empty
|
35
src/test/ui/borrowck/async-reference-generality.rs
Normal file
35
src/test/ui/borrowck/async-reference-generality.rs
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
// check-fail
|
||||||
|
// known-bug: #99492
|
||||||
|
// edition: 2021
|
||||||
|
|
||||||
|
use std::marker::PhantomData;
|
||||||
|
|
||||||
|
pub struct Struct<I, T>(PhantomData<fn() -> <Self as It>::Item>)
|
||||||
|
where
|
||||||
|
Self: It;
|
||||||
|
|
||||||
|
impl<I> It for Struct<I, I::Item>
|
||||||
|
where
|
||||||
|
I: It,
|
||||||
|
{
|
||||||
|
type Item = ();
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait It {
|
||||||
|
type Item;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn f() -> impl Send {
|
||||||
|
async {
|
||||||
|
let _x = Struct::<Empty<&'static ()>, _>(PhantomData);
|
||||||
|
async {}.await;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Empty<T>(PhantomData<fn() -> T>);
|
||||||
|
|
||||||
|
impl<T> It for Empty<T> {
|
||||||
|
type Item = T;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
27
src/test/ui/borrowck/async-reference-generality.stderr
Normal file
27
src/test/ui/borrowck/async-reference-generality.stderr
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/async-reference-generality.rs:23:5
|
||||||
|
|
|
||||||
|
LL | / async {
|
||||||
|
LL | | let _x = Struct::<Empty<&'static ()>, _>(PhantomData);
|
||||||
|
LL | | async {}.await;
|
||||||
|
LL | | }
|
||||||
|
| |_____^ one type is more general than the other
|
||||||
|
|
|
||||||
|
= note: expected reference `&()`
|
||||||
|
found reference `&()`
|
||||||
|
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/async-reference-generality.rs:23:5
|
||||||
|
|
|
||||||
|
LL | / async {
|
||||||
|
LL | | let _x = Struct::<Empty<&'static ()>, _>(PhantomData);
|
||||||
|
LL | | async {}.await;
|
||||||
|
LL | | }
|
||||||
|
| |_____^ one type is more general than the other
|
||||||
|
|
|
||||||
|
= note: expected reference `&()`
|
||||||
|
found reference `&()`
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0308`.
|
32
src/test/ui/dyn-star/issue-102430.rs
Normal file
32
src/test/ui/dyn-star/issue-102430.rs
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
// check-pass
|
||||||
|
|
||||||
|
#![feature(dyn_star)]
|
||||||
|
#![allow(incomplete_features)]
|
||||||
|
|
||||||
|
trait AddOne {
|
||||||
|
fn add1(&mut self) -> usize;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AddOne for usize {
|
||||||
|
fn add1(&mut self) -> usize {
|
||||||
|
*self += 1;
|
||||||
|
*self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AddOne for &mut usize {
|
||||||
|
fn add1(&mut self) -> usize {
|
||||||
|
(*self).add1()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn add_one(mut i: dyn* AddOne + '_) -> usize {
|
||||||
|
i.add1()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let mut x = 42usize;
|
||||||
|
let y = &mut x as (dyn* AddOne + '_);
|
||||||
|
|
||||||
|
println!("{}", add_one(y));
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
// check-fail
|
||||||
|
// known-bug: #90950
|
||||||
|
|
||||||
|
trait Yokeable<'a>: 'static {
|
||||||
|
type Output: 'a;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
trait IsCovariant<'a> {}
|
||||||
|
|
||||||
|
struct Yoke<Y: for<'a> Yokeable<'a>> {
|
||||||
|
data: Y,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// impl<Y: for<'a> Yokeable<'a>> Yoke<Y> {
|
||||||
|
// fn project<Y2: for<'a> Yokeable<'a>>(
|
||||||
|
// &self,
|
||||||
|
// f: for<'a> fn(<Y as Yokeable<'a>>::Output, &'a (),
|
||||||
|
// ) -> <Y2 as Yokeable<'a>>::Output) -> Yoke<Y2> {
|
||||||
|
// unimplemented!()
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
fn upcast<Y>(x: Yoke<Y>) -> Yoke<Box<dyn IsCovariant<'static> + 'static>> where
|
||||||
|
Y: for<'a> Yokeable<'a>,
|
||||||
|
for<'a> <Y as Yokeable<'a>>::Output: IsCovariant<'a>
|
||||||
|
{
|
||||||
|
// x.project(|data, _| {
|
||||||
|
// Box::new(data)
|
||||||
|
// })
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
impl<'a> Yokeable<'a> for Box<dyn IsCovariant<'static> + 'static> {
|
||||||
|
type Output = Box<dyn IsCovariant<'a> + 'a>;
|
||||||
|
}
|
||||||
|
|
||||||
|
// this impl is mostly an example and unnecessary for the pure repro
|
||||||
|
use std::borrow::*;
|
||||||
|
impl<'a, T: ToOwned + ?Sized> Yokeable<'a> for Cow<'static, T> {
|
||||||
|
type Output = Cow<'a, T>;
|
||||||
|
}
|
||||||
|
impl<'a, T: ToOwned + ?Sized> IsCovariant<'a> for Cow<'a, T> {}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
fn upcast_yoke(y: Yoke<Cow<'static, str>>) -> Yoke<Box<dyn IsCovariant<'static> + 'static>> {
|
||||||
|
upcast(y)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -0,0 +1,21 @@
|
||||||
|
error[E0277]: the trait bound `for<'a> <_ as Yokeable<'a>>::Output: IsCovariant<'a>` is not satisfied
|
||||||
|
--> $DIR/issue-90950.rs:50:12
|
||||||
|
|
|
||||||
|
LL | upcast(y)
|
||||||
|
| ------ ^ the trait `for<'a> IsCovariant<'a>` is not implemented for `<_ as Yokeable<'a>>::Output`
|
||||||
|
| |
|
||||||
|
| required by a bound introduced by this call
|
||||||
|
|
|
||||||
|
= help: the trait `IsCovariant<'a>` is implemented for `std::borrow::Cow<'a, T>`
|
||||||
|
note: required by a bound in `upcast`
|
||||||
|
--> $DIR/issue-90950.rs:27:42
|
||||||
|
|
|
||||||
|
LL | fn upcast<Y>(x: Yoke<Y>) -> Yoke<Box<dyn IsCovariant<'static> + 'static>> where
|
||||||
|
| ------ required by a bound in this
|
||||||
|
LL | Y: for<'a> Yokeable<'a>,
|
||||||
|
LL | for<'a> <Y as Yokeable<'a>>::Output: IsCovariant<'a>
|
||||||
|
| ^^^^^^^^^^^^^^^ required by this bound in `upcast`
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0277`.
|
|
@ -0,0 +1,23 @@
|
||||||
|
// check-fail
|
||||||
|
// known-bug: #89196
|
||||||
|
|
||||||
|
// Should pass, but we normalize and check bounds before we resolve the generics
|
||||||
|
// of the function (which we know because of the return type).
|
||||||
|
|
||||||
|
trait Trait<'a> {
|
||||||
|
type Out;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a, T> Trait<'a> for T {
|
||||||
|
type Out = T;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn weird_bound<X>() -> X
|
||||||
|
where
|
||||||
|
for<'a> X: Trait<'a>,
|
||||||
|
for<'a> <X as Trait<'a>>::Out: Copy
|
||||||
|
{ todo!() }
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let _: () = weird_bound();
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
error[E0277]: the trait bound `for<'a> <_ as Trait<'a>>::Out: Copy` is not satisfied
|
||||||
|
--> $DIR/norm-before-method-resolution.rs:22:17
|
||||||
|
|
|
||||||
|
LL | let _: () = weird_bound();
|
||||||
|
| ^^^^^^^^^^^ the trait `for<'a> Copy` is not implemented for `<_ as Trait<'a>>::Out`
|
||||||
|
|
|
||||||
|
note: required by a bound in `weird_bound`
|
||||||
|
--> $DIR/norm-before-method-resolution.rs:18:40
|
||||||
|
|
|
||||||
|
LL | fn weird_bound<X>() -> X
|
||||||
|
| ----------- required by a bound in this
|
||||||
|
...
|
||||||
|
LL | for<'a> <X as Trait<'a>>::Out: Copy
|
||||||
|
| ^^^^ required by this bound in `weird_bound`
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0277`.
|
21
src/test/ui/never_type/exhaustive_patterns.rs
Normal file
21
src/test/ui/never_type/exhaustive_patterns.rs
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
// check-fail
|
||||||
|
// known-bug: #104034
|
||||||
|
|
||||||
|
#![feature(exhaustive_patterns, never_type)]
|
||||||
|
|
||||||
|
mod inner {
|
||||||
|
pub struct Wrapper<T>(T);
|
||||||
|
}
|
||||||
|
|
||||||
|
enum Either<A, B> {
|
||||||
|
A(A),
|
||||||
|
B(inner::Wrapper<B>),
|
||||||
|
}
|
||||||
|
|
||||||
|
fn foo() -> Either<(), !> {
|
||||||
|
Either::A(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let Either::A(()) = foo();
|
||||||
|
}
|
25
src/test/ui/never_type/exhaustive_patterns.stderr
Normal file
25
src/test/ui/never_type/exhaustive_patterns.stderr
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
error[E0005]: refutable pattern in local binding: `Either::B(_)` not covered
|
||||||
|
--> $DIR/exhaustive_patterns.rs:20:9
|
||||||
|
|
|
||||||
|
LL | let Either::A(()) = foo();
|
||||||
|
| ^^^^^^^^^^^^^ pattern `Either::B(_)` not covered
|
||||||
|
|
|
||||||
|
= note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant
|
||||||
|
= note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html
|
||||||
|
note: `Either<(), !>` defined here
|
||||||
|
--> $DIR/exhaustive_patterns.rs:12:5
|
||||||
|
|
|
||||||
|
LL | enum Either<A, B> {
|
||||||
|
| ------
|
||||||
|
LL | A(A),
|
||||||
|
LL | B(inner::Wrapper<B>),
|
||||||
|
| ^ not covered
|
||||||
|
= note: the matched value is of type `Either<(), !>`
|
||||||
|
help: you might want to use `if let` to ignore the variant that isn't matched
|
||||||
|
|
|
||||||
|
LL | if let Either::A(()) = foo() { todo!() }
|
||||||
|
| ++ ~~~~~~~~~~~
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0005`.
|
16
src/test/ui/nll/user-annotations/ascribed-type-wf.rs
Normal file
16
src/test/ui/nll/user-annotations/ascribed-type-wf.rs
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
// check-pass
|
||||||
|
// known-bug: #101350
|
||||||
|
|
||||||
|
trait Trait {
|
||||||
|
type Ty;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Trait for &'static () {
|
||||||
|
type Ty = ();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn extend<'a>() {
|
||||||
|
None::<<&'a () as Trait>::Ty>;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
24
src/test/ui/traits/suggest-fully-qualified-closure.rs
Normal file
24
src/test/ui/traits/suggest-fully-qualified-closure.rs
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
// check-fail
|
||||||
|
// known-bug: #103705
|
||||||
|
// normalize-stderr-test "\[closure@.*\]" -> "[closure@]"
|
||||||
|
// normalize-stderr-test "\+* ~" -> "+++ ~"
|
||||||
|
|
||||||
|
// The output of this currently suggests writing a closure in the qualified path.
|
||||||
|
|
||||||
|
trait MyTrait<T> {
|
||||||
|
fn lol<F:FnOnce()>(&self, f:F) -> u16;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Qqq;
|
||||||
|
|
||||||
|
impl MyTrait<u32> for Qqq{
|
||||||
|
fn lol<F:FnOnce()>(&self, _f:F) -> u16 { 5 }
|
||||||
|
}
|
||||||
|
impl MyTrait<u64> for Qqq{
|
||||||
|
fn lol<F:FnOnce()>(&self, _f:F) -> u16 { 6 }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let q = Qqq;
|
||||||
|
q.lol(||());
|
||||||
|
}
|
34
src/test/ui/traits/suggest-fully-qualified-closure.stderr
Normal file
34
src/test/ui/traits/suggest-fully-qualified-closure.stderr
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
error[E0282]: type annotations needed
|
||||||
|
--> $DIR/suggest-fully-qualified-closure.rs:23:7
|
||||||
|
|
|
||||||
|
LL | q.lol(||());
|
||||||
|
| ^^^
|
||||||
|
|
|
||||||
|
help: try using a fully qualified path to specify the expected types
|
||||||
|
|
|
||||||
|
LL | <Qqq as MyTrait<T>>::lol::<[closure@]>(&q, ||());
|
||||||
|
| +++ ~
|
||||||
|
|
||||||
|
error[E0283]: type annotations needed
|
||||||
|
--> $DIR/suggest-fully-qualified-closure.rs:23:7
|
||||||
|
|
|
||||||
|
LL | q.lol(||());
|
||||||
|
| ^^^
|
||||||
|
|
|
||||||
|
note: multiple `impl`s satisfying `Qqq: MyTrait<_>` found
|
||||||
|
--> $DIR/suggest-fully-qualified-closure.rs:14:1
|
||||||
|
|
|
||||||
|
LL | impl MyTrait<u32> for Qqq{
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
...
|
||||||
|
LL | impl MyTrait<u64> for Qqq{
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
help: try using a fully qualified path to specify the expected types
|
||||||
|
|
|
||||||
|
LL | <Qqq as MyTrait<T>>::lol::<[closure@]>(&q, ||());
|
||||||
|
| +++ ~
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0282, E0283.
|
||||||
|
For more information about an error, try `rustc --explain E0282`.
|
33
src/test/ui/typeck/issue-103899.rs
Normal file
33
src/test/ui/typeck/issue-103899.rs
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
// check-fail
|
||||||
|
// failure-status: 101
|
||||||
|
// normalize-stderr-test "note: .*" -> ""
|
||||||
|
// normalize-stderr-test "thread 'rustc' .*" -> ""
|
||||||
|
// normalize-stderr-test " .*\n" -> ""
|
||||||
|
// normalize-stderr-test " .*\n" -> ""
|
||||||
|
// known-bug: #103899
|
||||||
|
|
||||||
|
trait BaseWithAssoc {
|
||||||
|
type Assoc;
|
||||||
|
}
|
||||||
|
|
||||||
|
trait WrapperWithAssoc {
|
||||||
|
type BaseAssoc: BaseWithAssoc;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Wrapper<B> {
|
||||||
|
inner: B,
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ProjectToBase<T: BaseWithAssoc> {
|
||||||
|
data_type_h: T::Assoc,
|
||||||
|
}
|
||||||
|
|
||||||
|
struct DoubleProject<L: WrapperWithAssoc> {
|
||||||
|
buffer: Wrapper<ProjectToBase<L::BaseAssoc>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn trigger<L: WrapperWithAssoc<BaseAssoc = ()>>() -> DoubleProject<L> {
|
||||||
|
loop {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
12
src/test/ui/typeck/issue-103899.stderr
Normal file
12
src/test/ui/typeck/issue-103899.stderr
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
|
||||||
|
stack
|
||||||
|
error:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
query#0#1end
|
Loading…
Add table
Add a link
Reference in a new issue