use syntax::symbol::{Symbol, keywords};
use syntax::tokenstream::TokenStream;
use syntax::util::ThinVec;
+use ty::AdtKind;
use rustc_data_structures::indexed_vec;
ItemDefaultImpl(..) => "item",
}
}
+
+ pub fn adt_kind(&self) -> Option<AdtKind> {
+ match *self {
+ ItemStruct(..) => Some(AdtKind::Struct),
+ ItemUnion(..) => Some(AdtKind::Union),
+ ItemEnum(..) => Some(AdtKind::Enum),
+ _ => None,
+ }
+ }
}
/// A reference from an trait to one of its associated items. This
ObligationCauseCode::StructInitializerSized => {
err.note("structs must have a statically known size to be initialized");
}
- ObligationCauseCode::FieldSized => {
- err.note("only the last field of a struct or an union may have a dynamically \
- sized type");
+ ObligationCauseCode::FieldSized(ref item) => {
+ match *item {
+ AdtKind::Struct => {
+ err.note("only the last field of a struct may have a dynamically \
+ sized type");
+ }
+ AdtKind::Union => {
+ err.note("no field of a union may have a dynamically sized type");
+ }
+ AdtKind::Enum => {
+ err.note("no field of an enum variant may have a dynamically sized type");
+ }
+ }
}
ObligationCauseCode::ConstSized => {
err.note("constant expressions must have a statically known size");
fn suggest_new_overflow_limit(&self, err: &mut DiagnosticBuilder) {
let current_limit = self.tcx.sess.recursion_limit.get();
let suggested_limit = current_limit * 2;
- err.help(&format!(
- "consider adding a `#![recursion_limit=\"{}\"]` attribute to your crate",
+ err.help(&format!("consider adding a `#![recursion_limit=\"{}\"]` attribute to your crate",
suggested_limit));
}
}
use middle::region::RegionMaps;
use middle::free_region::FreeRegionMap;
use ty::subst::Substs;
-use ty::{self, Ty, TyCtxt, TypeFoldable, ToPredicate};
+use ty::{self, AdtKind, Ty, TyCtxt, TypeFoldable, ToPredicate};
use ty::error::{ExpectedFound, TypeError};
use infer::{InferCtxt};
RepeatVec,
/// Types of fields (other than the last) in a struct must be sized.
- FieldSized,
+ FieldSized(AdtKind),
/// Constant expressions must be sized.
ConstSized,
super::ReturnType(id) => Some(super::ReturnType(id)),
super::SizedReturnType => Some(super::SizedReturnType),
super::RepeatVec => Some(super::RepeatVec),
- super::FieldSized => Some(super::FieldSized),
+ super::FieldSized(item) => Some(super::FieldSized(item)),
super::ConstSized => Some(super::ConstSized),
super::SharedStatic => Some(super::SharedStatic),
super::BuiltinDerivedObligation(ref cause) => {
super::SizedReturnType |
super::ReturnNoExpression |
super::RepeatVec |
- super::FieldSized |
+ super::FieldSized(_) |
super::ConstSized |
super::SharedStatic |
super::BlockTailExpression(_) |
super::SizedReturnType |
super::ReturnNoExpression |
super::RepeatVec |
- super::FieldSized |
+ super::FieldSized(_) |
super::ConstSized |
super::SharedStatic |
super::BlockTailExpression(_) |
fcx.tcx.require_lang_item(lang_items::SizedTraitLangItem),
traits::ObligationCause::new(field.span,
fcx.body_id,
- traits::FieldSized));
+ traits::FieldSized(match item.node.adt_kind() {
+ Some(i) => i,
+ None => bug!(),
+ })));
}
// All field types must be well-formed.
value: T,
}
+struct Foo2<T: ?Sized> {
+ value: T,
+ t: u32,
+}
+
+enum Foo3<T: ?Sized> {
+ Value(T),
+}
+
fn main() {}
|
= help: the trait `std::marker::Sized` is not implemented for `T`
= help: consider adding a `where T: std::marker::Sized` bound
- = note: only the last field of a struct or an union may have a dynamically sized type
+ = note: no field of a union may have a dynamically sized type
-error: aborting due to previous error
+error[E0277]: the trait bound `T: std::marker::Sized` is not satisfied
+ --> $DIR/union-sized-field.rs:18:5
+ |
+18 | value: T,
+ | ^^^^^^^^ `T` does not have a constant size known at compile-time
+ |
+ = help: the trait `std::marker::Sized` is not implemented for `T`
+ = help: consider adding a `where T: std::marker::Sized` bound
+ = note: only the last field of a struct may have a dynamically sized type
+
+error[E0277]: the trait bound `T: std::marker::Sized` is not satisfied
+ --> $DIR/union-sized-field.rs:23:11
+ |
+23 | Value(T),
+ | ^^ `T` does not have a constant size known at compile-time
+ |
+ = help: the trait `std::marker::Sized` is not implemented for `T`
+ = help: consider adding a `where T: std::marker::Sized` bound
+ = note: no field of an enum variant may have a dynamically sized type
+
+error: aborting due to 3 previous errors