From 34608099e37f9359d03ae7777cca9f78384aa2ec Mon Sep 17 00:00:00 2001 From: jason Date: Wed, 24 Feb 2016 19:56:03 +0000 Subject: [PATCH] PR c++/69323 - valid * pt.c (instantiate_class_template_1): Set processing_template_decl before substituting friend_type. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@233681 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/pt.c | 6 +++--- gcc/testsuite/g++.dg/template/friend61.C | 12 ++++++++++++ 3 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/friend61.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 764d2a8..8fe4306 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2016-02-24 Jason Merrill + + PR c++/69323 + * pt.c (instantiate_class_template_1): Set + processing_template_decl before substituting friend_type. + 016-02-24 Martin Sebor PR c++/69912 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 65edfa7..e9cdf6e 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -10180,11 +10180,11 @@ instantiate_class_template_1 (tree type) template friend class T::C; otherwise. */ + /* Bump processing_template_decl in case this is something like + template friend struct A::B. */ + ++processing_template_decl; friend_type = tsubst (friend_type, args, tf_warning_or_error, NULL_TREE); - /* Bump processing_template_decl for correct - dependent_type_p calculation. */ - ++processing_template_decl; if (dependent_type_p (friend_type)) adjust_processing_template_decl = true; --processing_template_decl; diff --git a/gcc/testsuite/g++.dg/template/friend61.C b/gcc/testsuite/g++.dg/template/friend61.C new file mode 100644 index 0000000..1604f5c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend61.C @@ -0,0 +1,12 @@ +// PR c++/69323 + +template +struct Outer +{ + struct StupidValueTrick + { + template friend struct Outer::StupidValueTrick; + }; +}; +typedef Outer<42>::StupidValueTrick GoodValue; +GoodValue good; -- 2.7.4