PR c++/81204 - parse error with dependent template-name
authorJason Merrill <jason@redhat.com>
Wed, 28 Jun 2017 19:41:18 +0000 (15:41 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 28 Jun 2017 19:41:18 +0000 (15:41 -0400)
* parser.c (cp_parser_lookup_name): Disqualify function templates
after lookup.

From-SVN: r249750

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/g++.dg/template/lookup10.C [new file with mode: 0644]

index b5c09ac57662f1c9ecf80db4c22832dd217f9a52..23586d40f1fb38f35c1c4d84aba31e03dad17ddc 100644 (file)
@@ -1,3 +1,9 @@
+2017-06-28  Jason Merrill  <jason@redhat.com>
+
+       PR c++/81204 - parse error with dependent template-name
+       * parser.c (cp_parser_lookup_name): Disqualify function templates
+       after lookup.
+
 2017-06-27  Nathan Sidwell  <nathan@acm.org>
 
        * pt.c (tsubst_decl <FUNCTION_DECL>): Move var decls to
index 2ff6afdbf6477bb6a5bf3cab205b06c03ebeb440..e0a6c8b2fc84360aded656d27bd70e774e2158be 100644 (file)
@@ -25813,11 +25813,22 @@ cp_parser_lookup_name (cp_parser *parser, tree name,
        decl = NULL_TREE;
 
       if (!decl)
-       /* Look it up in the enclosing context.  DR 141: When looking for a
-          template-name after -> or ., only consider class templates.  */
-       decl = lookup_name_real (name, prefer_type_arg (tag_type, is_template),
-                                /*nonclass=*/0,
-                                /*block_p=*/true, is_namespace, 0);
+       {
+         /* Look it up in the enclosing context.  */
+         decl = lookup_name_real (name, prefer_type_arg (tag_type),
+                                  /*nonclass=*/0,
+                                  /*block_p=*/true, is_namespace, 0);
+         /* DR 141 says when looking for a template-name after -> or ., only
+            consider class templates.  */
+         if (decl && is_template && !DECL_TYPE_TEMPLATE_P (decl))
+           {
+             tree d = decl;
+             if (is_overloaded_fn (d))
+               d = get_first_fn (d);
+             if (DECL_P (d) && !DECL_CLASS_SCOPE_P (d))
+               decl = NULL_TREE;
+           }
+       }
       if (object_type == unknown_type_node)
        /* The object is type-dependent, so we can't look anything up; we used
           this to get the DR 141 behavior.  */
diff --git a/gcc/testsuite/g++.dg/template/lookup10.C b/gcc/testsuite/g++.dg/template/lookup10.C
new file mode 100644 (file)
index 0000000..fa90af4
--- /dev/null
@@ -0,0 +1,12 @@
+// PR c++/81204
+
+namespace std {
+  template<typename, typename> struct set { };
+}
+using namespace std;
+
+template <int I, typename Result>
+inline void set(Result & res)
+{
+    res.template set<I>();
+}