From fc7612fd026d28298e2c270acdc5cafbe21cc1a8 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Mon, 23 Jan 2017 20:24:32 +0000 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/pt.c | 16 ++++++++-------- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/template/pr71710.C | 10 ++++++++++ 4 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/pr71710.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c56c840..66151e9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2017-01-23 Nathan Sidwell + 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 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 8c920c3..537d107 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -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, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f3ac5e5..ee1f19c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2017-01-23 Nathan Sidwell + PR C++/71710 + * g++.dg/template/pr71710.C: New. + PR c++/71406 PR c++/77508 * g++.dg/template/pr71406.C: New. diff --git a/gcc/testsuite/g++.dg/template/pr71710.C b/gcc/testsuite/g++.dg/template/pr71710.C new file mode 100644 index 0000000..7c394e7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr71710.C @@ -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 (); +}; -- 2.7.4