From patchwork Wed Oct 14 19:52:45 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Marek Polacek X-Patchwork-Id: 1382331 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=pass (p=none dis=none) header.from=gcc.gnu.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha256 header.s=default header.b=wCIF0280; dkim-atps=neutral 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 4CBNPS5NPBz9sRK for ; Thu, 15 Oct 2020 06:52:59 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 1817B3861000; Wed, 14 Oct 2020 19:52:56 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 1817B3861000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1602705176; bh=88zTTWWMKsijB1rhl9ir7uLQt1XJG8HGjwbaiLrfdy8=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=wCIF0280BIHVsDu6Gyo4csNAbCPVy3Df9X/ijLIc0oqFqc48iytxzDMJ1TToCVMmT Et7igQA4zbEE4y5X/LOpTrrl/Y/kFLg2IiOt4Okkjrg5lW8C3ZoyBxAlQh+v/DMlnn UmqkEzkL8JX2gqBOYkcXwsDLW8HkxExIGZ0rx630= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by sourceware.org (Postfix) with ESMTP id D40E5385780E for ; Wed, 14 Oct 2020 19:52:53 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org D40E5385780E Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-377-qFXRc69dMHyaoTW-U-tTbA-1; Wed, 14 Oct 2020 15:52:51 -0400 X-MC-Unique: qFXRc69dMHyaoTW-U-tTbA-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 5E8AD64082 for ; Wed, 14 Oct 2020 19:52:50 +0000 (UTC) Received: from pdp-11.redhat.com (ovpn-117-219.rdu2.redhat.com [10.10.117.219]) by smtp.corp.redhat.com (Postfix) with ESMTP id E67955C1BD; Wed, 14 Oct 2020 19:52:49 +0000 (UTC) To: Jason Merrill , GCC Patches Subject: [PATCH] c++: Improve printing of pointers-to-members [PR97406, PR85901] Date: Wed, 14 Oct 2020 15:52:45 -0400 Message-Id: <20201014195245.1237803-1-polacek@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-14.6 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_NONE, 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-Patchwork-Original-From: Marek Polacek via Gcc-patches From: Marek Polacek Reply-To: Marek Polacek Errors-To: gcc-patches-bounces@gcc.gnu.org Sender: "Gcc-patches" This PR points out that when printing the parameter mapping for a pointer-to-member-function, the output was truncated: [with T = void (X::*] Fixed by printing the abstract declarator for pointers-to-members in cxx_pretty_printer::type_id. So now we print: [with T = void (X::*)()] But when I tried a pointer-to-data-member, I got [with T = ‘offset_type’ not supported by simple_type_specifier)‘offset_type’ not supported by direct_abstract_declarator] so had to fix that too so that we now print: [with T = int X::*] or [with T = int (X::*)[5]] when the type is an array type. Which is what PR85901 was about. Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk? gcc/cp/ChangeLog: PR c++/97406 PR c++/85901 * cxx-pretty-print.c (pp_cxx_type_specifier_seq): Handle OFFSET_TYPE. (cxx_pretty_printer::abstract_declarator): Fix the printing of ')'. (cxx_pretty_printer::direct_abstract_declarator): Handle OFFSET_TYPE. (cxx_pretty_printer::type_id): Likewise. Print the abstract declarator for pointers-to-members. gcc/testsuite/ChangeLog: PR c++/97406 PR c++/85901 * g++.dg/diagnostic/ptrtomem1.C: New test. * g++.dg/diagnostic/ptrtomem2.C: New test. --- gcc/cp/cxx-pretty-print.c | 33 ++++++++++++++++++++- gcc/testsuite/g++.dg/diagnostic/ptrtomem1.C | 31 +++++++++++++++++++ gcc/testsuite/g++.dg/diagnostic/ptrtomem2.C | 14 +++++++++ 3 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/diagnostic/ptrtomem1.C create mode 100644 gcc/testsuite/g++.dg/diagnostic/ptrtomem2.C base-commit: 93103603fd66a9fcf3ea2d8b52657e4b2496f544 diff --git a/gcc/cp/cxx-pretty-print.c b/gcc/cp/cxx-pretty-print.c index 8bea79b93a2..058b9c2f4fc 100644 --- a/gcc/cp/cxx-pretty-print.c +++ b/gcc/cp/cxx-pretty-print.c @@ -1420,6 +1420,16 @@ pp_cxx_type_specifier_seq (cxx_pretty_printer *pp, tree t) } /* fall through */ + case OFFSET_TYPE: + if (TYPE_PTRDATAMEM_P (t)) + { + pp_cxx_type_specifier_seq (pp, TREE_TYPE (t)); + pp_cxx_whitespace (pp); + pp_cxx_ptr_operator (pp, t); + break; + } + /* fall through */ + default: if (!(TREE_CODE (t) == FUNCTION_DECL && DECL_CONSTRUCTOR_P (t))) pp_c_specifier_qualifier_list (pp, t); @@ -1753,7 +1763,20 @@ pp_cxx_function_definition (cxx_pretty_printer *pp, tree t) void cxx_pretty_printer::abstract_declarator (tree t) { - if (TYPE_PTRMEM_P (t)) + /* pp_cxx_ptr_operator prints '(' for a pointer-to-member function, + or a pointer-to-data-member of array type: + + void (X::*)() + int (X::*)[5] + + but not for a pointer-to-data-member of non-array type: + + int X::* + + so be mindful of that. */ + if (TYPE_PTRMEMFUNC_P (t) + || (TYPE_PTRDATAMEM_P (t) + && TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)) pp_cxx_right_paren (this); else if (INDIRECT_TYPE_P (t)) { @@ -1785,6 +1808,11 @@ cxx_pretty_printer::direct_abstract_declarator (tree t) direct_abstract_declarator (TYPE_PTRMEMFUNC_FN_TYPE (t)); break; + case OFFSET_TYPE: + if (TYPE_PTRDATAMEM_P (t)) + direct_abstract_declarator (TREE_TYPE (t)); + break; + case METHOD_TYPE: case FUNCTION_TYPE: pp_cxx_parameter_declaration_clause (this, t); @@ -1837,7 +1865,10 @@ cxx_pretty_printer::type_id (tree t) case UNDERLYING_TYPE: case DECLTYPE_TYPE: case TEMPLATE_ID_EXPR: + case OFFSET_TYPE: pp_cxx_type_specifier_seq (this, t); + if (TYPE_PTRMEM_P (t)) + abstract_declarator (t); break; case TYPE_PACK_EXPANSION: diff --git a/gcc/testsuite/g++.dg/diagnostic/ptrtomem1.C b/gcc/testsuite/g++.dg/diagnostic/ptrtomem1.C new file mode 100644 index 00000000000..bb1327f7af1 --- /dev/null +++ b/gcc/testsuite/g++.dg/diagnostic/ptrtomem1.C @@ -0,0 +1,31 @@ +// PR c++/97406 +// { dg-do compile { target c++20 } } + +struct X { + void f() { } + int a; + int arr[5]; +}; + +// Duplicated so that I can check dg-message. +template +requires (sizeof(T)==1) // { dg-message {\[with T = void \(X::\*\)\(\)\]} } +void f1(T) +{ } + +template +requires (sizeof(T)==1) // { dg-message {\[with T = int X::\*\]} } +void f2(T) +{ } + +template +requires (sizeof(T)==1) // dg-message {\[with T = int \(X::\*\)\[5\]\]} } +void f3(T) +{ } + +int main() +{ + f1(&X::f); // { dg-error "no matching function for call" } + f2(&X::a); // { dg-error "no matching function for call" } + f3(&X::arr); // { dg-error "no matching function for call" } +} diff --git a/gcc/testsuite/g++.dg/diagnostic/ptrtomem2.C b/gcc/testsuite/g++.dg/diagnostic/ptrtomem2.C new file mode 100644 index 00000000000..f3b29a07a99 --- /dev/null +++ b/gcc/testsuite/g++.dg/diagnostic/ptrtomem2.C @@ -0,0 +1,14 @@ +// PR c++/85901 +// { dg-do compile { target c++11 } } + +template struct A; + +template +struct A { + template + static auto c(int U::*p, TT o) -> decltype(o.*p); // { dg-message {A} } +}; + +struct X {}; + +int x = A::c(); // { dg-error "no matching function for call" }