Skip to content

Commit 4d1e502

Browse files
compiler-errorscuviper
authored andcommitted
Revert "Rollup merge of #136274 - compiler-errors:sized-wf, r=lcnr"
This reverts commit a8ecb79, reversing changes made to 40c4e05. (cherry picked from commit 9ea587e)
1 parent ad393e3 commit 4d1e502

File tree

61 files changed

+430
-521
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+430
-521
lines changed

compiler/rustc_hir_analysis/src/check/wfcheck.rs

+2-33
Original file line numberDiff line numberDiff line change
@@ -1110,7 +1110,6 @@ fn check_associated_item(
11101110
let ty = tcx.type_of(item.def_id).instantiate_identity();
11111111
let ty = wfcx.normalize(span, Some(WellFormedLoc::Ty(item_id)), ty);
11121112
wfcx.register_wf_obligation(span, loc, ty.into());
1113-
check_sized_if_body(wfcx, item.def_id.expect_local(), ty, Some(span));
11141113
Ok(())
11151114
}
11161115
ty::AssocKind::Fn => {
@@ -1235,7 +1234,7 @@ fn check_type_defn<'tcx>(
12351234
),
12361235
wfcx.param_env,
12371236
ty,
1238-
tcx.require_lang_item(LangItem::Sized, Some(hir_ty.span)),
1237+
tcx.require_lang_item(LangItem::Sized, None),
12391238
);
12401239
}
12411240

@@ -1360,7 +1359,7 @@ fn check_item_type(
13601359
),
13611360
wfcx.param_env,
13621361
item_ty,
1363-
tcx.require_lang_item(LangItem::Sized, Some(ty_span)),
1362+
tcx.require_lang_item(LangItem::Sized, None),
13641363
);
13651364
}
13661365

@@ -1690,36 +1689,6 @@ fn check_fn_or_method<'tcx>(
16901689
);
16911690
}
16921691
}
1693-
1694-
// If the function has a body, additionally require that the return type is sized.
1695-
check_sized_if_body(
1696-
wfcx,
1697-
def_id,
1698-
sig.output(),
1699-
match hir_decl.output {
1700-
hir::FnRetTy::Return(ty) => Some(ty.span),
1701-
hir::FnRetTy::DefaultReturn(_) => None,
1702-
},
1703-
);
1704-
}
1705-
1706-
fn check_sized_if_body<'tcx>(
1707-
wfcx: &WfCheckingCtxt<'_, 'tcx>,
1708-
def_id: LocalDefId,
1709-
ty: Ty<'tcx>,
1710-
maybe_span: Option<Span>,
1711-
) {
1712-
let tcx = wfcx.tcx();
1713-
if let Some(body) = tcx.hir().maybe_body_owned_by(def_id) {
1714-
let span = maybe_span.unwrap_or(body.value.span);
1715-
1716-
wfcx.register_bound(
1717-
ObligationCause::new(span, def_id, traits::ObligationCauseCode::SizedReturnType),
1718-
wfcx.param_env,
1719-
ty,
1720-
tcx.require_lang_item(LangItem::Sized, Some(span)),
1721-
);
1722-
}
17231692
}
17241693

17251694
/// The `arbitrary_self_types_pointers` feature implies `arbitrary_self_types`.

compiler/rustc_hir_typeck/src/check.rs

