]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
flag-types.h (enum ivar_visibility): Add.
authorDimitris Papavasiliou <dpapavas@gmail.com>
Thu, 24 Apr 2014 15:58:44 +0000 (15:58 +0000)
committerMike Stump <mrs@gcc.gnu.org>
Thu, 24 Apr 2014 15:58:44 +0000 (15:58 +0000)
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

gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c.opt
gcc/flag-types.h
gcc/objc/ChangeLog
gcc/objc/objc-act.c

index 5e91288075d9973b5ad2aa6e1c2bddc562d0c42c..a29383083b3759d9a038e14e8b3cbaca1f58d166 100644 (file)
@@ -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
index d9e39ed80fe1ba0c1304f2ca293a9c871d53d0f9..1b466ac4b51cd6fa906bf817559791f9e373ed10 100644 (file)
@@ -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.
index 390c056becc8f8063309b5d4797a30d95400f594..2bc06ba7bbac94a1bdeebb93536873fd8e80bcda 100644 (file)
@@ -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)
 
index 97382719ff777cac0161540b8efac2f4609be285..fc3261bbbb72b2d1f98386d6ba7cd13efb541811 100644 (file)
@@ -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
 {
index ca9841eed55ca8872f01c23a7e2960abdabd1e73..c10aa891d3da4842127716248749145b9fd27bd0 100644 (file)
@@ -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
index cb0b5ac6a763f3a6a9ef4a4f5729e7359337920c..cda345b3de835a960c659ce04c63c9fc8365dda2 100644 (file)
@@ -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;
     }