Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
a1df132
Deduplicate some error messages
Jul 17, 2019
43a2cbd
lifetime elision: add conforming-to-fn tests.
Centril Aug 8, 2019
a694782
lifetime elision: add non-conforming-to-fn tests.
Centril Aug 8, 2019
d9294a2
lifetime elision: document conformance of 'async fn' to 'fn'.
Centril Aug 8, 2019
f395787
Add async version of self_lifetime.rs test.
Centril Aug 8, 2019
5ce8f7a
Add async versions of arbitrary_self_types_pin_lifetime tests.
Centril Aug 8, 2019
2644205
Remove unneeded comment in src/libcore/hash/mod.rs
sd234678 Aug 9, 2019
51ce121
Implement Clone, Display for ascii::EscapeDefault
Aug 9, 2019
fa7a40c
Document From trait for BinaryHeap
Observer42 Aug 12, 2019
eb832b2
ci: move mirrors to their standalone bucket
pietroalbini Aug 12, 2019
91af5c2
Bring back suggestion for splitting `<-` into `< -`
iluuu1994 Aug 11, 2019
fecf305
DiagnosticBuilder docs
RalfJung Aug 12, 2019
e30480c
Apply suggestions from code review
Aug 12, 2019
34dcca2
syntax: account for CVarArgs being in the argument list.
eddyb Aug 11, 2019
861d1bb
typeck: Prohibit RPIT types that inherit lifetimes
davidtwco Jul 21, 2019
18e5453
use `ParamName` to track in-scope lifetimes instead of Ident
nikomatsakis Aug 12, 2019
03e7b96
revamp how we handle elision in async fn
nikomatsakis Aug 12, 2019
cbe8518
use `modern` everywhere
nikomatsakis Aug 12, 2019
a02a171
add edition to regression test
nikomatsakis Aug 12, 2019
948739f
revamp comment
nikomatsakis Aug 12, 2019
ad214fe
fix README.md
nikomatsakis Aug 12, 2019
e4756e6
clear in-scope lifetimes for nested items in HIR lowering
nikomatsakis Aug 13, 2019
d7c7c52
bless tests
nikomatsakis Aug 13, 2019
d824edf
Do not ICE when synthesizing spans falling inside unicode chars
estebank Aug 13, 2019
686553d
ci: add a check for clock drift
pietroalbini Aug 13, 2019
84cab92
Provide map_ok and map_err method for Poll<Option<Result<T, E>>>
95th Aug 13, 2019
18d69c8
bless tests with compare-mode=nll
nikomatsakis Aug 13, 2019
105b3a0
review comment: remove unecessary error in test
estebank Aug 13, 2019
c259d1c
RELEASES.md: ? is one of three Kleene operators
andersk Aug 13, 2019
ea1a9a0
Fix typo in error message.
ehuss Aug 13, 2019
84e202e
review comments
estebank Aug 13, 2019
643ddfa
Apply Centril's suggestion
ehuss Aug 13, 2019
dda33ca
Rollup merge of #62760 - chansuke:dedupe-error-messages, r=zackmdavis
Centril Aug 14, 2019
3f18112
Rollup merge of #62849 - davidtwco:prohibit-inheriting-lifetimes, r=n…
Centril Aug 14, 2019
3d5387d
Rollup merge of #63383 - Centril:async-lifetime-elision-tests, r=niko…
Centril Aug 14, 2019
b5df4bb
Rollup merge of #63421 - clarfon:escape_default, r=dtolnay
Centril Aug 14, 2019
76bd7d6
Rollup merge of #63459 - eddyb:issue-63430, r=petrochenkov
Centril Aug 14, 2019
c824839
Rollup merge of #63475 - iluuu1994:issue-62632, r=Centril
Centril Aug 14, 2019
6092519
Rollup merge of #63485 - pietroalbini:new-mirror-bucket, r=alexcrichton
Centril Aug 14, 2019
4e1b865
Rollup merge of #63486 - Observer42:document-from-trait-in-binaryheap…
Centril Aug 14, 2019
f47226e
Rollup merge of #63488 - RalfJung:diagnostic-docs, r=zackmdavis
Centril Aug 14, 2019
0098d0c
Rollup merge of #63493 - sd234678:remove-unneeded-comment-from-src/li…
Centril Aug 14, 2019
4134241
Rollup merge of #63499 - nikomatsakis:issuee-63388-async-fn-elision-s…
Centril Aug 14, 2019
5741e29
Rollup merge of #63501 - nikomatsakis:issue-63500-async-anon-impl-lif…
Centril Aug 14, 2019
43f4990
Rollup merge of #63508 - estebank:compromice, r=petrochenkov
Centril Aug 14, 2019
051598b
Rollup merge of #63511 - pietroalbini:pa-ci-date, r=Mark-Simulacrum
Centril Aug 14, 2019
d5dd097
Rollup merge of #63512 - 95th:master, r=cramertj
Centril Aug 14, 2019
92e5508
Rollup merge of #63529 - andersk:release-notes-kleene, r=Centril
Centril Aug 14, 2019
a8bb375
Rollup merge of #63530 - ehuss:typo-statemement, r=centril
Centril Aug 14, 2019
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
84 changes: 83 additions & 1 deletion src/librustc_typeck/check/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1325,12 +1325,94 @@ fn check_union(tcx: TyCtxt<'_>, id: hir::HirId, span: Span) {
check_packed(tcx, span, def_id);
}

