aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitris Papavasiliou <dpapavas@gmail.com>2014-04-24 15:58:44 +0000
committerMike Stump <mrs@gcc.gnu.org>2014-04-24 15:58:44 +0000
commitdcaaa5a04a88256c5838696742be5efb6ced353a (patch)
treeba1651fb43cb7ce456f3f31e912458a294219553
parent07fb62554c2667cc35033f7c6439acf3e35e1996 (diff)
downloadgcc-dcaaa5a04a88256c5838696742be5efb6ced353a.zip
gcc-dcaaa5a04a88256c5838696742be5efb6ced353a.tar.gz
gcc-dcaaa5a04a88256c5838696742be5efb6ced353a.tar.bz2
flag-types.h (enum ivar_visibility): Add.
2014-04-24 Dimitris Papavasiliou <dpapavas@gmail.com> * flag-types.h (enum ivar_visibility): Add. c-family: * c.opt (Wshadow-ivar, flocal-ivars, fivar-visibility): Add. objc: * 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. From-SVN: r209753
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/c-family/ChangeLog4
-rw-r--r--gcc/c-family/c.opt27
-rw-r--r--gcc/flag-types.h10
-rw-r--r--gcc/objc/ChangeLog8
-rw-r--r--gcc/objc/objc-act.c35
6 files changed, 83 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5e91288..a2938308 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,7 @@
+2014-04-24 Dimitris Papavasiliou <dpapavas@gmail.com>
+
+ * flag-types.h (enum ivar_visibility): Add.
+
2014-04-24 Trevor Saunders <tsaunders@mozilla.com>
* config/sh/sh_treg_combine.c (sh_treg_combine::execute): Take
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index d9e39ed..1b466ac 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,3 +1,7 @@
+2014-04-24 Dimitris Papavasiliou <dpapavas@gmail.com>
+
+ * c.opt (Wshadow-ivar, flocal-ivars, fivar-visibility): Add.
+
2014-04-23 Marek Polacek <polacek@redhat.com>
* 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 390c056..2bc06ba 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 9738271..fc3261b 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 ca9841e..c10aa89 100644
--- a/gcc/objc/ChangeLog
+++ b/gcc/objc/ChangeLog
@@ -1,3 +1,11 @@
+2014-04-24 Dimitris Papavasiliou <dpapavas@gmail.com>
+
+ * 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 <polacek@redhat.com>
PR c/59963
diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c
index cb0b5ac..cda345b 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;
}