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 <nathanielosh...@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" } +}; -- 2.43.2