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 ESMTPS id CB386382FDCE for ; Tue, 12 Jul 2022 01:27:56 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org CB386382FDCE 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.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-612-8zWY4vSPMKmhFGEMEHEqKA-1; Mon, 11 Jul 2022 21:27:55 -0400 X-MC-Unique: 8zWY4vSPMKmhFGEMEHEqKA-1 Received: by mail-qk1-f199.google.com with SMTP id br43-20020a05620a462b00b006b5833f8132so4190836qkb.22 for ; Mon, 11 Jul 2022 18:27:55 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=fmL8objo4Sj1Ef36rwOm9ktp4SZoJuUoyJ/dQIX9Mz0=; b=EkSCM1ZomwMTILCv2EHsgrOClgMSCEOe70FIiOnJjQIiXV/D9lh81waiW0cGKUwp9X A0IrUIOWkhsm0J9avlLs8T6/EVpWXffI/Oy5FFK7iqYMgTVdodGtT4OK4G3dgp4D7Svv WWU8m5SZrypF7GhF3QgTRSL+o48+Sdq6gPUAJwVl0rdJonY36Wmt/XJ2ysM5vRsYjGyq SVJDr/kp6idm9chUsZyPrIBhehUsPX6s1AQ1F1Zp4+WbqRMz6sK+LM4CRdQbzBrbvuis 2Mu3YjQH4IH7tH5Cg3yn6Q0bA1tt+CS8gjm6azS/q8lQjo7bpnxwPOUubULS773sSp6Z TGxA== X-Gm-Message-State: AJIora9D+fbnsHa+u4jcgXZdHQW1COBpcnQFfuLO0HTIEpKheWV1qoS9 RkyzhZ22CJM6U7Q0hK4ahpbZCsEMyx4bINpZiM7ApgF7uVhOnjQfTfDAnpQcklNBn7o2sL1UYom Xr4t9tW44P3bPKDWag/395iz7zMmcQuHQbwivyRblDe0zx/GWAGm194MWTzuerRqE4kQ= X-Received: by 2002:a05:620a:2411:b0:6af:22e8:71d7 with SMTP id d17-20020a05620a241100b006af22e871d7mr13612755qkn.457.1657589274989; Mon, 11 Jul 2022 18:27:54 -0700 (PDT) X-Google-Smtp-Source: AGRyM1svLsUp50VE5bZutVd3x4h0CoBDmOmnPH1WH7naTZOS1py6jfEOBBoItE7lPwBt+Be5ikeiLw== X-Received: by 2002:a05:620a:2411:b0:6af:22e8:71d7 with SMTP id d17-20020a05620a241100b006af22e871d7mr13612745qkn.457.1657589274712; Mon, 11 Jul 2022 18:27:54 -0700 (PDT) Received: from localhost.localdomain (ool-457670bb.dyn.optonline.net. [69.118.112.187]) by smtp.gmail.com with ESMTPSA id bl29-20020a05620a1a9d00b006af45243e15sm7963361qkb.114.2022.07.11.18.27.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 Jul 2022 18:27:54 -0700 (PDT) From: Patrick Palka To: gcc-patches@gcc.gnu.org Subject: [PATCH] c++: non-dependent call to consteval operator [PR105912] Date: Mon, 11 Jul 2022 21:27:42 -0400 Message-Id: <20220712012742.13658-1-ppalka@redhat.com> X-Mailer: git-send-email 2.37.0.3.g30cc8d0f14 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-default=true X-Spam-Status: No, score=-14.2 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, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE 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-List-Received-Date: Tue, 12 Jul 2022 01:27:58 -0000 Here we were crashing when substituting a non-dependent call to a consteval operator, whose CALL_EXPR_OPERATOR_SYNTAX flag we try to propagate to the result, but the result isn't a CALL_EXPR since the called function is consteval. This patch fixes this by checking the result of extract_call_expr accordingly. (Note that we can't easily check DECL_IMMEDIATE_FUNCTION_P here because we don't know which function was selected by overload resolution from this call frame.) Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for trunk/12? PR c++/105912 gcc/cp/ChangeLog: * pt.cc (tsubst_copy_and_build) : Guard against NULL_TREE extract_call_expr result. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/consteval31.C: New test. --- gcc/cp/pt.cc | 10 +++++---- gcc/testsuite/g++.dg/cpp2a/consteval31.C | 26 ++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp2a/consteval31.C diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index 232964c2831..8a6ae5c42fe 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -21207,10 +21207,12 @@ tsubst_copy_and_build (tree t, bool rev = CALL_EXPR_REVERSE_ARGS (t); if (op || ord || rev) { - function = extract_call_expr (ret); - CALL_EXPR_OPERATOR_SYNTAX (function) = op; - CALL_EXPR_ORDERED_ARGS (function) = ord; - CALL_EXPR_REVERSE_ARGS (function) = rev; + if (tree call = extract_call_expr (ret)) + { + CALL_EXPR_OPERATOR_SYNTAX (call) = op; + CALL_EXPR_ORDERED_ARGS (call) = ord; + CALL_EXPR_REVERSE_ARGS (call) = rev; + } } } diff --git a/gcc/testsuite/g++.dg/cpp2a/consteval31.C b/gcc/testsuite/g++.dg/cpp2a/consteval31.C new file mode 100644 index 00000000000..85a4d1794e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/consteval31.C @@ -0,0 +1,26 @@ +// PR c++/105912 +// { dg-do compile { target c++20 } } + +struct A { + consteval A operator+() { + return {}; + } +}; + +consteval A operator~(A) { + return {}; +} + +consteval A operator+(A, A) { + return {}; +} + +template +void f() { + A a; + ~a; + a + a; + +a; +} + +template void f(); -- 2.37.0.3.g30cc8d0f14