testsuite, coroutines : Make final_suspend calls noexcept.
authorIain Sandoe <iain@sandoe.co.uk>
Mon, 15 Feb 2021 16:56:52 +0000 (16:56 +0000)
committerIain Sandoe <iain@sandoe.co.uk>
Wed, 24 Feb 2021 19:23:45 +0000 (19:23 +0000)
The wording of [dcl.fct.def.coroutine]/15 states:
The expression co_await promise.final_suspend() shall not be
potentially-throwing.  A fair number of testcases are not correctly
marked. Fixed here.

gcc/testsuite/ChangeLog:

* g++.dg/coroutines/co-await-void_type.C: Mark promise
final_suspend call as noexcept.
* g++.dg/coroutines/co-return-syntax-08-bad-return.C: Likewise.
* g++.dg/coroutines/co-return-syntax-10-movable.C: Likewise.
* g++.dg/coroutines/co-return-warning-1.C: Likewise.
* g++.dg/coroutines/co-yield-syntax-08-needs-expr.C: Likewise.
* g++.dg/coroutines/coro-bad-gro-00-class-gro-scalar-return.C: Likewise.
* g++.dg/coroutines/coro-bad-gro-01-void-gro-non-class-coro.C: Likewise.
* g++.dg/coroutines/coro-missing-gro.C: Likewise.
* g++.dg/coroutines/coro-missing-promise-yield.C: Likewise.
* g++.dg/coroutines/coro-missing-ret-value.C: Likewise.
* g++.dg/coroutines/coro-missing-ret-void.C: Likewise.
* g++.dg/coroutines/coro-missing-ueh.h: Likewise.
* g++.dg/coroutines/coro1-allocators.h: Likewise.
* g++.dg/coroutines/coro1-refs-and-ctors.h: Likewise.
* g++.dg/coroutines/coro1-ret-int-yield-int.h: Likewise.
* g++.dg/coroutines/pr94682-preview-this.C: Likewise.
* g++.dg/coroutines/pr94752.C: Likewise.
* g++.dg/coroutines/pr94760-mismatched-traits-and-promise-prev.C: Likewise.
* g++.dg/coroutines/pr94879-folly-1.C: Likewise.
* g++.dg/coroutines/pr94883-folly-2.C: Likewise.
* g++.dg/coroutines/pr95050.C: Likewise.
* g++.dg/coroutines/pr95345.C: Likewise.
* g++.dg/coroutines/pr95440.C: Likewise.
* g++.dg/coroutines/pr95591.C: Likewise.
* g++.dg/coroutines/pr95711.C: Likewise.
* g++.dg/coroutines/pr95813.C: Likewise.
* g++.dg/coroutines/symmetric-transfer-00-basic.C: Likewise.
* g++.dg/coroutines/torture/co-await-07-tmpl.C: Likewise.
* g++.dg/coroutines/torture/co-await-17-capture-comp-ref.C: Likewise.
* g++.dg/coroutines/torture/co-ret-00-void-return-is-ready.C: Likewise.
* g++.dg/coroutines/torture/co-ret-01-void-return-is-suspend.C: Likewise.
* g++.dg/coroutines/torture/co-ret-03-different-GRO-type.C: Likewise.
* g++.dg/coroutines/torture/co-ret-04-GRO-nontriv.C: Likewise.
* g++.dg/coroutines/torture/co-ret-06-template-promise-val-1.C: Likewise.
* g++.dg/coroutines/torture/co-ret-08-template-cast-ret.C: Likewise.
* g++.dg/coroutines/torture/co-ret-09-bool-await-susp.C: Likewise.
* g++.dg/coroutines/torture/co-ret-15-default-return_void.C: Likewise.
* g++.dg/coroutines/torture/co-ret-17-void-ret-coro.C: Likewise.
* g++.dg/coroutines/torture/co-yield-00-triv.C: Likewise.
* g++.dg/coroutines/torture/co-yield-03-tmpl.C: Likewise.
* g++.dg/coroutines/torture/co-yield-04-complex-local-state.C: Likewise.
* g++.dg/coroutines/torture/exceptions-test-0.C: Likewise.
* g++.dg/coroutines/torture/exceptions-test-01-n4849-a.C: Likewise.
* g++.dg/coroutines/torture/func-params-04.C: Likewise.
* g++.dg/coroutines/torture/local-var-06-structured-binding.C: Likewise.
* g++.dg/coroutines/torture/mid-suspend-destruction-0.C: Likewise.

