-
Notifications
You must be signed in to change notification settings - Fork 12.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of #74945 - dingxiangfei2009:promote-static-ref-deref, r=o…
…li-obk [mir] Special treatment for dereferencing a borrow to a static definition Fix #70584. As suggested by @oli-obk in this [comment](#70584 (comment)), one can chase the definition of the local variable being de-referenced and check if it is a true static variable. If that is the case, `validate_place` will admit the promotion. This is my first time to contribute to `rustc`, and I have two questions. 1. A generalization to some extent is applied to decide if the promotion is possible in the static context. In case that there are more projection operations preceding the de-referencing, `validate_place` recursively decent into inner projection operations. I have put thoughts into its correctness but I am not totally sure about it. 2. I have a hard time to find a good place for the test case. This patch has to do with MIR, but this test case would look out of place compared to other tests in `src/test/ui/mir` or `src/test/ui/borrowck` because it does not generate errors while others do. It is tentatively placed in `src/test/ui/statics` for now. Thank you for any comments and suggestions!
- Loading branch information
Showing
2 changed files
with
74 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
// check-pass | ||
|
||
// Use of global static variables in literal values should be allowed for | ||
// promotion. | ||
// This test is to demonstrate the issue raised in | ||
// https://github.com/rust-lang/rust/issues/70584 | ||
|
||
// Literal values were previously promoted into local static values when | ||
// other global static variables are used. | ||
|
||
struct A<T: 'static>(&'static T); | ||
struct B<T: 'static + ?Sized> { | ||
x: &'static T, | ||
} | ||
static STR: &'static [u8] = b"hi"; | ||
static C: A<B<B<[u8]>>> = { | ||
A(&B { | ||
x: &B { x: STR }, | ||
}) | ||
}; | ||
|
||
pub struct Slice(&'static [i32]); | ||
|
||
static CONTENT: i32 = 42; | ||
pub static CONTENT_MAP: Slice = Slice(&[CONTENT]); | ||
|
||
pub static FOO: (i32, i32) = (42, 43); | ||
pub static CONTENT_MAP2: Slice = Slice(&[FOO.0]); | ||
|
||
fn main() { | ||
assert_eq!(b"hi", C.0.x.x); | ||
assert_eq!(&[42], CONTENT_MAP.0); | ||
assert_eq!(&[42], CONTENT_MAP2.0); | ||
} |