ExprConstant.cpp revision b83d287bc7f47d36fb0751a481e2ef9308b37252
1b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner//===--- ExprConstant.cpp - Expression Constant Evaluator -----------------===//
2c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//
3c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//                     The LLVM Compiler Infrastructure
4c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//
5c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// This file is distributed under the University of Illinois Open Source
6c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// License. See LICENSE.TXT for details.
7c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//
8c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//===----------------------------------------------------------------------===//
9c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//
10c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// This file implements the Expr constant evaluator.
11c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//
12c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//===----------------------------------------------------------------------===//
13c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson
14c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson#include "clang/AST/APValue.h"
15c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson#include "clang/AST/ASTContext.h"
164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman#include "clang/AST/RecordLayout.h"
170fe52e1bcaa69ba127f1bda036f057fec1f478deSeo Sanghyeon#include "clang/AST/StmtVisitor.h"
18500d3297d2a21edeac4d46cbcbe21bc2352c2a28Chris Lattner#include "clang/AST/ASTDiagnostic.h"
1906a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson#include "clang/Basic/TargetInfo.h"
20c754aa62643e66ab967ca32ae8b0b3fc419bba25Anders Carlsson#include "llvm/Support/Compiler.h"
21c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlssonusing namespace clang;
22f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerusing llvm::APSInt;
23d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanusing llvm::APFloat;
24c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson
2587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// EvalInfo - This is a private struct used by the evaluator to capture
2687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// information about a subexpression as it is folded.  It retains information
2787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// about the AST context, but also maintains information about the folded
2887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// expression.
2987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner///
3087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// If an expression could be evaluated, it is still possible it is not a C
3187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// "integer constant expression" or constant expression.  If not, this struct
3287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// captures information about how and why not.
3387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner///
3487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// One bit of information passed *into* the request for constant folding
3587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// indicates whether the subexpression is "evaluated" or not according to C
3687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// rules.  For example, the RHS of (0 && foo()) is not evaluated.  We can
3787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// evaluate the expression regardless of what the RHS is, but C only allows
3887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// certain things in certain situations.
3987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstruct EvalInfo {
4087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  ASTContext &Ctx;
4187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner
4254da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson  /// EvalResult - Contains information about the evaluation.
4354da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson  Expr::EvalResult &EvalResult;
44f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson
45f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson  /// ShortCircuit - will be greater than zero if the current subexpression has
46f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson  /// will not be evaluated because it's short-circuited (according to C rules).
47f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson  unsigned ShortCircuit;
4854da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson
4954da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson  EvalInfo(ASTContext &ctx, Expr::EvalResult& evalresult) : Ctx(ctx),
50f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson           EvalResult(evalresult), ShortCircuit(0) {}
5187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner};
5287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner
5387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner
544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool EvaluateLValue(const Expr *E, APValue &Result, EvalInfo &Info);
5587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluatePointer(const Expr *E, APValue &Result, EvalInfo &Info);
5687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluateInteger(const Expr *E, APSInt  &Result, EvalInfo &Info);
57d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr *E, APFloat &Result, EvalInfo &Info);
58a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbarstatic bool EvaluateComplex(const Expr *E, APValue &Result, EvalInfo &Info);
59f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
60f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// Misc utilities
624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool HandleConversionToBool(Expr* E, bool& Result, EvalInfo &Info) {
654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (E->getType()->isIntegralType()) {
664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APSInt IntResult;
674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!EvaluateInteger(E, IntResult, Info))
684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
694efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Result = IntResult != 0;
704efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
714efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  } else if (E->getType()->isRealFloatingType()) {
724efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APFloat FloatResult(0.0);
734efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!EvaluateFloat(E, FloatResult, Info))
744efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
754efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Result = !FloatResult.isZero();
764efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
774efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  } else if (E->getType()->isPointerType()) {
784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APValue PointerResult;
794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!EvaluatePointer(E, PointerResult, Info))
804efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    // FIXME: Is this accurate for all kinds of bases?  If not, what would
824efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    // the check look like?
834efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Result = PointerResult.getLValueBase() || PointerResult.getLValueOffset();
844efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
864efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
874efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return false;
884efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
894efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
90a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbarstatic APSInt HandleFloatToIntCast(QualType DestType, QualType SrcType,
91a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                   APFloat &Value, ASTContext &Ctx) {
92a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  unsigned DestWidth = Ctx.getIntWidth(DestType);
93a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  // Determine whether we are converting to unsigned or signed.
94a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  bool DestSigned = DestType->isSignedIntegerType();
95a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
96a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  // FIXME: Warning for overflow.
97a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  uint64_t Space[4];
98a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  bool ignored;
99a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  (void)Value.convertToInteger(Space, DestWidth, DestSigned,
100a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                               llvm::APFloat::rmTowardZero, &ignored);
101a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  return APSInt(llvm::APInt(DestWidth, 4, Space), !DestSigned);
102a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar}
103a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
104a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbarstatic APFloat HandleFloatToFloatCast(QualType DestType, QualType SrcType,
105a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                      APFloat &Value, ASTContext &Ctx) {
106a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  bool ignored;
107a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  APFloat Result = Value;
108a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  Result.convert(Ctx.getFloatTypeSemantics(DestType),
109a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                 APFloat::rmNearestTiesToEven, &ignored);
110a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  return Result;
111a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar}
112a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
113a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbarstatic APSInt HandleIntToIntCast(QualType DestType, QualType SrcType,
114a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                 APSInt &Value, ASTContext &Ctx) {
115a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  unsigned DestWidth = Ctx.getIntWidth(DestType);
116a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  APSInt Result = Value;
117a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  // Figure out if this is a truncate, extend or noop cast.
118a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  // If the input is signed, do a sign extend, noop, or truncate.
119a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  Result.extOrTrunc(DestWidth);
120a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  Result.setIsUnsigned(DestType->isUnsignedIntegerType());
121a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  return Result;
122a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar}
123a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
124a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbarstatic APFloat HandleIntToFloatCast(QualType DestType, QualType SrcType,
125a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                    APSInt &Value, ASTContext &Ctx) {
126a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
127a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  APFloat Result(Ctx.getFloatTypeSemantics(DestType), 1);
128a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  Result.convertFromAPInt(Value, Value.isSigned(),
129a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                          APFloat::rmNearestTiesToEven);
130a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  return Result;
131a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar}
132a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1334efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
1344efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// LValue Evaluation
1354efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
1364efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmannamespace {
1374efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanclass VISIBILITY_HIDDEN LValueExprEvaluator
1384efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  : public StmtVisitor<LValueExprEvaluator, APValue> {
1394efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  EvalInfo &Info;
1404efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanpublic:
1414efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1424efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  LValueExprEvaluator(EvalInfo &info) : Info(info) {}
1434efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1444efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitStmt(Stmt *S) {
1458a7b7c6d4c96ace3667204bed4a48bad91b7c0f0Daniel Dunbar#if 0
1464efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    // FIXME: Remove this when we support more expressions.
1474efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    printf("Unhandled pointer statement\n");
1484efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    S->dump();
1498a7b7c6d4c96ace3667204bed4a48bad91b7c0f0Daniel Dunbar#endif
1504efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return APValue();
1514efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
1524efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
15435873c49adad211ff466e34342a52665742794f5Anders Carlsson  APValue VisitDeclRefExpr(DeclRefExpr *E);
1554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitPredefinedExpr(PredefinedExpr *E) { return APValue(E, 0); }
1564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
1574efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitMemberExpr(MemberExpr *E);
1584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitStringLiteral(StringLiteral *E) { return APValue(E, 0); }
1593068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  APValue VisitArraySubscriptExpr(ArraySubscriptExpr *E);
1604efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman};
1614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} // end anonymous namespace
1624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool EvaluateLValue(const Expr* E, APValue& Result, EvalInfo &Info) {
1644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  Result = LValueExprEvaluator(Info).Visit(const_cast<Expr*>(E));
1654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return Result.isLValue();
1664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
1674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
16835873c49adad211ff466e34342a52665742794f5Anders CarlssonAPValue LValueExprEvaluator::VisitDeclRefExpr(DeclRefExpr *E)
16935873c49adad211ff466e34342a52665742794f5Anders Carlsson{
17035873c49adad211ff466e34342a52665742794f5Anders Carlsson  if (!E->hasGlobalStorage())
17135873c49adad211ff466e34342a52665742794f5Anders Carlsson    return APValue();
17235873c49adad211ff466e34342a52665742794f5Anders Carlsson
17335873c49adad211ff466e34342a52665742794f5Anders Carlsson  return APValue(E, 0);
17435873c49adad211ff466e34342a52665742794f5Anders Carlsson}
17535873c49adad211ff466e34342a52665742794f5Anders Carlsson
1764efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue LValueExprEvaluator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
1774efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (E->isFileScope())
1784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return APValue(E, 0);
1794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return APValue();
1804efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
1814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1824efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue LValueExprEvaluator::VisitMemberExpr(MemberExpr *E) {
1834efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue result;
1844efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  QualType Ty;
1854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (E->isArrow()) {
1864efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!EvaluatePointer(E->getBase(), result, Info))
1874efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return APValue();
1884efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Ty = E->getBase()->getType()->getAsPointerType()->getPointeeType();
1894efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  } else {
1904efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    result = Visit(E->getBase());
1914efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (result.isUninit())
1924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return APValue();
1934efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Ty = E->getBase()->getType();
1944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
1954efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1964efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  RecordDecl *RD = Ty->getAsRecordType()->getDecl();
1974efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD);
19886f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor
19986f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor  FieldDecl *FD = dyn_cast<FieldDecl>(E->getMemberDecl());
20086f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor  if (!FD) // FIXME: deal with other kinds of member expressions
20186f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor    return APValue();
2024efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2034efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  // FIXME: This is linear time.
20444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  unsigned i = 0;
20544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  for (RecordDecl::field_iterator Field = RD->field_begin(),
20644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor                               FieldEnd = RD->field_end();
20744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor       Field != FieldEnd; (void)++Field, ++i) {
20844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor    if (*Field == FD)
2094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      break;
2104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
2114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2124efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  result.setLValue(result.getLValueBase(),
2134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman                   result.getLValueOffset() + RL.getFieldOffset(i) / 8);
2144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return result;
2164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
2174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2183068d117951a8df54bae9db039b56201ab10962bAnders CarlssonAPValue LValueExprEvaluator::VisitArraySubscriptExpr(ArraySubscriptExpr *E)
2193068d117951a8df54bae9db039b56201ab10962bAnders Carlsson{
2203068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  APValue Result;
2213068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
2223068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  if (!EvaluatePointer(E->getBase(), Result, Info))
2233068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    return APValue();
2243068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
2253068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  APSInt Index;
2263068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  if (!EvaluateInteger(E->getIdx(), Index, Info))
2273068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    return APValue();
2283068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
2293068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  uint64_t ElementSize = Info.Ctx.getTypeSize(E->getType()) / 8;
2303068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
2313068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  uint64_t Offset = Index.getSExtValue() * ElementSize;
2323068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  Result.setLValue(Result.getLValueBase(),
2333068d117951a8df54bae9db039b56201ab10962bAnders Carlsson                   Result.getLValueOffset() + Offset);
2343068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  return Result;
2353068d117951a8df54bae9db039b56201ab10962bAnders Carlsson}
2364efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2374efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
238f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Pointer Evaluation
239f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
240f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
241c754aa62643e66ab967ca32ae8b0b3fc419bba25Anders Carlssonnamespace {
2422bad1687fe6f00e10767a691a33b070b151902b6Anders Carlssonclass VISIBILITY_HIDDEN PointerExprEvaluator
2432bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  : public StmtVisitor<PointerExprEvaluator, APValue> {
24487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  EvalInfo &Info;
2452bad1687fe6f00e10767a691a33b070b151902b6Anders Carlssonpublic:
2462bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
24787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  PointerExprEvaluator(EvalInfo &info) : Info(info) {}
248f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
2492bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  APValue VisitStmt(Stmt *S) {
2502bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson    return APValue();
2512bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  }
2522bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
2532bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
2542bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
255650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  APValue VisitBinaryOperator(const BinaryOperator *E);
256650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  APValue VisitCastExpr(const CastExpr* E);
2574efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitUnaryOperator(const UnaryOperator *E);
2584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitObjCStringLiteral(ObjCStringLiteral *E)
2594efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      { return APValue(E, 0); }
260f01158941ba4560c63150032073bb231ce38999eEli Friedman  APValue VisitAddrLabelExpr(AddrLabelExpr *E)
261f01158941ba4560c63150032073bb231ce38999eEli Friedman      { return APValue(E, 0); }
2623941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman  APValue VisitCallExpr(CallExpr *E);
263b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump  APValue VisitBlockExpr(BlockExpr *E) {
264b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump    if (!E->hasBlockDeclRefExprs())
265b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump      return APValue(E, 0);
266b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump    return APValue();
267b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump  }
2684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitConditionalOperator(ConditionalOperator *E);
2692bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson};
270f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace
2712bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
27287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluatePointer(const Expr* E, APValue& Result, EvalInfo &Info) {
273ca2f3fdeedc4e4beea4f7572d6d975188d0bb5efMike Stump  if (!E->getType()->isPointerType()
274ca2f3fdeedc4e4beea4f7572d6d975188d0bb5efMike Stump      && !E->getType()->isBlockPointerType())
275f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner    return false;
27687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  Result = PointerExprEvaluator(Info).Visit(const_cast<Expr*>(E));
277f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  return Result.isLValue();
278f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner}
279650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
280f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris LattnerAPValue PointerExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
281650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  if (E->getOpcode() != BinaryOperator::Add &&
282650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson      E->getOpcode() != BinaryOperator::Sub)
283650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    return APValue();
284650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
285650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  const Expr *PExp = E->getLHS();
286650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  const Expr *IExp = E->getRHS();
287650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  if (IExp->getType()->isPointerType())
288f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner    std::swap(PExp, IExp);
289650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
290650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  APValue ResultLValue;
29187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  if (!EvaluatePointer(PExp, ResultLValue, Info))
292650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    return APValue();
293f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
294650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  llvm::APSInt AdditionalOffset(32);
29587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  if (!EvaluateInteger(IExp, AdditionalOffset, Info))
296650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    return APValue();
297650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
2984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  QualType PointeeType = PExp->getType()->getAsPointerType()->getPointeeType();
2994d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson  uint64_t SizeOfPointee;
3004d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson
3014d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson  // Explicitly handle GNU void* and function pointer arithmetic extensions.
3024d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson  if (PointeeType->isVoidType() || PointeeType->isFunctionType())
3034d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson    SizeOfPointee = 1;
3044d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson  else
3054d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson    SizeOfPointee = Info.Ctx.getTypeSize(PointeeType) / 8;
3064efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
307650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  uint64_t Offset = ResultLValue.getLValueOffset();
3084efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
309650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  if (E->getOpcode() == BinaryOperator::Add)
3104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Offset += AdditionalOffset.getLimitedValue() * SizeOfPointee;
311650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  else
3124efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Offset -= AdditionalOffset.getLimitedValue() * SizeOfPointee;
3134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
314650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  return APValue(ResultLValue.getLValueBase(), Offset);
315650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson}
3164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
3174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue PointerExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
3184efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (E->getOpcode() == UnaryOperator::Extension) {
3194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    // FIXME: Deal with warnings?
3204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return Visit(E->getSubExpr());
3214efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
3224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
3234efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (E->getOpcode() == UnaryOperator::AddrOf) {
3244efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APValue result;
3254efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (EvaluateLValue(E->getSubExpr(), result, Info))
3264efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return result;
3274efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
3284efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
3294efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return APValue();
3304efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
331d407a7619904c81d38b41a9ee850de413105084bAnders Carlsson
332650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
333b542afe02d317411d53b3541946f9f2a8f509a11Chris LattnerAPValue PointerExprEvaluator::VisitCastExpr(const CastExpr* E) {
334650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  const Expr* SubExpr = E->getSubExpr();
335650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
336650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson   // Check for pointer->pointer cast
337650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  if (SubExpr->getType()->isPointerType()) {
338650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    APValue Result;
33987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner    if (EvaluatePointer(SubExpr, Result, Info))
340650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson      return Result;
341f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner    return APValue();
342650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  }
343650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
344d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman  if (SubExpr->getType()->isIntegralType()) {
345650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    llvm::APSInt Result(32);
34687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner    if (EvaluateInteger(SubExpr, Result, Info)) {
34787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner      Result.extOrTrunc((unsigned)Info.Ctx.getTypeSize(E->getType()));
348650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson      return APValue(0, Result.getZExtValue());
349650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    }
350650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  }
3514efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
3524efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (SubExpr->getType()->isFunctionType() ||
3534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      SubExpr->getType()->isArrayType()) {
3544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APValue Result;
3554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (EvaluateLValue(SubExpr, Result, Info))
3564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return Result;
3574efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return APValue();
3584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
3594efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
3604efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  //assert(0 && "Unhandled cast");
361650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  return APValue();
362650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson}
363650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
3643941b18b8e441c8c466efecd557de60b9a32d10bEli FriedmanAPValue PointerExprEvaluator::VisitCallExpr(CallExpr *E) {
3653c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  if (E->isBuiltinCall(Info.Ctx) ==
3663c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor        Builtin::BI__builtin___CFStringMakeConstantString)
3673941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman    return APValue(E, 0);
3683941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman  return APValue();
3693941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman}
3703941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman
3714efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue PointerExprEvaluator::VisitConditionalOperator(ConditionalOperator *E) {
3724efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  bool BoolResult;
3734efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (!HandleConversionToBool(E->getCond(), BoolResult, Info))
3744efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return APValue();
3754efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
3764efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  Expr* EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr();
3774efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
3784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue Result;
3794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (EvaluatePointer(EvalExpr, Result, Info))
3804efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return Result;
3814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return APValue();
3824efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
383f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
384f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
38559b5da6d853b4368b984700315adf7b37de05764Nate Begeman// Vector Evaluation
38659b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===//
38759b5da6d853b4368b984700315adf7b37de05764Nate Begeman
38859b5da6d853b4368b984700315adf7b37de05764Nate Begemannamespace {
38959b5da6d853b4368b984700315adf7b37de05764Nate Begeman  class VISIBILITY_HIDDEN VectorExprEvaluator
39059b5da6d853b4368b984700315adf7b37de05764Nate Begeman  : public StmtVisitor<VectorExprEvaluator, APValue> {
39159b5da6d853b4368b984700315adf7b37de05764Nate Begeman    EvalInfo &Info;
39259b5da6d853b4368b984700315adf7b37de05764Nate Begeman  public:
39359b5da6d853b4368b984700315adf7b37de05764Nate Begeman
39459b5da6d853b4368b984700315adf7b37de05764Nate Begeman    VectorExprEvaluator(EvalInfo &info) : Info(info) {}
39559b5da6d853b4368b984700315adf7b37de05764Nate Begeman
39659b5da6d853b4368b984700315adf7b37de05764Nate Begeman    APValue VisitStmt(Stmt *S) {
39759b5da6d853b4368b984700315adf7b37de05764Nate Begeman      return APValue();
39859b5da6d853b4368b984700315adf7b37de05764Nate Begeman    }
39959b5da6d853b4368b984700315adf7b37de05764Nate Begeman
40059b5da6d853b4368b984700315adf7b37de05764Nate Begeman    APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
40159b5da6d853b4368b984700315adf7b37de05764Nate Begeman    APValue VisitCastExpr(const CastExpr* E);
40259b5da6d853b4368b984700315adf7b37de05764Nate Begeman    APValue VisitCompoundLiteralExpr(const CompoundLiteralExpr *E);
40359b5da6d853b4368b984700315adf7b37de05764Nate Begeman    APValue VisitInitListExpr(const InitListExpr *E);
40459b5da6d853b4368b984700315adf7b37de05764Nate Begeman  };
40559b5da6d853b4368b984700315adf7b37de05764Nate Begeman} // end anonymous namespace
40659b5da6d853b4368b984700315adf7b37de05764Nate Begeman
40759b5da6d853b4368b984700315adf7b37de05764Nate Begemanstatic bool EvaluateVector(const Expr* E, APValue& Result, EvalInfo &Info) {
40859b5da6d853b4368b984700315adf7b37de05764Nate Begeman  if (!E->getType()->isVectorType())
40959b5da6d853b4368b984700315adf7b37de05764Nate Begeman    return false;
41059b5da6d853b4368b984700315adf7b37de05764Nate Begeman  Result = VectorExprEvaluator(Info).Visit(const_cast<Expr*>(E));
41159b5da6d853b4368b984700315adf7b37de05764Nate Begeman  return !Result.isUninit();
41259b5da6d853b4368b984700315adf7b37de05764Nate Begeman}
41359b5da6d853b4368b984700315adf7b37de05764Nate Begeman
41459b5da6d853b4368b984700315adf7b37de05764Nate BegemanAPValue VectorExprEvaluator::VisitCastExpr(const CastExpr* E) {
41559b5da6d853b4368b984700315adf7b37de05764Nate Begeman  const Expr* SE = E->getSubExpr();
41659b5da6d853b4368b984700315adf7b37de05764Nate Begeman
41759b5da6d853b4368b984700315adf7b37de05764Nate Begeman  // Check for vector->vector bitcast.
41859b5da6d853b4368b984700315adf7b37de05764Nate Begeman  if (SE->getType()->isVectorType())
41959b5da6d853b4368b984700315adf7b37de05764Nate Begeman    return this->Visit(const_cast<Expr*>(SE));
42059b5da6d853b4368b984700315adf7b37de05764Nate Begeman
42159b5da6d853b4368b984700315adf7b37de05764Nate Begeman  return APValue();
42259b5da6d853b4368b984700315adf7b37de05764Nate Begeman}
42359b5da6d853b4368b984700315adf7b37de05764Nate Begeman
42459b5da6d853b4368b984700315adf7b37de05764Nate BegemanAPValue
42559b5da6d853b4368b984700315adf7b37de05764Nate BegemanVectorExprEvaluator::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) {
42659b5da6d853b4368b984700315adf7b37de05764Nate Begeman  return this->Visit(const_cast<Expr*>(E->getInitializer()));
42759b5da6d853b4368b984700315adf7b37de05764Nate Begeman}
42859b5da6d853b4368b984700315adf7b37de05764Nate Begeman
42959b5da6d853b4368b984700315adf7b37de05764Nate BegemanAPValue
43059b5da6d853b4368b984700315adf7b37de05764Nate BegemanVectorExprEvaluator::VisitInitListExpr(const InitListExpr *E) {
43159b5da6d853b4368b984700315adf7b37de05764Nate Begeman  const VectorType *VT = E->getType()->getAsVectorType();
43259b5da6d853b4368b984700315adf7b37de05764Nate Begeman  unsigned NumInits = E->getNumInits();
43359b5da6d853b4368b984700315adf7b37de05764Nate Begeman
43459b5da6d853b4368b984700315adf7b37de05764Nate Begeman  if (!VT || VT->getNumElements() != NumInits)
43559b5da6d853b4368b984700315adf7b37de05764Nate Begeman    return APValue();
43659b5da6d853b4368b984700315adf7b37de05764Nate Begeman
43759b5da6d853b4368b984700315adf7b37de05764Nate Begeman  QualType EltTy = VT->getElementType();
43859b5da6d853b4368b984700315adf7b37de05764Nate Begeman  llvm::SmallVector<APValue, 4> Elements;
43959b5da6d853b4368b984700315adf7b37de05764Nate Begeman
44059b5da6d853b4368b984700315adf7b37de05764Nate Begeman  for (unsigned i = 0; i < NumInits; i++) {
44159b5da6d853b4368b984700315adf7b37de05764Nate Begeman    if (EltTy->isIntegerType()) {
44259b5da6d853b4368b984700315adf7b37de05764Nate Begeman      llvm::APSInt sInt(32);
44359b5da6d853b4368b984700315adf7b37de05764Nate Begeman      if (!EvaluateInteger(E->getInit(i), sInt, Info))
44459b5da6d853b4368b984700315adf7b37de05764Nate Begeman        return APValue();
44559b5da6d853b4368b984700315adf7b37de05764Nate Begeman      Elements.push_back(APValue(sInt));
44659b5da6d853b4368b984700315adf7b37de05764Nate Begeman    } else {
44759b5da6d853b4368b984700315adf7b37de05764Nate Begeman      llvm::APFloat f(0.0);
44859b5da6d853b4368b984700315adf7b37de05764Nate Begeman      if (!EvaluateFloat(E->getInit(i), f, Info))
44959b5da6d853b4368b984700315adf7b37de05764Nate Begeman        return APValue();
45059b5da6d853b4368b984700315adf7b37de05764Nate Begeman      Elements.push_back(APValue(f));
45159b5da6d853b4368b984700315adf7b37de05764Nate Begeman    }
45259b5da6d853b4368b984700315adf7b37de05764Nate Begeman  }
45359b5da6d853b4368b984700315adf7b37de05764Nate Begeman  return APValue(&Elements[0], Elements.size());
45459b5da6d853b4368b984700315adf7b37de05764Nate Begeman}
45559b5da6d853b4368b984700315adf7b37de05764Nate Begeman
45659b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===//
457f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Integer Evaluation
458f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
459f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
460f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnernamespace {
461f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerclass VISIBILITY_HIDDEN IntExprEvaluator
462b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  : public StmtVisitor<IntExprEvaluator, bool> {
46387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  EvalInfo &Info;
46430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  APValue &Result;
465f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerpublic:
46630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  IntExprEvaluator(EvalInfo &info, APValue &result)
46787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner    : Info(info), Result(result) {}
468f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
46982206e267ce6cc709797127616f64672d255b310Anders Carlsson  bool Extension(SourceLocation L, diag::kind D, const Expr *E) {
47054da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson    Info.EvalResult.DiagLoc = L;
47154da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson    Info.EvalResult.Diag = D;
47282206e267ce6cc709797127616f64672d255b310Anders Carlsson    Info.EvalResult.DiagExpr = E;
47354176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    return true;  // still a constant.
47454176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner  }
475131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar
4763f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  bool Success(const llvm::APSInt &SI, const Expr *E) {
47730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    assert(SI.isSigned() == E->getType()->isSignedIntegerType() &&
4783f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar           "Invalid evaluation result.");
47930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    assert(SI.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) &&
4803f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar           "Invalid evaluation result.");
48130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    Result = APValue(SI);
4823f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    return true;
4833f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  }
4843f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar
485131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  bool Success(const llvm::APInt &I, const Expr *E) {
48630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    assert(I.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) &&
4873f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar           "Invalid evaluation result.");
48830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    Result = APValue(APSInt(I));
48930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    Result.getInt().setIsUnsigned(E->getType()->isUnsignedIntegerType());
490131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return true;
491131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  }
492131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar
493131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  bool Success(uint64_t Value, const Expr *E) {
49430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    Result = APValue(Info.Ctx.MakeIntValue(Value, E->getType()));
495131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return true;
496131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  }
497131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar
49882206e267ce6cc709797127616f64672d255b310Anders Carlsson  bool Error(SourceLocation L, diag::kind D, const Expr *E) {
49954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    // If this is in an unevaluated portion of the subexpression, ignore the
50054176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    // error.
501f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson    if (Info.ShortCircuit) {
50232fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner      // If error is ignored because the value isn't evaluated, get the real
50332fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner      // type at least to prevent errors downstream.
504131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(0, E);
50532fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    }
50654176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner
50732fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    // Take the first error.
50830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar
50930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    // FIXME: This is wrong if we happen to have already emitted an
51030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    // extension diagnostic; in that case we should report this error.
51154da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson    if (Info.EvalResult.Diag == 0) {
51254da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson      Info.EvalResult.DiagLoc = L;
51354da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson      Info.EvalResult.Diag = D;
51482206e267ce6cc709797127616f64672d255b310Anders Carlsson      Info.EvalResult.DiagExpr = E;
51532fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    }
51654176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    return false;
5177a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner  }
5187a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner
519f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  //===--------------------------------------------------------------------===//
520f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  //                            Visitor Methods
521f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  //===--------------------------------------------------------------------===//
52232fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner
52332fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner  bool VisitStmt(Stmt *) {
52432fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    assert(0 && "This should be called on integers, stmts are not integers");
52532fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    return false;
52632fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner  }
5277a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner
52832fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner  bool VisitExpr(Expr *E) {
5290e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
530f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  }
531f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
532b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
533f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
5344c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitIntegerLiteral(const IntegerLiteral *E) {
535131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(E->getValue(), E);
5364c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  }
5374c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitCharacterLiteral(const CharacterLiteral *E) {
538131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(E->getValue(), E);
5394c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  }
5404c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitTypesCompatibleExpr(const TypesCompatibleExpr *E) {
541ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    // Per gcc docs "this built-in function ignores top level
542ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    // qualifiers".  We need to use the canonical version to properly
543ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    // be able to strip CRV qualifiers from the type.
544ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    QualType T0 = Info.Ctx.getCanonicalType(E->getArgType1());
545ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    QualType T1 = Info.Ctx.getCanonicalType(E->getArgType2());
546131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(Info.Ctx.typesAreCompatible(T0.getUnqualifiedType(),
547131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                                               T1.getUnqualifiedType()),
548131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                   E);
5494c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  }
5504c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitDeclRefExpr(const DeclRefExpr *E);
5514c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitCallExpr(const CallExpr *E);
552b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  bool VisitBinaryOperator(const BinaryOperator *E);
553b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  bool VisitUnaryOperator(const UnaryOperator *E);
554ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes  bool VisitConditionalOperator(const ConditionalOperator *E);
555f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
556a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  bool VisitCastExpr(CastExpr* E);
5570518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  bool VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E);
5580518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl
5593068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  bool VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) {
560131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(E->getValue(), E);
5613068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  }
5623068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
5633f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson  bool VisitGNUNullExpr(const GNUNullExpr *E) {
564131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(0, E);
5653f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson  }
5663f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson
5673068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  bool VisitCXXZeroInitValueExpr(const CXXZeroInitValueExpr *E) {
568131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(0, E);
5693068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  }
5703068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
57164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  bool VisitUnaryTypeTraitExpr(const UnaryTypeTraitExpr *E) {
572131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(E->EvaluateTrait(), E);
57364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  }
57464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl
575fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattnerprivate:
576af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  unsigned GetAlignOfExpr(const Expr *E);
577af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  unsigned GetAlignOfType(QualType T);
578f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner};
579f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace
580f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
58187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluateInteger(const Expr* E, APSInt &Result, EvalInfo &Info) {
5823f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  if (!E->getType()->isIntegralType())
5833f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    return false;
58430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar
58530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  APValue Val;
58630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  if (!IntExprEvaluator(Info, Val).Visit(const_cast<Expr*>(E)) ||
58730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar      !Val.isInt())
58830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return false;
58930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar
59030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  Result = Val.getInt();
59130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  return true;
592f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner}
593f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
5944c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattnerbool IntExprEvaluator::VisitDeclRefExpr(const DeclRefExpr *E) {
5954c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  // Enums are integer constant exprs.
5964c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  if (const EnumConstantDecl *D = dyn_cast<EnumConstantDecl>(E->getDecl())) {
597e9a0f43927041e2bcc89140c338dfae207ad3c3bEli Friedman    // FIXME: This is an ugly hack around the fact that enums don't set their
5983f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    // signedness consistently; see PR3173.
5993f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    APSInt SI = D->getInitVal();
6003f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    SI.setIsUnsigned(!E->getType()->isSignedIntegerType());
6013f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    // FIXME: This is an ugly hack around the fact that enums don't
6023f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    // set their width (!?!) consistently; see PR3173.
6033f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    SI.extOrTrunc(Info.Ctx.getIntWidth(E->getType()));
6043f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    return Success(SI, E);
6054c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  }
606b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl
607b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl  // In C++, const, non-volatile integers initialized with ICEs are ICEs.
608b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl  if (Info.Ctx.getLangOptions().CPlusPlus &&
609b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl      E->getType().getCVRQualifiers() == QualType::Const) {
610b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl    if (const VarDecl *D = dyn_cast<VarDecl>(E->getDecl())) {
611b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl      if (const Expr *Init = D->getInit())
612b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl        return Visit(const_cast<Expr*>(Init));
613b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl    }
614b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl  }
615b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl
6164c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  // Otherwise, random variable references are not constants.
6170e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson  return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
6184c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner}
6194c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner
620a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way
621a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// as GCC.
622a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattnerstatic int EvaluateBuiltinClassifyType(const CallExpr *E) {
623a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  // The following enum mimics the values returned by GCC.
624a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  enum gcc_type_class {
625a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    no_type_class = -1,
626a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    void_type_class, integer_type_class, char_type_class,
627a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    enumeral_type_class, boolean_type_class,
628a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    pointer_type_class, reference_type_class, offset_type_class,
629a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    real_type_class, complex_type_class,
630a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    function_type_class, method_type_class,
631a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    record_type_class, union_type_class,
632a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    array_type_class, string_type_class,
633a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    lang_type_class
634a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  };
635a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner
636a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  // If no argument was supplied, default to "no_type_class". This isn't
637a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  // ideal, however it is what gcc does.
638a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  if (E->getNumArgs() == 0)
639a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return no_type_class;
640a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner
641a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  QualType ArgTy = E->getArg(0)->getType();
642a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  if (ArgTy->isVoidType())
643a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return void_type_class;
644a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isEnumeralType())
645a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return enumeral_type_class;
646a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isBooleanType())
647a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return boolean_type_class;
648a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isCharType())
649a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return string_type_class; // gcc doesn't appear to use char_type_class
650a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isIntegerType())
651a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return integer_type_class;
652a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isPointerType())
653a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return pointer_type_class;
654a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isReferenceType())
655a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return reference_type_class;
656a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isRealType())
657a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return real_type_class;
658a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isComplexType())
659a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return complex_type_class;
660a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isFunctionType())
661a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return function_type_class;
662a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isStructureType())
663a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return record_type_class;
664a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isUnionType())
665a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return union_type_class;
666a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isArrayType())
667a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return array_type_class;
668a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isUnionType())
669a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return union_type_class;
670a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else  // FIXME: offset_type_class, method_type_class, & lang_type_class?
671a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    assert(0 && "CallExpr::isBuiltinClassifyType(): unimplemented type");
672a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  return -1;
673a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner}
674a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner
6754c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattnerbool IntExprEvaluator::VisitCallExpr(const CallExpr *E) {
6763c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  switch (E->isBuiltinCall(Info.Ctx)) {
677019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  default:
6780e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
679019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_classify_type:
680131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(EvaluateBuiltinClassifyType(E), E);
681019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner
6824bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson  case Builtin::BI__builtin_constant_p:
683019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner    // __builtin_constant_p always has one operand: it returns true if that
684019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner    // operand can be folded, false otherwise.
685131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(E->getArg(0)->isEvaluatable(Info.Ctx), E);
686019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  }
6874c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner}
688f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
689b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
690a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  if (E->getOpcode() == BinaryOperator::Comma) {
691027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson    if (!Visit(E->getRHS()))
692027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson      return false;
6934fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson
6944fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson    if (!Info.ShortCircuit) {
6954fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson      // If we can't evaluate the LHS, it must be because it has
6964fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson      // side effects.
6974fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson      if (!E->getLHS()->isEvaluatable(Info.Ctx))
6984fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson        Info.EvalResult.HasSideEffects = true;
6994fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson
7000e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson      return Extension(E->getOperatorLoc(), diag::note_comma_in_ice, E);
7014fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson    }
702c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner
703027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson    return true;
704a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  }
705a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
706a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  if (E->isLogicalOp()) {
707a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // These need to be handled specially because the operands aren't
708a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // necessarily integral
709fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson    bool lhsResult, rhsResult;
71051fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson
711fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson    if (HandleConversionToBool(E->getLHS(), lhsResult, Info)) {
71251fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson      // We were able to evaluate the LHS, see if we can get away with not
71351fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson      // evaluating the RHS: 0 && X -> 0, 1 || X -> 1
714fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson      if (lhsResult == (E->getOpcode() == BinaryOperator::LOr) ||
715fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson          !lhsResult == (E->getOpcode() == BinaryOperator::LAnd)) {
716f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson        Info.ShortCircuit++;
717fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson        bool rhsEvaluated = HandleConversionToBool(E->getRHS(), rhsResult, Info);
718f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson        Info.ShortCircuit--;
719f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson
720fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson        // FIXME: Return an extension warning saying that the RHS could not be
721fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson        // evaluated.
7223f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar        // if (!rhsEvaluated) ...
7233f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar        (void) rhsEvaluated;
7243f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar
7253f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar        return Success(lhsResult, E);
726a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman      }
727a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
728fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson      if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) {
7294bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        if (E->getOpcode() == BinaryOperator::LOr)
730131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar          return Success(lhsResult || rhsResult, E);
7314bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        else
732131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar          return Success(lhsResult && rhsResult, E);
7334bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson      }
7344bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson    } else {
735fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson      if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) {
7364bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        // We can't evaluate the LHS; however, sometimes the result
7374bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        // is determined by the RHS: X && 0 -> 0, X || 1 -> 1.
738fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson        if (rhsResult == (E->getOpcode() == BinaryOperator::LOr) ||
739fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson            !rhsResult == (E->getOpcode() == BinaryOperator::LAnd)) {
740131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar          // Since we weren't able to evaluate the left hand side, it
741fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson          // must have had side effects.
742fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson          Info.EvalResult.HasSideEffects = true;
743131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar
744131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar          return Success(rhsResult, E);
7454bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        }
7464bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson      }
747a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    }
748a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
749a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    return false;
750c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner  }
75154176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner
752286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  QualType LHSTy = E->getLHS()->getType();
753286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  QualType RHSTy = E->getRHS()->getType();
7544087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
7554087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar  if (LHSTy->isAnyComplexType()) {
7564087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    assert(RHSTy->isAnyComplexType() && "Invalid comparison");
7574087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    APValue LHS, RHS;
7584087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
7594087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    if (!EvaluateComplex(E->getLHS(), LHS, Info))
7604087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      return false;
7614087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
7624087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    if (!EvaluateComplex(E->getRHS(), RHS, Info))
7634087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      return false;
7644087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
7654087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    if (LHS.isComplexFloat()) {
7664087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      APFloat::cmpResult CR_r =
7674087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar        LHS.getComplexFloatReal().compare(RHS.getComplexFloatReal());
7684087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      APFloat::cmpResult CR_i =
7694087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar        LHS.getComplexFloatImag().compare(RHS.getComplexFloatImag());
7704087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
7714087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      if (E->getOpcode() == BinaryOperator::EQ)
772131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        return Success((CR_r == APFloat::cmpEqual &&
773131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                        CR_i == APFloat::cmpEqual), E);
774131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      else {
775131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        assert(E->getOpcode() == BinaryOperator::NE &&
776131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar               "Invalid complex comparison.");
777131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        return Success(((CR_r == APFloat::cmpGreaterThan ||
778131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                         CR_r == APFloat::cmpLessThan) &&
779131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                        (CR_i == APFloat::cmpGreaterThan ||
780131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                         CR_i == APFloat::cmpLessThan)), E);
781131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      }
7824087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    } else {
7834087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      if (E->getOpcode() == BinaryOperator::EQ)
784131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        return Success((LHS.getComplexIntReal() == RHS.getComplexIntReal() &&
785131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                        LHS.getComplexIntImag() == RHS.getComplexIntImag()), E);
786131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      else {
787131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        assert(E->getOpcode() == BinaryOperator::NE &&
788131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar               "Invalid compex comparison.");
789131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        return Success((LHS.getComplexIntReal() != RHS.getComplexIntReal() ||
790131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                        LHS.getComplexIntImag() != RHS.getComplexIntImag()), E);
791131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      }
7924087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    }
7934087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar  }
794286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson
795286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  if (LHSTy->isRealFloatingType() &&
796286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      RHSTy->isRealFloatingType()) {
797286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    APFloat RHS(0.0), LHS(0.0);
798286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson
799286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    if (!EvaluateFloat(E->getRHS(), RHS, Info))
800286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      return false;
801286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson
802286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    if (!EvaluateFloat(E->getLHS(), LHS, Info))
803286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      return false;
804286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson
805286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    APFloat::cmpResult CR = LHS.compare(RHS);
806529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson
807286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    switch (E->getOpcode()) {
808286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    default:
809286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      assert(0 && "Invalid binary operator!");
810286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::LT:
811131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpLessThan, E);
812286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::GT:
813131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpGreaterThan, E);
814286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::LE:
815131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpLessThan || CR == APFloat::cmpEqual, E);
816286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::GE:
817131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpGreaterThan || CR == APFloat::cmpEqual,
818131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                     E);
819286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::EQ:
820131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpEqual, E);
821286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::NE:
822131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpGreaterThan
823131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                     || CR == APFloat::cmpLessThan, E);
824286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    }
825286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  }
826286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson
8273068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  if (E->getOpcode() == BinaryOperator::Sub) {
828529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson    if (LHSTy->isPointerType() && RHSTy->isPointerType()) {
8293068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      APValue LHSValue;
8303068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      if (!EvaluatePointer(E->getLHS(), LHSValue, Info))
8313068d117951a8df54bae9db039b56201ab10962bAnders Carlsson        return false;
8323068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
8333068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      APValue RHSValue;
8343068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      if (!EvaluatePointer(E->getRHS(), RHSValue, Info))
8353068d117951a8df54bae9db039b56201ab10962bAnders Carlsson        return false;
8363068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
8373068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      // FIXME: Is this correct? What if only one of the operands has a base?
8383068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      if (LHSValue.getLValueBase() || RHSValue.getLValueBase())
8393068d117951a8df54bae9db039b56201ab10962bAnders Carlsson        return false;
8403068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
8413068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      const QualType Type = E->getLHS()->getType();
8423068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      const QualType ElementType = Type->getAsPointerType()->getPointeeType();
8433068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
8443068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      uint64_t D = LHSValue.getLValueOffset() - RHSValue.getLValueOffset();
8453068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      D /= Info.Ctx.getTypeSize(ElementType) / 8;
8463068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
847131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(D, E);
8483068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    }
8493068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  }
850286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  if (!LHSTy->isIntegralType() ||
851286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      !RHSTy->isIntegralType()) {
852a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // We can't continue from here for non-integral types, and they
853a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // could potentially confuse the following operations.
854a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // FIXME: Deal with EQ and friends.
855a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    return false;
856a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  }
857a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
858a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  // The LHS of a constant expr is always evaluated and needed.
85930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  if (!Visit(E->getLHS()))
860a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    return false; // error in subexpression.
861d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman
86230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  // Only support arithmetic on integers for now.
86330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  if (!Result.isInt())
86430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return false;
86530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar
866131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  llvm::APSInt RHS;
86754176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner  if (!EvaluateInteger(E->getRHS(), RHS, Info))
868b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner    return false;
869a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
870a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  switch (E->getOpcode()) {
87132fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner  default:
8720e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E);
87330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::Mul: return Success(Result.getInt() * RHS, E);
87430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::Add: return Success(Result.getInt() + RHS, E);
87530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::Sub: return Success(Result.getInt() - RHS, E);
87630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::And: return Success(Result.getInt() & RHS, E);
87730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::Xor: return Success(Result.getInt() ^ RHS, E);
87830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::Or:  return Success(Result.getInt() | RHS, E);
879a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  case BinaryOperator::Div:
88054176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    if (RHS == 0)
8810e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson      return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E);
88230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return Success(Result.getInt() / RHS, E);
883a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  case BinaryOperator::Rem:
88454176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    if (RHS == 0)
8850e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson      return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E);
88630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return Success(Result.getInt() % RHS, E);
8873f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  case BinaryOperator::Shl: {
88854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    // FIXME: Warn about out of range shift amounts!
88930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    unsigned SA =
89030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar      (unsigned) RHS.getLimitedValue(Result.getInt().getBitWidth()-1);
89130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return Success(Result.getInt() << SA, E);
8923f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  }
8933f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  case BinaryOperator::Shr: {
89430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    unsigned SA =
89530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar      (unsigned) RHS.getLimitedValue(Result.getInt().getBitWidth()-1);
89630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return Success(Result.getInt() >> SA, E);
8973f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  }
898b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner
89930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::LT: return Success(Result.getInt() < RHS, E);
90030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::GT: return Success(Result.getInt() > RHS, E);
90130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::LE: return Success(Result.getInt() <= RHS, E);
90230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::GE: return Success(Result.getInt() >= RHS, E);
90330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::EQ: return Success(Result.getInt() == RHS, E);
90430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::NE: return Success(Result.getInt() != RHS, E);
905b11e77836dd0867955c5abf32baf1c3e6c7f81e1Eli Friedman  }
906a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson}
907a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson
908ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopesbool IntExprEvaluator::VisitConditionalOperator(const ConditionalOperator *E) {
909a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes  bool Cond;
910a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes  if (!HandleConversionToBool(E->getCond(), Cond, Info))
911ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes    return false;
912ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes
913a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes  return Visit(Cond ? E->getTrueExpr() : E->getFalseExpr());
914ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes}
915ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes
916af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattnerunsigned IntExprEvaluator::GetAlignOfType(QualType T) {
917e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  const Type *Ty = Info.Ctx.getCanonicalType(T).getTypePtr();
918e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
919e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  // __alignof__(void) = 1 as a gcc extension.
920e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  if (Ty->isVoidType())
921e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner    return 1;
922e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
923e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  // GCC extension: alignof(function) = 4.
924e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  // FIXME: AlignOf shouldn't be unconditionally 4!  It should listen to the
925e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  // attribute(align) directive.
926e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  if (Ty->isFunctionType())
927e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner    return 4;
928e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
929f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian  if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(Ty))
930f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian    return GetAlignOfType(QualType(EXTQT->getBaseType(), 0));
931e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
932e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  // alignof VLA/incomplete array.
933e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  if (const ArrayType *VAT = dyn_cast<ArrayType>(Ty))
934e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner    return GetAlignOfType(VAT->getElementType());
935e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
936e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  // sizeof (objc class)?
937e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  if (isa<ObjCInterfaceType>(Ty))
938e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner    return 1;  // FIXME: This probably isn't right.
939e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
940e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  // Get information about the alignment.
941e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  unsigned CharSize = Info.Ctx.Target.getCharWidth();
942e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  return Info.Ctx.getTypeAlign(Ty) / CharSize;
943e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner}
944e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
945af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattnerunsigned IntExprEvaluator::GetAlignOfExpr(const Expr *E) {
946af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  E = E->IgnoreParens();
947af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner
948af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  // alignof decl is always accepted, even if it doesn't make sense: we default
949af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  // to 1 in those cases.
950af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
951b7d0844c887a72064b624dc6df12cbe1441f69d0Daniel Dunbar    return Info.Ctx.getDeclAlignInBytes(DRE->getDecl());
952af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner
953af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  if (const MemberExpr *ME = dyn_cast<MemberExpr>(E))
954b7d0844c887a72064b624dc6df12cbe1441f69d0Daniel Dunbar    return Info.Ctx.getDeclAlignInBytes(ME->getMemberDecl());
955af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner
956e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  return GetAlignOfType(E->getType());
957e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner}
958e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
959e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
9600518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// VisitSizeAlignOfExpr - Evaluate a sizeof or alignof with a result as the
9610518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// expression's type.
9620518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redlbool IntExprEvaluator::VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E) {
9630518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  QualType DstTy = E->getType();
964fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner
965e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  // Handle alignof separately.
966e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  if (!E->isSizeOf()) {
967e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner    if (E->isArgumentType())
968131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(GetAlignOfType(E->getArgumentType()), E);
969e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner    else
970131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(GetAlignOfExpr(E->getArgumentExpr()), E);
971e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  }
972e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
9730518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  QualType SrcTy = E->getTypeOfArgument();
9740518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl
975131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  // sizeof(void), __alignof__(void), sizeof(function) = 1 as a gcc
976131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  // extension.
977131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  if (SrcTy->isVoidType() || SrcTy->isFunctionType())
978131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(1, E);
979fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner
980fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner  // sizeof(vla) is not a constantexpr: C99 6.5.3.4p2.
981e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  if (!SrcTy->isConstantSizeType())
982fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner    return false;
983f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman
984f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman  if (SrcTy->isObjCInterfaceType()) {
985f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman    // Slightly unusual case: the size of an ObjC interface type is the
986f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman    // size of the class.  This code intentionally falls through to the normal
987f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman    // case.
988f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman    ObjCInterfaceDecl *OI = SrcTy->getAsObjCInterfaceType()->getDecl();
989f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman    RecordDecl *RD = const_cast<RecordDecl*>(Info.Ctx.addRecordToClass(OI));
990f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman    SrcTy = Info.Ctx.getTagDeclType(static_cast<TagDecl*>(RD));
991f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman  }
992f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman
993e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  // Get information about the size.
99487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  unsigned CharSize = Info.Ctx.Target.getCharWidth();
995131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  return Success(Info.Ctx.getTypeSize(SrcTy) / CharSize, E);
996fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner}
997fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner
998b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
9994c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  // Special case unary operators that do not need their subexpression
10004c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  // evaluated.  offsetof/sizeof/alignof are all special.
1001131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  if (E->isOffsetOfOp())
1002131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(E->evaluateOffsetOf(Info.Ctx), E);
1003a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
1004a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  if (E->getOpcode() == UnaryOperator::LNot) {
1005a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // LNot's operand isn't necessarily an integer, so we handle it specially.
1006a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    bool bres;
1007a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    if (!HandleConversionToBool(E->getSubExpr(), bres, Info))
1008a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman      return false;
1009131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(!bres, E);
1010a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  }
1011a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
101287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  // Get the operand value into 'Result'.
101387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  if (!Visit(E->getSubExpr()))
101475a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    return false;
1015a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson
101675a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  switch (E->getOpcode()) {
10174c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  default:
101875a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    // Address, indirect, pre/post inc/dec, etc are not valid constant exprs.
101975a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    // See C99 6.6p3.
10200e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E);
102175a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  case UnaryOperator::Extension:
10224c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    // FIXME: Should extension allow i-c-e extension expressions in its scope?
10234c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    // If so, we could clear the diagnostic ID.
10243f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    return true;
102575a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  case UnaryOperator::Plus:
10264c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    // The result is always just the subexpr.
10273f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    return true;
102875a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  case UnaryOperator::Minus:
102930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    if (!Result.isInt()) return false;
103030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return Success(-Result.getInt(), E);
103175a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  case UnaryOperator::Not:
103230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    if (!Result.isInt()) return false;
103330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return Success(~Result.getInt(), E);
103406a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson  }
1035a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson}
1036a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson
1037732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// HandleCast - This is used to evaluate implicit or explicit casts where the
1038732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// result type is integer.
1039a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbarbool IntExprEvaluator::VisitCastExpr(CastExpr *E) {
104082206e267ce6cc709797127616f64672d255b310Anders Carlsson  Expr *SubExpr = E->getSubExpr();
104182206e267ce6cc709797127616f64672d255b310Anders Carlsson  QualType DestType = E->getType();
104282206e267ce6cc709797127616f64672d255b310Anders Carlsson
10434efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (DestType->isBooleanType()) {
10444efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    bool BoolResult;
10454efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!HandleConversionToBool(SubExpr, BoolResult, Info))
10464efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
1047131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(BoolResult, E);
10484efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
10494efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1050a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  // Handle simple integer->integer casts.
1051a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  if (SubExpr->getType()->isIntegralType()) {
1052732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner    if (!Visit(SubExpr))
1053b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner      return false;
1054a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
105530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    // FIXME: Support cast on LValue results.
105630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    if (!Result.isInt())
105730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar      return false;
105830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar
10593f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    return Success(HandleIntToIntCast(DestType, SubExpr->getType(),
106030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar                                      Result.getInt(), Info.Ctx), E);
1061732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner  }
1062732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner
1063732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner  // FIXME: Clean this up!
1064732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner  if (SubExpr->getType()->isPointerType()) {
1065a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson    APValue LV;
106687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner    if (!EvaluatePointer(SubExpr, LV, Info))
1067b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner      return false;
10684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1069a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson    if (LV.getLValueBase())
1070b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner      return false;
10714efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1072131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(LV.getLValueOffset(), E);
10732bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  }
10744efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1075732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner  if (!SubExpr->getType()->isRealFloatingType())
10760e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
1077732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner
1078d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  APFloat F(0.0);
1079d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  if (!EvaluateFloat(SubExpr, F, Info))
10800e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
1081732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner
10823f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  return Success(HandleFloatToIntCast(DestType, SubExpr->getType(),
10833f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar                                      F, Info.Ctx), E);
1084a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson}
10852bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
1086f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
1087d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman// Float Evaluation
1088d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===//
1089d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1090d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmannamespace {
1091d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanclass VISIBILITY_HIDDEN FloatExprEvaluator
1092d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  : public StmtVisitor<FloatExprEvaluator, bool> {
1093d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  EvalInfo &Info;
1094d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  APFloat &Result;
1095d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanpublic:
1096d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  FloatExprEvaluator(EvalInfo &info, APFloat &result)
1097d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    : Info(info), Result(result) {}
1098d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1099d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitStmt(Stmt *S) {
1100d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return false;
1101d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  }
1102d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1103d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
1104019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  bool VisitCallExpr(const CallExpr *E);
1105d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
11065db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  bool VisitUnaryOperator(const UnaryOperator *E);
1107d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitBinaryOperator(const BinaryOperator *E);
1108d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitFloatingLiteral(const FloatingLiteral *E);
11094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  bool VisitCastExpr(CastExpr *E);
11104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  bool VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E);
1111d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman};
1112d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} // end anonymous namespace
1113d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1114d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr* E, APFloat& Result, EvalInfo &Info) {
1115d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  return FloatExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E));
1116d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}
1117d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1118019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattnerbool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) {
11193c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  switch (E->isBuiltinCall(Info.Ctx)) {
112034a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner  default: return false;
1121019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_huge_val:
1122019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_huge_valf:
1123019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_huge_vall:
1124019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_inf:
1125019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_inff:
11267cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar  case Builtin::BI__builtin_infl: {
11277cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar    const llvm::fltSemantics &Sem =
11287cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar      Info.Ctx.getFloatTypeSemantics(E->getType());
112934a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner    Result = llvm::APFloat::getInf(Sem);
113034a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner    return true;
11317cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar  }
11329e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner
11339e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner  case Builtin::BI__builtin_nan:
11349e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner  case Builtin::BI__builtin_nanf:
11359e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner  case Builtin::BI__builtin_nanl:
11369e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    // If this is __builtin_nan("") turn this into a simple nan, otherwise we
11379e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    // can't constant fold it.
11389e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    if (const StringLiteral *S =
11399e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner        dyn_cast<StringLiteral>(E->getArg(0)->IgnoreParenCasts())) {
11409e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner      if (!S->isWide() && S->getByteLength() == 0) { // empty string.
11417cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar        const llvm::fltSemantics &Sem =
11427cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar          Info.Ctx.getFloatTypeSemantics(E->getType());
11439e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner        Result = llvm::APFloat::getNaN(Sem);
11449e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner        return true;
11459e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner      }
11469e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    }
11479e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    return false;
11485db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar
11495db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_fabs:
11505db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_fabsf:
11515db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_fabsl:
11525db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    if (!EvaluateFloat(E->getArg(0), Result, Info))
11535db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar      return false;
11545db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar
11555db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    if (Result.isNegative())
11565db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar      Result.changeSign();
11575db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
11585db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar
11595db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_copysign:
11605db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_copysignf:
11615db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_copysignl: {
11625db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    APFloat RHS(0.);
11635db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    if (!EvaluateFloat(E->getArg(0), Result, Info) ||
11645db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar        !EvaluateFloat(E->getArg(1), RHS, Info))
11655db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar      return false;
11665db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    Result.copySign(RHS);
11675db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
11685db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  }
1169019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  }
1170019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner}
1171019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner
11725db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbarbool FloatExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
1173a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes  if (E->getOpcode() == UnaryOperator::Deref)
1174a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes    return false;
1175a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes
11765db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  if (!EvaluateFloat(E->getSubExpr(), Result, Info))
11775db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return false;
11785db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar
11795db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  switch (E->getOpcode()) {
11805db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  default: return false;
11815db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case UnaryOperator::Plus:
11825db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
11835db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case UnaryOperator::Minus:
11845db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    Result.changeSign();
11855db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
11865db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  }
11875db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar}
1188019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner
1189d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
1190d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  // FIXME: Diagnostics?  I really don't understand how the warnings
1191d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  // and errors are supposed to work.
11925db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  APFloat RHS(0.0);
1193d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  if (!EvaluateFloat(E->getLHS(), Result, Info))
1194d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return false;
1195d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  if (!EvaluateFloat(E->getRHS(), RHS, Info))
1196d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return false;
1197d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1198d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  switch (E->getOpcode()) {
1199d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  default: return false;
1200d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  case BinaryOperator::Mul:
1201d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.multiply(RHS, APFloat::rmNearestTiesToEven);
1202d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
1203d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  case BinaryOperator::Add:
1204d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.add(RHS, APFloat::rmNearestTiesToEven);
1205d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
1206d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  case BinaryOperator::Sub:
1207d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.subtract(RHS, APFloat::rmNearestTiesToEven);
1208d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
1209d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  case BinaryOperator::Div:
1210d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.divide(RHS, APFloat::rmNearestTiesToEven);
1211d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
1212d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  case BinaryOperator::Rem:
1213d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.mod(RHS, APFloat::rmNearestTiesToEven);
1214d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
1215d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  }
1216d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}
1217d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1218d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitFloatingLiteral(const FloatingLiteral *E) {
1219d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  Result = E->getValue();
1220d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  return true;
1221d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}
1222d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
12234efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanbool FloatExprEvaluator::VisitCastExpr(CastExpr *E) {
12244efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  Expr* SubExpr = E->getSubExpr();
122559b5da6d853b4368b984700315adf7b37de05764Nate Begeman
12264efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (SubExpr->getType()->isIntegralType()) {
12274efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APSInt IntResult;
12283f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    if (!EvaluateInteger(SubExpr, IntResult, Info))
12294efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
1230a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    Result = HandleIntToFloatCast(E->getType(), SubExpr->getType(),
1231a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                  IntResult, Info.Ctx);
12324efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
12334efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
12344efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (SubExpr->getType()->isRealFloatingType()) {
12354efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!Visit(SubExpr))
12364efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
1237a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    Result = HandleFloatToFloatCast(E->getType(), SubExpr->getType(),
1238a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                    Result, Info.Ctx);
12394efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
12404efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
12414efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
12424efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return false;
12434efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
12444efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
12454efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanbool FloatExprEvaluator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
12464efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  Result = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(E->getType()));
12474efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return true;
12484efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
12494efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1250d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===//
1251a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar// Complex Evaluation (for float and integer)
12529ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===//
12539ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
12549ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonnamespace {
1255a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbarclass VISIBILITY_HIDDEN ComplexExprEvaluator
1256a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  : public StmtVisitor<ComplexExprEvaluator, APValue> {
12579ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  EvalInfo &Info;
12589ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
12599ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonpublic:
1260a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  ComplexExprEvaluator(EvalInfo &info) : Info(info) {}
12619ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
12629ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  //===--------------------------------------------------------------------===//
12639ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  //                            Visitor Methods
12649ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  //===--------------------------------------------------------------------===//
12659ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
12669ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  APValue VisitStmt(Stmt *S) {
12679ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson    return APValue();
12689ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  }
12699ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
12709ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
12719ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
12729ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  APValue VisitImaginaryLiteral(ImaginaryLiteral *E) {
1273a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    Expr* SubExpr = E->getSubExpr();
1274a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
1275a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    if (SubExpr->getType()->isRealFloatingType()) {
1276a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      APFloat Result(0.0);
1277a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
1278a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      if (!EvaluateFloat(SubExpr, Result, Info))
1279a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar        return APValue();
12809ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
12813f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      return APValue(APFloat(Result.getSemantics(), APFloat::fcZero, false),
1282a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                     Result);
1283a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    } else {
1284a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      assert(SubExpr->getType()->isIntegerType() &&
1285a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar             "Unexpected imaginary literal.");
1286a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
1287a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      llvm::APSInt Result;
1288a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      if (!EvaluateInteger(SubExpr, Result, Info))
1289a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar        return APValue();
1290a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
1291a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      llvm::APSInt Zero(Result.getBitWidth(), !Result.isSigned());
1292a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Zero = 0;
1293a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      return APValue(Zero, Result);
1294a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    }
12959ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  }
12969ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
1297ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  APValue VisitCastExpr(CastExpr *E) {
1298ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    Expr* SubExpr = E->getSubExpr();
1299a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    QualType EltType = E->getType()->getAsComplexType()->getElementType();
1300a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    QualType SubType = SubExpr->getType();
1301ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1302a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    if (SubType->isRealFloatingType()) {
1303ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson      APFloat Result(0.0);
1304ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1305ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson      if (!EvaluateFloat(SubExpr, Result, Info))
1306ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson        return APValue();
1307ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1308a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      // Apply float conversion if necessary.
1309a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      Result = HandleFloatToFloatCast(EltType, SubType, Result, Info.Ctx);
13108f826f0e0c90b05ab04e84c29157d2e965713288Daniel Dunbar      return APValue(Result,
13113f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar                     APFloat(Result.getSemantics(), APFloat::fcZero, false));
1312a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    } else if (SubType->isIntegerType()) {
1313a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      APSInt Result;
1314a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
1315a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      if (!EvaluateInteger(SubExpr, Result, Info))
1316a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar        return APValue();
1317a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1318a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      // Apply integer conversion if necessary.
1319a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      Result = HandleIntToIntCast(EltType, SubType, Result, Info.Ctx);
1320a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      llvm::APSInt Zero(Result.getBitWidth(), !Result.isSigned());
1321a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Zero = 0;
1322a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      return APValue(Result, Zero);
1323a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    } else if (const ComplexType *CT = SubType->getAsComplexType()) {
1324a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      APValue Src;
1325a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1326a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      if (!EvaluateComplex(SubExpr, Src, Info))
1327a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        return APValue();
1328a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1329a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      QualType SrcType = CT->getElementType();
1330a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1331a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      if (Src.isComplexFloat()) {
1332a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        if (EltType->isRealFloatingType()) {
1333a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar          return APValue(HandleFloatToFloatCast(EltType, SrcType,
1334a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                                Src.getComplexFloatReal(),
1335a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                                Info.Ctx),
1336a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                         HandleFloatToFloatCast(EltType, SrcType,
1337a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                                Src.getComplexFloatImag(),
1338a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                                Info.Ctx));
1339a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        } else {
1340a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar          return APValue(HandleFloatToIntCast(EltType, SrcType,
1341a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Src.getComplexFloatReal(),
1342a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Info.Ctx),
1343a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                         HandleFloatToIntCast(EltType, SrcType,
1344a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Src.getComplexFloatImag(),
1345a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Info.Ctx));
1346a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        }
1347a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      } else {
1348a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        assert(Src.isComplexInt() && "Invalid evaluate result.");
1349a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        if (EltType->isRealFloatingType()) {
1350a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar          return APValue(HandleIntToFloatCast(EltType, SrcType,
1351a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Src.getComplexIntReal(),
1352a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Info.Ctx),
1353a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                         HandleIntToFloatCast(EltType, SrcType,
1354a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Src.getComplexIntImag(),
1355a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Info.Ctx));
1356a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        } else {
1357a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar          return APValue(HandleIntToIntCast(EltType, SrcType,
1358a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                            Src.getComplexIntReal(),
1359a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                            Info.Ctx),
1360a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                         HandleIntToIntCast(EltType, SrcType,
1361a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                            Src.getComplexIntImag(),
1362a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                            Info.Ctx));
1363a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        }
1364a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      }
1365ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    }
1366ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1367ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    // FIXME: Handle more casts.
1368ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    return APValue();
1369ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  }
1370ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1371ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  APValue VisitBinaryOperator(const BinaryOperator *E);
1372ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
13739ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson};
13749ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson} // end anonymous namespace
13759ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
1376a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbarstatic bool EvaluateComplex(const Expr *E, APValue &Result, EvalInfo &Info)
13779ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson{
1378a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  Result = ComplexExprEvaluator(Info).Visit(const_cast<Expr*>(E));
1379a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  assert((!Result.isComplexFloat() ||
1380a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar          (&Result.getComplexFloatReal().getSemantics() ==
1381a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar           &Result.getComplexFloatImag().getSemantics())) &&
1382a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar         "Invalid complex evaluation.");
1383a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  return Result.isComplexFloat() || Result.isComplexInt();
13849ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson}
13859ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
1386a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel DunbarAPValue ComplexExprEvaluator::VisitBinaryOperator(const BinaryOperator *E)
1387ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson{
1388ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  APValue Result, RHS;
1389ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1390a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  if (!EvaluateComplex(E->getLHS(), Result, Info))
1391ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    return APValue();
1392ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1393a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  if (!EvaluateComplex(E->getRHS(), RHS, Info))
1394ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    return APValue();
1395a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
13963f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar  assert(Result.isComplexFloat() == RHS.isComplexFloat() &&
13973f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar         "Invalid operands to binary operator.");
1398ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  switch (E->getOpcode()) {
1399ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  default: return APValue();
1400ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  case BinaryOperator::Add:
1401a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    if (Result.isComplexFloat()) {
1402a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatReal().add(RHS.getComplexFloatReal(),
1403a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                       APFloat::rmNearestTiesToEven);
1404a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatImag().add(RHS.getComplexFloatImag(),
1405a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                       APFloat::rmNearestTiesToEven);
1406a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    } else {
1407a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntReal() += RHS.getComplexIntReal();
1408a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntImag() += RHS.getComplexIntImag();
1409a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    }
14103f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    break;
1411ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  case BinaryOperator::Sub:
1412a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    if (Result.isComplexFloat()) {
1413a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatReal().subtract(RHS.getComplexFloatReal(),
1414a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                            APFloat::rmNearestTiesToEven);
1415a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatImag().subtract(RHS.getComplexFloatImag(),
1416a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                            APFloat::rmNearestTiesToEven);
1417a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    } else {
1418a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntReal() -= RHS.getComplexIntReal();
1419a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntImag() -= RHS.getComplexIntImag();
1420a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    }
14213f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    break;
14223f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar  case BinaryOperator::Mul:
14233f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    if (Result.isComplexFloat()) {
14243f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APValue LHS = Result;
14253f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &LHS_r = LHS.getComplexFloatReal();
14263f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &LHS_i = LHS.getComplexFloatImag();
14273f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &RHS_r = RHS.getComplexFloatReal();
14283f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &RHS_i = RHS.getComplexFloatImag();
14293f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar
14303f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat Tmp = LHS_r;
14313f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven);
14323f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatReal() = Tmp;
14333f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp = LHS_i;
14343f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven);
14353f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatReal().subtract(Tmp, APFloat::rmNearestTiesToEven);
14363f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar
14373f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp = LHS_r;
14383f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven);
14393f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatImag() = Tmp;
14403f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp = LHS_i;
14413f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven);
14423f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatImag().add(Tmp, APFloat::rmNearestTiesToEven);
14433f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    } else {
14443f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APValue LHS = Result;
14453f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexIntReal() =
14463f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar        (LHS.getComplexIntReal() * RHS.getComplexIntReal() -
14473f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar         LHS.getComplexIntImag() * RHS.getComplexIntImag());
14483f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexIntImag() =
14493f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar        (LHS.getComplexIntReal() * RHS.getComplexIntImag() +
14503f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar         LHS.getComplexIntImag() * RHS.getComplexIntReal());
14513f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    }
14523f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    break;
1453ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  }
1454ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1455ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  return Result;
1456ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson}
1457ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
14589ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===//
14596ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner// Top level Expr::Evaluate method.
1460f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
1461f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
14626ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner/// Evaluate - Return true if this is a constant which we can fold using
1463019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// any crazy technique (that has nothing to do with language standards) that
1464019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// we want to.  If this function returns true, it returns the folded constant
1465019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// in Result.
14665b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlssonbool Expr::Evaluate(EvalResult &Result, ASTContext &Ctx) const {
14675b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson  EvalInfo Info(Ctx, Result);
146854da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson
146959b5da6d853b4368b984700315adf7b37de05764Nate Begeman  if (getType()->isVectorType()) {
147059b5da6d853b4368b984700315adf7b37de05764Nate Begeman    if (!EvaluateVector(this, Result.Val, Info))
147159b5da6d853b4368b984700315adf7b37de05764Nate Begeman      return false;
147259b5da6d853b4368b984700315adf7b37de05764Nate Begeman  } else if (getType()->isIntegerType()) {
147330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    if (!IntExprEvaluator(Info, Result.Val).Visit(const_cast<Expr*>(this)))
14746dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
1475ca2f3fdeedc4e4beea4f7572d6d975188d0bb5efMike Stump  } else if (getType()->isPointerType()
1476ca2f3fdeedc4e4beea4f7572d6d975188d0bb5efMike Stump             || getType()->isBlockPointerType()) {
14775b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson    if (!EvaluatePointer(this, Result.Val, Info))
14786dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
1479d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  } else if (getType()->isRealFloatingType()) {
1480d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    llvm::APFloat f(0.0);
14816dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson    if (!EvaluateFloat(this, f, Info))
14826dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
14836dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson
14845b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson    Result.Val = APValue(f);
1485a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  } else if (getType()->isAnyComplexType()) {
1486a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    if (!EvaluateComplex(this, Result.Val, Info))
14876dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
1488a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  } else
14899d4c157baaada8945671dc98363a40ed00cbd824Anders Carlsson    return false;
14906dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson
14915b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson  return true;
14925b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson}
14935b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson
14946ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner/// isEvaluatable - Call Evaluate to see if this expression can be constant
149545b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner/// folded, but discard the result.
149645b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattnerbool Expr::isEvaluatable(ASTContext &Ctx) const {
14974fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson  EvalResult Result;
14984fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson  return Evaluate(Result, Ctx) && !Result.HasSideEffects;
149945b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner}
150051fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson
150151fe996231b1d7199f76e4005ff4c943d5deeecdAnders CarlssonAPSInt Expr::EvaluateAsInt(ASTContext &Ctx) const {
15021c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  EvalResult EvalResult;
15031c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  bool Result = Evaluate(EvalResult, Ctx);
1504f185319f25efd6094870f287030270fad26085baDaniel Dunbar  Result = Result;
150551fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson  assert(Result && "Could not evaluate expression");
15061c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer");
150751fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson
15081c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  return EvalResult.Val.getInt();
150951fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson}
1510