diff options
author | Without Boats <woboats@gmail.com> | 2017-04-23 22:00:09 -0700 |
---|---|---|
committer | Without Boats <woboats@gmail.com> | 2017-04-23 22:00:09 -0700 |
commit | 86b10671dbb7edf4090cb04476b4da205fd892b2 (patch) | |
tree | ca4f0b6eb413b63de278ac0c533d5caf42948ed0 | |
parent | 15ce54096a589de277771ad1f55a334fe2661a64 (diff) | |
download | rust-86b10671dbb7edf4090cb04476b4da205fd892b2.tar.gz |
Associated consts are not object safe.
-rw-r--r-- | src/librustc/traits/object_safety.rs | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/src/librustc/traits/object_safety.rs b/src/librustc/traits/object_safety.rs index d190635bec3..f51711d0310 100644 --- a/src/librustc/traits/object_safety.rs +++ b/src/librustc/traits/object_safety.rs @@ -37,6 +37,9 @@ pub enum ObjectSafetyViolation { /// Method has something illegal Method(ast::Name, MethodViolationCode), + + /// Associated const + AssociatedConst(ast::Name), } impl ObjectSafetyViolation { @@ -54,6 +57,8 @@ impl ObjectSafetyViolation { in its arguments or return type", name).into(), ObjectSafetyViolation::Method(name, MethodViolationCode::Generic) => format!("method `{}` has generic type parameters", name).into(), + ObjectSafetyViolation::AssociatedConst(name) => + format!("the trait cannot contain associated consts, such as `{}`", name), } } } @@ -141,6 +146,10 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { violations.push(ObjectSafetyViolation::SupertraitSelf); } + violations.extend(self.associated_items(trait_def_id) + .filter(|item| item.kind == ty::AssociatedKind::Const) + .map(|item| ObjectSafetyViolation::AssociatedConst(item.name))); + debug!("object_safety_violations_for_trait(trait_def_id={:?}) = {:?}", trait_def_id, violations); |