Enhancements to Expr::isConstantInitializer to deal with a few

cases it couldn't deal with before.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62952 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eli Friedman 2009-01-25 03:12:18 +00:00
Родитель c9e8f60678
Коммит c39dc9a25a
1 изменённых файлов: 25 добавлений и 6 удалений

Просмотреть файл

@ -693,12 +693,14 @@ bool Expr::hasAnyValueDependentArguments(Expr** Exprs, unsigned NumExprs) {
}
bool Expr::isConstantInitializer(ASTContext &Ctx) const {
// This function is attempting whether an expression is an initializer
// which can be evaluated at compile-time. isEvaluatable handles most
// of the cases, but it can't deal with some initializer-specific
// expressions, and it can't deal with aggregates; we deal with those here,
// and fall back to isEvaluatable for the other cases.
switch (getStmtClass()) {
default:
if (!isEvaluatable(Ctx)) {
return false;
}
break;
default: break;
case StringLiteralClass:
return true;
case CompoundLiteralExprClass: {
@ -712,10 +714,27 @@ bool Expr::isConstantInitializer(ASTContext &Ctx) const {
if (!Exp->getInit(i)->isConstantInitializer(Ctx))
return false;
}
return true;
}
case ParenExprClass: {
return cast<ParenExpr>(this)->getSubExpr()->isConstantInitializer(Ctx);
}
case UnaryOperatorClass: {
const UnaryOperator* Exp = cast<UnaryOperator>(this);
if (Exp->getOpcode() == UnaryOperator::Extension)
return Exp->getSubExpr()->isConstantInitializer(Ctx);
break;
}
case CStyleCastExprClass:
// Handle casts with a destination that's a struct or union; this
// deals with both the gcc no-op struct cast extension and the
// cast-to-union extension.
if (getType()->isRecordType())
return cast<CastExpr>(this)->getSubExpr()->isConstantInitializer(Ctx);
break;
}
return true;
return isEvaluatable(Ctx);
}
/// isIntegerConstantExpr - this recursive routine will test if an expression is