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 | expand |
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
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
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
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