PR c++/71406 - ICE with scope-ref'd template id exprs

PR c++/71406 - ICE with scope-ref'd template id exprs
	PR c++/77508
	* typeck.c (finish_class_member_access_expr): Break up SCOPE_REF
	before breaking up TEMPLATE_ID_EXPR.

	PR c++/71406
	PR c++/77508
	* g++.dg/template/pr71406.C: New.

From-SVN: r244832
This commit is contained in:
Nathan Sidwell 2017-01-23 20:19:07 +00:00 committed by Nathan Sidwell
parent 15b8fd499d
commit e6b8075cce
4 changed files with 59 additions and 17 deletions

View File

@ -1,3 +1,10 @@
2017-01-23 Nathan Sidwell <nathan@acm.org>
PR c++/71406 - ICE with scope-ref'd template id exprs
PR c++/77508
* typeck.c (finish_class_member_access_expr): Break up SCOPE_REF
before breaking up TEMPLATE_ID_EXPR.
2017-01-20 Nathan Sidwell <nathan@acm.org>
PR c++/78495 - wrong code inherited ctor and invisi-ref parm

View File

@ -2730,19 +2730,9 @@ finish_class_member_access_expr (cp_expr object, tree name, bool template_p,
{
bool is_template_id = false;
tree template_args = NULL_TREE;
tree scope;
tree scope = NULL_TREE;
if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
{
is_template_id = true;
template_args = TREE_OPERAND (name, 1);
name = TREE_OPERAND (name, 0);
if (TREE_CODE (name) == OVERLOAD)
name = DECL_NAME (get_first_fn (name));
else if (DECL_P (name))
name = DECL_NAME (name);
}
access_path = object_type;
if (TREE_CODE (name) == SCOPE_REF)
{
@ -2761,9 +2751,25 @@ finish_class_member_access_expr (cp_expr object, tree name, bool template_p,
scope, name, object_type);
return error_mark_node;
}
}
if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
{
is_template_id = true;
template_args = TREE_OPERAND (name, 1);
name = TREE_OPERAND (name, 0);
if (TREE_CODE (name) == OVERLOAD)
name = DECL_NAME (get_first_fn (name));
else if (DECL_P (name))
name = DECL_NAME (name);
}
if (scope)
{
if (TREE_CODE (scope) == ENUMERAL_TYPE)
{
gcc_assert (!is_template_id);
/* Looking up a member enumerator (c++/56793). */
if (!TYPE_CLASS_SCOPE_P (scope)
|| !DERIVED_FROM_P (TYPE_CONTEXT (scope), object_type))
@ -2812,11 +2818,6 @@ finish_class_member_access_expr (cp_expr object, tree name, bool template_p,
return error_mark_node;
}
}
else
{
scope = NULL_TREE;
access_path = object_type;
}
if (TREE_CODE (name) == BIT_NOT_EXPR)
{

View File

@ -1,3 +1,9 @@
2017-01-23 Nathan Sidwell <nathan@acm.org>
PR c++/71406
PR c++/77508
* g++.dg/template/pr71406.C: New.
2017-01-23 Thomas Koenig <tkoenig@netcologne.de>
* gfortran.dg/integer_exponentiation_7.f90: New test.

View File

@ -0,0 +1,28 @@
// { dg-do compile }
// PR c++/71406 ICE with X::template Name
template < typename T >
struct C : T
{
void foo () { this->C::template bar <>; }
};
template < typename T >
struct A
{
template < void (T::*Fn) () > void f () {}
};
template < typename T > struct B : A < B < T > >
{
void g ()
{
this->B::template f < &B < T >::g > ();
}
};
void Foo ()
{
B < int > b;
b.g ();
}