We should not generate __weak write barrier on indirect reference
of a pointer to object; This patch does this odd behavior according to
gcc.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65334 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp
index c962652..0449900 100644
--- a/lib/CodeGen/CGExpr.cpp
+++ b/lib/CodeGen/CGExpr.cpp
@@ -669,10 +669,19 @@
   case UnaryOperator::Deref:
     {
       QualType T = E->getSubExpr()->getType()->getAsPointerType()->getPointeeType();
-      return LValue::MakeAddr(EmitScalarExpr(E->getSubExpr()),
-                              ExprTy->getAsPointerType()->getPointeeType()
+      LValue LV = LValue::MakeAddr(EmitScalarExpr(E->getSubExpr()),
+                                   ExprTy->getAsPointerType()->getPointeeType()
                                       .getCVRQualifiers(), 
-                              getContext().getObjCGCAttrKind(T));
+                                   getContext().getObjCGCAttrKind(T));
+     // We should not generate __weak write barrier on indirect reference
+     // of a pointer to object; as in void foo (__weak id *param); *param = 0;
+     // But, we continue to generate __strong write barrier on indirect write
+     // into a pointer to object.
+     if (getContext().getLangOptions().ObjC1 &&
+         getContext().getLangOptions().getGCMode() != LangOptions::NonGC &&
+         LV.isObjCWeak())
+       LValue::SetObjCNonGC(LV, !E->isOBJCGCCandidate());
+     return LV;
     }
   case UnaryOperator::Real:
   case UnaryOperator::Imag: