From cc6bc76df8ce5de4345d7df64b44bc2d0cdce373 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 16 Jan 2009 18:17:35 -0500 Subject: [PATCH] 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. From-SVN: r143449 --- gcc/cp/ChangeLog | 5 ++++ gcc/cp/tree.c | 2 ++ gcc/testsuite/g++.dg/template/lvalue1.C | 31 +++++++++++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 gcc/testsuite/g++.dg/template/lvalue1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a3a59ebb076..bda8b40c936 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2009-01-16 Jason Merrill + + PR c++/38877 + * tree.c (lvalue_p_1): Allow non-fields in COMPONENT_REF. + 2009-01-16 Steve Ellcey PR c++/31260 diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 8c466254837..47daad77144 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -117,6 +117,8 @@ lvalue_p_1 (tree ref, situations. */ op1_lvalue_kind = lvalue_p_1 (TREE_OPERAND (ref, 1), treat_class_rvalues_as_lvalues); + 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 00000000000..9def2a18ce4 --- /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); + }