ExprConstant.cpp revision 8cad3046be06ea73ff8892d947697a21d7a440d3
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/TypeLoc.h"
20#include "clang/AST/ASTDiagnostic.h"
21#include "clang/AST/Expr.h"
22#include "clang/Basic/Builtins.h"
23#include "clang/Basic/TargetInfo.h"
24#include "llvm/ADT/SmallString.h"
25#include <cstring>
26
27using namespace clang;
28using llvm::APSInt;
29using llvm::APFloat;
30
31/// EvalInfo - This is a private struct used by the evaluator to capture
32/// information about a subexpression as it is folded.  It retains information
33/// about the AST context, but also maintains information about the folded
34/// expression.
35///
36/// If an expression could be evaluated, it is still possible it is not a C
37/// "integer constant expression" or constant expression.  If not, this struct
38/// captures information about how and why not.
39///
40/// One bit of information passed *into* the request for constant folding
41/// indicates whether the subexpression is "evaluated" or not according to C
42/// rules.  For example, the RHS of (0 && foo()) is not evaluated.  We can
43/// evaluate the expression regardless of what the RHS is, but C only allows
44/// certain things in certain situations.
45namespace {
46  struct EvalInfo {
47    const ASTContext &Ctx;
48
49    /// EvalResult - Contains information about the evaluation.
50    Expr::EvalResult &EvalResult;
51
52    typedef llvm::DenseMap<const OpaqueValueExpr*, APValue> MapTy;
53    MapTy OpaqueValues;
54    const APValue *getOpaqueValue(const OpaqueValueExpr *e) const {
55      MapTy::const_iterator i = OpaqueValues.find(e);
56      if (i == OpaqueValues.end()) return 0;
57      return &i->second;
58    }
59
60    EvalInfo(const ASTContext &ctx, Expr::EvalResult &evalresult)
61      : Ctx(ctx), EvalResult(evalresult) {}
62  };
63
64  struct ComplexValue {
65  private:
66    bool IsInt;
67
68  public:
69    APSInt IntReal, IntImag;
70    APFloat FloatReal, FloatImag;
71
72    ComplexValue() : FloatReal(APFloat::Bogus), FloatImag(APFloat::Bogus) {}
73
74    void makeComplexFloat() { IsInt = false; }
75    bool isComplexFloat() const { return !IsInt; }
76    APFloat &getComplexFloatReal() { return FloatReal; }
77    APFloat &getComplexFloatImag() { return FloatImag; }
78
79    void makeComplexInt() { IsInt = true; }
80    bool isComplexInt() const { return IsInt; }
81    APSInt &getComplexIntReal() { return IntReal; }
82    APSInt &getComplexIntImag() { return IntImag; }
83
84    void moveInto(APValue &v) const {
85      if (isComplexFloat())
86        v = APValue(FloatReal, FloatImag);
87      else
88        v = APValue(IntReal, IntImag);
89    }
90    void setFrom(const APValue &v) {
91      assert(v.isComplexFloat() || v.isComplexInt());
92      if (v.isComplexFloat()) {
93        makeComplexFloat();
94        FloatReal = v.getComplexFloatReal();
95        FloatImag = v.getComplexFloatImag();
96      } else {
97        makeComplexInt();
98        IntReal = v.getComplexIntReal();
99        IntImag = v.getComplexIntImag();
100      }
101    }
102  };
103
104  struct LValue {
105    const Expr *Base;
106    CharUnits Offset;
107
108    const Expr *getLValueBase() { return Base; }
109    CharUnits getLValueOffset() { return Offset; }
110
111    void moveInto(APValue &v) const {
112      v = APValue(Base, Offset);
113    }
114    void setFrom(const APValue &v) {
115      assert(v.isLValue());
116      Base = v.getLValueBase();
117      Offset = v.getLValueOffset();
118    }
119  };
120}
121
122static bool Evaluate(EvalInfo &info, const Expr *E);
123static bool EvaluateLValue(const Expr *E, LValue &Result, EvalInfo &Info);
124static bool EvaluatePointer(const Expr *E, LValue &Result, EvalInfo &Info);
125static bool EvaluateInteger(const Expr *E, APSInt  &Result, EvalInfo &Info);
126static bool EvaluateIntegerOrLValue(const Expr *E, APValue  &Result,
127                                    EvalInfo &Info);
128static bool EvaluateFloat(const Expr *E, APFloat &Result, EvalInfo &Info);
129static bool EvaluateComplex(const Expr *E, ComplexValue &Res, EvalInfo &Info);
130
131//===----------------------------------------------------------------------===//
132// Misc utilities
133//===----------------------------------------------------------------------===//
134
135static bool IsGlobalLValue(const Expr* E) {
136  if (!E) return true;
137
138  if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
139    if (isa<FunctionDecl>(DRE->getDecl()))
140      return true;
141    if (const VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl()))
142      return VD->hasGlobalStorage();
143    return false;
144  }
145
146  if (const CompoundLiteralExpr *CLE = dyn_cast<CompoundLiteralExpr>(E))
147    return CLE->isFileScope();
148
149  return true;
150}
151
152static bool EvalPointerValueAsBool(LValue& Value, bool& Result) {
153  const Expr* Base = Value.Base;
154
155  // A null base expression indicates a null pointer.  These are always
156  // evaluatable, and they are false unless the offset is zero.
157  if (!Base) {
158    Result = !Value.Offset.isZero();
159    return true;
160  }
161
162  // Require the base expression to be a global l-value.
163  if (!IsGlobalLValue(Base)) return false;
164
165  // We have a non-null base expression.  These are generally known to
166  // be true, but if it'a decl-ref to a weak symbol it can be null at
167  // runtime.
168  Result = true;
169
170  const DeclRefExpr* DeclRef = dyn_cast<DeclRefExpr>(Base);
171  if (!DeclRef)
172    return true;
173
174  // If it's a weak symbol, it isn't constant-evaluable.
175  const ValueDecl* Decl = DeclRef->getDecl();
176  if (Decl->hasAttr<WeakAttr>() ||
177      Decl->hasAttr<WeakRefAttr>() ||
178      Decl->isWeakImported())
179    return false;
180
181  return true;
182}
183
184static bool HandleConversionToBool(const Expr* E, bool& Result,
185                                   EvalInfo &Info) {
186  if (E->getType()->isIntegralOrEnumerationType()) {
187    APSInt IntResult;
188    if (!EvaluateInteger(E, IntResult, Info))
189      return false;
190    Result = IntResult != 0;
191    return true;
192  } else if (E->getType()->isRealFloatingType()) {
193    APFloat FloatResult(0.0);
194    if (!EvaluateFloat(E, FloatResult, Info))
195      return false;
196    Result = !FloatResult.isZero();
197    return true;
198  } else if (E->getType()->hasPointerRepresentation()) {
199    LValue PointerResult;
200    if (!EvaluatePointer(E, PointerResult, Info))
201      return false;
202    return EvalPointerValueAsBool(PointerResult, Result);
203  } else if (E->getType()->isAnyComplexType()) {
204    ComplexValue ComplexResult;
205    if (!EvaluateComplex(E, ComplexResult, Info))
206      return false;
207    if (ComplexResult.isComplexFloat()) {
208      Result = !ComplexResult.getComplexFloatReal().isZero() ||
209               !ComplexResult.getComplexFloatImag().isZero();
210    } else {
211      Result = ComplexResult.getComplexIntReal().getBoolValue() ||
212               ComplexResult.getComplexIntImag().getBoolValue();
213    }
214    return true;
215  }
216
217  return false;
218}
219
220static APSInt HandleFloatToIntCast(QualType DestType, QualType SrcType,
221                                   APFloat &Value, const ASTContext &Ctx) {
222  unsigned DestWidth = Ctx.getIntWidth(DestType);
223  // Determine whether we are converting to unsigned or signed.
224  bool DestSigned = DestType->isSignedIntegerType();
225
226  // FIXME: Warning for overflow.
227  uint64_t Space[4];
228  bool ignored;
229  (void)Value.convertToInteger(Space, DestWidth, DestSigned,
230                               llvm::APFloat::rmTowardZero, &ignored);
231  return APSInt(llvm::APInt(DestWidth, 4, Space), !DestSigned);
232}
233
234static APFloat HandleFloatToFloatCast(QualType DestType, QualType SrcType,
235                                      APFloat &Value, const ASTContext &Ctx) {
236  bool ignored;
237  APFloat Result = Value;
238  Result.convert(Ctx.getFloatTypeSemantics(DestType),
239                 APFloat::rmNearestTiesToEven, &ignored);
240  return Result;
241}
242
243static APSInt HandleIntToIntCast(QualType DestType, QualType SrcType,
244                                 APSInt &Value, const ASTContext &Ctx) {
245  unsigned DestWidth = Ctx.getIntWidth(DestType);
246  APSInt Result = Value;
247  // Figure out if this is a truncate, extend or noop cast.
248  // If the input is signed, do a sign extend, noop, or truncate.
249  Result = Result.extOrTrunc(DestWidth);
250  Result.setIsUnsigned(DestType->isUnsignedIntegerType());
251  return Result;
252}
253
254static APFloat HandleIntToFloatCast(QualType DestType, QualType SrcType,
255                                    APSInt &Value, const ASTContext &Ctx) {
256
257  APFloat Result(Ctx.getFloatTypeSemantics(DestType), 1);
258  Result.convertFromAPInt(Value, Value.isSigned(),
259                          APFloat::rmNearestTiesToEven);
260  return Result;
261}
262
263namespace {
264class HasSideEffect
265  : public ConstStmtVisitor<HasSideEffect, bool> {
266  EvalInfo &Info;
267public:
268
269  HasSideEffect(EvalInfo &info) : Info(info) {}
270
271  // Unhandled nodes conservatively default to having side effects.
272  bool VisitStmt(const Stmt *S) {
273    return true;
274  }
275
276  bool VisitParenExpr(const ParenExpr *E) { return Visit(E->getSubExpr()); }
277  bool VisitGenericSelectionExpr(const GenericSelectionExpr *E) {
278    return Visit(E->getResultExpr());
279  }
280  bool VisitDeclRefExpr(const DeclRefExpr *E) {
281    if (Info.Ctx.getCanonicalType(E->getType()).isVolatileQualified())
282      return true;
283    return false;
284  }
285  // We don't want to evaluate BlockExprs multiple times, as they generate
286  // a ton of code.
287  bool VisitBlockExpr(const BlockExpr *E) { return true; }
288  bool VisitPredefinedExpr(const PredefinedExpr *E) { return false; }
289  bool VisitCompoundLiteralExpr(const CompoundLiteralExpr *E)
290    { return Visit(E->getInitializer()); }
291  bool VisitMemberExpr(const MemberExpr *E) { return Visit(E->getBase()); }
292  bool VisitIntegerLiteral(const IntegerLiteral *E) { return false; }
293  bool VisitFloatingLiteral(const FloatingLiteral *E) { return false; }
294  bool VisitStringLiteral(const StringLiteral *E) { return false; }
295  bool VisitCharacterLiteral(const CharacterLiteral *E) { return false; }
296  bool VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *E)
297    { return false; }
298  bool VisitArraySubscriptExpr(const ArraySubscriptExpr *E)
299    { return Visit(E->getLHS()) || Visit(E->getRHS()); }
300  bool VisitChooseExpr(const ChooseExpr *E)
301    { return Visit(E->getChosenSubExpr(Info.Ctx)); }
302  bool VisitCastExpr(const CastExpr *E) { return Visit(E->getSubExpr()); }
303  bool VisitBinAssign(const BinaryOperator *E) { return true; }
304  bool VisitCompoundAssignOperator(const BinaryOperator *E) { return true; }
305  bool VisitBinaryOperator(const BinaryOperator *E)
306  { return Visit(E->getLHS()) || Visit(E->getRHS()); }
307  bool VisitUnaryPreInc(const UnaryOperator *E) { return true; }
308  bool VisitUnaryPostInc(const UnaryOperator *E) { return true; }
309  bool VisitUnaryPreDec(const UnaryOperator *E) { return true; }
310  bool VisitUnaryPostDec(const UnaryOperator *E) { return true; }
311  bool VisitUnaryDeref(const UnaryOperator *E) {
312    if (Info.Ctx.getCanonicalType(E->getType()).isVolatileQualified())
313      return true;
314    return Visit(E->getSubExpr());
315  }
316  bool VisitUnaryOperator(const UnaryOperator *E) { return Visit(E->getSubExpr()); }
317
318  // Has side effects if any element does.
319  bool VisitInitListExpr(const InitListExpr *E) {
320    for (unsigned i = 0, e = E->getNumInits(); i != e; ++i)
321      if (Visit(E->getInit(i))) return true;
322    if (const Expr *filler = E->getArrayFiller())
323      return Visit(filler);
324    return false;
325  }
326
327  bool VisitSizeOfPackExpr(const SizeOfPackExpr *) { return false; }
328};
329
330class OpaqueValueEvaluation {
331  EvalInfo &info;
332  OpaqueValueExpr *opaqueValue;
333
334public:
335  OpaqueValueEvaluation(EvalInfo &info, OpaqueValueExpr *opaqueValue,
336                        Expr *value)
337    : info(info), opaqueValue(opaqueValue) {
338
339    // If evaluation fails, fail immediately.
340    if (!Evaluate(info, value)) {
341      this->opaqueValue = 0;
342      return;
343    }
344    info.OpaqueValues[opaqueValue] = info.EvalResult.Val;
345  }
346
347  bool hasError() const { return opaqueValue == 0; }
348
349  ~OpaqueValueEvaluation() {
350    if (opaqueValue) info.OpaqueValues.erase(opaqueValue);
351  }
352};
353
354} // end anonymous namespace
355
356//===----------------------------------------------------------------------===//
357// Generic Evaluation
358//===----------------------------------------------------------------------===//
359namespace {
360
361template <class Derived, typename RetTy=void>
362class ExprEvaluatorBase
363  : public ConstStmtVisitor<Derived, RetTy> {
364private:
365  RetTy DerivedSuccess(const APValue &V, const Expr *E) {
366    return static_cast<Derived*>(this)->Success(V, E);
367  }
368  RetTy DerivedError(const Expr *E) {
369    return static_cast<Derived*>(this)->Error(E);
370  }
371
372protected:
373  EvalInfo &Info;
374  typedef ConstStmtVisitor<Derived, RetTy> StmtVisitorTy;
375  typedef ExprEvaluatorBase ExprEvaluatorBaseTy;
376
377public:
378  ExprEvaluatorBase(EvalInfo &Info) : Info(Info) {}
379
380  RetTy VisitStmt(const Stmt *) {
381    assert(0 && "Expression evaluator should not be called on stmts");
382    return DerivedError(0);
383  }
384  RetTy VisitExpr(const Expr *E) {
385    return DerivedError(E);
386  }
387
388  RetTy VisitParenExpr(const ParenExpr *E)
389    { return StmtVisitorTy::Visit(E->getSubExpr()); }
390  RetTy VisitUnaryExtension(const UnaryOperator *E)
391    { return StmtVisitorTy::Visit(E->getSubExpr()); }
392  RetTy VisitUnaryPlus(const UnaryOperator *E)
393    { return StmtVisitorTy::Visit(E->getSubExpr()); }
394  RetTy VisitChooseExpr(const ChooseExpr *E)
395    { return StmtVisitorTy::Visit(E->getChosenSubExpr(Info.Ctx)); }
396  RetTy VisitGenericSelectionExpr(const GenericSelectionExpr *E)
397    { return StmtVisitorTy::Visit(E->getResultExpr()); }
398
399  RetTy VisitBinaryConditionalOperator(const BinaryConditionalOperator *E) {
400    OpaqueValueEvaluation opaque(Info, E->getOpaqueValue(), E->getCommon());
401    if (opaque.hasError())
402      return DerivedError(E);
403
404    bool cond;
405    if (!HandleConversionToBool(E->getCond(), cond, Info))
406      return DerivedError(E);
407
408    return StmtVisitorTy::Visit(cond ? E->getTrueExpr() : E->getFalseExpr());
409  }
410
411  RetTy VisitConditionalOperator(const ConditionalOperator *E) {
412    bool BoolResult;
413    if (!HandleConversionToBool(E->getCond(), BoolResult, Info))
414      return DerivedError(E);
415
416    Expr* EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr();
417    return StmtVisitorTy::Visit(EvalExpr);
418  }
419
420  RetTy VisitOpaqueValueExpr(const OpaqueValueExpr *E) {
421    const APValue *value = Info.getOpaqueValue(E);
422    if (!value)
423      return (E->getSourceExpr() ? StmtVisitorTy::Visit(E->getSourceExpr())
424                                 : DerivedError(E));
425    return DerivedSuccess(*value, E);
426  }
427};
428
429}
430
431//===----------------------------------------------------------------------===//
432// LValue Evaluation
433//===----------------------------------------------------------------------===//
434namespace {
435class LValueExprEvaluator
436  : public ExprEvaluatorBase<LValueExprEvaluator, bool> {
437  LValue &Result;
438
439  bool Success(const Expr *E) {
440    Result.Base = E;
441    Result.Offset = CharUnits::Zero();
442    return true;
443  }
444public:
445
446  LValueExprEvaluator(EvalInfo &info, LValue &Result) :
447    ExprEvaluatorBaseTy(info), Result(Result) {}
448
449  bool Success(const APValue &V, const Expr *E) {
450    Result.setFrom(V);
451    return true;
452  }
453  bool Error(const Expr *E) {
454    return false;
455  }
456
457  bool VisitDeclRefExpr(const DeclRefExpr *E);
458  bool VisitPredefinedExpr(const PredefinedExpr *E) { return Success(E); }
459  bool VisitCompoundLiteralExpr(const CompoundLiteralExpr *E);
460  bool VisitMemberExpr(const MemberExpr *E);
461  bool VisitStringLiteral(const StringLiteral *E) { return Success(E); }
462  bool VisitObjCEncodeExpr(const ObjCEncodeExpr *E) { return Success(E); }
463  bool VisitArraySubscriptExpr(const ArraySubscriptExpr *E);
464  bool VisitUnaryDeref(const UnaryOperator *E);
465
466  bool VisitCastExpr(const CastExpr *E) {
467    switch (E->getCastKind()) {
468    default:
469      return false;
470
471    case CK_NoOp:
472      return Visit(E->getSubExpr());
473    }
474  }
475  // FIXME: Missing: __real__, __imag__
476
477};
478} // end anonymous namespace
479
480static bool EvaluateLValue(const Expr* E, LValue& Result, EvalInfo &Info) {
481  return LValueExprEvaluator(Info, Result).Visit(E);
482}
483
484bool LValueExprEvaluator::VisitDeclRefExpr(const DeclRefExpr *E) {
485  if (isa<FunctionDecl>(E->getDecl())) {
486    return Success(E);
487  } else if (const VarDecl* VD = dyn_cast<VarDecl>(E->getDecl())) {
488    if (!VD->getType()->isReferenceType())
489      return Success(E);
490    // Reference parameters can refer to anything even if they have an
491    // "initializer" in the form of a default argument.
492    if (!isa<ParmVarDecl>(VD))
493      // FIXME: Check whether VD might be overridden!
494      if (const Expr *Init = VD->getAnyInitializer())
495        return Visit(Init);
496  }
497
498  return ExprEvaluatorBaseTy::VisitDeclRefExpr(E);
499}
500
501bool
502LValueExprEvaluator::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) {
503  return Success(E);
504}
505
506bool LValueExprEvaluator::VisitMemberExpr(const MemberExpr *E) {
507  QualType Ty;
508  if (E->isArrow()) {
509    if (!EvaluatePointer(E->getBase(), Result, Info))
510      return false;
511    Ty = E->getBase()->getType()->getAs<PointerType>()->getPointeeType();
512  } else {
513    if (!Visit(E->getBase()))
514      return false;
515    Ty = E->getBase()->getType();
516  }
517
518  const RecordDecl *RD = Ty->getAs<RecordType>()->getDecl();
519  const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD);
520
521  const FieldDecl *FD = dyn_cast<FieldDecl>(E->getMemberDecl());
522  if (!FD) // FIXME: deal with other kinds of member expressions
523    return false;
524
525  if (FD->getType()->isReferenceType())
526    return false;
527
528  // FIXME: This is linear time.
529  unsigned i = 0;
530  for (RecordDecl::field_iterator Field = RD->field_begin(),
531                               FieldEnd = RD->field_end();
532       Field != FieldEnd; (void)++Field, ++i) {
533    if (*Field == FD)
534      break;
535  }
536
537  Result.Offset += Info.Ctx.toCharUnitsFromBits(RL.getFieldOffset(i));
538  return true;
539}
540
541bool LValueExprEvaluator::VisitArraySubscriptExpr(const ArraySubscriptExpr *E) {
542  if (!EvaluatePointer(E->getBase(), Result, Info))
543    return false;
544
545  APSInt Index;
546  if (!EvaluateInteger(E->getIdx(), Index, Info))
547    return false;
548
549  CharUnits ElementSize = Info.Ctx.getTypeSizeInChars(E->getType());
550  Result.Offset += Index.getSExtValue() * ElementSize;
551  return true;
552}
553
554bool LValueExprEvaluator::VisitUnaryDeref(const UnaryOperator *E) {
555  return EvaluatePointer(E->getSubExpr(), Result, Info);
556}
557
558//===----------------------------------------------------------------------===//
559// Pointer Evaluation
560//===----------------------------------------------------------------------===//
561
562namespace {
563class PointerExprEvaluator
564  : public ExprEvaluatorBase<PointerExprEvaluator, bool> {
565  LValue &Result;
566
567  bool Success(const Expr *E) {
568    Result.Base = E;
569    Result.Offset = CharUnits::Zero();
570    return true;
571  }
572public:
573
574  PointerExprEvaluator(EvalInfo &info, LValue &Result)
575    : ExprEvaluatorBaseTy(info), Result(Result) {}
576
577  bool Success(const APValue &V, const Expr *E) {
578    Result.setFrom(V);
579    return true;
580  }
581  bool Error(const Stmt *S) {
582    return false;
583  }
584
585  bool VisitBinaryOperator(const BinaryOperator *E);
586  bool VisitCastExpr(const CastExpr* E);
587  bool VisitUnaryAddrOf(const UnaryOperator *E);
588  bool VisitObjCStringLiteral(const ObjCStringLiteral *E)
589      { return Success(E); }
590  bool VisitAddrLabelExpr(const AddrLabelExpr *E)
591      { return Success(E); }
592  bool VisitCallExpr(const CallExpr *E);
593  bool VisitBlockExpr(const BlockExpr *E) {
594    if (!E->getBlockDecl()->hasCaptures())
595      return Success(E);
596    return false;
597  }
598  bool VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E)
599      { return Success((Expr*)0); }
600  bool VisitCXXNullPtrLiteralExpr(const CXXNullPtrLiteralExpr *E)
601      { return Success((Expr*)0); }
602
603  // FIXME: Missing: @protocol, @selector
604};
605} // end anonymous namespace
606
607static bool EvaluatePointer(const Expr* E, LValue& Result, EvalInfo &Info) {
608  assert(E->getType()->hasPointerRepresentation());
609  return PointerExprEvaluator(Info, Result).Visit(E);
610}
611
612bool PointerExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
613  if (E->getOpcode() != BO_Add &&
614      E->getOpcode() != BO_Sub)
615    return false;
616
617  const Expr *PExp = E->getLHS();
618  const Expr *IExp = E->getRHS();
619  if (IExp->getType()->isPointerType())
620    std::swap(PExp, IExp);
621
622  if (!EvaluatePointer(PExp, Result, Info))
623    return false;
624
625  llvm::APSInt Offset;
626  if (!EvaluateInteger(IExp, Offset, Info))
627    return false;
628  int64_t AdditionalOffset
629    = Offset.isSigned() ? Offset.getSExtValue()
630                        : static_cast<int64_t>(Offset.getZExtValue());
631
632  // Compute the new offset in the appropriate width.
633
634  QualType PointeeType =
635    PExp->getType()->getAs<PointerType>()->getPointeeType();
636  CharUnits SizeOfPointee;
637
638  // Explicitly handle GNU void* and function pointer arithmetic extensions.
639  if (PointeeType->isVoidType() || PointeeType->isFunctionType())
640    SizeOfPointee = CharUnits::One();
641  else
642    SizeOfPointee = Info.Ctx.getTypeSizeInChars(PointeeType);
643
644  if (E->getOpcode() == BO_Add)
645    Result.Offset += AdditionalOffset * SizeOfPointee;
646  else
647    Result.Offset -= AdditionalOffset * SizeOfPointee;
648
649  return true;
650}
651
652bool PointerExprEvaluator::VisitUnaryAddrOf(const UnaryOperator *E) {
653  return EvaluateLValue(E->getSubExpr(), Result, Info);
654}
655
656
657bool PointerExprEvaluator::VisitCastExpr(const CastExpr* E) {
658  const Expr* SubExpr = E->getSubExpr();
659
660  switch (E->getCastKind()) {
661  default:
662    break;
663
664  case CK_NoOp:
665  case CK_BitCast:
666  case CK_AnyPointerToObjCPointerCast:
667  case CK_AnyPointerToBlockPointerCast:
668    return Visit(SubExpr);
669
670  case CK_DerivedToBase:
671  case CK_UncheckedDerivedToBase: {
672    LValue BaseLV;
673    if (!EvaluatePointer(E->getSubExpr(), BaseLV, Info))
674      return false;
675
676    // Now figure out the necessary offset to add to the baseLV to get from
677    // the derived class to the base class.
678    CharUnits Offset = CharUnits::Zero();
679
680    QualType Ty = E->getSubExpr()->getType();
681    const CXXRecordDecl *DerivedDecl =
682      Ty->getAs<PointerType>()->getPointeeType()->getAsCXXRecordDecl();
683
684    for (CastExpr::path_const_iterator PathI = E->path_begin(),
685         PathE = E->path_end(); PathI != PathE; ++PathI) {
686      const CXXBaseSpecifier *Base = *PathI;
687
688      // FIXME: If the base is virtual, we'd need to determine the type of the
689      // most derived class and we don't support that right now.
690      if (Base->isVirtual())
691        return false;
692
693      const CXXRecordDecl *BaseDecl = Base->getType()->getAsCXXRecordDecl();
694      const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(DerivedDecl);
695
696      Offset += Layout.getBaseClassOffset(BaseDecl);
697      DerivedDecl = BaseDecl;
698    }
699
700    Result.Base = BaseLV.getLValueBase();
701    Result.Offset = BaseLV.getLValueOffset() + Offset;
702    return true;
703  }
704
705  case CK_NullToPointer: {
706    Result.Base = 0;
707    Result.Offset = CharUnits::Zero();
708    return true;
709  }
710
711  case CK_IntegralToPointer: {
712    APValue Value;
713    if (!EvaluateIntegerOrLValue(SubExpr, Value, Info))
714      break;
715
716    if (Value.isInt()) {
717      Value.getInt() = Value.getInt().extOrTrunc((unsigned)Info.Ctx.getTypeSize(E->getType()));
718      Result.Base = 0;
719      Result.Offset = CharUnits::fromQuantity(Value.getInt().getZExtValue());
720      return true;
721    } else {
722      // Cast is of an lvalue, no need to change value.
723      Result.Base = Value.getLValueBase();
724      Result.Offset = Value.getLValueOffset();
725      return true;
726    }
727  }
728  case CK_ArrayToPointerDecay:
729  case CK_FunctionToPointerDecay:
730    return EvaluateLValue(SubExpr, Result, Info);
731  }
732
733  return false;
734}
735
736bool PointerExprEvaluator::VisitCallExpr(const CallExpr *E) {
737  if (E->isBuiltinCall(Info.Ctx) ==
738        Builtin::BI__builtin___CFStringMakeConstantString ||
739      E->isBuiltinCall(Info.Ctx) ==
740        Builtin::BI__builtin___NSStringMakeConstantString)
741    return Success(E);
742
743  return ExprEvaluatorBaseTy::VisitCallExpr(E);
744}
745
746//===----------------------------------------------------------------------===//
747// Vector Evaluation
748//===----------------------------------------------------------------------===//
749
750namespace {
751  class VectorExprEvaluator
752  : public ExprEvaluatorBase<VectorExprEvaluator, APValue> {
753    APValue GetZeroVector(QualType VecType);
754  public:
755
756    VectorExprEvaluator(EvalInfo &info) : ExprEvaluatorBaseTy(info) {}
757
758    APValue Success(const APValue &V, const Expr *E) { return V; }
759    APValue Error(const Expr *E) { return APValue(); }
760
761    APValue VisitUnaryReal(const UnaryOperator *E)
762      { return Visit(E->getSubExpr()); }
763    APValue VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E)
764      { return GetZeroVector(E->getType()); }
765    APValue VisitCastExpr(const CastExpr* E);
766    APValue VisitCompoundLiteralExpr(const CompoundLiteralExpr *E);
767    APValue VisitInitListExpr(const InitListExpr *E);
768    APValue VisitUnaryImag(const UnaryOperator *E);
769    // FIXME: Missing: unary -, unary ~, binary add/sub/mul/div,
770    //                 binary comparisons, binary and/or/xor,
771    //                 shufflevector, ExtVectorElementExpr
772    //        (Note that these require implementing conversions
773    //         between vector types.)
774  };
775} // end anonymous namespace
776
777static bool EvaluateVector(const Expr* E, APValue& Result, EvalInfo &Info) {
778  if (!E->getType()->isVectorType())
779    return false;
780  Result = VectorExprEvaluator(Info).Visit(E);
781  return !Result.isUninit();
782}
783
784APValue VectorExprEvaluator::VisitCastExpr(const CastExpr* E) {
785  const VectorType *VTy = E->getType()->getAs<VectorType>();
786  QualType EltTy = VTy->getElementType();
787  unsigned NElts = VTy->getNumElements();
788  unsigned EltWidth = Info.Ctx.getTypeSize(EltTy);
789
790  const Expr* SE = E->getSubExpr();
791  QualType SETy = SE->getType();
792
793  switch (E->getCastKind()) {
794  case CK_VectorSplat: {
795    APValue Result = APValue();
796    if (SETy->isIntegerType()) {
797      APSInt IntResult;
798      if (!EvaluateInteger(SE, IntResult, Info))
799         return APValue();
800      Result = APValue(IntResult);
801    } else if (SETy->isRealFloatingType()) {
802       APFloat F(0.0);
803       if (!EvaluateFloat(SE, F, Info))
804         return APValue();
805       Result = APValue(F);
806    } else {
807      return APValue();
808    }
809
810    // Splat and create vector APValue.
811    llvm::SmallVector<APValue, 4> Elts(NElts, Result);
812    return APValue(&Elts[0], Elts.size());
813  }
814  case CK_BitCast: {
815    if (SETy->isVectorType())
816      return Visit(SE);
817
818    if (!SETy->isIntegerType())
819      return APValue();
820
821    APSInt Init;
822    if (!EvaluateInteger(SE, Init, Info))
823      return APValue();
824
825    assert((EltTy->isIntegerType() || EltTy->isRealFloatingType()) &&
826           "Vectors must be composed of ints or floats");
827
828    llvm::SmallVector<APValue, 4> Elts;
829    for (unsigned i = 0; i != NElts; ++i) {
830      APSInt Tmp = Init.extOrTrunc(EltWidth);
831
832      if (EltTy->isIntegerType())
833        Elts.push_back(APValue(Tmp));
834      else
835        Elts.push_back(APValue(APFloat(Tmp)));
836
837      Init >>= EltWidth;
838    }
839    return APValue(&Elts[0], Elts.size());
840  }
841  case CK_LValueToRValue:
842  case CK_NoOp:
843    return Visit(SE);
844  default:
845    return APValue();
846  }
847}
848
849APValue
850VectorExprEvaluator::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) {
851  return this->Visit(E->getInitializer());
852}
853
854APValue
855VectorExprEvaluator::VisitInitListExpr(const InitListExpr *E) {
856  const VectorType *VT = E->getType()->getAs<VectorType>();
857  unsigned NumInits = E->getNumInits();
858  unsigned NumElements = VT->getNumElements();
859
860  QualType EltTy = VT->getElementType();
861  llvm::SmallVector<APValue, 4> Elements;
862
863  // If a vector is initialized with a single element, that value
864  // becomes every element of the vector, not just the first.
865  // This is the behavior described in the IBM AltiVec documentation.
866  if (NumInits == 1) {
867
868    // Handle the case where the vector is initialized by a another
869    // vector (OpenCL 6.1.6).
870    if (E->getInit(0)->getType()->isVectorType())
871      return this->Visit(const_cast<Expr*>(E->getInit(0)));
872
873    APValue InitValue;
874    if (EltTy->isIntegerType()) {
875      llvm::APSInt sInt(32);
876      if (!EvaluateInteger(E->getInit(0), sInt, Info))
877        return APValue();
878      InitValue = APValue(sInt);
879    } else {
880      llvm::APFloat f(0.0);
881      if (!EvaluateFloat(E->getInit(0), f, Info))
882        return APValue();
883      InitValue = APValue(f);
884    }
885    for (unsigned i = 0; i < NumElements; i++) {
886      Elements.push_back(InitValue);
887    }
888  } else {
889    for (unsigned i = 0; i < NumElements; i++) {
890      if (EltTy->isIntegerType()) {
891        llvm::APSInt sInt(32);
892        if (i < NumInits) {
893          if (!EvaluateInteger(E->getInit(i), sInt, Info))
894            return APValue();
895        } else {
896          sInt = Info.Ctx.MakeIntValue(0, EltTy);
897        }
898        Elements.push_back(APValue(sInt));
899      } else {
900        llvm::APFloat f(0.0);
901        if (i < NumInits) {
902          if (!EvaluateFloat(E->getInit(i), f, Info))
903            return APValue();
904        } else {
905          f = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy));
906        }
907        Elements.push_back(APValue(f));
908      }
909    }
910  }
911  return APValue(&Elements[0], Elements.size());
912}
913
914APValue
915VectorExprEvaluator::GetZeroVector(QualType T) {
916  const VectorType *VT = T->getAs<VectorType>();
917  QualType EltTy = VT->getElementType();
918  APValue ZeroElement;
919  if (EltTy->isIntegerType())
920    ZeroElement = APValue(Info.Ctx.MakeIntValue(0, EltTy));
921  else
922    ZeroElement =
923        APValue(APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy)));
924
925  llvm::SmallVector<APValue, 4> Elements(VT->getNumElements(), ZeroElement);
926  return APValue(&Elements[0], Elements.size());
927}
928
929APValue VectorExprEvaluator::VisitUnaryImag(const UnaryOperator *E) {
930  if (!E->getSubExpr()->isEvaluatable(Info.Ctx))
931    Info.EvalResult.HasSideEffects = true;
932  return GetZeroVector(E->getType());
933}
934
935//===----------------------------------------------------------------------===//
936// Integer Evaluation
937//===----------------------------------------------------------------------===//
938
939namespace {
940class IntExprEvaluator
941  : public ExprEvaluatorBase<IntExprEvaluator, bool> {
942  APValue &Result;
943public:
944  IntExprEvaluator(EvalInfo &info, APValue &result)
945    : ExprEvaluatorBaseTy(info), Result(result) {}
946
947  bool Success(const llvm::APSInt &SI, const Expr *E) {
948    assert(E->getType()->isIntegralOrEnumerationType() &&
949           "Invalid evaluation result.");
950    assert(SI.isSigned() == E->getType()->isSignedIntegerType() &&
951           "Invalid evaluation result.");
952    assert(SI.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) &&
953           "Invalid evaluation result.");
954    Result = APValue(SI);
955    return true;
956  }
957
958  bool Success(const llvm::APInt &I, const Expr *E) {
959    assert(E->getType()->isIntegralOrEnumerationType() &&
960           "Invalid evaluation result.");
961    assert(I.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) &&
962           "Invalid evaluation result.");
963    Result = APValue(APSInt(I));
964    Result.getInt().setIsUnsigned(E->getType()->isUnsignedIntegerType());
965    return true;
966  }
967
968  bool Success(uint64_t Value, const Expr *E) {
969    assert(E->getType()->isIntegralOrEnumerationType() &&
970           "Invalid evaluation result.");
971    Result = APValue(Info.Ctx.MakeIntValue(Value, E->getType()));
972    return true;
973  }
974
975  bool Success(CharUnits Size, const Expr *E) {
976    return Success(Size.getQuantity(), E);
977  }
978
979
980  bool Error(SourceLocation L, diag::kind D, const Expr *E) {
981    // Take the first error.
982    if (Info.EvalResult.Diag == 0) {
983      Info.EvalResult.DiagLoc = L;
984      Info.EvalResult.Diag = D;
985      Info.EvalResult.DiagExpr = E;
986    }
987    return false;
988  }
989
990  bool Success(const APValue &V, const Expr *E) {
991    return Success(V.getInt(), E);
992  }
993  bool Error(const Expr *E) {
994    return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
995  }
996
997  //===--------------------------------------------------------------------===//
998  //                            Visitor Methods
999  //===--------------------------------------------------------------------===//
1000
1001  bool VisitIntegerLiteral(const IntegerLiteral *E) {
1002    return Success(E->getValue(), E);
1003  }
1004  bool VisitCharacterLiteral(const CharacterLiteral *E) {
1005    return Success(E->getValue(), E);
1006  }
1007
1008  bool CheckReferencedDecl(const Expr *E, const Decl *D);
1009  bool VisitDeclRefExpr(const DeclRefExpr *E) {
1010    if (CheckReferencedDecl(E, E->getDecl()))
1011      return true;
1012
1013    return ExprEvaluatorBaseTy::VisitDeclRefExpr(E);
1014  }
1015  bool VisitMemberExpr(const MemberExpr *E) {
1016    if (CheckReferencedDecl(E, E->getMemberDecl())) {
1017      // Conservatively assume a MemberExpr will have side-effects
1018      Info.EvalResult.HasSideEffects = true;
1019      return true;
1020    }
1021
1022    return ExprEvaluatorBaseTy::VisitMemberExpr(E);
1023  }
1024
1025  bool VisitCallExpr(const CallExpr *E);
1026  bool VisitBinaryOperator(const BinaryOperator *E);
1027  bool VisitOffsetOfExpr(const OffsetOfExpr *E);
1028  bool VisitUnaryOperator(const UnaryOperator *E);
1029
1030  bool VisitCastExpr(const CastExpr* E);
1031  bool VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *E);
1032
1033  bool VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) {
1034    return Success(E->getValue(), E);
1035  }
1036
1037  bool VisitGNUNullExpr(const GNUNullExpr *E) {
1038    return Success(0, E);
1039  }
1040
1041  bool VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr *E) {
1042    return Success(0, E);
1043  }
1044
1045  bool VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) {
1046    return Success(0, E);
1047  }
1048
1049  bool VisitUnaryTypeTraitExpr(const UnaryTypeTraitExpr *E) {
1050    return Success(E->getValue(), E);
1051  }
1052
1053  bool VisitBinaryTypeTraitExpr(const BinaryTypeTraitExpr *E) {
1054    return Success(E->getValue(), E);
1055  }
1056
1057  bool VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *E) {
1058    return Success(E->getValue(), E);
1059  }
1060
1061  bool VisitExpressionTraitExpr(const ExpressionTraitExpr *E) {
1062    return Success(E->getValue(), E);
1063  }
1064
1065  bool VisitUnaryReal(const UnaryOperator *E);
1066  bool VisitUnaryImag(const UnaryOperator *E);
1067
1068  bool VisitCXXNoexceptExpr(const CXXNoexceptExpr *E);
1069  bool VisitSizeOfPackExpr(const SizeOfPackExpr *E);
1070
1071private:
1072  CharUnits GetAlignOfExpr(const Expr *E);
1073  CharUnits GetAlignOfType(QualType T);
1074  static QualType GetObjectType(const Expr *E);
1075  bool TryEvaluateBuiltinObjectSize(const CallExpr *E);
1076  // FIXME: Missing: array subscript of vector, member of vector
1077};
1078} // end anonymous namespace
1079
1080static bool EvaluateIntegerOrLValue(const Expr* E, APValue &Result, EvalInfo &Info) {
1081  assert(E->getType()->isIntegralOrEnumerationType());
1082  return IntExprEvaluator(Info, Result).Visit(E);
1083}
1084
1085static bool EvaluateInteger(const Expr* E, APSInt &Result, EvalInfo &Info) {
1086  assert(E->getType()->isIntegralOrEnumerationType());
1087
1088  APValue Val;
1089  if (!EvaluateIntegerOrLValue(E, Val, Info) || !Val.isInt())
1090    return false;
1091  Result = Val.getInt();
1092  return true;
1093}
1094
1095bool IntExprEvaluator::CheckReferencedDecl(const Expr* E, const Decl* D) {
1096  // Enums are integer constant exprs.
1097  if (const EnumConstantDecl *ECD = dyn_cast<EnumConstantDecl>(D))
1098    return Success(ECD->getInitVal(), E);
1099
1100  // In C++, const, non-volatile integers initialized with ICEs are ICEs.
1101  // In C, they can also be folded, although they are not ICEs.
1102  if (Info.Ctx.getCanonicalType(E->getType()).getCVRQualifiers()
1103                                                        == Qualifiers::Const) {
1104
1105    if (isa<ParmVarDecl>(D))
1106      return false;
1107
1108    if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
1109      if (const Expr *Init = VD->getAnyInitializer()) {
1110        if (APValue *V = VD->getEvaluatedValue()) {
1111          if (V->isInt())
1112            return Success(V->getInt(), E);
1113          return false;
1114        }
1115
1116        if (VD->isEvaluatingValue())
1117          return false;
1118
1119        VD->setEvaluatingValue();
1120
1121        Expr::EvalResult EResult;
1122        if (Init->Evaluate(EResult, Info.Ctx) && !EResult.HasSideEffects &&
1123            EResult.Val.isInt()) {
1124          // Cache the evaluated value in the variable declaration.
1125          Result = EResult.Val;
1126          VD->setEvaluatedValue(Result);
1127          return true;
1128        }
1129
1130        VD->setEvaluatedValue(APValue());
1131      }
1132    }
1133  }
1134
1135  // Otherwise, random variable references are not constants.
1136  return false;
1137}
1138
1139/// EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way
1140/// as GCC.
1141static int EvaluateBuiltinClassifyType(const CallExpr *E) {
1142  // The following enum mimics the values returned by GCC.
1143  // FIXME: Does GCC differ between lvalue and rvalue references here?
1144  enum gcc_type_class {
1145    no_type_class = -1,
1146    void_type_class, integer_type_class, char_type_class,
1147    enumeral_type_class, boolean_type_class,
1148    pointer_type_class, reference_type_class, offset_type_class,
1149    real_type_class, complex_type_class,
1150    function_type_class, method_type_class,
1151    record_type_class, union_type_class,
1152    array_type_class, string_type_class,
1153    lang_type_class
1154  };
1155
1156  // If no argument was supplied, default to "no_type_class". This isn't
1157  // ideal, however it is what gcc does.
1158  if (E->getNumArgs() == 0)
1159    return no_type_class;
1160
1161  QualType ArgTy = E->getArg(0)->getType();
1162  if (ArgTy->isVoidType())
1163    return void_type_class;
1164  else if (ArgTy->isEnumeralType())
1165    return enumeral_type_class;
1166  else if (ArgTy->isBooleanType())
1167    return boolean_type_class;
1168  else if (ArgTy->isCharType())
1169    return string_type_class; // gcc doesn't appear to use char_type_class
1170  else if (ArgTy->isIntegerType())
1171    return integer_type_class;
1172  else if (ArgTy->isPointerType())
1173    return pointer_type_class;
1174  else if (ArgTy->isReferenceType())
1175    return reference_type_class;
1176  else if (ArgTy->isRealType())
1177    return real_type_class;
1178  else if (ArgTy->isComplexType())
1179    return complex_type_class;
1180  else if (ArgTy->isFunctionType())
1181    return function_type_class;
1182  else if (ArgTy->isStructureOrClassType())
1183    return record_type_class;
1184  else if (ArgTy->isUnionType())
1185    return union_type_class;
1186  else if (ArgTy->isArrayType())
1187    return array_type_class;
1188  else if (ArgTy->isUnionType())
1189    return union_type_class;
1190  else  // FIXME: offset_type_class, method_type_class, & lang_type_class?
1191    assert(0 && "CallExpr::isBuiltinClassifyType(): unimplemented type");
1192  return -1;
1193}
1194
1195/// Retrieves the "underlying object type" of the given expression,
1196/// as used by __builtin_object_size.
1197QualType IntExprEvaluator::GetObjectType(const Expr *E) {
1198  if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
1199    if (const VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl()))
1200      return VD->getType();
1201  } else if (isa<CompoundLiteralExpr>(E)) {
1202    return E->getType();
1203  }
1204
1205  return QualType();
1206}
1207
1208bool IntExprEvaluator::TryEvaluateBuiltinObjectSize(const CallExpr *E) {
1209  // TODO: Perhaps we should let LLVM lower this?
1210  LValue Base;
1211  if (!EvaluatePointer(E->getArg(0), Base, Info))
1212    return false;
1213
1214  // If we can prove the base is null, lower to zero now.
1215  const Expr *LVBase = Base.getLValueBase();
1216  if (!LVBase) return Success(0, E);
1217
1218  QualType T = GetObjectType(LVBase);
1219  if (T.isNull() ||
1220      T->isIncompleteType() ||
1221      T->isFunctionType() ||
1222      T->isVariablyModifiedType() ||
1223      T->isDependentType())
1224    return false;
1225
1226  CharUnits Size = Info.Ctx.getTypeSizeInChars(T);
1227  CharUnits Offset = Base.getLValueOffset();
1228
1229  if (!Offset.isNegative() && Offset <= Size)
1230    Size -= Offset;
1231  else
1232    Size = CharUnits::Zero();
1233  return Success(Size, E);
1234}
1235
1236bool IntExprEvaluator::VisitCallExpr(const CallExpr *E) {
1237  switch (E->isBuiltinCall(Info.Ctx)) {
1238  default:
1239    return ExprEvaluatorBaseTy::VisitCallExpr(E);
1240
1241  case Builtin::BI__builtin_object_size: {
1242    if (TryEvaluateBuiltinObjectSize(E))
1243      return true;
1244
1245    // If evaluating the argument has side-effects we can't determine
1246    // the size of the object and lower it to unknown now.
1247    if (E->getArg(0)->HasSideEffects(Info.Ctx)) {
1248      if (E->getArg(1)->EvaluateAsInt(Info.Ctx).getZExtValue() <= 1)
1249        return Success(-1ULL, E);
1250      return Success(0, E);
1251    }
1252
1253    return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
1254  }
1255
1256  case Builtin::BI__builtin_classify_type:
1257    return Success(EvaluateBuiltinClassifyType(E), E);
1258
1259  case Builtin::BI__builtin_constant_p:
1260    // __builtin_constant_p always has one operand: it returns true if that
1261    // operand can be folded, false otherwise.
1262    return Success(E->getArg(0)->isEvaluatable(Info.Ctx), E);
1263
1264  case Builtin::BI__builtin_eh_return_data_regno: {
1265    int Operand = E->getArg(0)->EvaluateAsInt(Info.Ctx).getZExtValue();
1266    Operand = Info.Ctx.Target.getEHDataRegisterNumber(Operand);
1267    return Success(Operand, E);
1268  }
1269
1270  case Builtin::BI__builtin_expect:
1271    return Visit(E->getArg(0));
1272
1273  case Builtin::BIstrlen:
1274  case Builtin::BI__builtin_strlen:
1275    // As an extension, we support strlen() and __builtin_strlen() as constant
1276    // expressions when the argument is a string literal.
1277    if (const StringLiteral *S
1278               = dyn_cast<StringLiteral>(E->getArg(0)->IgnoreParenImpCasts())) {
1279      // The string literal may have embedded null characters. Find the first
1280      // one and truncate there.
1281      llvm::StringRef Str = S->getString();
1282      llvm::StringRef::size_type Pos = Str.find(0);
1283      if (Pos != llvm::StringRef::npos)
1284        Str = Str.substr(0, Pos);
1285
1286      return Success(Str.size(), E);
1287    }
1288
1289    return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
1290  }
1291}
1292
1293bool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
1294  if (E->getOpcode() == BO_Comma) {
1295    if (!Visit(E->getRHS()))
1296      return false;
1297
1298    // If we can't evaluate the LHS, it might have side effects;
1299    // conservatively mark it.
1300    if (!E->getLHS()->isEvaluatable(Info.Ctx))
1301      Info.EvalResult.HasSideEffects = true;
1302
1303    return true;
1304  }
1305
1306  if (E->isLogicalOp()) {
1307    // These need to be handled specially because the operands aren't
1308    // necessarily integral
1309    bool lhsResult, rhsResult;
1310
1311    if (HandleConversionToBool(E->getLHS(), lhsResult, Info)) {
1312      // We were able to evaluate the LHS, see if we can get away with not
1313      // evaluating the RHS: 0 && X -> 0, 1 || X -> 1
1314      if (lhsResult == (E->getOpcode() == BO_LOr))
1315        return Success(lhsResult, E);
1316
1317      if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) {
1318        if (E->getOpcode() == BO_LOr)
1319          return Success(lhsResult || rhsResult, E);
1320        else
1321          return Success(lhsResult && rhsResult, E);
1322      }
1323    } else {
1324      if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) {
1325        // We can't evaluate the LHS; however, sometimes the result
1326        // is determined by the RHS: X && 0 -> 0, X || 1 -> 1.
1327        if (rhsResult == (E->getOpcode() == BO_LOr) ||
1328            !rhsResult == (E->getOpcode() == BO_LAnd)) {
1329          // Since we weren't able to evaluate the left hand side, it
1330          // must have had side effects.
1331          Info.EvalResult.HasSideEffects = true;
1332
1333          return Success(rhsResult, E);
1334        }
1335      }
1336    }
1337
1338    return false;
1339  }
1340
1341  QualType LHSTy = E->getLHS()->getType();
1342  QualType RHSTy = E->getRHS()->getType();
1343
1344  if (LHSTy->isAnyComplexType()) {
1345    assert(RHSTy->isAnyComplexType() && "Invalid comparison");
1346    ComplexValue LHS, RHS;
1347
1348    if (!EvaluateComplex(E->getLHS(), LHS, Info))
1349      return false;
1350
1351    if (!EvaluateComplex(E->getRHS(), RHS, Info))
1352      return false;
1353
1354    if (LHS.isComplexFloat()) {
1355      APFloat::cmpResult CR_r =
1356        LHS.getComplexFloatReal().compare(RHS.getComplexFloatReal());
1357      APFloat::cmpResult CR_i =
1358        LHS.getComplexFloatImag().compare(RHS.getComplexFloatImag());
1359
1360      if (E->getOpcode() == BO_EQ)
1361        return Success((CR_r == APFloat::cmpEqual &&
1362                        CR_i == APFloat::cmpEqual), E);
1363      else {
1364        assert(E->getOpcode() == BO_NE &&
1365               "Invalid complex comparison.");
1366        return Success(((CR_r == APFloat::cmpGreaterThan ||
1367                         CR_r == APFloat::cmpLessThan ||
1368                         CR_r == APFloat::cmpUnordered) ||
1369                        (CR_i == APFloat::cmpGreaterThan ||
1370                         CR_i == APFloat::cmpLessThan ||
1371                         CR_i == APFloat::cmpUnordered)), E);
1372      }
1373    } else {
1374      if (E->getOpcode() == BO_EQ)
1375        return Success((LHS.getComplexIntReal() == RHS.getComplexIntReal() &&
1376                        LHS.getComplexIntImag() == RHS.getComplexIntImag()), E);
1377      else {
1378        assert(E->getOpcode() == BO_NE &&
1379               "Invalid compex comparison.");
1380        return Success((LHS.getComplexIntReal() != RHS.getComplexIntReal() ||
1381                        LHS.getComplexIntImag() != RHS.getComplexIntImag()), E);
1382      }
1383    }
1384  }
1385
1386  if (LHSTy->isRealFloatingType() &&
1387      RHSTy->isRealFloatingType()) {
1388    APFloat RHS(0.0), LHS(0.0);
1389
1390    if (!EvaluateFloat(E->getRHS(), RHS, Info))
1391      return false;
1392
1393    if (!EvaluateFloat(E->getLHS(), LHS, Info))
1394      return false;
1395
1396    APFloat::cmpResult CR = LHS.compare(RHS);
1397
1398    switch (E->getOpcode()) {
1399    default:
1400      assert(0 && "Invalid binary operator!");
1401    case BO_LT:
1402      return Success(CR == APFloat::cmpLessThan, E);
1403    case BO_GT:
1404      return Success(CR == APFloat::cmpGreaterThan, E);
1405    case BO_LE:
1406      return Success(CR == APFloat::cmpLessThan || CR == APFloat::cmpEqual, E);
1407    case BO_GE:
1408      return Success(CR == APFloat::cmpGreaterThan || CR == APFloat::cmpEqual,
1409                     E);
1410    case BO_EQ:
1411      return Success(CR == APFloat::cmpEqual, E);
1412    case BO_NE:
1413      return Success(CR == APFloat::cmpGreaterThan
1414                     || CR == APFloat::cmpLessThan
1415                     || CR == APFloat::cmpUnordered, E);
1416    }
1417  }
1418
1419  if (LHSTy->isPointerType() && RHSTy->isPointerType()) {
1420    if (E->getOpcode() == BO_Sub || E->isEqualityOp()) {
1421      LValue LHSValue;
1422      if (!EvaluatePointer(E->getLHS(), LHSValue, Info))
1423        return false;
1424
1425      LValue RHSValue;
1426      if (!EvaluatePointer(E->getRHS(), RHSValue, Info))
1427        return false;
1428
1429      // Reject any bases from the normal codepath; we special-case comparisons
1430      // to null.
1431      if (LHSValue.getLValueBase()) {
1432        if (!E->isEqualityOp())
1433          return false;
1434        if (RHSValue.getLValueBase() || !RHSValue.getLValueOffset().isZero())
1435          return false;
1436        bool bres;
1437        if (!EvalPointerValueAsBool(LHSValue, bres))
1438          return false;
1439        return Success(bres ^ (E->getOpcode() == BO_EQ), E);
1440      } else if (RHSValue.getLValueBase()) {
1441        if (!E->isEqualityOp())
1442          return false;
1443        if (LHSValue.getLValueBase() || !LHSValue.getLValueOffset().isZero())
1444          return false;
1445        bool bres;
1446        if (!EvalPointerValueAsBool(RHSValue, bres))
1447          return false;
1448        return Success(bres ^ (E->getOpcode() == BO_EQ), E);
1449      }
1450
1451      if (E->getOpcode() == BO_Sub) {
1452        QualType Type = E->getLHS()->getType();
1453        QualType ElementType = Type->getAs<PointerType>()->getPointeeType();
1454
1455        CharUnits ElementSize = CharUnits::One();
1456        if (!ElementType->isVoidType() && !ElementType->isFunctionType())
1457          ElementSize = Info.Ctx.getTypeSizeInChars(ElementType);
1458
1459        CharUnits Diff = LHSValue.getLValueOffset() -
1460                             RHSValue.getLValueOffset();
1461        return Success(Diff / ElementSize, E);
1462      }
1463      bool Result;
1464      if (E->getOpcode() == BO_EQ) {
1465        Result = LHSValue.getLValueOffset() == RHSValue.getLValueOffset();
1466      } else {
1467        Result = LHSValue.getLValueOffset() != RHSValue.getLValueOffset();
1468      }
1469      return Success(Result, E);
1470    }
1471  }
1472  if (!LHSTy->isIntegralOrEnumerationType() ||
1473      !RHSTy->isIntegralOrEnumerationType()) {
1474    // We can't continue from here for non-integral types, and they
1475    // could potentially confuse the following operations.
1476    return false;
1477  }
1478
1479  // The LHS of a constant expr is always evaluated and needed.
1480  if (!Visit(E->getLHS()))
1481    return false; // error in subexpression.
1482
1483  APValue RHSVal;
1484  if (!EvaluateIntegerOrLValue(E->getRHS(), RHSVal, Info))
1485    return false;
1486
1487  // Handle cases like (unsigned long)&a + 4.
1488  if (E->isAdditiveOp() && Result.isLValue() && RHSVal.isInt()) {
1489    CharUnits Offset = Result.getLValueOffset();
1490    CharUnits AdditionalOffset = CharUnits::fromQuantity(
1491                                     RHSVal.getInt().getZExtValue());
1492    if (E->getOpcode() == BO_Add)
1493      Offset += AdditionalOffset;
1494    else
1495      Offset -= AdditionalOffset;
1496    Result = APValue(Result.getLValueBase(), Offset);
1497    return true;
1498  }
1499
1500  // Handle cases like 4 + (unsigned long)&a
1501  if (E->getOpcode() == BO_Add &&
1502        RHSVal.isLValue() && Result.isInt()) {
1503    CharUnits Offset = RHSVal.getLValueOffset();
1504    Offset += CharUnits::fromQuantity(Result.getInt().getZExtValue());
1505    Result = APValue(RHSVal.getLValueBase(), Offset);
1506    return true;
1507  }
1508
1509  // All the following cases expect both operands to be an integer
1510  if (!Result.isInt() || !RHSVal.isInt())
1511    return false;
1512
1513  APSInt& RHS = RHSVal.getInt();
1514
1515  switch (E->getOpcode()) {
1516  default:
1517    return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E);
1518  case BO_Mul: return Success(Result.getInt() * RHS, E);
1519  case BO_Add: return Success(Result.getInt() + RHS, E);
1520  case BO_Sub: return Success(Result.getInt() - RHS, E);
1521  case BO_And: return Success(Result.getInt() & RHS, E);
1522  case BO_Xor: return Success(Result.getInt() ^ RHS, E);
1523  case BO_Or:  return Success(Result.getInt() | RHS, E);
1524  case BO_Div:
1525    if (RHS == 0)
1526      return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E);
1527    return Success(Result.getInt() / RHS, E);
1528  case BO_Rem:
1529    if (RHS == 0)
1530      return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E);
1531    return Success(Result.getInt() % RHS, E);
1532  case BO_Shl: {
1533    // During constant-folding, a negative shift is an opposite shift.
1534    if (RHS.isSigned() && RHS.isNegative()) {
1535      RHS = -RHS;
1536      goto shift_right;
1537    }
1538
1539  shift_left:
1540    unsigned SA
1541      = (unsigned) RHS.getLimitedValue(Result.getInt().getBitWidth()-1);
1542    return Success(Result.getInt() << SA, E);
1543  }
1544  case BO_Shr: {
1545    // During constant-folding, a negative shift is an opposite shift.
1546    if (RHS.isSigned() && RHS.isNegative()) {
1547      RHS = -RHS;
1548      goto shift_left;
1549    }
1550
1551  shift_right:
1552    unsigned SA =
1553      (unsigned) RHS.getLimitedValue(Result.getInt().getBitWidth()-1);
1554    return Success(Result.getInt() >> SA, E);
1555  }
1556
1557  case BO_LT: return Success(Result.getInt() < RHS, E);
1558  case BO_GT: return Success(Result.getInt() > RHS, E);
1559  case BO_LE: return Success(Result.getInt() <= RHS, E);
1560  case BO_GE: return Success(Result.getInt() >= RHS, E);
1561  case BO_EQ: return Success(Result.getInt() == RHS, E);
1562  case BO_NE: return Success(Result.getInt() != RHS, E);
1563  }
1564}
1565
1566CharUnits IntExprEvaluator::GetAlignOfType(QualType T) {
1567  // C++ [expr.sizeof]p2: "When applied to a reference or a reference type,
1568  //   the result is the size of the referenced type."
1569  // C++ [expr.alignof]p3: "When alignof is applied to a reference type, the
1570  //   result shall be the alignment of the referenced type."
1571  if (const ReferenceType *Ref = T->getAs<ReferenceType>())
1572    T = Ref->getPointeeType();
1573
1574  // __alignof is defined to return the preferred alignment.
1575  return Info.Ctx.toCharUnitsFromBits(
1576    Info.Ctx.getPreferredTypeAlign(T.getTypePtr()));
1577}
1578
1579CharUnits IntExprEvaluator::GetAlignOfExpr(const Expr *E) {
1580  E = E->IgnoreParens();
1581
1582  // alignof decl is always accepted, even if it doesn't make sense: we default
1583  // to 1 in those cases.
1584  if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
1585    return Info.Ctx.getDeclAlign(DRE->getDecl(),
1586                                 /*RefAsPointee*/true);
1587
1588  if (const MemberExpr *ME = dyn_cast<MemberExpr>(E))
1589    return Info.Ctx.getDeclAlign(ME->getMemberDecl(),
1590                                 /*RefAsPointee*/true);
1591
1592  return GetAlignOfType(E->getType());
1593}
1594
1595
1596/// VisitUnaryExprOrTypeTraitExpr - Evaluate a sizeof, alignof or vec_step with
1597/// a result as the expression's type.
1598bool IntExprEvaluator::VisitUnaryExprOrTypeTraitExpr(
1599                                    const UnaryExprOrTypeTraitExpr *E) {
1600  switch(E->getKind()) {
1601  case UETT_AlignOf: {
1602    if (E->isArgumentType())
1603      return Success(GetAlignOfType(E->getArgumentType()), E);
1604    else
1605      return Success(GetAlignOfExpr(E->getArgumentExpr()), E);
1606  }
1607
1608  case UETT_VecStep: {
1609    QualType Ty = E->getTypeOfArgument();
1610
1611    if (Ty->isVectorType()) {
1612      unsigned n = Ty->getAs<VectorType>()->getNumElements();
1613
1614      // The vec_step built-in functions that take a 3-component
1615      // vector return 4. (OpenCL 1.1 spec 6.11.12)
1616      if (n == 3)
1617        n = 4;
1618
1619      return Success(n, E);
1620    } else
1621      return Success(1, E);
1622  }
1623
1624  case UETT_SizeOf: {
1625    QualType SrcTy = E->getTypeOfArgument();
1626    // C++ [expr.sizeof]p2: "When applied to a reference or a reference type,
1627    //   the result is the size of the referenced type."
1628    // C++ [expr.alignof]p3: "When alignof is applied to a reference type, the
1629    //   result shall be the alignment of the referenced type."
1630    if (const ReferenceType *Ref = SrcTy->getAs<ReferenceType>())
1631      SrcTy = Ref->getPointeeType();
1632
1633    // sizeof(void), __alignof__(void), sizeof(function) = 1 as a gcc
1634    // extension.
1635    if (SrcTy->isVoidType() || SrcTy->isFunctionType())
1636      return Success(1, E);
1637
1638    // sizeof(vla) is not a constantexpr: C99 6.5.3.4p2.
1639    if (!SrcTy->isConstantSizeType())
1640      return false;
1641
1642    // Get information about the size.
1643    return Success(Info.Ctx.getTypeSizeInChars(SrcTy), E);
1644  }
1645  }
1646
1647  llvm_unreachable("unknown expr/type trait");
1648  return false;
1649}
1650
1651bool IntExprEvaluator::VisitOffsetOfExpr(const OffsetOfExpr *OOE) {
1652  CharUnits Result;
1653  unsigned n = OOE->getNumComponents();
1654  if (n == 0)
1655    return false;
1656  QualType CurrentType = OOE->getTypeSourceInfo()->getType();
1657  for (unsigned i = 0; i != n; ++i) {
1658    OffsetOfExpr::OffsetOfNode ON = OOE->getComponent(i);
1659    switch (ON.getKind()) {
1660    case OffsetOfExpr::OffsetOfNode::Array: {
1661      const Expr *Idx = OOE->getIndexExpr(ON.getArrayExprIndex());
1662      APSInt IdxResult;
1663      if (!EvaluateInteger(Idx, IdxResult, Info))
1664        return false;
1665      const ArrayType *AT = Info.Ctx.getAsArrayType(CurrentType);
1666      if (!AT)
1667        return false;
1668      CurrentType = AT->getElementType();
1669      CharUnits ElementSize = Info.Ctx.getTypeSizeInChars(CurrentType);
1670      Result += IdxResult.getSExtValue() * ElementSize;
1671        break;
1672    }
1673
1674    case OffsetOfExpr::OffsetOfNode::Field: {
1675      FieldDecl *MemberDecl = ON.getField();
1676      const RecordType *RT = CurrentType->getAs<RecordType>();
1677      if (!RT)
1678        return false;
1679      RecordDecl *RD = RT->getDecl();
1680      const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD);
1681      unsigned i = MemberDecl->getFieldIndex();
1682      assert(i < RL.getFieldCount() && "offsetof field in wrong type");
1683      Result += Info.Ctx.toCharUnitsFromBits(RL.getFieldOffset(i));
1684      CurrentType = MemberDecl->getType().getNonReferenceType();
1685      break;
1686    }
1687
1688    case OffsetOfExpr::OffsetOfNode::Identifier:
1689      llvm_unreachable("dependent __builtin_offsetof");
1690      return false;
1691
1692    case OffsetOfExpr::OffsetOfNode::Base: {
1693      CXXBaseSpecifier *BaseSpec = ON.getBase();
1694      if (BaseSpec->isVirtual())
1695        return false;
1696
1697      // Find the layout of the class whose base we are looking into.
1698      const RecordType *RT = CurrentType->getAs<RecordType>();
1699      if (!RT)
1700        return false;
1701      RecordDecl *RD = RT->getDecl();
1702      const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD);
1703
1704      // Find the base class itself.
1705      CurrentType = BaseSpec->getType();
1706      const RecordType *BaseRT = CurrentType->getAs<RecordType>();
1707      if (!BaseRT)
1708        return false;
1709
1710      // Add the offset to the base.
1711      Result += RL.getBaseClassOffset(cast<CXXRecordDecl>(BaseRT->getDecl()));
1712      break;
1713    }
1714    }
1715  }
1716  return Success(Result, OOE);
1717}
1718
1719bool IntExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
1720  if (E->getOpcode() == UO_LNot) {
1721    // LNot's operand isn't necessarily an integer, so we handle it specially.
1722    bool bres;
1723    if (!HandleConversionToBool(E->getSubExpr(), bres, Info))
1724      return false;
1725    return Success(!bres, E);
1726  }
1727
1728  // Only handle integral operations...
1729  if (!E->getSubExpr()->getType()->isIntegralOrEnumerationType())
1730    return false;
1731
1732  // Get the operand value into 'Result'.
1733  if (!Visit(E->getSubExpr()))
1734    return false;
1735
1736  switch (E->getOpcode()) {
1737  default:
1738    // Address, indirect, pre/post inc/dec, etc are not valid constant exprs.
1739    // See C99 6.6p3.
1740    return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E);
1741  case UO_Extension:
1742    // FIXME: Should extension allow i-c-e extension expressions in its scope?
1743    // If so, we could clear the diagnostic ID.
1744    return true;
1745  case UO_Plus:
1746    // The result is always just the subexpr.
1747    return true;
1748  case UO_Minus:
1749    if (!Result.isInt()) return false;
1750    return Success(-Result.getInt(), E);
1751  case UO_Not:
1752    if (!Result.isInt()) return false;
1753    return Success(~Result.getInt(), E);
1754  }
1755}
1756
1757/// HandleCast - This is used to evaluate implicit or explicit casts where the
1758/// result type is integer.
1759bool IntExprEvaluator::VisitCastExpr(const CastExpr *E) {
1760  const Expr *SubExpr = E->getSubExpr();
1761  QualType DestType = E->getType();
1762  QualType SrcType = SubExpr->getType();
1763
1764  switch (E->getCastKind()) {
1765  case CK_BaseToDerived:
1766  case CK_DerivedToBase:
1767  case CK_UncheckedDerivedToBase:
1768  case CK_Dynamic:
1769  case CK_ToUnion:
1770  case CK_ArrayToPointerDecay:
1771  case CK_FunctionToPointerDecay:
1772  case CK_NullToPointer:
1773  case CK_NullToMemberPointer:
1774  case CK_BaseToDerivedMemberPointer:
1775  case CK_DerivedToBaseMemberPointer:
1776  case CK_ConstructorConversion:
1777  case CK_IntegralToPointer:
1778  case CK_ToVoid:
1779  case CK_VectorSplat:
1780  case CK_IntegralToFloating:
1781  case CK_FloatingCast:
1782  case CK_AnyPointerToObjCPointerCast:
1783  case CK_AnyPointerToBlockPointerCast:
1784  case CK_ObjCObjectLValueCast:
1785  case CK_FloatingRealToComplex:
1786  case CK_FloatingComplexToReal:
1787  case CK_FloatingComplexCast:
1788  case CK_FloatingComplexToIntegralComplex:
1789  case CK_IntegralRealToComplex:
1790  case CK_IntegralComplexCast:
1791  case CK_IntegralComplexToFloatingComplex:
1792    llvm_unreachable("invalid cast kind for integral value");
1793
1794  case CK_BitCast:
1795  case CK_Dependent:
1796  case CK_GetObjCProperty:
1797  case CK_LValueBitCast:
1798  case CK_UserDefinedConversion:
1799    return false;
1800
1801  case CK_LValueToRValue:
1802  case CK_NoOp:
1803    return Visit(E->getSubExpr());
1804
1805  case CK_MemberPointerToBoolean:
1806  case CK_PointerToBoolean:
1807  case CK_IntegralToBoolean:
1808  case CK_FloatingToBoolean:
1809  case CK_FloatingComplexToBoolean:
1810  case CK_IntegralComplexToBoolean: {
1811    bool BoolResult;
1812    if (!HandleConversionToBool(SubExpr, BoolResult, Info))
1813      return false;
1814    return Success(BoolResult, E);
1815  }
1816
1817  case CK_IntegralCast: {
1818    if (!Visit(SubExpr))
1819      return false;
1820
1821    if (!Result.isInt()) {
1822      // Only allow casts of lvalues if they are lossless.
1823      return Info.Ctx.getTypeSize(DestType) == Info.Ctx.getTypeSize(SrcType);
1824    }
1825
1826    return Success(HandleIntToIntCast(DestType, SrcType,
1827                                      Result.getInt(), Info.Ctx), E);
1828  }
1829
1830  case CK_PointerToIntegral: {
1831    LValue LV;
1832    if (!EvaluatePointer(SubExpr, LV, Info))
1833      return false;
1834
1835    if (LV.getLValueBase()) {
1836      // Only allow based lvalue casts if they are lossless.
1837      if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(SrcType))
1838        return false;
1839
1840      LV.moveInto(Result);
1841      return true;
1842    }
1843
1844    APSInt AsInt = Info.Ctx.MakeIntValue(LV.getLValueOffset().getQuantity(),
1845                                         SrcType);
1846    return Success(HandleIntToIntCast(DestType, SrcType, AsInt, Info.Ctx), E);
1847  }
1848
1849  case CK_IntegralComplexToReal: {
1850    ComplexValue C;
1851    if (!EvaluateComplex(SubExpr, C, Info))
1852      return false;
1853    return Success(C.getComplexIntReal(), E);
1854  }
1855
1856  case CK_FloatingToIntegral: {
1857    APFloat F(0.0);
1858    if (!EvaluateFloat(SubExpr, F, Info))
1859      return false;
1860
1861    return Success(HandleFloatToIntCast(DestType, SrcType, F, Info.Ctx), E);
1862  }
1863  }
1864
1865  llvm_unreachable("unknown cast resulting in integral value");
1866  return false;
1867}
1868
1869bool IntExprEvaluator::VisitUnaryReal(const UnaryOperator *E) {
1870  if (E->getSubExpr()->getType()->isAnyComplexType()) {
1871    ComplexValue LV;
1872    if (!EvaluateComplex(E->getSubExpr(), LV, Info) || !LV.isComplexInt())
1873      return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
1874    return Success(LV.getComplexIntReal(), E);
1875  }
1876
1877  return Visit(E->getSubExpr());
1878}
1879
1880bool IntExprEvaluator::VisitUnaryImag(const UnaryOperator *E) {
1881  if (E->getSubExpr()->getType()->isComplexIntegerType()) {
1882    ComplexValue LV;
1883    if (!EvaluateComplex(E->getSubExpr(), LV, Info) || !LV.isComplexInt())
1884      return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
1885    return Success(LV.getComplexIntImag(), E);
1886  }
1887
1888  if (!E->getSubExpr()->isEvaluatable(Info.Ctx))
1889    Info.EvalResult.HasSideEffects = true;
1890  return Success(0, E);
1891}
1892
1893bool IntExprEvaluator::VisitSizeOfPackExpr(const SizeOfPackExpr *E) {
1894  return Success(E->getPackLength(), E);
1895}
1896
1897bool IntExprEvaluator::VisitCXXNoexceptExpr(const CXXNoexceptExpr *E) {
1898  return Success(E->getValue(), E);
1899}
1900
1901//===----------------------------------------------------------------------===//
1902// Float Evaluation
1903//===----------------------------------------------------------------------===//
1904
1905namespace {
1906class FloatExprEvaluator
1907  : public ExprEvaluatorBase<FloatExprEvaluator, bool> {
1908  APFloat &Result;
1909public:
1910  FloatExprEvaluator(EvalInfo &info, APFloat &result)
1911    : ExprEvaluatorBaseTy(info), Result(result) {}
1912
1913  bool Success(const APValue &V, const Expr *e) {
1914    Result = V.getFloat();
1915    return true;
1916  }
1917  bool Error(const Stmt *S) {
1918    return false;
1919  }
1920
1921  bool VisitCallExpr(const CallExpr *E);
1922
1923  bool VisitUnaryOperator(const UnaryOperator *E);
1924  bool VisitBinaryOperator(const BinaryOperator *E);
1925  bool VisitFloatingLiteral(const FloatingLiteral *E);
1926  bool VisitCastExpr(const CastExpr *E);
1927  bool VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr *E);
1928
1929  bool VisitUnaryReal(const UnaryOperator *E);
1930  bool VisitUnaryImag(const UnaryOperator *E);
1931
1932  bool VisitDeclRefExpr(const DeclRefExpr *E);
1933
1934  // FIXME: Missing: array subscript of vector, member of vector,
1935  //                 ImplicitValueInitExpr
1936};
1937} // end anonymous namespace
1938
1939static bool EvaluateFloat(const Expr* E, APFloat& Result, EvalInfo &Info) {
1940  assert(E->getType()->isRealFloatingType());
1941  return FloatExprEvaluator(Info, Result).Visit(E);
1942}
1943
1944static bool TryEvaluateBuiltinNaN(const ASTContext &Context,
1945                                  QualType ResultTy,
1946                                  const Expr *Arg,
1947                                  bool SNaN,
1948                                  llvm::APFloat &Result) {
1949  const StringLiteral *S = dyn_cast<StringLiteral>(Arg->IgnoreParenCasts());
1950  if (!S) return false;
1951
1952  const llvm::fltSemantics &Sem = Context.getFloatTypeSemantics(ResultTy);
1953
1954  llvm::APInt fill;
1955
1956  // Treat empty strings as if they were zero.
1957  if (S->getString().empty())
1958    fill = llvm::APInt(32, 0);
1959  else if (S->getString().getAsInteger(0, fill))
1960    return false;
1961
1962  if (SNaN)
1963    Result = llvm::APFloat::getSNaN(Sem, false, &fill);
1964  else
1965    Result = llvm::APFloat::getQNaN(Sem, false, &fill);
1966  return true;
1967}
1968
1969bool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) {
1970  switch (E->isBuiltinCall(Info.Ctx)) {
1971  default:
1972    return ExprEvaluatorBaseTy::VisitCallExpr(E);
1973
1974  case Builtin::BI__builtin_huge_val:
1975  case Builtin::BI__builtin_huge_valf:
1976  case Builtin::BI__builtin_huge_vall:
1977  case Builtin::BI__builtin_inf:
1978  case Builtin::BI__builtin_inff:
1979  case Builtin::BI__builtin_infl: {
1980    const llvm::fltSemantics &Sem =
1981      Info.Ctx.getFloatTypeSemantics(E->getType());
1982    Result = llvm::APFloat::getInf(Sem);
1983    return true;
1984  }
1985
1986  case Builtin::BI__builtin_nans:
1987  case Builtin::BI__builtin_nansf:
1988  case Builtin::BI__builtin_nansl:
1989    return TryEvaluateBuiltinNaN(Info.Ctx, E->getType(), E->getArg(0),
1990                                 true, Result);
1991
1992  case Builtin::BI__builtin_nan:
1993  case Builtin::BI__builtin_nanf:
1994  case Builtin::BI__builtin_nanl:
1995    // If this is __builtin_nan() turn this into a nan, otherwise we
1996    // can't constant fold it.
1997    return TryEvaluateBuiltinNaN(Info.Ctx, E->getType(), E->getArg(0),
1998                                 false, Result);
1999
2000  case Builtin::BI__builtin_fabs:
2001  case Builtin::BI__builtin_fabsf:
2002  case Builtin::BI__builtin_fabsl:
2003    if (!EvaluateFloat(E->getArg(0), Result, Info))
2004      return false;
2005
2006    if (Result.isNegative())
2007      Result.changeSign();
2008    return true;
2009
2010  case Builtin::BI__builtin_copysign:
2011  case Builtin::BI__builtin_copysignf:
2012  case Builtin::BI__builtin_copysignl: {
2013    APFloat RHS(0.);
2014    if (!EvaluateFloat(E->getArg(0), Result, Info) ||
2015        !EvaluateFloat(E->getArg(1), RHS, Info))
2016      return false;
2017    Result.copySign(RHS);
2018    return true;
2019  }
2020  }
2021}
2022
2023bool FloatExprEvaluator::VisitDeclRefExpr(const DeclRefExpr *E) {
2024  if (ExprEvaluatorBaseTy::VisitDeclRefExpr(E))
2025    return true;
2026
2027  const Decl *D = E->getDecl();
2028  if (!isa<VarDecl>(D) || isa<ParmVarDecl>(D)) return false;
2029  const VarDecl *VD = cast<VarDecl>(D);
2030
2031  // Require the qualifiers to be const and not volatile.
2032  CanQualType T = Info.Ctx.getCanonicalType(E->getType());
2033  if (!T.isConstQualified() || T.isVolatileQualified())
2034    return false;
2035
2036  const Expr *Init = VD->getAnyInitializer();
2037  if (!Init) return false;
2038
2039  if (APValue *V = VD->getEvaluatedValue()) {
2040    if (V->isFloat()) {
2041      Result = V->getFloat();
2042      return true;
2043    }
2044    return false;
2045  }
2046
2047  if (VD->isEvaluatingValue())
2048    return false;
2049
2050  VD->setEvaluatingValue();
2051
2052  Expr::EvalResult InitResult;
2053  if (Init->Evaluate(InitResult, Info.Ctx) && !InitResult.HasSideEffects &&
2054      InitResult.Val.isFloat()) {
2055    // Cache the evaluated value in the variable declaration.
2056    Result = InitResult.Val.getFloat();
2057    VD->setEvaluatedValue(InitResult.Val);
2058    return true;
2059  }
2060
2061  VD->setEvaluatedValue(APValue());
2062  return false;
2063}
2064
2065bool FloatExprEvaluator::VisitUnaryReal(const UnaryOperator *E) {
2066  if (E->getSubExpr()->getType()->isAnyComplexType()) {
2067    ComplexValue CV;
2068    if (!EvaluateComplex(E->getSubExpr(), CV, Info))
2069      return false;
2070    Result = CV.FloatReal;
2071    return true;
2072  }
2073
2074  return Visit(E->getSubExpr());
2075}
2076
2077bool FloatExprEvaluator::VisitUnaryImag(const UnaryOperator *E) {
2078  if (E->getSubExpr()->getType()->isAnyComplexType()) {
2079    ComplexValue CV;
2080    if (!EvaluateComplex(E->getSubExpr(), CV, Info))
2081      return false;
2082    Result = CV.FloatImag;
2083    return true;
2084  }
2085
2086  if (!E->getSubExpr()->isEvaluatable(Info.Ctx))
2087    Info.EvalResult.HasSideEffects = true;
2088  const llvm::fltSemantics &Sem = Info.Ctx.getFloatTypeSemantics(E->getType());
2089  Result = llvm::APFloat::getZero(Sem);
2090  return true;
2091}
2092
2093bool FloatExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
2094  if (E->getOpcode() == UO_Deref)
2095    return false;
2096
2097  if (!EvaluateFloat(E->getSubExpr(), Result, Info))
2098    return false;
2099
2100  switch (E->getOpcode()) {
2101  default: return false;
2102  case UO_Plus:
2103    return true;
2104  case UO_Minus:
2105    Result.changeSign();
2106    return true;
2107  }
2108}
2109
2110bool FloatExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
2111  if (E->getOpcode() == BO_Comma) {
2112    if (!EvaluateFloat(E->getRHS(), Result, Info))
2113      return false;
2114
2115    // If we can't evaluate the LHS, it might have side effects;
2116    // conservatively mark it.
2117    if (!E->getLHS()->isEvaluatable(Info.Ctx))
2118      Info.EvalResult.HasSideEffects = true;
2119
2120    return true;
2121  }
2122
2123  // We can't evaluate pointer-to-member operations.
2124  if (E->isPtrMemOp())
2125    return false;
2126
2127  // FIXME: Diagnostics?  I really don't understand how the warnings
2128  // and errors are supposed to work.
2129  APFloat RHS(0.0);
2130  if (!EvaluateFloat(E->getLHS(), Result, Info))
2131    return false;
2132  if (!EvaluateFloat(E->getRHS(), RHS, Info))
2133    return false;
2134
2135  switch (E->getOpcode()) {
2136  default: return false;
2137  case BO_Mul:
2138    Result.multiply(RHS, APFloat::rmNearestTiesToEven);
2139    return true;
2140  case BO_Add:
2141    Result.add(RHS, APFloat::rmNearestTiesToEven);
2142    return true;
2143  case BO_Sub:
2144    Result.subtract(RHS, APFloat::rmNearestTiesToEven);
2145    return true;
2146  case BO_Div:
2147    Result.divide(RHS, APFloat::rmNearestTiesToEven);
2148    return true;
2149  }
2150}
2151
2152bool FloatExprEvaluator::VisitFloatingLiteral(const FloatingLiteral *E) {
2153  Result = E->getValue();
2154  return true;
2155}
2156
2157bool FloatExprEvaluator::VisitCastExpr(const CastExpr *E) {
2158  const Expr* SubExpr = E->getSubExpr();
2159
2160  switch (E->getCastKind()) {
2161  default:
2162    return false;
2163
2164  case CK_LValueToRValue:
2165  case CK_NoOp:
2166    return Visit(SubExpr);
2167
2168  case CK_IntegralToFloating: {
2169    APSInt IntResult;
2170    if (!EvaluateInteger(SubExpr, IntResult, Info))
2171      return false;
2172    Result = HandleIntToFloatCast(E->getType(), SubExpr->getType(),
2173                                  IntResult, Info.Ctx);
2174    return true;
2175  }
2176
2177  case CK_FloatingCast: {
2178    if (!Visit(SubExpr))
2179      return false;
2180    Result = HandleFloatToFloatCast(E->getType(), SubExpr->getType(),
2181                                    Result, Info.Ctx);
2182    return true;
2183  }
2184
2185  case CK_FloatingComplexToReal: {
2186    ComplexValue V;
2187    if (!EvaluateComplex(SubExpr, V, Info))
2188      return false;
2189    Result = V.getComplexFloatReal();
2190    return true;
2191  }
2192  }
2193
2194  return false;
2195}
2196
2197bool FloatExprEvaluator::VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr *E) {
2198  Result = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(E->getType()));
2199  return true;
2200}
2201
2202//===----------------------------------------------------------------------===//
2203// Complex Evaluation (for float and integer)
2204//===----------------------------------------------------------------------===//
2205
2206namespace {
2207class ComplexExprEvaluator
2208  : public ExprEvaluatorBase<ComplexExprEvaluator, bool> {
2209  ComplexValue &Result;
2210
2211public:
2212  ComplexExprEvaluator(EvalInfo &info, ComplexValue &Result)
2213    : ExprEvaluatorBaseTy(info), Result(Result) {}
2214
2215  bool Success(const APValue &V, const Expr *e) {
2216    Result.setFrom(V);
2217    return true;
2218  }
2219  bool Error(const Expr *E) {
2220    return false;
2221  }
2222
2223  //===--------------------------------------------------------------------===//
2224  //                            Visitor Methods
2225  //===--------------------------------------------------------------------===//
2226
2227  bool VisitImaginaryLiteral(const ImaginaryLiteral *E);
2228
2229  bool VisitCastExpr(const CastExpr *E);
2230
2231  bool VisitBinaryOperator(const BinaryOperator *E);
2232  bool VisitUnaryOperator(const UnaryOperator *E);
2233  // FIXME Missing: ImplicitValueInitExpr
2234};
2235} // end anonymous namespace
2236
2237static bool EvaluateComplex(const Expr *E, ComplexValue &Result,
2238                            EvalInfo &Info) {
2239  assert(E->getType()->isAnyComplexType());
2240  return ComplexExprEvaluator(Info, Result).Visit(E);
2241}
2242
2243bool ComplexExprEvaluator::VisitImaginaryLiteral(const ImaginaryLiteral *E) {
2244  const Expr* SubExpr = E->getSubExpr();
2245
2246  if (SubExpr->getType()->isRealFloatingType()) {
2247    Result.makeComplexFloat();
2248    APFloat &Imag = Result.FloatImag;
2249    if (!EvaluateFloat(SubExpr, Imag, Info))
2250      return false;
2251
2252    Result.FloatReal = APFloat(Imag.getSemantics());
2253    return true;
2254  } else {
2255    assert(SubExpr->getType()->isIntegerType() &&
2256           "Unexpected imaginary literal.");
2257
2258    Result.makeComplexInt();
2259    APSInt &Imag = Result.IntImag;
2260    if (!EvaluateInteger(SubExpr, Imag, Info))
2261      return false;
2262
2263    Result.IntReal = APSInt(Imag.getBitWidth(), !Imag.isSigned());
2264    return true;
2265  }
2266}
2267
2268bool ComplexExprEvaluator::VisitCastExpr(const CastExpr *E) {
2269
2270  switch (E->getCastKind()) {
2271  case CK_BitCast:
2272  case CK_BaseToDerived:
2273  case CK_DerivedToBase:
2274  case CK_UncheckedDerivedToBase:
2275  case CK_Dynamic:
2276  case CK_ToUnion:
2277  case CK_ArrayToPointerDecay:
2278  case CK_FunctionToPointerDecay:
2279  case CK_NullToPointer:
2280  case CK_NullToMemberPointer:
2281  case CK_BaseToDerivedMemberPointer:
2282  case CK_DerivedToBaseMemberPointer:
2283  case CK_MemberPointerToBoolean:
2284  case CK_ConstructorConversion:
2285  case CK_IntegralToPointer:
2286  case CK_PointerToIntegral:
2287  case CK_PointerToBoolean:
2288  case CK_ToVoid:
2289  case CK_VectorSplat:
2290  case CK_IntegralCast:
2291  case CK_IntegralToBoolean:
2292  case CK_IntegralToFloating:
2293  case CK_FloatingToIntegral:
2294  case CK_FloatingToBoolean:
2295  case CK_FloatingCast:
2296  case CK_AnyPointerToObjCPointerCast:
2297  case CK_AnyPointerToBlockPointerCast:
2298  case CK_ObjCObjectLValueCast:
2299  case CK_FloatingComplexToReal:
2300  case CK_FloatingComplexToBoolean:
2301  case CK_IntegralComplexToReal:
2302  case CK_IntegralComplexToBoolean:
2303    llvm_unreachable("invalid cast kind for complex value");
2304
2305  case CK_LValueToRValue:
2306  case CK_NoOp:
2307    return Visit(E->getSubExpr());
2308
2309  case CK_Dependent:
2310  case CK_GetObjCProperty:
2311  case CK_LValueBitCast:
2312  case CK_UserDefinedConversion:
2313    return false;
2314
2315  case CK_FloatingRealToComplex: {
2316    APFloat &Real = Result.FloatReal;
2317    if (!EvaluateFloat(E->getSubExpr(), Real, Info))
2318      return false;
2319
2320    Result.makeComplexFloat();
2321    Result.FloatImag = APFloat(Real.getSemantics());
2322    return true;
2323  }
2324
2325  case CK_FloatingComplexCast: {
2326    if (!Visit(E->getSubExpr()))
2327      return false;
2328
2329    QualType To = E->getType()->getAs<ComplexType>()->getElementType();
2330    QualType From
2331      = E->getSubExpr()->getType()->getAs<ComplexType>()->getElementType();
2332
2333    Result.FloatReal
2334      = HandleFloatToFloatCast(To, From, Result.FloatReal, Info.Ctx);
2335    Result.FloatImag
2336      = HandleFloatToFloatCast(To, From, Result.FloatImag, Info.Ctx);
2337    return true;
2338  }
2339
2340  case CK_FloatingComplexToIntegralComplex: {
2341    if (!Visit(E->getSubExpr()))
2342      return false;
2343
2344    QualType To = E->getType()->getAs<ComplexType>()->getElementType();
2345    QualType From
2346      = E->getSubExpr()->getType()->getAs<ComplexType>()->getElementType();
2347    Result.makeComplexInt();
2348    Result.IntReal = HandleFloatToIntCast(To, From, Result.FloatReal, Info.Ctx);
2349    Result.IntImag = HandleFloatToIntCast(To, From, Result.FloatImag, Info.Ctx);
2350    return true;
2351  }
2352
2353  case CK_IntegralRealToComplex: {
2354    APSInt &Real = Result.IntReal;
2355    if (!EvaluateInteger(E->getSubExpr(), Real, Info))
2356      return false;
2357
2358    Result.makeComplexInt();
2359    Result.IntImag = APSInt(Real.getBitWidth(), !Real.isSigned());
2360    return true;
2361  }
2362
2363  case CK_IntegralComplexCast: {
2364    if (!Visit(E->getSubExpr()))
2365      return false;
2366
2367    QualType To = E->getType()->getAs<ComplexType>()->getElementType();
2368    QualType From
2369      = E->getSubExpr()->getType()->getAs<ComplexType>()->getElementType();
2370
2371    Result.IntReal = HandleIntToIntCast(To, From, Result.IntReal, Info.Ctx);
2372    Result.IntImag = HandleIntToIntCast(To, From, Result.IntImag, Info.Ctx);
2373    return true;
2374  }
2375
2376  case CK_IntegralComplexToFloatingComplex: {
2377    if (!Visit(E->getSubExpr()))
2378      return false;
2379
2380    QualType To = E->getType()->getAs<ComplexType>()->getElementType();
2381    QualType From
2382      = E->getSubExpr()->getType()->getAs<ComplexType>()->getElementType();
2383    Result.makeComplexFloat();
2384    Result.FloatReal = HandleIntToFloatCast(To, From, Result.IntReal, Info.Ctx);
2385    Result.FloatImag = HandleIntToFloatCast(To, From, Result.IntImag, Info.Ctx);
2386    return true;
2387  }
2388  }
2389
2390  llvm_unreachable("unknown cast resulting in complex value");
2391  return false;
2392}
2393
2394bool ComplexExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
2395  if (E->getOpcode() == BO_Comma) {
2396    if (!Visit(E->getRHS()))
2397      return false;
2398
2399    // If we can't evaluate the LHS, it might have side effects;
2400    // conservatively mark it.
2401    if (!E->getLHS()->isEvaluatable(Info.Ctx))
2402      Info.EvalResult.HasSideEffects = true;
2403
2404    return true;
2405  }
2406  if (!Visit(E->getLHS()))
2407    return false;
2408
2409  ComplexValue RHS;
2410  if (!EvaluateComplex(E->getRHS(), RHS, Info))
2411    return false;
2412
2413  assert(Result.isComplexFloat() == RHS.isComplexFloat() &&
2414         "Invalid operands to binary operator.");
2415  switch (E->getOpcode()) {
2416  default: return false;
2417  case BO_Add:
2418    if (Result.isComplexFloat()) {
2419      Result.getComplexFloatReal().add(RHS.getComplexFloatReal(),
2420                                       APFloat::rmNearestTiesToEven);
2421      Result.getComplexFloatImag().add(RHS.getComplexFloatImag(),
2422                                       APFloat::rmNearestTiesToEven);
2423    } else {
2424      Result.getComplexIntReal() += RHS.getComplexIntReal();
2425      Result.getComplexIntImag() += RHS.getComplexIntImag();
2426    }
2427    break;
2428  case BO_Sub:
2429    if (Result.isComplexFloat()) {
2430      Result.getComplexFloatReal().subtract(RHS.getComplexFloatReal(),
2431                                            APFloat::rmNearestTiesToEven);
2432      Result.getComplexFloatImag().subtract(RHS.getComplexFloatImag(),
2433                                            APFloat::rmNearestTiesToEven);
2434    } else {
2435      Result.getComplexIntReal() -= RHS.getComplexIntReal();
2436      Result.getComplexIntImag() -= RHS.getComplexIntImag();
2437    }
2438    break;
2439  case BO_Mul:
2440    if (Result.isComplexFloat()) {
2441      ComplexValue LHS = Result;
2442      APFloat &LHS_r = LHS.getComplexFloatReal();
2443      APFloat &LHS_i = LHS.getComplexFloatImag();
2444      APFloat &RHS_r = RHS.getComplexFloatReal();
2445      APFloat &RHS_i = RHS.getComplexFloatImag();
2446
2447      APFloat Tmp = LHS_r;
2448      Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven);
2449      Result.getComplexFloatReal() = Tmp;
2450      Tmp = LHS_i;
2451      Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven);
2452      Result.getComplexFloatReal().subtract(Tmp, APFloat::rmNearestTiesToEven);
2453
2454      Tmp = LHS_r;
2455      Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven);
2456      Result.getComplexFloatImag() = Tmp;
2457      Tmp = LHS_i;
2458      Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven);
2459      Result.getComplexFloatImag().add(Tmp, APFloat::rmNearestTiesToEven);
2460    } else {
2461      ComplexValue LHS = Result;
2462      Result.getComplexIntReal() =
2463        (LHS.getComplexIntReal() * RHS.getComplexIntReal() -
2464         LHS.getComplexIntImag() * RHS.getComplexIntImag());
2465      Result.getComplexIntImag() =
2466        (LHS.getComplexIntReal() * RHS.getComplexIntImag() +
2467         LHS.getComplexIntImag() * RHS.getComplexIntReal());
2468    }
2469    break;
2470  case BO_Div:
2471    if (Result.isComplexFloat()) {
2472      ComplexValue LHS = Result;
2473      APFloat &LHS_r = LHS.getComplexFloatReal();
2474      APFloat &LHS_i = LHS.getComplexFloatImag();
2475      APFloat &RHS_r = RHS.getComplexFloatReal();
2476      APFloat &RHS_i = RHS.getComplexFloatImag();
2477      APFloat &Res_r = Result.getComplexFloatReal();
2478      APFloat &Res_i = Result.getComplexFloatImag();
2479
2480      APFloat Den = RHS_r;
2481      Den.multiply(RHS_r, APFloat::rmNearestTiesToEven);
2482      APFloat Tmp = RHS_i;
2483      Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven);
2484      Den.add(Tmp, APFloat::rmNearestTiesToEven);
2485
2486      Res_r = LHS_r;
2487      Res_r.multiply(RHS_r, APFloat::rmNearestTiesToEven);
2488      Tmp = LHS_i;
2489      Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven);
2490      Res_r.add(Tmp, APFloat::rmNearestTiesToEven);
2491      Res_r.divide(Den, APFloat::rmNearestTiesToEven);
2492
2493      Res_i = LHS_i;
2494      Res_i.multiply(RHS_r, APFloat::rmNearestTiesToEven);
2495      Tmp = LHS_r;
2496      Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven);
2497      Res_i.subtract(Tmp, APFloat::rmNearestTiesToEven);
2498      Res_i.divide(Den, APFloat::rmNearestTiesToEven);
2499    } else {
2500      if (RHS.getComplexIntReal() == 0 && RHS.getComplexIntImag() == 0) {
2501        // FIXME: what about diagnostics?
2502        return false;
2503      }
2504      ComplexValue LHS = Result;
2505      APSInt Den = RHS.getComplexIntReal() * RHS.getComplexIntReal() +
2506        RHS.getComplexIntImag() * RHS.getComplexIntImag();
2507      Result.getComplexIntReal() =
2508        (LHS.getComplexIntReal() * RHS.getComplexIntReal() +
2509         LHS.getComplexIntImag() * RHS.getComplexIntImag()) / Den;
2510      Result.getComplexIntImag() =
2511        (LHS.getComplexIntImag() * RHS.getComplexIntReal() -
2512         LHS.getComplexIntReal() * RHS.getComplexIntImag()) / Den;
2513    }
2514    break;
2515  }
2516
2517  return true;
2518}
2519
2520bool ComplexExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
2521  // Get the operand value into 'Result'.
2522  if (!Visit(E->getSubExpr()))
2523    return false;
2524
2525  switch (E->getOpcode()) {
2526  default:
2527    // FIXME: what about diagnostics?
2528    return false;
2529  case UO_Extension:
2530    return true;
2531  case UO_Plus:
2532    // The result is always just the subexpr.
2533    return true;
2534  case UO_Minus:
2535    if (Result.isComplexFloat()) {
2536      Result.getComplexFloatReal().changeSign();
2537      Result.getComplexFloatImag().changeSign();
2538    }
2539    else {
2540      Result.getComplexIntReal() = -Result.getComplexIntReal();
2541      Result.getComplexIntImag() = -Result.getComplexIntImag();
2542    }
2543    return true;
2544  case UO_Not:
2545    if (Result.isComplexFloat())
2546      Result.getComplexFloatImag().changeSign();
2547    else
2548      Result.getComplexIntImag() = -Result.getComplexIntImag();
2549    return true;
2550  }
2551}
2552
2553//===----------------------------------------------------------------------===//
2554// Top level Expr::Evaluate method.
2555//===----------------------------------------------------------------------===//
2556
2557static bool Evaluate(EvalInfo &Info, const Expr *E) {
2558  if (E->getType()->isVectorType()) {
2559    if (!EvaluateVector(E, Info.EvalResult.Val, Info))
2560      return false;
2561  } else if (E->getType()->isIntegerType()) {
2562    if (!IntExprEvaluator(Info, Info.EvalResult.Val).Visit(E))
2563      return false;
2564    if (Info.EvalResult.Val.isLValue() &&
2565        !IsGlobalLValue(Info.EvalResult.Val.getLValueBase()))
2566      return false;
2567  } else if (E->getType()->hasPointerRepresentation()) {
2568    LValue LV;
2569    if (!EvaluatePointer(E, LV, Info))
2570      return false;
2571    if (!IsGlobalLValue(LV.Base))
2572      return false;
2573    LV.moveInto(Info.EvalResult.Val);
2574  } else if (E->getType()->isRealFloatingType()) {
2575    llvm::APFloat F(0.0);
2576    if (!EvaluateFloat(E, F, Info))
2577      return false;
2578
2579    Info.EvalResult.Val = APValue(F);
2580  } else if (E->getType()->isAnyComplexType()) {
2581    ComplexValue C;
2582    if (!EvaluateComplex(E, C, Info))
2583      return false;
2584    C.moveInto(Info.EvalResult.Val);
2585  } else
2586    return false;
2587
2588  return true;
2589}
2590
2591/// Evaluate - Return true if this is a constant which we can fold using
2592/// any crazy technique (that has nothing to do with language standards) that
2593/// we want to.  If this function returns true, it returns the folded constant
2594/// in Result.
2595bool Expr::Evaluate(EvalResult &Result, const ASTContext &Ctx) const {
2596  EvalInfo Info(Ctx, Result);
2597  return ::Evaluate(Info, this);
2598}
2599
2600bool Expr::EvaluateAsBooleanCondition(bool &Result,
2601                                      const ASTContext &Ctx) const {
2602  EvalResult Scratch;
2603  EvalInfo Info(Ctx, Scratch);
2604
2605  return HandleConversionToBool(this, Result, Info);
2606}
2607
2608bool Expr::EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx) const {
2609  EvalInfo Info(Ctx, Result);
2610
2611  LValue LV;
2612  if (EvaluateLValue(this, LV, Info) &&
2613      !Result.HasSideEffects &&
2614      IsGlobalLValue(LV.Base)) {
2615    LV.moveInto(Result.Val);
2616    return true;
2617  }
2618  return false;
2619}
2620
2621bool Expr::EvaluateAsAnyLValue(EvalResult &Result,
2622                               const ASTContext &Ctx) const {
2623  EvalInfo Info(Ctx, Result);
2624
2625  LValue LV;
2626  if (EvaluateLValue(this, LV, Info)) {
2627    LV.moveInto(Result.Val);
2628    return true;
2629  }
2630  return false;
2631}
2632
2633/// isEvaluatable - Call Evaluate to see if this expression can be constant
2634/// folded, but discard the result.
2635bool Expr::isEvaluatable(const ASTContext &Ctx) const {
2636  EvalResult Result;
2637  return Evaluate(Result, Ctx) && !Result.HasSideEffects;
2638}
2639
2640bool Expr::HasSideEffects(const ASTContext &Ctx) const {
2641  Expr::EvalResult Result;
2642  EvalInfo Info(Ctx, Result);
2643  return HasSideEffect(Info).Visit(this);
2644}
2645
2646APSInt Expr::EvaluateAsInt(const ASTContext &Ctx) const {
2647  EvalResult EvalResult;
2648  bool Result = Evaluate(EvalResult, Ctx);
2649  (void)Result;
2650  assert(Result && "Could not evaluate expression");
2651  assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer");
2652
2653  return EvalResult.Val.getInt();
2654}
2655
2656 bool Expr::EvalResult::isGlobalLValue() const {
2657   assert(Val.isLValue());
2658   return IsGlobalLValue(Val.getLValueBase());
2659 }
2660
2661
2662/// isIntegerConstantExpr - this recursive routine will test if an expression is
2663/// an integer constant expression.
2664
2665/// FIXME: Pass up a reason why! Invalid operation in i-c-e, division by zero,
2666/// comma, etc
2667///
2668/// FIXME: Handle offsetof.  Two things to do:  Handle GCC's __builtin_offsetof
2669/// to support gcc 4.0+  and handle the idiom GCC recognizes with a null pointer
2670/// cast+dereference.
2671
2672// CheckICE - This function does the fundamental ICE checking: the returned
2673// ICEDiag contains a Val of 0, 1, or 2, and a possibly null SourceLocation.
2674// Note that to reduce code duplication, this helper does no evaluation
2675// itself; the caller checks whether the expression is evaluatable, and
2676// in the rare cases where CheckICE actually cares about the evaluated
2677// value, it calls into Evalute.
2678//
2679// Meanings of Val:
2680// 0: This expression is an ICE if it can be evaluated by Evaluate.
2681// 1: This expression is not an ICE, but if it isn't evaluated, it's
2682//    a legal subexpression for an ICE. This return value is used to handle
2683//    the comma operator in C99 mode.
2684// 2: This expression is not an ICE, and is not a legal subexpression for one.
2685
2686namespace {
2687
2688struct ICEDiag {
2689  unsigned Val;
2690  SourceLocation Loc;
2691
2692  public:
2693  ICEDiag(unsigned v, SourceLocation l) : Val(v), Loc(l) {}
2694  ICEDiag() : Val(0) {}
2695};
2696
2697}
2698
2699static ICEDiag NoDiag() { return ICEDiag(); }
2700
2701static ICEDiag CheckEvalInICE(const Expr* E, ASTContext &Ctx) {
2702  Expr::EvalResult EVResult;
2703  if (!E->Evaluate(EVResult, Ctx) || EVResult.HasSideEffects ||
2704      !EVResult.Val.isInt()) {
2705    return ICEDiag(2, E->getLocStart());
2706  }
2707  return NoDiag();
2708}
2709
2710static ICEDiag CheckICE(const Expr* E, ASTContext &Ctx) {
2711  assert(!E->isValueDependent() && "Should not see value dependent exprs!");
2712  if (!E->getType()->isIntegralOrEnumerationType()) {
2713    return ICEDiag(2, E->getLocStart());
2714  }
2715
2716  switch (E->getStmtClass()) {
2717#define ABSTRACT_STMT(Node)
2718#define STMT(Node, Base) case Expr::Node##Class:
2719#define EXPR(Node, Base)
2720#include "clang/AST/StmtNodes.inc"
2721  case Expr::PredefinedExprClass:
2722  case Expr::FloatingLiteralClass:
2723  case Expr::ImaginaryLiteralClass:
2724  case Expr::StringLiteralClass:
2725  case Expr::ArraySubscriptExprClass:
2726  case Expr::MemberExprClass:
2727  case Expr::CompoundAssignOperatorClass:
2728  case Expr::CompoundLiteralExprClass:
2729  case Expr::ExtVectorElementExprClass:
2730  case Expr::InitListExprClass:
2731  case Expr::DesignatedInitExprClass:
2732  case Expr::ImplicitValueInitExprClass:
2733  case Expr::ParenListExprClass:
2734  case Expr::VAArgExprClass:
2735  case Expr::AddrLabelExprClass:
2736  case Expr::StmtExprClass:
2737  case Expr::CXXMemberCallExprClass:
2738  case Expr::CUDAKernelCallExprClass:
2739  case Expr::CXXDynamicCastExprClass:
2740  case Expr::CXXTypeidExprClass:
2741  case Expr::CXXUuidofExprClass:
2742  case Expr::CXXNullPtrLiteralExprClass:
2743  case Expr::CXXThisExprClass:
2744  case Expr::CXXThrowExprClass:
2745  case Expr::CXXNewExprClass:
2746  case Expr::CXXDeleteExprClass:
2747  case Expr::CXXPseudoDestructorExprClass:
2748  case Expr::UnresolvedLookupExprClass:
2749  case Expr::DependentScopeDeclRefExprClass:
2750  case Expr::CXXConstructExprClass:
2751  case Expr::CXXBindTemporaryExprClass:
2752  case Expr::ExprWithCleanupsClass:
2753  case Expr::CXXTemporaryObjectExprClass:
2754  case Expr::CXXUnresolvedConstructExprClass:
2755  case Expr::CXXDependentScopeMemberExprClass:
2756  case Expr::UnresolvedMemberExprClass:
2757  case Expr::ObjCStringLiteralClass:
2758  case Expr::ObjCEncodeExprClass:
2759  case Expr::ObjCMessageExprClass:
2760  case Expr::ObjCSelectorExprClass:
2761  case Expr::ObjCProtocolExprClass:
2762  case Expr::ObjCIvarRefExprClass:
2763  case Expr::ObjCPropertyRefExprClass:
2764  case Expr::ObjCIsaExprClass:
2765  case Expr::ShuffleVectorExprClass:
2766  case Expr::BlockExprClass:
2767  case Expr::BlockDeclRefExprClass:
2768  case Expr::NoStmtClass:
2769  case Expr::OpaqueValueExprClass:
2770  case Expr::PackExpansionExprClass:
2771  case Expr::SubstNonTypeTemplateParmPackExprClass:
2772    return ICEDiag(2, E->getLocStart());
2773
2774  case Expr::SizeOfPackExprClass:
2775  case Expr::GNUNullExprClass:
2776    // GCC considers the GNU __null value to be an integral constant expression.
2777    return NoDiag();
2778
2779  case Expr::ParenExprClass:
2780    return CheckICE(cast<ParenExpr>(E)->getSubExpr(), Ctx);
2781  case Expr::GenericSelectionExprClass:
2782    return CheckICE(cast<GenericSelectionExpr>(E)->getResultExpr(), Ctx);
2783  case Expr::IntegerLiteralClass:
2784  case Expr::CharacterLiteralClass:
2785  case Expr::CXXBoolLiteralExprClass:
2786  case Expr::CXXScalarValueInitExprClass:
2787  case Expr::UnaryTypeTraitExprClass:
2788  case Expr::BinaryTypeTraitExprClass:
2789  case Expr::ArrayTypeTraitExprClass:
2790  case Expr::ExpressionTraitExprClass:
2791  case Expr::CXXNoexceptExprClass:
2792    return NoDiag();
2793  case Expr::CallExprClass:
2794  case Expr::CXXOperatorCallExprClass: {
2795    const CallExpr *CE = cast<CallExpr>(E);
2796    if (CE->isBuiltinCall(Ctx))
2797      return CheckEvalInICE(E, Ctx);
2798    return ICEDiag(2, E->getLocStart());
2799  }
2800  case Expr::DeclRefExprClass:
2801    if (isa<EnumConstantDecl>(cast<DeclRefExpr>(E)->getDecl()))
2802      return NoDiag();
2803    if (Ctx.getLangOptions().CPlusPlus &&
2804        E->getType().getCVRQualifiers() == Qualifiers::Const) {
2805      const NamedDecl *D = cast<DeclRefExpr>(E)->getDecl();
2806
2807      // Parameter variables are never constants.  Without this check,
2808      // getAnyInitializer() can find a default argument, which leads
2809      // to chaos.
2810      if (isa<ParmVarDecl>(D))
2811        return ICEDiag(2, cast<DeclRefExpr>(E)->getLocation());
2812
2813      // C++ 7.1.5.1p2
2814      //   A variable of non-volatile const-qualified integral or enumeration
2815      //   type initialized by an ICE can be used in ICEs.
2816      if (const VarDecl *Dcl = dyn_cast<VarDecl>(D)) {
2817        Qualifiers Quals = Ctx.getCanonicalType(Dcl->getType()).getQualifiers();
2818        if (Quals.hasVolatile() || !Quals.hasConst())
2819          return ICEDiag(2, cast<DeclRefExpr>(E)->getLocation());
2820
2821        // Look for a declaration of this variable that has an initializer.
2822        const VarDecl *ID = 0;
2823        const Expr *Init = Dcl->getAnyInitializer(ID);
2824        if (Init) {
2825          if (ID->isInitKnownICE()) {
2826            // We have already checked whether this subexpression is an
2827            // integral constant expression.
2828            if (ID->isInitICE())
2829              return NoDiag();
2830            else
2831              return ICEDiag(2, cast<DeclRefExpr>(E)->getLocation());
2832          }
2833
2834          // It's an ICE whether or not the definition we found is
2835          // out-of-line.  See DR 721 and the discussion in Clang PR
2836          // 6206 for details.
2837
2838          if (Dcl->isCheckingICE()) {
2839            return ICEDiag(2, cast<DeclRefExpr>(E)->getLocation());
2840          }
2841
2842          Dcl->setCheckingICE();
2843          ICEDiag Result = CheckICE(Init, Ctx);
2844          // Cache the result of the ICE test.
2845          Dcl->setInitKnownICE(Result.Val == 0);
2846          return Result;
2847        }
2848      }
2849    }
2850    return ICEDiag(2, E->getLocStart());
2851  case Expr::UnaryOperatorClass: {
2852    const UnaryOperator *Exp = cast<UnaryOperator>(E);
2853    switch (Exp->getOpcode()) {
2854    case UO_PostInc:
2855    case UO_PostDec:
2856    case UO_PreInc:
2857    case UO_PreDec:
2858    case UO_AddrOf:
2859    case UO_Deref:
2860      return ICEDiag(2, E->getLocStart());
2861    case UO_Extension:
2862    case UO_LNot:
2863    case UO_Plus:
2864    case UO_Minus:
2865    case UO_Not:
2866    case UO_Real:
2867    case UO_Imag:
2868      return CheckICE(Exp->getSubExpr(), Ctx);
2869    }
2870
2871    // OffsetOf falls through here.
2872  }
2873  case Expr::OffsetOfExprClass: {
2874      // Note that per C99, offsetof must be an ICE. And AFAIK, using
2875      // Evaluate matches the proposed gcc behavior for cases like
2876      // "offsetof(struct s{int x[4];}, x[!.0])".  This doesn't affect
2877      // compliance: we should warn earlier for offsetof expressions with
2878      // array subscripts that aren't ICEs, and if the array subscripts
2879      // are ICEs, the value of the offsetof must be an integer constant.
2880      return CheckEvalInICE(E, Ctx);
2881  }
2882  case Expr::UnaryExprOrTypeTraitExprClass: {
2883    const UnaryExprOrTypeTraitExpr *Exp = cast<UnaryExprOrTypeTraitExpr>(E);
2884    if ((Exp->getKind() ==  UETT_SizeOf) &&
2885        Exp->getTypeOfArgument()->isVariableArrayType())
2886      return ICEDiag(2, E->getLocStart());
2887    return NoDiag();
2888  }
2889  case Expr::BinaryOperatorClass: {
2890    const BinaryOperator *Exp = cast<BinaryOperator>(E);
2891    switch (Exp->getOpcode()) {
2892    case BO_PtrMemD:
2893    case BO_PtrMemI:
2894    case BO_Assign:
2895    case BO_MulAssign:
2896    case BO_DivAssign:
2897    case BO_RemAssign:
2898    case BO_AddAssign:
2899    case BO_SubAssign:
2900    case BO_ShlAssign:
2901    case BO_ShrAssign:
2902    case BO_AndAssign:
2903    case BO_XorAssign:
2904    case BO_OrAssign:
2905      return ICEDiag(2, E->getLocStart());
2906
2907    case BO_Mul:
2908    case BO_Div:
2909    case BO_Rem:
2910    case BO_Add:
2911    case BO_Sub:
2912    case BO_Shl:
2913    case BO_Shr:
2914    case BO_LT:
2915    case BO_GT:
2916    case BO_LE:
2917    case BO_GE:
2918    case BO_EQ:
2919    case BO_NE:
2920    case BO_And:
2921    case BO_Xor:
2922    case BO_Or:
2923    case BO_Comma: {
2924      ICEDiag LHSResult = CheckICE(Exp->getLHS(), Ctx);
2925      ICEDiag RHSResult = CheckICE(Exp->getRHS(), Ctx);
2926      if (Exp->getOpcode() == BO_Div ||
2927          Exp->getOpcode() == BO_Rem) {
2928        // Evaluate gives an error for undefined Div/Rem, so make sure
2929        // we don't evaluate one.
2930        if (LHSResult.Val == 0 && RHSResult.Val == 0) {
2931          llvm::APSInt REval = Exp->getRHS()->EvaluateAsInt(Ctx);
2932          if (REval == 0)
2933            return ICEDiag(1, E->getLocStart());
2934          if (REval.isSigned() && REval.isAllOnesValue()) {
2935            llvm::APSInt LEval = Exp->getLHS()->EvaluateAsInt(Ctx);
2936            if (LEval.isMinSignedValue())
2937              return ICEDiag(1, E->getLocStart());
2938          }
2939        }
2940      }
2941      if (Exp->getOpcode() == BO_Comma) {
2942        if (Ctx.getLangOptions().C99) {
2943          // C99 6.6p3 introduces a strange edge case: comma can be in an ICE
2944          // if it isn't evaluated.
2945          if (LHSResult.Val == 0 && RHSResult.Val == 0)
2946            return ICEDiag(1, E->getLocStart());
2947        } else {
2948          // In both C89 and C++, commas in ICEs are illegal.
2949          return ICEDiag(2, E->getLocStart());
2950        }
2951      }
2952      if (LHSResult.Val >= RHSResult.Val)
2953        return LHSResult;
2954      return RHSResult;
2955    }
2956    case BO_LAnd:
2957    case BO_LOr: {
2958      ICEDiag LHSResult = CheckICE(Exp->getLHS(), Ctx);
2959      ICEDiag RHSResult = CheckICE(Exp->getRHS(), Ctx);
2960      if (LHSResult.Val == 0 && RHSResult.Val == 1) {
2961        // Rare case where the RHS has a comma "side-effect"; we need
2962        // to actually check the condition to see whether the side
2963        // with the comma is evaluated.
2964        if ((Exp->getOpcode() == BO_LAnd) !=
2965            (Exp->getLHS()->EvaluateAsInt(Ctx) == 0))
2966          return RHSResult;
2967        return NoDiag();
2968      }
2969
2970      if (LHSResult.Val >= RHSResult.Val)
2971        return LHSResult;
2972      return RHSResult;
2973    }
2974    }
2975  }
2976  case Expr::ImplicitCastExprClass:
2977  case Expr::CStyleCastExprClass:
2978  case Expr::CXXFunctionalCastExprClass:
2979  case Expr::CXXStaticCastExprClass:
2980  case Expr::CXXReinterpretCastExprClass:
2981  case Expr::CXXConstCastExprClass: {
2982    const Expr *SubExpr = cast<CastExpr>(E)->getSubExpr();
2983    if (SubExpr->getType()->isIntegralOrEnumerationType())
2984      return CheckICE(SubExpr, Ctx);
2985    if (isa<FloatingLiteral>(SubExpr->IgnoreParens()))
2986      return NoDiag();
2987    return ICEDiag(2, E->getLocStart());
2988  }
2989  case Expr::BinaryConditionalOperatorClass: {
2990    const BinaryConditionalOperator *Exp = cast<BinaryConditionalOperator>(E);
2991    ICEDiag CommonResult = CheckICE(Exp->getCommon(), Ctx);
2992    if (CommonResult.Val == 2) return CommonResult;
2993    ICEDiag FalseResult = CheckICE(Exp->getFalseExpr(), Ctx);
2994    if (FalseResult.Val == 2) return FalseResult;
2995    if (CommonResult.Val == 1) return CommonResult;
2996    if (FalseResult.Val == 1 &&
2997        Exp->getCommon()->EvaluateAsInt(Ctx) == 0) return NoDiag();
2998    return FalseResult;
2999  }
3000  case Expr::ConditionalOperatorClass: {
3001    const ConditionalOperator *Exp = cast<ConditionalOperator>(E);
3002    // If the condition (ignoring parens) is a __builtin_constant_p call,
3003    // then only the true side is actually considered in an integer constant
3004    // expression, and it is fully evaluated.  This is an important GNU
3005    // extension.  See GCC PR38377 for discussion.
3006    if (const CallExpr *CallCE
3007        = dyn_cast<CallExpr>(Exp->getCond()->IgnoreParenCasts()))
3008      if (CallCE->isBuiltinCall(Ctx) == Builtin::BI__builtin_constant_p) {
3009        Expr::EvalResult EVResult;
3010        if (!E->Evaluate(EVResult, Ctx) || EVResult.HasSideEffects ||
3011            !EVResult.Val.isInt()) {
3012          return ICEDiag(2, E->getLocStart());
3013        }
3014        return NoDiag();
3015      }
3016    ICEDiag CondResult = CheckICE(Exp->getCond(), Ctx);
3017    ICEDiag TrueResult = CheckICE(Exp->getTrueExpr(), Ctx);
3018    ICEDiag FalseResult = CheckICE(Exp->getFalseExpr(), Ctx);
3019    if (CondResult.Val == 2)
3020      return CondResult;
3021    if (TrueResult.Val == 2)
3022      return TrueResult;
3023    if (FalseResult.Val == 2)
3024      return FalseResult;
3025    if (CondResult.Val == 1)
3026      return CondResult;
3027    if (TrueResult.Val == 0 && FalseResult.Val == 0)
3028      return NoDiag();
3029    // Rare case where the diagnostics depend on which side is evaluated
3030    // Note that if we get here, CondResult is 0, and at least one of
3031    // TrueResult and FalseResult is non-zero.
3032    if (Exp->getCond()->EvaluateAsInt(Ctx) == 0) {
3033      return FalseResult;
3034    }
3035    return TrueResult;
3036  }
3037  case Expr::CXXDefaultArgExprClass:
3038    return CheckICE(cast<CXXDefaultArgExpr>(E)->getExpr(), Ctx);
3039  case Expr::ChooseExprClass: {
3040    return CheckICE(cast<ChooseExpr>(E)->getChosenSubExpr(Ctx), Ctx);
3041  }
3042  }
3043
3044  // Silence a GCC warning
3045  return ICEDiag(2, E->getLocStart());
3046}
3047
3048bool Expr::isIntegerConstantExpr(llvm::APSInt &Result, ASTContext &Ctx,
3049                                 SourceLocation *Loc, bool isEvaluated) const {
3050  ICEDiag d = CheckICE(this, Ctx);
3051  if (d.Val != 0) {
3052    if (Loc) *Loc = d.Loc;
3053    return false;
3054  }
3055  EvalResult EvalResult;
3056  if (!Evaluate(EvalResult, Ctx))
3057    llvm_unreachable("ICE cannot be evaluated!");
3058  assert(!EvalResult.HasSideEffects && "ICE with side effects!");
3059  assert(EvalResult.Val.isInt() && "ICE that isn't integer!");
3060  Result = EvalResult.Val.getInt();
3061  return true;
3062}
3063