Skip to content

Rollup of 7 pull requests #111311

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

Merged
merged 21 commits into from
May 7, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
48af94c
Operand::extract_field: only cast llval if it's a pointer and replace…
luqmana Dec 12, 2022
75f3faf
Add test.
luqmana Dec 12, 2022
af69cc0
Make test more targeted.
luqmana Dec 12, 2022
6a5ee11
Don't bitcast aggregate field.
luqmana Dec 16, 2022
2942121
Update test location.
luqmana May 5, 2023
7b1eeda
Switch test back to run-pass.
luqmana May 5, 2023
c7c042a
Address review comments.
luqmana May 5, 2023
7e3b934
clean up transmutes in core
May 6, 2023
b2acf3e
rustc --explain E0726 - grammar fixing (it's => its + add a `the` whe…
Astroide May 6, 2023
05414b0
update Rust Unstable Book docs for `--extern force`
mhammerly May 6, 2023
faa797e
Emit while_true lint spanning the entire loop condition
Flying-Toast May 6, 2023
ec7fcdc
Remove unneeded calls to `mem::forget`
nullptrderef29 May 6, 2023
fd005b0
delete whitelist and add checks to check_item() for missing_docs
mj10021 May 3, 2023
d6ef6e0
Update compiler/rustc_error_codes/src/error_codes/E0726.md
Astroide May 6, 2023
5859771
Rollup merge of #105583 - luqmana:bitcast-immediates, r=oli-obk
JohnTitor May 7, 2023
aef008a
Rollup merge of #110094 - lukas-code:less-transmute, r=thomcc
JohnTitor May 7, 2023
61115cd
Rollup merge of #111150 - mj10021:issue-111025-fix, r=petrochenkov
JohnTitor May 7, 2023
4e4e5bf
Rollup merge of #111293 - Astroide:patch-1, r=compiler-errors
JohnTitor May 7, 2023
88a0204
Rollup merge of #111300 - Flying-Toast:while_true_span_condition, r=c…
JohnTitor May 7, 2023
816e029
Rollup merge of #111301 - JohnBobbo96:cleanup_option_insert_methods, …
JohnTitor May 7, 2023
8372eae
Rollup merge of #111303 - mhammerly:extern-force-docs, r=JohnTitor
JohnTitor May 7, 2023
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
37 changes: 33 additions & 4 deletions compiler/rustc_codegen_ssa/src/mir/operand.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ use super::place::PlaceRef;
use super::{FunctionCx, LocalRef};

use crate::base;
use crate::common::TypeKind;
use crate::glue;
use crate::traits::*;
use crate::MemFlags;
Expand Down Expand Up @@ -236,19 +237,47 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
};

