Bunch of location improvements

Message ID 8f2d7681-ce1f-15e9-02cf-b8fc83c6f284@oracle.com
State New
Headers show
Series
  • Bunch of location improvements
Related show

Commit Message

Paolo Carlini Sept. 2, 2019, 2:28 p.m.
Hi,

all should be more or less straightforward. I also propose to use an 
additional range for that error message about constinit && constexpr 
mentioned to Marek a few days ago. Tested x86_64-linux.

Thanks, Paolo.

/////////////////////////
/cp
2019-09-02  Paolo Carlini  <paolo.carlini@oracle.com>

	* decl.c (has_designator_problem): Use cp_expr_loc_or_input_loc
	in error_at.
	(build_enumerator): Likewise.
	(cp_finish_decl): Use DECL_SOURCE_LOCATION.
	(grokdeclarator): Use id_loc in two error_at; change errror
	message about constinit together constexpr to use two ranges.

/testsuite
2019-09-02  Paolo Carlini  <paolo.carlini@oracle.com>

	* g++.dg/cpp0x/enum29.C: Test location(s) too.
	* g++.dg/cpp0x/lambda/lambda-ice10.C: Likewise.
	* g++.dg/cpp2a/constinit3.C: Likewise.
	* g++.dg/ext/desig4.C: Likewise.
	* g++.dg/ext/label10.C: Likewise.
	* g++.old-deja/g++.other/dtor3.C: Likewise.

Comments

Paolo Carlini Sept. 9, 2019, 8:24 a.m. | #1
Hi,

On 02/09/19 16:28, Paolo Carlini wrote:
> Hi,

>

> all should be more or less straightforward. I also propose to use an 

> additional range for that error message about constinit && constexpr 

> mentioned to Marek a few days ago. Tested x86_64-linux.


I'm gently piniging this very early because the first time I forgot to 
add the C++ Patch tag.

     https://gcc.gnu.org/ml/gcc-patches/2019-09/msg00063.html

Cheers, Paolo.
Jason Merrill Sept. 9, 2019, 9:01 p.m. | #2
On 9/2/19 9:28 AM, Paolo Carlini wrote:
> Hi,

> 

> all should be more or less straightforward. I also propose to use an 

> additional range for that error message about constinit && constexpr 

> mentioned to Marek a few days ago. Tested x86_64-linux.

> 

> Thanks, Paolo.

> 

> /////////////////////////

> 


OK.

Jason

Patch

