From ff50ce9a1b43720d7147251904c29b9503ea9dd9 Mon Sep 17 00:00:00 2001 From: Benjamin Herr Date: Sun, 22 Jun 2014 19:53:56 +0200 Subject: [PATCH] libsyntax: don't allow enum structs with no fields Unit-like structs are written as `struct Foo;`, but we erroneously accepted `struct Foo();` and took it to mean the same thing. Now we don't, so use the `struct Foo;` form! [breaking-change] --- src/libsyntax/parse/parser.rs | 5 +++++ src/test/compile-fail/lint-dead-code-1.rs | 2 +- src/test/compile-fail/struct-no-fields-enumlike.rs | 13 +++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 src/test/compile-fail/struct-no-fields-enumlike.rs diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 043ce3bf5b0..4a75473ac11 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -4116,6 +4116,11 @@ impl<'a> Parser<'a> { }; spanned(lo, p.span.hi, struct_field_) }); + if fields.len() == 0 { + self.fatal(format!("unit-like struct definition should be \ + written as `struct {};`", + token::get_ident(class_name)).as_slice()); + } self.expect(&token::SEMI); } else if self.eat(&token::SEMI) { // It's a unit-like struct. diff --git a/src/test/compile-fail/lint-dead-code-1.rs b/src/test/compile-fail/lint-dead-code-1.rs index bca2a5d7edc..25e5ecde02d 100644 --- a/src/test/compile-fail/lint-dead-code-1.rs +++ b/src/test/compile-fail/lint-dead-code-1.rs @@ -37,7 +37,7 @@ static USED_STATIC: int = 0; static STATIC_USED_IN_ENUM_DISCRIMINANT: uint = 10; pub type typ = *UsedStruct4; -pub struct PubStruct(); +pub struct PubStruct; struct PrivStruct; //~ ERROR: code is never used struct UsedStruct1 { #[allow(dead_code)] diff --git a/src/test/compile-fail/struct-no-fields-enumlike.rs b/src/test/compile-fail/struct-no-fields-enumlike.rs new file mode 100644 index 00000000000..379d310a60b --- /dev/null +++ b/src/test/compile-fail/struct-no-fields-enumlike.rs @@ -0,0 +1,13 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +struct Foo(); //~ ERROR unit-like struct definition should be written as `struct Foo;` + +fn main() {}