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 struct
s 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 struct
s 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 struct
s 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 struct
s 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
`+
}
`