From patchwork Fri Jan 25 19:53:37 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Merrill X-Patchwork-Id: 215840 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]) by ozlabs.org (Postfix) with SMTP id 7C0A72C008F for ; Sat, 26 Jan 2013 06:54:20 +1100 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1359748460; h=Comment: DomainKey-Signature:Received:Received:Received:Received:Received: Message-ID:Date:From:User-Agent:MIME-Version:To:Subject: Content-Type:Mailing-List:Precedence:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:Sender:Delivered-To; bh=6EFcwVQ G8OJ2pj7Pep7lGu1Yalg=; b=hcwZK+5T227f3KRJhOQq64kqBwLmeN4Xf3nBlpz kx/GSVPoUZinSlzjoTAOjNXdAfjMYRFHaOL53VFTpkgDSiMBGoR9ZDZ4K2ND6ZRJ mEGSgfXOnL65U3FQTUWIm57Sxj41nbUP69YTqujeQWOoJtZt6xLQvR19wFA8ql63 PCOY= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:Received:Message-ID:Date:From:User-Agent:MIME-Version:To:Subject:Content-Type:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=ldcJtHU2Z68N2flRiMJeOSRzFx/0o+ngxgL0jL88zyaziQJ0c5MsHhfLWSQ5J8 4CDwykH37pv8xCuqH1cC7w3dHyuJWdH9UI3mcbK3weTsKwUU9x9bWCtc4ZSYfCP2 P5IyXzYYr9KICxlffg6xjHQBEwALh521SzgiRzmHCoT6w=; Received: (qmail 13222 invoked by alias); 25 Jan 2013 19:54:16 -0000 Received: (qmail 13212 invoked by uid 22791); 25 Jan 2013 19:54:15 -0000 X-SWARE-Spam-Status: No, hits=-6.3 required=5.0 tests=AWL, BAYES_00, KHOP_RCVD_UNTRUST, KHOP_SPAMHAUS_DROP, RCVD_IN_DNSWL_HI, RCVD_IN_HOSTKARMA_W, RP_MATCHES_RCVD, SPF_HELO_PASS, TW_CX 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, 25 Jan 2013 19:53:40 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r0PJreYc020686 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 25 Jan 2013 14:53:40 -0500 Received: from [10.3.113.195] (ovpn-113-195.phx2.redhat.com [10.3.113.195]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0PJrdj3010851 for ; Fri, 25 Jan 2013 14:53:39 -0500 Message-ID: <5102E2C1.507@redhat.com> Date: Fri, 25 Jan 2013 14:53:37 -0500 From: Jason Merrill User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130110 Thunderbird/17.0.2 MIME-Version: 1.0 To: gcc-patches List Subject: C++ PATCH for c++/56095 (ICE on invalid function pointer template argument) 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 We were assuming well-formed code. Tested x86_64-pc-linux-gnu, applying to trunk. commit dc80cbbc639c39dd8728aa14d6188bcd9061bfd0 Author: Jason Merrill Date: Fri Jan 25 06:15:26 2013 -0500 PR c++/56095 * pt.c (convert_nontype_argument_function): Handle invalid input. (convert_nontype_argument): Likewise. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 01d4295..7430289 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -5113,6 +5113,17 @@ convert_nontype_argument_function (tree type, tree expr) [...] -- the address of an object or function with external [C++11: or internal] linkage. */ + + if (TREE_CODE (fn_no_ptr) != FUNCTION_DECL) + { + error ("%qE is not a valid template argument for type %qT", expr, type); + if (TREE_CODE (type) == POINTER_TYPE) + error ("it must be the address of a function with external linkage"); + else + error ("it must be the name of a function with external linkage"); + return NULL_TREE; + } + linkage = decl_linkage (fn_no_ptr); if (cxx_dialect >= cxx0x ? linkage == lk_none : linkage != lk_external) { @@ -5511,15 +5522,16 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain) could actually change the type to something more cv-qualified, and this is not folded by convert_from_reference. */ tree addr = TREE_OPERAND (probe, 0); - gcc_assert (TREE_CODE (probe_type) == REFERENCE_TYPE); - gcc_assert (TREE_CODE (addr) == ADDR_EXPR); - gcc_assert (TREE_CODE (TREE_TYPE (addr)) == POINTER_TYPE); - gcc_assert (same_type_ignoring_top_level_qualifiers_p - (TREE_TYPE (probe_type), - TREE_TYPE (TREE_TYPE (addr)))); - - expr = TREE_OPERAND (addr, 0); - expr_type = TREE_TYPE (expr); + if (TREE_CODE (probe_type) == REFERENCE_TYPE + && TREE_CODE (addr) == ADDR_EXPR + && TREE_CODE (TREE_TYPE (addr)) == POINTER_TYPE + && (same_type_ignoring_top_level_qualifiers_p + (TREE_TYPE (probe_type), + TREE_TYPE (TREE_TYPE (addr))))) + { + expr = TREE_OPERAND (addr, 0); + expr_type = TREE_TYPE (expr); + } } } @@ -5745,13 +5757,6 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain) expr = convert_nontype_argument_function (type, expr); if (!expr || expr == error_mark_node) return expr; - - if (TREE_CODE (expr) != ADDR_EXPR) - { - error ("%qE is not a valid template argument for type %qT", expr, type); - error ("it must be the address of a function with external linkage"); - return NULL_TREE; - } } /* [temp.arg.nontype]/5, bullet 5 diff --git a/gcc/testsuite/g++.dg/template/fn-ptr2.C b/gcc/testsuite/g++.dg/template/fn-ptr2.C new file mode 100644 index 0000000..742135a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/fn-ptr2.C @@ -0,0 +1,14 @@ +// PR c++/56095 + +int *a(void) { return 0; } +typedef void voidfn(void); +template void z1(void) {} +template void z2(void) {} + +int main() +{ + z1<(voidfn*)a>(); // { dg-error "" } + z1(a)>(); // { dg-error "" } + z2<(voidfn&)a>(); // { dg-error "" } + z2(a)>(); // { dg-error "" } +}