Skip to content

Commit

Permalink
add FIXME related to ref x bindings
Browse files Browse the repository at this point in the history
  • Loading branch information
nikomatsakis committed Sep 10, 2018
1 parent 2b6f966 commit df37678
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 14 deletions.
15 changes: 14 additions & 1 deletion src/librustc_mir/build/matches/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -475,7 +475,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
pub fn visit_bindings(
&mut self,
pattern: &Pattern<'tcx>,
pattern_user_ty: Option<CanonicalTy<'tcx>>,
mut pattern_user_ty: Option<CanonicalTy<'tcx>>,
f: &mut impl FnMut(
&mut Self,
Mutability,
Expand All @@ -497,6 +497,19 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
ref subpattern,
..
} => {
match mode {
BindingMode::ByValue => { }
BindingMode::ByRef(..) => {
// If this is a `ref` binding (e.g., `let ref
// x: T = ..`), then the type of `x` is not
// `T` but rather `&T`, so ignore
// `pattern_user_ty` for now.
//
// FIXME(#47184): extract or handle `pattern_user_ty` somehow
pattern_user_ty = None;
}
}

f(self, mutability, name, mode, var, pattern.span, ty, pattern_user_ty);
if let Some(subpattern) = subpattern.as_ref() {
self.visit_bindings(subpattern, pattern_user_ty, f);
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/nll/user-annotations/patterns.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ fn ref_with_ascribed_static_type() -> u32 {
// Check the behavior in some wacky cases.
let x = 22;
let y = &x; //~ ERROR
let ref z: &'static u32 = y; //~ ERROR
let ref z: &'static u32 = y;
**z
}

Expand Down
13 changes: 1 addition & 12 deletions src/test/ui/nll/user-annotations/patterns.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,6 @@ LL | }
|
= note: borrowed value must be valid for the static lifetime...

error[E0597]: `y` does not live long enough
--> $DIR/patterns.rs:23:9
|
LL | let ref z: &'static u32 = y; //~ ERROR
| ^^^^^ borrowed value does not live long enough
LL | **z
LL | }
| - `y` dropped here while still borrowed
|
= note: borrowed value must be valid for the static lifetime...

error[E0597]: `x` does not live long enough
--> $DIR/patterns.rs:46:27
|
Expand Down Expand Up @@ -149,6 +138,6 @@ LL | fn a_to_static_then_static<'a>(x: &'a u32) -> &'static u32 {
LL | let (y, _z): (&'static u32, u32) = (x, 44); //~ ERROR
| ^^^^^^^ requires that `'a` must outlive `'static`

error: aborting due to 15 previous errors
error: aborting due to 14 previous errors

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

0 comments on commit df37678

Please sign in to comment.