diff options
| author | bors <bors@rust-lang.org> | 2016-08-12 19:38:46 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-08-12 19:38:46 -0700 |
| commit | d3c3de8abe63f738113874267dad3b92a1965ecd (patch) | |
| tree | 7aee211940151fc16238ee0169d92381bdff2313 /src/libsyntax/feature_gate.rs | |
| parent | 1deb02ea69a7ca3fd8011a45bb75ff22c3f7579a (diff) | |
| parent | f6624782d41dce401a4103240daa06011ed326a5 (diff) | |
| download | rust-d3c3de8abe63f738113874267dad3b92a1965ecd.tar.gz rust-d3c3de8abe63f738113874267dad3b92a1965ecd.zip | |
Auto merge of #35138 - petrochenkov:clarify, r=eddyb
Implement RFC 1506 "Clarify the relationships between various kinds of structs and variants" cc https://github.com/rust-lang/rust/issues/35626
Diffstat (limited to 'src/libsyntax/feature_gate.rs')
| -rw-r--r-- | src/libsyntax/feature_gate.rs | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index f550e7d2a05..ad52184a6dc 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -280,7 +280,11 @@ declare_features! ( (active, dotdot_in_tuple_patterns, "1.10.0", Some(33627)), // Allows `impl Trait` in function return types. - (active, conservative_impl_trait, "1.12.0", Some(34511)) + (active, conservative_impl_trait, "1.12.0", Some(34511)), + + // Allows tuple structs and variants in more contexts, + // Permits numeric fields in struct expressions and patterns. + (active, relaxed_adts, "1.12.0", Some(35626)) ); declare_features! ( @@ -1022,9 +1026,8 @@ impl<'a> Visitor for PostExpansionVisitor<'a> { } PatKind::TupleStruct(_, ref fields, ddpos) if ddpos.is_none() && fields.is_empty() => { - self.context.span_handler.struct_span_err(pattern.span, - "nullary enum variants are written with \ - no trailing `( )`").emit(); + gate_feature_post!(&self, relaxed_adts, pattern.span, + "empty tuple structs patterns are unstable"); } _ => {} } @@ -1107,6 +1110,19 @@ impl<'a> Visitor for PostExpansionVisitor<'a> { visit::walk_impl_item(self, ii); } + fn visit_variant_data(&mut self, vdata: &ast::VariantData, _: ast::Ident, + _: &ast::Generics, _: NodeId, span: Span) { + if vdata.fields().is_empty() { + if vdata.is_tuple() { + gate_feature_post!(&self, relaxed_adts, span, + "empty tuple structs and enum variants are unstable, \ + use unit structs and enum variants instead"); + } + } + + visit::walk_struct_def(self, vdata) + } + fn visit_vis(&mut self, vis: &ast::Visibility) { let span = match *vis { ast::Visibility::Crate(span) => span, |
