blob: 795dad82b099ffc1be60cef24f84a4b973a8f0fe [file] [log] [blame]
#import <Foundation/Foundation.h>
#include <ciso646>
#ifdef _LIBCPP_VERSION
#import <memory>
#else
#import <tr1/memory>
#endif
// rdar: //7501812
class Value
{
public:
explicit Value(int amount) : m_amount(amount){}
int GetAmount() const { return m_amount; }
private:
int m_amount;
};
#ifdef _LIBCPP_VERSION
typedef std::shared_ptr<Value> ValuePtr;
#else
typedef std::tr1::shared_ptr<Value> ValuePtr;
#endif
@interface ValueUser : NSObject
{
@private
ValuePtr* _valuePtr;
}
- (id)initWithValue:(ValuePtr&)valuePtr;
@property ValuePtr value;
@end
@implementation ValueUser
- (id)initWithValue:(ValuePtr&)valuePtr
{
self = [super init];
_valuePtr = new ValuePtr(valuePtr);
return self;
}
- (void)setValue:(ValuePtr)valuePtr
{
*_valuePtr = valuePtr;
}
- (ValuePtr)value
{
return *_valuePtr;
}
- (void)dealloc
{
delete _valuePtr;
[super dealloc];
}
@end
int main()
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
ValuePtr valuePtr(new Value(42));
ValueUser* valueUser = [[ValueUser alloc] initWithValue:valuePtr];
#ifdef __clang__
volatile int GetAmountVal = (valueUser.value)->GetAmount();
#endif
printf("The value's amount is %d\n", [valueUser value]->GetAmount());
[valueUser release];
[pool release];
return 0;
}