Skip to content

Commit 8ab115c

Browse files
committedDec 7, 2018

19 files changed

+30
-213
lines changed
 

‎src/librustc_driver/driver.rs

-2
Original file line numberDiff line numberDiff line change
@@ -908,7 +908,6 @@ where
908908
}
909909
});
910910

911-
let whitelisted_legacy_custom_derives = registry.take_whitelisted_custom_derives();
912911
let Registry {
913912
syntax_exts,
914913
early_lint_passes,
@@ -955,7 +954,6 @@ where
955954
crate_loader,
956955
&resolver_arenas,
957956
);
958-
resolver.whitelisted_legacy_custom_derives = whitelisted_legacy_custom_derives;
959957
syntax_ext::register_builtins(&mut resolver, syntax_exts, sess.features_untracked().quote);
960958

961959
// Expand all macros

‎src/librustc_plugin/registry.rs

-16
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,6 @@ pub struct Registry<'a> {
6060

6161
#[doc(hidden)]
6262
pub attributes: Vec<(String, AttributeType)>,
63-
64-
whitelisted_custom_derives: Vec<ast::Name>,
6563
}
6664

6765
impl<'a> Registry<'a> {
@@ -77,7 +75,6 @@ impl<'a> Registry<'a> {
7775
lint_groups: FxHashMap::default(),
7876
llvm_passes: vec![],
7977
attributes: vec![],
80-
whitelisted_custom_derives: Vec::new(),
8178
}
8279
}
8380

@@ -130,19 +127,6 @@ impl<'a> Registry<'a> {
130127
}));
131128
}
132129

133-
/// This can be used in place of `register_syntax_extension` to register legacy custom derives
134-
/// (i.e. attribute syntax extensions whose name begins with `derive_`). Legacy custom
135-
/// derives defined by this function do not trigger deprecation warnings when used.
136-
pub fn register_custom_derive(&mut self, name: ast::Name, extension: SyntaxExtension) {
137-
assert!(name.as_str().starts_with("derive_"));
138-
self.whitelisted_custom_derives.push(name);
139-
self.register_syntax_extension(name, extension);
140-
}
141-
142-
pub fn take_whitelisted_custom_derives(&mut self) -> Vec<ast::Name> {
143-
::std::mem::replace(&mut self.whitelisted_custom_derives, Vec::new())
144-
}
145-
146130
/// Register a macro of the usual kind.
147131
///
148132
/// This is a convenience wrapper for `register_syntax_extension`.

‎src/librustc_resolve/lib.rs

-2
Original file line numberDiff line numberDiff line change
@@ -1588,7 +1588,6 @@ pub struct Resolver<'a, 'b: 'a> {
15881588
macro_map: FxHashMap<DefId, Lrc<SyntaxExtension>>,
15891589
macro_defs: FxHashMap<Mark, DefId>,
15901590
local_macro_def_scopes: FxHashMap<NodeId, Module<'a>>,
1591-
pub whitelisted_legacy_custom_derives: Vec<Name>,
15921591
pub found_unresolved_macro: bool,
15931592

15941593
/// List of crate local macros that we need to warn about as being unused.
@@ -1922,7 +1921,6 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
19221921
macro_defs,
19231922
local_macro_def_scopes: FxHashMap::default(),
19241923
name_already_seen: FxHashMap::default(),
1925-
whitelisted_legacy_custom_derives: Vec::new(),
19261924
potentially_unused_imports: Vec::new(),
19271925
struct_constructors: Default::default(),
19281926
found_unresolved_macro: false,

‎src/librustc_resolve/macros.rs

