From patchwork Sat Dec 16 00:20:02 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nathaniel Shead X-Patchwork-Id: 1876823 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20230601 header.b=L7l86x64; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.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 ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4SsRZ73wGHz23p3 for ; Sat, 16 Dec 2023 11:20:31 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 4B34E3857B8D for ; Sat, 16 Dec 2023 00:20:29 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-pf1-x433.google.com (mail-pf1-x433.google.com [IPv6:2607:f8b0:4864:20::433]) by sourceware.org (Postfix) with ESMTPS id 7D3483858C52 for ; Sat, 16 Dec 2023 00:20:08 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 7D3483858C52 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 7D3483858C52 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::433 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1702686018; cv=none; b=fOt3y02egPcH9nl9WI+g/dlSDO2bo9jnwL5fbBexflqb1tAuIywBcTUGj8SgTkO6CMgIA/fQuJyXOfe35Bzcd6W2H17OwxaeiCS4+GsO5/JHTNxYiVax7+ZmklP5DRTkhNC4bV8jXAvbQQ7JZtBh8x9gaNSiORZYDxYegmg97g8= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1702686018; c=relaxed/simple; bh=9kxT8auGZsYa5izzvOz/wVEMXTnbU9KiiztVCA1ivuA=; h=DKIM-Signature:Message-ID:Date:From:To:Subject:MIME-Version; b=WPB5zlRaE5HbyPjT65LsfvjJf1VS22EIZK4upuoJhdI934DoQ1ohCp0JXJRNixhUFqUiTVdhYzJDL4ewIcwjxijkWY/YtKmWyHmIz4MmgiX+Dp5vKtza9Fo8b9RBw2eqajNQ/8Ydlc3gkt6aqdqaNL9pbMLh41QiLa1B1k84vpE= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-pf1-x433.google.com with SMTP id d2e1a72fcca58-6d0985c70ffso854059b3a.2 for ; Fri, 15 Dec 2023 16:20:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1702686007; x=1703290807; darn=gcc.gnu.org; h=content-disposition:mime-version:subject:cc:to:from:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=6FxzTbmsSPvm2T5FBRTxnoOwwSg7woJyMuUuC01HmKI=; b=L7l86x64n1rZCFt+z0++Ys+qKWIisuhhhMlt7pvoHobVZ4vP2OftwUcH3eM1JyT5+p L5ZLsCnE+zwdQ4RXs37/PsKFf53ISWlsnUwSj12qinzqCeVMb9XMYjUG3Fulnl71MASO S4CEId9n+3J86NXLIQs8qMKQ0+8DzuJzLM5plp3BRJv8F/nN5wY3fuj4UlTMMiCTlmmO NTuqpOLpFug6k0+vqSBct5rDYnp/iGtCex3vkw4tgPz3Sp37vY23FclBC8PN8oisKE4N LtMHgGq2egymzdJ7y+HHLJhf2wcjmII6HVD6cFnaU9e5XmQUHQDpKUFjcG2XGK96kFFu NXTQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1702686007; x=1703290807; h=content-disposition:mime-version:subject:cc:to:from:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=6FxzTbmsSPvm2T5FBRTxnoOwwSg7woJyMuUuC01HmKI=; b=Hal1rSByM95i8kGYhwL7y4D7jTpgI6dGMk6SfKHuTc+mnA8pqYB/0xuEOm0MAHjsV4 eIk3rEaSlOsc9S8Bs/8ZLOfbBiPsUwlc2hwszOxaSLb97L/Er8VM1V/586cg8U3UdiFi WCrMyc3kAy6fE/qR+aivo454+MIGSm5H5iekVPQHcypNmDbxV4h76aGewClo5EDobrgj hEYBardt744Bnk2Alqdwik1Oe3YW1x3TMHameKG+cijrysN0JDpT+SmmCqgmzB00UtlP 94CCBMsUsamrDLQ88g9jacvDO2OkDnNxytQvQ1XOAbqjUg2/bkuejGUwjLGj/jr1LWx8 gq2Q== X-Gm-Message-State: AOJu0YxUWJ+75Ynktt728rIA/2oaZx4e1W+jItY7Jow0BAs/TRYuzO04 YDHa39io+/74hWerXPNwlcEKagRRGCw= X-Google-Smtp-Source: AGHT+IHGw6LmN+ftwtZhbG4KIrXwUQmA4XT4cyoTOd9/ibWKBX7R5NsCJcLjm2fBEKRHo5jhDE6joQ== X-Received: by 2002:a05:6a20:3c8d:b0:190:53f9:43e6 with SMTP id b13-20020a056a203c8d00b0019053f943e6mr7670478pzj.4.1702686006880; Fri, 15 Dec 2023 16:20:06 -0800 (PST) Received: from Thaum. ([203.166.236.30]) by smtp.gmail.com with ESMTPSA id q19-20020a170902bd9300b001d06df5c1absm14839163pls.86.2023.12.15.16.20.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 Dec 2023 16:20:06 -0800 (PST) Message-ID: <657ced36.170a0220.f138a.ff27@mx.google.com> X-Google-Original-Message-ID: Date: Sat, 16 Dec 2023 11:20:02 +1100 From: Nathaniel Shead To: gcc-patches@gcc.gnu.org Cc: Jason Merrill , Jonathan Wakely Subject: [PATCH] c++: Fix unchecked use of CLASSTYPE_AS_BASE [PR113031] MIME-Version: 1.0 Content-Disposition: inline X-Spam-Status: No, score=-12.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, 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.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Bootstrapped and regtested on x86_64-pc-linux-gnu with GLIBCXX_TESTSUITE_STDS=20 and RUNTESTFLAGS="--target_board=unix/-D_GLIBCXX_USE_CXX11_ABI=0". -- >8 -- My previous patch (naively) assumed that a TREE_CODE of RECORD_TYPE or UNION_TYPE was sufficient for optype to be considered a "class type". However, this does not account for e.g. template type parameters of record or union type. This patch corrects to check for CLASS_TYPE_P before checking for as-base conversion. PR c++/113031 gcc/cp/ChangeLog: * constexpr.cc (cxx_fold_indirect_ref_1): Check for CLASS_TYPE before using CLASSTYPE_AS_BASE. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/pr113031.C: New test. Signed-off-by: Nathaniel Shead --- gcc/cp/constexpr.cc | 3 ++- gcc/testsuite/g++.dg/cpp0x/pr113031.C | 34 +++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/pr113031.C diff --git a/gcc/cp/constexpr.cc b/gcc/cp/constexpr.cc index e1b2d27fc36..051f73fb73f 100644 --- a/gcc/cp/constexpr.cc +++ b/gcc/cp/constexpr.cc @@ -5709,7 +5709,8 @@ cxx_fold_indirect_ref_1 (const constexpr_ctx *ctx, location_t loc, tree type, } /* Handle conversion to "as base" type. */ - if (CLASSTYPE_AS_BASE (optype) == type) + if (CLASS_TYPE_P (optype) + && CLASSTYPE_AS_BASE (optype) == type) return op; /* Handle conversion to an empty base class, which is represented with a diff --git a/gcc/testsuite/g++.dg/cpp0x/pr113031.C b/gcc/testsuite/g++.dg/cpp0x/pr113031.C new file mode 100644 index 00000000000..aecdc3fc4b2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr113031.C @@ -0,0 +1,34 @@ +// PR c++/113031 +// { dg-do compile } + +template struct variant; + +template +variant<_Types> __variant_cast(_Tp __rhs) { return static_cast&>(__rhs); } + +template +struct _Move_assign_base : _Types { + void operator=(_Move_assign_base __rhs) { __variant_cast<_Types>(__rhs); } +}; + +template +struct variant : _Move_assign_base<_Types> { + void emplace() { + variant __tmp; + *this = __tmp; + } +}; + +struct _Undefined_class { + struct _Nocopy_types { + void (_Undefined_class::*_M_member_pointer)(); + }; + struct function : _Nocopy_types { + struct optional { + void test03() { + variant v; + v.emplace(); + } + }; + }; +};