From patchwork Tue Feb 11 23:24:32 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Polacek X-Patchwork-Id: 106342 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 384593858410 for ; Tue, 11 Feb 2025 23:25:28 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 384593858410 Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=VtTT4lA2 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 ESMTP id C83823858D39 for ; Tue, 11 Feb 2025 23:24:42 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org C83823858D39 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org C83823858D39 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1739316282; cv=none; b=TDenUMNgOv4+4zZu8/ckW5fmqboJmioxy5HUQYpqMUwWZHcXnDlnEm2Yc/KiDMdpLffduYR0wpbnHYXpn1iEga5IoKKwh5/Jd5wvD0lKzA4cy3xXq+Ls4ZlUYmYXmdmsbnPQOvo+pS/MnOwZK39eGu5cOezpWbheROrbn4EA8LM= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1739316282; c=relaxed/simple; bh=HWTeetjeDUM9Eu9ucDs9dj48PYNh36VeNh2dkaXnjuI=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=UFh3ANz1V/bBwlGUonsG9D9/G49csB4whQ38qqiDHo8tWQGI2mRm15eBu7qRi1+XOELn0HnetOzumLTzwsPZLBzSVf8S03KvndTdmtCbiHLNRm3B13uN8Fe/l2mHi48AMUxVwq8lJZvBJXoazagkWd+TBqYCEILMkj5a7zmC4l4= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C83823858D39 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1739316282; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=CUYDbg27xizk7/n3Eg5u9x6z85Nnt5SGMecUakSQtko=; b=VtTT4lA2Hq1+EO+51kMf4s5L/9wlP9LoygvyyetnjMdy9nr39ACgRVg7TwEFQCIjPqRHJ8 Lgcxk/w5rrh+7oheodnyyB8NquClxbnQ2KwTFrkjJKp8BXIp5Ok5IhoyCTpZUMnC2B+R7r jgF14Ml6KLIlF7e1SndLgBFBgN3VtLw= Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-511-NOOc8TWVP5yVQ2uVDSBSyg-1; Tue, 11 Feb 2025 18:24:40 -0500 X-MC-Unique: NOOc8TWVP5yVQ2uVDSBSyg-1 X-Mimecast-MFC-AGG-ID: NOOc8TWVP5yVQ2uVDSBSyg Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 54840180036F for ; Tue, 11 Feb 2025 23:24:39 +0000 (UTC) Received: from pdp-11.redhat.com (unknown [10.22.81.94]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 2E1211800358; Tue, 11 Feb 2025 23:24:38 +0000 (UTC) From: Marek Polacek To: Jason Merrill , GCC Patches Cc: Jakub Jelinek Subject: [PATCH] c++: ICE with operator new[] in constexpr [PR118775] Date: Tue, 11 Feb 2025 18:24:32 -0500 Message-ID: <20250211232432.493636-1-polacek@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: s0Zsjp_Fn87GBsce0QhAY5oKp9DterBhcEPwEJ7JgpQ_1739316279 X-Mimecast-Originator: redhat.com content-type: text/plain; charset="US-ASCII"; x-default=true X-Spam-Status: No, score=-12.8 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_H5, RCVD_IN_MSPIKE_WL, 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.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces~patchwork=sourceware.org@gcc.gnu.org Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk? -- >8 -- Here we ICE since r11-7740 because we no longer say that (long)&a (where a is a global var) is non_constant_p. So VERIFY_CONSTANT does not return and we crash on tree_to_uhwi. We should check tree_fits_uhwi_p before calling tree_to_uhwi. PR c++/118775 gcc/cp/ChangeLog: * constexpr.cc (cxx_eval_call_expression): Check tree_fits_uhwi_p. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/constexpr-new24.C: New test. * g++.dg/cpp2a/constexpr-new25.C: New test. --- gcc/cp/constexpr.cc | 7 +++++ gcc/testsuite/g++.dg/cpp2a/constexpr-new24.C | 25 ++++++++++++++++++ gcc/testsuite/g++.dg/cpp2a/constexpr-new25.C | 27 ++++++++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp2a/constexpr-new24.C create mode 100644 gcc/testsuite/g++.dg/cpp2a/constexpr-new25.C base-commit: 299a8e2dc667e795991bc439d2cad5ea5bd379e2 diff --git a/gcc/cp/constexpr.cc b/gcc/cp/constexpr.cc index f142dd32bc8..f8f9a9df1a2 100644 --- a/gcc/cp/constexpr.cc +++ b/gcc/cp/constexpr.cc @@ -2909,6 +2909,13 @@ cxx_eval_call_expression (const constexpr_ctx *ctx, tree t, gcc_assert (arg0); if (new_op_p) { + if (!tree_fits_uhwi_p (arg0)) + { + if (!ctx->quiet) + error_at (loc, "cannot allocate array: size too large"); + *non_constant_p = true; + return t; + } tree type = build_array_type_nelts (char_type_node, tree_to_uhwi (arg0)); tree var = build_decl (loc, VAR_DECL, diff --git a/gcc/testsuite/g++.dg/cpp2a/constexpr-new24.C b/gcc/testsuite/g++.dg/cpp2a/constexpr-new24.C new file mode 100644 index 00000000000..debb7f0f5c4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/constexpr-new24.C @@ -0,0 +1,25 @@ +// PR c++/118775 +// { dg-do compile { target c++20 } } + +int a; + +constexpr char * +f1 () +{ + constexpr auto p = new char[(long int) &a]; // { dg-error "size too large" } + return p; +} + +constexpr char * +f2 () +{ + auto p = new char[(long int) &a]; // { dg-error "size too large" } + return p; +} + +void +g () +{ + auto r1 = f2 (); + constexpr auto r2 = f2 (); // { dg-message "in .constexpr. expansion" } +} diff --git a/gcc/testsuite/g++.dg/cpp2a/constexpr-new25.C b/gcc/testsuite/g++.dg/cpp2a/constexpr-new25.C new file mode 100644 index 00000000000..91c0318abd8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/constexpr-new25.C @@ -0,0 +1,27 @@ +// PR c++/118775 +// { dg-do compile { target c++20 } } + +namespace std { +struct __uniq_ptr_impl { + constexpr __uniq_ptr_impl(char *) {} +}; +template struct unique_ptr { + __uniq_ptr_impl _M_t; + constexpr ~unique_ptr() {} +}; +template struct _MakeUniq; +template struct _MakeUniq<_Tp[]> { + typedef unique_ptr<_Tp[]> __array; +}; +template using __unique_ptr_array_t = _MakeUniq<_Tp>::__array; +constexpr __unique_ptr_array_t make_unique(long __num) { + return unique_ptr(new char[__num]); +} +} // namespace std +int a; +int +main () +{ + std::unique_ptr p = std::make_unique((long)&a); + constexpr std::unique_ptr p2 = std::make_unique((long)&a); // { dg-error "conversion" } +}