aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/parser.c8
-rw-r--r--gcc/testsuite/g++.dg/template/memtmpl5.C22
3 files changed, 33 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 2e2cd6c..8dce6d1 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 060962d..92d8cce 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -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
index 0000000..c5c3634
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/memtmpl5.C
@@ -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);
+}