[C++] Use locations[ds_storage_class] in error messages about ill-formed uses of mutable

Message ID b84eafda-34fd-c8a3-ed12-06840db7ee05@oracle.com
State New
Headers show
Series
  • [C++] Use locations[ds_storage_class] in error messages about ill-formed uses of mutable
Related show

Commit Message

Paolo Carlini Jan. 15, 2019, 4:58 p.m.
Hi,

something a little different from my last patches but nevertheless 
pretty straightforward (noticed while I was wondering whether we should 
immediately move the location_t grokdeclarator local even further up). 
Tested x86_64-linux, as usual.

Thanks, Paolo.

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

	* decl.c (grokdeclarator): Use locations[ds_storage_class] in
	error messages about ill-formed uses of mutable.

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

	* g++.dg/other/pr33558.C: Test location too.
	* g++.dg/other/pr33558-2.C: Likewise.
	* g++.dg/parse/crash4.C: Likewise.
	* g++.old-deja/g++.brendan/err-msg11.C: Likewise.
	* g++.old-deja/g++.mike/p7635.C: Likewise.
	* g++.old-deja/g++.other/decl6.C: Likewise.

Comments

Martin Sebor Jan. 15, 2019, 8:42 p.m. | #1
On 1/15/19 9:58 AM, Paolo Carlini wrote:
> Hi,

> 

> something a little different from my last patches but nevertheless 

> pretty straightforward (noticed while I was wondering whether we should 

> immediately move the location_t grokdeclarator local even further up). 

> Tested x86_64-linux, as usual.


Since you're already making changes to the tests, would be too much
more work to also add quoting around static and const in the error
messages below where mutable is already quoted:

-	  error ("static %qs cannot be declared %<mutable%>", name);
+	  error_at (sloc, "static %qs cannot be declared %<mutable%>", name);
  	  storage_class = sc_none;
  	}
        else if (type_quals & TYPE_QUAL_CONST)
  	{
-	  error ("const %qs cannot be declared %<mutable%>", name);
+	  error_at (sloc, "const %qs cannot be declared %<mutable%>", name);

(I can see it being a hassle if there were many other tests where
the messages expect to find static and const with no quotes.)

Martin
Paolo Carlini Jan. 15, 2019, 10:27 p.m. | #2
Hi Martin,

On 15/01/19 21:42, Martin Sebor wrote:
> On 1/15/19 9:58 AM, Paolo Carlini wrote:

>> Hi,

>>

>> something a little different from my last patches but nevertheless 

>> pretty straightforward (noticed while I was wondering whether we 

>> should immediately move the location_t grokdeclarator local even 

>> further up). Tested x86_64-linux, as usual.

>

> Since you're already making changes to the tests, would be too much

> more work to also add quoting around static and const in the error

> messages below where mutable is already quoted:

>

> -      error ("static %qs cannot be declared %<mutable%>", name);

> +      error_at (sloc, "static %qs cannot be declared %<mutable%>", 

> name);

>        storage_class = sc_none;

>      }

>        else if (type_quals & TYPE_QUAL_CONST)

