ExprConstant.cpp revision 8b752f10c394b140f9ef89e049cbad1a7676fc25
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"
16199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck#include "clang/AST/CharUnits.h"
1719cc4abea06a9b49e0e16a50d335c064cd723572Anders Carlsson#include "clang/AST/RecordLayout.h"
180fe52e1bcaa69ba127f1bda036f057fec1f478deSeo Sanghyeon#include "clang/AST/StmtVisitor.h"
19500d3297d2a21edeac4d46cbcbe21bc2352c2a28Chris Lattner#include "clang/AST/ASTDiagnostic.h"
201b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner#include "clang/Basic/Builtins.h"
2106a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson#include "clang/Basic/TargetInfo.h"
227462b39a9bccaf4392687831036713f09f9c0681Mike Stump#include "llvm/ADT/SmallString.h"
234572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump#include <cstring>
244572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump
25c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlssonusing namespace clang;
26f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerusing llvm::APSInt;
27d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanusing llvm::APFloat;
28c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson
2987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// EvalInfo - This is a private struct used by the evaluator to capture
3087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// information about a subexpression as it is folded.  It retains information
3187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// about the AST context, but also maintains information about the folded
3287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// expression.
3387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner///
3487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// If an expression could be evaluated, it is still possible it is not a C
3587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// "integer constant expression" or constant expression.  If not, this struct
3687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// captures information about how and why not.
3787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner///
3887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// One bit of information passed *into* the request for constant folding
3987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// indicates whether the subexpression is "evaluated" or not according to C
4087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// rules.  For example, the RHS of (0 && foo()) is not evaluated.  We can
4187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// evaluate the expression regardless of what the RHS is, but C only allows
4287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// certain things in certain situations.
4387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstruct EvalInfo {
4487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  ASTContext &Ctx;
451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4654da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson  /// EvalResult - Contains information about the evaluation.
4754da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson  Expr::EvalResult &EvalResult;
48f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson
49b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman  /// AnyLValue - Stack based LValue results are not discarded.
50b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman  bool AnyLValue;
51b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman
52b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman  EvalInfo(ASTContext &ctx, Expr::EvalResult& evalresult,
53b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman           bool anylvalue = false)
54b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman    : Ctx(ctx), EvalResult(evalresult), AnyLValue(anylvalue) {}
5587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner};
5687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner
5787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner
584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool EvaluateLValue(const Expr *E, APValue &Result, EvalInfo &Info);
5987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluatePointer(const Expr *E, APValue &Result, EvalInfo &Info);
6087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluateInteger(const Expr *E, APSInt  &Result, EvalInfo &Info);
61d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattnerstatic bool EvaluateIntegerOrLValue(const Expr *E, APValue  &Result,
62d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner                                    EvalInfo &Info);
63d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr *E, APFloat &Result, EvalInfo &Info);
64a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbarstatic bool EvaluateComplex(const Expr *E, APValue &Result, EvalInfo &Info);
65f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
66f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// Misc utilities
684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
694efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
705bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedmanstatic bool EvalPointerValueAsBool(APValue& Value, bool& Result) {
715bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman  // FIXME: Is this accurate for all kinds of bases?  If not, what would
725bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman  // the check look like?
73a73058324197b7bdfd19307965954f626e26199dKen Dyck  Result = Value.getLValueBase() || !Value.getLValueOffset().isZero();
745bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman  return true;
755bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman}
765bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman
77cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCallstatic bool HandleConversionToBool(const Expr* E, bool& Result,
78cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall                                   EvalInfo &Info) {
794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (E->getType()->isIntegralType()) {
804efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APSInt IntResult;
814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!EvaluateInteger(E, IntResult, Info))
824efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
834efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Result = IntResult != 0;
844efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  } else if (E->getType()->isRealFloatingType()) {
864efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APFloat FloatResult(0.0);
874efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!EvaluateFloat(E, FloatResult, Info))
884efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
894efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Result = !FloatResult.isZero();
904efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
91a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman  } else if (E->getType()->hasPointerRepresentation()) {
924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APValue PointerResult;
934efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!EvaluatePointer(E, PointerResult, Info))
944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
955bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman    return EvalPointerValueAsBool(PointerResult, Result);
96a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman  } else if (E->getType()->isAnyComplexType()) {
97a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman    APValue ComplexResult;
98a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman    if (!EvaluateComplex(E, ComplexResult, Info))
99a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman      return false;
100a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman    if (ComplexResult.isComplexFloat()) {
101a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman      Result = !ComplexResult.getComplexFloatReal().isZero() ||
102a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman               !ComplexResult.getComplexFloatImag().isZero();
103a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman    } else {
104a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman      Result = ComplexResult.getComplexIntReal().getBoolValue() ||
105a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman               ComplexResult.getComplexIntImag().getBoolValue();
106a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman    }
107a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman    return true;
1084efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
1094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return false;
1114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
1124efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APSInt HandleFloatToIntCast(QualType DestType, QualType SrcType,
114a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                   APFloat &Value, ASTContext &Ctx) {
115a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  unsigned DestWidth = Ctx.getIntWidth(DestType);
116a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  // Determine whether we are converting to unsigned or signed.
117a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  bool DestSigned = DestType->isSignedIntegerType();
1181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
119a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  // FIXME: Warning for overflow.
120a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  uint64_t Space[4];
121a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  bool ignored;
122a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  (void)Value.convertToInteger(Space, DestWidth, DestSigned,
123a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                               llvm::APFloat::rmTowardZero, &ignored);
124a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  return APSInt(llvm::APInt(DestWidth, 4, Space), !DestSigned);
125a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar}
126a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APFloat HandleFloatToFloatCast(QualType DestType, QualType SrcType,
128a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                      APFloat &Value, ASTContext &Ctx) {
129a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  bool ignored;
130a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  APFloat Result = Value;
1311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Result.convert(Ctx.getFloatTypeSemantics(DestType),
132a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                 APFloat::rmNearestTiesToEven, &ignored);
133a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  return Result;
134a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar}
135a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APSInt HandleIntToIntCast(QualType DestType, QualType SrcType,
137a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                 APSInt &Value, ASTContext &Ctx) {
138a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  unsigned DestWidth = Ctx.getIntWidth(DestType);
139a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  APSInt Result = Value;
140a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  // Figure out if this is a truncate, extend or noop cast.
141a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  // If the input is signed, do a sign extend, noop, or truncate.
142a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  Result.extOrTrunc(DestWidth);
143a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  Result.setIsUnsigned(DestType->isUnsignedIntegerType());
144a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  return Result;
145a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar}
146a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APFloat HandleIntToFloatCast(QualType DestType, QualType SrcType,
148a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                    APSInt &Value, ASTContext &Ctx) {
149a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
150a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  APFloat Result(Ctx.getFloatTypeSemantics(DestType), 1);
151a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  Result.convertFromAPInt(Value, Value.isSigned(),
152a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                          APFloat::rmNearestTiesToEven);
153a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  return Result;
154a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar}
155a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
156c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stumpnamespace {
157770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass HasSideEffect
158c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  : public StmtVisitor<HasSideEffect, bool> {
159c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  EvalInfo &Info;
160c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stumppublic:
161c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump
162c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  HasSideEffect(EvalInfo &info) : Info(info) {}
163c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump
164c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  // Unhandled nodes conservatively default to having side effects.
165c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  bool VisitStmt(Stmt *S) {
166c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump    return true;
167c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  }
168c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump
169c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
170c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  bool VisitDeclRefExpr(DeclRefExpr *E) {
171df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump    if (Info.Ctx.getCanonicalType(E->getType()).isVolatileQualified())
172c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump      return true;
173c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump    return false;
174c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  }
175c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  // We don't want to evaluate BlockExprs multiple times, as they generate
176c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  // a ton of code.
177c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  bool VisitBlockExpr(BlockExpr *E) { return true; }
178c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  bool VisitPredefinedExpr(PredefinedExpr *E) { return false; }
179c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  bool VisitCompoundLiteralExpr(CompoundLiteralExpr *E)
180c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump    { return Visit(E->getInitializer()); }
181c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  bool VisitMemberExpr(MemberExpr *E) { return Visit(E->getBase()); }
182c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  bool VisitIntegerLiteral(IntegerLiteral *E) { return false; }
183c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  bool VisitFloatingLiteral(FloatingLiteral *E) { return false; }
184c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  bool VisitStringLiteral(StringLiteral *E) { return false; }
185c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  bool VisitCharacterLiteral(CharacterLiteral *E) { return false; }
186c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  bool VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) { return false; }
187c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  bool VisitArraySubscriptExpr(ArraySubscriptExpr *E)
188980ca220848d27ef55ef4c2d37423461a8ed0da3Mike Stump    { return Visit(E->getLHS()) || Visit(E->getRHS()); }
189c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  bool VisitChooseExpr(ChooseExpr *E)
190c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump    { return Visit(E->getChosenSubExpr(Info.Ctx)); }
191c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  bool VisitCastExpr(CastExpr *E) { return Visit(E->getSubExpr()); }
192c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  bool VisitBinAssign(BinaryOperator *E) { return true; }
1933f0147e161df4725ff15fbb731f4f727afcc229fMike Stump  bool VisitCompoundAssignOperator(BinaryOperator *E) { return true; }
194980ca220848d27ef55ef4c2d37423461a8ed0da3Mike Stump  bool VisitBinaryOperator(BinaryOperator *E)
195980ca220848d27ef55ef4c2d37423461a8ed0da3Mike Stump  { return Visit(E->getLHS()) || Visit(E->getRHS()); }
196c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  bool VisitUnaryPreInc(UnaryOperator *E) { return true; }
197c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  bool VisitUnaryPostInc(UnaryOperator *E) { return true; }
198c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  bool VisitUnaryPreDec(UnaryOperator *E) { return true; }
199c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  bool VisitUnaryPostDec(UnaryOperator *E) { return true; }
200c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  bool VisitUnaryDeref(UnaryOperator *E) {
201df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump    if (Info.Ctx.getCanonicalType(E->getType()).isVolatileQualified())
202c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump      return true;
203980ca220848d27ef55ef4c2d37423461a8ed0da3Mike Stump    return Visit(E->getSubExpr());
204c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  }
205c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  bool VisitUnaryOperator(UnaryOperator *E) { return Visit(E->getSubExpr()); }
206c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump};
207c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump
208c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump} // end anonymous namespace
209c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump
2104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
2114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// LValue Evaluation
2124efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
2134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmannamespace {
214770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass LValueExprEvaluator
2154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  : public StmtVisitor<LValueExprEvaluator, APValue> {
2164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  EvalInfo &Info;
2174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanpublic:
2181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  LValueExprEvaluator(EvalInfo &info) : Info(info) {}
2204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2214efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitStmt(Stmt *S) {
2224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return APValue();
2234efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
2244efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2254efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
22635873c49adad211ff466e34342a52665742794f5Anders Carlsson  APValue VisitDeclRefExpr(DeclRefExpr *E);
227a73058324197b7bdfd19307965954f626e26199dKen Dyck  APValue VisitPredefinedExpr(PredefinedExpr *E) { return APValue(E); }
2284efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
2294efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitMemberExpr(MemberExpr *E);
230a73058324197b7bdfd19307965954f626e26199dKen Dyck  APValue VisitStringLiteral(StringLiteral *E) { return APValue(E); }
231a73058324197b7bdfd19307965954f626e26199dKen Dyck  APValue VisitObjCEncodeExpr(ObjCEncodeExpr *E) { return APValue(E); }
2323068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  APValue VisitArraySubscriptExpr(ArraySubscriptExpr *E);
233e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman  APValue VisitUnaryDeref(UnaryOperator *E);
234ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  APValue VisitUnaryExtension(const UnaryOperator *E)
235ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman    { return Visit(E->getSubExpr()); }
236ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  APValue VisitChooseExpr(const ChooseExpr *E)
237ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman    { return Visit(E->getChosenSubExpr(Info.Ctx)); }
23826bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson
23926bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson  APValue VisitCastExpr(CastExpr *E) {
24026bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson    switch (E->getCastKind()) {
24126bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson    default:
24226bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson      return APValue();
24326bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson
24426bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson    case CastExpr::CK_NoOp:
24526bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson      return Visit(E->getSubExpr());
24626bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson    }
24726bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson  }
248ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  // FIXME: Missing: __real__, __imag__
2494efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman};
2504efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} // end anonymous namespace
2514efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2524efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool EvaluateLValue(const Expr* E, APValue& Result, EvalInfo &Info) {
2534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  Result = LValueExprEvaluator(Info).Visit(const_cast<Expr*>(E));
2544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return Result.isLValue();
2554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
2564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2571eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue LValueExprEvaluator::VisitDeclRefExpr(DeclRefExpr *E) {
25850c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman  if (isa<FunctionDecl>(E->getDecl())) {
259a73058324197b7bdfd19307965954f626e26199dKen Dyck    return APValue(E);
26050c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman  } else if (VarDecl* VD = dyn_cast<VarDecl>(E->getDecl())) {
261b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman    if (!Info.AnyLValue && !VD->hasGlobalStorage())
262d933a0198f3ccce9c73bf2951625315b911d37bfEli Friedman      return APValue();
26350c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman    if (!VD->getType()->isReferenceType())
264a73058324197b7bdfd19307965954f626e26199dKen Dyck      return APValue(E);
265d933a0198f3ccce9c73bf2951625315b911d37bfEli Friedman    // FIXME: Check whether VD might be overridden!
266cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor    const VarDecl *Def = 0;
267cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor    if (const Expr *Init = VD->getDefinition(Def))
268cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor      return Visit(const_cast<Expr *>(Init));
26950c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman  }
27050c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman
27150c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman  return APValue();
27235873c49adad211ff466e34342a52665742794f5Anders Carlsson}
27335873c49adad211ff466e34342a52665742794f5Anders Carlsson
2744efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue LValueExprEvaluator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
275b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman  if (!Info.AnyLValue && !E->isFileScope())
276b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman    return APValue();
277a73058324197b7bdfd19307965954f626e26199dKen Dyck  return APValue(E);
2784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
2794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2804efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue LValueExprEvaluator::VisitMemberExpr(MemberExpr *E) {
2814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue result;
2824efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  QualType Ty;
2834efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (E->isArrow()) {
2844efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!EvaluatePointer(E->getBase(), result, Info))
2854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return APValue();
2866217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek    Ty = E->getBase()->getType()->getAs<PointerType>()->getPointeeType();
2874efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  } else {
2884efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    result = Visit(E->getBase());
2894efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (result.isUninit())
2904efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return APValue();
2914efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Ty = E->getBase()->getType();
2924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
2934efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2946217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek  RecordDecl *RD = Ty->getAs<RecordType>()->getDecl();
2954efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD);
29686f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor
29786f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor  FieldDecl *FD = dyn_cast<FieldDecl>(E->getMemberDecl());
29886f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor  if (!FD) // FIXME: deal with other kinds of member expressions
29986f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor    return APValue();
3002be586108bb401019647791feca19ea03fd477ceEli Friedman
3012be586108bb401019647791feca19ea03fd477ceEli Friedman  if (FD->getType()->isReferenceType())
3022be586108bb401019647791feca19ea03fd477ceEli Friedman    return APValue();
3032be586108bb401019647791feca19ea03fd477ceEli Friedman
3044efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  // FIXME: This is linear time.
30544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  unsigned i = 0;
30617945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis  for (RecordDecl::field_iterator Field = RD->field_begin(),
30717945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis                               FieldEnd = RD->field_end();
30844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor       Field != FieldEnd; (void)++Field, ++i) {
30944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor    if (*Field == FD)
3104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      break;
3114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
3124efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
3134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  result.setLValue(result.getLValueBase(),
314a73058324197b7bdfd19307965954f626e26199dKen Dyck                   result.getLValueOffset() +
315a73058324197b7bdfd19307965954f626e26199dKen Dyck                       CharUnits::fromQuantity(RL.getFieldOffset(i) / 8));
3164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
3174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return result;
3184efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
3194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
3201eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue LValueExprEvaluator::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
3213068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  APValue Result;
3221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3233068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  if (!EvaluatePointer(E->getBase(), Result, Info))
3243068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    return APValue();
3251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3263068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  APSInt Index;
3273068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  if (!EvaluateInteger(E->getIdx(), Index, Info))
3283068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    return APValue();
3293068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
330199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  CharUnits ElementSize = Info.Ctx.getTypeSizeInChars(E->getType());
3313068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
332199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  CharUnits Offset = Index.getSExtValue() * ElementSize;
3331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Result.setLValue(Result.getLValueBase(),
334a73058324197b7bdfd19307965954f626e26199dKen Dyck                   Result.getLValueOffset() + Offset);
3353068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  return Result;
3363068d117951a8df54bae9db039b56201ab10962bAnders Carlsson}
3374efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
3381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue LValueExprEvaluator::VisitUnaryDeref(UnaryOperator *E) {
339e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman  APValue Result;
340e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman  if (!EvaluatePointer(E->getSubExpr(), Result, Info))
341e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman    return APValue();
342e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman  return Result;
343e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman}
344e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman
3454efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
346f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Pointer Evaluation
347f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
348f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
349c754aa62643e66ab967ca32ae8b0b3fc419bba25Anders Carlssonnamespace {
350770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass PointerExprEvaluator
3512bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  : public StmtVisitor<PointerExprEvaluator, APValue> {
35287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  EvalInfo &Info;
3532bad1687fe6f00e10767a691a33b070b151902b6Anders Carlssonpublic:
3541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  PointerExprEvaluator(EvalInfo &info) : Info(info) {}
356f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
3572bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  APValue VisitStmt(Stmt *S) {
3582bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson    return APValue();
3592bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  }
3602bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
3612bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
3622bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
363650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  APValue VisitBinaryOperator(const BinaryOperator *E);
36409a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman  APValue VisitCastExpr(CastExpr* E);
3652217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman  APValue VisitUnaryExtension(const UnaryOperator *E)
3662217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman      { return Visit(E->getSubExpr()); }
3672217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman  APValue VisitUnaryAddrOf(const UnaryOperator *E);
3684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitObjCStringLiteral(ObjCStringLiteral *E)
369a73058324197b7bdfd19307965954f626e26199dKen Dyck      { return APValue(E); }
370f01158941ba4560c63150032073bb231ce38999eEli Friedman  APValue VisitAddrLabelExpr(AddrLabelExpr *E)
371a73058324197b7bdfd19307965954f626e26199dKen Dyck      { return APValue(E); }
3723941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman  APValue VisitCallExpr(CallExpr *E);
373b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump  APValue VisitBlockExpr(BlockExpr *E) {
374b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump    if (!E->hasBlockDeclRefExprs())
375a73058324197b7bdfd19307965954f626e26199dKen Dyck      return APValue(E);
376b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump    return APValue();
377b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump  }
37891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  APValue VisitImplicitValueInitExpr(ImplicitValueInitExpr *E)
379a73058324197b7bdfd19307965954f626e26199dKen Dyck      { return APValue((Expr*)0); }
3804efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitConditionalOperator(ConditionalOperator *E);
381ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  APValue VisitChooseExpr(ChooseExpr *E)
3826e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl      { return Visit(E->getChosenSubExpr(Info.Ctx)); }
3836e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  APValue VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E)
384a73058324197b7bdfd19307965954f626e26199dKen Dyck      { return APValue((Expr*)0); }
385ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  // FIXME: Missing: @protocol, @selector
3862bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson};
387f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace
3882bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
38987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluatePointer(const Expr* E, APValue& Result, EvalInfo &Info) {
3908958891f5fa1e593c4519a36b3df427ee019d70bDaniel Dunbar  if (!E->getType()->hasPointerRepresentation())
391f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner    return false;
39287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  Result = PointerExprEvaluator(Info).Visit(const_cast<Expr*>(E));
393f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  return Result.isLValue();
394f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner}
395650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
396f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris LattnerAPValue PointerExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
397650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  if (E->getOpcode() != BinaryOperator::Add &&
398650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson      E->getOpcode() != BinaryOperator::Sub)
399650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    return APValue();
4001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
401650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  const Expr *PExp = E->getLHS();
402650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  const Expr *IExp = E->getRHS();
403650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  if (IExp->getType()->isPointerType())
404f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner    std::swap(PExp, IExp);
4051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
406650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  APValue ResultLValue;
40787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  if (!EvaluatePointer(PExp, ResultLValue, Info))
408650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    return APValue();
4091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
410650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  llvm::APSInt AdditionalOffset(32);
41187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  if (!EvaluateInteger(IExp, AdditionalOffset, Info))
412650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    return APValue();
413650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
4146217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek  QualType PointeeType = PExp->getType()->getAs<PointerType>()->getPointeeType();
415199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  CharUnits SizeOfPointee;
4161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4174d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson  // Explicitly handle GNU void* and function pointer arithmetic extensions.
4184d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson  if (PointeeType->isVoidType() || PointeeType->isFunctionType())
419199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    SizeOfPointee = CharUnits::One();
4204d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson  else
421199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    SizeOfPointee = Info.Ctx.getTypeSizeInChars(PointeeType);
4224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
423a73058324197b7bdfd19307965954f626e26199dKen Dyck  CharUnits Offset = ResultLValue.getLValueOffset();
4244efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
425650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  if (E->getOpcode() == BinaryOperator::Add)
4264efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Offset += AdditionalOffset.getLimitedValue() * SizeOfPointee;
427650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  else
4284efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Offset -= AdditionalOffset.getLimitedValue() * SizeOfPointee;
4294efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
430a73058324197b7bdfd19307965954f626e26199dKen Dyck  return APValue(ResultLValue.getLValueBase(), Offset);
431650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson}
4324efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
4332217c87bdc5ab357046a5453bdb06f469c41024eEli FriedmanAPValue PointerExprEvaluator::VisitUnaryAddrOf(const UnaryOperator *E) {
4342217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman  APValue result;
4352217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman  if (EvaluateLValue(E->getSubExpr(), result, Info))
4362217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman    return result;
4374efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return APValue();
4384efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
4391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
440650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
44109a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli FriedmanAPValue PointerExprEvaluator::VisitCastExpr(CastExpr* E) {
44209a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman  Expr* SubExpr = E->getSubExpr();
443650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
44409a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman  switch (E->getCastKind()) {
44509a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman  default:
44609a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman    break;
44709a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman
44809a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman  case CastExpr::CK_Unknown: {
44909a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman    // FIXME: The handling for CK_Unknown is ugly/shouldn't be necessary!
45009a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman
45109a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman    // Check for pointer->pointer cast
45209a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman    if (SubExpr->getType()->isPointerType() ||
45309a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman        SubExpr->getType()->isObjCObjectPointerType() ||
45409a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman        SubExpr->getType()->isNullPtrType() ||
45509a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman        SubExpr->getType()->isBlockPointerType())
45609a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman      return Visit(SubExpr);
45709a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman
45809a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman    if (SubExpr->getType()->isIntegralType()) {
45909a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman      APValue Result;
46009a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman      if (!EvaluateIntegerOrLValue(SubExpr, Result, Info))
46109a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman        break;
46209a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman
46309a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman      if (Result.isInt()) {
46409a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman        Result.getInt().extOrTrunc((unsigned)Info.Ctx.getTypeSize(E->getType()));
465a73058324197b7bdfd19307965954f626e26199dKen Dyck        return APValue(0,
466a73058324197b7bdfd19307965954f626e26199dKen Dyck                       CharUnits::fromQuantity(Result.getInt().getZExtValue()));
46709a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman      }
46809a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman
46909a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman      // Cast is of an lvalue, no need to change value.
470650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson      return Result;
47109a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman    }
47209a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman    break;
473650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  }
4741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47509a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman  case CastExpr::CK_NoOp:
47609a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman  case CastExpr::CK_BitCast:
47709a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman  case CastExpr::CK_AnyPointerToObjCPointerCast:
47809a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman  case CastExpr::CK_AnyPointerToBlockPointerCast:
47909a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman    return Visit(SubExpr);
48009a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman
48109a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman  case CastExpr::CK_IntegralToPointer: {
48269ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar    APValue Result;
48369ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar    if (!EvaluateIntegerOrLValue(SubExpr, Result, Info))
48409a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman      break;
48569ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar
48669ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar    if (Result.isInt()) {
48769ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar      Result.getInt().extOrTrunc((unsigned)Info.Ctx.getTypeSize(E->getType()));
488a73058324197b7bdfd19307965954f626e26199dKen Dyck      return APValue(0,
489a73058324197b7bdfd19307965954f626e26199dKen Dyck                     CharUnits::fromQuantity(Result.getInt().getZExtValue()));
490650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    }
4911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
49269ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar    // Cast is of an lvalue, no need to change value.
49369ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar    return Result;
494650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  }
49509a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman  case CastExpr::CK_ArrayToPointerDecay:
49609a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman  case CastExpr::CK_FunctionToPointerDecay: {
4974efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APValue Result;
4984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (EvaluateLValue(SubExpr, Result, Info))
4994efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return Result;
50009a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman    break;
50109a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman  }
5024efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
5034efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
504650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  return APValue();
5051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
506650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
5073941b18b8e441c8c466efecd557de60b9a32d10bEli FriedmanAPValue PointerExprEvaluator::VisitCallExpr(CallExpr *E) {
5081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (E->isBuiltinCall(Info.Ctx) ==
5090d13f6fdbdd6f06e2449b8834dda53334abd399aDavid Chisnall        Builtin::BI__builtin___CFStringMakeConstantString ||
5100d13f6fdbdd6f06e2449b8834dda53334abd399aDavid Chisnall      E->isBuiltinCall(Info.Ctx) ==
5110d13f6fdbdd6f06e2449b8834dda53334abd399aDavid Chisnall        Builtin::BI__builtin___NSStringMakeConstantString)
512a73058324197b7bdfd19307965954f626e26199dKen Dyck    return APValue(E);
5133941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman  return APValue();
5143941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman}
5153941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman
5164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue PointerExprEvaluator::VisitConditionalOperator(ConditionalOperator *E) {
5174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  bool BoolResult;
5184efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (!HandleConversionToBool(E->getCond(), BoolResult, Info))
5194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return APValue();
5204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
5214efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  Expr* EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr();
5224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
5234efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue Result;
5244efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (EvaluatePointer(EvalExpr, Result, Info))
5254efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return Result;
5264efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return APValue();
5274efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
528f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
529f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
53059b5da6d853b4368b984700315adf7b37de05764Nate Begeman// Vector Evaluation
53159b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===//
53259b5da6d853b4368b984700315adf7b37de05764Nate Begeman
53359b5da6d853b4368b984700315adf7b37de05764Nate Begemannamespace {
534770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramer  class VectorExprEvaluator
53559b5da6d853b4368b984700315adf7b37de05764Nate Begeman  : public StmtVisitor<VectorExprEvaluator, APValue> {
53659b5da6d853b4368b984700315adf7b37de05764Nate Begeman    EvalInfo &Info;
53791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    APValue GetZeroVector(QualType VecType);
53859b5da6d853b4368b984700315adf7b37de05764Nate Begeman  public:
5391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
54059b5da6d853b4368b984700315adf7b37de05764Nate Begeman    VectorExprEvaluator(EvalInfo &info) : Info(info) {}
5411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
54259b5da6d853b4368b984700315adf7b37de05764Nate Begeman    APValue VisitStmt(Stmt *S) {
54359b5da6d853b4368b984700315adf7b37de05764Nate Begeman      return APValue();
54459b5da6d853b4368b984700315adf7b37de05764Nate Begeman    }
5451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
54691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    APValue VisitParenExpr(ParenExpr *E)
54791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman        { return Visit(E->getSubExpr()); }
54891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    APValue VisitUnaryExtension(const UnaryOperator *E)
54991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      { return Visit(E->getSubExpr()); }
55091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    APValue VisitUnaryPlus(const UnaryOperator *E)
55191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      { return Visit(E->getSubExpr()); }
55291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    APValue VisitUnaryReal(const UnaryOperator *E)
55391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      { return Visit(E->getSubExpr()); }
55491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    APValue VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E)
55591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      { return GetZeroVector(E->getType()); }
55659b5da6d853b4368b984700315adf7b37de05764Nate Begeman    APValue VisitCastExpr(const CastExpr* E);
55759b5da6d853b4368b984700315adf7b37de05764Nate Begeman    APValue VisitCompoundLiteralExpr(const CompoundLiteralExpr *E);
55859b5da6d853b4368b984700315adf7b37de05764Nate Begeman    APValue VisitInitListExpr(const InitListExpr *E);
55991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    APValue VisitConditionalOperator(const ConditionalOperator *E);
560ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman    APValue VisitChooseExpr(const ChooseExpr *E)
561ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman      { return Visit(E->getChosenSubExpr(Info.Ctx)); }
56291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    APValue VisitUnaryImag(const UnaryOperator *E);
56391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    // FIXME: Missing: unary -, unary ~, binary add/sub/mul/div,
5642217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman    //                 binary comparisons, binary and/or/xor,
56591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    //                 shufflevector, ExtVectorElementExpr
56691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    //        (Note that these require implementing conversions
56791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    //         between vector types.)
56859b5da6d853b4368b984700315adf7b37de05764Nate Begeman  };
56959b5da6d853b4368b984700315adf7b37de05764Nate Begeman} // end anonymous namespace
57059b5da6d853b4368b984700315adf7b37de05764Nate Begeman
57159b5da6d853b4368b984700315adf7b37de05764Nate Begemanstatic bool EvaluateVector(const Expr* E, APValue& Result, EvalInfo &Info) {
57259b5da6d853b4368b984700315adf7b37de05764Nate Begeman  if (!E->getType()->isVectorType())
57359b5da6d853b4368b984700315adf7b37de05764Nate Begeman    return false;
57459b5da6d853b4368b984700315adf7b37de05764Nate Begeman  Result = VectorExprEvaluator(Info).Visit(const_cast<Expr*>(E));
57559b5da6d853b4368b984700315adf7b37de05764Nate Begeman  return !Result.isUninit();
57659b5da6d853b4368b984700315adf7b37de05764Nate Begeman}
57759b5da6d853b4368b984700315adf7b37de05764Nate Begeman
57859b5da6d853b4368b984700315adf7b37de05764Nate BegemanAPValue VectorExprEvaluator::VisitCastExpr(const CastExpr* E) {
579183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  const VectorType *VTy = E->getType()->getAs<VectorType>();
580c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  QualType EltTy = VTy->getElementType();
581c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  unsigned NElts = VTy->getNumElements();
582c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  unsigned EltWidth = Info.Ctx.getTypeSize(EltTy);
5831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58459b5da6d853b4368b984700315adf7b37de05764Nate Begeman  const Expr* SE = E->getSubExpr();
585e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman  QualType SETy = SE->getType();
586e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman  APValue Result = APValue();
58759b5da6d853b4368b984700315adf7b37de05764Nate Begeman
588e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman  // Check for vector->vector bitcast and scalar->vector splat.
589e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman  if (SETy->isVectorType()) {
59059b5da6d853b4368b984700315adf7b37de05764Nate Begeman    return this->Visit(const_cast<Expr*>(SE));
591e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman  } else if (SETy->isIntegerType()) {
592e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman    APSInt IntResult;
593d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar    if (!EvaluateInteger(SE, IntResult, Info))
594d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar      return APValue();
595d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar    Result = APValue(IntResult);
596e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman  } else if (SETy->isRealFloatingType()) {
597e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman    APFloat F(0.0);
598d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar    if (!EvaluateFloat(SE, F, Info))
599d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar      return APValue();
600d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar    Result = APValue(F);
601d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar  } else
602c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    return APValue();
60359b5da6d853b4368b984700315adf7b37de05764Nate Begeman
604c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  // For casts of a scalar to ExtVector, convert the scalar to the element type
605c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  // and splat it to all elements.
606c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  if (E->getType()->isExtVectorType()) {
607c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    if (EltTy->isIntegerType() && Result.isInt())
608c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman      Result = APValue(HandleIntToIntCast(EltTy, SETy, Result.getInt(),
609c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman                                          Info.Ctx));
610c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    else if (EltTy->isIntegerType())
611c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman      Result = APValue(HandleFloatToIntCast(EltTy, SETy, Result.getFloat(),
612c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman                                            Info.Ctx));
613c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    else if (EltTy->isRealFloatingType() && Result.isInt())
614c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman      Result = APValue(HandleIntToFloatCast(EltTy, SETy, Result.getInt(),
615c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman                                            Info.Ctx));
616c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    else if (EltTy->isRealFloatingType())
617c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman      Result = APValue(HandleFloatToFloatCast(EltTy, SETy, Result.getFloat(),
618c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman                                              Info.Ctx));
619c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    else
620c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman      return APValue();
621c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman
622c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    // Splat and create vector APValue.
623c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    llvm::SmallVector<APValue, 4> Elts(NElts, Result);
624c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    return APValue(&Elts[0], Elts.size());
625e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman  }
626c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman
627c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  // For casts of a scalar to regular gcc-style vector type, bitcast the scalar
628c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  // to the vector. To construct the APValue vector initializer, bitcast the
629c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  // initializing value to an APInt, and shift out the bits pertaining to each
630c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  // element.
631c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  APSInt Init;
632c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  Init = Result.isInt() ? Result.getInt() : Result.getFloat().bitcastToAPInt();
6331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
634c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  llvm::SmallVector<APValue, 4> Elts;
635c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  for (unsigned i = 0; i != NElts; ++i) {
636c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    APSInt Tmp = Init;
637c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    Tmp.extOrTrunc(EltWidth);
6381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
639c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    if (EltTy->isIntegerType())
640c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman      Elts.push_back(APValue(Tmp));
641c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    else if (EltTy->isRealFloatingType())
642c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman      Elts.push_back(APValue(APFloat(Tmp)));
643c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    else
644c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman      return APValue();
645c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman
646c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    Init >>= EltWidth;
647c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  }
648c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  return APValue(&Elts[0], Elts.size());
64959b5da6d853b4368b984700315adf7b37de05764Nate Begeman}
65059b5da6d853b4368b984700315adf7b37de05764Nate Begeman
6511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue
65259b5da6d853b4368b984700315adf7b37de05764Nate BegemanVectorExprEvaluator::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) {
65359b5da6d853b4368b984700315adf7b37de05764Nate Begeman  return this->Visit(const_cast<Expr*>(E->getInitializer()));
65459b5da6d853b4368b984700315adf7b37de05764Nate Begeman}
65559b5da6d853b4368b984700315adf7b37de05764Nate Begeman
6561eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue
65759b5da6d853b4368b984700315adf7b37de05764Nate BegemanVectorExprEvaluator::VisitInitListExpr(const InitListExpr *E) {
658183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  const VectorType *VT = E->getType()->getAs<VectorType>();
65959b5da6d853b4368b984700315adf7b37de05764Nate Begeman  unsigned NumInits = E->getNumInits();
66091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  unsigned NumElements = VT->getNumElements();
6611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
66259b5da6d853b4368b984700315adf7b37de05764Nate Begeman  QualType EltTy = VT->getElementType();
66359b5da6d853b4368b984700315adf7b37de05764Nate Begeman  llvm::SmallVector<APValue, 4> Elements;
66459b5da6d853b4368b984700315adf7b37de05764Nate Begeman
66591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  for (unsigned i = 0; i < NumElements; i++) {
66659b5da6d853b4368b984700315adf7b37de05764Nate Begeman    if (EltTy->isIntegerType()) {
66759b5da6d853b4368b984700315adf7b37de05764Nate Begeman      llvm::APSInt sInt(32);
66891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      if (i < NumInits) {
66991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman        if (!EvaluateInteger(E->getInit(i), sInt, Info))
67091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman          return APValue();
67191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      } else {
67291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman        sInt = Info.Ctx.MakeIntValue(0, EltTy);
67391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      }
67459b5da6d853b4368b984700315adf7b37de05764Nate Begeman      Elements.push_back(APValue(sInt));
67559b5da6d853b4368b984700315adf7b37de05764Nate Begeman    } else {
67659b5da6d853b4368b984700315adf7b37de05764Nate Begeman      llvm::APFloat f(0.0);
67791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      if (i < NumInits) {
67891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman        if (!EvaluateFloat(E->getInit(i), f, Info))
67991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman          return APValue();
68091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      } else {
68191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman        f = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy));
68291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      }
68359b5da6d853b4368b984700315adf7b37de05764Nate Begeman      Elements.push_back(APValue(f));
68459b5da6d853b4368b984700315adf7b37de05764Nate Begeman    }
68559b5da6d853b4368b984700315adf7b37de05764Nate Begeman  }
68659b5da6d853b4368b984700315adf7b37de05764Nate Begeman  return APValue(&Elements[0], Elements.size());
68759b5da6d853b4368b984700315adf7b37de05764Nate Begeman}
68859b5da6d853b4368b984700315adf7b37de05764Nate Begeman
6891eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue
69091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli FriedmanVectorExprEvaluator::GetZeroVector(QualType T) {
691183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  const VectorType *VT = T->getAs<VectorType>();
69291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  QualType EltTy = VT->getElementType();
69391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  APValue ZeroElement;
69491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  if (EltTy->isIntegerType())
69591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    ZeroElement = APValue(Info.Ctx.MakeIntValue(0, EltTy));
69691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  else
69791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    ZeroElement =
69891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman        APValue(APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy)));
69991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman
70091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  llvm::SmallVector<APValue, 4> Elements(VT->getNumElements(), ZeroElement);
70191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  return APValue(&Elements[0], Elements.size());
70291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman}
70391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman
70491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli FriedmanAPValue VectorExprEvaluator::VisitConditionalOperator(const ConditionalOperator *E) {
70591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  bool BoolResult;
70691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  if (!HandleConversionToBool(E->getCond(), BoolResult, Info))
70791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    return APValue();
70891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman
70991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  Expr* EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr();
71091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman
71191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  APValue Result;
71291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  if (EvaluateVector(EvalExpr, Result, Info))
71391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    return Result;
71491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  return APValue();
71591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman}
71691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman
71791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli FriedmanAPValue VectorExprEvaluator::VisitUnaryImag(const UnaryOperator *E) {
71891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  if (!E->getSubExpr()->isEvaluatable(Info.Ctx))
71991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    Info.EvalResult.HasSideEffects = true;
72091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  return GetZeroVector(E->getType());
72191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman}
72291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman
72359b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===//
724f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Integer Evaluation
725f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
726f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
727f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnernamespace {
728770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass IntExprEvaluator
729b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  : public StmtVisitor<IntExprEvaluator, bool> {
73087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  EvalInfo &Info;
73130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  APValue &Result;
732f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerpublic:
73330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  IntExprEvaluator(EvalInfo &info, APValue &result)
73487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner    : Info(info), Result(result) {}
735f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
7363f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  bool Success(const llvm::APSInt &SI, const Expr *E) {
7374fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar    assert(E->getType()->isIntegralType() && "Invalid evaluation result.");
73830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    assert(SI.isSigned() == E->getType()->isSignedIntegerType() &&
7393f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar           "Invalid evaluation result.");
74030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    assert(SI.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) &&
7413f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar           "Invalid evaluation result.");
74230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    Result = APValue(SI);
7433f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    return true;
7443f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  }
7453f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar
746131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  bool Success(const llvm::APInt &I, const Expr *E) {
7474fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar    assert(E->getType()->isIntegralType() && "Invalid evaluation result.");
74830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    assert(I.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) &&
7493f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar           "Invalid evaluation result.");
75030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    Result = APValue(APSInt(I));
75130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    Result.getInt().setIsUnsigned(E->getType()->isUnsignedIntegerType());
752131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return true;
753131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  }
754131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar
755131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  bool Success(uint64_t Value, const Expr *E) {
7564fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar    assert(E->getType()->isIntegralType() && "Invalid evaluation result.");
75730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    Result = APValue(Info.Ctx.MakeIntValue(Value, E->getType()));
758131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return true;
759131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  }
760131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar
76182206e267ce6cc709797127616f64672d255b310Anders Carlsson  bool Error(SourceLocation L, diag::kind D, const Expr *E) {
76232fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    // Take the first error.
76354da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson    if (Info.EvalResult.Diag == 0) {
76454da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson      Info.EvalResult.DiagLoc = L;
76554da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson      Info.EvalResult.Diag = D;
76682206e267ce6cc709797127616f64672d255b310Anders Carlsson      Info.EvalResult.DiagExpr = E;
76732fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    }
76854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    return false;
7697a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner  }
7701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
771f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  //===--------------------------------------------------------------------===//
772f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  //                            Visitor Methods
773f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  //===--------------------------------------------------------------------===//
7741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
77532fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner  bool VisitStmt(Stmt *) {
77632fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    assert(0 && "This should be called on integers, stmts are not integers");
77732fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    return false;
77832fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner  }
7791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
78032fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner  bool VisitExpr(Expr *E) {
7810e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
782f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  }
7831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
784b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
785f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
7864c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitIntegerLiteral(const IntegerLiteral *E) {
787131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(E->getValue(), E);
7884c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  }
7894c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitCharacterLiteral(const CharacterLiteral *E) {
790131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(E->getValue(), E);
7914c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  }
7924c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitTypesCompatibleExpr(const TypesCompatibleExpr *E) {
793ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    // Per gcc docs "this built-in function ignores top level
794ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    // qualifiers".  We need to use the canonical version to properly
795ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    // be able to strip CRV qualifiers from the type.
796ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    QualType T0 = Info.Ctx.getCanonicalType(E->getArgType1());
797ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    QualType T1 = Info.Ctx.getCanonicalType(E->getArgType2());
7981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return Success(Info.Ctx.typesAreCompatible(T0.getUnqualifiedType(),
799131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                                               T1.getUnqualifiedType()),
800131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                   E);
8014c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  }
802043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman
803043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman  bool CheckReferencedDecl(const Expr *E, const Decl *D);
804043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman  bool VisitDeclRefExpr(const DeclRefExpr *E) {
805043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman    return CheckReferencedDecl(E, E->getDecl());
806043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman  }
807043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman  bool VisitMemberExpr(const MemberExpr *E) {
808043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman    if (CheckReferencedDecl(E, E->getMemberDecl())) {
809043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman      // Conservatively assume a MemberExpr will have side-effects
810043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman      Info.EvalResult.HasSideEffects = true;
811043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman      return true;
812043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman    }
813043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman    return false;
814043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman  }
815043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman
8164c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitCallExpr(const CallExpr *E);
817b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  bool VisitBinaryOperator(const BinaryOperator *E);
818b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  bool VisitUnaryOperator(const UnaryOperator *E);
819ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes  bool VisitConditionalOperator(const ConditionalOperator *E);
820f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
821a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  bool VisitCastExpr(CastExpr* E);
8220518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  bool VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E);
8230518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl
8243068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  bool VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) {
825131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(E->getValue(), E);
8263068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  }
8271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8283f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson  bool VisitGNUNullExpr(const GNUNullExpr *E) {
829131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(0, E);
8303f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson  }
8311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8323068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  bool VisitCXXZeroInitValueExpr(const CXXZeroInitValueExpr *E) {
833131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(0, E);
8343068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  }
8353068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
836664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman  bool VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) {
837664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman    return Success(0, E);
838664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman  }
839664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman
84064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  bool VisitUnaryTypeTraitExpr(const UnaryTypeTraitExpr *E) {
8415e03f9ea8174ae588c5e69ec6b5ef4c68f8fd766Douglas Gregor    return Success(E->EvaluateTrait(Info.Ctx), E);
84264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  }
84364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl
844ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  bool VisitChooseExpr(const ChooseExpr *E) {
845ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman    return Visit(E->getChosenSubExpr(Info.Ctx));
846ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  }
847ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman
848722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  bool VisitUnaryReal(const UnaryOperator *E);
849664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman  bool VisitUnaryImag(const UnaryOperator *E);
850664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman
851fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattnerprivate:
8528b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck  CharUnits GetAlignOfExpr(const Expr *E);
8538b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck  CharUnits GetAlignOfType(QualType T);
854664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman  // FIXME: Missing: array subscript of vector, member of vector
855f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner};
856f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace
857f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
85869ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbarstatic bool EvaluateIntegerOrLValue(const Expr* E, APValue &Result, EvalInfo &Info) {
8593f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  if (!E->getType()->isIntegralType())
8603f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    return false;
8611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
86269ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar  return IntExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E));
86369ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar}
86469ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar
86569ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbarstatic bool EvaluateInteger(const Expr* E, APSInt &Result, EvalInfo &Info) {
86630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  APValue Val;
86769ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar  if (!EvaluateIntegerOrLValue(E, Val, Info) || !Val.isInt())
86830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return false;
86930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  Result = Val.getInt();
87030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  return true;
871f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner}
872f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
873043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedmanbool IntExprEvaluator::CheckReferencedDecl(const Expr* E, const Decl* D) {
8744c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  // Enums are integer constant exprs.
87529a7f3342c3c6dd15d914c61ae22246c36d51ce7Eli Friedman  if (const EnumConstantDecl *ECD = dyn_cast<EnumConstantDecl>(D))
87629a7f3342c3c6dd15d914c61ae22246c36d51ce7Eli Friedman    return Success(ECD->getInitVal(), E);
877b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl
878b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl  // In C++, const, non-volatile integers initialized with ICEs are ICEs.
879e1646da3bb0fe97b372e5fe8cefc537b22048fc4Eli Friedman  // In C, they can also be folded, although they are not ICEs.
880cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor  if (Info.Ctx.getCanonicalType(E->getType()).getCVRQualifiers()
881cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor                                                        == Qualifiers::Const) {
882043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman    if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
883cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor      const VarDecl *Def = 0;
884043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman      if (const Expr *Init = VD->getDefinition(Def)) {
885c013118155077cf8bdaef743c5dbce760114eed3Eli Friedman        if (APValue *V = VD->getEvaluatedValue()) {
886c013118155077cf8bdaef743c5dbce760114eed3Eli Friedman          if (V->isInt())
887c013118155077cf8bdaef743c5dbce760114eed3Eli Friedman            return Success(V->getInt(), E);
888c013118155077cf8bdaef743c5dbce760114eed3Eli Friedman          return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
889c013118155077cf8bdaef743c5dbce760114eed3Eli Friedman        }
890c013118155077cf8bdaef743c5dbce760114eed3Eli Friedman
891c013118155077cf8bdaef743c5dbce760114eed3Eli Friedman        if (VD->isEvaluatingValue())
892c013118155077cf8bdaef743c5dbce760114eed3Eli Friedman          return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
893c013118155077cf8bdaef743c5dbce760114eed3Eli Friedman
894c013118155077cf8bdaef743c5dbce760114eed3Eli Friedman        VD->setEvaluatingValue();
895c013118155077cf8bdaef743c5dbce760114eed3Eli Friedman
89678d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor        if (Visit(const_cast<Expr*>(Init))) {
89778d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor          // Cache the evaluated value in the variable declaration.
898c013118155077cf8bdaef743c5dbce760114eed3Eli Friedman          VD->setEvaluatedValue(Result);
89978d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor          return true;
90078d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor        }
90178d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor
902c013118155077cf8bdaef743c5dbce760114eed3Eli Friedman        VD->setEvaluatedValue(APValue());
90378d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor        return false;
90478d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor      }
905b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl    }
906b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl  }
907b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl
9084c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  // Otherwise, random variable references are not constants.
9090e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson  return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
9104c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner}
9114c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner
912a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way
913a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// as GCC.
914a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattnerstatic int EvaluateBuiltinClassifyType(const CallExpr *E) {
915a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  // The following enum mimics the values returned by GCC.
9167c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  // FIXME: Does GCC differ between lvalue and rvalue references here?
917a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  enum gcc_type_class {
918a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    no_type_class = -1,
919a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    void_type_class, integer_type_class, char_type_class,
920a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    enumeral_type_class, boolean_type_class,
921a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    pointer_type_class, reference_type_class, offset_type_class,
922a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    real_type_class, complex_type_class,
923a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    function_type_class, method_type_class,
924a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    record_type_class, union_type_class,
925a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    array_type_class, string_type_class,
926a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    lang_type_class
927a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  };
9281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // If no argument was supplied, default to "no_type_class". This isn't
930a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  // ideal, however it is what gcc does.
931a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  if (E->getNumArgs() == 0)
932a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return no_type_class;
9331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
934a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  QualType ArgTy = E->getArg(0)->getType();
935a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  if (ArgTy->isVoidType())
936a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return void_type_class;
937a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isEnumeralType())
938a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return enumeral_type_class;
939a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isBooleanType())
940a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return boolean_type_class;
941a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isCharType())
942a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return string_type_class; // gcc doesn't appear to use char_type_class
943a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isIntegerType())
944a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return integer_type_class;
945a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isPointerType())
946a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return pointer_type_class;
947a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isReferenceType())
948a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return reference_type_class;
949a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isRealType())
950a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return real_type_class;
951a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isComplexType())
952a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return complex_type_class;
953a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isFunctionType())
954a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return function_type_class;
955a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isStructureType())
956a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return record_type_class;
957a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isUnionType())
958a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return union_type_class;
959a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isArrayType())
960a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return array_type_class;
961a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isUnionType())
962a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return union_type_class;
963a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else  // FIXME: offset_type_class, method_type_class, & lang_type_class?
964a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    assert(0 && "CallExpr::isBuiltinClassifyType(): unimplemented type");
965a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  return -1;
966a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner}
967a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner
9684c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattnerbool IntExprEvaluator::VisitCallExpr(const CallExpr *E) {
9693c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  switch (E->isBuiltinCall(Info.Ctx)) {
970019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  default:
9710e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
97264eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump
97364eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump  case Builtin::BI__builtin_object_size: {
97464eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump    const Expr *Arg = E->getArg(0)->IgnoreParens();
97564eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump    Expr::EvalResult Base;
976b2aaf51ed73a4774322a39a0dd59d0fe7e3258c0Eric Christopher
977b2aaf51ed73a4774322a39a0dd59d0fe7e3258c0Eric Christopher    // TODO: Perhaps we should let LLVM lower this?
978660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump    if (Arg->EvaluateAsAny(Base, Info.Ctx)
97964eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump        && Base.Val.getKind() == APValue::LValue
98064eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump        && !Base.HasSideEffects)
98164eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump      if (const Expr *LVBase = Base.Val.getLValueBase())
98264eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump        if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(LVBase)) {
98364eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump          if (const VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl())) {
984460d138c19be357414e4ab56ec880e5451f95cb4Mike Stump            if (!VD->getType()->isIncompleteType()
985460d138c19be357414e4ab56ec880e5451f95cb4Mike Stump                && VD->getType()->isObjectType()
986460d138c19be357414e4ab56ec880e5451f95cb4Mike Stump                && !VD->getType()->isVariablyModifiedType()
987460d138c19be357414e4ab56ec880e5451f95cb4Mike Stump                && !VD->getType()->isDependentType()) {
988199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck              CharUnits Size = Info.Ctx.getTypeSizeInChars(VD->getType());
989a73058324197b7bdfd19307965954f626e26199dKen Dyck              CharUnits Offset = Base.Val.getLValueOffset();
990199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck              if (!Offset.isNegative() && Offset <= Size)
991199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck                Size -= Offset;
992460d138c19be357414e4ab56ec880e5451f95cb4Mike Stump              else
993199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck                Size = CharUnits::Zero();
994199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck              return Success(Size.getQuantity(), E);
995460d138c19be357414e4ab56ec880e5451f95cb4Mike Stump            }
99664eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump          }
99764eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump        }
99864eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump
999b2aaf51ed73a4774322a39a0dd59d0fe7e3258c0Eric Christopher    // If evaluating the argument has side-effects we can't determine
1000b2aaf51ed73a4774322a39a0dd59d0fe7e3258c0Eric Christopher    // the size of the object and lower it to unknown now.
1001393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian    if (E->getArg(0)->HasSideEffects(Info.Ctx)) {
10023f27b384801de26ce7efaa395699b42719372f24Benjamin Kramer      if (E->getArg(1)->EvaluateAsInt(Info.Ctx).getZExtValue() <= 1)
1003cf184655319cf7a5b811067cff9d26a5741fd161Chris Lattner        return Success(-1ULL, E);
100464eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump      return Success(0, E);
100564eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump    }
1006c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump
100764eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump    return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
100864eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump  }
100964eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump
1010019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_classify_type:
1011131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(EvaluateBuiltinClassifyType(E), E);
10121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10134bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson  case Builtin::BI__builtin_constant_p:
1014019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner    // __builtin_constant_p always has one operand: it returns true if that
1015019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner    // operand can be folded, false otherwise.
1016131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(E->getArg(0)->isEvaluatable(Info.Ctx), E);
101721fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner
101821fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner  case Builtin::BI__builtin_eh_return_data_regno: {
101921fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner    int Operand = E->getArg(0)->EvaluateAsInt(Info.Ctx).getZExtValue();
102021fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner    Operand = Info.Ctx.Target.getEHDataRegisterNumber(Operand);
102121fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner    return Success(Operand, E);
102221fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner  }
1023019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  }
10244c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner}
1025f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
1026b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
1027a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  if (E->getOpcode() == BinaryOperator::Comma) {
1028027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson    if (!Visit(E->getRHS()))
1029027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson      return false;
10304fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson
103133ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman    // If we can't evaluate the LHS, it might have side effects;
103233ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman    // conservatively mark it.
103333ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman    if (!E->getLHS()->isEvaluatable(Info.Ctx))
103433ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman      Info.EvalResult.HasSideEffects = true;
1035c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner
1036027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson    return true;
1037a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  }
1038a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
1039a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  if (E->isLogicalOp()) {
1040a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // These need to be handled specially because the operands aren't
1041a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // necessarily integral
1042fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson    bool lhsResult, rhsResult;
10431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1044fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson    if (HandleConversionToBool(E->getLHS(), lhsResult, Info)) {
104551fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson      // We were able to evaluate the LHS, see if we can get away with not
104651fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson      // evaluating the RHS: 0 && X -> 0, 1 || X -> 1
104733ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman      if (lhsResult == (E->getOpcode() == BinaryOperator::LOr))
10483f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar        return Success(lhsResult, E);
1049a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
1050fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson      if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) {
10514bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        if (E->getOpcode() == BinaryOperator::LOr)
1052131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar          return Success(lhsResult || rhsResult, E);
10534bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        else
1054131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar          return Success(lhsResult && rhsResult, E);
10554bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson      }
10564bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson    } else {
1057fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson      if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) {
10584bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        // We can't evaluate the LHS; however, sometimes the result
10594bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        // is determined by the RHS: X && 0 -> 0, X || 1 -> 1.
10601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        if (rhsResult == (E->getOpcode() == BinaryOperator::LOr) ||
1061fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson            !rhsResult == (E->getOpcode() == BinaryOperator::LAnd)) {
1062131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar          // Since we weren't able to evaluate the left hand side, it
1063fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson          // must have had side effects.
1064fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson          Info.EvalResult.HasSideEffects = true;
1065131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar
1066131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar          return Success(rhsResult, E);
10674bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        }
10684bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson      }
1069a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    }
1070a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
1071a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    return false;
1072c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner  }
107354176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner
1074286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  QualType LHSTy = E->getLHS()->getType();
1075286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  QualType RHSTy = E->getRHS()->getType();
10764087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
10774087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar  if (LHSTy->isAnyComplexType()) {
10784087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    assert(RHSTy->isAnyComplexType() && "Invalid comparison");
10794087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    APValue LHS, RHS;
10804087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
10814087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    if (!EvaluateComplex(E->getLHS(), LHS, Info))
10824087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      return false;
10834087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
10844087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    if (!EvaluateComplex(E->getRHS(), RHS, Info))
10854087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      return false;
10864087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
10874087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    if (LHS.isComplexFloat()) {
10881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      APFloat::cmpResult CR_r =
10894087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar        LHS.getComplexFloatReal().compare(RHS.getComplexFloatReal());
10901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      APFloat::cmpResult CR_i =
10914087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar        LHS.getComplexFloatImag().compare(RHS.getComplexFloatImag());
10924087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
10934087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      if (E->getOpcode() == BinaryOperator::EQ)
1094131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        return Success((CR_r == APFloat::cmpEqual &&
1095131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                        CR_i == APFloat::cmpEqual), E);
1096131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      else {
1097131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        assert(E->getOpcode() == BinaryOperator::NE &&
1098131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar               "Invalid complex comparison.");
10991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        return Success(((CR_r == APFloat::cmpGreaterThan ||
1100131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                         CR_r == APFloat::cmpLessThan) &&
11011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                        (CR_i == APFloat::cmpGreaterThan ||
1102131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                         CR_i == APFloat::cmpLessThan)), E);
1103131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      }
11044087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    } else {
11054087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      if (E->getOpcode() == BinaryOperator::EQ)
1106131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        return Success((LHS.getComplexIntReal() == RHS.getComplexIntReal() &&
1107131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                        LHS.getComplexIntImag() == RHS.getComplexIntImag()), E);
1108131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      else {
1109131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        assert(E->getOpcode() == BinaryOperator::NE &&
1110131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar               "Invalid compex comparison.");
1111131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        return Success((LHS.getComplexIntReal() != RHS.getComplexIntReal() ||
1112131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                        LHS.getComplexIntImag() != RHS.getComplexIntImag()), E);
1113131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      }
11144087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    }
11154087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar  }
11161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1117286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  if (LHSTy->isRealFloatingType() &&
1118286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      RHSTy->isRealFloatingType()) {
1119286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    APFloat RHS(0.0), LHS(0.0);
11201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1121286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    if (!EvaluateFloat(E->getRHS(), RHS, Info))
1122286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      return false;
11231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1124286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    if (!EvaluateFloat(E->getLHS(), LHS, Info))
1125286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      return false;
11261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1127286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    APFloat::cmpResult CR = LHS.compare(RHS);
1128529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson
1129286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    switch (E->getOpcode()) {
1130286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    default:
1131286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      assert(0 && "Invalid binary operator!");
1132286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::LT:
1133131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpLessThan, E);
1134286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::GT:
1135131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpGreaterThan, E);
1136286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::LE:
1137131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpLessThan || CR == APFloat::cmpEqual, E);
1138286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::GE:
11391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return Success(CR == APFloat::cmpGreaterThan || CR == APFloat::cmpEqual,
1140131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                     E);
1141286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::EQ:
1142131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpEqual, E);
1143286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::NE:
11441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return Success(CR == APFloat::cmpGreaterThan
1145131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                     || CR == APFloat::cmpLessThan, E);
1146286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    }
1147286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  }
11481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1149ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman  if (LHSTy->isPointerType() && RHSTy->isPointerType()) {
1150ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman    if (E->getOpcode() == BinaryOperator::Sub || E->isEqualityOp()) {
11513068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      APValue LHSValue;
11523068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      if (!EvaluatePointer(E->getLHS(), LHSValue, Info))
11533068d117951a8df54bae9db039b56201ab10962bAnders Carlsson        return false;
1154a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
11553068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      APValue RHSValue;
11563068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      if (!EvaluatePointer(E->getRHS(), RHSValue, Info))
11573068d117951a8df54bae9db039b56201ab10962bAnders Carlsson        return false;
1158a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
11595bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman      // Reject any bases from the normal codepath; we special-case comparisons
11605bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman      // to null.
11615bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman      if (LHSValue.getLValueBase()) {
11625bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman        if (!E->isEqualityOp())
11635bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman          return false;
1164a73058324197b7bdfd19307965954f626e26199dKen Dyck        if (RHSValue.getLValueBase() || !RHSValue.getLValueOffset().isZero())
11655bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman          return false;
11665bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman        bool bres;
11675bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman        if (!EvalPointerValueAsBool(LHSValue, bres))
11685bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman          return false;
11695bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman        return Success(bres ^ (E->getOpcode() == BinaryOperator::EQ), E);
11705bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman      } else if (RHSValue.getLValueBase()) {
11715bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman        if (!E->isEqualityOp())
11725bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman          return false;
1173a73058324197b7bdfd19307965954f626e26199dKen Dyck        if (LHSValue.getLValueBase() || !LHSValue.getLValueOffset().isZero())
11745bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman          return false;
11755bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman        bool bres;
11765bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman        if (!EvalPointerValueAsBool(RHSValue, bres))
11775bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman          return false;
11785bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman        return Success(bres ^ (E->getOpcode() == BinaryOperator::EQ), E);
11795bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman      }
1180a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
1181ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman      if (E->getOpcode() == BinaryOperator::Sub) {
1182ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman        const QualType Type = E->getLHS()->getType();
11836217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek        const QualType ElementType = Type->getAs<PointerType>()->getPointeeType();
11843068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
1185a73058324197b7bdfd19307965954f626e26199dKen Dyck        CharUnits ElementSize = CharUnits::One();
1186ce1bca73aef9bbf6359ab8420278203dda81a054Eli Friedman        if (!ElementType->isVoidType() && !ElementType->isFunctionType())
1187a73058324197b7bdfd19307965954f626e26199dKen Dyck          ElementSize = Info.Ctx.getTypeSizeInChars(ElementType);
1188a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
1189a73058324197b7bdfd19307965954f626e26199dKen Dyck        CharUnits Diff = LHSValue.getLValueOffset() -
1190a73058324197b7bdfd19307965954f626e26199dKen Dyck                             RHSValue.getLValueOffset();
1191a73058324197b7bdfd19307965954f626e26199dKen Dyck        return Success(Diff / ElementSize, E);
1192ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman      }
1193ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman      bool Result;
1194ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman      if (E->getOpcode() == BinaryOperator::EQ) {
1195ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman        Result = LHSValue.getLValueOffset() == RHSValue.getLValueOffset();
1196267c0ab1b9a15768f3f15abbfc40ce344751c78bEli Friedman      } else {
1197ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman        Result = LHSValue.getLValueOffset() != RHSValue.getLValueOffset();
1198ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman      }
1199ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman      return Success(Result, E);
12003068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    }
12013068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  }
1202286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  if (!LHSTy->isIntegralType() ||
1203286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      !RHSTy->isIntegralType()) {
1204a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // We can't continue from here for non-integral types, and they
1205a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // could potentially confuse the following operations.
1206a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    return false;
1207a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  }
1208a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
1209a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  // The LHS of a constant expr is always evaluated and needed.
121030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  if (!Visit(E->getLHS()))
1211a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    return false; // error in subexpression.
1212d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman
121342edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  APValue RHSVal;
121442edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  if (!EvaluateIntegerOrLValue(E->getRHS(), RHSVal, Info))
121530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return false;
121642edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman
121742edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  // Handle cases like (unsigned long)&a + 4.
121842edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  if (E->isAdditiveOp() && Result.isLValue() && RHSVal.isInt()) {
1219a73058324197b7bdfd19307965954f626e26199dKen Dyck    CharUnits Offset = Result.getLValueOffset();
1220a73058324197b7bdfd19307965954f626e26199dKen Dyck    CharUnits AdditionalOffset = CharUnits::fromQuantity(
1221a73058324197b7bdfd19307965954f626e26199dKen Dyck                                     RHSVal.getInt().getZExtValue());
122242edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman    if (E->getOpcode() == BinaryOperator::Add)
1223a73058324197b7bdfd19307965954f626e26199dKen Dyck      Offset += AdditionalOffset;
122442edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman    else
1225a73058324197b7bdfd19307965954f626e26199dKen Dyck      Offset -= AdditionalOffset;
1226a73058324197b7bdfd19307965954f626e26199dKen Dyck    Result = APValue(Result.getLValueBase(), Offset);
122742edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman    return true;
122842edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  }
122942edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman
123042edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  // Handle cases like 4 + (unsigned long)&a
123142edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  if (E->getOpcode() == BinaryOperator::Add &&
123242edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman        RHSVal.isLValue() && Result.isInt()) {
1233a73058324197b7bdfd19307965954f626e26199dKen Dyck    CharUnits Offset = RHSVal.getLValueOffset();
1234a73058324197b7bdfd19307965954f626e26199dKen Dyck    Offset += CharUnits::fromQuantity(Result.getInt().getZExtValue());
1235a73058324197b7bdfd19307965954f626e26199dKen Dyck    Result = APValue(RHSVal.getLValueBase(), Offset);
123642edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman    return true;
123742edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  }
123842edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman
123942edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  // All the following cases expect both operands to be an integer
124042edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  if (!Result.isInt() || !RHSVal.isInt())
1241b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner    return false;
1242a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
124342edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  APSInt& RHS = RHSVal.getInt();
124442edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman
1245a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  switch (E->getOpcode()) {
124632fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner  default:
12470e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E);
124830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::Mul: return Success(Result.getInt() * RHS, E);
124930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::Add: return Success(Result.getInt() + RHS, E);
125030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::Sub: return Success(Result.getInt() - RHS, E);
125130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::And: return Success(Result.getInt() & RHS, E);
125230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::Xor: return Success(Result.getInt() ^ RHS, E);
125330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::Or:  return Success(Result.getInt() | RHS, E);
1254a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  case BinaryOperator::Div:
125554176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    if (RHS == 0)
12560e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson      return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E);
125730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return Success(Result.getInt() / RHS, E);
1258a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  case BinaryOperator::Rem:
125954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    if (RHS == 0)
12600e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson      return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E);
126130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return Success(Result.getInt() % RHS, E);
12623f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  case BinaryOperator::Shl: {
126354176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    // FIXME: Warn about out of range shift amounts!
12641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    unsigned SA =
126530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar      (unsigned) RHS.getLimitedValue(Result.getInt().getBitWidth()-1);
126630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return Success(Result.getInt() << SA, E);
12673f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  }
12683f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  case BinaryOperator::Shr: {
12691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    unsigned SA =
127030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar      (unsigned) RHS.getLimitedValue(Result.getInt().getBitWidth()-1);
127130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return Success(Result.getInt() >> SA, E);
12723f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  }
12731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
127430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::LT: return Success(Result.getInt() < RHS, E);
127530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::GT: return Success(Result.getInt() > RHS, E);
127630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::LE: return Success(Result.getInt() <= RHS, E);
127730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::GE: return Success(Result.getInt() >= RHS, E);
127830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::EQ: return Success(Result.getInt() == RHS, E);
127930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::NE: return Success(Result.getInt() != RHS, E);
1280b11e77836dd0867955c5abf32baf1c3e6c7f81e1Eli Friedman  }
1281a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson}
1282a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson
1283ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopesbool IntExprEvaluator::VisitConditionalOperator(const ConditionalOperator *E) {
1284a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes  bool Cond;
1285a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes  if (!HandleConversionToBool(E->getCond(), Cond, Info))
1286ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes    return false;
1287ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes
1288a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes  return Visit(Cond ? E->getTrueExpr() : E->getFalseExpr());
1289ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes}
1290ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes
12918b752f10c394b140f9ef89e049cbad1a7676fc25Ken DyckCharUnits IntExprEvaluator::GetAlignOfType(QualType T) {
12925d484e8cf710207010720589d89602233de61d01Sebastian Redl  // C++ [expr.sizeof]p2: "When applied to a reference or a reference type,
12935d484e8cf710207010720589d89602233de61d01Sebastian Redl  //   the result is the size of the referenced type."
12945d484e8cf710207010720589d89602233de61d01Sebastian Redl  // C++ [expr.alignof]p3: "When alignof is applied to a reference type, the
12955d484e8cf710207010720589d89602233de61d01Sebastian Redl  //   result shall be the alignment of the referenced type."
12965d484e8cf710207010720589d89602233de61d01Sebastian Redl  if (const ReferenceType *Ref = T->getAs<ReferenceType>())
12975d484e8cf710207010720589d89602233de61d01Sebastian Redl    T = Ref->getPointeeType();
12985d484e8cf710207010720589d89602233de61d01Sebastian Redl
1299e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  // Get information about the alignment.
1300e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  unsigned CharSize = Info.Ctx.Target.getCharWidth();
130118857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor
13022be586108bb401019647791feca19ea03fd477ceEli Friedman  // __alignof is defined to return the preferred alignment.
13038b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck  return CharUnits::fromQuantity(
13048b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck      Info.Ctx.getPreferredTypeAlign(T.getTypePtr()) / CharSize);
1305e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner}
1306e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
13078b752f10c394b140f9ef89e049cbad1a7676fc25Ken DyckCharUnits IntExprEvaluator::GetAlignOfExpr(const Expr *E) {
1308af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  E = E->IgnoreParens();
1309af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner
1310af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  // alignof decl is always accepted, even if it doesn't make sense: we default
13111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // to 1 in those cases.
1312af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
13138b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck    return Info.Ctx.getDeclAlign(DRE->getDecl(),
13148b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck                                 /*RefAsPointee*/true);
1315a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
1316af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  if (const MemberExpr *ME = dyn_cast<MemberExpr>(E))
13178b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck    return Info.Ctx.getDeclAlign(ME->getMemberDecl(),
13188b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck                                 /*RefAsPointee*/true);
1319af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner
1320e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  return GetAlignOfType(E->getType());
1321e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner}
1322e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
1323e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
13240518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// VisitSizeAlignOfExpr - Evaluate a sizeof or alignof with a result as the
13250518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// expression's type.
13260518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redlbool IntExprEvaluator::VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E) {
1327e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  // Handle alignof separately.
1328e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  if (!E->isSizeOf()) {
1329e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner    if (E->isArgumentType())
13308b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck      return Success(GetAlignOfType(E->getArgumentType()).getQuantity(), E);
1331e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner    else
13328b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck      return Success(GetAlignOfExpr(E->getArgumentExpr()).getQuantity(), E);
1333e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  }
1334a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
13350518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  QualType SrcTy = E->getTypeOfArgument();
13365d484e8cf710207010720589d89602233de61d01Sebastian Redl  // C++ [expr.sizeof]p2: "When applied to a reference or a reference type,
13375d484e8cf710207010720589d89602233de61d01Sebastian Redl  //   the result is the size of the referenced type."
13385d484e8cf710207010720589d89602233de61d01Sebastian Redl  // C++ [expr.alignof]p3: "When alignof is applied to a reference type, the
13395d484e8cf710207010720589d89602233de61d01Sebastian Redl  //   result shall be the alignment of the referenced type."
13405d484e8cf710207010720589d89602233de61d01Sebastian Redl  if (const ReferenceType *Ref = SrcTy->getAs<ReferenceType>())
13415d484e8cf710207010720589d89602233de61d01Sebastian Redl    SrcTy = Ref->getPointeeType();
13420518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl
1343131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  // sizeof(void), __alignof__(void), sizeof(function) = 1 as a gcc
1344131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  // extension.
1345131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  if (SrcTy->isVoidType() || SrcTy->isFunctionType())
1346131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(1, E);
1347a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
1348fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner  // sizeof(vla) is not a constantexpr: C99 6.5.3.4p2.
1349e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  if (!SrcTy->isConstantSizeType())
1350fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner    return false;
1351f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman
1352e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  // Get information about the size.
1353199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  return Success(Info.Ctx.getTypeSizeInChars(SrcTy).getQuantity(), E);
1354fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner}
1355fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner
1356b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
13574c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  // Special case unary operators that do not need their subexpression
13584c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  // evaluated.  offsetof/sizeof/alignof are all special.
135935183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman  if (E->isOffsetOfOp()) {
136035183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman    // The AST for offsetof is defined in such a way that we can just
136135183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman    // directly Evaluate it as an l-value.
136235183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman    APValue LV;
136335183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman    if (!EvaluateLValue(E->getSubExpr(), LV, Info))
136435183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman      return false;
136535183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman    if (LV.getLValueBase())
136635183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman      return false;
1367a73058324197b7bdfd19307965954f626e26199dKen Dyck    return Success(LV.getLValueOffset().getQuantity(), E);
136835183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman  }
1369a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
1370a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  if (E->getOpcode() == UnaryOperator::LNot) {
1371a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // LNot's operand isn't necessarily an integer, so we handle it specially.
1372a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    bool bres;
1373a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    if (!HandleConversionToBool(E->getSubExpr(), bres, Info))
1374a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman      return false;
1375131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(!bres, E);
1376a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  }
1377a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
13784fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar  // Only handle integral operations...
13794fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar  if (!E->getSubExpr()->getType()->isIntegralType())
13804fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar    return false;
13814fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar
138287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  // Get the operand value into 'Result'.
138387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  if (!Visit(E->getSubExpr()))
138475a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    return false;
1385a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson
138675a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  switch (E->getOpcode()) {
13874c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  default:
138875a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    // Address, indirect, pre/post inc/dec, etc are not valid constant exprs.
138975a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    // See C99 6.6p3.
13900e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E);
139175a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  case UnaryOperator::Extension:
13924c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    // FIXME: Should extension allow i-c-e extension expressions in its scope?
13934c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    // If so, we could clear the diagnostic ID.
13943f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    return true;
139575a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  case UnaryOperator::Plus:
13961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // The result is always just the subexpr.
13973f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    return true;
139875a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  case UnaryOperator::Minus:
139930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    if (!Result.isInt()) return false;
140030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return Success(-Result.getInt(), E);
140175a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  case UnaryOperator::Not:
140230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    if (!Result.isInt()) return false;
140330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return Success(~Result.getInt(), E);
140406a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson  }
1405a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson}
14061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1407732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// HandleCast - This is used to evaluate implicit or explicit casts where the
1408732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// result type is integer.
1409a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbarbool IntExprEvaluator::VisitCastExpr(CastExpr *E) {
141082206e267ce6cc709797127616f64672d255b310Anders Carlsson  Expr *SubExpr = E->getSubExpr();
141182206e267ce6cc709797127616f64672d255b310Anders Carlsson  QualType DestType = E->getType();
1412b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar  QualType SrcType = SubExpr->getType();
141382206e267ce6cc709797127616f64672d255b310Anders Carlsson
14144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (DestType->isBooleanType()) {
14154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    bool BoolResult;
14164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!HandleConversionToBool(SubExpr, BoolResult, Info))
14174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
1418131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(BoolResult, E);
14194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
14204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1421a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  // Handle simple integer->integer casts.
1422b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar  if (SrcType->isIntegralType()) {
1423732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner    if (!Visit(SubExpr))
1424b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner      return false;
1425a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1426be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    if (!Result.isInt()) {
1427be26570e3faa009bdcefedfaf04473e518940520Eli Friedman      // Only allow casts of lvalues if they are lossless.
1428be26570e3faa009bdcefedfaf04473e518940520Eli Friedman      return Info.Ctx.getTypeSize(DestType) == Info.Ctx.getTypeSize(SrcType);
1429be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    }
143030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar
1431dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar    return Success(HandleIntToIntCast(DestType, SrcType,
143230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar                                      Result.getInt(), Info.Ctx), E);
1433732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner  }
14341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1435732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner  // FIXME: Clean this up!
1436b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar  if (SrcType->isPointerType()) {
1437a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson    APValue LV;
143887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner    if (!EvaluatePointer(SubExpr, LV, Info))
1439b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner      return false;
14404efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1441dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar    if (LV.getLValueBase()) {
1442dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar      // Only allow based lvalue casts if they are lossless.
1443dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar      if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(SrcType))
1444dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar        return false;
1445dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar
1446dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar      Result = LV;
1447dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar      return true;
1448dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar    }
14494efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1450a73058324197b7bdfd19307965954f626e26199dKen Dyck    APSInt AsInt = Info.Ctx.MakeIntValue(LV.getLValueOffset().getQuantity(),
1451a73058324197b7bdfd19307965954f626e26199dKen Dyck                                         SrcType);
1452dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar    return Success(HandleIntToIntCast(DestType, SrcType, AsInt, Info.Ctx), E);
14532bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  }
14544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1455be26570e3faa009bdcefedfaf04473e518940520Eli Friedman  if (SrcType->isArrayType() || SrcType->isFunctionType()) {
1456be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    // This handles double-conversion cases, where there's both
1457be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    // an l-value promotion and an implicit conversion to int.
1458be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    APValue LV;
1459be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    if (!EvaluateLValue(SubExpr, LV, Info))
1460be26570e3faa009bdcefedfaf04473e518940520Eli Friedman      return false;
1461be26570e3faa009bdcefedfaf04473e518940520Eli Friedman
1462be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(Info.Ctx.VoidPtrTy))
1463be26570e3faa009bdcefedfaf04473e518940520Eli Friedman      return false;
1464be26570e3faa009bdcefedfaf04473e518940520Eli Friedman
1465be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    Result = LV;
1466be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    return true;
1467be26570e3faa009bdcefedfaf04473e518940520Eli Friedman  }
1468be26570e3faa009bdcefedfaf04473e518940520Eli Friedman
14691725f683432715e5afe34d476024bd6f16eac3fcEli Friedman  if (SrcType->isAnyComplexType()) {
14701725f683432715e5afe34d476024bd6f16eac3fcEli Friedman    APValue C;
14711725f683432715e5afe34d476024bd6f16eac3fcEli Friedman    if (!EvaluateComplex(SubExpr, C, Info))
14721725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      return false;
14731725f683432715e5afe34d476024bd6f16eac3fcEli Friedman    if (C.isComplexFloat())
14741725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      return Success(HandleFloatToIntCast(DestType, SrcType,
14751725f683432715e5afe34d476024bd6f16eac3fcEli Friedman                                          C.getComplexFloatReal(), Info.Ctx),
14761725f683432715e5afe34d476024bd6f16eac3fcEli Friedman                     E);
14771725f683432715e5afe34d476024bd6f16eac3fcEli Friedman    else
14781725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      return Success(HandleIntToIntCast(DestType, SrcType,
14791725f683432715e5afe34d476024bd6f16eac3fcEli Friedman                                        C.getComplexIntReal(), Info.Ctx), E);
14801725f683432715e5afe34d476024bd6f16eac3fcEli Friedman  }
14812217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman  // FIXME: Handle vectors
14822217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman
1483b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar  if (!SrcType->isRealFloatingType())
14840e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
1485732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner
1486d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  APFloat F(0.0);
1487d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  if (!EvaluateFloat(SubExpr, F, Info))
14880e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
14891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1490b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar  return Success(HandleFloatToIntCast(DestType, SrcType, F, Info.Ctx), E);
1491a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson}
14922bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
1493722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedmanbool IntExprEvaluator::VisitUnaryReal(const UnaryOperator *E) {
1494722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  if (E->getSubExpr()->getType()->isAnyComplexType()) {
1495722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman    APValue LV;
1496722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman    if (!EvaluateComplex(E->getSubExpr(), LV, Info) || !LV.isComplexInt())
1497722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman      return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
1498722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman    return Success(LV.getComplexIntReal(), E);
1499722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  }
1500722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman
1501722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  return Visit(E->getSubExpr());
1502722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman}
1503722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman
1504664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedmanbool IntExprEvaluator::VisitUnaryImag(const UnaryOperator *E) {
1505722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  if (E->getSubExpr()->getType()->isComplexIntegerType()) {
1506722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman    APValue LV;
1507722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman    if (!EvaluateComplex(E->getSubExpr(), LV, Info) || !LV.isComplexInt())
1508722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman      return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
1509722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman    return Success(LV.getComplexIntImag(), E);
1510722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  }
1511722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman
1512664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman  if (!E->getSubExpr()->isEvaluatable(Info.Ctx))
1513664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman    Info.EvalResult.HasSideEffects = true;
1514664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman  return Success(0, E);
1515664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman}
1516664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman
1517f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
1518d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman// Float Evaluation
1519d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===//
1520d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1521d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmannamespace {
1522770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass FloatExprEvaluator
1523d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  : public StmtVisitor<FloatExprEvaluator, bool> {
1524d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  EvalInfo &Info;
1525d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  APFloat &Result;
1526d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanpublic:
1527d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  FloatExprEvaluator(EvalInfo &info, APFloat &result)
1528d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    : Info(info), Result(result) {}
1529d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1530d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitStmt(Stmt *S) {
1531d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return false;
1532d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  }
1533d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1534d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
1535019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  bool VisitCallExpr(const CallExpr *E);
1536d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
15375db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  bool VisitUnaryOperator(const UnaryOperator *E);
1538d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitBinaryOperator(const BinaryOperator *E);
1539d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitFloatingLiteral(const FloatingLiteral *E);
15404efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  bool VisitCastExpr(CastExpr *E);
15414efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  bool VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E);
154267f85fcdab64f36233a7211f963ed1cccffcbfb8Eli Friedman  bool VisitConditionalOperator(ConditionalOperator *E);
15432217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman
1544ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  bool VisitChooseExpr(const ChooseExpr *E)
1545ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman    { return Visit(E->getChosenSubExpr(Info.Ctx)); }
1546ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  bool VisitUnaryExtension(const UnaryOperator *E)
1547ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman    { return Visit(E->getSubExpr()); }
1548ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman
1549ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  // FIXME: Missing: __real__/__imag__, array subscript of vector,
155067f85fcdab64f36233a7211f963ed1cccffcbfb8Eli Friedman  //                 member of vector, ImplicitValueInitExpr
1551d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman};
1552d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} // end anonymous namespace
1553d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1554d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr* E, APFloat& Result, EvalInfo &Info) {
1555d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  return FloatExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E));
1556d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}
1557d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1558019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattnerbool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) {
15593c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  switch (E->isBuiltinCall(Info.Ctx)) {
156034a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner  default: return false;
1561019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_huge_val:
1562019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_huge_valf:
1563019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_huge_vall:
1564019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_inf:
1565019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_inff:
15667cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar  case Builtin::BI__builtin_infl: {
15677cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar    const llvm::fltSemantics &Sem =
15687cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar      Info.Ctx.getFloatTypeSemantics(E->getType());
156934a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner    Result = llvm::APFloat::getInf(Sem);
157034a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner    return true;
15717cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar  }
15721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15739e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner  case Builtin::BI__builtin_nan:
15749e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner  case Builtin::BI__builtin_nanf:
15759e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner  case Builtin::BI__builtin_nanl:
15764572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump    // If this is __builtin_nan() turn this into a nan, otherwise we
15779e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    // can't constant fold it.
15781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (const StringLiteral *S =
15799e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner        dyn_cast<StringLiteral>(E->getArg(0)->IgnoreParenCasts())) {
15804572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump      if (!S->isWide()) {
15817cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar        const llvm::fltSemantics &Sem =
15827cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar          Info.Ctx.getFloatTypeSemantics(E->getType());
1583330358056acf05445273f4f4004dfd283a2ecc4dBenjamin Kramer        unsigned Type = 0;
1584330358056acf05445273f4f4004dfd283a2ecc4dBenjamin Kramer        if (!S->getString().empty() && S->getString().getAsInteger(0, Type))
15854572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump          return false;
1586330358056acf05445273f4f4004dfd283a2ecc4dBenjamin Kramer        Result = llvm::APFloat::getNaN(Sem, false, Type);
15879e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner        return true;
15889e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner      }
15899e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    }
15909e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    return false;
15915db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar
15925db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_fabs:
15935db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_fabsf:
15945db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_fabsl:
15955db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    if (!EvaluateFloat(E->getArg(0), Result, Info))
15965db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar      return false;
15971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15985db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    if (Result.isNegative())
15995db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar      Result.changeSign();
16005db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
16015db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar
16021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  case Builtin::BI__builtin_copysign:
16031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  case Builtin::BI__builtin_copysignf:
16045db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_copysignl: {
16055db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    APFloat RHS(0.);
16065db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    if (!EvaluateFloat(E->getArg(0), Result, Info) ||
16075db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar        !EvaluateFloat(E->getArg(1), RHS, Info))
16085db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar      return false;
16095db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    Result.copySign(RHS);
16105db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
16115db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  }
1612019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  }
1613019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner}
1614019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner
16155db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbarbool FloatExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
1616a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes  if (E->getOpcode() == UnaryOperator::Deref)
1617a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes    return false;
1618a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes
16195db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  if (!EvaluateFloat(E->getSubExpr(), Result, Info))
16205db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return false;
16215db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar
16225db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  switch (E->getOpcode()) {
16235db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  default: return false;
16241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  case UnaryOperator::Plus:
16255db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
16265db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case UnaryOperator::Minus:
16275db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    Result.changeSign();
16285db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
16295db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  }
16305db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar}
1631019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner
1632d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
16337f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman  if (E->getOpcode() == BinaryOperator::Comma) {
16347f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman    if (!EvaluateFloat(E->getRHS(), Result, Info))
16357f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman      return false;
16367f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman
16377f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman    // If we can't evaluate the LHS, it might have side effects;
16387f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman    // conservatively mark it.
16397f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman    if (!E->getLHS()->isEvaluatable(Info.Ctx))
16407f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman      Info.EvalResult.HasSideEffects = true;
16417f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman
16427f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman    return true;
16437f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman  }
16447f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman
1645d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  // FIXME: Diagnostics?  I really don't understand how the warnings
1646d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  // and errors are supposed to work.
16475db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  APFloat RHS(0.0);
1648d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  if (!EvaluateFloat(E->getLHS(), Result, Info))
1649d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return false;
1650d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  if (!EvaluateFloat(E->getRHS(), RHS, Info))
1651d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return false;
1652d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1653d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  switch (E->getOpcode()) {
1654d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  default: return false;
1655d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  case BinaryOperator::Mul:
1656d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.multiply(RHS, APFloat::rmNearestTiesToEven);
1657d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
1658d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  case BinaryOperator::Add:
1659d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.add(RHS, APFloat::rmNearestTiesToEven);
1660d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
1661d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  case BinaryOperator::Sub:
1662d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.subtract(RHS, APFloat::rmNearestTiesToEven);
1663d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
1664d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  case BinaryOperator::Div:
1665d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.divide(RHS, APFloat::rmNearestTiesToEven);
1666d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
1667d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  }
1668d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}
1669d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1670d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitFloatingLiteral(const FloatingLiteral *E) {
1671d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  Result = E->getValue();
1672d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  return true;
1673d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}
1674d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
16754efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanbool FloatExprEvaluator::VisitCastExpr(CastExpr *E) {
16764efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  Expr* SubExpr = E->getSubExpr();
16771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (SubExpr->getType()->isIntegralType()) {
16794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APSInt IntResult;
16803f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    if (!EvaluateInteger(SubExpr, IntResult, Info))
16814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
16821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Result = HandleIntToFloatCast(E->getType(), SubExpr->getType(),
1683a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                  IntResult, Info.Ctx);
16844efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
16854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
16864efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (SubExpr->getType()->isRealFloatingType()) {
16874efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!Visit(SubExpr))
16884efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
1689a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    Result = HandleFloatToFloatCast(E->getType(), SubExpr->getType(),
1690a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                    Result, Info.Ctx);
16914efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
16924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
16932217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman  // FIXME: Handle complex types
16944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
16954efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return false;
16964efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
16974efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
16984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanbool FloatExprEvaluator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
16994efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  Result = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(E->getType()));
17004efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return true;
17014efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
17024efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
170367f85fcdab64f36233a7211f963ed1cccffcbfb8Eli Friedmanbool FloatExprEvaluator::VisitConditionalOperator(ConditionalOperator *E) {
170467f85fcdab64f36233a7211f963ed1cccffcbfb8Eli Friedman  bool Cond;
170567f85fcdab64f36233a7211f963ed1cccffcbfb8Eli Friedman  if (!HandleConversionToBool(E->getCond(), Cond, Info))
170667f85fcdab64f36233a7211f963ed1cccffcbfb8Eli Friedman    return false;
170767f85fcdab64f36233a7211f963ed1cccffcbfb8Eli Friedman
170867f85fcdab64f36233a7211f963ed1cccffcbfb8Eli Friedman  return Visit(Cond ? E->getTrueExpr() : E->getFalseExpr());
170967f85fcdab64f36233a7211f963ed1cccffcbfb8Eli Friedman}
171067f85fcdab64f36233a7211f963ed1cccffcbfb8Eli Friedman
1711d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===//
1712a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar// Complex Evaluation (for float and integer)
17139ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===//
17149ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
17159ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonnamespace {
1716770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass ComplexExprEvaluator
1717a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  : public StmtVisitor<ComplexExprEvaluator, APValue> {
17189ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  EvalInfo &Info;
17191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17209ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonpublic:
1721a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  ComplexExprEvaluator(EvalInfo &info) : Info(info) {}
17221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17239ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  //===--------------------------------------------------------------------===//
17249ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  //                            Visitor Methods
17259ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  //===--------------------------------------------------------------------===//
17269ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
17279ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  APValue VisitStmt(Stmt *S) {
17289ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson    return APValue();
17299ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  }
17301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17319ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
17329ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
17339ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  APValue VisitImaginaryLiteral(ImaginaryLiteral *E) {
1734a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    Expr* SubExpr = E->getSubExpr();
1735a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
1736a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    if (SubExpr->getType()->isRealFloatingType()) {
1737a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      APFloat Result(0.0);
1738a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
1739a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      if (!EvaluateFloat(SubExpr, Result, Info))
1740a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar        return APValue();
17411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return APValue(APFloat(Result.getSemantics(), APFloat::fcZero, false),
1743a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                     Result);
1744a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    } else {
17451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      assert(SubExpr->getType()->isIntegerType() &&
1746a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar             "Unexpected imaginary literal.");
1747a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
1748a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      llvm::APSInt Result;
1749a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      if (!EvaluateInteger(SubExpr, Result, Info))
1750a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar        return APValue();
17511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1752a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      llvm::APSInt Zero(Result.getBitWidth(), !Result.isSigned());
1753a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Zero = 0;
1754a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      return APValue(Zero, Result);
1755a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    }
17569ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  }
17579ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
1758ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  APValue VisitCastExpr(CastExpr *E) {
1759ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    Expr* SubExpr = E->getSubExpr();
1760183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    QualType EltType = E->getType()->getAs<ComplexType>()->getElementType();
1761a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    QualType SubType = SubExpr->getType();
1762ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1763a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    if (SubType->isRealFloatingType()) {
1764ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson      APFloat Result(0.0);
17651725f683432715e5afe34d476024bd6f16eac3fcEli Friedman
1766ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson      if (!EvaluateFloat(SubExpr, Result, Info))
1767ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson        return APValue();
17681725f683432715e5afe34d476024bd6f16eac3fcEli Friedman
17691725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      if (EltType->isRealFloatingType()) {
17701725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        Result = HandleFloatToFloatCast(EltType, SubType, Result, Info.Ctx);
17711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        return APValue(Result,
17721725f683432715e5afe34d476024bd6f16eac3fcEli Friedman                       APFloat(Result.getSemantics(), APFloat::fcZero, false));
17731725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      } else {
17741725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        llvm::APSInt IResult;
17751725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        IResult = HandleFloatToIntCast(EltType, SubType, Result, Info.Ctx);
17761725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        llvm::APSInt Zero(IResult.getBitWidth(), !IResult.isSigned());
17771725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        Zero = 0;
17781725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        return APValue(IResult, Zero);
17791725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      }
1780a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    } else if (SubType->isIntegerType()) {
1781a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      APSInt Result;
17821725f683432715e5afe34d476024bd6f16eac3fcEli Friedman
1783a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      if (!EvaluateInteger(SubExpr, Result, Info))
1784a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar        return APValue();
1785a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
17861725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      if (EltType->isRealFloatingType()) {
17871725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        APFloat FResult =
17881725f683432715e5afe34d476024bd6f16eac3fcEli Friedman            HandleIntToFloatCast(EltType, SubType, Result, Info.Ctx);
17891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        return APValue(FResult,
17901725f683432715e5afe34d476024bd6f16eac3fcEli Friedman                       APFloat(FResult.getSemantics(), APFloat::fcZero, false));
17911725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      } else {
17921725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        Result = HandleIntToIntCast(EltType, SubType, Result, Info.Ctx);
17931725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        llvm::APSInt Zero(Result.getBitWidth(), !Result.isSigned());
17941725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        Zero = 0;
17951725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        return APValue(Result, Zero);
17961725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      }
1797183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    } else if (const ComplexType *CT = SubType->getAs<ComplexType>()) {
1798a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      APValue Src;
17991725f683432715e5afe34d476024bd6f16eac3fcEli Friedman
1800a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      if (!EvaluateComplex(SubExpr, Src, Info))
1801a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        return APValue();
1802a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1803a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      QualType SrcType = CT->getElementType();
1804a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1805a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      if (Src.isComplexFloat()) {
1806a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        if (EltType->isRealFloatingType()) {
18071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump          return APValue(HandleFloatToFloatCast(EltType, SrcType,
1808a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                                Src.getComplexFloatReal(),
1809a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                                Info.Ctx),
18101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                         HandleFloatToFloatCast(EltType, SrcType,
1811a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                                Src.getComplexFloatImag(),
1812a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                                Info.Ctx));
1813a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        } else {
1814a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar          return APValue(HandleFloatToIntCast(EltType, SrcType,
1815a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Src.getComplexFloatReal(),
1816a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Info.Ctx),
18171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                         HandleFloatToIntCast(EltType, SrcType,
1818a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Src.getComplexFloatImag(),
18191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                              Info.Ctx));
1820a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        }
1821a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      } else {
1822a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        assert(Src.isComplexInt() && "Invalid evaluate result.");
1823a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        if (EltType->isRealFloatingType()) {
18241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump          return APValue(HandleIntToFloatCast(EltType, SrcType,
1825a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Src.getComplexIntReal(),
1826a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Info.Ctx),
18271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                         HandleIntToFloatCast(EltType, SrcType,
1828a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Src.getComplexIntImag(),
1829a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Info.Ctx));
1830a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        } else {
1831a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar          return APValue(HandleIntToIntCast(EltType, SrcType,
1832a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                            Src.getComplexIntReal(),
1833a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                            Info.Ctx),
18341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                         HandleIntToIntCast(EltType, SrcType,
1835a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                            Src.getComplexIntImag(),
18361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                            Info.Ctx));
1837a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        }
1838a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      }
1839ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    }
1840ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1841ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    // FIXME: Handle more casts.
1842ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    return APValue();
1843ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  }
18441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1845ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  APValue VisitBinaryOperator(const BinaryOperator *E);
1846ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  APValue VisitChooseExpr(const ChooseExpr *E)
1847ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman    { return Visit(E->getChosenSubExpr(Info.Ctx)); }
1848ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  APValue VisitUnaryExtension(const UnaryOperator *E)
1849ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman    { return Visit(E->getSubExpr()); }
1850ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  // FIXME Missing: unary +/-/~, binary div, ImplicitValueInitExpr,
18512217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman  //                conditional ?:, comma
18529ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson};
18539ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson} // end anonymous namespace
18549ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
18551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic bool EvaluateComplex(const Expr *E, APValue &Result, EvalInfo &Info) {
1856a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  Result = ComplexExprEvaluator(Info).Visit(const_cast<Expr*>(E));
1857a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  assert((!Result.isComplexFloat() ||
18581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump          (&Result.getComplexFloatReal().getSemantics() ==
18591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump           &Result.getComplexFloatImag().getSemantics())) &&
1860a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar         "Invalid complex evaluation.");
1861a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  return Result.isComplexFloat() || Result.isComplexInt();
18629ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson}
18639ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
18641eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue ComplexExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
1865ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  APValue Result, RHS;
18661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1867a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  if (!EvaluateComplex(E->getLHS(), Result, Info))
1868ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    return APValue();
18691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1870a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  if (!EvaluateComplex(E->getRHS(), RHS, Info))
1871ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    return APValue();
1872a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
18733f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar  assert(Result.isComplexFloat() == RHS.isComplexFloat() &&
18743f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar         "Invalid operands to binary operator.");
1875ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  switch (E->getOpcode()) {
1876ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  default: return APValue();
1877ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  case BinaryOperator::Add:
1878a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    if (Result.isComplexFloat()) {
1879a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatReal().add(RHS.getComplexFloatReal(),
1880a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                       APFloat::rmNearestTiesToEven);
1881a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatImag().add(RHS.getComplexFloatImag(),
1882a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                       APFloat::rmNearestTiesToEven);
1883a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    } else {
1884a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntReal() += RHS.getComplexIntReal();
1885a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntImag() += RHS.getComplexIntImag();
1886a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    }
18873f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    break;
1888ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  case BinaryOperator::Sub:
1889a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    if (Result.isComplexFloat()) {
1890a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatReal().subtract(RHS.getComplexFloatReal(),
1891a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                            APFloat::rmNearestTiesToEven);
1892a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatImag().subtract(RHS.getComplexFloatImag(),
1893a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                            APFloat::rmNearestTiesToEven);
1894a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    } else {
1895a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntReal() -= RHS.getComplexIntReal();
1896a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntImag() -= RHS.getComplexIntImag();
1897a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    }
18983f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    break;
18993f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar  case BinaryOperator::Mul:
19003f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    if (Result.isComplexFloat()) {
19013f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APValue LHS = Result;
19023f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &LHS_r = LHS.getComplexFloatReal();
19033f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &LHS_i = LHS.getComplexFloatImag();
19043f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &RHS_r = RHS.getComplexFloatReal();
19053f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &RHS_i = RHS.getComplexFloatImag();
19061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19073f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat Tmp = LHS_r;
19083f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven);
19093f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatReal() = Tmp;
19103f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp = LHS_i;
19113f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven);
19123f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatReal().subtract(Tmp, APFloat::rmNearestTiesToEven);
19133f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar
19143f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp = LHS_r;
19153f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven);
19163f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatImag() = Tmp;
19173f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp = LHS_i;
19183f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven);
19193f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatImag().add(Tmp, APFloat::rmNearestTiesToEven);
19203f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    } else {
19213f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APValue LHS = Result;
19221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Result.getComplexIntReal() =
19233f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar        (LHS.getComplexIntReal() * RHS.getComplexIntReal() -
19243f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar         LHS.getComplexIntImag() * RHS.getComplexIntImag());
19251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Result.getComplexIntImag() =
19263f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar        (LHS.getComplexIntReal() * RHS.getComplexIntImag() +
19273f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar         LHS.getComplexIntImag() * RHS.getComplexIntReal());
19283f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    }
19293f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    break;
1930ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  }
1931ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1932ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  return Result;
1933ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson}
1934ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
19359ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===//
19366ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner// Top level Expr::Evaluate method.
1937f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
1938f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
19396ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner/// Evaluate - Return true if this is a constant which we can fold using
1940019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// any crazy technique (that has nothing to do with language standards) that
1941019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// we want to.  If this function returns true, it returns the folded constant
1942019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// in Result.
19435b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlssonbool Expr::Evaluate(EvalResult &Result, ASTContext &Ctx) const {
19445b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson  EvalInfo Info(Ctx, Result);
194554da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson
194659b5da6d853b4368b984700315adf7b37de05764Nate Begeman  if (getType()->isVectorType()) {
194759b5da6d853b4368b984700315adf7b37de05764Nate Begeman    if (!EvaluateVector(this, Result.Val, Info))
194859b5da6d853b4368b984700315adf7b37de05764Nate Begeman      return false;
194959b5da6d853b4368b984700315adf7b37de05764Nate Begeman  } else if (getType()->isIntegerType()) {
195030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    if (!IntExprEvaluator(Info, Result.Val).Visit(const_cast<Expr*>(this)))
19516dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
19528958891f5fa1e593c4519a36b3df427ee019d70bDaniel Dunbar  } else if (getType()->hasPointerRepresentation()) {
19535b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson    if (!EvaluatePointer(this, Result.Val, Info))
19546dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
1955d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  } else if (getType()->isRealFloatingType()) {
1956d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    llvm::APFloat f(0.0);
19576dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson    if (!EvaluateFloat(this, f, Info))
19586dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
19591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19605b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson    Result.Val = APValue(f);
1961a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  } else if (getType()->isAnyComplexType()) {
1962a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    if (!EvaluateComplex(this, Result.Val, Info))
1963660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump      return false;
1964660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump  } else
1965660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump    return false;
1966660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump
1967660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump  return true;
1968660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump}
1969660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump
1970660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stumpbool Expr::EvaluateAsAny(EvalResult &Result, ASTContext &Ctx) const {
1971660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump  EvalInfo Info(Ctx, Result, true);
1972660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump
1973660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump  if (getType()->isVectorType()) {
1974660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump    if (!EvaluateVector(this, Result.Val, Info))
1975660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump      return false;
1976660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump  } else if (getType()->isIntegerType()) {
1977660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump    if (!IntExprEvaluator(Info, Result.Val).Visit(const_cast<Expr*>(this)))
1978660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump      return false;
1979660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump  } else if (getType()->hasPointerRepresentation()) {
1980660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump    if (!EvaluatePointer(this, Result.Val, Info))
1981660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump      return false;
1982660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump  } else if (getType()->isRealFloatingType()) {
1983660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump    llvm::APFloat f(0.0);
1984660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump    if (!EvaluateFloat(this, f, Info))
1985660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump      return false;
1986660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump
1987660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump    Result.Val = APValue(f);
1988660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump  } else if (getType()->isAnyComplexType()) {
1989660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump    if (!EvaluateComplex(this, Result.Val, Info))
19906dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
1991a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  } else
19929d4c157baaada8945671dc98363a40ed00cbd824Anders Carlsson    return false;
19936dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson
19945b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson  return true;
19955b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson}
19965b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson
1997cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCallbool Expr::EvaluateAsBooleanCondition(bool &Result, ASTContext &Ctx) const {
1998cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall  EvalResult Scratch;
1999cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall  EvalInfo Info(Ctx, Scratch);
2000cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall
2001cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall  return HandleConversionToBool(this, Result, Info);
2002cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall}
2003cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall
20041b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlssonbool Expr::EvaluateAsLValue(EvalResult &Result, ASTContext &Ctx) const {
20051b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson  EvalInfo Info(Ctx, Result);
20061b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson
20071b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson  return EvaluateLValue(this, Result.Val, Info) && !Result.HasSideEffects;
20081b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson}
20091b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson
2010b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedmanbool Expr::EvaluateAsAnyLValue(EvalResult &Result, ASTContext &Ctx) const {
2011b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman  EvalInfo Info(Ctx, Result, true);
2012b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman
2013b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman  return EvaluateLValue(this, Result.Val, Info) && !Result.HasSideEffects;
2014b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman}
2015b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman
20166ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner/// isEvaluatable - Call Evaluate to see if this expression can be constant
201745b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner/// folded, but discard the result.
201845b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattnerbool Expr::isEvaluatable(ASTContext &Ctx) const {
20194fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson  EvalResult Result;
20204fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson  return Evaluate(Result, Ctx) && !Result.HasSideEffects;
202145b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner}
202251fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson
2023393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanianbool Expr::HasSideEffects(ASTContext &Ctx) const {
2024393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian  Expr::EvalResult Result;
2025393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian  EvalInfo Info(Ctx, Result);
2026393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian  return HasSideEffect(Info).Visit(const_cast<Expr*>(this));
2027393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian}
2028393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian
202951fe996231b1d7199f76e4005ff4c943d5deeecdAnders CarlssonAPSInt Expr::EvaluateAsInt(ASTContext &Ctx) const {
20301c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  EvalResult EvalResult;
20311c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  bool Result = Evaluate(EvalResult, Ctx);
2032f185319f25efd6094870f287030270fad26085baDaniel Dunbar  Result = Result;
203351fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson  assert(Result && "Could not evaluate expression");
20341c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer");
203551fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson
20361c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  return EvalResult.Val.getInt();
203751fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson}
2038