match (&mut val, field.abi) {
(OperandValue::Immediate(llval), _) => {
(
OperandValue::Immediate(llval),
Abi::Scalar(_) | Abi::ScalarPair(..) | Abi::Vector { .. },
) => {
// Bools in union fields needs to be truncated.
*llval = bx.to_immediate(*llval, field);
// HACK(eddyb) have to bitcast pointers until LLVM removes pointee types.
*llval = bx.bitcast(*llval, bx.cx().immediate_backend_type(field));
let ty = bx.cx().immediate_backend_type(field);
if bx.type_kind(ty) == TypeKind::Pointer {
*llval = bx.pointercast(*llval, ty);
}
}
(OperandValue::Pair(a, b), Abi::ScalarPair(a_abi, b_abi)) => {
// Bools in union fields needs to be truncated.
*a = bx.to_immediate_scalar(*a, a_abi);
*b = bx.to_immediate_scalar(*b, b_abi);
// HACK(eddyb) have to bitcast pointers until LLVM removes pointee types.
*a = bx.bitcast(*a, bx.cx().scalar_pair_element_backend_type(field, 0, true));
*b = bx.bitcast(*b, bx.cx().scalar_pair_element_backend_type(field, 1, true));
let a_ty = bx.cx().scalar_pair_element_backend_type(field, 0, true);
let b_ty = bx.cx().scalar_pair_element_backend_type(field, 1, true);
if bx.type_kind(a_ty) == TypeKind::Pointer {
*a = bx.pointercast(*a, a_ty);
}
if bx.type_kind(b_ty) == TypeKind::Pointer {
*b = bx.pointercast(*b, b_ty);
}
}
// Newtype vector of array, e.g. #[repr(simd)] struct S([i32; 4]);
(OperandValue::Immediate(llval), Abi::Aggregate { sized: true }) => {
assert!(matches!(self.layout.abi, Abi::Vector { .. }));

let llty = bx.cx().backend_type(self.layout);
let llfield_ty = bx.cx().backend_type(field);

// Can't bitcast an aggregate, so round trip through memory.
let lltemp = bx.alloca(llfield_ty, field.align.abi);
let llptr = bx.pointercast(lltemp, bx.cx().type_ptr_to(llty));
bx.store(*llval, llptr, field.align.abi);
*llval = bx.load(llfield_ty, lltemp, field.align.abi);
}
(OperandValue::Immediate(_), Abi::Uninhabited | Abi::Aggregate { sized: false }) => {
bug!()
}
(OperandValue::Pair(..), _) => bug!(),
(OperandValue::Ref(..), _) => bug!(),
Expand Down
4 changes: 2 additions & 2 deletions compiler/rustc_error_codes/src/error_codes/E0726.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ block_on(future);

Specify desired lifetime of parameter `content` or indicate the anonymous
lifetime like `content: Content<'_>`. The anonymous lifetime tells the Rust
compiler that `content` is only needed until create function is done with
it's execution.
compiler that `content` is only needed until the `create` function is done with
its execution.

The `implicit elision` meaning the omission of suggested lifetime that is
`pub async fn create<'a>(content: Content<'a>) {}` is not allowed here as
Expand Down
32 changes: 6 additions & 26 deletions compiler/rustc_lint/src/builtin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -117,8 +117,7 @@ impl EarlyLintPass for WhileTrue {
#[inline]
fn check_expr(&mut self, cx: &EarlyContext<'_>, e: &ast::Expr) {
if let ast::ExprKind::While(cond, _, label) = &e.kind
&& let cond = pierce_parens(cond)
&& let ast::ExprKind::Lit(token_lit) = cond.kind
&& let ast::ExprKind::Lit(token_lit) = pierce_parens(cond).kind
&& let token::Lit { kind: token::Bool, symbol: kw::True, .. } = token_lit
&& !cond.span.from_expansion()
{
Expand Down Expand Up @@ -547,32 +546,13 @@ impl<'tcx> LateLintPass<'tcx> for MissingDoc {
}

fn check_item(&mut self, cx: &LateContext<'_>, it: &hir::Item<'_>) {
match it.kind {
hir::ItemKind::Trait(..) => {
// Issue #11592: traits are always considered exported, even when private.
if cx.tcx.visibility(it.owner_id)
== ty::Visibility::Restricted(
cx.tcx.parent_module_from_def_id(it.owner_id.def_id).to_def_id(),
)
{
return;
}
}
hir::ItemKind::TyAlias(..)
| hir::ItemKind::Fn(..)
| hir::ItemKind::Macro(..)
| hir::ItemKind::Mod(..)
| hir::ItemKind::Enum(..)
| hir::ItemKind::Struct(..)
| hir::ItemKind::Union(..)
| hir::ItemKind::Const(..)
| hir::ItemKind::Static(..) => {}

_ => return,
};
// Previously the Impl and Use types have been excluded from missing docs,
// so we will continue to exclude them for compatibility
if let hir::ItemKind::Impl(..) | hir::ItemKind::Use(..) = it.kind {
return;
}

let (article, desc) = cx.tcx.article_and_description(it.owner_id.to_def_id());

self.check_missing_docs_attrs(cx, it.owner_id.def_id, article, desc);
}

Expand Down
4 changes: 2 additions & 2 deletions library/core/src/mem/maybe_uninit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1287,7 +1287,7 @@ impl<T, const N: usize> MaybeUninit<[T; N]> {
#[inline]
pub const fn transpose(self) -> [MaybeUninit<T>; N] {
// SAFETY: T and MaybeUninit<T> have the same layout
unsafe { super::transmute_copy(&ManuallyDrop::new(self)) }
unsafe { intrinsics::transmute_unchecked(self) }
}
}

Expand All @@ -1307,6 +1307,6 @@ impl<T, const N: usize> [MaybeUninit<T>; N] {
#[inline]
pub const fn transpose(self) -> MaybeUninit<[T; N]> {
// SAFETY: T and MaybeUninit<T> have the same layout
unsafe { super::transmute_copy(&ManuallyDrop::new(self)) }
unsafe { intrinsics::transmute_unchecked(self) }
}
}
6 changes: 2 additions & 4 deletions library/core/src/option.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1641,10 +1641,8 @@ impl<T> Option<T> {
where
F: FnOnce() -> T,
{
if let None = *self {
// the compiler isn't smart enough to know that we are not dropping a `T`
// here and wants us to ensure `T` can be dropped at compile time.
mem::forget(mem::replace(self, Some(f())))
if let None = self {
*self = Some(f());
}

// SAFETY: a `None` variant for `self` would have been replaced by a `Some`
Expand Down
18 changes: 7 additions & 11 deletions library/core/src/tuple.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
// See src/libstd/primitive_docs.rs for documentation.

use crate::cmp::Ordering::{self, *};
use crate::mem::transmute;

// Recursive macro for implementing n-ary tuple functions and operations
//
Expand Down Expand Up @@ -142,16 +141,13 @@ macro_rules! maybe_tuple_doc {
#[inline]
const fn ordering_is_some(c: Option<Ordering>, x: Ordering) -> bool {
// FIXME: Just use `==` once that's const-stable on `Option`s.
// This isn't using `match` because that optimizes worse due to
// making a two-step check (`Some` *then* the inner value).

// SAFETY: There's no public guarantee for `Option<Ordering>`,
// but we're core so we know that it's definitely a byte.
unsafe {
let c: i8 = transmute(c);
let x: i8 = transmute(Some(x));
c == x
}
// This is mapping `None` to 2 and then doing the comparison afterwards
// because it optimizes better (`None::<Ordering>` is represented as 2).
x as i8
== match c {
Some(c) => c as i8,
None => 2,
}
}

// Constructs an expression that performs a lexical ordering using method `$rel`.
Expand Down
2 changes: 2 additions & 0 deletions src/doc/unstable-book/src/compiler-flags/extern-options.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
* Tracking issue for `noprelude`: [#98398](https://github.com/rust-lang/rust/issues/98398)
* Tracking issue for `priv`: [#98399](https://github.com/rust-lang/rust/issues/98399)
* Tracking issue for `nounused`: [#98400](https://github.com/rust-lang/rust/issues/98400)
* Tracking issue for `force`: [#111302](https://github.com/rust-lang/rust/issues/111302)

The behavior of the `--extern` flag can be modified with `noprelude`, `priv` or `nounused` options.

Expand All @@ -25,3 +26,4 @@ To use multiple options, separate them with a comma:
This is used by the [build-std project](https://github.com/rust-lang/wg-cargo-std-aware/) to simulate compatibility with sysroot-only crates.
* `priv`: Mark the crate as a private dependency for the [`exported_private_dependencies`](../../rustc/lints/listing/warn-by-default.html#exported-private-dependencies) lint.
* `nounused`: Suppress [`unused-crate-dependencies`](../../rustc/lints/listing/allowed-by-default.html#unused-crate-dependencies) warnings for the crate.
* `force`: Resolve the crate as if it is used, even if it is not used. This can be used to satisfy compilation session requirements like the presence of an allocator or panic handler.
3 changes: 3 additions & 0 deletions tests/ui/lint/lint-missing-doc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#![deny(missing_docs)]
#![allow(dead_code)]
#![feature(associated_type_defaults, extern_types)]
#![feature(trait_alias)]

//! Some garbage docs for the crate here
#![doc="More garbage"]
Expand Down Expand Up @@ -202,4 +203,6 @@ extern "C" {
//~^ ERROR: missing documentation for a foreign type
}

pub trait T = Sync; //~ ERROR: missing documentation for a trait alias

fn main() {}
56 changes: 31 additions & 25 deletions tests/ui/lint/lint-missing-doc.stderr
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: missing documentation for a type alias
--> $DIR/lint-missing-doc.rs:11:1
--> $DIR/lint-missing-doc.rs:12:1
|
LL | pub type PubTypedef = String;
| ^^^^^^^^^^^^^^^^^^^
Expand All @@ -11,142 +11,148 @@ LL | #![deny(missing_docs)]
| ^^^^^^^^^^^^

error: missing documentation for a struct
--> $DIR/lint-missing-doc.rs:18:1
--> $DIR/lint-missing-doc.rs:19:1
|
LL | pub struct PubFoo {
| ^^^^^^^^^^^^^^^^^

error: missing documentation for a struct field
--> $DIR/lint-missing-doc.rs:19:5
--> $DIR/lint-missing-doc.rs:20:5
|
LL | pub a: isize,
| ^^^^^^^^^^^^

error: missing documentation for a module
--> $DIR/lint-missing-doc.rs:30:1
--> $DIR/lint-missing-doc.rs:31:1
|
LL | pub mod pub_module_no_dox {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^

error: missing documentation for a function
--> $DIR/lint-missing-doc.rs:34:1
--> $DIR/lint-missing-doc.rs:35:1
|
LL | pub fn foo2() {}
| ^^^^^^^^^^^^^

error: missing documentation for a trait
--> $DIR/lint-missing-doc.rs:52:1
--> $DIR/lint-missing-doc.rs:53:1
|
LL | pub trait C {
| ^^^^^^^^^^^

error: missing documentation for a method
--> $DIR/lint-missing-doc.rs:53:5
--> $DIR/lint-missing-doc.rs:54:5
|
LL | fn foo(&self);
| ^^^^^^^^^^^^^^

error: missing documentation for a method
--> $DIR/lint-missing-doc.rs:54:5
--> $DIR/lint-missing-doc.rs:55:5
|
LL | fn foo_with_impl(&self) {}
| ^^^^^^^^^^^^^^^^^^^^^^^

error: missing documentation for an associated function
--> $DIR/lint-missing-doc.rs:55:5
--> $DIR/lint-missing-doc.rs:56:5
|
LL | fn foo_no_self();
| ^^^^^^^^^^^^^^^^^

error: missing documentation for an associated function
--> $DIR/lint-missing-doc.rs:56:5
--> $DIR/lint-missing-doc.rs:57:5
|
LL | fn foo_no_self_with_impl() {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^

error: missing documentation for an associated type
--> $DIR/lint-missing-doc.rs:66:5
--> $DIR/lint-missing-doc.rs:67:5
|
LL | type AssociatedType;
| ^^^^^^^^^^^^^^^^^^^

error: missing documentation for an associated type
--> $DIR/lint-missing-doc.rs:67:5
--> $DIR/lint-missing-doc.rs:68:5
|
LL | type AssociatedTypeDef = Self;
| ^^^^^^^^^^^^^^^^^^^^^^

error: missing documentation for an associated function
--> $DIR/lint-missing-doc.rs:83:5
--> $DIR/lint-missing-doc.rs:84:5
|
LL | pub fn foo() {}
| ^^^^^^^^^^^^

error: missing documentation for an enum
--> $DIR/lint-missing-doc.rs:120:1
--> $DIR/lint-missing-doc.rs:121:1
|
LL | pub enum PubBaz {
| ^^^^^^^^^^^^^^^

error: missing documentation for a variant
--> $DIR/lint-missing-doc.rs:121:5
--> $DIR/lint-missing-doc.rs:122:5
|
LL | PubBazA {
| ^^^^^^^

error: missing documentation for a struct field
--> $DIR/lint-missing-doc.rs:122:9
--> $DIR/lint-missing-doc.rs:123:9
|
LL | a: isize,
| ^^^^^^^^

error: missing documentation for a constant
--> $DIR/lint-missing-doc.rs:153:1
--> $DIR/lint-missing-doc.rs:154:1
|
LL | pub const FOO4: u32 = 0;
| ^^^^^^^^^^^^^^^^^^^

error: missing documentation for a static
--> $DIR/lint-missing-doc.rs:163:1
--> $DIR/lint-missing-doc.rs:164:1
|
LL | pub static BAR4: u32 = 0;
| ^^^^^^^^^^^^^^^^^^^^

error: missing documentation for a function
--> $DIR/lint-missing-doc.rs:169:5
--> $DIR/lint-missing-doc.rs:170:5
|
LL | pub fn undocumented1() {}
| ^^^^^^^^^^^^^^^^^^^^^^

error: missing documentation for a function
--> $DIR/lint-missing-doc.rs:170:5
--> $DIR/lint-missing-doc.rs:171:5
|
LL | pub fn undocumented2() {}
| ^^^^^^^^^^^^^^^^^^^^^^

error: missing documentation for a function
--> $DIR/lint-missing-doc.rs:176:9
--> $DIR/lint-missing-doc.rs:177:9
|
LL | pub fn also_undocumented1() {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: missing documentation for a function
--> $DIR/lint-missing-doc.rs:191:5
--> $DIR/lint-missing-doc.rs:192:5
|
LL | pub fn extern_fn_undocumented(f: f32) -> f32;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: missing documentation for a static
--> $DIR/lint-missing-doc.rs:196:5
--> $DIR/lint-missing-doc.rs:197:5
|
LL | pub static EXTERN_STATIC_UNDOCUMENTED: u8;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: missing documentation for a foreign type
--> $DIR/lint-missing-doc.rs:201:5
--> $DIR/lint-missing-doc.rs:202:5
|
LL | pub type ExternTyUndocumented;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: aborting due to 24 previous errors
error: missing documentation for a trait alias
--> $DIR/lint-missing-doc.rs:206:1
|
LL | pub trait T = Sync;
| ^^^^^^^^^^^

error: aborting due to 25 previous errors

Loading