@@ -46,6 +46,8 @@ use std::str::FromStr;
4646use bitflags:: bitflags;
4747#[ cfg( feature = "nightly" ) ]
4848use rustc_data_structures:: stable_hasher:: StableOrd ;
49+ #[ cfg( feature = "nightly" ) ]
50+ use rustc_errors:: { Diag , DiagCtxtHandle , Diagnostic , EmissionGuarantee , Level , msg} ;
4951use rustc_hashes:: Hash64 ;
5052use rustc_index:: { Idx , IndexSlice , IndexVec } ;
5153#[ cfg( feature = "nightly" ) ]
@@ -332,7 +334,7 @@ impl Default for TargetDataLayout {
332334 }
333335}
334336
335- pub enum TargetDataLayoutErrors < ' a > {
337+ pub enum TargetDataLayoutError < ' a > {
336338 InvalidAddressSpace { addr_space : & ' a str , cause : & ' a str , err : ParseIntError } ,
337339 InvalidBits { kind : & ' a str , bit : & ' a str , cause : & ' a str , err : ParseIntError } ,
338340 MissingAlignment { cause : & ' a str } ,
@@ -343,6 +345,51 @@ pub enum TargetDataLayoutErrors<'a> {
343345 UnknownPointerSpecification { err : String } ,
344346}
345347
348+ #[ cfg( feature = "nightly" ) ]
349+ impl < G : EmissionGuarantee > Diagnostic < ' _ , G > for TargetDataLayoutError < ' _ > {
350+ fn into_diag ( self , dcx : DiagCtxtHandle < ' _ > , level : Level ) -> Diag < ' _ , G > {
351+ match self {
352+ TargetDataLayoutError :: InvalidAddressSpace { addr_space, err, cause } => {
353+ Diag :: new ( dcx, level, msg ! ( "invalid address space `{$addr_space}` for `{$cause}` in \" data-layout\" : {$err}" ) )
354+ . with_arg ( "addr_space" , addr_space)
355+ . with_arg ( "cause" , cause)
356+ . with_arg ( "err" , err)
357+ }
358+ TargetDataLayoutError :: InvalidBits { kind, bit, cause, err } => {
359+ Diag :: new ( dcx, level, msg ! ( "invalid {$kind} `{$bit}` for `{$cause}` in \" data-layout\" : {$err}" ) )
360+ . with_arg ( "kind" , kind)
361+ . with_arg ( "bit" , bit)
362+ . with_arg ( "cause" , cause)
363+ . with_arg ( "err" , err)
364+ }
365+ TargetDataLayoutError :: MissingAlignment { cause } => {
366+ Diag :: new ( dcx, level, msg ! ( "missing alignment for `{$cause}` in \" data-layout\" " ) )
367+ . with_arg ( "cause" , cause)
368+ }
369+ TargetDataLayoutError :: InvalidAlignment { cause, err } => {
370+ Diag :: new ( dcx, level, msg ! ( "invalid alignment for `{$cause}` in \" data-layout\" : {$err}" ) )
371+ . with_arg ( "cause" , cause)
372+ . with_arg ( "err" , err. to_string ( ) )
373+ }
374+ TargetDataLayoutError :: InconsistentTargetArchitecture { dl, target } => {
375+ Diag :: new ( dcx, level, msg ! ( "inconsistent target specification: \" data-layout\" claims architecture is {$dl}-endian, while \" target-endian\" is `{$target}`" ) )
376+ . with_arg ( "dl" , dl) . with_arg ( "target" , target)
377+ }
378+ TargetDataLayoutError :: InconsistentTargetPointerWidth { pointer_size, target } => {
379+ Diag :: new ( dcx, level, msg ! ( "inconsistent target specification: \" data-layout\" claims pointers are {$pointer_size}-bit, while \" target-pointer-width\" is `{$target}`" ) )
380+ . with_arg ( "pointer_size" , pointer_size) . with_arg ( "target" , target)
381+ }
382+ TargetDataLayoutError :: InvalidBitsSize { err } => {
383+ Diag :: new ( dcx, level, msg ! ( "{$err}" ) ) . with_arg ( "err" , err)
384+ }
385+ TargetDataLayoutError :: UnknownPointerSpecification { err } => {
386+ Diag :: new ( dcx, level, msg ! ( "unknown pointer specification `{$err}` in datalayout string" ) )
387+ . with_arg ( "err" , err)
388+ }
389+ }
390+ }
391+ }
392+
346393impl TargetDataLayout {
347394 /// Parse data layout from an
348395 /// [llvm data layout string](https://llvm.org/docs/LangRef.html#data-layout)
@@ -352,17 +399,17 @@ impl TargetDataLayout {
352399 pub fn parse_from_llvm_datalayout_string < ' a > (
353400 input : & ' a str ,
354401 default_address_space : AddressSpace ,
355- ) -> Result < TargetDataLayout , TargetDataLayoutErrors < ' a > > {
402+ ) -> Result < TargetDataLayout , TargetDataLayoutError < ' a > > {
356403 // Parse an address space index from a string.
357404 let parse_address_space = |s : & ' a str , cause : & ' a str | {
358405 s. parse :: < u32 > ( ) . map ( AddressSpace ) . map_err ( |err| {
359- TargetDataLayoutErrors :: InvalidAddressSpace { addr_space : s, cause, err }
406+ TargetDataLayoutError :: InvalidAddressSpace { addr_space : s, cause, err }
360407 } )
361408 } ;
362409
363410 // Parse a bit count from a string.
364411 let parse_bits = |s : & ' a str , kind : & ' a str , cause : & ' a str | {
365- s. parse :: < u64 > ( ) . map_err ( |err| TargetDataLayoutErrors :: InvalidBits {
412+ s. parse :: < u64 > ( ) . map_err ( |err| TargetDataLayoutError :: InvalidBits {
366413 kind,
367414 bit : s,
368415 cause,
@@ -378,7 +425,7 @@ impl TargetDataLayout {
378425 let parse_align_str = |s : & ' a str , cause : & ' a str | {
379426 let align_from_bits = |bits| {
380427 Align :: from_bits ( bits)
381- . map_err ( |err| TargetDataLayoutErrors :: InvalidAlignment { cause, err } )
428+ . map_err ( |err| TargetDataLayoutError :: InvalidAlignment { cause, err } )
382429 } ;
383430 let abi = parse_bits ( s, "alignment" , cause) ?;
384431 Ok ( align_from_bits ( abi) ?)
@@ -388,7 +435,7 @@ impl TargetDataLayout {
388435 // ignoring the secondary alignment specifications.
389436 let parse_align_seq = |s : & [ & ' a str ] , cause : & ' a str | {
390437 if s. is_empty ( ) {
391- return Err ( TargetDataLayoutErrors :: MissingAlignment { cause } ) ;
438+ return Err ( TargetDataLayoutError :: MissingAlignment { cause } ) ;
392439 }
393440 parse_align_str ( s[ 0 ] , cause)
394441 } ;
@@ -426,7 +473,7 @@ impl TargetDataLayout {
426473 // However, we currently don't take into account further specifications:
427474 // an error is emitted instead.
428475 if p. starts_with ( char:: is_alphabetic) {
429- return Err ( TargetDataLayoutErrors :: UnknownPointerSpecification {
476+ return Err ( TargetDataLayoutError :: UnknownPointerSpecification {
430477 err : p. to_string ( ) ,
431478 } ) ;
432479 }
@@ -471,7 +518,7 @@ impl TargetDataLayout {
471518 // However, we currently don't take into account further specifications:
472519 // an error is emitted instead.
473520 if p. starts_with ( char:: is_alphabetic) {
474- return Err ( TargetDataLayoutErrors :: UnknownPointerSpecification {
521+ return Err ( TargetDataLayoutError :: UnknownPointerSpecification {
475522 err : p. to_string ( ) ,
476523 } ) ;
477524 }
0 commit comments