diff options
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/init.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/new9.C | 16 |
3 files changed, 23 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 24783f5..34996fc 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2010-11-03 Jason Merrill <jason@redhat.com> + + PR c++/46277 + * init.c (expand_default_init): Avoid ICE if we can't figure out + which function is being called. + 2010-11-02 Nathan Froyd <froydnj@codesourcery.com> * class.c (build_base_path, add_vcall_offset): Use build_zero_cst diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 1f73d14..ab834bf 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 T> class ggIO +{ + void readbody(int); + ggRGBE *scanline; +}; +template <class T> void +ggIO<T>::readbody(int width) +{ + scanline = new ggRGBE[width]; +} |