aboutsummaryrefslogtreecommitdiff
path: root/gcc/go
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2022-07-16 16:29:38 -0700
committerIan Lance Taylor <iant@golang.org>2022-07-16 16:30:34 -0700
commit2b5baaef0b6e4d1d8e36cda091be26649163ffdb (patch)
treef5c46f9c6f20ff4d80922339633f10282beb53ec /gcc/go
parentd6d8e6a7e1379f9dfdf2f39efcc82d9185cca6d0 (diff)
downloadgcc-2b5baaef0b6e4d1d8e36cda091be26649163ffdb.zip
gcc-2b5baaef0b6e4d1d8e36cda091be26649163ffdb.tar.gz
gcc-2b5baaef0b6e4d1d8e36cda091be26649163ffdb.tar.bz2
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.
Diffstat (limited to 'gcc/go')
-rw-r--r--gcc/go/go-gcc.cc7
1 files changed, 7 insertions, 0 deletions
diff --git a/gcc/go/go-gcc.cc b/gcc/go/go-gcc.cc
index 7b4b2ad..1ba7206 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)