ExprConstant.cpp revision b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1
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);
2634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitConditionalOperator(ConditionalOperator *E);
2642bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson};
265f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace
2662bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
26787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluatePointer(const Expr* E, APValue& Result, EvalInfo &Info) {
268f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  if (!E->getType()->isPointerType())
269f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner    return false;
27087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  Result = PointerExprEvaluator(Info).Visit(const_cast<Expr*>(E));
271f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  return Result.isLValue();
272f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner}
273650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
274f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris LattnerAPValue PointerExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
275650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  if (E->getOpcode() != BinaryOperator::Add &&
276650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson      E->getOpcode() != BinaryOperator::Sub)
277650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    return APValue();
278650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
279650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  const Expr *PExp = E->getLHS();
280650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  const Expr *IExp = E->getRHS();
281650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  if (IExp->getType()->isPointerType())
282f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner    std::swap(PExp, IExp);
283650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
284650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  APValue ResultLValue;
28587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  if (!EvaluatePointer(PExp, ResultLValue, Info))
286650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    return APValue();
287f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
288650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  llvm::APSInt AdditionalOffset(32);
28987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  if (!EvaluateInteger(IExp, AdditionalOffset, Info))
290650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    return APValue();
291650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
2924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  QualType PointeeType = PExp->getType()->getAsPointerType()->getPointeeType();
2934efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  uint64_t SizeOfPointee = Info.Ctx.getTypeSize(PointeeType) / 8;
2944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
295650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  uint64_t Offset = ResultLValue.getLValueOffset();
2964efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
297650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  if (E->getOpcode() == BinaryOperator::Add)
2984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Offset += AdditionalOffset.getLimitedValue() * SizeOfPointee;
299650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  else
3004efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Offset -= AdditionalOffset.getLimitedValue() * SizeOfPointee;
3014efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
302650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  return APValue(ResultLValue.getLValueBase(), Offset);
303650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson}
3044efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
3054efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue PointerExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
3064efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (E->getOpcode() == UnaryOperator::Extension) {
3074efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    // FIXME: Deal with warnings?
3084efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return Visit(E->getSubExpr());
3094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
3104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
3114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (E->getOpcode() == UnaryOperator::AddrOf) {
3124efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APValue result;
3134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (EvaluateLValue(E->getSubExpr(), result, Info))
3144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return result;
3154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
3164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
3174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return APValue();
3184efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
319d407a7619904c81d38b41a9ee850de413105084bAnders Carlsson
320650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
321b542afe02d317411d53b3541946f9f2a8f509a11Chris LattnerAPValue PointerExprEvaluator::VisitCastExpr(const CastExpr* E) {
322650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  const Expr* SubExpr = E->getSubExpr();
323650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
324650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson   // Check for pointer->pointer cast
325650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  if (SubExpr->getType()->isPointerType()) {
326650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    APValue Result;
32787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner    if (EvaluatePointer(SubExpr, Result, Info))
328650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson      return Result;
329f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner    return APValue();
330650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  }
331650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
332d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman  if (SubExpr->getType()->isIntegralType()) {
333650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    llvm::APSInt Result(32);
33487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner    if (EvaluateInteger(SubExpr, Result, Info)) {
33587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner      Result.extOrTrunc((unsigned)Info.Ctx.getTypeSize(E->getType()));
336650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson      return APValue(0, Result.getZExtValue());
337650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    }
338650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  }
3394efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
3404efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (SubExpr->getType()->isFunctionType() ||
3414efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      SubExpr->getType()->isArrayType()) {
3424efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APValue Result;
3434efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (EvaluateLValue(SubExpr, Result, Info))
3444efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return Result;
3454efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return APValue();
3464efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
3474efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
3484efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  //assert(0 && "Unhandled cast");
349650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  return APValue();
350650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson}
351650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
3523941b18b8e441c8c466efecd557de60b9a32d10bEli FriedmanAPValue PointerExprEvaluator::VisitCallExpr(CallExpr *E) {
3533941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman  if (E->isBuiltinCall() == Builtin::BI__builtin___CFStringMakeConstantString)
3543941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman    return APValue(E, 0);
3553941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman  return APValue();
3563941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman}
3573941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman
3584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue PointerExprEvaluator::VisitConditionalOperator(ConditionalOperator *E) {
3594efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  bool BoolResult;
3604efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (!HandleConversionToBool(E->getCond(), BoolResult, Info))
3614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return APValue();
3624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
3634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  Expr* EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr();
3644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
3654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue Result;
3664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (EvaluatePointer(EvalExpr, Result, Info))
3674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return Result;
3684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return APValue();
3694efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
370f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
371f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
37259b5da6d853b4368b984700315adf7b37de05764Nate Begeman// Vector Evaluation
37359b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===//
37459b5da6d853b4368b984700315adf7b37de05764Nate Begeman
37559b5da6d853b4368b984700315adf7b37de05764Nate Begemannamespace {
37659b5da6d853b4368b984700315adf7b37de05764Nate Begeman  class VISIBILITY_HIDDEN VectorExprEvaluator
37759b5da6d853b4368b984700315adf7b37de05764Nate Begeman  : public StmtVisitor<VectorExprEvaluator, APValue> {
37859b5da6d853b4368b984700315adf7b37de05764Nate Begeman    EvalInfo &Info;
37959b5da6d853b4368b984700315adf7b37de05764Nate Begeman  public:
38059b5da6d853b4368b984700315adf7b37de05764Nate Begeman
38159b5da6d853b4368b984700315adf7b37de05764Nate Begeman    VectorExprEvaluator(EvalInfo &info) : Info(info) {}
38259b5da6d853b4368b984700315adf7b37de05764Nate Begeman
38359b5da6d853b4368b984700315adf7b37de05764Nate Begeman    APValue VisitStmt(Stmt *S) {
38459b5da6d853b4368b984700315adf7b37de05764Nate Begeman      return APValue();
38559b5da6d853b4368b984700315adf7b37de05764Nate Begeman    }
38659b5da6d853b4368b984700315adf7b37de05764Nate Begeman
38759b5da6d853b4368b984700315adf7b37de05764Nate Begeman    APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
38859b5da6d853b4368b984700315adf7b37de05764Nate Begeman    APValue VisitCastExpr(const CastExpr* E);
38959b5da6d853b4368b984700315adf7b37de05764Nate Begeman    APValue VisitCompoundLiteralExpr(const CompoundLiteralExpr *E);
39059b5da6d853b4368b984700315adf7b37de05764Nate Begeman    APValue VisitInitListExpr(const InitListExpr *E);
39159b5da6d853b4368b984700315adf7b37de05764Nate Begeman  };
39259b5da6d853b4368b984700315adf7b37de05764Nate Begeman} // end anonymous namespace
39359b5da6d853b4368b984700315adf7b37de05764Nate Begeman
39459b5da6d853b4368b984700315adf7b37de05764Nate Begemanstatic bool EvaluateVector(const Expr* E, APValue& Result, EvalInfo &Info) {
39559b5da6d853b4368b984700315adf7b37de05764Nate Begeman  if (!E->getType()->isVectorType())
39659b5da6d853b4368b984700315adf7b37de05764Nate Begeman    return false;
39759b5da6d853b4368b984700315adf7b37de05764Nate Begeman  Result = VectorExprEvaluator(Info).Visit(const_cast<Expr*>(E));
39859b5da6d853b4368b984700315adf7b37de05764Nate Begeman  return !Result.isUninit();
39959b5da6d853b4368b984700315adf7b37de05764Nate Begeman}
40059b5da6d853b4368b984700315adf7b37de05764Nate Begeman
40159b5da6d853b4368b984700315adf7b37de05764Nate BegemanAPValue VectorExprEvaluator::VisitCastExpr(const CastExpr* E) {
40259b5da6d853b4368b984700315adf7b37de05764Nate Begeman  const Expr* SE = E->getSubExpr();
40359b5da6d853b4368b984700315adf7b37de05764Nate Begeman
40459b5da6d853b4368b984700315adf7b37de05764Nate Begeman  // Check for vector->vector bitcast.
40559b5da6d853b4368b984700315adf7b37de05764Nate Begeman  if (SE->getType()->isVectorType())
40659b5da6d853b4368b984700315adf7b37de05764Nate Begeman    return this->Visit(const_cast<Expr*>(SE));
40759b5da6d853b4368b984700315adf7b37de05764Nate Begeman
40859b5da6d853b4368b984700315adf7b37de05764Nate Begeman  return APValue();
40959b5da6d853b4368b984700315adf7b37de05764Nate Begeman}
41059b5da6d853b4368b984700315adf7b37de05764Nate Begeman
41159b5da6d853b4368b984700315adf7b37de05764Nate BegemanAPValue
41259b5da6d853b4368b984700315adf7b37de05764Nate BegemanVectorExprEvaluator::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) {
41359b5da6d853b4368b984700315adf7b37de05764Nate Begeman  return this->Visit(const_cast<Expr*>(E->getInitializer()));
41459b5da6d853b4368b984700315adf7b37de05764Nate Begeman}
41559b5da6d853b4368b984700315adf7b37de05764Nate Begeman
41659b5da6d853b4368b984700315adf7b37de05764Nate BegemanAPValue
41759b5da6d853b4368b984700315adf7b37de05764Nate BegemanVectorExprEvaluator::VisitInitListExpr(const InitListExpr *E) {
41859b5da6d853b4368b984700315adf7b37de05764Nate Begeman  const VectorType *VT = E->getType()->getAsVectorType();
41959b5da6d853b4368b984700315adf7b37de05764Nate Begeman  unsigned NumInits = E->getNumInits();
42059b5da6d853b4368b984700315adf7b37de05764Nate Begeman
42159b5da6d853b4368b984700315adf7b37de05764Nate Begeman  if (!VT || VT->getNumElements() != NumInits)
42259b5da6d853b4368b984700315adf7b37de05764Nate Begeman    return APValue();
42359b5da6d853b4368b984700315adf7b37de05764Nate Begeman
42459b5da6d853b4368b984700315adf7b37de05764Nate Begeman  QualType EltTy = VT->getElementType();
42559b5da6d853b4368b984700315adf7b37de05764Nate Begeman  llvm::SmallVector<APValue, 4> Elements;
42659b5da6d853b4368b984700315adf7b37de05764Nate Begeman
42759b5da6d853b4368b984700315adf7b37de05764Nate Begeman  for (unsigned i = 0; i < NumInits; i++) {
42859b5da6d853b4368b984700315adf7b37de05764Nate Begeman    if (EltTy->isIntegerType()) {
42959b5da6d853b4368b984700315adf7b37de05764Nate Begeman      llvm::APSInt sInt(32);
43059b5da6d853b4368b984700315adf7b37de05764Nate Begeman      if (!EvaluateInteger(E->getInit(i), sInt, Info))
43159b5da6d853b4368b984700315adf7b37de05764Nate Begeman        return APValue();
43259b5da6d853b4368b984700315adf7b37de05764Nate Begeman      Elements.push_back(APValue(sInt));
43359b5da6d853b4368b984700315adf7b37de05764Nate Begeman    } else {
43459b5da6d853b4368b984700315adf7b37de05764Nate Begeman      llvm::APFloat f(0.0);
43559b5da6d853b4368b984700315adf7b37de05764Nate Begeman      if (!EvaluateFloat(E->getInit(i), f, Info))
43659b5da6d853b4368b984700315adf7b37de05764Nate Begeman        return APValue();
43759b5da6d853b4368b984700315adf7b37de05764Nate Begeman      Elements.push_back(APValue(f));
43859b5da6d853b4368b984700315adf7b37de05764Nate Begeman    }
43959b5da6d853b4368b984700315adf7b37de05764Nate Begeman  }
44059b5da6d853b4368b984700315adf7b37de05764Nate Begeman  return APValue(&Elements[0], Elements.size());
44159b5da6d853b4368b984700315adf7b37de05764Nate Begeman}
44259b5da6d853b4368b984700315adf7b37de05764Nate Begeman
44359b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===//
444f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Integer Evaluation
445f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
446f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
447f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnernamespace {
448f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerclass VISIBILITY_HIDDEN IntExprEvaluator
449b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  : public StmtVisitor<IntExprEvaluator, bool> {
45087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  EvalInfo &Info;
451b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  APSInt &Result;
452f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerpublic:
45387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  IntExprEvaluator(EvalInfo &info, APSInt &result)
45487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner    : Info(info), Result(result) {}
455f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
4567a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner  unsigned getIntTypeSizeInBits(QualType T) const {
45754176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    return (unsigned)Info.Ctx.getIntWidth(T);
45854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner  }
45954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner
46082206e267ce6cc709797127616f64672d255b310Anders Carlsson  bool Extension(SourceLocation L, diag::kind D, const Expr *E) {
46154da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson    Info.EvalResult.DiagLoc = L;
46254da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson    Info.EvalResult.Diag = D;
46382206e267ce6cc709797127616f64672d255b310Anders Carlsson    Info.EvalResult.DiagExpr = E;
46454176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    return true;  // still a constant.
46554176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner  }
46654176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner
46782206e267ce6cc709797127616f64672d255b310Anders Carlsson  bool Error(SourceLocation L, diag::kind D, const Expr *E) {
46854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    // If this is in an unevaluated portion of the subexpression, ignore the
46954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    // error.
470f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson    if (Info.ShortCircuit) {
47132fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner      // If error is ignored because the value isn't evaluated, get the real
47232fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner      // type at least to prevent errors downstream.
47382206e267ce6cc709797127616f64672d255b310Anders Carlsson      Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
47482206e267ce6cc709797127616f64672d255b310Anders Carlsson      Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
47554176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner      return true;
47632fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    }
47754176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner
47832fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    // Take the first error.
47954da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson    if (Info.EvalResult.Diag == 0) {
48054da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson      Info.EvalResult.DiagLoc = L;
48154da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson      Info.EvalResult.Diag = D;
48282206e267ce6cc709797127616f64672d255b310Anders Carlsson      Info.EvalResult.DiagExpr = E;
48332fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    }
48454176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    return false;
4857a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner  }
4867a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner
487f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  //===--------------------------------------------------------------------===//
488f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  //                            Visitor Methods
489f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  //===--------------------------------------------------------------------===//
49032fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner
49132fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner  bool VisitStmt(Stmt *) {
49232fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    assert(0 && "This should be called on integers, stmts are not integers");
49332fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    return false;
49432fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner  }
4957a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner
49632fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner  bool VisitExpr(Expr *E) {
4970e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
498f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  }
499f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
500b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
501f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
5024c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitIntegerLiteral(const IntegerLiteral *E) {
5034c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    Result = E->getValue();
5044c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
5054c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    return true;
5064c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  }
5074c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitCharacterLiteral(const CharacterLiteral *E) {
5084c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
5094c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    Result = E->getValue();
5104c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
5114c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    return true;
5124c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  }
5134c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitTypesCompatibleExpr(const TypesCompatibleExpr *E) {
5144c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
515ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    // Per gcc docs "this built-in function ignores top level
516ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    // qualifiers".  We need to use the canonical version to properly
517ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    // be able to strip CRV qualifiers from the type.
518ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    QualType T0 = Info.Ctx.getCanonicalType(E->getArgType1());
519ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    QualType T1 = Info.Ctx.getCanonicalType(E->getArgType2());
520ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    Result = Info.Ctx.typesAreCompatible(T0.getUnqualifiedType(),
521ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar                                         T1.getUnqualifiedType());
5224c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    return true;
5234c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  }
5244c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitDeclRefExpr(const DeclRefExpr *E);
5254c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitCallExpr(const CallExpr *E);
526b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  bool VisitBinaryOperator(const BinaryOperator *E);
527b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  bool VisitUnaryOperator(const UnaryOperator *E);
528ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes  bool VisitConditionalOperator(const ConditionalOperator *E);
529f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
530a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  bool VisitCastExpr(CastExpr* E);
5310518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  bool VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E);
5320518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl
5333068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  bool VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) {
534529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
5353068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    Result = E->getValue();
5363068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
5373068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    return true;
5383068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  }
5393068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
5403f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson  bool VisitGNUNullExpr(const GNUNullExpr *E) {
5413f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson    Result = APSInt::getNullValue(getIntTypeSizeInBits(E->getType()));
5423f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson    Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
5433f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson    return true;
5443f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson  }
5453f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson
5463068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  bool VisitCXXZeroInitValueExpr(const CXXZeroInitValueExpr *E) {
5473068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    Result = APSInt::getNullValue(getIntTypeSizeInBits(E->getType()));
5483068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
5493068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    return true;
5503068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  }
5513068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
55264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  bool VisitUnaryTypeTraitExpr(const UnaryTypeTraitExpr *E) {
55364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
55464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl    Result = E->Evaluate();
55564b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl    return true;
55664b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  }
55764b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl
558fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattnerprivate:
559af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  unsigned GetAlignOfExpr(const Expr *E);
560af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  unsigned GetAlignOfType(QualType T);
561f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner};
562f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace
563f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
56487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluateInteger(const Expr* E, APSInt &Result, EvalInfo &Info) {
56587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  return IntExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E));
566f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner}
567f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
5684c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattnerbool IntExprEvaluator::VisitDeclRefExpr(const DeclRefExpr *E) {
5694c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  // Enums are integer constant exprs.
5704c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  if (const EnumConstantDecl *D = dyn_cast<EnumConstantDecl>(E->getDecl())) {
5714c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    Result = D->getInitVal();
572e9a0f43927041e2bcc89140c338dfae207ad3c3bEli Friedman    // FIXME: This is an ugly hack around the fact that enums don't set their
573e9a0f43927041e2bcc89140c338dfae207ad3c3bEli Friedman    // signedness consistently; see PR3173
574e9a0f43927041e2bcc89140c338dfae207ad3c3bEli Friedman    Result.setIsUnsigned(!E->getType()->isSignedIntegerType());
5754c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    return true;
5764c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  }
577b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl
578b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl  // In C++, const, non-volatile integers initialized with ICEs are ICEs.
579b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl  if (Info.Ctx.getLangOptions().CPlusPlus &&
580b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl      E->getType().getCVRQualifiers() == QualType::Const) {
581b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl    if (const VarDecl *D = dyn_cast<VarDecl>(E->getDecl())) {
582b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl      if (const Expr *Init = D->getInit())
583b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl        return Visit(const_cast<Expr*>(Init));
584b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl    }
585b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl  }
586b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl
5874c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  // Otherwise, random variable references are not constants.
5880e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson  return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
5894c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner}
5904c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner
591a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way
592a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// as GCC.
593a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattnerstatic int EvaluateBuiltinClassifyType(const CallExpr *E) {
594a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  // The following enum mimics the values returned by GCC.
595a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  enum gcc_type_class {
596a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    no_type_class = -1,
597a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    void_type_class, integer_type_class, char_type_class,
598a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    enumeral_type_class, boolean_type_class,
599a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    pointer_type_class, reference_type_class, offset_type_class,
600a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    real_type_class, complex_type_class,
601a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    function_type_class, method_type_class,
602a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    record_type_class, union_type_class,
603a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    array_type_class, string_type_class,
604a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    lang_type_class
605a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  };
606a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner
607a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  // If no argument was supplied, default to "no_type_class". This isn't
608a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  // ideal, however it is what gcc does.
609a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  if (E->getNumArgs() == 0)
610a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return no_type_class;
611a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner
612a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  QualType ArgTy = E->getArg(0)->getType();
613a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  if (ArgTy->isVoidType())
614a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return void_type_class;
615a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isEnumeralType())
616a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return enumeral_type_class;
617a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isBooleanType())
618a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return boolean_type_class;
619a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isCharType())
620a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return string_type_class; // gcc doesn't appear to use char_type_class
621a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isIntegerType())
622a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return integer_type_class;
623a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isPointerType())
624a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return pointer_type_class;
625a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isReferenceType())
626a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return reference_type_class;
627a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isRealType())
628a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return real_type_class;
629a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isComplexType())
630a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return complex_type_class;
631a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isFunctionType())
632a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return function_type_class;
633a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isStructureType())
634a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return record_type_class;
635a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isUnionType())
636a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return union_type_class;
637a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isArrayType())
638a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return array_type_class;
639a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isUnionType())
640a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return union_type_class;
641a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else  // FIXME: offset_type_class, method_type_class, & lang_type_class?
642a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    assert(0 && "CallExpr::isBuiltinClassifyType(): unimplemented type");
643a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  return -1;
644a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner}
645a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner
6464c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattnerbool IntExprEvaluator::VisitCallExpr(const CallExpr *E) {
6474c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
6484c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner
649019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  switch (E->isBuiltinCall()) {
650019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  default:
6510e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
652019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_classify_type:
653a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    Result.setIsSigned(true);
654a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    Result = EvaluateBuiltinClassifyType(E);
655019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner    return true;
656019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner
6574bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson  case Builtin::BI__builtin_constant_p:
658019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner    // __builtin_constant_p always has one operand: it returns true if that
659019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner    // operand can be folded, false otherwise.
6604bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson    Result = E->getArg(0)->isEvaluatable(Info.Ctx);
661019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner    return true;
662019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  }
6634c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner}
664f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
665b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
666a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  if (E->getOpcode() == BinaryOperator::Comma) {
667027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson    if (!Visit(E->getRHS()))
668027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson      return false;
6694fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson
6704fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson    if (!Info.ShortCircuit) {
6714fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson      // If we can't evaluate the LHS, it must be because it has
6724fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson      // side effects.
6734fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson      if (!E->getLHS()->isEvaluatable(Info.Ctx))
6744fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson        Info.EvalResult.HasSideEffects = true;
6754fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson
6760e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson      return Extension(E->getOperatorLoc(), diag::note_comma_in_ice, E);
6774fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson    }
678c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner
679027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson    return true;
680a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  }
681a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
682a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  if (E->isLogicalOp()) {
683a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // These need to be handled specially because the operands aren't
684a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // necessarily integral
685fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson    bool lhsResult, rhsResult;
68651fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson
687fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson    if (HandleConversionToBool(E->getLHS(), lhsResult, Info)) {
68851fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson      // We were able to evaluate the LHS, see if we can get away with not
68951fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson      // evaluating the RHS: 0 && X -> 0, 1 || X -> 1
690fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson      if (lhsResult == (E->getOpcode() == BinaryOperator::LOr) ||
691fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson          !lhsResult == (E->getOpcode() == BinaryOperator::LAnd)) {
6924bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
6934bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
694fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson        Result = lhsResult;
6954bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson
696f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson        Info.ShortCircuit++;
697fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson        bool rhsEvaluated = HandleConversionToBool(E->getRHS(), rhsResult, Info);
698f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson        Info.ShortCircuit--;
699f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson
700fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson        if (rhsEvaluated)
701fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson          return true;
702fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson
703fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson        // FIXME: Return an extension warning saying that the RHS could not be
704fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson        // evaluated.
7054bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        return true;
706a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman      }
707a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
708fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson      if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) {
7094bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
7104bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
7114bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        if (E->getOpcode() == BinaryOperator::LOr)
712fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson          Result = lhsResult || rhsResult;
7134bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        else
714fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson          Result = lhsResult && rhsResult;
7154bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        return true;
7164bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson      }
7174bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson    } else {
718fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson      if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) {
7194bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        // We can't evaluate the LHS; however, sometimes the result
7204bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        // is determined by the RHS: X && 0 -> 0, X || 1 -> 1.
721fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson        if (rhsResult == (E->getOpcode() == BinaryOperator::LOr) ||
722fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson            !rhsResult == (E->getOpcode() == BinaryOperator::LAnd)) {
7234bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson          Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
7244bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson          Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
725fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson          Result = rhsResult;
726fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson
727fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson          // Since we werent able to evaluate the left hand side, it
728fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson          // must have had side effects.
729fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson          Info.EvalResult.HasSideEffects = true;
730fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson
7314bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson          return true;
7324bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        }
7334bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson      }
734a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    }
735a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
736a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    return false;
737c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner  }
73854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner
739286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  QualType LHSTy = E->getLHS()->getType();
740286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  QualType RHSTy = E->getRHS()->getType();
7414087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
7424087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar  if (LHSTy->isAnyComplexType()) {
7434087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    assert(RHSTy->isAnyComplexType() && "Invalid comparison");
7444087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    APValue LHS, RHS;
7454087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
7464087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    if (!EvaluateComplex(E->getLHS(), LHS, Info))
7474087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      return false;
7484087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
7494087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    if (!EvaluateComplex(E->getRHS(), RHS, Info))
7504087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      return false;
7514087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
7524087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    if (LHS.isComplexFloat()) {
7534087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      APFloat::cmpResult CR_r =
7544087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar        LHS.getComplexFloatReal().compare(RHS.getComplexFloatReal());
7554087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      APFloat::cmpResult CR_i =
7564087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar        LHS.getComplexFloatImag().compare(RHS.getComplexFloatImag());
7574087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
7584087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
7594087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      if (E->getOpcode() == BinaryOperator::EQ)
7604087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar        Result = (CR_r == APFloat::cmpEqual &&
7614087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar                  CR_i == APFloat::cmpEqual);
7624087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      else if (E->getOpcode() == BinaryOperator::NE)
7634087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar        Result = ((CR_r == APFloat::cmpGreaterThan ||
7644087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar                   CR_r == APFloat::cmpLessThan) &&
7654087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar                  (CR_i == APFloat::cmpGreaterThan ||
7664087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar                   CR_i == APFloat::cmpLessThan));
7674087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      else
7684087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar        assert(0 && "Invalid complex compartison.");
7694087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
7704087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      return true;
7714087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    } else {
7724087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
7734087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      if (E->getOpcode() == BinaryOperator::EQ)
7744087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar        Result = (LHS.getComplexIntReal() == RHS.getComplexIntReal() &&
7754087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar                  LHS.getComplexIntImag() == RHS.getComplexIntImag());
7764087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      else if (E->getOpcode() == BinaryOperator::NE)
7774087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar        Result = (LHS.getComplexIntReal() != RHS.getComplexIntReal() ||
7784087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar                  LHS.getComplexIntImag() != RHS.getComplexIntImag());
7794087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      else
7804087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar        assert(0 && "Invalid complex compartison.");
7814087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
7824087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      return true;
7834087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    }
7844087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar  }
785286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson
786286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  if (LHSTy->isRealFloatingType() &&
787286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      RHSTy->isRealFloatingType()) {
788286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    APFloat RHS(0.0), LHS(0.0);
789286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson
790286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    if (!EvaluateFloat(E->getRHS(), RHS, Info))
791286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      return false;
792286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson
793286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    if (!EvaluateFloat(E->getLHS(), LHS, Info))
794286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      return false;
795286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson
796286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    APFloat::cmpResult CR = LHS.compare(RHS);
797529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson
798529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
799529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson
800286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    switch (E->getOpcode()) {
801286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    default:
802286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      assert(0 && "Invalid binary operator!");
803286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::LT:
804286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      Result = CR == APFloat::cmpLessThan;
805286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      break;
806286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::GT:
807286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      Result = CR == APFloat::cmpGreaterThan;
808286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      break;
809286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::LE:
810286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      Result = CR == APFloat::cmpLessThan || CR == APFloat::cmpEqual;
811286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      break;
812286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::GE:
813286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      Result = CR == APFloat::cmpGreaterThan || CR == APFloat::cmpEqual;
814286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      break;
815286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::EQ:
816286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      Result = CR == APFloat::cmpEqual;
817286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      break;
818286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::NE:
819286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      Result = CR == APFloat::cmpGreaterThan || CR == APFloat::cmpLessThan;
820286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      break;
821286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    }
822286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson
823286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
824286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    return true;
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
8473068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
848529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson      Result = D;
8493068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
8503068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
8513068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      return true;
8523068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    }
8533068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  }
854286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  if (!LHSTy->isIntegralType() ||
855286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      !RHSTy->isIntegralType()) {
856a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // We can't continue from here for non-integral types, and they
857a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // could potentially confuse the following operations.
858a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // FIXME: Deal with EQ and friends.
859a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    return false;
860a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  }
861a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
862a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  // The LHS of a constant expr is always evaluated and needed.
863a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  llvm::APSInt RHS(32);
864a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  if (!Visit(E->getLHS())) {
865a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    return false; // error in subexpression.
866a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  }
867d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman
868d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman
869d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman  // FIXME Maybe we want to succeed even where we can't evaluate the
870d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman  // right side of LAnd/LOr?
871d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman  // For example, see http://llvm.org/bugs/show_bug.cgi?id=2525
87254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner  if (!EvaluateInteger(E->getRHS(), RHS, Info))
873b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner    return false;
874a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
875a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  switch (E->getOpcode()) {
87632fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner  default:
8770e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E);
87854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner  case BinaryOperator::Mul: Result *= RHS; return true;
87954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner  case BinaryOperator::Add: Result += RHS; return true;
88054176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner  case BinaryOperator::Sub: Result -= RHS; return true;
88154176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner  case BinaryOperator::And: Result &= RHS; return true;
88254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner  case BinaryOperator::Xor: Result ^= RHS; return true;
88354176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner  case BinaryOperator::Or:  Result |= RHS; return true;
884a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  case BinaryOperator::Div:
88554176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    if (RHS == 0)
8860e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson      return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E);
887b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner    Result /= RHS;
88832fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    break;
889a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  case BinaryOperator::Rem:
89054176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    if (RHS == 0)
8910e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson      return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E);
892a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson    Result %= RHS;
89332fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    break;
894a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  case BinaryOperator::Shl:
89554176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    // FIXME: Warn about out of range shift amounts!
896b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner    Result <<= (unsigned)RHS.getLimitedValue(Result.getBitWidth()-1);
897a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson    break;
898a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  case BinaryOperator::Shr:
899b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner    Result >>= (unsigned)RHS.getLimitedValue(Result.getBitWidth()-1);
900a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson    break;
901b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner
902ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner  case BinaryOperator::LT:
903ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    Result = Result < RHS;
904ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
905ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    break;
906ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner  case BinaryOperator::GT:
907ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    Result = Result > RHS;
908ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
909ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    break;
910ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner  case BinaryOperator::LE:
911ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    Result = Result <= RHS;
912ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
913ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    break;
914ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner  case BinaryOperator::GE:
915ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    Result = Result >= RHS;
916ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
917ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    break;
918ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner  case BinaryOperator::EQ:
919ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    Result = Result == RHS;
920ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
921ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    break;
922ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner  case BinaryOperator::NE:
923ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    Result = Result != RHS;
924ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
925ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    break;
92654176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner  case BinaryOperator::LAnd:
92754176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    Result = Result != 0 && RHS != 0;
92854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
92954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    break;
93054176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner  case BinaryOperator::LOr:
93154176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    Result = Result != 0 || RHS != 0;
93254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
93354176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    break;
934b11e77836dd0867955c5abf32baf1c3e6c7f81e1Eli Friedman  }
935a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson
936a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
937b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  return true;
938a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson}
939a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson
940ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopesbool IntExprEvaluator::VisitConditionalOperator(const ConditionalOperator *E) {
941a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes  bool Cond;
942a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes  if (!HandleConversionToBool(E->getCond(), Cond, Info))
943ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes    return false;
944ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes
945a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes  return Visit(Cond ? E->getTrueExpr() : E->getFalseExpr());
946ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes}
947ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes
948af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattnerunsigned IntExprEvaluator::GetAlignOfType(QualType T) {
949e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  const Type *Ty = Info.Ctx.getCanonicalType(T).getTypePtr();
950e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
951e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  // __alignof__(void) = 1 as a gcc extension.
952e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  if (Ty->isVoidType())
953e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner    return 1;
954e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
955e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  // GCC extension: alignof(function) = 4.
956e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  // FIXME: AlignOf shouldn't be unconditionally 4!  It should listen to the
957e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  // attribute(align) directive.
958e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  if (Ty->isFunctionType())
959e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner    return 4;
960e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
961e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  if (const ASQualType *ASQT = dyn_cast<ASQualType>(Ty))
962e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner    return GetAlignOfType(QualType(ASQT->getBaseType(), 0));
963e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
964e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  // alignof VLA/incomplete array.
965e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  if (const ArrayType *VAT = dyn_cast<ArrayType>(Ty))
966e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner    return GetAlignOfType(VAT->getElementType());
967e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
968e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  // sizeof (objc class)?
969e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  if (isa<ObjCInterfaceType>(Ty))
970e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner    return 1;  // FIXME: This probably isn't right.
971e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
972e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  // Get information about the alignment.
973e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  unsigned CharSize = Info.Ctx.Target.getCharWidth();
974e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  return Info.Ctx.getTypeAlign(Ty) / CharSize;
975e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner}
976e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
977af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattnerunsigned IntExprEvaluator::GetAlignOfExpr(const Expr *E) {
978af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  E = E->IgnoreParens();
979af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner
980af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  // alignof decl is always accepted, even if it doesn't make sense: we default
981af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  // to 1 in those cases.
982af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
983af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner    return Info.Ctx.getDeclAlign(DRE->getDecl());
984af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner
985af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  if (const MemberExpr *ME = dyn_cast<MemberExpr>(E))
986af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner    return Info.Ctx.getDeclAlign(ME->getMemberDecl());
987af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner
988e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  return GetAlignOfType(E->getType());
989e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner}
990e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
991e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
9920518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// VisitSizeAlignOfExpr - Evaluate a sizeof or alignof with a result as the
9930518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// expression's type.
9940518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redlbool IntExprEvaluator::VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E) {
9950518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  QualType DstTy = E->getType();
996fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner  // Return the result in the right width.
997fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner  Result.zextOrTrunc(getIntTypeSizeInBits(DstTy));
998fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner  Result.setIsUnsigned(DstTy->isUnsignedIntegerType());
999fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner
1000e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  // Handle alignof separately.
1001e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  if (!E->isSizeOf()) {
1002e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner    if (E->isArgumentType())
1003e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner      Result = GetAlignOfType(E->getArgumentType());
1004e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner    else
1005e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner      Result = GetAlignOfExpr(E->getArgumentExpr());
1006e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner    return true;
1007e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  }
1008e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
10090518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  QualType SrcTy = E->getTypeOfArgument();
10100518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl
1011fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner  // sizeof(void) and __alignof__(void) = 1 as a gcc extension.
10124efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (SrcTy->isVoidType()) {
1013fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner    Result = 1;
10144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
10154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
1016fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner
1017fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner  // sizeof(vla) is not a constantexpr: C99 6.5.3.4p2.
1018e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  if (!SrcTy->isConstantSizeType())
1019fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner    return false;
102067303c1c78345c53abbf19516170f5bd79b0534dFariborz Jahanian
1021fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner  // GCC extension: sizeof(function) = 1.
1022fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner  if (SrcTy->isFunctionType()) {
1023e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner    Result = 1;
1024fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner    return true;
1025fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner  }
1026f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman
1027f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman  if (SrcTy->isObjCInterfaceType()) {
1028f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman    // Slightly unusual case: the size of an ObjC interface type is the
1029f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman    // size of the class.  This code intentionally falls through to the normal
1030f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman    // case.
1031f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman    ObjCInterfaceDecl *OI = SrcTy->getAsObjCInterfaceType()->getDecl();
1032f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman    RecordDecl *RD = const_cast<RecordDecl*>(Info.Ctx.addRecordToClass(OI));
1033f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman    SrcTy = Info.Ctx.getTagDeclType(static_cast<TagDecl*>(RD));
1034f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman  }
1035f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman
1036e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  // Get information about the size.
103787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  unsigned CharSize = Info.Ctx.Target.getCharWidth();
1038e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  Result = Info.Ctx.getTypeSize(SrcTy) / CharSize;
1039fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner  return true;
1040fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner}
1041fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner
1042b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
10434c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  // Special case unary operators that do not need their subexpression
10444c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  // evaluated.  offsetof/sizeof/alignof are all special.
104575a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  if (E->isOffsetOfOp()) {
10464c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
104787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner    Result = E->evaluateOffsetOf(Info.Ctx);
104875a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
104975a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    return true;
105075a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  }
1051a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
1052a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  if (E->getOpcode() == UnaryOperator::LNot) {
1053a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // LNot's operand isn't necessarily an integer, so we handle it specially.
1054a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    bool bres;
1055a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    if (!HandleConversionToBool(E->getSubExpr(), bres, Info))
1056a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman      return false;
1057a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
1058a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
1059a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    Result = !bres;
1060a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    return true;
1061a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  }
1062a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
106387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  // Get the operand value into 'Result'.
106487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  if (!Visit(E->getSubExpr()))
106575a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    return false;
1066a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson
106775a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  switch (E->getOpcode()) {
10684c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  default:
106975a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    // Address, indirect, pre/post inc/dec, etc are not valid constant exprs.
107075a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    // See C99 6.6p3.
10710e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E);
107275a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  case UnaryOperator::Extension:
10734c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    // FIXME: Should extension allow i-c-e extension expressions in its scope?
10744c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    // If so, we could clear the diagnostic ID.
107575a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  case UnaryOperator::Plus:
10764c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    // The result is always just the subexpr.
107775a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    break;
107875a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  case UnaryOperator::Minus:
107975a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    Result = -Result;
108075a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    break;
108175a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  case UnaryOperator::Not:
108275a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    Result = ~Result;
108375a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    break;
108406a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson  }
108506a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson
1086a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
1087b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  return true;
1088a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson}
1089a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson
1090732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// HandleCast - This is used to evaluate implicit or explicit casts where the
1091732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// result type is integer.
1092a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbarbool IntExprEvaluator::VisitCastExpr(CastExpr *E) {
109382206e267ce6cc709797127616f64672d255b310Anders Carlsson  Expr *SubExpr = E->getSubExpr();
109482206e267ce6cc709797127616f64672d255b310Anders Carlsson  QualType DestType = E->getType();
109582206e267ce6cc709797127616f64672d255b310Anders Carlsson
10967a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner  unsigned DestWidth = getIntTypeSizeInBits(DestType);
109706a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson
10984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (DestType->isBooleanType()) {
10994efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    bool BoolResult;
11004efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!HandleConversionToBool(SubExpr, BoolResult, Info))
11014efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
11024efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Result.zextOrTrunc(DestWidth);
11034efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Result.setIsUnsigned(DestType->isUnsignedIntegerType());
11044efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Result = BoolResult;
11054efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
11064efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
11074efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1108a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  // Handle simple integer->integer casts.
1109a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  if (SubExpr->getType()->isIntegralType()) {
1110732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner    if (!Visit(SubExpr))
1111b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner      return false;
1112a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1113a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    Result = HandleIntToIntCast(DestType, SubExpr->getType(), Result, Info.Ctx);
1114732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner    return true;
1115732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner  }
1116732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner
1117732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner  // FIXME: Clean this up!
1118732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner  if (SubExpr->getType()->isPointerType()) {
1119a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson    APValue LV;
112087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner    if (!EvaluatePointer(SubExpr, LV, Info))
1121b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner      return false;
11224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1123a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson    if (LV.getLValueBase())
1124b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner      return false;
11254efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1126559e56b3a201316ae0b7e7389879a8054f6a3a82Anders Carlsson    Result.extOrTrunc(DestWidth);
1127559e56b3a201316ae0b7e7389879a8054f6a3a82Anders Carlsson    Result = LV.getLValueOffset();
1128732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner    Result.setIsUnsigned(DestType->isUnsignedIntegerType());
1129732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner    return true;
11302bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  }
11314efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1132732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner  if (!SubExpr->getType()->isRealFloatingType())
11330e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
1134732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner
1135d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  APFloat F(0.0);
1136d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  if (!EvaluateFloat(SubExpr, F, Info))
11370e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
1138732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner
1139a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  Result = HandleFloatToIntCast(DestType, SubExpr->getType(), F, Info.Ctx);
1140b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  return true;
1141a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson}
11422bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
1143f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
1144d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman// Float Evaluation
1145d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===//
1146d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1147d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmannamespace {
1148d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanclass VISIBILITY_HIDDEN FloatExprEvaluator
1149d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  : public StmtVisitor<FloatExprEvaluator, bool> {
1150d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  EvalInfo &Info;
1151d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  APFloat &Result;
1152d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanpublic:
1153d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  FloatExprEvaluator(EvalInfo &info, APFloat &result)
1154d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    : Info(info), Result(result) {}
1155d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1156d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitStmt(Stmt *S) {
1157d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return false;
1158d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  }
1159d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1160d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
1161019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  bool VisitCallExpr(const CallExpr *E);
1162d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
11635db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  bool VisitUnaryOperator(const UnaryOperator *E);
1164d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitBinaryOperator(const BinaryOperator *E);
1165d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitFloatingLiteral(const FloatingLiteral *E);
11664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  bool VisitCastExpr(CastExpr *E);
11674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  bool VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E);
1168d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman};
1169d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} // end anonymous namespace
1170d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1171d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr* E, APFloat& Result, EvalInfo &Info) {
1172d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  return FloatExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E));
1173d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}
1174d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1175019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattnerbool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) {
1176019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  switch (E->isBuiltinCall()) {
117734a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner  default: return false;
1178019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_huge_val:
1179019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_huge_valf:
1180019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_huge_vall:
1181019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_inf:
1182019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_inff:
11837cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar  case Builtin::BI__builtin_infl: {
11847cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar    const llvm::fltSemantics &Sem =
11857cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar      Info.Ctx.getFloatTypeSemantics(E->getType());
118634a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner    Result = llvm::APFloat::getInf(Sem);
118734a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner    return true;
11887cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar  }
11899e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner
11909e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner  case Builtin::BI__builtin_nan:
11919e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner  case Builtin::BI__builtin_nanf:
11929e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner  case Builtin::BI__builtin_nanl:
11939e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    // If this is __builtin_nan("") turn this into a simple nan, otherwise we
11949e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    // can't constant fold it.
11959e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    if (const StringLiteral *S =
11969e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner        dyn_cast<StringLiteral>(E->getArg(0)->IgnoreParenCasts())) {
11979e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner      if (!S->isWide() && S->getByteLength() == 0) { // empty string.
11987cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar        const llvm::fltSemantics &Sem =
11997cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar          Info.Ctx.getFloatTypeSemantics(E->getType());
12009e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner        Result = llvm::APFloat::getNaN(Sem);
12019e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner        return true;
12029e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner      }
12039e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    }
12049e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    return false;
12055db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar
12065db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_fabs:
12075db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_fabsf:
12085db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_fabsl:
12095db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    if (!EvaluateFloat(E->getArg(0), Result, Info))
12105db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar      return false;
12115db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar
12125db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    if (Result.isNegative())
12135db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar      Result.changeSign();
12145db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
12155db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar
12165db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_copysign:
12175db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_copysignf:
12185db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_copysignl: {
12195db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    APFloat RHS(0.);
12205db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    if (!EvaluateFloat(E->getArg(0), Result, Info) ||
12215db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar        !EvaluateFloat(E->getArg(1), RHS, Info))
12225db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar      return false;
12235db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    Result.copySign(RHS);
12245db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
12255db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  }
1226019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  }
1227019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner}
1228019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner
12295db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbarbool FloatExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
1230a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes  if (E->getOpcode() == UnaryOperator::Deref)
1231a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes    return false;
1232a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes
12335db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  if (!EvaluateFloat(E->getSubExpr(), Result, Info))
12345db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return false;
12355db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar
12365db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  switch (E->getOpcode()) {
12375db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  default: return false;
12385db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case UnaryOperator::Plus:
12395db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
12405db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case UnaryOperator::Minus:
12415db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    Result.changeSign();
12425db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
12435db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  }
12445db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar}
1245019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner
1246d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
1247d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  // FIXME: Diagnostics?  I really don't understand how the warnings
1248d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  // and errors are supposed to work.
12495db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  APFloat RHS(0.0);
1250d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  if (!EvaluateFloat(E->getLHS(), Result, Info))
1251d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return false;
1252d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  if (!EvaluateFloat(E->getRHS(), RHS, Info))
1253d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return false;
1254d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1255d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  switch (E->getOpcode()) {
1256d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  default: return false;
1257d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  case BinaryOperator::Mul:
1258d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.multiply(RHS, APFloat::rmNearestTiesToEven);
1259d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
1260d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  case BinaryOperator::Add:
1261d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.add(RHS, APFloat::rmNearestTiesToEven);
1262d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
1263d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  case BinaryOperator::Sub:
1264d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.subtract(RHS, APFloat::rmNearestTiesToEven);
1265d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
1266d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  case BinaryOperator::Div:
1267d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.divide(RHS, APFloat::rmNearestTiesToEven);
1268d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
1269d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  case BinaryOperator::Rem:
1270d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.mod(RHS, APFloat::rmNearestTiesToEven);
1271d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
1272d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  }
1273d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}
1274d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1275d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitFloatingLiteral(const FloatingLiteral *E) {
1276d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  Result = E->getValue();
1277d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  return true;
1278d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}
1279d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
12804efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanbool FloatExprEvaluator::VisitCastExpr(CastExpr *E) {
12814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  Expr* SubExpr = E->getSubExpr();
128259b5da6d853b4368b984700315adf7b37de05764Nate Begeman
12834efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (SubExpr->getType()->isIntegralType()) {
12844efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APSInt IntResult;
12854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!EvaluateInteger(E, IntResult, Info))
12864efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
1287a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    Result = HandleIntToFloatCast(E->getType(), SubExpr->getType(),
1288a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                  IntResult, Info.Ctx);
12894efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
12904efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
12914efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (SubExpr->getType()->isRealFloatingType()) {
12924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!Visit(SubExpr))
12934efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
1294a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    Result = HandleFloatToFloatCast(E->getType(), SubExpr->getType(),
1295a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                    Result, Info.Ctx);
12964efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
12974efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
12984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
12994efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return false;
13004efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
13014efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
13024efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanbool FloatExprEvaluator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
13034efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  Result = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(E->getType()));
13044efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return true;
13054efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
13064efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1307d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===//
1308a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar// Complex Evaluation (for float and integer)
13099ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===//
13109ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
13119ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonnamespace {
1312a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbarclass VISIBILITY_HIDDEN ComplexExprEvaluator
1313a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  : public StmtVisitor<ComplexExprEvaluator, APValue> {
13149ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  EvalInfo &Info;
13159ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
13169ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonpublic:
1317a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  ComplexExprEvaluator(EvalInfo &info) : Info(info) {}
13189ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
13199ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  //===--------------------------------------------------------------------===//
13209ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  //                            Visitor Methods
13219ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  //===--------------------------------------------------------------------===//
13229ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
13239ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  APValue VisitStmt(Stmt *S) {
13249ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson    return APValue();
13259ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  }
13269ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
13279ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
13289ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
13299ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  APValue VisitImaginaryLiteral(ImaginaryLiteral *E) {
1330a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    Expr* SubExpr = E->getSubExpr();
1331a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
1332a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    if (SubExpr->getType()->isRealFloatingType()) {
1333a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      APFloat Result(0.0);
1334a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
1335a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      if (!EvaluateFloat(SubExpr, Result, Info))
1336a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar        return APValue();
13379ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
13383f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      return APValue(APFloat(Result.getSemantics(), APFloat::fcZero, false),
1339a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                     Result);
1340a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    } else {
1341a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      assert(SubExpr->getType()->isIntegerType() &&
1342a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar             "Unexpected imaginary literal.");
1343a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
1344a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      llvm::APSInt Result;
1345a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      if (!EvaluateInteger(SubExpr, Result, Info))
1346a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar        return APValue();
1347a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
1348a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      llvm::APSInt Zero(Result.getBitWidth(), !Result.isSigned());
1349a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Zero = 0;
1350a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      return APValue(Zero, Result);
1351a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    }
13529ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  }
13539ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
1354ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  APValue VisitCastExpr(CastExpr *E) {
1355ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    Expr* SubExpr = E->getSubExpr();
1356a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    QualType EltType = E->getType()->getAsComplexType()->getElementType();
1357a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    QualType SubType = SubExpr->getType();
1358ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1359a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    if (SubType->isRealFloatingType()) {
1360ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson      APFloat Result(0.0);
1361ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1362ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson      if (!EvaluateFloat(SubExpr, Result, Info))
1363ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson        return APValue();
1364ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1365a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      // Apply float conversion if necessary.
1366a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      Result = HandleFloatToFloatCast(EltType, SubType, Result, Info.Ctx);
13678f826f0e0c90b05ab04e84c29157d2e965713288Daniel Dunbar      return APValue(Result,
13683f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar                     APFloat(Result.getSemantics(), APFloat::fcZero, false));
1369a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    } else if (SubType->isIntegerType()) {
1370a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      APSInt Result;
1371a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
1372a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      if (!EvaluateInteger(SubExpr, Result, Info))
1373a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar        return APValue();
1374a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1375a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      // Apply integer conversion if necessary.
1376a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      Result = HandleIntToIntCast(EltType, SubType, Result, Info.Ctx);
1377a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      llvm::APSInt Zero(Result.getBitWidth(), !Result.isSigned());
1378a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Zero = 0;
1379a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      return APValue(Result, Zero);
1380a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    } else if (const ComplexType *CT = SubType->getAsComplexType()) {
1381a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      APValue Src;
1382a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1383a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      if (!EvaluateComplex(SubExpr, Src, Info))
1384a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        return APValue();
1385a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1386a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      QualType SrcType = CT->getElementType();
1387a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1388a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      if (Src.isComplexFloat()) {
1389a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        if (EltType->isRealFloatingType()) {
1390a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar          return APValue(HandleFloatToFloatCast(EltType, SrcType,
1391a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                                Src.getComplexFloatReal(),
1392a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                                Info.Ctx),
1393a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                         HandleFloatToFloatCast(EltType, SrcType,
1394a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                                Src.getComplexFloatImag(),
1395a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                                Info.Ctx));
1396a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        } else {
1397a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar          return APValue(HandleFloatToIntCast(EltType, SrcType,
1398a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Src.getComplexFloatReal(),
1399a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Info.Ctx),
1400a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                         HandleFloatToIntCast(EltType, SrcType,
1401a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Src.getComplexFloatImag(),
1402a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Info.Ctx));
1403a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        }
1404a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      } else {
1405a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        assert(Src.isComplexInt() && "Invalid evaluate result.");
1406a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        if (EltType->isRealFloatingType()) {
1407a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar          return APValue(HandleIntToFloatCast(EltType, SrcType,
1408a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Src.getComplexIntReal(),
1409a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Info.Ctx),
1410a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                         HandleIntToFloatCast(EltType, SrcType,
1411a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Src.getComplexIntImag(),
1412a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Info.Ctx));
1413a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        } else {
1414a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar          return APValue(HandleIntToIntCast(EltType, SrcType,
1415a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                            Src.getComplexIntReal(),
1416a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                            Info.Ctx),
1417a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                         HandleIntToIntCast(EltType, SrcType,
1418a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                            Src.getComplexIntImag(),
1419a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                            Info.Ctx));
1420a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        }
1421a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      }
1422ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    }
1423ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1424ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    // FIXME: Handle more casts.
1425ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    return APValue();
1426ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  }
1427ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1428ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  APValue VisitBinaryOperator(const BinaryOperator *E);
1429ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
14309ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson};
14319ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson} // end anonymous namespace
14329ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
1433a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbarstatic bool EvaluateComplex(const Expr *E, APValue &Result, EvalInfo &Info)
14349ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson{
1435a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  Result = ComplexExprEvaluator(Info).Visit(const_cast<Expr*>(E));
1436a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  assert((!Result.isComplexFloat() ||
1437a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar          (&Result.getComplexFloatReal().getSemantics() ==
1438a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar           &Result.getComplexFloatImag().getSemantics())) &&
1439a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar         "Invalid complex evaluation.");
1440a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  return Result.isComplexFloat() || Result.isComplexInt();
14419ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson}
14429ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
1443a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel DunbarAPValue ComplexExprEvaluator::VisitBinaryOperator(const BinaryOperator *E)
1444ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson{
1445ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  APValue Result, RHS;
1446ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1447a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  if (!EvaluateComplex(E->getLHS(), Result, Info))
1448ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    return APValue();
1449ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1450a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  if (!EvaluateComplex(E->getRHS(), RHS, Info))
1451ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    return APValue();
1452a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
14533f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar  assert(Result.isComplexFloat() == RHS.isComplexFloat() &&
14543f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar         "Invalid operands to binary operator.");
1455ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  switch (E->getOpcode()) {
1456ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  default: return APValue();
1457ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  case BinaryOperator::Add:
1458a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    if (Result.isComplexFloat()) {
1459a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatReal().add(RHS.getComplexFloatReal(),
1460a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                       APFloat::rmNearestTiesToEven);
1461a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatImag().add(RHS.getComplexFloatImag(),
1462a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                       APFloat::rmNearestTiesToEven);
1463a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    } else {
1464a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntReal() += RHS.getComplexIntReal();
1465a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntImag() += RHS.getComplexIntImag();
1466a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    }
14673f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    break;
1468ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  case BinaryOperator::Sub:
1469a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    if (Result.isComplexFloat()) {
1470a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatReal().subtract(RHS.getComplexFloatReal(),
1471a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                            APFloat::rmNearestTiesToEven);
1472a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatImag().subtract(RHS.getComplexFloatImag(),
1473a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                            APFloat::rmNearestTiesToEven);
1474a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    } else {
1475a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntReal() -= RHS.getComplexIntReal();
1476a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntImag() -= RHS.getComplexIntImag();
1477a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    }
14783f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    break;
14793f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar  case BinaryOperator::Mul:
14803f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    if (Result.isComplexFloat()) {
14813f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APValue LHS = Result;
14823f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &LHS_r = LHS.getComplexFloatReal();
14833f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &LHS_i = LHS.getComplexFloatImag();
14843f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &RHS_r = RHS.getComplexFloatReal();
14853f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &RHS_i = RHS.getComplexFloatImag();
14863f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar
14873f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat Tmp = LHS_r;
14883f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven);
14893f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatReal() = Tmp;
14903f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp = LHS_i;
14913f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven);
14923f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatReal().subtract(Tmp, APFloat::rmNearestTiesToEven);
14933f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar
14943f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp = LHS_r;
14953f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven);
14963f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatImag() = Tmp;
14973f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp = LHS_i;
14983f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven);
14993f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatImag().add(Tmp, APFloat::rmNearestTiesToEven);
15003f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    } else {
15013f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APValue LHS = Result;
15023f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexIntReal() =
15033f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar        (LHS.getComplexIntReal() * RHS.getComplexIntReal() -
15043f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar         LHS.getComplexIntImag() * RHS.getComplexIntImag());
15053f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexIntImag() =
15063f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar        (LHS.getComplexIntReal() * RHS.getComplexIntImag() +
15073f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar         LHS.getComplexIntImag() * RHS.getComplexIntReal());
15083f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    }
15093f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    break;
1510ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  }
1511ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1512ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  return Result;
1513ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson}
1514ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
15159ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===//
15166ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner// Top level Expr::Evaluate method.
1517f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
1518f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
15196ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner/// Evaluate - Return true if this is a constant which we can fold using
1520019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// any crazy technique (that has nothing to do with language standards) that
1521019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// we want to.  If this function returns true, it returns the folded constant
1522019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// in Result.
15235b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlssonbool Expr::Evaluate(EvalResult &Result, ASTContext &Ctx) const {
15245b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson  EvalInfo Info(Ctx, Result);
152554da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson
152659b5da6d853b4368b984700315adf7b37de05764Nate Begeman  if (getType()->isVectorType()) {
152759b5da6d853b4368b984700315adf7b37de05764Nate Begeman    if (!EvaluateVector(this, Result.Val, Info))
152859b5da6d853b4368b984700315adf7b37de05764Nate Begeman      return false;
152959b5da6d853b4368b984700315adf7b37de05764Nate Begeman  } else if (getType()->isIntegerType()) {
1530d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    llvm::APSInt sInt(32);
15316dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson    if (!EvaluateInteger(this, sInt, Info))
15326dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
15336dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson
15345b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson    Result.Val = APValue(sInt);
1535d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  } else if (getType()->isPointerType()) {
15365b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson    if (!EvaluatePointer(this, Result.Val, Info))
15376dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
1538d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  } else if (getType()->isRealFloatingType()) {
1539d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    llvm::APFloat f(0.0);
15406dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson    if (!EvaluateFloat(this, f, Info))
15416dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
15426dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson
15435b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson    Result.Val = APValue(f);
1544a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  } else if (getType()->isAnyComplexType()) {
1545a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    if (!EvaluateComplex(this, Result.Val, Info))
15466dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
1547a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  } else
15489d4c157baaada8945671dc98363a40ed00cbd824Anders Carlsson    return false;
15496dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson
15505b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson  return true;
15515b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson}
15525b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson
15536ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner/// isEvaluatable - Call Evaluate to see if this expression can be constant
155445b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner/// folded, but discard the result.
155545b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattnerbool Expr::isEvaluatable(ASTContext &Ctx) const {
15564fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson  EvalResult Result;
15574fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson  return Evaluate(Result, Ctx) && !Result.HasSideEffects;
155845b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner}
155951fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson
156051fe996231b1d7199f76e4005ff4c943d5deeecdAnders CarlssonAPSInt Expr::EvaluateAsInt(ASTContext &Ctx) const {
15611c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  EvalResult EvalResult;
15621c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  bool Result = Evaluate(EvalResult, Ctx);
1563f185319f25efd6094870f287030270fad26085baDaniel Dunbar  Result = Result;
156451fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson  assert(Result && "Could not evaluate expression");
15651c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer");
156651fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson
15671c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  return EvalResult.Val.getInt();
156851fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson}
1569