aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Wood <wood@gnu.org>1993-05-01 10:48:31 +0000
committerTom Wood <wood@gnu.org>1993-05-01 10:48:31 +0000
commita878dab7efe69318fa71d9c7249eaaf4e150b6c8 (patch)
treeacd7a164e29bdbeee353718f6085a6347cc53882
parent257e61ed70f52c514f9486ee4d37a501245a069b (diff)
downloadgcc-a878dab7efe69318fa71d9c7249eaaf4e150b6c8.zip
gcc-a878dab7efe69318fa71d9c7249eaaf4e150b6c8.tar.gz
gcc-a878dab7efe69318fa71d9c7249eaaf4e150b6c8.tar.bz2
(build_ivar_reference): Warn when a class method
refers to an instance variable. From-SVN: r4294
-rw-r--r--gcc/objc/objc-act.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c
index 6a973b6..0968f1e 100644
--- a/gcc/objc/objc-act.c
+++ b/gcc/objc/objc-act.c
@@ -4739,7 +4739,20 @@ build_ivar_reference (id)
tree id;
{
if (TREE_CODE (method_context) == CLASS_METHOD_DECL)
- TREE_TYPE (self_decl) = instance_type; /* cast */
+ {
+ /* Historically, a class method that produced objects (factory
+ method) would assign `self' to the instance that it
+ allocated. This would effectively turn the class method into
+ an instance method. Following this assignment, the instance
+ variables could be accessed. That practice, while safe,
+ violates the simple rule that a class method should not refer
+ to an instance variable. It's better to catch the cases
+ where this is done unknowingly than to support the above
+ paradigm. */
+ warning ("instance variable `%s' accessed in class method",
+ IDENTIFIER_POINTER (id));
+ TREE_TYPE (self_decl) = instance_type; /* cast */
+ }
return build_component_ref (build_indirect_ref (self_decl, "->"), id);
}