+12-7
Original file line numberDiff line numberDiff line change
@@ -117,17 +117,22 @@ pub(super) fn check_fn<'a, 'tcx>(
117117

118118
fcx.typeck_results.borrow_mut().liberated_fn_sigs_mut().insert(fn_id, fn_sig);
119119

120-
// We checked the root's ret ty during wfcheck, but not the child.
121-
if fcx.tcx.is_typeck_child(fn_def_id.to_def_id()) {
122-
let return_or_body_span = match decl.output {
123-
hir::FnRetTy::DefaultReturn(_) => body.value.span,
124-
hir::FnRetTy::Return(ty) => ty.span,
125-
};
120+
let return_or_body_span = match decl.output {
121+
hir::FnRetTy::DefaultReturn(_) => body.value.span,
122+
hir::FnRetTy::Return(ty) => ty.span,
123+
};
126124

125+
fcx.require_type_is_sized(
126+
declared_ret_ty,
127+
return_or_body_span,
128+
ObligationCauseCode::SizedReturnType,
129+
);
130+
// We checked the root's signature during wfcheck, but not the child.
131+
if fcx.tcx.is_typeck_child(fn_def_id.to_def_id()) {
127132
fcx.require_type_is_sized(
128133
declared_ret_ty,
129134
return_or_body_span,
130-
ObligationCauseCode::SizedReturnType,
135+
ObligationCauseCode::WellFormed(None),
131136
);
132137
}
133138

compiler/rustc_hir_typeck/src/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,8 @@ fn typeck_with_inspect<'tcx>(
186186
let wf_code = ObligationCauseCode::WellFormed(Some(WellFormedLoc::Ty(def_id)));
187187
fcx.register_wf_obligation(expected_type.into(), body.value.span, wf_code);
188188

189+
fcx.require_type_is_sized(expected_type, body.value.span, ObligationCauseCode::ConstSized);
190+
189191
// Gather locals in statics (because of block expressions).
190192
GatherLocalsVisitor::new(&fcx).visit_body(body);
191193

compiler/rustc_trait_selection/src/error_reporting/traits/fulfillment_errors.rs

+5
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,7 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
707707
};
708708

709709
self.note_obligation_cause(&mut err, &obligation);
710+
self.point_at_returns_when_relevant(&mut err, &obligation);
710711
err.emit()
711712
}
712713
}
@@ -809,6 +810,7 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
809810
"Async",
810811
);
811812
self.note_obligation_cause(&mut err, &obligation);
813+
self.point_at_returns_when_relevant(&mut err, &obligation);
812814
return Some(err.emit());
813815
}
814816
}
@@ -854,6 +856,7 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
854856
"",
855857
);
856858
self.note_obligation_cause(&mut err, &obligation);
859+
self.point_at_returns_when_relevant(&mut err, &obligation);
857860
return Some(err.emit());
858861
}
859862

@@ -869,6 +872,7 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
869872
kind: expected_kind.as_str(),
870873
});
871874
self.note_obligation_cause(&mut err, &obligation);
875+
self.point_at_returns_when_relevant(&mut err, &obligation);
872876
return Some(err.emit());
873877
}
874878
}
@@ -2829,6 +2833,7 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
28292833
err.span_note(self.tcx.def_span(def_id), "opaque type is declared here");
28302834

28312835
self.note_obligation_cause(&mut err, &obligation);
2836+
self.point_at_returns_when_relevant(&mut err, &obligation);
28322837
self.dcx().try_steal_replace_and_emit_err(self.tcx.def_span(def_id), StashKey::Cycle, err)
28332838
}
28342839

compiler/rustc_trait_selection/src/error_reporting/traits/overflow.rs

+1
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
185185
suggest_increasing_limit,
186186
);
187187
self.note_obligation_cause(&mut err, &obligation);
188+
self.point_at_returns_when_relevant(&mut err, &obligation);
188189
err.emit()
189190
}
190191
}

compiler/rustc_trait_selection/src/error_reporting/traits/suggestions.rs

+56-9
Original file line numberDiff line numberDiff line change
@@ -1765,7 +1765,7 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
17651765
};
17661766

17671767
err.code(E0746);
1768-
err.primary_message("return type cannot be a trait object without pointer indirection");
1768+
err.primary_message("return type cannot have an unboxed trait object");
17691769
err.children.clear();
17701770

17711771
let span = obligation.cause.span;
@@ -1781,13 +1781,25 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
17811781
} else {
17821782
("dyn ", span.shrink_to_lo())
17831783
};
1784-
1785-
err.span_suggestion_verbose(
1786-
impl_span,
1787-
"consider returning an `impl Trait` instead of a `dyn Trait`",
1788-
"impl ",
1789-
Applicability::MaybeIncorrect,
1790-
);
1784+
let alternatively = if visitor
1785+
.returns
1786+
.iter()
1787+
.map(|expr| self.typeck_results.as_ref().unwrap().expr_ty_adjusted_opt(expr))
1788+
.collect::<FxHashSet<_>>()
1789+
.len()
1790+
<= 1
1791+
{
1792+
err.span_suggestion_verbose(
1793+
impl_span,
1794+
"consider returning an `impl Trait` instead of a `dyn Trait`",
1795+
"impl ",
1796+
Applicability::MaybeIncorrect,
1797+
);
1798+
"alternatively, "
1799+
} else {
1800+
err.help("if there were a single returned type, you could use `impl Trait` instead");
1801+
""
1802+
};
17911803

