reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
// RUN: %clang_cc1 -verify -Wused-but-marked-unused -Wno-objc-protocol-method-implementation -Wunused -Wunused-parameter -fsyntax-only -Wno-objc-root-class %s

int printf(const char *, ...);

@interface Greeter
+ (void) hello;
@end

@implementation Greeter
+ (void) hello { printf("Hello, World!\n"); }
@end

int test1(void) {
  [Greeter hello];
  return 0;
}

@interface NSObject @end
@interface NSString : NSObject 
- (int)length;
@end

void test2() {
  @"pointless example call for test purposes".length; // expected-warning {{property access result unused - getters should not be used for side effects}}
}

@interface foo
- (int)meth: (int)x : (int)y : (int)z ;
@end

@implementation foo
- (int) meth: (int)x: // expected-warning {{'x' used as the name of the previous parameter rather than as part of the selector}} \
                      // expected-note {{introduce a parameter name to make 'x' part of the selector}} \
                      // expected-note {{or insert whitespace before ':' to use 'x' as parameter name and have an empty entry in the selector}}

(int)y:  // expected-warning {{'y' used as the name of the previous parameter rather than as part of the selector}} \
         // expected-note {{introduce a parameter name to make 'y' part of the selector}} \
         // expected-note {{or insert whitespace before ':' to use 'y' as parameter name and have an empty entry in the selector}}
(int) __attribute__((unused))z { return x; }
@end

//===------------------------------------------------------------------------===
// The next test shows how clang accepted attribute((unused)) on ObjC
// instance variables, which GCC does not.
//===------------------------------------------------------------------------===

#if __has_feature(attribute_objc_ivar_unused)
#define UNUSED_IVAR __attribute__((unused))
#else
#error __attribute__((unused)) not supported on ivars
#endif

@interface TestUnusedIvar {
  id y __attribute__((unused)); // no-warning
  id x UNUSED_IVAR; // no-warning
}
@end

// rdar://10777111
static NSString *x = @"hi"; // expected-warning {{unused variable 'x'}}

// rdar://12233989
@interface TestTransitiveUnused
- (void) a __attribute__((unused));
- (void) b __attribute__((unused));
@end

@interface TestTransitiveUnused(CAT)
@end

@implementation TestTransitiveUnused(CAT)
- (void) b {}
- (void) a { [self b]; }
@end

// Test that objc_precise_lifetime suppresses
// unused variable warnings.
extern void rdar15596883_foo(void);
void rdar15596883(id x) {
  __attribute__((objc_precise_lifetime)) id y = x; // no-warning
  rdar15596883_foo();
}

@interface PropertyObject : NSObject 
@property int length;
@end

@protocol P
@property int property;
@end

void test3(PropertyObject *o)
{
  [o length]; // No warning. property name used in direct method call.
}

void test4(id o)
{
  [o length]; // No warning.
}

void test5(id <P> p)
{
    [p property]; // No warning. property name used in direct method call.
}

// rdar://19773512
@interface Model
@property (nonatomic, retain, setter=setOrCreateGroup:, getter=getOrCreateGroup) id group;
@end

@implementation Model {
    id _group;
}
- (void)method {
    [self getOrCreateGroup];
    self.getOrCreateGroup; // expected-warning {{property access result unused - getters should not be used for side effects}}
    self.group; // expected-warning {{property access result unused - getters should not be used for side effects}}
    self.group = (void*)0;
    [self setOrCreateGroup : ((void*)0)];
    
}
- (id)getOrCreateGroup {
    if (!_group) {
        _group = @"group";
    }
    return _group;
}
@end