Create E0777 error code for "invalid literal in derive"
This commit is contained in:
parent
782013564e
commit
de21c3df0e
5 changed files with 44 additions and 4 deletions
|
@ -459,6 +459,7 @@ E0773: include_str!("./error_codes/E0773.md"),
|
|||
E0774: include_str!("./error_codes/E0774.md"),
|
||||
E0775: include_str!("./error_codes/E0775.md"),
|
||||
E0776: include_str!("./error_codes/E0776.md"),
|
||||
E0777: include_str!("./error_codes/E0777.md"),
|
||||
;
|
||||
// E0006, // merged with E0005
|
||||
// E0008, // cannot bind by-move into a pattern guard
|
||||
|
|
19
compiler/rustc_error_codes/src/error_codes/E0777.md
Normal file
19
compiler/rustc_error_codes/src/error_codes/E0777.md
Normal file
|
@ -0,0 +1,19 @@
|
|||
A literal value was used inside `#[derive]`.
|
||||
|
||||
Erroneous code example:
|
||||
|
||||
```compile_fail,E0777
|
||||
#[derive("Clone")] // error!
|
||||
struct Foo;
|
||||
```
|
||||
|
||||
Only paths to traits are allowed as argument inside `#[derive]`. You can find
|
||||
more information about the `#[derive]` attribute in the [Rust Book].
|
||||
|
||||
|
||||
```
|
||||
#[derive(Clone)] // ok!
|
||||
struct Foo;
|
||||
```
|
||||
|
||||
[Rust Book]: https://doc.rust-lang.org/book/appendix-03-derivable-traits.html
|
|
@ -5,7 +5,7 @@ use rustc_ast::token;
|
|||
use rustc_ast::tokenstream::{TokenStream, TokenTree};
|
||||
use rustc_ast::{self as ast, *};
|
||||
use rustc_data_structures::sync::Lrc;
|
||||
use rustc_errors::{Applicability, ErrorReported};
|
||||
use rustc_errors::{struct_span_err, Applicability, ErrorReported};
|
||||
use rustc_parse::nt_to_tokenstream;
|
||||
use rustc_span::symbol::sym;
|
||||
use rustc_span::{Span, DUMMY_SP};
|
||||
|
@ -182,7 +182,12 @@ crate fn collect_derives(cx: &mut ExtCtxt<'_>, attrs: &mut Vec<ast::Attribute>)
|
|||
.filter_map(|nmi| match nmi {
|
||||
NestedMetaItem::Literal(lit) => {
|
||||
error_reported_filter_map = true;
|
||||
cx.struct_span_err(lit.span, "expected path to a trait, found literal")
|
||||
struct_span_err!(
|
||||
cx.sess,
|
||||
lit.span,
|
||||
E0777,
|
||||
"expected path to a trait, found literal",
|
||||
)
|
||||
.help("for example, write `#[derive(Debug)]` for `Debug`")
|
||||
.emit();
|
||||
None
|
||||
|
|
4
src/test/ui/error-codes/E0777.rs
Normal file
4
src/test/ui/error-codes/E0777.rs
Normal file
|
@ -0,0 +1,4 @@
|
|||
#[derive("Clone")] //~ ERROR E0777
|
||||
struct Foo;
|
||||
|
||||
fn main() {}
|
11
src/test/ui/error-codes/E0777.stderr
Normal file
11
src/test/ui/error-codes/E0777.stderr
Normal file
|
@ -0,0 +1,11 @@
|
|||
error[E0777]: expected path to a trait, found literal
|
||||
--> $DIR/E0777.rs:1:10
|
||||
|
|
||||
LL | #[derive("Clone")]
|
||||
| ^^^^^^^
|
||||
|
|
||||
= help: for example, write `#[derive(Debug)]` for `Debug`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0777`.
|
Loading…
Add table
Add a link
Reference in a new issue