rollup merge of #20631: huon/no-drop-and-copy

This commit is contained in:
Alex Crichton 2015-01-07 17:28:38 -08:00
commit 773fdb3dbe
5 changed files with 46 additions and 3 deletions

View File

@ -6915,6 +6915,7 @@ pub enum CopyImplementationError {
FieldDoesNotImplementCopy(ast::Name), FieldDoesNotImplementCopy(ast::Name),
VariantDoesNotImplementCopy(ast::Name), VariantDoesNotImplementCopy(ast::Name),
TypeIsStructural, TypeIsStructural,
TypeHasDestructor,
} }
pub fn can_type_implement_copy<'a,'tcx>(param_env: &ParameterEnvironment<'a, 'tcx>, pub fn can_type_implement_copy<'a,'tcx>(param_env: &ParameterEnvironment<'a, 'tcx>,
@ -6924,7 +6925,7 @@ pub fn can_type_implement_copy<'a,'tcx>(param_env: &ParameterEnvironment<'a, 'tc
{ {
let tcx = param_env.tcx; let tcx = param_env.tcx;
match self_type.sty { let did = match self_type.sty {
ty::ty_struct(struct_did, substs) => { ty::ty_struct(struct_did, substs) => {
let fields = ty::struct_fields(tcx, struct_did, substs); let fields = ty::struct_fields(tcx, struct_did, substs);
for field in fields.iter() { for field in fields.iter() {
@ -6932,6 +6933,7 @@ pub fn can_type_implement_copy<'a,'tcx>(param_env: &ParameterEnvironment<'a, 'tc
return Err(FieldDoesNotImplementCopy(field.name)) return Err(FieldDoesNotImplementCopy(field.name))
} }
} }
struct_did
} }
ty::ty_enum(enum_did, substs) => { ty::ty_enum(enum_did, substs) => {
let enum_variants = ty::enum_variants(tcx, enum_did); let enum_variants = ty::enum_variants(tcx, enum_did);
@ -6944,8 +6946,13 @@ pub fn can_type_implement_copy<'a,'tcx>(param_env: &ParameterEnvironment<'a, 'tc
} }
} }
} }
enum_did
} }
_ => return Err(TypeIsStructural), _ => return Err(TypeIsStructural),
};
if ty::has_dtor(tcx, did) {
return Err(TypeHasDestructor)
} }
Ok(()) Ok(())

View File

@ -507,6 +507,11 @@ impl<'a, 'tcx> CoherenceChecker<'a, 'tcx> {
for this type; type is not a structure or \ for this type; type is not a structure or \
enumeration") enumeration")
} }
Err(ty::TypeHasDestructor) => {
span_err!(tcx.sess, span, E0184,
"the trait `Copy` may not be implemented for this type; \
the type has a destructor");
}
} }
} }
} }

View File

@ -157,5 +157,6 @@ register_diagnostics! {
E0180, E0180,
E0181, E0181,
E0182, E0182,
E0183 E0183,
E0184
} }

View File

@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
impl Drop for int { impl<'a> Drop for &'a mut int {
//~^ ERROR the Drop trait may only be implemented on structures //~^ ERROR the Drop trait may only be implemented on structures
//~^^ ERROR E0117 //~^^ ERROR E0117
fn drop(&mut self) { fn drop(&mut self) {

View File

@ -0,0 +1,30 @@
// 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(unsafe_destructor)]
// issue #20126
#[derive(Copy)] //~ ERROR the trait `Copy` may not be implemented
struct Foo;
impl Drop for Foo {
fn drop(&mut self) {}
}
#[derive(Copy)] //~ ERROR the trait `Copy` may not be implemented
struct Bar<T>;
#[unsafe_destructor]
impl<T> Drop for Bar<T> {
fn drop(&mut self) {}
}
fn main() {}