Auto merge of #133865 - matthiaskrgr:rollup-9v2f3w4, r=matthiaskrgr · rust-lang/rust@acabb52 (original) (raw)

`@@ -9,6 +9,7 @@ use rustc_ast::{

`

9

9

`use rustc_attr as attr;

`

10

10

`use rustc_data_structures::flat_map_in_place::FlatMapInPlace;

`

11

11

`use rustc_expand::base::{Annotatable, ExtCtxt};

`

``

12

`+

use rustc_macros::Diagnostic;

`

12

13

`use rustc_span::symbol::{Ident, sym};

`

13

14

`use rustc_span::{Span, Symbol};

`

14

15

`use thin_vec::{ThinVec, thin_vec};

`

`@@ -38,35 +39,20 @@ pub(crate) fn expand_deriving_coerce_pointee(

`

38

39

`.any(|r| matches!(r, attr::ReprTransparent))

`

39

40

`});

`

40

41

`if !is_transparent {

`

41

``

`-

cx.dcx()

`

42

``

`-

.struct_span_err(

`

43

``

`-

span,

`

44

``

`` -

"CoercePointee can only be derived on structs with #[repr(transparent)]",

``

45

``

`-

)

`

46

``

`-

.emit();

`

``

42

`+

cx.dcx().emit_err(RequireTransparent { span });

`

47

43

`return;

`

48

44

`}

`

49

45

`if !matches!(

`

50

46

` struct_data,

`

51

47

`VariantData::Struct { fields, recovered: _ } | VariantData::Tuple(fields, _)

`

52

48

`if !fields.is_empty())

`

53

49

`{

`

54

``

`-

cx.dcx()

`

55

``

`-

.struct_span_err(

`

56

``

`-

span,

`

57

``

`` -

"CoercePointee can only be derived on structs with at least one field",

``

58

``

`-

)

`

59

``

`-

.emit();

`

``

50

`+

cx.dcx().emit_err(RequireOneField { span });

`

60

51

`return;

`

61

52

`}

`

62

53

`(aitem.ident, g)

`

63

54

`} else {

`

64

``

`-

cx.dcx()

`

65

``

`-

.struct_span_err(

`

66

``

`-

span,

`

67

``

`` -

"CoercePointee can only be derived on structs with #[repr(transparent)]",

``

68

``

`-

)

`

69

``

`-

.emit();

`

``

55

`+

cx.dcx().emit_err(RequireTransparent { span });

`

70

56

`return;

`

71

57

`};

`

72

58

``

`@@ -95,10 +81,7 @@ pub(crate) fn expand_deriving_coerce_pointee(

`

95

81

``

96

82

`let pointee_param_idx = if type_params.is_empty() {

`

97

83

`` // #[derive(CoercePointee)] requires at least one generic type on the target struct

``

98

``

`-

cx.dcx().struct_span_err(

`

99

``

`-

span,

`

100

``

`` -

"CoercePointee can only be derived on structs that are generic over at least one type",

``

101

``

`-

).emit();

`

``

84

`+

cx.dcx().emit_err(RequireOneGeneric { span });

`

102

85

`return;

`

103

86

`} else if type_params.len() == 1 {

`

104

87

`` // Regardless of the only type param being designed as #[pointee] or not, we can just use it as such

``

`@@ -111,19 +94,11 @@ pub(crate) fn expand_deriving_coerce_pointee(

`

111

94

`match (pointees.next(), pointees.next()) {

`

112

95

`(Some((idx, _span)), None) => idx,

`

113

96

`(None, _) => {

`

114

``

`-

cx.dcx().struct_span_err(

`

115

``

`-

span,

`

116

``

`-

"exactly one generic type parameter must be marked as #[pointee] to derive CoercePointee traits",

`

117

``

`-

).emit();

`

``

97

`+

cx.dcx().emit_err(RequireOnePointee { span });

`

118

98

`return;

`