>      {

> -      error ("const %qs cannot be declared %<mutable%>", name);

> +      error_at (sloc, "const %qs cannot be declared %<mutable%>", name);

>

> (I can see it being a hassle if there were many other tests where

> the messages expect to find static and const with no quotes.)


No problem, that's not the case. I'm finishing testing the below, then.

Thanks, Paolo.

////////////////////
Index: cp/decl.c
===================================================================
--- cp/decl.c	(revision 267932)
+++ cp/decl.c	(working copy)
@@ -11902,36 +11902,43 @@ grokdeclarator (const cp_declarator *declarator,
 
   if (storage_class == sc_mutable)
     {
+      location_t sloc = declspecs->locations[ds_storage_class];
       if (decl_context != FIELD || friendp)
 	{
-	  error ("non-member %qs cannot be declared %<mutable%>", name);
+	  error_at (sloc, "non-member %qs cannot be declared %<mutable%>",
+		    name);
 	  storage_class = sc_none;
 	}
       else if (decl_context == TYPENAME || typedef_p)
 	{
-	  error ("non-object member %qs cannot be declared %<mutable%>", name);
+	  error_at (sloc,
+		    "non-object member %qs cannot be declared %<mutable%>",
+		    name);
 	  storage_class = sc_none;
 	}
       else if (TREE_CODE (type) == FUNCTION_TYPE
 	       || TREE_CODE (type) == METHOD_TYPE)
 	{
-	  error ("function %qs cannot be declared %<mutable%>", name);
+	  error_at (sloc, "function %qs cannot be declared %<mutable%>",
+		    name);
 	  storage_class = sc_none;
 	}
       else if (staticp)
 	{
-	  error ("static %qs cannot be declared %<mutable%>", name);
+	  error_at (sloc, "%<static%> %qs cannot be declared %<mutable%>",
+		    name);
 	  storage_class = sc_none;
 	}
       else if (type_quals & TYPE_QUAL_CONST)
 	{
-	  error ("const %qs cannot be declared %<mutable%>", name);
+	  error_at (sloc, "%<const%> %qs cannot be declared %<mutable%>",
+		    name);
 	  storage_class = sc_none;
 	}
       else if (TYPE_REF_P (type))
 	{
-	  permerror (input_location, "reference %qs cannot be declared "
-	             "%<mutable%>", name);
+	  permerror (sloc, "reference %qs cannot be declared %<mutable%>",
+		     name);
 	  storage_class = sc_none;
 	}
     }
Index: testsuite/g++.dg/other/pr33558-2.C
===================================================================
--- testsuite/g++.dg/other/pr33558-2.C	(revision 267931)
+++ testsuite/g++.dg/other/pr33558-2.C	(working copy)
@@ -2,5 +2,5 @@
 /* { dg-options "-fpermissive" } */
 
 class X {
-  mutable int &q; /* { dg-warning "cannot be declared 'mutable'" } */
+  mutable int &q; /* { dg-warning "3:reference .q. cannot be declared .mutable." } */
 };
Index: testsuite/g++.dg/other/pr33558.C
===================================================================
--- testsuite/g++.dg/other/pr33558.C	(revision 267931)
+++ testsuite/g++.dg/other/pr33558.C	(working copy)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
 
 class X {
-  mutable int &q; /* { dg-error "cannot be declared 'mutable'" } */
+  mutable int &q; /* { dg-error "3:reference .q. cannot be declared .mutable." } */
 };
Index: testsuite/g++.dg/parse/crash4.C
===================================================================
--- testsuite/g++.dg/parse/crash4.C	(revision 267931)
+++ testsuite/g++.dg/parse/crash4.C	(working copy)
@@ -7,6 +7,6 @@ struct Bar
  {
      void func(void)
      {
-       mutable Bar::type x; // { dg-error "" }
+       mutable Bar::type x; // { dg-error "8:non-member .x. cannot be declared .mutable." }
      }
  };
Index: testsuite/g++.old-deja/g++.brendan/err-msg11.C
===================================================================
--- testsuite/g++.old-deja/g++.brendan/err-msg11.C	(revision 267931)
+++ testsuite/g++.old-deja/g++.brendan/err-msg11.C	(working copy)
@@ -1,3 +1,3 @@
 // { dg-do assemble  }
 // GROUPS passed error-messages
-void foo (mutable int x);// { dg-error "" }  non-member `x' cannot be declared `mutable'.*
+void foo (mutable int x);// { dg-error "11:non-member .x. cannot be declared .mutable." }  non-member `x' cannot be declared `mutable'.*
Index: testsuite/g++.old-deja/g++.mike/p7635.C
===================================================================
--- testsuite/g++.old-deja/g++.mike/p7635.C	(revision 267931)
+++ testsuite/g++.old-deja/g++.mike/p7635.C	(working copy)
@@ -3,5 +3,5 @@
 
 class DaycountBasis {
   mutable const int * p;
-  mutable int * const q;	// { dg-error "" } 
+  mutable int * const q;	// { dg-error "3:.const. .q. cannot be declared .mutable." } 
 };
Index: testsuite/g++.old-deja/g++.other/decl6.C
===================================================================
--- testsuite/g++.old-deja/g++.other/decl6.C	(revision 267931)
+++ testsuite/g++.old-deja/g++.other/decl6.C	(working copy)
@@ -11,16 +11,16 @@ struct A
   friend explicit B::B ();    // { dg-error "" } only ctor decls can be explicit
   int f(const);               // { dg-error "" } ansi forbids no type
   const k;                    // { dg-error "" } ansi forbids no type
-  mutable friend int j1 ();   // { dg-error "" } non-member cannot be mutable
+  mutable friend int j1 ();   // { dg-error "3:storage class specifiers" } non-member cannot be mutable
   mutable typedef int d;      // { dg-error "" } non-object cannot be mutable
-  mutable int fn ();          // { dg-error "" } non-object cannot be mutable
-  void fn (mutable int);      // { dg-error "" } non-member cannot be mutable
+  mutable int fn ();          // { dg-error "3:function .fn. cannot be declared .mutable." } non-object cannot be mutable
+  void fn (mutable int);      // { dg-error "12:non-member .parameter. cannot be declared .mutable." } non-member cannot be mutable
   mutable static int s;       // { dg-error "" } static cannot be mutable
-  mutable const int s1;       // { dg-error "" } const cannot be mutable
+  mutable const int s1;       // { dg-error "3:.const. .s1. cannot be declared .mutable." } const cannot be mutable
   mutable const int *s2;      // ok
-  mutable int *const s3;      // { dg-error "" } const cannot be mutable
+  mutable int *const s3;      // { dg-error "3:.const. .s3. cannot be declared .mutable." } const cannot be mutable
   explicit A ();              // ok
 };
-mutable int g;                // { dg-error "" } non-member cannot be mutable
+mutable int g;                // { dg-error "1:non-member .g. cannot be declared .mutable." } non-member cannot be mutable
 explicit A::A () {}           // { dg-error "" } only ctor decls can be explicit
Jason Merrill Jan. 16, 2019, 3:57 p.m. | #3
On 1/15/19 5:27 PM, Paolo Carlini wrote:
> Hi Martin,

> 

> On 15/01/19 21:42, Martin Sebor wrote:

>> On 1/15/19 9:58 AM, Paolo Carlini wrote:

>>> Hi,

>>>

>>> something a little different from my last patches but nevertheless 

>>> pretty straightforward (noticed while I was wondering whether we 

>>> should immediately move the location_t grokdeclarator local even 

>>> further up). Tested x86_64-linux, as usual.

>>

>> Since you're already making changes to the tests, would be too much

>> more work to also add quoting around static and const in the error

>> messages below where mutable is already quoted:

>>

>> -      error ("static %qs cannot be declared %<mutable%>", name);

>> +      error_at (sloc, "static %qs cannot be declared %<mutable%>", 

>> name);

>>        storage_class = sc_none;

>>      }

