diff options
author | Jason Merrill <jason@redhat.com> | 2011-05-25 15:51:54 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2011-05-25 15:51:54 -0400 |
commit | ce9b1898e5516ed5cdc444f1c0de82de34939181 (patch) | |
tree | 4479a705d9bb9315f2625bd328fe3e0aeca05493 | |
parent | 5e24286319abceaee8846843c89c5c6332d25e51 (diff) | |
download | gcc-ce9b1898e5516ed5cdc444f1c0de82de34939181.zip gcc-ce9b1898e5516ed5cdc444f1c0de82de34939181.tar.gz gcc-ce9b1898e5516ed5cdc444f1c0de82de34939181.tar.bz2 |
re PR c++/46245 ([C++0x] rejects function with late-specified return type as a non-type template parameter)
PR c++/46245
* decl.c (grokdeclarator): Complain later for auto parameter.
* pt.c (splice_late_return_type): Handle use in a template
type-parameter.
From-SVN: r174227
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/decl.c | 12 | ||||
-rw-r--r-- | gcc/cp/pt.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/auto23.C | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/auto9.C | 8 |
6 files changed, 28 insertions, 11 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 72e62d7..d78f183 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2011-05-25 Jason Merrill <jason@redhat.com> + PR c++/46245 + * decl.c (grokdeclarator): Complain later for auto parameter. + * pt.c (splice_late_return_type): Handle use in a template + type-parameter. + PR c++/46696 * typeck.c (cp_build_modify_expr): Check DECL_DEFAULTED_FN. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index d87a837..8000441 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -8741,12 +8741,6 @@ grokdeclarator (const cp_declarator *declarator, || thread_p) error ("storage class specifiers invalid in parameter declarations"); - if (type_uses_auto (type)) - { - error ("parameter declared %<auto%>"); - type = error_mark_node; - } - /* Function parameters cannot be constexpr. If we saw one, moan and pretend it wasn't there. */ if (constexpr_p) @@ -9727,6 +9721,12 @@ grokdeclarator (const cp_declarator *declarator, if (ctype || in_namespace) error ("cannot use %<::%> in parameter declaration"); + if (type_uses_auto (type)) + { + error ("parameter declared %<auto%>"); + 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/ChangeLog b/gcc/testsuite/ChangeLog index 833d52e..3cc818a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2011-05-25 Jason Merrill <jason@redhat.com> + * g++.dg/cpp0x/auto23.C: New. + * g++.dg/cpp0x/auto9.C: Adjust. + * g++.dg/cpp0x/defaulted29.C: New. * g++.dg/cpp0x/initlist51.C: New. 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 } + +template<auto f()->int> 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 |