Auto merge of #85664 - GuillaumeGomez:rollup-o7qgo8c, r=GuillaumeGomez
Rollup of 6 pull requests Successful merges: - #85361 (Use TargetTriple::from_path in rustdoc) - #85605 (Replace Local::new(1) with CAPTURE_STRUCT_LOCAL) - #85631 (Move keyword primitive css dom) - #85644 (Better English for documenting when to use unimplemented!()) - #85650 (Add some backticks to the `rustc_middle::ty::adjustment::Adjustment` docs) - #85657 (Remove doubled braces in non_exhaustive structs’ documentation text.) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
fbf1b1a719
18 changed files with 104 additions and 57 deletions
|
@ -47,7 +47,7 @@ pub enum PointerCast {
|
||||||
/// 1. The simplest cases are where a pointer is not adjusted fat vs thin.
|
/// 1. The simplest cases are where a pointer is not adjusted fat vs thin.
|
||||||
/// Here the pointer will be dereferenced N times (where a dereference can
|
/// Here the pointer will be dereferenced N times (where a dereference can
|
||||||
/// happen to raw or borrowed pointers or any smart pointer which implements
|
/// happen to raw or borrowed pointers or any smart pointer which implements
|
||||||
/// Deref, including Box<_>). The types of dereferences is given by
|
/// `Deref`, including `Box<_>`). The types of dereferences is given by
|
||||||
/// `autoderefs`. It can then be auto-referenced zero or one times, indicated
|
/// `autoderefs`. It can then be auto-referenced zero or one times, indicated
|
||||||
/// by `autoref`, to either a raw or borrowed pointer. In these cases unsize is
|
/// by `autoref`, to either a raw or borrowed pointer. In these cases unsize is
|
||||||
/// `false`.
|
/// `false`.
|
||||||
|
@ -56,7 +56,7 @@ pub enum PointerCast {
|
||||||
/// with a thin pointer, deref a number of times, unsize the underlying data,
|
/// with a thin pointer, deref a number of times, unsize the underlying data,
|
||||||
/// then autoref. The 'unsize' phase may change a fixed length array to a
|
/// then autoref. The 'unsize' phase may change a fixed length array to a
|
||||||
/// dynamically sized one, a concrete object to a trait object, or statically
|
/// dynamically sized one, a concrete object to a trait object, or statically
|
||||||
/// sized struct to a dynamically sized one. E.g., &[i32; 4] -> &[i32] is
|
/// sized struct to a dynamically sized one. E.g., `&[i32; 4]` -> `&[i32]` is
|
||||||
/// represented by:
|
/// represented by:
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```
|
||||||
|
@ -66,7 +66,7 @@ pub enum PointerCast {
|
||||||
/// ```
|
/// ```
|
||||||
///
|
///
|
||||||
/// Note that for a struct, the 'deep' unsizing of the struct is not recorded.
|
/// Note that for a struct, the 'deep' unsizing of the struct is not recorded.
|
||||||
/// E.g., `struct Foo<T> { x: T }` we can coerce &Foo<[i32; 4]> to &Foo<[i32]>
|
/// E.g., `struct Foo<T> { x: T }` we can coerce `&Foo<[i32; 4]>` to `&Foo<[i32]>`
|
||||||
/// The autoderef and -ref are the same as in the above example, but the type
|
/// The autoderef and -ref are the same as in the above example, but the type
|
||||||
/// stored in `unsize` is `Foo<[i32]>`, we don't store any further detail about
|
/// stored in `unsize` is `Foo<[i32]>`, we don't store any further detail about
|
||||||
/// the underlying conversions from `[i32; 4]` to `[i32]`.
|
/// the underlying conversions from `[i32; 4]` to `[i32]`.
|
||||||
|
@ -75,8 +75,8 @@ pub enum PointerCast {
|
||||||
/// that case, we have the pointer we need coming in, so there are no
|
/// that case, we have the pointer we need coming in, so there are no
|
||||||
/// autoderefs, and no autoref. Instead we just do the `Unsize` transformation.
|
/// autoderefs, and no autoref. Instead we just do the `Unsize` transformation.
|
||||||
/// At some point, of course, `Box` should move out of the compiler, in which
|
/// At some point, of course, `Box` should move out of the compiler, in which
|
||||||
/// case this is analogous to transforming a struct. E.g., Box<[i32; 4]> ->
|
/// case this is analogous to transforming a struct. E.g., `Box<[i32; 4]>` ->
|
||||||
/// Box<[i32]> is an `Adjust::Unsize` with the target `Box<[i32]>`.
|
/// `Box<[i32]>` is an `Adjust::Unsize` with the target `Box<[i32]>`.
|
||||||
#[derive(Clone, TyEncodable, TyDecodable, HashStable, TypeFoldable)]
|
#[derive(Clone, TyEncodable, TyDecodable, HashStable, TypeFoldable)]
|
||||||
pub struct Adjustment<'tcx> {
|
pub struct Adjustment<'tcx> {
|
||||||
pub kind: Adjust<'tcx>,
|
pub kind: Adjust<'tcx>,
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use crate::hir::place::{
|
use crate::hir::place::{
|
||||||
Place as HirPlace, PlaceBase as HirPlaceBase, ProjectionKind as HirProjectionKind,
|
Place as HirPlace, PlaceBase as HirPlaceBase, ProjectionKind as HirProjectionKind,
|
||||||
};
|
};
|
||||||
use crate::ty;
|
use crate::{mir, ty};
|
||||||
|
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxIndexMap};
|
use rustc_data_structures::fx::{FxHashMap, FxIndexMap};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
|
@ -12,6 +12,10 @@ use super::{Ty, TyCtxt};
|
||||||
|
|
||||||
use self::BorrowKind::*;
|
use self::BorrowKind::*;
|
||||||
|
|
||||||
|
// Captures are represented using fields inside a structure.
|
||||||
|
// This represents accessing self in the closure structure
|
||||||
|
pub const CAPTURE_STRUCT_LOCAL: mir::Local = mir::Local::from_u32(1);
|
||||||
|
|
||||||
#[derive(
|
#[derive(
|
||||||
Clone,
|
Clone,
|
||||||
Copy,
|
Copy,
|
||||||
|
|
|
@ -4,10 +4,9 @@ use rustc_errors::{Applicability, DiagnosticBuilder};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_hir::{AsyncGeneratorKind, GeneratorKind};
|
use rustc_hir::{AsyncGeneratorKind, GeneratorKind};
|
||||||
use rustc_index::vec::Idx;
|
|
||||||
use rustc_middle::mir::{
|
use rustc_middle::mir::{
|
||||||
self, AggregateKind, BindingForm, BorrowKind, ClearCrossCrate, ConstraintCategory,
|
self, AggregateKind, BindingForm, BorrowKind, ClearCrossCrate, ConstraintCategory,
|
||||||
FakeReadCause, Local, LocalDecl, LocalInfo, LocalKind, Location, Operand, Place, PlaceRef,
|
FakeReadCause, LocalDecl, LocalInfo, LocalKind, Location, Operand, Place, PlaceRef,
|
||||||
ProjectionElem, Rvalue, Statement, StatementKind, Terminator, TerminatorKind, VarBindingForm,
|
ProjectionElem, Rvalue, Statement, StatementKind, Terminator, TerminatorKind, VarBindingForm,
|
||||||
};
|
};
|
||||||
use rustc_middle::ty::{self, suggest_constraining_type_param, Ty, TypeFoldable};
|
use rustc_middle::ty::{self, suggest_constraining_type_param, Ty, TypeFoldable};
|
||||||
|
@ -1274,7 +1273,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||||
bug!("temporary or return pointer with a name")
|
bug!("temporary or return pointer with a name")
|
||||||
}
|
}
|
||||||
LocalKind::Var => "local variable ",
|
LocalKind::Var => "local variable ",
|
||||||
LocalKind::Arg if !self.upvars.is_empty() && local == Local::new(1) => {
|
LocalKind::Arg
|
||||||
|
if !self.upvars.is_empty() && local == ty::CAPTURE_STRUCT_LOCAL =>
|
||||||
|
{
|
||||||
"variable captured by `move` "
|
"variable captured by `move` "
|
||||||
}
|
}
|
||||||
LocalKind::Arg => "function parameter ",
|
LocalKind::Arg => "function parameter ",
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::Node;
|
use rustc_hir::Node;
|
||||||
use rustc_index::vec::Idx;
|
|
||||||
use rustc_middle::hir::map::Map;
|
use rustc_middle::hir::map::Map;
|
||||||
use rustc_middle::mir::{Mutability, Place, PlaceRef, ProjectionElem};
|
use rustc_middle::mir::{Mutability, Place, PlaceRef, ProjectionElem};
|
||||||
use rustc_middle::ty::{self, Ty, TyCtxt};
|
use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||||
|
@ -115,12 +114,14 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PlaceRef { local: _, projection: [proj_base @ .., ProjectionElem::Deref] } => {
|
PlaceRef { local: _, projection: [proj_base @ .., ProjectionElem::Deref] } => {
|
||||||
if the_place_err.local == Local::new(1)
|
if the_place_err.local == ty::CAPTURE_STRUCT_LOCAL
|
||||||
&& proj_base.is_empty()
|
&& proj_base.is_empty()
|
||||||
&& !self.upvars.is_empty()
|
&& !self.upvars.is_empty()
|
||||||
{
|
{
|
||||||
item_msg = format!("`{}`", access_place_desc.unwrap());
|
item_msg = format!("`{}`", access_place_desc.unwrap());
|
||||||
debug_assert!(self.body.local_decls[Local::new(1)].ty.is_region_ptr());
|
debug_assert!(
|
||||||
|
self.body.local_decls[ty::CAPTURE_STRUCT_LOCAL].ty.is_region_ptr()
|
||||||
|
);
|
||||||
debug_assert!(is_closure_or_generator(
|
debug_assert!(is_closure_or_generator(
|
||||||
Place::ty_from(
|
Place::ty_from(
|
||||||
the_place_err.local,
|
the_place_err.local,
|
||||||
|
@ -478,11 +479,9 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PlaceRef {
|
PlaceRef { local, projection: [ProjectionElem::Deref] }
|
||||||
local,
|
if local == ty::CAPTURE_STRUCT_LOCAL && !self.upvars.is_empty() =>
|
||||||
projection: [ProjectionElem::Deref],
|
{
|
||||||
// FIXME document what is this 1 magic number about
|
|
||||||
} if local == Local::new(1) && !self.upvars.is_empty() => {
|
|
||||||
self.expected_fn_found_fn_mut_call(&mut err, span, act);
|
self.expected_fn_found_fn_mut_call(&mut err, span, act);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -209,9 +209,7 @@ fn to_upvars_resolved_place_builder<'a, 'tcx>(
|
||||||
match from_builder.base {
|
match from_builder.base {
|
||||||
PlaceBase::Local(_) => Ok(from_builder),
|
PlaceBase::Local(_) => Ok(from_builder),
|
||||||
PlaceBase::Upvar { var_hir_id, closure_def_id, closure_kind } => {
|
PlaceBase::Upvar { var_hir_id, closure_def_id, closure_kind } => {
|
||||||
// Captures are represented using fields inside a structure.
|
let mut upvar_resolved_place_builder = PlaceBuilder::from(ty::CAPTURE_STRUCT_LOCAL);
|
||||||
// This represents accessing self in the closure structure
|
|
||||||
let mut upvar_resolved_place_builder = PlaceBuilder::from(Local::new(1));
|
|
||||||
match closure_kind {
|
match closure_kind {
|
||||||
ty::ClosureKind::Fn | ty::ClosureKind::FnMut => {
|
ty::ClosureKind::Fn | ty::ClosureKind::FnMut => {
|
||||||
upvar_resolved_place_builder = upvar_resolved_place_builder.deref();
|
upvar_resolved_place_builder = upvar_resolved_place_builder.deref();
|
||||||
|
|
|
@ -446,7 +446,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||||
} => {
|
} => {
|
||||||
// Not in a closure
|
// Not in a closure
|
||||||
debug_assert!(
|
debug_assert!(
|
||||||
local == Local::new(1),
|
local == ty::CAPTURE_STRUCT_LOCAL,
|
||||||
"Expected local to be Local(1), found {:?}",
|
"Expected local to be Local(1), found {:?}",
|
||||||
local
|
local
|
||||||
);
|
);
|
||||||
|
|
|
@ -953,9 +953,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||||
// the given closure and use the necessary information to create upvar
|
// the given closure and use the necessary information to create upvar
|
||||||
// debuginfo and to fill `self.upvar_mutbls`.
|
// debuginfo and to fill `self.upvar_mutbls`.
|
||||||
if hir_typeck_results.closure_min_captures.get(&fn_def_id).is_some() {
|
if hir_typeck_results.closure_min_captures.get(&fn_def_id).is_some() {
|
||||||
let closure_env_arg = Local::new(1);
|
|
||||||
let mut closure_env_projs = vec![];
|
let mut closure_env_projs = vec![];
|
||||||
let mut closure_ty = self.local_decls[closure_env_arg].ty;
|
let mut closure_ty = self.local_decls[ty::CAPTURE_STRUCT_LOCAL].ty;
|
||||||
if let ty::Ref(_, ty, _) = closure_ty.kind() {
|
if let ty::Ref(_, ty, _) = closure_ty.kind() {
|
||||||
closure_env_projs.push(ProjectionElem::Deref);
|
closure_env_projs.push(ProjectionElem::Deref);
|
||||||
closure_ty = ty;
|
closure_ty = ty;
|
||||||
|
@ -1001,7 +1000,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||||
name,
|
name,
|
||||||
source_info: SourceInfo::outermost(tcx_hir.span(var_id)),
|
source_info: SourceInfo::outermost(tcx_hir.span(var_id)),
|
||||||
value: VarDebugInfoContents::Place(Place {
|
value: VarDebugInfoContents::Place(Place {
|
||||||
local: closure_env_arg,
|
local: ty::CAPTURE_STRUCT_LOCAL,
|
||||||
projection: tcx.intern_place_elems(&projs),
|
projection: tcx.intern_place_elems(&projs),
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
|
@ -1507,7 +1507,10 @@ fn collect_print_requests(
|
||||||
prints
|
prints
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_target_triple(matches: &getopts::Matches, error_format: ErrorOutputType) -> TargetTriple {
|
pub fn parse_target_triple(
|
||||||
|
matches: &getopts::Matches,
|
||||||
|
error_format: ErrorOutputType,
|
||||||
|
) -> TargetTriple {
|
||||||
match matches.opt_str("target") {
|
match matches.opt_str("target") {
|
||||||
Some(target) if target.ends_with(".json") => {
|
Some(target) if target.ends_with(".json") => {
|
||||||
let path = Path::new(&target);
|
let path = Path::new(&target);
|
||||||
|
|
|
@ -595,7 +595,7 @@ macro_rules! unreachable {
|
||||||
/// Indicates unimplemented code by panicking with a message of "not implemented".
|
/// Indicates unimplemented code by panicking with a message of "not implemented".
|
||||||
///
|
///
|
||||||
/// This allows your code to type-check, which is useful if you are prototyping or
|
/// This allows your code to type-check, which is useful if you are prototyping or
|
||||||
/// implementing a trait that requires multiple methods which you don't plan of using all of.
|
/// implementing a trait that requires multiple methods which you don't plan to use all of.
|
||||||
///
|
///
|
||||||
/// The difference between `unimplemented!` and [`todo!`] is that while `todo!`
|
/// The difference between `unimplemented!` and [`todo!`] is that while `todo!`
|
||||||
/// conveys an intent of implementing the functionality later and the message is "not yet
|
/// conveys an intent of implementing the functionality later and the message is "not yet
|
||||||
|
|
|
@ -6,8 +6,10 @@ use std::path::PathBuf;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::FxHashMap;
|
||||||
use rustc_session::config::{self, parse_crate_types_from_list, parse_externs, CrateType};
|
use rustc_session::config::{
|
||||||
use rustc_session::config::{get_cmd_lint_options, host_triple, nightly_options};
|
self, parse_crate_types_from_list, parse_externs, parse_target_triple, CrateType,
|
||||||
|
};
|
||||||
|
use rustc_session::config::{get_cmd_lint_options, nightly_options};
|
||||||
use rustc_session::config::{CodegenOptions, DebuggingOptions, ErrorOutputType, Externs};
|
use rustc_session::config::{CodegenOptions, DebuggingOptions, ErrorOutputType, Externs};
|
||||||
use rustc_session::getopts;
|
use rustc_session::getopts;
|
||||||
use rustc_session::lint::Level;
|
use rustc_session::lint::Level;
|
||||||
|
@ -562,14 +564,7 @@ impl Options {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let target =
|
let target = parse_target_triple(matches, error_format);
|
||||||
matches.opt_str("target").map_or(TargetTriple::from_triple(host_triple()), |target| {
|
|
||||||
if target.ends_with(".json") {
|
|
||||||
TargetTriple::TargetPath(PathBuf::from(target))
|
|
||||||
} else {
|
|
||||||
TargetTriple::TargetTriple(target)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
let show_coverage = matches.opt_present("show-coverage");
|
let show_coverage = matches.opt_present("show-coverage");
|
||||||
|
|
||||||
|
|
|
@ -1502,7 +1502,7 @@ fn document_non_exhaustive(w: &mut Buffer, item: &clean::Item) {
|
||||||
w.write_str(
|
w.write_str(
|
||||||
"Non-exhaustive structs could have additional fields added in future. \
|
"Non-exhaustive structs could have additional fields added in future. \
|
||||||
Therefore, non-exhaustive structs cannot be constructed in external crates \
|
Therefore, non-exhaustive structs cannot be constructed in external crates \
|
||||||
using the traditional <code>Struct {{ .. }}</code> syntax; cannot be \
|
using the traditional <code>Struct { .. }</code> syntax; cannot be \
|
||||||
matched against without a wildcard <code>..</code>; and \
|
matched against without a wildcard <code>..</code>; and \
|
||||||
struct update syntax will not work.",
|
struct update syntax will not work.",
|
||||||
);
|
);
|
||||||
|
|
|
@ -796,16 +796,6 @@ a {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
|
|
||||||
.result-name span.primitive::after {
|
|
||||||
content: ' (primitive type)';
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
|
|
||||||
.result-name span.keyword::after {
|
|
||||||
content: ' (keyword)';
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
|
|
||||||
body.blur > :not(#help) {
|
body.blur > :not(#help) {
|
||||||
filter: blur(8px);
|
filter: blur(8px);
|
||||||
-webkit-filter: blur(8px);
|
-webkit-filter: blur(8px);
|
||||||
|
|
|
@ -975,26 +975,32 @@ window.initSearch = function(rawSearchIndex) {
|
||||||
output = "<div class=\"search-results " + extraClass + "\">";
|
output = "<div class=\"search-results " + extraClass + "\">";
|
||||||
|
|
||||||
array.forEach(function(item) {
|
array.forEach(function(item) {
|
||||||
var name, type;
|
|
||||||
|
|
||||||
name = item.name;
|
|
||||||
type = itemTypes[item.ty];
|
|
||||||
|
|
||||||
if (item.is_alias !== true) {
|
if (item.is_alias !== true) {
|
||||||
if (duplicates[item.fullPath]) {
|
if (duplicates[item.fullPath]) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
duplicates[item.fullPath] = true;
|
duplicates[item.fullPath] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var name = item.name;
|
||||||
|
var type = itemTypes[item.ty];
|
||||||
|
|
||||||
length += 1;
|
length += 1;
|
||||||
|
|
||||||
|
var extra = "";
|
||||||
|
if (type === "primitive") {
|
||||||
|
extra = " <i>(primitive type)</i>";
|
||||||
|
} else if (type === "keyword") {
|
||||||
|
extra = " <i>(keyword)</i>";
|
||||||
|
}
|
||||||
|
|
||||||
output += "<a class=\"result-" + type + "\" href=\"" + item.href + "\">" +
|
output += "<a class=\"result-" + type + "\" href=\"" + item.href + "\">" +
|
||||||
"<div><div class=\"result-name\">" +
|
"<div><div class=\"result-name\">" +
|
||||||
(item.is_alias === true ?
|
(item.is_alias === true ?
|
||||||
("<span class=\"alias\"><b>" + item.alias + " </b></span><span " +
|
("<span class=\"alias\"><b>" + item.alias + " </b></span><span " +
|
||||||
"class=\"grey\"><i> - see </i></span>") : "") +
|
"class=\"grey\"><i> - see </i></span>") : "") +
|
||||||
item.displayPath + "<span class=\"" + type + "\">" +
|
item.displayPath + "<span class=\"" + type + "\">" +
|
||||||
name + "</span></div><div class=\"desc\">" +
|
name + extra + "</span></div><div class=\"desc\">" +
|
||||||
"<span>" + item.desc +
|
"<span>" + item.desc +
|
||||||
" </span></div></div></a>";
|
" </span></div></div></a>";
|
||||||
});
|
});
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
include ../tools.mk
|
||||||
|
|
||||||
|
# Test that rustdoc will properly canonicalize the target spec json path just like rustc
|
||||||
|
|
||||||
|
OUTPUT_DIR := "$(TMPDIR)/rustdoc-target-spec-json-path"
|
||||||
|
|
||||||
|
all:
|
||||||
|
$(RUSTC) --crate-type lib dummy_core.rs --target target.json
|
||||||
|
$(RUSTDOC) -o $(OUTPUT_DIR) -L $(TMPDIR) my_crate.rs --target target.json
|
|
@ -0,0 +1,2 @@
|
||||||
|
#![feature(no_core)]
|
||||||
|
#![no_core]
|
|
@ -0,0 +1,3 @@
|
||||||
|
#![feature(no_core)]
|
||||||
|
#![no_core]
|
||||||
|
extern crate dummy_core;
|
|
@ -0,0 +1,39 @@
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"cpu": "x86-64",
|
||||||
|
"crt-static-respected": true,
|
||||||
|
"data-layout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128",
|
||||||
|
"dynamic-linking": true,
|
||||||
|
"env": "gnu",
|
||||||
|
"executables": true,
|
||||||
|
"has-elf-tls": true,
|
||||||
|
"has-rpath": true,
|
||||||
|
"is-builtin": true,
|
||||||
|
"linker-is-gnu": true,
|
||||||
|
"llvm-target": "x86_64-unknown-linux-gnu",
|
||||||
|
"max-atomic-width": 64,
|
||||||
|
"os": "linux",
|
||||||
|
"position-independent-executables": true,
|
||||||
|
"pre-link-args": {
|
||||||
|
"gcc": [
|
||||||
|
"-m64"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"relro-level": "full",
|
||||||
|
"stack-probes": {
|
||||||
|
"kind": "inline-or-call",
|
||||||
|
"min-llvm-version-for-inline": [
|
||||||
|
11,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"supported-sanitizers": [
|
||||||
|
"address",
|
||||||
|
"leak",
|
||||||
|
"memory",
|
||||||
|
"thread"
|
||||||
|
],
|
||||||
|
"target-family": "unix",
|
||||||
|
"target-pointer-width": "64"
|
||||||
|
}
|
|
@ -5,7 +5,6 @@ wait-for: "#titles"
|
||||||
// Note: The two next assert commands could be merged as one but readability would be
|
// Note: The two next assert commands could be merged as one but readability would be
|
||||||
// less good.
|
// less good.
|
||||||
//
|
//
|
||||||
// Checking that the CSS is displaying " (keyword)"...
|
// Checking that the CSS is displaying " (keyword)" in italic.
|
||||||
assert: (".result-name span.keyword::after", {"content": '" (keyword)"'})
|
assert: (".result-name span.keyword > i", "(keyword)")
|
||||||
// ... in italic.
|
assert: (".result-name span.keyword", "CookieMonster (keyword)")
|
||||||
assert: (".result-name span.keyword::after", {"font-style": "italic"})
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue