Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rollup of 9 pull requests #106266

Merged
merged 74 commits into from
Dec 29, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
055f349
Avoid `match_wildcard_for_single_variants` on guarded wild matches
koka831 Dec 10, 2022
3b6bbf7
Fix match_single_binding suggestion introduced an extra semicolon
alex-semenyuk Nov 7, 2022
5b3a666
fix manual_filter false positive
ericwu17 Dec 16, 2022
3c14075
manual_filter: add a related test
ericwu17 Dec 16, 2022
033f1ec
Add 2018/2021 edition tests for wildcard_imports
chansuke Dec 12, 2022
1c42252
Merge commit '4bdfb0741dbcecd5279a2635c3280726db0604b5' into clippyup
flip1995 Dec 17, 2022
af39a8a
Identify more cases of useless `into_iter()` calls
samueltardieu Dec 1, 2022
6afe547
Add lint `transmute_null_to_fn`
Niki4tap Dec 17, 2022
3cc67d0
Relax clippy_utils::consts::miri_to_const pointer type restrictiveness
Niki4tap Dec 17, 2022
42106e0
Add lint `fn_null_check`
Niki4tap Dec 17, 2022
54a9168
Remove useless pattern matching
Niki4tap Dec 17, 2022
dae54fa
Doc codeblock fixup
Niki4tap Dec 18, 2022
ebb0759
Add a test for regular wildcard
koka831 Dec 11, 2022
b1ca307
Address some of the code style issues
Niki4tap Dec 18, 2022
910a97d
Auto merge of #10020 - samueltardieu:more-into-iter-removal, r=xFrednet
bors Dec 18, 2022
9b2fc8e
Make clippy happy
Niki4tap Dec 18, 2022
20f501a
Improve code style further
Niki4tap Dec 18, 2022
cc98574
Fix comments, use `constant` instead of raw `constant_context`
Niki4tap Dec 18, 2022
62061b8
Move manual_clamp to nursery
flip1995 Dec 19, 2022
8a6aca3
Auto merge of #10101 - flip1995:manual_clamp_nursery, r=xFrednet
bors Dec 19, 2022
691df70
Inline some `const`s
Niki4tap Dec 19, 2022
b3145fe
Auto merge of #10099 - Niki4tap:null_fn_lints, r=llogiq
bors Dec 19, 2022
d0ac6ba
Fix overflow ICE in large_stack/const_arrays
Niki4tap Dec 19, 2022
30e6e85
add [`permissions_set_readonly_false`] #9702
Oct 28, 2022
e1d3c1e
refactor: fix style
chansuke Dec 17, 2022
09cfcaf
Auto merge of #10103 - Niki4tap:overflow_ice, r=flip1995
bors Dec 19, 2022
2444494
Make Clippy test no longer unsound
compiler-errors Dec 16, 2022
1e68973
Auto merge of #10067 - chansuke:issue-7943, r=giraffate
bors Dec 20, 2022
cd3d38a
Use `rustc_mir_dataflow::impls::MaybeStorageLive`
smoelius Oct 11, 2022
c6477eb
Add tests
smoelius Oct 12, 2022
ed519ad
Improve `possible_borrower`
smoelius Oct 12, 2022
26df551
Fix adjacent code
smoelius Oct 12, 2022
c7dc961
Address review comments
smoelius Dec 13, 2022
4dbd8ad
Address https://github.com/rust-lang/rust/pull/105659
smoelius Dec 20, 2022
b21cc36
hotfix: add help dialog for `PermissionExt`
chansuke Dec 17, 2022
4a09068
Auto merge of #10063 - chansuke:issue-9702, r=Alexendoo
bors Dec 20, 2022
065c6f7
Auto merge of #10091 - EricWu2003:manual-filter-FP, r=llogiq
bors Dec 21, 2022
b6882f6
Fix FP in needless_return when using yeet
Niki4tap Dec 22, 2022
f0d331a
Auto merge of #10109 - Niki4tap:yeet_not_return, r=flip1995
bors Dec 22, 2022
8a6e6fd
Auto merge of #10056 - koka831:fix/9993, r=Jarcho
bors Dec 22, 2022
4fe3727
Auto merge of #9701 - smoelius:improve-possible-borrower, r=Jarcho
bors Dec 22, 2022
faebca3
Changelog fix
alex-semenyuk Dec 23, 2022
e2a687d
Auto merge of #10111 - alex-semenyuk:changelog_fix, r=flip1995
bors Dec 23, 2022
d7b9e19
Add size_of_ref lint
lukaslueg Dec 17, 2022
e8703a0
Auto merge of #10098 - lukaslueg:size_of_ref, r=Jarcho
bors Dec 24, 2022
12f2dea
`not_unsafe_ptr_arg_deref` update documentation
tgross35 Dec 25, 2022
4f1bae0
Auto merge of #10116 - tgross35:patch-1, r=llogiq
bors Dec 25, 2022
fae19a9
Place default values near its definitions
koka831 Dec 25, 2022
6bb6dd6
fix incorrect suggestion in `suboptimal_flops`
ericwu17 Dec 23, 2022
d98e714
Auto merge of #10113 - EricWu2003:suboptimal_flops_incorrect_suggesti…
bors Dec 26, 2022
b6453a4
Trim more paths in obligation types
estebank Dec 28, 2022
266eef7
Auto merge of #10119 - koka831:doc/config-default-value, r=xFrednet
bors Dec 28, 2022
fefe309
rustdoc: simplify settings, help, and copy button CSS by not reusing
notriddle Dec 28, 2022
da7fcc7
docs/test: add UI test and long-form error docs for `E0519`
Ezrashaw Dec 21, 2022
726519d
docs: add long-form error docs for `E0514`
Ezrashaw Dec 23, 2022
e5281c3
Provide a better error for `Fn` traits with lifetime params
ohno418 Nov 17, 2022
22af8fe
Auto merge of #10060 - alex-semenyuk:match_single_binding_fix, r=llogiq
bors Dec 29, 2022
50a8ca5
`./x doc library --open` opens `std`
Dec 19, 2022
0853540
Merge remote-tracking branch 'upstream/master' into rustup
flip1995 Dec 29, 2022
1f97186
Bump nightly version -> 2022-12-29
flip1995 Dec 29, 2022
4f3ab69
Auto merge of #10126 - flip1995:rustup, r=flip1995
bors Dec 29, 2022
56ab392
Merge commit '4f3ab69ea0a0908260944443c739426cc384ae1a' into clippyup
flip1995 Dec 29, 2022
c6b90d2
Fix index out of bounds issues in rustdoc
chenyukang Dec 29, 2022
7ebcc78
fix #106261, formater should not try to format non-Rust files
chenyukang Dec 29, 2022
af74ca0
Account for multiple multiline spans with empty padding
estebank Dec 27, 2022
81c2b72
Rollup merge of #104531 - ohno418:recover-fn-traits-with-lifetime-par…
matthiaskrgr Dec 29, 2022
10374d3
Rollup merge of #105899 - lukas-code:stage-1-docs, r=jyn514
matthiaskrgr Dec 29, 2022
be56dc0
Rollup merge of #106190 - estebank:multiline-start-tweak, r=jackh726
matthiaskrgr Dec 29, 2022
6b792e9
Rollup merge of #106202 - estebank:trim-paths, r=Nilstrieb
matthiaskrgr Dec 29, 2022
0e953ed
Rollup merge of #106234 - notriddle:notriddle/button-width, r=Guillau…
matthiaskrgr Dec 29, 2022
51534b8
Rollup merge of #106236 - Ezrashaw:add-test+docs-e0519-e0514, r=Guill…
matthiaskrgr Dec 29, 2022
b75b0a8
Rollup merge of #106259 - flip1995:clippyup, r=matthiaskrgr
matthiaskrgr Dec 29, 2022
caa33bf
Rollup merge of #106260 - chenyukang:yukang/fix-106213-doc, r=Guillau…
matthiaskrgr Dec 29, 2022
65fb703
Rollup merge of #106263 - chenyukang:yukang/fix-106261-formater, r=jy…
matthiaskrgr Dec 29, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions compiler/rustc_error_codes/src/error_codes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -276,10 +276,12 @@ E0509: include_str!("./error_codes/E0509.md"),
E0510: include_str!("./error_codes/E0510.md"),
E0511: include_str!("./error_codes/E0511.md"),
E0512: include_str!("./error_codes/E0512.md"),
E0514: include_str!("./error_codes/E0514.md"),
E0515: include_str!("./error_codes/E0515.md"),
E0516: include_str!("./error_codes/E0516.md"),
E0517: include_str!("./error_codes/E0517.md"),
E0518: include_str!("./error_codes/E0518.md"),
E0519: include_str!("./error_codes/E0519.md"),
E0520: include_str!("./error_codes/E0520.md"),
E0521: include_str!("./error_codes/E0521.md"),
E0522: include_str!("./error_codes/E0522.md"),
Expand Down Expand Up @@ -615,8 +617,6 @@ E0791: include_str!("./error_codes/E0791.md"),
// E0488, // lifetime of variable does not enclose its declaration
// E0489, // type/lifetime parameter not in scope here
E0490, // a value of type `..` is borrowed for too long
E0514, // metadata version mismatch
E0519, // local crate and dependency have same (crate-name, disambiguator)
E0523, // two dependencies have same (crate-name, disambiguator) but different SVH
// E0526, // shuffle indices are not constant
// E0540, // multiple rustc_deprecated attributes
Expand Down
33 changes: 33 additions & 0 deletions compiler/rustc_error_codes/src/error_codes/E0514.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
Dependency compiled with different version of `rustc`.

