From b88498204521731f46b439b33f936009fedfdf35 Mon Sep 17 00:00:00 2001 From: Iain Sandoe Date: Sat, 13 Jun 2020 10:36:29 +0100 Subject: [PATCH] coroutines: Make call argument handling more robust [PR95440] build_new_method_call is supposed to be able to handle a null arguments list pointer (when the method has no parms). There were a couple of places where uses of the argument list pointer were not defended against NULL. gcc/cp/ChangeLog: PR c++/95440 * call.c (add_candidates): Use vec_safe_length() for testing the arguments list. (build_new_method_call_1): Use vec_safe_is_empty() when checking for an empty args list. gcc/testsuite/ChangeLog: PR c++/95440 * g++.dg/coroutines/pr95440.C: New test. (cherry picked from commit a9eec9625ea7165292958be04899b057804192fb) --- gcc/cp/call.c | 4 ++-- gcc/testsuite/g++.dg/coroutines/pr95440.C | 28 +++++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/coroutines/pr95440.C diff --git a/gcc/cp/call.c b/gcc/cp/call.c index c97aa800b4a5..8a72fbd04088 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -5841,7 +5841,7 @@ add_candidates (tree fns, tree first_arg, const vec *args, } /* Don't bother reversing an operator with two identical parameters. */ - else if (args->length () == 2 && (flags & LOOKUP_REVERSED)) + else if (vec_safe_length (args) == 2 && (flags & LOOKUP_REVERSED)) { tree parmlist = TYPE_ARG_TYPES (TREE_TYPE (fn)); if (same_type_p (TREE_VALUE (parmlist), @@ -10243,7 +10243,7 @@ build_new_method_call_1 (tree instance, tree fns, vec **args, && !(flags & LOOKUP_ONLYCONVERTING) && cxx_dialect >= cxx2a && CP_AGGREGATE_TYPE_P (basetype) - && !user_args->is_empty ()) + && !vec_safe_is_empty (user_args)) { /* Create a CONSTRUCTOR from ARGS, e.g. {1, 2} from <1, 2>. */ tree list = build_tree_list_vec (user_args); diff --git a/gcc/testsuite/g++.dg/coroutines/pr95440.C b/gcc/testsuite/g++.dg/coroutines/pr95440.C new file mode 100644 index 000000000000..935eaadc8d28 --- /dev/null +++ b/gcc/testsuite/g++.dg/coroutines/pr95440.C @@ -0,0 +1,28 @@ +#if __has_include() +#include +#else +#include +namespace std { using namespace experimental; } +#endif + +struct task +{ + struct promise_type + { + auto get_return_object() const { return task{}; } + static constexpr std::suspend_always initial_suspend() { return {}; } + static constexpr std::suspend_never final_suspend() { return {}; } + static constexpr void return_void() {} + static constexpr void unhandled_exception() {} + }; +}; + +task +test_task () +{ + co_await std::suspend_always{}; +} + +auto t = test_task(); + +int main() {} -- 2.47.2