Skip to content

Commit 488aaf6

Browse files
committed
Auto merge of #156378 - matthiaskrgr:rollup-NO89xfV, r=matthiaskrgr
Rollup of 11 pull requests Successful merges: - #149362 (Add Command::get_resolved_envs) - #155705 (Add `str::word_to_titlecase()` to `alloc`) - #155970 (Add mention of sendfile(2) and splice(2) to fs::copy() documentation.) - #156006 (Update a bunch of bootstrap dependencies to remove windows-target) - #156169 (Change `SwitchInt` handling in dataflow analysis.) - #155188 (Add regression test for issue 144329) - #155515 (error on empty `export_name`) - #155817 (validate `#[link_name = "..."]` & `#[link(name = "...")]` parameters) - #156107 (remove turbofish notation + use None / Some instead of Option:: (in match documentation)) - #156133 (mark some panicking methods around Duration as track_caller) - #156363 (`rustc_attr_parsing`: add `AcceptContext::expect_string_literal`)
2 parents ce89c89 + ddecb76 commit 488aaf6

50 files changed

Lines changed: 803 additions & 516 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

compiler/rustc_ast/src/attr/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -845,7 +845,7 @@ pub fn list_contains_name(items: &[MetaItemInner], name: Symbol) -> bool {
845845
}
846846