46 files changed:
gcc/testsuite/g++.dg/coroutines/co-await-void_type.C
gcc/testsuite/g++.dg/coroutines/co-return-syntax-08-bad-return.C
gcc/testsuite/g++.dg/coroutines/co-return-syntax-10-movable.C
gcc/testsuite/g++.dg/coroutines/co-return-warning-1.C
gcc/testsuite/g++.dg/coroutines/co-yield-syntax-08-needs-expr.C
gcc/testsuite/g++.dg/coroutines/coro-bad-gro-00-class-gro-scalar-return.C
gcc/testsuite/g++.dg/coroutines/coro-bad-gro-01-void-gro-non-class-coro.C
gcc/testsuite/g++.dg/coroutines/coro-missing-gro.C
gcc/testsuite/g++.dg/coroutines/coro-missing-promise-yield.C
gcc/testsuite/g++.dg/coroutines/coro-missing-ret-value.C
gcc/testsuite/g++.dg/coroutines/coro-missing-ret-void.C
gcc/testsuite/g++.dg/coroutines/coro-missing-ueh.h
gcc/testsuite/g++.dg/coroutines/coro1-allocators.h
gcc/testsuite/g++.dg/coroutines/coro1-refs-and-ctors.h
gcc/testsuite/g++.dg/coroutines/coro1-ret-int-yield-int.h
gcc/testsuite/g++.dg/coroutines/pr94682-preview-this.C
gcc/testsuite/g++.dg/coroutines/pr94752.C
gcc/testsuite/g++.dg/coroutines/pr94760-mismatched-traits-and-promise-prev.C
gcc/testsuite/g++.dg/coroutines/pr94879-folly-1.C
gcc/testsuite/g++.dg/coroutines/pr94883-folly-2.C
gcc/testsuite/g++.dg/coroutines/pr95050.C
gcc/testsuite/g++.dg/coroutines/pr95345.C
gcc/testsuite/g++.dg/coroutines/pr95440.C
gcc/testsuite/g++.dg/coroutines/pr95591.C
gcc/testsuite/g++.dg/coroutines/pr95711.C
gcc/testsuite/g++.dg/coroutines/pr95813.C
gcc/testsuite/g++.dg/coroutines/symmetric-transfer-00-basic.C
gcc/testsuite/g++.dg/coroutines/torture/co-await-07-tmpl.C
gcc/testsuite/g++.dg/coroutines/torture/co-await-17-capture-comp-ref.C
gcc/testsuite/g++.dg/coroutines/torture/co-ret-00-void-return-is-ready.C
gcc/testsuite/g++.dg/coroutines/torture/co-ret-01-void-return-is-suspend.C
gcc/testsuite/g++.dg/coroutines/torture/co-ret-03-different-GRO-type.C
gcc/testsuite/g++.dg/coroutines/torture/co-ret-04-GRO-nontriv.C
gcc/testsuite/g++.dg/coroutines/torture/co-ret-06-template-promise-val-1.C
gcc/testsuite/g++.dg/coroutines/torture/co-ret-08-template-cast-ret.C
gcc/testsuite/g++.dg/coroutines/torture/co-ret-09-bool-await-susp.C
gcc/testsuite/g++.dg/coroutines/torture/co-ret-15-default-return_void.C
gcc/testsuite/g++.dg/coroutines/torture/co-ret-17-void-ret-coro.C
gcc/testsuite/g++.dg/coroutines/torture/co-yield-00-triv.C
gcc/testsuite/g++.dg/coroutines/torture/co-yield-03-tmpl.C
gcc/testsuite/g++.dg/coroutines/torture/co-yield-04-complex-local-state.C
gcc/testsuite/g++.dg/coroutines/torture/exceptions-test-0.C
gcc/testsuite/g++.dg/coroutines/torture/exceptions-test-01-n4849-a.C
gcc/testsuite/g++.dg/coroutines/torture/func-params-04.C
gcc/testsuite/g++.dg/coroutines/torture/local-var-06-structured-binding.C
gcc/testsuite/g++.dg/coroutines/torture/mid-suspend-destruction-0.C

