From patchwork Wed Feb 5 06:14:40 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: JunMa X-Patchwork-Id: 1233667 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=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-518924-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=linux.alibaba.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha1 header.s=default header.b=irL3F6TP; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48CBBx15Cfz9sSY for ; Wed, 5 Feb 2020 17:15:51 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:to:cc :from:subject:message-id:date:mime-version:content-type; q=dns; s=default; b=EUzUdKQraX2dywHIstZYlxMwoIBOCf35EEHLUY8uaYnrrV1s7D PP7S2DmZfWjIAgvnjU+uXKF/4UiCe6unb2zrjclRHeh99ezb7+sf8i5hUUnZyytb 2hks3VFCGV3gu+uO2v+LZu/KJkbRGI0la6kSueexJBysUy/h0a9iA5Yms= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:to:cc :from:subject:message-id:date:mime-version:content-type; s= default; bh=SD4xpP2me2iREZ92EbPj/aWtUhM=; b=irL3F6TPLBzNzNwYg0GK Fxyihhmw7VkevdyRy6qOocwd1w/zwqkvOgmU3LKx8zymInygLROa+PDQYOa0xpFr cgV+TEfY0GHtP6ThyPMgZ1R6fjmCEL/Lf5iiruSBDtkQWm4efg5ucFut3uxRmAKa w2ewO4qfIccLxHQ7C0bRQfw= Received: (qmail 98753 invoked by alias); 5 Feb 2020 06:15:42 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 98657 invoked by uid 89); 5 Feb 2020 06:15:25 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-22.0 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_LOW, SPF_FAIL, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 spammy=duration, Period, HX-Languages-Length:3871, chrono X-HELO: eggs.gnu.org Received: from eggs.gnu.org (HELO eggs.gnu.org) (209.51.188.92) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 05 Feb 2020 06:15:22 +0000 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1izDxr-0003jM-5R for gcc-patches@gcc.gnu.org; Wed, 05 Feb 2020 01:15:08 -0500 Received: from out4436.biz.mail.alibaba.com ([47.88.44.36]:45000) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1izDxq-0003E1-Pz for gcc-patches@gcc.gnu.org; Wed, 05 Feb 2020 01:15:07 -0500 X-Alimail-AntiSpam: AC=PASS; BC=-1|-1; BR=01201311R281e4; CH=green; DM=||false|; DS=||; FP=0|-1|-1|-1|0|-1|-1|-1; HT=e01f04397; MF=junma@linux.alibaba.com; NM=1; PH=DS; RN=3; SR=0; TI=SMTPD_---0TpAulO0_1580883280; Received: from 30.27.218.32(mailfrom:JunMa@linux.alibaba.com fp:SMTPD_---0TpAulO0_1580883280) by smtp.aliyun-inc.com(127.0.0.1); Wed, 05 Feb 2020 14:14:41 +0800 To: gcc-patches Cc: Nathan Sidwell , Iain Sandoe From: JunMa Subject: [PATCH coroutines] Build co_await/yield_expr with unknown_type in processing_template_decl phase Message-ID: <6ac2b47f-b1b2-5fb3-99f7-66597387018b@linux.alibaba.com> Date: Wed, 5 Feb 2020 14:14:40 +0800 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:68.0) Gecko/20100101 Thunderbird/68.4.1 MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 47.88.44.36 X-IsSubscribed: yes Hi This patch builds co_await/yield_expr with unknown_type when we can not know the promise type in processing_template_decl phase. it avoid to confuse compiler when handing type deduction and conversion. Bootstrap and test on X86_64, is it OK? Regards JunMa gcc/cp 2020-02-05  Jun Ma         * coroutines.cc (finish_co_await_expr): Build co_await_expr         with unknown_type_node.         (finish_co_yield_expr): Ditto.         *pt.c (type_dependent_expression_p): Set co_await/yield_expr         with unknown type as dependent. gcc/testsuite 2020-02-05  Jun Ma         * g++.dg/coroutines/torture/co-await-14-template-traits.C: New test. --- gcc/cp/coroutines.cc | 8 +++---- gcc/cp/pt.c | 5 ++++ .../torture/co-await-14-template-traits.C | 24 +++++++++++++++++++ 3 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/coroutines/torture/co-await-14-template-traits.C diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc index 7525d7c035a..e380ee24c5f 100644 --- a/gcc/cp/coroutines.cc +++ b/gcc/cp/coroutines.cc @@ -834,9 +834,8 @@ finish_co_await_expr (location_t kw, tree expr) /* If we don't know the promise type, we can't proceed. */ tree functype = TREE_TYPE (current_function_decl); if (dependent_type_p (functype) || type_dependent_expression_p (expr)) - return build5_loc (kw, CO_AWAIT_EXPR, TREE_TYPE (expr), expr, NULL_TREE, - NULL_TREE, NULL_TREE, integer_zero_node); - } + return build5_loc (kw, CO_AWAIT_EXPR, unknown_type_node, expr, + NULL_TREE, NULL_TREE, NULL_TREE, integer_zero_node); /* We must be able to look up the "await_transform" method in the scope of the promise type, and obtain its return type. */ @@ -912,9 +911,8 @@ finish_co_yield_expr (location_t kw, tree expr) tree functype = TREE_TYPE (current_function_decl); /* If we don't know the promise type, we can't proceed. */ if (dependent_type_p (functype) || type_dependent_expression_p (expr)) - return build2_loc (kw, CO_YIELD_EXPR, TREE_TYPE (expr), expr, + return build2_loc (kw, CO_YIELD_EXPR, unknown_type_node, expr, NULL_TREE); - } if (!coro_promise_type_found_p (current_function_decl, kw)) /* We must be able to look up the "yield_value" method in the scope of diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 40ff3c3a089..cfc3393991e 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -26743,6 +26743,11 @@ type_dependent_expression_p (tree expression) if (TREE_CODE (expression) == SCOPE_REF) return false; + /* CO_AWAIT/YIELD_EXPR with unknown type is always dependent. */ + if (TREE_CODE (expression) == CO_AWAIT_EXPR + || TREE_CODE (expression) == CO_YIELD_EXPR) + return true; + if (BASELINK_P (expression)) { if (BASELINK_OPTYPE (expression) diff --git a/gcc/testsuite/g++.dg/coroutines/torture/co-await-14-template-traits.C b/gcc/testsuite/g++.dg/coroutines/torture/co-await-14-template-traits.C new file mode 100644 index 00000000000..4e670b1c308 --- /dev/null +++ b/gcc/testsuite/g++.dg/coroutines/torture/co-await-14-template-traits.C @@ -0,0 +1,24 @@ +// { dg-do compile } +// Test we create co_await_expr with dependent type rather than type of awaitable class + +#include "../coro.h" +#include "../coro1-ret-int-yield-int.h" +#include + +struct TestAwaiter { + int recent_test; + TestAwaiter(int test) : recent_test{test} {} + bool await_ready() { return true; } + void await_suspend(coro::coroutine_handle<>) {} + int await_resume() { return recent_test;} + void return_value(int x) { recent_test = x;} +}; + +template +coro1 test_temparg (std::chrono::duration dur) +{ + auto sum = co_await TestAwaiter(1); + if (!sum) + dur.count(); + co_return 0; +}