c++: dependent conversion operator lookup [PR106179]
authorJason Merrill <jason@redhat.com>
Tue, 5 Jul 2022 21:05:47 +0000 (17:05 -0400)
committerJason Merrill <jason@redhat.com>
Wed, 6 Jul 2022 04:40:16 +0000 (00:40 -0400)
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
gcc/testsuite/g++.dg/template/operator16.C [new file with mode: 0644]

index df657a3..5cd6a52 100644 (file)
@@ -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 (file)
index 0000000..434a266
--- /dev/null
@@ -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>;
+}