diff options
| author | bors <bors@rust-lang.org> | 2018-08-01 19:54:06 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2018-08-01 19:54:06 +0000 |
| commit | 97085f9fb0736b322dc216db3655da780b4d8041 (patch) | |
| tree | 51ff3c45c1fdf154e186cb1c494a7ac93b94b5bf /src/libsyntax | |
| parent | c4156768aa1f23117903e6954f3e9ba946f49295 (diff) | |
| parent | 3e7897f773f48ce982cbee6fbfd3118e5648e352 (diff) | |
| download | rust-97085f9fb0736b322dc216db3655da780b4d8041.tar.gz rust-97085f9fb0736b322dc216db3655da780b4d8041.zip | |
Auto merge of #52958 - pietroalbini:rollup, r=pietroalbini
Rollup of 15 pull requests
Successful merges:
- #52793 (Add test for NLL: unexpected "free region `` does not outlive" error )
- #52799 (Use BitVector for global sets of AttrId)
- #52809 (Add test for unexpected region for local data ReStatic)
- #52834 ([NLL] Allow conflicting borrows of promoted length zero arrays)
- #52835 (Fix Alias intra doc ICE)
- #52854 (fix memrchr in miri)
- #52899 (tests/ui: Add missing mips{64} ignores)
- #52908 (Use SetLenOnDrop in Vec::truncate())
- #52915 (Don't count MIR locals as borrowed after StorageDead when finding locals live across a yield terminator)
- #52926 (rustc: Trim down the `rust_2018_idioms` lint group)
- #52930 (rustc_resolve: record single-segment extern crate import resolutions.)
- #52939 (Make io::Read::read_to_end consider io::Take::limit)
- #52942 (Another SmallVec.extend optimization)
- #52947 (1.27 actually added the `armv5te-unknown-linux-musleabi` target)
- #52954 (async can begin expressions)
Failed merges:
r? @ghost
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ast.rs | 12 | ||||
| -rw-r--r-- | src/libsyntax/attr/mod.rs | 32 | ||||
| -rw-r--r-- | src/libsyntax/lib.rs | 12 | ||||
| -rw-r--r-- | src/libsyntax/parse/token.rs | 1 |
4 files changed, 24 insertions, 33 deletions
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index d59c9dd6b53..28c1e4324de 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -23,6 +23,7 @@ use ext::hygiene::{Mark, SyntaxContext}; use print::pprust; use ptr::P; use rustc_data_structures::indexed_vec; +use rustc_data_structures::indexed_vec::Idx; use symbol::{Symbol, keywords}; use tokenstream::{ThinTokenStream, TokenStream}; @@ -1910,9 +1911,18 @@ pub enum AttrStyle { Inner, } -#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug, Copy)] +#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug, PartialOrd, Ord, Copy)] pub struct AttrId(pub usize); +impl Idx for AttrId { + fn new(idx: usize) -> Self { + AttrId(idx) + } + fn index(self) -> usize { + self.0 + } +} + /// Meta-data associated with an item /// Doc-comments are promoted to attributes that have is_sugared_doc = true #[derive(Clone, RustcEncodable, RustcDecodable, Debug)] diff --git a/src/libsyntax/attr/mod.rs b/src/libsyntax/attr/mod.rs index 137b94230a3..7fbc5d4c41a 100644 --- a/src/libsyntax/attr/mod.rs +++ b/src/libsyntax/attr/mod.rs @@ -41,51 +41,27 @@ use std::iter; pub fn mark_used(attr: &Attribute) { debug!("Marking {:?} as used.", attr); - let AttrId(id) = attr.id; GLOBALS.with(|globals| { - let mut slot = globals.used_attrs.lock(); - let idx = (id / 64) as usize; - let shift = id % 64; - if slot.len() <= idx { - slot.resize(idx + 1, 0); - } - slot[idx] |= 1 << shift; + globals.used_attrs.lock().insert(attr.id); }); } pub fn is_used(attr: &Attribute) -> bool { - let AttrId(id) = attr.id; GLOBALS.with(|globals| { - let slot = globals.used_attrs.lock(); - let idx = (id / 64) as usize; - let shift = id % 64; - slot.get(idx).map(|bits| bits & (1 << shift) != 0) - .unwrap_or(false) + globals.used_attrs.lock().contains(attr.id) }) } pub fn mark_known(attr: &Attribute) { debug!("Marking {:?} as known.", attr); - let AttrId(id) = attr.id; GLOBALS.with(|globals| { - let mut slot = globals.known_attrs.lock(); - let idx = (id / 64) as usize; - let shift = id % 64; - if slot.len() <= idx { - slot.resize(idx + 1, 0); - } - slot[idx] |= 1 << shift; + globals.known_attrs.lock().insert(attr.id); }); } pub fn is_known(attr: &Attribute) -> bool { - let AttrId(id) = attr.id; GLOBALS.with(|globals| { - let slot = globals.known_attrs.lock(); - let idx = (id / 64) as usize; - let shift = id % 64; - slot.get(idx).map(|bits| bits & (1 << shift) != 0) - .unwrap_or(false) + globals.known_attrs.lock().contains(attr.id) }) } diff --git a/src/libsyntax/lib.rs b/src/libsyntax/lib.rs index 60de94821bb..0c105865e0c 100644 --- a/src/libsyntax/lib.rs +++ b/src/libsyntax/lib.rs @@ -43,6 +43,8 @@ extern crate rustc_target; extern crate serialize as rustc_serialize; // used by deriving use rustc_data_structures::sync::Lock; +use rustc_data_structures::bitvec::BitVector; +use ast::AttrId; // A variant of 'try!' that panics on an Err. This is used as a crutch on the // way towards a non-panic!-prone parser. It should be used for fatal parsing @@ -75,16 +77,18 @@ macro_rules! unwrap_or { } pub struct Globals { - used_attrs: Lock<Vec<u64>>, - known_attrs: Lock<Vec<u64>>, + used_attrs: Lock<BitVector<AttrId>>, + known_attrs: Lock<BitVector<AttrId>>, syntax_pos_globals: syntax_pos::Globals, } impl Globals { fn new() -> Globals { Globals { - used_attrs: Lock::new(Vec::new()), - known_attrs: Lock::new(Vec::new()), + // We have no idea how many attributes their will be, so just + // initiate the vectors with 0 bits. We'll grow them as necessary. + used_attrs: Lock::new(BitVector::new()), + known_attrs: Lock::new(BitVector::new()), syntax_pos_globals: syntax_pos::Globals::new(), } } diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs index fd8f394a600..c449cc0a652 100644 --- a/src/libsyntax/parse/token.rs +++ b/src/libsyntax/parse/token.rs @@ -104,6 +104,7 @@ pub(crate) fn ident_can_begin_expr(ident: ast::Ident, is_raw: bool) -> bool { !ident_token.is_reserved_ident() || ident_token.is_path_segment_keyword() || [ + keywords::Async.name(), keywords::Do.name(), keywords::Box.name(), keywords::Break.name(), |
