[C++] In grokdeclarator, use typespec_loc in error messages about 'auto' and trailing return type

Message ID d7683b31-c18b-0f20-b715-e93c55b51a0a@oracle.com
State New
Headers show
Series
  • [C++] In grokdeclarator, use typespec_loc in error messages about 'auto' and trailing return type
Related show

Commit Message

Paolo Carlini Jan. 17, 2019, 9:59 a.m.
Hi,

just use in more places the carefully constructed typespec_loc. Note for 
another time: the 'type name' we print for tests like cpp0x/auto52.C 
doesn't seem particularly clear to me. Tested x86_64-linux, as usual.

Thanks, Paolo.

////////////////////////
/cp
2019-01-17  Paolo Carlini  <paolo.carlini@oracle.com>

	* decl.c (grokdeclarator): Use typespec_loc in error messages
	about 'auto' and trailing return type.

/testsuite
2019-01-17  Paolo Carlini  <paolo.carlini@oracle.com>

	* g++.dg/cpp0x/auto52.C: Test locations too.
	* g++.dg/cpp0x/trailing2.C: Likewise.
	* g++.dg/cpp1y/auto-fn18.C: Likewise.
	* g++.dg/cpp1y/auto-fn25.C: Likewise.
	* g++.dg/cpp1y/auto-fn52.C: Likewise.
	* g++.dg/cpp1y/auto-fn53.C: Likewise.
	* g++.dg/cpp1y/auto-fn54.C: Likewise.

Comments

Jason Merrill Jan. 17, 2019, 5:39 p.m. | #1
On 1/17/19 4:59 AM, Paolo Carlini wrote:
> Hi,

> 

> just use in more places the carefully constructed typespec_loc. Note for 

> another time: the 'type name' we print for tests like cpp0x/auto52.C 

> doesn't seem particularly clear to me. Tested x86_64-linux, as usual.


OK.

Jason

Patch

Index: cp/decl.c
===================================================================
--- cp/decl.c	(revision 267986)
+++ cp/decl.c	(working copy)
@@ -11287,35 +11288,37 @@  grokdeclarator (const cp_declarator *declarator,
 			  /* OK for C++11 lambdas.  */;
 			else if (cxx_dialect < cxx14)
 			  {
-			    error ("%qs function uses "
-				   "%<auto%> type specifier without trailing "
-				   "return type", name);
-			    inform (input_location, "deduced return type "
-				    "only available with -std=c++14 or "
-				    "-std=gnu++14");
+			    error_at (typespec_loc, "%qs function uses "
+				      "%<auto%> type specifier without "
+				      "trailing return type", name);
+			    inform (typespec_loc,
+				    "deduced return type only available "
+				    "with -std=c++14 or -std=gnu++14");
 			  }
 			else if (virtualp)
 			  {
-			    error ("virtual function cannot "
-				   "have deduced return type");
+			    error_at (typespec_loc, "virtual function "
+				      "cannot have deduced return type");
 			    virtualp = false;
 			  }
 		      }
 		    else if (!is_auto (type) && sfk != sfk_conversion)
 		      {
-			error ("%qs function with trailing return type has"
-			       " %qT as its type rather than plain %<auto%>",
-			       name, type);
+			error_at (typespec_loc, "%qs function with trailing "
+				  "return type has %qT as its type rather "
+				  "than plain %<auto%>", name, type);
 			return error_mark_node;
 		      }
 		    else if (is_auto (type) && AUTO_IS_DECLTYPE (type))
 		      {
 			if (funcdecl_p)
-			  error ("%qs function with trailing return type has "
-				 "%<decltype(auto)%> as its type rather than "
-				 "plain %<auto%>", name);
+			  error_at (typespec_loc,
+				    "%qs function with trailing return type "
+				    "has %<decltype(auto)%> as its type "
+				    "rather than plain %<auto%>", name);
 			else
-			  error ("invalid use of %<decltype(auto)%>");
+			  error_at (typespec_loc,
+				    "invalid use of %<decltype(auto)%>");
 			return error_mark_node;
 		      }
 		    tree tmpl = CLASS_PLACEHOLDER_TEMPLATE (auto_node);
@@ -11359,11 +11362,13 @@  grokdeclarator (const cp_declarator *declarator,
 		    if (cxx_dialect < cxx11)
 		      /* Not using maybe_warn_cpp0x because this should
 			 always be an error.  */
-		      error ("trailing return type only available with "
-			     "-std=c++11 or -std=gnu++11");
+		      error_at (typespec_loc,
+				"trailing return type only available "
+				"with -std=c++11 or -std=gnu++11");
 		    else
-		      error ("%qs function with trailing return type not "
-			     "declared with %<auto%> type specifier", name);
+		      error_at (typespec_loc, "%qs function with trailing "
+				"return type not declared with %<auto%> "
+				"type specifier", name);
 		    return error_mark_node;
 		  }
 	      }
