From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13331 invoked by alias); 28 Apr 2014 10:32:17 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 13315 invoked by uid 89); 28 Apr 2014 10:32:17 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=AWL,BAYES_05,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-ee0-f53.google.com Received: from mail-ee0-f53.google.com (HELO mail-ee0-f53.google.com) (74.125.83.53) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Mon, 28 Apr 2014 10:32:14 +0000 Received: by mail-ee0-f53.google.com with SMTP id b57so4695363eek.40 for ; Mon, 28 Apr 2014 03:32:10 -0700 (PDT) X-Received: by 10.15.81.135 with SMTP id x7mr2603074eey.61.1398681130902; Mon, 28 Apr 2014 03:32:10 -0700 (PDT) Received: from [192.168.1.12] (ppp-94-65-200-222.home.otenet.gr. [94.65.200.222]) by mx.google.com with ESMTPSA id s46sm49216873ees.3.2014.04.28.03.32.08 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 28 Apr 2014 03:32:09 -0700 (PDT) Message-ID: <535E2EF9.3070500@gmail.com> Date: Mon, 28 Apr 2014 10:37:00 -0000 From: Dimitris Papavasiliou User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.12) Gecko/20130116 Icedove/10.0.12 MIME-Version: 1.0 To: Mike Stump CC: "gcc-patches@gcc.gnu.org Patches" Subject: Re: [PATCH] Add a couple of dialect and warning options regarding Objective-C instance variable scope References: <52F35508.4080205@gmail.com> <5486E33D-B8F6-473F-8F33-6A7DEECB45A8@comcast.net> <5359999C.7090607@gmail.com> <757BB622-2CA8-4C9A-BCA9-AAD1FDF8F14F@comcast.net> <535A8EA8.5040706@gmail.com> <80E7465A-6FE8-475D-873E-FF2F2C8EC2ED@comcast.net> In-Reply-To: <80E7465A-6FE8-475D-873E-FF2F2C8EC2ED@comcast.net> Content-Type: multipart/mixed; boundary="------------090206080208030302020209" X-IsSubscribed: yes X-SW-Source: 2014-04/txt/msg01834.txt.bz2 This is a multi-part message in MIME format. --------------090206080208030302020209 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 8bit Content-length: 1855 On 04/25/2014 07:50 PM, Mike Stump wrote: > On Apr 25, 2014, at 9:34 AM, Dimitris Papavasiliou wrote: > >> --Wreturn-type -Wsequence-point -Wshadow @gol >> +-Wreturn-type -Wsequence-point -Wshadow -Wshadow-ivar @gol > > This has to be -Wno-shadow-ivar, we document the non-default… > >> +@item -Wshadow-ivar @r{(Objective-C only)} > > Likewise. > >> + /* Check wheter the local variable hides the instance variable. */ > > spelling, whether... Fixed these. >> + a = private; /* { dg-warning "hides instance variable" "" { xfail *-*-* } } */ >> + a = protected; /* { dg-warning "hides instance variable" "" { xfail *-*-* } } */ >> + a = public; /* { dg-warning "hides instance variable" "" { xfail *-*-* } } */ > > No, we don’t expect failures. We makes the compiler do what we wants or it gets the hose again. Then, we expect it to be perfect. If you won’t want warning, and non are produces, then just remove the /* … */, or write /* no warning */. I've fixed these as per your request. For the record though, this form of test seems to be fairly common in the test suites as this output indicates: dimitris@debian:~/sandbox/gcc-build$ find ../gcc-source/gcc/testsuite/ -name "*.c" -o -name "*.C" -o -name "*.m" | xargs grep "xfail \*-\*-\*" | wc -l 354 Many of these seem to be in error or warning messages which are expected not to show up. In any case if the messages do show up they'll trigger the excessive messages test so I suppose that's enough. > Also, synth up the ChnageLogs… :-), they are trivial enough. Done. > And, just pop them all into one patch (cd ..; svn diff), 3 is 3x the work for me. Attached. > Once we resolve the 3 warning tests above, this will be ok. Actually, there were a few more { xfail *-*-* } in the other test cases. I've removed these as well. Dimitris --------------090206080208030302020209 Content-Type: text/x-patch; name="tests_and_docs.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="tests_and_docs.patch" Content-length: 14192 Index: gcc/c-family/c.opt =================================================================== --- gcc/c-family/c.opt (revision 209852) +++ gcc/c-family/c.opt (working copy) @@ -685,7 +685,7 @@ Warn if a selector has multiple methods Wshadow-ivar -ObjC ObjC++ Var(warn_shadow_ivar) Init(1) Warning +ObjC ObjC++ Var(warn_shadow_ivar) EnabledBy(Wshadow) Init(1) Warning Warn if a local declaration hides an instance variable Wsequence-point Index: gcc/doc/invoke.texi =================================================================== --- gcc/doc/invoke.texi (revision 209852) +++ gcc/doc/invoke.texi (working copy) @@ -216,6 +216,8 @@ -fobjc-gc @gol -fobjc-nilcheck @gol -fobjc-std=objc1 @gol +-fno-local-ivars @gol +-fivar-visibility=@var{public|protected|private|package} @gol -freplace-objc-classes @gol -fzero-link @gol -gen-decls @gol @@ -261,7 +263,7 @@ -Wparentheses -Wpedantic-ms-format -Wno-pedantic-ms-format @gol -Wpointer-arith -Wno-pointer-to-int-cast @gol -Wredundant-decls -Wno-return-local-addr @gol --Wreturn-type -Wsequence-point -Wshadow @gol +-Wreturn-type -Wsequence-point -Wshadow -Wno-shadow-ivar @gol -Wsign-compare -Wsign-conversion -Wfloat-conversion @gol -Wsizeof-pointer-memaccess @gol -Wstack-protector -Wstack-usage=@var{len} -Wstrict-aliasing @gol @@ -2976,6 +2978,22 @@ The GNU runtime currently always retains calls to @code{objc_get_class("@dots{}")} regardless of command-line options. +@item -fno-local-ivars +@opindex fno-local-ivars +@opindex flocal-ivars +By default instance variables in Objective-C can be accessed as if +they were local variables from within the methods of the class they're +declared in. This can lead to shadowing between instance variables +and other variables declared either locally inside a class method or +globally with the same name. Specifying the @option{-fno-local-ivars} +flag disables this behavior thus avoiding variable shadowing issues. + +@item -fivar-visibility=@var{public|protected|private|package} +@opindex fivar-visibility +Set the default instance variable visibility to the specified option +so that instance variables declared outside the scope of any access +modifier directives default to the specified visibility. + @item -gen-decls @opindex gen-decls Dump interface declarations for all classes seen in the source file to a @@ -4350,11 +4368,18 @@ @item -Wshadow @opindex Wshadow @opindex Wno-shadow -Warn whenever a local variable or type declaration shadows another variable, -parameter, type, or class member (in C++), or whenever a built-in function -is shadowed. Note that in C++, the compiler warns if a local variable -shadows an explicit typedef, but not if it shadows a struct/class/enum. +Warn whenever a local variable or type declaration shadows another +variable, parameter, type, class member (in C++), or instance variable +(in Objective-C) or whenever a built-in function is shadowed. Note +that in C++, the compiler warns if a local variable shadows an +explicit typedef, but not if it shadows a struct/class/enum. +@item -Wno-shadow-ivar @r{(Objective-C only)} +@opindex Wno-shadow-ivar +@opindex Wshadow-ivar +Do not warn whenever a local variable shadows an instance variable in an +Objective-C method. + @item -Wlarger-than=@var{len} @opindex Wlarger-than=@var{len} @opindex Wlarger-than-@var{len} Index: gcc/ChangeLog =================================================================== --- gcc/ChangeLog (revision 209852) +++ gcc/ChangeLog (working copy) @@ -1,3 +1,11 @@ +2014-04-28 Dimitris Papavasiliou + + * doc/invoke.texi: Document new switches -Wno-shadow-ivar, + -fno-local-ivars and -fivar-visibility. + * c-family/c.opt: Make -Wshadow also implicitly enable + -Wshadow-ivar. + + 2014-04-28 Eric Botcazou * configure.ac: Tweak GAS check for LEON instructions on SPARC. Index: gcc/testsuite/ChangeLog =================================================================== --- gcc/testsuite/ChangeLog (revision 209852) +++ gcc/testsuite/ChangeLog (working copy) @@ -1,3 +1,16 @@ +2014-04-28 Dimitris Papavasiliou + + * objc.dg/shadow-1.m: New test. + * objc.dg/shadow-2.m: New test. + * objc.dg/ivar-scope-1.m: New test. + * objc.dg/ivar-scope-2.m: New test. + * objc.dg/ivar-scope-3.m: New test. + * objc.dg/ivar-scope-4.m: New test. + * objc.dg/ivar-visibility-1.m: New test. + * objc.dg/ivar-visibility-2.m: New test. + * objc.dg/ivar-visibility-3.m: New test. + * objc.dg/ivar-visibility-4.m: New test. + 2014-03-27 Thomas Koenig PR fortran/59604 Index: gcc/testsuite/objc.dg/ivar-visibility-2.m =================================================================== --- gcc/testsuite/objc.dg/ivar-visibility-2.m (revision 0) +++ gcc/testsuite/objc.dg/ivar-visibility-2.m (revision 0) @@ -0,0 +1,34 @@ +/* Test instance variable visibility. */ +/* Author: Dimitris Papavasiliou . */ +/* { dg-do compile } */ +/* { dg-additional-options "-fivar-visibility=protected" } */ +#include + +@interface MySuperClass +{ + int someivar; +} +@end + +@implementation MySuperClass +@end + + +@interface MyClass : MySuperClass +@end + +@implementation MyClass +@end + +@interface MyOtherClass +- (void) test: (MyClass *) object; +@end + +@implementation MyOtherClass +- (void) test: (MyClass *) object +{ + int a; + + a = object->someivar; /* { dg-error "instance variable .someivar. is declared protected" } */ +} +@end Index: gcc/testsuite/objc.dg/ivar-scope-1.m =================================================================== --- gcc/testsuite/objc.dg/ivar-scope-1.m (revision 0) +++ gcc/testsuite/objc.dg/ivar-scope-1.m (revision 0) @@ -0,0 +1,24 @@ +/* Test instance variable scope. */ +/* Author: Dimitris Papavasiliou . */ +/* { dg-do compile } */ +#include + +@interface MyClass +{ + int someivar; +} +- (void) test; +@end + +@implementation MyClass +- (void) test +{ + int a; + + /* Make sure instance variables do have local scope when + -fno-local-ivar isn't specified. */ + + a = self->someivar; /* No warning or error. */ + a = someivar; /* No error. */ +} +@end Index: gcc/testsuite/objc.dg/ivar-visibility-3.m =================================================================== --- gcc/testsuite/objc.dg/ivar-visibility-3.m (revision 0) +++ gcc/testsuite/objc.dg/ivar-visibility-3.m (revision 0) @@ -0,0 +1,34 @@ +/* Test instance variable visibility. */ +/* Author: Dimitris Papavasiliou . */ +/* { dg-do compile } */ +/* { dg-additional-options "-fivar-visibility=private" } */ +#include + +@interface MySuperClass +{ + int someivar; +} +@end + +@implementation MySuperClass +@end + + +@interface MyClass : MySuperClass +@end + +@implementation MyClass +@end + +@interface MyOtherClass +- (void) test: (MyClass *) object; +@end + +@implementation MyOtherClass +- (void) test: (MyClass *) object +{ + int a; + + a = object->someivar; /* { dg-error "instance variable .someivar. is declared private" } */ +} +@end Index: gcc/testsuite/objc.dg/ivar-scope-2.m =================================================================== --- gcc/testsuite/objc.dg/ivar-scope-2.m (revision 0) +++ gcc/testsuite/objc.dg/ivar-scope-2.m (revision 0) @@ -0,0 +1,34 @@ +/* Test instance variable scope. */ +/* Author: Dimitris Papavasiliou . */ +/* { dg-do compile } */ +/* { dg-additional-options "-fno-local-ivars" } */ +#include + +@interface MyClass +{ + int someivar; +} +- (void) testscope; +- (void) testshadowing; +@end + +@implementation MyClass +- (void) testscope +{ + int a; + + a = self->someivar; /* No warning or error. */ + a = someivar; /* { dg-error ".someivar. undeclared" } */ +} + +- (void) testshadowing +{ + int someivar = 1; + int a; + + /* Since instance variables don't have local scope no shadowing + should occur. */ + + a = someivar; /* No warning. */ +} +@end Index: gcc/testsuite/objc.dg/ivar-visibility-4.m =================================================================== --- gcc/testsuite/objc.dg/ivar-visibility-4.m (revision 0) +++ gcc/testsuite/objc.dg/ivar-visibility-4.m (revision 0) @@ -0,0 +1,36 @@ +/* Test instance variable visibility. */ +/* Author: Dimitris Papavasiliou . */ +/* { dg-do compile } */ +/* { dg-additional-options "-fivar-visibility=public" } */ +#include + +@interface MySuperClass +{ + int someivar; +} +@end + +@implementation MySuperClass +@end + + +@interface MyClass : MySuperClass +@end + +@implementation MyClass +@end + +@interface MyOtherClass +- (void) test: (MyClass *) object; +@end + +@implementation MyOtherClass +- (void) test: (MyClass *) object +{ + int a; + + /* someivar is public so we shoudn't get any errors here. */ + + a = object->someivar; +} +@end Index: gcc/testsuite/objc.dg/ivar-scope-3.m =================================================================== --- gcc/testsuite/objc.dg/ivar-scope-3.m (revision 0) +++ gcc/testsuite/objc.dg/ivar-scope-3.m (revision 0) @@ -0,0 +1,60 @@ +/* Test instance variable scope. */ +/* Author: Dimitris Papavasiliou . */ +/* { dg-do run } */ +/* { dg-additional-options "-Wno-shadow-ivar" } */ +#include "../objc-obj-c++-shared/TestsuiteObject.m" +#include + +extern void abort(void); + +int someivar = 1; + +@interface MyClass: TestsuiteObject +{ + int someivar; +} +- (int) get; +- (int) getHidden; +@end + +@implementation MyClass +- init +{ + someivar = 2; + + return self; +} + +- (int) get +{ + return someivar; +} + +- (int) getHidden +{ + int someivar = 3; + + return someivar; +} +@end + +int main(void) +{ + MyClass *object; + + object = [[MyClass alloc] init]; + + /* Check whether the instance variable hides the global variable. */ + + if ([object get] != 2) { + abort(); + } + + /* Check whether the local variable hides the instance variable. */ + + if ([object getHidden] != 3) { + abort(); + } + + return 0; +} Index: gcc/testsuite/objc.dg/ivar-scope-4.m =================================================================== --- gcc/testsuite/objc.dg/ivar-scope-4.m (revision 0) +++ gcc/testsuite/objc.dg/ivar-scope-4.m (revision 0) @@ -0,0 +1,83 @@ +/* Test instance variable scope. */ +/* Author: Dimitris Papavasiliou . */ +/* { dg-do run } */ +/* { dg-additional-options "-Wno-shadow-ivar -fno-local-ivars" } */ +#include "../objc-obj-c++-shared/runtime.h" +#include + +extern void abort(void); + +int someivar = 1; + +/* The testsuite object depends on local variable scope so we need to + implement our own minimal base object here. */ + +@interface MyClass +{ + Class isa; + int someivar; +} + ++ (id) alloc; +- (id) init; +- (int) getGlobal; +- (int) getInstance; +- (int) getHidden; +@end + +@implementation MyClass ++ (id) alloc +{ + return class_createInstance (self, 0); +} + +- (id) init +{ + self->someivar = 2; + + return self; +} + +- (int) getGlobal +{ + return someivar; +} + +- (int) getInstance +{ + return self->someivar; +} + +- (int) getHidden +{ + int someivar = 3; + + return someivar; +} +@end + +int main(void) +{ + id object; + + object = [[MyClass alloc] init]; + + /* Check for aliasing between instance variable and global + variable. */ + + if ([object getGlobal] != 1) { + abort(); + } + + if ([object getInstance] != 2) { + abort(); + } + + /* Check whether the local variable hides the instance variable. */ + + if ([object getHidden] != 3) { + abort(); + } + + return 0; +} Index: gcc/testsuite/objc.dg/shadow-1.m =================================================================== --- gcc/testsuite/objc.dg/shadow-1.m (revision 0) +++ gcc/testsuite/objc.dg/shadow-1.m (revision 0) @@ -0,0 +1,33 @@ +/* Test disabling of warnings for shadowing instance variables. */ +/* Author: Dimitris Papavasiliou . */ +/* { dg-do compile } */ +/* { dg-additional-options "-Wno-shadow-ivar" } */ +#include + +@interface MyClass +{ +@private + int private; + +@protected + int protected; + +@public + int public; +} +- (void) test; +@end + +@implementation MyClass +- (void) test +{ + int private = 12; + int protected = 12; + int public = 12; + int a; + + a = private; /* No warning. */ + a = protected; /* No warning. */ + a = public; /* No warning. */ +} +@end Index: gcc/testsuite/objc.dg/ivar-visibility-1.m =================================================================== --- gcc/testsuite/objc.dg/ivar-visibility-1.m (revision 0) +++ gcc/testsuite/objc.dg/ivar-visibility-1.m (revision 0) @@ -0,0 +1,33 @@ +/* Test instance variable visibility. */ +/* Author: Dimitris Papavasiliou . */ +/* { dg-do compile } */ +#include + +@interface MySuperClass +{ + int someivar; +} +@end + +@implementation MySuperClass +@end + + +@interface MyClass : MySuperClass +@end + +@implementation MyClass +@end + +@interface MyOtherClass +- (void) test: (MyClass *) object; +@end + +@implementation MyOtherClass +- (void) test: (MyClass *) object +{ + int a; + + a = object->someivar; /* { dg-error "instance variable .someivar. is declared protected" } */ +} +@end Index: gcc/testsuite/objc.dg/shadow-2.m =================================================================== --- gcc/testsuite/objc.dg/shadow-2.m (revision 0) +++ gcc/testsuite/objc.dg/shadow-2.m (revision 0) @@ -0,0 +1,33 @@ +/* Test disabling of warnings for shadowing instance variables. */ +/* Author: Dimitris Papavasiliou . */ +/* { dg-do compile } */ +/* { dg-additional-options "-Wno-shadow" } */ +#include + +@interface MyClass +{ +@private + int private; + +@protected + int protected; + +@public + int public; +} +- (void) test; +@end + +@implementation MyClass +- (void) test +{ + int private = 12; + int protected = 12; + int public = 12; + int a; + + a = private; /* No warning. */ + a = protected; /* No warning. */ + a = public; /* No warning. */ +} +@end --------------090206080208030302020209--