+3-99
Original file line numberDiff line numberDiff line change
@@ -21,22 +21,18 @@ use rustc::hir::def_id::{DefId, CRATE_DEF_INDEX, DefIndex,
2121
use rustc::hir::def::{Def, NonMacroAttrKind};
2222
use rustc::hir::map::{self, DefCollector};
2323
use rustc::{ty, lint};
24-
use syntax::ast::{self, Name, Ident};
24+
use syntax::ast::{self, Ident};
2525
use syntax::attr;
2626
use syntax::errors::DiagnosticBuilder;
2727
use syntax::ext::base::{self, Determinacy};
28-
use syntax::ext::base::{MacroKind, SyntaxExtension, Resolver as SyntaxResolver};
28+
use syntax::ext::base::{MacroKind, SyntaxExtension};
2929
use syntax::ext::expand::{AstFragment, Invocation, InvocationKind};
3030
use syntax::ext::hygiene::{self, Mark};
3131
use syntax::ext::tt::macro_rules;
32-
use syntax::feature_gate::{self, feature_err, emit_feature_err, is_builtin_attr_name, GateIssue};
33-
use syntax::feature_gate::EXPLAIN_DERIVE_UNDERSCORE;
32+
use syntax::feature_gate::{feature_err, is_builtin_attr_name, GateIssue};
3433
use syntax::fold::{self, Folder};
35-
use syntax::parse::parser::PathStyle;
36-
use syntax::parse::token::{self, Token};
3734
use syntax::ptr::P;
3835
use syntax::symbol::{Symbol, keywords};
39-
use syntax::tokenstream::{TokenStream, TokenTree, Delimited, DelimSpan};
4036
use syntax::util::lev_distance::find_best_match_for_name;
4137
use syntax_pos::{Span, DUMMY_SP};
4238
use errors::Applicability;
@@ -194,10 +190,6 @@ impl<'a, 'crateloader: 'a> base::Resolver for Resolver<'a, 'crateloader> {
194190
ret.into_iter().next().unwrap()
195191
}
196192

197-
fn is_whitelisted_legacy_custom_derive(&self, name: Name) -> bool {
198-
self.whitelisted_legacy_custom_derives.contains(&name)
199-
}
200-
201193
fn visit_ast_fragment_with_placeholders(&mut self, mark: Mark, fragment: &AstFragment,
202194
derives: &[Mark]) {
203195
let invocation = self.invocations[&mark];
@@ -240,79 +232,6 @@ impl<'a, 'crateloader: 'a> base::Resolver for Resolver<'a, 'crateloader> {
240232
ImportResolver { resolver: self }.resolve_imports()
241233
}
242234