>>        else if (type_quals & TYPE_QUAL_CONST)

>>      {

>> -      error ("const %qs cannot be declared %<mutable%>", name);

>> +      error_at (sloc, "const %qs cannot be declared %<mutable%>", name);

>>

>> (I can see it being a hassle if there were many other tests where

>> the messages expect to find static and const with no quotes.)

> 

> No problem, that's not the case. I'm finishing testing the below, then.


OK.

Jason

Patch

Index: cp/decl.c
===================================================================
--- cp/decl.c	(revision 267932)
+++ cp/decl.c	(working copy)
@@ -11902,36 +11902,40 @@  grokdeclarator (const cp_declarator *declarator,
 
   if (storage_class == sc_mutable)
     {
+      location_t sloc = declspecs->locations[ds_storage_class];
       if (decl_context != FIELD || friendp)
 	{
-	  error ("non-member %qs cannot be declared %<mutable%>", name);
+	  error_at (sloc, "non-member %qs cannot be declared %<mutable%>",
+		    name);
 	  storage_class = sc_none;
 	}
       else if (decl_context == TYPENAME || typedef_p)
 	{
-	  error ("non-object member %qs cannot be declared %<mutable%>", name);
+	  error_at (sloc,
+		    "non-object member %qs cannot be declared %<mutable%>",
+		    name);
 	  storage_class = sc_none;
 	}
       else if (TREE_CODE (type) == FUNCTION_TYPE
 	       || TREE_CODE (type) == METHOD_TYPE)
 	{
-	  error ("function %qs cannot be declared %<mutable%>", name);
+	  error_at (sloc, "function %qs cannot be declared %<mutable%>", name);
 	  storage_class = sc_none;
 	}
       else if (staticp)
 	{
-	  error ("static %qs cannot be declared %<mutable%>", name);
+	  error_at (sloc, "static %qs cannot be declared %<mutable%>", name);
 	  storage_class = sc_none;
 	}
       else if (type_quals & TYPE_QUAL_CONST)
 	{
-	  error ("const %qs cannot be declared %<mutable%>", name);
+	  error_at (sloc, "const %qs cannot be declared %<mutable%>", name);
 	  storage_class = sc_none;
 	}
       else if (TYPE_REF_P (type))
 	{
-	  permerror (input_location, "reference %qs cannot be declared "
-	             "%<mutable%>", name);
+	  permerror (sloc, "reference %qs cannot be declared %<mutable%>",
+		     name);
 	  storage_class = sc_none;
 	}
     }
Index: testsuite/g++.dg/other/pr33558-2.C
===================================================================
--- testsuite/g++.dg/other/pr33558-2.C	(revision 267931)
+++ testsuite/g++.dg/other/pr33558-2.C	(working copy)
@@ -2,5 +2,5 @@ 
 /* { dg-options "-fpermissive" } */
 
 class X {
-  mutable int &q; /* { dg-warning "cannot be declared 'mutable'" } */
+  mutable int &q; /* { dg-warning "3:reference .q. cannot be declared .mutable." } */
 };
Index: testsuite/g++.dg/other/pr33558.C
===================================================================
--- testsuite/g++.dg/other/pr33558.C	(revision 267931)
+++ testsuite/g++.dg/other/pr33558.C	(working copy)
@@ -1,5 +1,5 @@ 
 /* { dg-do compile } */
 
 class X {
-  mutable int &q; /* { dg-error "cannot be declared 'mutable'" } */
+  mutable int &q; /* { dg-error "3:reference .q. cannot be declared .mutable." } */
 };
Index: testsuite/g++.dg/parse/crash4.C
===================================================================
--- testsuite/g++.dg/parse/crash4.C	(revision 267931)
+++ testsuite/g++.dg/parse/crash4.C	(working copy)
@@ -7,6 +7,6 @@  struct Bar
  {
      void func(void)
      {
-       mutable Bar::type x; // { dg-error "" }
+       mutable Bar::type x; // { dg-error "8:non-member .x. cannot be declared .mutable." }
      }
  };
Index: testsuite/g++.old-deja/g++.brendan/err-msg11.C
===================================================================
--- testsuite/g++.old-deja/g++.brendan/err-msg11.C	(revision 267931)
+++ testsuite/g++.old-deja/g++.brendan/err-msg11.C	(working copy)
@@ -1,3 +1,3 @@ 
 // { dg-do assemble  }
 // GROUPS passed error-messages
-void foo (mutable int x);// { dg-error "" }  non-member `x' cannot be declared `mutable'.*
+void foo (mutable int x);// { dg-error "11:non-member .x. cannot be declared .mutable." }  non-member `x' cannot be declared `mutable'.*
Index: testsuite/g++.old-deja/g++.mike/p7635.C
===================================================================
--- testsuite/g++.old-deja/g++.mike/p7635.C	(revision 267931)
+++ testsuite/g++.old-deja/g++.mike/p7635.C	(working copy)
@@ -3,5 +3,5 @@ 
 
 class DaycountBasis {
   mutable const int * p;
-  mutable int * const q;	// { dg-error "" } 
+  mutable int * const q;	// { dg-error "3:const .q. cannot be declared .mutable." } 
 };
Index: testsuite/g++.old-deja/g++.other/decl6.C
===================================================================
--- testsuite/g++.old-deja/g++.other/decl6.C	(revision 267931)
+++ testsuite/g++.old-deja/g++.other/decl6.C	(working copy)
@@ -11,16 +11,16 @@  struct A
   friend explicit B::B ();    // { dg-error "" } only ctor decls can be explicit
   int f(const);               // { dg-error "" } ansi forbids no type
   const k;                    // { dg-error "" } ansi forbids no type
-  mutable friend int j1 ();   // { dg-error "" } non-member cannot be mutable
+  mutable friend int j1 ();   // { dg-error "3:storage class specifiers" } non-member cannot be mutable
   mutable typedef int d;      // { dg-error "" } non-object cannot be mutable
-  mutable int fn ();          // { dg-error "" } non-object cannot be mutable
-  void fn (mutable int);      // { dg-error "" } non-member cannot be mutable
+  mutable int fn ();          // { dg-error "3:function .fn. cannot be declared .mutable." } non-object cannot be mutable
+  void fn (mutable int);      // { dg-error "12:non-member .parameter. cannot be declared .mutable." } non-member cannot be mutable
   mutable static int s;       // { dg-error "" } static cannot be mutable
-  mutable const int s1;       // { dg-error "" } const cannot be mutable
+  mutable const int s1;       // { dg-error "3:const .s1. cannot be declared .mutable." } const cannot be mutable
   mutable const int *s2;      // ok
-  mutable int *const s3;      // { dg-error "" } const cannot be mutable
+  mutable int *const s3;      // { dg-error "3:const .s3. cannot be declared .mutable." } const cannot be mutable
   explicit A ();              // ok
 };
-mutable int g;                // { dg-error "" } non-member cannot be mutable
+mutable int g;                // { dg-error "1:non-member .g. cannot be declared .mutable." } non-member cannot be mutable
 explicit A::A () {}           // { dg-error "" } only ctor decls can be explicit