diff options
author | Jason Merrill <jason@redhat.com> | 2017-06-16 22:27:52 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2017-06-16 22:27:52 -0400 |
commit | 157420b4bd936f18b64d8143a6b3f32f89689412 (patch) | |
tree | 3b5de82fcc472501dd501e0fddefa996b399c623 | |
parent | 3eec359d0ddf2cfbcc6454bb478ff417c697801e (diff) | |
download | gcc-157420b4bd936f18b64d8143a6b3f32f89689412.zip gcc-157420b4bd936f18b64d8143a6b3f32f89689412.tar.gz gcc-157420b4bd936f18b64d8143a6b3f32f89689412.tar.bz2 |
PR c++/80174 - ICE with partial specialization of member template.
PR c++/71747
* pt.c (get_partial_spec_bindings): Only coerce innermost args.
From-SVN: r249319
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/pt.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/partial-specialization6.C | 28 |
3 files changed, 37 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 48a9cf6..330f0f2 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2017-06-16 Jason Merrill <jason@redhat.com> + PR c++/80174 - ICE with partial specialization of member template. + PR c++/71747 + * pt.c (get_partial_spec_bindings): Only coerce innermost args. + PR c++/80831 - ICE with -fsyntax-only. * decl2.c (c_parse_final_cleanups): Use cgraph_node::get_create. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 3dad0fc..0a58163 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -21672,9 +21672,11 @@ get_partial_spec_bindings (tree tmpl, tree spec_tmpl, tree args) `T' is `A' but unify () does not check whether `typename T::X' is `int'. */ spec_args = tsubst (spec_args, deduced_args, tf_none, NULL_TREE); - spec_args = coerce_template_parms (DECL_INNERMOST_TEMPLATE_PARMS (tmpl), - spec_args, tmpl, - tf_none, false, false); + + if (spec_args != error_mark_node) + spec_args = coerce_template_parms (DECL_INNERMOST_TEMPLATE_PARMS (tmpl), + INNERMOST_TEMPLATE_ARGS (spec_args), + tmpl, tf_none, false, false); pop_tinst_level (); diff --git a/gcc/testsuite/g++.dg/template/partial-specialization6.C b/gcc/testsuite/g++.dg/template/partial-specialization6.C new file mode 100644 index 0000000..51a1590 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/partial-specialization6.C @@ -0,0 +1,28 @@ +// PR c++/80174 + +typedef unsigned char uint8_t; + +template <typename T> +struct HighestMaxFieldIdx { + static const uint8_t maxFieldIdx = T::fieldIdx; +}; + +template <typename This> +struct Outer { + + template <uint8_t _fieldIdx, typename T, T This::*field> + struct Varint {}; + + + template <uint8_t _fieldIdx, uint8_t This::*field> + struct Varint<_fieldIdx, uint8_t, field> { + static const uint8_t fieldIdx = _fieldIdx; + }; +}; + +struct Msg { + uint8_t a; + + static const uint8_t t + = HighestMaxFieldIdx<Outer<Msg>::Varint<1, uint8_t, &Msg::a> >::maxFieldIdx; +}; |