diff mbox

[C++] Reject trailing return type for operator auto()

Message ID CAFk2RUabyC7nUNE_U6AZcYdJkBurBmO8rqMjRrdMxM6OzRvq6w@mail.gmail.com
State New
Headers show

Commit Message

Ville Voutilainen Dec. 19, 2014, 7:21 a.m. UTC
Tested on Linux-x64.

/cp
2014-12-19  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.

/testsuite
2014-12-19  Ville Voutilainen  <ville.voutilainen@gmail.com>

    Reject trailing return type for an operator auto().
    * g++.dg/cpp0x/auto9.C: Adjust.

Comments

Jason Merrill April 17, 2015, 2:10 p.m. UTC | #1
OK.

Jason
diff mbox

Patch

diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index bbaf3d6..5ff8cab 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -9775,7 +9775,7 @@  grokdeclarator (const cp_declarator *declarator,
 			    virtualp = false;
 			  }
 		      }
-		    else if (!is_auto (type))
+		    else if (!is_auto (type) && sfk != sfk_conversion)
 		      {
 			error ("%qs function with trailing return type has"
 			       " %qT as its type rather than plain %<auto%>",
@@ -9783,7 +9783,8 @@  grokdeclarator (const cp_declarator *declarator,
 			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)
 		      /* Not using maybe_warn_cpp0x because this should
@@ -9892,6 +9893,8 @@  grokdeclarator (const cp_declarator *declarator,
 		    maybe_warn_cpp0x (CPP0X_EXPLICIT_CONVERSION);
 		    explicitp = 2;
 		  }
+		if (late_return_type_p)
+		  error ("a conversion function cannot have a trailing return type");
 	      }
 
 	    arg_types = grokparms (declarator->u.function.parameters,
diff --git a/gcc/testsuite/g++.dg/cpp0x/auto9.C b/gcc/testsuite/g++.dg/cpp0x/auto9.C
index 0c0f39f..83efbaa 100644
--- a/gcc/testsuite/g++.dg/cpp0x/auto9.C
+++ b/gcc/testsuite/g++.dg/cpp0x/auto9.C
@@ -21,8 +21,8 @@  struct A
 
 struct A2
 {
-  operator auto () -> int;			// { dg-error "invalid use of" "" { target { ! c++14 } } }
-  operator auto *() -> int;			// { dg-error "auto" }
+  operator auto () -> int;			// { dg-error "invalid use of|trailing return type" }
+  operator auto*() -> int;			// { dg-error "invalid use of|trailing return type" }
 };
 
 template <typename> struct B