From patchwork Thu Aug 14 16:14:54 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Carlini X-Patchwork-Id: 379954 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id CD6C7140097 for ; Fri, 15 Aug 2014 02:15:14 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:subject:references :in-reply-to:content-type; q=dns; s=default; b=FhmD9hiIq5gL8MXaq G3JsHQniSd00wakkmY0ow7xvG0IP5wg+xTfGDTAAq7wQlFPSrbraiBuxuwsjkihE mergapbPRnw+deIRDmWba3erDDbh6hFkGab+zbE9oV+XYYR0DO/USOh1xlwHQQry Ovh69HKtfvh2EErsm60/pR+oH4= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:subject:references :in-reply-to:content-type; s=default; bh=GrnfbxNB1j4zaUwub8a6Ayl cQgc=; b=ASD3cyDHyKoMBYtWowsI4T771wC7I8LKlAIBKTyZeUYRM4pBbyjun4H pogN9dm/0oGXTjA8o5btabV+srSZo4LmvBt/xr5EtyZ2uXlx0C8wCeNqw+n41cVv JmhrASuMgCm7ZYTjmX+i6pr0kn2ou0OrRk2dD3U+ecfqkcoOhSI8= Received: (qmail 17993 invoked by alias); 14 Aug 2014 16:15:06 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 17982 invoked by uid 89); 14 Aug 2014 16:15:04 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.6 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD, SPF_PASS autolearn=ham version=3.3.2 X-HELO: aserp1040.oracle.com Received: from aserp1040.oracle.com (HELO aserp1040.oracle.com) (141.146.126.69) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-SHA encrypted) ESMTPS; Thu, 14 Aug 2014 16:15:01 +0000 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s7EGEwOS030716 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 14 Aug 2014 16:14:59 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s7EGEvSR025324 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 14 Aug 2014 16:14:58 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s7EGEv8q006383; Thu, 14 Aug 2014 16:14:57 GMT Received: from [192.168.1.4] (/87.10.238.12) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 14 Aug 2014 09:14:56 -0700 Message-ID: <53ECE07E.1080409@oracle.com> Date: Thu, 14 Aug 2014 18:14:54 +0200 From: Paolo Carlini User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.7.0 MIME-Version: 1.0 To: Jason Merrill , "gcc-patches@gcc.gnu.org" Subject: Re: [C++ Patch] PR 54377 References: <53EC9A0B.80006@oracle.com> <53ECC523.7080208@redhat.com> In-Reply-To: <53ECC523.7080208@redhat.com> X-IsSubscribed: yes Hi, On 08/14/2014 04:18 PM, Jason Merrill wrote: > On 08/14/2014 07:14 AM, Paolo Carlini wrote: >> + nparms -= variadic_p ? variadic_p : default_p; > > What if you have both default arguments and parameter packs? Right. Got distracted by the minor secondary issues... It seems to me that simply adding the counters works, ie, in the additional cpp0x testcase we thus say 'at least 2', instead of a wrong 'at least 3'. I'm finishing testing the below. Thanks, Paolo. ///////////////////// Index: cp/pt.c =================================================================== --- cp/pt.c (revision 213952) +++ cp/pt.c (working copy) @@ -6861,19 +6861,24 @@ coerce_template_parms (tree parms, int variadic_args_p = 0; int post_variadic_parms = 0; + /* Likewise for parameters with default arguments. */ + int default_p = 0; + if (args == error_mark_node) return error_mark_node; nparms = TREE_VEC_LENGTH (parms); - /* Determine if there are any parameter packs. */ + /* Determine if there are any parameter packs or default arguments. */ for (parm_idx = 0; parm_idx < nparms; ++parm_idx) { - tree tparm = TREE_VALUE (TREE_VEC_ELT (parms, parm_idx)); + tree parm = TREE_VEC_ELT (parms, parm_idx); if (variadic_p) ++post_variadic_parms; - if (template_parameter_pack_p (tparm)) + if (template_parameter_pack_p (TREE_VALUE (parm))) ++variadic_p; + if (TREE_PURPOSE (parm)) + ++default_p; } inner_args = orig_inner_args = INNERMOST_TEMPLATE_ARGS (args); @@ -6902,11 +6907,11 @@ coerce_template_parms (tree parms, { if (complain & tf_error) { - if (variadic_p) + if (variadic_p || default_p) { - nparms -= variadic_p; + nparms -= variadic_p + default_p; error ("wrong number of template arguments " - "(%d, should be %d or more)", nargs, nparms); + "(%d, should be at least %d)", nargs, nparms); } else error ("wrong number of template arguments " @@ -6913,7 +6918,7 @@ coerce_template_parms (tree parms, "(%d, should be %d)", nargs, nparms); if (in_decl) - error ("provided for %q+D", in_decl); + inform (input_location, "provided for %q+D", in_decl); } return error_mark_node; Index: testsuite/g++.dg/cpp0x/alias-decl-2.C =================================================================== --- testsuite/g++.dg/cpp0x/alias-decl-2.C (revision 213952) +++ testsuite/g++.dg/cpp0x/alias-decl-2.C (working copy) @@ -22,7 +22,7 @@ template using Vec = Vector > template void g(Vector >); -template class TT> void h(TT); // { dg-error "provided for" } +template class TT> void h(TT); // { dg-message "provided for" } void bar() Index: testsuite/g++.dg/cpp0x/pr51226.C =================================================================== --- testsuite/g++.dg/cpp0x/pr51226.C (revision 213952) +++ testsuite/g++.dg/cpp0x/pr51226.C (working copy) @@ -1,7 +1,7 @@ // PR c++/51226 // { dg-do compile { target c++11 } } -template struct A // { dg-error "provided" } +template struct A // { dg-message "provided" } { enum E : int; }; Index: testsuite/g++.dg/cpp0x/pr54377.C =================================================================== --- testsuite/g++.dg/cpp0x/pr54377.C (revision 0) +++ testsuite/g++.dg/cpp0x/pr54377.C (working copy) @@ -0,0 +1,7 @@ +// PR c++/54377 +// { dg-do compile { target c++11 } } + +template +struct foo {}; // { dg-message "provided for" } + +foo f; // { dg-error "at least 2" } Index: testsuite/g++.dg/cpp0x/variadic2.C =================================================================== --- testsuite/g++.dg/cpp0x/variadic2.C (revision 213952) +++ testsuite/g++.dg/cpp0x/variadic2.C (working copy) @@ -6,9 +6,9 @@ template // { dg-error "default class tuple3; template -struct two_or_more {}; // { dg-error "provided for" } +struct two_or_more {}; // { dg-message "provided for" } -typedef two_or_more bad; // { dg-error "2 or more" "2 or more" } +typedef two_or_more bad; // { dg-error "at least 2" "at least 2" } void f() { Index: testsuite/g++.dg/parse/too-many-tmpl-args1.C =================================================================== --- testsuite/g++.dg/parse/too-many-tmpl-args1.C (revision 213952) +++ testsuite/g++.dg/parse/too-many-tmpl-args1.C (working copy) @@ -2,7 +2,7 @@ // Origin: Wolfgang Bangerth // { dg-do compile } -template class A // { dg-error "" } +template class A // { dg-message "" } { struct B; template friend typename A::B foo(); // { dg-error "" } Index: testsuite/g++.dg/template/dtor3.C =================================================================== --- testsuite/g++.dg/template/dtor3.C (revision 213952) +++ testsuite/g++.dg/template/dtor3.C (working copy) @@ -1,4 +1,4 @@ // PR c++/19762 -template struct A { ~A(){} }; // { dg-error "" } +template struct A { ~A(){} }; // { dg-message "provided for" } template A<>::~A(); // { dg-error "template|declaration" } Index: testsuite/g++.dg/template/pr54377.C =================================================================== --- testsuite/g++.dg/template/pr54377.C (revision 0) +++ testsuite/g++.dg/template/pr54377.C (working copy) @@ -0,0 +1,6 @@ +// PR c++/54377 + +template +struct foo {}; // { dg-message "provided for" } + +foo f; // { dg-error "at least 2" } Index: testsuite/g++.dg/template/qualttp4.C =================================================================== --- testsuite/g++.dg/template/qualttp4.C (revision 213952) +++ testsuite/g++.dg/template/qualttp4.C (working copy) @@ -7,7 +7,7 @@ struct A template struct B {}; }; -template