/// Checks that an opaque type does not contain cycles and does not use `Self` or `T::Foo`
/// projections that would result in "inheriting lifetimes".
fn check_opaque<'tcx>(
tcx: TyCtxt<'tcx>,
def_id: DefId,
substs: SubstsRef<'tcx>,
span: Span,
origin: &hir::OpaqueTyOrigin
origin: &hir::OpaqueTyOrigin,
) {
check_opaque_for_inheriting_lifetimes(tcx, def_id, span);
check_opaque_for_cycles(tcx, def_id, substs, span, origin);
}

/// Checks that an opaque type does not use `Self` or `T::Foo` projections that would result
/// in "inheriting lifetimes".
fn check_opaque_for_inheriting_lifetimes(
tcx: TyCtxt<'tcx>,
def_id: DefId,
span: Span,
) {
let item = tcx.hir().expect_item(
tcx.hir().as_local_hir_id(def_id).expect("opaque type is not local"));
debug!("check_opaque_for_inheriting_lifetimes: def_id={:?} span={:?} item={:?}",
def_id, span, item);

#[derive(Debug)]
struct ProhibitOpaqueVisitor<'tcx> {
opaque_identity_ty: Ty<'tcx>,
generics: &'tcx ty::Generics,
};

impl<'tcx> ty::fold::TypeVisitor<'tcx> for ProhibitOpaqueVisitor<'tcx> {
fn visit_ty(&mut self, t: Ty<'tcx>) -> bool {
debug!("check_opaque_for_inheriting_lifetimes: (visit_ty) t={:?}", t);
if t == self.opaque_identity_ty { false } else { t.super_visit_with(self) }
}

fn visit_region(&mut self, r: ty::Region<'tcx>) -> bool {
debug!("check_opaque_for_inheriting_lifetimes: (visit_region) r={:?}", r);
if let RegionKind::ReEarlyBound(ty::EarlyBoundRegion { index, .. }) = r {
return *index < self.generics.parent_count as u32;
}

r.super_visit_with(self)
}
}

let prohibit_opaque = match item.node {
ItemKind::OpaqueTy(hir::OpaqueTy { origin: hir::OpaqueTyOrigin::AsyncFn, .. }) |
ItemKind::OpaqueTy(hir::OpaqueTy { origin: hir::OpaqueTyOrigin::FnReturn, .. }) => {
let mut visitor = ProhibitOpaqueVisitor {
opaque_identity_ty: tcx.mk_opaque(
def_id, InternalSubsts::identity_for_item(tcx, def_id)),
generics: tcx.generics_of(def_id),
};
debug!("check_opaque_for_inheriting_lifetimes: visitor={:?}", visitor);

tcx.predicates_of(def_id).predicates.iter().any(
|(predicate, _)| predicate.visit_with(&mut visitor))
},
_ => false,
};

debug!("check_opaque_for_inheriting_lifetimes: prohibit_opaque={:?}", prohibit_opaque);
if prohibit_opaque {
let is_async = match item.node {
ItemKind::OpaqueTy(hir::OpaqueTy { origin, .. }) => match origin {
hir::OpaqueTyOrigin::AsyncFn => true,
_ => false,
},
_ => unreachable!(),
};

tcx.sess.span_err(span, &format!(
"`{}` return type cannot contain a projection or `Self` that references lifetimes from \
a parent scope",
if is_async { "async fn" } else { "impl Trait" },
));
}
}

