mirror of
https://github.com/rust-lang/rust.git
synced 2024-10-31 06:22:00 +00:00
Auto merge of #92719 - matthiaskrgr:rollup-tc7oqys, r=matthiaskrgr
Rollup of 7 pull requests Successful merges: - #92248 (Normalize struct tail type when checking Pointee trait) - #92357 (Fix invalid removal of newlines from doc comments) - #92602 (Make source links look cleaner) - #92636 (Normalize generator-local types with unevaluated constants) - #92693 (Release notes: add `Result::unwrap_{,err_}unchecked`) - #92702 (Clean up lang_items::extract) - #92717 (update miri) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
89b9f7b284
@ -41,6 +41,8 @@ Stabilized APIs
|
|||||||
- [`Path::is_symlink`]
|
- [`Path::is_symlink`]
|
||||||
- [`{integer}::saturating_div`]
|
- [`{integer}::saturating_div`]
|
||||||
- [`Option::unwrap_unchecked`]
|
- [`Option::unwrap_unchecked`]
|
||||||
|
- [`Result::unwrap_unchecked`]
|
||||||
|
- [`Result::unwrap_err_unchecked`]
|
||||||
- [`NonZero{unsigned}::is_power_of_two`]
|
- [`NonZero{unsigned}::is_power_of_two`]
|
||||||
|
|
||||||
These APIs are now usable in const contexts:
|
These APIs are now usable in const contexts:
|
||||||
@ -136,6 +138,8 @@ and related tools.
|
|||||||
[`Path::is_symlink`]: https://doc.rust-lang.org/stable/std/path/struct.Path.html#method.is_symlink
|
[`Path::is_symlink`]: https://doc.rust-lang.org/stable/std/path/struct.Path.html#method.is_symlink
|
||||||
[`{integer}::saturating_div`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.saturating_div
|
[`{integer}::saturating_div`]: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.saturating_div
|
||||||
[`Option::unwrap_unchecked`]: https://doc.rust-lang.org/stable/std/option/enum.Option.html#method.unwrap_unchecked
|
[`Option::unwrap_unchecked`]: https://doc.rust-lang.org/stable/std/option/enum.Option.html#method.unwrap_unchecked
|
||||||
|
[`Result::unwrap_unchecked`]: https://doc.rust-lang.org/stable/std/result/enum.Result.html#method.unwrap_unchecked
|
||||||
|
[`Result::unwrap_err_unchecked`]: https://doc.rust-lang.org/stable/std/result/enum.Result.html#method.unwrap_err_unchecked
|
||||||
[`NonZero{unsigned}::is_power_of_two`]: https://doc.rust-lang.org/stable/std/num/struct.NonZeroU8.html#method.is_power_of_two
|
[`NonZero{unsigned}::is_power_of_two`]: https://doc.rust-lang.org/stable/std/num/struct.NonZeroU8.html#method.is_power_of_two
|
||||||
[`unix::process::ExitStatusExt::core_dumped`]: https://doc.rust-lang.org/stable/std/os/unix/process/trait.ExitStatusExt.html#tymethod.core_dumped
|
[`unix::process::ExitStatusExt::core_dumped`]: https://doc.rust-lang.org/stable/std/os/unix/process/trait.ExitStatusExt.html#tymethod.core_dumped
|
||||||
[`unix::process::ExitStatusExt::stopped_signal`]: https://doc.rust-lang.org/stable/std/os/unix/process/trait.ExitStatusExt.html#tymethod.stopped_signal
|
[`unix::process::ExitStatusExt::stopped_signal`]: https://doc.rust-lang.org/stable/std/os/unix/process/trait.ExitStatusExt.html#tymethod.stopped_signal
|
||||||
|
@ -34,18 +34,11 @@ pub fn beautify_doc_string(data: Symbol) -> Symbol {
|
|||||||
i += 1;
|
i += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
while i < j && lines[i].trim().is_empty() {
|
|
||||||
i += 1;
|
|
||||||
}
|
|
||||||
// like the first, a last line of all stars should be omitted
|
// like the first, a last line of all stars should be omitted
|
||||||
if j > i && !lines[j - 1].is_empty() && lines[j - 1].chars().all(|c| c == '*') {
|
if j > i && !lines[j - 1].is_empty() && lines[j - 1].chars().all(|c| c == '*') {
|
||||||
j -= 1;
|
j -= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
while j > i && lines[j - 1].trim().is_empty() {
|
|
||||||
j -= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if i != 0 || j != lines.len() { Some((i, j)) } else { None }
|
if i != 0 || j != lines.len() { Some((i, j)) } else { None }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -151,20 +151,12 @@ impl<CTX> HashStable<CTX> for LangItem {
|
|||||||
/// Extracts the first `lang = "$name"` out of a list of attributes.
|
/// Extracts the first `lang = "$name"` out of a list of attributes.
|
||||||
/// The attributes `#[panic_handler]` and `#[alloc_error_handler]`
|
/// The attributes `#[panic_handler]` and `#[alloc_error_handler]`
|
||||||
/// are also extracted out when found.
|
/// are also extracted out when found.
|
||||||
///
|
pub fn extract(attrs: &[ast::Attribute]) -> Option<(Symbol, Span)> {
|
||||||
/// About the `check_name` argument: passing in a `Session` would be simpler,
|
|
||||||
/// because then we could call `Session::check_name` directly. But we want to
|
|
||||||
/// avoid the need for `rustc_hir` to depend on `rustc_session`, so we
|
|
||||||
/// use a closure instead.
|
|
||||||
pub fn extract<'a, F>(check_name: F, attrs: &'a [ast::Attribute]) -> Option<(Symbol, Span)>
|
|
||||||
where
|
|
||||||
F: Fn(&'a ast::Attribute, Symbol) -> bool,
|
|
||||||
{
|
|
||||||
attrs.iter().find_map(|attr| {
|
attrs.iter().find_map(|attr| {
|
||||||
Some(match attr {
|
Some(match attr {
|
||||||
_ if check_name(attr, sym::lang) => (attr.value_str()?, attr.span),
|
_ if attr.has_name(sym::lang) => (attr.value_str()?, attr.span),
|
||||||
_ if check_name(attr, sym::panic_handler) => (sym::panic_impl, attr.span),
|
_ if attr.has_name(sym::panic_handler) => (sym::panic_impl, attr.span),
|
||||||
_ if check_name(attr, sym::alloc_error_handler) => (sym::oom, attr.span),
|
_ if attr.has_name(sym::alloc_error_handler) => (sym::oom, attr.span),
|
||||||
_ => return None,
|
_ => return None,
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -18,13 +18,9 @@ pub static WEAK_ITEMS_REFS: SyncLazy<StableMap<Symbol, LangItem>> = SyncLazy::ne
|
|||||||
map
|
map
|
||||||
});
|
});
|
||||||
|
|
||||||
/// The `check_name` argument avoids the need for `rustc_hir` to depend on
|
pub fn link_name(attrs: &[ast::Attribute]) -> Option<Symbol>
|
||||||
/// `rustc_session`.
|
|
||||||
pub fn link_name<'a, F>(check_name: F, attrs: &'a [ast::Attribute]) -> Option<Symbol>
|
|
||||||
where
|
|
||||||
F: Fn(&'a ast::Attribute, Symbol) -> bool
|
|
||||||
{
|
{
|
||||||
lang_items::extract(check_name, attrs).and_then(|(name, _)| {
|
lang_items::extract(attrs).and_then(|(name, _)| {
|
||||||
$(if name == sym::$name {
|
$(if name == sym::$name {
|
||||||
Some(sym::$sym)
|
Some(sym::$sym)
|
||||||
} else)* {
|
} else)* {
|
||||||
|
@ -2143,9 +2143,12 @@ impl<'tcx> TyS<'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the type of metadata for (potentially fat) pointers to this type.
|
/// Returns the type of metadata for (potentially fat) pointers to this type.
|
||||||
pub fn ptr_metadata_ty(&'tcx self, tcx: TyCtxt<'tcx>) -> Ty<'tcx> {
|
pub fn ptr_metadata_ty(
|
||||||
// FIXME: should this normalize?
|
&'tcx self,
|
||||||
let tail = tcx.struct_tail_without_normalization(self);
|
tcx: TyCtxt<'tcx>,
|
||||||
|
normalize: impl FnMut(Ty<'tcx>) -> Ty<'tcx>,
|
||||||
|
) -> Ty<'tcx> {
|
||||||
|
let tail = tcx.struct_tail_with_normalize(self, normalize);
|
||||||
match tail.kind() {
|
match tail.kind() {
|
||||||
// Sized types
|
// Sized types
|
||||||
ty::Infer(ty::IntVar(_) | ty::FloatVar(_))
|
ty::Infer(ty::IntVar(_) | ty::FloatVar(_))
|
||||||
|
@ -192,7 +192,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||||||
pub fn struct_tail_with_normalize(
|
pub fn struct_tail_with_normalize(
|
||||||
self,
|
self,
|
||||||
mut ty: Ty<'tcx>,
|
mut ty: Ty<'tcx>,
|
||||||
normalize: impl Fn(Ty<'tcx>) -> Ty<'tcx>,
|
mut normalize: impl FnMut(Ty<'tcx>) -> Ty<'tcx>,
|
||||||
) -> Ty<'tcx> {
|
) -> Ty<'tcx> {
|
||||||
let recursion_limit = self.recursion_limit();
|
let recursion_limit = self.recursion_limit();
|
||||||
for iteration in 0.. {
|
for iteration in 0.. {
|
||||||
|
@ -726,9 +726,13 @@ fn sanitize_witness<'tcx>(
|
|||||||
saved_locals: &GeneratorSavedLocals,
|
saved_locals: &GeneratorSavedLocals,
|
||||||
) {
|
) {
|
||||||
let did = body.source.def_id();
|
let did = body.source.def_id();
|
||||||
let allowed_upvars = tcx.erase_regions(upvars);
|
let param_env = tcx.param_env(did);
|
||||||
|
|
||||||
|
let allowed_upvars = tcx.normalize_erasing_regions(param_env, upvars);
|
||||||
let allowed = match witness.kind() {
|
let allowed = match witness.kind() {
|
||||||
&ty::GeneratorWitness(s) => tcx.erase_late_bound_regions(s),
|
&ty::GeneratorWitness(interior_tys) => {
|
||||||
|
tcx.normalize_erasing_late_bound_regions(param_env, interior_tys)
|
||||||
|
}
|
||||||
_ => {
|
_ => {
|
||||||
tcx.sess.delay_span_bug(
|
tcx.sess.delay_span_bug(
|
||||||
body.span,
|
body.span,
|
||||||
@ -738,8 +742,6 @@ fn sanitize_witness<'tcx>(
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let param_env = tcx.param_env(did);
|
|
||||||
|
|
||||||
for (local, decl) in body.local_decls.iter_enumerated() {
|
for (local, decl) in body.local_decls.iter_enumerated() {
|
||||||
// Ignore locals which are internal or not saved between yields.
|
// Ignore locals which are internal or not saved between yields.
|
||||||
if !saved_locals.contains(local) || decl.internal {
|
if !saved_locals.contains(local) || decl.internal {
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
use crate::check_attr::target_from_impl_item;
|
use crate::check_attr::target_from_impl_item;
|
||||||
use crate::weak_lang_items;
|
use crate::weak_lang_items;
|
||||||
|
|
||||||
use rustc_ast::Attribute;
|
|
||||||
use rustc_errors::{pluralize, struct_span_err};
|
use rustc_errors::{pluralize, struct_span_err};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
@ -57,8 +56,7 @@ impl<'tcx> LanguageItemCollector<'tcx> {
|
|||||||
|
|
||||||
fn check_for_lang(&mut self, actual_target: Target, hir_id: HirId) {
|
fn check_for_lang(&mut self, actual_target: Target, hir_id: HirId) {
|
||||||
let attrs = self.tcx.hir().attrs(hir_id);
|
let attrs = self.tcx.hir().attrs(hir_id);
|
||||||
let check_name = |attr: &Attribute, sym| attr.has_name(sym);
|
if let Some((value, span)) = extract(&attrs) {
|
||||||
if let Some((value, span)) = extract(check_name, &attrs) {
|
|
||||||
match ITEM_REFS.get(&value).cloned() {
|
match ITEM_REFS.get(&value).cloned() {
|
||||||
// Known lang item with attribute on correct target.
|
// Known lang item with attribute on correct target.
|
||||||
Some((item_index, expected_target)) if actual_target == expected_target => {
|
Some((item_index, expected_target)) if actual_target == expected_target => {
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
//! Validity checking for weak lang items
|
//! Validity checking for weak lang items
|
||||||
|
|
||||||
use rustc_ast::Attribute;
|
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxHashSet;
|
||||||
use rustc_errors::struct_span_err;
|
use rustc_errors::struct_span_err;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
@ -103,9 +102,8 @@ impl<'a, 'tcx, 'v> Visitor<'v> for Context<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn visit_foreign_item(&mut self, i: &hir::ForeignItem<'_>) {
|
fn visit_foreign_item(&mut self, i: &hir::ForeignItem<'_>) {
|
||||||
let check_name = |attr: &Attribute, sym| attr.has_name(sym);
|
|
||||||
let attrs = self.tcx.hir().attrs(i.hir_id());
|
let attrs = self.tcx.hir().attrs(i.hir_id());
|
||||||
if let Some((lang_item, _)) = lang_items::extract(check_name, attrs) {
|
if let Some((lang_item, _)) = lang_items::extract(attrs) {
|
||||||
self.register(lang_item, i.span);
|
self.register(lang_item, i.span);
|
||||||
}
|
}
|
||||||
intravisit::walk_foreign_item(self, i)
|
intravisit::walk_foreign_item(self, i)
|
||||||
|
@ -1400,8 +1400,17 @@ fn assemble_candidates_from_impls<'cx, 'tcx>(
|
|||||||
// Any type with multiple potential metadata types is therefore not eligible.
|
// Any type with multiple potential metadata types is therefore not eligible.
|
||||||
let self_ty = selcx.infcx().shallow_resolve(obligation.predicate.self_ty());
|
let self_ty = selcx.infcx().shallow_resolve(obligation.predicate.self_ty());
|
||||||
|
|
||||||
// FIXME: should this normalize?
|
let tail = selcx.tcx().struct_tail_with_normalize(self_ty, |ty| {
|
||||||
let tail = selcx.tcx().struct_tail_without_normalization(self_ty);
|
normalize_with_depth(
|
||||||
|
selcx,
|
||||||
|
obligation.param_env,
|
||||||
|
obligation.cause.clone(),
|
||||||
|
obligation.recursion_depth + 1,
|
||||||
|
ty,
|
||||||
|
)
|
||||||
|
.value
|
||||||
|
});
|
||||||
|
|
||||||
match tail.kind() {
|
match tail.kind() {
|
||||||
ty::Bool
|
ty::Bool
|
||||||
| ty::Char
|
| ty::Char
|
||||||
@ -1435,7 +1444,12 @@ fn assemble_candidates_from_impls<'cx, 'tcx>(
|
|||||||
| ty::Bound(..)
|
| ty::Bound(..)
|
||||||
| ty::Placeholder(..)
|
| ty::Placeholder(..)
|
||||||
| ty::Infer(..)
|
| ty::Infer(..)
|
||||||
| ty::Error(_) => false,
|
| ty::Error(_) => {
|
||||||
|
if tail.has_infer_types() {
|
||||||
|
candidate_set.mark_ambiguous();
|
||||||
|
}
|
||||||
|
false
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
super::ImplSource::Param(..) => {
|
super::ImplSource::Param(..) => {
|
||||||
@ -1640,18 +1654,30 @@ fn confirm_pointee_candidate<'cx, 'tcx>(
|
|||||||
_: ImplSourcePointeeData,
|
_: ImplSourcePointeeData,
|
||||||
) -> Progress<'tcx> {
|
) -> Progress<'tcx> {
|
||||||
let tcx = selcx.tcx();
|
let tcx = selcx.tcx();
|
||||||
|
|
||||||
let self_ty = selcx.infcx().shallow_resolve(obligation.predicate.self_ty());
|
let self_ty = selcx.infcx().shallow_resolve(obligation.predicate.self_ty());
|
||||||
let substs = tcx.mk_substs([self_ty.into()].iter());
|
|
||||||
|
|
||||||
|
let mut obligations = vec![];
|
||||||
|
let metadata_ty = self_ty.ptr_metadata_ty(tcx, |ty| {
|
||||||
|
normalize_with_depth_to(
|
||||||
|
selcx,
|
||||||
|
obligation.param_env,
|
||||||
|
obligation.cause.clone(),
|
||||||
|
obligation.recursion_depth + 1,
|
||||||
|
ty,
|
||||||
|
&mut obligations,
|
||||||
|
)
|
||||||
|
});
|
||||||
|
|
||||||
|
let substs = tcx.mk_substs([self_ty.into()].iter());
|
||||||
let metadata_def_id = tcx.require_lang_item(LangItem::Metadata, None);
|
let metadata_def_id = tcx.require_lang_item(LangItem::Metadata, None);
|
||||||
|
|
||||||
let predicate = ty::ProjectionPredicate {
|
let predicate = ty::ProjectionPredicate {
|
||||||
projection_ty: ty::ProjectionTy { substs, item_def_id: metadata_def_id },
|
projection_ty: ty::ProjectionTy { substs, item_def_id: metadata_def_id },
|
||||||
ty: self_ty.ptr_metadata_ty(tcx),
|
ty: metadata_ty,
|
||||||
};
|
};
|
||||||
|
|
||||||
confirm_param_env_candidate(selcx, obligation, ty::Binder::dummy(predicate), false)
|
confirm_param_env_candidate(selcx, obligation, ty::Binder::dummy(predicate), false)
|
||||||
|
.with_addl_obligations(obligations)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn confirm_fn_pointer_candidate<'cx, 'tcx>(
|
fn confirm_fn_pointer_candidate<'cx, 'tcx>(
|
||||||
|
@ -21,7 +21,6 @@ use crate::constrained_generic_params as cgp;
|
|||||||
use crate::errors;
|
use crate::errors;
|
||||||
use crate::middle::resolve_lifetime as rl;
|
use crate::middle::resolve_lifetime as rl;
|
||||||
use rustc_ast as ast;
|
use rustc_ast as ast;
|
||||||
use rustc_ast::Attribute;
|
|
||||||
use rustc_ast::{MetaItemKind, NestedMetaItem};
|
use rustc_ast::{MetaItemKind, NestedMetaItem};
|
||||||
use rustc_attr::{list_contains_name, InlineAttr, InstructionSetAttr, OptimizeAttr};
|
use rustc_attr::{list_contains_name, InlineAttr, InstructionSetAttr, OptimizeAttr};
|
||||||
use rustc_data_structures::captures::Captures;
|
use rustc_data_structures::captures::Captures;
|
||||||
@ -3120,8 +3119,7 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, id: DefId) -> CodegenFnAttrs {
|
|||||||
if tcx.is_weak_lang_item(id) {
|
if tcx.is_weak_lang_item(id) {
|
||||||
codegen_fn_attrs.flags |= CodegenFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL;
|
codegen_fn_attrs.flags |= CodegenFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL;
|
||||||
}
|
}
|
||||||
let check_name = |attr: &Attribute, sym| attr.has_name(sym);
|
if let Some(name) = weak_lang_items::link_name(attrs) {
|
||||||
if let Some(name) = weak_lang_items::link_name(check_name, attrs) {
|
|
||||||
codegen_fn_attrs.export_name = Some(name);
|
codegen_fn_attrs.export_name = Some(name);
|
||||||
codegen_fn_attrs.link_name = Some(name);
|
codegen_fn_attrs.link_name = Some(name);
|
||||||
}
|
}
|
||||||
|
@ -35,8 +35,8 @@
|
|||||||
//! development you may want to press the `[-]` button near the top of the
|
//! development you may want to press the `[-]` button near the top of the
|
||||||
//! page to collapse it into a more skimmable view.
|
//! page to collapse it into a more skimmable view.
|
||||||
//!
|
//!
|
||||||
//! While you are looking at that `[-]` button also notice the `[src]`
|
//! While you are looking at that `[-]` button also notice the `source`
|
||||||
//! button. Rust's API documentation comes with the source code and you are
|
//! link. Rust's API documentation comes with the source code and you are
|
||||||
//! encouraged to read it. The standard library source is generally high
|
//! encouraged to read it. The standard library source is generally high
|
||||||
//! quality and a peek behind the curtains is often enlightening.
|
//! quality and a peek behind the curtains is often enlightening.
|
||||||
//!
|
//!
|
||||||
|
@ -65,7 +65,7 @@ crate struct Context<'tcx> {
|
|||||||
///
|
///
|
||||||
/// [#82381]: https://github.com/rust-lang/rust/issues/82381
|
/// [#82381]: https://github.com/rust-lang/rust/issues/82381
|
||||||
crate shared: Rc<SharedContext<'tcx>>,
|
crate shared: Rc<SharedContext<'tcx>>,
|
||||||
/// This flag indicates whether `[src]` links should be generated or not. If
|
/// This flag indicates whether source links should be generated or not. If
|
||||||
/// the source files are present in the html rendering, then this will be
|
/// the source files are present in the html rendering, then this will be
|
||||||
/// `true`.
|
/// `true`.
|
||||||
crate include_sources: bool,
|
crate include_sources: bool,
|
||||||
|
@ -182,7 +182,7 @@ impl StylePath {
|
|||||||
|
|
||||||
fn write_srclink(cx: &Context<'_>, item: &clean::Item, buf: &mut Buffer) {
|
fn write_srclink(cx: &Context<'_>, item: &clean::Item, buf: &mut Buffer) {
|
||||||
if let Some(l) = cx.src_href(item) {
|
if let Some(l) = cx.src_href(item) {
|
||||||
write!(buf, "<a class=\"srclink\" href=\"{}\" title=\"goto source code\">[src]</a>", l)
|
write!(buf, "<a class=\"srclink\" href=\"{}\" title=\"goto source code\">source</a>", l)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -799,7 +799,7 @@ fn render_stability_since_raw(
|
|||||||
const_stability: Option<ConstStability>,
|
const_stability: Option<ConstStability>,
|
||||||
containing_ver: Option<Symbol>,
|
containing_ver: Option<Symbol>,
|
||||||
containing_const_ver: Option<Symbol>,
|
containing_const_ver: Option<Symbol>,
|
||||||
) {
|
) -> bool {
|
||||||
let ver = ver.filter(|inner| !inner.is_empty());
|
let ver = ver.filter(|inner| !inner.is_empty());
|
||||||
|
|
||||||
match (ver, const_stability) {
|
match (ver, const_stability) {
|
||||||
@ -842,8 +842,9 @@ fn render_stability_since_raw(
|
|||||||
v
|
v
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => return false,
|
||||||
}
|
}
|
||||||
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render_assoc_item(
|
fn render_assoc_item(
|
||||||
@ -1632,7 +1633,7 @@ fn render_impl(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Render the items that appear on the right side of methods, impls, and
|
// Render the items that appear on the right side of methods, impls, and
|
||||||
// associated types. For example "1.0.0 (const: 1.39.0) [src]".
|
// associated types. For example "1.0.0 (const: 1.39.0) · source".
|
||||||
fn render_rightside(
|
fn render_rightside(
|
||||||
w: &mut Buffer,
|
w: &mut Buffer,
|
||||||
cx: &Context<'_>,
|
cx: &Context<'_>,
|
||||||
@ -1650,13 +1651,16 @@ fn render_rightside(
|
|||||||
};
|
};
|
||||||
|
|
||||||
write!(w, "<div class=\"rightside\">");
|
write!(w, "<div class=\"rightside\">");
|
||||||
render_stability_since_raw(
|
let has_stability = render_stability_since_raw(
|
||||||
w,
|
w,
|
||||||
item.stable_since(tcx),
|
item.stable_since(tcx),
|
||||||
const_stability,
|
const_stability,
|
||||||
containing_item.stable_since(tcx),
|
containing_item.stable_since(tcx),
|
||||||
const_stable_since,
|
const_stable_since,
|
||||||
);
|
);
|
||||||
|
if has_stability {
|
||||||
|
w.write_str(" · ");
|
||||||
|
}
|
||||||
|
|
||||||
write_srclink(cx, item, w);
|
write_srclink(cx, item, w);
|
||||||
w.write_str("</div>");
|
w.write_str("</div>");
|
||||||
|
@ -108,10 +108,10 @@ pub(super) fn print_item(
|
|||||||
);
|
);
|
||||||
let stability_since_raw: String = stability_since_raw.into_inner();
|
let stability_since_raw: String = stability_since_raw.into_inner();
|
||||||
|
|
||||||
// Write `src` tag
|
// Write source tag
|
||||||
//
|
//
|
||||||
// When this item is part of a `crate use` in a downstream crate, the
|
// When this item is part of a `crate use` in a downstream crate, the
|
||||||
// [src] link in the downstream documentation will actually come back to
|
// source link in the downstream documentation will actually come back to
|
||||||
// this page, and this link will be auto-clicked. The `id` attribute is
|
// this page, and this link will be auto-clicked. The `id` attribute is
|
||||||
// used to find the link to auto-click.
|
// used to find the link to auto-click.
|
||||||
let src_href =
|
let src_href =
|
||||||
@ -1467,7 +1467,7 @@ fn render_stability_since(
|
|||||||
item.const_stability(tcx),
|
item.const_stability(tcx),
|
||||||
containing_item.stable_since(tcx),
|
containing_item.stable_since(tcx),
|
||||||
containing_item.const_stable_since(tcx),
|
containing_item.const_stable_since(tcx),
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn compare_impl<'a, 'b>(lhs: &'a &&Impl, rhs: &'b &&Impl, cx: &Context<'_>) -> Ordering {
|
fn compare_impl<'a, 'b>(lhs: &'a &&Impl, rhs: &'b &&Impl, cx: &Context<'_>) -> Ordering {
|
||||||
|
@ -137,17 +137,25 @@ h1, h2, h3, h4 {
|
|||||||
margin: 15px 0 5px 0;
|
margin: 15px 0 5px 0;
|
||||||
}
|
}
|
||||||
h1.fqn {
|
h1.fqn {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
.main-heading {
|
||||||
display: flex;
|
display: flex;
|
||||||
border-bottom: 1px dashed;
|
border-bottom: 1px dashed #DDDDDD;
|
||||||
margin-top: 0;
|
padding-bottom: 6px;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
|
||||||
/* workaround to keep flex from breaking below 700 px width due to the float: right on the nav
|
/* workaround to keep flex from breaking below 700 px width due to the float: right on the nav
|
||||||
above the h1 */
|
above the h1 */
|
||||||
padding-left: 1px;
|
padding-left: 1px;
|
||||||
}
|
}
|
||||||
h1.fqn > .in-band > a:hover {
|
.main-heading a:hover {
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
|
#toggle-all-docs {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
/* The only headings that get underlines are:
|
/* The only headings that get underlines are:
|
||||||
Markdown-generated headings within the top-doc
|
Markdown-generated headings within the top-doc
|
||||||
Rustdoc-generated h2 section headings (e.g. "Implementations", "Required Methods", etc)
|
Rustdoc-generated h2 section headings (e.g. "Implementations", "Required Methods", etc)
|
||||||
@ -195,11 +203,13 @@ h1, h2, h3, h4, h5, h6,
|
|||||||
.sidebar, a.source, .search-input, .search-results .result-name,
|
.sidebar, a.source, .search-input, .search-results .result-name,
|
||||||
.content table td:first-child > a,
|
.content table td:first-child > a,
|
||||||
.item-left > a,
|
.item-left > a,
|
||||||
div.item-list .out-of-band, span.since,
|
.out-of-band,
|
||||||
|
span.since,
|
||||||
#source-sidebar, #sidebar-toggle,
|
#source-sidebar, #sidebar-toggle,
|
||||||
details.rustdoc-toggle > summary::before,
|
details.rustdoc-toggle > summary::before,
|
||||||
div.impl-items > div:not(.docblock):not(.item-info),
|
div.impl-items > div:not(.docblock):not(.item-info),
|
||||||
.content ul.crate a.crate, a.srclink,
|
.content ul.crate a.crate,
|
||||||
|
a.srclink,
|
||||||
/* This selector is for the items listed in the "all items" page. */
|
/* This selector is for the items listed in the "all items" page. */
|
||||||
#main-content > ul.docblock > li > a {
|
#main-content > ul.docblock > li > a {
|
||||||
font-family: "Fira Sans", Arial, NanumBarunGothic, sans-serif;
|
font-family: "Fira Sans", Arial, NanumBarunGothic, sans-serif;
|
||||||
@ -609,10 +619,12 @@ nav.sub {
|
|||||||
.content .out-of-band {
|
.content .out-of-band {
|
||||||
flex-grow: 0;
|
flex-grow: 0;
|
||||||
text-align: right;
|
text-align: right;
|
||||||
font-size: 1.4375rem;
|
margin-left: auto;
|
||||||
margin: 0px;
|
margin-right: 0;
|
||||||
|
font-size: 1.15rem;
|
||||||
padding: 0 0 0 12px;
|
padding: 0 0 0 12px;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
|
float: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
.method > .code-header, .trait-impl > .code-header, .invisible > .code-header {
|
.method > .code-header, .trait-impl > .code-header, .invisible > .code-header {
|
||||||
@ -1082,7 +1094,7 @@ body.blur > :not(#help) {
|
|||||||
font-size: initial;
|
font-size: initial;
|
||||||
}
|
}
|
||||||
|
|
||||||
.impl-items .since, .impl .since, .methods .since {
|
.rightside {
|
||||||
padding-left: 12px;
|
padding-left: 12px;
|
||||||
padding-right: 2px;
|
padding-right: 2px;
|
||||||
position: initial;
|
position: initial;
|
||||||
@ -1160,10 +1172,6 @@ a.test-arrow:hover{
|
|||||||
font-weight: 300;
|
font-weight: 300;
|
||||||
}
|
}
|
||||||
|
|
||||||
.since + .srclink {
|
|
||||||
padding-left: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.item-spacer {
|
.item-spacer {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 12px;
|
height: 12px;
|
||||||
|
@ -222,7 +222,7 @@ nav.main .separator {
|
|||||||
a {
|
a {
|
||||||
color: #39AFD7;
|
color: #39AFD7;
|
||||||
}
|
}
|
||||||
a.srclink,
|
|
||||||
a#toggle-all-docs,
|
a#toggle-all-docs,
|
||||||
a.anchor,
|
a.anchor,
|
||||||
.small-section-header a,
|
.small-section-header a,
|
||||||
|
@ -180,7 +180,7 @@ nav.main .separator {
|
|||||||
a {
|
a {
|
||||||
color: #D2991D;
|
color: #D2991D;
|
||||||
}
|
}
|
||||||
a.srclink,
|
|
||||||
a#toggle-all-docs,
|
a#toggle-all-docs,
|
||||||
a.anchor,
|
a.anchor,
|
||||||
.small-section-header a,
|
.small-section-header a,
|
||||||
|
@ -177,7 +177,7 @@ nav.main .separator {
|
|||||||
a {
|
a {
|
||||||
color: #3873AD;
|
color: #3873AD;
|
||||||
}
|
}
|
||||||
a.srclink,
|
|
||||||
a#toggle-all-docs,
|
a#toggle-all-docs,
|
||||||
a.anchor,
|
a.anchor,
|
||||||
.small-section-header a,
|
.small-section-header a,
|
||||||
@ -243,10 +243,6 @@ details.undocumented > summary::before {
|
|||||||
border-color: #bfbfbf;
|
border-color: #bfbfbf;
|
||||||
}
|
}
|
||||||
|
|
||||||
.since {
|
|
||||||
color: grey;
|
|
||||||
}
|
|
||||||
|
|
||||||
.result-name .primitive > i, .result-name .keyword > i {
|
.result-name .primitive > i, .result-name .keyword > i {
|
||||||
color: black;
|
color: black;
|
||||||
}
|
}
|
||||||
|
@ -1,26 +1,28 @@
|
|||||||
<h1 class="fqn"> {#- -#}
|
<div class="main-heading">
|
||||||
<span class="in-band"> {#- -#}
|
<h1 class="fqn"> {#- -#}
|
||||||
{{-typ-}}
|
<span class="in-band"> {#- -#}
|
||||||
{#- The breadcrumbs of the item path, like std::string -#}
|
{{-typ-}}
|
||||||
{%- for component in path_components -%}
|
{#- The breadcrumbs of the item path, like std::string -#}
|
||||||
<a href="{{component.path | safe}}index.html">{{component.name}}</a>::<wbr>
|
{%- for component in path_components -%}
|
||||||
{%- endfor -%}
|
<a href="{{component.path | safe}}index.html">{{component.name}}</a>::<wbr>
|
||||||
<a class="{{item_type}}" href="#">{{name}}</a> {#- -#}
|
{%- endfor -%}
|
||||||
<button id="copy-path" onclick="copy_path(this)" title="Copy item path to clipboard"> {#- -#}
|
<a class="{{item_type}}" href="#">{{name}}</a> {#- -#}
|
||||||
<img src="{{static_root_path | safe}}clipboard{{page.resource_suffix}}.svg" {# -#}
|
<button id="copy-path" onclick="copy_path(this)" title="Copy item path to clipboard"> {#- -#}
|
||||||
width="19" height="18" {# -#}
|
<img src="{{static_root_path | safe}}clipboard{{page.resource_suffix}}.svg" {# -#}
|
||||||
alt="Copy item path"> {#- -#}
|
width="19" height="18" {# -#}
|
||||||
</button> {#- -#}
|
alt="Copy item path"> {#- -#}
|
||||||
</span> {#- -#}
|
</button> {#- -#}
|
||||||
<span class="out-of-band"> {#- -#}
|
|
||||||
{{- stability_since_raw | safe -}}
|
|
||||||
<span id="render-detail"> {#- -#}
|
|
||||||
<a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs"> {#- -#}
|
|
||||||
[<span class="inner">−</span>] {#- -#}
|
|
||||||
</a> {#- -#}
|
|
||||||
</span> {#- -#}
|
</span> {#- -#}
|
||||||
{%- if src_href -%}
|
</h1> {#- -#}
|
||||||
<a class="srclink" href="{{src_href | safe}}" title="goto source code">[src]</a>
|
<span class="out-of-band"> {#- -#}
|
||||||
{%- endif -%}
|
{% if stability_since_raw %}
|
||||||
|
{{- stability_since_raw | safe -}} ·
|
||||||
|
{% endif %}
|
||||||
|
{%- if src_href %}
|
||||||
|
<a class="srclink" href="{{src_href | safe}}" title="goto source code">source</a> ·
|
||||||
|
{% endif -%}
|
||||||
|
<a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs"> {#- -#}
|
||||||
|
[<span class="inner">−</span>] {#- -#}
|
||||||
|
</a> {#- -#}
|
||||||
</span> {#- -#}
|
</span> {#- -#}
|
||||||
</h1> {#- -#}
|
</div>
|
||||||
|
@ -13,8 +13,10 @@ reload:
|
|||||||
assert-css: ("#toggle-all-docs", {"color": "rgb(0, 0, 0)"})
|
assert-css: ("#toggle-all-docs", {"color": "rgb(0, 0, 0)"})
|
||||||
assert-css: (".fqn .in-band a:nth-of-type(1)", {"color": "rgb(0, 0, 0)"})
|
assert-css: (".fqn .in-band a:nth-of-type(1)", {"color": "rgb(0, 0, 0)"})
|
||||||
assert-css: (".fqn .in-band a:nth-of-type(2)", {"color": "rgb(173, 55, 138)"})
|
assert-css: (".fqn .in-band a:nth-of-type(2)", {"color": "rgb(173, 55, 138)"})
|
||||||
assert-css: (".srclink", {"color": "rgb(0, 0, 0)"})
|
assert-css: (".srclink", {"color": "rgb(56, 115, 173)"})
|
||||||
assert-css: (".srclink", {"color": "rgb(0, 0, 0)"})
|
|
||||||
|
move-cursor-to: ".main-heading .srclink"
|
||||||
|
assert-css: (".srclink", {"text-decoration": "underline solid rgb(56, 115, 173)"})
|
||||||
|
|
||||||
assert-css: ("#top-doc-prose-title", {"color": "rgb(0, 0, 0)"})
|
assert-css: ("#top-doc-prose-title", {"color": "rgb(0, 0, 0)"})
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
goto: file://|DOC_PATH|/test_docs/struct.HeavilyDocumentedStruct.html
|
goto: file://|DOC_PATH|/test_docs/struct.HeavilyDocumentedStruct.html
|
||||||
|
|
||||||
assert-css: ("h1.fqn", {"font-size": "24px"})
|
assert-css: ("h1.fqn", {"font-size": "24px"})
|
||||||
assert-css: ("h1.fqn", {"border-bottom-width": "1px"})
|
assert-css: (".main-heading", {"border-bottom-width": "1px"})
|
||||||
|
|
||||||
assert-css: ("h2#top-doc-prose-title", {"font-size": "20.8px"})
|
assert-css: ("h2#top-doc-prose-title", {"font-size": "20.8px"})
|
||||||
assert-css: ("h2#top-doc-prose-title", {"border-bottom-width": "1px"})
|
assert-css: ("h2#top-doc-prose-title", {"border-bottom-width": "1px"})
|
||||||
@ -55,7 +55,7 @@ assert-css: ("h6#sub-sub-heading-for-struct-impl-item-doc", {"font-size": "15.2p
|
|||||||
goto: file://|DOC_PATH|/test_docs/enum.HeavilyDocumentedEnum.html
|
goto: file://|DOC_PATH|/test_docs/enum.HeavilyDocumentedEnum.html
|
||||||
|
|
||||||
assert-css: ("h1.fqn", {"font-size": "24px"})
|
assert-css: ("h1.fqn", {"font-size": "24px"})
|
||||||
assert-css: ("h1.fqn", {"border-bottom-width": "1px"})
|
assert-css: (".main-heading", {"border-bottom-width": "1px"})
|
||||||
|
|
||||||
assert-css: ("h2#top-doc-prose-title", {"font-size": "20.8px"})
|
assert-css: ("h2#top-doc-prose-title", {"font-size": "20.8px"})
|
||||||
assert-css: ("h2#top-doc-prose-title", {"border-bottom-width": "1px"})
|
assert-css: ("h2#top-doc-prose-title", {"border-bottom-width": "1px"})
|
||||||
@ -115,7 +115,7 @@ assert-css: (".sidebar .others h3", {"border-bottom-width": "1px"}, ALL)
|
|||||||
goto: file://|DOC_PATH|/test_docs/union.HeavilyDocumentedUnion.html
|
goto: file://|DOC_PATH|/test_docs/union.HeavilyDocumentedUnion.html
|
||||||
|
|
||||||
assert-css: ("h1.fqn", {"font-size": "24px"})
|
assert-css: ("h1.fqn", {"font-size": "24px"})
|
||||||
assert-css: ("h1.fqn", {"border-bottom-width": "1px"})
|
assert-css: (".main-heading", {"border-bottom-width": "1px"})
|
||||||
|
|
||||||
assert-css: ("h2#top-doc-prose-title", {"font-size": "20.8px"})
|
assert-css: ("h2#top-doc-prose-title", {"font-size": "20.8px"})
|
||||||
assert-css: ("h2#top-doc-prose-title", {"border-bottom-width": "1px"})
|
assert-css: ("h2#top-doc-prose-title", {"border-bottom-width": "1px"})
|
||||||
@ -148,7 +148,7 @@ assert-css: ("h6#sub-heading-for-union-impl-item-doc", {"border-bottom-width": "
|
|||||||
goto: file://|DOC_PATH|/test_docs/macro.heavily_documented_macro.html
|
goto: file://|DOC_PATH|/test_docs/macro.heavily_documented_macro.html
|
||||||
|
|
||||||
assert-css: ("h1.fqn", {"font-size": "24px"})
|
assert-css: ("h1.fqn", {"font-size": "24px"})
|
||||||
assert-css: ("h1.fqn", {"border-bottom-width": "1px"})
|
assert-css: (".main-heading", {"border-bottom-width": "1px"})
|
||||||
|
|
||||||
assert-css: ("h2#top-doc-prose-title", {"font-size": "20.8px"})
|
assert-css: ("h2#top-doc-prose-title", {"font-size": "20.8px"})
|
||||||
assert-css: ("h2#top-doc-prose-title", {"border-bottom-width": "1px"})
|
assert-css: ("h2#top-doc-prose-title", {"border-bottom-width": "1px"})
|
||||||
|
@ -1,10 +1,13 @@
|
|||||||
goto: file://|DOC_PATH|/test_docs/index.html
|
goto: file://|DOC_PATH|/test_docs/index.html
|
||||||
assert-attribute: ("#main-content > details.top-doc", {"open": ""})
|
assert-attribute: ("#main-content > details.top-doc", {"open": ""})
|
||||||
|
assert-text: ("#toggle-all-docs", "[−]")
|
||||||
click: "#toggle-all-docs"
|
click: "#toggle-all-docs"
|
||||||
wait-for: 1000
|
wait-for: 1000
|
||||||
// This is now collapsed so there shouldn't be the "open" attribute on details.
|
// This is now collapsed so there shouldn't be the "open" attribute on details.
|
||||||
assert-attribute-false: ("#main-content > details.top-doc", {"open": ""})
|
assert-attribute-false: ("#main-content > details.top-doc", {"open": ""})
|
||||||
|
assert-text: ("#toggle-all-docs", "[+]")
|
||||||
click: "#toggle-all-docs"
|
click: "#toggle-all-docs"
|
||||||
wait-for: 1000
|
wait-for: 1000
|
||||||
// Not collapsed anymore so the "open" attribute should be back.
|
// Not collapsed anymore so the "open" attribute should be back.
|
||||||
assert-attribute: ("#main-content > details.top-doc", {"open": ""})
|
assert-attribute: ("#main-content > details.top-doc", {"open": ""})
|
||||||
|
assert-text: ("#toggle-all-docs", "[−]")
|
||||||
|
@ -2,5 +2,5 @@
|
|||||||
|
|
||||||
// This test ensures that the [src] link is present on traits items.
|
// This test ensures that the [src] link is present on traits items.
|
||||||
|
|
||||||
// @has foo/trait.Iterator.html '//div[@id="method.zip"]//a[@class="srclink"]' "[src]"
|
// @has foo/trait.Iterator.html '//div[@id="method.zip"]//a[@class="srclink"]' "source"
|
||||||
pub use std::iter::Iterator;
|
pub use std::iter::Iterator;
|
||||||
|
@ -5,8 +5,8 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate external_macro_src;
|
extern crate external_macro_src;
|
||||||
|
|
||||||
// @has foo/index.html '//a[@href="../src/foo/external-macro-src.rs.html#3-12"]' '[src]'
|
// @has foo/index.html '//a[@href="../src/foo/external-macro-src.rs.html#3-12"]' 'source'
|
||||||
|
|
||||||
// @has foo/struct.Foo.html
|
// @has foo/struct.Foo.html
|
||||||
// @has - '//a[@href="../src/foo/external-macro-src.rs.html#12"]' '[src]'
|
// @has - '//a[@href="../src/foo/external-macro-src.rs.html#12"]' 'source'
|
||||||
make_foo!();
|
make_foo!();
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
pub struct Foo;
|
pub struct Foo;
|
||||||
|
|
||||||
// @has issue_16265_1/traits/index.html '[src]'
|
// @has issue_16265_1/traits/index.html 'source'
|
||||||
pub mod traits {
|
pub mod traits {
|
||||||
impl PartialEq for super::Foo {
|
impl PartialEq for super::Foo {
|
||||||
fn eq(&self, _: &super::Foo) -> bool { true }
|
fn eq(&self, _: &super::Foo) -> bool {
|
||||||
|
true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// @has issue_16265_2/index.html '[src]'
|
// @has issue_16265_2/index.html 'source'
|
||||||
|
|
||||||
trait Y {}
|
trait Y {}
|
||||||
impl Y for Option<u32>{}
|
impl Y for Option<u32> {}
|
||||||
|
@ -7,5 +7,5 @@
|
|||||||
extern crate issue_26606_macro;
|
extern crate issue_26606_macro;
|
||||||
|
|
||||||
// @has issue_26606/constant.FOO.html
|
// @has issue_26606/constant.FOO.html
|
||||||
// @has - '//a[@href="../src/issue_26606/issue-26606.rs.html#11"]' '[src]'
|
// @has - '//a[@href="../src/issue_26606/issue-26606.rs.html#11"]' 'source'
|
||||||
make_item!(FOO);
|
make_item!(FOO);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
<div class="docblock"><p>Hello world!
|
<div class="docblock"><p>Hello world!</p>
|
||||||
Goodbye!
|
<p>Goodbye!
|
||||||
Hello again!</p>
|
Hello again!</p>
|
||||||
</div>
|
</div>
|
@ -0,0 +1,3 @@
|
|||||||
|
<div class="docblock"><p>Par 1</p>
|
||||||
|
<p>Par 2</p>
|
||||||
|
</div>
|
@ -16,3 +16,10 @@ pub struct S1;
|
|||||||
#[doc = "Goodbye!"]
|
#[doc = "Goodbye!"]
|
||||||
/// Hello again!
|
/// Hello again!
|
||||||
pub struct S2;
|
pub struct S2;
|
||||||
|
|
||||||
|
// @has 'foo/struct.S3.html'
|
||||||
|
// @snapshot S3_top-doc - '//details[@class="rustdoc-toggle top-doc"]/div[@class="docblock"]'
|
||||||
|
/** Par 1
|
||||||
|
*/ ///
|
||||||
|
/// Par 2
|
||||||
|
pub struct S3;
|
||||||
|
@ -2,11 +2,11 @@
|
|||||||
|
|
||||||
// @has foo/struct.Unsized.html
|
// @has foo/struct.Unsized.html
|
||||||
// @has - '//div[@id="impl-Sized"]/h3[@class="code-header in-band"]' 'impl !Sized for Unsized'
|
// @has - '//div[@id="impl-Sized"]/h3[@class="code-header in-band"]' 'impl !Sized for Unsized'
|
||||||
// @!has - '//div[@id="impl-Sized"]//a[@class="srclink"]' '[src]'
|
// @!has - '//div[@id="impl-Sized"]//a[@class="srclink"]' 'source'
|
||||||
// @has - '//div[@id="impl-Sync"]/h3[@class="code-header in-band"]' 'impl Sync for Unsized'
|
// @has - '//div[@id="impl-Sync"]/h3[@class="code-header in-band"]' 'impl Sync for Unsized'
|
||||||
// @!has - '//div[@id="impl-Sync"]//a[@class="srclink"]' '[src]'
|
// @!has - '//div[@id="impl-Sync"]//a[@class="srclink"]' 'source'
|
||||||
// @has - '//div[@id="impl-Any"]/h3[@class="code-header in-band"]' 'impl<T> Any for T'
|
// @has - '//div[@id="impl-Any"]/h3[@class="code-header in-band"]' 'impl<T> Any for T'
|
||||||
// @has - '//div[@id="impl-Any"]//a[@class="srclink"]' '[src]'
|
// @has - '//div[@id="impl-Any"]//a[@class="srclink"]' 'source'
|
||||||
pub struct Unsized {
|
pub struct Unsized {
|
||||||
data: [u8],
|
data: [u8],
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#![crate_name = "foo"]
|
#![crate_name = "foo"]
|
||||||
|
|
||||||
// @has foo/index.html '//a[@href="../src/foo/thread-local-src.rs.html#1-6"]' '[src]'
|
// @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"]' '[src]'
|
// @has foo/constant.FOO.html '//a[@href="../src/foo/thread-local-src.rs.html#6"]' 'source'
|
||||||
thread_local!(pub static FOO: bool = false);
|
thread_local!(pub static FOO: bool = false);
|
||||||
|
@ -1,26 +1,26 @@
|
|||||||
#![crate_name = "quix"]
|
#![crate_name = "quix"]
|
||||||
pub trait Foo {
|
pub trait Foo {
|
||||||
// @has quix/trait.Foo.html '//a[@href="../src/quix/trait-src-link.rs.html#4"]' '[src]'
|
// @has quix/trait.Foo.html '//a[@href="../src/quix/trait-src-link.rs.html#4"]' 'source'
|
||||||
fn required();
|
fn required();
|
||||||
|
|
||||||
// @has quix/trait.Foo.html '//a[@href="../src/quix/trait-src-link.rs.html#7"]' '[src]'
|
// @has quix/trait.Foo.html '//a[@href="../src/quix/trait-src-link.rs.html#7"]' 'source'
|
||||||
fn provided() {}
|
fn provided() {}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Bar;
|
pub struct Bar;
|
||||||
|
|
||||||
impl Foo for Bar {
|
impl Foo for Bar {
|
||||||
// @has quix/struct.Bar.html '//a[@href="../src/quix/trait-src-link.rs.html#14"]' '[src]'
|
// @has quix/struct.Bar.html '//a[@href="../src/quix/trait-src-link.rs.html#14"]' 'source'
|
||||||
fn required() {}
|
fn required() {}
|
||||||
// @has quix/struct.Bar.html '//a[@href="../src/quix/trait-src-link.rs.html#7"]' '[src]'
|
// @has quix/struct.Bar.html '//a[@href="../src/quix/trait-src-link.rs.html#7"]' 'source'
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Baz;
|
pub struct Baz;
|
||||||
|
|
||||||
impl Foo for Baz {
|
impl Foo for Baz {
|
||||||
// @has quix/struct.Baz.html '//a[@href="../src/quix/trait-src-link.rs.html#22"]' '[src]'
|
// @has quix/struct.Baz.html '//a[@href="../src/quix/trait-src-link.rs.html#22"]' 'source'
|
||||||
fn required() {}
|
fn required() {}
|
||||||
|
|
||||||
// @has quix/struct.Baz.html '//a[@href="../src/quix/trait-src-link.rs.html#25"]' '[src]'
|
// @has quix/struct.Baz.html '//a[@href="../src/quix/trait-src-link.rs.html#25"]' 'source'
|
||||||
fn provided() {}
|
fn provided() {}
|
||||||
}
|
}
|
||||||
|
26
src/test/ui/async-await/interior-with-const-generic-expr.rs
Normal file
26
src/test/ui/async-await/interior-with-const-generic-expr.rs
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
// edition:2018
|
||||||
|
// run-pass
|
||||||
|
|
||||||
|
#![allow(incomplete_features)]
|
||||||
|
#![feature(generic_const_exprs)]
|
||||||
|
#![allow(unused)]
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let x = test();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn concat<const A: usize, const B: usize>(a: [f32; A], b: [f32; B]) -> [f32; A + B] {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn reverse<const A: usize>(x: [f32; A]) -> [f32; A] {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn test() {
|
||||||
|
let a = [0.0];
|
||||||
|
let b = [1.0, 2.0];
|
||||||
|
let ab = concat(a,b);
|
||||||
|
let ba = reverse(ab).await;
|
||||||
|
println!("{:?}", ba);
|
||||||
|
}
|
22
src/test/ui/traits/pointee-deduction.rs
Normal file
22
src/test/ui/traits/pointee-deduction.rs
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
// run-pass
|
||||||
|
|
||||||
|
#![feature(ptr_metadata)]
|
||||||
|
|
||||||
|
use std::alloc::Layout;
|
||||||
|
use std::ptr::Pointee;
|
||||||
|
|
||||||
|
trait Foo {
|
||||||
|
type Bar;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Foo for () {
|
||||||
|
type Bar = ();
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Wrapper1<T: Foo>(<T as Foo>::Bar);
|
||||||
|
struct Wrapper2<T: Foo>(<Wrapper1<T> as Pointee>::Metadata);
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let _: Wrapper2<()> = Wrapper2(());
|
||||||
|
let _ = Layout::new::<Wrapper2<()>>();
|
||||||
|
}
|
@ -1 +1 @@
|
|||||||
Subproject commit 824816c973a3fd0596ae3a9a38c6fb6299b913b8
|
Subproject commit deb9bfd24648d50142ab29b810175837c4718885
|
Loading…
Reference in New Issue
Block a user