ExprConstant.cpp revision 50c39ea4858265f3f5f42a0c624557ce2281936b
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
4554da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson  EvalInfo(ASTContext &ctx, Expr::EvalResult& evalresult) : Ctx(ctx),
4633ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman           EvalResult(evalresult) {}
4787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner};
4887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner
4987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner
504efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool EvaluateLValue(const Expr *E, APValue &Result, EvalInfo &Info);
5187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluatePointer(const Expr *E, APValue &Result, EvalInfo &Info);
5287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluateInteger(const Expr *E, APSInt  &Result, EvalInfo &Info);
5369ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbarstatic bool EvaluateIntegerOrLValue(const Expr *E, APValue  &Result, EvalInfo &Info);
54d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr *E, APFloat &Result, EvalInfo &Info);
55a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbarstatic bool EvaluateComplex(const Expr *E, APValue &Result, EvalInfo &Info);
56f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
57f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// Misc utilities
594efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
604efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool HandleConversionToBool(Expr* E, bool& Result, EvalInfo &Info) {
624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (E->getType()->isIntegralType()) {
634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APSInt IntResult;
644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!EvaluateInteger(E, IntResult, Info))
654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Result = IntResult != 0;
674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  } else if (E->getType()->isRealFloatingType()) {
694efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APFloat FloatResult(0.0);
704efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!EvaluateFloat(E, FloatResult, Info))
714efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
724efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Result = !FloatResult.isZero();
734efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
74a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman  } else if (E->getType()->hasPointerRepresentation()) {
754efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APValue PointerResult;
764efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!EvaluatePointer(E, PointerResult, Info))
774efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    // FIXME: Is this accurate for all kinds of bases?  If not, what would
794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    // the check look like?
804efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Result = PointerResult.getLValueBase() || PointerResult.getLValueOffset();
814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
82a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman  } else if (E->getType()->isAnyComplexType()) {
83a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman    APValue ComplexResult;
84a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman    if (!EvaluateComplex(E, ComplexResult, Info))
85a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman      return false;
86a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman    if (ComplexResult.isComplexFloat()) {
87a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman      Result = !ComplexResult.getComplexFloatReal().isZero() ||
88a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman               !ComplexResult.getComplexFloatImag().isZero();
89a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman    } else {
90a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman      Result = ComplexResult.getComplexIntReal().getBoolValue() ||
91a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman               ComplexResult.getComplexIntImag().getBoolValue();
92a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman    }
93a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman    return true;
944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
954efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
964efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return false;
974efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
99a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbarstatic APSInt HandleFloatToIntCast(QualType DestType, QualType SrcType,
100a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                   APFloat &Value, ASTContext &Ctx) {
101a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  unsigned DestWidth = Ctx.getIntWidth(DestType);
102a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  // Determine whether we are converting to unsigned or signed.
103a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  bool DestSigned = DestType->isSignedIntegerType();
104a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
105a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  // FIXME: Warning for overflow.
106a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  uint64_t Space[4];
107a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  bool ignored;
108a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  (void)Value.convertToInteger(Space, DestWidth, DestSigned,
109a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                               llvm::APFloat::rmTowardZero, &ignored);
110a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  return APSInt(llvm::APInt(DestWidth, 4, Space), !DestSigned);
111a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar}
112a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
113a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbarstatic APFloat HandleFloatToFloatCast(QualType DestType, QualType SrcType,
114a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                      APFloat &Value, ASTContext &Ctx) {
115a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  bool ignored;
116a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  APFloat Result = Value;
117a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  Result.convert(Ctx.getFloatTypeSemantics(DestType),
118a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                 APFloat::rmNearestTiesToEven, &ignored);
119a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  return Result;
120a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar}
121a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
122a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbarstatic APSInt HandleIntToIntCast(QualType DestType, QualType SrcType,
123a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                 APSInt &Value, ASTContext &Ctx) {
124a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  unsigned DestWidth = Ctx.getIntWidth(DestType);
125a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  APSInt Result = Value;
126a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  // Figure out if this is a truncate, extend or noop cast.
127a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  // If the input is signed, do a sign extend, noop, or truncate.
128a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  Result.extOrTrunc(DestWidth);
129a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  Result.setIsUnsigned(DestType->isUnsignedIntegerType());
130a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  return Result;
131a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar}
132a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
133a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbarstatic APFloat HandleIntToFloatCast(QualType DestType, QualType SrcType,
134a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                    APSInt &Value, ASTContext &Ctx) {
135a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
136a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  APFloat Result(Ctx.getFloatTypeSemantics(DestType), 1);
137a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  Result.convertFromAPInt(Value, Value.isSigned(),
138a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                          APFloat::rmNearestTiesToEven);
139a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  return Result;
140a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar}
141a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1424efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
1434efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// LValue Evaluation
1444efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
1454efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmannamespace {
1464efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanclass VISIBILITY_HIDDEN LValueExprEvaluator
1474efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  : public StmtVisitor<LValueExprEvaluator, APValue> {
1484efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  EvalInfo &Info;
1494efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanpublic:
1504efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1514efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  LValueExprEvaluator(EvalInfo &info) : Info(info) {}
1524efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitStmt(Stmt *S) {
1544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return APValue();
1554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
1564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1574efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
15835873c49adad211ff466e34342a52665742794f5Anders Carlsson  APValue VisitDeclRefExpr(DeclRefExpr *E);
1593aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff  APValue VisitBlockExpr(BlockExpr *E);
1604efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitPredefinedExpr(PredefinedExpr *E) { return APValue(E, 0); }
1614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
1624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitMemberExpr(MemberExpr *E);
1634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitStringLiteral(StringLiteral *E) { return APValue(E, 0); }
164eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner  APValue VisitObjCEncodeExpr(ObjCEncodeExpr *E) { return APValue(E, 0); }
1653068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  APValue VisitArraySubscriptExpr(ArraySubscriptExpr *E);
166e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman  APValue VisitUnaryDeref(UnaryOperator *E);
167ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  APValue VisitUnaryExtension(const UnaryOperator *E)
168ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman    { return Visit(E->getSubExpr()); }
169ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  APValue VisitChooseExpr(const ChooseExpr *E)
170ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman    { return Visit(E->getChosenSubExpr(Info.Ctx)); }
171ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  // FIXME: Missing: __real__, __imag__
1724efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman};
1734efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} // end anonymous namespace
1744efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1754efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool EvaluateLValue(const Expr* E, APValue& Result, EvalInfo &Info) {
1764efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  Result = LValueExprEvaluator(Info).Visit(const_cast<Expr*>(E));
1774efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return Result.isLValue();
1784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
1794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
18035873c49adad211ff466e34342a52665742794f5Anders CarlssonAPValue LValueExprEvaluator::VisitDeclRefExpr(DeclRefExpr *E)
18150c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman{
18235873c49adad211ff466e34342a52665742794f5Anders Carlsson  if (!E->hasGlobalStorage())
18335873c49adad211ff466e34342a52665742794f5Anders Carlsson    return APValue();
18450c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman
18550c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman  if (isa<FunctionDecl>(E->getDecl())) {
18650c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman    return APValue(E, 0);
18750c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman  } else if (VarDecl* VD = dyn_cast<VarDecl>(E->getDecl())) {
18850c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman    if (!VD->getType()->isReferenceType())
18950c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman      return APValue(E, 0);
19050c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman    if (VD->getInit())
19150c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman      return Visit(VD->getInit());
19250c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman  }
19350c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman
19450c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman  return APValue();
19535873c49adad211ff466e34342a52665742794f5Anders Carlsson}
19635873c49adad211ff466e34342a52665742794f5Anders Carlsson
1973aaa482ea5b8d20b705f6ac8573b539be88d273aSteve NaroffAPValue LValueExprEvaluator::VisitBlockExpr(BlockExpr *E)
1983aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff{
1993aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff  if (E->hasBlockDeclRefExprs())
2003aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff    return APValue();
2013aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff
2023aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff  return APValue(E, 0);
2033aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff}
2043aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff
2054efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue LValueExprEvaluator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
2064efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (E->isFileScope())
2074efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return APValue(E, 0);
2084efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return APValue();
2094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
2104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue LValueExprEvaluator::VisitMemberExpr(MemberExpr *E) {
2124efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue result;
2134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  QualType Ty;
2144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (E->isArrow()) {
2154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!EvaluatePointer(E->getBase(), result, Info))
2164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return APValue();
2174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Ty = E->getBase()->getType()->getAsPointerType()->getPointeeType();
2184efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  } else {
2194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    result = Visit(E->getBase());
2204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (result.isUninit())
2214efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return APValue();
2224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Ty = E->getBase()->getType();
2234efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
2244efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2254efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  RecordDecl *RD = Ty->getAsRecordType()->getDecl();
2264efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD);
22786f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor
22886f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor  FieldDecl *FD = dyn_cast<FieldDecl>(E->getMemberDecl());
22986f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor  if (!FD) // FIXME: deal with other kinds of member expressions
23086f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor    return APValue();
2314efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2324efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  // FIXME: This is linear time.
23344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  unsigned i = 0;
2346ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor  for (RecordDecl::field_iterator Field = RD->field_begin(Info.Ctx),
2356ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor                               FieldEnd = RD->field_end(Info.Ctx);
23644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor       Field != FieldEnd; (void)++Field, ++i) {
23744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor    if (*Field == FD)
2384efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      break;
2394efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
2404efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2414efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  result.setLValue(result.getLValueBase(),
2424efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman                   result.getLValueOffset() + RL.getFieldOffset(i) / 8);
2434efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2444efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return result;
2454efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
2464efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2473068d117951a8df54bae9db039b56201ab10962bAnders CarlssonAPValue LValueExprEvaluator::VisitArraySubscriptExpr(ArraySubscriptExpr *E)
2483068d117951a8df54bae9db039b56201ab10962bAnders Carlsson{
2493068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  APValue Result;
2503068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
2513068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  if (!EvaluatePointer(E->getBase(), Result, Info))
2523068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    return APValue();
2533068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
2543068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  APSInt Index;
2553068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  if (!EvaluateInteger(E->getIdx(), Index, Info))
2563068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    return APValue();
2573068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
2583068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  uint64_t ElementSize = Info.Ctx.getTypeSize(E->getType()) / 8;
2593068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
2603068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  uint64_t Offset = Index.getSExtValue() * ElementSize;
2613068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  Result.setLValue(Result.getLValueBase(),
2623068d117951a8df54bae9db039b56201ab10962bAnders Carlsson                   Result.getLValueOffset() + Offset);
2633068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  return Result;
2643068d117951a8df54bae9db039b56201ab10962bAnders Carlsson}
2654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
266e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli FriedmanAPValue LValueExprEvaluator::VisitUnaryDeref(UnaryOperator *E)
267e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman{
268e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman  APValue Result;
269e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman  if (!EvaluatePointer(E->getSubExpr(), Result, Info))
270e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman    return APValue();
271e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman  return Result;
272e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman}
273e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman
2744efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
275f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Pointer Evaluation
276f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
277f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
278c754aa62643e66ab967ca32ae8b0b3fc419bba25Anders Carlssonnamespace {
2792bad1687fe6f00e10767a691a33b070b151902b6Anders Carlssonclass VISIBILITY_HIDDEN PointerExprEvaluator
2802bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  : public StmtVisitor<PointerExprEvaluator, APValue> {
28187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  EvalInfo &Info;
2822bad1687fe6f00e10767a691a33b070b151902b6Anders Carlssonpublic:
2832bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
28487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  PointerExprEvaluator(EvalInfo &info) : Info(info) {}
285f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
2862bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  APValue VisitStmt(Stmt *S) {
2872bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson    return APValue();
2882bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  }
2892bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
2902bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
2912bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
292650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  APValue VisitBinaryOperator(const BinaryOperator *E);
293650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  APValue VisitCastExpr(const CastExpr* E);
2942217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman  APValue VisitUnaryExtension(const UnaryOperator *E)
2952217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman      { return Visit(E->getSubExpr()); }
2962217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman  APValue VisitUnaryAddrOf(const UnaryOperator *E);
2974efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitObjCStringLiteral(ObjCStringLiteral *E)
2984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      { return APValue(E, 0); }
299f01158941ba4560c63150032073bb231ce38999eEli Friedman  APValue VisitAddrLabelExpr(AddrLabelExpr *E)
300f01158941ba4560c63150032073bb231ce38999eEli Friedman      { return APValue(E, 0); }
3013941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman  APValue VisitCallExpr(CallExpr *E);
302b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump  APValue VisitBlockExpr(BlockExpr *E) {
303b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump    if (!E->hasBlockDeclRefExprs())
304b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump      return APValue(E, 0);
305b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump    return APValue();
306b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump  }
30791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  APValue VisitImplicitValueInitExpr(ImplicitValueInitExpr *E)
30891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      { return APValue((Expr*)0, 0); }
3094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitConditionalOperator(ConditionalOperator *E);
310ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  APValue VisitChooseExpr(ChooseExpr *E)
3116e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl      { return Visit(E->getChosenSubExpr(Info.Ctx)); }
3126e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  APValue VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E)
3136e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl      { return APValue((Expr*)0, 0); }
314ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  // FIXME: Missing: @protocol, @selector
3152bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson};
316f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace
3172bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
31887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluatePointer(const Expr* E, APValue& Result, EvalInfo &Info) {
3198958891f5fa1e593c4519a36b3df427ee019d70bDaniel Dunbar  if (!E->getType()->hasPointerRepresentation())
320f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner    return false;
32187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  Result = PointerExprEvaluator(Info).Visit(const_cast<Expr*>(E));
322f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  return Result.isLValue();
323f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner}
324650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
325f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris LattnerAPValue PointerExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
326650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  if (E->getOpcode() != BinaryOperator::Add &&
327650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson      E->getOpcode() != BinaryOperator::Sub)
328650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    return APValue();
329650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
330650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  const Expr *PExp = E->getLHS();
331650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  const Expr *IExp = E->getRHS();
332650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  if (IExp->getType()->isPointerType())
333f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner    std::swap(PExp, IExp);
334650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
335650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  APValue ResultLValue;
33687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  if (!EvaluatePointer(PExp, ResultLValue, Info))
337650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    return APValue();
338f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
339650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  llvm::APSInt AdditionalOffset(32);
34087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  if (!EvaluateInteger(IExp, AdditionalOffset, Info))
341650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    return APValue();
342650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
3434efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  QualType PointeeType = PExp->getType()->getAsPointerType()->getPointeeType();
3444d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson  uint64_t SizeOfPointee;
3454d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson
3464d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson  // Explicitly handle GNU void* and function pointer arithmetic extensions.
3474d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson  if (PointeeType->isVoidType() || PointeeType->isFunctionType())
3484d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson    SizeOfPointee = 1;
3494d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson  else
3504d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson    SizeOfPointee = Info.Ctx.getTypeSize(PointeeType) / 8;
3514efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
352650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  uint64_t Offset = ResultLValue.getLValueOffset();
3534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
354650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  if (E->getOpcode() == BinaryOperator::Add)
3554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Offset += AdditionalOffset.getLimitedValue() * SizeOfPointee;
356650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  else
3574efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Offset -= AdditionalOffset.getLimitedValue() * SizeOfPointee;
3584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
359650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  return APValue(ResultLValue.getLValueBase(), Offset);
360650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson}
3614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
3622217c87bdc5ab357046a5453bdb06f469c41024eEli FriedmanAPValue PointerExprEvaluator::VisitUnaryAddrOf(const UnaryOperator *E) {
3632217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman  APValue result;
3642217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman  if (EvaluateLValue(E->getSubExpr(), result, Info))
3652217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman    return result;
3664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return APValue();
3674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
368d407a7619904c81d38b41a9ee850de413105084bAnders Carlsson
369650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
370b542afe02d317411d53b3541946f9f2a8f509a11Chris LattnerAPValue PointerExprEvaluator::VisitCastExpr(const CastExpr* E) {
371650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  const Expr* SubExpr = E->getSubExpr();
372650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
373650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson   // Check for pointer->pointer cast
374650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  if (SubExpr->getType()->isPointerType()) {
375650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    APValue Result;
37687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner    if (EvaluatePointer(SubExpr, Result, Info))
377650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson      return Result;
378f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner    return APValue();
379650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  }
380650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
381d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman  if (SubExpr->getType()->isIntegralType()) {
38269ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar    APValue Result;
38369ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar    if (!EvaluateIntegerOrLValue(SubExpr, Result, Info))
38469ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar      return APValue();
38569ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar
38669ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar    if (Result.isInt()) {
38769ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar      Result.getInt().extOrTrunc((unsigned)Info.Ctx.getTypeSize(E->getType()));
38869ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar      return APValue(0, Result.getInt().getZExtValue());
389650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    }
39069ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar
39169ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar    // Cast is of an lvalue, no need to change value.
39269ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar    return Result;
393650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  }
3944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
3954efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (SubExpr->getType()->isFunctionType() ||
3963aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff      SubExpr->getType()->isBlockPointerType() ||
3974efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      SubExpr->getType()->isArrayType()) {
3984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APValue Result;
3994efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (EvaluateLValue(SubExpr, Result, Info))
4004efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return Result;
4014efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return APValue();
4024efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
4034efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
404650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  return APValue();
405650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson}
406650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
4073941b18b8e441c8c466efecd557de60b9a32d10bEli FriedmanAPValue PointerExprEvaluator::VisitCallExpr(CallExpr *E) {
4083c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  if (E->isBuiltinCall(Info.Ctx) ==
4093c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor        Builtin::BI__builtin___CFStringMakeConstantString)
4103941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman    return APValue(E, 0);
4113941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman  return APValue();
4123941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman}
4133941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman
4144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue PointerExprEvaluator::VisitConditionalOperator(ConditionalOperator *E) {
4154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  bool BoolResult;
4164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (!HandleConversionToBool(E->getCond(), BoolResult, Info))
4174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return APValue();
4184efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
4194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  Expr* EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr();
4204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
4214efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue Result;
4224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (EvaluatePointer(EvalExpr, Result, Info))
4234efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return Result;
4244efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return APValue();
4254efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
426f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
427f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
42859b5da6d853b4368b984700315adf7b37de05764Nate Begeman// Vector Evaluation
42959b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===//
43059b5da6d853b4368b984700315adf7b37de05764Nate Begeman
43159b5da6d853b4368b984700315adf7b37de05764Nate Begemannamespace {
43259b5da6d853b4368b984700315adf7b37de05764Nate Begeman  class VISIBILITY_HIDDEN VectorExprEvaluator
43359b5da6d853b4368b984700315adf7b37de05764Nate Begeman  : public StmtVisitor<VectorExprEvaluator, APValue> {
43459b5da6d853b4368b984700315adf7b37de05764Nate Begeman    EvalInfo &Info;
43591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    APValue GetZeroVector(QualType VecType);
43659b5da6d853b4368b984700315adf7b37de05764Nate Begeman  public:
43759b5da6d853b4368b984700315adf7b37de05764Nate Begeman
43859b5da6d853b4368b984700315adf7b37de05764Nate Begeman    VectorExprEvaluator(EvalInfo &info) : Info(info) {}
43959b5da6d853b4368b984700315adf7b37de05764Nate Begeman
44059b5da6d853b4368b984700315adf7b37de05764Nate Begeman    APValue VisitStmt(Stmt *S) {
44159b5da6d853b4368b984700315adf7b37de05764Nate Begeman      return APValue();
44259b5da6d853b4368b984700315adf7b37de05764Nate Begeman    }
44359b5da6d853b4368b984700315adf7b37de05764Nate Begeman
44491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    APValue VisitParenExpr(ParenExpr *E)
44591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman        { return Visit(E->getSubExpr()); }
44691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    APValue VisitUnaryExtension(const UnaryOperator *E)
44791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      { return Visit(E->getSubExpr()); }
44891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    APValue VisitUnaryPlus(const UnaryOperator *E)
44991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      { return Visit(E->getSubExpr()); }
45091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    APValue VisitUnaryReal(const UnaryOperator *E)
45191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      { return Visit(E->getSubExpr()); }
45291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    APValue VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E)
45391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      { return GetZeroVector(E->getType()); }
45459b5da6d853b4368b984700315adf7b37de05764Nate Begeman    APValue VisitCastExpr(const CastExpr* E);
45559b5da6d853b4368b984700315adf7b37de05764Nate Begeman    APValue VisitCompoundLiteralExpr(const CompoundLiteralExpr *E);
45659b5da6d853b4368b984700315adf7b37de05764Nate Begeman    APValue VisitInitListExpr(const InitListExpr *E);
45791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    APValue VisitConditionalOperator(const ConditionalOperator *E);
458ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman    APValue VisitChooseExpr(const ChooseExpr *E)
459ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman      { return Visit(E->getChosenSubExpr(Info.Ctx)); }
46091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    APValue VisitUnaryImag(const UnaryOperator *E);
46191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    // FIXME: Missing: unary -, unary ~, binary add/sub/mul/div,
4622217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman    //                 binary comparisons, binary and/or/xor,
46391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    //                 shufflevector, ExtVectorElementExpr
46491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    //        (Note that these require implementing conversions
46591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    //         between vector types.)
46659b5da6d853b4368b984700315adf7b37de05764Nate Begeman  };
46759b5da6d853b4368b984700315adf7b37de05764Nate Begeman} // end anonymous namespace
46859b5da6d853b4368b984700315adf7b37de05764Nate Begeman
46959b5da6d853b4368b984700315adf7b37de05764Nate Begemanstatic bool EvaluateVector(const Expr* E, APValue& Result, EvalInfo &Info) {
47059b5da6d853b4368b984700315adf7b37de05764Nate Begeman  if (!E->getType()->isVectorType())
47159b5da6d853b4368b984700315adf7b37de05764Nate Begeman    return false;
47259b5da6d853b4368b984700315adf7b37de05764Nate Begeman  Result = VectorExprEvaluator(Info).Visit(const_cast<Expr*>(E));
47359b5da6d853b4368b984700315adf7b37de05764Nate Begeman  return !Result.isUninit();
47459b5da6d853b4368b984700315adf7b37de05764Nate Begeman}
47559b5da6d853b4368b984700315adf7b37de05764Nate Begeman
47659b5da6d853b4368b984700315adf7b37de05764Nate BegemanAPValue VectorExprEvaluator::VisitCastExpr(const CastExpr* E) {
47759b5da6d853b4368b984700315adf7b37de05764Nate Begeman  const Expr* SE = E->getSubExpr();
47859b5da6d853b4368b984700315adf7b37de05764Nate Begeman
47959b5da6d853b4368b984700315adf7b37de05764Nate Begeman  // Check for vector->vector bitcast.
48059b5da6d853b4368b984700315adf7b37de05764Nate Begeman  if (SE->getType()->isVectorType())
48159b5da6d853b4368b984700315adf7b37de05764Nate Begeman    return this->Visit(const_cast<Expr*>(SE));
48259b5da6d853b4368b984700315adf7b37de05764Nate Begeman
48359b5da6d853b4368b984700315adf7b37de05764Nate Begeman  return APValue();
48459b5da6d853b4368b984700315adf7b37de05764Nate Begeman}
48559b5da6d853b4368b984700315adf7b37de05764Nate Begeman
48659b5da6d853b4368b984700315adf7b37de05764Nate BegemanAPValue
48759b5da6d853b4368b984700315adf7b37de05764Nate BegemanVectorExprEvaluator::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) {
48859b5da6d853b4368b984700315adf7b37de05764Nate Begeman  return this->Visit(const_cast<Expr*>(E->getInitializer()));
48959b5da6d853b4368b984700315adf7b37de05764Nate Begeman}
49059b5da6d853b4368b984700315adf7b37de05764Nate Begeman
49159b5da6d853b4368b984700315adf7b37de05764Nate BegemanAPValue
49259b5da6d853b4368b984700315adf7b37de05764Nate BegemanVectorExprEvaluator::VisitInitListExpr(const InitListExpr *E) {
49359b5da6d853b4368b984700315adf7b37de05764Nate Begeman  const VectorType *VT = E->getType()->getAsVectorType();
49459b5da6d853b4368b984700315adf7b37de05764Nate Begeman  unsigned NumInits = E->getNumInits();
49591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  unsigned NumElements = VT->getNumElements();
49659b5da6d853b4368b984700315adf7b37de05764Nate Begeman
49759b5da6d853b4368b984700315adf7b37de05764Nate Begeman  QualType EltTy = VT->getElementType();
49859b5da6d853b4368b984700315adf7b37de05764Nate Begeman  llvm::SmallVector<APValue, 4> Elements;
49959b5da6d853b4368b984700315adf7b37de05764Nate Begeman
50091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  for (unsigned i = 0; i < NumElements; i++) {
50159b5da6d853b4368b984700315adf7b37de05764Nate Begeman    if (EltTy->isIntegerType()) {
50259b5da6d853b4368b984700315adf7b37de05764Nate Begeman      llvm::APSInt sInt(32);
50391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      if (i < NumInits) {
50491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman        if (!EvaluateInteger(E->getInit(i), sInt, Info))
50591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman          return APValue();
50691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      } else {
50791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman        sInt = Info.Ctx.MakeIntValue(0, EltTy);
50891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      }
50959b5da6d853b4368b984700315adf7b37de05764Nate Begeman      Elements.push_back(APValue(sInt));
51059b5da6d853b4368b984700315adf7b37de05764Nate Begeman    } else {
51159b5da6d853b4368b984700315adf7b37de05764Nate Begeman      llvm::APFloat f(0.0);
51291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      if (i < NumInits) {
51391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman        if (!EvaluateFloat(E->getInit(i), f, Info))
51491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman          return APValue();
51591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      } else {
51691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman        f = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy));
51791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      }
51859b5da6d853b4368b984700315adf7b37de05764Nate Begeman      Elements.push_back(APValue(f));
51959b5da6d853b4368b984700315adf7b37de05764Nate Begeman    }
52059b5da6d853b4368b984700315adf7b37de05764Nate Begeman  }
52159b5da6d853b4368b984700315adf7b37de05764Nate Begeman  return APValue(&Elements[0], Elements.size());
52259b5da6d853b4368b984700315adf7b37de05764Nate Begeman}
52359b5da6d853b4368b984700315adf7b37de05764Nate Begeman
52491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli FriedmanAPValue
52591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli FriedmanVectorExprEvaluator::GetZeroVector(QualType T) {
52691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  const VectorType *VT = T->getAsVectorType();
52791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  QualType EltTy = VT->getElementType();
52891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  APValue ZeroElement;
52991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  if (EltTy->isIntegerType())
53091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    ZeroElement = APValue(Info.Ctx.MakeIntValue(0, EltTy));
53191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  else
53291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    ZeroElement =
53391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman        APValue(APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy)));
53491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman
53591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  llvm::SmallVector<APValue, 4> Elements(VT->getNumElements(), ZeroElement);
53691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  return APValue(&Elements[0], Elements.size());
53791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman}
53891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman
53991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli FriedmanAPValue VectorExprEvaluator::VisitConditionalOperator(const ConditionalOperator *E) {
54091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  bool BoolResult;
54191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  if (!HandleConversionToBool(E->getCond(), BoolResult, Info))
54291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    return APValue();
54391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman
54491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  Expr* EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr();
54591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman
54691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  APValue Result;
54791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  if (EvaluateVector(EvalExpr, Result, Info))
54891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    return Result;
54991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  return APValue();
55091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman}
55191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman
55291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli FriedmanAPValue VectorExprEvaluator::VisitUnaryImag(const UnaryOperator *E) {
55391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  if (!E->getSubExpr()->isEvaluatable(Info.Ctx))
55491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    Info.EvalResult.HasSideEffects = true;
55591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  return GetZeroVector(E->getType());
55691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman}
55791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman
55859b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===//
559f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Integer Evaluation
560f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
561f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
562f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnernamespace {
563f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerclass VISIBILITY_HIDDEN IntExprEvaluator
564b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  : public StmtVisitor<IntExprEvaluator, bool> {
56587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  EvalInfo &Info;
56630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  APValue &Result;
567f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerpublic:
56830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  IntExprEvaluator(EvalInfo &info, APValue &result)
56987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner    : Info(info), Result(result) {}
570f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
5713f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  bool Success(const llvm::APSInt &SI, const Expr *E) {
5724fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar    assert(E->getType()->isIntegralType() && "Invalid evaluation result.");
57330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    assert(SI.isSigned() == E->getType()->isSignedIntegerType() &&
5743f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar           "Invalid evaluation result.");
57530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    assert(SI.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) &&
5763f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar           "Invalid evaluation result.");
57730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    Result = APValue(SI);
5783f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    return true;
5793f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  }
5803f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar
581131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  bool Success(const llvm::APInt &I, const Expr *E) {
5824fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar    assert(E->getType()->isIntegralType() && "Invalid evaluation result.");
58330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    assert(I.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) &&
5843f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar           "Invalid evaluation result.");
58530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    Result = APValue(APSInt(I));
58630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    Result.getInt().setIsUnsigned(E->getType()->isUnsignedIntegerType());
587131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return true;
588131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  }
589131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar
590131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  bool Success(uint64_t Value, const Expr *E) {
5914fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar    assert(E->getType()->isIntegralType() && "Invalid evaluation result.");
59230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    Result = APValue(Info.Ctx.MakeIntValue(Value, E->getType()));
593131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return true;
594131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  }
595131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar
59682206e267ce6cc709797127616f64672d255b310Anders Carlsson  bool Error(SourceLocation L, diag::kind D, const Expr *E) {
59732fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    // Take the first error.
59854da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson    if (Info.EvalResult.Diag == 0) {
59954da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson      Info.EvalResult.DiagLoc = L;
60054da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson      Info.EvalResult.Diag = D;
60182206e267ce6cc709797127616f64672d255b310Anders Carlsson      Info.EvalResult.DiagExpr = E;
60232fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    }
60354176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    return false;
6047a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner  }
6057a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner
606f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  //===--------------------------------------------------------------------===//
607f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  //                            Visitor Methods
608f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  //===--------------------------------------------------------------------===//
60932fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner
61032fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner  bool VisitStmt(Stmt *) {
61132fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    assert(0 && "This should be called on integers, stmts are not integers");
61232fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    return false;
61332fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner  }
6147a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner
61532fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner  bool VisitExpr(Expr *E) {
6160e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
617f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  }
618f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
619b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
620f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
6214c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitIntegerLiteral(const IntegerLiteral *E) {
622131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(E->getValue(), E);
6234c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  }
6244c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitCharacterLiteral(const CharacterLiteral *E) {
625131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(E->getValue(), E);
6264c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  }
6274c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitTypesCompatibleExpr(const TypesCompatibleExpr *E) {
628ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    // Per gcc docs "this built-in function ignores top level
629ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    // qualifiers".  We need to use the canonical version to properly
630ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    // be able to strip CRV qualifiers from the type.
631ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    QualType T0 = Info.Ctx.getCanonicalType(E->getArgType1());
632ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    QualType T1 = Info.Ctx.getCanonicalType(E->getArgType2());
633131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(Info.Ctx.typesAreCompatible(T0.getUnqualifiedType(),
634131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                                               T1.getUnqualifiedType()),
635131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                   E);
6364c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  }
6374c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitDeclRefExpr(const DeclRefExpr *E);
6384c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitCallExpr(const CallExpr *E);
639b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  bool VisitBinaryOperator(const BinaryOperator *E);
640b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  bool VisitUnaryOperator(const UnaryOperator *E);
641ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes  bool VisitConditionalOperator(const ConditionalOperator *E);
642f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
643a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  bool VisitCastExpr(CastExpr* E);
6440518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  bool VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E);
6450518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl
6463068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  bool VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) {
647131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(E->getValue(), E);
6483068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  }
6493068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
6503f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson  bool VisitGNUNullExpr(const GNUNullExpr *E) {
651131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(0, E);
6523f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson  }
6533f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson
6543068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  bool VisitCXXZeroInitValueExpr(const CXXZeroInitValueExpr *E) {
655131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(0, E);
6563068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  }
6573068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
658664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman  bool VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) {
659664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman    return Success(0, E);
660664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman  }
661664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman
66264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  bool VisitUnaryTypeTraitExpr(const UnaryTypeTraitExpr *E) {
663131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(E->EvaluateTrait(), E);
66464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  }
66564b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl
666ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  bool VisitChooseExpr(const ChooseExpr *E) {
667ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman    return Visit(E->getChosenSubExpr(Info.Ctx));
668ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  }
669ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman
670722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  bool VisitUnaryReal(const UnaryOperator *E);
671664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman  bool VisitUnaryImag(const UnaryOperator *E);
672664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman
673fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattnerprivate:
674af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  unsigned GetAlignOfExpr(const Expr *E);
675af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  unsigned GetAlignOfType(QualType T);
676664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman  // FIXME: Missing: array subscript of vector, member of vector
677f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner};
678f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace
679f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
68069ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbarstatic bool EvaluateIntegerOrLValue(const Expr* E, APValue &Result, EvalInfo &Info) {
6813f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  if (!E->getType()->isIntegralType())
6823f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    return false;
68330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar
68469ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar  return IntExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E));
68569ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar}
68669ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar
68769ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbarstatic bool EvaluateInteger(const Expr* E, APSInt &Result, EvalInfo &Info) {
68830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  APValue Val;
68969ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar  if (!EvaluateIntegerOrLValue(E, Val, Info) || !Val.isInt())
69030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return false;
69130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  Result = Val.getInt();
69230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  return true;
693f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner}
694f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
6954c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattnerbool IntExprEvaluator::VisitDeclRefExpr(const DeclRefExpr *E) {
6964c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  // Enums are integer constant exprs.
6974c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  if (const EnumConstantDecl *D = dyn_cast<EnumConstantDecl>(E->getDecl())) {
698e9a0f43927041e2bcc89140c338dfae207ad3c3bEli Friedman    // FIXME: This is an ugly hack around the fact that enums don't set their
6993f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    // signedness consistently; see PR3173.
7003f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    APSInt SI = D->getInitVal();
7013f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    SI.setIsUnsigned(!E->getType()->isSignedIntegerType());
7023f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    // FIXME: This is an ugly hack around the fact that enums don't
7033f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    // set their width (!?!) consistently; see PR3173.
7043f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    SI.extOrTrunc(Info.Ctx.getIntWidth(E->getType()));
7053f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    return Success(SI, E);
7064c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  }
707b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl
708b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl  // In C++, const, non-volatile integers initialized with ICEs are ICEs.
709e1646da3bb0fe97b372e5fe8cefc537b22048fc4Eli Friedman  // In C, they can also be folded, although they are not ICEs.
710e1646da3bb0fe97b372e5fe8cefc537b22048fc4Eli Friedman  if (E->getType().getCVRQualifiers() == QualType::Const) {
711b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl    if (const VarDecl *D = dyn_cast<VarDecl>(E->getDecl())) {
71278d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor      if (APValue *V = D->getEvaluatedValue())
71378d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor        return Success(V->getInt(), E);
71478d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor      if (const Expr *Init = D->getInit()) {
71578d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor        if (Visit(const_cast<Expr*>(Init))) {
71678d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor          // Cache the evaluated value in the variable declaration.
71778d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor          D->setEvaluatedValue(Info.Ctx, Result);
71878d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor          return true;
71978d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor        }
72078d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor
72178d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor        return false;
72278d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor      }
723b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl    }
724b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl  }
725b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl
7264c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  // Otherwise, random variable references are not constants.
7270e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson  return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
7284c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner}
7294c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner
730a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way
731a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// as GCC.
732a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattnerstatic int EvaluateBuiltinClassifyType(const CallExpr *E) {
733a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  // The following enum mimics the values returned by GCC.
7347c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  // FIXME: Does GCC differ between lvalue and rvalue references here?
735a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  enum gcc_type_class {
736a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    no_type_class = -1,
737a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    void_type_class, integer_type_class, char_type_class,
738a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    enumeral_type_class, boolean_type_class,
739a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    pointer_type_class, reference_type_class, offset_type_class,
740a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    real_type_class, complex_type_class,
741a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    function_type_class, method_type_class,
742a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    record_type_class, union_type_class,
743a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    array_type_class, string_type_class,
744a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    lang_type_class
745a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  };
746a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner
747a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  // If no argument was supplied, default to "no_type_class". This isn't
748a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  // ideal, however it is what gcc does.
749a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  if (E->getNumArgs() == 0)
750a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return no_type_class;
751a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner
752a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  QualType ArgTy = E->getArg(0)->getType();
753a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  if (ArgTy->isVoidType())
754a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return void_type_class;
755a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isEnumeralType())
756a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return enumeral_type_class;
757a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isBooleanType())
758a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return boolean_type_class;
759a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isCharType())
760a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return string_type_class; // gcc doesn't appear to use char_type_class
761a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isIntegerType())
762a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return integer_type_class;
763a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isPointerType())
764a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return pointer_type_class;
765a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isReferenceType())
766a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return reference_type_class;
767a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isRealType())
768a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return real_type_class;
769a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isComplexType())
770a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return complex_type_class;
771a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isFunctionType())
772a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return function_type_class;
773a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isStructureType())
774a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return record_type_class;
775a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isUnionType())
776a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return union_type_class;
777a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isArrayType())
778a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return array_type_class;
779a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isUnionType())
780a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return union_type_class;
781a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else  // FIXME: offset_type_class, method_type_class, & lang_type_class?
782a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    assert(0 && "CallExpr::isBuiltinClassifyType(): unimplemented type");
783a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  return -1;
784a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner}
785a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner
7864c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattnerbool IntExprEvaluator::VisitCallExpr(const CallExpr *E) {
7873c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  switch (E->isBuiltinCall(Info.Ctx)) {
788019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  default:
7890e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
790019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_classify_type:
791131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(EvaluateBuiltinClassifyType(E), E);
792019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner
7934bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson  case Builtin::BI__builtin_constant_p:
794019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner    // __builtin_constant_p always has one operand: it returns true if that
795019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner    // operand can be folded, false otherwise.
796131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(E->getArg(0)->isEvaluatable(Info.Ctx), E);
797019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  }
7984c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner}
799f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
800b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
801a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  if (E->getOpcode() == BinaryOperator::Comma) {
802027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson    if (!Visit(E->getRHS()))
803027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson      return false;
8044fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson
80533ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman    // If we can't evaluate the LHS, it might have side effects;
80633ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman    // conservatively mark it.
80733ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman    if (!E->getLHS()->isEvaluatable(Info.Ctx))
80833ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman      Info.EvalResult.HasSideEffects = true;
809c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner
810027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson    return true;
811a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  }
812a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
813a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  if (E->isLogicalOp()) {
814a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // These need to be handled specially because the operands aren't
815a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // necessarily integral
816fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson    bool lhsResult, rhsResult;
81751fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson
818fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson    if (HandleConversionToBool(E->getLHS(), lhsResult, Info)) {
81951fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson      // We were able to evaluate the LHS, see if we can get away with not
82051fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson      // evaluating the RHS: 0 && X -> 0, 1 || X -> 1
82133ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman      if (lhsResult == (E->getOpcode() == BinaryOperator::LOr))
8223f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar        return Success(lhsResult, E);
823a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
824fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson      if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) {
8254bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        if (E->getOpcode() == BinaryOperator::LOr)
826131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar          return Success(lhsResult || rhsResult, E);
8274bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        else
828131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar          return Success(lhsResult && rhsResult, E);
8294bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson      }
8304bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson    } else {
831fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson      if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) {
8324bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        // We can't evaluate the LHS; however, sometimes the result
8334bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        // is determined by the RHS: X && 0 -> 0, X || 1 -> 1.
834fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson        if (rhsResult == (E->getOpcode() == BinaryOperator::LOr) ||
835fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson            !rhsResult == (E->getOpcode() == BinaryOperator::LAnd)) {
836131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar          // Since we weren't able to evaluate the left hand side, it
837fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson          // must have had side effects.
838fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson          Info.EvalResult.HasSideEffects = true;
839131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar
840131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar          return Success(rhsResult, E);
8414bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        }
8424bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson      }
843a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    }
844a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
845a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    return false;
846c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner  }
84754176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner
848286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  QualType LHSTy = E->getLHS()->getType();
849286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  QualType RHSTy = E->getRHS()->getType();
8504087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
8514087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar  if (LHSTy->isAnyComplexType()) {
8524087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    assert(RHSTy->isAnyComplexType() && "Invalid comparison");
8534087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    APValue LHS, RHS;
8544087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
8554087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    if (!EvaluateComplex(E->getLHS(), LHS, Info))
8564087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      return false;
8574087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
8584087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    if (!EvaluateComplex(E->getRHS(), RHS, Info))
8594087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      return false;
8604087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
8614087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    if (LHS.isComplexFloat()) {
8624087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      APFloat::cmpResult CR_r =
8634087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar        LHS.getComplexFloatReal().compare(RHS.getComplexFloatReal());
8644087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      APFloat::cmpResult CR_i =
8654087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar        LHS.getComplexFloatImag().compare(RHS.getComplexFloatImag());
8664087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
8674087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      if (E->getOpcode() == BinaryOperator::EQ)
868131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        return Success((CR_r == APFloat::cmpEqual &&
869131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                        CR_i == APFloat::cmpEqual), E);
870131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      else {
871131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        assert(E->getOpcode() == BinaryOperator::NE &&
872131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar               "Invalid complex comparison.");
873131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        return Success(((CR_r == APFloat::cmpGreaterThan ||
874131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                         CR_r == APFloat::cmpLessThan) &&
875131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                        (CR_i == APFloat::cmpGreaterThan ||
876131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                         CR_i == APFloat::cmpLessThan)), E);
877131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      }
8784087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    } else {
8794087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      if (E->getOpcode() == BinaryOperator::EQ)
880131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        return Success((LHS.getComplexIntReal() == RHS.getComplexIntReal() &&
881131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                        LHS.getComplexIntImag() == RHS.getComplexIntImag()), E);
882131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      else {
883131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        assert(E->getOpcode() == BinaryOperator::NE &&
884131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar               "Invalid compex comparison.");
885131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        return Success((LHS.getComplexIntReal() != RHS.getComplexIntReal() ||
886131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                        LHS.getComplexIntImag() != RHS.getComplexIntImag()), E);
887131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      }
8884087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    }
8894087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar  }
890286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson
891286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  if (LHSTy->isRealFloatingType() &&
892286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      RHSTy->isRealFloatingType()) {
893286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    APFloat RHS(0.0), LHS(0.0);
894286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson
895286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    if (!EvaluateFloat(E->getRHS(), RHS, Info))
896286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      return false;
897286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson
898286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    if (!EvaluateFloat(E->getLHS(), LHS, Info))
899286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      return false;
900286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson
901286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    APFloat::cmpResult CR = LHS.compare(RHS);
902529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson
903286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    switch (E->getOpcode()) {
904286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    default:
905286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      assert(0 && "Invalid binary operator!");
906286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::LT:
907131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpLessThan, E);
908286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::GT:
909131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpGreaterThan, E);
910286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::LE:
911131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpLessThan || CR == APFloat::cmpEqual, E);
912286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::GE:
913131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpGreaterThan || CR == APFloat::cmpEqual,
914131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                     E);
915286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::EQ:
916131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpEqual, E);
917286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::NE:
918131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpGreaterThan
919131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                     || CR == APFloat::cmpLessThan, E);
920286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    }
921286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  }
922286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson
923ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman  if (LHSTy->isPointerType() && RHSTy->isPointerType()) {
924ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman    if (E->getOpcode() == BinaryOperator::Sub || E->isEqualityOp()) {
9253068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      APValue LHSValue;
9263068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      if (!EvaluatePointer(E->getLHS(), LHSValue, Info))
9273068d117951a8df54bae9db039b56201ab10962bAnders Carlsson        return false;
928a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
9293068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      APValue RHSValue;
9303068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      if (!EvaluatePointer(E->getRHS(), RHSValue, Info))
9313068d117951a8df54bae9db039b56201ab10962bAnders Carlsson        return false;
932a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
933a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman      // Reject any bases; this is conservative, but good enough for
934a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman      // common uses
9353068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      if (LHSValue.getLValueBase() || RHSValue.getLValueBase())
9363068d117951a8df54bae9db039b56201ab10962bAnders Carlsson        return false;
937a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
938ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman      if (E->getOpcode() == BinaryOperator::Sub) {
939ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman        const QualType Type = E->getLHS()->getType();
940ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman        const QualType ElementType = Type->getAsPointerType()->getPointeeType();
9413068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
942ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman        uint64_t D = LHSValue.getLValueOffset() - RHSValue.getLValueOffset();
943ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman        D /= Info.Ctx.getTypeSize(ElementType) / 8;
944a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
945ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman        return Success(D, E);
946ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman      }
947ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman      bool Result;
948ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman      if (E->getOpcode() == BinaryOperator::EQ) {
949ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman        Result = LHSValue.getLValueOffset() == RHSValue.getLValueOffset();
950267c0ab1b9a15768f3f15abbfc40ce344751c78bEli Friedman      } else {
951ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman        Result = LHSValue.getLValueOffset() != RHSValue.getLValueOffset();
952ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman      }
953ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman      return Success(Result, E);
9543068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    }
9553068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  }
956286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  if (!LHSTy->isIntegralType() ||
957286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      !RHSTy->isIntegralType()) {
958a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // We can't continue from here for non-integral types, and they
959a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // could potentially confuse the following operations.
960a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    return false;
961a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  }
962a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
963a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  // The LHS of a constant expr is always evaluated and needed.
96430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  if (!Visit(E->getLHS()))
965a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    return false; // error in subexpression.
966d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman
96742edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  APValue RHSVal;
96842edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  if (!EvaluateIntegerOrLValue(E->getRHS(), RHSVal, Info))
96930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return false;
97042edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman
97142edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  // Handle cases like (unsigned long)&a + 4.
97242edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  if (E->isAdditiveOp() && Result.isLValue() && RHSVal.isInt()) {
97342edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman    uint64_t offset = Result.getLValueOffset();
97442edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman    if (E->getOpcode() == BinaryOperator::Add)
97542edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman      offset += RHSVal.getInt().getZExtValue();
97642edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman    else
97742edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman      offset -= RHSVal.getInt().getZExtValue();
97842edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman    Result = APValue(Result.getLValueBase(), offset);
97942edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman    return true;
98042edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  }
98142edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman
98242edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  // Handle cases like 4 + (unsigned long)&a
98342edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  if (E->getOpcode() == BinaryOperator::Add &&
98442edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman        RHSVal.isLValue() && Result.isInt()) {
98542edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman    uint64_t offset = RHSVal.getLValueOffset();
98642edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman    offset += Result.getInt().getZExtValue();
98742edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman    Result = APValue(RHSVal.getLValueBase(), offset);
98842edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman    return true;
98942edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  }
99042edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman
99142edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  // All the following cases expect both operands to be an integer
99242edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  if (!Result.isInt() || !RHSVal.isInt())
993b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner    return false;
994a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
99542edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  APSInt& RHS = RHSVal.getInt();
99642edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman
997a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  switch (E->getOpcode()) {
99832fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner  default:
9990e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E);
100030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::Mul: return Success(Result.getInt() * RHS, E);
100130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::Add: return Success(Result.getInt() + RHS, E);
100230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::Sub: return Success(Result.getInt() - RHS, E);
100330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::And: return Success(Result.getInt() & RHS, E);
100430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::Xor: return Success(Result.getInt() ^ RHS, E);
100530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::Or:  return Success(Result.getInt() | RHS, E);
1006a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  case BinaryOperator::Div:
100754176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    if (RHS == 0)
10080e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson      return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E);
100930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return Success(Result.getInt() / RHS, E);
1010a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  case BinaryOperator::Rem:
101154176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    if (RHS == 0)
10120e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson      return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E);
101330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return Success(Result.getInt() % RHS, E);
10143f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  case BinaryOperator::Shl: {
101554176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    // FIXME: Warn about out of range shift amounts!
101630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    unsigned SA =
101730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar      (unsigned) RHS.getLimitedValue(Result.getInt().getBitWidth()-1);
101830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return Success(Result.getInt() << SA, E);
10193f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  }
10203f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  case BinaryOperator::Shr: {
102130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    unsigned SA =
102230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar      (unsigned) RHS.getLimitedValue(Result.getInt().getBitWidth()-1);
102330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return Success(Result.getInt() >> SA, E);
10243f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  }
1025b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner
102630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::LT: return Success(Result.getInt() < RHS, E);
102730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::GT: return Success(Result.getInt() > RHS, E);
102830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::LE: return Success(Result.getInt() <= RHS, E);
102930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::GE: return Success(Result.getInt() >= RHS, E);
103030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::EQ: return Success(Result.getInt() == RHS, E);
103130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::NE: return Success(Result.getInt() != RHS, E);
1032b11e77836dd0867955c5abf32baf1c3e6c7f81e1Eli Friedman  }
1033a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson}
1034a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson
1035ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopesbool IntExprEvaluator::VisitConditionalOperator(const ConditionalOperator *E) {
1036a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes  bool Cond;
1037a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes  if (!HandleConversionToBool(E->getCond(), Cond, Info))
1038ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes    return false;
1039ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes
1040a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes  return Visit(Cond ? E->getTrueExpr() : E->getFalseExpr());
1041ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes}
1042ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes
1043af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattnerunsigned IntExprEvaluator::GetAlignOfType(QualType T) {
1044e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  // Get information about the alignment.
1045e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  unsigned CharSize = Info.Ctx.Target.getCharWidth();
104618857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor
104718857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor  // FIXME: Why do we ask for the preferred alignment?
104818857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor  return Info.Ctx.getPreferredTypeAlign(T.getTypePtr()) / CharSize;
1049e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner}
1050e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
1051af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattnerunsigned IntExprEvaluator::GetAlignOfExpr(const Expr *E) {
1052af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  E = E->IgnoreParens();
1053af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner
1054af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  // alignof decl is always accepted, even if it doesn't make sense: we default
1055af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  // to 1 in those cases.
1056af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
1057b7d0844c887a72064b624dc6df12cbe1441f69d0Daniel Dunbar    return Info.Ctx.getDeclAlignInBytes(DRE->getDecl());
1058a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
1059af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  if (const MemberExpr *ME = dyn_cast<MemberExpr>(E))
1060b7d0844c887a72064b624dc6df12cbe1441f69d0Daniel Dunbar    return Info.Ctx.getDeclAlignInBytes(ME->getMemberDecl());
1061af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner
1062e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  return GetAlignOfType(E->getType());
1063e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner}
1064e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
1065e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
10660518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// VisitSizeAlignOfExpr - Evaluate a sizeof or alignof with a result as the
10670518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// expression's type.
10680518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redlbool IntExprEvaluator::VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E) {
10690518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  QualType DstTy = E->getType();
1070fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner
1071e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  // Handle alignof separately.
1072e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  if (!E->isSizeOf()) {
1073e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner    if (E->isArgumentType())
1074131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(GetAlignOfType(E->getArgumentType()), E);
1075e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner    else
1076131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(GetAlignOfExpr(E->getArgumentExpr()), E);
1077e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  }
1078a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
10790518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  QualType SrcTy = E->getTypeOfArgument();
10800518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl
1081131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  // sizeof(void), __alignof__(void), sizeof(function) = 1 as a gcc
1082131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  // extension.
1083131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  if (SrcTy->isVoidType() || SrcTy->isFunctionType())
1084131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(1, E);
1085a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
1086fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner  // sizeof(vla) is not a constantexpr: C99 6.5.3.4p2.
1087e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  if (!SrcTy->isConstantSizeType())
1088fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner    return false;
1089f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman
1090e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  // Get information about the size.
109124cbfb96f09318f59dc73eaaf4909a79788ec5acDaniel Dunbar  unsigned BitWidth = Info.Ctx.getTypeSize(SrcTy);
1092ff89666e8d143b52f2bb5d2c3a108125d523abb7Daniel Dunbar  return Success(BitWidth / Info.Ctx.Target.getCharWidth(), E);
1093fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner}
1094fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner
1095b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
10964c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  // Special case unary operators that do not need their subexpression
10974c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  // evaluated.  offsetof/sizeof/alignof are all special.
109835183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman  if (E->isOffsetOfOp()) {
109935183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman    // The AST for offsetof is defined in such a way that we can just
110035183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman    // directly Evaluate it as an l-value.
110135183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman    APValue LV;
110235183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman    if (!EvaluateLValue(E->getSubExpr(), LV, Info))
110335183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman      return false;
110435183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman    if (LV.getLValueBase())
110535183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman      return false;
110635183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman    return Success(LV.getLValueOffset(), E);
110735183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman  }
1108a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
1109a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  if (E->getOpcode() == UnaryOperator::LNot) {
1110a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // LNot's operand isn't necessarily an integer, so we handle it specially.
1111a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    bool bres;
1112a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    if (!HandleConversionToBool(E->getSubExpr(), bres, Info))
1113a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman      return false;
1114131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(!bres, E);
1115a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  }
1116a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
11174fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar  // Only handle integral operations...
11184fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar  if (!E->getSubExpr()->getType()->isIntegralType())
11194fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar    return false;
11204fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar
112187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  // Get the operand value into 'Result'.
112287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  if (!Visit(E->getSubExpr()))
112375a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    return false;
1124a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson
112575a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  switch (E->getOpcode()) {
11264c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  default:
112775a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    // Address, indirect, pre/post inc/dec, etc are not valid constant exprs.
112875a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    // See C99 6.6p3.
11290e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E);
113075a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  case UnaryOperator::Extension:
11314c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    // FIXME: Should extension allow i-c-e extension expressions in its scope?
11324c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    // If so, we could clear the diagnostic ID.
11333f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    return true;
113475a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  case UnaryOperator::Plus:
11354c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    // The result is always just the subexpr.
11363f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    return true;
113775a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  case UnaryOperator::Minus:
113830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    if (!Result.isInt()) return false;
113930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return Success(-Result.getInt(), E);
114075a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  case UnaryOperator::Not:
114130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    if (!Result.isInt()) return false;
114230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return Success(~Result.getInt(), E);
114306a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson  }
1144a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson}
1145a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson
1146732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// HandleCast - This is used to evaluate implicit or explicit casts where the
1147732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// result type is integer.
1148a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbarbool IntExprEvaluator::VisitCastExpr(CastExpr *E) {
114982206e267ce6cc709797127616f64672d255b310Anders Carlsson  Expr *SubExpr = E->getSubExpr();
115082206e267ce6cc709797127616f64672d255b310Anders Carlsson  QualType DestType = E->getType();
1151b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar  QualType SrcType = SubExpr->getType();
115282206e267ce6cc709797127616f64672d255b310Anders Carlsson
11534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (DestType->isBooleanType()) {
11544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    bool BoolResult;
11554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!HandleConversionToBool(SubExpr, BoolResult, Info))
11564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
1157131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(BoolResult, E);
11584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
11594efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1160a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  // Handle simple integer->integer casts.
1161b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar  if (SrcType->isIntegralType()) {
1162732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner    if (!Visit(SubExpr))
1163b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner      return false;
1164a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1165be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    if (!Result.isInt()) {
1166be26570e3faa009bdcefedfaf04473e518940520Eli Friedman      // Only allow casts of lvalues if they are lossless.
1167be26570e3faa009bdcefedfaf04473e518940520Eli Friedman      return Info.Ctx.getTypeSize(DestType) == Info.Ctx.getTypeSize(SrcType);
1168be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    }
116930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar
1170dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar    return Success(HandleIntToIntCast(DestType, SrcType,
117130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar                                      Result.getInt(), Info.Ctx), E);
1172732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner  }
1173732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner
1174732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner  // FIXME: Clean this up!
1175b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar  if (SrcType->isPointerType()) {
1176a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson    APValue LV;
117787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner    if (!EvaluatePointer(SubExpr, LV, Info))
1178b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner      return false;
11794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1180dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar    if (LV.getLValueBase()) {
1181dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar      // Only allow based lvalue casts if they are lossless.
1182dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar      if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(SrcType))
1183dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar        return false;
1184dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar
1185dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar      Result = LV;
1186dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar      return true;
1187dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar    }
11884efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1189dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar    APSInt AsInt = Info.Ctx.MakeIntValue(LV.getLValueOffset(), SrcType);
1190dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar    return Success(HandleIntToIntCast(DestType, SrcType, AsInt, Info.Ctx), E);
11912bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  }
11924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1193be26570e3faa009bdcefedfaf04473e518940520Eli Friedman  if (SrcType->isArrayType() || SrcType->isFunctionType()) {
1194be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    // This handles double-conversion cases, where there's both
1195be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    // an l-value promotion and an implicit conversion to int.
1196be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    APValue LV;
1197be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    if (!EvaluateLValue(SubExpr, LV, Info))
1198be26570e3faa009bdcefedfaf04473e518940520Eli Friedman      return false;
1199be26570e3faa009bdcefedfaf04473e518940520Eli Friedman
1200be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(Info.Ctx.VoidPtrTy))
1201be26570e3faa009bdcefedfaf04473e518940520Eli Friedman      return false;
1202be26570e3faa009bdcefedfaf04473e518940520Eli Friedman
1203be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    Result = LV;
1204be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    return true;
1205be26570e3faa009bdcefedfaf04473e518940520Eli Friedman  }
1206be26570e3faa009bdcefedfaf04473e518940520Eli Friedman
12071725f683432715e5afe34d476024bd6f16eac3fcEli Friedman  if (SrcType->isAnyComplexType()) {
12081725f683432715e5afe34d476024bd6f16eac3fcEli Friedman    APValue C;
12091725f683432715e5afe34d476024bd6f16eac3fcEli Friedman    if (!EvaluateComplex(SubExpr, C, Info))
12101725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      return false;
12111725f683432715e5afe34d476024bd6f16eac3fcEli Friedman    if (C.isComplexFloat())
12121725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      return Success(HandleFloatToIntCast(DestType, SrcType,
12131725f683432715e5afe34d476024bd6f16eac3fcEli Friedman                                          C.getComplexFloatReal(), Info.Ctx),
12141725f683432715e5afe34d476024bd6f16eac3fcEli Friedman                     E);
12151725f683432715e5afe34d476024bd6f16eac3fcEli Friedman    else
12161725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      return Success(HandleIntToIntCast(DestType, SrcType,
12171725f683432715e5afe34d476024bd6f16eac3fcEli Friedman                                        C.getComplexIntReal(), Info.Ctx), E);
12181725f683432715e5afe34d476024bd6f16eac3fcEli Friedman  }
12192217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman  // FIXME: Handle vectors
12202217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman
1221b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar  if (!SrcType->isRealFloatingType())
12220e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
1223732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner
1224d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  APFloat F(0.0);
1225d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  if (!EvaluateFloat(SubExpr, F, Info))
12260e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
1227732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner
1228b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar  return Success(HandleFloatToIntCast(DestType, SrcType, F, Info.Ctx), E);
1229a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson}
12302bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
1231722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedmanbool IntExprEvaluator::VisitUnaryReal(const UnaryOperator *E) {
1232722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  if (E->getSubExpr()->getType()->isAnyComplexType()) {
1233722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman    APValue LV;
1234722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman    if (!EvaluateComplex(E->getSubExpr(), LV, Info) || !LV.isComplexInt())
1235722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman      return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
1236722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman    return Success(LV.getComplexIntReal(), E);
1237722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  }
1238722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman
1239722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  return Visit(E->getSubExpr());
1240722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman}
1241722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman
1242664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedmanbool IntExprEvaluator::VisitUnaryImag(const UnaryOperator *E) {
1243722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  if (E->getSubExpr()->getType()->isComplexIntegerType()) {
1244722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman    APValue LV;
1245722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman    if (!EvaluateComplex(E->getSubExpr(), LV, Info) || !LV.isComplexInt())
1246722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman      return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
1247722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman    return Success(LV.getComplexIntImag(), E);
1248722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  }
1249722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman
1250664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman  if (!E->getSubExpr()->isEvaluatable(Info.Ctx))
1251664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman    Info.EvalResult.HasSideEffects = true;
1252664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman  return Success(0, E);
1253664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman}
1254664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman
1255f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
1256d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman// Float Evaluation
1257d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===//
1258d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1259d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmannamespace {
1260d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanclass VISIBILITY_HIDDEN FloatExprEvaluator
1261d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  : public StmtVisitor<FloatExprEvaluator, bool> {
1262d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  EvalInfo &Info;
1263d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  APFloat &Result;
1264d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanpublic:
1265d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  FloatExprEvaluator(EvalInfo &info, APFloat &result)
1266d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    : Info(info), Result(result) {}
1267d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1268d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitStmt(Stmt *S) {
1269d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return false;
1270d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  }
1271d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1272d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
1273019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  bool VisitCallExpr(const CallExpr *E);
1274d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
12755db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  bool VisitUnaryOperator(const UnaryOperator *E);
1276d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitBinaryOperator(const BinaryOperator *E);
1277d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitFloatingLiteral(const FloatingLiteral *E);
12784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  bool VisitCastExpr(CastExpr *E);
12794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  bool VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E);
12802217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman
1281ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  bool VisitChooseExpr(const ChooseExpr *E)
1282ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman    { return Visit(E->getChosenSubExpr(Info.Ctx)); }
1283ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  bool VisitUnaryExtension(const UnaryOperator *E)
1284ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman    { return Visit(E->getSubExpr()); }
1285ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman
1286ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  // FIXME: Missing: __real__/__imag__, array subscript of vector,
1287ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  //                 member of vector, ImplicitValueInitExpr,
12882217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman  //                 conditional ?:, comma
1289d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman};
1290d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} // end anonymous namespace
1291d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1292d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr* E, APFloat& Result, EvalInfo &Info) {
1293d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  return FloatExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E));
1294d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}
1295d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1296019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattnerbool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) {
12973c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  switch (E->isBuiltinCall(Info.Ctx)) {
129834a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner  default: return false;
1299019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_huge_val:
1300019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_huge_valf:
1301019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_huge_vall:
1302019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_inf:
1303019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_inff:
13047cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar  case Builtin::BI__builtin_infl: {
13057cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar    const llvm::fltSemantics &Sem =
13067cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar      Info.Ctx.getFloatTypeSemantics(E->getType());
130734a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner    Result = llvm::APFloat::getInf(Sem);
130834a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner    return true;
13097cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar  }
13109e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner
13119e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner  case Builtin::BI__builtin_nan:
13129e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner  case Builtin::BI__builtin_nanf:
13139e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner  case Builtin::BI__builtin_nanl:
13149e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    // If this is __builtin_nan("") turn this into a simple nan, otherwise we
13159e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    // can't constant fold it.
13169e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    if (const StringLiteral *S =
13179e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner        dyn_cast<StringLiteral>(E->getArg(0)->IgnoreParenCasts())) {
13189e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner      if (!S->isWide() && S->getByteLength() == 0) { // empty string.
13197cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar        const llvm::fltSemantics &Sem =
13207cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar          Info.Ctx.getFloatTypeSemantics(E->getType());
13219e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner        Result = llvm::APFloat::getNaN(Sem);
13229e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner        return true;
13239e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner      }
13249e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    }
13259e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    return false;
13265db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar
13275db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_fabs:
13285db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_fabsf:
13295db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_fabsl:
13305db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    if (!EvaluateFloat(E->getArg(0), Result, Info))
13315db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar      return false;
13325db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar
13335db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    if (Result.isNegative())
13345db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar      Result.changeSign();
13355db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
13365db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar
13375db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_copysign:
13385db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_copysignf:
13395db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_copysignl: {
13405db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    APFloat RHS(0.);
13415db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    if (!EvaluateFloat(E->getArg(0), Result, Info) ||
13425db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar        !EvaluateFloat(E->getArg(1), RHS, Info))
13435db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar      return false;
13445db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    Result.copySign(RHS);
13455db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
13465db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  }
1347019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  }
1348019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner}
1349019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner
13505db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbarbool FloatExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
1351a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes  if (E->getOpcode() == UnaryOperator::Deref)
1352a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes    return false;
1353a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes
13545db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  if (!EvaluateFloat(E->getSubExpr(), Result, Info))
13555db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return false;
13565db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar
13575db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  switch (E->getOpcode()) {
13585db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  default: return false;
13595db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case UnaryOperator::Plus:
13605db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
13615db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case UnaryOperator::Minus:
13625db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    Result.changeSign();
13635db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
13645db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  }
13655db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar}
1366019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner
1367d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
1368d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  // FIXME: Diagnostics?  I really don't understand how the warnings
1369d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  // and errors are supposed to work.
13705db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  APFloat RHS(0.0);
1371d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  if (!EvaluateFloat(E->getLHS(), Result, Info))
1372d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return false;
1373d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  if (!EvaluateFloat(E->getRHS(), RHS, Info))
1374d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return false;
1375d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1376d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  switch (E->getOpcode()) {
1377d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  default: return false;
1378d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  case BinaryOperator::Mul:
1379d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.multiply(RHS, APFloat::rmNearestTiesToEven);
1380d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
1381d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  case BinaryOperator::Add:
1382d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.add(RHS, APFloat::rmNearestTiesToEven);
1383d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
1384d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  case BinaryOperator::Sub:
1385d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.subtract(RHS, APFloat::rmNearestTiesToEven);
1386d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
1387d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  case BinaryOperator::Div:
1388d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.divide(RHS, APFloat::rmNearestTiesToEven);
1389d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
1390d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  }
1391d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}
1392d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1393d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitFloatingLiteral(const FloatingLiteral *E) {
1394d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  Result = E->getValue();
1395d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  return true;
1396d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}
1397d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
13984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanbool FloatExprEvaluator::VisitCastExpr(CastExpr *E) {
13994efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  Expr* SubExpr = E->getSubExpr();
140059b5da6d853b4368b984700315adf7b37de05764Nate Begeman
14014efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (SubExpr->getType()->isIntegralType()) {
14024efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APSInt IntResult;
14033f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    if (!EvaluateInteger(SubExpr, IntResult, Info))
14044efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
1405a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    Result = HandleIntToFloatCast(E->getType(), SubExpr->getType(),
1406a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                  IntResult, Info.Ctx);
14074efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
14084efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
14094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (SubExpr->getType()->isRealFloatingType()) {
14104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!Visit(SubExpr))
14114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
1412a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    Result = HandleFloatToFloatCast(E->getType(), SubExpr->getType(),
1413a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                    Result, Info.Ctx);
14144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
14154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
14162217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman  // FIXME: Handle complex types
14174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
14184efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return false;
14194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
14204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
14214efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanbool FloatExprEvaluator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
14224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  Result = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(E->getType()));
14234efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return true;
14244efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
14254efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1426d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===//
1427a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar// Complex Evaluation (for float and integer)
14289ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===//
14299ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
14309ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonnamespace {
1431a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbarclass VISIBILITY_HIDDEN ComplexExprEvaluator
1432a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  : public StmtVisitor<ComplexExprEvaluator, APValue> {
14339ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  EvalInfo &Info;
14349ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
14359ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonpublic:
1436a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  ComplexExprEvaluator(EvalInfo &info) : Info(info) {}
14379ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
14389ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  //===--------------------------------------------------------------------===//
14399ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  //                            Visitor Methods
14409ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  //===--------------------------------------------------------------------===//
14419ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
14429ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  APValue VisitStmt(Stmt *S) {
14439ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson    return APValue();
14449ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  }
14459ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
14469ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
14479ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
14489ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  APValue VisitImaginaryLiteral(ImaginaryLiteral *E) {
1449a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    Expr* SubExpr = E->getSubExpr();
1450a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
1451a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    if (SubExpr->getType()->isRealFloatingType()) {
1452a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      APFloat Result(0.0);
1453a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
1454a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      if (!EvaluateFloat(SubExpr, Result, Info))
1455a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar        return APValue();
14569ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
14573f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      return APValue(APFloat(Result.getSemantics(), APFloat::fcZero, false),
1458a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                     Result);
1459a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    } else {
1460a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      assert(SubExpr->getType()->isIntegerType() &&
1461a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar             "Unexpected imaginary literal.");
1462a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
1463a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      llvm::APSInt Result;
1464a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      if (!EvaluateInteger(SubExpr, Result, Info))
1465a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar        return APValue();
1466a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
1467a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      llvm::APSInt Zero(Result.getBitWidth(), !Result.isSigned());
1468a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Zero = 0;
1469a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      return APValue(Zero, Result);
1470a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    }
14719ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  }
14729ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
1473ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  APValue VisitCastExpr(CastExpr *E) {
1474ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    Expr* SubExpr = E->getSubExpr();
1475a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    QualType EltType = E->getType()->getAsComplexType()->getElementType();
1476a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    QualType SubType = SubExpr->getType();
1477ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1478a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    if (SubType->isRealFloatingType()) {
1479ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson      APFloat Result(0.0);
14801725f683432715e5afe34d476024bd6f16eac3fcEli Friedman
1481ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson      if (!EvaluateFloat(SubExpr, Result, Info))
1482ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson        return APValue();
14831725f683432715e5afe34d476024bd6f16eac3fcEli Friedman
14841725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      if (EltType->isRealFloatingType()) {
14851725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        Result = HandleFloatToFloatCast(EltType, SubType, Result, Info.Ctx);
14861725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        return APValue(Result,
14871725f683432715e5afe34d476024bd6f16eac3fcEli Friedman                       APFloat(Result.getSemantics(), APFloat::fcZero, false));
14881725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      } else {
14891725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        llvm::APSInt IResult;
14901725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        IResult = HandleFloatToIntCast(EltType, SubType, Result, Info.Ctx);
14911725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        llvm::APSInt Zero(IResult.getBitWidth(), !IResult.isSigned());
14921725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        Zero = 0;
14931725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        return APValue(IResult, Zero);
14941725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      }
1495a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    } else if (SubType->isIntegerType()) {
1496a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      APSInt Result;
14971725f683432715e5afe34d476024bd6f16eac3fcEli Friedman
1498a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      if (!EvaluateInteger(SubExpr, Result, Info))
1499a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar        return APValue();
1500a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
15011725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      if (EltType->isRealFloatingType()) {
15021725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        APFloat FResult =
15031725f683432715e5afe34d476024bd6f16eac3fcEli Friedman            HandleIntToFloatCast(EltType, SubType, Result, Info.Ctx);
15041725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        return APValue(FResult,
15051725f683432715e5afe34d476024bd6f16eac3fcEli Friedman                       APFloat(FResult.getSemantics(), APFloat::fcZero, false));
15061725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      } else {
15071725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        Result = HandleIntToIntCast(EltType, SubType, Result, Info.Ctx);
15081725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        llvm::APSInt Zero(Result.getBitWidth(), !Result.isSigned());
15091725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        Zero = 0;
15101725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        return APValue(Result, Zero);
15111725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      }
1512a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    } else if (const ComplexType *CT = SubType->getAsComplexType()) {
1513a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      APValue Src;
15141725f683432715e5afe34d476024bd6f16eac3fcEli Friedman
1515a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      if (!EvaluateComplex(SubExpr, Src, Info))
1516a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        return APValue();
1517a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1518a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      QualType SrcType = CT->getElementType();
1519a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1520a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      if (Src.isComplexFloat()) {
1521a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        if (EltType->isRealFloatingType()) {
1522a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar          return APValue(HandleFloatToFloatCast(EltType, SrcType,
1523a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                                Src.getComplexFloatReal(),
1524a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                                Info.Ctx),
1525a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                         HandleFloatToFloatCast(EltType, SrcType,
1526a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                                Src.getComplexFloatImag(),
1527a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                                Info.Ctx));
1528a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        } else {
1529a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar          return APValue(HandleFloatToIntCast(EltType, SrcType,
1530a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Src.getComplexFloatReal(),
1531a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Info.Ctx),
1532a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                         HandleFloatToIntCast(EltType, SrcType,
1533a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Src.getComplexFloatImag(),
1534a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Info.Ctx));
1535a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        }
1536a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      } else {
1537a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        assert(Src.isComplexInt() && "Invalid evaluate result.");
1538a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        if (EltType->isRealFloatingType()) {
1539a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar          return APValue(HandleIntToFloatCast(EltType, SrcType,
1540a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Src.getComplexIntReal(),
1541a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Info.Ctx),
1542a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                         HandleIntToFloatCast(EltType, SrcType,
1543a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Src.getComplexIntImag(),
1544a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Info.Ctx));
1545a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        } else {
1546a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar          return APValue(HandleIntToIntCast(EltType, SrcType,
1547a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                            Src.getComplexIntReal(),
1548a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                            Info.Ctx),
1549a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                         HandleIntToIntCast(EltType, SrcType,
1550a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                            Src.getComplexIntImag(),
1551a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                            Info.Ctx));
1552a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        }
1553a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      }
1554ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    }
1555ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1556ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    // FIXME: Handle more casts.
1557ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    return APValue();
1558ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  }
1559ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1560ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  APValue VisitBinaryOperator(const BinaryOperator *E);
1561ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  APValue VisitChooseExpr(const ChooseExpr *E)
1562ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman    { return Visit(E->getChosenSubExpr(Info.Ctx)); }
1563ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  APValue VisitUnaryExtension(const UnaryOperator *E)
1564ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman    { return Visit(E->getSubExpr()); }
1565ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  // FIXME Missing: unary +/-/~, binary div, ImplicitValueInitExpr,
15662217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman  //                conditional ?:, comma
15679ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson};
15689ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson} // end anonymous namespace
15699ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
1570a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbarstatic bool EvaluateComplex(const Expr *E, APValue &Result, EvalInfo &Info)
15719ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson{
1572a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  Result = ComplexExprEvaluator(Info).Visit(const_cast<Expr*>(E));
1573a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  assert((!Result.isComplexFloat() ||
1574a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar          (&Result.getComplexFloatReal().getSemantics() ==
1575a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar           &Result.getComplexFloatImag().getSemantics())) &&
1576a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar         "Invalid complex evaluation.");
1577a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  return Result.isComplexFloat() || Result.isComplexInt();
15789ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson}
15799ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
1580a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel DunbarAPValue ComplexExprEvaluator::VisitBinaryOperator(const BinaryOperator *E)
1581ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson{
1582ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  APValue Result, RHS;
1583ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1584a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  if (!EvaluateComplex(E->getLHS(), Result, Info))
1585ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    return APValue();
1586ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1587a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  if (!EvaluateComplex(E->getRHS(), RHS, Info))
1588ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    return APValue();
1589a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
15903f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar  assert(Result.isComplexFloat() == RHS.isComplexFloat() &&
15913f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar         "Invalid operands to binary operator.");
1592ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  switch (E->getOpcode()) {
1593ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  default: return APValue();
1594ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  case BinaryOperator::Add:
1595a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    if (Result.isComplexFloat()) {
1596a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatReal().add(RHS.getComplexFloatReal(),
1597a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                       APFloat::rmNearestTiesToEven);
1598a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatImag().add(RHS.getComplexFloatImag(),
1599a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                       APFloat::rmNearestTiesToEven);
1600a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    } else {
1601a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntReal() += RHS.getComplexIntReal();
1602a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntImag() += RHS.getComplexIntImag();
1603a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    }
16043f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    break;
1605ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  case BinaryOperator::Sub:
1606a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    if (Result.isComplexFloat()) {
1607a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatReal().subtract(RHS.getComplexFloatReal(),
1608a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                            APFloat::rmNearestTiesToEven);
1609a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatImag().subtract(RHS.getComplexFloatImag(),
1610a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                            APFloat::rmNearestTiesToEven);
1611a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    } else {
1612a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntReal() -= RHS.getComplexIntReal();
1613a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntImag() -= RHS.getComplexIntImag();
1614a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    }
16153f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    break;
16163f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar  case BinaryOperator::Mul:
16173f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    if (Result.isComplexFloat()) {
16183f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APValue LHS = Result;
16193f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &LHS_r = LHS.getComplexFloatReal();
16203f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &LHS_i = LHS.getComplexFloatImag();
16213f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &RHS_r = RHS.getComplexFloatReal();
16223f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &RHS_i = RHS.getComplexFloatImag();
16233f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar
16243f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat Tmp = LHS_r;
16253f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven);
16263f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatReal() = Tmp;
16273f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp = LHS_i;
16283f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven);
16293f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatReal().subtract(Tmp, APFloat::rmNearestTiesToEven);
16303f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar
16313f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp = LHS_r;
16323f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven);
16333f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatImag() = Tmp;
16343f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp = LHS_i;
16353f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven);
16363f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatImag().add(Tmp, APFloat::rmNearestTiesToEven);
16373f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    } else {
16383f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APValue LHS = Result;
16393f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexIntReal() =
16403f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar        (LHS.getComplexIntReal() * RHS.getComplexIntReal() -
16413f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar         LHS.getComplexIntImag() * RHS.getComplexIntImag());
16423f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexIntImag() =
16433f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar        (LHS.getComplexIntReal() * RHS.getComplexIntImag() +
16443f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar         LHS.getComplexIntImag() * RHS.getComplexIntReal());
16453f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    }
16463f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    break;
1647ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  }
1648ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1649ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  return Result;
1650ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson}
1651ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
16529ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===//
16536ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner// Top level Expr::Evaluate method.
1654f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
1655f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
16566ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner/// Evaluate - Return true if this is a constant which we can fold using
1657019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// any crazy technique (that has nothing to do with language standards) that
1658019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// we want to.  If this function returns true, it returns the folded constant
1659019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// in Result.
16605b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlssonbool Expr::Evaluate(EvalResult &Result, ASTContext &Ctx) const {
16615b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson  EvalInfo Info(Ctx, Result);
166254da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson
166359b5da6d853b4368b984700315adf7b37de05764Nate Begeman  if (getType()->isVectorType()) {
166459b5da6d853b4368b984700315adf7b37de05764Nate Begeman    if (!EvaluateVector(this, Result.Val, Info))
166559b5da6d853b4368b984700315adf7b37de05764Nate Begeman      return false;
166659b5da6d853b4368b984700315adf7b37de05764Nate Begeman  } else if (getType()->isIntegerType()) {
166730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    if (!IntExprEvaluator(Info, Result.Val).Visit(const_cast<Expr*>(this)))
16686dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
16698958891f5fa1e593c4519a36b3df427ee019d70bDaniel Dunbar  } else if (getType()->hasPointerRepresentation()) {
16705b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson    if (!EvaluatePointer(this, Result.Val, Info))
16716dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
1672d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  } else if (getType()->isRealFloatingType()) {
1673d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    llvm::APFloat f(0.0);
16746dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson    if (!EvaluateFloat(this, f, Info))
16756dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
16766dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson
16775b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson    Result.Val = APValue(f);
1678a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  } else if (getType()->isAnyComplexType()) {
1679a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    if (!EvaluateComplex(this, Result.Val, Info))
16806dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
1681a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  } else
16829d4c157baaada8945671dc98363a40ed00cbd824Anders Carlsson    return false;
16836dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson
16845b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson  return true;
16855b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson}
16865b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson
16871b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlssonbool Expr::EvaluateAsLValue(EvalResult &Result, ASTContext &Ctx) const {
16881b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson  EvalInfo Info(Ctx, Result);
16891b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson
16901b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson  return EvaluateLValue(this, Result.Val, Info) && !Result.HasSideEffects;
16911b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson}
16921b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson
16936ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner/// isEvaluatable - Call Evaluate to see if this expression can be constant
169445b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner/// folded, but discard the result.
169545b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattnerbool Expr::isEvaluatable(ASTContext &Ctx) const {
16964fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson  EvalResult Result;
16974fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson  return Evaluate(Result, Ctx) && !Result.HasSideEffects;
169845b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner}
169951fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson
170051fe996231b1d7199f76e4005ff4c943d5deeecdAnders CarlssonAPSInt Expr::EvaluateAsInt(ASTContext &Ctx) const {
17011c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  EvalResult EvalResult;
17021c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  bool Result = Evaluate(EvalResult, Ctx);
1703f185319f25efd6094870f287030270fad26085baDaniel Dunbar  Result = Result;
170451fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson  assert(Result && "Could not evaluate expression");
17051c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer");
170651fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson
17071c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  return EvalResult.Val.getInt();
170851fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson}
1709