return New;
}
+void Sema::InitializerElementNotConstant(const Expr *Init) {
+ Diag(Init->getExprLoc(),
+ diag::err_init_element_not_constant, Init->getSourceRange());
+}
+
bool Sema::CheckAddressConstantExpressionLValue(const Expr* Init) {
switch (Init->getStmtClass()) {
default:
- Diag(Init->getExprLoc(),
- diag::err_init_element_not_constant, Init->getSourceRange());
+ InitializerElementNotConstant(Init);
return true;
case Expr::ParenExprClass: {
const ParenExpr* PE = cast<ParenExpr>(Init);
if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
if (VD->hasGlobalStorage())
return false;
- Diag(Init->getExprLoc(),
- diag::err_init_element_not_constant, Init->getSourceRange());
+ InitializerElementNotConstant(Init);
return true;
}
if (isa<FunctionDecl>(D))
return false;
- Diag(Init->getExprLoc(),
- diag::err_init_element_not_constant, Init->getSourceRange());
+ InitializerElementNotConstant(Init);
return true;
}
case Expr::MemberExprClass: {
if (Exp->getOpcode() == UnaryOperator::Deref)
return CheckAddressConstantExpression(Exp->getSubExpr());
- Diag(Init->getExprLoc(),
- diag::err_init_element_not_constant, Init->getSourceRange());
+ InitializerElementNotConstant(Init);
return true;
}
}
bool Sema::CheckAddressConstantExpression(const Expr* Init) {
switch (Init->getStmtClass()) {
default:
- Diag(Init->getExprLoc(),
- diag::err_init_element_not_constant, Init->getSourceRange());
+ InitializerElementNotConstant(Init);
return true;
case Expr::ParenExprClass:
return CheckAddressConstantExpression(cast<ParenExpr>(Init)->getSubExpr());
Builtin::BI__builtin___CFStringMakeConstantString)
return false;
- Diag(Init->getExprLoc(),
- diag::err_init_element_not_constant, Init->getSourceRange());
+ InitializerElementNotConstant(Init);
return true;
case Expr::UnaryOperatorClass: {
if (Exp->getOpcode() == UnaryOperator::Extension)
return CheckAddressConstantExpression(Exp->getSubExpr());
- Diag(Init->getExprLoc(),
- diag::err_init_element_not_constant, Init->getSourceRange());
+ InitializerElementNotConstant(Init);
return true;
}
case Expr::BinaryOperatorClass: {
return CheckArithmeticConstantExpression(SubExpr);
}
- Diag(Init->getExprLoc(),
- diag::err_init_element_not_constant, Init->getSourceRange());
+ InitializerElementNotConstant(Init);
return true;
}
case Expr::ConditionalOperatorClass: {
// FIXME: Should we pedwarn here?
const ConditionalOperator *Exp = cast<ConditionalOperator>(Init);
if (!Exp->getCond()->getType()->isArithmeticType()) {
- Diag(Init->getExprLoc(),
- diag::err_init_element_not_constant, Init->getSourceRange());
+ InitializerElementNotConstant(Init);
return true;
}
if (CheckArithmeticConstantExpression(Exp->getCond()))
bool Sema::CheckArithmeticConstantExpression(const Expr* Init) {
switch (Init->getStmtClass()) {
default:
- Diag(Init->getExprLoc(),
- diag::err_init_element_not_constant, Init->getSourceRange());
+ InitializerElementNotConstant(Init);
return true;
case Expr::ParenExprClass: {
const ParenExpr* PE = cast<ParenExpr>(Init);
if (CE->isBuiltinCall() && CE->isEvaluatable(Context))
return false;
- Diag(Init->getExprLoc(),
- diag::err_init_element_not_constant, Init->getSourceRange());
+ InitializerElementNotConstant(Init);
return true;
}
case Expr::DeclRefExprClass: {
const Decl *D = cast<DeclRefExpr>(Init)->getDecl();
if (isa<EnumConstantDecl>(D))
return false;
- Diag(Init->getExprLoc(),
- diag::err_init_element_not_constant, Init->getSourceRange());
+ InitializerElementNotConstant(Init);
return true;
}
case Expr::CompoundLiteralExprClass:
// but vectors are allowed to be magic.
if (Init->getType()->isVectorType())
return false;
- Diag(Init->getExprLoc(),
- diag::err_init_element_not_constant, Init->getSourceRange());
+ InitializerElementNotConstant(Init);
return true;
case Expr::UnaryOperatorClass: {
const UnaryOperator *Exp = cast<UnaryOperator>(Init);
// Address, indirect, pre/post inc/dec, etc are not valid constant exprs.
// See C99 6.6p3.
default:
- Diag(Init->getExprLoc(),
- diag::err_init_element_not_constant, Init->getSourceRange());
+ InitializerElementNotConstant(Init);
return true;
case UnaryOperator::SizeOf:
case UnaryOperator::AlignOf:
// See C99 6.5.3.4p2 and 6.6p3.
if (Exp->getSubExpr()->getType()->isConstantSizeType())
return false;
- Diag(Init->getExprLoc(),
- diag::err_init_element_not_constant, Init->getSourceRange());
+ InitializerElementNotConstant(Init);
return true;
case UnaryOperator::Extension:
case UnaryOperator::LNot:
// alignof always evaluates to a constant.
// FIXME: is sizeof(int[3.0]) a constant expression?
if (Exp->isSizeOf() && !Exp->getArgumentType()->isConstantSizeType()) {
- Diag(Init->getExprLoc(),
- diag::err_init_element_not_constant, Init->getSourceRange());
+ InitializerElementNotConstant(Init);
return true;
}
return false;
}
}
- Diag(Init->getExprLoc(),
- diag::err_init_element_not_constant, Init->getSourceRange());
+ InitializerElementNotConstant(Init);
return true;
}
case Expr::ImplicitCastExprClass:
return CheckAddressConstantExpression(SubExpr);
}
- Diag(Init->getExprLoc(),
- diag::err_init_element_not_constant, Init->getSourceRange());
+ InitializerElementNotConstant(Init);
return true;
}
case Expr::ConditionalOperatorClass: {
if (Init->getType()->isBlockPointerType())
return false;
- Diag(Init->getExprLoc(), diag::err_init_element_not_constant,
- Init->getSourceRange());
+ InitializerElementNotConstant(Init);
return true;
}