summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWithout Boats <woboats@gmail.com>2017-04-23 22:00:09 -0700
committerWithout Boats <woboats@gmail.com>2017-04-23 22:00:09 -0700
commit86b10671dbb7edf4090cb04476b4da205fd892b2 (patch)
treeca4f0b6eb413b63de278ac0c533d5caf42948ed0
parent15ce54096a589de277771ad1f55a334fe2661a64 (diff)
downloadrust-86b10671dbb7edf4090cb04476b4da205fd892b2.tar.gz
Associated consts are not object safe.
-rw-r--r--src/librustc/traits/object_safety.rs9
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);