243-
// Resolves attribute and derive legacy macros from `#![plugin(..)]`.
244-
fn find_legacy_attr_invoc(&mut self, attrs: &mut Vec<ast::Attribute>, allow_derive: bool)
245-
-> Option<ast::Attribute> {
246-
if !allow_derive {
247-
return None;
248-
}
249-
250-
// Check for legacy derives
251-
for i in 0..attrs.len() {
252-
let name = attrs[i].name();
253-
254-
if name == "derive" {
255-
let result = attrs[i].parse_list(&self.session.parse_sess, |parser| {
256-
parser.parse_path_allowing_meta(PathStyle::Mod)
257-
});
258-
259-
let mut traits = match result {
260-
Ok(traits) => traits,
261-
Err(mut e) => {
262-
e.cancel();
263-
continue
264-
}
265-
};
266-
267-
for j in 0..traits.len() {
268-
if traits[j].segments.len() > 1 {
269-
continue
270-
}
271-
let trait_name = traits[j].segments[0].ident.name;
272-
let legacy_name = Symbol::intern(&format!("derive_{}", trait_name));
273-
if !self.builtin_macros.contains_key(&legacy_name) {
274-
continue
275-
}
276-
let span = traits.remove(j).span;
277-
self.gate_legacy_custom_derive(legacy_name, span);
278-
if traits.is_empty() {
279-
attrs.remove(i);
280-
} else {
281-
let mut tokens = Vec::with_capacity(traits.len() - 1);
282-
for (j, path) in traits.iter().enumerate() {
283-
if j > 0 {
284-
tokens.push(TokenTree::Token(attrs[i].span, Token::Comma).into());
285-
}
286-
tokens.reserve((path.segments.len() * 2).saturating_sub(1));
287-
for (k, segment) in path.segments.iter().enumerate() {
288-
if k > 0 {
289-
tokens.push(TokenTree::Token(path.span, Token::ModSep).into());
290-
}
291-
let tok = Token::from_ast_ident(segment.ident);
292-
tokens.push(TokenTree::Token(path.span, tok).into());
293-
}
294-
}
295-
let delim_span = DelimSpan::from_single(attrs[i].span);
296-
attrs[i].tokens = TokenTree::Delimited(delim_span, Delimited {
297-
delim: token::Paren,
298-
tts: TokenStream::concat(tokens).into(),
299-
}).into();
300-
}
301-
return Some(ast::Attribute {
302-
path: ast::Path::from_ident(Ident::new(legacy_name, span)),
303-
tokens: TokenStream::empty(),
304-
id: attr::mk_attr_id(),
305-
style: ast::AttrStyle::Outer,
306-
is_sugared_doc: false,
307-
span,
308-
});
309-
}
310-
}
311-
}
312-
313-
None
314-
}
315-
316235
fn resolve_macro_invocation(&mut self, invoc: &Invocation, invoc_id: Mark, force: bool)
317236
-> Result<Option<Lrc<SyntaxExtension>>, Determinacy> {
318237
let (path, kind, derives_in_scope, after_derive) = match invoc.kind {
@@ -430,11 +349,6 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
430349
feature_err(&self.session.parse_sess, "rustc_attrs", path.span,
431350
GateIssue::Language, &msg).emit();
432351
}
433-
} else if name.starts_with("derive_") {
434-
if !features.custom_derive {
435-
feature_err(&self.session.parse_sess, "custom_derive", path.span,
436-
GateIssue::Language, EXPLAIN_DERIVE_UNDERSCORE).emit();
437-
}
438352
} else if !features.custom_attribute {
439353
let msg = format!("The attribute `{}` is currently unknown to the \
440354
compiler and may have meaning added to it in the \
@@ -1218,14 +1132,4 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
12181132
self.define(module, ident, MacroNS, (def, vis, item.span, expansion));
12191133
}
12201134
}
1221-
1222-
fn gate_legacy_custom_derive(&mut self, name: Symbol, span: Span) {
1223-
if !self.session.features_untracked().custom_derive {
1224-
let sess = &self.session.parse_sess;
1225-
let explain = feature_gate::EXPLAIN_CUSTOM_DERIVE;
1226-
emit_feature_err(sess, "custom_derive", span, GateIssue::Language, explain);
1227-
} else if !self.is_whitelisted_legacy_custom_derive(name) {
1228-
self.session.span_warn(span, feature_gate::EXPLAIN_DEPR_CUSTOM_DERIVE);
1229-
}
1230-
}
12311135
}

‎src/libsyntax/ext/base.rs

