From: Jason Merrill Date: Fri, 16 Jan 2009 22:36:32 +0000 (-0500) Subject: re PR c++/38877 (Revision 143404 caused ICE on 447.dealII in SPEC CPU 2006) X-Git-Tag: releases/gcc-4.4.0~832 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b7da27c2e218c1da18cabf5e043a15c849fbfa20;p=thirdparty%2Fgcc.git re PR c++/38877 (Revision 143404 caused ICE on 447.dealII in SPEC CPU 2006) PR c++/38877 * tree.c (lvalue_p_1): Allow non-fields in COMPONENT_REF. * init.c (build_new): Don't call describable_type unless we have an auto. From-SVN: r143446 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ff0de5900996..a58d4ac27d50 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2009-01-16 Jason Merrill + PR c++/38877 + * tree.c (lvalue_p_1): Allow non-fields in COMPONENT_REF. + * init.c (build_new): Don't call describable_type unless we + have an auto. + PR c++/29470 * pt.c (tsubst_decl) [USING_DECL]: Propagate access flags. diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 1285f160f00f..f2b79f18899a 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -2334,11 +2334,10 @@ build_new (tree placement, tree type, tree nelts, tree init, orig_nelts = nelts; orig_init = init; - if (nelts == NULL_TREE && init != void_zero_node && list_length (init) == 1 - && describable_type (TREE_VALUE (init))) + if (nelts == NULL_TREE && init != void_zero_node && list_length (init) == 1) { tree auto_node = type_uses_auto (type); - if (auto_node) + if (auto_node && describable_type (TREE_VALUE (init))) type = do_auto_deduction (type, TREE_VALUE (init), auto_node); } diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 3347bfb9f0bd..04fc7e930aa9 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -114,9 +114,11 @@ lvalue_p_1 (tree ref, ; else if (is_overloaded_fn (TREE_OPERAND (ref, 1))) /* The "field" can be a FUNCTION_DECL or an OVERLOAD in some - situations. */ - op1_lvalue_kind = lvalue_p_1 (TREE_OPERAND (ref, 1), - treat_class_rvalues_as_lvalues); + situations. If we're seeing a COMPONENT_REF, it's a non-static + member, so it isn't an lvalue. */ + op1_lvalue_kind = clk_none; + else if (TREE_CODE (TREE_OPERAND (ref, 1)) != FIELD_DECL) + /* This can be IDENTIFIER_NODE in a template. */; else if (DECL_C_BIT_FIELD (TREE_OPERAND (ref, 1))) { /* Clear the ordinary bit. If this object was a class diff --git a/gcc/testsuite/g++.dg/template/lvalue1.C b/gcc/testsuite/g++.dg/template/lvalue1.C new file mode 100644 index 000000000000..9def2a18ce40 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/lvalue1.C @@ -0,0 +1,31 @@ +// PR c++/38877 + +template +struct pair +{ + typedef _T1 first_type; + typedef _T2 second_type; + _T1 first; + _T2 second; + pair () : first(), second() { } + pair(const _T1& __a, const _T2& __b) + : first(__a), second(__b) { } +}; + +template +inline pair<_T1, _T2> +make_pair(_T1 __x, _T2 __y) +{ + return pair<_T1, _T2>(__x, __y); +} + +template class bar; + +template +pair *, unsigned int> +foo (unsigned int position) +{ + const pair tmp; + return make_pair (new bar(tmp.first), + position); + }