Fixes #17169.
Fixes #17649.
}
ExprCall(ref callee, _) => {
match v.tcx.def_map.borrow().find(&callee.id) {
- Some(&DefStruct(..)) => {} // OK.
+ Some(&DefStruct(..)) |
Some(&DefVariant(..)) => {} // OK.
_ => {
span_err!(v.tcx.sess, e.span, E0015,
DefStatic(..) =>
cx.tcx.sess.span_bug(pat_span, "static pattern should've been rewritten"),
DefVariant(_, id, _) if *constructor != Variant(id) => None,
- DefVariant(..) | DefFn(..) | DefStruct(..) => {
+ DefVariant(..) | DefStruct(..) => {
Some(match args {
&Some(ref args) => args.iter().map(|p| &**p).collect(),
&None => Vec::from_elem(arity, &DUMMY_WILD_PAT)
if_ok!(self.cat_pattern(subcmt, &**subpat, |x,y,z| op(x,y,z)));
}
}
- Some(&def::DefFn(..)) |
Some(&def::DefStruct(..)) => {
for (i, subpat) in subpats.iter().enumerate() {
let subpat_ty = if_ok!(self.pat_ty(&**subpat)); // see (*2)
maybe_did.unwrap_or(did)
})
}
- // Tuple struct constructors across crates are identified as
- // DefFn types, so we explicitly handle that case here.
- Some(&def::DefFn(did, _, _)) if !is_local(did) => {
- match csearch::get_tuple_struct_definition_if_ctor(
- &self.tcx.sess.cstore, did) {
- Some(did) => guard(did),
- None => {}
- }
- }
_ => {}
}
}
child_name_bindings.define_value(def, DUMMY_SP, is_exported);
}
}
+ DefFn(ctor_id, _, true) => {
+ child_name_bindings.define_value(
+ csearch::get_tuple_struct_definition_if_ctor(&self.session.cstore, ctor_id)
+ .map_or(def, |_| DefStruct(ctor_id)), DUMMY_SP, is_public);
+ }
DefFn(..) | DefStaticMethod(..) | DefStatic(..) => {
debug!("(building reduced graph for external \
crate) building value (fn/static) {}", final_ident);
}
ast::PatEnum(..) | ast::PatIdent(_, _, None) => {
match tcx.def_map.borrow().find(&pat.id) {
- Some(&def::DefFn(..)) |
Some(&def::DefStruct(..)) => true,
_ => false
}
}
}
}
- Some(def::DefFn(..)) |
Some(def::DefStruct(..)) => {
match *sub_pats {
None => {
Argument(Struct)
}
+pub struct TupleStruct(pub uint, pub &'static str);
+
// used by the cfail test
pub struct StructWithFields {
static s3: xcrate_unit_struct::Unit =
xcrate_unit_struct::Argument(xcrate_unit_struct::Struct);
static s4: xcrate_unit_struct::Unit = xcrate_unit_struct::Argument(s1);
+static s5: xcrate_unit_struct::TupleStruct = xcrate_unit_struct::TupleStruct(20, "foo");
fn f1(_: xcrate_unit_struct::Struct) {}
fn f2(_: xcrate_unit_struct::Unit) {}
+fn f3(_: xcrate_unit_struct::TupleStruct) {}
pub fn main() {
f1(xcrate_unit_struct::Struct);
f2(xcrate_unit_struct::UnitVariant);
f2(xcrate_unit_struct::Argument(xcrate_unit_struct::Struct));
+ f3(xcrate_unit_struct::TupleStruct(10, "bar"));
f1(s1);
f2(s2);
f2(s3);
f2(s4);
+ f3(s5);
}