diff options
author | David Malcolm <dmalcolm@redhat.com> | 2018-03-21 18:21:39 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2018-03-21 18:21:39 +0000 |
commit | 5afef8b119ac69393900a8be42cc6b69ad0bcbd0 (patch) | |
tree | 48589739cf60c87d4370d731f0c5249f6d771e0c /gcc | |
parent | aa3dd75327228f00df19070afac6a99a06b04f60 (diff) | |
download | gcc-5afef8b119ac69393900a8be42cc6b69ad0bcbd0.zip gcc-5afef8b119ac69393900a8be42cc6b69ad0bcbd0.tar.gz gcc-5afef8b119ac69393900a8be42cc6b69ad0bcbd0.tar.bz2 |
C++: show private field accessor hints with -g and optimization (PR c++/84994)
gcc/cp/ChangeLog:
PR c++/84994
* constexpr.c (constexpr_fn_retval): Make non-"static".
* cp-tree.h (constexpr_fn_retval): New decl.
* search.c (direct_accessor_p): Update leading comment.
(reference_accessor_p): Likewise.
(field_accessor_p): Replace check that function body is a
RETURN_EXPR with a call to constexpr_fn_retval. Fix
indentation of "field_type" decl.
gcc/testsuite/ChangeLog:
PR c++/84994
* g++.dg/other/accessor-fixits-1.C: Move to...
* g++.dg/torture/accessor-fixits-1.C: ...here.
* g++.dg/other/accessor-fixits-2.C: Move to...
* g++.dg/torture/accessor-fixits-2.C: ...here.
* g++.dg/other/accessor-fixits-3.C: Move to...
* g++.dg/torture/accessor-fixits-3.C: ...here.
* g++.dg/other/accessor-fixits-4.C: Move to...
* g++.dg/torture/accessor-fixits-4.C: ...here.
* g++.dg/other/accessor-fixits-5.C: Move to...
* g++.dg/torture/accessor-fixits-5.C: ...here.
* g++.dg/torture/accessor-fixits-6.C: New testcase.
* g++.dg/torture/accessor-fixits-7.C: New testcase.
* g++.dg/torture/accessor-fixits-8.C: New testcase.
From-SVN: r258731
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/cp/constexpr.c | 2 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 1 | ||||
-rw-r--r-- | gcc/cp/search.c | 21 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 17 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/accessor-fixits-1.C (renamed from gcc/testsuite/g++.dg/other/accessor-fixits-1.C) | 0 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/accessor-fixits-2.C (renamed from gcc/testsuite/g++.dg/other/accessor-fixits-2.C) | 0 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/accessor-fixits-3.C (renamed from gcc/testsuite/g++.dg/other/accessor-fixits-3.C) | 0 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/accessor-fixits-4.C (renamed from gcc/testsuite/g++.dg/other/accessor-fixits-4.C) | 0 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/accessor-fixits-5.C (renamed from gcc/testsuite/g++.dg/other/accessor-fixits-5.C) | 0 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/accessor-fixits-6.C | 22 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/accessor-fixits-7.C | 22 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/accessor-fixits-8.C | 31 |
13 files changed, 116 insertions, 11 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8fc9314..c8b6b17 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,14 @@ +2018-03-21 David Malcolm <dmalcolm@redhat.com> + + PR c++/84994 + * constexpr.c (constexpr_fn_retval): Make non-"static". + * cp-tree.h (constexpr_fn_retval): New decl. + * search.c (direct_accessor_p): Update leading comment. + (reference_accessor_p): Likewise. + (field_accessor_p): Replace check that function body is a + RETURN_EXPR with a call to constexpr_fn_retval. Fix + indentation of "field_type" decl. + 2018-03-21 Nathan Sidwell <nathan@acm.org> PR c++/84804 diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index 9e813bf..bebd9f5 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -657,7 +657,7 @@ get_function_named_in_call (tree t) return value if suitable, error_mark_node for a statement not allowed in a constexpr function, or NULL_TREE if no return value was found. */ -static tree +tree constexpr_fn_retval (tree body) { switch (TREE_CODE (body)) diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 4df16e2..d5382c2 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -7424,6 +7424,7 @@ extern bool literal_type_p (tree); extern tree register_constexpr_fundef (tree, tree); extern bool is_valid_constexpr_fn (tree, bool); extern bool check_constexpr_ctor_body (tree, tree, bool); +extern tree constexpr_fn_retval (tree); extern tree ensure_literal_type_for_constexpr_object (tree); extern bool potential_constant_expression (tree); extern bool is_constant_expression (tree); diff --git a/gcc/cp/search.c b/gcc/cp/search.c index ddcff69..b436610 100644 --- a/gcc/cp/search.c +++ b/gcc/cp/search.c @@ -1657,8 +1657,7 @@ field_access_p (tree component_ref, tree field_decl, tree field_type) Specifically, a simple accessor within struct S of the form: T get_field () { return m_field; } - should have a DECL_SAVED_TREE of the form: - <return_expr + should have a constexpr_fn_retval (saved_tree) of the form: <init_expr:T <result_decl:T <nop_expr:T @@ -1666,7 +1665,7 @@ field_access_p (tree component_ref, tree field_decl, tree field_type) <indirect_ref:S> <nop_expr:P* <parm_decl (this)> - <field_decl (FIELD_DECL)>>>. */ + <field_decl (FIELD_DECL)>>>>>. */ static bool direct_accessor_p (tree init_expr, tree field_decl, tree field_type) @@ -1690,8 +1689,7 @@ direct_accessor_p (tree init_expr, tree field_decl, tree field_type) Specifically, a simple accessor within struct S of the form: T& get_field () { return m_field; } - should have a DECL_SAVED_TREE of the form: - <return_expr + should have a constexpr_fn_retval (saved_tree) of the form: <init_expr:T& <result_decl:T& <nop_expr: T& @@ -1757,16 +1755,19 @@ field_accessor_p (tree fn, tree field_decl, bool const_p) if (saved_tree == NULL_TREE) return false; - if (TREE_CODE (saved_tree) != RETURN_EXPR) + /* Attempt to extract a single return value from the function, + if it has one. */ + tree retval = constexpr_fn_retval (saved_tree); + if (retval == NULL_TREE || retval == error_mark_node) return false; - - tree init_expr = TREE_OPERAND (saved_tree, 0); - if (TREE_CODE (init_expr) != INIT_EXPR) + /* Require an INIT_EXPR. */ + if (TREE_CODE (retval) != INIT_EXPR) return false; + tree init_expr = retval; /* Determine if this is a simple accessor within struct S of the form: T get_field () { return m_field; }. */ - tree field_type = TREE_TYPE (field_decl); + tree field_type = TREE_TYPE (field_decl); if (cxx_types_compatible_p (TREE_TYPE (init_expr), field_type)) return direct_accessor_p (init_expr, field_decl, field_type); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 00fba27..5d25d56 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,20 @@ +2018-03-21 David Malcolm <dmalcolm@redhat.com> + + PR c++/84994 + * g++.dg/other/accessor-fixits-1.C: Move to... + * g++.dg/torture/accessor-fixits-1.C: ...here. + * g++.dg/other/accessor-fixits-2.C: Move to... + * g++.dg/torture/accessor-fixits-2.C: ...here. + * g++.dg/other/accessor-fixits-3.C: Move to... + * g++.dg/torture/accessor-fixits-3.C: ...here. + * g++.dg/other/accessor-fixits-4.C: Move to... + * g++.dg/torture/accessor-fixits-4.C: ...here. + * g++.dg/other/accessor-fixits-5.C: Move to... + * g++.dg/torture/accessor-fixits-5.C: ...here. + * g++.dg/torture/accessor-fixits-6.C: New testcase. + * g++.dg/torture/accessor-fixits-7.C: New testcase. + * g++.dg/torture/accessor-fixits-8.C: New testcase. + 2018-03-21 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> * gcc.dg/tree-ssa/pr84512.c: xfail on 64-bit SPARC. diff --git a/gcc/testsuite/g++.dg/other/accessor-fixits-1.C b/gcc/testsuite/g++.dg/torture/accessor-fixits-1.C index fd46a52..fd46a52 100644 --- a/gcc/testsuite/g++.dg/other/accessor-fixits-1.C +++ b/gcc/testsuite/g++.dg/torture/accessor-fixits-1.C diff --git a/gcc/testsuite/g++.dg/other/accessor-fixits-2.C b/gcc/testsuite/g++.dg/torture/accessor-fixits-2.C index e1a2b78..e1a2b78 100644 --- a/gcc/testsuite/g++.dg/other/accessor-fixits-2.C +++ b/gcc/testsuite/g++.dg/torture/accessor-fixits-2.C diff --git a/gcc/testsuite/g++.dg/other/accessor-fixits-3.C b/gcc/testsuite/g++.dg/torture/accessor-fixits-3.C index 27d2eb4..27d2eb4 100644 --- a/gcc/testsuite/g++.dg/other/accessor-fixits-3.C +++ b/gcc/testsuite/g++.dg/torture/accessor-fixits-3.C diff --git a/gcc/testsuite/g++.dg/other/accessor-fixits-4.C b/gcc/testsuite/g++.dg/torture/accessor-fixits-4.C index c03dd4e..c03dd4e 100644 --- a/gcc/testsuite/g++.dg/other/accessor-fixits-4.C +++ b/gcc/testsuite/g++.dg/torture/accessor-fixits-4.C diff --git a/gcc/testsuite/g++.dg/other/accessor-fixits-5.C b/gcc/testsuite/g++.dg/torture/accessor-fixits-5.C index cf72d78..cf72d78 100644 --- a/gcc/testsuite/g++.dg/other/accessor-fixits-5.C +++ b/gcc/testsuite/g++.dg/torture/accessor-fixits-5.C diff --git a/gcc/testsuite/g++.dg/torture/accessor-fixits-6.C b/gcc/testsuite/g++.dg/torture/accessor-fixits-6.C new file mode 100644 index 0000000..ae2f180 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/accessor-fixits-6.C @@ -0,0 +1,22 @@ +// PR c++/84994 +/* Ensure that fix-it hints are offered at every optimization level, even when + "-g" is enabled (coverage for every optimization level without -g is given + by the other cases within g++.dg/torture/accessor-fixits-*.C). */ +// { dg-additional-options "-g" } + +class foo +{ +public: + double get_ratio() const { return m_ratio; } + +private: + double m_ratio; // { dg-line field_decl } +}; + +void test(foo *ptr) +{ + if (ptr->m_ratio >= 0.5) // { dg-error "'double foo::m_ratio' is private within this context" } + ; + // { dg-message "declared private here" "" { target *-*-* } field_decl } + // { dg-message "'double foo::m_ratio' can be accessed via 'double foo::get_ratio\\(\\) const'" "" { target *-*-* } .-3 } +} diff --git a/gcc/testsuite/g++.dg/torture/accessor-fixits-7.C b/gcc/testsuite/g++.dg/torture/accessor-fixits-7.C new file mode 100644 index 0000000..3b5babd --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/accessor-fixits-7.C @@ -0,0 +1,22 @@ +class foo +{ +public: + double get_ratio() const; + +private: + double m_ratio; // { dg-line field_decl } +}; + +double +foo::get_ratio() const +{ + return m_ratio; +} + +void test(foo *ptr) +{ + if (ptr->m_ratio >= 0.5) // { dg-error "'double foo::m_ratio' is private within this context" } + ; + // { dg-message "declared private here" "" { target *-*-* } field_decl } + // { dg-message "'double foo::m_ratio' can be accessed via 'double foo::get_ratio\\(\\) const'" "" { target *-*-* } .-3 } +} diff --git a/gcc/testsuite/g++.dg/torture/accessor-fixits-8.C b/gcc/testsuite/g++.dg/torture/accessor-fixits-8.C new file mode 100644 index 0000000..1338b7d --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/accessor-fixits-8.C @@ -0,0 +1,31 @@ +// { dg-options "-fdiagnostics-show-caret" } + +class t1 +{ +public: + int get_doubled_field () const { return m_field * 2; } + int get_guarded_field_1 () const { if (m_field) return m_field; else return 42; } + int get_guarded_field_2 () const { return m_field ? m_field : 42; } + int with_unreachable () const { __builtin_unreachable (); return m_field; } + void no_return () { } + +private: + int m_field; // { dg-line field_decl } +}; + +int test (t1 *ptr) +{ + return ptr->m_field; // { dg-error ".int t1::m_field. is private within this context" } + /* { dg-begin-multiline-output "" } + return ptr->m_field; + ^~~~~~~ + { dg-end-multiline-output "" } */ + + // { dg-message "declared private here" "" { target *-*-* } field_decl } + /* { dg-begin-multiline-output "" } + int m_field; + ^~~~~~~ + { dg-end-multiline-output "" } */ + + /* We shouldn't issue a suggestion: none of the member functions are suitable returns. */ +} |