PR c++/71710 - template using directive of field

PR c++/71710 - template using directive of field
	* pt.c (tsubst_copy_and_build [COMPONENT_REF]): Move FIELD_DECL
	check earlier.

	PR C++/71710
	* g++.dg/template/pr71710.C: New.

From-SVN: r244833
This commit is contained in:
Nathan Sidwell 2017-01-23 20:24:32 +00:00 committed by Nathan Sidwell
parent e6b8075cce
commit fc7612fd02
4 changed files with 25 additions and 8 deletions

View File

@ -1,5 +1,9 @@
2017-01-23 Nathan Sidwell <nathan@acm.org>
PR c++/71710 - template using directive of field
* pt.c (tsubst_copy_and_build [COMPONENT_REF]): Move FIELD_DECL
check earlier.
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

View File

@ -17470,7 +17470,14 @@ tsubst_copy_and_build (tree t,
if (member == error_mark_node)
RETURN (error_mark_node);
if (type_dependent_expression_p (object))
if (TREE_CODE (member) == FIELD_DECL)
{
r = finish_non_static_data_member (member, object, NULL_TREE);
if (TREE_CODE (r) == COMPONENT_REF)
REF_PARENTHESIZED_P (r) = REF_PARENTHESIZED_P (t);
RETURN (r);
}
else if (type_dependent_expression_p (object))
/* We can't do much here. */;
else if (!CLASS_TYPE_P (object_type))
{
@ -17535,13 +17542,6 @@ tsubst_copy_and_build (tree t,
}
RETURN (error_mark_node);
}
else if (TREE_CODE (member) == FIELD_DECL)
{
r = finish_non_static_data_member (member, object, NULL_TREE);
if (TREE_CODE (r) == COMPONENT_REF)
REF_PARENTHESIZED_P (r) = REF_PARENTHESIZED_P (t);
RETURN (r);
}
r = finish_class_member_access_expr (object, member,
/*template_p=*/false,

View File

@ -1,5 +1,8 @@
2017-01-23 Nathan Sidwell <nathan@acm.org>
PR C++/71710
* g++.dg/template/pr71710.C: New.
PR c++/71406
PR c++/77508
* g++.dg/template/pr71406.C: New.

View File

@ -0,0 +1,10 @@
// { dg-do compile { target c++11 } }
// PR C++/71710 ICE with decltype & using
template < typename > struct A
{
A a;
template < int > using B = decltype (a);
B < 0 > b;
template < int C > B < C > foo ();
};