Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Add E0665
  • Loading branch information
GuillaumeGomez committed May 21, 2018
1 parent e315056 commit 8c004b8
Show file tree
Hide file tree
Showing 7 changed files with 82 additions and 17 deletions.
11 changes: 0 additions & 11 deletions src/libsyntax_ext/asm.rs
Expand Up @@ -45,17 +45,6 @@ impl State {
}
}

macro_rules! span_err_if_not_stage0 {
($cx:expr, $sp:expr, $code:ident, $text:tt) => {
#[cfg(not(stage0))] {
span_err!($cx, $sp, $code, $text)
}
#[cfg(stage0)] {
$cx.span_err($sp, $text)
}
}
}

const OPTIONS: &'static [&'static str] = &["volatile", "alignstack", "intel"];

pub fn expand_asm<'cx>(cx: &'cx mut ExtCtxt,
Expand Down
4 changes: 2 additions & 2 deletions src/libsyntax_ext/deriving/default.rs
Expand Up @@ -76,8 +76,8 @@ fn default_substructure(cx: &mut ExtCtxt, trait_span: Span, substr: &Substructur
}
}
StaticEnum(..) => {
cx.span_err(trait_span,
"`Default` cannot be derived for enums, only structs");
span_err_if_not_stage0!(cx, trait_span, E0665,
"`Default` cannot be derived for enums, only structs");
// let compilation continue
cx.expr_usize(trait_span, 0)
}
Expand Down
11 changes: 11 additions & 0 deletions src/libsyntax_ext/deriving/mod.rs
Expand Up @@ -19,6 +19,17 @@ use syntax::ptr::P;
use syntax::symbol::Symbol;
use syntax_pos::Span;

macro_rules! span_err_if_not_stage0 {
($cx:expr, $sp:expr, $code:ident, $text:tt) => {
#[cfg(not(stage0))] {
span_err!($cx, $sp, $code, $text)
}
#[cfg(stage0)] {
$cx.span_err($sp, $text)
}
}
}

macro path_local($x:ident) {
generic::ty::Path::new_local(stringify!($x))
}
Expand Down
36 changes: 35 additions & 1 deletion src/libsyntax_ext/diagnostics.rs
Expand Up @@ -82,7 +82,7 @@ A clobber was surrounded by braces in the `asm` macro.
Erroneous code example:
```compile_fail,E0663
```compile_fail,E0664
asm!("mov $$0x200, %eax"
:
:
Expand All @@ -94,4 +94,38 @@ Considering that this would be a long explanation, we instead recommend you to
take a look at the unstable book:
https://doc.rust-lang.org/unstable-book/language-features/asm.html
"##,

E0665: r##"
The `Default` trait was derived on an enum.
Erroneous code example:
```compile_fail,E0665
#[derive(Default)]
enum Food {
Sweet,
Salty,
}
```
The `Default` cannot be derived on an enum for the simple reason that the
compiler doesn't know which value to pick by default whereas it can for a
struct as long as all its fields implement the `Default` trait as well.
If you still want to implement `Default` on your enum, you'll have to do it "by
hand":
```
enum Food {
Sweet,
Salty,
}
impl Default for Food {
fn default() -> Food {
Food::Sweet
}
}
```
"##,
}
8 changes: 5 additions & 3 deletions src/libsyntax_ext/lib.rs
Expand Up @@ -32,8 +32,12 @@ extern crate rustc_target;
#[cfg(not(stage0))]
mod diagnostics;

mod assert;
#[macro_use]
// for custom_derive
pub mod deriving;

mod asm;
mod assert;
mod cfg;
mod compile_error;
mod concat;
Expand All @@ -47,8 +51,6 @@ mod trace_macros;

pub mod proc_macro_registrar;

// for custom_derive
pub mod deriving;

pub mod proc_macro_impl;

Expand Down
20 changes: 20 additions & 0 deletions src/test/ui/E0665.rs
@@ -0,0 +1,20 @@
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

// ignore-stage1

#[derive(Default)] //~ ERROR E0665
enum Food {
Sweet,
Salty,
}

fn main() {
}
9 changes: 9 additions & 0 deletions src/test/ui/E0665.stderr
@@ -0,0 +1,9 @@
error[E0665]: `Default` cannot be derived for enums, only structs
--> $DIR/E0665.rs:13:10
|
LL | #[derive(Default)] //~ ERROR E0665
| ^^^^^^^

error: aborting due to previous error

For more information about this error, try `rustc --explain E0665`.

0 comments on commit 8c004b8

Please sign in to comment.