]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Allow parsing a borrow from struct expression
authorOwen Avery <powerboat9.gamer@gmail.com>
Mon, 5 Jun 2023 20:48:55 +0000 (16:48 -0400)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 17:46:24 +0000 (18:46 +0100)
gcc/rust/ChangeLog:

* parse/rust-parse-impl.h
(Parser::null_denotation): Allow struct expression referencing.

gcc/testsuite/ChangeLog:

* rust/compile/struct-expr-parse.rs: New test.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
gcc/rust/parse/rust-parse-impl.h
gcc/testsuite/rust/compile/struct-expr-parse.rs [new file with mode: 0644]

index 9faa374915c6f3cfc52daa2825f39bf51d22a1dc..80ffbcc22f904e407235e326f304829146f411a2 100644 (file)
@@ -12633,11 +12633,10 @@ Parser<ManagedTokenSource>::null_denotation (const_TokenPtr tok,
        std::unique_ptr<AST::Expr> expr = nullptr;
        bool is_mut_borrow = false;
 
-       /* HACK: as struct expressions should always be value expressions,
-        * cannot be referenced */
        ParseRestrictions entered_from_unary;
        entered_from_unary.entered_from_unary = true;
-       entered_from_unary.can_be_struct_expr = false;
+       if (!restrictions.can_be_struct_expr)
+         entered_from_unary.can_be_struct_expr = false;
 
        if (lexer.peek_token ()->get_id () == MUT)
          {
diff --git a/gcc/testsuite/rust/compile/struct-expr-parse.rs b/gcc/testsuite/rust/compile/struct-expr-parse.rs
new file mode 100644 (file)
index 0000000..3c383a9
--- /dev/null
@@ -0,0 +1,7 @@
+struct A { // { dg-warning "struct is never constructed" }
+    a: u32
+}
+
+pub fn foo(a: u32) {
+    (&A { a }.a, 1);
+}