From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 29580 invoked by alias); 24 Jun 2011 21:05:44 -0000 Received: (qmail 29571 invoked by uid 22791); 24 Jun 2011 21:05:44 -0000 X-SWARE-Spam-Status: No, hits=-6.4 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 24 Jun 2011 21:05:25 +0000 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p5OL5POH030219 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 24 Jun 2011 17:05:25 -0400 Received: from [127.0.0.1] (ovpn-113-54.phx2.redhat.com [10.3.113.54]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p5OL5Nqm027186; Fri, 24 Jun 2011 17:05:24 -0400 Message-ID: <4E04FC13.7070103@redhat.com> Date: Fri, 24 Jun 2011 22:21:00 -0000 From: Jason Merrill User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.17) Gecko/20110428 Fedora/3.1.10-1.fc14 Lightning/1.0b2 Thunderbird/3.1.10 MIME-Version: 1.0 To: Diego Novillo CC: gcc-patches List Subject: Re: C++ PATCH for c++/35255 (address of template-id) References: <4E03F22C.9040208@redhat.com> In-Reply-To: Content-Type: multipart/mixed; boundary="------------010108000007050204010004" Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2011-06/txt/msg01898.txt.bz2 This is a multi-part message in MIME format. --------------010108000007050204010004 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Content-length: 69 On 06/24/2011 08:33 AM, Diego Novillo wrote: > Patch missing. Oopt. --------------010108000007050204010004 Content-Type: text/x-patch; name="35255.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="35255.patch" Content-length: 3409 commit 124387ceea38a3c0204c9f91d17bbfa68063d42e Author: Jason Merrill Date: Wed Jun 22 16:07:10 2011 -0400 PR c++/35255 * pt.c (resolve_overloaded_unification): Fix DR 115 handling. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 08ce5af..b3dd85f 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -14524,6 +14524,7 @@ resolve_overloaded_unification (tree tparms, the affected templates before we try to unify, in case the explicit args will completely resolve the templates in question. */ + int ok = 0; tree expl_subargs = TREE_OPERAND (arg, 1); arg = TREE_OPERAND (arg, 0); @@ -14538,7 +14539,7 @@ resolve_overloaded_unification (tree tparms, ++processing_template_decl; subargs = get_bindings (fn, DECL_TEMPLATE_RESULT (fn), expl_subargs, /*check_ret=*/false); - if (subargs) + if (subargs && !any_dependent_template_arguments_p (subargs)) { elem = tsubst (TREE_TYPE (fn), subargs, tf_none, NULL_TREE); if (try_one_overload (tparms, targs, tempargs, parm, @@ -14549,8 +14550,16 @@ resolve_overloaded_unification (tree tparms, ++good; } } + else if (subargs) + ++ok; --processing_template_decl; } + /* If no templates (or more than one) are fully resolved by the + explicit arguments, this template-id is a non-deduced context; it + could still be OK if we deduce all template arguments for the + enclosing call through other arguments. */ + if (good != 1) + good = ok; } else if (TREE_CODE (arg) != OVERLOAD && TREE_CODE (arg) != FUNCTION_DECL) diff --git a/gcc/testsuite/g++.dg/template/partial10.C b/gcc/testsuite/g++.dg/template/partial10.C new file mode 100644 index 0000000..53a48fb --- /dev/null +++ b/gcc/testsuite/g++.dg/template/partial10.C @@ -0,0 +1,18 @@ +// PR c++/35255, DR 115 +// { dg-do link } + +// 14.8.1: In contexts where deduction is done and fails, or in contexts +// where deduction is not done, if a template argument list is specified +// and it, along with any default template arguments, identifies a single +// function template specialization, then the template-id is an lvalue for +// the function template specialization. + +template void def(Fn fn) {} + +template T2 fn(T1, T2); +template int fn(T1) { } + +int main() +{ + def(fn); +} diff --git a/gcc/testsuite/g++.dg/template/partial11.C b/gcc/testsuite/g++.dg/template/partial11.C new file mode 100644 index 0000000..b5ceaa8 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/partial11.C @@ -0,0 +1,24 @@ +// DR 115 + +// 14.8.1: In contexts where deduction is done and fails, or in contexts +// where deduction is not done, if a template argument list is specified +// and it, along with any default template arguments, identifies a single +// function template specialization, then the template-id is an lvalue for +// the function template specialization. + +// Here, deduction is not done to resolve fn because the target type +// is a template parameter, so we resolve to the second template, and then +// the call to def fails because we deduce different values of Fn for the +// two function arguments. + +template void def(Fn fn, Fn fn2); + +template T2 fn(T1, T2); +template int fn(T1); + +int f(int,int); + +int main() +{ + def(fn,f); // { dg-error "" } +} --------------010108000007050204010004--