Commit 2a80d3ae by David Malcolm Committed by David Malcolm

C++: show private field accessor hints for const accesses (PR c++/84892)

gcc/cp/ChangeLog:
	PR c++/84892
	* search.c (field_accessor_p): Use class_of_this_parm rather than
	type_of_this_parm, to check that "this" is a "const T *", rather
	than a "T *const".

gcc/testsuite/ChangeLog:
	PR c++/84892
	* g++.dg/other/accessor-fixits-1.C
	(test_access_const_t1_color): New.
	(test_deref_const_t1_color): New.
	* g++.dg/other/accessor-fixits-5.C: New testcase.

From-SVN: r258716
parent 8bb406a2
2018-03-21 David Malcolm <dmalcolm@redhat.com>
PR c++/84892
* search.c (field_accessor_p): Use class_of_this_parm rather than
type_of_this_parm, to check that "this" is a "const T *", rather
than a "T *const".
2018-03-21 Nathan Sidwell <nathan@acm.org> 2018-03-21 Nathan Sidwell <nathan@acm.org>
* class.c (finish_struct_anon_r): Refactor, deprecate anything * class.c (finish_struct_anon_r): Refactor, deprecate anything
......
...@@ -1747,8 +1747,8 @@ field_accessor_p (tree fn, tree field_decl, bool const_p) ...@@ -1747,8 +1747,8 @@ field_accessor_p (tree fn, tree field_decl, bool const_p)
that the "this" parameter is const. */ that the "this" parameter is const. */
if (const_p) if (const_p)
{ {
tree this_type = type_of_this_parm (fntype); tree this_class = class_of_this_parm (fntype);
if (!TYPE_READONLY (this_type)) if (!TYPE_READONLY (this_class))
return false; return false;
} }
......
2018-03-21 David Malcolm <dmalcolm@redhat.com>
PR c++/84892
* g++.dg/other/accessor-fixits-1.C
(test_access_const_t1_color): New.
(test_deref_const_t1_color): New.
* g++.dg/other/accessor-fixits-5.C: New testcase.
2018-03-21 Tom de Vries <tom@codesourcery.com> 2018-03-21 Tom de Vries <tom@codesourcery.com>
PR tree-optimization/83126 PR tree-optimization/83126
......
...@@ -35,6 +35,28 @@ int test_access_t1_color (t1 &ref) ...@@ -35,6 +35,28 @@ int test_access_t1_color (t1 &ref)
{ dg-end-multiline-output "" } */ { dg-end-multiline-output "" } */
} }
int test_access_const_t1_color (const t1 &ref)
{
return ref.m_color; // { dg-error ".int t1::m_color. is private within this context" }
/* { dg-begin-multiline-output "" }
return ref.m_color;
^~~~~~~
{ dg-end-multiline-output "" } */
/* { dg-begin-multiline-output "" }
int m_color;
^~~~~~~
{ dg-end-multiline-output "" } */
// { dg-message "field .int t1::m_color. can be accessed via .int t1::get_color\\(\\) const." "" { target *-*-* } .-12 }
/* { dg-begin-multiline-output "" }
return ref.m_color;
^~~~~~~
get_color()
{ dg-end-multiline-output "" } */
}
int test_access_t1_shape (t1 &ref) int test_access_t1_shape (t1 &ref)
{ {
return ref.m_shape; // { dg-error ".int t1::m_shape. is protected within this context" } return ref.m_shape; // { dg-error ".int t1::m_shape. is protected within this context" }
...@@ -79,6 +101,28 @@ int test_deref_t1_color (t1 *ptr) ...@@ -79,6 +101,28 @@ int test_deref_t1_color (t1 *ptr)
{ dg-end-multiline-output "" } */ { dg-end-multiline-output "" } */
} }
int test_deref_const_t1_color (const t1 *ptr)
{
return ptr->m_color; // { dg-error ".int t1::m_color. is private within this context" }
/* { dg-begin-multiline-output "" }
return ptr->m_color;
^~~~~~~
{ dg-end-multiline-output "" } */
/* { dg-begin-multiline-output "" }
int m_color;
^~~~~~~
{ dg-end-multiline-output "" } */
// { dg-message "field .int t1::m_color. can be accessed via .int t1::get_color\\(\\) const." "" { target *-*-* } .-12 }
/* { dg-begin-multiline-output "" }
return ptr->m_color;
^~~~~~~
get_color()
{ dg-end-multiline-output "" } */
}
int test_deref_t1_shape (t1 *ptr) int test_deref_t1_shape (t1 *ptr)
{ {
return ptr->m_shape; // { dg-error ".int t1::m_shape. is protected within this context" } return ptr->m_shape; // { dg-error ".int t1::m_shape. is protected within this context" }
......
// PR c++/84892
// { dg-options "-fdiagnostics-show-caret" }
class S {
private:
bool field;
public:
bool get_field() const {
return field;
}
};
bool thingy(const S & s) {
return s.field; // { dg-error "'bool S::field' is private within this context" }
/* { dg-begin-multiline-output "" }
return s.field;
^~~~~
{ dg-end-multiline-output "" } */
// { dg-message "declared private here" "" { target *-*-* } 6 }
/* { dg-begin-multiline-output "" }
bool field;
^~~~~
{ dg-end-multiline-output "" } */
// { dg-message "field 'bool S::field' can be accessed via 'bool S::get_field\\(\\) const'" "" { target *-*-* } .-12 }
/* { dg-begin-multiline-output "" }
return s.field;
^~~~~
get_field()
{ dg-end-multiline-output "" } */
}
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