}
// Initialize remaining array elements.
+ // FIXME: This doesn't handle member pointers correctly!
for (; i < NumElements; ++i)
Elts.push_back(llvm::Constant::getNullValue(ElemTy));
std::vector<llvm::Constant*> Elts;
// Initialize the whole structure to zero.
+ // FIXME: This doesn't handle member pointers correctly!
for (unsigned i = 0; i < SType->getNumElements(); ++i) {
const llvm::Type *FieldTy = SType->getElementType(i);
Elts.push_back(llvm::Constant::getNullValue(FieldTy));
llvm::Constant *EmitUnionInitialization(InitListExpr *ILE) {
const llvm::Type *Ty = ConvertType(ILE->getType());
- // If this is an empty initializer list, we value-initialize the
- // union.
- if (ILE->getNumInits() == 0)
- return llvm::Constant::getNullValue(Ty);
-
FieldDecl* curField = ILE->getInitializedFieldInUnion();
if (!curField) {
// There's no field to initialize, so value-initialize the union.
return llvm::ConstantArray::get(RetTy, Elts);
}
- Expr *Init = ILE->getInit(0);
- return EmitUnion(CGM.EmitConstantExpr(Init, Init->getType(), CGF), Ty);
+ llvm::Constant *InitElem;
+ if (ILE->getNumInits() > 0) {
+ Expr *Init = ILE->getInit(0);
+ InitElem = CGM.EmitConstantExpr(Init, Init->getType(), CGF);
+ } else {
+ InitElem = CGM.EmitNullConstant(curField->getType());
+ }
+ return EmitUnion(InitElem, Ty);
}
llvm::Constant *EmitVectorInitialization(InitListExpr *ILE) {
}
llvm::Constant *VisitImplicitValueInitExpr(ImplicitValueInitExpr* E) {
- const llvm::Type* RetTy = CGM.getTypes().ConvertType(E->getType());
- return llvm::Constant::getNullValue(RetTy);
+ return CGM.EmitNullConstant(E->getType());
}
llvm::Constant *VisitInitListExpr(InitListExpr *ILE) {
Expr *Init = ILE->getInit(0);
return CGM.EmitConstantExpr(Init, Init->getType(), CGF);
}
- const llvm::Type* RetTy = CGM.getTypes().ConvertType(ILE->getType());
- return llvm::Constant::getNullValue(RetTy);
+ return CGM.EmitNullConstant(ILE->getType());
}
if (ILE->getType()->isArrayType())
}
return C;
}
+
+llvm::Constant *CodeGenModule::EmitNullConstant(QualType T) {
+ // Always return an LLVM null constant for now; this will change when we
+ // get support for IRGen of member pointers.
+ return llvm::Constant::getNullValue(getTypes().ConvertType(T));
+}
llvm::Constant *EmitConstantExpr(const Expr *E, QualType DestType,
CodeGenFunction *CGF = 0);
+ /// EmitNullConstant - Return the result of value-initializing the given
+ /// type, i.e. a null expression of the given type. This is usually,
+ /// but not always, an LLVM null constant.
+ llvm::Constant *EmitNullConstant(QualType T);
+
llvm::Constant *EmitAnnotateAttr(llvm::GlobalValue *GV,
const AnnotateAttr *AA, unsigned LineNo);