diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5e91288075d9..a29383083b37 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2014-04-24 Dimitris Papavasiliou + + * flag-types.h (enum ivar_visibility): Add. + 2014-04-24 Trevor Saunders * config/sh/sh_treg_combine.c (sh_treg_combine::execute): Take diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index d9e39ed80fe1..1b466ac4b51c 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,7 @@ +2014-04-24 Dimitris Papavasiliou + + * c.opt (Wshadow-ivar, flocal-ivars, fivar-visibility): Add. + 2014-04-23 Marek Polacek * c-common.c (handle_tm_wrap_attribute): Tweak error message. diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index 390c056becc8..2bc06ba7bbac 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -684,6 +684,10 @@ Wselector ObjC ObjC++ Var(warn_selector) Warning Warn if a selector has multiple methods +Wshadow-ivar +ObjC ObjC++ Var(warn_shadow_ivar) Init(-1) Warning +Warn if a local declaration hides an instance variable + Wsequence-point C ObjC C++ ObjC++ Var(warn_sequence_point) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall) Warn about possible violations of sequence point rules @@ -1038,6 +1042,29 @@ fnil-receivers ObjC ObjC++ Var(flag_nil_receivers) Init(1) Assume that receivers of Objective-C messages may be nil +flocal-ivars +ObjC ObjC++ Var(flag_local_ivars) Init(1) +Allow access to instance variables as if they were local declarations within instance method implementations. + +fivar-visibility= +ObjC ObjC++ Joined RejectNegative Enum(ivar_visibility) Var(default_ivar_visibility) Init(IVAR_VISIBILITY_PROTECTED) +-fvisibility=[private|protected|public|package] Set the default symbol visibility + +Enum +Name(ivar_visibility) Type(enum ivar_visibility) UnknownError(unrecognized ivar visibility value %qs) + +EnumValue +Enum(ivar_visibility) String(private) Value(IVAR_VISIBILITY_PRIVATE) + +EnumValue +Enum(ivar_visibility) String(protected) Value(IVAR_VISIBILITY_PROTECTED) + +EnumValue +Enum(ivar_visibility) String(public) Value(IVAR_VISIBILITY_PUBLIC) + +EnumValue +Enum(ivar_visibility) String(package) Value(IVAR_VISIBILITY_PACKAGE) + fnonansi-builtins C++ ObjC++ Var(flag_no_nonansi_builtin, 0) diff --git a/gcc/flag-types.h b/gcc/flag-types.h index 97382719ff77..fc3261bbbb72 100644 --- a/gcc/flag-types.h +++ b/gcc/flag-types.h @@ -104,6 +104,16 @@ enum symbol_visibility }; #endif +/* Enumerate Objective-c instance variable visibility settings. */ + +enum ivar_visibility +{ + IVAR_VISIBILITY_PRIVATE, + IVAR_VISIBILITY_PROTECTED, + IVAR_VISIBILITY_PUBLIC, + IVAR_VISIBILITY_PACKAGE +}; + /* The stack reuse level. */ enum stack_reuse_level { diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog index ca9841eed55c..c10aa891d3da 100644 --- a/gcc/objc/ChangeLog +++ b/gcc/objc/ChangeLog @@ -1,3 +1,11 @@ +2014-04-24 Dimitris Papavasiliou + + * objc-act.c (objc_ivar_visibility, objc_default_ivar_visibility): Add. + (objc_init): Initialize objc_default_ivar_visibility. + (objc_start_class_interface): Use objc_default_ivar_visibility. + (objc_start_class_implementation): Likewise. + (objc_lookup_ivar): Implement -fno-local-ivars. + 2014-01-31 Marek Polacek PR c/59963 diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index cb0b5ac6a763..cda345b3de83 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -226,7 +226,7 @@ struct imp_entry *imp_list = 0; int imp_count = 0; /* `@implementation' */ int cat_count = 0; /* `@category' */ -objc_ivar_visibility_kind objc_ivar_visibility; +objc_ivar_visibility_kind objc_ivar_visibility, objc_default_ivar_visibility; /* Use to generate method labels. */ static int method_slot = 0; @@ -394,6 +394,22 @@ objc_init (void) if (!ok) return false; + /* Determine the default visibility for instance variables. */ + switch (default_ivar_visibility) + { + case IVAR_VISIBILITY_PRIVATE: + objc_default_ivar_visibility = OBJC_IVAR_VIS_PRIVATE; + break; + case IVAR_VISIBILITY_PUBLIC: + objc_default_ivar_visibility = OBJC_IVAR_VIS_PUBLIC; + break; + case IVAR_VISIBILITY_PACKAGE: + objc_default_ivar_visibility = OBJC_IVAR_VIS_PACKAGE; + break; + default: + objc_default_ivar_visibility = OBJC_IVAR_VIS_PROTECTED; + } + /* Generate general types and push runtime-specific decls to file scope. */ synth_module_prologue (); @@ -568,7 +584,7 @@ objc_start_class_interface (tree klass, tree super_class, objc_interface_context = objc_ivar_context = start_class (CLASS_INTERFACE_TYPE, klass, super_class, protos, attributes); - objc_ivar_visibility = OBJC_IVAR_VIS_PROTECTED; + objc_ivar_visibility = objc_default_ivar_visibility; } void @@ -646,7 +662,7 @@ objc_start_class_implementation (tree klass, tree super_class) = objc_ivar_context = start_class (CLASS_IMPLEMENTATION_TYPE, klass, super_class, NULL_TREE, NULL_TREE); - objc_ivar_visibility = OBJC_IVAR_VIS_PROTECTED; + objc_ivar_visibility = objc_default_ivar_visibility; } void @@ -9366,6 +9382,12 @@ objc_lookup_ivar (tree other, tree id) && other && other != error_mark_node) return other; + /* Don't look up the ivar if the user has explicitly advised against + it with -fno-local-ivars. */ + + if (!flag_local_ivars) + return other; + /* Look up the ivar, but do not use it if it is not accessible. */ ivar = is_ivar (objc_ivar_chain, id); @@ -9382,8 +9404,11 @@ objc_lookup_ivar (tree other, tree id) && !DECL_FILE_SCOPE_P (other)) #endif { - warning (0, "local declaration of %qE hides instance variable", id); - + if (warn_shadow_ivar == 1 || (warn_shadow && warn_shadow_ivar != 0)) { + warning (warn_shadow_ivar ? OPT_Wshadow_ivar : OPT_Wshadow, + "local declaration of %qE hides instance variable", id); + } + return other; }