Index: cp/decl.c
===================================================================
--- cp/decl.c	(revision 275318)
+++ cp/decl.c	(working copy)
@@ -6108,8 +6108,9 @@  has_designator_problem (reshape_iter *d, tsubst_fl
   if (d->cur->index)
     {
       if (complain & tf_error)
-	error ("C99 designator %qE outside aggregate initializer",
-	       d->cur->index);
+	error_at (cp_expr_loc_or_input_loc (d->cur->index),
+		  "C99 designator %qE outside aggregate initializer",
+		  d->cur->index);
       else
 	return true;
     }
@@ -7282,8 +7283,9 @@  cp_finish_decl (tree decl, tree init, bool init_co
       if ((flags & LOOKUP_CONSTINIT)
 	  && !(dk == dk_thread || dk == dk_static))
 	{
-	  error ("%<constinit%> can only be applied to a variable with static "
-		 "or thread storage duration");
+	  error_at (DECL_SOURCE_LOCATION (decl),
+		    "%<constinit%> can only be applied to a variable with "
+		    "static or thread storage duration");
 	  return;
 	}
 
@@ -10622,8 +10624,9 @@  grokdeclarator (const cp_declarator *declarator,
 			     && !uniquely_derived_from_p (ctype,
 							  current_class_type))
 		      {
-			error ("invalid use of qualified-name %<%T::%D%>",
-			       qualifying_scope, decl);
+			error_at (id_declarator->id_loc,
+				  "invalid use of qualified-name %<%T::%D%>",
+				  qualifying_scope, decl);
 			return error_mark_node;
 		      }
 		  }
@@ -10810,8 +10813,9 @@  grokdeclarator (const cp_declarator *declarator,
      keywords shall appear in a decl-specifier-seq."  */
   if (constinit_p && constexpr_p)
     {
-      error_at (min_location (declspecs->locations[ds_constinit],
-			      declspecs->locations[ds_constexpr]),
+      gcc_rich_location richloc (declspecs->locations[ds_constinit]);
+      richloc.add_range (declspecs->locations[ds_constexpr]);
+      error_at (&richloc,
 		"can use at most one of the %<constinit%> and %<constexpr%> "
 		"specifiers");
       return error_mark_node;
@@ -11815,7 +11819,8 @@  grokdeclarator (const cp_declarator *declarator,
 		&& inner_declarator->u.id.sfk == sfk_destructor
 		&& arg_types != void_list_node)
 	      {
-		error ("destructors may not have parameters");
+		error_at (declarator->id_loc,
+			  "destructors may not have parameters");
 		arg_types = void_list_node;
 		parms = NULL_TREE;
 	      }
@@ -15155,8 +15160,9 @@  build_enumerator (tree name, tree value, tree enum
 	      if (! INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P
 		  (TREE_TYPE (value)))
 		{
-		  error ("enumerator value for %qD must have integral or "
-			 "unscoped enumeration type", name);
+		  error_at (cp_expr_loc_or_input_loc (value),
+			    "enumerator value for %qD must have integral or "
+			    "unscoped enumeration type", name);
 		  value = NULL_TREE;
 		}
 	      else
Index: testsuite/g++.dg/cpp0x/enum29.C
===================================================================
--- testsuite/g++.dg/cpp0x/enum29.C	(revision 275318)
+++ testsuite/g++.dg/cpp0x/enum29.C	(working copy)
@@ -38,7 +38,7 @@  enum E0 { e0 = X0() };
 enum E1 { e1 = X1() };
 enum E2 { e2 = X2() };
 enum E3 { e3 = X3() };
-enum E4 { e4 = X4() };  // { dg-error "integral" }
+enum E4 { e4 = X4() };  // { dg-error "16:enumerator value for .e4. must have integral" }
 enum E5 { e5 = X5() };  // { dg-error "ambiguous" }
 
 enum F0 : int { f0 = X0() };
Index: testsuite/g++.dg/cpp0x/lambda/lambda-ice10.C
===================================================================
--- testsuite/g++.dg/cpp0x/lambda/lambda-ice10.C	(revision 275318)
+++ testsuite/g++.dg/cpp0x/lambda/lambda-ice10.C	(working copy)
@@ -4,5 +4,5 @@ 
 template<int> struct A
 {
   static const int i;
-  template<int N> const int A<N>::i = []{ return 0; }(); // { dg-error "invalid use" }
+  template<int N> const int A<N>::i = []{ return 0; }(); // { dg-error "29:invalid use" }
 };
Index: testsuite/g++.dg/cpp2a/constinit3.C
===================================================================
--- testsuite/g++.dg/cpp2a/constinit3.C	(revision 275318)
+++ testsuite/g++.dg/cpp2a/constinit3.C	(working copy)
@@ -31,8 +31,8 @@  int
 fn1 ()
 {
   // Not static storage
-  constinit int a1 = 42; // { dg-error ".constinit. can only be applied to a variable with static or thread storage" }
-  constinit int a2 = 42; // { dg-error ".constinit. can only be applied to a variable with static or thread storage" }
+  constinit int a1 = 42; // { dg-error "17:.constinit. can only be applied to a variable with static or thread storage" }
+  constinit int a2 = 42; // { dg-error "17:.constinit. can only be applied to a variable with static or thread storage" }
   extern constinit int e1;
 
   return 0;
@@ -46,7 +46,7 @@  fn3 ()
 void
 fn2 (int i, constinit int p) // { dg-error "a parameter cannot be declared .constinit." }
 {
-  constinit auto l = [i](){ return i; }; // { dg-error ".constinit. can only be applied to a variable with static or thread storage" }
+  constinit auto l = [i](){ return i; }; // { dg-error "18:.constinit. can only be applied to a variable with static or thread storage" }
 }
 
 struct B { int d; };
Index: testsuite/g++.dg/ext/desig4.C
===================================================================
--- testsuite/g++.dg/ext/desig4.C	(revision 275318)
+++ testsuite/g++.dg/ext/desig4.C	(working copy)
@@ -1,18 +1,18 @@ 
 // PR c++/51458
 // { dg-options "" }
 
-char g[] = { [7] = "abcd" };	     // { dg-error "designator" }
+char g[] = { [7] = "abcd" };	     // { dg-error "15:designator .7." }
 int a = { .foo = 6 };		     // { dg-error "designator" }
-int b = { [0] = 1 };		     // { dg-error "designator" }
+int b = { [0] = 1 };		     // { dg-error "12:designator .0." }
 _Complex float c = { .foo = 0,  1 }; // { dg-error "designator" }
 				     // { dg-error "either all initializer clauses should be designated or none of them should be" "" { target c++2a } .-1 }
 				     // { dg-error "cannot convert" "" { target *-*-* } .-2 }
-_Complex float d = { [0] = 0,  1 };  // { dg-error "designator" }
+_Complex float d = { [0] = 0,  1 };  // { dg-error "23:designator .0." }
 				     // { dg-error "either all initializer clauses should be designated or none of them should be" "" { target c++2a } .-1 }
 				     // { dg-error "cannot convert" "" { target *-*-* } .-2 }
 _Complex float e = { 0, .foo = 1 };  // { dg-error "designator" }
 				     // { dg-error "either all initializer clauses should be designated or none of them should be" "" { target c++2a } .-1 }
 				     // { dg-error "cannot convert" "" { target *-*-* } .-2 }
-_Complex float f = { 0, [0] = 1 };   // { dg-error "designator" }
+_Complex float f = { 0, [0] = 1 };   // { dg-error "26:designator .0." }
 				     // { dg-error "either all initializer clauses should be designated or none of them should be" "" { target c++2a } .-1 }
 				     // { dg-error "cannot convert" "" { target *-*-* } .-2 }
Index: testsuite/g++.dg/ext/label10.C
===================================================================
--- testsuite/g++.dg/ext/label10.C	(revision 275318)
+++ testsuite/g++.dg/ext/label10.C	(working copy)
@@ -12,6 +12,6 @@  A<0> a;
 void foo ()
 {
   __label__ P;
-  enum { O = && P };	// { dg-error "cannot appear in|integral" }
+  enum { O = && P };	// { dg-error "14:enumerator value for .O. must have integral|cannot appear in" }
   P:;
 }
Index: testsuite/g++.old-deja/g++.other/dtor3.C
===================================================================
--- testsuite/g++.old-deja/g++.other/dtor3.C	(revision 275318)
+++ testsuite/g++.old-deja/g++.other/dtor3.C	(working copy)
@@ -2,7 +2,7 @@ 
 
 struct S1
 {
-  ~S1(int); // { dg-error "" } destructors may not have parameters
+  ~S1(int); // { dg-error "3:destructors may not have parameters" }
 };
 
 
@@ -9,13 +9,13 @@  struct S1
 template <class T>
 struct S2
 {
-  ~S2(int); // { dg-error "" } destructors may not have parameters
+  ~S2(int); // { dg-error "3:destructors may not have parameters" }
 };
 
 
 struct S3 
 {
-  ~S3(double) {} // { dg-error "" } destructors may not have parameters
+  ~S3(double) {} // { dg-error "3:destructors may not have parameters" }
 };
 
 
@@ -22,7 +22,7 @@  struct S3
 template <class T>
 struct S4
 {
-  ~S4(double) {} // { dg-error "" } destructors may not have parameters
+  ~S4(double) {} // { dg-error "3:destructors may not have parameters" }
 };