invoke.texi: Document new switches -Wno-shadow-ivar, -fno-local-ivars and -fivar-visibility.

2014-05-12  Dimitris Papavasiliou  <dpapavas@gmail.com>

            * 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.

testsuite:
            * 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.

Now, actuatally add the files....

From-SVN: r210339
This commit is contained in:
Dimitris Papavasiliou 2014-05-12 20:55:54 +00:00 committed by Mike Stump
parent 16e60fff0b
commit f636f886d2
10 changed files with 404 additions and 0 deletions

View File

@ -0,0 +1,24 @@
/* Test instance variable scope. */
/* Author: Dimitris Papavasiliou <dpapavas@gmail.com>. */
/* { dg-do compile } */
#include <objc/objc.h>
@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

View File

@ -0,0 +1,34 @@
/* Test instance variable scope. */
/* Author: Dimitris Papavasiliou <dpapavas@gmail.com>. */
/* { dg-do compile } */
/* { dg-additional-options "-fno-local-ivars" } */
#include <objc/objc.h>
@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

View File

@ -0,0 +1,60 @@
/* Test instance variable scope. */
/* Author: Dimitris Papavasiliou <dpapavas@gmail.com>. */
/* { dg-do run } */
/* { dg-additional-options "-Wno-shadow-ivar" } */
#include "../objc-obj-c++-shared/TestsuiteObject.m"
#include <objc/objc.h>
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;
}

View File

@ -0,0 +1,83 @@
/* Test instance variable scope. */
/* Author: Dimitris Papavasiliou <dpapavas@gmail.com>. */
/* { dg-do run } */
/* { dg-additional-options "-Wno-shadow-ivar -fno-local-ivars" } */
#include "../objc-obj-c++-shared/runtime.h"
#include <objc/objc.h>
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;
}

View File

@ -0,0 +1,33 @@
/* Test instance variable visibility. */
/* Author: Dimitris Papavasiliou <dpapavas@gmail.com>. */
/* { dg-do compile } */
#include <objc/objc.h>
@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

View File

@ -0,0 +1,34 @@
/* Test instance variable visibility. */
/* Author: Dimitris Papavasiliou <dpapavas@gmail.com>. */
/* { dg-do compile } */
/* { dg-additional-options "-fivar-visibility=protected" } */
#include <objc/objc.h>
@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

View File

@ -0,0 +1,34 @@
/* Test instance variable visibility. */
/* Author: Dimitris Papavasiliou <dpapavas@gmail.com>. */
/* { dg-do compile } */
/* { dg-additional-options "-fivar-visibility=private" } */
#include <objc/objc.h>
@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

View File

@ -0,0 +1,36 @@
/* Test instance variable visibility. */
/* Author: Dimitris Papavasiliou <dpapavas@gmail.com>. */
/* { dg-do compile } */
/* { dg-additional-options "-fivar-visibility=public" } */
#include <objc/objc.h>
@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 shouldn't get any errors here. */
a = object->someivar;
}
@end

View File

@ -0,0 +1,33 @@
/* Test disabling of warnings for shadowing instance variables. */
/* Author: Dimitris Papavasiliou <dpapavas@gmail.com>. */
/* { dg-do compile } */
/* { dg-additional-options "-Wno-shadow-ivar" } */
#include <objc/objc.h>
@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

View File

@ -0,0 +1,33 @@
/* Test disabling of warnings for shadowing instance variables. */
/* Author: Dimitris Papavasiliou <dpapavas@gmail.com>. */
/* { dg-do compile } */
/* { dg-additional-options "-Wno-shadow" } */
#include <objc/objc.h>
@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