blob: 1bef9388a1df91978c17da157e0823244022b74b [file] [log] [blame]
// { dg-additional-options "-frust-compile-until=compilation -frust-borrowcheck -fdiagnostics-show-caret -fdiagnostics-show-line-numbers" }
// { dg-enable-nn-line-numbers "" }
#![feature(lang_items)]
#[lang = "sized"]
pub trait Sized {}
struct Reference<'a> {
value: &'a i32,
}
impl<'a> Reference<'a> {
fn new<'a>(value: &'a i32) -> Reference<'a> {
Reference { value: value }
}
}
struct ReferenceMut<'a> {
value: &'a mut i32,
}
impl<'a> ReferenceMut<'a> {
fn new<'a>(value: &'a mut i32) -> ReferenceMut<'a> {
ReferenceMut { value: value }
}
}
fn immutable_borrow_while_immutable_borrowed_struct() {
let x = 0;
let y = Reference::new(&x);
let z = &x;
let w = y;
}
fn immutable_borrow_while_mutable_borrowed_struct() {
let mut x = 0;
let y = ReferenceMut::new(&mut x);
let z = &x; //~ ERROR
// { dg-error "use of borrowed value" "" { target *-*-* } .-1 }
let w = y;
/*
{ dg-begin-multiline-output "" }
NN | let y = ReferenceMut::new(&mut x);
| ~
| |
| borrow occurs here
NN | let z = &x; //~ ERROR
| ^
| |
| borrowed value used here
{ dg-end-multiline-output "" }
*/
}
fn mutable_borrow_while_immutable_borrowed_struct() {
let x = 0;
let y = Reference::new(&x);
let z = &mut x; //~ ERROR
// { dg-error "use of borrowed value" "" { target *-*-* } .-1 }
let w = y;
/*
{ dg-begin-multiline-output "" }
NN | let y = Reference::new(&x);
| ~
| |
| borrow occurs here
NN | let z = &mut x; //~ ERROR
| ^
| |
| borrowed value used here
{ dg-end-multiline-output "" }
*/
}
fn mutable_borrow_while_mutable_borrowed_struct() {
let mut x = 0;
let y = ReferenceMut::new(&mut x);
let z = &mut x; //~ ERROR
// { dg-error "use of borrowed value" "" { target *-*-* } .-1 }
let w = y;
/*
{ dg-begin-multiline-output "" }
NN | let y = ReferenceMut::new(&mut x);
| ~
| |
| borrow occurs here
NN | let z = &mut x; //~ ERROR
| ^
| |
| borrowed value used here
{ dg-end-multiline-output "" }
*/
}
fn immutable_reborrow_while_immutable_borrowed_struct() {
let x = 0;
let y = Reference::new(&x);
let z = &*y.value;
}
fn immutable_reborrow_while_mutable_borrowed_struct() {
let mut x = 0;
let y = Reference::new(&mut x);
let z = &*y.value;
}
fn mutable_reborrow_while_immutable_borrowed_struct() {
// { dg-error "Cannot reborrow immutable borrow as mutable" "" { target *-*-* } .-1 }
/*
{ dg-begin-multiline-output "" }
NN | fn mutable_reborrow_while_immutable_borrowed_struct() {
| ^~
{ dg-end-multiline-output "" }
*/
let x = 0;
let y = Reference::new(&x);
let z = &mut *y.value; //~ ERROR
}
fn read_while_mutable_borrowed_struct() {
let mut x = 0;
let y = ReferenceMut::new(&mut x);
let z = x; //~ ERROR
// { dg-error "use of borrowed value" "" { target *-*-* } .-1 }
let w = y;
/*
{ dg-begin-multiline-output "" }
NN | let y = ReferenceMut::new(&mut x);
| ~
| |
| borrow occurs here
NN | let z = x; //~ ERROR
| ^
| |
| borrowed value used here
{ dg-end-multiline-output "" }
*/
}
fn write_while_borrowed_struct() {
let mut x = 0;
let y = Reference::new(&x);
x = 1; //~ ERROR
// { dg-error "use of borrowed value" "" { target *-*-* } .-1 }
let z = y;
/*
{ dg-begin-multiline-output "" }
NN | let y = Reference::new(&x);
| ~
| |
| borrow occurs here
NN | x = 1; //~ ERROR
| ^
| |
| borrowed value used here
{ dg-end-multiline-output "" }
*/
}
fn write_while_immutable_borrowed_struct() {
let x = 0;
let y = Reference::new(&x);
x = 1; //~ ERROR
// { dg-error "use of borrowed value" "" { target *-*-* } .-1 }
let z = y;
/*
{ dg-begin-multiline-output "" }
NN | let y = Reference::new(&x);
| ~
| |
| borrow occurs here
NN | x = 1; //~ ERROR
| ^
| |
| borrowed value used here
{ dg-end-multiline-output "" }
*/
}