Rollup merge of #127591 - compiler-errors:label-after-primary, r=lcnr · rust-lang/rust@73c500b

File tree

4 files changed

lines changed

    • rustc_macros/src/diagnostics

4 files changed

lines changed

Original file line numberDiff line numberDiff line change

@@ -269,6 +269,7 @@ impl DiagnosticDeriveVariantBuilder {

269269

let field_binding = &binding_info.binding;

270270
271271

let inner_ty = FieldInnerTy::from_type(&field.ty);

272+

let mut seen_label = false;

272273
273274

field

274275

.attrs

@@ -280,6 +281,14 @@ impl DiagnosticDeriveVariantBuilder {

280281

}

281282
282283

let name = attr.path().segments.last().unwrap().ident.to_string();

284+
285+

if name == "primary_span" && seen_label {

286+

span_err(attr.span().unwrap(), format!("`#[primary_span]` must be placed before labels, since it overwrites the span of the diagnostic")).emit();

287+

}

288+

if name == "label" {

289+

seen_label = true;

290+

}

291+
283292

let needs_clone =

284293

name == "primary_span" && matches!(inner_ty, FieldInnerTy::Vec(_));

285294

let (binding, needs_destructure) = if needs_clone {

Original file line numberDiff line numberDiff line change

@@ -1089,8 +1089,8 @@ pub(crate) struct ToolWasAlreadyRegistered {

10891089

#[derive(Diagnostic)]

10901090

#[diag(resolve_tool_only_accepts_identifiers)]

10911091

pub(crate) struct ToolOnlyAcceptsIdentifiers {

1092-

#[label]

10931092

#[primary_span]

1093+

#[label]

10941094

pub(crate) span: Span,

10951095

pub(crate) tool: Symbol,

10961096

}

Original file line numberDiff line numberDiff line change

@@ -0,0 +1,6 @@

1+

#![feature(register_tool)]

2+
3+

#![register_tool(1)]

4+

//~^ ERROR `register_tool` only accepts identifiers

5+
6+

fn main() {}

Original file line numberDiff line numberDiff line change

@@ -0,0 +1,8 @@

1+

error: `register_tool` only accepts identifiers

2+

--> $DIR/invalid-tool.rs:3:18

3+

|

4+

LL | #![register_tool(1)]

5+

| ^ not an identifier

6+
7+

error: aborting due to 1 previous error

8+