Commit 59ec4914 by Paolo Carlini Committed by Paolo Carlini

decl.c (grokdeclarator): Use locations[ds_storage_class] in error messages about…

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

/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
parent 2ea2a74d
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> 2019-01-16 Marek Polacek <polacek@redhat.com>
PR c++/78244 - narrowing conversion in template not detected. PR c++/78244 - narrowing conversion in template not detected.
......
...@@ -11902,36 +11902,43 @@ grokdeclarator (const cp_declarator *declarator, ...@@ -11902,36 +11902,43 @@ grokdeclarator (const cp_declarator *declarator,
if (storage_class == sc_mutable) if (storage_class == sc_mutable)
{ {
location_t sloc = declspecs->locations[ds_storage_class];
if (decl_context != FIELD || friendp) 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; storage_class = sc_none;
} }
else if (decl_context == TYPENAME || typedef_p) 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; storage_class = sc_none;
} }
else if (TREE_CODE (type) == FUNCTION_TYPE else if (TREE_CODE (type) == FUNCTION_TYPE
|| TREE_CODE (type) == METHOD_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; storage_class = sc_none;
} }
else if (staticp) 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; storage_class = sc_none;
} }
else if (type_quals & TYPE_QUAL_CONST) 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; storage_class = sc_none;
} }
else if (TYPE_REF_P (type)) else if (TYPE_REF_P (type))
{ {
permerror (input_location, "reference %qs cannot be declared " permerror (sloc, "reference %qs cannot be declared %<mutable%>",
"%<mutable%>", name); name);
storage_class = sc_none; storage_class = sc_none;
} }
} }
......
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> 2019-01-16 Marek Polacek <polacek@redhat.com>
PR c++/78244 - narrowing conversion in template not detected. PR c++/78244 - narrowing conversion in template not detected.
......
...@@ -2,5 +2,5 @@ ...@@ -2,5 +2,5 @@
/* { dg-options "-fpermissive" } */ /* { dg-options "-fpermissive" } */
class X { class X {
mutable int &q; /* { dg-warning "cannot be declared 'mutable'" } */ mutable int &q; /* { dg-warning "3:reference .q. cannot be declared .mutable." } */
}; };
/* { dg-do compile } */ /* { dg-do compile } */
class X { class X {
mutable int &q; /* { dg-error "cannot be declared 'mutable'" } */ mutable int &q; /* { dg-error "3:reference .q. cannot be declared .mutable." } */
}; };
...@@ -7,6 +7,6 @@ struct Bar ...@@ -7,6 +7,6 @@ struct Bar
{ {
void func(void) void func(void)
{ {
mutable Bar::type x; // { dg-error "" } mutable Bar::type x; // { dg-error "8:non-member .x. cannot be declared .mutable." }
} }
}; };
// { dg-do assemble } // { dg-do assemble }
// GROUPS passed error-messages // 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'.*
...@@ -3,5 +3,5 @@ ...@@ -3,5 +3,5 @@
class DaycountBasis { class DaycountBasis {
mutable const int * p; mutable const int * p;
mutable int * const q; // { dg-error "" } mutable int * const q; // { dg-error "3:.const. .q. cannot be declared .mutable." }
}; };
...@@ -11,16 +11,16 @@ struct A ...@@ -11,16 +11,16 @@ struct A
friend explicit B::B (); // { dg-error "" } only ctor decls can be explicit friend explicit B::B (); // { dg-error "" } only ctor decls can be explicit
int f(const); // { dg-error "" } ansi forbids no type int f(const); // { dg-error "" } ansi forbids no type
const k; // { 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 typedef int d; // { dg-error "" } non-object cannot be mutable
mutable int fn (); // { dg-error "" } non-object 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 "" } non-member 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 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 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 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 explicit A::A () {} // { dg-error "" } only ctor decls can be explicit
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment