Message ID | 65e65986.170a0220.bd30c.39c1@mx.google.com |
---|---|
State | New |
Headers | show |
Series | c++: Fix ICE diagnosing incomplete type of overloaded function set [PR98356] | expand |
On 3/4/24 18:30, Nathaniel Shead wrote: > Bootstrapped and regtested on x86_64-pc-linux-gnu, OK for trunk? OK. > -- >8 -- > > In the linked PR the result of 'get_first_fn' is a USING_DECL against > the template parameter, to be filled in on instantiation. But we don't > actually need to get the first set of the member functions: it's enough > to know that we have a (possibly overloaded) member function at all. > > PR c++/98356 > > gcc/cp/ChangeLog: > > * typeck2.cc (cxx_incomplete_type_diagnostic): Don't assume > 'member' will be a FUNCTION_DECL (or something like it). > > gcc/testsuite/ChangeLog: > > * g++.dg/pr98356.C: New test. > > Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com> > --- > gcc/cp/typeck2.cc | 11 +++++------ > gcc/testsuite/g++.dg/pr98356.C | 9 +++++++++ > 2 files changed, 14 insertions(+), 6 deletions(-) > create mode 100644 gcc/testsuite/g++.dg/pr98356.C > > diff --git a/gcc/cp/typeck2.cc b/gcc/cp/typeck2.cc > index 9608bdccd8b..31198b2f9f5 100644 > --- a/gcc/cp/typeck2.cc > +++ b/gcc/cp/typeck2.cc > @@ -350,16 +350,15 @@ cxx_incomplete_type_diagnostic (location_t loc, const_tree value, > bad_member: > { > tree member = TREE_OPERAND (value, 1); > - if (is_overloaded_fn (member)) > - member = get_first_fn (member); > - > - if (DECL_FUNCTION_MEMBER_P (member) > - && ! flag_ms_extensions) > + if (is_overloaded_fn (member) && !flag_ms_extensions) > { > gcc_rich_location richloc (loc); > /* If "member" has no arguments (other than "this"), then > add a fix-it hint. */ > - if (type_num_arguments (TREE_TYPE (member)) == 1) > + member = MAYBE_BASELINK_FUNCTIONS (member); > + if (TREE_CODE (member) == FUNCTION_DECL > + && DECL_OBJECT_MEMBER_FUNCTION_P (member) > + && type_num_arguments (TREE_TYPE (member)) == 1) > richloc.add_fixit_insert_after ("()"); > complained = emit_diagnostic (diag_kind, &richloc, 0, > "invalid use of member function %qD " > diff --git a/gcc/testsuite/g++.dg/pr98356.C b/gcc/testsuite/g++.dg/pr98356.C > new file mode 100644 > index 00000000000..acea238593b > --- /dev/null > +++ b/gcc/testsuite/g++.dg/pr98356.C > @@ -0,0 +1,9 @@ > +// PR c++/98356 > +// { dg-do compile { target c++11 } } > + > +template <template <typename> class T> struct S { > + using A = T<int>; > + using A::foo; > + void foo (); > + void bar () {foo.} // { dg-error "invalid use of member function" } > +};
diff --git a/gcc/cp/typeck2.cc b/gcc/cp/typeck2.cc index 9608bdccd8b..31198b2f9f5 100644 --- a/gcc/cp/typeck2.cc +++ b/gcc/cp/typeck2.cc @@ -350,16 +350,15 @@ cxx_incomplete_type_diagnostic (location_t loc, const_tree value, bad_member: { tree member = TREE_OPERAND (value, 1); - if (is_overloaded_fn (member)) - member = get_first_fn (member); - - if (DECL_FUNCTION_MEMBER_P (member) - && ! flag_ms_extensions) + if (is_overloaded_fn (member) && !flag_ms_extensions) { gcc_rich_location richloc (loc); /* If "member" has no arguments (other than "this"), then add a fix-it hint. */ - if (type_num_arguments (TREE_TYPE (member)) == 1) + member = MAYBE_BASELINK_FUNCTIONS (member); + if (TREE_CODE (member) == FUNCTION_DECL + && DECL_OBJECT_MEMBER_FUNCTION_P (member) + && type_num_arguments (TREE_TYPE (member)) == 1) richloc.add_fixit_insert_after ("()"); complained = emit_diagnostic (diag_kind, &richloc, 0, "invalid use of member function %qD " diff --git a/gcc/testsuite/g++.dg/pr98356.C b/gcc/testsuite/g++.dg/pr98356.C new file mode 100644 index 00000000000..acea238593b --- /dev/null +++ b/gcc/testsuite/g++.dg/pr98356.C @@ -0,0 +1,9 @@ +// PR c++/98356 +// { dg-do compile { target c++11 } } + +template <template <typename> class T> struct S { + using A = T<int>; + using A::foo; + void foo (); + void bar () {foo.} // { dg-error "invalid use of member function" } +};
Bootstrapped and regtested on x86_64-pc-linux-gnu, OK for trunk? -- >8 -- In the linked PR the result of 'get_first_fn' is a USING_DECL against the template parameter, to be filled in on instantiation. But we don't actually need to get the first set of the member functions: it's enough to know that we have a (possibly overloaded) member function at all. PR c++/98356 gcc/cp/ChangeLog: * typeck2.cc (cxx_incomplete_type_diagnostic): Don't assume 'member' will be a FUNCTION_DECL (or something like it). gcc/testsuite/ChangeLog: * g++.dg/pr98356.C: New test. Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com> --- gcc/cp/typeck2.cc | 11 +++++------ gcc/testsuite/g++.dg/pr98356.C | 9 +++++++++ 2 files changed, 14 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/g++.dg/pr98356.C