/// Checks that an opaque type does not contain cycles.
fn check_opaque_for_cycles<'tcx>(
tcx: TyCtxt<'tcx>,
def_id: DefId,
substs: SubstsRef<'tcx>,
span: Span,
origin: &hir::OpaqueTyOrigin,
) {
if let Err(partially_expanded_type) = tcx.try_expand_impl_trait_type(def_id, substs) {
if let hir::OpaqueTyOrigin::AsyncFn = origin {
Expand Down
28 changes: 28 additions & 0 deletions src/test/ui/async-await/issue-61949-self-return-type.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// ignore-tidy-linelength
// edition:2018
#![feature(async_await)]

// This test checks that `Self` is prohibited as a return type. See #61949 for context.

pub struct Foo<'a> {
pub bar: &'a i32,
}

impl<'a> Foo<'a> {
pub async fn new(_bar: &'a i32) -> Self {
//~^ ERROR `async fn` return type cannot contain a projection or `Self` that references lifetimes from a parent scope
Foo {
bar: &22
}
}
}

async fn foo() {
let x = {
let bar = 22;
Foo::new(&bar).await
};
drop(x);
}

fn main() { }
8 changes: 8 additions & 0 deletions src/test/ui/async-await/issue-61949-self-return-type.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
error: `async fn` return type cannot contain a projection or `Self` that references lifetimes from a parent scope
--> $DIR/issue-61949-self-return-type.rs:12:40
|
LL | pub async fn new(_bar: &'a i32) -> Self {
| ^^^^

error: aborting due to previous error

4 changes: 3 additions & 1 deletion src/test/ui/impl-trait/bound-normalization-fail.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// compile-fail
// ignore-tidy-linelength
// edition:2018

#![feature(async_await)]
Expand Down Expand Up @@ -44,7 +45,8 @@ mod lifetimes {

/// Missing bound constraining `Assoc`, `T::Assoc` can't be normalized further.
fn foo2_fail<'a, T: Trait<'a>>() -> impl FooLike<Output=T::Assoc> {
//~^ ERROR: type mismatch
//~^ ERROR: type mismatch
//~^^ ERROR `impl Trait` return type cannot contain a projection or `Self` that references lifetimes from a parent scope
Foo(())
}
}
Expand Down
14 changes: 10 additions & 4 deletions src/test/ui/impl-trait/bound-normalization-fail.stderr
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
warning: the feature `impl_trait_in_bindings` is incomplete and may cause the compiler to crash
--> $DIR/bound-normalization-fail.rs:5:12
--> $DIR/bound-normalization-fail.rs:6:12
|
LL | #![feature(impl_trait_in_bindings)]
| ^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(incomplete_features)]` on by default

error[E0271]: type mismatch resolving `<Foo<()> as FooLike>::Output == <T as impl_trait::Trait>::Assoc`
--> $DIR/bound-normalization-fail.rs:29:32
--> $DIR/bound-normalization-fail.rs:30:32
|
LL | fn foo_fail<T: Trait>() -> impl FooLike<Output=T::Assoc> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected (), found associated type
Expand All @@ -16,8 +16,14 @@ LL | fn foo_fail<T: Trait>() -> impl FooLike<Output=T::Assoc> {
found type `<T as impl_trait::Trait>::Assoc`
= note: the return type of a function must have a statically known size

error: `impl Trait` return type cannot contain a projection or `Self` that references lifetimes from a parent scope
--> $DIR/bound-normalization-fail.rs:47:41
|
LL | fn foo2_fail<'a, T: Trait<'a>>() -> impl FooLike<Output=T::Assoc> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0271]: type mismatch resolving `<Foo<()> as FooLike>::Output == <T as lifetimes::Trait<'static>>::Assoc`
--> $DIR/bound-normalization-fail.rs:46:41
--> $DIR/bound-normalization-fail.rs:47:41
|
LL | fn foo2_fail<'a, T: Trait<'a>>() -> impl FooLike<Output=T::Assoc> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected (), found associated type
Expand All @@ -26,6 +32,6 @@ LL | fn foo2_fail<'a, T: Trait<'a>>() -> impl FooLike<Output=T::Assoc> {
found type `<T as lifetimes::Trait<'static>>::Assoc`
= note: the return type of a function must have a statically known size

error: aborting due to 2 previous errors
error: aborting due to 3 previous errors

For more information about this error, try `rustc --explain E0271`.