objc-gc-2.mm   [plain text]


/* APPLE LOCAL file ObjC GC */
/* A compile-only test for insertion of write barriers. */
/* Developed by Ziemowit Laski  <zlaski@apple.com>  */
/* { dg-do compile { target powerpc*-*-darwin* i?86*-*-darwin* } } */
/* { dg-options "-fnext-runtime -fobjc-gc -Wno-non-lvalue-assign -Wassign-intercept" } */
/* { dg-require-effective-target objc_gc } */

#include <objc/objc.h>

struct NSRect {
  void *a;
  id b;
  __strong void *c;
  __strong id *d;
};
  
@protocol WebCoreImageRenderer
- (void)drawImageInRect:(NSRect)ir fromRect:(NSRect)fr;
- (void)release;
- (void)new;
- (BOOL)isNull;
- (id <WebCoreImageRenderer>)copyWithZone:(int)z;
- (id <WebCoreImageRenderer>)retainOrCopyIfNeeded;
@end

typedef id <WebCoreImageRenderer> WebCoreImageRendererPtr;

class QPixmap {
public:
    QPixmap() {}
    ~QPixmap() {}

    void resize(int w, int h);

public:
    WebCoreImageRendererPtr imageRenderer;
    __strong void *somePtr;
    mutable bool needCopyOnWrite;
};

void inline_func(void) {
  QPixmap *pix;

  pix->imageRenderer = 0; /* { dg-warning "strong\\-cast assignment" } */
  pix->somePtr = 0; /* { dg-warning "strong\\-cast assignment" } */
  (__strong id)pix->somePtr = 0; /* { dg-warning "strong\\-cast assignment" } */
  (__strong id)pix->imageRenderer = 0; /* { dg-warning "strong\\-cast assignment" } */
}

void QPixmap::resize(int w, int h)
{
    if (needCopyOnWrite) {
        id <WebCoreImageRenderer> newImageRenderer = [imageRenderer copyWithZone:0];
        [imageRenderer release];
        imageRenderer = newImageRenderer; /* { dg-warning "strong\\-cast assignment" } */
        somePtr = 0; /* { dg-warning "strong\\-cast assignment" } */
        (__strong id)imageRenderer = newImageRenderer; /* { dg-warning "strong\\-cast assignment" } */
        needCopyOnWrite = false;
    }
    [imageRenderer new];
}