From patchwork Wed Nov 3 15:18:25 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: C++ PATCH for c++/46277 (ICE in spec2k) Date: Wed, 03 Nov 2010 05:18:25 -0000 From: Jason Merrill X-Patchwork-Id: 70013 Message-Id: <4CD17D41.4060508@redhat.com> To: gcc-patches List I'm a little concerned that we can't figure out which function is being called in this case, since it isn't actually type-dependent, but since this isn't in a constant expression it doesn't really matter. Tested x86_64-pc-linux-gnu, applied to trunk. commit 7d13a58f7e3d2e0fa70c58cab5bb73b206998c00 Author: Jason Merrill Date: Wed Nov 3 01:04:24 2010 -0400 PR c++/46277 * init.c (expand_default_init): Avoid ICE if we can't figure out which function is being called. diff --git a/gcc/cp/init.c b/gcc/cp/init.c index d632816..982dc24 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -1443,7 +1443,7 @@ expand_default_init (tree binfo, tree true_exp, tree exp, tree init, int flags, if (exp == true_exp && TREE_CODE (rval) == CALL_EXPR) { tree fn = get_callee_fndecl (rval); - if (DECL_DECLARED_CONSTEXPR_P (fn)) + if (fn && DECL_DECLARED_CONSTEXPR_P (fn)) { tree e = maybe_constant_value (rval); if (TREE_CONSTANT (e)) diff --git a/gcc/testsuite/g++.dg/template/new9.C b/gcc/testsuite/g++.dg/template/new9.C new file mode 100644 index 0000000..24e40ee --- /dev/null +++ b/gcc/testsuite/g++.dg/template/new9.C @@ -0,0 +1,16 @@ +// PR c++/46277 + +class ggRGBE { +public: + ggRGBE(); +}; +template class ggIO +{ + void readbody(int); + ggRGBE *scanline; +}; +template void +ggIO::readbody(int width) +{ + scanline = new ggRGBE[width]; +}