diff options
author | Chris Lattner <sabre@nondot.org> | 2009-02-26 23:01:51 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-02-26 23:01:51 +0000 |
commit | dbb1ecc32ca122b07b7c98fd0a8f6f53985adacc (patch) | |
tree | 7bd1b69e6ce297e213ade3d86ea61a070261489e | |
parent | e8e260039346695beaa15af3e64ba38a64a1c30b (diff) |
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
-rw-r--r-- | include/clang/Lex/LiteralSupport.h | 9 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenModule.cpp | 12 | ||||
-rw-r--r-- | lib/Lex/LiteralSupport.cpp | 10 | ||||
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 2 | ||||
-rw-r--r-- | test/CodeGen/string-literal.c | 2 | ||||
-rw-r--r-- | test/CodeGen/unsupported.c | 3 |
6 files changed, 16 insertions, 22 deletions
diff --git a/include/clang/Lex/LiteralSupport.h b/include/clang/Lex/LiteralSupport.h index 82a1f14ad8..13da783312 100644 --- a/include/clang/Lex/LiteralSupport.h +++ b/include/clang/Lex/LiteralSupport.h @@ -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. diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 95490df46b..75a8302792 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -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; diff --git a/lib/Lex/LiteralSupport.cpp b/lib/Lex/LiteralSupport.cpp index 9815f9b91e..c20383f031 100644 --- a/lib/Lex/LiteralSupport.cpp +++ b/lib/Lex/LiteralSupport.cpp @@ -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; diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index eec27cee83..01be6b2474 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -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! diff --git a/test/CodeGen/string-literal.c b/test/CodeGen/string-literal.c index 104477ee12..ea28f1a7cb 100644 --- a/test/CodeGen/string-literal.c +++ b/test/CodeGen/string-literal.c @@ -2,4 +2,6 @@ int main() { char a[10] = "abc"; + + void *foo = L"AB"; } diff --git a/test/CodeGen/unsupported.c b/test/CodeGen/unsupported.c deleted file mode 100644 index c11f1d1ef9..0000000000 --- a/test/CodeGen/unsupported.c +++ /dev/null @@ -1,3 +0,0 @@ -// RUN: clang -verify -emit-llvm -o - %s - -void *x = L"foo"; // expected-error {{cannot compile this wide string yet}} |