aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2021-06-24 10:11:22 +0000
committerGitHub <noreply@github.com>2021-06-24 10:11:22 +0000
commit23e748d7a6855ce132299cfef9692ee9c681de59 (patch)
treede6518392abf835f285e7951c0656d7394333ba2 /gcc
parent595ae7743c93bfda40a5914d15ae0db2e7e57301 (diff)
parentc41d5a20d34d11109142140a7a1db23d67ddf839 (diff)
downloadgcc-23e748d7a6855ce132299cfef9692ee9c681de59.zip
gcc-23e748d7a6855ce132299cfef9692ee9c681de59.tar.gz
gcc-23e748d7a6855ce132299cfef9692ee9c681de59.tar.bz2
Merge #522
522: Handle empty/unit tuple enum variants in the parser. r=philberty a=philberty A tuple enum variant can be empty, in which case it is a unit enum variant. Handle this in Parser<ManagedTokenSource>::parse_enum_item by creating a empty tuple_field vector instead of calling parse_tuple_fields. Add a testcase to show empty tuple enum variant types are now accepted. But note some part of the test is commented out because using the enum type isn't actually possible right now. Addresses #79 Co-authored-by: Mark Wielaard <mark@klomp.org>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/parse/rust-parse-impl.h7
-rw-r--r--gcc/testsuite/rust/compile/torture/tuple_enum_variants.rs19
2 files changed, 25 insertions, 1 deletions
diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h
index dfac00e..9a28f6c 100644
--- a/gcc/rust/parse/rust-parse-impl.h
+++ b/gcc/rust/parse/rust-parse-impl.h
@@ -4415,7 +4415,12 @@ Parser<ManagedTokenSource>::parse_enum_item ()
// tuple enum item
lexer.skip_token ();
- std::vector<AST::TupleField> tuple_fields = parse_tuple_fields ();
+ std::vector<AST::TupleField> tuple_fields;
+ // Might be empty tuple for unit tuple enum variant.
+ if (lexer.peek_token ()->get_id () == RIGHT_PAREN)
+ tuple_fields = std::vector<AST::TupleField> ();
+ else
+ tuple_fields = parse_tuple_fields ();
if (!skip_token (RIGHT_PAREN))
{
diff --git a/gcc/testsuite/rust/compile/torture/tuple_enum_variants.rs b/gcc/testsuite/rust/compile/torture/tuple_enum_variants.rs
new file mode 100644
index 0000000..26e3e5d
--- /dev/null
+++ b/gcc/testsuite/rust/compile/torture/tuple_enum_variants.rs
@@ -0,0 +1,19 @@
+enum E { T0(), T1(i32), T2(i32,u32) }
+
+/* The following doesn't parse yet...
+fn f(e0: E, e1: E, e2: E) -> (E,E,E,())
+{
+ let e = e0;
+ let f = e1;
+ let g = e2;
+ (e,f,g,())
+}
+
+fn main()
+{
+ let e0 = E::T0();
+ let e1 = E::T1(0);
+ let e2 = E::T2(0,1);
+ f(e0, e1, e2).3
+}
+*/