Index: testsuite/g++.dg/cpp0x/auto52.C
===================================================================
--- testsuite/g++.dg/cpp0x/auto52.C	(revision 267977)
+++ testsuite/g++.dg/cpp0x/auto52.C	(working copy)
@@ -2,5 +2,5 @@ 
 // { dg-do compile { target c++11 } }
 
 using T = auto() -> int;
-using U = void() -> int; // { dg-error "function with trailing return type not declared with .auto." }
-using W = auto(); // { dg-error "invalid use of .auto." }
+using U = void() -> int; // { dg-error "11:.type name. function with trailing return type not declared with .auto." }
+using W = auto(); // { dg-error "11:invalid use of .auto." }
Index: testsuite/g++.dg/cpp0x/trailing2.C
===================================================================
--- testsuite/g++.dg/cpp0x/trailing2.C	(revision 267977)
+++ testsuite/g++.dg/cpp0x/trailing2.C	(working copy)
@@ -3,14 +3,14 @@ 
 // { dg-do compile { target c++11 } }
 
 auto f1 () -> int;
-auto f2 ();		// { dg-error "without trailing return type" "" { target { ! c++14 } } }
-int f3 () -> int;	// { dg-error "trailing return type" }
-auto *f4 () -> int;	// { dg-error "trailing return type" }
+auto f2 ();		// { dg-error "1:.f2. function uses .auto. type specifier without trailing return type" "" { target { ! c++14 } } }
+int f3 () -> int;	// { dg-error "1:.f3. function with trailing return type" }
+auto *f4 () -> int;	// { dg-error "1:.f4. function with trailing return type" }
 
 struct A
 {
   auto f5 () const -> int;
-  auto f6 ();		// { dg-error "without trailing return type" "" { target { ! c++14 } } }
-  int f7 () -> int;	// { dg-error "trailing return type" }
-  auto *f8 () -> int;	// { dg-error "trailing return type" }
+  auto f6 ();		// { dg-error "3:.f6. function uses .auto. type specifier without trailing return type" "" { target { ! c++14 } } }
+  int f7 () -> int;	// { dg-error "3:.f7. function with trailing return type" }
+  auto *f8 () -> int;	// { dg-error "3:.f8. function with trailing return type" }
 };
Index: testsuite/g++.dg/cpp1y/auto-fn18.C
===================================================================
--- testsuite/g++.dg/cpp1y/auto-fn18.C	(revision 267977)
+++ testsuite/g++.dg/cpp1y/auto-fn18.C	(working copy)
@@ -3,7 +3,7 @@ 
 struct A
 {
   virtual int f() { return 1; }	 // { dg-message "overridden" }
-  virtual auto g() { return 1; } // { dg-error "virtual" }
+  virtual auto g() { return 1; } // { dg-error "11:virtual" }
 };
 
 struct B: A
Index: testsuite/g++.dg/cpp1y/auto-fn25.C
===================================================================
--- testsuite/g++.dg/cpp1y/auto-fn25.C	(revision 267977)
+++ testsuite/g++.dg/cpp1y/auto-fn25.C	(working copy)
@@ -5,7 +5,7 @@ 
 
 struct A
 {
-  virtual auto foo() {}		// { dg-error "virtual.*deduced" }
+  virtual auto foo() {}		// { dg-error "11:virtual.*deduced" }
 };
 
 struct B : A
Index: testsuite/g++.dg/cpp1y/auto-fn52.C
===================================================================
--- testsuite/g++.dg/cpp1y/auto-fn52.C	(revision 267977)
+++ testsuite/g++.dg/cpp1y/auto-fn52.C	(working copy)
@@ -1,4 +1,4 @@ 
 // PR c++/67012
 // { dg-do compile { target c++14 } }
 
-decltype(auto) f() -> int; // { dg-error "function with trailing return type has" }
+decltype(auto) f() -> int; // { dg-error "1:.f. function with trailing return type has" }
Index: testsuite/g++.dg/cpp1y/auto-fn53.C
===================================================================
--- testsuite/g++.dg/cpp1y/auto-fn53.C	(revision 267977)
+++ testsuite/g++.dg/cpp1y/auto-fn53.C	(working copy)
@@ -1,4 +1,4 @@ 
 // PR c++/86942
 // { dg-do compile { target c++14 } }
 
-using T = decltype(auto) () -> int; // { dg-error "invalid use of" }
+using T = decltype(auto) () -> int; // { dg-error "11:invalid use of" }
Index: testsuite/g++.dg/cpp1y/auto-fn54.C
===================================================================
--- testsuite/g++.dg/cpp1y/auto-fn54.C	(revision 267977)
+++ testsuite/g++.dg/cpp1y/auto-fn54.C	(working copy)
@@ -1,3 +1,3 @@ 
 // { dg-do compile { target c++14 } }
 
-using T = int () -> decltype(auto); // { dg-error "function with trailing return type not declared with .auto." }
+using T = int () -> decltype(auto); // { dg-error "11:.type name. function with trailing return type not declared with .auto." }