]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/38877 (Revision 143404 caused ICE on 447.dealII in SPEC CPU 2006)
authorJason Merrill <jason@redhat.com>
Fri, 16 Jan 2009 22:36:32 +0000 (17:36 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 16 Jan 2009 22:36:32 +0000 (17:36 -0500)
        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

gcc/cp/ChangeLog
gcc/cp/init.c
gcc/cp/tree.c
gcc/testsuite/g++.dg/template/lvalue1.C [new file with mode: 0644]

index ff0de59009964ad953afed2f69d776305ef4a30b..a58d4ac27d503ec28a89a136bb5379b0c94a75a0 100644 (file)
@@ -1,5 +1,10 @@
 2009-01-16  Jason Merrill  <jason@redhat.com>
 
+       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.
 
index 1285f160f00fde52824f135684b5441e79e52f31..f2b79f18899aa3978adff3f174303046b9e39457 100644 (file)
@@ -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);
     }
 
index 3347bfb9f0bd5861b5dff482e730430231fd1412..04fc7e930aa9b7a3f1dd4bd2dcc58d07eca361cf 100644 (file)
@@ -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 (file)
index 0000000..9def2a1
--- /dev/null
@@ -0,0 +1,31 @@
+// PR c++/38877
+
+template<class _T1, class _T2>
+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<class _T1, class _T2>
+inline pair<_T1, _T2>
+make_pair(_T1 __x, _T2 __y)
+{
+    return pair<_T1, _T2>(__x, __y);
+}
+
+template <int dim> class bar;
+
+template <int dim>
+pair<bar<dim> *, unsigned int>
+foo (unsigned int position)
+{  
+      const pair<int,unsigned int> tmp;
+      return make_pair (new bar<dim>(tmp.first),
+                             position);
+ }