]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/53055 (ICE in cp_build_indirect_ref, at cp/typeck.c:2836)
authorMarc Glisse <marc.glisse@inria.fr>
Fri, 12 Oct 2012 14:14:37 +0000 (16:14 +0200)
committerMarc Glisse <glisse@gcc.gnu.org>
Fri, 12 Oct 2012 14:14:37 +0000 (14:14 +0000)
2012-10-12  Marc Glisse  <marc.glisse@inria.fr>

PR c++/53055

gcc/c-family/
* c-common.h (enum ref_operator) [RO_ARROW_STAR]: New.

gcc/cp/
* call.c (build_new_op_1): Pass RO_ARROW_STAR to cp_build_indirect_ref.
* typeck.c (cp_build_indirect_ref): Handle RO_ARROW_STAR.

gcc/testsuite/
* g++.dg/pr53055.C: New testcase.

From-SVN: r192401

gcc/c-family/ChangeLog
gcc/c-family/c-common.h
gcc/cp/ChangeLog
gcc/cp/call.c
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/pr53055.C [new file with mode: 0644]

index 04b6971fef76cdc60f867ee36cfc006441096eb4..c740e449383944a59b09330fc24852c7c5742b21 100644 (file)
@@ -1,3 +1,8 @@
+2012-10-12  Marc Glisse  <marc.glisse@inria.fr>
+
+       PR c++/53055
+       * c-common.h (enum ref_operator) [RO_ARROW_STAR]: New.
+
 2012-10-11  Eric Botcazou  <ebotcazou@adacore.com>
 
        * c-ada-spec.c (dump_ada_template): Bail out for template declarations
index cb18b4e0747f38c441ea289e56d65ea4f36b8dce..66d90a345709e12a48ba97260234f07ca9602850 100644 (file)
@@ -477,7 +477,9 @@ typedef enum ref_operator {
   /* -> */
   RO_ARROW,
   /* implicit conversion */
-  RO_IMPLICIT_CONVERSION
+  RO_IMPLICIT_CONVERSION,
+  /* ->* */
+  RO_ARROW_STAR
 } ref_operator;
 
 /* Information about a statement tree.  */
index 549ddbdc31980077f119e8ad2fa0efc3d19b671e..ad765412832fc9bc94c6d771748b73d6c8d20fee 100644 (file)
@@ -1,3 +1,9 @@
+2012-10-12  Marc Glisse  <marc.glisse@inria.fr>
+
+       PR c++/53055
+       * call.c (build_new_op_1): Pass RO_ARROW_STAR to cp_build_indirect_ref.
+       * typeck.c (cp_build_indirect_ref): Handle RO_ARROW_STAR.
+
 2012-10-11  Jason Merrill  <jason@redhat.com>
 
        * cp-tree.h (DECL_THUNKS): NULL_TREE for non-virtual functions.
index 3351a585f2b4588d9a0ce6f17f229c3908a2a45b..c94bbbe3c08d13c75ad1b294c2b8e102a29f4d1a 100644 (file)
@@ -5309,7 +5309,7 @@ build_new_op_1 (location_t loc, enum tree_code code, int flags, tree arg1,
       return cp_build_array_ref (input_location, arg1, arg2, complain);
 
     case MEMBER_REF:
-      return build_m_component_ref (cp_build_indirect_ref (arg1, RO_NULL
+      return build_m_component_ref (cp_build_indirect_ref (arg1, RO_ARROW_STAR
                                                            complain), 
                                     arg2, complain);
 
index 13e75ab9ebf260e45bd205b46446825fcc9b03df..eaa0935dc98674865aaf1adbb84cea15d221aee2 100644 (file)
@@ -2908,6 +2908,10 @@ cp_build_indirect_ref (tree ptr, ref_operator errorstring,
          case RO_IMPLICIT_CONVERSION:
            error ("invalid use of implicit conversion on pointer to member");
            break;
+         case RO_ARROW_STAR:
+           error ("left hand operand of %<->*%> must be a pointer to class, "
+                 "but is a pointer to member of type %qT", type);
+           break;
          default:
            gcc_unreachable ();
       }
index 9f3d29906f9abaa6b7fc5661a86fb2e0375ab526..3b9f121baea2516f7f1798cc98a1ca3331d78f39 100644 (file)
@@ -1,3 +1,8 @@
+2012-10-12  Marc Glisse  <marc.glisse@inria.fr>
+
+       PR c++/53055
+       * g++.dg/pr53055.C: New testcase.
+
 2012-10-12  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/52744
diff --git a/gcc/testsuite/g++.dg/pr53055.C b/gcc/testsuite/g++.dg/pr53055.C
new file mode 100644 (file)
index 0000000..787af9d
--- /dev/null
@@ -0,0 +1,5 @@
+// PR c++/53055
+// { dg-do compile }
+
+struct A A :: * p ;
+int i = p ->* p ; // { dg-error "" }