make codegen reject initializes with designators, like this:

t.c:1:13: error: cannot codegen this designators yet
int a[10] = {2, 4, [8]=9, 10};
            ^~~~~~~~~~~~~~~~~

llvm-svn: 58220
This commit is contained in:
Chris Lattner 2008-10-26 23:53:12 +00:00
parent 07d754acf1
commit 084bc32e0d
4 changed files with 25 additions and 3 deletions

View File

@ -198,7 +198,7 @@ public:
}
bool hasAnyDesignators() const {
return Designations.empty();
return !Designations.empty();
}
Designation &CreateDesignation(unsigned Idx) {

View File

@ -263,7 +263,11 @@ void AggExprEmitter::VisitVAArgExpr(VAArgExpr *VE) {
}
void AggExprEmitter::EmitNonConstInit(InitListExpr *E) {
if (E->hadDesignators()) {
CGF.ErrorUnsupported(E, "initializer list with designators");
return;
}
const llvm::PointerType *APType =
cast<llvm::PointerType>(DestPtr->getType());
const llvm::Type *DestType = APType->getElementType();
@ -334,6 +338,11 @@ void AggExprEmitter::EmitNullInitializationToLValue(LValue LV, QualType T) {
}
void AggExprEmitter::VisitInitListExpr(InitListExpr *E) {
if (E->hadDesignators()) {
CGF.ErrorUnsupported(E, "initializer list with designators");
return;
}
// FIXME: For constant expressions, call into const expr emitter so
// that we can emit a memcpy instead of storing the individual
// members. This is purely for perf; both codepaths lead to

View File

@ -315,6 +315,12 @@ public:
const llvm::Type* RetTy = CGM.getTypes().ConvertType(ILE->getType());
return llvm::Constant::getNullValue(RetTy);
}
// FIXME: We don't codegen or sema designators yet.
if (ILE->hadDesignators()) {
CGM.ErrorUnsupported(ILE, "initializer list with designators");
return llvm::UndefValue::get(ConvertType(ILE->getType()));
}
if (ILE->getType()->isArrayType())
return EmitArrayInitialization(ILE);

View File

@ -154,7 +154,9 @@ public:
Value *VisitShuffleVectorExpr(ShuffleVectorExpr *E);
Value *VisitMemberExpr(Expr *E) { return EmitLoadOfLValue(E); }
Value *VisitExtVectorElementExpr(Expr *E) { return EmitLoadOfLValue(E); }
Value *VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { return EmitLoadOfLValue(E); }
Value *VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
return EmitLoadOfLValue(E);
}
Value *VisitStringLiteral(Expr *E) { return EmitLValue(E).getAddress(); }
Value *VisitPredefinedExpr(Expr *E) { return EmitLValue(E).getAddress(); }
@ -168,6 +170,11 @@ public:
if (!VType)
return Visit(E->getInit(0));
if (E->hadDesignators()) {
CGF.ErrorUnsupported(E, "initializer list with designators");
return llvm::UndefValue::get(CGF.ConvertType(E->getType()));
}
unsigned NumVectorElements = VType->getNumElements();
const llvm::Type *ElementType = VType->getElementType();