Skip to content

Commit

Permalink
Auto merge of #108640 - matthiaskrgr:rollup-rii4t5t, r=matthiaskrgr
Browse files Browse the repository at this point in the history
Rollup of 5 pull requests

Successful merges:

 - #108516 (Restrict `#[rustc_box]` to `Box::new` calls)
 - #108575 (Erase **all** regions when probing for associated types on ambiguity in astconv)
 - #108585 (Run compiler test suite in parallel on Fuchsia)
 - #108606 (Add test case for mismatched open/close delims)
 - #108609 (Highlight whole expression for E0599)

Failed merges:

r? `@ghost`
`@rustbot` modify labels: rollup
  • Loading branch information
bors committed Mar 2, 2023
2 parents 18caf88 + 832987b commit 7e966bc
Show file tree
Hide file tree
Showing 22 changed files with 252 additions and 64 deletions.
3 changes: 0 additions & 3 deletions compiler/rustc_ast_lowering/locales/en-US.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,6 @@ ast_lowering_misplaced_impl_trait =
ast_lowering_misplaced_assoc_ty_binding =
associated type bounds are only allowed in where clauses and function signatures, not in {$position}
ast_lowering_rustc_box_attribute_error =
#[rustc_box] requires precisely one argument and no other attributes are allowed
ast_lowering_underscore_expr_lhs_assign =
in expressions, `_` can only be used on the left-hand side of an assignment
.label = `_` not allowed here
Expand Down
7 changes: 0 additions & 7 deletions compiler/rustc_ast_lowering/src/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,13 +87,6 @@ pub struct MisplacedAssocTyBinding<'a> {
pub position: DiagnosticArgFromDisplay<'a>,
}

#[derive(Diagnostic, Clone, Copy)]
#[diag(ast_lowering_rustc_box_attribute_error)]
pub struct RustcBoxAttributeError {
#[primary_span]
pub span: Span,
}

#[derive(Diagnostic, Clone, Copy)]
#[diag(ast_lowering_underscore_expr_lhs_assign)]
pub struct UnderscoreExprLhsAssign {
Expand Down
12 changes: 2 additions & 10 deletions compiler/rustc_ast_lowering/src/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use super::errors::{
AsyncGeneratorsNotSupported, AsyncNonMoveClosureNotSupported, AwaitOnlyInAsyncFnAndBlocks,
BaseExpressionDoubleDot, ClosureCannotBeStatic, FunctionalRecordUpdateDestructuringAssignemnt,
GeneratorTooManyParameters, InclusiveRangeWithNoEnd, NotSupportedForLifetimeBinderAsyncClosure,
RustcBoxAttributeError, UnderscoreExprLhsAssign,
UnderscoreExprLhsAssign,
};
use super::ResolverAstLoweringExt;
use super::{ImplTraitContext, LoweringContext, ParamMode, ParenthesizedGenericArgs};
Expand Down Expand Up @@ -83,15 +83,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
}
ExprKind::Tup(elts) => hir::ExprKind::Tup(self.lower_exprs(elts)),
ExprKind::Call(f, args) => {
if e.attrs.get(0).map_or(false, |a| a.has_name(sym::rustc_box)) {
if let [inner] = &args[..] && e.attrs.len() == 1 {
let kind = hir::ExprKind::Box(self.lower_expr(&inner));
return hir::Expr { hir_id, kind, span: self.lower_span(e.span) };
} else {
let guar = self.tcx.sess.emit_err(RustcBoxAttributeError { span: e.span });
hir::ExprKind::Err(guar)
}
} else if let Some(legacy_args) = self.resolver.legacy_const_generic_args(f) {
if let Some(legacy_args) = self.resolver.legacy_const_generic_args(f) {
self.lower_legacy_const_generics((**f).clone(), args.clone(), &legacy_args)
} else {
let f = self.lower_expr(f);
Expand Down
6 changes: 4 additions & 2 deletions compiler/rustc_hir_analysis/src/astconv/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2399,8 +2399,10 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
infcx
.can_eq(
ty::ParamEnv::empty(),
tcx.erase_regions(impl_.self_ty()),
tcx.erase_regions(qself_ty),
impl_.self_ty(),
// Must fold past escaping bound vars too,
// since we have those at this point in astconv.
tcx.fold_regions(qself_ty, |_, _| tcx.lifetimes.re_erased),
)
})
&& tcx.impl_polarity(impl_def_id) != ty::ImplPolarity::Negative
Expand Down
3 changes: 3 additions & 0 deletions compiler/rustc_hir_typeck/src/method/suggest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
rcvr_ty.prefix_string(self.tcx),
ty_str_reported,
);
if tcx.sess.source_map().is_multiline(sugg_span) {
err.span_label(sugg_span.with_hi(span.lo()), "");
}
let ty_str = if short_ty_str.len() < ty_str.len() && ty_str.len() > 10 {
short_ty_str
} else {
Expand Down
6 changes: 6 additions & 0 deletions compiler/rustc_mir_build/locales/en-US.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -374,3 +374,9 @@ mir_build_suggest_let_else = you might want to use `let else` to handle the {$co
} matched
mir_build_suggest_attempted_int_lit = alternatively, you could prepend the pattern with an underscore to define a new named variable; identifiers cannot begin with digits
mir_build_rustc_box_attribute_error = `#[rustc_box]` attribute used incorrectly
.attributes = no other attributes may be applied
.not_box = `#[rustc_box]` may only be applied to a `Box::new()` call
.missing_box = `#[rustc_box]` requires the `owned_box` lang item
19 changes: 19 additions & 0 deletions compiler/rustc_mir_build/src/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -888,3 +888,22 @@ pub enum MiscPatternSuggestion {
start_span: Span,
},
}