119

99

`}

`

120

100

`(Some((, one)), Some((, another))) => {

`

121

``

`-

cx.dcx()

`

122

``

`-

.struct_span_err(

`

123

``

`-

vec![one, another],

`

124

``

`` -

"only one type parameter can be marked as #[pointee] when deriving CoercePointee traits",

``

125

``

`-

)

`

126

``

`-

.emit();

`

``

101

`+

cx.dcx().emit_err(TooManyPointees { one, another });

`

127

102

`return;

`

128

103

`}

`

129

104

`}

`

`@@ -181,15 +156,10 @@ pub(crate) fn expand_deriving_coerce_pointee(

`

181

156

` pointee_ty_ident.name,

`

182

157

`)

`

183

158

`{

`

184

``

`-

cx.dcx()

`

185

``

`-

.struct_span_err(

`

186

``

`-

pointee_ty_ident.span,

`

187

``

`-

format!(

`

188

``

`` -

"derive(CoercePointee) requires {} to be marked ?Sized",

``

189

``

`-

pointee_ty_ident.name

`

190

``

`-

),

`

191

``

`-

)

`

192

``

`-

.emit();

`

``

159

`+

cx.dcx().emit_err(RequiresMaybeSized {

`

``

160

`+

span: pointee_ty_ident.span,

`

``

161

`+

name: pointee_ty_ident.name.to_ident_string(),

`

``

162

`+

});

`

193

163

`return;

`

194

164

`}

`

195

165

`let arg = GenericArg::Type(s_ty.clone());

`

`@@ -459,3 +429,48 @@ impl<'a, 'b> rustc_ast::visit::Visitor<'a> for AlwaysErrorOnGenericParam<'a, 'b>

`

459

429

`}

`

460

430

`}

`

461

431

`}

`

``

432

+

``

433

`+

#[derive(Diagnostic)]

`

``

434

`+

#[diag(builtin_macros_coerce_pointee_requires_transparent)]

`

``

435

`+

struct RequireTransparent {

`

``

436

`+

#[primary_span]

`

``

437

`+

span: Span,

`

``

438

`+

}

`

``

439

+

``

440

`+

#[derive(Diagnostic)]

`

``

441

`+

#[diag(builtin_macros_coerce_pointee_requires_one_field)]

`

``

442

`+

struct RequireOneField {

`

``

443

`+

#[primary_span]

`

``

444

`+

span: Span,

`

``

445

`+

}

`

``

446

+

``

447

`+

#[derive(Diagnostic)]

`

``

448

`+

#[diag(builtin_macros_coerce_pointee_requires_one_generic)]

`

``

449

`+

struct RequireOneGeneric {

`

``

450

`+

#[primary_span]

`

``

451

`+

span: Span,

`

``

452

`+

}

`

``

453

+

``

454

`+

#[derive(Diagnostic)]

`

``

455

`+

#[diag(builtin_macros_coerce_pointee_requires_one_pointee)]

`

``

456

`+

struct RequireOnePointee {

`

``

457

`+

#[primary_span]

`

``

458

`+

span: Span,

`

``

459

`+

}

`

``

460

+

``

461

`+

#[derive(Diagnostic)]

`

``

462

`+

#[diag(builtin_macros_coerce_pointee_too_many_pointees)]

`

``

463

`+

struct TooManyPointees {

`

``

464

`+

#[primary_span]

`

``

465

`+

one: Span,

`

``

466

`+

#[label]

`

``

467

`+

another: Span,

`

``

468

`+

}

`

``

469

+

``

470

`+

#[derive(Diagnostic)]

`

``

471

`+

#[diag(builtin_macros_coerce_pointee_requires_maybe_sized)]

`

``

472

`+

struct RequiresMaybeSized {

`

``

473

`+

#[primary_span]

`

``

474

`+

span: Span,

`

``

475

`+

name: String,

`

``

476

`+

}

`