From patchwork Thu Feb 8 21:26:52 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Polacek X-Patchwork-Id: 1896769 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=ZyXBdrYS; 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 4TW97q0Tqbz23hZ for ; Fri, 9 Feb 2024 08:28:07 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 8A2793858C39 for ; Thu, 8 Feb 2024 21:28:01 +0000 (GMT) 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.133.124]) by sourceware.org (Postfix) with ESMTPS id 055003858403 for ; Thu, 8 Feb 2024 21:26:58 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 055003858403 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 055003858403 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1707427625; cv=none; b=s4MqmFlQtWizojwZlsbbt3KKaeHwHtLv6rj+cjUYt75aDAkaIpv89LMMaGFdswFc6PUlZPFeznh3N0OOGkuTev6jrxVaj/+MZqh8sqwma/LU2vZWrcUaLHiJtAtaceNOPByO80xzUxMTV0CrMW7iayy/mSyPK0GaMNDF3yyr5nw= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1707427625; c=relaxed/simple; bh=uyAmLtG5wFzOM2Ci7gIC0rX8tjqnEwDrIPXMvCOKM38=; h=DKIM-Signature:Date:From:To:Subject:Message-ID:MIME-Version; b=tcPlLy746NHp5adzkGMZ71W/VFwQo1G/WL4s53YM3WI9xexfK9Bv0ZOGgeHyYc2WgcRrps81PCQQkl0YwopCyy+IE+BbgcM2odMePSj02p8vbaCoaqHkNSB/cKnhwCuPZopFWSGmwmdKN05br5OBQQAl0euUUMosTSDCPjgRJjs= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1707427617; 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: in-reply-to:in-reply-to:references:references; bh=DB+7iwbCtilaWNLk0g/S4iug15932msyVk8Td0DFU3M=; b=ZyXBdrYSa0pksaGFzYFyJjJU4tYc5BljJWamIHMNF7X29ZGh//7LnCCudHaGxzfA5PMl3W rRJRO9qZq+1B9nWrWWHejdliILERFkzN1trax4TMLylLZ4oJf1HurKD2VIR/Yvzo/dQStm tGDJGjXD8C3hFXu7r+PXQrelwbLZGc4= Received: from mail-yw1-f200.google.com (mail-yw1-f200.google.com [209.85.128.200]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-172-YMYTQyV3PYa9_Zr3exWl7g-1; Thu, 08 Feb 2024 16:26:56 -0500 X-MC-Unique: YMYTQyV3PYa9_Zr3exWl7g-1 Received: by mail-yw1-f200.google.com with SMTP id 00721157ae682-6047a047f4cso9078357b3.3 for ; Thu, 08 Feb 2024 13:26:56 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1707427615; x=1708032415; h=user-agent:in-reply-to:content-disposition:mime-version:references :message-id:subject:cc:to:from:date:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=DB+7iwbCtilaWNLk0g/S4iug15932msyVk8Td0DFU3M=; b=Ib9fdTrKIQzNVROThwP3YJrVrFQpupFPmW3HAbv4AWFY9F4uJGM0HoS6MAj0DZ9GBR 9BgKuUR2rdrZtTXQuUjA6HsaXvD8oihq9e5Fv8iVSls9m4nc5/PEjTAOScJPpOSP9tT7 z+K8yTOu5/tvEvTNYNS+jHLHbLaHBp7wLyjllS0KLhnDBNIuPX4ti7q+uxtFotjaiMci QUOhuhnZDGNNrpucREc5tF/7NuJ8tLNb0d2yUO5Lki03CoNFtjKqAs+QkuYzEGEgsyVp xf6xdIPjlKmgogrZPZrKJGwhCMjZZvUQtRiDQDlYE0RkTdW30N0GmWg/tdPPc6jjrsXR FkWw== X-Gm-Message-State: AOJu0YyXX6Zm6cZQTqD5prX7oZiUaH5SVDKF1dUSgLUCZ8XgyDurjgiN 3s4BAMYINnIf7sYfe6mpHc2Y45S6EjosTH2lCXnJRhN3anIQRc7UpjxHnoTIqfnSYB6WTiT51N3 vBL0S7Zz2l7stsG/HhQOyKFYORkb8UrDk4+UyqAV9yCRRaETexrB4QDIy7bbJbPU= X-Received: by 2002:a25:8309:0:b0:dc2:2979:fcd5 with SMTP id s9-20020a258309000000b00dc22979fcd5mr674699ybk.28.1707427614725; Thu, 08 Feb 2024 13:26:54 -0800 (PST) X-Google-Smtp-Source: AGHT+IHIHVs+o6ysKn7/1v5AGVq5lTEOuRpA1+lm/v+UiSwvlucpui3Uy9h2EQxEyIe2frmn3hUO9A== X-Received: by 2002:a25:8309:0:b0:dc2:2979:fcd5 with SMTP id s9-20020a258309000000b00dc22979fcd5mr674677ybk.28.1707427614051; Thu, 08 Feb 2024 13:26:54 -0800 (PST) Received: from redhat.com (2603-7000-9500-34a5-0000-0000-0000-1db4.res6.spectrum.com. [2603:7000:9500:34a5::1db4]) by smtp.gmail.com with ESMTPSA id mb7-20020a056214550700b00685191beaa9sm171067qvb.3.2024.02.08.13.26.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Feb 2024 13:26:53 -0800 (PST) Date: Thu, 8 Feb 2024 16:26:52 -0500 From: Marek Polacek To: Jason Merrill Cc: GCC Patches Subject: [PATCH v3] c++: DR2237, cdtor and template-id tweaks [PR107126] Message-ID: References: <20240203152404.1199437-1-polacek@redhat.com> <69077fcc-97fe-43be-9e34-9d91d1a7c7af@redhat.com> <3bd79ed5-57fa-4ea9-a250-07417738579a@redhat.com> MIME-Version: 1.0 In-Reply-To: <3bd79ed5-57fa-4ea9-a250-07417738579a@redhat.com> User-Agent: Mutt/2.2.12 (2023-09-09) X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Disposition: inline X-Spam-Status: No, score=-12.4 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H5, RCVD_IN_MSPIKE_WL, 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.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 On Wed, Feb 07, 2024 at 05:19:56PM -0500, Jason Merrill wrote: > On 2/5/24 22:11, Marek Polacek wrote: > > On Mon, Feb 05, 2024 at 10:14:34AM -0500, Jason Merrill wrote: > > > On 2/3/24 10:24, Marek Polacek wrote: > > > > Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk? > > > > > > > > I'm not certain OPT_Wc__20_extensions is the best thing for something > > > > from [diff.cpp17]; would you prefer something else? > > > > > > I think it wants its own flag, that is enabled in C++20 or by > > > -Wc++20-compat. > > > > That seems best. I called it -Wdeprecated-template-id-cdtor. > > > > + if (cxx_dialect >= cxx20) > > > > + { > > > > + if (!cp_parser_simulate_error (parser)) > > > > + pedwarn (tilde_loc, OPT_Wc__20_extensions, > > > > + "template-id not allowed for destructor"); > > > > + return error_mark_node; > > > > + } > > > > + warning_at (tilde_loc, OPT_Wc__20_compat, > > > > + "template-id not allowed for destructor in C++20"); > > > > > > After a pedwarn we should accept the code, not return error_mark_node. > > > > /facepalm, yes. > > > I'm also concerned about pedwarn/warnings not guarded by > > > !cp_parser_uncommited_to_tentative_parse; that often leads to warning about > > > a tentative parse as a declaration that is eventually abandoned in favor of > > > a perfectly fine parse as an expression. > > > > Done. > > > It would be good for cp_parser_context to add a vec of warnings to emit at > > > cp_parser_parse_definitely time, and then > > > cp_parser_pedwarn/cp_parser_warning to fill it... > > > > That would be nice; I don't think we can fix bugs like PR61259 otherwise. > > > > Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk? > > > > -- >8 -- > > Since my r11-532 changes to implement DR2237, for this test: > > > > template > > struct S { > > S(); > > }; > > > > in C++20 we emit the ugly: > > > > q.C:3:8: error: expected unqualified-id before ')' token > > 3 | S(); > > > > which doesn't explain what the problem is. This patch improves that > > diagnostic, reduces the error to a pedwarn, and adds a -Wc++20-compat > > diagnostic. We now say: > > > > q.C:3:7: warning: template-id not allowed for constructor in C++20 [-Wdeprecated-template-id-cdtor] > > 3 | S(); > > q.C:3:7: note: remove the '< >' > > > > This patch does *not* fix > > > > where the C++20 diagnostic is missing altogether. > > > > -Wc++20-compat triggered in libitm/; I sent a patch for that. > > > > DR 2237 > > PR c++/107126 > > PR c++/97202 > > > > gcc/c-family/ChangeLog: > > > > * c-opts.cc (c_common_post_options): In C++20 or with -Wc++20-compat, > > turn on -Wdeprecated-template-id-cdtor. > > * c.opt (Wdeprecated-template-id-cdtor): New. > > > > gcc/cp/ChangeLog: > > > > * parser.cc (cp_parser_unqualified_id): Downgrade the DR2237 error to > > a pedwarn. > > (cp_parser_constructor_declarator_p): Likewise. > > > > diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc > > index 3748ccd49ff..473eaf4f1f7 100644 > > --- a/gcc/cp/parser.cc > > +++ b/gcc/cp/parser.cc > > @@ -6717,12 +6717,17 @@ cp_parser_unqualified_id (cp_parser* parser, > > /* DR 2237 (C++20 only): A simple-template-id is no longer valid as the > > declarator-id of a constructor or destructor. */ > > - if (token->type == CPP_TEMPLATE_ID && declarator_p > > - && cxx_dialect >= cxx20) > > + if (token->type == CPP_TEMPLATE_ID > > + && declarator_p > > + && !cp_parser_uncommitted_to_tentative_parse_p (parser) > > + && !cp_parser_simulate_error (parser)) > > Calling both _uncommitted_ and _simulate_ here is redundant since _simulate_ > checks _uncommitted_; since you check _uncommitted_ first, _simulate_ will > never do anything. Oops, pardon me. > And checking either of them before cxx_dialect seems wrong; we don't want > _simulate_ in pre-C++20 mode where it isn't an error, but we do want > _simulate_ in C++20 mode when uncommitted. I see. > > @@ -32550,6 +32555,19 @@ cp_parser_constructor_declarator_p (cp_parser *parser, cp_parser_flags flags, > > /* We did not really want to consume any tokens. */ > > cp_parser_abort_tentative_parse (parser); > > + /* DR 2237 (C++20 only): A simple-template-id is no longer valid as the > > + declarator-id of a constructor or destructor. */ > > + if (constructor_p > > + && saw_template_id > > + && !cp_parser_uncommitted_to_tentative_parse_p (parser)) > > As above, checking _uncommitted_ before cxx_dialect seems wrong for C++20. > > If testing succeeded with this patch, maybe we can't get here while parsing > tentatively, and we just want a checking_assert (!_uncommitted_) in both > places? Or would that break on 97202? I can add the assert to the second spot, but adding it to the first one causes crashes. So maybe like this, then? Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk? -- >8 -- Since my r11-532 changes to implement DR2237, for this test: template struct S { S(); }; in C++20 we emit the ugly: q.C:3:8: error: expected unqualified-id before ')' token 3 | S(); which doesn't explain what the problem is. This patch improves that diagnostic, reduces the error to a pedwarn, and adds a -Wc++20-compat diagnostic. We now say: q.C:3:7: warning: template-id not allowed for constructor in C++20 [-Wdeprecated-template-id-cdtor] 3 | S(); q.C:3:7: note: remove the '< >' This patch does *not* fix where the C++20 diagnostic is missing altogether. -Wc++20-compat triggered in libitm/; I sent a patch for that. DR 2237 PR c++/107126 PR c++/97202 gcc/c-family/ChangeLog: * c-opts.cc (c_common_post_options): In C++20 or with -Wc++20-compat, turn on -Wdeprecated-template-id-cdtor. * c.opt (Wdeprecated-template-id-cdtor): New. gcc/cp/ChangeLog: * parser.cc (cp_parser_unqualified_id): Downgrade the DR2237 error to a pedwarn. (cp_parser_constructor_declarator_p): Likewise. gcc/ChangeLog: * doc/invoke.texi: Document -Wdeprecated-template-id-cdtor. gcc/testsuite/ChangeLog: * g++.dg/DRs/dr2237.C: Adjust dg-error. * g++.dg/parse/constructor2.C: Likewise. * g++.dg/template/error34.C: Likewise. * g++.old-deja/g++.pt/ctor2.C: Likewise. * g++.dg/DRs/dr2237-2.C: New test. * g++.dg/DRs/dr2237-3.C: New test. * g++.dg/DRs/dr2237-4.C: New test. * g++.dg/warn/Wdeprecated-template-id-cdtor-1.C: New test. * g++.dg/warn/Wdeprecated-template-id-cdtor-2.C: New test. * g++.dg/warn/Wdeprecated-template-id-cdtor-3.C: New test. * g++.dg/warn/Wdeprecated-template-id-cdtor-4.C: New test. --- gcc/c-family/c-opts.cc | 5 +++ gcc/c-family/c.opt | 4 +++ gcc/cp/parser.cc | 36 ++++++++++++++----- gcc/doc/invoke.texi | 18 ++++++++++ gcc/testsuite/g++.dg/DRs/dr2237-2.C | 9 +++++ gcc/testsuite/g++.dg/DRs/dr2237-3.C | 16 +++++++++ gcc/testsuite/g++.dg/DRs/dr2237-4.C | 11 ++++++ gcc/testsuite/g++.dg/DRs/dr2237.C | 2 +- gcc/testsuite/g++.dg/parse/constructor2.C | 16 ++++----- gcc/testsuite/g++.dg/template/error34.C | 10 +++--- .../warn/Wdeprecated-template-id-cdtor-1.C | 9 +++++ .../warn/Wdeprecated-template-id-cdtor-2.C | 9 +++++ .../warn/Wdeprecated-template-id-cdtor-3.C | 9 +++++ .../warn/Wdeprecated-template-id-cdtor-4.C | 9 +++++ gcc/testsuite/g++.old-deja/g++.pt/ctor2.C | 2 +- 15 files changed, 142 insertions(+), 23 deletions(-) create mode 100644 gcc/testsuite/g++.dg/DRs/dr2237-2.C create mode 100644 gcc/testsuite/g++.dg/DRs/dr2237-3.C create mode 100644 gcc/testsuite/g++.dg/DRs/dr2237-4.C create mode 100644 gcc/testsuite/g++.dg/warn/Wdeprecated-template-id-cdtor-1.C create mode 100644 gcc/testsuite/g++.dg/warn/Wdeprecated-template-id-cdtor-2.C create mode 100644 gcc/testsuite/g++.dg/warn/Wdeprecated-template-id-cdtor-3.C create mode 100644 gcc/testsuite/g++.dg/warn/Wdeprecated-template-id-cdtor-4.C base-commit: 232ffb61ceb63c4a86a8bc67f1db989c2124db5f diff --git a/gcc/c-family/c-opts.cc b/gcc/c-family/c-opts.cc index b845aff2226..d2358e2009a 100644 --- a/gcc/c-family/c-opts.cc +++ b/gcc/c-family/c-opts.cc @@ -998,6 +998,11 @@ c_common_post_options (const char **pfilename) warn_deprecated_enum_float_conv, cxx_dialect >= cxx20 && warn_deprecated); + /* -Wdeprecated-template-id-cdtor is enabled by default in C++20. */ + SET_OPTION_IF_UNSET (&global_options, &global_options_set, + warn_deprecated_template_id_cdtor, + cxx_dialect >= cxx20 || warn_cxx20_compat); + /* Declone C++ 'structors if -Os. */ if (flag_declone_ctor_dtor == -1) flag_declone_ctor_dtor = optimize_size; diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index 9c0a28092fc..2e1d07b66de 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -642,6 +642,10 @@ C++ ObjC++ Var(warn_deprecated_enum_float_conv) Warning Warn about deprecated arithmetic conversions on operands where one is of enumeration type and the other is of a floating-point type. +Wdeprecated-template-id-cdtor +C++ ObjC++ Var(warn_deprecated_template_id_cdtor) Warning +Warn about deprecated simple-template-id in a constructor or destructor. + Wdesignated-init C ObjC Var(warn_designated_init) Init(1) Warning Warn about positional initialization of structs requiring designated initializers. diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index c4292c49ce2..759ba7e54c4 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -6719,12 +6719,19 @@ cp_parser_unqualified_id (cp_parser* parser, /* DR 2237 (C++20 only): A simple-template-id is no longer valid as the declarator-id of a constructor or destructor. */ - if (token->type == CPP_TEMPLATE_ID && declarator_p - && cxx_dialect >= cxx20) + if (token->type == CPP_TEMPLATE_ID && declarator_p) { - if (!cp_parser_simulate_error (parser)) - error_at (tilde_loc, "template-id not allowed for destructor"); - return error_mark_node; + auto_diagnostic_group d; + bool w = false; + if (cxx_dialect >= cxx20 && !cp_parser_simulate_error (parser)) + w = pedwarn (tilde_loc, OPT_Wdeprecated_template_id_cdtor, + "template-id not allowed for destructor in C++20"); + else if (cxx_dialect < cxx20 + && !cp_parser_uncommitted_to_tentative_parse_p (parser)) + w = warning_at (tilde_loc, OPT_Wdeprecated_template_id_cdtor, + "template-id not allowed for destructor in C++20"); + if (w) + inform (tilde_loc, "remove the %qs", "< >"); } /* If there was an explicit qualification (S::~T), first look @@ -32331,11 +32338,11 @@ cp_parser_constructor_declarator_p (cp_parser *parser, cp_parser_flags flags, if (next_token->type != CPP_NAME && next_token->type != CPP_SCOPE && next_token->type != CPP_NESTED_NAME_SPECIFIER - /* DR 2237 (C++20 only): A simple-template-id is no longer valid as the - declarator-id of a constructor or destructor. */ - && (next_token->type != CPP_TEMPLATE_ID || cxx_dialect >= cxx20)) + && next_token->type != CPP_TEMPLATE_ID) return false; + const bool saw_template_id = (next_token->type == CPP_TEMPLATE_ID); + /* Parse tentatively; we are going to roll back all of the tokens consumed here. */ cp_parser_parse_tentatively (parser); @@ -32552,6 +32559,19 @@ cp_parser_constructor_declarator_p (cp_parser *parser, cp_parser_flags flags, /* We did not really want to consume any tokens. */ cp_parser_abort_tentative_parse (parser); + /* DR 2237 (C++20 only): A simple-template-id is no longer valid as the + declarator-id of a constructor or destructor. */ + if (constructor_p && saw_template_id) + { + gcc_checking_assert + (!cp_parser_uncommitted_to_tentative_parse_p (parser)); + auto_diagnostic_group d; + if (emit_diagnostic (cxx_dialect >= cxx20 ? DK_PEDWARN : DK_WARNING, + input_location, OPT_Wdeprecated_template_id_cdtor, + "template-id not allowed for constructor in C++20")) + inform (input_location, "remove the %qs", "< >"); + } + return constructor_p; } diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 71339b8b30f..5bd65bd02be 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -255,6 +255,7 @@ in the following sections. -Wdelete-non-virtual-dtor -Wno-deprecated-array-compare -Wdeprecated-copy -Wdeprecated-copy-dtor -Wno-deprecated-enum-enum-conversion -Wno-deprecated-enum-float-conversion +-Wno-deprecated-template-id-cdtor -Weffc++ -Wno-elaborated-enum-base -Wno-exceptions -Wextra-semi -Wno-inaccessible-base -Wno-inherited-variadic-ctor -Wno-init-list-lifetime @@ -3989,6 +3990,23 @@ bool b = e <= 3.7; @option{-std=c++20}. In pre-C++20 dialects, this warning can be enabled by @option{-Wenum-conversion}. +@opindex Wdeprecated-template-id-cdtor +@opindex Wno-deprecated-template-id-cdtor +@item -Wno-deprecated-template-id-cdtor @r{(C++ and Objective-C++ only)} +Disable the warning about the deprecated use of simple-template-id as the +declarator-id of a constructor or destructor, which became invalid in C++20 +via DR 2237. For example: + +@smallexample +template struct S @{ + S(); // should be S(); + ~S(); // should be ~S(); +@}; +@end smallexample + +@option{-Wdeprecated-template-id-cdtor} is enabled by default with +@option{-std=c++20}; it is also enabled by @option{-Wc++20-compat}. + @opindex Welaborated-enum-base @opindex Wno-elaborated-enum-base @item -Wno-elaborated-enum-base diff --git a/gcc/testsuite/g++.dg/DRs/dr2237-2.C b/gcc/testsuite/g++.dg/DRs/dr2237-2.C new file mode 100644 index 00000000000..1d99347229c --- /dev/null +++ b/gcc/testsuite/g++.dg/DRs/dr2237-2.C @@ -0,0 +1,9 @@ +// DR 2237 - Can a template-id name a constructor? +// { dg-options "" } + +template +struct X { + X(); // { dg-warning "template-id not allowed for constructor" "" { target c++20 } } + X(int); // OK, injected-class-name used + ~X(); // { dg-warning "template-id not allowed for destructor" "" { target c++20 } } +}; diff --git a/gcc/testsuite/g++.dg/DRs/dr2237-3.C b/gcc/testsuite/g++.dg/DRs/dr2237-3.C new file mode 100644 index 00000000000..c8ad6852389 --- /dev/null +++ b/gcc/testsuite/g++.dg/DRs/dr2237-3.C @@ -0,0 +1,16 @@ +// PR c++/107126 +// { dg-options "" } + +template +struct C +{ + ~C(); +}; +template +C::~C() // { dg-warning "template-id not allowed for destructor" "" { target c++20 } } +{ +} +int main() +{ + C c;; +} diff --git a/gcc/testsuite/g++.dg/DRs/dr2237-4.C b/gcc/testsuite/g++.dg/DRs/dr2237-4.C new file mode 100644 index 00000000000..a358dd521b5 --- /dev/null +++ b/gcc/testsuite/g++.dg/DRs/dr2237-4.C @@ -0,0 +1,11 @@ +// PR c++/97202 +// { dg-options "" } + +template +struct F +{ + F(); // { dg-warning "template-id not allowed for constructor" "" { target c++20 } } +}; + +template +inline F::F() { } diff --git a/gcc/testsuite/g++.dg/DRs/dr2237.C b/gcc/testsuite/g++.dg/DRs/dr2237.C index f3d6d11e61e..830c8f5a2a6 100644 --- a/gcc/testsuite/g++.dg/DRs/dr2237.C +++ b/gcc/testsuite/g++.dg/DRs/dr2237.C @@ -2,7 +2,7 @@ template struct X { - X(); // { dg-error "expected" "" { target c++20 } } + X(); // { dg-error "template-id not allowed for constructor" "" { target c++20 } } X(int); // OK, injected-class-name used ~X(); // { dg-error "template-id not allowed for destructor" "" { target c++20 } } }; diff --git a/gcc/testsuite/g++.dg/parse/constructor2.C b/gcc/testsuite/g++.dg/parse/constructor2.C index d620f41e027..e4b2ad3f2fe 100644 --- a/gcc/testsuite/g++.dg/parse/constructor2.C +++ b/gcc/testsuite/g++.dg/parse/constructor2.C @@ -1,11 +1,11 @@ // PR c++/14260 -template -class T -{ -public: - T(short,short f=0) {} - T(int f) {} // { dg-error "expected" "" { target c++20 } } - T(int f=0,const char* b=0) {} // { dg-error "expected" "" { target c++20 } } -}; +template +class T +{ +public: + T(short,short f=0) {} + T(int f) {} // { dg-error "template-id not allowed for constructor" "" { target c++20 } } + T(int f=0,const char* b=0) {} // { dg-error "template-id not allowed for constructor" "" { target c++20 } } +}; diff --git a/gcc/testsuite/g++.dg/template/error34.C b/gcc/testsuite/g++.dg/template/error34.C index ab688d9ba8c..921cb8fb729 100644 --- a/gcc/testsuite/g++.dg/template/error34.C +++ b/gcc/testsuite/g++.dg/template/error34.C @@ -3,27 +3,27 @@ template struct A { - A<__builtin_offsetof(T, x)>(); // { dg-error "type/value mismatch|offsetof\\(T, x\\)|expected" } + A<__builtin_offsetof(T, x)>(); // { dg-error "type/value mismatch|offsetof\\(T, x\\)|template-id" } }; template struct B { - B<__builtin_offsetof(T, x.y)>(); // { dg-error "type/value mismatch|offsetof\\(T, x.y\\)|expected" } + B<__builtin_offsetof(T, x.y)>(); // { dg-error "type/value mismatch|offsetof\\(T, x.y\\)|template-id" } }; template struct C { - C<__builtin_offsetof(T, x[6])>(); // { dg-error "type/value mismatch|offsetof\\(T, x\\\[6\\\]\\)|expected" } + C<__builtin_offsetof(T, x[6])>(); // { dg-error "type/value mismatch|offsetof\\(T, x\\\[6\\\]\\)|template-id" } }; template struct D { - D<__builtin_offsetof(T, x.y[6].z)>(); // { dg-error "type/value mismatch|offsetof\\(T, x.y\\\[6\\\].z\\)|expected" } + D<__builtin_offsetof(T, x.y[6].z)>(); // { dg-error "type/value mismatch|offsetof\\(T, x.y\\\[6\\\].z\\)|template-id" } }; struct E { int x; }; template struct F { - F<__builtin_offsetof(E, x)>(); // { dg-error "type/value mismatch|offsetof\\(E, x\\)|expected" } + F<__builtin_offsetof(E, x)>(); // { dg-error "type/value mismatch|offsetof\\(E, x\\)|template-id" } }; diff --git a/gcc/testsuite/g++.dg/warn/Wdeprecated-template-id-cdtor-1.C b/gcc/testsuite/g++.dg/warn/Wdeprecated-template-id-cdtor-1.C new file mode 100644 index 00000000000..429490708bc --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wdeprecated-template-id-cdtor-1.C @@ -0,0 +1,9 @@ +// PR c++/107126 +// { dg-do compile } +// { dg-options "-Wc++20-compat" } + +template +struct X { + X(); // { dg-warning "template-id not allowed for constructor" } + ~X(); // { dg-warning "template-id not allowed for destructor" } +}; diff --git a/gcc/testsuite/g++.dg/warn/Wdeprecated-template-id-cdtor-2.C b/gcc/testsuite/g++.dg/warn/Wdeprecated-template-id-cdtor-2.C new file mode 100644 index 00000000000..d76b647c615 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wdeprecated-template-id-cdtor-2.C @@ -0,0 +1,9 @@ +// PR c++/107126 +// { dg-do compile } +// { dg-options "-Wdeprecated-template-id-cdtor" } + +template +struct X { + X(); // { dg-warning "template-id not allowed for constructor" } + ~X(); // { dg-warning "template-id not allowed for destructor" } +}; diff --git a/gcc/testsuite/g++.dg/warn/Wdeprecated-template-id-cdtor-3.C b/gcc/testsuite/g++.dg/warn/Wdeprecated-template-id-cdtor-3.C new file mode 100644 index 00000000000..80fc2ff7739 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wdeprecated-template-id-cdtor-3.C @@ -0,0 +1,9 @@ +// PR c++/107126 +// { dg-do compile } +// { dg-options "-Wc++20-compat -Wno-deprecated-template-id-cdtor" } + +template +struct X { + X(); // { dg-bogus "template-id not allowed for constructor" } + ~X(); // { dg-bogus "template-id not allowed for destructor" } +}; diff --git a/gcc/testsuite/g++.dg/warn/Wdeprecated-template-id-cdtor-4.C b/gcc/testsuite/g++.dg/warn/Wdeprecated-template-id-cdtor-4.C new file mode 100644 index 00000000000..6f1747701da --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wdeprecated-template-id-cdtor-4.C @@ -0,0 +1,9 @@ +// PR c++/107126 +// { dg-do compile } +// { dg-options "-Wdeprecated-template-id-cdtor -Wno-c++20-compat" } + +template +struct X { + X(); // { dg-warning "template-id not allowed for constructor" } + ~X(); // { dg-warning "template-id not allowed for destructor" } +}; diff --git a/gcc/testsuite/g++.old-deja/g++.pt/ctor2.C b/gcc/testsuite/g++.old-deja/g++.pt/ctor2.C index bf418ba48c7..56b4232d04b 100644 --- a/gcc/testsuite/g++.old-deja/g++.pt/ctor2.C +++ b/gcc/testsuite/g++.old-deja/g++.pt/ctor2.C @@ -4,7 +4,7 @@ template struct A { - A(); // { dg-error "expected" "" { target c++20 } } + A(); // { dg-error "template-id" "" { target c++20 } } }; template