index 0bb8818..370068f 100644 (file)
@@ -28,7 +28,7 @@ struct resumable::promise_type {
     return coro_handle::from_promise(*this);
   }
   auto initial_suspend() { return std::suspend_always(); }
-  auto final_suspend() { return std::suspend_always(); }
+  auto final_suspend() noexcept { return std::suspend_always(); }
   void yield_value(int v) { value_ = v; }
   void unhandled_exception() {}
 };
index 9b53754..148ee45 100644 (file)
@@ -24,7 +24,7 @@ struct Coro {
   ~promise_type() {}
   Coro get_return_object () { return Coro (handle_type::from_promise (*this)); }
   auto initial_suspend () { return coro::suspend_always{}; }
-  auto final_suspend () { return coro::suspend_always{}; }
+  auto final_suspend () noexcept { return coro::suspend_always{}; }
   void return_void () { }
    void unhandled_exception() { }
   };
index c6f36a7..0cf3c39 100644 (file)
@@ -32,7 +32,7 @@ struct coro1 {
 
   auto get_return_object () { return handle_type::from_promise (*this);}
   coro::suspend_always initial_suspend () const { return {}; }
-  coro::suspend_always final_suspend () const {  return {}; }
+  coro::suspend_always final_suspend () const noexcept {  return {}; }
 
   void return_value(T&& v) noexcept { value = std::move(v); }
   void return_value(const T&) noexcept = delete;
index 69e7690..b2aaba1 100644 (file)
@@ -28,7 +28,7 @@ struct resumable::promise_type {
     return coro_handle::from_promise(*this);
   }
   auto initial_suspend() { return std::suspend_always(); }
-  auto final_suspend() { return std::suspend_always(); }
+  auto final_suspend() noexcept { return std::suspend_always(); }
   void return_value(int v) { value_ = v; }
   std::suspend_always yield_value(int v) {
     value_ = v;
index 86969f7..aec1214 100644 (file)
@@ -10,7 +10,7 @@ struct DummyYield {
   DummyYield (coro::coroutine_handle<> handle) : handle (handle) {}
   struct dummy_yield {
     coro::suspend_never initial_suspend() { return {}; }
-    coro::suspend_never final_suspend() { return {}; }
+    coro::suspend_never final_suspend() noexcept { return {}; }
     DummyYield get_return_object() {
       return DummyYield (coro::coroutine_handle<dummy_yield>::from_promise (*this));
     }
index bd9dec6..f9e8a5f 100644 (file)
@@ -21,11 +21,11 @@ struct std::coroutine_traits<R, HandleRef, T...> {
         }
        ~promise_type () { PRINT ("Destroyed Promise"); g_promise = 0;}
         Thing get_return_object() { return {}; }
-
+       //int get_return_object() { return 0; }
         auto initial_suspend() {
           return std::suspend_always{};
          }
-        auto final_suspend() { return std::suspend_never{}; }
+        auto final_suspend() noexcept { return std::suspend_never{}; }
 
         void return_void() {}
         void unhandled_exception() {}
index c31fcb5..2671ce7 100644 (file)
@@ -19,7 +19,7 @@ struct std::coroutine_traits<R, HandleRef, T...> {
         auto initial_suspend() {
           return std::suspend_always{};
          }
-        auto final_suspend() { return std::suspend_never{}; }
+        auto final_suspend() noexcept { return std::suspend_never{}; }
 
         void return_void() {}
         void unhandled_exception() {}
index fb02e9d..44a629b 100644 (file)
@@ -10,7 +10,7 @@ struct MissingGRO {
   MissingGRO (coro::coroutine_handle<> handle) : handle (handle) {}
   struct missing_gro {
     coro::suspend_never initial_suspend() { return {}; }
-    coro::suspend_never final_suspend() { return {}; }
+    coro::suspend_never final_suspend() noexcept { return {}; }
     void return_void () {}
     void unhandled_exception() { /*std::terminate();*/ };
   };
index a85a4d5..01cc414 100644 (file)
@@ -7,7 +7,7 @@ struct MissingPromiseYield {
   MissingPromiseYield (coro::coroutine_handle<> handle) : handle (handle) {}
   struct missing_yield {
     coro::suspend_never initial_suspend() { return {}; }
-    coro::suspend_never final_suspend() { return {}; }
+    coro::suspend_never final_suspend() noexcept { return {}; }
     MissingPromiseYield get_return_object() {
       return MissingPromiseYield (coro::coroutine_handle<missing_yield>::from_promise (*this));
     }
index f745fa9..91c29d3 100644 (file)
@@ -10,7 +10,7 @@ struct MissingRetValue {
   MissingRetValue (coro::coroutine_handle<> handle) : handle (handle) {}
   struct missing_retvoid {
     coro::suspend_never initial_suspend() { return {}; }
-    coro::suspend_never final_suspend() { return {}; }
+    coro::suspend_never final_suspend() noexcept { return {}; }
     MissingRetValue get_return_object() {
       return MissingRetValue (coro::coroutine_handle<missing_retvoid>::from_promise (*this));
     }
index 8639a9d..502391a 100644 (file)
@@ -10,7 +10,7 @@ struct MissingRetVoid {
   MissingRetVoid (coro::coroutine_handle<> handle) : handle (handle) {}
   struct missing_retvoid {
     coro::suspend_never initial_suspend() { return {}; }
-    coro::suspend_never final_suspend() { return {}; }
+    coro::suspend_never final_suspend() noexcept { return {}; }
     MissingRetVoid get_return_object() {
       return MissingRetVoid (coro::coroutine_handle<missing_retvoid>::from_promise (*this));
     }
index 51e6135..361003c 100644 (file)
@@ -8,7 +8,7 @@ struct MissingUEH {
   MissingUEH (coro::coroutine_handle<> handle) : handle (handle) {}
   struct missing_ueh {
     coro::suspend_never initial_suspend() { return {}; }
-    coro::suspend_never final_suspend() { return {}; }
+    coro::suspend_never final_suspend() noexcept { return {}; }
     MissingUEH get_return_object() {
       return MissingUEH (coro::coroutine_handle<missing_ueh>::from_promise (*this));
     }
index f7a85e9..cf73dc0 100644 (file)
@@ -100,7 +100,7 @@ struct coro1 {
     PRINT ("get initial_suspend (always)");
     return suspend_always_prt{};
   }
-  auto final_suspend () {
+  auto final_suspend () noexcept {
     PRINT ("get final_suspend (always)");
     return suspend_always_prt{};
   }
index 5b89e7c..8831a07 100644 (file)
@@ -19,7 +19,7 @@ struct coro1 {
     PRINT ("get initial_suspend (always)");
     return suspend_always_prt{};
   }
-  auto final_suspend () {
+  auto final_suspend () noexcept {
     PRINT ("get final_suspend (always)");
     return suspend_always_prt{};
   }
index 7cf5052..826519e 100644 (file)
@@ -108,7 +108,7 @@ struct coro1 {
 #endif
 #ifdef MISSING_FINAL_SUSPEND
 #else
-  auto final_suspend () {
+  auto final_suspend () noexcept {
     PRINT ("get final_suspend (always)");
     return suspend_always_prt{};
   }
index ca96f37..7c4bae2 100644 (file)
@@ -13,7 +13,7 @@ struct promise
   promise(Class &,int) { static_assert(!std::is_pointer<Class>::value, ""); }
 
   coro::suspend_never initial_suspend() { return {}; }
-  coro::suspend_never final_suspend() { return {}; }
+  coro::suspend_never final_suspend() noexcept { return {}; }
 
   future get_return_object() { return {}; }
 
index 89ace6a..e5e4ece 100644 (file)
@@ -9,7 +9,7 @@ struct task {
         promise_type() {}
         task get_return_object() { return {}; }
         suspend_never initial_suspend() { return {}; }
-        suspend_never final_suspend() { return {}; }
+        suspend_never final_suspend() noexcept { return {}; }
         void return_void() {}
         void unhandled_exception() {}
     };
index 235b5e7..90a558d 100644 (file)
@@ -14,7 +14,7 @@ struct std::coroutine_traits<R, CallOp, T...> {
         promise_type (CallOp op, T ...args) {}
         Fake get_return_object() { return {}; }
         std::suspend_always initial_suspend() { return {}; }
-        std::suspend_never final_suspend() { return {}; }
+        std::suspend_never final_suspend() noexcept { return {}; }
         void return_void() {}
         void unhandled_exception() {}
     };
index 7d66ce0..e815ca7 100644 (file)
@@ -31,7 +31,7 @@ class j {
 
 public:
   std::g initial_suspend();
-  l final_suspend();
+  l final_suspend() noexcept;
 };
 class m : public j {
 public:
index 088f133..c5fa659 100644 (file)
@@ -24,7 +24,7 @@ class h {
 public:
   void get_return_object();
   std::b initial_suspend();
-  j final_suspend();
+  j final_suspend() noexcept;
   void unhandled_exception();
   template <typename g> 
     auto await_transform (g c) { return ab(f, c); }
index fd1516d..2867cfc 100644 (file)
@@ -21,7 +21,7 @@ struct task
   {
     auto get_return_object () -> task  { return {}; }
     auto initial_suspend () -> suspend_always { return {}; }
-    auto final_suspend () -> suspend_always { return {}; }
+    auto final_suspend () noexcept -> suspend_always { return {}; }
     void return_void () {} 
     void unhandled_exception () { }
     void thing (ret_type x) {} 
index 90e946d..8eae611 100644 (file)
@@ -14,7 +14,7 @@ struct dummy_coro
   void await_resume() { }
   dummy_coro get_return_object() { return {}; }
   dummy_coro initial_suspend() { return {}; }
-  dummy_coro final_suspend() { return {}; }
+  dummy_coro final_suspend() noexcept { return {}; }
   void return_void() { }
   void unhandled_exception() { }
 };
index 8542880..1169da4 100644 (file)
@@ -22,7 +22,7 @@ struct task
 //    static constexpr suspend_n initial_suspend()  { return {2}; }
 #endif
     static constexpr std::suspend_always initial_suspend()  { return {}; }
-    static constexpr std::suspend_never final_suspend() { return {}; }
+    static constexpr std::suspend_never final_suspend() noexcept { return {}; }
     static constexpr void return_void() {}
     static constexpr void unhandled_exception() {}
   };
index 664b1d3..a1a2e57 100644 (file)
@@ -12,7 +12,7 @@ struct generator {
         void return_void();
         void unhandled_exception();
         suspend_always initial_suspend();
-        suspend_always final_suspend();
+        suspend_always final_suspend() noexcept;
 
         template<typename Arg>
         suspend_always yield_value(Arg&&) {
index f6aedb1..682a221 100644 (file)
@@ -23,7 +23,7 @@ struct generator{
         std::suspend_always initial_suspend (){
             return {};
         }
-        std::suspend_always final_suspend (){
+        std::suspend_always final_suspend () noexcept {
             return {};
         }
 
index 445cdf1..269cba7 100644 (file)
@@ -21,7 +21,7 @@ template <typename T, typename... Args>
 struct coroutine_traits<lazy<T>, Args...> {
     struct promise_type {
         suspend_always initial_suspend() const { return {}; }
-        suspend_always final_suspend() const { return {}; }
+        suspend_always final_suspend() const noexcept { return {}; }
         void return_value(T val) {}
         lazy<T> get_return_object() {
             return lazy<T>();
index b78ae20..a959408 100644 (file)
@@ -44,7 +44,7 @@ struct Loopy {
     }
 
     coro::suspend_always initial_suspend() { return {}; }
-    coro::suspend_always final_suspend() { return {}; }
+    coro::suspend_always final_suspend() noexcept { return {}; }
 
     void unhandled_exception() { /*std::terminate();*/  }
     void return_void() {}
index 33f8e99..17dff0d 100644 (file)
@@ -71,7 +71,7 @@ struct coro1 {
     return suspend_never_prt{};
   }
 
-  auto final_suspend() {
+  auto final_suspend() noexcept {
     PRINT ("get final_suspend");
     return suspend_always_prt{};
   }
index c5829c4..3eefe9e 100644 (file)
@@ -20,7 +20,7 @@ struct resumable::promise_type {
     return coro_handle::from_promise(*this);
   }
   auto initial_suspend() { return std::suspend_never(); }
-  auto final_suspend() { return std::suspend_always(); }
+  auto final_suspend() noexcept { return std::suspend_always(); }
   void return_value(int x) {used = x;}
   void unhandled_exception() {}
 
index f551c6e..dd0a3b7 100644 (file)
@@ -57,7 +57,7 @@ struct coro1 {
     PRINT ("get initial_suspend (never) ");
     return suspend_never_prt{};
   }
-  auto final_suspend () {
+  auto final_suspend () noexcept {
     PRINT ("get final_suspend (always) ");
     return suspend_always_prt{};
   }
index 03fc6ee..1f4c3de 100644 (file)
@@ -57,7 +57,7 @@ struct coro1 {
     PRINT ("get initial_suspend (always)");
     return suspend_always_prt{};
   }
-  auto final_suspend () {
+  auto final_suspend () noexcept {
     PRINT ("get final_suspend (always)");
     return suspend_always_prt{};
   }
index 36da680..1a095c6 100644 (file)
@@ -55,7 +55,7 @@ struct coro1 {
     PRINT ("get initial_suspend (always)");
     return suspend_always_prt{};
   }
-  auto final_suspend () {
+  auto final_suspend () noexcept {
     PRINT ("get final_suspend (always)");
     return suspend_always_prt{};
   }
index 29fb942..abb789a 100644 (file)
@@ -72,7 +72,7 @@ struct coro1 {
     PRINT ("get initial_suspend (always)");
     return suspend_always_prt{};
   }
-  auto final_suspend () {
+  auto final_suspend () noexcept {
     PRINT ("get final_suspend (always)");
     return suspend_always_prt{};
   }
index 5b1acb8..91f591a 100644 (file)
@@ -63,7 +63,7 @@ struct coro1 {
     PRINT ("get initial_suspend (always)");
     return suspend_always_prt{};
   }
-  auto final_suspend () const {
+  auto final_suspend () const noexcept {
     PRINT ("get final_suspend (always)");
     return suspend_always_prt{};
   }
index 266bc7b..ac4cca4 100644 (file)
@@ -60,7 +60,7 @@ struct coro1 {
     PRINT ("get initial_suspend (always)");
     return suspend_always_prt{};
   }
-  suspend_always_prt final_suspend () const {
+  suspend_always_prt final_suspend () const noexcept {
     PRINT ("get final_suspend (always)");
     return suspend_always_prt{};
   }
index d14c358..3368322 100644 (file)
@@ -70,7 +70,7 @@ struct coro1 {
     PRINT ("get initial_suspend (always, but really never) ");
     return suspend_always_prt{};
   }
-  auto final_suspend () {
+  auto final_suspend () noexcept {
     PRINT ("get final_suspend (always, but never) ");
     return suspend_always_prt{};
   }
index 99910f3..300052c 100644 (file)
@@ -28,7 +28,7 @@ public:
   using coro_handle = std::coroutine_handle<promise_type>;
   auto get_return_object() { return coro_handle::from_promise(*this); }
   auto initial_suspend() { return std::suspend_always(); }
-  auto final_suspend() { return std::suspend_always(); }
+  auto final_suspend() noexcept { return std::suspend_always(); }
   void return_void() { value_ = -1; }
   void unhandled_exception() {}
 private:
index 01a75c1..9c9d2fa 100644 (file)
@@ -21,7 +21,7 @@ struct std::coroutine_traits<R, HandleRef, T...> {
         auto initial_suspend() {
           return std::suspend_always{};
          }
-        auto final_suspend() { return std::suspend_never{}; }
+        auto final_suspend() noexcept { return std::suspend_never{}; }
 
         void return_void() {}
         void unhandled_exception() {}
index 586b6b2..15e390e 100644 (file)
@@ -62,7 +62,7 @@ struct coro1 {
     PRINT ("get initial_suspend (always)");
     return suspend_always_prt{};
   }
-  auto final_suspend () {
+  auto final_suspend () noexcept {
     PRINT ("get final_suspend (always)");
     return suspend_always_prt{};
   }
index cceee1f..45fc8d7 100644 (file)
@@ -22,7 +22,7 @@ struct looper {
     return suspend_always_prt{};
   }
 
-  auto final_suspend () {
+  auto final_suspend () noexcept {
     PRINT ("get final_suspend (always)");
     return suspend_always_prt{};
   }
index d9330b3..f97bd23 100644 (file)
@@ -25,7 +25,7 @@ struct looper {
     return suspend_always_prt{};
   }
 
-  auto final_suspend () {
+  auto final_suspend () noexcept {
     PRINT ("get final_suspend (always)");
     return suspend_always_prt{};
   }
index 164c804..85135fc 100644 (file)
@@ -60,7 +60,7 @@ struct coro1 {
     PRINT ("get initial_suspend (always)");
     return suspend_always_prt{};
   }
-  auto final_suspend () {
+  auto final_suspend () noexcept {
     PRINT ("get final_suspend (always)");
     return suspend_always_prt{};
   }
index e96b4ed..6433b62 100644 (file)
@@ -87,7 +87,7 @@ struct coro1 {
     PRINT ("get initial_suspend (always)");
     return suspend_always_susp_throws_prt(throw_control);
   }
-  auto final_suspend () {
+  auto final_suspend () noexcept {
     PRINT ("get final_suspend (always)");
     return suspend_always_prt{};
   }
index 789e2c0..c90c152 100644 (file)
@@ -12,6 +12,7 @@ struct nontriv {
   int a, b, c;
   nontriv (int _a, int _b, int _c) : a(_a), b(_b), c(_c) {}
   virtual int getA () { return a; }
+  ~nontriv() { a = -1; }
 };
 
 struct coro1
@@ -19,12 +20,12 @@ f (nontriv t) noexcept
 {
   if (t.a > 30)
     {
-      PRINTF ("coro1: about to return %d", t.b);
+      PRINTF ("coro1: about to return %d\n", t.b);
       co_return t.b;
     }
   else if (t.a > 20)
     {
-      PRINTF ("coro1: about to co-return %d", t.c);
+      PRINTF ("coro1: about to co-return %d\n", t.c);
       co_return t.c;
     }
   else
index ef3ff47..282aa7a 100644 (file)
@@ -15,7 +15,7 @@ struct promise
   promise (Args&... args) {}
  
   coro::suspend_never initial_suspend() { return {}; }
-  coro::suspend_never final_suspend() { return {}; }
+  coro::suspend_never final_suspend() noexcept { return {}; }
 
   future get_return_object() { return {}; }
 
index 505bfa3..63561ea 100644 (file)
@@ -61,7 +61,7 @@ struct coro1 {
     PRINT ("get initial_suspend (always)");
     return suspend_always_prt{};
   }
-  auto final_suspend () {
+  auto final_suspend () noexcept {
     PRINT ("get final_suspend (always)");
     return suspend_always_prt{};
   }