Auto merge of #132099 - matthiaskrgr:rollup-myi94r8, r=matthiaskrgr
Rollup of 5 pull requests Successful merges: - #129248 (Taking a raw ref (`&raw (const|mut)`) of a deref of pointer (`*ptr`) is always safe) - #131906 (rustdoc: adjust spacing and typography in header) - #132084 (Consider param-env candidates even if they have errors) - #132096 (Replace an FTP link in comments with an equivalent HTTPS link) - #132098 (rustc_feature::Features: explain what that 'Option<Symbol>' is about) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
5ae4d75eff
@ -2,7 +2,7 @@
|
||||
//!
|
||||
//! Algorithm based on Loukas Georgiadis,
|
||||
//! "Linear-Time Algorithms for Dominators and Related Problems",
|
||||
//! <ftp://ftp.cs.princeton.edu/techreports/2005/737.pdf>
|
||||
//! <https://www.cs.princeton.edu/techreports/2005/737.pdf>
|
||||
//!
|
||||
//! Additionally useful is the original Lengauer-Tarjan paper on this subject,
|
||||
//! "A Fast Algorithm for Finding Dominators in a Flowgraph"
|
||||
|
@ -44,6 +44,8 @@ pub struct Features {
|
||||
}
|
||||
|
||||
impl Features {
|
||||
/// `since` should be set for stable features that are nevertheless enabled with a `#[feature]`
|
||||
/// attribute, indicating since when they are stable.
|
||||
pub fn set_enabled_lang_feature(&mut self, name: Symbol, span: Span, since: Option<Symbol>) {
|
||||
self.enabled_lang_features.push((name, span, since));
|
||||
self.enabled_features.insert(name);
|
||||
@ -54,6 +56,10 @@ pub fn set_enabled_lib_feature(&mut self, name: Symbol, span: Span) {
|
||||
self.enabled_features.insert(name);
|
||||
}
|
||||
|
||||
/// Returns a list of triples with:
|
||||
/// - feature gate name
|
||||
/// - the span of the `#[feature]` attribute
|
||||
/// - (for already stable features) the version since which it is stable
|
||||
pub fn enabled_lang_features(&self) -> &Vec<(Symbol, Span, Option<Symbol>)> {
|
||||
&self.enabled_lang_features
|
||||
}
|
||||
|
@ -2657,8 +2657,8 @@ fn ty_find_init_error<'tcx>(
|
||||
///
|
||||
/// ### Explanation
|
||||
///
|
||||
/// Dereferencing a null pointer causes [undefined behavior] even as a place expression,
|
||||
/// like `&*(0 as *const i32)` or `addr_of!(*(0 as *const i32))`.
|
||||
/// Dereferencing a null pointer causes [undefined behavior] if it is accessed
|
||||
/// (loaded from or stored to).
|
||||
///
|
||||
/// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html
|
||||
pub DEREF_NULLPTR,
|
||||
@ -2673,14 +2673,14 @@ fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &hir::Expr<'_>) {
|
||||
/// test if expression is a null ptr
|
||||
fn is_null_ptr(cx: &LateContext<'_>, expr: &hir::Expr<'_>) -> bool {
|
||||
match &expr.kind {
|
||||
rustc_hir::ExprKind::Cast(expr, ty) => {
|
||||
if let rustc_hir::TyKind::Ptr(_) = ty.kind {
|
||||
hir::ExprKind::Cast(expr, ty) => {
|
||||
if let hir::TyKind::Ptr(_) = ty.kind {
|
||||
return is_zero(expr) || is_null_ptr(cx, expr);
|
||||
}
|
||||
}
|
||||
// check for call to `core::ptr::null` or `core::ptr::null_mut`
|
||||
rustc_hir::ExprKind::Call(path, _) => {
|
||||
if let rustc_hir::ExprKind::Path(ref qpath) = path.kind {
|
||||
hir::ExprKind::Call(path, _) => {
|
||||
if let hir::ExprKind::Path(ref qpath) = path.kind {
|
||||
if let Some(def_id) = cx.qpath_res(qpath, path.hir_id).opt_def_id() {
|
||||
return matches!(
|
||||
cx.tcx.get_diagnostic_name(def_id),
|
||||
@ -2697,7 +2697,7 @@ fn is_null_ptr(cx: &LateContext<'_>, expr: &hir::Expr<'_>) -> bool {
|
||||
/// test if expression is the literal `0`
|
||||
fn is_zero(expr: &hir::Expr<'_>) -> bool {
|
||||
match &expr.kind {
|
||||
rustc_hir::ExprKind::Lit(lit) => {
|
||||
hir::ExprKind::Lit(lit) => {
|
||||
if let LitKind::Int(a, _) = lit.node {
|
||||
return a == 0;
|
||||
}
|
||||
@ -2707,8 +2707,16 @@ fn is_zero(expr: &hir::Expr<'_>) -> bool {
|
||||
false
|
||||
}
|
||||
|
||||
if let rustc_hir::ExprKind::Unary(rustc_hir::UnOp::Deref, expr_deref) = expr.kind {
|
||||
if is_null_ptr(cx, expr_deref) {
|
||||
if let hir::ExprKind::Unary(hir::UnOp::Deref, expr_deref) = expr.kind
|
||||
&& is_null_ptr(cx, expr_deref)
|
||||
{
|
||||
if let hir::Node::Expr(hir::Expr {
|
||||
kind: hir::ExprKind::AddrOf(hir::BorrowKind::Raw, ..),
|
||||
..
|
||||
}) = cx.tcx.parent_hir_node(expr.hir_id)
|
||||
{
|
||||
// `&raw *NULL` is ok.
|
||||
} else {
|
||||
cx.emit_span_lint(DEREF_NULLPTR, expr.span, BuiltinDerefNullptr {
|
||||
label: expr.span,
|
||||
});
|
||||
|
@ -509,20 +509,12 @@ fn visit_expr(&mut self, expr: &'a Expr<'tcx>) {
|
||||
}
|
||||
ExprKind::RawBorrow { arg, .. } => {
|
||||
if let ExprKind::Scope { value: arg, .. } = self.thir[arg].kind
|
||||
// THIR desugars UNSAFE_STATIC into *UNSAFE_STATIC_REF, where
|
||||
// UNSAFE_STATIC_REF holds the addr of the UNSAFE_STATIC, so: take two steps
|
||||
&& let ExprKind::Deref { arg } = self.thir[arg].kind
|
||||
// FIXME(workingjubiee): we lack a clear reason to reject ThreadLocalRef here,
|
||||
// but we also have no conclusive reason to allow it either!
|
||||
&& let ExprKind::StaticRef { .. } = self.thir[arg].kind
|
||||
{
|
||||
// A raw ref to a place expr, even an "unsafe static", is okay!
|
||||
// We short-circuit to not recursively traverse this expression.
|
||||
// Taking a raw ref to a deref place expr is always safe.
|
||||
// Make sure the expression we're deref'ing is safe, though.
|
||||
visit::walk_expr(self, &self.thir[arg]);
|
||||
return;
|
||||
// note: const_mut_refs enables this code, and it currently remains unsafe:
|
||||
// static mut BYTE: u8 = 0;
|
||||
// static mut BYTE_PTR: *mut u8 = unsafe { addr_of_mut!(BYTE) };
|
||||
// static mut DEREF_BYTE_PTR: *mut u8 = unsafe { addr_of_mut!(*BYTE_PTR) };
|
||||
}
|
||||
}
|
||||
ExprKind::Deref { arg } => {
|
||||
|
@ -244,7 +244,6 @@ fn assemble_candidates_from_caller_bounds<'o>(
|
||||
.param_env
|
||||
.caller_bounds()
|
||||
.iter()
|
||||
.filter(|p| !p.references_error())
|
||||
.filter_map(|p| p.as_trait_clause())
|
||||
// Micro-optimization: filter out predicates relating to different traits.
|
||||
.filter(|p| p.def_id() == stack.obligation.predicate.def_id())
|
||||
|
@ -2010,9 +2010,9 @@ fn render_rightside(w: &mut Buffer, cx: &Context<'_>, item: &clean::Item, render
|
||||
);
|
||||
if let Some(link) = src_href {
|
||||
if has_stability {
|
||||
write!(rightside, " · <a class=\"src\" href=\"{link}\">source</a>")
|
||||
write!(rightside, " · <a class=\"src\" href=\"{link}\">Source</a>")
|
||||
} else {
|
||||
write!(rightside, "<a class=\"src rightside\" href=\"{link}\">source</a>")
|
||||
write!(rightside, "<a class=\"src rightside\" href=\"{link}\">Source</a>")
|
||||
}
|
||||
}
|
||||
if has_stability && has_src_ref {
|
||||
|
@ -185,7 +185,7 @@ h1, h2, h3, h4 {
|
||||
grid-template-columns: minmax(105px, 1fr) minmax(0, max-content);
|
||||
grid-template-rows: minmax(25px, min-content) min-content min-content;
|
||||
padding-bottom: 6px;
|
||||
margin-bottom: 11px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
.rustdoc-breadcrumbs {
|
||||
grid-area: main-heading-breadcrumbs;
|
||||
@ -1004,6 +1004,7 @@ nav.sub {
|
||||
display: flex;
|
||||
height: 34px;
|
||||
flex-grow: 1;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
.src nav.sub {
|
||||
margin: 0 0 -10px 0;
|
||||
@ -2253,7 +2254,12 @@ in src-script.js and main.js
|
||||
|
||||
/* We don't display this button on mobile devices. */
|
||||
#copy-path {
|
||||
display: none;
|
||||
/* display: none; avoided as a layout hack.
|
||||
When there's one line, we get an effective line-height of 34px,
|
||||
because that's how big the image is, but if the header wraps,
|
||||
they're packed more tightly than that. */
|
||||
width: 0;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
/* Text label takes up too much space at this size. */
|
||||
|
@ -26,7 +26,7 @@
|
||||
{% match src_href %}
|
||||
{% when Some with (href) %}
|
||||
{% if !stability_since_raw.is_empty() +%} · {%+ endif %}
|
||||
<a class="src" href="{{href|safe}}">source</a> {#+ #}
|
||||
<a class="src" href="{{href|safe}}">Source</a> {#+ #}
|
||||
{% else %}
|
||||
{% endmatch %}
|
||||
</span> {# #}
|
||||
|
@ -1,28 +0,0 @@
|
||||
//@ known-bug: #110630
|
||||
|
||||
#![feature(generic_const_exprs)]
|
||||
|
||||
use std::ops::Mul;
|
||||
|
||||
pub trait Indices<const N: usize> {
|
||||
const NUM_ELEMS: usize = I::NUM_ELEMS * N;
|
||||
}
|
||||
|
||||
pub trait Concat<J> {
|
||||
type Output;
|
||||
}
|
||||
|
||||
pub struct Tensor<I: Indices<N>, const N: usize>
|
||||
where
|
||||
[u8; I::NUM_ELEMS]: Sized, {}
|
||||
|
||||
impl<I: Indices<N>, J: Indices<N>, const N: usize> Mul<Tensor<J, N>> for Tensor<I, N>
|
||||
where
|
||||
I: Concat<T>,
|
||||
<I as Concat<J>>::Output: Indices<N>,
|
||||
[u8; I::NUM_ELEMS]: Sized,
|
||||
[u8; J::NUM_ELEMS]: Sized,
|
||||
[u8; <I as Concat<J>>::Output::NUM_ELEMS]: Sized,
|
||||
{
|
||||
type Output = Tensor<<I as Concat<J>>::Output, N>;
|
||||
}
|
@ -1,27 +0,0 @@
|
||||
//@ known-bug: #115808
|
||||
#![feature(generic_const_exprs)]
|
||||
|
||||
use std::ops::Mul;
|
||||
|
||||
pub trait Indices<const N: usize> {
|
||||
const NUM_ELEMS: usize;
|
||||
}
|
||||
|
||||
pub trait Concat<J> {
|
||||
type Output;
|
||||
}
|
||||
|
||||
pub struct Tensor<I: Indices<N>, const N: usize>
|
||||
where
|
||||
[u8; I::NUM_ELEMS]: Sized, {}
|
||||
|
||||
impl<I: Indices<N>, J: Indices<N>, const N: usize> Mul<Tensor<J, N>> for Tensor<I, N>
|
||||
where
|
||||
I: Concat<FN>,
|
||||
<I as Concat<J>>::Output: Indices<N>,
|
||||
[u8; I::NUM_ELEMS]: Sized,
|
||||
[u8; J::NUM_ELEMS]: Sized,
|
||||
[u8; <I as Concat<J>>::Output::NUM_ELEMS]: Sized,
|
||||
{
|
||||
type Output = Tensor<<I as Concat<J>>::Output, N>;
|
||||
}
|
@ -1,32 +0,0 @@
|
||||
//@ known-bug: #121052
|
||||
#![feature(generic_const_exprs, with_negative_coherence)]
|
||||
|
||||
use std::ops::Mul;
|
||||
|
||||
pub trait Indices<const N: usize> {
|
||||
const NUM_ELEMS: usize;
|
||||
}
|
||||
|
||||
impl<I: Indices<N>, J: Indices<N>, const N: usize> Mul for Tensor<I, N>
|
||||
where
|
||||
I: Concat<J>,
|
||||
<I as Concat<J>>::Output: Indices<N>,
|
||||
[u8; I::NUM_ELEMS]: Sized,
|
||||
[u8; J::NUM_ELEMS]: Sized,
|
||||
[u8; <I as Concat<J>>::Output::NUM_ELEMS]: Sized,
|
||||
{
|
||||
}
|
||||
|
||||
pub trait Concat<J> {}
|
||||
|
||||
pub struct Tensor<I: Indices<N>, const N: usize> {}
|
||||
|
||||
impl<I: Indices<N>, J: Indices<N>, const N: usize> Mul for Tensor<I, N>
|
||||
where
|
||||
I: Concat<J>,
|
||||
<I as Concat<J>>::Output: Indices<N>,
|
||||
[u8; I::NUM_ELEMS]: Sized,
|
||||
[u8; J::NUM_ELEMS]: Sized,
|
||||
[u8; <I as Concat<J>>::Output::NUM_ELEMS]: Sized,
|
||||
{
|
||||
}
|
@ -20,7 +20,7 @@ store-position: (
|
||||
{"x": second_line_x, "y": second_line_y},
|
||||
)
|
||||
assert: |first_line_x| != |second_line_x| && |first_line_x| == 516 && |second_line_x| == 272
|
||||
assert: |first_line_y| != |second_line_y| && |first_line_y| == 714 && |second_line_y| == 737
|
||||
assert: |first_line_y| != |second_line_y| && |first_line_y| == 718 && |second_line_y| == 741
|
||||
|
||||
// Now we ensure that they're not rendered on the same line.
|
||||
set-window-size: (1100, 800)
|
||||
|
@ -80,8 +80,8 @@ click: ".scraped-example .button-holder .expand"
|
||||
store-value: (offset_y, 4)
|
||||
|
||||
// First with desktop
|
||||
assert-position: (".scraped-example", {"y": 252})
|
||||
assert-position: (".scraped-example .prev", {"y": 252 + |offset_y|})
|
||||
assert-position: (".scraped-example", {"y": 256})
|
||||
assert-position: (".scraped-example .prev", {"y": 256 + |offset_y|})
|
||||
|
||||
// Gradient background should be at the top of the code block.
|
||||
assert-css: (".scraped-example .example-wrap::before", {"top": "0px"})
|
||||
@ -90,8 +90,8 @@ assert-css: (".scraped-example .example-wrap::after", {"bottom": "0px"})
|
||||
// Then with mobile
|
||||
set-window-size: (600, 600)
|
||||
store-size: (".scraped-example .scraped-example-title", {"height": title_height})
|
||||
assert-position: (".scraped-example", {"y": 287})
|
||||
assert-position: (".scraped-example .prev", {"y": 287 + |offset_y| + |title_height|})
|
||||
assert-position: (".scraped-example", {"y": 291})
|
||||
assert-position: (".scraped-example .prev", {"y": 291 + |offset_y| + |title_height|})
|
||||
|
||||
define-function: (
|
||||
"check_title_and_code_position",
|
||||
|
@ -141,7 +141,7 @@ click: "#sidebar-button"
|
||||
wait-for-css: (".src .sidebar > *", {"visibility": "hidden"})
|
||||
// We scroll to line 117 to change the scroll position.
|
||||
scroll-to: '//*[@id="117"]'
|
||||
store-value: (y_offset, "2570")
|
||||
store-value: (y_offset, "2578")
|
||||
assert-window-property: {"pageYOffset": |y_offset|}
|
||||
// Expanding the sidebar...
|
||||
click: "#sidebar-button"
|
||||
|
@ -8,13 +8,13 @@ set-window-size: (600, 800)
|
||||
assert-property: ("html", {"scrollTop": "0"})
|
||||
|
||||
click: '//a[text() = "barbar" and @href="#5-7"]'
|
||||
assert-property: ("html", {"scrollTop": "200"})
|
||||
assert-property: ("html", {"scrollTop": "208"})
|
||||
click: '//a[text() = "bar" and @href="#28-36"]'
|
||||
assert-property: ("html", {"scrollTop": "231"})
|
||||
assert-property: ("html", {"scrollTop": "239"})
|
||||
click: '//a[normalize-space() = "sub_fn" and @href="#2-4"]'
|
||||
assert-property: ("html", {"scrollTop": "128"})
|
||||
assert-property: ("html", {"scrollTop": "136"})
|
||||
|
||||
// We now check that clicking on lines doesn't change the scroll
|
||||
// Extra information: the "sub_fn" function header is on line 1.
|
||||
click: '//*[@id="6"]'
|
||||
assert-property: ("html", {"scrollTop": "128"})
|
||||
assert-property: ("html", {"scrollTop": "136"})
|
||||
|
@ -89,7 +89,7 @@ assert-css: (".src-line-numbers", {"text-align": "right"})
|
||||
// do anything (and certainly not add a `#NaN` to the URL!).
|
||||
go-to: "file://" + |DOC_PATH| + "/src/test_docs/lib.rs.html"
|
||||
// We use this assert-position to know where we will click.
|
||||
assert-position: ("//*[@id='1']", {"x": 88, "y": 163})
|
||||
assert-position: ("//*[@id='1']", {"x": 88, "y": 171})
|
||||
// We click on the left of the "1" anchor but still in the "src-line-number" `<pre>`.
|
||||
click: (163, 77)
|
||||
assert-document-property: ({"URL": "/lib.rs.html"}, ENDS_WITH)
|
||||
@ -165,7 +165,7 @@ assert-css: ("nav.sub", {"flex-direction": "row"})
|
||||
// offsetTop[nav.sub form] = offsetTop[#main-content] - offsetHeight[nav.sub form] - offsetTop[nav.sub form]
|
||||
assert-position: ("nav.sub form", {"y": 15})
|
||||
assert-property: ("nav.sub form", {"offsetHeight": 34})
|
||||
assert-position: ("h1", {"y": 64})
|
||||
assert-position: ("h1", {"y": 68})
|
||||
// 15 = 64 - 34 - 15
|
||||
|
||||
// Now do the same check on moderately-sized, tablet mobile.
|
||||
@ -173,7 +173,7 @@ set-window-size: (700, 700)
|
||||
assert-css: ("nav.sub", {"flex-direction": "row"})
|
||||
assert-position: ("nav.sub form", {"y": 8})
|
||||
assert-property: ("nav.sub form", {"offsetHeight": 34})
|
||||
assert-position: ("h1", {"y": 50})
|
||||
assert-position: ("h1", {"y": 54})
|
||||
// 8 = 50 - 34 - 8
|
||||
|
||||
// Check the sidebar directory entries have a marker and spacing (tablet).
|
||||
|
@ -1 +1 @@
|
||||
<section id="associatedconstant.YOLO" class="method"><a class="src rightside" href="../src/foo/anchors.rs.html#16">source</a><h4 class="code-header">const <a href="#associatedconstant.YOLO" class="constant">YOLO</a>: <a class="primitive" href="{{channel}}/std/primitive.u32.html">u32</a></h4></section>
|
||||
<section id="associatedconstant.YOLO" class="method"><a class="src rightside" href="../src/foo/anchors.rs.html#16">Source</a><h4 class="code-header">const <a href="#associatedconstant.YOLO" class="constant">YOLO</a>: <a class="primitive" href="{{channel}}/std/primitive.u32.html">u32</a></h4></section>
|
@ -1 +1 @@
|
||||
<section id="associatedconstant.X" class="associatedconstant"><a class="src rightside" href="../src/foo/anchors.rs.html#42">source</a><h4 class="code-header">pub const <a href="#associatedconstant.X" class="constant">X</a>: <a class="primitive" href="{{channel}}/std/primitive.i32.html">i32</a> = 0i32</h4></section>
|
||||
<section id="associatedconstant.X" class="associatedconstant"><a class="src rightside" href="../src/foo/anchors.rs.html#42">Source</a><h4 class="code-header">pub const <a href="#associatedconstant.X" class="constant">X</a>: <a class="primitive" href="{{channel}}/std/primitive.i32.html">i32</a> = 0i32</h4></section>
|
@ -1 +1 @@
|
||||
<section id="method.new" class="method"><a class="src rightside" href="../src/foo/anchors.rs.html#48">source</a><h4 class="code-header">pub fn <a href="#method.new" class="fn">new</a>() -> Self</h4></section>
|
||||
<section id="method.new" class="method"><a class="src rightside" href="../src/foo/anchors.rs.html#48">Source</a><h4 class="code-header">pub fn <a href="#method.new" class="fn">new</a>() -> Self</h4></section>
|
@ -1 +1 @@
|
||||
<section id="method.bar" class="method"><a class="src rightside" href="../src/foo/anchors.rs.html#23">source</a><h4 class="code-header">fn <a href="#method.bar" class="fn">bar</a>()</h4></section>
|
||||
<section id="method.bar" class="method"><a class="src rightside" href="../src/foo/anchors.rs.html#23">Source</a><h4 class="code-header">fn <a href="#method.bar" class="fn">bar</a>()</h4></section>
|
@ -1 +1 @@
|
||||
<section id="tymethod.foo" class="method"><a class="src rightside" href="../src/foo/anchors.rs.html#20">source</a><h4 class="code-header">fn <a href="#tymethod.foo" class="fn">foo</a>()</h4></section>
|
||||
<section id="tymethod.foo" class="method"><a class="src rightside" href="../src/foo/anchors.rs.html#20">Source</a><h4 class="code-header">fn <a href="#tymethod.foo" class="fn">foo</a>()</h4></section>
|
@ -1 +1 @@
|
||||
<section id="associatedtype.T" class="method"><a class="src rightside" href="../src/foo/anchors.rs.html#13">source</a><h4 class="code-header">type <a href="#associatedtype.T" class="associatedtype">T</a></h4></section>
|
||||
<section id="associatedtype.T" class="method"><a class="src rightside" href="../src/foo/anchors.rs.html#13">Source</a><h4 class="code-header">type <a href="#associatedtype.T" class="associatedtype">T</a></h4></section>
|
@ -1 +1 @@
|
||||
<section id="associatedtype.Y" class="associatedtype"><a class="src rightside" href="../src/foo/anchors.rs.html#45">source</a><h4 class="code-header">pub type <a href="#associatedtype.Y" class="associatedtype">Y</a> = <a class="primitive" href="{{channel}}/std/primitive.u32.html">u32</a></h4></section>
|
||||
<section id="associatedtype.Y" class="associatedtype"><a class="src rightside" href="../src/foo/anchors.rs.html#45">Source</a><h4 class="code-header">pub type <a href="#associatedtype.Y" class="associatedtype">Y</a> = <a class="primitive" href="{{channel}}/std/primitive.u32.html">u32</a></h4></section>
|
@ -8,7 +8,7 @@
|
||||
pub struct Bar;
|
||||
|
||||
impl Bar {
|
||||
//@ has - '//*[@id="implementations-list"]//*[@id="associatedtype.Y"]/a' 'source'
|
||||
//@ has - '//*[@id="implementations-list"]//*[@id="associatedtype.Y"]/a' 'Source'
|
||||
//@ has - '//*[@id="implementations-list"]//*[@id="associatedtype.Y"]/a/@href' \
|
||||
// '../src/foo/assoc-type-source-link.rs.html#14'
|
||||
pub type Y = u8;
|
||||
@ -19,7 +19,7 @@ pub trait Foo {
|
||||
}
|
||||
|
||||
impl Foo for Bar {
|
||||
//@ has - '//*[@id="trait-implementations-list"]//*[@id="associatedtype.Z"]/a' 'source'
|
||||
//@ has - '//*[@id="trait-implementations-list"]//*[@id="associatedtype.Z"]/a' 'Source'
|
||||
//@ has - '//*[@id="trait-implementations-list"]//*[@id="associatedtype.Z"]/a/@href' \
|
||||
// '../src/foo/assoc-type-source-link.rs.html#25'
|
||||
type Z = u8;
|
||||
|
@ -2,5 +2,5 @@
|
||||
|
||||
// This test ensures that the [src] link is present on traits items.
|
||||
|
||||
//@ has foo/trait.Iterator.html '//*[@id="method.zip"]//a[@class="src"]' "source"
|
||||
//@ has foo/trait.Iterator.html '//*[@id="method.zip"]//a[@class="src"]' "Source"
|
||||
pub use std::iter::Iterator;
|
||||
|
@ -5,8 +5,8 @@
|
||||
#[macro_use]
|
||||
extern crate external_macro_src;
|
||||
|
||||
//@ has foo/index.html '//a[@href="../src/foo/external-macro-src.rs.html#3-12"]' 'source'
|
||||
//@ has foo/index.html '//a[@href="../src/foo/external-macro-src.rs.html#3-12"]' 'Source'
|
||||
|
||||
//@ has foo/struct.Foo.html
|
||||
//@ has - '//a[@href="../src/foo/external-macro-src.rs.html#12"]' 'source'
|
||||
//@ has - '//a[@href="../src/foo/external-macro-src.rs.html#12"]' 'Source'
|
||||
make_foo!();
|
||||
|
@ -3,23 +3,23 @@
|
||||
#![feature(staged_api)]
|
||||
|
||||
//@ has foo/trait.Bar.html
|
||||
//@ has - '//div[@class="main-heading"]/*[@class="sub-heading"]' '1.0.0 · source'
|
||||
//@ has - '//div[@class="main-heading"]/*[@class="sub-heading"]' '1.0.0 · Source'
|
||||
#[stable(feature = "bar", since = "1.0")]
|
||||
pub trait Bar {
|
||||
//@ has - '//*[@id="tymethod.foo"]/*[@class="rightside"]' '3.0.0 · source'
|
||||
//@ has - '//*[@id="tymethod.foo"]/*[@class="rightside"]' '3.0.0 · Source'
|
||||
#[stable(feature = "foobar", since = "3.0")]
|
||||
fn foo();
|
||||
}
|
||||
|
||||
//@ has - '//div[@id="implementors-list"]//*[@class="rightside"]' '4.0.0 · source'
|
||||
//@ has - '//div[@id="implementors-list"]//*[@class="rightside"]' '4.0.0 · Source'
|
||||
|
||||
//@ has foo/struct.Foo.html
|
||||
//@ has - '//div[@class="main-heading"]/*[@class="sub-heading"]' '1.0.0 · source'
|
||||
//@ has - '//div[@class="main-heading"]/*[@class="sub-heading"]' '1.0.0 · Source'
|
||||
#[stable(feature = "baz", since = "1.0")]
|
||||
pub struct Foo;
|
||||
|
||||
impl Foo {
|
||||
//@ has - '//*[@id="method.foofoo"]/*[@class="rightside"]' '3.0.0 · source'
|
||||
//@ has - '//*[@id="method.foofoo"]/*[@class="rightside"]' '3.0.0 · Source'
|
||||
#[stable(feature = "foobar", since = "3.0")]
|
||||
pub fn foofoo() {}
|
||||
}
|
||||
|
@ -10,5 +10,5 @@
|
||||
extern crate issue_26606_macro;
|
||||
|
||||
//@ has issue_26606/constant.FOO.html
|
||||
//@ has - '//a[@href="../src/issue_26606/src-link-external-macro-26606.rs.html#14"]' 'source'
|
||||
//@ has - '//a[@href="../src/issue_26606/src-link-external-macro-26606.rs.html#14"]' 'Source'
|
||||
make_item!(FOO);
|
||||
|
@ -2,11 +2,11 @@
|
||||
|
||||
//@ has foo/struct.Unsized.html
|
||||
//@ has - '//*[@id="impl-Sized-for-Unsized"]/h3[@class="code-header"]' 'impl !Sized for Unsized'
|
||||
//@ !has - '//*[@id="impl-Sized-for-Unsized"]//a[@class="src"]' 'source'
|
||||
//@ !has - '//*[@id="impl-Sized-for-Unsized"]//a[@class="src"]' 'Source'
|
||||
//@ has - '//*[@id="impl-Sync-for-Unsized"]/h3[@class="code-header"]' 'impl Sync for Unsized'
|
||||
//@ !has - '//*[@id="impl-Sync-for-Unsized"]//a[@class="src"]' 'source'
|
||||
//@ !has - '//*[@id="impl-Sync-for-Unsized"]//a[@class="src"]' 'Source'
|
||||
//@ has - '//*[@id="impl-Any-for-T"]/h3[@class="code-header"]' 'impl<T> Any for T'
|
||||
//@ has - '//*[@id="impl-Any-for-T"]//a[@class="src rightside"]' 'source'
|
||||
//@ has - '//*[@id="impl-Any-for-T"]//a[@class="src rightside"]' 'Source'
|
||||
pub struct Unsized {
|
||||
data: [u8],
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
#![crate_name = "foo"]
|
||||
|
||||
//@ has foo/index.html '//a[@href="../src/foo/thread-local-src.rs.html#1-6"]' 'source'
|
||||
//@ has foo/index.html '//a[@href="../src/foo/thread-local-src.rs.html#1-6"]' 'Source'
|
||||
|
||||
//@ has foo/constant.FOO.html '//a[@href="../src/foo/thread-local-src.rs.html#6"]' 'source'
|
||||
//@ has foo/constant.FOO.html '//a[@href="../src/foo/thread-local-src.rs.html#6"]' 'Source'
|
||||
thread_local!(pub static FOO: bool = false);
|
||||
|
@ -1,26 +1,26 @@
|
||||
#![crate_name = "quix"]
|
||||
pub trait Foo {
|
||||
//@ has quix/trait.Foo.html '//a[@href="../src/quix/trait-src-link.rs.html#4"]' 'source'
|
||||
//@ has quix/trait.Foo.html '//a[@href="../src/quix/trait-src-link.rs.html#4"]' 'Source'
|
||||
fn required();
|
||||
|
||||
//@ has quix/trait.Foo.html '//a[@href="../src/quix/trait-src-link.rs.html#7"]' 'source'
|
||||
//@ has quix/trait.Foo.html '//a[@href="../src/quix/trait-src-link.rs.html#7"]' 'Source'
|
||||
fn provided() {}
|
||||
}
|
||||
|
||||
pub struct Bar;
|
||||
|
||||
impl Foo for Bar {
|
||||
//@ has quix/struct.Bar.html '//a[@href="../src/quix/trait-src-link.rs.html#14"]' 'source'
|
||||
//@ has quix/struct.Bar.html '//a[@href="../src/quix/trait-src-link.rs.html#14"]' 'Source'
|
||||
fn required() {}
|
||||
//@ has quix/struct.Bar.html '//a[@href="../src/quix/trait-src-link.rs.html#7"]' 'source'
|
||||
//@ has quix/struct.Bar.html '//a[@href="../src/quix/trait-src-link.rs.html#7"]' 'Source'
|
||||
}
|
||||
|
||||
pub struct Baz;
|
||||
|
||||
impl Foo for Baz {
|
||||
//@ has quix/struct.Baz.html '//a[@href="../src/quix/trait-src-link.rs.html#22"]' 'source'
|
||||
//@ has quix/struct.Baz.html '//a[@href="../src/quix/trait-src-link.rs.html#22"]' 'Source'
|
||||
fn required() {}
|
||||
|
||||
//@ has quix/struct.Baz.html '//a[@href="../src/quix/trait-src-link.rs.html#25"]' 'source'
|
||||
//@ has quix/struct.Baz.html '//a[@href="../src/quix/trait-src-link.rs.html#25"]' 'Source'
|
||||
fn provided() {}
|
||||
}
|
||||
|
@ -14,7 +14,6 @@ impl<'a> Actor for () {
|
||||
//~^ ERROR the lifetime parameter `'a` is not constrained by the impl trait, self type, or predicates
|
||||
type Message = &'a ();
|
||||
async fn on_mount(self, _: impl Inbox<&'a ()>) {}
|
||||
//~^ ERROR the trait bound `impl Inbox<&'a ()>: Inbox<&'a ()>` is not satisfied
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
@ -1,22 +1,9 @@
|
||||
error[E0277]: the trait bound `impl Inbox<&'a ()>: Inbox<&'a ()>` is not satisfied
|
||||
--> $DIR/unconstrained-impl-region.rs:16:5
|
||||
|
|
||||
LL | async fn on_mount(self, _: impl Inbox<&'a ()>) {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Inbox<&'a ()>` is not implemented for `impl Inbox<&'a ()>`
|
||||
|
|
||||
note: required by a bound in `<() as Actor>::on_mount`
|
||||
--> $DIR/unconstrained-impl-region.rs:16:37
|
||||
|
|
||||
LL | async fn on_mount(self, _: impl Inbox<&'a ()>) {}
|
||||
| ^^^^^^^^^^^^^ required by this bound in `<() as Actor>::on_mount`
|
||||
|
||||
error[E0207]: the lifetime parameter `'a` is not constrained by the impl trait, self type, or predicates
|
||||
--> $DIR/unconstrained-impl-region.rs:13:6
|
||||
|
|
||||
LL | impl<'a> Actor for () {
|
||||
| ^^ unconstrained lifetime parameter
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
Some errors have detailed explanations: E0207, E0277.
|
||||
For more information about an error, try `rustc --explain E0207`.
|
||||
For more information about this error, try `rustc --explain E0207`.
|
||||
|
@ -27,9 +27,9 @@ fn f() {
|
||||
let ub = &*ptr::null_mut::<i32>();
|
||||
//~^ ERROR dereferencing a null pointer
|
||||
ptr::addr_of!(*ptr::null::<i32>());
|
||||
//~^ ERROR dereferencing a null pointer
|
||||
// ^^ OKAY
|
||||
ptr::addr_of_mut!(*ptr::null_mut::<i32>());
|
||||
//~^ ERROR dereferencing a null pointer
|
||||
// ^^ OKAY
|
||||
let offset = ptr::addr_of!((*ptr::null::<Struct>()).field);
|
||||
//~^ ERROR dereferencing a null pointer
|
||||
}
|
||||
|
@ -46,23 +46,11 @@ error: dereferencing a null pointer
|
||||
LL | let ub = &*ptr::null_mut::<i32>();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ this code causes undefined behavior when executed
|
||||
|
||||
error: dereferencing a null pointer
|
||||
--> $DIR/lint-deref-nullptr.rs:29:23
|
||||
|
|
||||
LL | ptr::addr_of!(*ptr::null::<i32>());
|
||||
| ^^^^^^^^^^^^^^^^^^^ this code causes undefined behavior when executed
|
||||
|
||||
error: dereferencing a null pointer
|
||||
--> $DIR/lint-deref-nullptr.rs:31:27
|
||||
|
|
||||
LL | ptr::addr_of_mut!(*ptr::null_mut::<i32>());
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ this code causes undefined behavior when executed
|
||||
|
||||
error: dereferencing a null pointer
|
||||
--> $DIR/lint-deref-nullptr.rs:33:36
|
||||
|
|
||||
LL | let offset = ptr::addr_of!((*ptr::null::<Struct>()).field);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ this code causes undefined behavior when executed
|
||||
|
||||
error: aborting due to 10 previous errors
|
||||
error: aborting due to 8 previous errors
|
||||
|
||||
|
@ -1,13 +1,14 @@
|
||||
//@ check-pass
|
||||
use std::ptr;
|
||||
|
||||
// This code should remain unsafe because of the two unsafe operations here,
|
||||
// even if in a hypothetical future we deem all &raw (const|mut) *ptr exprs safe.
|
||||
|
||||
static mut BYTE: u8 = 0;
|
||||
static mut BYTE_PTR: *mut u8 = ptr::addr_of_mut!(BYTE);
|
||||
|
||||
// This code should remain unsafe because reading from a static mut is *always* unsafe.
|
||||
|
||||
// An unsafe static's ident is a place expression in its own right, so despite the above being safe
|
||||
// (it's fine to create raw refs to places!) the following derefs the ptr before creating its ref
|
||||
// (it's fine to create raw refs to places!) the following *reads* from the static mut place before
|
||||
// derefing it explicitly with the `*` below.
|
||||
static mut DEREF_BYTE_PTR: *mut u8 = unsafe { ptr::addr_of_mut!(*BYTE_PTR) };
|
||||
|
||||
fn main() {
|
||||
|
@ -1,15 +1,14 @@
|
||||
use std::ptr;
|
||||
|
||||
// This code should remain unsafe because of the two unsafe operations here,
|
||||
// even if in a hypothetical future we deem all &raw (const|mut) *ptr exprs safe.
|
||||
|
||||
static mut BYTE: u8 = 0;
|
||||
static mut BYTE_PTR: *mut u8 = ptr::addr_of_mut!(BYTE);
|
||||
|
||||
// This code should remain unsafe because reading from a static mut is *always* unsafe.
|
||||
|
||||
// An unsafe static's ident is a place expression in its own right, so despite the above being safe
|
||||
// (it's fine to create raw refs to places!) the following derefs the ptr before creating its ref!
|
||||
static mut DEREF_BYTE_PTR: *mut u8 = ptr::addr_of_mut!(*BYTE_PTR);
|
||||
//~^ ERROR: use of mutable static
|
||||
//~| ERROR: dereference of raw pointer
|
||||
|
||||
fn main() {
|
||||
let _ = unsafe { DEREF_BYTE_PTR };
|
||||
|
@ -1,11 +1,3 @@
|
||||
error[E0133]: dereference of raw pointer is unsafe and requires unsafe function or block
|
||||
--> $DIR/raw-ref-deref-without-unsafe.rs:10:56
|
||||
|
|
||||
LL | static mut DEREF_BYTE_PTR: *mut u8 = ptr::addr_of_mut!(*BYTE_PTR);
|
||||
| ^^^^^^^^^ dereference of raw pointer
|
||||
|
|
||||
= note: raw pointers may be null, dangling or unaligned; they can violate aliasing rules and cause data races: all of these are undefined behavior
|
||||
|
||||
error[E0133]: use of mutable static is unsafe and requires unsafe function or block
|
||||
--> $DIR/raw-ref-deref-without-unsafe.rs:10:57
|
||||
|
|
||||
@ -14,6 +6,6 @@ LL | static mut DEREF_BYTE_PTR: *mut u8 = ptr::addr_of_mut!(*BYTE_PTR);
|
||||
|
|
||||
= note: mutable statics can be mutated by multiple threads: aliasing violations or data races will cause undefined behavior
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0133`.
|
||||
|
10
tests/ui/traits/error-reporting/apit-with-bad-path.rs
Normal file
10
tests/ui/traits/error-reporting/apit-with-bad-path.rs
Normal file
@ -0,0 +1,10 @@
|
||||
// Ensure that we don't emit an E0270 for "`impl AsRef<Path>: AsRef<Path>` not satisfied".
|
||||
|
||||
fn foo(filename: impl AsRef<Path>) {
|
||||
//~^ ERROR cannot find type `Path` in this scope
|
||||
std::fs::write(filename, "hello").unwrap();
|
||||
}
|
||||
|
||||
fn main() {
|
||||
foo("/tmp/hello");
|
||||
}
|
14
tests/ui/traits/error-reporting/apit-with-bad-path.stderr
Normal file
14
tests/ui/traits/error-reporting/apit-with-bad-path.stderr
Normal file
@ -0,0 +1,14 @@
|
||||
error[E0412]: cannot find type `Path` in this scope
|
||||
--> $DIR/apit-with-bad-path.rs:3:29
|
||||
|
|
||||
LL | fn foo(filename: impl AsRef<Path>) {
|
||||
| ^^^^ not found in this scope
|
||||
|
|
||||
help: consider importing this struct
|
||||
|
|
||||
LL + use std::path::Path;
|
||||
|
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0412`.
|
@ -0,0 +1,10 @@
|
||||
// Ensure that we don't emit an E0270 for "`impl AsRef<Path>: AsRef<Path>` not satisfied".
|
||||
|
||||
fn foo<T: AsRef<Path>>(filename: T) {
|
||||
//~^ ERROR cannot find type `Path` in this scope
|
||||
std::fs::write(filename, "hello").unwrap();
|
||||
}
|
||||
|
||||
fn main() {
|
||||
foo("/tmp/hello");
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
error[E0412]: cannot find type `Path` in this scope
|
||||
--> $DIR/where-clause-with-bad-path.rs:3:17
|
||||
|
|
||||
LL | fn foo<T: AsRef<Path>>(filename: T) {
|
||||
| ^^^^ not found in this scope
|
||||
|
|
||||
help: consider importing this struct
|
||||
|
|
||||
LL + use std::path::Path;
|
||||
|
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0412`.
|
14
tests/ui/unsafe/place-expr-safe.rs
Normal file
14
tests/ui/unsafe/place-expr-safe.rs
Normal file
@ -0,0 +1,14 @@
|
||||
//@ check-pass
|
||||
|
||||
fn main() {
|
||||
let ptr = std::ptr::null_mut::<i32>();
|
||||
let addr = &raw const *ptr;
|
||||
|
||||
let local = 1;
|
||||
let ptr = &local as *const i32;
|
||||
let addr = &raw const *ptr;
|
||||
|
||||
let boxed = Box::new(1);
|
||||
let ptr = &*boxed as *const i32;
|
||||
let addr = &raw const *ptr;
|
||||
}
|
Loading…
Reference in New Issue
Block a user