ExprConstant.cpp revision 1c0cfd4599e816cfd7a8f348286bf0ad79652ffc
1b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner//===--- ExprConstant.cpp - Expression Constant Evaluator -----------------===//
2c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//
3c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//                     The LLVM Compiler Infrastructure
4c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//
5c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// This file is distributed under the University of Illinois Open Source
6c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// License. See LICENSE.TXT for details.
7c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//
8c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//===----------------------------------------------------------------------===//
9c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//
10c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// This file implements the Expr constant evaluator.
11c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//
12c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//===----------------------------------------------------------------------===//
13c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson
14c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson#include "clang/AST/APValue.h"
15c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson#include "clang/AST/ASTContext.h"
164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman#include "clang/AST/RecordLayout.h"
170fe52e1bcaa69ba127f1bda036f057fec1f478deSeo Sanghyeon#include "clang/AST/StmtVisitor.h"
1854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner#include "clang/Basic/Diagnostic.h"
1906a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson#include "clang/Basic/TargetInfo.h"
20c754aa62643e66ab967ca32ae8b0b3fc419bba25Anders Carlsson#include "llvm/Support/Compiler.h"
21c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlssonusing namespace clang;
22f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerusing llvm::APSInt;
23d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanusing llvm::APFloat;
24c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson
2587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// EvalInfo - This is a private struct used by the evaluator to capture
2687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// information about a subexpression as it is folded.  It retains information
2787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// about the AST context, but also maintains information about the folded
2887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// expression.
2987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner///
3087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// If an expression could be evaluated, it is still possible it is not a C
3187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// "integer constant expression" or constant expression.  If not, this struct
3287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// captures information about how and why not.
3387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner///
3487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// One bit of information passed *into* the request for constant folding
3587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// indicates whether the subexpression is "evaluated" or not according to C
3687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// rules.  For example, the RHS of (0 && foo()) is not evaluated.  We can
3787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// evaluate the expression regardless of what the RHS is, but C only allows
3887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// certain things in certain situations.
3987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstruct EvalInfo {
4087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  ASTContext &Ctx;
4187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner
4254da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson  /// EvalResult - Contains information about the evaluation.
4354da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson  Expr::EvalResult &EvalResult;
44f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson
45f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson  /// ShortCircuit - will be greater than zero if the current subexpression has
46f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson  /// will not be evaluated because it's short-circuited (according to C rules).
47f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson  unsigned ShortCircuit;
4854da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson
4954da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson  EvalInfo(ASTContext &ctx, Expr::EvalResult& evalresult) : Ctx(ctx),
50f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson           EvalResult(evalresult), ShortCircuit(0) {}
5187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner};
5287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner
5387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner
544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool EvaluateLValue(const Expr *E, APValue &Result, EvalInfo &Info);
5587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluatePointer(const Expr *E, APValue &Result, EvalInfo &Info);
5687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluateInteger(const Expr *E, APSInt  &Result, EvalInfo &Info);
57d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr *E, APFloat &Result, EvalInfo &Info);
589ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonstatic bool EvaluateComplexFloat(const Expr *E, APValue &Result,
599ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson                                 EvalInfo &Info);
60f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
61f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// Misc utilities
634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool HandleConversionToBool(Expr* E, bool& Result, EvalInfo &Info) {
664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (E->getType()->isIntegralType()) {
674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APSInt IntResult;
684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!EvaluateInteger(E, IntResult, Info))
694efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
704efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Result = IntResult != 0;
714efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
724efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  } else if (E->getType()->isRealFloatingType()) {
734efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APFloat FloatResult(0.0);
744efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!EvaluateFloat(E, FloatResult, Info))
754efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
764efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Result = !FloatResult.isZero();
774efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  } else if (E->getType()->isPointerType()) {
794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APValue PointerResult;
804efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!EvaluatePointer(E, PointerResult, Info))
814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
824efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    // FIXME: Is this accurate for all kinds of bases?  If not, what would
834efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    // the check look like?
844efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Result = PointerResult.getLValueBase() || PointerResult.getLValueOffset();
854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
864efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
874efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
884efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return false;
894efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
904efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
914efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// LValue Evaluation
934efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmannamespace {
954efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanclass VISIBILITY_HIDDEN LValueExprEvaluator
964efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  : public StmtVisitor<LValueExprEvaluator, APValue> {
974efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  EvalInfo &Info;
984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanpublic:
994efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1004efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  LValueExprEvaluator(EvalInfo &info) : Info(info) {}
1014efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1024efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitStmt(Stmt *S) {
1038a7b7c6d4c96ace3667204bed4a48bad91b7c0f0Daniel Dunbar#if 0
1044efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    // FIXME: Remove this when we support more expressions.
1054efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    printf("Unhandled pointer statement\n");
1064efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    S->dump();
1078a7b7c6d4c96ace3667204bed4a48bad91b7c0f0Daniel Dunbar#endif
1084efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return APValue();
1094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
1104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
11235873c49adad211ff466e34342a52665742794f5Anders Carlsson  APValue VisitDeclRefExpr(DeclRefExpr *E);
1134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitPredefinedExpr(PredefinedExpr *E) { return APValue(E, 0); }
1144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
1154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitMemberExpr(MemberExpr *E);
1164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitStringLiteral(StringLiteral *E) { return APValue(E, 0); }
1173068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  APValue VisitArraySubscriptExpr(ArraySubscriptExpr *E);
1184efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman};
1194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} // end anonymous namespace
1204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1214efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool EvaluateLValue(const Expr* E, APValue& Result, EvalInfo &Info) {
1224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  Result = LValueExprEvaluator(Info).Visit(const_cast<Expr*>(E));
1234efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return Result.isLValue();
1244efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
1254efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
12635873c49adad211ff466e34342a52665742794f5Anders CarlssonAPValue LValueExprEvaluator::VisitDeclRefExpr(DeclRefExpr *E)
12735873c49adad211ff466e34342a52665742794f5Anders Carlsson{
12835873c49adad211ff466e34342a52665742794f5Anders Carlsson  if (!E->hasGlobalStorage())
12935873c49adad211ff466e34342a52665742794f5Anders Carlsson    return APValue();
13035873c49adad211ff466e34342a52665742794f5Anders Carlsson
13135873c49adad211ff466e34342a52665742794f5Anders Carlsson  return APValue(E, 0);
13235873c49adad211ff466e34342a52665742794f5Anders Carlsson}
13335873c49adad211ff466e34342a52665742794f5Anders Carlsson
1344efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue LValueExprEvaluator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
1354efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (E->isFileScope())
1364efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return APValue(E, 0);
1374efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return APValue();
1384efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
1394efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1404efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue LValueExprEvaluator::VisitMemberExpr(MemberExpr *E) {
1414efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue result;
1424efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  QualType Ty;
1434efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (E->isArrow()) {
1444efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!EvaluatePointer(E->getBase(), result, Info))
1454efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return APValue();
1464efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Ty = E->getBase()->getType()->getAsPointerType()->getPointeeType();
1474efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  } else {
1484efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    result = Visit(E->getBase());
1494efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (result.isUninit())
1504efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return APValue();
1514efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Ty = E->getBase()->getType();
1524efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
1534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  RecordDecl *RD = Ty->getAsRecordType()->getDecl();
1554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD);
1564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  FieldDecl *FD = E->getMemberDecl();
1574efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  // FIXME: This is linear time.
15944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  unsigned i = 0;
16044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  for (RecordDecl::field_iterator Field = RD->field_begin(),
16144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor                               FieldEnd = RD->field_end();
16244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor       Field != FieldEnd; (void)++Field, ++i) {
16344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor    if (*Field == FD)
1644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      break;
1654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
1664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  result.setLValue(result.getLValueBase(),
1684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman                   result.getLValueOffset() + RL.getFieldOffset(i) / 8);
1694efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1704efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return result;
1714efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
1724efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1733068d117951a8df54bae9db039b56201ab10962bAnders CarlssonAPValue LValueExprEvaluator::VisitArraySubscriptExpr(ArraySubscriptExpr *E)
1743068d117951a8df54bae9db039b56201ab10962bAnders Carlsson{
1753068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  APValue Result;
1763068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
1773068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  if (!EvaluatePointer(E->getBase(), Result, Info))
1783068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    return APValue();
1793068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
1803068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  APSInt Index;
1813068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  if (!EvaluateInteger(E->getIdx(), Index, Info))
1823068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    return APValue();
1833068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
1843068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  uint64_t ElementSize = Info.Ctx.getTypeSize(E->getType()) / 8;
1853068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
1863068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  uint64_t Offset = Index.getSExtValue() * ElementSize;
1873068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  Result.setLValue(Result.getLValueBase(),
1883068d117951a8df54bae9db039b56201ab10962bAnders Carlsson                   Result.getLValueOffset() + Offset);
1893068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  return Result;
1903068d117951a8df54bae9db039b56201ab10962bAnders Carlsson}
1914efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
193f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Pointer Evaluation
194f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
195f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
196c754aa62643e66ab967ca32ae8b0b3fc419bba25Anders Carlssonnamespace {
1972bad1687fe6f00e10767a691a33b070b151902b6Anders Carlssonclass VISIBILITY_HIDDEN PointerExprEvaluator
1982bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  : public StmtVisitor<PointerExprEvaluator, APValue> {
19987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  EvalInfo &Info;
2002bad1687fe6f00e10767a691a33b070b151902b6Anders Carlssonpublic:
2012bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
20287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  PointerExprEvaluator(EvalInfo &info) : Info(info) {}
203f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
2042bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  APValue VisitStmt(Stmt *S) {
2052bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson    return APValue();
2062bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  }
2072bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
2082bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
2092bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
210650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  APValue VisitBinaryOperator(const BinaryOperator *E);
211650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  APValue VisitCastExpr(const CastExpr* E);
2124efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitUnaryOperator(const UnaryOperator *E);
2134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitObjCStringLiteral(ObjCStringLiteral *E)
2144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      { return APValue(E, 0); }
2154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitConditionalOperator(ConditionalOperator *E);
2162bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson};
217f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace
2182bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
21987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluatePointer(const Expr* E, APValue& Result, EvalInfo &Info) {
220f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  if (!E->getType()->isPointerType())
221f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner    return false;
22287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  Result = PointerExprEvaluator(Info).Visit(const_cast<Expr*>(E));
223f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  return Result.isLValue();
224f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner}
225650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
226f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris LattnerAPValue PointerExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
227650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  if (E->getOpcode() != BinaryOperator::Add &&
228650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson      E->getOpcode() != BinaryOperator::Sub)
229650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    return APValue();
230650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
231650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  const Expr *PExp = E->getLHS();
232650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  const Expr *IExp = E->getRHS();
233650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  if (IExp->getType()->isPointerType())
234f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner    std::swap(PExp, IExp);
235650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
236650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  APValue ResultLValue;
23787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  if (!EvaluatePointer(PExp, ResultLValue, Info))
238650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    return APValue();
239f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
240650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  llvm::APSInt AdditionalOffset(32);
24187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  if (!EvaluateInteger(IExp, AdditionalOffset, Info))
242650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    return APValue();
243650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
2444efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  QualType PointeeType = PExp->getType()->getAsPointerType()->getPointeeType();
2454efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  uint64_t SizeOfPointee = Info.Ctx.getTypeSize(PointeeType) / 8;
2464efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
247650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  uint64_t Offset = ResultLValue.getLValueOffset();
2484efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
249650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  if (E->getOpcode() == BinaryOperator::Add)
2504efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Offset += AdditionalOffset.getLimitedValue() * SizeOfPointee;
251650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  else
2524efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Offset -= AdditionalOffset.getLimitedValue() * SizeOfPointee;
2534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
254650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  return APValue(ResultLValue.getLValueBase(), Offset);
255650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson}
2564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2574efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue PointerExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
2584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (E->getOpcode() == UnaryOperator::Extension) {
2594efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    // FIXME: Deal with warnings?
2604efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return Visit(E->getSubExpr());
2614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
2624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (E->getOpcode() == UnaryOperator::AddrOf) {
2644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APValue result;
2654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (EvaluateLValue(E->getSubExpr(), result, Info))
2664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return result;
2674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
2684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2694efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return APValue();
2704efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
271d407a7619904c81d38b41a9ee850de413105084bAnders Carlsson
272650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
273b542afe02d317411d53b3541946f9f2a8f509a11Chris LattnerAPValue PointerExprEvaluator::VisitCastExpr(const CastExpr* E) {
274650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  const Expr* SubExpr = E->getSubExpr();
275650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
276650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson   // Check for pointer->pointer cast
277650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  if (SubExpr->getType()->isPointerType()) {
278650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    APValue Result;
27987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner    if (EvaluatePointer(SubExpr, Result, Info))
280650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson      return Result;
281f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner    return APValue();
282650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  }
283650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
284d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman  if (SubExpr->getType()->isIntegralType()) {
285650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    llvm::APSInt Result(32);
28687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner    if (EvaluateInteger(SubExpr, Result, Info)) {
28787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner      Result.extOrTrunc((unsigned)Info.Ctx.getTypeSize(E->getType()));
288650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson      return APValue(0, Result.getZExtValue());
289650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    }
290650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  }
2914efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (SubExpr->getType()->isFunctionType() ||
2934efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      SubExpr->getType()->isArrayType()) {
2944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APValue Result;
2954efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (EvaluateLValue(SubExpr, Result, Info))
2964efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return Result;
2974efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return APValue();
2984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
2994efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
3004efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  //assert(0 && "Unhandled cast");
301650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  return APValue();
302650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson}
303650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
3044efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue PointerExprEvaluator::VisitConditionalOperator(ConditionalOperator *E) {
3054efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  bool BoolResult;
3064efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (!HandleConversionToBool(E->getCond(), BoolResult, Info))
3074efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return APValue();
3084efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
3094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  Expr* EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr();
3104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
3114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue Result;
3124efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (EvaluatePointer(EvalExpr, Result, Info))
3134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return Result;
3144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return APValue();
3154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
316f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
317f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
318f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Integer Evaluation
319f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
320f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
321f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnernamespace {
322f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerclass VISIBILITY_HIDDEN IntExprEvaluator
323b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  : public StmtVisitor<IntExprEvaluator, bool> {
32487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  EvalInfo &Info;
325b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  APSInt &Result;
326f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerpublic:
32787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  IntExprEvaluator(EvalInfo &info, APSInt &result)
32887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner    : Info(info), Result(result) {}
329f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
3307a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner  unsigned getIntTypeSizeInBits(QualType T) const {
33154176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    return (unsigned)Info.Ctx.getIntWidth(T);
33254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner  }
33354176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner
33482206e267ce6cc709797127616f64672d255b310Anders Carlsson  bool Extension(SourceLocation L, diag::kind D, const Expr *E) {
33554da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson    Info.EvalResult.DiagLoc = L;
33654da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson    Info.EvalResult.Diag = D;
33782206e267ce6cc709797127616f64672d255b310Anders Carlsson    Info.EvalResult.DiagExpr = E;
33854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    return true;  // still a constant.
33954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner  }
34054176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner
34182206e267ce6cc709797127616f64672d255b310Anders Carlsson  bool Error(SourceLocation L, diag::kind D, const Expr *E) {
34254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    // If this is in an unevaluated portion of the subexpression, ignore the
34354176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    // error.
344f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson    if (Info.ShortCircuit) {
34532fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner      // If error is ignored because the value isn't evaluated, get the real
34632fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner      // type at least to prevent errors downstream.
34782206e267ce6cc709797127616f64672d255b310Anders Carlsson      Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
34882206e267ce6cc709797127616f64672d255b310Anders Carlsson      Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
34954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner      return true;
35032fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    }
35154176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner
35232fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    // Take the first error.
35354da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson    if (Info.EvalResult.Diag == 0) {
35454da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson      Info.EvalResult.DiagLoc = L;
35554da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson      Info.EvalResult.Diag = D;
35682206e267ce6cc709797127616f64672d255b310Anders Carlsson      Info.EvalResult.DiagExpr = E;
35732fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    }
35854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    return false;
3597a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner  }
3607a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner
361f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  //===--------------------------------------------------------------------===//
362f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  //                            Visitor Methods
363f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  //===--------------------------------------------------------------------===//
36432fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner
36532fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner  bool VisitStmt(Stmt *) {
36632fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    assert(0 && "This should be called on integers, stmts are not integers");
36732fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    return false;
36832fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner  }
3697a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner
37032fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner  bool VisitExpr(Expr *E) {
3710e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
372f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  }
373f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
374b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
375f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
3764c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitIntegerLiteral(const IntegerLiteral *E) {
3774c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    Result = E->getValue();
3784c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
3794c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    return true;
3804c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  }
3814c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitCharacterLiteral(const CharacterLiteral *E) {
3824c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
3834c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    Result = E->getValue();
3844c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
3854c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    return true;
3864c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  }
3874c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitTypesCompatibleExpr(const TypesCompatibleExpr *E) {
3884c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
389ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    // Per gcc docs "this built-in function ignores top level
390ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    // qualifiers".  We need to use the canonical version to properly
391ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    // be able to strip CRV qualifiers from the type.
392ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    QualType T0 = Info.Ctx.getCanonicalType(E->getArgType1());
393ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    QualType T1 = Info.Ctx.getCanonicalType(E->getArgType2());
394ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    Result = Info.Ctx.typesAreCompatible(T0.getUnqualifiedType(),
395ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar                                         T1.getUnqualifiedType());
3964c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    return true;
3974c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  }
3984c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitDeclRefExpr(const DeclRefExpr *E);
3994c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitCallExpr(const CallExpr *E);
400b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  bool VisitBinaryOperator(const BinaryOperator *E);
401b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  bool VisitUnaryOperator(const UnaryOperator *E);
402ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes  bool VisitConditionalOperator(const ConditionalOperator *E);
403f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
404732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner  bool VisitCastExpr(CastExpr* E) {
40582206e267ce6cc709797127616f64672d255b310Anders Carlsson    return HandleCast(E);
406f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  }
4070518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  bool VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E);
4080518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl
4093068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  bool VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) {
410529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
4113068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    Result = E->getValue();
4123068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
4133068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    return true;
4143068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  }
4153068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
4163068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  bool VisitCXXZeroInitValueExpr(const CXXZeroInitValueExpr *E) {
4173068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    Result = APSInt::getNullValue(getIntTypeSizeInBits(E->getType()));
4183068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
4193068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    return true;
4203068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  }
4213068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
422fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattnerprivate:
42382206e267ce6cc709797127616f64672d255b310Anders Carlsson  bool HandleCast(CastExpr* E);
424f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner};
425f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace
426f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
42787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluateInteger(const Expr* E, APSInt &Result, EvalInfo &Info) {
42887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  return IntExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E));
429f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner}
430f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
4314c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattnerbool IntExprEvaluator::VisitDeclRefExpr(const DeclRefExpr *E) {
4324c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  // Enums are integer constant exprs.
4334c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  if (const EnumConstantDecl *D = dyn_cast<EnumConstantDecl>(E->getDecl())) {
4344c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    Result = D->getInitVal();
435e9a0f43927041e2bcc89140c338dfae207ad3c3bEli Friedman    // FIXME: This is an ugly hack around the fact that enums don't set their
436e9a0f43927041e2bcc89140c338dfae207ad3c3bEli Friedman    // signedness consistently; see PR3173
437e9a0f43927041e2bcc89140c338dfae207ad3c3bEli Friedman    Result.setIsUnsigned(!E->getType()->isSignedIntegerType());
4384c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    return true;
4394c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  }
4404c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner
4414c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  // Otherwise, random variable references are not constants.
4420e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson  return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
4434c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner}
4444c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner
445a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way
446a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// as GCC.
447a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattnerstatic int EvaluateBuiltinClassifyType(const CallExpr *E) {
448a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  // The following enum mimics the values returned by GCC.
449a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  enum gcc_type_class {
450a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    no_type_class = -1,
451a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    void_type_class, integer_type_class, char_type_class,
452a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    enumeral_type_class, boolean_type_class,
453a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    pointer_type_class, reference_type_class, offset_type_class,
454a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    real_type_class, complex_type_class,
455a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    function_type_class, method_type_class,
456a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    record_type_class, union_type_class,
457a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    array_type_class, string_type_class,
458a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    lang_type_class
459a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  };
460a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner
461a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  // If no argument was supplied, default to "no_type_class". This isn't
462a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  // ideal, however it is what gcc does.
463a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  if (E->getNumArgs() == 0)
464a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return no_type_class;
465a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner
466a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  QualType ArgTy = E->getArg(0)->getType();
467a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  if (ArgTy->isVoidType())
468a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return void_type_class;
469a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isEnumeralType())
470a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return enumeral_type_class;
471a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isBooleanType())
472a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return boolean_type_class;
473a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isCharType())
474a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return string_type_class; // gcc doesn't appear to use char_type_class
475a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isIntegerType())
476a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return integer_type_class;
477a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isPointerType())
478a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return pointer_type_class;
479a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isReferenceType())
480a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return reference_type_class;
481a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isRealType())
482a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return real_type_class;
483a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isComplexType())
484a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return complex_type_class;
485a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isFunctionType())
486a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return function_type_class;
487a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isStructureType())
488a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return record_type_class;
489a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isUnionType())
490a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return union_type_class;
491a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isArrayType())
492a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return array_type_class;
493a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isUnionType())
494a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return union_type_class;
495a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else  // FIXME: offset_type_class, method_type_class, & lang_type_class?
496a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    assert(0 && "CallExpr::isBuiltinClassifyType(): unimplemented type");
497a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  return -1;
498a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner}
499a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner
5004c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattnerbool IntExprEvaluator::VisitCallExpr(const CallExpr *E) {
5014c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
5024c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner
503019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  switch (E->isBuiltinCall()) {
504019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  default:
5050e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
506019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_classify_type:
507a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    Result.setIsSigned(true);
508a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    Result = EvaluateBuiltinClassifyType(E);
509019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner    return true;
510019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner
5114bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson  case Builtin::BI__builtin_constant_p:
512019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner    // __builtin_constant_p always has one operand: it returns true if that
513019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner    // operand can be folded, false otherwise.
5144bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson    Result = E->getArg(0)->isEvaluatable(Info.Ctx);
515019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner    return true;
516019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  }
5174c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner}
518f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
519b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
520a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  if (E->getOpcode() == BinaryOperator::Comma) {
521027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson    if (!Visit(E->getRHS()))
522027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson      return false;
5234fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson
5244fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson    if (!Info.ShortCircuit) {
5254fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson      // If we can't evaluate the LHS, it must be because it has
5264fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson      // side effects.
5274fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson      if (!E->getLHS()->isEvaluatable(Info.Ctx))
5284fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson        Info.EvalResult.HasSideEffects = true;
5294fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson
5300e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson      return Extension(E->getOperatorLoc(), diag::note_comma_in_ice, E);
5314fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson    }
532c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner
533027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson    return true;
534a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  }
535a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
536a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  if (E->isLogicalOp()) {
537a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // These need to be handled specially because the operands aren't
538a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // necessarily integral
539fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson    bool lhsResult, rhsResult;
54051fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson
541fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson    if (HandleConversionToBool(E->getLHS(), lhsResult, Info)) {
54251fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson      // We were able to evaluate the LHS, see if we can get away with not
54351fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson      // evaluating the RHS: 0 && X -> 0, 1 || X -> 1
544fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson      if (lhsResult == (E->getOpcode() == BinaryOperator::LOr) ||
545fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson          !lhsResult == (E->getOpcode() == BinaryOperator::LAnd)) {
5464bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
5474bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
548fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson        Result = lhsResult;
5494bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson
550f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson        Info.ShortCircuit++;
551fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson        bool rhsEvaluated = HandleConversionToBool(E->getRHS(), rhsResult, Info);
552f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson        Info.ShortCircuit--;
553f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson
554fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson        if (rhsEvaluated)
555fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson          return true;
556fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson
557fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson        // FIXME: Return an extension warning saying that the RHS could not be
558fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson        // evaluated.
5594bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        return true;
560a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman      }
561a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
562fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson      if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) {
5634bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
5644bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
5654bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        if (E->getOpcode() == BinaryOperator::LOr)
566fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson          Result = lhsResult || rhsResult;
5674bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        else
568fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson          Result = lhsResult && rhsResult;
5694bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        return true;
5704bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson      }
5714bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson    } else {
572fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson      if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) {
5734bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        // We can't evaluate the LHS; however, sometimes the result
5744bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        // is determined by the RHS: X && 0 -> 0, X || 1 -> 1.
575fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson        if (rhsResult == (E->getOpcode() == BinaryOperator::LOr) ||
576fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson            !rhsResult == (E->getOpcode() == BinaryOperator::LAnd)) {
5774bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson          Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
5784bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson          Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
579fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson          Result = rhsResult;
580fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson
581fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson          // Since we werent able to evaluate the left hand side, it
582fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson          // must have had side effects.
583fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson          Info.EvalResult.HasSideEffects = true;
584fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson
5854bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson          return true;
5864bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        }
5874bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson      }
588a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    }
589a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
590a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    return false;
591c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner  }
59254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner
593286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  QualType LHSTy = E->getLHS()->getType();
594286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  QualType RHSTy = E->getRHS()->getType();
595286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson
596286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  if (LHSTy->isRealFloatingType() &&
597286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      RHSTy->isRealFloatingType()) {
598286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    APFloat RHS(0.0), LHS(0.0);
599286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson
600286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    if (!EvaluateFloat(E->getRHS(), RHS, Info))
601286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      return false;
602286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson
603286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    if (!EvaluateFloat(E->getLHS(), LHS, Info))
604286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      return false;
605286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson
606286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    APFloat::cmpResult CR = LHS.compare(RHS);
607529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson
608529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
609529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson
610286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    switch (E->getOpcode()) {
611286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    default:
612286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      assert(0 && "Invalid binary operator!");
613286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::LT:
614286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      Result = CR == APFloat::cmpLessThan;
615286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      break;
616286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::GT:
617286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      Result = CR == APFloat::cmpGreaterThan;
618286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      break;
619286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::LE:
620286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      Result = CR == APFloat::cmpLessThan || CR == APFloat::cmpEqual;
621286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      break;
622286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::GE:
623286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      Result = CR == APFloat::cmpGreaterThan || CR == APFloat::cmpEqual;
624286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      break;
625286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::EQ:
626286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      Result = CR == APFloat::cmpEqual;
627286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      break;
628286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::NE:
629286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      Result = CR == APFloat::cmpGreaterThan || CR == APFloat::cmpLessThan;
630286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      break;
631286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    }
632286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson
633286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
634286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    return true;
635286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  }
636286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson
6373068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  if (E->getOpcode() == BinaryOperator::Sub) {
638529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson    if (LHSTy->isPointerType() && RHSTy->isPointerType()) {
6393068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      APValue LHSValue;
6403068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      if (!EvaluatePointer(E->getLHS(), LHSValue, Info))
6413068d117951a8df54bae9db039b56201ab10962bAnders Carlsson        return false;
6423068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
6433068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      APValue RHSValue;
6443068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      if (!EvaluatePointer(E->getRHS(), RHSValue, Info))
6453068d117951a8df54bae9db039b56201ab10962bAnders Carlsson        return false;
6463068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
6473068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      // FIXME: Is this correct? What if only one of the operands has a base?
6483068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      if (LHSValue.getLValueBase() || RHSValue.getLValueBase())
6493068d117951a8df54bae9db039b56201ab10962bAnders Carlsson        return false;
6503068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
6513068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      const QualType Type = E->getLHS()->getType();
6523068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      const QualType ElementType = Type->getAsPointerType()->getPointeeType();
6533068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
6543068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      uint64_t D = LHSValue.getLValueOffset() - RHSValue.getLValueOffset();
6553068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      D /= Info.Ctx.getTypeSize(ElementType) / 8;
6563068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
6573068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
658529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson      Result = D;
6593068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
6603068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
6613068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      return true;
6623068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    }
6633068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  }
664286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  if (!LHSTy->isIntegralType() ||
665286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      !RHSTy->isIntegralType()) {
666a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // We can't continue from here for non-integral types, and they
667a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // could potentially confuse the following operations.
668a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // FIXME: Deal with EQ and friends.
669a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    return false;
670a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  }
671a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
672a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  // The LHS of a constant expr is always evaluated and needed.
673a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  llvm::APSInt RHS(32);
674a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  if (!Visit(E->getLHS())) {
675a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    return false; // error in subexpression.
676a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  }
677d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman
678d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman
679d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman  // FIXME Maybe we want to succeed even where we can't evaluate the
680d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman  // right side of LAnd/LOr?
681d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman  // For example, see http://llvm.org/bugs/show_bug.cgi?id=2525
68254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner  if (!EvaluateInteger(E->getRHS(), RHS, Info))
683b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner    return false;
684a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
685a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  switch (E->getOpcode()) {
68632fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner  default:
6870e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E);
68854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner  case BinaryOperator::Mul: Result *= RHS; return true;
68954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner  case BinaryOperator::Add: Result += RHS; return true;
69054176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner  case BinaryOperator::Sub: Result -= RHS; return true;
69154176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner  case BinaryOperator::And: Result &= RHS; return true;
69254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner  case BinaryOperator::Xor: Result ^= RHS; return true;
69354176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner  case BinaryOperator::Or:  Result |= RHS; return true;
694a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  case BinaryOperator::Div:
69554176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    if (RHS == 0)
6960e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson      return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E);
697b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner    Result /= RHS;
69832fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    break;
699a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  case BinaryOperator::Rem:
70054176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    if (RHS == 0)
7010e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson      return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E);
702a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson    Result %= RHS;
70332fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    break;
704a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  case BinaryOperator::Shl:
70554176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    // FIXME: Warn about out of range shift amounts!
706b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner    Result <<= (unsigned)RHS.getLimitedValue(Result.getBitWidth()-1);
707a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson    break;
708a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  case BinaryOperator::Shr:
709b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner    Result >>= (unsigned)RHS.getLimitedValue(Result.getBitWidth()-1);
710a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson    break;
711b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner
712ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner  case BinaryOperator::LT:
713ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    Result = Result < RHS;
714ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
715ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    break;
716ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner  case BinaryOperator::GT:
717ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    Result = Result > RHS;
718ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
719ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    break;
720ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner  case BinaryOperator::LE:
721ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    Result = Result <= RHS;
722ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
723ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    break;
724ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner  case BinaryOperator::GE:
725ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    Result = Result >= RHS;
726ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
727ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    break;
728ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner  case BinaryOperator::EQ:
729ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    Result = Result == RHS;
730ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
731ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    break;
732ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner  case BinaryOperator::NE:
733ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    Result = Result != RHS;
734ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
735ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner    break;
73654176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner  case BinaryOperator::LAnd:
73754176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    Result = Result != 0 && RHS != 0;
73854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
73954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    break;
74054176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner  case BinaryOperator::LOr:
74154176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    Result = Result != 0 || RHS != 0;
74254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
74354176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    break;
744b11e77836dd0867955c5abf32baf1c3e6c7f81e1Eli Friedman  }
745a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson
746a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
747b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  return true;
748a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson}
749a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson
750ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopesbool IntExprEvaluator::VisitConditionalOperator(const ConditionalOperator *E) {
751a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes  bool Cond;
752a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes  if (!HandleConversionToBool(E->getCond(), Cond, Info))
753ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes    return false;
754ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes
755a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes  return Visit(Cond ? E->getTrueExpr() : E->getFalseExpr());
756ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes}
757ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes
7580518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// VisitSizeAlignOfExpr - Evaluate a sizeof or alignof with a result as the
7590518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// expression's type.
7600518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redlbool IntExprEvaluator::VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E) {
7610518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  QualType DstTy = E->getType();
762fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner  // Return the result in the right width.
763fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner  Result.zextOrTrunc(getIntTypeSizeInBits(DstTy));
764fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner  Result.setIsUnsigned(DstTy->isUnsignedIntegerType());
765fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner
7660518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  QualType SrcTy = E->getTypeOfArgument();
7670518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl
768fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner  // sizeof(void) and __alignof__(void) = 1 as a gcc extension.
7694efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (SrcTy->isVoidType()) {
770fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner    Result = 1;
7714efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
7724efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
773fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner
774fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner  // sizeof(vla) is not a constantexpr: C99 6.5.3.4p2.
7754efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  // FIXME: But alignof(vla) is!
776fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner  if (!SrcTy->isConstantSizeType()) {
777fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner    // FIXME: Should we attempt to evaluate this?
778fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner    return false;
779fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner  }
7800518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl
7810518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  bool isSizeOf = E->isSizeOf();
782fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner
783fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner  // GCC extension: sizeof(function) = 1.
784fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner  if (SrcTy->isFunctionType()) {
785fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner    // FIXME: AlignOf shouldn't be unconditionally 4!
786fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner    Result = isSizeOf ? 1 : 4;
787fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner    return true;
788fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner  }
789fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner
790fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner  // Get information about the size or align.
79187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  unsigned CharSize = Info.Ctx.Target.getCharWidth();
792fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner  if (isSizeOf)
7934efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Result = Info.Ctx.getTypeSize(SrcTy) / CharSize;
794fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner  else
79587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner    Result = Info.Ctx.getTypeAlign(SrcTy) / CharSize;
796fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner  return true;
797fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner}
798fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner
799b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
8004c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  // Special case unary operators that do not need their subexpression
8014c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  // evaluated.  offsetof/sizeof/alignof are all special.
80275a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  if (E->isOffsetOfOp()) {
8034c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
80487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner    Result = E->evaluateOffsetOf(Info.Ctx);
80575a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
80675a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    return true;
80775a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  }
808a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
809a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  if (E->getOpcode() == UnaryOperator::LNot) {
810a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // LNot's operand isn't necessarily an integer, so we handle it specially.
811a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    bool bres;
812a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    if (!HandleConversionToBool(E->getSubExpr(), bres, Info))
813a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman      return false;
814a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
815a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
816a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    Result = !bres;
817a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    return true;
818a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  }
819a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
82087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  // Get the operand value into 'Result'.
82187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  if (!Visit(E->getSubExpr()))
82275a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    return false;
823a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson
82475a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  switch (E->getOpcode()) {
8254c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  default:
82675a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    // Address, indirect, pre/post inc/dec, etc are not valid constant exprs.
82775a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    // See C99 6.6p3.
8280e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E);
82975a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  case UnaryOperator::Extension:
8304c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    // FIXME: Should extension allow i-c-e extension expressions in its scope?
8314c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    // If so, we could clear the diagnostic ID.
83275a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  case UnaryOperator::Plus:
8334c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    // The result is always just the subexpr.
83475a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    break;
83575a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  case UnaryOperator::Minus:
83675a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    Result = -Result;
83775a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    break;
83875a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  case UnaryOperator::Not:
83975a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    Result = ~Result;
84075a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    break;
84106a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson  }
84206a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson
843a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
844b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  return true;
845a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson}
846a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson
847732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// HandleCast - This is used to evaluate implicit or explicit casts where the
848732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// result type is integer.
84982206e267ce6cc709797127616f64672d255b310Anders Carlssonbool IntExprEvaluator::HandleCast(CastExpr *E) {
85082206e267ce6cc709797127616f64672d255b310Anders Carlsson  Expr *SubExpr = E->getSubExpr();
85182206e267ce6cc709797127616f64672d255b310Anders Carlsson  QualType DestType = E->getType();
85282206e267ce6cc709797127616f64672d255b310Anders Carlsson
8537a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner  unsigned DestWidth = getIntTypeSizeInBits(DestType);
85406a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson
8554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (DestType->isBooleanType()) {
8564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    bool BoolResult;
8574efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!HandleConversionToBool(SubExpr, BoolResult, Info))
8584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
8594efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Result.zextOrTrunc(DestWidth);
8604efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Result.setIsUnsigned(DestType->isUnsignedIntegerType());
8614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Result = BoolResult;
8624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
8634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
8644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
865a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  // Handle simple integer->integer casts.
866a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  if (SubExpr->getType()->isIntegralType()) {
867732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner    if (!Visit(SubExpr))
868b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner      return false;
8692bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
870a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson    // Figure out if this is a truncate, extend or noop cast.
871a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson    // If the input is signed, do a sign extend, noop, or truncate.
8724efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Result.extOrTrunc(DestWidth);
873732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner    Result.setIsUnsigned(DestType->isUnsignedIntegerType());
874732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner    return true;
875732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner  }
876732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner
877732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner  // FIXME: Clean this up!
878732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner  if (SubExpr->getType()->isPointerType()) {
879a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson    APValue LV;
88087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner    if (!EvaluatePointer(SubExpr, LV, Info))
881b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner      return false;
8824efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
883a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson    if (LV.getLValueBase())
884b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner      return false;
8854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
886559e56b3a201316ae0b7e7389879a8054f6a3a82Anders Carlsson    Result.extOrTrunc(DestWidth);
887559e56b3a201316ae0b7e7389879a8054f6a3a82Anders Carlsson    Result = LV.getLValueOffset();
888732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner    Result.setIsUnsigned(DestType->isUnsignedIntegerType());
889732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner    return true;
8902bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  }
8914efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
892732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner  if (!SubExpr->getType()->isRealFloatingType())
8930e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
894732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner
895d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  APFloat F(0.0);
896d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  if (!EvaluateFloat(SubExpr, F, Info))
8970e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
898732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner
899732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner  // Determine whether we are converting to unsigned or signed.
900732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner  bool DestSigned = DestType->isSignedIntegerType();
901732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner
902732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner  // FIXME: Warning for overflow.
903ee5a700af3fe9ae1a639c271f093f40677dddc04Dale Johannesen  uint64_t Space[4];
904ee5a700af3fe9ae1a639c271f093f40677dddc04Dale Johannesen  bool ignored;
905d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  (void)F.convertToInteger(Space, DestWidth, DestSigned,
906ee5a700af3fe9ae1a639c271f093f40677dddc04Dale Johannesen                           llvm::APFloat::rmTowardZero, &ignored);
907732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner  Result = llvm::APInt(DestWidth, 4, Space);
908732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner  Result.setIsUnsigned(!DestSigned);
909b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  return true;
910a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson}
9112bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
912f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
913d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman// Float Evaluation
914d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===//
915d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
916d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmannamespace {
917d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanclass VISIBILITY_HIDDEN FloatExprEvaluator
918d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  : public StmtVisitor<FloatExprEvaluator, bool> {
919d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  EvalInfo &Info;
920d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  APFloat &Result;
921d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanpublic:
922d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  FloatExprEvaluator(EvalInfo &info, APFloat &result)
923d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    : Info(info), Result(result) {}
924d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
925d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitStmt(Stmt *S) {
926d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return false;
927d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  }
928d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
929d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
930019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  bool VisitCallExpr(const CallExpr *E);
931d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
9325db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  bool VisitUnaryOperator(const UnaryOperator *E);
933d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitBinaryOperator(const BinaryOperator *E);
934d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitFloatingLiteral(const FloatingLiteral *E);
9354efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  bool VisitCastExpr(CastExpr *E);
9364efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  bool VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E);
937d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman};
938d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} // end anonymous namespace
939d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
940d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr* E, APFloat& Result, EvalInfo &Info) {
941d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  return FloatExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E));
942d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}
943d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
944019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattnerbool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) {
945019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  switch (E->isBuiltinCall()) {
94634a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner  default: return false;
947019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_huge_val:
948019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_huge_valf:
949019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_huge_vall:
950019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_inf:
951019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_inff:
9527cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar  case Builtin::BI__builtin_infl: {
9537cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar    const llvm::fltSemantics &Sem =
9547cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar      Info.Ctx.getFloatTypeSemantics(E->getType());
95534a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner    Result = llvm::APFloat::getInf(Sem);
95634a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner    return true;
9577cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar  }
9589e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner
9599e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner  case Builtin::BI__builtin_nan:
9609e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner  case Builtin::BI__builtin_nanf:
9619e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner  case Builtin::BI__builtin_nanl:
9629e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    // If this is __builtin_nan("") turn this into a simple nan, otherwise we
9639e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    // can't constant fold it.
9649e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    if (const StringLiteral *S =
9659e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner        dyn_cast<StringLiteral>(E->getArg(0)->IgnoreParenCasts())) {
9669e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner      if (!S->isWide() && S->getByteLength() == 0) { // empty string.
9677cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar        const llvm::fltSemantics &Sem =
9687cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar          Info.Ctx.getFloatTypeSemantics(E->getType());
9699e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner        Result = llvm::APFloat::getNaN(Sem);
9709e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner        return true;
9719e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner      }
9729e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    }
9739e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    return false;
9745db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar
9755db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_fabs:
9765db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_fabsf:
9775db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_fabsl:
9785db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    if (!EvaluateFloat(E->getArg(0), Result, Info))
9795db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar      return false;
9805db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar
9815db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    if (Result.isNegative())
9825db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar      Result.changeSign();
9835db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
9845db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar
9855db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_copysign:
9865db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_copysignf:
9875db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_copysignl: {
9885db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    APFloat RHS(0.);
9895db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    if (!EvaluateFloat(E->getArg(0), Result, Info) ||
9905db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar        !EvaluateFloat(E->getArg(1), RHS, Info))
9915db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar      return false;
9925db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    Result.copySign(RHS);
9935db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
9945db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  }
995019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  }
996019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner}
997019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner
9985db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbarbool FloatExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
999a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes  if (E->getOpcode() == UnaryOperator::Deref)
1000a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes    return false;
1001a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes
10025db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  if (!EvaluateFloat(E->getSubExpr(), Result, Info))
10035db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return false;
10045db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar
10055db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  switch (E->getOpcode()) {
10065db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  default: return false;
10075db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case UnaryOperator::Plus:
10085db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
10095db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case UnaryOperator::Minus:
10105db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    Result.changeSign();
10115db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
10125db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  }
10135db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar}
1014019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner
1015d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
1016d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  // FIXME: Diagnostics?  I really don't understand how the warnings
1017d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  // and errors are supposed to work.
10185db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  APFloat RHS(0.0);
1019d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  if (!EvaluateFloat(E->getLHS(), Result, Info))
1020d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return false;
1021d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  if (!EvaluateFloat(E->getRHS(), RHS, Info))
1022d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return false;
1023d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1024d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  switch (E->getOpcode()) {
1025d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  default: return false;
1026d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  case BinaryOperator::Mul:
1027d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.multiply(RHS, APFloat::rmNearestTiesToEven);
1028d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
1029d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  case BinaryOperator::Add:
1030d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.add(RHS, APFloat::rmNearestTiesToEven);
1031d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
1032d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  case BinaryOperator::Sub:
1033d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.subtract(RHS, APFloat::rmNearestTiesToEven);
1034d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
1035d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  case BinaryOperator::Div:
1036d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.divide(RHS, APFloat::rmNearestTiesToEven);
1037d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
1038d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  case BinaryOperator::Rem:
1039d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.mod(RHS, APFloat::rmNearestTiesToEven);
1040d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
1041d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  }
1042d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}
1043d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1044d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitFloatingLiteral(const FloatingLiteral *E) {
1045d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  Result = E->getValue();
1046d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  return true;
1047d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}
1048d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
10494efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanbool FloatExprEvaluator::VisitCastExpr(CastExpr *E) {
10504efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  Expr* SubExpr = E->getSubExpr();
10514efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  const llvm::fltSemantics& destSemantics =
10524efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      Info.Ctx.getFloatTypeSemantics(E->getType());
10534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (SubExpr->getType()->isIntegralType()) {
10544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APSInt IntResult;
10554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!EvaluateInteger(E, IntResult, Info))
10564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
10574efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Result = APFloat(destSemantics, 1);
10584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Result.convertFromAPInt(IntResult, IntResult.isSigned(),
10594efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman                            APFloat::rmNearestTiesToEven);
10604efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
10614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
10624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (SubExpr->getType()->isRealFloatingType()) {
10634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!Visit(SubExpr))
10644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
10654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    bool ignored;
10664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Result.convert(destSemantics, APFloat::rmNearestTiesToEven, &ignored);
10674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
10684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
10694efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
10704efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return false;
10714efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
10724efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
10734efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanbool FloatExprEvaluator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
10744efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  Result = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(E->getType()));
10754efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return true;
10764efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
10774efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1078d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===//
10799ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson// Complex Float Evaluation
10809ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===//
10819ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
10829ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonnamespace {
10839ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonclass VISIBILITY_HIDDEN ComplexFloatExprEvaluator
10849ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  : public StmtVisitor<ComplexFloatExprEvaluator, APValue> {
10859ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  EvalInfo &Info;
10869ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
10879ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonpublic:
10889ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  ComplexFloatExprEvaluator(EvalInfo &info) : Info(info) {}
10899ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
10909ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  //===--------------------------------------------------------------------===//
10919ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  //                            Visitor Methods
10929ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  //===--------------------------------------------------------------------===//
10939ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
10949ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  APValue VisitStmt(Stmt *S) {
10959ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson    return APValue();
10969ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  }
10979ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
10989ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
10999ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
11009ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  APValue VisitImaginaryLiteral(ImaginaryLiteral *E) {
11019ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson    APFloat Result(0.0);
11029ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson    if (!EvaluateFloat(E->getSubExpr(), Result, Info))
11039ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson      return APValue();
11049ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
11059ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson    return APValue(APFloat(0.0), Result);
11069ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  }
11079ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
1108ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  APValue VisitCastExpr(CastExpr *E) {
1109ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    Expr* SubExpr = E->getSubExpr();
1110ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1111ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    if (SubExpr->getType()->isRealFloatingType()) {
1112ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson      APFloat Result(0.0);
1113ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1114ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson      if (!EvaluateFloat(SubExpr, Result, Info))
1115ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson        return APValue();
1116ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1117ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson      return APValue(Result, APFloat(0.0));
1118ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    }
1119ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1120ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    // FIXME: Handle more casts.
1121ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    return APValue();
1122ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  }
1123ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1124ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  APValue VisitBinaryOperator(const BinaryOperator *E);
1125ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
11269ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson};
11279ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson} // end anonymous namespace
11289ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
11299ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonstatic bool EvaluateComplexFloat(const Expr *E, APValue &Result, EvalInfo &Info)
11309ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson{
11319ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  Result = ComplexFloatExprEvaluator(Info).Visit(const_cast<Expr*>(E));
11329ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  return Result.isComplexFloat();
11339ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson}
11349ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
1135ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders CarlssonAPValue ComplexFloatExprEvaluator::VisitBinaryOperator(const BinaryOperator *E)
1136ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson{
1137ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  APValue Result, RHS;
1138ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1139ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  if (!EvaluateComplexFloat(E->getLHS(), Result, Info))
1140ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    return APValue();
1141ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1142ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  if (!EvaluateComplexFloat(E->getRHS(), RHS, Info))
1143ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    return APValue();
1144ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1145ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  switch (E->getOpcode()) {
1146ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  default: return APValue();
1147ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  case BinaryOperator::Add:
1148ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    Result.getComplexFloatReal().add(RHS.getComplexFloatReal(),
1149ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson                                     APFloat::rmNearestTiesToEven);
1150ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    Result.getComplexFloatImag().add(RHS.getComplexFloatImag(),
1151ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson                                     APFloat::rmNearestTiesToEven);
1152ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  case BinaryOperator::Sub:
1153ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    Result.getComplexFloatReal().subtract(RHS.getComplexFloatReal(),
1154ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson                                          APFloat::rmNearestTiesToEven);
1155ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    Result.getComplexFloatImag().subtract(RHS.getComplexFloatImag(),
1156ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson                                          APFloat::rmNearestTiesToEven);
1157ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  }
1158ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1159ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  return Result;
1160ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson}
1161ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
11629ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===//
11636ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner// Top level Expr::Evaluate method.
1164f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
1165f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
11666ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner/// Evaluate - Return true if this is a constant which we can fold using
1167019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// any crazy technique (that has nothing to do with language standards) that
1168019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// we want to.  If this function returns true, it returns the folded constant
1169019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// in Result.
11705b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlssonbool Expr::Evaluate(EvalResult &Result, ASTContext &Ctx) const {
11715b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson  EvalInfo Info(Ctx, Result);
117254da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson
117306a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson  if (getType()->isIntegerType()) {
1174d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    llvm::APSInt sInt(32);
11756dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson    if (!EvaluateInteger(this, sInt, Info))
11766dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
11776dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson
11785b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson    Result.Val = APValue(sInt);
1179d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  } else if (getType()->isPointerType()) {
11805b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson    if (!EvaluatePointer(this, Result.Val, Info))
11816dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
1182d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  } else if (getType()->isRealFloatingType()) {
1183d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    llvm::APFloat f(0.0);
11846dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson    if (!EvaluateFloat(this, f, Info))
11856dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
11866dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson
11875b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson    Result.Val = APValue(f);
11889ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  } else if (getType()->isComplexType()) {
11895b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson    if (!EvaluateComplexFloat(this, Result.Val, Info))
11906dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
11919d4c157baaada8945671dc98363a40ed00cbd824Anders Carlsson  }  else
11929d4c157baaada8945671dc98363a40ed00cbd824Anders Carlsson    return false;
11936dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson
11945b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson  return true;
11955b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson}
11965b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson
11976ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner/// isEvaluatable - Call Evaluate to see if this expression can be constant
119845b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner/// folded, but discard the result.
119945b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattnerbool Expr::isEvaluatable(ASTContext &Ctx) const {
12004fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson  EvalResult Result;
12014fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson  return Evaluate(Result, Ctx) && !Result.HasSideEffects;
120245b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner}
120351fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson
120451fe996231b1d7199f76e4005ff4c943d5deeecdAnders CarlssonAPSInt Expr::EvaluateAsInt(ASTContext &Ctx) const {
12051c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  EvalResult EvalResult;
12061c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  bool Result = Evaluate(EvalResult, Ctx);
120751fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson  assert(Result && "Could not evaluate expression");
12081c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer");
120951fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson
12101c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  return EvalResult.Val.getInt();
121151fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson}
1212