diff options
| author | Jorge Aparicio <japaricious@gmail.com> | 2015-03-06 08:07:50 -0500 |
|---|---|---|
| committer | Jorge Aparicio <japaricious@gmail.com> | 2015-03-06 08:50:34 -0500 |
| commit | 707f7a1617013f7684fe81a1bba2dd77acbaaa73 (patch) | |
| tree | 9c3e545a6f52defa7b2a1cd55ba49c195dd5da4f | |
| parent | 1fe8f221450bad3ffb1351c6549f67c18ce0b94e (diff) | |
| download | rust-707f7a1617013f7684fe81a1bba2dd77acbaaa73.tar.gz rust-707f7a1617013f7684fe81a1bba2dd77acbaaa73.zip | |
Check that traits with default impls have no methods
fixes #23080
| -rw-r--r-- | src/librustc_typeck/check/mod.rs | 28 | ||||
| -rw-r--r-- | src/test/compile-fail/issue-23080.rs | 29 |
2 files changed, 57 insertions, 0 deletions
diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs index 595a2295674..57469d94ce8 100644 --- a/src/librustc_typeck/check/mod.rs +++ b/src/librustc_typeck/check/mod.rs @@ -465,6 +465,29 @@ impl<'a, 'tcx> Visitor<'tcx> for CheckItemTypesVisitor<'a, 'tcx> { } } +// Check that trait with default impls (`impl Trait for ..`) contain no methods +struct DefaultedTraitVisitor<'a, 'tcx: 'a> { ccx: &'a CrateCtxt<'a, 'tcx> } + +impl<'a, 'tcx> Visitor<'tcx> for DefaultedTraitVisitor<'a, 'tcx> { + fn visit_item(&mut self, item: &ast::Item) { + let tcx = self.ccx.tcx; + + match item.node { + ast::ItemTrait(_, _, _, ref trait_methods) => { + if ty::trait_has_default_impl(tcx, local_def(item.id)) && + !trait_methods.is_empty() + { + tcx.sess.span_err( + item.span, + "traits with default impls (`e.g. impl Trait for ..`) must have no \ + methods") + } + }, + _ => {}, + } + } +} + pub fn check_item_types(ccx: &CrateCtxt) { let krate = ccx.tcx.map.krate(); let mut visit = wf::CheckTypeWellFormedVisitor::new(ccx); @@ -478,6 +501,11 @@ pub fn check_item_types(ccx: &CrateCtxt) { visit::walk_crate(&mut visit, krate); ccx.tcx.sess.abort_if_errors(); + + let mut visit = DefaultedTraitVisitor { ccx: ccx }; + visit::walk_crate(&mut visit, krate); + + ccx.tcx.sess.abort_if_errors(); } fn check_bare_fn<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>, diff --git a/src/test/compile-fail/issue-23080.rs b/src/test/compile-fail/issue-23080.rs new file mode 100644 index 00000000000..61b9a1a14e0 --- /dev/null +++ b/src/test/compile-fail/issue-23080.rs @@ -0,0 +1,29 @@ +// Copyright 2015 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. + +#![feature(optin_builtin_traits)] + +unsafe trait Trait { +//~^ error: traits with default impls (`e.g. impl Trait for ..`) must have no methods + fn method(&self) { + println!("Hello"); + } +} + +unsafe impl Trait for .. {} + +fn call_method<T: Trait>(x: T) { + x.method(); +} + +fn main() { + // ICE + call_method(()); +} |
