extend or truncate the initializer for a string initializer to match its type.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44751 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/CodeGen/CodeGenModule.cpp b/CodeGen/CodeGenModule.cpp
index 5533651..afd23c4 100644
--- a/CodeGen/CodeGenModule.cpp
+++ b/CodeGen/CodeGenModule.cpp
@@ -419,12 +419,21 @@
         // FIXME: What about wchar_t??
         if (AT->getElementType()->isCharType()) {
           const char *StrData = String->getStrData();
-          unsigned Len = String->getByteLength();
-          llvm::Constant *C =
-            llvm::ConstantArray::get(std::string(StrData, StrData + Len));
-          // FIXME: This should return a string of the proper type: this
-          // mishandles things like 'char x[4] = "1234567";
-          return C;
+          std::string Str(StrData, StrData + String->getByteLength());
+          // Null terminate the string before potentially truncating it.
+          Str.push_back(0);
+
+          // FIXME: The size of the cast is not always specified yet, fix this
+          // in sema.
+          if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(AT)) {
+            uint64_t RealLen = CAT->getSize().getZExtValue();
+            // String or grow the initializer to the required size.
+            if (RealLen != Str.size())
+              Str.resize(RealLen);
+          }
+          
+          
+          return llvm::ConstantArray::get(Str, false);
         }
       }