From patchwork Wed May 25 19:41:44 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Merrill X-Patchwork-Id: 97406 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 E051DB6F8F for ; Thu, 26 May 2011 05:42:03 +1000 (EST) Received: (qmail 13457 invoked by alias); 25 May 2011 19:42:02 -0000 Received: (qmail 13444 invoked by uid 22791); 25 May 2011 19:42:00 -0000 X-SWARE-Spam-Status: No, hits=-6.3 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_HI, SPF_HELO_PASS, TW_RG, 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; Wed, 25 May 2011 19:41:46 +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 p4PJfj6v007986 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 25 May 2011 15:41:45 -0400 Received: from [127.0.0.1] (ovpn-113-23.phx2.redhat.com [10.3.113.23]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id p4PJfjoQ029086 for ; Wed, 25 May 2011 15:41:45 -0400 Message-ID: <4DDD5B78.20401@redhat.com> Date: Wed, 25 May 2011 15:41:44 -0400 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: gcc-patches List Subject: C++ PATCHes for c++/46245 and c++/46145 (auto issues) 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 In 46245, we were complaining too soon about an auto parameter; we need to wait until after we splice in a late-specified return type. In 46145, we were failing to complain about an auto typedef. Tested x86_64-pc-linux-gnu, applying to trunk. commit 2ab4982d07fd89b0a7bc42868aa655173a132af7 Author: Jason Merrill Date: Wed May 25 12:22:13 2011 -0400 PR c++/46245 * decl.c (grokdeclarator): Complain later for auto parameter. * pt.c (splice_late_return_type): Handle use in a template type-parameter. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index cc09c1d..68dc999 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -8763,12 +8763,6 @@ grokdeclarator (const cp_declarator *declarator, || thread_p) error ("storage class specifiers invalid in parameter declarations"); - if (type_uses_auto (type)) - { - error ("parameter declared %"); - type = error_mark_node; - } - /* Function parameters cannot be constexpr. If we saw one, moan and pretend it wasn't there. */ if (constexpr_p) @@ -9749,6 +9743,12 @@ grokdeclarator (const cp_declarator *declarator, if (ctype || in_namespace) error ("cannot use %<::%> in parameter declaration"); + if (type_uses_auto (type)) + { + error ("parameter declared %"); + type = error_mark_node; + } + /* A parameter declared as an array of T is really a pointer to T. One declared as a function is really a pointer to a function. One declared as a member is really a pointer to member. */ diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index bb4515b..c3c759e 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -19315,7 +19315,12 @@ splice_late_return_type (tree type, tree late_return_type) return type; argvec = make_tree_vec (1); TREE_VEC_ELT (argvec, 0) = late_return_type; - if (processing_template_decl) + if (processing_template_parmlist) + /* For a late-specified return type in a template type-parameter, we + need to add a dummy argument level for its parmlist. */ + argvec = add_to_template_args + (make_tree_vec (processing_template_parmlist), argvec); + if (current_template_parms) argvec = add_to_template_args (current_template_args (), argvec); return tsubst (type, argvec, tf_warning_or_error, NULL_TREE); } diff --git a/gcc/testsuite/g++.dg/cpp0x/auto23.C b/gcc/testsuite/g++.dg/cpp0x/auto23.C new file mode 100644 index 0000000..49b5a0e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto23.C @@ -0,0 +1,4 @@ +// PR c++/46245 +// { dg-options -std=c++0x } + +templateint> struct A { }; diff --git a/gcc/testsuite/g++.dg/cpp0x/auto9.C b/gcc/testsuite/g++.dg/cpp0x/auto9.C index ab90be5..142ef90 100644 --- a/gcc/testsuite/g++.dg/cpp0x/auto9.C +++ b/gcc/testsuite/g++.dg/cpp0x/auto9.C @@ -79,10 +79,10 @@ enum struct D : auto * { FF = 0 }; // { dg-error "must be an integral type|decl void bar () { - try { } catch (auto i) { } // { dg-error "invalid use of" } - try { } catch (auto) { } // { dg-error "invalid use of" } - try { } catch (auto *i) { } // { dg-error "invalid use of" } - try { } catch (auto *) { } // { dg-error "invalid use of" } + try { } catch (auto i) { } // { dg-error "parameter declared" } + try { } catch (auto) { } // { dg-error "parameter declared" } + try { } catch (auto *i) { } // { dg-error "parameter declared" } + try { } catch (auto *) { } // { dg-error "parameter declared" } } void