diff options
author | Jason Merrill <jason@redhat.com> | 2014-09-09 07:59:45 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2014-09-09 07:59:45 -0400 |
commit | cb3037199c8e3ca9f7982ec3a0024f8ab007cfbb (patch) | |
tree | accff89b25d5d74b30830f7bb127bc7d568bdca5 /gcc | |
parent | b27832edcf1a344c9e2ba94c68b0ceef2d141f7b (diff) | |
download | gcc-cb3037199c8e3ca9f7982ec3a0024f8ab007cfbb.zip gcc-cb3037199c8e3ca9f7982ec3a0024f8ab007cfbb.tar.gz gcc-cb3037199c8e3ca9f7982ec3a0024f8ab007cfbb.tar.bz2 |
re PR c++/62255 (Introducing an unrelated template parameter causes compilation to fail)
PR c++/62255
* pt.c (instantiate_decl): Handle recursive instantiation of
static data member.
From-SVN: r215062
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 19 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/recurse4.C | 18 |
3 files changed, 36 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3d87231..6447bc7 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2014-09-08 Jason Merrill <jason@redhat.com> + + PR c++/62255 + * pt.c (instantiate_decl): Handle recursive instantiation of + static data member. + 2014-09-05 Jason Merrill <jason@redhat.com> PR c++/62659 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 5ea5a58..38093ec 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -19996,13 +19996,18 @@ instantiate_decl (tree d, int defer_ok, args, tf_warning_or_error, NULL_TREE, /*integral_constant_expression_p=*/false); - /* Make sure the initializer is still constant, in case of - circular dependency (template/instantiate6.C). */ - const_init - = DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (code_pattern); - cp_finish_decl (d, init, /*init_const_expr_p=*/const_init, - /*asmspec_tree=*/NULL_TREE, - LOOKUP_ONLYCONVERTING); + /* If instantiating the initializer involved instantiating this + again, don't call cp_finish_decl twice. */ + if (!DECL_INITIAL (d)) + { + /* Make sure the initializer is still constant, in case of + circular dependency (template/instantiate6.C). */ + const_init + = DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (code_pattern); + cp_finish_decl (d, init, /*init_const_expr_p=*/const_init, + /*asmspec_tree=*/NULL_TREE, + LOOKUP_ONLYCONVERTING); + } if (enter_context) pop_nested_class (); pop_nested_namespace (ns); diff --git a/gcc/testsuite/g++.dg/template/recurse4.C b/gcc/testsuite/g++.dg/template/recurse4.C new file mode 100644 index 0000000..ee8d1b7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/recurse4.C @@ -0,0 +1,18 @@ +// PR c++/62255 + +// It's not clear whether this is well-formed; instantiating the +// initializer of 'value' causes the instantiation of Derived, which in +// turn requires the value of 'value', but the recursion ends there, so it +// seems reasonable to allow it. + +template <typename T> struct Test { + template<typename X> static int check(typename X::Type*); + template<typename> static char check(...); + static const bool value = (sizeof(check<T>(0)) == sizeof(int)); +}; +template <int> struct Sink { }; +template <typename T> struct Derived : Sink<Test<Derived<T> >::value> { + typedef int Type; +}; + +Sink<Test<Derived<int> >::value> s; |