#[derive(Diagnostic)]
#[diag(mir_build_rustc_box_attribute_error)]
pub struct RustcBoxAttributeError {
#[primary_span]
pub span: Span,
#[subdiagnostic]
pub reason: RustcBoxAttrReason,
}

#[derive(Subdiagnostic)]
pub enum RustcBoxAttrReason {
#[note(mir_build_attributes)]
Attributes,
#[note(mir_build_not_box)]
NotBoxNew,
#[note(mir_build_missing_box)]
MissingBox,
}
32 changes: 31 additions & 1 deletion compiler/rustc_mir_build/src/thir/cx/expr.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use crate::errors;
use crate::thir::cx::region::Scope;
use crate::thir::cx::Cx;
use crate::thir::util::UserAnnotatedTyHelpers;
Expand All @@ -18,7 +19,7 @@ use rustc_middle::ty::subst::InternalSubsts;
use rustc_middle::ty::{
self, AdtKind, InlineConstSubsts, InlineConstSubstsParts, ScalarInt, Ty, UpvarSubsts, UserType,
};
use rustc_span::Span;
use rustc_span::{sym, Span};
use rustc_target::abi::VariantIdx;

impl<'tcx> Cx<'tcx> {
Expand Down Expand Up @@ -262,6 +263,7 @@ impl<'tcx> Cx<'tcx> {
}
}

