From: Fariborz Jahanian Date: Wed, 18 Feb 2009 18:52:41 +0000 (+0000) Subject: Start generating gc'able code using the new X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5934e75d98d99374f72722a69c5eefe026f35c74;p=clang Start generating gc'able code using the new objc gc type attributes. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64935 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.def b/include/clang/Basic/DiagnosticSemaKinds.def index fc4bfc9ad2..a283b73ab7 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.def +++ b/include/clang/Basic/DiagnosticSemaKinds.def @@ -903,6 +903,8 @@ DIAG(error_objc_throw_expects_object, ERROR, "invalid %0 argument (expected an ObjC object type)") DIAG(error_rethrow_used_outside_catch, ERROR, "@throw (rethrow) used outside of a @catch block") +DIAG(err_attribute_multiple_objc_gc, ERROR, + "multiple garbage collection attributes specified for type") // C++ casts diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index 4e60cc518b..ae8d4b433a 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -609,22 +609,17 @@ void CodeGenFunction::EmitStoreThroughExtVectorComponentLValue(RValue Src, static void SetVarDeclObjCAttribute(ASTContext &Ctx, const Decl *VD, const QualType &Ty, LValue &LV) { -#if 0 -// FIXME. ObjCGCAttr no more. - if (const ObjCGCAttr *A = VD->getAttr()) { - ObjCGCAttr::GCAttrTypes attrType = A->getType(); - LValue::SetObjCType(attrType == ObjCGCAttr::Weak, - attrType == ObjCGCAttr::Strong, LV); - } - else -#endif if (Ctx.getLangOptions().ObjC1 && - Ctx.getLangOptions().getGCMode() != LangOptions::NonGC) { + Ctx.getLangOptions().getGCMode() != LangOptions::NonGC) { + QualType::GCAttrTypes attr = Ty.getObjCGCAttr(); + if (attr != QualType::GCNone) + LValue::SetObjCType(attr == QualType::Weak, + attr == QualType::Strong, LV); // Default behavious under objective-c's gc is for objective-c pointers // be treated as though they were declared as __strong. - if (Ctx.isObjCObjectPointerType(Ty)) + else if (Ctx.isObjCObjectPointerType(Ty)) LValue::SetObjCType(false, true, LV); - } + } } LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) { @@ -929,21 +924,17 @@ LValue CodeGenFunction::EmitLValueForField(llvm::Value* BaseValue, LValue LV = LValue::MakeAddr(V, Field->getType().getCVRQualifiers()|CVRQualifiers); -#if 0 -// FIXME. ObjCGCAttr is no more. - if (const ObjCGCAttr *A = Field->getAttr()) { - ObjCGCAttr::GCAttrTypes attrType = A->getType(); - // __weak attribute on a field is ignored. - LValue::SetObjCType(false, attrType == ObjCGCAttr::Strong, LV); - } - else -#endif if (CGM.getLangOptions().ObjC1 && - CGM.getLangOptions().getGCMode() != LangOptions::NonGC) { - QualType ExprTy = Field->getType(); - if (getContext().isObjCObjectPointerType(ExprTy)) + CGM.getLangOptions().getGCMode() != LangOptions::NonGC) { + QualType Ty = Field->getType(); + QualType::GCAttrTypes attr = Ty.getObjCGCAttr(); + if (attr != QualType::GCNone) + // __weak attribute on a field is ignored. + LValue::SetObjCType(false, attr == QualType::Strong, LV); + else if (getContext().isObjCObjectPointerType(Ty)) LValue::SetObjCType(false, true, LV); - } + + } return LV; } diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp index 96800dd4d1..dfd024b31e 100644 --- a/lib/Sema/SemaType.cpp +++ b/lib/Sema/SemaType.cpp @@ -781,7 +781,7 @@ static void HandleObjCGCTypeAttribute(QualType &Type, const AttributeList &Attr, Sema &S){ // FIXME. change error code. if (Type.getObjCGCAttr() != QualType::GCNone) { - S.Diag(Attr.getLoc(), diag::err_attribute_address_multiple_qualifiers); + S.Diag(Attr.getLoc(), diag::err_attribute_multiple_objc_gc); return; }