ExprConstant.cpp revision 204643
1//===--- ExprConstant.cpp - Expression Constant Evaluator -----------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the Expr constant evaluator.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/AST/APValue.h"
15#include "clang/AST/ASTContext.h"
16#include "clang/AST/CharUnits.h"
17#include "clang/AST/RecordLayout.h"
18#include "clang/AST/StmtVisitor.h"
19#include "clang/AST/ASTDiagnostic.h"
20#include "clang/Basic/Builtins.h"
21#include "clang/Basic/TargetInfo.h"
22#include "llvm/ADT/SmallString.h"
23#include <cstring>
24
25using namespace clang;
26using llvm::APSInt;
27using llvm::APFloat;
28
29/// EvalInfo - This is a private struct used by the evaluator to capture
30/// information about a subexpression as it is folded.  It retains information
31/// about the AST context, but also maintains information about the folded
32/// expression.
33///
34/// If an expression could be evaluated, it is still possible it is not a C
35/// "integer constant expression" or constant expression.  If not, this struct
36/// captures information about how and why not.
37///
38/// One bit of information passed *into* the request for constant folding
39/// indicates whether the subexpression is "evaluated" or not according to C
40/// rules.  For example, the RHS of (0 && foo()) is not evaluated.  We can
41/// evaluate the expression regardless of what the RHS is, but C only allows
42/// certain things in certain situations.
43struct EvalInfo {
44  ASTContext &Ctx;
45
46  /// EvalResult - Contains information about the evaluation.
47  Expr::EvalResult &EvalResult;
48
49  /// AnyLValue - Stack based LValue results are not discarded.
50  bool AnyLValue;
51
52  EvalInfo(ASTContext &ctx, Expr::EvalResult& evalresult,
53           bool anylvalue = false)
54    : Ctx(ctx), EvalResult(evalresult), AnyLValue(anylvalue) {}
55};
56
57
58static bool EvaluateLValue(const Expr *E, APValue &Result, EvalInfo &Info);
59static bool EvaluatePointer(const Expr *E, APValue &Result, EvalInfo &Info);
60static bool EvaluateInteger(const Expr *E, APSInt  &Result, EvalInfo &Info);
61static bool EvaluateIntegerOrLValue(const Expr *E, APValue  &Result,
62                                    EvalInfo &Info);
63static bool EvaluateFloat(const Expr *E, APFloat &Result, EvalInfo &Info);
64static bool EvaluateComplex(const Expr *E, APValue &Result, EvalInfo &Info);
65
66//===----------------------------------------------------------------------===//
67// Misc utilities
68//===----------------------------------------------------------------------===//
69
70static bool EvalPointerValueAsBool(APValue& Value, bool& Result) {
71  // FIXME: Is this accurate for all kinds of bases?  If not, what would
72  // the check look like?
73  Result = Value.getLValueBase() || !Value.getLValueOffset().isZero();
74  return true;
75}
76
77static bool HandleConversionToBool(const Expr* E, bool& Result,
78                                   EvalInfo &Info) {
79  if (E->getType()->isIntegralType()) {
80    APSInt IntResult;
81    if (!EvaluateInteger(E, IntResult, Info))
82      return false;
83    Result = IntResult != 0;
84    return true;
85  } else if (E->getType()->isRealFloatingType()) {
86    APFloat FloatResult(0.0);
87    if (!EvaluateFloat(E, FloatResult, Info))
88      return false;
89    Result = !FloatResult.isZero();
90    return true;
91  } else if (E->getType()->hasPointerRepresentation()) {
92    APValue PointerResult;
93    if (!EvaluatePointer(E, PointerResult, Info))
94      return false;
95    return EvalPointerValueAsBool(PointerResult, Result);
96  } else if (E->getType()->isAnyComplexType()) {
97    APValue ComplexResult;
98    if (!EvaluateComplex(E, ComplexResult, Info))
99      return false;
100    if (ComplexResult.isComplexFloat()) {
101      Result = !ComplexResult.getComplexFloatReal().isZero() ||
102               !ComplexResult.getComplexFloatImag().isZero();
103    } else {
104      Result = ComplexResult.getComplexIntReal().getBoolValue() ||
105               ComplexResult.getComplexIntImag().getBoolValue();
106    }
107    return true;
108  }
109
110  return false;
111}
112
113static APSInt HandleFloatToIntCast(QualType DestType, QualType SrcType,
114                                   APFloat &Value, ASTContext &Ctx) {
115  unsigned DestWidth = Ctx.getIntWidth(DestType);
116  // Determine whether we are converting to unsigned or signed.
117  bool DestSigned = DestType->isSignedIntegerType();
118
119  // FIXME: Warning for overflow.
120  uint64_t Space[4];
121  bool ignored;
122  (void)Value.convertToInteger(Space, DestWidth, DestSigned,
123                               llvm::APFloat::rmTowardZero, &ignored);
124  return APSInt(llvm::APInt(DestWidth, 4, Space), !DestSigned);
125}
126
127static APFloat HandleFloatToFloatCast(QualType DestType, QualType SrcType,
128                                      APFloat &Value, ASTContext &Ctx) {
129  bool ignored;
130  APFloat Result = Value;
131  Result.convert(Ctx.getFloatTypeSemantics(DestType),
132                 APFloat::rmNearestTiesToEven, &ignored);
133  return Result;
134}
135
136static APSInt HandleIntToIntCast(QualType DestType, QualType SrcType,
137                                 APSInt &Value, ASTContext &Ctx) {
138  unsigned DestWidth = Ctx.getIntWidth(DestType);
139  APSInt Result = Value;
140  // Figure out if this is a truncate, extend or noop cast.
141  // If the input is signed, do a sign extend, noop, or truncate.
142  Result.extOrTrunc(DestWidth);
143  Result.setIsUnsigned(DestType->isUnsignedIntegerType());
144  return Result;
145}
146
147static APFloat HandleIntToFloatCast(QualType DestType, QualType SrcType,
148                                    APSInt &Value, ASTContext &Ctx) {
149
150  APFloat Result(Ctx.getFloatTypeSemantics(DestType), 1);
151  Result.convertFromAPInt(Value, Value.isSigned(),
152                          APFloat::rmNearestTiesToEven);
153  return Result;
154}
155
156namespace {
157class HasSideEffect
158  : public StmtVisitor<HasSideEffect, bool> {
159  EvalInfo &Info;
160public:
161
162  HasSideEffect(EvalInfo &info) : Info(info) {}
163
164  // Unhandled nodes conservatively default to having side effects.
165  bool VisitStmt(Stmt *S) {
166    return true;
167  }
168
169  bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
170  bool VisitDeclRefExpr(DeclRefExpr *E) {
171    if (Info.Ctx.getCanonicalType(E->getType()).isVolatileQualified())
172      return true;
173    return false;
174  }
175  // We don't want to evaluate BlockExprs multiple times, as they generate
176  // a ton of code.
177  bool VisitBlockExpr(BlockExpr *E) { return true; }
178  bool VisitPredefinedExpr(PredefinedExpr *E) { return false; }
179  bool VisitCompoundLiteralExpr(CompoundLiteralExpr *E)
180    { return Visit(E->getInitializer()); }
181  bool VisitMemberExpr(MemberExpr *E) { return Visit(E->getBase()); }
182  bool VisitIntegerLiteral(IntegerLiteral *E) { return false; }
183  bool VisitFloatingLiteral(FloatingLiteral *E) { return false; }
184  bool VisitStringLiteral(StringLiteral *E) { return false; }
185  bool VisitCharacterLiteral(CharacterLiteral *E) { return false; }
186  bool VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) { return false; }
187  bool VisitArraySubscriptExpr(ArraySubscriptExpr *E)
188    { return Visit(E->getLHS()) || Visit(E->getRHS()); }
189  bool VisitChooseExpr(ChooseExpr *E)
190    { return Visit(E->getChosenSubExpr(Info.Ctx)); }
191  bool VisitCastExpr(CastExpr *E) { return Visit(E->getSubExpr()); }
192  bool VisitBinAssign(BinaryOperator *E) { return true; }
193  bool VisitCompoundAssignOperator(BinaryOperator *E) { return true; }
194  bool VisitBinaryOperator(BinaryOperator *E)
195  { return Visit(E->getLHS()) || Visit(E->getRHS()); }
196  bool VisitUnaryPreInc(UnaryOperator *E) { return true; }
197  bool VisitUnaryPostInc(UnaryOperator *E) { return true; }
198  bool VisitUnaryPreDec(UnaryOperator *E) { return true; }
199  bool VisitUnaryPostDec(UnaryOperator *E) { return true; }
200  bool VisitUnaryDeref(UnaryOperator *E) {
201    if (Info.Ctx.getCanonicalType(E->getType()).isVolatileQualified())
202      return true;
203    return Visit(E->getSubExpr());
204  }
205  bool VisitUnaryOperator(UnaryOperator *E) { return Visit(E->getSubExpr()); }
206};
207
208} // end anonymous namespace
209
210//===----------------------------------------------------------------------===//
211// LValue Evaluation
212//===----------------------------------------------------------------------===//
213namespace {
214class LValueExprEvaluator
215  : public StmtVisitor<LValueExprEvaluator, APValue> {
216  EvalInfo &Info;
217public:
218
219  LValueExprEvaluator(EvalInfo &info) : Info(info) {}
220
221  APValue VisitStmt(Stmt *S) {
222    return APValue();
223  }
224
225  APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
226  APValue VisitDeclRefExpr(DeclRefExpr *E);
227  APValue VisitPredefinedExpr(PredefinedExpr *E) { return APValue(E); }
228  APValue VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
229  APValue VisitMemberExpr(MemberExpr *E);
230  APValue VisitStringLiteral(StringLiteral *E) { return APValue(E); }
231  APValue VisitObjCEncodeExpr(ObjCEncodeExpr *E) { return APValue(E); }
232  APValue VisitArraySubscriptExpr(ArraySubscriptExpr *E);
233  APValue VisitUnaryDeref(UnaryOperator *E);
234  APValue VisitUnaryExtension(const UnaryOperator *E)
235    { return Visit(E->getSubExpr()); }
236  APValue VisitChooseExpr(const ChooseExpr *E)
237    { return Visit(E->getChosenSubExpr(Info.Ctx)); }
238
239  APValue VisitCastExpr(CastExpr *E) {
240    switch (E->getCastKind()) {
241    default:
242      return APValue();
243
244    case CastExpr::CK_NoOp:
245      return Visit(E->getSubExpr());
246    }
247  }
248  // FIXME: Missing: __real__, __imag__
249};
250} // end anonymous namespace
251
252static bool EvaluateLValue(const Expr* E, APValue& Result, EvalInfo &Info) {
253  Result = LValueExprEvaluator(Info).Visit(const_cast<Expr*>(E));
254  return Result.isLValue();
255}
256
257APValue LValueExprEvaluator::VisitDeclRefExpr(DeclRefExpr *E) {
258  if (isa<FunctionDecl>(E->getDecl())) {
259    return APValue(E);
260  } else if (VarDecl* VD = dyn_cast<VarDecl>(E->getDecl())) {
261    if (!Info.AnyLValue && !VD->hasGlobalStorage())
262      return APValue();
263    if (!VD->getType()->isReferenceType())
264      return APValue(E);
265    // FIXME: Check whether VD might be overridden!
266    if (const Expr *Init = VD->getAnyInitializer())
267      return Visit(const_cast<Expr *>(Init));
268  }
269
270  return APValue();
271}
272
273APValue LValueExprEvaluator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
274  if (!Info.AnyLValue && !E->isFileScope())
275    return APValue();
276  return APValue(E);
277}
278
279APValue LValueExprEvaluator::VisitMemberExpr(MemberExpr *E) {
280  APValue result;
281  QualType Ty;
282  if (E->isArrow()) {
283    if (!EvaluatePointer(E->getBase(), result, Info))
284      return APValue();
285    Ty = E->getBase()->getType()->getAs<PointerType>()->getPointeeType();
286  } else {
287    result = Visit(E->getBase());
288    if (result.isUninit())
289      return APValue();
290    Ty = E->getBase()->getType();
291  }
292
293  RecordDecl *RD = Ty->getAs<RecordType>()->getDecl();
294  const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD);
295
296  FieldDecl *FD = dyn_cast<FieldDecl>(E->getMemberDecl());
297  if (!FD) // FIXME: deal with other kinds of member expressions
298    return APValue();
299
300  if (FD->getType()->isReferenceType())
301    return APValue();
302
303  // FIXME: This is linear time.
304  unsigned i = 0;
305  for (RecordDecl::field_iterator Field = RD->field_begin(),
306                               FieldEnd = RD->field_end();
307       Field != FieldEnd; (void)++Field, ++i) {
308    if (*Field == FD)
309      break;
310  }
311
312  result.setLValue(result.getLValueBase(),
313                   result.getLValueOffset() +
314                       CharUnits::fromQuantity(RL.getFieldOffset(i) / 8));
315
316  return result;
317}
318
319APValue LValueExprEvaluator::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
320  APValue Result;
321
322  if (!EvaluatePointer(E->getBase(), Result, Info))
323    return APValue();
324
325  APSInt Index;
326  if (!EvaluateInteger(E->getIdx(), Index, Info))
327    return APValue();
328
329  CharUnits ElementSize = Info.Ctx.getTypeSizeInChars(E->getType());
330
331  CharUnits Offset = Index.getSExtValue() * ElementSize;
332  Result.setLValue(Result.getLValueBase(),
333                   Result.getLValueOffset() + Offset);
334  return Result;
335}
336
337APValue LValueExprEvaluator::VisitUnaryDeref(UnaryOperator *E) {
338  APValue Result;
339  if (!EvaluatePointer(E->getSubExpr(), Result, Info))
340    return APValue();
341  return Result;
342}
343
344//===----------------------------------------------------------------------===//
345// Pointer Evaluation
346//===----------------------------------------------------------------------===//
347
348namespace {
349class PointerExprEvaluator
350  : public StmtVisitor<PointerExprEvaluator, APValue> {
351  EvalInfo &Info;
352public:
353
354  PointerExprEvaluator(EvalInfo &info) : Info(info) {}
355
356  APValue VisitStmt(Stmt *S) {
357    return APValue();
358  }
359
360  APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
361
362  APValue VisitBinaryOperator(const BinaryOperator *E);
363  APValue VisitCastExpr(CastExpr* E);
364  APValue VisitUnaryExtension(const UnaryOperator *E)
365      { return Visit(E->getSubExpr()); }
366  APValue VisitUnaryAddrOf(const UnaryOperator *E);
367  APValue VisitObjCStringLiteral(ObjCStringLiteral *E)
368      { return APValue(E); }
369  APValue VisitAddrLabelExpr(AddrLabelExpr *E)
370      { return APValue(E); }
371  APValue VisitCallExpr(CallExpr *E);
372  APValue VisitBlockExpr(BlockExpr *E) {
373    if (!E->hasBlockDeclRefExprs())
374      return APValue(E);
375    return APValue();
376  }
377  APValue VisitImplicitValueInitExpr(ImplicitValueInitExpr *E)
378      { return APValue((Expr*)0); }
379  APValue VisitConditionalOperator(ConditionalOperator *E);
380  APValue VisitChooseExpr(ChooseExpr *E)
381      { return Visit(E->getChosenSubExpr(Info.Ctx)); }
382  APValue VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E)
383      { return APValue((Expr*)0); }
384  // FIXME: Missing: @protocol, @selector
385};
386} // end anonymous namespace
387
388static bool EvaluatePointer(const Expr* E, APValue& Result, EvalInfo &Info) {
389  if (!E->getType()->hasPointerRepresentation())
390    return false;
391  Result = PointerExprEvaluator(Info).Visit(const_cast<Expr*>(E));
392  return Result.isLValue();
393}
394
395APValue PointerExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
396  if (E->getOpcode() != BinaryOperator::Add &&
397      E->getOpcode() != BinaryOperator::Sub)
398    return APValue();
399
400  const Expr *PExp = E->getLHS();
401  const Expr *IExp = E->getRHS();
402  if (IExp->getType()->isPointerType())
403    std::swap(PExp, IExp);
404
405  APValue ResultLValue;
406  if (!EvaluatePointer(PExp, ResultLValue, Info))
407    return APValue();
408
409  llvm::APSInt AdditionalOffset(32);
410  if (!EvaluateInteger(IExp, AdditionalOffset, Info))
411    return APValue();
412
413  QualType PointeeType = PExp->getType()->getAs<PointerType>()->getPointeeType();
414  CharUnits SizeOfPointee;
415
416  // Explicitly handle GNU void* and function pointer arithmetic extensions.
417  if (PointeeType->isVoidType() || PointeeType->isFunctionType())
418    SizeOfPointee = CharUnits::One();
419  else
420    SizeOfPointee = Info.Ctx.getTypeSizeInChars(PointeeType);
421
422  CharUnits Offset = ResultLValue.getLValueOffset();
423
424  if (E->getOpcode() == BinaryOperator::Add)
425    Offset += AdditionalOffset.getLimitedValue() * SizeOfPointee;
426  else
427    Offset -= AdditionalOffset.getLimitedValue() * SizeOfPointee;
428
429  return APValue(ResultLValue.getLValueBase(), Offset);
430}
431
432APValue PointerExprEvaluator::VisitUnaryAddrOf(const UnaryOperator *E) {
433  APValue result;
434  if (EvaluateLValue(E->getSubExpr(), result, Info))
435    return result;
436  return APValue();
437}
438
439
440APValue PointerExprEvaluator::VisitCastExpr(CastExpr* E) {
441  Expr* SubExpr = E->getSubExpr();
442
443  switch (E->getCastKind()) {
444  default:
445    break;
446
447  case CastExpr::CK_Unknown: {
448    // FIXME: The handling for CK_Unknown is ugly/shouldn't be necessary!
449
450    // Check for pointer->pointer cast
451    if (SubExpr->getType()->isPointerType() ||
452        SubExpr->getType()->isObjCObjectPointerType() ||
453        SubExpr->getType()->isNullPtrType() ||
454        SubExpr->getType()->isBlockPointerType())
455      return Visit(SubExpr);
456
457    if (SubExpr->getType()->isIntegralType()) {
458      APValue Result;
459      if (!EvaluateIntegerOrLValue(SubExpr, Result, Info))
460        break;
461
462      if (Result.isInt()) {
463        Result.getInt().extOrTrunc((unsigned)Info.Ctx.getTypeSize(E->getType()));
464        return APValue(0,
465                       CharUnits::fromQuantity(Result.getInt().getZExtValue()));
466      }
467
468      // Cast is of an lvalue, no need to change value.
469      return Result;
470    }
471    break;
472  }
473
474  case CastExpr::CK_NoOp:
475  case CastExpr::CK_BitCast:
476  case CastExpr::CK_AnyPointerToObjCPointerCast:
477  case CastExpr::CK_AnyPointerToBlockPointerCast:
478    return Visit(SubExpr);
479
480  case CastExpr::CK_IntegralToPointer: {
481    APValue Result;
482    if (!EvaluateIntegerOrLValue(SubExpr, Result, Info))
483      break;
484
485    if (Result.isInt()) {
486      Result.getInt().extOrTrunc((unsigned)Info.Ctx.getTypeSize(E->getType()));
487      return APValue(0,
488                     CharUnits::fromQuantity(Result.getInt().getZExtValue()));
489    }
490
491    // Cast is of an lvalue, no need to change value.
492    return Result;
493  }
494  case CastExpr::CK_ArrayToPointerDecay:
495  case CastExpr::CK_FunctionToPointerDecay: {
496    APValue Result;
497    if (EvaluateLValue(SubExpr, Result, Info))
498      return Result;
499    break;
500  }
501  }
502
503  return APValue();
504}
505
506APValue PointerExprEvaluator::VisitCallExpr(CallExpr *E) {
507  if (E->isBuiltinCall(Info.Ctx) ==
508        Builtin::BI__builtin___CFStringMakeConstantString ||
509      E->isBuiltinCall(Info.Ctx) ==
510        Builtin::BI__builtin___NSStringMakeConstantString)
511    return APValue(E);
512  return APValue();
513}
514
515APValue PointerExprEvaluator::VisitConditionalOperator(ConditionalOperator *E) {
516  bool BoolResult;
517  if (!HandleConversionToBool(E->getCond(), BoolResult, Info))
518    return APValue();
519
520  Expr* EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr();
521
522  APValue Result;
523  if (EvaluatePointer(EvalExpr, Result, Info))
524    return Result;
525  return APValue();
526}
527
528//===----------------------------------------------------------------------===//
529// Vector Evaluation
530//===----------------------------------------------------------------------===//
531
532namespace {
533  class VectorExprEvaluator
534  : public StmtVisitor<VectorExprEvaluator, APValue> {
535    EvalInfo &Info;
536    APValue GetZeroVector(QualType VecType);
537  public:
538
539    VectorExprEvaluator(EvalInfo &info) : Info(info) {}
540
541    APValue VisitStmt(Stmt *S) {
542      return APValue();
543    }
544
545    APValue VisitParenExpr(ParenExpr *E)
546        { return Visit(E->getSubExpr()); }
547    APValue VisitUnaryExtension(const UnaryOperator *E)
548      { return Visit(E->getSubExpr()); }
549    APValue VisitUnaryPlus(const UnaryOperator *E)
550      { return Visit(E->getSubExpr()); }
551    APValue VisitUnaryReal(const UnaryOperator *E)
552      { return Visit(E->getSubExpr()); }
553    APValue VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E)
554      { return GetZeroVector(E->getType()); }
555    APValue VisitCastExpr(const CastExpr* E);
556    APValue VisitCompoundLiteralExpr(const CompoundLiteralExpr *E);
557    APValue VisitInitListExpr(const InitListExpr *E);
558    APValue VisitConditionalOperator(const ConditionalOperator *E);
559    APValue VisitChooseExpr(const ChooseExpr *E)
560      { return Visit(E->getChosenSubExpr(Info.Ctx)); }
561    APValue VisitUnaryImag(const UnaryOperator *E);
562    // FIXME: Missing: unary -, unary ~, binary add/sub/mul/div,
563    //                 binary comparisons, binary and/or/xor,
564    //                 shufflevector, ExtVectorElementExpr
565    //        (Note that these require implementing conversions
566    //         between vector types.)
567  };
568} // end anonymous namespace
569
570static bool EvaluateVector(const Expr* E, APValue& Result, EvalInfo &Info) {
571  if (!E->getType()->isVectorType())
572    return false;
573  Result = VectorExprEvaluator(Info).Visit(const_cast<Expr*>(E));
574  return !Result.isUninit();
575}
576
577APValue VectorExprEvaluator::VisitCastExpr(const CastExpr* E) {
578  const VectorType *VTy = E->getType()->getAs<VectorType>();
579  QualType EltTy = VTy->getElementType();
580  unsigned NElts = VTy->getNumElements();
581  unsigned EltWidth = Info.Ctx.getTypeSize(EltTy);
582
583  const Expr* SE = E->getSubExpr();
584  QualType SETy = SE->getType();
585  APValue Result = APValue();
586
587  // Check for vector->vector bitcast and scalar->vector splat.
588  if (SETy->isVectorType()) {
589    return this->Visit(const_cast<Expr*>(SE));
590  } else if (SETy->isIntegerType()) {
591    APSInt IntResult;
592    if (!EvaluateInteger(SE, IntResult, Info))
593      return APValue();
594    Result = APValue(IntResult);
595  } else if (SETy->isRealFloatingType()) {
596    APFloat F(0.0);
597    if (!EvaluateFloat(SE, F, Info))
598      return APValue();
599    Result = APValue(F);
600  } else
601    return APValue();
602
603  // For casts of a scalar to ExtVector, convert the scalar to the element type
604  // and splat it to all elements.
605  if (E->getType()->isExtVectorType()) {
606    if (EltTy->isIntegerType() && Result.isInt())
607      Result = APValue(HandleIntToIntCast(EltTy, SETy, Result.getInt(),
608                                          Info.Ctx));
609    else if (EltTy->isIntegerType())
610      Result = APValue(HandleFloatToIntCast(EltTy, SETy, Result.getFloat(),
611                                            Info.Ctx));
612    else if (EltTy->isRealFloatingType() && Result.isInt())
613      Result = APValue(HandleIntToFloatCast(EltTy, SETy, Result.getInt(),
614                                            Info.Ctx));
615    else if (EltTy->isRealFloatingType())
616      Result = APValue(HandleFloatToFloatCast(EltTy, SETy, Result.getFloat(),
617                                              Info.Ctx));
618    else
619      return APValue();
620
621    // Splat and create vector APValue.
622    llvm::SmallVector<APValue, 4> Elts(NElts, Result);
623    return APValue(&Elts[0], Elts.size());
624  }
625
626  // For casts of a scalar to regular gcc-style vector type, bitcast the scalar
627  // to the vector. To construct the APValue vector initializer, bitcast the
628  // initializing value to an APInt, and shift out the bits pertaining to each
629  // element.
630  APSInt Init;
631  Init = Result.isInt() ? Result.getInt() : Result.getFloat().bitcastToAPInt();
632
633  llvm::SmallVector<APValue, 4> Elts;
634  for (unsigned i = 0; i != NElts; ++i) {
635    APSInt Tmp = Init;
636    Tmp.extOrTrunc(EltWidth);
637
638    if (EltTy->isIntegerType())
639      Elts.push_back(APValue(Tmp));
640    else if (EltTy->isRealFloatingType())
641      Elts.push_back(APValue(APFloat(Tmp)));
642    else
643      return APValue();
644
645    Init >>= EltWidth;
646  }
647  return APValue(&Elts[0], Elts.size());
648}
649
650APValue
651VectorExprEvaluator::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) {
652  return this->Visit(const_cast<Expr*>(E->getInitializer()));
653}
654
655APValue
656VectorExprEvaluator::VisitInitListExpr(const InitListExpr *E) {
657  const VectorType *VT = E->getType()->getAs<VectorType>();
658  unsigned NumInits = E->getNumInits();
659  unsigned NumElements = VT->getNumElements();
660
661  QualType EltTy = VT->getElementType();
662  llvm::SmallVector<APValue, 4> Elements;
663
664  for (unsigned i = 0; i < NumElements; i++) {
665    if (EltTy->isIntegerType()) {
666      llvm::APSInt sInt(32);
667      if (i < NumInits) {
668        if (!EvaluateInteger(E->getInit(i), sInt, Info))
669          return APValue();
670      } else {
671        sInt = Info.Ctx.MakeIntValue(0, EltTy);
672      }
673      Elements.push_back(APValue(sInt));
674    } else {
675      llvm::APFloat f(0.0);
676      if (i < NumInits) {
677        if (!EvaluateFloat(E->getInit(i), f, Info))
678          return APValue();
679      } else {
680        f = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy));
681      }
682      Elements.push_back(APValue(f));
683    }
684  }
685  return APValue(&Elements[0], Elements.size());
686}
687
688APValue
689VectorExprEvaluator::GetZeroVector(QualType T) {
690  const VectorType *VT = T->getAs<VectorType>();
691  QualType EltTy = VT->getElementType();
692  APValue ZeroElement;
693  if (EltTy->isIntegerType())
694    ZeroElement = APValue(Info.Ctx.MakeIntValue(0, EltTy));
695  else
696    ZeroElement =
697        APValue(APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy)));
698
699  llvm::SmallVector<APValue, 4> Elements(VT->getNumElements(), ZeroElement);
700  return APValue(&Elements[0], Elements.size());
701}
702
703APValue VectorExprEvaluator::VisitConditionalOperator(const ConditionalOperator *E) {
704  bool BoolResult;
705  if (!HandleConversionToBool(E->getCond(), BoolResult, Info))
706    return APValue();
707
708  Expr* EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr();
709
710  APValue Result;
711  if (EvaluateVector(EvalExpr, Result, Info))
712    return Result;
713  return APValue();
714}
715
716APValue VectorExprEvaluator::VisitUnaryImag(const UnaryOperator *E) {
717  if (!E->getSubExpr()->isEvaluatable(Info.Ctx))
718    Info.EvalResult.HasSideEffects = true;
719  return GetZeroVector(E->getType());
720}
721
722//===----------------------------------------------------------------------===//
723// Integer Evaluation
724//===----------------------------------------------------------------------===//
725
726namespace {
727class IntExprEvaluator
728  : public StmtVisitor<IntExprEvaluator, bool> {
729  EvalInfo &Info;
730  APValue &Result;
731public:
732  IntExprEvaluator(EvalInfo &info, APValue &result)
733    : Info(info), Result(result) {}
734
735  bool Success(const llvm::APSInt &SI, const Expr *E) {
736    assert(E->getType()->isIntegralType() && "Invalid evaluation result.");
737    assert(SI.isSigned() == E->getType()->isSignedIntegerType() &&
738           "Invalid evaluation result.");
739    assert(SI.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) &&
740           "Invalid evaluation result.");
741    Result = APValue(SI);
742    return true;
743  }
744
745  bool Success(const llvm::APInt &I, const Expr *E) {
746    assert(E->getType()->isIntegralType() && "Invalid evaluation result.");
747    assert(I.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) &&
748           "Invalid evaluation result.");
749    Result = APValue(APSInt(I));
750    Result.getInt().setIsUnsigned(E->getType()->isUnsignedIntegerType());
751    return true;
752  }
753
754  bool Success(uint64_t Value, const Expr *E) {
755    assert(E->getType()->isIntegralType() && "Invalid evaluation result.");
756    Result = APValue(Info.Ctx.MakeIntValue(Value, E->getType()));
757    return true;
758  }
759
760  bool Error(SourceLocation L, diag::kind D, const Expr *E) {
761    // Take the first error.
762    if (Info.EvalResult.Diag == 0) {
763      Info.EvalResult.DiagLoc = L;
764      Info.EvalResult.Diag = D;
765      Info.EvalResult.DiagExpr = E;
766    }
767    return false;
768  }
769
770  //===--------------------------------------------------------------------===//
771  //                            Visitor Methods
772  //===--------------------------------------------------------------------===//
773
774  bool VisitStmt(Stmt *) {
775    assert(0 && "This should be called on integers, stmts are not integers");
776    return false;
777  }
778
779  bool VisitExpr(Expr *E) {
780    return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
781  }
782
783  bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
784
785  bool VisitIntegerLiteral(const IntegerLiteral *E) {
786    return Success(E->getValue(), E);
787  }
788  bool VisitCharacterLiteral(const CharacterLiteral *E) {
789    return Success(E->getValue(), E);
790  }
791  bool VisitTypesCompatibleExpr(const TypesCompatibleExpr *E) {
792    // Per gcc docs "this built-in function ignores top level
793    // qualifiers".  We need to use the canonical version to properly
794    // be able to strip CRV qualifiers from the type.
795    QualType T0 = Info.Ctx.getCanonicalType(E->getArgType1());
796    QualType T1 = Info.Ctx.getCanonicalType(E->getArgType2());
797    return Success(Info.Ctx.typesAreCompatible(T0.getUnqualifiedType(),
798                                               T1.getUnqualifiedType()),
799                   E);
800  }
801
802  bool CheckReferencedDecl(const Expr *E, const Decl *D);
803  bool VisitDeclRefExpr(const DeclRefExpr *E) {
804    return CheckReferencedDecl(E, E->getDecl());
805  }
806  bool VisitMemberExpr(const MemberExpr *E) {
807    if (CheckReferencedDecl(E, E->getMemberDecl())) {
808      // Conservatively assume a MemberExpr will have side-effects
809      Info.EvalResult.HasSideEffects = true;
810      return true;
811    }
812    return false;
813  }
814
815  bool VisitCallExpr(CallExpr *E);
816  bool VisitBinaryOperator(const BinaryOperator *E);
817  bool VisitUnaryOperator(const UnaryOperator *E);
818  bool VisitConditionalOperator(const ConditionalOperator *E);
819
820  bool VisitCastExpr(CastExpr* E);
821  bool VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E);
822
823  bool VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) {
824    return Success(E->getValue(), E);
825  }
826
827  bool VisitGNUNullExpr(const GNUNullExpr *E) {
828    return Success(0, E);
829  }
830
831  bool VisitCXXZeroInitValueExpr(const CXXZeroInitValueExpr *E) {
832    return Success(0, E);
833  }
834
835  bool VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) {
836    return Success(0, E);
837  }
838
839  bool VisitUnaryTypeTraitExpr(const UnaryTypeTraitExpr *E) {
840    return Success(E->EvaluateTrait(Info.Ctx), E);
841  }
842
843  bool VisitChooseExpr(const ChooseExpr *E) {
844    return Visit(E->getChosenSubExpr(Info.Ctx));
845  }
846
847  bool VisitUnaryReal(const UnaryOperator *E);
848  bool VisitUnaryImag(const UnaryOperator *E);
849
850private:
851  CharUnits GetAlignOfExpr(const Expr *E);
852  CharUnits GetAlignOfType(QualType T);
853  // FIXME: Missing: array subscript of vector, member of vector
854};
855} // end anonymous namespace
856
857static bool EvaluateIntegerOrLValue(const Expr* E, APValue &Result, EvalInfo &Info) {
858  if (!E->getType()->isIntegralType())
859    return false;
860
861  return IntExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E));
862}
863
864static bool EvaluateInteger(const Expr* E, APSInt &Result, EvalInfo &Info) {
865  APValue Val;
866  if (!EvaluateIntegerOrLValue(E, Val, Info) || !Val.isInt())
867    return false;
868  Result = Val.getInt();
869  return true;
870}
871
872bool IntExprEvaluator::CheckReferencedDecl(const Expr* E, const Decl* D) {
873  // Enums are integer constant exprs.
874  if (const EnumConstantDecl *ECD = dyn_cast<EnumConstantDecl>(D))
875    return Success(ECD->getInitVal(), E);
876
877  // In C++, const, non-volatile integers initialized with ICEs are ICEs.
878  // In C, they can also be folded, although they are not ICEs.
879  if (Info.Ctx.getCanonicalType(E->getType()).getCVRQualifiers()
880                                                        == Qualifiers::Const) {
881
882    if (isa<ParmVarDecl>(D))
883      return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
884
885    if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
886      if (const Expr *Init = VD->getAnyInitializer()) {
887        if (APValue *V = VD->getEvaluatedValue()) {
888          if (V->isInt())
889            return Success(V->getInt(), E);
890          return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
891        }
892
893        if (VD->isEvaluatingValue())
894          return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
895
896        VD->setEvaluatingValue();
897
898        if (Visit(const_cast<Expr*>(Init))) {
899          // Cache the evaluated value in the variable declaration.
900          VD->setEvaluatedValue(Result);
901          return true;
902        }
903
904        VD->setEvaluatedValue(APValue());
905        return false;
906      }
907    }
908  }
909
910  // Otherwise, random variable references are not constants.
911  return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
912}
913
914/// EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way
915/// as GCC.
916static int EvaluateBuiltinClassifyType(const CallExpr *E) {
917  // The following enum mimics the values returned by GCC.
918  // FIXME: Does GCC differ between lvalue and rvalue references here?
919  enum gcc_type_class {
920    no_type_class = -1,
921    void_type_class, integer_type_class, char_type_class,
922    enumeral_type_class, boolean_type_class,
923    pointer_type_class, reference_type_class, offset_type_class,
924    real_type_class, complex_type_class,
925    function_type_class, method_type_class,
926    record_type_class, union_type_class,
927    array_type_class, string_type_class,
928    lang_type_class
929  };
930
931  // If no argument was supplied, default to "no_type_class". This isn't
932  // ideal, however it is what gcc does.
933  if (E->getNumArgs() == 0)
934    return no_type_class;
935
936  QualType ArgTy = E->getArg(0)->getType();
937  if (ArgTy->isVoidType())
938    return void_type_class;
939  else if (ArgTy->isEnumeralType())
940    return enumeral_type_class;
941  else if (ArgTy->isBooleanType())
942    return boolean_type_class;
943  else if (ArgTy->isCharType())
944    return string_type_class; // gcc doesn't appear to use char_type_class
945  else if (ArgTy->isIntegerType())
946    return integer_type_class;
947  else if (ArgTy->isPointerType())
948    return pointer_type_class;
949  else if (ArgTy->isReferenceType())
950    return reference_type_class;
951  else if (ArgTy->isRealType())
952    return real_type_class;
953  else if (ArgTy->isComplexType())
954    return complex_type_class;
955  else if (ArgTy->isFunctionType())
956    return function_type_class;
957  else if (ArgTy->isStructureType())
958    return record_type_class;
959  else if (ArgTy->isUnionType())
960    return union_type_class;
961  else if (ArgTy->isArrayType())
962    return array_type_class;
963  else if (ArgTy->isUnionType())
964    return union_type_class;
965  else  // FIXME: offset_type_class, method_type_class, & lang_type_class?
966    assert(0 && "CallExpr::isBuiltinClassifyType(): unimplemented type");
967  return -1;
968}
969
970bool IntExprEvaluator::VisitCallExpr(CallExpr *E) {
971  switch (E->isBuiltinCall(Info.Ctx)) {
972  default:
973    return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
974
975  case Builtin::BI__builtin_object_size: {
976    const Expr *Arg = E->getArg(0)->IgnoreParens();
977    Expr::EvalResult Base;
978
979    // TODO: Perhaps we should let LLVM lower this?
980    if (Arg->EvaluateAsAny(Base, Info.Ctx)
981        && Base.Val.getKind() == APValue::LValue
982        && !Base.HasSideEffects)
983      if (const Expr *LVBase = Base.Val.getLValueBase())
984        if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(LVBase)) {
985          if (const VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl())) {
986            if (!VD->getType()->isIncompleteType()
987                && VD->getType()->isObjectType()
988                && !VD->getType()->isVariablyModifiedType()
989                && !VD->getType()->isDependentType()) {
990              CharUnits Size = Info.Ctx.getTypeSizeInChars(VD->getType());
991              CharUnits Offset = Base.Val.getLValueOffset();
992              if (!Offset.isNegative() && Offset <= Size)
993                Size -= Offset;
994              else
995                Size = CharUnits::Zero();
996              return Success(Size.getQuantity(), E);
997            }
998          }
999        }
1000
1001    // If evaluating the argument has side-effects we can't determine
1002    // the size of the object and lower it to unknown now.
1003    if (E->getArg(0)->HasSideEffects(Info.Ctx)) {
1004      if (E->getArg(1)->EvaluateAsInt(Info.Ctx).getZExtValue() <= 1)
1005        return Success(-1ULL, E);
1006      return Success(0, E);
1007    }
1008
1009    return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
1010  }
1011
1012  case Builtin::BI__builtin_classify_type:
1013    return Success(EvaluateBuiltinClassifyType(E), E);
1014
1015  case Builtin::BI__builtin_constant_p:
1016    // __builtin_constant_p always has one operand: it returns true if that
1017    // operand can be folded, false otherwise.
1018    return Success(E->getArg(0)->isEvaluatable(Info.Ctx), E);
1019
1020  case Builtin::BI__builtin_eh_return_data_regno: {
1021    int Operand = E->getArg(0)->EvaluateAsInt(Info.Ctx).getZExtValue();
1022    Operand = Info.Ctx.Target.getEHDataRegisterNumber(Operand);
1023    return Success(Operand, E);
1024  }
1025
1026  case Builtin::BI__builtin_expect:
1027    return Visit(E->getArg(0));
1028  }
1029}
1030
1031bool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
1032  if (E->getOpcode() == BinaryOperator::Comma) {
1033    if (!Visit(E->getRHS()))
1034      return false;
1035
1036    // If we can't evaluate the LHS, it might have side effects;
1037    // conservatively mark it.
1038    if (!E->getLHS()->isEvaluatable(Info.Ctx))
1039      Info.EvalResult.HasSideEffects = true;
1040
1041    return true;
1042  }
1043
1044  if (E->isLogicalOp()) {
1045    // These need to be handled specially because the operands aren't
1046    // necessarily integral
1047    bool lhsResult, rhsResult;
1048
1049    if (HandleConversionToBool(E->getLHS(), lhsResult, Info)) {
1050      // We were able to evaluate the LHS, see if we can get away with not
1051      // evaluating the RHS: 0 && X -> 0, 1 || X -> 1
1052      if (lhsResult == (E->getOpcode() == BinaryOperator::LOr))
1053        return Success(lhsResult, E);
1054
1055      if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) {
1056        if (E->getOpcode() == BinaryOperator::LOr)
1057          return Success(lhsResult || rhsResult, E);
1058        else
1059          return Success(lhsResult && rhsResult, E);
1060      }
1061    } else {
1062      if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) {
1063        // We can't evaluate the LHS; however, sometimes the result
1064        // is determined by the RHS: X && 0 -> 0, X || 1 -> 1.
1065        if (rhsResult == (E->getOpcode() == BinaryOperator::LOr) ||
1066            !rhsResult == (E->getOpcode() == BinaryOperator::LAnd)) {
1067          // Since we weren't able to evaluate the left hand side, it
1068          // must have had side effects.
1069          Info.EvalResult.HasSideEffects = true;
1070
1071          return Success(rhsResult, E);
1072        }
1073      }
1074    }
1075
1076    return false;
1077  }
1078
1079  QualType LHSTy = E->getLHS()->getType();
1080  QualType RHSTy = E->getRHS()->getType();
1081
1082  if (LHSTy->isAnyComplexType()) {
1083    assert(RHSTy->isAnyComplexType() && "Invalid comparison");
1084    APValue LHS, RHS;
1085
1086    if (!EvaluateComplex(E->getLHS(), LHS, Info))
1087      return false;
1088
1089    if (!EvaluateComplex(E->getRHS(), RHS, Info))
1090      return false;
1091
1092    if (LHS.isComplexFloat()) {
1093      APFloat::cmpResult CR_r =
1094        LHS.getComplexFloatReal().compare(RHS.getComplexFloatReal());
1095      APFloat::cmpResult CR_i =
1096        LHS.getComplexFloatImag().compare(RHS.getComplexFloatImag());
1097
1098      if (E->getOpcode() == BinaryOperator::EQ)
1099        return Success((CR_r == APFloat::cmpEqual &&
1100                        CR_i == APFloat::cmpEqual), E);
1101      else {
1102        assert(E->getOpcode() == BinaryOperator::NE &&
1103               "Invalid complex comparison.");
1104        return Success(((CR_r == APFloat::cmpGreaterThan ||
1105                         CR_r == APFloat::cmpLessThan) &&
1106                        (CR_i == APFloat::cmpGreaterThan ||
1107                         CR_i == APFloat::cmpLessThan)), E);
1108      }
1109    } else {
1110      if (E->getOpcode() == BinaryOperator::EQ)
1111        return Success((LHS.getComplexIntReal() == RHS.getComplexIntReal() &&
1112                        LHS.getComplexIntImag() == RHS.getComplexIntImag()), E);
1113      else {
1114        assert(E->getOpcode() == BinaryOperator::NE &&
1115               "Invalid compex comparison.");
1116        return Success((LHS.getComplexIntReal() != RHS.getComplexIntReal() ||
1117                        LHS.getComplexIntImag() != RHS.getComplexIntImag()), E);
1118      }
1119    }
1120  }
1121
1122  if (LHSTy->isRealFloatingType() &&
1123      RHSTy->isRealFloatingType()) {
1124    APFloat RHS(0.0), LHS(0.0);
1125
1126    if (!EvaluateFloat(E->getRHS(), RHS, Info))
1127      return false;
1128
1129    if (!EvaluateFloat(E->getLHS(), LHS, Info))
1130      return false;
1131
1132    APFloat::cmpResult CR = LHS.compare(RHS);
1133
1134    switch (E->getOpcode()) {
1135    default:
1136      assert(0 && "Invalid binary operator!");
1137    case BinaryOperator::LT:
1138      return Success(CR == APFloat::cmpLessThan, E);
1139    case BinaryOperator::GT:
1140      return Success(CR == APFloat::cmpGreaterThan, E);
1141    case BinaryOperator::LE:
1142      return Success(CR == APFloat::cmpLessThan || CR == APFloat::cmpEqual, E);
1143    case BinaryOperator::GE:
1144      return Success(CR == APFloat::cmpGreaterThan || CR == APFloat::cmpEqual,
1145                     E);
1146    case BinaryOperator::EQ:
1147      return Success(CR == APFloat::cmpEqual, E);
1148    case BinaryOperator::NE:
1149      return Success(CR == APFloat::cmpGreaterThan
1150                     || CR == APFloat::cmpLessThan, E);
1151    }
1152  }
1153
1154  if (LHSTy->isPointerType() && RHSTy->isPointerType()) {
1155    if (E->getOpcode() == BinaryOperator::Sub || E->isEqualityOp()) {
1156      APValue LHSValue;
1157      if (!EvaluatePointer(E->getLHS(), LHSValue, Info))
1158        return false;
1159
1160      APValue RHSValue;
1161      if (!EvaluatePointer(E->getRHS(), RHSValue, Info))
1162        return false;
1163
1164      // Reject any bases from the normal codepath; we special-case comparisons
1165      // to null.
1166      if (LHSValue.getLValueBase()) {
1167        if (!E->isEqualityOp())
1168          return false;
1169        if (RHSValue.getLValueBase() || !RHSValue.getLValueOffset().isZero())
1170          return false;
1171        bool bres;
1172        if (!EvalPointerValueAsBool(LHSValue, bres))
1173          return false;
1174        return Success(bres ^ (E->getOpcode() == BinaryOperator::EQ), E);
1175      } else if (RHSValue.getLValueBase()) {
1176        if (!E->isEqualityOp())
1177          return false;
1178        if (LHSValue.getLValueBase() || !LHSValue.getLValueOffset().isZero())
1179          return false;
1180        bool bres;
1181        if (!EvalPointerValueAsBool(RHSValue, bres))
1182          return false;
1183        return Success(bres ^ (E->getOpcode() == BinaryOperator::EQ), E);
1184      }
1185
1186      if (E->getOpcode() == BinaryOperator::Sub) {
1187        const QualType Type = E->getLHS()->getType();
1188        const QualType ElementType = Type->getAs<PointerType>()->getPointeeType();
1189
1190        CharUnits ElementSize = CharUnits::One();
1191        if (!ElementType->isVoidType() && !ElementType->isFunctionType())
1192          ElementSize = Info.Ctx.getTypeSizeInChars(ElementType);
1193
1194        CharUnits Diff = LHSValue.getLValueOffset() -
1195                             RHSValue.getLValueOffset();
1196        return Success(Diff / ElementSize, E);
1197      }
1198      bool Result;
1199      if (E->getOpcode() == BinaryOperator::EQ) {
1200        Result = LHSValue.getLValueOffset() == RHSValue.getLValueOffset();
1201      } else {
1202        Result = LHSValue.getLValueOffset() != RHSValue.getLValueOffset();
1203      }
1204      return Success(Result, E);
1205    }
1206  }
1207  if (!LHSTy->isIntegralType() ||
1208      !RHSTy->isIntegralType()) {
1209    // We can't continue from here for non-integral types, and they
1210    // could potentially confuse the following operations.
1211    return false;
1212  }
1213
1214  // The LHS of a constant expr is always evaluated and needed.
1215  if (!Visit(E->getLHS()))
1216    return false; // error in subexpression.
1217
1218  APValue RHSVal;
1219  if (!EvaluateIntegerOrLValue(E->getRHS(), RHSVal, Info))
1220    return false;
1221
1222  // Handle cases like (unsigned long)&a + 4.
1223  if (E->isAdditiveOp() && Result.isLValue() && RHSVal.isInt()) {
1224    CharUnits Offset = Result.getLValueOffset();
1225    CharUnits AdditionalOffset = CharUnits::fromQuantity(
1226                                     RHSVal.getInt().getZExtValue());
1227    if (E->getOpcode() == BinaryOperator::Add)
1228      Offset += AdditionalOffset;
1229    else
1230      Offset -= AdditionalOffset;
1231    Result = APValue(Result.getLValueBase(), Offset);
1232    return true;
1233  }
1234
1235  // Handle cases like 4 + (unsigned long)&a
1236  if (E->getOpcode() == BinaryOperator::Add &&
1237        RHSVal.isLValue() && Result.isInt()) {
1238    CharUnits Offset = RHSVal.getLValueOffset();
1239    Offset += CharUnits::fromQuantity(Result.getInt().getZExtValue());
1240    Result = APValue(RHSVal.getLValueBase(), Offset);
1241    return true;
1242  }
1243
1244  // All the following cases expect both operands to be an integer
1245  if (!Result.isInt() || !RHSVal.isInt())
1246    return false;
1247
1248  APSInt& RHS = RHSVal.getInt();
1249
1250  switch (E->getOpcode()) {
1251  default:
1252    return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E);
1253  case BinaryOperator::Mul: return Success(Result.getInt() * RHS, E);
1254  case BinaryOperator::Add: return Success(Result.getInt() + RHS, E);
1255  case BinaryOperator::Sub: return Success(Result.getInt() - RHS, E);
1256  case BinaryOperator::And: return Success(Result.getInt() & RHS, E);
1257  case BinaryOperator::Xor: return Success(Result.getInt() ^ RHS, E);
1258  case BinaryOperator::Or:  return Success(Result.getInt() | RHS, E);
1259  case BinaryOperator::Div:
1260    if (RHS == 0)
1261      return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E);
1262    return Success(Result.getInt() / RHS, E);
1263  case BinaryOperator::Rem:
1264    if (RHS == 0)
1265      return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E);
1266    return Success(Result.getInt() % RHS, E);
1267  case BinaryOperator::Shl: {
1268    // FIXME: Warn about out of range shift amounts!
1269    unsigned SA =
1270      (unsigned) RHS.getLimitedValue(Result.getInt().getBitWidth()-1);
1271    return Success(Result.getInt() << SA, E);
1272  }
1273  case BinaryOperator::Shr: {
1274    unsigned SA =
1275      (unsigned) RHS.getLimitedValue(Result.getInt().getBitWidth()-1);
1276    return Success(Result.getInt() >> SA, E);
1277  }
1278
1279  case BinaryOperator::LT: return Success(Result.getInt() < RHS, E);
1280  case BinaryOperator::GT: return Success(Result.getInt() > RHS, E);
1281  case BinaryOperator::LE: return Success(Result.getInt() <= RHS, E);
1282  case BinaryOperator::GE: return Success(Result.getInt() >= RHS, E);
1283  case BinaryOperator::EQ: return Success(Result.getInt() == RHS, E);
1284  case BinaryOperator::NE: return Success(Result.getInt() != RHS, E);
1285  }
1286}
1287
1288bool IntExprEvaluator::VisitConditionalOperator(const ConditionalOperator *E) {
1289  bool Cond;
1290  if (!HandleConversionToBool(E->getCond(), Cond, Info))
1291    return false;
1292
1293  return Visit(Cond ? E->getTrueExpr() : E->getFalseExpr());
1294}
1295
1296CharUnits IntExprEvaluator::GetAlignOfType(QualType T) {
1297  // C++ [expr.sizeof]p2: "When applied to a reference or a reference type,
1298  //   the result is the size of the referenced type."
1299  // C++ [expr.alignof]p3: "When alignof is applied to a reference type, the
1300  //   result shall be the alignment of the referenced type."
1301  if (const ReferenceType *Ref = T->getAs<ReferenceType>())
1302    T = Ref->getPointeeType();
1303
1304  // Get information about the alignment.
1305  unsigned CharSize = Info.Ctx.Target.getCharWidth();
1306
1307  // __alignof is defined to return the preferred alignment.
1308  return CharUnits::fromQuantity(
1309      Info.Ctx.getPreferredTypeAlign(T.getTypePtr()) / CharSize);
1310}
1311
1312CharUnits IntExprEvaluator::GetAlignOfExpr(const Expr *E) {
1313  E = E->IgnoreParens();
1314
1315  // alignof decl is always accepted, even if it doesn't make sense: we default
1316  // to 1 in those cases.
1317  if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
1318    return Info.Ctx.getDeclAlign(DRE->getDecl(),
1319                                 /*RefAsPointee*/true);
1320
1321  if (const MemberExpr *ME = dyn_cast<MemberExpr>(E))
1322    return Info.Ctx.getDeclAlign(ME->getMemberDecl(),
1323                                 /*RefAsPointee*/true);
1324
1325  return GetAlignOfType(E->getType());
1326}
1327
1328
1329/// VisitSizeAlignOfExpr - Evaluate a sizeof or alignof with a result as the
1330/// expression's type.
1331bool IntExprEvaluator::VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E) {
1332  // Handle alignof separately.
1333  if (!E->isSizeOf()) {
1334    if (E->isArgumentType())
1335      return Success(GetAlignOfType(E->getArgumentType()).getQuantity(), E);
1336    else
1337      return Success(GetAlignOfExpr(E->getArgumentExpr()).getQuantity(), E);
1338  }
1339
1340  QualType SrcTy = E->getTypeOfArgument();
1341  // C++ [expr.sizeof]p2: "When applied to a reference or a reference type,
1342  //   the result is the size of the referenced type."
1343  // C++ [expr.alignof]p3: "When alignof is applied to a reference type, the
1344  //   result shall be the alignment of the referenced type."
1345  if (const ReferenceType *Ref = SrcTy->getAs<ReferenceType>())
1346    SrcTy = Ref->getPointeeType();
1347
1348  // sizeof(void), __alignof__(void), sizeof(function) = 1 as a gcc
1349  // extension.
1350  if (SrcTy->isVoidType() || SrcTy->isFunctionType())
1351    return Success(1, E);
1352
1353  // sizeof(vla) is not a constantexpr: C99 6.5.3.4p2.
1354  if (!SrcTy->isConstantSizeType())
1355    return false;
1356
1357  // Get information about the size.
1358  return Success(Info.Ctx.getTypeSizeInChars(SrcTy).getQuantity(), E);
1359}
1360
1361bool IntExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
1362  // Special case unary operators that do not need their subexpression
1363  // evaluated.  offsetof/sizeof/alignof are all special.
1364  if (E->isOffsetOfOp()) {
1365    // The AST for offsetof is defined in such a way that we can just
1366    // directly Evaluate it as an l-value.
1367    APValue LV;
1368    if (!EvaluateLValue(E->getSubExpr(), LV, Info))
1369      return false;
1370    if (LV.getLValueBase())
1371      return false;
1372    return Success(LV.getLValueOffset().getQuantity(), E);
1373  }
1374
1375  if (E->getOpcode() == UnaryOperator::LNot) {
1376    // LNot's operand isn't necessarily an integer, so we handle it specially.
1377    bool bres;
1378    if (!HandleConversionToBool(E->getSubExpr(), bres, Info))
1379      return false;
1380    return Success(!bres, E);
1381  }
1382
1383  // Only handle integral operations...
1384  if (!E->getSubExpr()->getType()->isIntegralType())
1385    return false;
1386
1387  // Get the operand value into 'Result'.
1388  if (!Visit(E->getSubExpr()))
1389    return false;
1390
1391  switch (E->getOpcode()) {
1392  default:
1393    // Address, indirect, pre/post inc/dec, etc are not valid constant exprs.
1394    // See C99 6.6p3.
1395    return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E);
1396  case UnaryOperator::Extension:
1397    // FIXME: Should extension allow i-c-e extension expressions in its scope?
1398    // If so, we could clear the diagnostic ID.
1399    return true;
1400  case UnaryOperator::Plus:
1401    // The result is always just the subexpr.
1402    return true;
1403  case UnaryOperator::Minus:
1404    if (!Result.isInt()) return false;
1405    return Success(-Result.getInt(), E);
1406  case UnaryOperator::Not:
1407    if (!Result.isInt()) return false;
1408    return Success(~Result.getInt(), E);
1409  }
1410}
1411
1412/// HandleCast - This is used to evaluate implicit or explicit casts where the
1413/// result type is integer.
1414bool IntExprEvaluator::VisitCastExpr(CastExpr *E) {
1415  Expr *SubExpr = E->getSubExpr();
1416  QualType DestType = E->getType();
1417  QualType SrcType = SubExpr->getType();
1418
1419  if (DestType->isBooleanType()) {
1420    bool BoolResult;
1421    if (!HandleConversionToBool(SubExpr, BoolResult, Info))
1422      return false;
1423    return Success(BoolResult, E);
1424  }
1425
1426  // Handle simple integer->integer casts.
1427  if (SrcType->isIntegralType()) {
1428    if (!Visit(SubExpr))
1429      return false;
1430
1431    if (!Result.isInt()) {
1432      // Only allow casts of lvalues if they are lossless.
1433      return Info.Ctx.getTypeSize(DestType) == Info.Ctx.getTypeSize(SrcType);
1434    }
1435
1436    return Success(HandleIntToIntCast(DestType, SrcType,
1437                                      Result.getInt(), Info.Ctx), E);
1438  }
1439
1440  // FIXME: Clean this up!
1441  if (SrcType->isPointerType()) {
1442    APValue LV;
1443    if (!EvaluatePointer(SubExpr, LV, Info))
1444      return false;
1445
1446    if (LV.getLValueBase()) {
1447      // Only allow based lvalue casts if they are lossless.
1448      if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(SrcType))
1449        return false;
1450
1451      Result = LV;
1452      return true;
1453    }
1454
1455    APSInt AsInt = Info.Ctx.MakeIntValue(LV.getLValueOffset().getQuantity(),
1456                                         SrcType);
1457    return Success(HandleIntToIntCast(DestType, SrcType, AsInt, Info.Ctx), E);
1458  }
1459
1460  if (SrcType->isArrayType() || SrcType->isFunctionType()) {
1461    // This handles double-conversion cases, where there's both
1462    // an l-value promotion and an implicit conversion to int.
1463    APValue LV;
1464    if (!EvaluateLValue(SubExpr, LV, Info))
1465      return false;
1466
1467    if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(Info.Ctx.VoidPtrTy))
1468      return false;
1469
1470    Result = LV;
1471    return true;
1472  }
1473
1474  if (SrcType->isAnyComplexType()) {
1475    APValue C;
1476    if (!EvaluateComplex(SubExpr, C, Info))
1477      return false;
1478    if (C.isComplexFloat())
1479      return Success(HandleFloatToIntCast(DestType, SrcType,
1480                                          C.getComplexFloatReal(), Info.Ctx),
1481                     E);
1482    else
1483      return Success(HandleIntToIntCast(DestType, SrcType,
1484                                        C.getComplexIntReal(), Info.Ctx), E);
1485  }
1486  // FIXME: Handle vectors
1487
1488  if (!SrcType->isRealFloatingType())
1489    return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
1490
1491  APFloat F(0.0);
1492  if (!EvaluateFloat(SubExpr, F, Info))
1493    return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
1494
1495  return Success(HandleFloatToIntCast(DestType, SrcType, F, Info.Ctx), E);
1496}
1497
1498bool IntExprEvaluator::VisitUnaryReal(const UnaryOperator *E) {
1499  if (E->getSubExpr()->getType()->isAnyComplexType()) {
1500    APValue LV;
1501    if (!EvaluateComplex(E->getSubExpr(), LV, Info) || !LV.isComplexInt())
1502      return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
1503    return Success(LV.getComplexIntReal(), E);
1504  }
1505
1506  return Visit(E->getSubExpr());
1507}
1508
1509bool IntExprEvaluator::VisitUnaryImag(const UnaryOperator *E) {
1510  if (E->getSubExpr()->getType()->isComplexIntegerType()) {
1511    APValue LV;
1512    if (!EvaluateComplex(E->getSubExpr(), LV, Info) || !LV.isComplexInt())
1513      return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
1514    return Success(LV.getComplexIntImag(), E);
1515  }
1516
1517  if (!E->getSubExpr()->isEvaluatable(Info.Ctx))
1518    Info.EvalResult.HasSideEffects = true;
1519  return Success(0, E);
1520}
1521
1522//===----------------------------------------------------------------------===//
1523// Float Evaluation
1524//===----------------------------------------------------------------------===//
1525
1526namespace {
1527class FloatExprEvaluator
1528  : public StmtVisitor<FloatExprEvaluator, bool> {
1529  EvalInfo &Info;
1530  APFloat &Result;
1531public:
1532  FloatExprEvaluator(EvalInfo &info, APFloat &result)
1533    : Info(info), Result(result) {}
1534
1535  bool VisitStmt(Stmt *S) {
1536    return false;
1537  }
1538
1539  bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
1540  bool VisitCallExpr(const CallExpr *E);
1541
1542  bool VisitUnaryOperator(const UnaryOperator *E);
1543  bool VisitBinaryOperator(const BinaryOperator *E);
1544  bool VisitFloatingLiteral(const FloatingLiteral *E);
1545  bool VisitCastExpr(CastExpr *E);
1546  bool VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E);
1547  bool VisitConditionalOperator(ConditionalOperator *E);
1548
1549  bool VisitChooseExpr(const ChooseExpr *E)
1550    { return Visit(E->getChosenSubExpr(Info.Ctx)); }
1551  bool VisitUnaryExtension(const UnaryOperator *E)
1552    { return Visit(E->getSubExpr()); }
1553
1554  // FIXME: Missing: __real__/__imag__, array subscript of vector,
1555  //                 member of vector, ImplicitValueInitExpr
1556};
1557} // end anonymous namespace
1558
1559static bool EvaluateFloat(const Expr* E, APFloat& Result, EvalInfo &Info) {
1560  return FloatExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E));
1561}
1562
1563static bool TryEvaluateBuiltinNaN(ASTContext &Context,
1564                                  QualType ResultTy,
1565                                  const Expr *Arg,
1566                                  bool SNaN,
1567                                  llvm::APFloat &Result) {
1568  const StringLiteral *S = dyn_cast<StringLiteral>(Arg->IgnoreParenCasts());
1569  if (!S) return false;
1570
1571  const llvm::fltSemantics &Sem = Context.getFloatTypeSemantics(ResultTy);
1572
1573  llvm::APInt fill;
1574
1575  // Treat empty strings as if they were zero.
1576  if (S->getString().empty())
1577    fill = llvm::APInt(32, 0);
1578  else if (S->getString().getAsInteger(0, fill))
1579    return false;
1580
1581  if (SNaN)
1582    Result = llvm::APFloat::getSNaN(Sem, false, &fill);
1583  else
1584    Result = llvm::APFloat::getQNaN(Sem, false, &fill);
1585  return true;
1586}
1587
1588bool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) {
1589  switch (E->isBuiltinCall(Info.Ctx)) {
1590  default: return false;
1591  case Builtin::BI__builtin_huge_val:
1592  case Builtin::BI__builtin_huge_valf:
1593  case Builtin::BI__builtin_huge_vall:
1594  case Builtin::BI__builtin_inf:
1595  case Builtin::BI__builtin_inff:
1596  case Builtin::BI__builtin_infl: {
1597    const llvm::fltSemantics &Sem =
1598      Info.Ctx.getFloatTypeSemantics(E->getType());
1599    Result = llvm::APFloat::getInf(Sem);
1600    return true;
1601  }
1602
1603  case Builtin::BI__builtin_nans:
1604  case Builtin::BI__builtin_nansf:
1605  case Builtin::BI__builtin_nansl:
1606    return TryEvaluateBuiltinNaN(Info.Ctx, E->getType(), E->getArg(0),
1607                                 true, Result);
1608
1609  case Builtin::BI__builtin_nan:
1610  case Builtin::BI__builtin_nanf:
1611  case Builtin::BI__builtin_nanl:
1612    // If this is __builtin_nan() turn this into a nan, otherwise we
1613    // can't constant fold it.
1614    return TryEvaluateBuiltinNaN(Info.Ctx, E->getType(), E->getArg(0),
1615                                 false, Result);
1616
1617  case Builtin::BI__builtin_fabs:
1618  case Builtin::BI__builtin_fabsf:
1619  case Builtin::BI__builtin_fabsl:
1620    if (!EvaluateFloat(E->getArg(0), Result, Info))
1621      return false;
1622
1623    if (Result.isNegative())
1624      Result.changeSign();
1625    return true;
1626
1627  case Builtin::BI__builtin_copysign:
1628  case Builtin::BI__builtin_copysignf:
1629  case Builtin::BI__builtin_copysignl: {
1630    APFloat RHS(0.);
1631    if (!EvaluateFloat(E->getArg(0), Result, Info) ||
1632        !EvaluateFloat(E->getArg(1), RHS, Info))
1633      return false;
1634    Result.copySign(RHS);
1635    return true;
1636  }
1637  }
1638}
1639
1640bool FloatExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
1641  if (E->getOpcode() == UnaryOperator::Deref)
1642    return false;
1643
1644  if (!EvaluateFloat(E->getSubExpr(), Result, Info))
1645    return false;
1646
1647  switch (E->getOpcode()) {
1648  default: return false;
1649  case UnaryOperator::Plus:
1650    return true;
1651  case UnaryOperator::Minus:
1652    Result.changeSign();
1653    return true;
1654  }
1655}
1656
1657bool FloatExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
1658  if (E->getOpcode() == BinaryOperator::Comma) {
1659    if (!EvaluateFloat(E->getRHS(), Result, Info))
1660      return false;
1661
1662    // If we can't evaluate the LHS, it might have side effects;
1663    // conservatively mark it.
1664    if (!E->getLHS()->isEvaluatable(Info.Ctx))
1665      Info.EvalResult.HasSideEffects = true;
1666
1667    return true;
1668  }
1669
1670  // FIXME: Diagnostics?  I really don't understand how the warnings
1671  // and errors are supposed to work.
1672  APFloat RHS(0.0);
1673  if (!EvaluateFloat(E->getLHS(), Result, Info))
1674    return false;
1675  if (!EvaluateFloat(E->getRHS(), RHS, Info))
1676    return false;
1677
1678  switch (E->getOpcode()) {
1679  default: return false;
1680  case BinaryOperator::Mul:
1681    Result.multiply(RHS, APFloat::rmNearestTiesToEven);
1682    return true;
1683  case BinaryOperator::Add:
1684    Result.add(RHS, APFloat::rmNearestTiesToEven);
1685    return true;
1686  case BinaryOperator::Sub:
1687    Result.subtract(RHS, APFloat::rmNearestTiesToEven);
1688    return true;
1689  case BinaryOperator::Div:
1690    Result.divide(RHS, APFloat::rmNearestTiesToEven);
1691    return true;
1692  }
1693}
1694
1695bool FloatExprEvaluator::VisitFloatingLiteral(const FloatingLiteral *E) {
1696  Result = E->getValue();
1697  return true;
1698}
1699
1700bool FloatExprEvaluator::VisitCastExpr(CastExpr *E) {
1701  Expr* SubExpr = E->getSubExpr();
1702
1703  if (SubExpr->getType()->isIntegralType()) {
1704    APSInt IntResult;
1705    if (!EvaluateInteger(SubExpr, IntResult, Info))
1706      return false;
1707    Result = HandleIntToFloatCast(E->getType(), SubExpr->getType(),
1708                                  IntResult, Info.Ctx);
1709    return true;
1710  }
1711  if (SubExpr->getType()->isRealFloatingType()) {
1712    if (!Visit(SubExpr))
1713      return false;
1714    Result = HandleFloatToFloatCast(E->getType(), SubExpr->getType(),
1715                                    Result, Info.Ctx);
1716    return true;
1717  }
1718  // FIXME: Handle complex types
1719
1720  return false;
1721}
1722
1723bool FloatExprEvaluator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
1724  Result = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(E->getType()));
1725  return true;
1726}
1727
1728bool FloatExprEvaluator::VisitConditionalOperator(ConditionalOperator *E) {
1729  bool Cond;
1730  if (!HandleConversionToBool(E->getCond(), Cond, Info))
1731    return false;
1732
1733  return Visit(Cond ? E->getTrueExpr() : E->getFalseExpr());
1734}
1735
1736//===----------------------------------------------------------------------===//
1737// Complex Evaluation (for float and integer)
1738//===----------------------------------------------------------------------===//
1739
1740namespace {
1741class ComplexExprEvaluator
1742  : public StmtVisitor<ComplexExprEvaluator, APValue> {
1743  EvalInfo &Info;
1744
1745public:
1746  ComplexExprEvaluator(EvalInfo &info) : Info(info) {}
1747
1748  //===--------------------------------------------------------------------===//
1749  //                            Visitor Methods
1750  //===--------------------------------------------------------------------===//
1751
1752  APValue VisitStmt(Stmt *S) {
1753    return APValue();
1754  }
1755
1756  APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
1757
1758  APValue VisitImaginaryLiteral(ImaginaryLiteral *E) {
1759    Expr* SubExpr = E->getSubExpr();
1760
1761    if (SubExpr->getType()->isRealFloatingType()) {
1762      APFloat Result(0.0);
1763
1764      if (!EvaluateFloat(SubExpr, Result, Info))
1765        return APValue();
1766
1767      return APValue(APFloat(Result.getSemantics(), APFloat::fcZero, false),
1768                     Result);
1769    } else {
1770      assert(SubExpr->getType()->isIntegerType() &&
1771             "Unexpected imaginary literal.");
1772
1773      llvm::APSInt Result;
1774      if (!EvaluateInteger(SubExpr, Result, Info))
1775        return APValue();
1776
1777      llvm::APSInt Zero(Result.getBitWidth(), !Result.isSigned());
1778      Zero = 0;
1779      return APValue(Zero, Result);
1780    }
1781  }
1782
1783  APValue VisitCastExpr(CastExpr *E) {
1784    Expr* SubExpr = E->getSubExpr();
1785    QualType EltType = E->getType()->getAs<ComplexType>()->getElementType();
1786    QualType SubType = SubExpr->getType();
1787
1788    if (SubType->isRealFloatingType()) {
1789      APFloat Result(0.0);
1790
1791      if (!EvaluateFloat(SubExpr, Result, Info))
1792        return APValue();
1793
1794      if (EltType->isRealFloatingType()) {
1795        Result = HandleFloatToFloatCast(EltType, SubType, Result, Info.Ctx);
1796        return APValue(Result,
1797                       APFloat(Result.getSemantics(), APFloat::fcZero, false));
1798      } else {
1799        llvm::APSInt IResult;
1800        IResult = HandleFloatToIntCast(EltType, SubType, Result, Info.Ctx);
1801        llvm::APSInt Zero(IResult.getBitWidth(), !IResult.isSigned());
1802        Zero = 0;
1803        return APValue(IResult, Zero);
1804      }
1805    } else if (SubType->isIntegerType()) {
1806      APSInt Result;
1807
1808      if (!EvaluateInteger(SubExpr, Result, Info))
1809        return APValue();
1810
1811      if (EltType->isRealFloatingType()) {
1812        APFloat FResult =
1813            HandleIntToFloatCast(EltType, SubType, Result, Info.Ctx);
1814        return APValue(FResult,
1815                       APFloat(FResult.getSemantics(), APFloat::fcZero, false));
1816      } else {
1817        Result = HandleIntToIntCast(EltType, SubType, Result, Info.Ctx);
1818        llvm::APSInt Zero(Result.getBitWidth(), !Result.isSigned());
1819        Zero = 0;
1820        return APValue(Result, Zero);
1821      }
1822    } else if (const ComplexType *CT = SubType->getAs<ComplexType>()) {
1823      APValue Src;
1824
1825      if (!EvaluateComplex(SubExpr, Src, Info))
1826        return APValue();
1827
1828      QualType SrcType = CT->getElementType();
1829
1830      if (Src.isComplexFloat()) {
1831        if (EltType->isRealFloatingType()) {
1832          return APValue(HandleFloatToFloatCast(EltType, SrcType,
1833                                                Src.getComplexFloatReal(),
1834                                                Info.Ctx),
1835                         HandleFloatToFloatCast(EltType, SrcType,
1836                                                Src.getComplexFloatImag(),
1837                                                Info.Ctx));
1838        } else {
1839          return APValue(HandleFloatToIntCast(EltType, SrcType,
1840                                              Src.getComplexFloatReal(),
1841                                              Info.Ctx),
1842                         HandleFloatToIntCast(EltType, SrcType,
1843                                              Src.getComplexFloatImag(),
1844                                              Info.Ctx));
1845        }
1846      } else {
1847        assert(Src.isComplexInt() && "Invalid evaluate result.");
1848        if (EltType->isRealFloatingType()) {
1849          return APValue(HandleIntToFloatCast(EltType, SrcType,
1850                                              Src.getComplexIntReal(),
1851                                              Info.Ctx),
1852                         HandleIntToFloatCast(EltType, SrcType,
1853                                              Src.getComplexIntImag(),
1854                                              Info.Ctx));
1855        } else {
1856          return APValue(HandleIntToIntCast(EltType, SrcType,
1857                                            Src.getComplexIntReal(),
1858                                            Info.Ctx),
1859                         HandleIntToIntCast(EltType, SrcType,
1860                                            Src.getComplexIntImag(),
1861                                            Info.Ctx));
1862        }
1863      }
1864    }
1865
1866    // FIXME: Handle more casts.
1867    return APValue();
1868  }
1869
1870  APValue VisitBinaryOperator(const BinaryOperator *E);
1871  APValue VisitChooseExpr(const ChooseExpr *E)
1872    { return Visit(E->getChosenSubExpr(Info.Ctx)); }
1873  APValue VisitUnaryExtension(const UnaryOperator *E)
1874    { return Visit(E->getSubExpr()); }
1875  // FIXME Missing: unary +/-/~, binary div, ImplicitValueInitExpr,
1876  //                conditional ?:, comma
1877};
1878} // end anonymous namespace
1879
1880static bool EvaluateComplex(const Expr *E, APValue &Result, EvalInfo &Info) {
1881  Result = ComplexExprEvaluator(Info).Visit(const_cast<Expr*>(E));
1882  assert((!Result.isComplexFloat() ||
1883          (&Result.getComplexFloatReal().getSemantics() ==
1884           &Result.getComplexFloatImag().getSemantics())) &&
1885         "Invalid complex evaluation.");
1886  return Result.isComplexFloat() || Result.isComplexInt();
1887}
1888
1889APValue ComplexExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
1890  APValue Result, RHS;
1891
1892  if (!EvaluateComplex(E->getLHS(), Result, Info))
1893    return APValue();
1894
1895  if (!EvaluateComplex(E->getRHS(), RHS, Info))
1896    return APValue();
1897
1898  assert(Result.isComplexFloat() == RHS.isComplexFloat() &&
1899         "Invalid operands to binary operator.");
1900  switch (E->getOpcode()) {
1901  default: return APValue();
1902  case BinaryOperator::Add:
1903    if (Result.isComplexFloat()) {
1904      Result.getComplexFloatReal().add(RHS.getComplexFloatReal(),
1905                                       APFloat::rmNearestTiesToEven);
1906      Result.getComplexFloatImag().add(RHS.getComplexFloatImag(),
1907                                       APFloat::rmNearestTiesToEven);
1908    } else {
1909      Result.getComplexIntReal() += RHS.getComplexIntReal();
1910      Result.getComplexIntImag() += RHS.getComplexIntImag();
1911    }
1912    break;
1913  case BinaryOperator::Sub:
1914    if (Result.isComplexFloat()) {
1915      Result.getComplexFloatReal().subtract(RHS.getComplexFloatReal(),
1916                                            APFloat::rmNearestTiesToEven);
1917      Result.getComplexFloatImag().subtract(RHS.getComplexFloatImag(),
1918                                            APFloat::rmNearestTiesToEven);
1919    } else {
1920      Result.getComplexIntReal() -= RHS.getComplexIntReal();
1921      Result.getComplexIntImag() -= RHS.getComplexIntImag();
1922    }
1923    break;
1924  case BinaryOperator::Mul:
1925    if (Result.isComplexFloat()) {
1926      APValue LHS = Result;
1927      APFloat &LHS_r = LHS.getComplexFloatReal();
1928      APFloat &LHS_i = LHS.getComplexFloatImag();
1929      APFloat &RHS_r = RHS.getComplexFloatReal();
1930      APFloat &RHS_i = RHS.getComplexFloatImag();
1931
1932      APFloat Tmp = LHS_r;
1933      Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven);
1934      Result.getComplexFloatReal() = Tmp;
1935      Tmp = LHS_i;
1936      Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven);
1937      Result.getComplexFloatReal().subtract(Tmp, APFloat::rmNearestTiesToEven);
1938
1939      Tmp = LHS_r;
1940      Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven);
1941      Result.getComplexFloatImag() = Tmp;
1942      Tmp = LHS_i;
1943      Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven);
1944      Result.getComplexFloatImag().add(Tmp, APFloat::rmNearestTiesToEven);
1945    } else {
1946      APValue LHS = Result;
1947      Result.getComplexIntReal() =
1948        (LHS.getComplexIntReal() * RHS.getComplexIntReal() -
1949         LHS.getComplexIntImag() * RHS.getComplexIntImag());
1950      Result.getComplexIntImag() =
1951        (LHS.getComplexIntReal() * RHS.getComplexIntImag() +
1952         LHS.getComplexIntImag() * RHS.getComplexIntReal());
1953    }
1954    break;
1955  }
1956
1957  return Result;
1958}
1959
1960//===----------------------------------------------------------------------===//
1961// Top level Expr::Evaluate method.
1962//===----------------------------------------------------------------------===//
1963
1964/// Evaluate - Return true if this is a constant which we can fold using
1965/// any crazy technique (that has nothing to do with language standards) that
1966/// we want to.  If this function returns true, it returns the folded constant
1967/// in Result.
1968bool Expr::Evaluate(EvalResult &Result, ASTContext &Ctx) const {
1969  EvalInfo Info(Ctx, Result);
1970
1971  if (getType()->isVectorType()) {
1972    if (!EvaluateVector(this, Result.Val, Info))
1973      return false;
1974  } else if (getType()->isIntegerType()) {
1975    if (!IntExprEvaluator(Info, Result.Val).Visit(const_cast<Expr*>(this)))
1976      return false;
1977  } else if (getType()->hasPointerRepresentation()) {
1978    if (!EvaluatePointer(this, Result.Val, Info))
1979      return false;
1980  } else if (getType()->isRealFloatingType()) {
1981    llvm::APFloat f(0.0);
1982    if (!EvaluateFloat(this, f, Info))
1983      return false;
1984
1985    Result.Val = APValue(f);
1986  } else if (getType()->isAnyComplexType()) {
1987    if (!EvaluateComplex(this, Result.Val, Info))
1988      return false;
1989  } else
1990    return false;
1991
1992  return true;
1993}
1994
1995bool Expr::EvaluateAsAny(EvalResult &Result, ASTContext &Ctx) const {
1996  EvalInfo Info(Ctx, Result, true);
1997
1998  if (getType()->isVectorType()) {
1999    if (!EvaluateVector(this, Result.Val, Info))
2000      return false;
2001  } else if (getType()->isIntegerType()) {
2002    if (!IntExprEvaluator(Info, Result.Val).Visit(const_cast<Expr*>(this)))
2003      return false;
2004  } else if (getType()->hasPointerRepresentation()) {
2005    if (!EvaluatePointer(this, Result.Val, Info))
2006      return false;
2007  } else if (getType()->isRealFloatingType()) {
2008    llvm::APFloat f(0.0);
2009    if (!EvaluateFloat(this, f, Info))
2010      return false;
2011
2012    Result.Val = APValue(f);
2013  } else if (getType()->isAnyComplexType()) {
2014    if (!EvaluateComplex(this, Result.Val, Info))
2015      return false;
2016  } else
2017    return false;
2018
2019  return true;
2020}
2021
2022bool Expr::EvaluateAsBooleanCondition(bool &Result, ASTContext &Ctx) const {
2023  EvalResult Scratch;
2024  EvalInfo Info(Ctx, Scratch);
2025
2026  return HandleConversionToBool(this, Result, Info);
2027}
2028
2029bool Expr::EvaluateAsLValue(EvalResult &Result, ASTContext &Ctx) const {
2030  EvalInfo Info(Ctx, Result);
2031
2032  return EvaluateLValue(this, Result.Val, Info) && !Result.HasSideEffects;
2033}
2034
2035bool Expr::EvaluateAsAnyLValue(EvalResult &Result, ASTContext &Ctx) const {
2036  EvalInfo Info(Ctx, Result, true);
2037
2038  return EvaluateLValue(this, Result.Val, Info) && !Result.HasSideEffects;
2039}
2040
2041/// isEvaluatable - Call Evaluate to see if this expression can be constant
2042/// folded, but discard the result.
2043bool Expr::isEvaluatable(ASTContext &Ctx) const {
2044  EvalResult Result;
2045  return Evaluate(Result, Ctx) && !Result.HasSideEffects;
2046}
2047
2048bool Expr::HasSideEffects(ASTContext &Ctx) const {
2049  Expr::EvalResult Result;
2050  EvalInfo Info(Ctx, Result);
2051  return HasSideEffect(Info).Visit(const_cast<Expr*>(this));
2052}
2053
2054APSInt Expr::EvaluateAsInt(ASTContext &Ctx) const {
2055  EvalResult EvalResult;
2056  bool Result = Evaluate(EvalResult, Ctx);
2057  Result = Result;
2058  assert(Result && "Could not evaluate expression");
2059  assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer");
2060
2061  return EvalResult.Val.getInt();
2062}
2063