Improve handling of member pointers.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@78536 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGExprConstant.cpp b/lib/CodeGen/CGExprConstant.cpp
index 047fecd..d8fc314 100644
--- a/lib/CodeGen/CGExprConstant.cpp
+++ b/lib/CodeGen/CGExprConstant.cpp
@@ -773,7 +773,27 @@
 }
 
 llvm::Constant *CodeGenModule::EmitNullConstant(QualType T) {
-  // Always return an LLVM null constant for now; this will change when we
-  // get support for IRGen of member pointers.
+  if (const ConstantArrayType *CAT = Context.getAsConstantArrayType(T)) {
+    
+    QualType ElementTy = CAT->getElementType();
+
+    // FIXME: Handle arrays of structs that contain member pointers.
+    if (Context.getBaseElementType(ElementTy)->isMemberPointerType()) {
+      llvm::Constant *Element = EmitNullConstant(ElementTy);
+      uint64_t NumElements = CAT->getSize().getZExtValue();
+      std::vector<llvm::Constant *> Array(NumElements);
+      for (uint64_t i = 0; i != NumElements; ++i)
+        Array[i] = Element;
+      
+      const llvm::ArrayType *ATy = 
+        cast<llvm::ArrayType>(getTypes().ConvertTypeForMem(T));
+      return llvm::ConstantArray::get(ATy, Array);
+    }
+  }
+  
+  // FIXME: Handle structs that contain member pointers.
+  if (T->isMemberPointerType()) 
+    return llvm::Constant::getAllOnesValue(getTypes().ConvertTypeForMem(T));
+  
   return llvm::Constant::getNullValue(getTypes().ConvertTypeForMem(T));
 }