From cf3caeaf0ac59e858ff2ae54e59dc5a2bf51961d Mon Sep 17 00:00:00 2001 From: Nicola Pero Date: Tue, 12 Apr 2011 17:37:39 +0000 Subject: [PATCH] In gcc/objc/: 2011-04-12 Nicola Pero In gcc/objc/: 2011-04-12 Nicola Pero * objc-act.c (printable_ivar_name): New. (add_instance_variable): Call printable_ivar_name() when an error message needs to be printed. Do not prepare the instance variable for printing unless there is an actual error. From-SVN: r172328 --- gcc/objc/ChangeLog | 7 +++++++ gcc/objc/objc-act.c | 24 +++++++++++++++++------- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog index e9e3be6..2c38853 100644 --- a/gcc/objc/ChangeLog +++ b/gcc/objc/ChangeLog @@ -1,5 +1,12 @@ 2011-04-12 Nicola Pero + * objc-act.c (printable_ivar_name): New. + (add_instance_variable): Call printable_ivar_name() when an error + message needs to be printed. Do not prepare the instance variable + for printing unless there is an actual error. + +2011-04-12 Nicola Pero + * objc-act.c (objc_is_class_name, objc_is_id): For efficiency, avoid calling identifier_global_value() multiple times. diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index dd81fd1..75e11da 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -5983,6 +5983,17 @@ flexible_array_type_p (tree type) } #endif +/* Produce a printable version of an ivar name. This is only used + inside add_instance_variable. */ +static const char * +printable_ivar_name (tree field_decl) +{ + if (DECL_NAME (field_decl)) + return identifier_to_locale (IDENTIFIER_POINTER (DECL_NAME (field_decl))); + else + return _(""); +} + /* Called after parsing each instance variable declaration. Necessary to preserve typedefs and implement public/private... @@ -5993,15 +6004,12 @@ add_instance_variable (tree klass, objc_ivar_visibility_kind visibility, tree field_decl) { tree field_type = TREE_TYPE (field_decl); - const char *ivar_name = DECL_NAME (field_decl) - ? identifier_to_locale (IDENTIFIER_POINTER (DECL_NAME (field_decl))) - : _(""); #ifdef OBJCPLUS if (TREE_CODE (field_type) == REFERENCE_TYPE) { error ("illegal reference type specified for instance variable %qs", - ivar_name); + printable_ivar_name (field_decl)); /* Return class as is without adding this ivar. */ return klass; } @@ -6011,7 +6019,8 @@ add_instance_variable (tree klass, objc_ivar_visibility_kind visibility, || TYPE_SIZE (field_type) == error_mark_node) /* 'type[0]' is allowed, but 'type[]' is not! */ { - error ("instance variable %qs has unknown size", ivar_name); + error ("instance variable %qs has unknown size", + printable_ivar_name (field_decl)); /* Return class as is without adding this ivar. */ return klass; } @@ -6031,7 +6040,8 @@ add_instance_variable (tree klass, objc_ivar_visibility_kind visibility, to calculate the offset of the next instance variable. */ if (flexible_array_type_p (field_type)) { - error ("instance variable %qs uses flexible array member", ivar_name); + error ("instance variable %qs uses flexible array member", + printable_ivar_name (field_decl)); /* Return class as is without adding this ivar. */ return klass; } @@ -6078,7 +6088,7 @@ add_instance_variable (tree klass, objc_ivar_visibility_kind visibility, error ("type %qE has virtual member functions", type_name); error ("illegal aggregate type %qE specified " "for instance variable %qs", - type_name, ivar_name); + type_name, printable_ivar_name (field_decl)); /* Return class as is without adding this ivar. */ return klass; } -- 2.7.4