re PR c++/52596 ([C++11] internal compiler error: in lvalue_kind, at cp/tree.c:153)
authorJason Merrill <jason@redhat.com>
Fri, 6 Apr 2012 13:25:45 +0000 (09:25 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 6 Apr 2012 13:25:45 +0000 (09:25 -0400)
PR c++/52596
* semantics.c (finish_non_static_data_member): In templates, pass
the decl to build_qualified_name.
* tree.c (lvalue_kind) [SCOPE_REF]: Handle FIELD_DECL.

From-SVN: r186187

gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/cp/tree.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/qualified-id5.C [new file with mode: 0644]

index 1b93ecd134d888b99b60cb73b69724d68564b1b6..78c43691d45557b61590f6c707db909b35ce2722 100644 (file)
@@ -1,3 +1,10 @@
+2012-04-05  Jason Merrill  <jason@redhat.com>
+
+       PR c++/52596
+       * semantics.c (finish_non_static_data_member): In templates, pass
+       the decl to build_qualified_name.
+       * tree.c (lvalue_kind) [SCOPE_REF]: Handle FIELD_DECL.
+
 2012-04-04  Jason Merrill  <jason@redhat.com>
 
        PR c++/52845
index 65b771f1ee2ab5cf28d037e45f35f1435e38c000..9bdd2ee1c89c314fb9c3fe11c94ca2ed665ec491 100644 (file)
@@ -1590,7 +1590,7 @@ finish_non_static_data_member (tree decl, tree object, tree qualifying_scope)
   else if (processing_template_decl)
     return build_qualified_name (TREE_TYPE (decl),
                                 qualifying_scope,
-                                DECL_NAME (decl),
+                                decl,
                                 /*template_p=*/false);
   else
     {
index 30ad5e1b7be6563912c91cde5b8f272fc5460e9b..05777594e5462d3c7d7e3c76703c8dce55bcc0c0 100644 (file)
@@ -151,8 +151,14 @@ lvalue_kind (const_tree ref)
       /* A scope ref in a template, left as SCOPE_REF to support later
         access checking.  */
     case SCOPE_REF:
-      gcc_assert (!type_dependent_expression_p (CONST_CAST_TREE(ref)));
-      return lvalue_kind (TREE_OPERAND (ref, 1));
+      gcc_assert (!type_dependent_expression_p (CONST_CAST_TREE (ref)));
+      {
+       tree op = TREE_OPERAND (ref, 1);
+       if (TREE_CODE (op) == FIELD_DECL)
+         return (DECL_C_BIT_FIELD (op) ? clk_bitfield : clk_ordinary);
+       else
+         return lvalue_kind (op);
+      }
 
     case MAX_EXPR:
     case MIN_EXPR:
index cde30efa5a17b4dfc70264be38b69712b5f853d8..946f02ecf37b6137322702c57a667c5357f796c4 100644 (file)
@@ -1,3 +1,8 @@
+2012-04-05  Jason Merrill  <jason@redhat.com>
+
+       PR c++/52596
+       * g++.dg/template/qualified-id5.C: New.
+
 2012-04-05  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/52882
diff --git a/gcc/testsuite/g++.dg/template/qualified-id5.C b/gcc/testsuite/g++.dg/template/qualified-id5.C
new file mode 100644 (file)
index 0000000..3126d33
--- /dev/null
@@ -0,0 +1,17 @@
+// PR c++/52596
+
+struct msgpack_zone_finalizer_array {
+    int* tail;
+};
+struct msgpack_zone {
+    msgpack_zone_finalizer_array finalizer_array;
+};
+struct zone : public msgpack_zone {
+    template <typename T> T* allocate();
+
+};
+template <typename T>
+T* zone::allocate()
+{
+  --msgpack_zone::finalizer_array.tail;
+}