Commit ce9b1898 by Jason Merrill Committed by Jason Merrill

re PR c++/46245 ([C++0x] rejects function with late-specified return type as a…

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
parent 5e242863
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.
......
......@@ -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. */
......
......@@ -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);
}
......
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.
......
// PR c++/46245
// { dg-options -std=c++0x }
template<auto f()->int> struct A { };
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment