return Visit(E->getSubExpr());
}
}
+
+ bool VisitInitListExpr(const InitListExpr *E) {
+ if (Info.Ctx.getLangOptions().CPlusPlus0x && E->getNumInits() == 1)
+ return Visit(E->getInit(0));
+ return Error(E);
+ }
+
// FIXME: Missing: __real__, __imag__
};
bool VisitCXXNoexceptExpr(const CXXNoexceptExpr *E);
bool VisitSizeOfPackExpr(const SizeOfPackExpr *E);
-
+
+ bool VisitInitListExpr(const InitListExpr *E);
+
private:
CharUnits GetAlignOfExpr(const Expr *E);
CharUnits GetAlignOfType(QualType T);
return Success(E->getValue(), E);
}
+bool IntExprEvaluator::VisitInitListExpr(const InitListExpr *E) {
+ if (!Info.Ctx.getLangOptions().CPlusPlus0x)
+ return Error(E);
+
+ if (E->getNumInits() == 0)
+ return Success(0, E);
+
+ assert(E->getNumInits() == 1 && "Excess initializers for integer in C++11.");
+ return Visit(E->getInit(0));
+}
+
//===----------------------------------------------------------------------===//
// Float Evaluation
//===----------------------------------------------------------------------===//
bool VisitDeclRefExpr(const DeclRefExpr *E);
+ bool VisitInitListExpr(const InitListExpr *E);
+
// FIXME: Missing: array subscript of vector, member of vector,
// ImplicitValueInitExpr
};
return true;
}
+bool FloatExprEvaluator::VisitInitListExpr(const InitListExpr *E) {
+ if (!Info.Ctx.getLangOptions().CPlusPlus0x)
+ return Error(E);
+
+ if (E->getNumInits() == 0) {
+ Result = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(E->getType()));
+ return true;
+ }
+
+ assert(E->getNumInits() == 1 && "Excess initializers for integer in C++11.");
+ return Visit(E->getInit(0));
+}
+
//===----------------------------------------------------------------------===//
// Complex Evaluation (for float and integer)
//===----------------------------------------------------------------------===//
bool VisitBinaryOperator(const BinaryOperator *E);
bool VisitUnaryOperator(const UnaryOperator *E);
- // FIXME Missing: ImplicitValueInitExpr
+ // FIXME Missing: ImplicitValueInitExpr, InitListExpr
};
} // end anonymous namespace
case Expr::CompoundAssignOperatorClass:
case Expr::CompoundLiteralExprClass:
case Expr::ExtVectorElementExprClass:
- case Expr::InitListExprClass:
case Expr::DesignatedInitExprClass:
case Expr::ImplicitValueInitExprClass:
case Expr::ParenListExprClass:
case Expr::MaterializeTemporaryExprClass:
return ICEDiag(2, E->getLocStart());
+ case Expr::InitListExprClass:
+ if (Ctx.getLangOptions().CPlusPlus0x) {
+ const InitListExpr *ILE = cast<InitListExpr>(E);
+ if (ILE->getNumInits() == 0)
+ return NoDiag();
+ if (ILE->getNumInits() == 1)
+ return CheckICE(ILE->getInit(0), Ctx);
+ // Fall through for more than 1 expression.
+ }
+ return ICEDiag(2, E->getLocStart());
+
case Expr::SizeOfPackExprClass:
case Expr::GNUNullExprClass:
// GCC considers the GNU __null value to be an integral constant expression.