(build_ivar_reference): Warn when a class method
refers to an instance variable. From-SVN: r4294
This commit is contained in:
parent
257e61ed70
commit
a878dab7ef
@ -4739,7 +4739,20 @@ build_ivar_reference (id)
|
|||||||
tree id;
|
tree id;
|
||||||
{
|
{
|
||||||
if (TREE_CODE (method_context) == CLASS_METHOD_DECL)
|
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);
|
return build_component_ref (build_indirect_ref (self_decl, "->"), id);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user