/* APPLE LOCAL file radar 5080710 */
/* Test that we generate correct message call for method returning a C++ class
   with copy constructor. Such methods return the result in memory and not in
   registers. */
/* { dg-options "-Wno-objc-root-class -fnext-runtime -m64 -mmacosx-version-min=10.5" } */
/* { dg-do compile { target powerpc*-*-darwin* i?86*-*-darwin* } } */

class DTLock {
public:

    DTLock();
    ~DTLock();
    bool operator==(const DTLock &L) const;
    void Lock(void) const;
private:
    DTLock(const DTLock &ToC);
    DTLock &operator=(const DTLock &ToC);


    void *mutexLock;

};

class DTDoubleArrayStorage {
public:
    DTDoubleArrayStorage(long int mv,long int nv,long int ov);
    ~DTDoubleArrayStorage();

    DTLock accessLock;
    long int m,n,o,mn,length;
    int referenceCount;
    int mutableReferences;
    double *Data;

private:
    DTDoubleArrayStorage(const DTDoubleArrayStorage &);
    DTDoubleArrayStorage &operator=(const DTDoubleArrayStorage &);
};

class DTDoubleArray {

public:
    DTDoubleArray();
    virtual ~DTDoubleArray();
    DTDoubleArray(const DTDoubleArray &A);
    DTDoubleArray &operator=(const DTDoubleArray &A);

protected:

    explicit DTDoubleArray(long int mv,long int nv=1,long int ov=1);
public:


    long int m() const;
    long int n() const;
    long int o() const;
    long int Length() const;
    bool IsEmpty() const;
    bool NotEmpty() const;


    int ReferenceCount() const;
    int MutableReferences() const;
    const double *Pointer() const;

    double operator()(long int i) const;
    double operator()(long int i,long int j) const;
    double operator()(long int i,long int j,long int k) const;
    double e(int i) const;
    double e(int i,int j) const;
    double e(int i,int j,int k) const;
    void pinfo(void) const;
    void pi(int i) const;
    void pj(int j) const;
    void pall(void) const;
    void prange(int s,int e) const;
    void pcrange(int s,int e) const;

    long int Find(double) const;


protected:
    DTDoubleArrayStorage *Storage;
    DTLock accessLock;
    double invalidEntry;


    void PrintErrorMessage(long int i) const;
    void PrintErrorMessage(long int i,long int j) const;
    void PrintErrorMessage(long int i,long int j,long int k) const;
};

@interface DoubleArrayContainer
- (DTDoubleArray)doubleArray;
@end

@interface TestController
{
}
- (void)myAction:(id)sender;
@end

@implementation TestController

- (void)myAction:(id)sender
{
 DoubleArrayContainer *dA;
 DTDoubleArray b = [dA doubleArray];
}

@end
/* { dg-final { scan-assembler "objc_msgSend_stret_fixup" } } */
