@@ -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