diff options
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/parser.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/memtmpl5.C | 22 |
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); +} |