diff options
author | Marc Glisse <marc.glisse@inria.fr> | 2012-10-12 16:14:37 +0200 |
---|---|---|
committer | Marc Glisse <glisse@gcc.gnu.org> | 2012-10-12 14:14:37 +0000 |
commit | 5e54f81df1b2336a3ddc4f77180f4e579436b663 (patch) | |
tree | 5da8b5b508b980a39d2baba4a7cdd2679a5858b9 /gcc | |
parent | 7e4dd63d9d4143d27dfa7692039b4f48854c1d99 (diff) | |
download | gcc-5e54f81df1b2336a3ddc4f77180f4e579436b663.zip gcc-5e54f81df1b2336a3ddc4f77180f4e579436b663.tar.gz gcc-5e54f81df1b2336a3ddc4f77180f4e579436b663.tar.bz2 |
re PR c++/53055 (ICE in cp_build_indirect_ref, at cp/typeck.c:2836)
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/c-family/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/c-family/c-common.h | 4 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/call.c | 2 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/pr53055.C | 5 |
7 files changed, 29 insertions, 2 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 04b6971..c740e44 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -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 diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h index cb18b4e..66d90a3 100644 --- a/gcc/c-family/c-common.h +++ b/gcc/c-family/c-common.h @@ -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. */ diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 549ddbd..ad76541 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 3351a58..c94bbbe 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -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); diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 13e75ab..eaa0935 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -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 (); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9f3d299..3b9f121 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..787af9d --- /dev/null +++ b/gcc/testsuite/g++.dg/pr53055.C @@ -0,0 +1,5 @@ +// PR c++/53055 +// { dg-do compile } + +struct A A :: * p ; +int i = p ->* p ; // { dg-error "" } |