decl.c (grokdeclarator): Use locations[ds_storage_class] in error messages about...
authorPaolo Carlini <paolo.carlini@oracle.com>
Wed, 16 Jan 2019 16:16:54 +0000 (16:16 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Wed, 16 Jan 2019 16:16:54 +0000 (16:16 +0000)
/cp
2019-01-16  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-16  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.

From-SVN: r267978

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/pr33558-2.C
gcc/testsuite/g++.dg/other/pr33558.C
gcc/testsuite/g++.dg/parse/crash4.C
gcc/testsuite/g++.old-deja/g++.brendan/err-msg11.C
gcc/testsuite/g++.old-deja/g++.mike/p7635.C
gcc/testsuite/g++.old-deja/g++.other/decl6.C

index 6adb0e44d7e5cbd5d5dd89dac795f29cbda0c5c7..50f00f2e4c4721c74460261dc95285fb27c2e067 100644 (file)
@@ -1,3 +1,8 @@
+2019-01-16  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * decl.c (grokdeclarator): Use locations[ds_storage_class] in
+       error messages about ill-formed uses of mutable.
+
 2019-01-16  Marek Polacek  <polacek@redhat.com>
 
        PR c++/78244 - narrowing conversion in template not detected.
index 8e1d12d8feb3f28fbaadc7f08858128cc615286b..9f96ebc19efe36a8f5e9c5de8c2aaa0178bb7e90 100644 (file)
@@ -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 df36f5e8315d710bd28fa8d7b87c9464bf71c1b9..6c11b84797eee9de3b1042923ec4910bd96f4ec3 100644 (file)
@@ -1,3 +1,12 @@
+2019-01-16  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.
+
 2019-01-16  Marek Polacek  <polacek@redhat.com>
 
        PR c++/78244 - narrowing conversion in template not detected.
index a8df840b7a8a1c90138b819c06c9b64a72bb7aa4..4b53977407416541795494061f9f93a32bf61f1f 100644 (file)
@@ -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 1a340af59724ccf2413808e4cbc211969dca285b..2372a5cb0fd64f3769b885e0a8bb75c1d2e1e88b 100644 (file)
@@ -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 a24f0dd003c1e5296c74004dffecbe2560c765e2..e5e95800c803676d50689b7b5919ea91e9a06e11 100644 (file)
@@ -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 abfe0e12753651b67cf900b6f4e6cbcd003ca855..3a405e8ea247954dddeade05935f787408bccd32 100644 (file)
@@ -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 ac31af202a5c06359ceefe79c7f0d7e5bb37e672..db7c56661c12ea929423205dd734d2ec6e1fdb1e 100644 (file)
@@ -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 40247b81eb4f926204e5d7cee4b94bf57a181668..60edc54c564f18455f30790385301a9bdf9c6a07 100644 (file)
@@ -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