From patchwork Sun Jun 28 12:55:42 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Iain Sandoe X-Patchwork-Id: 1318565 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=sourceware.org; envelope-from=gcc-patches-bounces@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=sandoe.co.uk Received: from sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 49vrGW3zhgz9s6w for ; Sun, 28 Jun 2020 22:56:17 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 66D90383E835; Sun, 28 Jun 2020 12:56:15 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtp1.wavenetuk.net (smtp.wavenetuk.net [195.26.36.10]) by sourceware.org (Postfix) with ESMTP id 05EB13851C1C for ; Sun, 28 Jun 2020 12:56:12 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 05EB13851C1C Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=sandoe.co.uk Authentication-Results: sourceware.org; spf=none smtp.mailfrom=iain@sandoe.co.uk Received: from [192.168.1.212] (host81-138-1-83.in-addr.btopenworld.com [81.138.1.83]) by smtp1.wavenetuk.net (Postfix) with ESMTPA id 5FDD51201154; Sun, 28 Jun 2020 13:56:10 +0100 (BST) From: Iain Sandoe Mime-Version: 1.0 (Mac OS X Mail 10.3 \(3273\)) Subject: [pushed] coroutines: Handle namespaces while scanning local vars [PR95711]. Message-Id: <3652A84D-EA80-4D8A-9A36-408103BC1F8B@sandoe.co.uk> Date: Sun, 28 Jun 2020 13:55:42 +0100 To: GCC Patches X-Mailer: Apple Mail (2.3273) X-Spam-Status: No, score=-17.6 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_COUK, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, KHOP_HELO_FCRDNS, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Nathan Sidwell Errors-To: gcc-patches-bounces@gcc.gnu.org Sender: "Gcc-patches" Hi, We need to skip past namespace decls when scanning the bind expression var lists checking for local vars. The PR notes that this omission results in an ice-on-valid. tested on x86_64-linux, darwin, powerpc64-linux, applied to master as obvious (and will backport to 10.2). thanks Iain gcc/cp/ChangeLog: PR c++/95711 * coroutines.cc (register_local_var_uses): Skip past namespace decls. gcc/testsuite/ChangeLog: PR c++/95711 * g++.dg/coroutines/pr95711.C: New test. --- gcc/cp/coroutines.cc | 3 +- gcc/testsuite/g++.dg/coroutines/pr95711.C | 79 +++++++++++++++++++++++ 2 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/coroutines/pr95711.C diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc index bab03d44863..54f9cb3b4e4 100644 --- a/gcc/cp/coroutines.cc +++ b/gcc/cp/coroutines.cc @@ -3563,7 +3563,8 @@ register_local_var_uses (tree *stmt, int *do_subtree, void *d) local_var.field_idx = local_var.field_id = NULL_TREE; /* Make sure that we only present vars to the tests below. */ - if (TREE_CODE (lvar) == TYPE_DECL) + if (TREE_CODE (lvar) == TYPE_DECL + || TREE_CODE (lvar) == NAMESPACE_DECL) continue; /* We don't move static vars into the frame. */ diff --git a/gcc/testsuite/g++.dg/coroutines/pr95711.C b/gcc/testsuite/g++.dg/coroutines/pr95711.C new file mode 100644 index 00000000000..f6aedb16ebd --- /dev/null +++ b/gcc/testsuite/g++.dg/coroutines/pr95711.C @@ -0,0 +1,79 @@ +// { dg-do run } + +#if __has_include() +#include +#else +#include +namespace std { + using namespace std::experimental; +} +#endif +#include + +template +struct generator{ + struct promise_type; + using coro_handle = std::coroutine_handle; + + struct promise_type{ + std::suspend_always yield_value (T value){ + value_ = value; + return {}; + } + std::suspend_always initial_suspend (){ + return {}; + } + std::suspend_always final_suspend (){ + return {}; + } + + std::suspend_never return_void() + { + return {}; + } + generator get_return_object () { + return {coro_handle::from_promise(*this)}; + } + void unhandled_exception () { + return; + } + T value_; + }; + coro_handle handle; + generator(coro_handle h) + :handle(h) + {} + ~generator(){ + if(handle) + handle.destroy(); + } + + bool resume(){ + if(not handle.done()) + handle.resume(); + return not handle.done(); + }; + + T get () { + return handle.promise().value_; + } +}; +namespace A +{ +} + +generator +parse() +{ + namespace B = A; + co_yield 1; +} + +int main() +{ + auto gen = parse(); + gen.handle.resume (); /* init suspend. */ + if (gen.get() != 1) + abort (); + return 0; +}