Example of erroneous code:

`a.rs`
```ignore (cannot-link-with-other-tests)
// compiled with stable `rustc`

#[crate_type = "lib"]
```

`b.rs`
```ignore (cannot-link-with-other-tests)
// compiled with nightly `rustc`

#[crate_type = "lib"]

extern crate a; // error: found crate `a` compiled by an incompatible version
// of rustc
```

This error is caused when the version of `rustc` used to compile a crate, as
stored in the binary's metadata, differs from the version of one of its
dependencies. Many parts of Rust binaries are considered unstable. For
instance, the Rust ABI is not stable between compiler versions. This means that
the compiler cannot be sure about *how* to call a function between compiler
versions, and therefore this error occurs.

This error can be fixed by:
* Using [Cargo](../cargo/index.html), the Rust package manager and
[Rustup](https://rust-lang.github.io/rustup/), the Rust toolchain installer,
automatically fixing this issue.
* Recompiling the crates with a uniform `rustc` version.
40 changes: 40 additions & 0 deletions compiler/rustc_error_codes/src/error_codes/E0519.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
The current crate is indistinguishable from one of its dependencies, in terms
of metadata.

Example of erroneous code:

`a.rs`
```ignore (cannot-link-with-other-tests)
#![crate_name = "a"]
#![crate_type = "lib"]

pub fn foo() {}
```

`b.rs`
```ignore (cannot-link-with-other-tests)
#![crate_name = "a"]
#![crate_type = "lib"]

// error: the current crate is indistinguishable from one of its dependencies:
// it has the same crate-name `a` and was compiled with the same
// `-C metadata` arguments. This will result in symbol conflicts between
// the two.
extern crate a;

pub fn foo() {}

fn bar() {
a::foo(); // is this calling the local crate or the dependency?
}
```

The above example compiles two crates with exactly the same name and
`crate_type` (plus any other metadata). This causes an error because it becomes
impossible for the compiler to distinguish between symbols (`pub` item names).

This error can be fixed by:
* Using [Cargo](../cargo/index.html), the Rust package manager, automatically
fixing this issue.
* Recompiling the crate with different metadata (different name/
`crate_type`).
22 changes: 19 additions & 3 deletions compiler/rustc_errors/src/emitter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -845,18 +845,34 @@ impl EmitterWriter {
// 3 | |
// 4 | | }
// | |_^ test
if let [ann] = &line.annotations[..] {
let mut buffer_ops = vec![];
let mut annotations = vec![];
let mut short_start = true;
for ann in &line.annotations {
if let AnnotationType::MultilineStart(depth) = ann.annotation_type {
if source_string.chars().take(ann.start_col).all(|c| c.is_whitespace()) {
let style = if ann.is_primary {
Style::UnderlinePrimary
} else {
Style::UnderlineSecondary
};
buffer.putc(line_offset, width_offset + depth - 1, '/', style);
return vec![(depth, style)];
annotations.push((depth, style));
buffer_ops.push((line_offset, width_offset + depth - 1, '/', style));
} else {
short_start = false;
break;
}
} else if let AnnotationType::MultilineLine(_) = ann.annotation_type {
} else {
short_start = false;
break;
}
}
if short_start {
for (y, x, c, s) in buffer_ops {
buffer.putc(y, x, c, s);
}
return annotations;
}

// We want to display like this:
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_parse/src/parser/item.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2423,7 +2423,7 @@ impl<'a> Parser<'a> {
}

/// Parses the parameter list of a function, including the `(` and `)` delimiters.
fn parse_fn_params(&mut self, req_name: ReqName) -> PResult<'a, Vec<Param>> {
pub(super) fn parse_fn_params(&mut self, req_name: ReqName) -> PResult<'a, Vec<Param>> {
let mut first_param = true;
// Parse the arguments, starting out with `self` being allowed...
let (mut params, _) = self.parse_paren_comma_seq(|p| {
Expand Down
95 changes: 93 additions & 2 deletions compiler/rustc_parse/src/parser/ty.rs
Original file line number Diff line number Diff line change
Expand Up @@ -933,15 +933,20 @@ impl<'a> Parser<'a> {
has_parens: bool,
modifiers: BoundModifiers,
) -> PResult<'a, GenericBound> {
let lifetime_defs = self.parse_late_bound_lifetime_defs()?;
let path = if self.token.is_keyword(kw::Fn)
let mut lifetime_defs = self.parse_late_bound_lifetime_defs()?;
let mut path = if self.token.is_keyword(kw::Fn)
&& self.look_ahead(1, |tok| tok.kind == TokenKind::OpenDelim(Delimiter::Parenthesis))
&& let Some(path) = self.recover_path_from_fn()
{
path
} else {
self.parse_path(PathStyle::Type)?
};

if self.may_recover() && self.token == TokenKind::OpenDelim(Delimiter::Parenthesis) {
self.recover_fn_trait_with_lifetime_params(&mut path, &mut lifetime_defs)?;
}

if has_parens {
if self.token.is_like_plus() {
// Someone has written something like `&dyn (Trait + Other)`. The correct code
Expand Down Expand Up @@ -1016,6 +1021,92 @@ impl<'a> Parser<'a> {
}
}

/// Recover from `Fn`-family traits (Fn, FnMut, FnOnce) with lifetime arguments
/// (e.g. `FnOnce<'a>(&'a str) -> bool`). Up to generic arguments have already
/// been eaten.
fn recover_fn_trait_with_lifetime_params(
&mut self,
fn_path: &mut ast::Path,
lifetime_defs: &mut Vec<GenericParam>,
) -> PResult<'a, ()> {
let fn_path_segment = fn_path.segments.last_mut().unwrap();
let generic_args = if let Some(p_args) = &fn_path_segment.args {
p_args.clone().into_inner()
} else {
// Normally it wouldn't come here because the upstream should have parsed
// generic parameters (otherwise it's impossible to call this function).
return Ok(());
};
let lifetimes =
if let ast::GenericArgs::AngleBracketed(ast::AngleBracketedArgs { span: _, args }) =
&generic_args
{
args.into_iter()
.filter_map(|arg| {
if let ast::AngleBracketedArg::Arg(generic_arg) = arg
&& let ast::GenericArg::Lifetime(lifetime) = generic_arg {
Some(lifetime)
} else {
None
}
})
.collect()
} else {
Vec::new()
};
// Only try to recover if the trait has lifetime params.
if lifetimes.is_empty() {
return Ok(());
}

// Parse `(T, U) -> R`.
let inputs_lo = self.token.span;
let inputs: Vec<_> =
self.parse_fn_params(|_| false)?.into_iter().map(|input| input.ty).collect();
let inputs_span = inputs_lo.to(self.prev_token.span);
let output = self.parse_ret_ty(AllowPlus::No, RecoverQPath::No, RecoverReturnSign::No)?;
let args = ast::ParenthesizedArgs {
span: fn_path_segment.span().to(self.prev_token.span),
inputs,
inputs_span,
output,
}
.into();
*fn_path_segment =
ast::PathSegment { ident: fn_path_segment.ident, args, id: ast::DUMMY_NODE_ID };

// Convert parsed `<'a>` in `Fn<'a>` into `for<'a>`.
let mut generic_params = lifetimes
.iter()
.map(|lt| GenericParam {
id: lt.id,
ident: lt.ident,
attrs: ast::AttrVec::new(),
bounds: Vec::new(),
is_placeholder: false,
kind: ast::GenericParamKind::Lifetime,
colon_span: None,
})
.collect::<Vec<GenericParam>>();
lifetime_defs.append(&mut generic_params);

let generic_args_span = generic_args.span();
let mut err =
self.struct_span_err(generic_args_span, "`Fn` traits cannot take lifetime parameters");
let snippet = format!(
"for<{}> ",
lifetimes.iter().map(|lt| lt.ident.as_str()).intersperse(", ").collect::<String>(),
);
let before_fn_path = fn_path.span.shrink_to_lo();
err.multipart_suggestion(
"consider using a higher-ranked trait bound instead",
vec![(generic_args_span, "".to_owned()), (before_fn_path, snippet)],
Applicability::MaybeIncorrect,
)
.emit();
Ok(())
}

pub(super) fn check_lifetime(&mut self) -> bool {
self.expected_tokens.push(TokenType::Lifetime);
self.token.is_lifetime()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2683,7 +2683,9 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
// Don't print the tuple of capture types
'print: {
if !is_upvar_tys_infer_tuple {
let msg = format!("required because it appears within the type `{}`", ty);
let msg = with_forced_trimmed_paths!(format!(
"required because it appears within the type `{ty}`",
));
match ty.kind() {
ty::Adt(def, _) => match self.tcx.opt_item_ident(def.did()) {
Some(ident) => err.span_note(ident.span, &msg),
Expand Down Expand Up @@ -2724,7 +2726,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
let mut msg =
"required because it captures the following types: ".to_owned();
for ty in bound_tys.skip_binder() {
write!(msg, "`{}`, ", ty).unwrap();
with_forced_trimmed_paths!(write!(msg, "`{}`, ", ty).unwrap());
}
err.note(msg.trim_end_matches(", "))
}
Expand All @@ -2735,7 +2737,9 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
let kind = tcx.generator_kind(def_id).unwrap().descr();
err.span_note(
sp,
&format!("required because it's used within this {}", kind),
with_forced_trimmed_paths!(&format!(
"required because it's used within this {kind}",
)),
)
}
ty::Closure(def_id, _) => err.span_note(
Expand Down Expand Up @@ -2959,7 +2963,9 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
let expr_ty = with_forced_trimmed_paths!(self.ty_to_string(expr_ty));
err.span_label(
expr_span,
format!("return type was inferred to be `{expr_ty}` here"),
with_forced_trimmed_paths!(format!(
"return type was inferred to be `{expr_ty}` here",
)),
);
}
}
Expand Down
6 changes: 5 additions & 1 deletion src/bootstrap/doc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -506,7 +506,11 @@ impl Step for Std {
// Look for library/std, library/core etc in the `x.py doc` arguments and
// open the corresponding rendered docs.
for requested_crate in requested_crates {
if STD_PUBLIC_CRATES.iter().any(|k| *k == requested_crate.as_str()) {
if requested_crate == "library" {
// For `x.py doc library --open`, open `std` by default.
let index = out.join("std").join("index.html");
builder.open_in_browser(index);
} else if STD_PUBLIC_CRATES.iter().any(|&k| k == requested_crate) {
let index = out.join(requested_crate).join("index.html");
builder.open_in_browser(index);
}
Expand Down
7 changes: 4 additions & 3 deletions src/bootstrap/format.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,11 +74,11 @@ fn update_rustfmt_version(build: &Builder<'_>) {
t!(std::fs::write(stamp_file, version))
}

/// Returns the files modified between the `merge-base` of HEAD and
/// Returns the Rust files modified between the `merge-base` of HEAD and
/// rust-lang/master and what is now on the disk.
///
/// Returns `None` if all files should be formatted.
fn get_modified_files(build: &Builder<'_>) -> Option<Vec<String>> {
fn get_modified_rs_files(build: &Builder<'_>) -> Option<Vec<String>> {
let Ok(remote) = get_rust_lang_rust_remote() else {return None;};
if !verify_rustfmt_version(build) {
return None;
Expand All @@ -95,6 +95,7 @@ fn get_modified_files(build: &Builder<'_>) -> Option<Vec<String>> {
)
.lines()
.map(|s| s.trim().to_owned())
.filter(|f| Path::new(f).extension().map_or(false, |ext| ext == "rs"))
.collect(),
)
}
Expand Down Expand Up @@ -195,7 +196,7 @@ pub fn format(build: &Builder<'_>, check: bool, paths: &[PathBuf]) {
ignore_fmt.add(&format!("!/{}", untracked_path)).expect(&untracked_path);
}
if !check && paths.is_empty() {
if let Some(files) = get_modified_files(build) {
if let Some(files) = get_modified_rs_files(build) {
for file in files {
println!("formatting modified file {file}");
ignore_fmt.add(&format!("/{file}")).expect(&file);
Expand Down
2 changes: 1 addition & 1 deletion src/librustdoc/clean/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1740,7 +1740,7 @@ impl Type {
fn inner_def_id(&self, cache: Option<&Cache>) -> Option<DefId> {
let t: PrimitiveType = match *self {
Type::Path { ref path } => return Some(path.def_id()),
DynTrait(ref bounds, _) => return Some(bounds[0].trait_.def_id()),
DynTrait(ref bounds, _) => return bounds.get(0).map(|b| b.trait_.def_id()),
Primitive(p) => return cache.and_then(|c| c.primitive_locations.get(&p).cloned()),
BorrowedRef { type_: box Generic(..), .. } => PrimitiveType::Reference,
BorrowedRef { ref type_, .. } => return type_.inner_def_id(cache),
Expand Down
3 changes: 1 addition & 2 deletions src/librustdoc/html/render/search_index.rs
Original file line number Diff line number Diff line change
Expand Up @@ -322,8 +322,7 @@ fn get_index_type_id(clean_type: &clean::Type) -> Option<RenderTypeId> {
match *clean_type {
clean::Type::Path { ref path, .. } => Some(RenderTypeId::DefId(path.def_id())),
clean::DynTrait(ref bounds, _) => {
let path = &bounds[0].trait_;
Some(RenderTypeId::DefId(path.def_id()))
bounds.get(0).map(|b| RenderTypeId::DefId(b.trait_.def_id()))
}
clean::Primitive(p) => Some(RenderTypeId::Primitive(p)),
clean::BorrowedRef { ref type_, .. } | clean::RawPointer(_, ref type_) => {
Expand Down
8 changes: 3 additions & 5 deletions src/librustdoc/html/static/css/rustdoc.css
Original file line number Diff line number Diff line change
Expand Up @@ -1318,15 +1318,11 @@ a.test-arrow:hover {
-webkit-appearance: none;
opacity: 1;
}

#settings-menu, #help-button {
margin-left: 4px;
display: flex;
}

#settings-menu > a, #help-button > a, #copy-path {
width: 33px;
}

#settings-menu > a, #help-button > a {
display: flex;
align-items: center;
Expand All @@ -1338,6 +1334,7 @@ a.test-arrow:hover {
/* Rare exception to specifying font sizes in rem. Since this is acting
as an icon, it's okay to specify their sizes in pixels. */
font-size: 20px;
width: 33px;
}

#settings-menu > a:hover, #settings-menu > a:focus,
Expand All @@ -1353,6 +1350,7 @@ a.test-arrow:hover {
padding: 0;
padding-left: 2px;
border: 0;
width: 33px;
}
#copy-path > img {
filter: var(--copy-path-img-filter);
Expand Down
Loading