This testcase demonstrates that my assumption that we would only be interested in a class template lookup if the template-id is followed by :: was wrong.
PR c++/106179 PR c++/106024 gcc/cp/ChangeLog: * parser.cc (cp_parser_lookup_name): Remove :: requirement for using unqualified lookup result. gcc/testsuite/ChangeLog: * g++.dg/template/operator16.C: New test. --- gcc/cp/parser.cc | 4 ---- gcc/testsuite/g++.dg/template/operator16.C | 9 +++++++++ 2 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/operator16.C diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index df657a3fb2b..5cd6a527d93 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -30738,10 +30738,6 @@ cp_parser_lookup_name (cp_parser *parser, tree name, looking at a template arg list. */ if (!cp_parser_skip_entire_template_parameter_list (parser)) decl = NULL_TREE; - /* And only use the unqualified lookup if we're looking at ::. */ - if (decl - && !cp_lexer_next_token_is (parser->lexer, CPP_SCOPE)) - decl = NULL_TREE; } /* If we know we're looking for a type (e.g. A in p->A::x), diff --git a/gcc/testsuite/g++.dg/template/operator16.C b/gcc/testsuite/g++.dg/template/operator16.C new file mode 100644 index 00000000000..434a266850c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/operator16.C @@ -0,0 +1,9 @@ +// PR c++/106179 + +struct Mat { + template <typename> Mat(); +}; +template <typename> struct Mat_; +template <typename _Tp> Mat::Mat() { + _Tp commaInitializer = commaInitializer.operator Mat_<_Tp>; +} base-commit: 510ac273a785361f7c8f24e4815bfb477a6a2e07 -- 2.27.0