mirror of
https://github.com/rust-lang/rust.git
synced 2024-10-31 22:41:50 +00:00
rollup merge of #20631: huon/no-drop-and-copy
This commit is contained in:
commit
773fdb3dbe
@ -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(())
|
||||||
|
@ -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");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -157,5 +157,6 @@ register_diagnostics! {
|
|||||||
E0180,
|
E0180,
|
||||||
E0181,
|
E0181,
|
||||||
E0182,
|
E0182,
|
||||||
E0183
|
E0183,
|
||||||
|
E0184
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
|
30
src/test/compile-fail/exclusive-drop-and-copy.rs
Normal file
30
src/test/compile-fail/exclusive-drop-and-copy.rs
Normal 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() {}
|
Loading…
Reference in New Issue
Block a user