From 5c27b6339932010631806a4c36f57ad909d3ce35 Mon Sep 17 00:00:00 2001 From: jason Date: Wed, 25 May 2011 20:29:54 +0000 Subject: [PATCH] PR c++/46245 * decl.c (grokdeclarator): Complain later for auto parameter. * pt.c (splice_late_return_type): Handle use in a template type-parameter. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@174234 138bc75d-0d04-0410-961f-82ee72b054a4 index 9e029d2..dbf03f9 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -8559,12 +8559,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) @@ -9550,6 +9544,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 c5f2422..3afeb9b 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -19061,7 +19061,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); } 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 -- 1.7.0.4