From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTP id 4F86D384403C for ; Fri, 16 Apr 2021 22:58:42 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 4F86D384403C Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-492-v4DtHaMpPayRgPBNW9kuQQ-1; Fri, 16 Apr 2021 18:58:40 -0400 X-MC-Unique: v4DtHaMpPayRgPBNW9kuQQ-1 Received: by mail-qk1-f197.google.com with SMTP id o4so4721405qkg.2 for ; Fri, 16 Apr 2021 15:58:40 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=dHdAEvmdibAaVpFjBDVMX/h/AEwFFW08dBxcEf5yPkA=; b=jF5mBDftyqI1uqC4YX3uD7PbdKbGfyp86gqj0C9Y7TfANHBuCo/zbAE3kZgbvEcfGq 6H8bZe87jaWill/DjJk/NYMVqj4yFGRQRP4PeDAc34e+W5FupSURhYcj55RGpiYvNR3n bk83xIm+FW8QO9q5UVScjwcn0+O/J/w6KJplP6niblcbvbBL/KyPLWXGinjdTm2OQ4zG MISWdHGiQJ8VlAqRQsAx72XLtH2yPn19nsUG1lAcVPkgjvFoLFEBa1EbDlm0+eYlJysq f9R4AznTUaOUmCIfMNb31BqZbi7DzgktiyHQXBjnzvuwWpX9cT5vFjm1s9mJP/1vseLS tEcg== X-Gm-Message-State: AOAM5324JIqMMGs6r3DZTGMiUyar3nBteIVoj+60Vt/7LlyUR8961GA0 nP1Nk009NqllBowpwFOKd12vchSMrASOMCR85xyUdLKnTzHGu5d4qJ9Ixrf02zXsEQkg1KOfvF4 D795wVzNqLAh1dQeCWo9GnsJKZIOLSMOBD5KNUFY2xy7L/Z7tUuntvRFzVgnsMiFIJwQ= X-Received: by 2002:a05:6214:76a:: with SMTP id f10mr10806764qvz.62.1618613919420; Fri, 16 Apr 2021 15:58:39 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxQItrYsbVGcqXFFx984li/4aeXFQk3fY4lCUtuqkIoTvmbx+ymtKZ+DVtw9JVu9MUdEdDdZA== X-Received: by 2002:a05:6214:76a:: with SMTP id f10mr10806745qvz.62.1618613919075; Fri, 16 Apr 2021 15:58:39 -0700 (PDT) Received: from localhost.localdomain (ool-457d493a.dyn.optonline.net. [69.125.73.58]) by smtp.gmail.com with ESMTPSA id a10sm5090969qkh.122.2021.04.16.15.58.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 Apr 2021 15:58:38 -0700 (PDT) From: Patrick Palka To: gcc-patches@gcc.gnu.org Subject: [PATCH] c++: Fix pretty printing of function pointer type [PR98767] Date: Fri, 16 Apr 2021 18:58:30 -0400 Message-Id: <20210416225830.3897124-1-ppalka@redhat.com> X-Mailer: git-send-email 2.31.1.305.gd1b10fc6d8 MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII" X-Spam-Status: No, score=-16.1 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, 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: , X-List-Received-Date: Fri, 16 Apr 2021 22:58:52 -0000 When pretty printing a function pointer type via pp_cxx_parameter_declaration_clause, we end up always printing an empty parameter list because the loop that's supposed to print the parameter list iterates over 'args' instead of 'types', and 'args' is empty in this case when a FUNCTION_TYPE is passed to this routine (as opposed to a FUNCTION_DECL). This patch fixes this by making the loop iterator over 'types' instead. This patch also moves the retrofitted PARM_DECL printing from this routine to pp_cxx_requires_expr, the only caller that uses it. This simplification lets us easily output the trailing '...' in the parameter list of a variadic function, which this patch also implements. Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for trunk? gcc/cp/ChangeLog: PR c++/98767 * cxx-pretty-print.c (pp_cxx_parameter_declaration_clause): Fix loop over parameter list to iterate over 'types' instead of 'args'. Output the trailing '...' for a variadic function. Remove PARM_DECL support. (pp_cxx_requires_expr): Pretty print the parameter list directly instead of going through pp_cxx_parameter_declaration_clause. gcc/testsuite/ChangeLog: PR c++/98767 * g++.dg/concepts/diagnostic16.C: New test. --- gcc/cp/cxx-pretty-print.c | 48 ++++++++++++-------- gcc/testsuite/g++.dg/concepts/diagnostic16.C | 17 +++++++ 2 files changed, 46 insertions(+), 19 deletions(-) create mode 100644 gcc/testsuite/g++.dg/concepts/diagnostic16.C diff --git a/gcc/cp/cxx-pretty-print.c b/gcc/cp/cxx-pretty-print.c index a22eea5239c..894472e26e0 100644 --- a/gcc/cp/cxx-pretty-print.c +++ b/gcc/cp/cxx-pretty-print.c @@ -1537,34 +1537,27 @@ pp_cxx_parameter_declaration (cxx_pretty_printer *pp, tree t) static void pp_cxx_parameter_declaration_clause (cxx_pretty_printer *pp, tree t) { - tree args; - tree types; - bool abstract; - - // For a requires clause or the explicit printing of a parameter list - // we expect T to be a chain of PARM_DECLs. Otherwise, the list of - // args and types are taken from the function decl T. - if (TREE_CODE (t) == PARM_DECL) + gcc_assert (FUNC_OR_METHOD_TYPE_P (t) || TREE_CODE (t) == FUNCTION_DECL); + tree types, args; + if (TYPE_P (t)) { - args = t; - types = t; - abstract = false; + types = TYPE_ARG_TYPES (t); + args = NULL_TREE; } else { - bool type_p = TYPE_P (t); - args = type_p ? NULL : FUNCTION_FIRST_USER_PARM (t); - types = type_p ? TYPE_ARG_TYPES (t) : FUNCTION_FIRST_USER_PARMTYPE (t); - abstract = args == NULL || pp->flags & pp_c_flag_abstract; + types = FUNCTION_FIRST_USER_PARMTYPE (t); + args = FUNCTION_FIRST_USER_PARM (t); } - bool first = true; + bool abstract = !args || (pp->flags & pp_c_flag_abstract); /* Skip artificial parameter for non-static member functions. */ if (TREE_CODE (t) == METHOD_TYPE) types = TREE_CHAIN (types); + bool first = true; pp_cxx_left_paren (pp); - for (; args; args = TREE_CHAIN (args), types = TREE_CHAIN (types)) + for (; types && types != void_list_node; types = TREE_CHAIN (types)) { if (!first) pp_cxx_separate_with (pp, ','); @@ -1577,6 +1570,14 @@ pp_cxx_parameter_declaration_clause (cxx_pretty_printer *pp, tree t) pp_cxx_whitespace (pp); pp->assignment_expression (TREE_PURPOSE (types)); } + if (!abstract) + args = TREE_CHAIN (args); + } + if (!types) + { + if (!first) + pp_cxx_separate_with (pp, ','); + pp_cxx_ws_string (pp, "..."); } pp_cxx_right_paren (pp); } @@ -2775,9 +2776,18 @@ void pp_cxx_requires_expr (cxx_pretty_printer *pp, tree t) { pp_string (pp, "requires"); - if (tree parms = TREE_OPERAND (t, 0)) + if (tree parms = REQUIRES_EXPR_PARMS (t)) { - pp_cxx_parameter_declaration_clause (pp, parms); + bool first = true; + pp_cxx_left_paren (pp); + for (; parms; parms = TREE_CHAIN (parms)) + { + if (!first) + pp_cxx_separate_with (pp, ',' ); + first = false; + pp_cxx_parameter_declaration (pp, parms); + } + pp_cxx_right_paren (pp); pp_cxx_whitespace (pp); } pp_cxx_requirement_body (pp, TREE_OPERAND (t, 1)); diff --git a/gcc/testsuite/g++.dg/concepts/diagnostic16.C b/gcc/testsuite/g++.dg/concepts/diagnostic16.C new file mode 100644 index 00000000000..49d5733faea --- /dev/null +++ b/gcc/testsuite/g++.dg/concepts/diagnostic16.C @@ -0,0 +1,17 @@ +// PR c++/98767 +// { dg-do compile { target c++20 } } + +template +concept Callable = requires(Function func, Args... args) { func(args...); }; + +static_assert(Callable); // { dg-error "failed" } +// { dg-message {Function = int \(\*\)\(\)} "" { target *-*-* } 5 } + +static_assert(Callable); // { dg-error "failed" } +// { dg-message {Function = char \(\*\)\(int\*\)} "" { target *-*-* } 5 } + +static_assert(Callable); // { dg-error "failed" } +// { dg-message {Function = short int \(\*\)\(int\*, int\)} "" { target *-*-* } 5 } + +static_assert(Callable); // { dg-error "failed" } +// { dg-message {Function = long int \(\*\)\(int\*, int, \.\.\.\)} "" { target *-*-* } 5 } -- 2.31.1.305.gd1b10fc6d8