diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9ba828fd45e..d9d27245e38 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2010-12-09 Nathan Froyd + + * c-typeck.c (build_indirect_ref): Call invalid_indirection_error. + 2010-12-09 Joseph Myers * doc/extend.texi (Attribute Syntax): Correct description of diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 2ea3960170f..495816b6a00 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,8 @@ +2010-12-09 Nathan Froyd + + * c-common.h (invalid_indirection_error): Declare. + * c-common.c (invalid_indirection_error): Define. + 2010-12-03 Richard Guenther PR c/46745 diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 7a57838a857..8d0fcc388fe 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -8585,6 +8585,43 @@ lvalue_error (enum lvalue_use use) gcc_unreachable (); } } + +/* Print an error message for an invalid indirection of type TYPE. + ERRSTRING is the name of the operator for the indirection. */ + +void +invalid_indirection_error (location_t loc, tree type, ref_operator errstring) +{ + switch (errstring) + { + case RO_NULL: + gcc_assert (c_dialect_cxx ()); + error_at (loc, "invalid type argument (have %qT)", type); + break; + case RO_ARRAY_INDEXING: + error_at (loc, + "invalid type argument of array indexing (have %qT)", + type); + break; + case RO_UNARY_STAR: + error_at (loc, + "invalid type argument of unary %<*%> (have %qT)", + type); + break; + case RO_ARROW: + error_at (loc, + "invalid type argument of %<->%> (have %qT)", + type); + break; + case RO_IMPLICIT_CONVERSION: + error_at (loc, + "invalid type argument of implicit conversion (have %qT)", + type); + break; + default: + gcc_unreachable (); + } +} /* *PTYPE is an incomplete array. Complete it with a domain based on INITIAL_VALUE. If INITIAL_VALUE is not present, use 1 if DO_DEFAULT diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h index 928e5021d23..b6f8d398657 100644 --- a/gcc/c-family/c-common.h +++ b/gcc/c-family/c-common.h @@ -929,6 +929,7 @@ enum lvalue_use { }; extern void lvalue_error (enum lvalue_use); +extern void invalid_indirection_error (location_t, tree, ref_operator); extern int complete_array_type (tree *, tree, bool); diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 7bba44ed3ef..cbe9f209220 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -2267,26 +2267,8 @@ build_indirect_ref (location_t loc, tree ptr, ref_operator errstring) } } else if (TREE_CODE (pointer) != ERROR_MARK) - switch (errstring) - { - case RO_ARRAY_INDEXING: - error_at (loc, - "invalid type argument of array indexing (have %qT)", - type); - break; - case RO_UNARY_STAR: - error_at (loc, - "invalid type argument of unary %<*%> (have %qT)", - type); - break; - case RO_ARROW: - error_at (loc, - "invalid type argument of %<->%> (have %qT)", - type); - break; - default: - gcc_unreachable (); - } + invalid_indirection_error (loc, type, errstring); + return error_mark_node; } diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3c14d737d2b..ae7d057a11b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,7 @@ +2010-12-09 Nathan Froyd + + * typeck.c (cp_build_indirect_ref): Call invalid_indirection_error. + 2010-12-09 Nathan Froyd * typeck.c (composite_pointer_error): New function. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index a4bbd4eb137..f055bbce2b1 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -2776,23 +2776,8 @@ cp_build_indirect_ref (tree ptr, ref_operator errorstring, gcc_unreachable (); } else if (pointer != error_mark_node) - switch (errorstring) - { - case RO_NULL: - error ("invalid type argument"); - break; - case RO_ARRAY_INDEXING: - error ("invalid type argument of array indexing"); - break; - case RO_UNARY_STAR: - error ("invalid type argument of unary %<*%>"); - break; - case RO_IMPLICIT_CONVERSION: - error ("invalid type argument of implicit conversion"); - break; - default: - gcc_unreachable (); - } + invalid_indirection_error (input_location, type, errorstring); + return error_mark_node; }