diff options
author | Martin Liska <mliska@suse.cz> | 2022-07-18 09:50:59 +0200 |
---|---|---|
committer | Martin Liska <mliska@suse.cz> | 2022-07-18 09:50:59 +0200 |
commit | 85df616e13a6a176883e39362c764a2dfa3448e8 (patch) | |
tree | f8a689c7075c69fce355abdbe5bc97b0d10bb144 /gcc/go | |
parent | c29d4ad6d7f4ca1ebfd9489bb62178ea09ae6c6b (diff) | |
parent | 2907bfc3412dd8aef6c6acc17f2152a4e0ac4979 (diff) | |
download | gcc-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/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/go/go-gcc.cc | 20 |
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; |