PR c++/81204 - parse error with dependent template-name
authorJason Merrill <jason@redhat.com>
Thu, 6 Jul 2017 18:26:59 +0000 (14:26 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 6 Jul 2017 18:26:59 +0000 (14:26 -0400)
PR c++/81204 - parse error with dependent template-name
* parser.c (cp_parser_lookup_name): Revert previous change.

From-SVN: r250037

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/g++.dg/cpp0x/variadic-mem_fn2.C [new file with mode: 0644]

index 2617fff1dc9b5c7b4640ff6177fea112b84ea61c..3af0c432718c8ff7b8635f60657e82f4b63a8fe0 100644 (file)
@@ -1,3 +1,8 @@
+2017-07-06  Jason Merrill  <jason@redhat.com>
+
+       PR c++/81204 - parse error with dependent template-name
+       * parser.c (cp_parser_lookup_name): Revert previous change.
+
 2017-07-06  David Malcolm  <dmalcolm@redhat.com>
 
        * cp-lang.c (LANG_HOOKS_RUN_LANG_SELFTESTS): Define as
index dbe0052792454c2e32edddb10d1b8b5d96409388..c81b1a1f5c122cfb3be8adb3a5c19232c9a1ff1d 100644 (file)
@@ -25855,22 +25855,11 @@ cp_parser_lookup_name (cp_parser *parser, tree name,
        decl = NULL_TREE;
 
       if (!decl)
-       {
-         /* 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;
-           }
-       }
+       /* 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);
       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/cpp0x/variadic-mem_fn2.C b/gcc/testsuite/g++.dg/cpp0x/variadic-mem_fn2.C
new file mode 100644 (file)
index 0000000..4a02ab2
--- /dev/null
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+
+template <class A0, class... As> struct tuple 
+{
+  tuple<As...> tail;
+  template <int Offset, class... More> int apply(const More&... more) {
+    return tail.apply<1>(more...); // { dg-error "" } needs .template
+  }
+};