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 15 pull requests #78810

Merged
merged 39 commits into from
Nov 6, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
7cae9e8
`#![deny(unsafe_op_in_unsafe_fn)]` in sys/hermit
maekawatoshiki Jul 31, 2020
3a46cca
Revert "`#![deny(unsafe_op_in_unsafe_fn)]` in sys/hermit"
maekawatoshiki Aug 21, 2020
d94258e
Add `#![allow(unsafe_op_in_unsafe_fn)]` in sys/hermit
maekawatoshiki Aug 21, 2020
14158f5
Remove #![allow(unsafe_op_in_unsafe_fn)] except for mod.rs
maekawatoshiki Oct 8, 2020
1e73724
Allow using 1/2/3/4 for `x.py setup` options
jyn514 Oct 29, 2020
be01d54
BTreeMap: document a curious assumption in test cases
ssomers Oct 29, 2020
5fb5707
Add LLVM upgrades from 7 to 10 to RELEASES.md
glandium Oct 30, 2020
f289a87
Print a summary of which test suite failed
Mark-Simulacrum Nov 3, 2020
8db2bf2
Add link to rust website
GuillaumeGomez Nov 4, 2020
340c94a
Expand explanation of reverse_bits
kornelski Nov 4, 2020
6ca43ac
inliner: Copy unevaluated constants only after successful inlining
tmiasko Nov 5, 2020
9d9292c
`deny(invalid_codeblock_attributes)`
jyn514 Nov 5, 2020
03f0ca0
Add test
Nadrieril Oct 20, 2020
25e272e
Fix unreachable sub-branch detection
Nadrieril Oct 20, 2020
107a29a
Emit lints in the order in which they occur in the file.
Nadrieril Nov 5, 2020
fe6dfcd
Intra-doc links for std::io::buffered
pitaj Oct 16, 2020
de2940f
rustc_expand: use collect_bang helper instead of manual reimplementation
est31 Nov 6, 2020
dfa5e46
The renumber pass is long gone
est31 Nov 6, 2020
8d48e3b
document HACKs
pitaj Nov 6, 2020
0af959d
Fixing Spelling Typos
ankushduacodes Nov 6, 2020
f197da6
fix shellcheck error of SC2148
sasurau4 Nov 3, 2020
ce4c124
fix shellcheck error of SC1008
sasurau4 Nov 2, 2020
a1af001
fix shellcheck error of SC2068
sasurau4 Nov 2, 2020
5ea028e
ignore shellcheck error SC2068
sasurau4 Nov 3, 2020
4136ed2
Rollup merge of #74979 - maekawatoshiki:fix, r=Mark-Simulacrum
JohnTitor Nov 6, 2020
0e71fc7
Rollup merge of #78006 - pitaj:master, r=jyn514
JohnTitor Nov 6, 2020
91153d5
Rollup merge of #78167 - Nadrieril:fix-76836_, r=varkor
JohnTitor Nov 6, 2020
8ca7531
Rollup merge of #78514 - jyn514:setup-number, r=Mark-Simulacrum
JohnTitor Nov 6, 2020
162f400
Rollup merge of #78538 - ssomers:btree_testing_rng, r=Mark-Simulacrum
JohnTitor Nov 6, 2020
c990a38
Rollup merge of #78559 - glandium:release-notes, r=Mark-Simulacrum
JohnTitor Nov 6, 2020
7931b24
Rollup merge of #78666 - sasurau4:fix/shellcheck-error, r=jyn514
JohnTitor Nov 6, 2020
3f5723c
Rollup merge of #78705 - Mark-Simulacrum:nicer-failure-compiletest, r…
JohnTitor Nov 6, 2020
707988a
Rollup merge of #78726 - GuillaumeGomez:back-link-to-main-website, r=…
JohnTitor Nov 6, 2020
8f70cad
Rollup merge of #78730 - kornelski:not-inverse, r=Dylan-DPC
JohnTitor Nov 6, 2020
55bf791
Rollup merge of #78760 - jyn514:deny-invalid-codeblocks, r=GuillaumeG…
JohnTitor Nov 6, 2020
0a89d7b
Rollup merge of #78771 - tmiasko:inline-consts, r=oli-obk
JohnTitor Nov 6, 2020
09a40af
Rollup merge of #78794 - est31:collect_bang, r=oli-obk
JohnTitor Nov 6, 2020
5b16a66
Rollup merge of #78795 - est31:node_id_assignment_doc_fix, r=oli-obk
JohnTitor Nov 6, 2020
af50c79
Rollup merge of #78798 - ankushduacodes:fixing-typo, r=jonas-schievink
JohnTitor Nov 6, 2020
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
8 changes: 8 additions & 0 deletions RELEASES.md
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,7 @@ Compiler
- [Added the `tiny` value to the `code-model` codegen flag.][72397]
- [Added tier 3 support\* for the `mipsel-sony-psp` target.][72062]
- [Added tier 3 support for the `thumbv7a-uwp-windows-msvc` target.][72133]
- [Upgraded to LLVM 10.][67759]

