From patchwork Thu Dec 9 18:16:30 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nathan Froyd X-Patchwork-Id: 74954 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 451A4B70A4 for ; Fri, 10 Dec 2010 05:16:41 +1100 (EST) Received: (qmail 3577 invoked by alias); 9 Dec 2010 18:16:39 -0000 Received: (qmail 3568 invoked by uid 22791); 9 Dec 2010 18:16:38 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=AWL, BAYES_00, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (38.113.113.100) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 09 Dec 2010 18:16:34 +0000 Received: (qmail 20708 invoked from network); 9 Dec 2010 18:16:32 -0000 Received: from unknown (HELO codesourcery.com) (froydnj@127.0.0.2) by mail.codesourcery.com with ESMTPA; 9 Dec 2010 18:16:32 -0000 Date: Thu, 9 Dec 2010 13:16:30 -0500 From: Nathan Froyd To: gcc-patches@gcc.gnu.org Subject: [PATCH] unify c/c++ error handling for simple indirections Message-ID: <20101209181629.GK25904@nightcrawler> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.20 (2009-06-14) X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org For whatever reason, the C and C++ front-ends report invalid indirections in different ways. The patch below unifies them into a common routine, invalid_indirection_error. This change has the pleasant side-effect of printing out type information in the C++ front-end for such errors. If folks want to change the error messages later, it also becomes somewhat easier. Tested on x86_64-unknown-linux-gnu. OK to commit? -Nathan gcc/ * c-typeck.c (build_indirect_ref): Call invalid_indirection_error. gcc/c-family/ * c-common.h (invalid_indirection_error): Declare. * c-common.c (invalid_indirection_error): Define. gcc/cp/ * typeck.c (cp_build_indirect_ref): Call invalid_indirection_error. diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 7a57838..b3d0ea5 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -8585,6 +8585,42 @@ 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: + 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 928e502..b6f8d39 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 7bba44e..cbe9f20 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/typeck.c b/gcc/cp/typeck.c index 7416f09..fc9ad7d 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -2804,23 +2804,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; }