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

llvm-svn: 44751
This commit is contained in:
Chris Lattner
2007-12-10 00:00:56 +00:00
parent c25c42f3ca
commit 686628e052
2 changed files with 17 additions and 7 deletions

View File

@@ -419,12 +419,21 @@ static llvm::Constant *GenerateConstantExpr(const Expr *Expression,
// 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);
}
}