From: Chris Lattner Date: Sun, 9 Dec 2007 23:49:42 +0000 (+0000) Subject: Implement codegen support for: X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a44cf73c741ebc7312f90f7b989d96985a4f354f;p=clang Implement codegen support for: char text[8] = "string"; Big fixme remains. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44750 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/CodeGen/CodeGenModule.cpp b/CodeGen/CodeGenModule.cpp index ecabb814ae..55336510c6 100644 --- a/CodeGen/CodeGenModule.cpp +++ b/CodeGen/CodeGenModule.cpp @@ -407,6 +407,27 @@ static llvm::Constant *GenerateConstantExpr(const Expr *Expression, return llvm::ConstantExpr::getGetElementPtr(C, Ops, 2); } + // If this is an implicit cast of a string literal to an array type, this + // must be a string initializing an array. Don't emit it as the address of + // the string, emit the string data itself as an inline array. + if (const StringLiteral *String = + dyn_cast(ICExpr->getSubExpr())) + if (const ArrayType *AT = ICExpr->getType()->getAsArrayType()) { + // Verify that this is an array of char or wchar. Array of const char* + // can be initialized with a string literal, which does not expand the + // characters inline. + // 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; + } + } + return GenerateConstantCast(ICExpr->getSubExpr(), type, CGM); } diff --git a/test/CodeGen/globalinit.c b/test/CodeGen/globalinit.c index bfa909bd75..996d2acabb 100644 --- a/test/CodeGen/globalinit.c +++ b/test/CodeGen/globalinit.c @@ -15,3 +15,6 @@ void *g = y; int latin_ptr2len (char *p); int (*mb_ptr2len) (char *p) = latin_ptr2len; + +char string[8] = "string"; +