\* Refer to Rust's [platform support page][forge-platform-support] for more
information on Rust's tiered platform support.
Expand Down Expand Up @@ -396,6 +397,7 @@ Internals Only
[72062]: https://github.com/rust-lang/rust/pull/72062/
[72094]: https://github.com/rust-lang/rust/pull/72094/
[72133]: https://github.com/rust-lang/rust/pull/72133/
[67759]: https://github.com/rust-lang/rust/pull/67759/
[71900]: https://github.com/rust-lang/rust/pull/71900/
[71928]: https://github.com/rust-lang/rust/pull/71928/
[71662]: https://github.com/rust-lang/rust/pull/71662/
Expand Down Expand Up @@ -1270,6 +1272,7 @@ Compiler
`armv7-unknown-linux-musleabi` targets.][63107]
- [Added tier 3 support for the `hexagon-unknown-linux-musl` target.][62814]
- [Added tier 3 support for the `riscv32i-unknown-none-elf` target.][62784]
- [Upgraded to LLVM 9.][62592]

\* Refer to Rust's [platform support page][forge-platform-support] for more
information on Rust's tiered platform support.
Expand Down Expand Up @@ -1336,6 +1339,7 @@ Compatibility Notes
[62735]: https://github.com/rust-lang/rust/pull/62735/
[62766]: https://github.com/rust-lang/rust/pull/62766/
[62784]: https://github.com/rust-lang/rust/pull/62784/
[62592]: https://github.com/rust-lang/rust/pull/62592/
[62785]: https://github.com/rust-lang/rust/issues/62785/
[62814]: https://github.com/rust-lang/rust/pull/62814/
[62896]: https://github.com/rust-lang/rust/issues/62896/
Expand Down Expand Up @@ -2431,6 +2435,7 @@ Compiler
--------
- [Added the `riscv32imc-unknown-none-elf` target.][53822]
- [Added the `aarch64-unknown-netbsd` target][53165]
- [Upgraded to LLVM 8.][53611]

Libraries
---------
Expand Down Expand Up @@ -2479,6 +2484,7 @@ Misc
[53033]: https://github.com/rust-lang/rust/pull/53033/
[53044]: https://github.com/rust-lang/rust/pull/53044/
[53165]: https://github.com/rust-lang/rust/pull/53165/
[53611]: https://github.com/rust-lang/rust/pull/53611/
[53213]: https://github.com/rust-lang/rust/pull/53213/
[53236]: https://github.com/rust-lang/rust/pull/53236/
[53272]: https://github.com/rust-lang/rust/pull/53272/
Expand Down Expand Up @@ -2537,6 +2543,7 @@ Compiler
- [Bumped minimum LLVM version to 5.0.][51899]
- [Added `powerpc64le-unknown-linux-musl` target.][51619]
- [Added `aarch64-unknown-hermit` and `x86_64-unknown-hermit` targets.][52861]
- [Upgraded to LLVM 7.][51966]

Libraries
---------
Expand Down Expand Up @@ -2588,6 +2595,7 @@ Compatibility Notes

[53893]: https://github.com/rust-lang/rust/pull/53893/
[52861]: https://github.com/rust-lang/rust/pull/52861/
[51966]: https://github.com/rust-lang/rust/pull/51966/
[52656]: https://github.com/rust-lang/rust/pull/52656/
[52239]: https://github.com/rust-lang/rust/pull/52239/
[52330]: https://github.com/rust-lang/rust/pull/52330/
Expand Down
4 changes: 2 additions & 2 deletions compiler/rustc_ast/src/node_id.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ rustc_data_structures::define_id_collections!(NodeMap, NodeSet, NodeId);
pub const CRATE_NODE_ID: NodeId = NodeId::from_u32(0);

/// When parsing and doing expansions, we initially give all AST nodes this AST
/// node value. Then later, in the renumber pass, we renumber them to have
/// small, positive ids.
/// node value. Then later, during expansion, we renumber them to have small,
/// positive ids.
pub const DUMMY_NODE_ID: NodeId = NodeId::MAX;

