aboutsummaryrefslogtreecommitdiff
path: root/gcc/go
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2022-07-18 09:50:59 +0200
committerMartin Liska <mliska@suse.cz>2022-07-18 09:50:59 +0200
commit85df616e13a6a176883e39362c764a2dfa3448e8 (patch)
treef8a689c7075c69fce355abdbe5bc97b0d10bb144 /gcc/go
parentc29d4ad6d7f4ca1ebfd9489bb62178ea09ae6c6b (diff)
parent2907bfc3412dd8aef6c6acc17f2152a4e0ac4979 (diff)
downloadgcc-85df616e13a6a176883e39362c764a2dfa3448e8.zip
gcc-85df616e13a6a176883e39362c764a2dfa3448e8.tar.gz
gcc-85df616e13a6a176883e39362c764a2dfa3448e8.tar.bz2
Merge branch 'master' into devel/sphinx
Diffstat (limited to 'gcc/go')
-rw-r--r--gcc/go/ChangeLog10
-rw-r--r--gcc/go/go-gcc.cc20
2 files changed, 30 insertions, 0 deletions
diff --git a/gcc/go/ChangeLog b/gcc/go/ChangeLog
index 5fdf423..5dbcb29 100644
--- a/gcc/go/ChangeLog
+++ b/gcc/go/ChangeLog
@@ -1,3 +1,13 @@
+2022-07-16 Ian Lance Taylor <iant@golang.org>
+
+ * go-gcc.cc (Gcc_backend::struct_field_expression): Handle a void
+ expression, as for f().x where f returns a zero-sized type.
+
+2022-07-15 Ian Lance Taylor <iant@golang.org>
+
+ * go-gcc.cc (Gcc_backend::call_expression): Handle a void
+ argument, as for f(g()) where g returns a zero-sized type.
+
2022-06-02 David Malcolm <dmalcolm@redhat.com>
* go-lang.cc (go_get_sarif_source_language): New.
diff --git a/gcc/go/go-gcc.cc b/gcc/go/go-gcc.cc
index f3de7a8..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)
@@ -2112,6 +2119,19 @@ Gcc_backend::call_expression(Bfunction*, // containing fcn for call
args[i] = fn_args.at(i)->get_tree();
if (args[i] == error_mark_node)
return this->error_expression();
+ if (TREE_TYPE(args[i]) == void_type_node)
+ {
+ // This can happen for a case like f(g()) where g returns a
+ // zero-sized type, because in that case we've changed g to
+ // return void.
+ tree t = TYPE_ARG_TYPES(TREE_TYPE(TREE_TYPE(fn)));
+ for (size_t j = 0; j < i; ++j)
+ t = TREE_CHAIN(t);
+ tree arg_type = TREE_TYPE(TREE_VALUE(t));
+ args[i] = fold_build2_loc(EXPR_LOCATION(args[i]), COMPOUND_EXPR,
+ arg_type, args[i],
+ build_zero_cst(arg_type));
+ }
}
tree fndecl = fn;