From 5054bc001d9b66fe68d938790f08f48621c6b976 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 15 Jul 2022 08:02:13 -0700 Subject: go: fix f(g()) where g returns zero-sized type Test case is https://go.dev/cl/417481. Fixes golang/go#23868 * go-gcc.cc (Gcc_backend::call_expression): Handle a void argument, as for f(g()) where g returns a zero-sized type. --- gcc/go/go-gcc.cc | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'gcc/go') diff --git a/gcc/go/go-gcc.cc b/gcc/go/go-gcc.cc index f3de7a8..7b4b2ad 100644 --- a/gcc/go/go-gcc.cc +++ b/gcc/go/go-gcc.cc @@ -2112,6 +2112,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; -- cgit v1.1 From bdc7b765f8728cbb769fe1eeef773eda15578aee Mon Sep 17 00:00:00 2001 From: GCC Administrator Date: Sat, 16 Jul 2022 00:16:30 +0000 Subject: Daily bump. --- gcc/go/ChangeLog | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'gcc/go') diff --git a/gcc/go/ChangeLog b/gcc/go/ChangeLog index 5fdf423..6ad883f 100644 --- a/gcc/go/ChangeLog +++ b/gcc/go/ChangeLog @@ -1,3 +1,8 @@ +2022-07-15 Ian Lance Taylor + + * 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 * go-lang.cc (go_get_sarif_source_language): New. -- cgit v1.1 From 2b5baaef0b6e4d1d8e36cda091be26649163ffdb Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sat, 16 Jul 2022 16:29:38 -0700 Subject: 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. --- gcc/go/go-gcc.cc | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'gcc/go') 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) -- cgit v1.1 From 7bcd7f47359b903bf7a193b95d4450d9d69c60ba Mon Sep 17 00:00:00 2001 From: GCC Administrator Date: Sun, 17 Jul 2022 00:16:23 +0000 Subject: Daily bump. --- gcc/go/ChangeLog | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'gcc/go') diff --git a/gcc/go/ChangeLog b/gcc/go/ChangeLog index 6ad883f..5dbcb29 100644 --- a/gcc/go/ChangeLog +++ b/gcc/go/ChangeLog @@ -1,3 +1,8 @@ +2022-07-16 Ian Lance Taylor + + * 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 * go-gcc.cc (Gcc_backend::call_expression): Handle a void -- cgit v1.1