#[instrument(level = "debug", skip(self), ret)]
fn make_mirror_unadjusted(&mut self, expr: &'tcx hir::Expr<'tcx>) -> Expr<'tcx> {
let tcx = self.tcx;
let expr_ty = self.typeck_results().expr_ty(expr);
Expand Down Expand Up @@ -322,6 +324,34 @@ impl<'tcx> Cx<'tcx> {
fn_span: expr.span,
}
} else {
let attrs = tcx.hir().attrs(expr.hir_id);
if attrs.iter().any(|a| a.name_or_empty() == sym::rustc_box) {
if attrs.len() != 1 {
tcx.sess.emit_err(errors::RustcBoxAttributeError {
span: attrs[0].span,
reason: errors::RustcBoxAttrReason::Attributes,
});
} else if let Some(box_item) = tcx.lang_items().owned_box() {
if let hir::ExprKind::Path(hir::QPath::TypeRelative(ty, fn_path)) = fun.kind
&& let hir::TyKind::Path(hir::QPath::Resolved(_, path)) = ty.kind
&& path.res.opt_def_id().map_or(false, |did| did == box_item)
&& fn_path.ident.name == sym::new
&& let [value] = args
{
return Expr { temp_lifetime, ty: expr_ty, span: expr.span, kind: ExprKind::Box { value: self.mirror_expr(value) } }
} else {
tcx.sess.emit_err(errors::RustcBoxAttributeError {
span: expr.span,
reason: errors::RustcBoxAttrReason::NotBoxNew
});
}
} else {
tcx.sess.emit_err(errors::RustcBoxAttributeError {
span: attrs[0].span,
reason: errors::RustcBoxAttrReason::MissingBox,
});
}
}
let adt_data =
if let hir::ExprKind::Path(hir::QPath::Resolved(_, ref path)) = fun.kind {
// Tuple-like ADTs are represented as ExprKind::Call. We convert them here.
Expand Down
39 changes: 26 additions & 13 deletions src/ci/docker/scripts/fuchsia-test-runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

import argparse
from dataclasses import dataclass
import fcntl
import glob
import hashlib
import json
Expand Down Expand Up @@ -146,6 +147,9 @@ def host_arch_triple(self):
def zxdb_script_path(self):
return os.path.join(self.tmp_dir(), "zxdb_script")

def pm_lockfile_path(self):
return os.path.join(self.tmp_dir(), "pm.lock")

def log_info(self, msg):
print(msg)

Expand Down Expand Up @@ -460,6 +464,9 @@ def start(self):
stderr=self.subprocess_output(),
)

# Create lockfiles
open(self.pm_lockfile_path(), 'a').close()

# Write to file
self.write_to_file()

Expand Down Expand Up @@ -676,19 +683,25 @@ def log(msg):
log("Publishing package to repo...")

# Publish package to repo
subprocess.check_call(
[
self.tool_path("pm"),
"publish",
"-a",
"-repo",
self.repo_dir(),
"-f",
far_path,
],
stdout=log_file,
stderr=log_file,
)
with open(self.pm_lockfile_path(), 'w') as pm_lockfile:
fcntl.lockf(pm_lockfile.fileno(), fcntl.LOCK_EX)
subprocess.check_call(
[
self.tool_path("pm"),
"publish",
"-a",
"-repo",
self.repo_dir(),
"-f",
far_path,
],
stdout=log_file,
stderr=log_file,
)
# This lock should be released automatically when the pm
# lockfile is closed, but we'll be polite and unlock it now
# since the spec leaves some wiggle room.
fcntl.lockf(pm_lockfile.fileno(), fcntl.LOCK_UN)

log("Running ffx test...")

Expand Down
7 changes: 2 additions & 5 deletions src/doc/rustc/src/platform-support/fuchsia.md
Original file line number Diff line number Diff line change
Expand Up @@ -716,7 +716,7 @@ run the full `tests/ui` test suite:
--stage=2 \
test tests/ui \
--target x86_64-unknown-fuchsia \
--run=always --jobs 1 \
--run=always \
--test-args --target-rustcflags \
--test-args -Lnative=${SDK_PATH}/arch/{x64|arm64}/sysroot/lib \
--test-args --target-rustcflags \
Expand All @@ -728,9 +728,6 @@ run the full `tests/ui` test suite:
)
```

*Note: The test suite cannot be run in parallel at the moment, so `x.py`
must be run with `--jobs 1` to ensure only one test runs at a time.*

By default, `x.py` compiles test binaries with `panic=unwind`. If you built your
Rust toolchain with `-Cpanic=abort`, you need to tell `x.py` to compile test
binaries with `panic=abort` as well:
Expand Down Expand Up @@ -907,7 +904,7 @@ through our `x.py` invocation. The full invocation is:
--stage=2 \
test tests/${TEST} \
--target x86_64-unknown-fuchsia \
--run=always --jobs 1 \
--run=always \
--test-args --target-rustcflags \
--test-args -Lnative=${SDK_PATH}/arch/{x64|arm64}/sysroot/lib \
--test-args --target-rustcflags \
Expand Down
13 changes: 5 additions & 8 deletions src/tools/clippy/clippy_utils/src/higher.rs
Original file line number Diff line number Diff line change
Expand Up @@ -287,15 +287,12 @@ impl<'a> VecArgs<'a> {
Some(VecArgs::Repeat(&args[0], &args[1]))
} else if match_def_path(cx, fun_def_id, &paths::SLICE_INTO_VEC) && args.len() == 1 {
// `vec![a, b, c]` case
if_chain! {
if let hir::ExprKind::Box(boxed) = args[0].kind;
if let hir::ExprKind::Array(args) = boxed.kind;
then {
return Some(VecArgs::Vec(args));
}
if let hir::ExprKind::Call(_, [arg]) = &args[0].kind
&& let hir::ExprKind::Array(args) = arg.kind {
Some(VecArgs::Vec(args))
} else {
None
}

None
} else if match_def_path(cx, fun_def_id, &paths::VEC_NEW) && args.is_empty() {
Some(VecArgs::Vec(&[]))
} else {
Expand Down
13 changes: 7 additions & 6 deletions src/tools/compiletest/src/runtest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1432,12 +1432,13 @@ impl<'test> TestCx<'test> {
expect_help: bool,
expect_note: bool,
) -> bool {
match actual_error.kind {
Some(ErrorKind::Help) => expect_help,
Some(ErrorKind::Note) => expect_note,
Some(ErrorKind::Error) | Some(ErrorKind::Warning) => true,
Some(ErrorKind::Suggestion) | None => false,
}
!actual_error.msg.is_empty()
&& match actual_error.kind {
Some(ErrorKind::Help) => expect_help,
Some(ErrorKind::Note) => expect_note,
Some(ErrorKind::Error) | Some(ErrorKind::Warning) => true,
Some(ErrorKind::Suggestion) | None => false,
}
}

fn should_emit_metadata(&self, pm: Option<PassMode>) -> Emit {
Expand Down
18 changes: 18 additions & 0 deletions tests/ui/attributes/rustc-box.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#![feature(rustc_attrs, stmt_expr_attributes)]

fn foo(_: u32, _: u32) {}
fn bar(_: u32) {}

fn main() {
#[rustc_box]
Box::new(1); // OK
#[rustc_box]
Box::pin(1); //~ ERROR `#[rustc_box]` attribute used incorrectly
#[rustc_box]
foo(1, 1); //~ ERROR `#[rustc_box]` attribute used incorrectly
#[rustc_box]
bar(1); //~ ERROR `#[rustc_box]` attribute used incorrectly
#[rustc_box] //~ ERROR `#[rustc_box]` attribute used incorrectly
#[rustfmt::skip]
Box::new(1);
}
34 changes: 34 additions & 0 deletions tests/ui/attributes/rustc-box.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
error: `#[rustc_box]` attribute used incorrectly
--> $DIR/rustc-box.rs:10:5
|
LL | Box::pin(1);
| ^^^^^^^^^^^
|
= note: `#[rustc_box]` may only be applied to a `Box::new()` call