impl NodeId {
Expand Down
4 changes: 2 additions & 2 deletions compiler/rustc_codegen_cranelift/scripts/cargo.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ cmd=$1
shift || true

if [[ "$cmd" = "jit" ]]; then
cargo +${TOOLCHAIN} rustc $@ -- --jit
cargo +${TOOLCHAIN} rustc "$@" -- --jit
else
cargo +${TOOLCHAIN} $cmd $@
cargo +${TOOLCHAIN} $cmd "$@"
fi
1 change: 1 addition & 0 deletions compiler/rustc_codegen_cranelift/scripts/config.sh
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#!/usr/bin/env bash
set -e

unamestr=`uname`
Expand Down
4 changes: 2 additions & 2 deletions compiler/rustc_codegen_cranelift/test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@ set -e

export RUSTFLAGS="-Zrun_dsymutil=no"

./build.sh --without-sysroot $@
./build.sh --without-sysroot "$@"

rm -r target/out || true

scripts/tests.sh no_sysroot

./build.sh $@
./build.sh "$@"

scripts/tests.sh base_sysroot
scripts/tests.sh extended_sysroot
1 change: 1 addition & 0 deletions compiler/rustc_error_codes/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#![deny(invalid_codeblock_attributes)]
//! This library is used to gather all error codes into one place,
//! the goal being to make their maintenance easier.

Expand Down
6 changes: 3 additions & 3 deletions compiler/rustc_expand/src/expand.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1436,9 +1436,9 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> {
item.attrs = attrs;
self.check_attributes(&item.attrs);
item.and_then(|item| match item.kind {
ItemKind::MacCall(mac) => self
.collect(AstFragmentKind::Items, InvocationKind::Bang { mac, span })
.make_items(),
ItemKind::MacCall(mac) => {
self.collect_bang(mac, span, AstFragmentKind::Items).make_items()
}
_ => unreachable!(),
})
}
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_mir/src/transform/check_unsafety.rs
Original file line number Diff line number Diff line change
Expand Up @@ -693,7 +693,7 @@ pub fn check_unsafety(tcx: TyCtxt<'_>, def_id: LocalDefId) {
// should only issue a warning for the sake of backwards compatibility.
//
// The solution those 2 expectations is to always take the minimum of both lints.
// This prevent any new errors (unless both lints are explicitely set to `deny`).
// This prevent any new errors (unless both lints are explicitly set to `deny`).
let lint = if tcx.lint_level_at_node(SAFE_PACKED_BORROWS, lint_root).0
<= tcx.lint_level_at_node(UNSAFE_OP_IN_UNSAFE_FN, lint_root).0
{
Expand Down
18 changes: 10 additions & 8 deletions compiler/rustc_mir/src/transform/inline.rs
Original file line number Diff line number Diff line change
Expand Up @@ -140,14 +140,6 @@ impl Inliner<'tcx> {
continue;
};

// Copy only unevaluated constants from the callee_body into the caller_body.
// Although we are only pushing `ConstKind::Unevaluated` consts to
// `required_consts`, here we may not only have `ConstKind::Unevaluated`
// because we are calling `subst_and_normalize_erasing_regions`.
caller_body.required_consts.extend(callee_body.required_consts.iter().copied().filter(
|&constant| matches!(constant.literal.val, ConstKind::Unevaluated(_, _, _)),
));

let start = caller_body.basic_blocks().len();
debug!("attempting to inline callsite {:?} - body={:?}", callsite, callee_body);
if !self.inline_call(callsite, caller_body, callee_body) {
Expand Down Expand Up @@ -522,6 +514,16 @@ impl Inliner<'tcx> {
kind: TerminatorKind::Goto { target: integrator.map_block(START_BLOCK) },
});

// Copy only unevaluated constants from the callee_body into the caller_body.
// Although we are only pushing `ConstKind::Unevaluated` consts to
// `required_consts`, here we may not only have `ConstKind::Unevaluated`
// because we are calling `subst_and_normalize_erasing_regions`.
caller_body.required_consts.extend(
callee_body.required_consts.iter().copied().filter(|&constant| {
matches!(constant.literal.val, ConstKind::Unevaluated(_, _, _))
}),
);

true
}
kind => {
Expand Down
120 changes: 88 additions & 32 deletions compiler/rustc_mir_build/src/thir/pattern/_match.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
//! Note: most of the tests relevant to this file can be found (at the time of writing) in
//! src/tests/ui/pattern/usefulness.
//! Note: tests specific to this file can be found in:
//! - ui/pattern/usefulness
//! - ui/or-patterns
//! - ui/consts/const_in_pattern
//! - ui/rfc-2008-non-exhaustive
//! - probably many others
//! I (Nadrieril) prefer to put new tests in `ui/pattern/usefulness` unless there's a specific
//! reason not to, for example if they depend on a particular feature like or_patterns.
//!
//! This file includes the logic for exhaustiveness and usefulness checking for
//! pattern-matching. Specifically, given a list of patterns for a type, we can
Expand Down Expand Up @@ -1361,8 +1367,9 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {

#[derive(Clone, Debug)]
crate enum Usefulness<'tcx> {
/// Carries a list of unreachable subpatterns. Used only in the presence of or-patterns.
Useful(Vec<Span>),
/// Carries, for each column in the matrix, a set of sub-branches that have been found to be
/// unreachable. Used only in the presence of or-patterns, otherwise it stays empty.
Useful(Vec<FxHashSet<Span>>),
/// Carries a list of witnesses of non-exhaustiveness.
UsefulWithWitness(Vec<Witness<'tcx>>),
NotUseful,
Expand Down Expand Up @@ -1410,6 +1417,23 @@ impl<'tcx> Usefulness<'tcx> {
};
UsefulWithWitness(new_witnesses)
}
Useful(mut unreachables) => {
if !unreachables.is_empty() {
// When we apply a constructor, there are `arity` columns of the matrix that
// corresponded to its arguments. All the unreachables found in these columns
// will, after `apply`, come from the first column. So we take the union of all
// the corresponding sets and put them in the first column.
// Note that `arity` may be 0, in which case we just push a new empty set.
let len = unreachables.len();
let arity = ctor_wild_subpatterns.len();
let mut unioned = FxHashSet::default();
for set in unreachables.drain((len - arity)..) {
unioned.extend(set)
}
unreachables.push(unioned);
}
Useful(unreachables)
}
x => x,
}
}
Expand Down Expand Up @@ -2091,55 +2115,87 @@ crate fn is_useful<'p, 'tcx>(

// If the first pattern is an or-pattern, expand it.
if let Some(vs) = v.expand_or_pat() {
// We need to push the already-seen patterns into the matrix in order to detect redundant
// branches like `Some(_) | Some(0)`. We also keep track of the unreachable subpatterns.
let mut matrix = matrix.clone();
// `Vec` of all the unreachable branches of the current or-pattern.
let mut unreachable_branches = Vec::new();
// Subpatterns that are unreachable from all branches. E.g. in the following case, the last
// `true` is unreachable only from one branch, so it is overall reachable.
// We expand the or pattern, trying each of its branches in turn and keeping careful track
// of possible unreachable sub-branches.
//
// If two branches have detected some unreachable sub-branches, we need to be careful. If
// they were detected in columns that are not the current one, we want to keep only the
// sub-branches that were unreachable in _all_ branches. Eg. in the following, the last
// `true` is unreachable in the second branch of the first or-pattern, but not otherwise.
// Therefore we don't want to lint that it is unreachable.
//
// ```
// match (true, true) {
// (true, true) => {}
// (false | true, false | true) => {}
// }
// ```
let mut unreachable_subpats = FxHashSet::default();
// Whether any branch at all is useful.
// If however the sub-branches come from the current column, they come from the inside of
// the current or-pattern, and we want to keep them all. Eg. in the following, we _do_ want
// to lint that the last `false` is unreachable.
// ```
// match None {
// Some(false) => {}
// None | Some(true | false) => {}
// }
// ```

let mut matrix = matrix.clone();
// We keep track of sub-branches separately depending on whether they come from this column
// or from others.
let mut unreachables_this_column: FxHashSet<Span> = FxHashSet::default();
let mut unreachables_other_columns: Vec<FxHashSet<Span>> = Vec::default();
// Whether at least one branch is reachable.
let mut any_is_useful = false;

for v in vs {
let res = is_useful(cx, &matrix, &v, witness_preference, hir_id, is_under_guard, false);
match res {
Useful(pats) => {
if !any_is_useful {
any_is_useful = true;
// Initialize with the first set of unreachable subpatterns encountered.
unreachable_subpats = pats.into_iter().collect();
} else {
// Keep the patterns unreachable from both this and previous branches.
unreachable_subpats =
pats.into_iter().filter(|p| unreachable_subpats.contains(p)).collect();
Useful(unreachables) => {
if let Some((this_column, other_columns)) = unreachables.split_last() {
// We keep the union of unreachables found in the first column.
unreachables_this_column.extend(this_column);
// We keep the intersection of unreachables found in other columns.
if unreachables_other_columns.is_empty() {
unreachables_other_columns = other_columns.to_vec();
} else {
unreachables_other_columns = unreachables_other_columns
.into_iter()
.zip(other_columns)
.map(|(x, y)| x.intersection(&y).copied().collect())
.collect();
}
}
any_is_useful = true;
}
NotUseful => unreachable_branches.push(v.head().span),
UsefulWithWitness(_) => {
bug!("Encountered or-pat in `v` during exhaustiveness checking")
NotUseful => {
unreachables_this_column.insert(v.head().span);
}
UsefulWithWitness(_) => bug!(
"encountered or-pat in the expansion of `_` during exhaustiveness checking"
),
}
// If pattern has a guard don't add it to the matrix

// If pattern has a guard don't add it to the matrix.
if !is_under_guard {
// We push the already-seen patterns into the matrix in order to detect redundant
// branches like `Some(_) | Some(0)`.
matrix.push(v);
}
}
if any_is_useful {
// Collect all the unreachable patterns.
unreachable_branches.extend(unreachable_subpats);
return Useful(unreachable_branches);

return if any_is_useful {
let mut unreachables = if unreachables_other_columns.is_empty() {
let n_columns = v.len();
(0..n_columns - 1).map(|_| FxHashSet::default()).collect()
} else {
unreachables_other_columns
};
unreachables.push(unreachables_this_column);
Useful(unreachables)
} else {
return NotUseful;
}
NotUseful
};
}

// FIXME(Nadrieril): Hack to work around type normalization issues (see #72476).
Expand Down
7 changes: 5 additions & 2 deletions compiler/rustc_mir_build/src/thir/pattern/check_match.rs
Original file line number Diff line number Diff line change
Expand Up @@ -389,8 +389,11 @@ fn check_arms<'p, 'tcx>(
hir::MatchSource::AwaitDesugar | hir::MatchSource::TryDesugar => {}
}
}
Useful(unreachable_subpatterns) => {
for span in unreachable_subpatterns {
Useful(unreachables) => {
let mut unreachables: Vec<_> = unreachables.into_iter().flatten().collect();
// Emit lints in the order in which they occur in the file.
unreachables.sort_unstable();
for span in unreachables {
unreachable_pattern(cx.tcx, span, id, None);
}
}
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_typeck/src/check/pat.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1500,7 +1500,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
err.span_suggestion(
sp,
&format!(
"if you don't care about {} missing field{}, you can explicitely ignore {}",
"if you don't care about {} missing field{}, you can explicitly ignore {}",
if len == 1 { "this" } else { "these" },
if len == 1 { "" } else { "s" },
if len == 1 { "it" } else { "them" },
Expand Down
1 change: 1 addition & 0 deletions library/alloc/src/collections/btree/map/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1668,6 +1668,7 @@ create_append_test!(test_append_239, 239);
create_append_test!(test_append_1700, 1700);

fn rand_data(len: usize) -> Vec<(u32, u32)> {
assert!(len * 2 <= 70029); // from that point on numbers repeat
let mut rng = DeterministicRng::new();
Vec::from_iter((0..len).map(|_| (rng.next(), rng.next())))
}
Expand Down
1 change: 1 addition & 0 deletions library/alloc/src/collections/btree/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ impl DeterministicRng {
DeterministicRng { x: 0x193a6754, y: 0xa8a7d469, z: 0x97830e05, w: 0x113ba7bb }
}

/// Guarantees that the first 70029 results are unique.
fn next(&mut self) -> u32 {
let x = self.x;
let t = x ^ (x << 11);
Expand Down
1 change: 1 addition & 0 deletions library/alloc/src/collections/btree/set/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -687,6 +687,7 @@ fn test_first_last() {
}

fn rand_data(len: usize) -> Vec<u32> {
assert!(len <= 70029); // from that point on numbers repeat
let mut rng = DeterministicRng::new();
Vec::from_iter((0..len).map(|_| rng.next()))
}
Expand Down
4 changes: 3 additions & 1 deletion library/core/src/num/int_macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,8 @@ assert_eq!(m, ", $swapped, ");
}

doc_comment! {
concat!("Reverses the bit pattern of the integer.
concat!("Reverses the order of bits in the integer. The least significant bit becomes the most significant bit,
second least-significant bit becomes second most-significant bit, etc.

# Examples

Expand All @@ -285,6 +286,7 @@ let n = ", $swap_op, stringify!($SelfT), ";
let m = n.reverse_bits();

assert_eq!(m, ", $reversed, ");
assert_eq!(0, 0", stringify!($SelfT), ".reverse_bits());
```"),
#[stable(feature = "reverse_bits", since = "1.37.0")]
#[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")]
Expand Down
Loading