зеркало из https://github.com/microsoft/clang-1.git
fix some sema problems with wide strings and hook up basic codegen for them.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65582 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
e8e2600393
Коммит
dbb1ecc32c
|
@ -155,8 +155,13 @@ public:
|
|||
bool Pascal;
|
||||
|
||||
const char *GetString() { return &ResultBuf[0]; }
|
||||
unsigned GetStringLength() { return ResultPtr-&ResultBuf[0]; }
|
||||
|
||||
unsigned GetStringLength() const { return ResultPtr-&ResultBuf[0]; }
|
||||
|
||||
unsigned GetNumStringChars() const {
|
||||
if (AnyWide)
|
||||
return GetStringLength() / wchar_tByteWidth;
|
||||
return GetStringLength();
|
||||
}
|
||||
/// getOffsetOfStringByte - This function returns the offset of the
|
||||
/// specified byte of the string data represented by Token. This handles
|
||||
/// advancing over escape sequences in the string.
|
||||
|
|
|
@ -1069,11 +1069,6 @@ GetAddrOfConstantCFString(const std::string &str) {
|
|||
/// GetStringForStringLiteral - Return the appropriate bytes for a
|
||||
/// string literal, properly padded to match the literal type.
|
||||
std::string CodeGenModule::GetStringForStringLiteral(const StringLiteral *E) {
|
||||
if (E->isWide()) {
|
||||
ErrorUnsupported(E, "wide string");
|
||||
return "FIXME";
|
||||
}
|
||||
|
||||
const char *StrData = E->getStrData();
|
||||
unsigned Len = E->getByteLength();
|
||||
|
||||
|
@ -1081,10 +1076,13 @@ std::string CodeGenModule::GetStringForStringLiteral(const StringLiteral *E) {
|
|||
getContext().getAsConstantArrayType(E->getType());
|
||||
assert(CAT && "String isn't pointer or array!");
|
||||
|
||||
// Resize the string to the right size
|
||||
// FIXME: What about wchar_t strings?
|
||||
// Resize the string to the right size.
|
||||
std::string Str(StrData, StrData+Len);
|
||||
uint64_t RealLen = CAT->getSize().getZExtValue();
|
||||
|
||||
if (E->isWide())
|
||||
RealLen *= getContext().Target.getWCharWidth()/8;
|
||||
|
||||
Str.resize(RealLen, '\0');
|
||||
|
||||
return Str;
|
||||
|
|
|
@ -672,8 +672,7 @@ StringLiteralParser(const Token *StringToks, unsigned NumStringToks,
|
|||
// Remember if we see any wide strings.
|
||||
AnyWide |= StringToks[i].is(tok::wide_string_literal);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Include space for the null terminator.
|
||||
++SizeBound;
|
||||
|
||||
|
@ -779,13 +778,6 @@ StringLiteralParser(const Token *StringToks, unsigned NumStringToks,
|
|||
}
|
||||
}
|
||||
|
||||
// Add zero terminator.
|
||||
*ResultPtr = 0;
|
||||
if (AnyWide) {
|
||||
for (unsigned i = 1, e = wchar_tByteWidth; i != e; ++i)
|
||||
*ResultPtr++ = 0;
|
||||
}
|
||||
|
||||
if (Pascal) {
|
||||
ResultBuf[0] = ResultPtr-&ResultBuf[0]-1;
|
||||
|
||||
|
|
|
@ -400,7 +400,7 @@ Sema::ActOnStringLiteral(const Token *StringToks, unsigned NumStringToks) {
|
|||
// the nul terminator character as well as the string length for pascal
|
||||
// strings.
|
||||
StrTy = Context.getConstantArrayType(StrTy,
|
||||
llvm::APInt(32, Literal.GetStringLength()+1),
|
||||
llvm::APInt(32, Literal.GetNumStringChars()+1),
|
||||
ArrayType::Normal, 0);
|
||||
|
||||
// Pass &StringTokLocs[0], StringTokLocs.size() to factory!
|
||||
|
|
|
@ -2,4 +2,6 @@
|
|||
|
||||
int main() {
|
||||
char a[10] = "abc";
|
||||
|
||||
void *foo = L"AB";
|
||||
}
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
// RUN: clang -verify -emit-llvm -o - %s
|
||||
|
||||
void *x = L"foo"; // expected-error {{cannot compile this wide string yet}}
|
Загрузка…
Ссылка в новой задаче