error: `#[rustc_box]` attribute used incorrectly
--> $DIR/rustc-box.rs:12:5
|
LL | foo(1, 1);
| ^^^^^^^^^
|
= note: `#[rustc_box]` may only be applied to a `Box::new()` call

error: `#[rustc_box]` attribute used incorrectly
--> $DIR/rustc-box.rs:14:5
|
LL | bar(1);
| ^^^^^^
|
= note: `#[rustc_box]` may only be applied to a `Box::new()` call

error: `#[rustc_box]` attribute used incorrectly
--> $DIR/rustc-box.rs:15:5
|
LL | #[rustc_box]
| ^^^^^^^^^^^^
|
= note: no other attributes may be applied

error: aborting due to 4 previous errors

17 changes: 10 additions & 7 deletions tests/ui/methods/method-call-err-msg.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -48,14 +48,17 @@ LL | .two(0, /* isize */);
error[E0599]: `Foo` is not an iterator
--> $DIR/method-call-err-msg.rs:19:7
|
LL | pub struct Foo;
| --------------
| |
| method `take` not found for this struct
| doesn't satisfy `Foo: Iterator`
LL | pub struct Foo;
| --------------
| |
| method `take` not found for this struct
| doesn't satisfy `Foo: Iterator`
...
LL | .take()
| ^^^^ `Foo` is not an iterator
LL | / y.zero()
LL | | .take()
| | -^^^^ `Foo` is not an iterator
| |______|
|
|
= note: the following trait bounds were not satisfied:
`Foo: Iterator`
Expand Down
6 changes: 6 additions & 0 deletions tests/ui/parser/issues/issue-104367.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#[derive(A)]
struct S {
d: [u32; {
#![cfg] {
#![w,) //~ ERROR mismatched closing delimiter
//~ ERROR this file contains an unclosed delimiter
Loading

0 comments on commit 7e966bc

Please sign in to comment.