https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94799

--- Comment #3 from Marek Polacek <mpolacek at gcc dot gnu.org> ---
Here we have "p->template A<T>::a()" but cp_parser_expression only parses the
"p->template A<T>" part, so we complain that a ; isn't following.

It's because cp_parser_template_name now considers the object scope:

16957       if (template_keyword_p)
16958         {
16959           tree scope = (parser->scope ? parser->scope
16960                         : parser->context->object_type);
16961           if (scope && TYPE_P (scope)
16962               && (!CLASS_TYPE_P (scope) 
16963                   || (check_dependency_p && dependent_type_p (scope))))
16964             {
16965               /* We're optimizing away the call to cp_parser_lookup_name,
but
16966                  we still need to do this.  */
16967               parser->context->object_type = NULL_TREE;
16968               return identifier;
16969             }
16970         }

which here is unknown_type_node, signalling a type-dependent object:

 7756   if (dependent_p)
 7757     /* Tell cp_parser_lookup_name that there was an object, even though
it's
 7758        type-dependent.  */
 7759     parser->context->object_type = unknown_type_node;

so now cp_parser_template_name returns identifier 'A', cp_parser_class_name
creates a TEMPLATE_ID_EXPR A<T>, but then

23735       decl = make_typename_type (scope, decl, tag_type, tf_error);

fails because scope is NULL -- we've used the object scope instead.  We
probably have to look that up first.

Reply via email to