From patchwork Tue Mar 8 17:25:43 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Merrill X-Patchwork-Id: 86026 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 57047B6F12 for ; Wed, 9 Mar 2011 04:26:00 +1100 (EST) Received: (qmail 15269 invoked by alias); 8 Mar 2011 17:25:55 -0000 Received: (qmail 15256 invoked by uid 22791); 8 Mar 2011 17:25:53 -0000 X-SWARE-Spam-Status: No, hits=-6.2 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; Tue, 08 Mar 2011 17:25:46 +0000 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p28HPio5015593 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 8 Mar 2011 12:25:44 -0500 Received: from [127.0.0.1] (ovpn-113-31.phx2.redhat.com [10.3.113.31]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p28HPhbu031976 for ; Tue, 8 Mar 2011 12:25:44 -0500 Message-ID: <4D766697.2020507@redhat.com> Date: Tue, 08 Mar 2011 12:25:43 -0500 From: Jason Merrill User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.13) Gecko/20101209 Fedora/3.1.7-0.35.b3pre.fc14 Lightning/1.0b2 Thunderbird/3.1.7 MIME-Version: 1.0 To: gcc-patches List Subject: C++ PATCH for c++/47705 (ICE with non-pointer argument to pointer template parameter) 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 asserting that any argument to a non-type template parameter of pointer type must be an address. Which is true of valid code (apart from null pointer values), but not necessarily of invalid code, where we should complain rather than crash. Tested x86_64-pc-linux-gnu, applied to trunk. commit 0aa8b389e5b3d863edd4e9969cadf2af5f2c1907 Author: Jason Merrill Date: Tue Mar 8 11:02:49 2011 -0500 PR c++/47705 * pt.c (convert_nontype_argument): Don't crash on non-pointer argument to pointer parameter. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 48f9382..cda9df8 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -5369,15 +5369,20 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain) qualification conversion. Let's strip everything. */ else if (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 sub = expr; + STRIP_NOPS (sub); + if (TREE_CODE (sub) == ADDR_EXPR) + { + gcc_assert (TREE_CODE (TREE_TYPE (sub)) == 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 (sub, 0))) == ARRAY_TYPE) + expr = TREE_OPERAND (sub, 0); + else + expr = sub; + expr_type = TREE_TYPE (expr); + } } } diff --git a/gcc/testsuite/g++.dg/template/nontype21.C b/gcc/testsuite/g++.dg/template/nontype21.C new file mode 100644 index 0000000..c8e73d2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype21.C @@ -0,0 +1,10 @@ +// PR c++/47705 + +template class Something { +}; + +extern char const xyz; + +class SomethingElse:public Something { // { dg-error "const char *" } +}; +