Commit 0cfabb37 by Ville Voutilainen Committed by Jason Merrill

Reject trailing return type for an operator auto().

	* decl.c (grokdeclarator): Reject trailing return types for
	all conversion operators, don't handle conversion operators
	in the previous checks that deal with auto.

From-SVN: r222248
parent cb864fbc
2015-04-20 Ville Voutilainen <ville.voutilainen@gmail.com>
Reject trailing return type for an operator auto().
* decl.c (grokdeclarator): Reject trailing return types for
all conversion operators, don't handle conversion operators
in the previous checks that deal with auto.
2015-04-20 Ilya Verbin <ilya.verbin@intel.com> 2015-04-20 Ilya Verbin <ilya.verbin@intel.com>
* parser.c (cp_parser_omp_target_update): Add missed %> to error_at (). * parser.c (cp_parser_omp_target_update): Add missed %> to error_at ().
......
...@@ -9782,7 +9782,7 @@ grokdeclarator (const cp_declarator *declarator, ...@@ -9782,7 +9782,7 @@ grokdeclarator (const cp_declarator *declarator,
virtualp = false; virtualp = false;
} }
} }
else if (!is_auto (type)) else if (!is_auto (type) && sfk != sfk_conversion)
{ {
error ("%qs function with trailing return type has" error ("%qs function with trailing return type has"
" %qT as its type rather than plain %<auto%>", " %qT as its type rather than plain %<auto%>",
...@@ -9790,7 +9790,8 @@ grokdeclarator (const cp_declarator *declarator, ...@@ -9790,7 +9790,8 @@ grokdeclarator (const cp_declarator *declarator,
return error_mark_node; return error_mark_node;
} }
} }
else if (declarator->u.function.late_return_type) else if (declarator->u.function.late_return_type
&& sfk != sfk_conversion)
{ {
if (cxx_dialect < cxx11) if (cxx_dialect < cxx11)
/* Not using maybe_warn_cpp0x because this should /* Not using maybe_warn_cpp0x because this should
...@@ -9899,6 +9900,8 @@ grokdeclarator (const cp_declarator *declarator, ...@@ -9899,6 +9900,8 @@ grokdeclarator (const cp_declarator *declarator,
maybe_warn_cpp0x (CPP0X_EXPLICIT_CONVERSION); maybe_warn_cpp0x (CPP0X_EXPLICIT_CONVERSION);
explicitp = 2; explicitp = 2;
} }
if (late_return_type_p)
error ("a conversion function cannot have a trailing return type");
} }
arg_types = grokparms (declarator->u.function.parameters, arg_types = grokparms (declarator->u.function.parameters,
......
...@@ -21,8 +21,8 @@ struct A ...@@ -21,8 +21,8 @@ struct A
struct A2 struct A2
{ {
operator auto () -> int; // { dg-error "invalid use of" "" { target { ! c++14 } } } operator auto () -> int; // { dg-error "invalid use of|trailing return type" }
operator auto *() -> int; // { dg-error "auto" } operator auto*() -> int; // { dg-error "invalid use of|trailing return type" }
}; };
template <typename> struct B template <typename> struct B
......
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