Skip to content

Commit

Permalink
Move the E0130 check to AST validation pass
Browse files Browse the repository at this point in the history
  • Loading branch information
petrochenkov committed Aug 2, 2016
1 parent 32e462e commit e5cc046
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 47 deletions.
17 changes: 17 additions & 0 deletions src/librustc_passes/ast_validation.rs
Expand Up @@ -135,6 +135,23 @@ impl<'a> Visitor for AstValidator<'a> {
visit::walk_item(self, item)
}

fn visit_foreign_item(&mut self, fi: &ForeignItem) {
match fi.node {
ForeignItemKind::Fn(ref decl, _) => {
for arg in &decl.inputs {
match arg.pat.node {
PatKind::Ident(..) | PatKind::Wild => {}
_ => span_err!(self.session, arg.pat.span, E0130,
"patterns aren't allowed in foreign function declarations")
}
}
}
ForeignItemKind::Static(..) => {}
}

visit::walk_foreign_item(self, fi)
}

fn visit_variant_data(&mut self, vdata: &VariantData, _: Ident,
_: &Generics, _: NodeId, span: Span) {
if vdata.fields().is_empty() {
Expand Down
33 changes: 33 additions & 0 deletions src/librustc_passes/diagnostics.rs
Expand Up @@ -49,6 +49,39 @@ match 5u32 {
```
"##,

E0130: r##"
You declared a pattern as an argument in a foreign function declaration.
Erroneous code example:
```compile_fail
extern {
fn foo((a, b): (u32, u32)); // error: patterns aren't allowed in foreign
// function declarations
}
```
Please replace the pattern argument with a regular one. Example:
```
struct SomeStruct {
a: u32,
b: u32,
}
extern {
fn foo(s: SomeStruct); // ok!
}
```
Or:
```
extern {
fn foo(a: (u32, u32)); // ok!
}
```
"##,

E0161: r##"
A value was moved. However, its size was not known at compile time, and only
values of a known size can be moved.
Expand Down
17 changes: 3 additions & 14 deletions src/librustc_typeck/collect.rs
Expand Up @@ -60,8 +60,6 @@ There are some shortcomings in this design:

use astconv::{AstConv, ast_region_to_region, Bounds, PartitionedBounds, partition_bounds};
use lint;
use hir::def::Def;
use hir::def_id::DefId;
use constrained_type_params as ctp;
use middle::lang_items::SizedTraitLangItem;
use middle::const_val::ConstVal;
Expand All @@ -74,7 +72,6 @@ use rustc::ty::{VariantKind};
use rustc::ty::util::IntTypeExt;
use rscope::*;
use rustc::dep_graph::DepNode;
use rustc::hir::map as hir_map;
use util::common::{ErrorReported, MemoizationMap};
use util::nodemap::{NodeMap, FnvHashMap};
use {CrateCtxt, write_ty_to_tcx};
Expand All @@ -91,9 +88,9 @@ use syntax::parse::token::keywords;
use syntax::ptr::P;
use syntax_pos::Span;

use rustc::hir::{self, PatKind};
use rustc::hir::intravisit;
use rustc::hir::print as pprust;
use rustc::hir::{self, intravisit, map as hir_map, print as pprust};
use rustc::hir::def::Def;
use rustc::hir::def_id::DefId;

///////////////////////////////////////////////////////////////////////////
// Main entry point
Expand Down Expand Up @@ -2144,14 +2141,6 @@ fn compute_type_scheme_of_foreign_fn_decl<'a, 'tcx>(
abi: abi::Abi)
-> ty::TypeScheme<'tcx>
{
for i in &decl.inputs {
match i.pat.node {
PatKind::Binding(..) | PatKind::Wild => {}
_ => span_err!(ccx.tcx.sess, i.pat.span, E0130,
"patterns aren't allowed in foreign function declarations")
}
}

let ty_generics = ty_generics_for_fn(ccx, ast_generics, &ty::Generics::empty());

let rb = BindingRscope::new();
Expand Down
33 changes: 0 additions & 33 deletions src/librustc_typeck/diagnostics.rs
Expand Up @@ -1800,39 +1800,6 @@ Please also verify that this wasn't because of a name-clash and rename the type
parameter if so.
"##,

E0130: r##"
You declared a pattern as an argument in a foreign function declaration.
Erroneous code example:
```compile_fail
extern {
fn foo((a, b): (u32, u32)); // error: patterns aren't allowed in foreign
// function declarations
}
```
Please replace the pattern argument with a regular one. Example:
```
struct SomeStruct {
a: u32,
b: u32,
}
extern {
fn foo(s: SomeStruct); // ok!
}
```
Or:
```
extern {
fn foo(a: (u32, u32)); // ok!
}
```
"##,

E0131: r##"
It is not possible to define `main` with type parameters, or even with function
parameters. When `main` is present, it must take no arguments and return `()`.
Expand Down

0 comments on commit e5cc046

Please sign in to comment.