Added a test case for __weak field decls. Change SetVarDeclObjCAttribute
to static function. Added comments.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59738 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp
index 4228bc2..a9cf453 100644
--- a/lib/CodeGen/CGExpr.cpp
+++ b/lib/CodeGen/CGExpr.cpp
@@ -523,18 +523,19 @@
 
 /// SetVarDeclObjCAttribute - Set __weak/__strong attributes into the LValue
 /// object.
-void CodeGenFunction::SetVarDeclObjCAttribute(const VarDecl *VD, 
-                                              const QualType &Ty, 
-                                              LValue &LV)
+static void SetVarDeclObjCAttribute(ASTContext &Ctx, const VarDecl *VD, 
+                                    const QualType &Ty, LValue &LV)
 {
   if (const ObjCGCAttr *A = VD->getAttr<ObjCGCAttr>()) {
     ObjCGCAttr::GCAttrTypes attrType = A->getType();
     LValue::SetObjCType(attrType == ObjCGCAttr::Weak, 
                         attrType == ObjCGCAttr::Strong, LV);
   }
-  else if (CGM.getLangOptions().ObjC1 &&
-           CGM.getLangOptions().getGCMode() != LangOptions::NonGC) {
-    if (getContext().isObjCObjectPointerType(Ty))
+  else if (Ctx.getLangOptions().ObjC1 &&
+           Ctx.getLangOptions().getGCMode() != LangOptions::NonGC) {
+    // 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))
       LValue::SetObjCType(false, true, LV);
   }  
 }
@@ -557,12 +558,12 @@
     if (VD->isBlockVarDecl() && 
         (VD->getStorageClass() == VarDecl::Static || 
          VD->getStorageClass() == VarDecl::Extern))
-      SetVarDeclObjCAttribute(VD, E->getType(), LV);
+      SetVarDeclObjCAttribute(getContext(), VD, E->getType(), LV);
     return LV;
   } else if (VD && VD->isFileVarDecl()) {
     LValue LV = LValue::MakeAddr(CGM.GetAddrOfGlobalVar(VD),
                                  E->getType().getCVRQualifiers());
-    SetVarDeclObjCAttribute(VD, E->getType(), LV);
+    SetVarDeclObjCAttribute(getContext(), VD, E->getType(), LV);
     return LV;
   } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(E->getDecl())) {
     return LValue::MakeAddr(CGM.GetAddrOfFunction(FD),