From patchwork Thu Mar 23 21:39:08 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Merrill X-Patchwork-Id: 66825 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 0295C384F00E for ; Thu, 23 Mar 2023 21:39:43 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0295C384F00E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1679607583; bh=XqZ6UNQfy/5SEfV/P7izLiBF08gQ9+BPZ7EsVnRZLB0=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=uBq/wWWC2CjjYxQPqaecBSuQewPB4/e5gh1ZIkCey9/pGcJbUWv+L4v6+oT9pi7Ci +urDLr45c1zXt5IBz44Xk1yfesnaJBwrXpJgP9OLpsRPBbXnJ1MSyFBK704hD5jo97 2RxarAK+0Agig2UM/ZuqzJ64WzTDxZYuS3ctn44A= 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 [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id CA60C3858CDB for ; Thu, 23 Mar 2023 21:39:14 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org CA60C3858CDB Received: from mail-qk1-f199.google.com (mail-qk1-f199.google.com [209.85.222.199]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-237-dC06idcsO3WzqtsKZjg3mg-1; Thu, 23 Mar 2023 17:39:13 -0400 X-MC-Unique: dC06idcsO3WzqtsKZjg3mg-1 Received: by mail-qk1-f199.google.com with SMTP id 66-20020a370345000000b00746886b1593so6598878qkd.14 for ; Thu, 23 Mar 2023 14:39:12 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679607552; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=XqZ6UNQfy/5SEfV/P7izLiBF08gQ9+BPZ7EsVnRZLB0=; b=ZKvYXHEPgr+bUz1bGssADGO9K1I1Xyi/RgqT2omEq48DH5g9xRhocCNleLiuSer8+f S4+0B2yKS9gjeUbU0px6D9FhGsp4rjkxvlLAMP2xzfYbPoESquEPH2vUYSlnY3SBiEzf x0LdfnhPCiXpyBZ1gHxdVdTgoWSY/sKpMV+w899rlzrNR36G2vf31tU/dOrSoL1PgzA5 RQv40XGPu0CEMsUhEq+0XnkVo1k9HTc0ujszHbl5HCJtEIfITn/0nYr5LCOEWMNTT+Dc SMjJlU2DwfkPXcAJsKzyZObyaitNN8RfnVNjVI2M71MQuyfnrL5/12hTnJ8BAfcG3/1y cdPQ== X-Gm-Message-State: AAQBX9dDEOPneiimWskcxeHtnyPWeBemccRh0PvaNcEyfUwUxMqEIgRs 78s3Uxue92FvERJMBxIEGXmr9SYcoum9HCKW3MCfyaTaj+e8feogzNyPrANj/QFs0KBktXsyYrg Y9vCiGmLrKZcvTRlAuMBeOCWxXlVLOnxXMpYNPie5R2W/fb6cs4WrpL433vtI/5GN5NsAwdWZ/A == X-Received: by 2002:a05:6214:2585:b0:5ce:6636:a45 with SMTP id fq5-20020a056214258500b005ce66360a45mr664186qvb.25.1679607552238; Thu, 23 Mar 2023 14:39:12 -0700 (PDT) X-Google-Smtp-Source: AKy350bYwp/4B+UksIisszxTznlFj3L1j71frBDITkbHN7OBPLQt46hSCSX4DtwzMb9KCMvLNp9JCQ== X-Received: by 2002:a05:6214:2585:b0:5ce:6636:a45 with SMTP id fq5-20020a056214258500b005ce66360a45mr664144qvb.25.1679607551774; Thu, 23 Mar 2023 14:39:11 -0700 (PDT) Received: from jason.cygnus.com (130-44-159-43.s15913.c3-0.arl-cbr1.sbo-arl.ma.cable.rcncustomer.com. [130.44.159.43]) by smtp.gmail.com with ESMTPSA id ph4-20020a0562144a4400b005dd8b9345f7sm170580qvb.143.2023.03.23.14.39.10 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Mar 2023 14:39:11 -0700 (PDT) To: gcc-patches@gcc.gnu.org Subject: [pushed] c++: constexpr PMF conversion [PR105996] Date: Thu, 23 Mar 2023 17:39:08 -0400 Message-Id: <20230323213908.2988082-1-jason@redhat.com> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-12.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_H2, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) 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: Jason Merrill via Gcc-patches From: Jason Merrill Reply-To: Jason Merrill Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" Tested x86_64-pc-linux-gnu, applying to trunk. -- 8< -- Here, we were calling build_reinterpret_cast regardless of whether there was actually a cast, and that now sets REINTERPRET_CAST_P. But that optimization seems dodgy anyway, as it involves NOP_EXPR from one RECORD_TYPE to another and we try to reserve NOP_EXPR for fundamental types. And the generated code seems the same, so let's drop it. And also strip location wrappers. PR c++/105996 gcc/cp/ChangeLog: * typeck.cc (build_ptrmemfunc): Drop 0-offset optimization and location wrappers. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/constexpr-pmf3.C: New test. --- gcc/cp/typeck.cc | 13 +++++-------- gcc/testsuite/g++.dg/cpp0x/constexpr-pmf3.C | 13 +++++++++++++ 2 files changed, 18 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/constexpr-pmf3.C base-commit: 3fbeff66684d95417646aaa22d0a8f1ec9786299 diff --git a/gcc/cp/typeck.cc b/gcc/cp/typeck.cc index afb956087ce..8b60cbbc167 100644 --- a/gcc/cp/typeck.cc +++ b/gcc/cp/typeck.cc @@ -9960,18 +9960,15 @@ build_ptrmemfunc (tree type, tree pfn, int force, bool c_cast_p, if (n == error_mark_node) return error_mark_node; + STRIP_ANY_LOCATION_WRAPPER (pfn); + /* We don't have to do any conversion to convert a pointer-to-member to its own type. But, we don't want to just return a PTRMEM_CST if there's an explicit cast; that cast should make the expression an invalid template argument. */ - if (TREE_CODE (pfn) != PTRMEM_CST) - { - if (same_type_p (to_type, pfn_type)) - return pfn; - else if (integer_zerop (n) && TREE_CODE (pfn) != CONSTRUCTOR) - return build_reinterpret_cast (input_location, to_type, pfn, - complain); - } + if (TREE_CODE (pfn) != PTRMEM_CST + && same_type_p (to_type, pfn_type)) + return pfn; if (TREE_SIDE_EFFECTS (pfn)) pfn = save_expr (pfn); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-pmf3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-pmf3.C new file mode 100644 index 00000000000..14daea312b7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-pmf3.C @@ -0,0 +1,13 @@ +// PR c++/105996 +// { dg-do compile { target c++11 } } + +struct A { + void CB() {} +}; +struct B : public A { }; + +using APMF = void (A::*)(); +using BPMF = void (B::*)(); + +constexpr APMF foo () { return &A::CB; }; +static constexpr BPMF b = foo();