From 50db9be203dc18ecde1c7284d213683c69a520b9 Mon Sep 17 00:00:00 2001 From: Tomas Lindquist Olsen Date: Wed, 7 May 2008 00:58:36 +0200 Subject: [PATCH] [svn r192] Fixed: String literals as constant expression was broken for utf16/32. --- gen/arrays.cpp | 2 ++ gen/toir.cpp | 40 ++++++++++++++++++++++++++++++++++------ 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/gen/arrays.cpp b/gen/arrays.cpp index 6ad22c49..7c96c07d 100644 --- a/gen/arrays.cpp +++ b/gen/arrays.cpp @@ -340,8 +340,10 @@ llvm::Constant* DtoConstArrayInitializer(ArrayInitializer* arrinit) assert(v); inits[i] = v; + Logger::cout() << "llval: " << *v << '\n'; } + Logger::println("building constant array"); const llvm::ArrayType* arrty = llvm::ArrayType::get(elemty,tdim); llvm::Constant* constarr = llvm::ConstantArray::get(arrty, inits); diff --git a/gen/toir.cpp b/gen/toir.cpp index 1c1c8f92..489d4c58 100644 --- a/gen/toir.cpp +++ b/gen/toir.cpp @@ -490,15 +490,43 @@ llvm::Constant* StringExp::toConstElem(IRState* p) Logger::print("StringExp::toConstElem: %s | %s\n", toChars(), type->toChars()); LOG_SCOPE; - uint8_t* str = (uint8_t*)string; - std::string cont((char*)str, len); - Type* t = DtoDType(type); + Type* cty = DtoDType(t->next); - if (t->ty == Tsarray) { - return llvm::ConstantArray::get(cont,false); + bool nullterm = (t->ty != Tsarray); + size_t endlen = nullterm ? len+1 : len; + + const llvm::Type* ct = DtoType(cty); + const llvm::ArrayType* at = llvm::ArrayType::get(ct,endlen); + + llvm::Constant* _init; + if (cty->ty == Tchar || cty->ty == Tvoid) { + uint8_t* str = (uint8_t*)string; + std::string cont((char*)str, len); + _init = llvm::ConstantArray::get(cont, nullterm); } - llvm::Constant* _init = llvm::ConstantArray::get(cont,true); + else if (cty->ty == Twchar) { + uint16_t* str = (uint16_t*)string; + std::vector vals; + for(size_t i=0; ity == Tdchar) { + uint32_t* str = (uint32_t*)string; + std::vector vals; + for(size_t i=0; igetType(),true,_linkage,_init,"stringliteral",gIR->module);