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