rust/tests/ui-fulldeps/session-diagnostic/subdiagnostic-derive.rs

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

840 lines
19 KiB
Rust
Raw Normal View History

//@ check-fail
// Tests error conditions for specifying subdiagnostics using #[derive(Subdiagnostic)]
// The proc_macro2 crate handles spans differently when on beta/stable release rather than nightly,
// changing the output of this test. Since Subdiagnostic is strictly internal to the compiler
// the test is just ignored on stable and beta:
Support `x test --stage 1 ui-fulldeps` Nils had an excellent idea the other day: the same way that rustdoc is able to load `rustc_driver` from the sysroot, ui-fulldeps tests should also be able to load it from the sysroot. That allows us to run fulldeps tests with stage1, without having to fully rebuild the compiler twice. It does unfortunately have the downside that we're running the tests on the *bootstrap* compiler, not the in-tree sources, but since most of the fulldeps tests are for the *API* of the compiler, that seems ok. I think it's possible to extend this to `run-make-fulldeps`, but I've run out of energy for tonight. - Move `plugin` tests into a subdirectory. Plugins are loaded at runtime with `dlopen` and so require the ABI of the running compile to match the ABI of the compiler linked with `rustc_driver`. As a result they can't be supported in stage 1 and have to use `// ignore-stage1`. - Remove `ignore-stage1` from most non-plugin tests - Ignore diagnostic tests in stage 1. Even though this requires a stage 2 build to load rustc_driver, it's primarily testing the error message that the *running* compiler emits when the diagnostic struct is malformed. - Pass `-Zforce-unstable-if-unmarked` in stage1, not just stage2. That allows running `hash-stable-is-unstable` in stage1, since it now suggests adding `rustc_private` to enable loading the crates. - Add libLLVM.so to the stage0 target sysroot, to allow fulldeps tests that act as custom drivers to load it at runtime. - Pass `--sysroot stage0-sysroot` in compiletest so that we use the correct version of std.
2023-04-17 20:00:36 -05:00
//@ ignore-stage1
//@ ignore-beta
//@ ignore-stable
#![feature(rustc_private)]
#![crate_type = "lib"]
extern crate rustc_errors;
extern crate rustc_fluent_macro;
2022-10-20 14:09:54 -05:00
extern crate rustc_macros;
extern crate rustc_session;
extern crate rustc_span;
use rustc_errors::{Applicability, DiagMessage, SubdiagMessage};
use rustc_macros::Subdiagnostic;
2022-10-20 14:09:54 -05:00
use rustc_span::Span;
rustc_fluent_macro::fluent_messages! { "./example.ftl" }
#[derive(Subdiagnostic)]
#[label(no_crate_example)]
struct A {
#[primary_span]
span: Span,
var: String,
}
#[derive(Subdiagnostic)]
enum B {
#[label(no_crate_example)]
A {
#[primary_span]
span: Span,
var: String,
},
#[label(no_crate_example)]
B {
#[primary_span]
span: Span,
var: String,
2022-10-20 14:09:54 -05:00
},
}
#[derive(Subdiagnostic)]
#[label(no_crate_example)]
//~^ ERROR label without `#[primary_span]` field
struct C {
var: String,
}
#[derive(Subdiagnostic)]
#[label]
//~^ ERROR diagnostic slug must be first argument
struct D {
#[primary_span]
span: Span,
var: String,
}
#[derive(Subdiagnostic)]
#[foo]
//~^ ERROR `#[foo]` is not a valid attribute
//~^^ ERROR cannot find attribute `foo` in this scope
struct E {
#[primary_span]
span: Span,
var: String,
}
#[derive(Subdiagnostic)]
#[label = "..."]
//~^ ERROR `#[label = ...]` is not a valid attribute
struct F {
#[primary_span]
span: Span,
var: String,
}
#[derive(Subdiagnostic)]
#[label(bug = "...")]
//~^ ERROR only `no_span` is a valid nested attribute
//~| ERROR diagnostic slug must be first argument
struct G {
#[primary_span]
span: Span,
var: String,
}
#[derive(Subdiagnostic)]
#[label("...")]
//~^ ERROR failed to resolve: you might be missing crate `core`
//~| NOTE you might be missing crate `core`
struct H {
#[primary_span]
span: Span,
var: String,
}
#[derive(Subdiagnostic)]
#[label(slug = 4)]
//~^ ERROR only `no_span` is a valid nested attribute
//~| ERROR diagnostic slug must be first argument
struct J {
#[primary_span]
span: Span,
var: String,
}
#[derive(Subdiagnostic)]
#[label(slug("..."))]
//~^ ERROR only `no_span` is a valid nested attribute
//~| ERROR diagnostic slug must be first argument
struct K {
#[primary_span]
span: Span,
var: String,
}
#[derive(Subdiagnostic)]
#[label(slug)]
//~^ ERROR cannot find value `slug` in module `crate::fluent_generated`
//~^^ NOTE not found in `crate::fluent_generated`
struct L {
#[primary_span]
span: Span,
var: String,
}
#[derive(Subdiagnostic)]
#[label()]
2023-07-26 03:42:40 -05:00
//~^ ERROR diagnostic slug must be first argument of a `#[label(...)]` attribute
struct M {
#[primary_span]
span: Span,
var: String,
}
#[derive(Subdiagnostic)]
#[label(no_crate_example, code = "...")]
//~^ ERROR only `no_span` is a valid nested attribute
struct N {
#[primary_span]
span: Span,
var: String,
}
#[derive(Subdiagnostic)]
#[label(no_crate_example, applicability = "machine-applicable")]
//~^ ERROR only `no_span` is a valid nested attribute
struct O {
#[primary_span]
span: Span,
var: String,
}
#[derive(Subdiagnostic)]
#[foo]
//~^ ERROR cannot find attribute `foo` in this scope
//~^^ ERROR unsupported type attribute for subdiagnostic enum
enum P {
#[label(no_crate_example)]
A {
#[primary_span]
span: Span,
var: String,
2022-10-20 14:09:54 -05:00
},
}
#[derive(Subdiagnostic)]
enum Q {
#[bar]
//~^ ERROR `#[bar]` is not a valid attribute
//~^^ ERROR cannot find attribute `bar` in this scope
A {
#[primary_span]
span: Span,
var: String,
2022-10-20 14:09:54 -05:00
},
}
#[derive(Subdiagnostic)]
enum R {
#[bar = "..."]
//~^ ERROR `#[bar = ...]` is not a valid attribute
//~^^ ERROR cannot find attribute `bar` in this scope
A {
#[primary_span]
span: Span,
var: String,
2022-10-20 14:09:54 -05:00
},
}
#[derive(Subdiagnostic)]
enum S {
#[bar = 4]
//~^ ERROR `#[bar = ...]` is not a valid attribute
//~^^ ERROR cannot find attribute `bar` in this scope
A {
#[primary_span]
span: Span,
var: String,
2022-10-20 14:09:54 -05:00
},
}
#[derive(Subdiagnostic)]
enum T {
#[bar("...")]
//~^ ERROR `#[bar(...)]` is not a valid attribute
//~^^ ERROR cannot find attribute `bar` in this scope
A {
#[primary_span]
span: Span,
var: String,
2022-10-20 14:09:54 -05:00
},
}
#[derive(Subdiagnostic)]
enum U {
#[label(code = "...")]
//~^ ERROR diagnostic slug must be first argument of a `#[label(...)]` attribute
//~| ERROR only `no_span` is a valid nested attribute
A {
#[primary_span]
span: Span,
var: String,
2022-10-20 14:09:54 -05:00
},
}
#[derive(Subdiagnostic)]
enum V {
#[label(no_crate_example)]
A {
#[primary_span]
span: Span,
var: String,
},
B {
#[primary_span]
span: Span,
var: String,
2022-10-20 14:09:54 -05:00
},
}
#[derive(Subdiagnostic)]
#[label(no_crate_example)]
//~^ ERROR label without `#[primary_span]` field
struct W {
#[primary_span]
//~^ ERROR the `#[primary_span]` attribute can only be applied to fields of type `Span` or `MultiSpan`
span: String,
}
#[derive(Subdiagnostic)]
#[label(no_crate_example)]
struct X {
#[primary_span]
span: Span,
#[applicability]
//~^ ERROR `#[applicability]` is only valid on suggestions
applicability: Applicability,
}
#[derive(Subdiagnostic)]
#[label(no_crate_example)]
struct Y {
#[primary_span]
span: Span,
#[bar]
//~^ ERROR `#[bar]` is not a valid attribute
//~^^ ERROR cannot find attribute `bar` in this scope
bar: String,
}
#[derive(Subdiagnostic)]
#[label(no_crate_example)]
struct Z {
#[primary_span]
span: Span,
#[bar = "..."]
//~^ ERROR `#[bar = ...]` is not a valid attribute
//~^^ ERROR cannot find attribute `bar` in this scope
bar: String,
}
#[derive(Subdiagnostic)]
#[label(no_crate_example)]
struct AA {
#[primary_span]
span: Span,
#[bar("...")]
//~^ ERROR `#[bar(...)]` is not a valid attribute
//~^^ ERROR cannot find attribute `bar` in this scope
bar: String,
}
#[derive(Subdiagnostic)]
#[label(no_crate_example)]
struct AB {
#[primary_span]
span: Span,
#[skip_arg]
2022-10-20 14:09:54 -05:00
z: Z,
}
#[derive(Subdiagnostic)]
union AC {
//~^ ERROR failed to resolve: you might be missing crate `core`
//~| NOTE you might be missing crate `core`
span: u32,
2022-10-20 14:09:54 -05:00
b: u64,
}
#[derive(Subdiagnostic)]
#[label(no_crate_example)]
#[label(no_crate_example)]
struct AD {
#[primary_span]
span: Span,
}
#[derive(Subdiagnostic)]
#[label(no_crate_example, no_crate::example)]
2023-04-03 10:11:30 -05:00
//~^ ERROR a diagnostic slug must be the first argument to the attribute
struct AE {
#[primary_span]
span: Span,
}
#[derive(Subdiagnostic)]
#[label(no_crate_example)]
struct AF {
#[primary_span]
//~^ NOTE previously specified here
span_a: Span,
#[primary_span]
//~^ ERROR specified multiple times
span_b: Span,
}
#[derive(Subdiagnostic)]
struct AG {
//~^ ERROR subdiagnostic kind not specified
#[primary_span]
span: Span,
}
#[derive(Subdiagnostic)]
#[suggestion(no_crate_example, code = "...")]
struct AH {
#[primary_span]
span: Span,
#[applicability]
applicability: Applicability,
var: String,
}
#[derive(Subdiagnostic)]
enum AI {
#[suggestion(no_crate_example, code = "...")]
A {
#[primary_span]
span: Span,
#[applicability]
applicability: Applicability,
var: String,
},
#[suggestion(no_crate_example, code = "...")]
B {
#[primary_span]
span: Span,
#[applicability]
applicability: Applicability,
var: String,
2022-10-20 14:09:54 -05:00
},
}
#[derive(Subdiagnostic)]
#[suggestion(no_crate_example, code = "...", code = "...")]
//~^ ERROR specified multiple times
//~^^ NOTE previously specified here
struct AJ {
#[primary_span]
span: Span,
#[applicability]
applicability: Applicability,
}
#[derive(Subdiagnostic)]
#[suggestion(no_crate_example, code = "...")]
struct AK {
#[primary_span]
span: Span,
#[applicability]
//~^ NOTE previously specified here
applicability_a: Applicability,
#[applicability]
//~^ ERROR specified multiple times
applicability_b: Applicability,
}
#[derive(Subdiagnostic)]
#[suggestion(no_crate_example, code = "...")]
struct AL {
#[primary_span]
span: Span,
#[applicability]
//~^ ERROR the `#[applicability]` attribute can only be applied to fields of type `Applicability`
applicability: Span,
}
#[derive(Subdiagnostic)]
#[suggestion(no_crate_example, code = "...")]
struct AM {
#[primary_span]
span: Span,
}
#[derive(Subdiagnostic)]
#[suggestion(no_crate_example)]
//~^ ERROR suggestion without `code = "..."`
struct AN {
#[primary_span]
span: Span,
#[applicability]
applicability: Applicability,
}
#[derive(Subdiagnostic)]
#[suggestion(no_crate_example, code = "...", applicability = "foo")]
//~^ ERROR invalid applicability
struct AO {
#[primary_span]
span: Span,
}
#[derive(Subdiagnostic)]
#[help(no_crate_example)]
struct AP {
2022-10-20 14:09:54 -05:00
var: String,
}
#[derive(Subdiagnostic)]
#[note(no_crate_example)]
struct AQ;
#[derive(Subdiagnostic)]
#[suggestion(no_crate_example, code = "...")]
//~^ ERROR suggestion without `#[primary_span]` field
struct AR {
var: String,
}
#[derive(Subdiagnostic)]
#[suggestion(no_crate_example, code = "...", applicability = "machine-applicable")]
struct AS {
#[primary_span]
span: Span,
}
#[derive(Subdiagnostic)]
#[label]
//~^ ERROR unsupported type attribute for subdiagnostic enum
enum AT {
#[label(no_crate_example)]
A {
#[primary_span]
span: Span,
var: String,
2022-10-20 14:09:54 -05:00
},
}
#[derive(Subdiagnostic)]
#[suggestion(no_crate_example, code = "{var}", applicability = "machine-applicable")]
struct AU {
#[primary_span]
span: Span,
var: String,
}
#[derive(Subdiagnostic)]
#[suggestion(no_crate_example, code = "{var}", applicability = "machine-applicable")]
//~^ ERROR `var` doesn't refer to a field on this type
struct AV {
#[primary_span]
span: Span,
}
#[derive(Subdiagnostic)]
enum AW {
#[suggestion(no_crate_example, code = "{var}", applicability = "machine-applicable")]
A {
#[primary_span]
span: Span,
var: String,
2022-10-20 14:09:54 -05:00
},
}
#[derive(Subdiagnostic)]
enum AX {
#[suggestion(no_crate_example, code = "{var}", applicability = "machine-applicable")]
2022-10-20 14:09:54 -05:00
//~^ ERROR `var` doesn't refer to a field on this type
A {
#[primary_span]
span: Span,
2022-10-20 14:09:54 -05:00
},
}
#[derive(Subdiagnostic)]
#[warning(no_crate_example)]
struct AY {}
#[derive(Subdiagnostic)]
#[warning(no_crate_example)]
struct AZ {
#[primary_span]
span: Span,
}
#[derive(Subdiagnostic)]
#[suggestion(no_crate_example, code = "...")]
//~^ ERROR suggestion without `#[primary_span]` field
struct BA {
#[suggestion_part]
//~^ ERROR `#[suggestion_part]` is not a valid attribute
span: Span,
#[suggestion_part(code = "...")]
//~^ ERROR `#[suggestion_part(...)]` is not a valid attribute
span2: Span,
#[applicability]
applicability: Applicability,
var: String,
}
#[derive(Subdiagnostic)]
#[multipart_suggestion(no_crate_example, code = "...", applicability = "machine-applicable")]
//~^ ERROR multipart suggestion without any `#[suggestion_part(...)]` fields
2023-04-03 10:11:30 -05:00
//~| ERROR invalid nested attribute
struct BBa {
var: String,
}
#[derive(Subdiagnostic)]
#[multipart_suggestion(no_crate_example, applicability = "machine-applicable")]
struct BBb {
#[suggestion_part]
//~^ ERROR `#[suggestion_part(...)]` attribute without `code = "..."`
span1: Span,
}
#[derive(Subdiagnostic)]
#[multipart_suggestion(no_crate_example, applicability = "machine-applicable")]
struct BBc {
#[suggestion_part()]
2023-07-26 03:42:40 -05:00
//~^ ERROR `#[suggestion_part(...)]` attribute without `code = "..."`
span1: Span,
}
#[derive(Subdiagnostic)]
#[multipart_suggestion(no_crate_example)]
//~^ ERROR multipart suggestion without any `#[suggestion_part(...)]` fields
struct BC {
#[primary_span]
//~^ ERROR `#[primary_span]` is not a valid attribute
span: Span,
}
#[derive(Subdiagnostic)]
#[multipart_suggestion(no_crate_example)]
struct BD {
#[suggestion_part]
//~^ ERROR `#[suggestion_part(...)]` attribute without `code = "..."`
span1: Span,
#[suggestion_part()]
2023-07-26 03:42:40 -05:00
//~^ ERROR `#[suggestion_part(...)]` attribute without `code = "..."`
span2: Span,
#[suggestion_part(foo = "bar")]
2023-04-03 10:11:30 -05:00
//~^ ERROR `code` is the only valid nested attribute
//~| ERROR failed to resolve: you might be missing crate `core`
//~| NOTE you might be missing crate `core`
span4: Span,
#[suggestion_part(code = "...")]
//~^ ERROR the `#[suggestion_part(...)]` attribute can only be applied to fields of type `Span` or `MultiSpan`
s1: String,
#[suggestion_part()]
//~^ ERROR the `#[suggestion_part(...)]` attribute can only be applied to fields of type `Span` or `MultiSpan`
s2: String,
}
#[derive(Subdiagnostic)]
#[multipart_suggestion(no_crate_example, applicability = "machine-applicable")]
struct BE {
#[suggestion_part(code = "...", code = ",,,")]
//~^ ERROR specified multiple times
//~| NOTE previously specified here
span: Span,
}
#[derive(Subdiagnostic)]
#[multipart_suggestion(no_crate_example, applicability = "machine-applicable")]
struct BF {
#[suggestion_part(code = "(")]
first: Span,
#[suggestion_part(code = ")")]
second: Span,
}
#[derive(Subdiagnostic)]
#[multipart_suggestion(no_crate_example)]
struct BG {
#[applicability]
appl: Applicability,
#[suggestion_part(code = "(")]
first: Span,
#[suggestion_part(code = ")")]
second: Span,
}
#[derive(Subdiagnostic)]
#[multipart_suggestion(no_crate_example, applicability = "machine-applicable")]
struct BH {
#[applicability]
//~^ ERROR `#[applicability]` has no effect
appl: Applicability,
#[suggestion_part(code = "(")]
first: Span,
#[suggestion_part(code = ")")]
second: Span,
}
#[derive(Subdiagnostic)]
#[multipart_suggestion(no_crate_example, applicability = "machine-applicable")]
struct BI {
#[suggestion_part(code = "")]
spans: Vec<Span>,
}
#[derive(Subdiagnostic)]
#[label(no_crate_example)]
struct BJ {
#[primary_span]
span: Span,
r#type: String,
}
/// with a doc comment on the type..
#[derive(Subdiagnostic)]
#[label(no_crate_example)]
struct BK {
/// ..and the field
#[primary_span]
span: Span,
}
/// with a doc comment on the type..
#[derive(Subdiagnostic)]
enum BL {
/// ..and the variant..
#[label(no_crate_example)]
Foo {
/// ..and the field
#[primary_span]
span: Span,
2022-10-20 14:09:54 -05:00
},
}
#[derive(Subdiagnostic)]
#[multipart_suggestion(no_crate_example)]
struct BM {
#[suggestion_part(code("foo"))]
//~^ ERROR expected exactly one string literal for `code = ...`
//~| ERROR failed to resolve: you might be missing crate `core`
//~| NOTE you might be missing crate `core`
span: Span,
r#type: String,
}
#[derive(Subdiagnostic)]
#[multipart_suggestion(no_crate_example)]
struct BN {
#[suggestion_part(code("foo", "bar"))]
//~^ ERROR expected exactly one string literal for `code = ...`
//~| ERROR failed to resolve: you might be missing crate `core`
//~| NOTE you might be missing crate `core`
span: Span,
r#type: String,
}
#[derive(Subdiagnostic)]
#[multipart_suggestion(no_crate_example)]
struct BO {
#[suggestion_part(code(3))]
//~^ ERROR expected exactly one string literal for `code = ...`
//~| ERROR failed to resolve: you might be missing crate `core`
//~| NOTE you might be missing crate `core`
span: Span,
r#type: String,
}
#[derive(Subdiagnostic)]
#[multipart_suggestion(no_crate_example)]
struct BP {
#[suggestion_part(code())]
//~^ ERROR expected exactly one string literal for `code = ...`
span: Span,
r#type: String,
}
#[derive(Subdiagnostic)]
2023-04-03 10:11:30 -05:00
//~^ ERROR cannot find value `__code_29` in this scope
//~| NOTE in this expansion
//~| NOTE not found in this scope
#[multipart_suggestion(no_crate_example)]
struct BQ {
#[suggestion_part(code = 3)]
//~^ ERROR failed to resolve: you might be missing crate `core`
//~| NOTE you might be missing crate `core`
span: Span,
r#type: String,
}
#[derive(Subdiagnostic)]
#[suggestion(no_crate_example, code = "")]
struct SuggestionStyleDefault {
#[primary_span]
sub: Span,
}
#[derive(Subdiagnostic)]
#[suggestion(no_crate_example, code = "", style = "short")]
struct SuggestionStyleShort {
#[primary_span]
sub: Span,
}
#[derive(Subdiagnostic)]
#[suggestion(no_crate_example, code = "", style = "hidden")]
struct SuggestionStyleHidden {
#[primary_span]
sub: Span,
}
#[derive(Subdiagnostic)]
#[suggestion(no_crate_example, code = "", style = "verbose")]
struct SuggestionStyleVerbose {
#[primary_span]
sub: Span,
}
2022-10-20 14:17:14 -05:00
#[derive(Subdiagnostic)]
#[suggestion(no_crate_example, code = "", style = "tool-only")]
2022-10-20 14:17:14 -05:00
struct SuggestionStyleToolOnly {
#[primary_span]
sub: Span,
}
#[derive(Subdiagnostic)]
#[suggestion(no_crate_example, code = "", style = "hidden", style = "normal")]
//~^ ERROR specified multiple times
//~| NOTE previously specified here
struct SuggestionStyleTwice {
#[primary_span]
sub: Span,
}
2022-10-22 10:21:11 -05:00
#[derive(Subdiagnostic)]
#[suggestion_hidden(no_crate_example, code = "")]
2022-10-22 10:21:11 -05:00
//~^ ERROR #[suggestion_hidden(...)]` is not a valid attribute
struct SuggestionStyleOldSyntax {
#[primary_span]
sub: Span,
}
#[derive(Subdiagnostic)]
#[suggestion_hidden(no_crate_example, code = "", style = "normal")]
2022-10-22 10:21:11 -05:00
//~^ ERROR #[suggestion_hidden(...)]` is not a valid attribute
struct SuggestionStyleOldAndNewSyntax {
#[primary_span]
sub: Span,
}
#[derive(Subdiagnostic)]
#[suggestion(no_crate_example, code = "", style = "foo")]
//~^ ERROR invalid suggestion style
struct SuggestionStyleInvalid1 {
#[primary_span]
sub: Span,
}
#[derive(Subdiagnostic)]
#[suggestion(no_crate_example, code = "", style = 42)]
2023-04-03 10:11:30 -05:00
//~^ ERROR expected `= "xxx"`
struct SuggestionStyleInvalid2 {
#[primary_span]
sub: Span,
}
#[derive(Subdiagnostic)]
#[suggestion(no_crate_example, code = "", style)]
2023-04-03 10:11:30 -05:00
//~^ ERROR a diagnostic slug must be the first argument to the attribute
struct SuggestionStyleInvalid3 {
#[primary_span]
sub: Span,
}
#[derive(Subdiagnostic)]
#[suggestion(no_crate_example, code = "", style("foo"))]
2023-04-03 10:11:30 -05:00
//~^ ERROR expected `= "xxx"`
//~| ERROR failed to resolve: you might be missing crate `core`
//~| NOTE you might be missing crate `core`
struct SuggestionStyleInvalid4 {
#[primary_span]
sub: Span,
}
#[derive(Subdiagnostic)]
#[suggestion(no_crate_example, code = "")]
//~^ ERROR suggestion without `#[primary_span]` field
struct PrimarySpanOnVec {
#[primary_span]
//~^ ERROR `#[primary_span]` is not a valid attribute
//~| NOTE there must be exactly one primary span
sub: Vec<Span>,
}
2024-04-20 07:52:05 -05:00
#[derive(Subdiagnostic)]
struct NestedParent {
#[subdiagnostic]
single_sub: A,
#[subdiagnostic]
option_sub: Option<A>,
#[subdiagnostic]
vec_sub: Vec<A>,
}