Hi!
When a variable template (both static data member of some class or at
namespace level) is accessed without template arguments,
finish_id_expression_1 handles it through:
/* If we didn't find anything, or what we found was a type,
then this wasn't really an id-expression. */
if (TREE_CODE (decl) == TEMPLATE_DECL
&& !DECL_FUNCTION_TEMPLATE_P (decl))
{
*error_msg = G_("missing template arguments");
return error_mark_node;
}
On the following invalid testcase the access is from within a template and
in that case finish_id_expression{,_1} isn't really called for that, instead
tsubst_qualified_id just calls finish_qualified_id_expr.
The ICE is because we pass over a TEMPLATE_DECL to the middle-end (e.g. on
rhs of an INIT_EXPR etc.).
The following patch does something similar to what finish_id_expression_1
does. Bootstrapped/regtested on x86_64-linux and i686-linux. Or should it
be done in tsubst_qualified_id instead (before or after the
finish_qualified_id_expr call?
2019-03-13 Jakub Jelinek <jakub@redhat.com>
PR c++/89512
* semantics.c (finish_qualified_id_expr): Reject variable templates.