Skip to content

Commit 9715428

Browse files
committed
syntax: Do not accidentally treat multi-segment meta-items as single-segment
1 parent e0b37b1 commit 9715428

File tree

29 files changed

+236
-213
lines changed

29 files changed

+236
-213
lines changed

src/librustc/hir/check_attr.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ impl<'a, 'tcx> CheckAttrVisitor<'a, 'tcx> {
166166
// ```
167167
let hints: Vec<_> = item.attrs
168168
.iter()
169-
.filter(|attr| attr.name() == "repr")
169+
.filter(|attr| attr.check_name("repr"))
170170
.filter_map(|attr| attr.meta_item_list())
171171
.flatten()
172172
.collect();
@@ -177,15 +177,15 @@ impl<'a, 'tcx> CheckAttrVisitor<'a, 'tcx> {
177177
let mut is_transparent = false;
178178

179179
for hint in &hints {
180-
let name = if let Some(name) = hint.name() {
180+
let name = if let Some(name) = hint.ident_str() {
181181
name
182182
} else {
183183
// Invalid repr hint like repr(42). We don't check for unrecognized hints here
184184
// (libsyntax does that), so just ignore it.
185185
continue;
186186
};
187187

188-
let (article, allowed_targets) = match &*name.as_str() {
188+
let (article, allowed_targets) = match name {
189189
"C" | "align" => {
190190
is_c |= name == "C";
191191
if target != Target::Struct &&
@@ -313,7 +313,7 @@ impl<'a, 'tcx> CheckAttrVisitor<'a, 'tcx> {
313313

314314
fn check_used(&self, item: &hir::Item, target: Target) {
315315
for attr in &item.attrs {
316-
if attr.name() == "used" && target != Target::Static {
316+
if attr.check_name("used") && target != Target::Static {
317317
self.tcx.sess
318318
.span_err(attr.span, "attribute must be applied to a `static` variable");
319319
}

src/librustc/ich/impls_syntax.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,8 @@ impl<'a> HashStable<StableHashingContext<'a>> for [ast::Attribute] {
197197
let filtered: SmallVec<[&ast::Attribute; 8]> = self
198198
.iter()
199199
.filter(|attr| {
200-
!attr.is_sugared_doc && !hcx.is_ignored_attr(attr.name())
200+
!attr.is_sugared_doc &&
201+
!attr.ident().map_or(false, |ident| hcx.is_ignored_attr(ident.name))
201202
})
202203
.collect();
203204

@@ -224,7 +225,7 @@ impl<'a> HashStable<StableHashingContext<'a>> for ast::Attribute {
224225
hcx: &mut StableHashingContext<'a>,
225226
hasher: &mut StableHasher<W>) {
226227
// Make sure that these have been filtered out.
227-
debug_assert!(!hcx.is_ignored_attr(self.name()));
228+
debug_assert!(!self.ident().map_or(false, |ident| hcx.is_ignored_attr(ident.name)));
228229
debug_assert!(!self.is_sugared_doc);
229230

230231
let ast::Attribute {

src/librustc/lint/levels.rs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ impl<'a> LintLevelsBuilder<'a> {
193193
struct_span_err!(sess, span, E0452, "malformed lint attribute")
194194
};
195195
for attr in attrs {
196-
let level = match Level::from_str(&attr.name().as_str()) {
196+
let level = match attr.ident_str().and_then(|name| Level::from_str(name)) {
197197
None => continue,
198198
Some(lvl) => lvl,
199199
};
@@ -254,9 +254,9 @@ impl<'a> LintLevelsBuilder<'a> {
254254
}
255255

256256
for li in metas {
257-
let word = match li.word() {
258-
Some(word) => word,
259-
None => {
257+
let meta_item = match li.meta_item() {
258+
Some(meta_item) if meta_item.is_word() => meta_item,
259+
_ => {
260260
let mut err = bad_attr(li.span);
261261
if let Some(item) = li.meta_item() {
262262
if let ast::MetaItemKind::NameValue(_) = item.node {
@@ -269,23 +269,24 @@ impl<'a> LintLevelsBuilder<'a> {
269269
continue;
270270
}
271271
};
272-
let tool_name = if let Some(lint_tool) = word.is_scoped() {
273-
if !attr::is_known_lint_tool(lint_tool) {
272+
let tool_name = if meta_item.ident.segments.len() > 1 {
273+
let tool_ident = meta_item.ident.segments[0].ident;
274+
if !attr::is_known_lint_tool(tool_ident) {
274275
span_err!(
275276
sess,
276-
lint_tool.span,
277+
tool_ident.span,
277278
E0710,
278279
"an unknown tool name found in scoped lint: `{}`",
279-
word.ident
280+
meta_item.ident
280281
);
281282
continue;
282283
}
283284

284-
Some(lint_tool.as_str())
285+
Some(tool_ident.as_str())
285286
} else {
286287
None
287288
};
288-
let name = word.name();
289+
let name = meta_item.ident.segments.last().expect("empty lint name").ident.name;
289290
match store.check_lint_name(&name.as_str(), tool_name) {
290291
CheckLintNameResult::Ok(ids) => {
291292
let src = LintSource::Node(name, li.span, reason);

src/librustc/middle/lib_features.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,9 @@ impl<'a, 'tcx> LibFeatureCollector<'a, 'tcx> {
6363
for meta in metas {
6464
if let Some(mi) = meta.meta_item() {
6565
// Find the `feature = ".."` meta-item.
66-
match (&*mi.name().as_str(), mi.value_str()) {
67-
("feature", val) => feature = val,
68-
("since", val) => since = val,
66+
match (mi.ident_str(), mi.value_str()) {
67+
(Some("feature"), val) => feature = val,
68+
(Some("since"), val) => since = val,
6969
_ => {}
7070
}
7171
}

src/librustc/middle/stability.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -194,11 +194,12 @@ impl<'a, 'tcx: 'a> Annotator<'a, 'tcx> {
194194
} else {
195195
// Emit errors for non-staged-api crates.
196196
for attr in attrs {
197-
let tag = attr.name();
198-
if tag == "unstable" || tag == "stable" || tag == "rustc_deprecated" {
199-
attr::mark_used(attr);
200-
self.tcx.sess.span_err(attr.span(), "stability attributes may not be used \
201-
outside of the standard library");
197+
if let Some(tag) = attr.ident_str() {
198+
if tag == "unstable" || tag == "stable" || tag == "rustc_deprecated" {
199+
attr::mark_used(attr);
200+
self.tcx.sess.span_err(attr.span, "stability attributes may not be used \
201+
outside of the standard library");
202+
}
202203
}
203204
}
204205

src/librustc/session/config.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1817,7 +1817,8 @@ pub fn parse_cfgspecs(cfgspecs: Vec<String>) -> ast::CrateConfig {
18171817
error!("argument value must be a string");
18181818
}
18191819
MetaItemKind::NameValue(..) | MetaItemKind::Word => {
1820-
return (meta_item.name(), meta_item.value_str());
1820+
let ident = meta_item.ident().expect("multi-segment cfg key");
1821+
return (ident.name, meta_item.value_str());
18211822
}
18221823
}
18231824
}

src/librustc/traits/on_unimplemented.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -177,10 +177,12 @@ impl<'a, 'gcx, 'tcx> OnUnimplementedDirective {
177177
for command in self.subcommands.iter().chain(Some(self)).rev() {
178178
if let Some(ref condition) = command.condition {
179179
if !attr::eval_condition(condition, &tcx.sess.parse_sess, &mut |c| {
180-
options.contains(&(
181-
c.name().as_str().to_string(),
182-
c.value_str().map(|s| s.as_str().to_string())
183-
))
180+
c.ident_str().map_or(false, |name| {
181+
options.contains(&(
182+
name.to_string(),
183+
c.value_str().map(|s| s.as_str().to_string())
184+
))
185+
})
184186
}) {
185187
debug!("evaluate: skipping {:?} due to condition", command);
186188
continue

src/librustc_incremental/assert_dep_graph.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,9 @@ impl<'a, 'tcx> IfThisChanged<'a, 'tcx> {
9999
fn argument(&self, attr: &ast::Attribute) -> Option<ast::Name> {
100100
let mut value = None;
101101
for list_item in attr.meta_item_list().unwrap_or_default() {
102-
match list_item.word() {
103-
Some(word) if value.is_none() =>
104-
value = Some(word.name()),
102+
match list_item.ident() {
103+
Some(ident) if list_item.is_word() && value.is_none() =>
104+
value = Some(ident.name),
105105
_ =>
106106
// FIXME better-encapsulate meta_item (don't directly access `node`)
107107
span_bug!(list_item.span(), "unexpected meta-item {:?}", list_item.node),

src/librustc_incremental/persist/dirty_clean.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -576,7 +576,7 @@ fn expect_associated_value(tcx: TyCtxt<'_, '_, '_>, item: &NestedMetaItem) -> as
576576
if let Some(value) = item.value_str() {
577577
value
578578
} else {
579-
let msg = if let Some(name) = item.name() {
579+
let msg = if let Some(name) = item.ident_str() {
580580
format!("associated value expected for `{}`", name)
581581
} else {
582582
"expected an associated value".to_string()

src/librustc_lint/builtin.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -760,7 +760,7 @@ impl LintPass for DeprecatedAttr {
760760
impl EarlyLintPass for DeprecatedAttr {
761761
fn check_attribute(&mut self, cx: &EarlyContext<'_>, attr: &ast::Attribute) {
762762
for &&(n, _, _, ref g) in &self.depr_attrs {
763-
if attr.name() == n {
763+
if attr.ident_str() == Some(n) {
764764
if let &AttributeGate::Gated(Stability::Deprecated(link, suggestion),
765765
ref name,
766766
ref reason,

0 commit comments

Comments
 (0)