847847
impl MetaItemLit {
848-
pub fn value_str(&self) -> Option<Symbol> {
848+
pub fn value_as_str(&self) -> Option<Symbol> {
849849
LitKind::from_token_lit(self.as_token_lit()).ok().and_then(|lit| lit.str())
850850
}
851851
}

compiler/rustc_attr_parsing/src/attributes/cfg.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,12 +135,12 @@ fn parse_cfg_entry_version(
135135
cx.emit_err(session_diagnostics::ExpectedSingleVersionLiteral { span: list.span })
136136
);
137137
};
138-
let Some(version_lit) = version.lit() else {
138+
let Some(version_lit) = version.as_lit() else {
139139
return Err(
140140
cx.emit_err(session_diagnostics::ExpectedVersionLiteral { span: version.span() })
141141
);
142142
};
143-
let Some(version_str) = version_lit.value_str() else {
143+
let Some(version_str) = version_lit.value_as_str() else {
144144
return Err(
145145
cx.emit_err(session_diagnostics::ExpectedVersionLiteral { span: version_lit.span })
146146
);

compiler/rustc_attr_parsing/src/attributes/cfi_encoding.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,7 @@ impl SingleAttributeParser for CfiEncodingParser {
1313
fn convert(cx: &mut AcceptContext<'_, '_>, args: &ArgParser) -> Option<AttributeKind> {
1414
let name_value = cx.expect_name_value(args, cx.attr_span, Some(sym::cfi_encoding))?;
1515

16-
let Some(value_str) = name_value.value_as_str() else {
17-
cx.adcx().expected_string_literal(name_value.value_span, None);
18-
return None;
19-
};
16+
let value_str = cx.expect_string_literal(name_value)?;
2017

2118
if value_str.as_str().trim().is_empty() {
2219
cx.adcx().expected_non_empty_string_literal(name_value.value_span);

compiler/rustc_attr_parsing/src/attributes/codegen_attrs.rs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ use rustc_span::edition::Edition::Edition2024;
55
use super::prelude::*;
66
use crate::attributes::AttributeSafety;
77
use crate::session_diagnostics::{
8-
NakedFunctionIncompatibleAttribute, NullOnExport, NullOnObjcClass, NullOnObjcSelector,
9-
ObjcClassExpectedStringLiteral, ObjcSelectorExpectedStringLiteral,
8+
EmptyExportName, NakedFunctionIncompatibleAttribute, NullOnExport, NullOnObjcClass,
9+
NullOnObjcSelector, ObjcClassExpectedStringLiteral, ObjcSelectorExpectedStringLiteral,
1010
};
1111
use crate::target_checking::Policy::AllowSilent;
1212

@@ -119,16 +119,19 @@ impl SingleAttributeParser for ExportNameParser {
119119

120120
fn convert(cx: &mut AcceptContext<'_, '_>, args: &ArgParser) -> Option<AttributeKind> {
121121
let nv = cx.expect_name_value(args, cx.attr_span, None)?;
122-
let Some(name) = nv.value_as_str() else {
123-
cx.adcx().expected_string_literal(nv.value_span, Some(nv.value_as_lit()));
124-
return None;
125-
};
122+
let name = cx.expect_string_literal(nv)?;
126123
if name.as_str().contains('\0') {
127124
// `#[export_name = ...]` will be converted to a null-terminated string,
128125
// so it may not contain any null characters.
129126
cx.emit_err(NullOnExport { span: cx.attr_span });
130127
return None;
131128
}
129+
if name.is_empty() {
130+
// LLVM will make up a name if the empty string is given, but that name will be
131+
// inconsistent between compilation units, causing linker errors.
132+
cx.emit_err(EmptyExportName { span: cx.attr_span });
133+
return None;
134+
}
132135
Some(AttributeKind::ExportName { name, span: cx.attr_span })
133136
}
134137
}
@@ -478,8 +481,7 @@ fn parse_tf_attribute(
478481
}
479482

480483
// Use value
481-
let Some(value_str) = value.value_as_str() else {
482-
cx.adcx().expected_string_literal(value.value_span, Some(value.value_as_lit()));
484+
let Some(value_str) = cx.expect_string_literal(value) else {
483485
return features;
484486
};
485487
for feature in value_str.as_str().split(",") {
@@ -594,8 +596,10 @@ impl SingleAttributeParser for SanitizeParser {
594596
return;
595597
}
596598
None => {
597-
cx.adcx()
598-
.expected_string_literal(value.value_span, Some(value.value_as_lit()));
599+
cx.adcx().expected_specific_argument_strings(
600+
value.value_span,
601+
&[sym::on, sym::off],
602+
);
599603
return;
600604
}
601605
};

compiler/rustc_attr_parsing/src/attributes/confusables.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,7 @@ impl AttributeParser for ConfusablesParser {
1919
}
2020

2121
for param in list.mixed() {
22-
let span = param.span();
23-
24-
let Some(lit) = param.lit().and_then(|i| i.value_str()) else {
25-
cx.adcx().expected_string_literal(span, param.lit());
22+
let Some(lit) = cx.expect_string_literal(param) else {
2623
continue;
2724
};
2825

compiler/rustc_attr_parsing/src/attributes/crate_level.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,7 @@ impl SingleAttributeParser for CrateNameParser {
1717
fn convert(cx: &mut AcceptContext<'_, '_>, args: &ArgParser) -> Option<AttributeKind> {
1818
let n = cx.expect_name_value(args, cx.attr_span, None)?;
1919

20-
let Some(name) = n.value_as_str() else {
21-
cx.adcx().expected_string_literal(n.value_span, Some(n.value_as_lit()));
22-
return None;
23-
};
20+
let name = cx.expect_string_literal(n)?;
2421

2522
Some(AttributeKind::CrateName { name, name_span: n.value_span, attr_span: cx.attr_span })
2623
}
@@ -44,10 +41,7 @@ impl CombineAttributeParser for CrateTypeParser {
4441
) -> impl IntoIterator<Item = Self::Item> {
4542
let n = cx.expect_name_value(args, cx.attr_span, None)?;
4643

47-
let Some(crate_type) = n.value_as_str() else {
48-
cx.adcx().expected_string_literal(n.value_span, Some(n.value_as_lit()));
49-
return None;
50-
};
44+
let crate_type = cx.expect_string_literal(n)?;
5145

5246
let Ok(crate_type) = crate_type.try_into() else {
5347
// We don't error on invalid `#![crate_type]` when not applied to a crate

compiler/rustc_attr_parsing/src/attributes/debugger.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,7 @@ impl CombineAttributeParser for DebuggerViualizerParser {
3434
}
3535
};
3636

37-
let Some(path) = args.value_as_str() else {
38-
cx.adcx().expected_string_literal(args.value_span, Some(args.value_as_lit()));
39-
return None;
40-
};
37+
let path = cx.expect_string_literal(args)?;
4138

4239
Some(DebugVisualizer { span: ident.span.to(args.value_span), visualizer_type, path })
4340
}

compiler/rustc_attr_parsing/src/attributes/doc.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -255,17 +255,15 @@ impl DocParser {
255255
}
256256
ArgParser::List(list) => {
257257
for i in list.mixed() {
258-
let Some(alias) = i.lit().and_then(|i| i.value_str()) else {
259-
cx.adcx().expected_string_literal(i.span(), i.lit());
258+
let Some(alias) = cx.expect_string_literal(i) else {
260259
continue;
261260
};
262261

263262
self.add_alias(cx, alias, i.span());
264263
}
265264
}
266265
ArgParser::NameValue(nv) => {
267-
let Some(alias) = nv.value_as_str() else {
268-
cx.adcx().expected_string_literal(nv.value_span, Some(nv.value_as_lit()));
266+
let Some(alias) = cx.expect_string_literal(nv) else {
269267
return;
270268
};
271269
self.add_alias(cx, alias, nv.value_span);

compiler/rustc_attr_parsing/src/attributes/inline.rs

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -77,21 +77,11 @@ impl SingleAttributeParser for RustcForceInlineParser {
7777
ArgParser::List(list) => {
7878
let l = cx.expect_single(list)?;
7979

80-
let Some(reason) = l.lit().and_then(|i| i.kind.str()) else {
81-
cx.adcx().expected_string_literal(l.span(), l.lit());
82-
return None;
83-
};
84-
85-
Some(reason)
86-
}
87-
ArgParser::NameValue(v) => {
88-
let Some(reason) = v.value_as_str() else {
89-
cx.adcx().expected_string_literal(v.value_span, Some(v.value_as_lit()));
90-
return None;
91-
};
80+
let reason = cx.expect_string_literal(l)?;
9281

9382
Some(reason)
9483
}
84+
ArgParser::NameValue(v) => cx.expect_string_literal(v),
9585
};
9686

9787
Some(AttributeKind::Inline(

compiler/rustc_attr_parsing/src/attributes/link_attrs.rs

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use crate::session_diagnostics::{
1717
AsNeededCompatibility, BundleNeedsStatic, EmptyLinkName, ExportSymbolsNeedsStatic,
1818
ImportNameTypeRaw, ImportNameTypeX86, IncompatibleWasmLink, InvalidLinkModifier,
1919
InvalidMachoSection, InvalidMachoSectionReason, LinkFrameworkApple, LinkOrdinalOutOfRange,
20-
LinkRequiresName, MultipleModifiers, NullOnLinkSection, RawDylibNoNul, RawDylibOnlyWindows,
20+
LinkRequiresName, MultipleModifiers, NullOnLinkName, NullOnLinkSection, RawDylibOnlyWindows,
2121
WholeArchiveNeedsStatic,
2222
};
2323

@@ -37,10 +37,20 @@ impl SingleAttributeParser for LinkNameParser {
3737

3838
fn convert(cx: &mut AcceptContext<'_, '_>, args: &ArgParser) -> Option<AttributeKind> {
3939
let nv = cx.expect_name_value(args, cx.attr_span, None)?;
40-
let Some(name) = nv.value_as_str() else {
41-
cx.adcx().expected_string_literal(nv.value_span, Some(nv.value_as_lit()));
40+
let name = cx.expect_string_literal(nv)?;
41+
42+
if name.as_str().contains('\0') {
43+
// `#[link_name = ...]` will be converted to a null-terminated string,
44+
// so it may not contain any null characters.
45+
cx.emit_err(NullOnLinkName { span: nv.value_span });
4246
return None;
43-
};
47+
}
48+
if name.is_empty() {
49+
// Otherwise LLVM will just make up a name and the linker will fail
50+
// to find an empty symbol name.
51+
cx.emit_err(EmptyLinkName { span: nv.value_span });
52+
return None;
53+
}
4454

4555
Some(LinkName { name, span: cx.attr_span })
4656
}
@@ -218,7 +228,7 @@ impl CombineAttributeParser for LinkParser {
218228
if wasm_import_module.is_some() {
219229
(name, kind) = (wasm_import_module, Some(NativeLibKind::WasmImportModule));
220230
}
221-
let Some((name, name_span)) = name else {
231+
let Some((name, _name_span)) = name else {
222232
cx.emit_err(LinkRequiresName { span: cx.attr_span });
223233
return None;
224234
};
@@ -230,12 +240,6 @@ impl CombineAttributeParser for LinkParser {
230240
}
231241
}
232242

233-
if let Some(NativeLibKind::RawDylib { .. }) = kind
234-
&& name.as_str().contains('\0')
235-
{
236-
cx.emit_err(RawDylibNoNul { span: name_span });
237-
}
238-
239243
Some(LinkEntry {
240244
span: cx.attr_span,
241245
kind: kind.unwrap_or(NativeLibKind::Unspecified),
@@ -260,14 +264,17 @@ impl LinkParser {
260264
let Some(nv) = cx.expect_name_value(item.args(), item.span(), Some(sym::name)) else {
261265
return false;
262266
};
263-
let Some(link_name) = nv.value_as_str() else {
264-
cx.adcx().expected_string_literal(nv.args_span(), Some(nv.value_as_lit()));
267+
let Some(link_name) = cx.expect_string_literal(nv) else {
265268
return false;
266269
};
267270

271+
if link_name.as_str().contains('\0') {
272+
cx.emit_err(NullOnLinkName { span: nv.value_span });
273+
}
268274
if link_name.is_empty() {
269275
cx.emit_err(EmptyLinkName { span: nv.value_span });
270276
}
277+
271278
*name = Some((link_name, nv.value_span));
272279
true
273280
}
@@ -286,8 +293,7 @@ impl LinkParser {
286293
let Some(nv) = cx.expect_name_value(item.args(), item.span(), Some(sym::kind)) else {
287294
return true;
288295
};
289-
let Some(link_kind) = nv.value_as_str() else {
290-
cx.adcx().expected_string_literal(item.span(), Some(nv.value_as_lit()));
296+
let Some(link_kind) = cx.expect_string_literal(nv) else {
291297
return true;
292298
};
293299

@@ -365,8 +371,7 @@ impl LinkParser {
365371
let Some(nv) = cx.expect_name_value(item.args(), item.span(), Some(sym::modifiers)) else {
366372
return true;
367373
};
368-
let Some(link_modifiers) = nv.value_as_str() else {
369-
cx.adcx().expected_string_literal(item.span(), Some(nv.value_as_lit()));
374+
let Some(link_modifiers) = cx.expect_string_literal(nv) else {
370375
return true;
371376
};
372377
*modifiers = Some((link_modifiers, nv.value_span));
@@ -408,8 +413,7 @@ impl LinkParser {
408413
else {
409414
return true;
410415
};
411-
let Some(link_wasm_import_module) = nv.value_as_str() else {
412-
cx.adcx().expected_string_literal(item.span(), Some(nv.value_as_lit()));
416+
let Some(link_wasm_import_module) = cx.expect_string_literal(nv) else {
413417
return true;
414418
};
415419
*wasm_import_module = Some((link_wasm_import_module, item.span()));
@@ -429,8 +433,7 @@ impl LinkParser {
429433
else {
430434
return true;
431435
};
432-
let Some(link_import_name_type) = nv.value_as_str() else {
433-
cx.adcx().expected_string_literal(nv.value_span, Some(nv.value_as_lit()));
436+
let Some(link_import_name_type) = cx.expect_string_literal(nv) else {
434437
return true;
435438
};
436439
if cx.sess().target.arch != Arch::X86 {
@@ -498,10 +501,7 @@ impl SingleAttributeParser for LinkSectionParser {
498501

499502
fn convert(cx: &mut AcceptContext<'_, '_>, args: &ArgParser) -> Option<AttributeKind> {
500503
let nv = cx.expect_name_value(args, cx.attr_span, None)?;
501-
let Some(name) = nv.value_as_str() else {
502-
cx.adcx().expected_string_literal(nv.value_span, Some(nv.value_as_lit()));
503-
return None;
504-
};
504+
let name = cx.expect_string_literal(nv)?;
505505
if name.as_str().contains('\0') {
506506
// `#[link_section = ...]` will be converted to a null-terminated string,
507507
// so it may not contain any null characters.
@@ -630,9 +630,7 @@ impl SingleAttributeParser for LinkageParser {
630630
fn convert(cx: &mut AcceptContext<'_, '_>, args: &ArgParser) -> Option<AttributeKind> {
631631
let name_value = cx.expect_name_value(args, cx.attr_span, Some(sym::linkage))?;
632632

633-
let Some(value) = name_value.value_as_str() else {
634-
cx.adcx()
635-
.expected_string_literal(name_value.value_span, Some(name_value.value_as_lit()));
633+
let Some(value) = cx.expect_string_literal(name_value) else {
636634
return None;
637635
};
638636

0 commit comments

Comments
 (0)