Fix the emission of expressions like char a[10] = "asdf"; previously,
they were causing bad code to be emitted. There are two fixes here: one makes sure we emit a string that is long enough, and one makes sure we properly handle string initialization in init lists. llvm-svn: 51259
This commit is contained in:
parent
f767e44ed6
commit
f23b6fa41f
|
@ -395,9 +395,16 @@ LValue CodeGenFunction::EmitUnaryOpLValue(const UnaryOperator *E) {
|
|||
|
||||
LValue CodeGenFunction::EmitStringLiteralLValue(const StringLiteral *E) {
|
||||
assert(!E->isWide() && "FIXME: Wide strings not supported yet!");
|
||||
// Get the string data
|
||||
const char *StrData = E->getStrData();
|
||||
unsigned Len = E->getByteLength();
|
||||
std::string StringLiteral(StrData, StrData+Len);
|
||||
|
||||
// Resize the string to the right size
|
||||
const ConstantArrayType *CAT = E->getType()->getAsConstantArrayType();
|
||||
uint64_t RealLen = CAT->getSize().getZExtValue();
|
||||
StringLiteral.resize(RealLen, '\0');
|
||||
|
||||
return LValue::MakeAddr(CGM.GetAddrOfConstantString(StringLiteral));
|
||||
}
|
||||
|
||||
|
|
|
@ -53,7 +53,7 @@ public:
|
|||
void EmitAggregateClear(llvm::Value *DestPtr, QualType Ty);
|
||||
|
||||
void EmitNonConstInit(InitListExpr *E);
|
||||
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Visitor Methods
|
||||
//===--------------------------------------------------------------------===//
|
||||
|
@ -336,7 +336,6 @@ void AggExprEmitter::EmitNullInitializationToLValue(LValue LV, QualType T) {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
void AggExprEmitter::VisitInitListExpr(InitListExpr *E) {
|
||||
if (E->isConstantExpr(CGF.getContext(), 0)) {
|
||||
// FIXME: call into const expr emitter so that we can emit
|
||||
|
@ -355,6 +354,14 @@ void AggExprEmitter::VisitInitListExpr(InitListExpr *E) {
|
|||
cast<llvm::ArrayType>(APType->getElementType());
|
||||
|
||||
uint64_t NumInitElements = E->getNumInits();
|
||||
|
||||
if (E->getNumInits() > 0 &&
|
||||
E->getType().getCanonicalType().getUnqualifiedType() ==
|
||||
E->getInit(0)->getType().getCanonicalType().getUnqualifiedType()) {
|
||||
EmitAggLoadOfLValue(E->getInit(0));
|
||||
return;
|
||||
}
|
||||
|
||||
uint64_t NumArrayElements = AType->getNumElements();
|
||||
QualType ElementType = E->getType()->getAsArrayType()->getElementType();
|
||||
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
// RUN: clang -emit-llvm %s -o - | not grep "[5 x i8]"
|
||||
// RUN: clang -emit-llvm %s -o - | not grep "store"
|
||||
|
||||
void test(void) {
|
||||
char a[10] = "asdf";
|
||||
char b[10] = { "asdf" };
|
||||
}
|
||||
|
Loading…
Reference in New Issue