17921804
let mut sugg = vec![
17931805
(span.shrink_to_lo(), format!("Box<{pre}")),
@@ -1819,7 +1831,7 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
18191831

18201832
err.multipart_suggestion(
18211833
format!(
1822-
"alternatively, box the return type, and wrap all of the returned values in \
1834+
"{alternatively}box the return type, and wrap all of the returned values in \
18231835
`Box::new`",
18241836
),
18251837
sugg,
@@ -1829,6 +1841,41 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
18291841
true
18301842
}
18311843

1844+
pub(super) fn point_at_returns_when_relevant(
1845+
&self,
1846+
err: &mut Diag<'_>,
1847+
obligation: &PredicateObligation<'tcx>,
1848+
) {
1849+
match obligation.cause.code().peel_derives() {
1850+
ObligationCauseCode::SizedReturnType => {}
1851+
_ => return,
1852+
}
1853+
1854+
let hir = self.tcx.hir();
1855+
let node = self.tcx.hir_node_by_def_id(obligation.cause.body_id);
1856+
if let hir::Node::Item(hir::Item {
1857+
kind: hir::ItemKind::Fn { body: body_id, .. }, ..
1858+
}) = node
1859+
{
1860+
let body = hir.body(*body_id);
1861+
// Point at all the `return`s in the function as they have failed trait bounds.
1862+
let mut visitor = ReturnsVisitor::default();
1863+
visitor.visit_body(body);
1864+
let typeck_results = self.typeck_results.as_ref().unwrap();
1865+
for expr in &visitor.returns {
1866+
if let Some(returned_ty) = typeck_results.node_type_opt(expr.hir_id) {
1867+
let ty = self.resolve_vars_if_possible(returned_ty);
1868+
if ty.references_error() {
1869+
// don't print out the [type error] here
1870+
err.downgrade_to_delayed_bug();
1871+
} else {
1872+
err.span_label(expr.span, format!("this returned value is of type `{ty}`"));
1873+
}
1874+
}
1875+
}
1876+
}
1877+
}
1878+
18321879
pub(super) fn report_closure_arg_mismatch(
18331880
&self,
18341881
span: Span,

tests/crashes/134355.rs

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
//@ known-bug: #134355
2+
3+
//@compile-flags: --crate-type=lib
4+
fn digit() -> str {
5+
return { i32::MIN };
6+
}

tests/rustdoc-json/primitives/primitive_impls.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
1-
#![feature(no_core, lang_items)]
1+
#![feature(no_core)]
22
#![feature(rustc_attrs)]
33
#![feature(rustdoc_internals)]
44
#![no_core]
55
#![rustc_coherence_is_core]
66

77
//@ set impl_i32 = "$.index[*][?(@.docs=='Only core can do this')].id"
88

9-
#[lang = "sized"]
10-
trait Sized {}
11-
129
/// Only core can do this
1310
impl i32 {
1411
//@ set identity = "$.index[*][?(@.docs=='Do Nothing')].id"

tests/rustdoc-ui/custom_code_classes_in_docs-warning3.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,9 @@
22
// feature.
33

44
#![deny(warnings)]
5-
#![feature(no_core, lang_items)]
5+
#![feature(no_core)]
66
#![no_core]
77

8-
#[lang = "sized"]
9-
trait Sized {}
10-
118
/// ```{class="}
129
/// main;
1310
/// ```

tests/rustdoc-ui/custom_code_classes_in_docs-warning3.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
error: unclosed quote string `"`
2-
--> $DIR/custom_code_classes_in_docs-warning3.rs:11:1
2+
--> $DIR/custom_code_classes_in_docs-warning3.rs:8:1
33
|
44
LL | / /// ```{class="}
55
LL | | /// main;
@@ -17,7 +17,7 @@ LL | #![deny(warnings)]
1717
= note: `#[deny(rustdoc::invalid_codeblock_attributes)]` implied by `#[deny(warnings)]`
1818

1919
error: unclosed quote string `"`
20-
--> $DIR/custom_code_classes_in_docs-warning3.rs:11:1
20+
--> $DIR/custom_code_classes_in_docs-warning3.rs:8:1
2121
|
2222
LL | / /// ```{class="}
2323
LL | | /// main;

tests/rustdoc/cfg_doc_reexport.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
#![feature(doc_cfg)]
2-
#![feature(no_core, lang_items)]
2+
#![feature(no_core)]
33

44
#![crate_name = "foo"]
55
#![no_core]
66

7-
#[lang = "sized"]
8-
trait Sized {}
9-
107
//@ has 'foo/index.html'
118
//@ has - '//dt/*[@class="stab portability"]' 'foobar'
129
//@ has - '//dt/*[@class="stab portability"]' 'bar'

tests/rustdoc/cross-crate-primitive-doc.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,9 @@
22
//@ compile-flags: --extern-html-root-url=primitive_doc=../ -Z unstable-options
33
//@ only-linux
44

5-
#![feature(no_core, lang_items)]
5+
#![feature(no_core)]
66
#![no_core]
77

8-
#[lang = "sized"]
9-
trait Sized {}
10-
118
extern crate primitive_doc;
129

1310
//@ has 'cross_crate_primitive_doc/fn.foo.html' '//a[@href="../primitive_doc/primitive.usize.html"]' 'usize'

tests/rustdoc/intra-doc/no-doc-primitive.rs

-5
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,8 @@
66
#![rustc_coherence_is_core]
77
#![crate_type = "rlib"]
88

9-
109
//@ has no_doc_primitive/index.html
1110
//! A [`char`] and its [`char::len_utf8`].
12-
13-
#[lang = "sized"]
14-
trait Sized {}
15-
1611
impl char {
1712
pub fn len_utf8(self) -> usize {
1813
42

tests/rustdoc/reexport-trait-from-hidden-111064-2.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
// Regression test for <https://github.com/rust-lang/rust/issues/111064>.
2-
#![feature(no_core, lang_items)]
2+
#![feature(no_core)]
33
#![no_core]
44
#![crate_name = "foo"]
55

6-
#[lang = "sized"]
7-
trait Sized {}
8-
96
//@ files "foo" "['sidebar-items.js', 'all.html', 'hidden', 'index.html', 'struct.Bar.html', \
107
// 'visible']"
118
//@ files "foo/hidden" "['inner']"

tests/rustdoc/safe-intrinsic.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
#![feature(intrinsics)]
2-
#![feature(no_core, lang_items)]
2+
#![feature(no_core)]
33
#![feature(rustc_attrs)]
44

55
#![no_core]
66
#![crate_name = "foo"]
77

8-
#[lang = "sized"]
9-
trait Sized {}
10-
118
//@ has 'foo/fn.abort.html'
129
//@ has - '//pre[@class="rust item-decl"]' 'pub fn abort() -> !'
1310
#[rustc_intrinsic]

tests/ui/associated-consts/issue-58022.stderr

+9-9
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
error[E0790]: cannot refer to the associated constant on trait without specifying the corresponding `impl` type
2+
--> $DIR/issue-58022.rs:4:25
3+
|
4+
LL | const SIZE: usize;
5+
| ------------------ `Foo::SIZE` defined here
6+
LL |
7+
LL | fn new(slice: &[u8; Foo::SIZE]) -> Self;
8+
| ^^^^^^^^^ cannot refer to the associated constant of trait
9+
110
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
211
--> $DIR/issue-58022.rs:13:41
312
|
@@ -12,15 +21,6 @@ LL | pub struct Bar<T: ?Sized>(T);
1221
| ^^^
1322
= note: the return type of a function must have a statically known size
1423

15-
error[E0790]: cannot refer to the associated constant on trait without specifying the corresponding `impl` type
16-
--> $DIR/issue-58022.rs:4:25
17-
|
18-
LL | const SIZE: usize;
19-
| ------------------ `Foo::SIZE` defined here
20-
LL |
21-
LL | fn new(slice: &[u8; Foo::SIZE]) -> Self;
22-
| ^^^^^^^^^ cannot refer to the associated constant of trait
23-
2424
error[E0423]: expected function, tuple struct or tuple variant, found trait `Foo`
2525
--> $DIR/issue-58022.rs:15:9
2626
|

0 commit comments

Comments
 (0)