[gcc/devel/omp/gcc-10] coroutines: Make call argument handling more robust [PR95440]

Tobias Burnus burnus@gcc.gnu.org
Mon Jun 15 15:52:47 GMT 2020


https://gcc.gnu.org/g:b88498204521731f46b439b33f936009fedfdf35

commit b88498204521731f46b439b33f936009fedfdf35
Author: Iain Sandoe <iain@sandoe.co.uk>
Date:   Sat Jun 13 10:36:29 2020 +0100

    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)

Diff:
---
 gcc/cp/call.c                             |  4 ++--
 gcc/testsuite/g++.dg/coroutines/pr95440.C | 28 ++++++++++++++++++++++++++++
 2 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index c97aa800b4a..8a72fbd0408 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -5841,7 +5841,7 @@ add_candidates (tree fns, tree first_arg, const vec<tree, va_gc> *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<tree, va_gc> **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 00000000000..935eaadc8d2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/coroutines/pr95440.C
@@ -0,0 +1,28 @@
+#if __has_include(<coroutine>)
+#include <coroutine>
+#else
+#include <experimental/coroutine>
+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() {}


More information about the Gcc-cvs mailing list