From patchwork Sat Mar 16 19:30:16 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Merrill X-Patchwork-Id: 228244 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 0E4072C00B4 for ; Sun, 17 Mar 2013 06:30:43 +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=1364067044; 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=2NobCmy ge29MjSqsP3MzY/kpn2U=; b=NBxQGa1dgAgxcaHXUN2LfkAnyimju4G8Zy1DPTK +MOyGBeuzLUxyjYiI1pqpHsqC59E71CaiXnTiwtWBY7ES3mm8pdx3gJgQX/qfF6L zdWFNmElcsCS1jN0J128uwlX5KrvLTD832EfFf6n5PFzWcnqo0z0WPexBpe7j6wn ufR0= 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=LrJvp7oasLCOt9387swIA/c0SefDk1hMF+PLGC9e7mZN011G5QDrMJ+PYYn6FZ zzrLs7Ibsd7gYqbFewgRxlllEx88PVs0FbEeDTal8Ofx3bMKcI2oZzKwI6lNlokq 4IIUHXvxmtQQUEmiZp8+6SRrYrA66VFcTklSLKZF5+RoU=; Received: (qmail 2818 invoked by alias); 16 Mar 2013 19:30:31 -0000 Received: (qmail 2807 invoked by uid 22791); 16 Mar 2013 19:30:30 -0000 X-SWARE-Spam-Status: No, hits=-7.6 required=5.0 tests=AWL, BAYES_00, KHOP_RCVD_UNTRUST, RCVD_IN_DNSWL_HI, RCVD_IN_HOSTKARMA_W, RP_MATCHES_RCVD, SPF_HELO_PASS 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; Sat, 16 Mar 2013 19:30:22 +0000 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r2GJUIro006159 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Sat, 16 Mar 2013 15:30:18 -0400 Received: from [10.3.113.8] ([10.3.113.8]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r2GJUHPs016155 for ; Sat, 16 Mar 2013 15:30:17 -0400 Message-ID: <5144C848.4060608@redhat.com> Date: Sat, 16 Mar 2013 15:30:16 -0400 From: Jason Merrill User-Agent: Mozilla/5.0 (X11; Linux i686; rv:21.0) Gecko/20100101 Thunderbird/21.0a2 MIME-Version: 1.0 To: gcc-patches List Subject: C++ PATCH for c++/54946 (ICE on invalid 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, which doesn't work out so well. Tested x86_64-pc-linux-gnu, applying to trunk. commit f4e6a7962929074fc6290dd27742d93ddd924a43 Author: Jason Merrill Date: Fri Feb 15 15:09:50 2013 -0500 PR c++/54946 * pt.c (convert_nontype_argument): Handle invalid pointer. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 126e110..c07ed32 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -5553,15 +5553,19 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain) qualification conversion. Let's strip everything. */ else if (TREE_CODE (expr) == NOP_EXPR && TYPE_PTROBV_P (type)) { - STRIP_NOPS (expr); - gcc_assert (TREE_CODE (expr) == ADDR_EXPR); - gcc_assert (TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE); - /* Skip the ADDR_EXPR only if it is part of the decay for - an array. Otherwise, it is part of the original argument - in the source code. */ - if (TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == ARRAY_TYPE) - expr = TREE_OPERAND (expr, 0); - expr_type = TREE_TYPE (expr); + tree probe = expr; + STRIP_NOPS (probe); + if (TREE_CODE (probe) == ADDR_EXPR + && TREE_CODE (TREE_TYPE (probe)) == POINTER_TYPE) + { + /* Skip the ADDR_EXPR only if it is part of the decay for + an array. Otherwise, it is part of the original argument + in the source code. */ + if (TREE_CODE (TREE_TYPE (TREE_OPERAND (probe, 0))) == ARRAY_TYPE) + probe = TREE_OPERAND (probe, 0); + expr = probe; + expr_type = TREE_TYPE (expr); + } } /* [temp.arg.nontype]/5, bullet 1 @@ -5640,6 +5644,13 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain) expr, expr); return NULL_TREE; } + if (POINTER_TYPE_P (expr_type)) + { + error ("%qE is not a valid template argument for %qT" + "because it is not the address of a variable", + expr, type); + return NULL_TREE; + } /* Other values, like integer constants, might be valid non-type arguments of some other type. */ return error_mark_node; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-template5.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-template5.C new file mode 100644 index 0000000..aa80658 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-template5.C @@ -0,0 +1,6 @@ +// PR c++/54946 +// { dg-do compile { target c++11 } } + +template static void testfunc(); +constexpr struct testtype { const char* str; } test = { "abc"} ; +void (*functionpointer)() = testfunc<(const char*) test.str>; // { dg-error "" }