From ab24d29f0d1bb32a6d8913996755972887f5f150 Mon Sep 17 00:00:00 2001 From: Kevin Butler Date: Thu, 19 Jun 2014 23:23:51 +0100 Subject: [PATCH] rustc: catch `impl X for Y` where X is not a trait in resolve. --- src/librustc/middle/resolve.rs | 27 +++++++++++++++++++++++++-- src/test/compile-fail/issue-3907-2.rs | 20 ++++++++++++++++++++ src/test/compile-fail/issue-3907.rs | 5 +++-- src/test/compile-fail/issue-3973.rs | 3 +-- src/test/compile-fail/issue-5035-2.rs | 14 ++++++++++++++ src/test/compile-fail/issue-5035.rs | 3 ++- 6 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 src/test/compile-fail/issue-3907-2.rs create mode 100644 src/test/compile-fail/issue-5035-2.rs diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs index 6c916272593dc..ee6c5e1f9bc31 100644 --- a/src/librustc/middle/resolve.rs +++ b/src/librustc/middle/resolve.rs @@ -3894,8 +3894,31 @@ impl<'a> Resolver<'a> { self.resolve_error(trait_reference.path.span, msg.as_slice()); } Some(def) => { - debug!("(resolving trait) found trait def: {:?}", def); - self.record_def(trait_reference.ref_id, def); + match def { + (DefTrait(_), _) => { + debug!("(resolving trait) found trait def: {:?}", def); + self.record_def(trait_reference.ref_id, def); + } + (def, _) => { + self.resolve_error(trait_reference.path.span, + format!("`{}` is not a trait", + self.path_idents_to_str( + &trait_reference.path))); + + // If it's a typedef, give a note + match def { + DefTy(_) => { + self.session.span_note( + trait_reference.path.span, + format!("`type` aliases cannot \ + be used for traits") + .as_slice()); + } + _ => {} + } + } + } + } } } diff --git a/src/test/compile-fail/issue-3907-2.rs b/src/test/compile-fail/issue-3907-2.rs new file mode 100644 index 0000000000000..795e48cb7b005 --- /dev/null +++ b/src/test/compile-fail/issue-3907-2.rs @@ -0,0 +1,20 @@ +// Copyright 2013-2014 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// aux-build:issue_3907.rs +extern crate issue_3907; + +type Foo = issue_3907::Foo; //~ ERROR: reference to trait + +struct S { + name: int +} + +fn main() {} diff --git a/src/test/compile-fail/issue-3907.rs b/src/test/compile-fail/issue-3907.rs index 767e674fcda17..a2faef59fd828 100644 --- a/src/test/compile-fail/issue-3907.rs +++ b/src/test/compile-fail/issue-3907.rs @@ -1,4 +1,4 @@ -// Copyright 2013 The Rust Project Developers. See the COPYRIGHT +// Copyright 2013-2014 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // @@ -11,13 +11,14 @@ // aux-build:issue_3907.rs extern crate issue_3907; -type Foo = issue_3907::Foo; //~ ERROR: reference to trait +type Foo = issue_3907::Foo; struct S { name: int } impl Foo for S { //~ ERROR: `Foo` is not a trait + //~^ NOTE: `type` aliases cannot be used for traits fn bar() { } } diff --git a/src/test/compile-fail/issue-3973.rs b/src/test/compile-fail/issue-3973.rs index d2d7625842a07..9b77d62a06529 100644 --- a/src/test/compile-fail/issue-3973.rs +++ b/src/test/compile-fail/issue-3973.rs @@ -31,7 +31,6 @@ impl NewTrait for Point { fn main() { let p = Point::new(0.0, 0.0); //~^ ERROR unresolved name `Point::new` - //~^^ ERROR unresolved name - //~^^^ ERROR use of undeclared module `Point` + //~^^ ERROR failed to resolve. Use of undeclared module `Point` println!("{}", p.a()); } diff --git a/src/test/compile-fail/issue-5035-2.rs b/src/test/compile-fail/issue-5035-2.rs new file mode 100644 index 0000000000000..8d9116da81db2 --- /dev/null +++ b/src/test/compile-fail/issue-5035-2.rs @@ -0,0 +1,14 @@ +// Copyright 2013-2014 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +trait I {} +type K = I; //~ ERROR: reference to trait + +fn main() {} diff --git a/src/test/compile-fail/issue-5035.rs b/src/test/compile-fail/issue-5035.rs index 94110f077623b..8ffe308a66939 100644 --- a/src/test/compile-fail/issue-5035.rs +++ b/src/test/compile-fail/issue-5035.rs @@ -9,6 +9,7 @@ // except according to those terms. trait I {} -type K = I; //~ ERROR: reference to trait +type K = I; impl K for int {} //~ ERROR: `K` is not a trait +//~^ NOTE: `type` aliases cannot be used for traits fn main() {}