-7
Original file line numberDiff line numberDiff line change
@@ -733,16 +733,12 @@ pub trait Resolver {
733733
fn next_node_id(&mut self) -> ast::NodeId;
734734
fn get_module_scope(&mut self, id: ast::NodeId) -> Mark;
735735
fn eliminate_crate_var(&mut self, item: P<ast::Item>) -> P<ast::Item>;
736-
fn is_whitelisted_legacy_custom_derive(&self, name: Name) -> bool;
737736

738737
fn visit_ast_fragment_with_placeholders(&mut self, mark: Mark, fragment: &AstFragment,
739738
derives: &[Mark]);
740739
fn add_builtin(&mut self, ident: ast::Ident, ext: Lrc<SyntaxExtension>);
741740

742741
fn resolve_imports(&mut self);
743-
// Resolves attribute and derive legacy macros from `#![plugin(..)]`.
744-
fn find_legacy_attr_invoc(&mut self, attrs: &mut Vec<Attribute>, allow_derive: bool)
745-
-> Option<Attribute>;
746742

747743
fn resolve_macro_invocation(&mut self, invoc: &Invocation, invoc_id: Mark, force: bool)
748744
-> Result<Option<Lrc<SyntaxExtension>>, Determinacy>;
@@ -771,15 +767,12 @@ impl Resolver for DummyResolver {
771767
fn next_node_id(&mut self) -> ast::NodeId { ast::DUMMY_NODE_ID }
772768
fn get_module_scope(&mut self, _id: ast::NodeId) -> Mark { Mark::root() }
773769
fn eliminate_crate_var(&mut self, item: P<ast::Item>) -> P<ast::Item> { item }
774-
fn is_whitelisted_legacy_custom_derive(&self, _name: Name) -> bool { false }
775770

776771
fn visit_ast_fragment_with_placeholders(&mut self, _invoc: Mark, _fragment: &AstFragment,
777772
_derives: &[Mark]) {}
778773
fn add_builtin(&mut self, _ident: ast::Ident, _ext: Lrc<SyntaxExtension>) {}
779774

780775
fn resolve_imports(&mut self) {}
781-
fn find_legacy_attr_invoc(&mut self, _attrs: &mut Vec<Attribute>, _allow_derive: bool)
782-
-> Option<Attribute> { None }
783776
fn resolve_macro_invocation(&mut self, _invoc: &Invocation, _invoc_id: Mark, _force: bool)
784777
-> Result<Option<Lrc<SyntaxExtension>>, Determinacy> {
785778
Err(Determinacy::Determined)

‎src/libsyntax/ext/expand.rs

-14
Original file line numberDiff line numberDiff line change
@@ -1134,12 +1134,6 @@ impl<'a, 'b> InvocationCollector<'a, 'b> {
11341134
let (mut attr, mut traits, mut after_derive) = (None, Vec::new(), false);
11351135

11361136
item = item.map_attrs(|mut attrs| {
1137-
if let Some(legacy_attr_invoc) = self.cx.resolver.find_legacy_attr_invoc(&mut attrs,
1138-
true) {
1139-
attr = Some(legacy_attr_invoc);
1140-
return attrs;
1141-
}
1142-
11431137
attr = self.find_attr_invoc(&mut attrs, &mut after_derive);
11441138
traits = collect_derives(&mut self.cx, &mut attrs);
11451139
attrs
@@ -1156,12 +1150,6 @@ impl<'a, 'b> InvocationCollector<'a, 'b> {
11561150
let (mut attr, mut after_derive) = (None, false);
11571151

11581152
item = item.map_attrs(|mut attrs| {
1159-
if let Some(legacy_attr_invoc) = self.cx.resolver.find_legacy_attr_invoc(&mut attrs,
1160-
false) {
1161-
attr = Some(legacy_attr_invoc);
1162-
return attrs;
1163-
}
1164-
11651153
attr = self.find_attr_invoc(&mut attrs, &mut after_derive);
11661154
attrs
11671155
});
@@ -1623,15 +1611,13 @@ impl<'feat> ExpansionConfig<'feat> {
16231611
}
16241612

16251613
feature_tests! {
1626-
fn enable_quotes = quote,
16271614
fn enable_asm = asm,
16281615
fn enable_custom_test_frameworks = custom_test_frameworks,
16291616
fn enable_global_asm = global_asm,
16301617
fn enable_log_syntax = log_syntax,
16311618
fn enable_concat_idents = concat_idents,
16321619
fn enable_trace_macros = trace_macros,
16331620
fn enable_allow_internal_unstable = allow_internal_unstable,
1634-
fn enable_custom_derive = custom_derive,
16351621
fn enable_format_args_nl = format_args_nl,
16361622
fn macros_in_extern_enabled = macros_in_extern,
16371623
fn proc_macro_hygiene = proc_macro_hygiene,

‎src/libsyntax/feature_gate.rs

+3-16
Original file line numberDiff line numberDiff line change
@@ -176,10 +176,6 @@ declare_features! (
176176
// Allows the use of custom attributes; RFC 572
177177
(active, custom_attribute, "1.0.0", Some(29642), None),
178178

179-
// Allows the use of #[derive(Anything)] as sugar for
180-
// #[derive_Anything].
181-
(active, custom_derive, "1.0.0", Some(29644), None),
182-
183179
// Allows the use of rustc_* attributes; RFC 572
184180
(active, rustc_attrs, "1.0.0", Some(29642), None),
185181

@@ -530,6 +526,9 @@ declare_features! (
530526
Some("subsumed by `#![feature(proc_macro_hygiene)]`")),
531527
(removed, panic_implementation, "1.28.0", Some(44489), None,
532528
Some("subsumed by `#[panic_handler]`")),
529+
// Allows the use of `#[derive(Anything)]` as sugar for `#[derive_Anything]`.
530+
(removed, custom_derive, "1.0.0", Some(29644), None,
531+
Some("subsumed by `#[proc_macro_derive]`")),
533532
);
534533

535534
declare_features! (
@@ -1287,8 +1286,6 @@ impl<'a> Context<'a> {
12871286
"unless otherwise specified, attributes \
12881287
with the prefix `rustc_` \
12891288
are reserved for internal compiler diagnostics");
1290-
} else if name.starts_with("derive_") {
1291-
gate_feature!(self, custom_derive, attr.span, EXPLAIN_DERIVE_UNDERSCORE);
12921289
} else if !attr::is_known(attr) {
12931290
// Only run the custom attribute lint during regular
12941291
// feature gate checking. Macro gating runs
@@ -1418,16 +1415,6 @@ pub const EXPLAIN_ALLOW_INTERNAL_UNSTABLE: &str =
14181415
pub const EXPLAIN_ALLOW_INTERNAL_UNSAFE: &str =
14191416
"allow_internal_unsafe side-steps the unsafe_code lint";
14201417

1421-
pub const EXPLAIN_CUSTOM_DERIVE: &str =
1422-
"`#[derive]` for custom traits is deprecated and will be removed in the future.";
1423-
1424-
pub const EXPLAIN_DEPR_CUSTOM_DERIVE: &str =
1425-
"`#[derive]` for custom traits is deprecated and will be removed in the future. \
1426-
Prefer using procedural macro custom derive.";
1427-
1428-
pub const EXPLAIN_DERIVE_UNDERSCORE: &str =
1429-
"attributes of the form `#[derive_*]` are reserved for the compiler";
1430-
14311418
pub const EXPLAIN_UNSIZED_TUPLE_COERCION: &str =
14321419
"unsized tuple coercion is not stable enough for use and is subject to change";
14331420

‎src/libsyntax_ext/lib.rs

+3-6
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,6 @@ extern crate log;
3939

4040
mod diagnostics;
4141

42-
#[macro_use]
43-
// for custom_derive
44-
pub mod deriving;
45-
4642
mod asm;
4743
mod assert;
4844
mod cfg;
@@ -54,13 +50,14 @@ mod format;
5450
mod format_foreign;
5551
mod global_asm;
5652
mod log_syntax;
57-
mod trace_macros;
53+
mod proc_macro_server;
5854
mod test;
5955
mod test_case;
56+
mod trace_macros;
6057

58+
pub mod deriving;
6159
pub mod proc_macro_decls;
6260
pub mod proc_macro_impl;
63-
mod proc_macro_server;
6461

6562
use rustc_data_structures::sync::Lrc;
6663
use syntax::ast;

‎src/test/compile-fail/proc-macro/derive-still-gated.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
#[macro_use]
1616
extern crate derive_a;
1717

18-
#[derive_A] //~ ERROR: attributes of the form `#[derive_*]` are reserved for the compiler
18+
#[derive_A] //~ ERROR attribute `derive_A` is currently unknown
1919
struct A;
2020

2121
fn main() {}

‎src/test/run-pass-fulldeps/auxiliary/custom_derive_plugin.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@ use rustc_plugin::Registry;
3131

3232
#[plugin_registrar]
3333
pub fn plugin_registrar(reg: &mut Registry) {
34-
reg.register_custom_derive(
34+
reg.register_syntax_extension(
3535
Symbol::intern("derive_TotalSum"),
3636
MultiDecorator(box expand));
3737

38-
reg.register_custom_derive(
38+
reg.register_syntax_extension(
3939
Symbol::intern("derive_Nothing"),
4040
MultiDecorator(box noop));
4141
}

‎src/test/run-pass-fulldeps/custom-derive-partial-eq.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@
1010

1111
// aux-build:custom_derive_partial_eq.rs
1212
// ignore-stage1
13-
#![feature(plugin, custom_derive)]
13+
#![feature(plugin)]
1414
#![plugin(custom_derive_partial_eq)]
1515
#![allow(unused)]
1616

17-
#[derive(CustomPartialEq)] // Check that this is not a stability error.
17+
#[derive_CustomPartialEq] // Check that this is not a stability error.
1818
enum E { V1, V2 }
1919

2020
fn main() {}

‎src/test/run-pass-fulldeps/custom-derive-partial-eq.stderr

-6
This file was deleted.

‎src/test/run-pass-fulldeps/derive-totalsum-attr.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
// aux-build:custom_derive_plugin_attr.rs
1212
// ignore-stage1
1313

14-
#![feature(plugin, custom_derive, rustc_attrs)]
14+
#![feature(plugin, rustc_attrs)]
1515
#![plugin(custom_derive_plugin_attr)]
1616

1717
trait TotalSum {

‎src/test/run-pass-fulldeps/derive-totalsum.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
// aux-build:custom_derive_plugin.rs
1212
// ignore-stage1
1313

14-
#![feature(plugin, custom_derive)]
14+
#![feature(plugin)]
1515
#![plugin(custom_derive_plugin)]
1616

1717
trait TotalSum {
@@ -32,14 +32,14 @@ impl TotalSum for Seven {
3232
}
3333
}
3434

35-
#[derive(TotalSum)]
35+
#[derive_TotalSum]
3636
struct Foo {
3737
seven: Seven,
3838
bar: Bar,
3939
baz: isize,
4040
}
4141

42-
#[derive(TotalSum)]
42+
#[derive_TotalSum]
4343
struct Bar {
4444
quux: isize,
4545
bleh: isize,

‎src/test/run-pass-fulldeps/issue-40663.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@
1212
// aux-build:custom_derive_plugin.rs
1313
// ignore-stage1
1414

15-
#![feature(plugin, custom_derive)]
15+
#![feature(plugin)]
1616
#![plugin(custom_derive_plugin)]
1717

18-
#[derive(Nothing, Nothing, Nothing)]
18+
#[derive_Nothing]
19+
#[derive_Nothing]
20+
#[derive_Nothing]
1921
struct S;
2022

2123
fn main() {}

‎src/test/ui/feature-gates/feature-gate-custom_derive.rs

-15
This file was deleted.

‎src/test/ui/feature-gates/feature-gate-custom_derive.stderr

-11
This file was deleted.

‎src/test/ui/issues/issue-32655.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
macro_rules! foo (
1515
() => (
16-
#[derive_Clone] //~ ERROR attributes of the form
16+
#[derive_Clone] //~ ERROR attribute `derive_Clone` is currently unknown
1717
struct T;
1818
);
1919
);
@@ -25,7 +25,7 @@ macro_rules! bar (
2525
foo!();
2626

2727
bar!(
28-
#[derive_Clone] //~ ERROR attributes of the form
28+
#[derive_Clone] //~ ERROR attribute `derive_Clone` is currently unknown
2929
struct S;
3030
);
3131

‎src/test/ui/issues/issue-32655.stderr

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
1-
error[E0658]: attributes of the form `#[derive_*]` are reserved for the compiler (see issue #29644)
1+
error[E0658]: The attribute `derive_Clone` is currently unknown to the compiler and may have meaning added to it in the future (see issue #29642)
22
--> $DIR/issue-32655.rs:16:11
33
|
4-
LL | #[derive_Clone] //~ ERROR attributes of the form
4+
LL | #[derive_Clone] //~ ERROR attribute `derive_Clone` is currently unknown
55
| ^^^^^^^^^^^^
66
...
77
LL | foo!();
88
| ------- in this macro invocation
99
|
10-
= help: add #![feature(custom_derive)] to the crate attributes to enable
10+
= help: add #![feature(custom_attribute)] to the crate attributes to enable
1111

12-
error[E0658]: attributes of the form `#[derive_*]` are reserved for the compiler (see issue #29644)
12+
error[E0658]: The attribute `derive_Clone` is currently unknown to the compiler and may have meaning added to it in the future (see issue #29642)
1313
--> $DIR/issue-32655.rs:28:7
1414
|
15-
LL | #[derive_Clone] //~ ERROR attributes of the form
15+
LL | #[derive_Clone] //~ ERROR attribute `derive_Clone` is currently unknown
1616
| ^^^^^^^^^^^^
1717
|
18-
= help: add #![feature(custom_derive)] to the crate attributes to enable
18+
= help: add #![feature(custom_attribute)] to the crate attributes to enable
1919

2020
error: aborting due to 2 previous errors
2121

0 commit comments

Comments
 (0)
Please sign in to comment.