PR c++/79508 - lookup error with member template
authorJason Merrill <jason@redhat.com>
Fri, 17 Feb 2017 22:05:18 +0000 (17:05 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 17 Feb 2017 22:05:18 +0000 (17:05 -0500)
* parser.c (cp_parser_template_name): Clear
parser->context->object_type if we aren't doing lookup.

From-SVN: r245553

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

index 2e2cd6c48c5580fb0ccec761d25f5dff0f6f07d4..8dce6d18feaab08688d87279b770795f64b98d4b 100644 (file)
@@ -1,5 +1,9 @@
 2017-02-17  Jason Merrill  <jason@redhat.com>
 
+       PR c++/79508 - lookup error with member template
+       * parser.c (cp_parser_template_name): Clear
+       parser->context->object_type if we aren't doing lookup.
+
        PR c++/78690 - ICE with using and global type with same name
        * pt.c (type_dependent_object_expression_p): True for
        IDENTIFIER_NODE.
index 060962db625328e4d068eb83a232768f39afd3b4..92d8ccea95bbf46aaf1bab037f661905c117f1cd 100644 (file)
@@ -15719,6 +15719,7 @@ cp_parser_template_name (cp_parser* parser,
            cp_lexer_purge_tokens_after (parser->lexer, start);
          if (is_identifier)
            *is_identifier = true;
+         parser->context->object_type = NULL_TREE;
          return identifier;
        }
 
@@ -15730,7 +15731,12 @@ cp_parser_template_name (cp_parser* parser,
          && (!parser->scope
              || (TYPE_P (parser->scope)
                  && dependent_type_p (parser->scope))))
-       return identifier;
+       {
+         /* We're optimizing away the call to cp_parser_lookup_name, but we
+            still need to do this.  */
+         parser->context->object_type = NULL_TREE;
+         return identifier;
+       }
     }
 
   /* Look up the name.  */
diff --git a/gcc/testsuite/g++.dg/template/memtmpl5.C b/gcc/testsuite/g++.dg/template/memtmpl5.C
new file mode 100644 (file)
index 0000000..c5c3634
--- /dev/null
@@ -0,0 +1,22 @@
+// PR c++/79508
+
+struct C
+{
+  template< void(*F)()> void set_default() {   }       
+};
+
+
+template <class T> void random_positive()
+{
+}
+
+template<class T> void initialize(T& x)
+{
+  x.template set_default<random_positive<T> >();
+}
+
+int main ()
+{
+  C x;
+  initialize<C>(x);
+}