forked from OSchip/llvm-project
Make sure that we infer __strong, etc. when we instantiate variables
under ARC. Fixes <rdar://problem/10530209>. llvm-svn: 146307
This commit is contained in:
parent
036e2bd07a
commit
8ca0c6408e
|
@ -9528,6 +9528,10 @@ VarDecl *Sema::BuildExceptionDeclaration(Scope *S,
|
|||
ExDeclType, TInfo, SC_None, SC_None);
|
||||
ExDecl->setExceptionVariable(true);
|
||||
|
||||
// In ARC, infer 'retaining' for variables of retainable type.
|
||||
if (getLangOptions().ObjCAutoRefCount && inferObjCARCLifetime(ExDecl))
|
||||
Invalid = true;
|
||||
|
||||
if (!Invalid && !ExDeclType->isDependentType()) {
|
||||
if (const RecordType *recordType = ExDeclType->getAs<RecordType>()) {
|
||||
// C++ [except.handle]p16:
|
||||
|
|
|
@ -2911,6 +2911,10 @@ VarDecl *Sema::BuildObjCExceptionDecl(TypeSourceInfo *TInfo, QualType T,
|
|||
T, TInfo, SC_None, SC_None);
|
||||
New->setExceptionVariable(true);
|
||||
|
||||
// In ARC, infer 'retaining' for variables of retainable type.
|
||||
if (getLangOptions().ObjCAutoRefCount && inferObjCARCLifetime(New))
|
||||
Invalid = true;
|
||||
|
||||
if (Invalid)
|
||||
New->setInvalidDecl();
|
||||
return New;
|
||||
|
|
|
@ -351,6 +351,12 @@ Decl *TemplateDeclInstantiator::VisitVarDecl(VarDecl *D) {
|
|||
Sema::LookupOrdinaryName, Sema::ForRedeclaration);
|
||||
if (D->isStaticDataMember())
|
||||
SemaRef.LookupQualifiedName(Previous, Owner, false);
|
||||
|
||||
// In ARC, infer 'retaining' for variables of retainable type.
|
||||
if (SemaRef.getLangOptions().ObjCAutoRefCount &&
|
||||
SemaRef.inferObjCARCLifetime(Var))
|
||||
Var->setInvalidDecl();
|
||||
|
||||
SemaRef.CheckVariableDeclaration(Var, Previous);
|
||||
|
||||
if (D->isOutOfLine()) {
|
||||
|
|
|
@ -178,6 +178,8 @@ id test36(id z) {
|
|||
|
||||
// Template instantiation side of rdar://problem/9817306
|
||||
@interface Test37
|
||||
+ alloc;
|
||||
- init;
|
||||
- (NSArray *) array;
|
||||
@end
|
||||
template <class T> void test37(T *a) {
|
||||
|
@ -224,3 +226,18 @@ void send_release() {
|
|||
// CHECK-NEXT: call void @objc_release
|
||||
// CHECK-NEXT: ret void
|
||||
template void send_release<int>();
|
||||
|
||||
template<typename T>
|
||||
Test37 *instantiate_init() {
|
||||
Test37 *result = [[Test37 alloc] init];
|
||||
return result;
|
||||
}
|
||||
|
||||
// CHECK: define weak_odr %2* @_Z16instantiate_initIiEP6Test37v
|
||||
// CHECK: call i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend
|
||||
// CHECK: call i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend
|
||||
// CHECK: call i8* @objc_retain
|
||||
// CHECK: call void @objc_release
|
||||
// CHECK: call i8* @objc_autoreleaseReturnValue
|
||||
template Test37* instantiate_init<int>();
|
||||
|
||||
|
|
Loading…
Reference in New Issue