From 4bff36d30616df91fbfb4d9c427721d52c0a1527 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Tue, 11 Oct 2005 06:26:04 +0000 Subject: [PATCH] re PR c++/24277 (Boost causes ICE in build_c_cast, at cp/typeck.c:5231) PR c++/24277 * pt.c (instantiate_decl): Call finish_static_data_member_decl for static data members. PR c++/24277 * g++.dg/template/static20.C: New test. From-SVN: r105228 --- gcc/cp/pt.c | 16 +++++++++++----- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/template/static20.C | 14 ++++++++++++++ 3 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/static20.C diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 2bd96a6d57b..a5a7c1ed80e 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -11558,13 +11558,19 @@ instantiate_decl (tree d, int defer_ok, && !DECL_INITIAL (d) && DECL_INITIAL (code_pattern)) { - tree ns = decl_namespace_context (d); + tree ns; + tree init; + + ns = decl_namespace_context (d); push_nested_namespace (ns); push_nested_class (DECL_CONTEXT (d)); - DECL_INITIAL (d) - = tsubst_expr (DECL_INITIAL (code_pattern), - args, - tf_error | tf_warning, NULL_TREE); + init = tsubst_expr (DECL_INITIAL (code_pattern), + args, + tf_error | tf_warning, NULL_TREE); + DECL_INITIAL (d) = NULL_TREE; + finish_static_data_member_decl (d, init, + /*asmspec_tree=*/NULL_TREE, + LOOKUP_ONLYCONVERTING); pop_nested_class (); pop_nested_namespace (ns); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index aa4a66fdfd7..dd19af6bf64 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2005-10-10 Mark Mitchell + PR c++/24277 + * g++.dg/template/static20.C: New test. + PR c++/24302 * g++.dg/warn/Wunused-12.C: New test. diff --git a/gcc/testsuite/g++.dg/template/static20.C b/gcc/testsuite/g++.dg/template/static20.C new file mode 100644 index 00000000000..6f1096b88ea --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static20.C @@ -0,0 +1,14 @@ +// PR c++/24277 + +template< int Bits > struct uint_t { + typedef unsigned short fast; +}; +template < int Bits > struct mask_uint_t { + typedef typename uint_t< Bits >::fast fast; + static const fast sig_bits = 1; + static const fast sig_bits_fast = fast(sig_bits); +}; +template < int Bits> int checksum ( ) { + return 1 & mask_uint_t::sig_bits_fast; +} +int i = checksum<1>();