From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2116) id 373FB3858D39; Sat, 16 Jul 2022 23:30:47 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 373FB3858D39 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Ian Lance Taylor To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-1721] go: fix f().x where f returns zero-sized type X-Act-Checkin: gcc X-Git-Author: Ian Lance Taylor X-Git-Refname: refs/heads/master X-Git-Oldrev: d6d8e6a7e1379f9dfdf2f39efcc82d9185cca6d0 X-Git-Newrev: 2b5baaef0b6e4d1d8e36cda091be26649163ffdb Message-Id: <20220716233047.373FB3858D39@sourceware.org> Date: Sat, 16 Jul 2022 23:30:47 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 16 Jul 2022 23:30:47 -0000 https://gcc.gnu.org/g:2b5baaef0b6e4d1d8e36cda091be26649163ffdb commit r13-1721-g2b5baaef0b6e4d1d8e36cda091be26649163ffdb Author: Ian Lance Taylor Date: Sat Jul 16 16:29:38 2022 -0700 go: fix f().x where f returns zero-sized type Test case is https://go.dev/cl/417874. Fixes golang/go#23870 * go-gcc.cc (Gcc_backend::struct_field_expression): Handle a void expression, as for f().x where f returns a zero-sized type. Diff: --- gcc/go/go-gcc.cc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/gcc/go/go-gcc.cc b/gcc/go/go-gcc.cc index 7b4b2adb058..1ba7206caeb 100644 --- a/gcc/go/go-gcc.cc +++ b/gcc/go/go-gcc.cc @@ -1707,6 +1707,13 @@ Gcc_backend::struct_field_expression(Bexpression* bstruct, size_t index, if (struct_tree == error_mark_node || TREE_TYPE(struct_tree) == error_mark_node) return this->error_expression(); + + // A function call that returns a zero-sized object will have been + // changed to return void. A zero-sized object can have a + // (zero-sized) field, so support that case. + if (TREE_TYPE(struct_tree) == void_type_node) + return bstruct; + gcc_assert(TREE_CODE(TREE_TYPE(struct_tree)) == RECORD_TYPE); tree field = TYPE_FIELDS(TREE_TYPE(struct_tree)); if (field == NULL_TREE)