ExprConstant.cpp revision 3d75ca836205856077c18e30e9447accbd85f751
1b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner//===--- ExprConstant.cpp - Expression Constant Evaluator -----------------===//
2c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//
3c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//                     The LLVM Compiler Infrastructure
4c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//
5c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// This file is distributed under the University of Illinois Open Source
6c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// License. See LICENSE.TXT for details.
7c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//
8c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//===----------------------------------------------------------------------===//
9c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//
10c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// This file implements the Expr constant evaluator.
11c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//
12c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//===----------------------------------------------------------------------===//
13c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson
14c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson#include "clang/AST/APValue.h"
15c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson#include "clang/AST/ASTContext.h"
16199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck#include "clang/AST/CharUnits.h"
1719cc4abea06a9b49e0e16a50d335c064cd723572Anders Carlsson#include "clang/AST/RecordLayout.h"
180fe52e1bcaa69ba127f1bda036f057fec1f478deSeo Sanghyeon#include "clang/AST/StmtVisitor.h"
198ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor#include "clang/AST/TypeLoc.h"
20500d3297d2a21edeac4d46cbcbe21bc2352c2a28Chris Lattner#include "clang/AST/ASTDiagnostic.h"
218ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor#include "clang/AST/Expr.h"
221b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner#include "clang/Basic/Builtins.h"
2306a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson#include "clang/Basic/TargetInfo.h"
247462b39a9bccaf4392687831036713f09f9c0681Mike Stump#include "llvm/ADT/SmallString.h"
254572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump#include <cstring>
264572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump
27c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlssonusing namespace clang;
28f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerusing llvm::APSInt;
29d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanusing llvm::APFloat;
30c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson
3187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// EvalInfo - This is a private struct used by the evaluator to capture
3287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// information about a subexpression as it is folded.  It retains information
3387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// about the AST context, but also maintains information about the folded
3487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// expression.
3587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner///
3687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// If an expression could be evaluated, it is still possible it is not a C
3787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// "integer constant expression" or constant expression.  If not, this struct
3887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// captures information about how and why not.
3987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner///
4087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// One bit of information passed *into* the request for constant folding
4187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// indicates whether the subexpression is "evaluated" or not according to C
4287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// rules.  For example, the RHS of (0 && foo()) is not evaluated.  We can
4387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// evaluate the expression regardless of what the RHS is, but C only allows
4487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// certain things in certain situations.
45c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramernamespace {
46d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  struct CallStackFrame;
47bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith  struct EvalInfo;
48d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
499a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith  /// Determine whether the described subobject is an array element.
509a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith  static bool SubobjectIsArrayElement(QualType Base,
519a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith                                      ArrayRef<APValue::LValuePathEntry> Path) {
529a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith    bool IsArrayElement = false;
539a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith    const Type *T = Base.getTypePtr();
549a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith    for (unsigned I = 0, N = Path.size(); I != N; ++I) {
559a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith      IsArrayElement = T && T->isArrayType();
569a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith      if (IsArrayElement)
579a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith        T = T->getBaseElementTypeUnsafe();
589a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith      else if (const FieldDecl *FD = dyn_cast<FieldDecl>(Path[I].BaseOrMember))
599a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith        T = FD->getType().getTypePtr();
609a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith      else
619a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith        // Path[I] describes a base class.
629a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith        T = 0;
639a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith    }
649a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith    return IsArrayElement;
659a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith  }
669a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith
670a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith  /// A path from a glvalue to a subobject of that glvalue.
680a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith  struct SubobjectDesignator {
690a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    /// True if the subobject was named in a manner not supported by C++11. Such
700a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    /// lvalues can still be folded, but they are not core constant expressions
710a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    /// and we cannot perform lvalue-to-rvalue conversions on them.
720a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    bool Invalid : 1;
730a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith
740a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    /// Whether this designates an array element.
750a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    bool ArrayElement : 1;
760a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith
770a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    /// Whether this designates 'one past the end' of the current subobject.
780a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    bool OnePastTheEnd : 1;
790a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith
809a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith    typedef APValue::LValuePathEntry PathEntry;
819a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith
820a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    /// The entries on the path from the glvalue to the designated subobject.
830a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    SmallVector<PathEntry, 8> Entries;
840a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith
850a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    SubobjectDesignator() :
860a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      Invalid(false), ArrayElement(false), OnePastTheEnd(false) {}
870a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith
889a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith    SubobjectDesignator(const APValue &V) :
899a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith      Invalid(!V.isLValue() || !V.hasLValuePath()), ArrayElement(false),
909a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith      OnePastTheEnd(false) {
919a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith      if (!Invalid) {
929a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith        ArrayRef<PathEntry> VEntries = V.getLValuePath();
939a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith        Entries.insert(Entries.end(), VEntries.begin(), VEntries.end());
949a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith        if (V.getLValueBase())
959a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith          ArrayElement = SubobjectIsArrayElement(V.getLValueBase()->getType(),
969a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith                                                 V.getLValuePath());
979a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith        else
989a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith          assert(V.getLValuePath().empty() &&"Null pointer with nonempty path");
999a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith      }
1009a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith    }
1019a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith
1020a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    void setInvalid() {
1030a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      Invalid = true;
1040a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      Entries.clear();
1050a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    }
1060a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    /// Update this designator to refer to the given element within this array.
1070a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    void addIndex(uint64_t N) {
1080a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      if (Invalid) return;
1090a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      if (OnePastTheEnd) {
1100a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith        setInvalid();
1110a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith        return;
1120a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      }
1130a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      PathEntry Entry;
1149a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith      Entry.ArrayIndex = N;
1150a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      Entries.push_back(Entry);
1160a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      ArrayElement = true;
1170a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    }
1180a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    /// Update this designator to refer to the given base or member of this
1190a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    /// object.
1200a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    void addDecl(const Decl *D) {
1210a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      if (Invalid) return;
1220a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      if (OnePastTheEnd) {
1230a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith        setInvalid();
1240a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith        return;
1250a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      }
1260a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      PathEntry Entry;
1270a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      Entry.BaseOrMember = D;
1280a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      Entries.push_back(Entry);
1290a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      ArrayElement = false;
1300a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    }
1310a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    /// Add N to the address of this subobject.
1320a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    void adjustIndex(uint64_t N) {
1330a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      if (Invalid) return;
1340a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      if (ArrayElement) {
135cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith        // FIXME: Make sure the index stays within bounds, or one past the end.
1369a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith        Entries.back().ArrayIndex += N;
1370a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith        return;
1380a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      }
1390a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      if (OnePastTheEnd && N == (uint64_t)-1)
1400a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith        OnePastTheEnd = false;
1410a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      else if (!OnePastTheEnd && N == 1)
1420a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith        OnePastTheEnd = true;
1430a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      else if (N != 0)
1440a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith        setInvalid();
1450a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    }
1460a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith  };
1470a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith
14847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  /// A core constant value. This can be the value of any constant expression,
14947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  /// or a pointer or reference to a non-static object or function parameter.
15047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  class CCValue : public APValue {
15147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    typedef llvm::APSInt APSInt;
15247a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    typedef llvm::APFloat APFloat;
153177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith    /// If the value is a reference or pointer into a parameter or temporary,
154177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith    /// this is the corresponding call stack frame.
155177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith    CallStackFrame *CallFrame;
1560a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    /// If the value is a reference or pointer, this is a description of how the
1570a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    /// subobject was specified.
1580a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    SubobjectDesignator Designator;
15947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  public:
160177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith    struct GlobalValue {};
161177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith
16247a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    CCValue() {}
16347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    explicit CCValue(const APSInt &I) : APValue(I) {}
16447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    explicit CCValue(const APFloat &F) : APValue(F) {}
16547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    CCValue(const APValue *E, unsigned N) : APValue(E, N) {}
16647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    CCValue(const APSInt &R, const APSInt &I) : APValue(R, I) {}
16747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    CCValue(const APFloat &R, const APFloat &I) : APValue(R, I) {}
168177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith    CCValue(const CCValue &V) : APValue(V), CallFrame(V.CallFrame) {}
1690a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    CCValue(const Expr *B, const CharUnits &O, CallStackFrame *F,
1700a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith            const SubobjectDesignator &D) :
1719a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith      APValue(B, O, APValue::NoLValuePath()), CallFrame(F), Designator(D) {}
172177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith    CCValue(const APValue &V, GlobalValue) :
1739a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith      APValue(V), CallFrame(0), Designator(V) {}
17447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith
175177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith    CallStackFrame *getLValueFrame() const {
17647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith      assert(getKind() == LValue);
177177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith      return CallFrame;
17847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    }
1790a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    SubobjectDesignator &getLValueDesignator() {
1800a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      assert(getKind() == LValue);
1810a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      return Designator;
1820a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    }
1830a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    const SubobjectDesignator &getLValueDesignator() const {
1840a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      return const_cast<CCValue*>(this)->getLValueDesignator();
1850a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    }
18647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  };
18747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith
188bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith  /// A stack frame in the constexpr call stack.
189bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith  struct CallStackFrame {
190bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    EvalInfo &Info;
191bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith
192bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    /// Parent - The caller of this stack frame.
193bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    CallStackFrame *Caller;
194bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith
195bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    /// ParmBindings - Parameter bindings for this function call, indexed by
196bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    /// parameters' function scope indices.
197bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    const CCValue *Arguments;
198bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith
199bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    typedef llvm::DenseMap<const Expr*, CCValue> MapTy;
200bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    typedef MapTy::const_iterator temp_iterator;
201bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    /// Temporaries - Temporary lvalues materialized within this stack frame.
202bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    MapTy Temporaries;
203bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith
204bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    CallStackFrame(EvalInfo &Info, const CCValue *Arguments);
205bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    ~CallStackFrame();
206bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith  };
207bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith
208c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer  struct EvalInfo {
209c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer    const ASTContext &Ctx;
2101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2111e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith    /// EvalStatus - Contains information about the evaluation.
2121e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith    Expr::EvalStatus &EvalStatus;
213f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson
214d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    /// CurrentCall - The top of the constexpr call stack.
215bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    CallStackFrame *CurrentCall;
216d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
217d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    /// NumCalls - The number of calls we've evaluated so far.
218d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    unsigned NumCalls;
219d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
220d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    /// CallStackDepth - The number of calls in the call stack right now.
221d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    unsigned CallStackDepth;
222d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
22347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    typedef llvm::DenseMap<const OpaqueValueExpr*, CCValue> MapTy;
224bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    /// OpaqueValues - Values used as the common expression in a
225bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    /// BinaryConditionalOperator.
226c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer    MapTy OpaqueValues;
227bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith
228bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    /// BottomFrame - The frame in which evaluation started. This must be
229bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    /// initialized last.
230bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    CallStackFrame BottomFrame;
231bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith
232bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith
233bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    EvalInfo(const ASTContext &C, Expr::EvalStatus &S)
234bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith      : Ctx(C), EvalStatus(S), CurrentCall(0), NumCalls(0), CallStackDepth(0),
235bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith        BottomFrame(*this, 0) {}
236bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith
23747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    const CCValue *getOpaqueValue(const OpaqueValueExpr *e) const {
238c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer      MapTy::const_iterator i = OpaqueValues.find(e);
239c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer      if (i == OpaqueValues.end()) return 0;
240c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer      return &i->second;
241c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer    }
24256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
243f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith    const LangOptions &getLangOpts() { return Ctx.getLangOptions(); }
244c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer  };
24587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner
246bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith  CallStackFrame::CallStackFrame(EvalInfo &Info, const CCValue *Arguments)
247177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith      : Info(Info), Caller(Info.CurrentCall), Arguments(Arguments) {
248bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    Info.CurrentCall = this;
249bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    ++Info.CallStackDepth;
250bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith  }
251d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
252bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith  CallStackFrame::~CallStackFrame() {
253bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    assert(Info.CurrentCall == this && "calls retired out of order");
254bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    --Info.CallStackDepth;
255bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    Info.CurrentCall = Caller;
256bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith  }
257d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
258f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall  struct ComplexValue {
259f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall  private:
260f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    bool IsInt;
261f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall
262f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall  public:
263f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    APSInt IntReal, IntImag;
264f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    APFloat FloatReal, FloatImag;
265f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall
266f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    ComplexValue() : FloatReal(APFloat::Bogus), FloatImag(APFloat::Bogus) {}
267f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall
268f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    void makeComplexFloat() { IsInt = false; }
269f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    bool isComplexFloat() const { return !IsInt; }
270f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    APFloat &getComplexFloatReal() { return FloatReal; }
271f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    APFloat &getComplexFloatImag() { return FloatImag; }
272f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall
273f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    void makeComplexInt() { IsInt = true; }
274f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    bool isComplexInt() const { return IsInt; }
275f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    APSInt &getComplexIntReal() { return IntReal; }
276f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    APSInt &getComplexIntImag() { return IntImag; }
277f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall
27847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    void moveInto(CCValue &v) const {
279f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall      if (isComplexFloat())
28047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith        v = CCValue(FloatReal, FloatImag);
281f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall      else
28247a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith        v = CCValue(IntReal, IntImag);
283f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    }
28447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    void setFrom(const CCValue &v) {
28556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      assert(v.isComplexFloat() || v.isComplexInt());
28656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      if (v.isComplexFloat()) {
28756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall        makeComplexFloat();
28856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall        FloatReal = v.getComplexFloatReal();
28956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall        FloatImag = v.getComplexFloatImag();
29056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      } else {
29156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall        makeComplexInt();
29256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall        IntReal = v.getComplexIntReal();
29356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall        IntImag = v.getComplexIntImag();
29456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      }
29556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    }
296f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall  };
297efdb83e26f9a1fd2566afe54461216cd84814d42John McCall
298efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  struct LValue {
2998cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    const Expr *Base;
300efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    CharUnits Offset;
301177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith    CallStackFrame *Frame;
3020a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    SubobjectDesignator Designator;
303efdb83e26f9a1fd2566afe54461216cd84814d42John McCall
304625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith    const Expr *getLValueBase() const { return Base; }
30547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    CharUnits &getLValueOffset() { return Offset; }
306625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith    const CharUnits &getLValueOffset() const { return Offset; }
307177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith    CallStackFrame *getLValueFrame() const { return Frame; }
3080a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    SubobjectDesignator &getLValueDesignator() { return Designator; }
3090a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    const SubobjectDesignator &getLValueDesignator() const { return Designator;}
310efdb83e26f9a1fd2566afe54461216cd84814d42John McCall
31147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    void moveInto(CCValue &V) const {
3120a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      V = CCValue(Base, Offset, Frame, Designator);
313efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    }
31447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    void setFrom(const CCValue &V) {
31547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith      assert(V.isLValue());
31647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith      Base = V.getLValueBase();
31747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith      Offset = V.getLValueOffset();
318177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith      Frame = V.getLValueFrame();
3190a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      Designator = V.getLValueDesignator();
3200a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    }
3210a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith
3220a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    void setExpr(const Expr *E, CallStackFrame *F = 0) {
3230a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      Base = E;
3240a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      Offset = CharUnits::Zero();
3250a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      Frame = F;
3260a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      Designator = SubobjectDesignator();
32756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    }
328efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  };
329f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall}
33087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner
33147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smithstatic bool Evaluate(CCValue &Result, EvalInfo &Info, const Expr *E);
33269c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smithstatic bool EvaluateConstantExpression(APValue &Result, EvalInfo &Info,
33369c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith                                       const Expr *E);
334efdb83e26f9a1fd2566afe54461216cd84814d42John McCallstatic bool EvaluateLValue(const Expr *E, LValue &Result, EvalInfo &Info);
335efdb83e26f9a1fd2566afe54461216cd84814d42John McCallstatic bool EvaluatePointer(const Expr *E, LValue &Result, EvalInfo &Info);
33687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluateInteger(const Expr *E, APSInt  &Result, EvalInfo &Info);
33747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smithstatic bool EvaluateIntegerOrLValue(const Expr *E, CCValue &Result,
338d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner                                    EvalInfo &Info);
339d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr *E, APFloat &Result, EvalInfo &Info);
340f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCallstatic bool EvaluateComplex(const Expr *E, ComplexValue &Res, EvalInfo &Info);
341f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
342f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
3434efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// Misc utilities
3444efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
3454efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
346e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnarastatic bool IsGlobalLValue(const Expr* E) {
34742c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  if (!E) return true;
34842c8f87eb60958170c46767273bf93e6c96125bfJohn McCall
34942c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
35042c8f87eb60958170c46767273bf93e6c96125bfJohn McCall    if (isa<FunctionDecl>(DRE->getDecl()))
35142c8f87eb60958170c46767273bf93e6c96125bfJohn McCall      return true;
35242c8f87eb60958170c46767273bf93e6c96125bfJohn McCall    if (const VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl()))
35342c8f87eb60958170c46767273bf93e6c96125bfJohn McCall      return VD->hasGlobalStorage();
35442c8f87eb60958170c46767273bf93e6c96125bfJohn McCall    return false;
35542c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  }
35642c8f87eb60958170c46767273bf93e6c96125bfJohn McCall
35742c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  if (const CompoundLiteralExpr *CLE = dyn_cast<CompoundLiteralExpr>(E))
35842c8f87eb60958170c46767273bf93e6c96125bfJohn McCall    return CLE->isFileScope();
35942c8f87eb60958170c46767273bf93e6c96125bfJohn McCall
360bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith  if (isa<MemberExpr>(E) || isa<MaterializeTemporaryExpr>(E))
361c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return false;
362c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
36342c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  return true;
36442c8f87eb60958170c46767273bf93e6c96125bfJohn McCall}
36542c8f87eb60958170c46767273bf93e6c96125bfJohn McCall
3669a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith/// Check that this reference or pointer core constant expression is a valid
3679a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith/// value for a constant expression. Type T should be either LValue or CCValue.
3689a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smithtemplate<typename T>
3699a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smithstatic bool CheckLValueConstantExpression(const T &LVal, APValue &Value) {
3709a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith  if (!IsGlobalLValue(LVal.getLValueBase()))
37169c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith    return false;
37269c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith
3739a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith  const SubobjectDesignator &Designator = LVal.getLValueDesignator();
3749a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith  // A constant expression must refer to an object or be a null pointer.
3759a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith  if (Designator.Invalid || Designator.OnePastTheEnd ||
3769a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith      (!LVal.getLValueBase() && !Designator.Entries.empty())) {
3779a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith    // FIXME: Check for out-of-bounds array indices.
3789a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith    // FIXME: This is not a constant expression.
3799a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith    Value = APValue(LVal.getLValueBase(), LVal.getLValueOffset(),
3809a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith                    APValue::NoLValuePath());
3819a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith    return true;
3829a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith  }
3839a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith
3849a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith  Value = APValue(LVal.getLValueBase(), LVal.getLValueOffset(),
3859a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith                  Designator.Entries);
38669c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith  return true;
38747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith}
38847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith
3899a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith/// Check that this core constant expression value is a valid value for a
3909a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith/// constant expression, and if it is, produce the corresponding constant value.
3919a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smithstatic bool CheckConstantExpression(const CCValue &CCValue, APValue &Value) {
3929a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith  if (!CCValue.isLValue()) {
3939a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith    Value = CCValue;
3949a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith    return true;
3959a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith  }
3969a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith  return CheckLValueConstantExpression(CCValue, Value);
3979a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith}
3989a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith
3999e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smithconst ValueDecl *GetLValueBaseDecl(const LValue &LVal) {
4009e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith  if (!LVal.Base)
4019e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith    return 0;
4029e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith
4039e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith  if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(LVal.Base))
4049e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith    return DRE->getDecl();
4059e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith
4069e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith  // FIXME: Static data members accessed via a MemberExpr are represented as
4079e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith  // that MemberExpr. We should use the Decl directly instead.
4089e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith  if (const MemberExpr *ME = dyn_cast<MemberExpr>(LVal.Base)) {
4099e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith    assert(!isa<FieldDecl>(ME->getMemberDecl()) && "shouldn't see fields here");
4109e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith    return ME->getMemberDecl();
4119e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith  }
4129e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith
4139e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith  return 0;
4149e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith}
4159e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith
4169e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smithstatic bool IsLiteralLValue(const LValue &Value) {
4179e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith  return Value.Base &&
4189e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith         !isa<DeclRefExpr>(Value.Base) &&
419bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith         !isa<MemberExpr>(Value.Base) &&
420bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith         !isa<MaterializeTemporaryExpr>(Value.Base);
4219e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith}
4229e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith
42365ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smithstatic bool IsWeakDecl(const ValueDecl *Decl) {
4249e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith  return Decl->hasAttr<WeakAttr>() ||
4259e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith         Decl->hasAttr<WeakRefAttr>() ||
4269e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith         Decl->isWeakImported();
4279e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith}
4289e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith
42965ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smithstatic bool IsWeakLValue(const LValue &Value) {
43065ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith  const ValueDecl *Decl = GetLValueBaseDecl(Value);
43165ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith  return Decl && IsWeakDecl(Decl);
43265ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith}
43365ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith
434c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smithstatic bool EvalPointerValueAsBool(const LValue &Value, bool &Result) {
435efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  const Expr* Base = Value.Base;
436a7d3c04fcfe9d4af2f7758f46aef26b1a8f8ac09Rafael Espindola
4373554283157190e67918fad4221a5e6faf9317362John McCall  // A null base expression indicates a null pointer.  These are always
4383554283157190e67918fad4221a5e6faf9317362John McCall  // evaluatable, and they are false unless the offset is zero.
4393554283157190e67918fad4221a5e6faf9317362John McCall  if (!Base) {
4403554283157190e67918fad4221a5e6faf9317362John McCall    Result = !Value.Offset.isZero();
4413554283157190e67918fad4221a5e6faf9317362John McCall    return true;
4423554283157190e67918fad4221a5e6faf9317362John McCall  }
4433554283157190e67918fad4221a5e6faf9317362John McCall
44442c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  // Require the base expression to be a global l-value.
44547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  // FIXME: C++11 requires such conversions. Remove this check.
446e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara  if (!IsGlobalLValue(Base)) return false;
44742c8f87eb60958170c46767273bf93e6c96125bfJohn McCall
4483554283157190e67918fad4221a5e6faf9317362John McCall  // We have a non-null base expression.  These are generally known to
4493554283157190e67918fad4221a5e6faf9317362John McCall  // be true, but if it'a decl-ref to a weak symbol it can be null at
4503554283157190e67918fad4221a5e6faf9317362John McCall  // runtime.
4513554283157190e67918fad4221a5e6faf9317362John McCall  Result = true;
4529e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith  return !IsWeakLValue(Value);
4535bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman}
4545bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman
45547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smithstatic bool HandleConversionToBool(const CCValue &Val, bool &Result) {
456c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  switch (Val.getKind()) {
457c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  case APValue::Uninitialized:
458c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return false;
459c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  case APValue::Int:
460c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    Result = Val.getInt().getBoolValue();
46141bf4f38348561a0f12c10d34f1673cd19a6eb04Richard Smith    return true;
462c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  case APValue::Float:
463c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    Result = !Val.getFloat().isZero();
464a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman    return true;
465c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  case APValue::ComplexInt:
466c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    Result = Val.getComplexIntReal().getBoolValue() ||
467c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith             Val.getComplexIntImag().getBoolValue();
468c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return true;
469c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  case APValue::ComplexFloat:
470c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    Result = !Val.getComplexFloatReal().isZero() ||
471c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith             !Val.getComplexFloatImag().isZero();
472436c8898cd1c93c5bacd3fcc4ac586bc5cd77062Richard Smith    return true;
47347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  case APValue::LValue: {
47447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    LValue PointerResult;
47547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    PointerResult.setFrom(Val);
47647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    return EvalPointerValueAsBool(PointerResult, Result);
47747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  }
478c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  case APValue::Vector:
479cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  case APValue::Array:
480c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return false;
4814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
4824efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
483c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  llvm_unreachable("unknown APValue kind");
484c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith}
485c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
486c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smithstatic bool EvaluateAsBooleanCondition(const Expr *E, bool &Result,
487c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith                                       EvalInfo &Info) {
488c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  assert(E->isRValue() && "missing lvalue-to-rvalue conv in bool condition");
48947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  CCValue Val;
490c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  if (!Evaluate(Val, Info, E))
491c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return false;
492c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  return HandleConversionToBool(Val, Result);
4934efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
4944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
4951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APSInt HandleFloatToIntCast(QualType DestType, QualType SrcType,
4964ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                   APFloat &Value, const ASTContext &Ctx) {
497a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  unsigned DestWidth = Ctx.getIntWidth(DestType);
498a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  // Determine whether we are converting to unsigned or signed.
499575a1c9dc8dc5b4977194993e289f9eda7295c39Douglas Gregor  bool DestSigned = DestType->isSignedIntegerOrEnumerationType();
5001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
501a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  // FIXME: Warning for overflow.
5023e1ef7849845a9e7bf79156bbb8a2c26d77a1d2eJeffrey Yasskin  APSInt Result(DestWidth, !DestSigned);
503a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  bool ignored;
5043e1ef7849845a9e7bf79156bbb8a2c26d77a1d2eJeffrey Yasskin  (void)Value.convertToInteger(Result, llvm::APFloat::rmTowardZero, &ignored);
5053e1ef7849845a9e7bf79156bbb8a2c26d77a1d2eJeffrey Yasskin  return Result;
506a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar}
507a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
5081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APFloat HandleFloatToFloatCast(QualType DestType, QualType SrcType,
5094ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                      APFloat &Value, const ASTContext &Ctx) {
510a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  bool ignored;
511a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  APFloat Result = Value;
5121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Result.convert(Ctx.getFloatTypeSemantics(DestType),
513a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                 APFloat::rmNearestTiesToEven, &ignored);
514a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  return Result;
515a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar}
516a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
5171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APSInt HandleIntToIntCast(QualType DestType, QualType SrcType,
5184ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                 APSInt &Value, const ASTContext &Ctx) {
519a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  unsigned DestWidth = Ctx.getIntWidth(DestType);
520a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  APSInt Result = Value;
521a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  // Figure out if this is a truncate, extend or noop cast.
522a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  // If the input is signed, do a sign extend, noop, or truncate.
5239f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad  Result = Result.extOrTrunc(DestWidth);
524575a1c9dc8dc5b4977194993e289f9eda7295c39Douglas Gregor  Result.setIsUnsigned(DestType->isUnsignedIntegerOrEnumerationType());
525a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  return Result;
526a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar}
527a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
5281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APFloat HandleIntToFloatCast(QualType DestType, QualType SrcType,
5294ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                    APSInt &Value, const ASTContext &Ctx) {
530a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
531a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  APFloat Result(Ctx.getFloatTypeSemantics(DestType), 1);
532a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  Result.convertFromAPInt(Value, Value.isSigned(),
533a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                          APFloat::rmNearestTiesToEven);
534a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  return Result;
535a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar}
536a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
53703f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith/// Try to evaluate the initializer for a variable declaration.
53847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smithstatic bool EvaluateVarDeclInit(EvalInfo &Info, const VarDecl *VD,
539177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith                                CallStackFrame *Frame, CCValue &Result) {
540d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  // If this is a parameter to an active constexpr function call, perform
541d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  // argument substitution.
542d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  if (const ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(VD)) {
543177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith    if (!Frame || !Frame->Arguments)
544177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith      return false;
545177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith    Result = Frame->Arguments[PVD->getFunctionScopeIndex()];
546177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith    return true;
547d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  }
54803f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith
54965ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith  // Never evaluate the initializer of a weak variable. We can't be sure that
55065ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith  // this is the definition which will be used.
55165ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith  if (IsWeakDecl(VD))
55265ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith    return false;
55365ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith
55403f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith  const Expr *Init = VD->getAnyInitializer();
555db1822c6de43ff4aa5fa00234bf8222f6f4816e8Richard Smith  if (!Init || Init->isValueDependent())
55647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    return false;
55703f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith
55847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  if (APValue *V = VD->getEvaluatedValue()) {
559177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith    Result = CCValue(*V, CCValue::GlobalValue());
56047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    return !Result.isUninit();
56147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  }
56203f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith
56303f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith  if (VD->isEvaluatingValue())
56447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    return false;
56503f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith
56603f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith  VD->setEvaluatingValue();
56703f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith
56847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  Expr::EvalStatus EStatus;
56947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  EvalInfo InitInfo(Info.Ctx, EStatus);
570c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  // FIXME: The caller will need to know whether the value was a constant
571c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  // expression. If not, we should propagate up a diagnostic.
57269c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith  APValue EvalResult;
57369c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith  if (!EvaluateConstantExpression(EvalResult, InitInfo, Init)) {
574cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    // FIXME: If the evaluation failure was not permanent (for instance, if we
575cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    // hit a variable with no declaration yet, or a constexpr function with no
576cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    // definition yet), the standard is unclear as to how we should behave.
577cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    //
578cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    // Either the initializer should be evaluated when the variable is defined,
579cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    // or a failed evaluation of the initializer should be reattempted each time
580cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    // it is used.
58103f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith    VD->setEvaluatedValue(APValue());
58247a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    return false;
58347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  }
58403f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith
58569c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith  VD->setEvaluatedValue(EvalResult);
58669c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith  Result = CCValue(EvalResult, CCValue::GlobalValue());
58747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  return true;
58803f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith}
58903f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith
590c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smithstatic bool IsConstNonVolatile(QualType T) {
59103f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith  Qualifiers Quals = T.getQualifiers();
59203f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith  return Quals.hasConst() && !Quals.hasVolatile();
59303f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith}
59403f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith
595cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith/// Extract the designated sub-object of an rvalue.
596cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smithstatic bool ExtractSubobject(EvalInfo &Info, CCValue &Obj, QualType ObjType,
597cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith                             const SubobjectDesignator &Sub, QualType SubType) {
598cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  if (Sub.Invalid || Sub.OnePastTheEnd)
599cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    return false;
600cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  if (Sub.Entries.empty()) {
601cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    assert(Info.Ctx.hasSameUnqualifiedType(ObjType, SubType) &&
602cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith           "Unexpected subobject type");
603cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    return true;
604cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  }
605cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith
606cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  assert(!Obj.isLValue() && "extracting subobject of lvalue");
607cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  const APValue *O = &Obj;
608cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  for (unsigned I = 0, N = Sub.Entries.size(); I != N; ++I) {
609cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    if (O->isUninit())
610cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith      return false;
611cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    if (ObjType->isArrayType()) {
612cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith      const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType(ObjType);
613cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith      if (!CAT)
614cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith        return false;
615cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith      uint64_t Index = Sub.Entries[I].ArrayIndex;
616cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith      if (CAT->getSize().ule(Index))
617cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith        return false;
618cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith      if (O->getArrayInitializedElts() > Index)
619cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith        O = &O->getArrayInitializedElt(Index);
620cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith      else
621cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith        O = &O->getArrayFiller();
622cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith      ObjType = CAT->getElementType();
623cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    } else {
624cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith      // FIXME: Support handling of subobjects of structs and unions. Also
625cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith      // for vector elements, if we want to support those?
626cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    }
627cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  }
628cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith
629cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  assert(Info.Ctx.hasSameUnqualifiedType(ObjType, SubType) &&
630cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith         "Unexpected subobject type");
631cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  Obj = CCValue(*O, CCValue::GlobalValue());
632cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  return true;
633cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith}
634cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith
635cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smithstatic bool HandleLValueToRValueConversion(EvalInfo &Info, QualType Type,
636cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith                                           const LValue &LVal, CCValue &RVal) {
637c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  const Expr *Base = LVal.Base;
638177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith  CallStackFrame *Frame = LVal.Frame;
639c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
640c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  // FIXME: Indirection through a null pointer deserves a diagnostic.
641c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  if (!Base)
642c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return false;
643c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
644625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith  if (const ValueDecl *D = GetLValueBaseDecl(LVal)) {
645c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    // In C++98, const, non-volatile integers initialized with ICEs are ICEs.
646c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    // In C++11, constexpr, non-volatile variables initialized with constant
647d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    // expressions are constant expressions too. Inside constexpr functions,
648d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    // parameters are constant expressions even if they're non-const.
649c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    // In C, such things can also be folded, although they are not ICEs.
650c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    //
651d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    // FIXME: volatile-qualified ParmVarDecls need special handling. A literal
652d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    // interpretation of C++11 suggests that volatile parameters are OK if
653d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    // they're never read (there's no prohibition against constructing volatile
654d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    // objects in constant expressions), but lvalue-to-rvalue conversions on
655d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    // them are not permitted.
656c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    const VarDecl *VD = dyn_cast<VarDecl>(D);
6570a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    QualType VT = VD->getType();
658cd689927139d3ab52c0c088521633c661bd2d807Richard Smith    if (!VD || VD->isInvalidDecl())
6590a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      return false;
6600a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    if (!isa<ParmVarDecl>(VD)) {
6610a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      if (!IsConstNonVolatile(VT))
6620a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith        return false;
663cd689927139d3ab52c0c088521633c661bd2d807Richard Smith      // FIXME: Allow folding of values of any literal type in all languages.
664cd689927139d3ab52c0c088521633c661bd2d807Richard Smith      if (!VT->isIntegralOrEnumerationType() && !VT->isRealFloatingType() &&
665cd689927139d3ab52c0c088521633c661bd2d807Richard Smith          !VD->isConstexpr())
6660a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith        return false;
6670a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    }
6680a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    if (!EvaluateVarDeclInit(Info, VD, Frame, RVal))
669c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith      return false;
670c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
67147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    if (isa<ParmVarDecl>(VD) || !VD->getAnyInitializer()->isLValue())
672cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith      return ExtractSubobject(Info, RVal, VT, LVal.Designator, Type);
673c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
674c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    // The declaration was initialized by an lvalue, with no lvalue-to-rvalue
675c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    // conversion. This happens when the declaration and the lvalue should be
676c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    // considered synonymous, for instance when initializing an array of char
677c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    // from a string literal. Continue as if the initializer lvalue was the
678c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    // value we were originally given.
6790a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    assert(RVal.getLValueOffset().isZero() &&
6800a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith           "offset for lvalue init of non-reference");
68147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    Base = RVal.getLValueBase();
682177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith    Frame = RVal.getLValueFrame();
683c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  }
684c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
6850a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith  // FIXME: Support PredefinedExpr, ObjCEncodeExpr, MakeStringConstant
6860a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith  if (const StringLiteral *S = dyn_cast<StringLiteral>(Base)) {
6870a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    const SubobjectDesignator &Designator = LVal.Designator;
6880a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    if (Designator.Invalid || Designator.Entries.size() != 1)
6890a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      return false;
6900a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith
6910a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    assert(Type->isIntegerType() && "string element not integer type");
6929a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith    uint64_t Index = Designator.Entries[0].ArrayIndex;
6930a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    if (Index > S->getLength())
6940a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      return false;
6950a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    APSInt Value(S->getCharByteWidth() * Info.Ctx.getCharWidth(),
6960a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith                 Type->isUnsignedIntegerType());
6970a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    if (Index < S->getLength())
6980a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      Value = S->getCodeUnit(Index);
6990a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    RVal = CCValue(Value);
7000a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    return true;
7010a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith  }
7020a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith
703177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith  if (Frame) {
704cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    // If this is a temporary expression with a nontrivial initializer, grab the
705cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    // value from the relevant stack frame.
706177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith    RVal = Frame->Temporaries[Base];
707cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  } else if (const CompoundLiteralExpr *CLE
708cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith             = dyn_cast<CompoundLiteralExpr>(Base)) {
709cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    // In C99, a CompoundLiteralExpr is an lvalue, and we defer evaluating the
710cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    // initializer until now for such expressions. Such an expression can't be
711cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    // an ICE in C, so this only matters for fold.
712c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    assert(!Info.getLangOpts().CPlusPlus && "lvalue compound literal in c++?");
713cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    if (!Evaluate(RVal, Info, CLE->getInitializer()))
714cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith      return false;
715cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  } else
716cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    return false;
717c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
718cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  return ExtractSubobject(Info, RVal, Base->getType(), LVal.Designator, Type);
719c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith}
720c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
721c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stumpnamespace {
722d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smithenum EvalStmtResult {
723d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  /// Evaluation failed.
724d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  ESR_Failed,
725d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  /// Hit a 'return' statement.
726d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  ESR_Returned,
727d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  /// Evaluation succeeded.
728d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  ESR_Succeeded
729d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith};
730d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith}
731d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
732d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith// Evaluate a statement.
73347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smithstatic EvalStmtResult EvaluateStmt(CCValue &Result, EvalInfo &Info,
734d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith                                   const Stmt *S) {
735d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  switch (S->getStmtClass()) {
736d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  default:
737d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    return ESR_Failed;
738d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
739d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  case Stmt::NullStmtClass:
740d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  case Stmt::DeclStmtClass:
741d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    return ESR_Succeeded;
742d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
743d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  case Stmt::ReturnStmtClass:
744d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    if (Evaluate(Result, Info, cast<ReturnStmt>(S)->getRetValue()))
745d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith      return ESR_Returned;
746d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    return ESR_Failed;
747d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
748d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  case Stmt::CompoundStmtClass: {
749d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    const CompoundStmt *CS = cast<CompoundStmt>(S);
750d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    for (CompoundStmt::const_body_iterator BI = CS->body_begin(),
751d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith           BE = CS->body_end(); BI != BE; ++BI) {
752d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith      EvalStmtResult ESR = EvaluateStmt(Result, Info, *BI);
753d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith      if (ESR != ESR_Succeeded)
754d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith        return ESR;
755d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    }
756d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    return ESR_Succeeded;
757d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  }
758d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  }
759d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith}
760d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
761d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith/// Evaluate a function call.
762d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smithstatic bool HandleFunctionCall(ArrayRef<const Expr*> Args, const Stmt *Body,
76347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith                               EvalInfo &Info, CCValue &Result) {
764d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  // FIXME: Implement a proper call limit, along with a command-line flag.
765d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  if (Info.NumCalls >= 1000000 || Info.CallStackDepth >= 512)
766d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    return false;
767d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
76847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  SmallVector<CCValue, 16> ArgValues(Args.size());
769d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  // FIXME: Deal with default arguments and 'this'.
770d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  for (ArrayRef<const Expr*>::iterator I = Args.begin(), E = Args.end();
771d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith       I != E; ++I)
772d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    if (!Evaluate(ArgValues[I - Args.begin()], Info, *I))
773d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith      return false;
774d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
775d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  CallStackFrame Frame(Info, ArgValues.data());
776d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  return EvaluateStmt(Result, Info, Body) == ESR_Returned;
777d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith}
778d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
779d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smithnamespace {
780770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass HasSideEffect
7818cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  : public ConstStmtVisitor<HasSideEffect, bool> {
7821e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith  const ASTContext &Ctx;
783c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stumppublic:
784c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump
7851e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith  HasSideEffect(const ASTContext &C) : Ctx(C) {}
786c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump
787c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  // Unhandled nodes conservatively default to having side effects.
7888cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitStmt(const Stmt *S) {
789c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump    return true;
790c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  }
791c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump
7928cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitParenExpr(const ParenExpr *E) { return Visit(E->getSubExpr()); }
7938cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitGenericSelectionExpr(const GenericSelectionExpr *E) {
794f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    return Visit(E->getResultExpr());
795f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  }
7968cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitDeclRefExpr(const DeclRefExpr *E) {
7971e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith    if (Ctx.getCanonicalType(E->getType()).isVolatileQualified())
798c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump      return true;
799c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump    return false;
800c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  }
801f85e193739c953358c865005855253af4f68a497John McCall  bool VisitObjCIvarRefExpr(const ObjCIvarRefExpr *E) {
8021e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith    if (Ctx.getCanonicalType(E->getType()).isVolatileQualified())
803f85e193739c953358c865005855253af4f68a497John McCall      return true;
804f85e193739c953358c865005855253af4f68a497John McCall    return false;
805f85e193739c953358c865005855253af4f68a497John McCall  }
806f85e193739c953358c865005855253af4f68a497John McCall  bool VisitBlockDeclRefExpr (const BlockDeclRefExpr *E) {
8071e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith    if (Ctx.getCanonicalType(E->getType()).isVolatileQualified())
808f85e193739c953358c865005855253af4f68a497John McCall      return true;
809f85e193739c953358c865005855253af4f68a497John McCall    return false;
810f85e193739c953358c865005855253af4f68a497John McCall  }
811f85e193739c953358c865005855253af4f68a497John McCall
812c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  // We don't want to evaluate BlockExprs multiple times, as they generate
813c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  // a ton of code.
8148cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitBlockExpr(const BlockExpr *E) { return true; }
8158cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitPredefinedExpr(const PredefinedExpr *E) { return false; }
8168cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitCompoundLiteralExpr(const CompoundLiteralExpr *E)
817c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump    { return Visit(E->getInitializer()); }
8188cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitMemberExpr(const MemberExpr *E) { return Visit(E->getBase()); }
8198cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitIntegerLiteral(const IntegerLiteral *E) { return false; }
8208cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitFloatingLiteral(const FloatingLiteral *E) { return false; }
8218cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitStringLiteral(const StringLiteral *E) { return false; }
8228cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitCharacterLiteral(const CharacterLiteral *E) { return false; }
8238cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *E)
824f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    { return false; }
8258cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitArraySubscriptExpr(const ArraySubscriptExpr *E)
826980ca220848d27ef55ef4c2d37423461a8ed0da3Mike Stump    { return Visit(E->getLHS()) || Visit(E->getRHS()); }
8278cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitChooseExpr(const ChooseExpr *E)
8281e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith    { return Visit(E->getChosenSubExpr(Ctx)); }
8298cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitCastExpr(const CastExpr *E) { return Visit(E->getSubExpr()); }
8308cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitBinAssign(const BinaryOperator *E) { return true; }
8318cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitCompoundAssignOperator(const BinaryOperator *E) { return true; }
8328cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitBinaryOperator(const BinaryOperator *E)
833980ca220848d27ef55ef4c2d37423461a8ed0da3Mike Stump  { return Visit(E->getLHS()) || Visit(E->getRHS()); }
8348cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitUnaryPreInc(const UnaryOperator *E) { return true; }
8358cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitUnaryPostInc(const UnaryOperator *E) { return true; }
8368cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitUnaryPreDec(const UnaryOperator *E) { return true; }
8378cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitUnaryPostDec(const UnaryOperator *E) { return true; }
8388cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitUnaryDeref(const UnaryOperator *E) {
8391e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith    if (Ctx.getCanonicalType(E->getType()).isVolatileQualified())
840c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump      return true;
841980ca220848d27ef55ef4c2d37423461a8ed0da3Mike Stump    return Visit(E->getSubExpr());
842c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump  }
8438cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitUnaryOperator(const UnaryOperator *E) { return Visit(E->getSubExpr()); }
844363ff23cfddb51abe4ee4212a6dd3c9b534fcc8bChris Lattner
845363ff23cfddb51abe4ee4212a6dd3c9b534fcc8bChris Lattner  // Has side effects if any element does.
8468cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitInitListExpr(const InitListExpr *E) {
847363ff23cfddb51abe4ee4212a6dd3c9b534fcc8bChris Lattner    for (unsigned i = 0, e = E->getNumInits(); i != e; ++i)
848363ff23cfddb51abe4ee4212a6dd3c9b534fcc8bChris Lattner      if (Visit(E->getInit(i))) return true;
8498cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    if (const Expr *filler = E->getArrayFiller())
8504423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis      return Visit(filler);
851363ff23cfddb51abe4ee4212a6dd3c9b534fcc8bChris Lattner    return false;
852363ff23cfddb51abe4ee4212a6dd3c9b534fcc8bChris Lattner  }
853ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor
8548cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitSizeOfPackExpr(const SizeOfPackExpr *) { return false; }
855c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump};
856c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump
85756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallclass OpaqueValueEvaluation {
85856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  EvalInfo &info;
85956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  OpaqueValueExpr *opaqueValue;
86056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
86156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallpublic:
86256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  OpaqueValueEvaluation(EvalInfo &info, OpaqueValueExpr *opaqueValue,
86356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                        Expr *value)
86456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    : info(info), opaqueValue(opaqueValue) {
86556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
86656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    // If evaluation fails, fail immediately.
8671e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith    if (!Evaluate(info.OpaqueValues[opaqueValue], info, value)) {
86856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      this->opaqueValue = 0;
86956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      return;
87056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    }
87156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  }
87256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
87356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  bool hasError() const { return opaqueValue == 0; }
87456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
87556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  ~OpaqueValueEvaluation() {
8761e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith    // FIXME: This will not work for recursive constexpr functions using opaque
8771e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith    // values. Restore the former value.
87856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    if (opaqueValue) info.OpaqueValues.erase(opaqueValue);
87956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  }
88056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall};
88156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
882c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump} // end anonymous namespace
883c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump
8844efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
8858cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne// Generic Evaluation
8868cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne//===----------------------------------------------------------------------===//
8878cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournenamespace {
8888cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
8898cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournetemplate <class Derived, typename RetTy=void>
8908cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourneclass ExprEvaluatorBase
8918cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  : public ConstStmtVisitor<Derived, RetTy> {
8928cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourneprivate:
89347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  RetTy DerivedSuccess(const CCValue &V, const Expr *E) {
8948cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    return static_cast<Derived*>(this)->Success(V, E);
8958cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  }
8968cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  RetTy DerivedError(const Expr *E) {
8978cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    return static_cast<Derived*>(this)->Error(E);
8988cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  }
899f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith  RetTy DerivedValueInitialization(const Expr *E) {
900f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith    return static_cast<Derived*>(this)->ValueInitialization(E);
901f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith  }
9028cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
9038cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourneprotected:
9048cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  EvalInfo &Info;
9058cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  typedef ConstStmtVisitor<Derived, RetTy> StmtVisitorTy;
9068cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  typedef ExprEvaluatorBase ExprEvaluatorBaseTy;
9078cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
908f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith  RetTy ValueInitialization(const Expr *E) { return DerivedError(E); }
909f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith
910177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith  bool MakeTemporary(const Expr *Key, const Expr *Value, LValue &Result) {
911177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith    if (!Evaluate(Info.CurrentCall->Temporaries[Key], Info, Value))
912177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith      return false;
9130a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    Result.setExpr(Key, Info.CurrentCall);
914177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith    return true;
915177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith  }
9168cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournepublic:
9178cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  ExprEvaluatorBase(EvalInfo &Info) : Info(Info) {}
9188cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
9198cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  RetTy VisitStmt(const Stmt *) {
920b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("Expression evaluator should not be called on stmts");
9218cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  }
9228cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  RetTy VisitExpr(const Expr *E) {
9238cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    return DerivedError(E);
9248cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  }
9258cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
9268cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  RetTy VisitParenExpr(const ParenExpr *E)
9278cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    { return StmtVisitorTy::Visit(E->getSubExpr()); }
9288cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  RetTy VisitUnaryExtension(const UnaryOperator *E)
9298cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    { return StmtVisitorTy::Visit(E->getSubExpr()); }
9308cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  RetTy VisitUnaryPlus(const UnaryOperator *E)
9318cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    { return StmtVisitorTy::Visit(E->getSubExpr()); }
9328cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  RetTy VisitChooseExpr(const ChooseExpr *E)
9338cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    { return StmtVisitorTy::Visit(E->getChosenSubExpr(Info.Ctx)); }
9348cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  RetTy VisitGenericSelectionExpr(const GenericSelectionExpr *E)
9358cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    { return StmtVisitorTy::Visit(E->getResultExpr()); }
93691a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall  RetTy VisitSubstNonTypeTemplateParmExpr(const SubstNonTypeTemplateParmExpr *E)
93791a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall    { return StmtVisitorTy::Visit(E->getReplacement()); }
9383d75ca836205856077c18e30e9447accbd85f751Richard Smith  RetTy VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *E)
9393d75ca836205856077c18e30e9447accbd85f751Richard Smith    { return StmtVisitorTy::Visit(E->getExpr()); }
9408cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
9418cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  RetTy VisitBinaryConditionalOperator(const BinaryConditionalOperator *E) {
9428cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    OpaqueValueEvaluation opaque(Info, E->getOpaqueValue(), E->getCommon());
9438cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    if (opaque.hasError())
9448cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne      return DerivedError(E);
9458cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
9468cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    bool cond;
947c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    if (!EvaluateAsBooleanCondition(E->getCond(), cond, Info))
9488cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne      return DerivedError(E);
9498cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
9508cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    return StmtVisitorTy::Visit(cond ? E->getTrueExpr() : E->getFalseExpr());
9518cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  }
9528cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
9538cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  RetTy VisitConditionalOperator(const ConditionalOperator *E) {
9548cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    bool BoolResult;
955c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    if (!EvaluateAsBooleanCondition(E->getCond(), BoolResult, Info))
9568cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne      return DerivedError(E);
9578cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
958c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    Expr *EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr();
9598cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    return StmtVisitorTy::Visit(EvalExpr);
9608cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  }
9618cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
9628cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  RetTy VisitOpaqueValueExpr(const OpaqueValueExpr *E) {
96347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    const CCValue *Value = Info.getOpaqueValue(E);
96447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    if (!Value)
9658cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne      return (E->getSourceExpr() ? StmtVisitorTy::Visit(E->getSourceExpr())
9668cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne                                 : DerivedError(E));
96747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    return DerivedSuccess(*Value, E);
9688cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  }
969f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith
970d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  RetTy VisitCallExpr(const CallExpr *E) {
971d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    const Expr *Callee = E->getCallee();
972d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    QualType CalleeType = Callee->getType();
973d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
974d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    // FIXME: Handle the case where Callee is a (parenthesized) MemberExpr for a
975d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    // non-static member function.
976d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    if (CalleeType->isSpecificBuiltinType(BuiltinType::BoundMember))
977d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith      return DerivedError(E);
978d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
979d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    if (!CalleeType->isFunctionType() && !CalleeType->isFunctionPointerType())
980d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith      return DerivedError(E);
981d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
98247a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    CCValue Call;
983d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    if (!Evaluate(Call, Info, Callee) || !Call.isLValue() ||
984d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith        !Call.getLValueBase() || !Call.getLValueOffset().isZero())
985d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith      return DerivedError(Callee);
986d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
987d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    const FunctionDecl *FD = 0;
988d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Call.getLValueBase()))
989d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith      FD = dyn_cast<FunctionDecl>(DRE->getDecl());
990d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    else if (const MemberExpr *ME = dyn_cast<MemberExpr>(Call.getLValueBase()))
991d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith      FD = dyn_cast<FunctionDecl>(ME->getMemberDecl());
992d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    if (!FD)
993d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith      return DerivedError(Callee);
994d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
995d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    // Don't call function pointers which have been cast to some other type.
996d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    if (!Info.Ctx.hasSameType(CalleeType->getPointeeType(), FD->getType()))
997d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith      return DerivedError(E);
998d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
999d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    const FunctionDecl *Definition;
1000d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    Stmt *Body = FD->getBody(Definition);
100169c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith    CCValue CCResult;
100269c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith    APValue Result;
1003d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    llvm::ArrayRef<const Expr*> Args(E->getArgs(), E->getNumArgs());
1004d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
1005d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    if (Body && Definition->isConstexpr() && !Definition->isInvalidDecl() &&
100669c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith        HandleFunctionCall(Args, Body, Info, CCResult) &&
100769c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith        CheckConstantExpression(CCResult, Result))
100869c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith      return DerivedSuccess(CCValue(Result, CCValue::GlobalValue()), E);
1009d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
1010d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    return DerivedError(E);
1011d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  }
1012d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
1013c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  RetTy VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) {
1014c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return StmtVisitorTy::Visit(E->getInitializer());
1015c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  }
1016f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith  RetTy VisitInitListExpr(const InitListExpr *E) {
1017f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith    if (Info.getLangOpts().CPlusPlus0x) {
1018f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith      if (E->getNumInits() == 0)
1019f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith        return DerivedValueInitialization(E);
1020f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith      if (E->getNumInits() == 1)
1021f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith        return StmtVisitorTy::Visit(E->getInit(0));
1022f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith    }
1023f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith    return DerivedError(E);
1024f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith  }
1025f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith  RetTy VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) {
1026f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith    return DerivedValueInitialization(E);
1027f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith  }
1028f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith  RetTy VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr *E) {
1029f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith    return DerivedValueInitialization(E);
1030f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith  }
1031f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith
1032c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  RetTy VisitCastExpr(const CastExpr *E) {
1033c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    switch (E->getCastKind()) {
1034c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    default:
1035c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith      break;
1036c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
1037c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    case CK_NoOp:
1038c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith      return StmtVisitorTy::Visit(E->getSubExpr());
1039c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
1040c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    case CK_LValueToRValue: {
1041c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith      LValue LVal;
1042c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith      if (EvaluateLValue(E->getSubExpr(), LVal, Info)) {
104347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith        CCValue RVal;
1044c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith        if (HandleLValueToRValueConversion(Info, E->getType(), LVal, RVal))
1045c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith          return DerivedSuccess(RVal, E);
1046c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith      }
1047c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith      break;
1048c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    }
1049c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    }
1050c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
1051c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return DerivedError(E);
1052c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  }
1053c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
10548327fad71da34492d82c532f42a58cb4baff81a3Richard Smith  /// Visit a value which is evaluated, but whose value is ignored.
10558327fad71da34492d82c532f42a58cb4baff81a3Richard Smith  void VisitIgnoredValue(const Expr *E) {
105647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    CCValue Scratch;
10578327fad71da34492d82c532f42a58cb4baff81a3Richard Smith    if (!Evaluate(Scratch, Info, E))
10588327fad71da34492d82c532f42a58cb4baff81a3Richard Smith      Info.EvalStatus.HasSideEffects = true;
10598327fad71da34492d82c532f42a58cb4baff81a3Richard Smith  }
10608cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne};
10618cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
10628cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne}
10638cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
10648cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne//===----------------------------------------------------------------------===//
10654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// LValue Evaluation
1066c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith//
1067c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// This is used for evaluating lvalues (in C and C++), xvalues (in C++11),
1068c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// function designators (in C), decl references to void objects (in C), and
1069c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// temporaries (if building with -Wno-address-of-temporary).
1070c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith//
1071c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// LValue evaluation produces values comprising a base expression of one of the
1072c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// following types:
1073c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith//  * DeclRefExpr
1074c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith//  * MemberExpr for a static member
1075c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith//  * CompoundLiteralExpr in C
1076c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith//  * StringLiteral
1077c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith//  * PredefinedExpr
1078c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith//  * ObjCEncodeExpr
1079c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith//  * AddrLabelExpr
1080c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith//  * BlockExpr
1081c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith//  * CallExpr for a MakeStringConstant builtin
1082177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith// plus an offset in bytes. It can also produce lvalues referring to locals. In
1083177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith// that case, the Frame will point to a stack frame, and the Expr is used as a
1084177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith// key to find the relevant temporary's value.
10854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
10864efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmannamespace {
1087770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass LValueExprEvaluator
10888cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  : public ExprEvaluatorBase<LValueExprEvaluator, bool> {
1089efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  LValue &Result;
10900124839d7fb3d846795190ba2ccf3951f27784feChandler Carruth  const Decl *PrevDecl;
1091efdb83e26f9a1fd2566afe54461216cd84814d42John McCall
10928cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool Success(const Expr *E) {
10930a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    Result.setExpr(E);
1094efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    return true;
1095efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  }
10964efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanpublic:
10971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1098efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  LValueExprEvaluator(EvalInfo &info, LValue &Result) :
10990124839d7fb3d846795190ba2ccf3951f27784feChandler Carruth    ExprEvaluatorBaseTy(info), Result(Result), PrevDecl(0) {}
11004efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
110147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  bool Success(const CCValue &V, const Expr *E) {
11028cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    Result.setFrom(V);
11038cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    return true;
11048cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  }
11058cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool Error(const Expr *E) {
1106efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    return false;
11074efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
11088ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
1109c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  bool VisitVarDecl(const Expr *E, const VarDecl *VD);
1110c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
11118cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitDeclRefExpr(const DeclRefExpr *E);
11128cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitPredefinedExpr(const PredefinedExpr *E) { return Success(E); }
1113bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith  bool VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *E);
11148cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitCompoundLiteralExpr(const CompoundLiteralExpr *E);
11158cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitMemberExpr(const MemberExpr *E);
11168cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitStringLiteral(const StringLiteral *E) { return Success(E); }
11178cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitObjCEncodeExpr(const ObjCEncodeExpr *E) { return Success(E); }
11188cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitArraySubscriptExpr(const ArraySubscriptExpr *E);
11198cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitUnaryDeref(const UnaryOperator *E);
11208cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
11218cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitCastExpr(const CastExpr *E) {
112226bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson    switch (E->getCastKind()) {
112326bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson    default:
1124c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith      return ExprEvaluatorBaseTy::VisitCastExpr(E);
112526bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson
1126db924224b51b153f24fbe492102d4edebcbbb7f4Eli Friedman    case CK_LValueBitCast:
11270a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      if (!Visit(E->getSubExpr()))
11280a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith        return false;
11290a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      Result.Designator.setInvalid();
11300a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      return true;
1131db924224b51b153f24fbe492102d4edebcbbb7f4Eli Friedman
1132c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    // FIXME: Support CK_DerivedToBase and CK_UncheckedDerivedToBase.
1133c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    // Reuse PointerExprEvaluator::VisitCastExpr for these.
113426bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson    }
113526bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson  }
1136cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl
1137ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  // FIXME: Missing: __real__, __imag__
11388cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
11394efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman};
11404efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} // end anonymous namespace
11414efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1142c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// Evaluate an expression as an lvalue. This can be legitimately called on
1143c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// expressions which are not glvalues, in a few cases:
1144c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith///  * function designators in C,
1145c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith///  * "extern void" objects,
1146c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith///  * temporaries, if building with -Wno-address-of-temporary.
1147efdb83e26f9a1fd2566afe54461216cd84814d42John McCallstatic bool EvaluateLValue(const Expr* E, LValue& Result, EvalInfo &Info) {
1148c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  assert((E->isGLValue() || E->getType()->isFunctionType() ||
1149c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith          E->getType()->isVoidType() || isa<CXXTemporaryObjectExpr>(E)) &&
1150c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith         "can't evaluate expression as an lvalue");
11518cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  return LValueExprEvaluator(Info, Result).Visit(E);
11524efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
11534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
11548cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool LValueExprEvaluator::VisitDeclRefExpr(const DeclRefExpr *E) {
1155c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  if (isa<FunctionDecl>(E->getDecl()))
1156efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    return Success(E);
1157c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  if (const VarDecl* VD = dyn_cast<VarDecl>(E->getDecl()))
1158c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return VisitVarDecl(E, VD);
1159c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  return Error(E);
1160c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith}
1161436c8898cd1c93c5bacd3fcc4ac586bc5cd77062Richard Smith
1162c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smithbool LValueExprEvaluator::VisitVarDecl(const Expr *E, const VarDecl *VD) {
1163177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith  if (!VD->getType()->isReferenceType()) {
1164177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith    if (isa<ParmVarDecl>(VD)) {
11650a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      Result.setExpr(E, Info.CurrentCall);
1166177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith      return true;
1167177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith    }
1168c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return Success(E);
1169177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith  }
117050c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman
117147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  CCValue V;
1172177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith  if (EvaluateVarDeclInit(Info, VD, Info.CurrentCall, V))
117347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    return Success(V, E);
1174c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
1175c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  return Error(E);
117635873c49adad211ff466e34342a52665742794f5Anders Carlsson}
117735873c49adad211ff466e34342a52665742794f5Anders Carlsson
1178bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smithbool LValueExprEvaluator::VisitMaterializeTemporaryExpr(
1179bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    const MaterializeTemporaryExpr *E) {
1180177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith  return MakeTemporary(E, E->GetTemporaryExpr(), Result);
1181bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith}
1182bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith
11838cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool
11848cad3046be06ea73ff8892d947697a21d7a440d3Peter CollingbourneLValueExprEvaluator::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) {
1185c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  assert(!Info.getLangOpts().CPlusPlus && "lvalue compound literal in c++?");
1186c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  // Defer visiting the literal until the lvalue-to-rvalue conversion. We can
1187c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  // only see this when folding in C, so there's no standard to follow here.
1188efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  return Success(E);
11894efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
11904efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
11918cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool LValueExprEvaluator::VisitMemberExpr(const MemberExpr *E) {
1192c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  // Handle static data members.
1193c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  if (const VarDecl *VD = dyn_cast<VarDecl>(E->getMemberDecl())) {
1194c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    VisitIgnoredValue(E->getBase());
1195c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return VisitVarDecl(E, VD);
1196c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  }
1197c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
1198d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  // Handle static member functions.
1199d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(E->getMemberDecl())) {
1200d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    if (MD->isStatic()) {
1201d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith      VisitIgnoredValue(E->getBase());
1202d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith      return Success(E);
1203d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    }
1204d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  }
1205d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
12064efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  QualType Ty;
12074efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (E->isArrow()) {
1208efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    if (!EvaluatePointer(E->getBase(), Result, Info))
1209efdb83e26f9a1fd2566afe54461216cd84814d42John McCall      return false;
12106217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek    Ty = E->getBase()->getType()->getAs<PointerType>()->getPointeeType();
12114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  } else {
1212efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    if (!Visit(E->getBase()))
1213efdb83e26f9a1fd2566afe54461216cd84814d42John McCall      return false;
12144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Ty = E->getBase()->getType();
12154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
12164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
12178cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  const RecordDecl *RD = Ty->getAs<RecordType>()->getDecl();
12184efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD);
121986f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor
12208cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  const FieldDecl *FD = dyn_cast<FieldDecl>(E->getMemberDecl());
122186f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor  if (!FD) // FIXME: deal with other kinds of member expressions
1222efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    return false;
12232be586108bb401019647791feca19ea03fd477ceEli Friedman
12242be586108bb401019647791feca19ea03fd477ceEli Friedman  if (FD->getType()->isReferenceType())
1225efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    return false;
12262be586108bb401019647791feca19ea03fd477ceEli Friedman
122782905749d5c8d8b4edec11de754a73349cb96603Eli Friedman  unsigned i = FD->getFieldIndex();
1228fb1e3bc29b667f4275e1d5a43d64ec173f4f9a7dKen Dyck  Result.Offset += Info.Ctx.toCharUnitsFromBits(RL.getFieldOffset(i));
12290a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith  Result.Designator.addDecl(FD);
1230efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  return true;
12314efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
12324efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
12338cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool LValueExprEvaluator::VisitArraySubscriptExpr(const ArraySubscriptExpr *E) {
1234c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  // FIXME: Deal with vectors as array subscript bases.
1235c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  if (E->getBase()->getType()->isVectorType())
1236c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return false;
1237c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
12383068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  if (!EvaluatePointer(E->getBase(), Result, Info))
1239efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    return false;
12401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12413068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  APSInt Index;
12423068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  if (!EvaluateInteger(E->getIdx(), Index, Info))
1243efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    return false;
12440a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith  uint64_t IndexValue
12450a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    = Index.isSigned() ? static_cast<uint64_t>(Index.getSExtValue())
12460a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith                       : Index.getZExtValue();
12473068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
1248199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  CharUnits ElementSize = Info.Ctx.getTypeSizeInChars(E->getType());
12490a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith  Result.Offset += IndexValue * ElementSize;
12500a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith  Result.Designator.adjustIndex(IndexValue);
1251efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  return true;
12523068d117951a8df54bae9db039b56201ab10962bAnders Carlsson}
12534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
12548cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool LValueExprEvaluator::VisitUnaryDeref(const UnaryOperator *E) {
1255efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  return EvaluatePointer(E->getSubExpr(), Result, Info);
1256e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman}
1257e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman
12584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
1259f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Pointer Evaluation
1260f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
1261f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
1262c754aa62643e66ab967ca32ae8b0b3fc419bba25Anders Carlssonnamespace {
1263770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass PointerExprEvaluator
12648cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  : public ExprEvaluatorBase<PointerExprEvaluator, bool> {
1265efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  LValue &Result;
1266efdb83e26f9a1fd2566afe54461216cd84814d42John McCall
12678cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool Success(const Expr *E) {
12680a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    Result.setExpr(E);
1269efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    return true;
1270efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  }
12712bad1687fe6f00e10767a691a33b070b151902b6Anders Carlssonpublic:
12721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1273efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  PointerExprEvaluator(EvalInfo &info, LValue &Result)
12748cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    : ExprEvaluatorBaseTy(info), Result(Result) {}
1275f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
127647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  bool Success(const CCValue &V, const Expr *E) {
12778cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    Result.setFrom(V);
12788cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    return true;
12792bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  }
12808cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool Error(const Stmt *S) {
12818cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    return false;
1282f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  }
1283f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith  bool ValueInitialization(const Expr *E) {
1284f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith    return Success((Expr*)0);
1285f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith  }
12862bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
1287efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  bool VisitBinaryOperator(const BinaryOperator *E);
12888cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitCastExpr(const CastExpr* E);
1289efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  bool VisitUnaryAddrOf(const UnaryOperator *E);
12908cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitObjCStringLiteral(const ObjCStringLiteral *E)
1291efdb83e26f9a1fd2566afe54461216cd84814d42John McCall      { return Success(E); }
12928cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitAddrLabelExpr(const AddrLabelExpr *E)
1293efdb83e26f9a1fd2566afe54461216cd84814d42John McCall      { return Success(E); }
12948cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitCallExpr(const CallExpr *E);
12958cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitBlockExpr(const BlockExpr *E) {
1296469a1eb996e1cb0be54f9b210f836afbddcbb2ccJohn McCall    if (!E->getBlockDecl()->hasCaptures())
1297efdb83e26f9a1fd2566afe54461216cd84814d42John McCall      return Success(E);
1298efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    return false;
1299b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump  }
13008cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitCXXNullPtrLiteralExpr(const CXXNullPtrLiteralExpr *E)
1301f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith      { return ValueInitialization(E); }
130256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
1303ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  // FIXME: Missing: @protocol, @selector
13042bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson};
1305f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace
13062bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
1307efdb83e26f9a1fd2566afe54461216cd84814d42John McCallstatic bool EvaluatePointer(const Expr* E, LValue& Result, EvalInfo &Info) {
1308c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  assert(E->isRValue() && E->getType()->hasPointerRepresentation());
13098cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  return PointerExprEvaluator(Info, Result).Visit(E);
1310f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner}
1311650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
1312efdb83e26f9a1fd2566afe54461216cd84814d42John McCallbool PointerExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
13132de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  if (E->getOpcode() != BO_Add &&
13142de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      E->getOpcode() != BO_Sub)
1315efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    return false;
13161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1317650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  const Expr *PExp = E->getLHS();
1318650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  const Expr *IExp = E->getRHS();
1319650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  if (IExp->getType()->isPointerType())
1320f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner    std::swap(PExp, IExp);
13211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1322efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  if (!EvaluatePointer(PExp, Result, Info))
1323efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    return false;
13241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1325efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  llvm::APSInt Offset;
1326efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  if (!EvaluateInteger(IExp, Offset, Info))
1327efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    return false;
1328efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  int64_t AdditionalOffset
1329efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    = Offset.isSigned() ? Offset.getSExtValue()
1330efdb83e26f9a1fd2566afe54461216cd84814d42John McCall                        : static_cast<int64_t>(Offset.getZExtValue());
13310a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith  if (E->getOpcode() == BO_Sub)
13320a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    AdditionalOffset = -AdditionalOffset;
1333650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
1334e0cdb4edd8f265d0fd22d178d03c597dd201cda2Daniel Dunbar  // Compute the new offset in the appropriate width.
1335e0cdb4edd8f265d0fd22d178d03c597dd201cda2Daniel Dunbar  QualType PointeeType =
1336e0cdb4edd8f265d0fd22d178d03c597dd201cda2Daniel Dunbar    PExp->getType()->getAs<PointerType>()->getPointeeType();
1337efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  CharUnits SizeOfPointee;
13381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13394d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson  // Explicitly handle GNU void* and function pointer arithmetic extensions.
13404d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson  if (PointeeType->isVoidType() || PointeeType->isFunctionType())
1341efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    SizeOfPointee = CharUnits::One();
13424d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson  else
1343efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    SizeOfPointee = Info.Ctx.getTypeSizeInChars(PointeeType);
13444efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
13450a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith  Result.Offset += AdditionalOffset * SizeOfPointee;
13460a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith  Result.Designator.adjustIndex(AdditionalOffset);
1347efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  return true;
1348650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson}
13494efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1350efdb83e26f9a1fd2566afe54461216cd84814d42John McCallbool PointerExprEvaluator::VisitUnaryAddrOf(const UnaryOperator *E) {
1351efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  return EvaluateLValue(E->getSubExpr(), Result, Info);
13524efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
13531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1354650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
13558cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool PointerExprEvaluator::VisitCastExpr(const CastExpr* E) {
13568cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  const Expr* SubExpr = E->getSubExpr();
1357650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
135809a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman  switch (E->getCastKind()) {
135909a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman  default:
136009a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman    break;
136109a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman
13622de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_BitCast:
13631d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall  case CK_CPointerToObjCPointerCast:
13641d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall  case CK_BlockPointerToObjCPointerCast:
13652de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_AnyPointerToBlockPointerCast:
13660a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    if (!Visit(SubExpr))
13670a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      return false;
13680a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    Result.Designator.setInvalid();
13690a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    return true;
137009a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman
13715c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson  case CK_DerivedToBase:
13725c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson  case CK_UncheckedDerivedToBase: {
137347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    if (!EvaluatePointer(E->getSubExpr(), Result, Info))
13745c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson      return false;
13755c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson
13765c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson    // Now figure out the necessary offset to add to the baseLV to get from
13775c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson    // the derived class to the base class.
13785c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson    QualType Ty = E->getSubExpr()->getType();
13795c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson    const CXXRecordDecl *DerivedDecl =
13805c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson      Ty->getAs<PointerType>()->getPointeeType()->getAsCXXRecordDecl();
13815c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson
13825c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson    for (CastExpr::path_const_iterator PathI = E->path_begin(),
13835c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson         PathE = E->path_end(); PathI != PathE; ++PathI) {
13845c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson      const CXXBaseSpecifier *Base = *PathI;
13855c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson
13865c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson      // FIXME: If the base is virtual, we'd need to determine the type of the
13875c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson      // most derived class and we don't support that right now.
13885c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson      if (Base->isVirtual())
13895c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson        return false;
13905c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson
13915c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson      const CXXRecordDecl *BaseDecl = Base->getType()->getAsCXXRecordDecl();
13925c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson      const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(DerivedDecl);
13935c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson
139447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith      Result.getLValueOffset() += Layout.getBaseClassOffset(BaseDecl);
13955c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson      DerivedDecl = BaseDecl;
13965c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson    }
13975c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson
13980a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    // FIXME
13990a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    Result.Designator.setInvalid();
14000a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith
14015c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson    return true;
14025c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson  }
14035c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson
140447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  case CK_NullToPointer:
140547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    return ValueInitialization(E);
1406404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall
14072de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_IntegralToPointer: {
140847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    CCValue Value;
1409efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    if (!EvaluateIntegerOrLValue(SubExpr, Value, Info))
141009a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman      break;
141169ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar
1412efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    if (Value.isInt()) {
141347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith      unsigned Size = Info.Ctx.getTypeSize(E->getType());
141447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith      uint64_t N = Value.getInt().extOrTrunc(Size).getZExtValue();
1415efdb83e26f9a1fd2566afe54461216cd84814d42John McCall      Result.Base = 0;
141647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith      Result.Offset = CharUnits::fromQuantity(N);
1417177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith      Result.Frame = 0;
14180a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      Result.Designator.setInvalid();
1419efdb83e26f9a1fd2566afe54461216cd84814d42John McCall      return true;
1420efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    } else {
1421efdb83e26f9a1fd2566afe54461216cd84814d42John McCall      // Cast is of an lvalue, no need to change value.
142247a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith      Result.setFrom(Value);
1423efdb83e26f9a1fd2566afe54461216cd84814d42John McCall      return true;
1424650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    }
1425650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  }
14262de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_ArrayToPointerDecay:
14276a7c94af983717e2c2d6aebe42cb4737c1c7b9e6Richard Smith    // FIXME: Support array-to-pointer decay on array rvalues.
14286a7c94af983717e2c2d6aebe42cb4737c1c7b9e6Richard Smith    if (!SubExpr->isGLValue())
14296a7c94af983717e2c2d6aebe42cb4737c1c7b9e6Richard Smith      return Error(E);
14300a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    if (!EvaluateLValue(SubExpr, Result, Info))
14310a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      return false;
14320a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    // The result is a pointer to the first element of the array.
14330a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    Result.Designator.addIndex(0);
14340a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    return true;
14356a7c94af983717e2c2d6aebe42cb4737c1c7b9e6Richard Smith
14362de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_FunctionToPointerDecay:
14376a7c94af983717e2c2d6aebe42cb4737c1c7b9e6Richard Smith    return EvaluateLValue(SubExpr, Result, Info);
14384efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
14394efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1440c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  return ExprEvaluatorBaseTy::VisitCastExpr(E);
14411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
1442650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
14438cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool PointerExprEvaluator::VisitCallExpr(const CallExpr *E) {
14441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (E->isBuiltinCall(Info.Ctx) ==
14450d13f6fdbdd6f06e2449b8834dda53334abd399aDavid Chisnall        Builtin::BI__builtin___CFStringMakeConstantString ||
14460d13f6fdbdd6f06e2449b8834dda53334abd399aDavid Chisnall      E->isBuiltinCall(Info.Ctx) ==
14470d13f6fdbdd6f06e2449b8834dda53334abd399aDavid Chisnall        Builtin::BI__builtin___NSStringMakeConstantString)
1448efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    return Success(E);
144956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
14508cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  return ExprEvaluatorBaseTy::VisitCallExpr(E);
14514efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
1452f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
1453f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
145459b5da6d853b4368b984700315adf7b37de05764Nate Begeman// Vector Evaluation
145559b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===//
145659b5da6d853b4368b984700315adf7b37de05764Nate Begeman
145759b5da6d853b4368b984700315adf7b37de05764Nate Begemannamespace {
1458770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramer  class VectorExprEvaluator
145907fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith  : public ExprEvaluatorBase<VectorExprEvaluator, bool> {
146007fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    APValue &Result;
146159b5da6d853b4368b984700315adf7b37de05764Nate Begeman  public:
14621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
146307fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    VectorExprEvaluator(EvalInfo &info, APValue &Result)
146407fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith      : ExprEvaluatorBaseTy(info), Result(Result) {}
14651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
146607fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    bool Success(const ArrayRef<APValue> &V, const Expr *E) {
146707fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith      assert(V.size() == E->getType()->castAs<VectorType>()->getNumElements());
146807fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith      // FIXME: remove this APValue copy.
146907fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith      Result = APValue(V.data(), V.size());
147007fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith      return true;
147107fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    }
147269c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith    bool Success(const CCValue &V, const Expr *E) {
147369c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith      assert(V.isVector());
147407fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith      Result = V;
147507fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith      return true;
147607fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    }
147707fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    bool Error(const Expr *E) { return false; }
147807fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    bool ValueInitialization(const Expr *E);
14791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
148007fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    bool VisitUnaryReal(const UnaryOperator *E)
148191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      { return Visit(E->getSubExpr()); }
148207fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    bool VisitCastExpr(const CastExpr* E);
148307fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    bool VisitInitListExpr(const InitListExpr *E);
148407fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    bool VisitUnaryImag(const UnaryOperator *E);
148591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    // FIXME: Missing: unary -, unary ~, binary add/sub/mul/div,
14862217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman    //                 binary comparisons, binary and/or/xor,
148791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    //                 shufflevector, ExtVectorElementExpr
148891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    //        (Note that these require implementing conversions
148991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    //         between vector types.)
149059b5da6d853b4368b984700315adf7b37de05764Nate Begeman  };
149159b5da6d853b4368b984700315adf7b37de05764Nate Begeman} // end anonymous namespace
149259b5da6d853b4368b984700315adf7b37de05764Nate Begeman
149359b5da6d853b4368b984700315adf7b37de05764Nate Begemanstatic bool EvaluateVector(const Expr* E, APValue& Result, EvalInfo &Info) {
1494c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  assert(E->isRValue() && E->getType()->isVectorType() &&"not a vector rvalue");
149507fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith  return VectorExprEvaluator(Info, Result).Visit(E);
149659b5da6d853b4368b984700315adf7b37de05764Nate Begeman}
149759b5da6d853b4368b984700315adf7b37de05764Nate Begeman
149807fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smithbool VectorExprEvaluator::VisitCastExpr(const CastExpr* E) {
149907fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith  const VectorType *VTy = E->getType()->castAs<VectorType>();
1500c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  QualType EltTy = VTy->getElementType();
1501c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  unsigned NElts = VTy->getNumElements();
1502c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  unsigned EltWidth = Info.Ctx.getTypeSize(EltTy);
15031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
150459b5da6d853b4368b984700315adf7b37de05764Nate Begeman  const Expr* SE = E->getSubExpr();
1505e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman  QualType SETy = SE->getType();
150659b5da6d853b4368b984700315adf7b37de05764Nate Begeman
150746a523285928aa07bf14803178dc04616ac85994Eli Friedman  switch (E->getCastKind()) {
150846a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_VectorSplat: {
150907fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    APValue Val = APValue();
151046a523285928aa07bf14803178dc04616ac85994Eli Friedman    if (SETy->isIntegerType()) {
151146a523285928aa07bf14803178dc04616ac85994Eli Friedman      APSInt IntResult;
151246a523285928aa07bf14803178dc04616ac85994Eli Friedman      if (!EvaluateInteger(SE, IntResult, Info))
151307fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith         return Error(E);
151407fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith      Val = APValue(IntResult);
151546a523285928aa07bf14803178dc04616ac85994Eli Friedman    } else if (SETy->isRealFloatingType()) {
151646a523285928aa07bf14803178dc04616ac85994Eli Friedman       APFloat F(0.0);
151746a523285928aa07bf14803178dc04616ac85994Eli Friedman       if (!EvaluateFloat(SE, F, Info))
151807fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith         return Error(E);
151907fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith       Val = APValue(F);
152046a523285928aa07bf14803178dc04616ac85994Eli Friedman    } else {
152107fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith      return Error(E);
152246a523285928aa07bf14803178dc04616ac85994Eli Friedman    }
1523c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman
1524c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    // Splat and create vector APValue.
152507fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    SmallVector<APValue, 4> Elts(NElts, Val);
152607fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    return Success(Elts, E);
1527e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman  }
152846a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_BitCast: {
152907fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    // FIXME: this is wrong for any cast other than a no-op cast.
153046a523285928aa07bf14803178dc04616ac85994Eli Friedman    if (SETy->isVectorType())
15318cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne      return Visit(SE);
1532c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman
153346a523285928aa07bf14803178dc04616ac85994Eli Friedman    if (!SETy->isIntegerType())
153407fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith      return Error(E);
15351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
153646a523285928aa07bf14803178dc04616ac85994Eli Friedman    APSInt Init;
153746a523285928aa07bf14803178dc04616ac85994Eli Friedman    if (!EvaluateInteger(SE, Init, Info))
153807fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith      return Error(E);
1539c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman
154046a523285928aa07bf14803178dc04616ac85994Eli Friedman    assert((EltTy->isIntegerType() || EltTy->isRealFloatingType()) &&
154146a523285928aa07bf14803178dc04616ac85994Eli Friedman           "Vectors must be composed of ints or floats");
154246a523285928aa07bf14803178dc04616ac85994Eli Friedman
15435f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    SmallVector<APValue, 4> Elts;
154446a523285928aa07bf14803178dc04616ac85994Eli Friedman    for (unsigned i = 0; i != NElts; ++i) {
154546a523285928aa07bf14803178dc04616ac85994Eli Friedman      APSInt Tmp = Init.extOrTrunc(EltWidth);
154646a523285928aa07bf14803178dc04616ac85994Eli Friedman
154746a523285928aa07bf14803178dc04616ac85994Eli Friedman      if (EltTy->isIntegerType())
154846a523285928aa07bf14803178dc04616ac85994Eli Friedman        Elts.push_back(APValue(Tmp));
154946a523285928aa07bf14803178dc04616ac85994Eli Friedman      else
155046a523285928aa07bf14803178dc04616ac85994Eli Friedman        Elts.push_back(APValue(APFloat(Tmp)));
155146a523285928aa07bf14803178dc04616ac85994Eli Friedman
155246a523285928aa07bf14803178dc04616ac85994Eli Friedman      Init >>= EltWidth;
155346a523285928aa07bf14803178dc04616ac85994Eli Friedman    }
155407fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    return Success(Elts, E);
155546a523285928aa07bf14803178dc04616ac85994Eli Friedman  }
155646a523285928aa07bf14803178dc04616ac85994Eli Friedman  default:
1557c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return ExprEvaluatorBaseTy::VisitCastExpr(E);
1558c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  }
155959b5da6d853b4368b984700315adf7b37de05764Nate Begeman}
156059b5da6d853b4368b984700315adf7b37de05764Nate Begeman
156107fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smithbool
156259b5da6d853b4368b984700315adf7b37de05764Nate BegemanVectorExprEvaluator::VisitInitListExpr(const InitListExpr *E) {
156307fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith  const VectorType *VT = E->getType()->castAs<VectorType>();
156459b5da6d853b4368b984700315adf7b37de05764Nate Begeman  unsigned NumInits = E->getNumInits();
156591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  unsigned NumElements = VT->getNumElements();
15661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
156759b5da6d853b4368b984700315adf7b37de05764Nate Begeman  QualType EltTy = VT->getElementType();
15685f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<APValue, 4> Elements;
156959b5da6d853b4368b984700315adf7b37de05764Nate Begeman
1570a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall  // If a vector is initialized with a single element, that value
1571a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall  // becomes every element of the vector, not just the first.
1572a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall  // This is the behavior described in the IBM AltiVec documentation.
1573a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall  if (NumInits == 1) {
157407fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith
157507fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    // Handle the case where the vector is initialized by another
1576b92ae0e31126e5630d7022f2d6abe7eed2e17746Tanya Lattner    // vector (OpenCL 6.1.6).
1577b92ae0e31126e5630d7022f2d6abe7eed2e17746Tanya Lattner    if (E->getInit(0)->getType()->isVectorType())
157807fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith      return Visit(E->getInit(0));
157907fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith
1580a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall    APValue InitValue;
158159b5da6d853b4368b984700315adf7b37de05764Nate Begeman    if (EltTy->isIntegerType()) {
158259b5da6d853b4368b984700315adf7b37de05764Nate Begeman      llvm::APSInt sInt(32);
1583a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall      if (!EvaluateInteger(E->getInit(0), sInt, Info))
158407fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith        return Error(E);
1585a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall      InitValue = APValue(sInt);
158659b5da6d853b4368b984700315adf7b37de05764Nate Begeman    } else {
158759b5da6d853b4368b984700315adf7b37de05764Nate Begeman      llvm::APFloat f(0.0);
1588a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall      if (!EvaluateFloat(E->getInit(0), f, Info))
158907fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith        return Error(E);
1590a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall      InitValue = APValue(f);
1591a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall    }
1592a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall    for (unsigned i = 0; i < NumElements; i++) {
1593a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall      Elements.push_back(InitValue);
1594a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall    }
1595a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall  } else {
1596a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall    for (unsigned i = 0; i < NumElements; i++) {
1597a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall      if (EltTy->isIntegerType()) {
1598a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall        llvm::APSInt sInt(32);
1599a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall        if (i < NumInits) {
1600a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall          if (!EvaluateInteger(E->getInit(i), sInt, Info))
160107fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith            return Error(E);
1602a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall        } else {
1603a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall          sInt = Info.Ctx.MakeIntValue(0, EltTy);
1604a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall        }
1605a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall        Elements.push_back(APValue(sInt));
160691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      } else {
1607a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall        llvm::APFloat f(0.0);
1608a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall        if (i < NumInits) {
1609a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall          if (!EvaluateFloat(E->getInit(i), f, Info))
161007fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith            return Error(E);
1611a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall        } else {
1612a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall          f = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy));
1613a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall        }
1614a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall        Elements.push_back(APValue(f));
161591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      }
161659b5da6d853b4368b984700315adf7b37de05764Nate Begeman    }
161759b5da6d853b4368b984700315adf7b37de05764Nate Begeman  }
161807fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith  return Success(Elements, E);
161959b5da6d853b4368b984700315adf7b37de05764Nate Begeman}
162059b5da6d853b4368b984700315adf7b37de05764Nate Begeman
162107fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smithbool
162207fc657e3077531805b0e2dbf8f8964d48daa38bRichard SmithVectorExprEvaluator::ValueInitialization(const Expr *E) {
162307fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith  const VectorType *VT = E->getType()->getAs<VectorType>();
162491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  QualType EltTy = VT->getElementType();
162591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  APValue ZeroElement;
162691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  if (EltTy->isIntegerType())
162791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    ZeroElement = APValue(Info.Ctx.MakeIntValue(0, EltTy));
162891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  else
162991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    ZeroElement =
163091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman        APValue(APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy)));
163191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman
16325f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<APValue, 4> Elements(VT->getNumElements(), ZeroElement);
163307fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith  return Success(Elements, E);
163491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman}
163591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman
163607fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smithbool VectorExprEvaluator::VisitUnaryImag(const UnaryOperator *E) {
16378327fad71da34492d82c532f42a58cb4baff81a3Richard Smith  VisitIgnoredValue(E->getSubExpr());
163807fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith  return ValueInitialization(E);
163991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman}
164091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman
164159b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===//
1642cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith// Array Evaluation
1643cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith//===----------------------------------------------------------------------===//
1644cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith
1645cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smithnamespace {
1646cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  class ArrayExprEvaluator
1647cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  : public ExprEvaluatorBase<ArrayExprEvaluator, bool> {
1648cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    APValue &Result;
1649cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  public:
1650cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith
1651cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    ArrayExprEvaluator(EvalInfo &Info, APValue &Result)
1652cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith      : ExprEvaluatorBaseTy(Info), Result(Result) {}
1653cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith
1654cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    bool Success(const APValue &V, const Expr *E) {
1655cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith      assert(V.isArray() && "Expected array type");
1656cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith      Result = V;
1657cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith      return true;
1658cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    }
1659cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    bool Error(const Expr *E) { return false; }
1660cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith
1661cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    bool VisitInitListExpr(const InitListExpr *E);
1662cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  };
1663cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith} // end anonymous namespace
1664cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith
1665cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smithstatic bool EvaluateArray(const Expr* E, APValue& Result, EvalInfo &Info) {
1666cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  assert(E->isRValue() && E->getType()->isArrayType() &&
1667cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith         E->getType()->isLiteralType() && "not a literal array rvalue");
1668cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  return ArrayExprEvaluator(Info, Result).Visit(E);
1669cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith}
1670cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith
1671cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smithbool ArrayExprEvaluator::VisitInitListExpr(const InitListExpr *E) {
1672cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType(E->getType());
1673cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  if (!CAT)
1674cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    return false;
1675cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith
1676cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  Result = APValue(APValue::UninitArray(), E->getNumInits(),
1677cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith                   CAT->getSize().getZExtValue());
1678cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  for (InitListExpr::const_iterator I = E->begin(), End = E->end();
1679cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith       I != End; ++I)
1680cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    if (!EvaluateConstantExpression(Result.getArrayInitializedElt(I-E->begin()),
1681cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith                                    Info, cast<Expr>(*I)))
1682cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith      return false;
1683cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith
1684cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  if (!Result.hasArrayFiller()) return true;
1685cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  assert(E->hasArrayFiller() && "no array filler for incomplete init list");
1686cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  return EvaluateConstantExpression(Result.getArrayFiller(), Info,
1687cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith                                    E->getArrayFiller());
1688cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith}
1689cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith
1690cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith//===----------------------------------------------------------------------===//
1691f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Integer Evaluation
1692c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith//
1693c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// As a GNU extension, we support casting pointers to sufficiently-wide integer
1694c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// types and back in constant folding. Integer values are thus represented
1695c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// either as an integer-valued APValue, or as an lvalue-valued APValue.
1696f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
1697f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
1698f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnernamespace {
1699770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass IntExprEvaluator
17008cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  : public ExprEvaluatorBase<IntExprEvaluator, bool> {
170147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  CCValue &Result;
1702f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerpublic:
170347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  IntExprEvaluator(EvalInfo &info, CCValue &result)
17048cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    : ExprEvaluatorBaseTy(info), Result(result) {}
1705f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
1706973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara  bool Success(const llvm::APSInt &SI, const Expr *E) {
1707973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara    assert(E->getType()->isIntegralOrEnumerationType() &&
17082ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor           "Invalid evaluation result.");
1709973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara    assert(SI.isSigned() == E->getType()->isSignedIntegerOrEnumerationType() &&
17103f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar           "Invalid evaluation result.");
1711973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara    assert(SI.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) &&
17123f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar           "Invalid evaluation result.");
171347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    Result = CCValue(SI);
17143f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    return true;
17153f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  }
17163f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar
1717131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  bool Success(const llvm::APInt &I, const Expr *E) {
17182ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor    assert(E->getType()->isIntegralOrEnumerationType() &&
17192ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor           "Invalid evaluation result.");
172030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    assert(I.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) &&
17213f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar           "Invalid evaluation result.");
172247a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    Result = CCValue(APSInt(I));
1723575a1c9dc8dc5b4977194993e289f9eda7295c39Douglas Gregor    Result.getInt().setIsUnsigned(
1724575a1c9dc8dc5b4977194993e289f9eda7295c39Douglas Gregor                            E->getType()->isUnsignedIntegerOrEnumerationType());
1725131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return true;
1726131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  }
1727131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar
1728131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  bool Success(uint64_t Value, const Expr *E) {
17292ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor    assert(E->getType()->isIntegralOrEnumerationType() &&
17302ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor           "Invalid evaluation result.");
173147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    Result = CCValue(Info.Ctx.MakeIntValue(Value, E->getType()));
1732131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return true;
1733131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  }
1734131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar
17354f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck  bool Success(CharUnits Size, const Expr *E) {
17364f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck    return Success(Size.getQuantity(), E);
17374f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck  }
17384f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck
17394f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck
174082206e267ce6cc709797127616f64672d255b310Anders Carlsson  bool Error(SourceLocation L, diag::kind D, const Expr *E) {
174132fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    // Take the first error.
17421e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith    if (Info.EvalStatus.Diag == 0) {
17431e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith      Info.EvalStatus.DiagLoc = L;
17441e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith      Info.EvalStatus.Diag = D;
17451e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith      Info.EvalStatus.DiagExpr = E;
174632fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    }
174754176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    return false;
17487a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner  }
17491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
175047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  bool Success(const CCValue &V, const Expr *E) {
1751342f1f8b0a402c5a7f8c5055db7f60a7808f1687Richard Smith    if (V.isLValue()) {
1752342f1f8b0a402c5a7f8c5055db7f60a7808f1687Richard Smith      Result = V;
1753342f1f8b0a402c5a7f8c5055db7f60a7808f1687Richard Smith      return true;
1754342f1f8b0a402c5a7f8c5055db7f60a7808f1687Richard Smith    }
17558cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    return Success(V.getInt(), E);
175632fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner  }
17578cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool Error(const Expr *E) {
17580e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
1759f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  }
17601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1761f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith  bool ValueInitialization(const Expr *E) { return Success(0, E); }
1762f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith
17638cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  //===--------------------------------------------------------------------===//
17648cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  //                            Visitor Methods
17658cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  //===--------------------------------------------------------------------===//
1766f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
17674c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitIntegerLiteral(const IntegerLiteral *E) {
1768131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(E->getValue(), E);
17694c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  }
17704c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitCharacterLiteral(const CharacterLiteral *E) {
1771131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(E->getValue(), E);
17724c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  }
1773043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman
1774043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman  bool CheckReferencedDecl(const Expr *E, const Decl *D);
1775043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman  bool VisitDeclRefExpr(const DeclRefExpr *E) {
17768cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    if (CheckReferencedDecl(E, E->getDecl()))
17778cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne      return true;
17788cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
17798cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    return ExprEvaluatorBaseTy::VisitDeclRefExpr(E);
1780043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman  }
1781043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman  bool VisitMemberExpr(const MemberExpr *E) {
1782043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman    if (CheckReferencedDecl(E, E->getMemberDecl())) {
1783c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith      VisitIgnoredValue(E->getBase());
1784043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman      return true;
1785043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman    }
17868cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
17878cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    return ExprEvaluatorBaseTy::VisitMemberExpr(E);
1788043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman  }
1789043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman
17908cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitCallExpr(const CallExpr *E);
1791b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  bool VisitBinaryOperator(const BinaryOperator *E);
17928ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  bool VisitOffsetOfExpr(const OffsetOfExpr *E);
1793b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  bool VisitUnaryOperator(const UnaryOperator *E);
1794f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
17958cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitCastExpr(const CastExpr* E);
1796f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  bool VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *E);
17970518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl
17983068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  bool VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) {
1799131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(E->getValue(), E);
18003068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  }
18011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1802f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith  // Note, GNU defines __null as an integer, not a pointer.
18033f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson  bool VisitGNUNullExpr(const GNUNullExpr *E) {
1804f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith    return ValueInitialization(E);
1805664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman  }
1806664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman
180764b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  bool VisitUnaryTypeTraitExpr(const UnaryTypeTraitExpr *E) {
18080dfd848fa4c9664852ba8c929a8bd3fce93ddca2Sebastian Redl    return Success(E->getValue(), E);
180964b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  }
181064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl
18116ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  bool VisitBinaryTypeTraitExpr(const BinaryTypeTraitExpr *E) {
18126ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet    return Success(E->getValue(), E);
18136ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  }
18146ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet
181521ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  bool VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *E) {
181621ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley    return Success(E->getValue(), E);
181721ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  }
181821ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley
1819552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  bool VisitExpressionTraitExpr(const ExpressionTraitExpr *E) {
1820552622067dc45013d240f73952fece703f5e63bdJohn Wiegley    return Success(E->getValue(), E);
1821552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  }
1822552622067dc45013d240f73952fece703f5e63bdJohn Wiegley
1823722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  bool VisitUnaryReal(const UnaryOperator *E);
1824664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman  bool VisitUnaryImag(const UnaryOperator *E);
1825664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman
1826295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  bool VisitCXXNoexceptExpr(const CXXNoexceptExpr *E);
1827ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  bool VisitSizeOfPackExpr(const SizeOfPackExpr *E);
1828cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl
1829fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattnerprivate:
18308b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck  CharUnits GetAlignOfExpr(const Expr *E);
18318b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck  CharUnits GetAlignOfType(QualType T);
183242c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  static QualType GetObjectType(const Expr *E);
18338cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool TryEvaluateBuiltinObjectSize(const CallExpr *E);
1834664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman  // FIXME: Missing: array subscript of vector, member of vector
1835f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner};
1836f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace
1837f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
1838c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// EvaluateIntegerOrLValue - Evaluate an rvalue integral-typed expression, and
1839c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// produce either the integer value or a pointer.
1840c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith///
1841c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// GCC has a heinous extension which folds casts between pointer types and
1842c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// pointer-sized integral types. We support this by allowing the evaluation of
1843c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// an integer rvalue to produce a pointer (represented as an lvalue) instead.
1844c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// Some simple arithmetic on such values is supported (they are treated much
1845c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// like char*).
184647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smithstatic bool EvaluateIntegerOrLValue(const Expr* E, CCValue &Result,
184747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith                                    EvalInfo &Info) {
1848c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  assert(E->isRValue() && E->getType()->isIntegralOrEnumerationType());
18498cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  return IntExprEvaluator(Info, Result).Visit(E);
185069ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar}
185169ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar
185269ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbarstatic bool EvaluateInteger(const Expr* E, APSInt &Result, EvalInfo &Info) {
185347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  CCValue Val;
185469ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar  if (!EvaluateIntegerOrLValue(E, Val, Info) || !Val.isInt())
185530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return false;
185630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  Result = Val.getInt();
185730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  return true;
1858f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner}
1859f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
1860043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedmanbool IntExprEvaluator::CheckReferencedDecl(const Expr* E, const Decl* D) {
18614c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  // Enums are integer constant exprs.
1862bfbdcd861a4364bfc21a9e5047bdbd56812d6693Abramo Bagnara  if (const EnumConstantDecl *ECD = dyn_cast<EnumConstantDecl>(D)) {
1863973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara    // Check for signedness/width mismatches between E type and ECD value.
1864973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara    bool SameSign = (ECD->getInitVal().isSigned()
1865973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara                     == E->getType()->isSignedIntegerOrEnumerationType());
1866973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara    bool SameWidth = (ECD->getInitVal().getBitWidth()
1867973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara                      == Info.Ctx.getIntWidth(E->getType()));
1868973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara    if (SameSign && SameWidth)
1869973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara      return Success(ECD->getInitVal(), E);
1870973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara    else {
1871973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara      // Get rid of mismatch (otherwise Success assertions will fail)
1872973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara      // by computing a new value matching the type of E.
1873973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara      llvm::APSInt Val = ECD->getInitVal();
1874973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara      if (!SameSign)
1875973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara        Val.setIsSigned(!ECD->getInitVal().isSigned());
1876973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara      if (!SameWidth)
1877973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara        Val = Val.extOrTrunc(Info.Ctx.getIntWidth(E->getType()));
1878973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara      return Success(Val, E);
1879973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara    }
1880bfbdcd861a4364bfc21a9e5047bdbd56812d6693Abramo Bagnara  }
18818cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  return false;
18824c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner}
18834c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner
1884a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way
1885a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// as GCC.
1886a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattnerstatic int EvaluateBuiltinClassifyType(const CallExpr *E) {
1887a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  // The following enum mimics the values returned by GCC.
18887c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  // FIXME: Does GCC differ between lvalue and rvalue references here?
1889a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  enum gcc_type_class {
1890a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    no_type_class = -1,
1891a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    void_type_class, integer_type_class, char_type_class,
1892a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    enumeral_type_class, boolean_type_class,
1893a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    pointer_type_class, reference_type_class, offset_type_class,
1894a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    real_type_class, complex_type_class,
1895a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    function_type_class, method_type_class,
1896a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    record_type_class, union_type_class,
1897a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    array_type_class, string_type_class,
1898a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    lang_type_class
1899a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  };
19001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // If no argument was supplied, default to "no_type_class". This isn't
1902a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  // ideal, however it is what gcc does.
1903a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  if (E->getNumArgs() == 0)
1904a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return no_type_class;
19051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1906a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  QualType ArgTy = E->getArg(0)->getType();
1907a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  if (ArgTy->isVoidType())
1908a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return void_type_class;
1909a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isEnumeralType())
1910a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return enumeral_type_class;
1911a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isBooleanType())
1912a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return boolean_type_class;
1913a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isCharType())
1914a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return string_type_class; // gcc doesn't appear to use char_type_class
1915a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isIntegerType())
1916a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return integer_type_class;
1917a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isPointerType())
1918a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return pointer_type_class;
1919a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isReferenceType())
1920a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return reference_type_class;
1921a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isRealType())
1922a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return real_type_class;
1923a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isComplexType())
1924a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return complex_type_class;
1925a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isFunctionType())
1926a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return function_type_class;
1927fb87b89fc9eb103e19fb8e4b925c23f0bd091b99Douglas Gregor  else if (ArgTy->isStructureOrClassType())
1928a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return record_type_class;
1929a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isUnionType())
1930a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return union_type_class;
1931a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isArrayType())
1932a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return array_type_class;
1933a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isUnionType())
1934a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return union_type_class;
1935a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else  // FIXME: offset_type_class, method_type_class, & lang_type_class?
1936b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("CallExpr::isBuiltinClassifyType(): unimplemented type");
1937a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  return -1;
1938a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner}
1939a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner
194042c8f87eb60958170c46767273bf93e6c96125bfJohn McCall/// Retrieves the "underlying object type" of the given expression,
194142c8f87eb60958170c46767273bf93e6c96125bfJohn McCall/// as used by __builtin_object_size.
194242c8f87eb60958170c46767273bf93e6c96125bfJohn McCallQualType IntExprEvaluator::GetObjectType(const Expr *E) {
194342c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
194442c8f87eb60958170c46767273bf93e6c96125bfJohn McCall    if (const VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl()))
194542c8f87eb60958170c46767273bf93e6c96125bfJohn McCall      return VD->getType();
194642c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  } else if (isa<CompoundLiteralExpr>(E)) {
194742c8f87eb60958170c46767273bf93e6c96125bfJohn McCall    return E->getType();
194842c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  }
194942c8f87eb60958170c46767273bf93e6c96125bfJohn McCall
195042c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  return QualType();
195142c8f87eb60958170c46767273bf93e6c96125bfJohn McCall}
195242c8f87eb60958170c46767273bf93e6c96125bfJohn McCall
19538cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool IntExprEvaluator::TryEvaluateBuiltinObjectSize(const CallExpr *E) {
195442c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  // TODO: Perhaps we should let LLVM lower this?
195542c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  LValue Base;
195642c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  if (!EvaluatePointer(E->getArg(0), Base, Info))
195742c8f87eb60958170c46767273bf93e6c96125bfJohn McCall    return false;
195842c8f87eb60958170c46767273bf93e6c96125bfJohn McCall
195942c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  // If we can prove the base is null, lower to zero now.
196042c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  const Expr *LVBase = Base.getLValueBase();
196142c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  if (!LVBase) return Success(0, E);
196242c8f87eb60958170c46767273bf93e6c96125bfJohn McCall
196342c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  QualType T = GetObjectType(LVBase);
196442c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  if (T.isNull() ||
196542c8f87eb60958170c46767273bf93e6c96125bfJohn McCall      T->isIncompleteType() ||
19661357869bc5983cdfbc986db1f3d18265bb34cb0eEli Friedman      T->isFunctionType() ||
196742c8f87eb60958170c46767273bf93e6c96125bfJohn McCall      T->isVariablyModifiedType() ||
196842c8f87eb60958170c46767273bf93e6c96125bfJohn McCall      T->isDependentType())
196942c8f87eb60958170c46767273bf93e6c96125bfJohn McCall    return false;
197042c8f87eb60958170c46767273bf93e6c96125bfJohn McCall
197142c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  CharUnits Size = Info.Ctx.getTypeSizeInChars(T);
197242c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  CharUnits Offset = Base.getLValueOffset();
197342c8f87eb60958170c46767273bf93e6c96125bfJohn McCall
197442c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  if (!Offset.isNegative() && Offset <= Size)
197542c8f87eb60958170c46767273bf93e6c96125bfJohn McCall    Size -= Offset;
197642c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  else
197742c8f87eb60958170c46767273bf93e6c96125bfJohn McCall    Size = CharUnits::Zero();
19784f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck  return Success(Size, E);
197942c8f87eb60958170c46767273bf93e6c96125bfJohn McCall}
198042c8f87eb60958170c46767273bf93e6c96125bfJohn McCall
19818cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool IntExprEvaluator::VisitCallExpr(const CallExpr *E) {
19823c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  switch (E->isBuiltinCall(Info.Ctx)) {
1983019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  default:
19848cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    return ExprEvaluatorBaseTy::VisitCallExpr(E);
198564eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump
198664eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump  case Builtin::BI__builtin_object_size: {
198742c8f87eb60958170c46767273bf93e6c96125bfJohn McCall    if (TryEvaluateBuiltinObjectSize(E))
198842c8f87eb60958170c46767273bf93e6c96125bfJohn McCall      return true;
198964eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump
1990b2aaf51ed73a4774322a39a0dd59d0fe7e3258c0Eric Christopher    // If evaluating the argument has side-effects we can't determine
1991b2aaf51ed73a4774322a39a0dd59d0fe7e3258c0Eric Christopher    // the size of the object and lower it to unknown now.
1992393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian    if (E->getArg(0)->HasSideEffects(Info.Ctx)) {
1993a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith      if (E->getArg(1)->EvaluateKnownConstInt(Info.Ctx).getZExtValue() <= 1)
1994cf184655319cf7a5b811067cff9d26a5741fd161Chris Lattner        return Success(-1ULL, E);
199564eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump      return Success(0, E);
199664eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump    }
1997c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump
199864eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump    return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
199964eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump  }
200064eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump
2001019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_classify_type:
2002131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(EvaluateBuiltinClassifyType(E), E);
20031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20044bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson  case Builtin::BI__builtin_constant_p:
2005019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner    // __builtin_constant_p always has one operand: it returns true if that
2006019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner    // operand can be folded, false otherwise.
2007131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(E->getArg(0)->isEvaluatable(Info.Ctx), E);
200821fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner
200921fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner  case Builtin::BI__builtin_eh_return_data_regno: {
2010a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith    int Operand = E->getArg(0)->EvaluateKnownConstInt(Info.Ctx).getZExtValue();
2011bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Operand = Info.Ctx.getTargetInfo().getEHDataRegisterNumber(Operand);
201221fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner    return Success(Operand, E);
201321fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner  }
2014c4a2638b5ef3e2d35d872614ceb655a7a22c58beEli Friedman
2015c4a2638b5ef3e2d35d872614ceb655a7a22c58beEli Friedman  case Builtin::BI__builtin_expect:
2016c4a2638b5ef3e2d35d872614ceb655a7a22c58beEli Friedman    return Visit(E->getArg(0));
20175726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor
20185726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor  case Builtin::BIstrlen:
20195726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor  case Builtin::BI__builtin_strlen:
20205726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor    // As an extension, we support strlen() and __builtin_strlen() as constant
20215726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor    // expressions when the argument is a string literal.
20228cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    if (const StringLiteral *S
20235726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor               = dyn_cast<StringLiteral>(E->getArg(0)->IgnoreParenImpCasts())) {
20245726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor      // The string literal may have embedded null characters. Find the first
20255726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor      // one and truncate there.
20265f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      StringRef Str = S->getString();
20275f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      StringRef::size_type Pos = Str.find(0);
20285f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      if (Pos != StringRef::npos)
20295726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor        Str = Str.substr(0, Pos);
20305726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor
20315726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor      return Success(Str.size(), E);
20325726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor    }
20335726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor
20345726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor    return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
2035454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman
2036454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman  case Builtin::BI__atomic_is_lock_free: {
2037454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    APSInt SizeVal;
2038454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    if (!EvaluateInteger(E->getArg(0), SizeVal, Info))
2039454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman      return false;
2040454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman
2041454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    // For __atomic_is_lock_free(sizeof(_Atomic(T))), if the size is a power
2042454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    // of two less than the maximum inline atomic width, we know it is
2043454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    // lock-free.  If the size isn't a power of two, or greater than the
2044454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    // maximum alignment where we promote atomics, we know it is not lock-free
2045454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    // (at least not in the sense of atomic_is_lock_free).  Otherwise,
2046454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    // the answer can only be determined at runtime; for example, 16-byte
2047454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    // atomics have lock-free implementations on some, but not all,
2048454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    // x86-64 processors.
2049454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman
2050454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    // Check power-of-two.
2051454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    CharUnits Size = CharUnits::fromQuantity(SizeVal.getZExtValue());
2052454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    if (!Size.isPowerOfTwo())
2053454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman#if 0
2054454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman      // FIXME: Suppress this folding until the ABI for the promotion width
2055454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman      // settles.
2056454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman      return Success(0, E);
2057454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman#else
2058454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman      return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
2059454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman#endif
2060454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman
2061454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman#if 0
2062454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    // Check against promotion width.
2063454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    // FIXME: Suppress this folding until the ABI for the promotion width
2064454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    // settles.
2065454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    unsigned PromoteWidthBits =
2066454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman        Info.Ctx.getTargetInfo().getMaxAtomicPromoteWidth();
2067454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    if (Size > Info.Ctx.toCharUnitsFromBits(PromoteWidthBits))
2068454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman      return Success(0, E);
2069454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman#endif
2070454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman
2071454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    // Check against inlining width.
2072454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    unsigned InlineWidthBits =
2073454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman        Info.Ctx.getTargetInfo().getMaxAtomicInlineWidth();
2074454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    if (Size <= Info.Ctx.toCharUnitsFromBits(InlineWidthBits))
2075454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman      return Success(1, E);
2076454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman
2077454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
2078454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman  }
2079019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  }
20804c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner}
2081f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
2082625b80755b603d28f36fb4212c81484d87ad08d3Richard Smithstatic bool HasSameBase(const LValue &A, const LValue &B) {
2083625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith  if (!A.getLValueBase())
2084625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith    return !B.getLValueBase();
2085625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith  if (!B.getLValueBase())
2086625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith    return false;
2087625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith
2088625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith  if (A.getLValueBase() != B.getLValueBase()) {
2089625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith    const Decl *ADecl = GetLValueBaseDecl(A);
2090625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith    if (!ADecl)
2091625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith      return false;
2092625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith    const Decl *BDecl = GetLValueBaseDecl(B);
20939a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith    if (!BDecl || ADecl->getCanonicalDecl() != BDecl->getCanonicalDecl())
2094625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith      return false;
2095625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith  }
2096625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith
2097625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith  return IsGlobalLValue(A.getLValueBase()) ||
2098177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith         A.getLValueFrame() == B.getLValueFrame();
2099625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith}
2100625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith
2101b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
2102c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  if (E->isAssignmentOp())
2103c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E);
2104c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
21052de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  if (E->getOpcode() == BO_Comma) {
21068327fad71da34492d82c532f42a58cb4baff81a3Richard Smith    VisitIgnoredValue(E->getLHS());
21078327fad71da34492d82c532f42a58cb4baff81a3Richard Smith    return Visit(E->getRHS());
2108a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  }
2109a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
2110a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  if (E->isLogicalOp()) {
2111a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // These need to be handled specially because the operands aren't
2112a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // necessarily integral
2113fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson    bool lhsResult, rhsResult;
21141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2115c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    if (EvaluateAsBooleanCondition(E->getLHS(), lhsResult, Info)) {
211651fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson      // We were able to evaluate the LHS, see if we can get away with not
211751fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson      // evaluating the RHS: 0 && X -> 0, 1 || X -> 1
21182de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      if (lhsResult == (E->getOpcode() == BO_LOr))
21193f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar        return Success(lhsResult, E);
2120a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
2121c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith      if (EvaluateAsBooleanCondition(E->getRHS(), rhsResult, Info)) {
21222de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall        if (E->getOpcode() == BO_LOr)
2123131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar          return Success(lhsResult || rhsResult, E);
21244bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        else
2125131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar          return Success(lhsResult && rhsResult, E);
21264bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson      }
21274bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson    } else {
2128c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith      if (EvaluateAsBooleanCondition(E->getRHS(), rhsResult, Info)) {
21294bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        // We can't evaluate the LHS; however, sometimes the result
21304bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        // is determined by the RHS: X && 0 -> 0, X || 1 -> 1.
21312de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall        if (rhsResult == (E->getOpcode() == BO_LOr) ||
21322de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall            !rhsResult == (E->getOpcode() == BO_LAnd)) {
2133131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar          // Since we weren't able to evaluate the left hand side, it
2134fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson          // must have had side effects.
21351e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith          Info.EvalStatus.HasSideEffects = true;
2136131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar
2137131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar          return Success(rhsResult, E);
21384bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        }
21394bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson      }
2140a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    }
2141a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
2142a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    return false;
2143c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner  }
214454176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner
2145286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  QualType LHSTy = E->getLHS()->getType();
2146286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  QualType RHSTy = E->getRHS()->getType();
21474087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
21484087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar  if (LHSTy->isAnyComplexType()) {
21494087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    assert(RHSTy->isAnyComplexType() && "Invalid comparison");
2150f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    ComplexValue LHS, RHS;
21514087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
21524087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    if (!EvaluateComplex(E->getLHS(), LHS, Info))
21534087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      return false;
21544087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
21554087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    if (!EvaluateComplex(E->getRHS(), RHS, Info))
21564087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      return false;
21574087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
21584087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    if (LHS.isComplexFloat()) {
21591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      APFloat::cmpResult CR_r =
21604087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar        LHS.getComplexFloatReal().compare(RHS.getComplexFloatReal());
21611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      APFloat::cmpResult CR_i =
21624087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar        LHS.getComplexFloatImag().compare(RHS.getComplexFloatImag());
21634087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
21642de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      if (E->getOpcode() == BO_EQ)
2165131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        return Success((CR_r == APFloat::cmpEqual &&
2166131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                        CR_i == APFloat::cmpEqual), E);
2167131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      else {
21682de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall        assert(E->getOpcode() == BO_NE &&
2169131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar               "Invalid complex comparison.");
21701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        return Success(((CR_r == APFloat::cmpGreaterThan ||
2171fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang                         CR_r == APFloat::cmpLessThan ||
2172fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang                         CR_r == APFloat::cmpUnordered) ||
21731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                        (CR_i == APFloat::cmpGreaterThan ||
2174fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang                         CR_i == APFloat::cmpLessThan ||
2175fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang                         CR_i == APFloat::cmpUnordered)), E);
2176131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      }
21774087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    } else {
21782de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      if (E->getOpcode() == BO_EQ)
2179131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        return Success((LHS.getComplexIntReal() == RHS.getComplexIntReal() &&
2180131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                        LHS.getComplexIntImag() == RHS.getComplexIntImag()), E);
2181131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      else {
21822de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall        assert(E->getOpcode() == BO_NE &&
2183131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar               "Invalid compex comparison.");
2184131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        return Success((LHS.getComplexIntReal() != RHS.getComplexIntReal() ||
2185131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                        LHS.getComplexIntImag() != RHS.getComplexIntImag()), E);
2186131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      }
21874087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    }
21884087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar  }
21891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2190286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  if (LHSTy->isRealFloatingType() &&
2191286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      RHSTy->isRealFloatingType()) {
2192286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    APFloat RHS(0.0), LHS(0.0);
21931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2194286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    if (!EvaluateFloat(E->getRHS(), RHS, Info))
2195286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      return false;
21961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2197286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    if (!EvaluateFloat(E->getLHS(), LHS, Info))
2198286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      return false;
21991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2200286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    APFloat::cmpResult CR = LHS.compare(RHS);
2201529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson
2202286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    switch (E->getOpcode()) {
2203286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    default:
2204b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie      llvm_unreachable("Invalid binary operator!");
22052de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_LT:
2206131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpLessThan, E);
22072de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_GT:
2208131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpGreaterThan, E);
22092de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_LE:
2210131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpLessThan || CR == APFloat::cmpEqual, E);
22112de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_GE:
22121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return Success(CR == APFloat::cmpGreaterThan || CR == APFloat::cmpEqual,
2213131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                     E);
22142de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_EQ:
2215131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpEqual, E);
22162de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_NE:
22171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return Success(CR == APFloat::cmpGreaterThan
2218fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang                     || CR == APFloat::cmpLessThan
2219fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang                     || CR == APFloat::cmpUnordered, E);
2220286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    }
2221286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  }
22221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2223ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman  if (LHSTy->isPointerType() && RHSTy->isPointerType()) {
2224625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith    if (E->getOpcode() == BO_Sub || E->isComparisonOp()) {
2225efdb83e26f9a1fd2566afe54461216cd84814d42John McCall      LValue LHSValue;
22263068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      if (!EvaluatePointer(E->getLHS(), LHSValue, Info))
22273068d117951a8df54bae9db039b56201ab10962bAnders Carlsson        return false;
2228a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
2229efdb83e26f9a1fd2566afe54461216cd84814d42John McCall      LValue RHSValue;
22303068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      if (!EvaluatePointer(E->getRHS(), RHSValue, Info))
22313068d117951a8df54bae9db039b56201ab10962bAnders Carlsson        return false;
2232a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
2233625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith      // Reject differing bases from the normal codepath; we special-case
2234625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith      // comparisons to null.
2235625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith      if (!HasSameBase(LHSValue, RHSValue)) {
22369e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith        // Inequalities and subtractions between unrelated pointers have
22379e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith        // unspecified or undefined behavior.
22385bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman        if (!E->isEqualityOp())
22395bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman          return false;
2240ffbda40a1fb7169591dc01771f3511178a2f727cEli Friedman        // A constant address may compare equal to the address of a symbol.
2241ffbda40a1fb7169591dc01771f3511178a2f727cEli Friedman        // The one exception is that address of an object cannot compare equal
2242c45061bd0c0fdad4df8eea7e9e5af186d11427e5Eli Friedman        // to a null pointer constant.
2243ffbda40a1fb7169591dc01771f3511178a2f727cEli Friedman        if ((!LHSValue.Base && !LHSValue.Offset.isZero()) ||
2244ffbda40a1fb7169591dc01771f3511178a2f727cEli Friedman            (!RHSValue.Base && !RHSValue.Offset.isZero()))
2245ffbda40a1fb7169591dc01771f3511178a2f727cEli Friedman          return false;
22469e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith        // It's implementation-defined whether distinct literals will have
2247c45061bd0c0fdad4df8eea7e9e5af186d11427e5Eli Friedman        // distinct addresses. In clang, we do not guarantee the addresses are
224874f4634781cee06e28eb741bda5d0f936fdd1948Richard Smith        // distinct. However, we do know that the address of a literal will be
224974f4634781cee06e28eb741bda5d0f936fdd1948Richard Smith        // non-null.
225074f4634781cee06e28eb741bda5d0f936fdd1948Richard Smith        if ((IsLiteralLValue(LHSValue) || IsLiteralLValue(RHSValue)) &&
225174f4634781cee06e28eb741bda5d0f936fdd1948Richard Smith            LHSValue.Base && RHSValue.Base)
22525bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman          return false;
22539e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith        // We can't tell whether weak symbols will end up pointing to the same
22549e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith        // object.
22559e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith        if (IsWeakLValue(LHSValue) || IsWeakLValue(RHSValue))
22565bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman          return false;
22579e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith        // Pointers with different bases cannot represent the same object.
2258c45061bd0c0fdad4df8eea7e9e5af186d11427e5Eli Friedman        // (Note that clang defaults to -fmerge-all-constants, which can
2259c45061bd0c0fdad4df8eea7e9e5af186d11427e5Eli Friedman        // lead to inconsistent results for comparisons involving the address
2260c45061bd0c0fdad4df8eea7e9e5af186d11427e5Eli Friedman        // of a constant; this generally doesn't matter in practice.)
22619e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith        return Success(E->getOpcode() == BO_NE, E);
22625bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman      }
2263a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
2264cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith      // FIXME: Implement the C++11 restrictions:
2265cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith      //  - Pointer subtractions must be on elements of the same array.
2266cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith      //  - Pointer comparisons must be between members with the same access.
2267cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith
22682de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      if (E->getOpcode() == BO_Sub) {
22694992bdde387c5f033bb450a716eaabc0fda52688Chris Lattner        QualType Type = E->getLHS()->getType();
22704992bdde387c5f033bb450a716eaabc0fda52688Chris Lattner        QualType ElementType = Type->getAs<PointerType>()->getPointeeType();
22713068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
2272a73058324197b7bdfd19307965954f626e26199dKen Dyck        CharUnits ElementSize = CharUnits::One();
2273ce1bca73aef9bbf6359ab8420278203dda81a054Eli Friedman        if (!ElementType->isVoidType() && !ElementType->isFunctionType())
2274a73058324197b7bdfd19307965954f626e26199dKen Dyck          ElementSize = Info.Ctx.getTypeSizeInChars(ElementType);
2275a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
2276a73058324197b7bdfd19307965954f626e26199dKen Dyck        CharUnits Diff = LHSValue.getLValueOffset() -
2277a73058324197b7bdfd19307965954f626e26199dKen Dyck                             RHSValue.getLValueOffset();
2278a73058324197b7bdfd19307965954f626e26199dKen Dyck        return Success(Diff / ElementSize, E);
2279ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman      }
2280625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith
2281625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith      const CharUnits &LHSOffset = LHSValue.getLValueOffset();
2282625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith      const CharUnits &RHSOffset = RHSValue.getLValueOffset();
2283625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith      switch (E->getOpcode()) {
2284625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith      default: llvm_unreachable("missing comparison operator");
2285625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith      case BO_LT: return Success(LHSOffset < RHSOffset, E);
2286625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith      case BO_GT: return Success(LHSOffset > RHSOffset, E);
2287625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith      case BO_LE: return Success(LHSOffset <= RHSOffset, E);
2288625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith      case BO_GE: return Success(LHSOffset >= RHSOffset, E);
2289625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith      case BO_EQ: return Success(LHSOffset == RHSOffset, E);
2290625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith      case BO_NE: return Success(LHSOffset != RHSOffset, E);
2291ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman      }
22923068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    }
22933068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  }
22942ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor  if (!LHSTy->isIntegralOrEnumerationType() ||
22952ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor      !RHSTy->isIntegralOrEnumerationType()) {
2296a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // We can't continue from here for non-integral types, and they
2297a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // could potentially confuse the following operations.
2298a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    return false;
2299a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  }
2300a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
2301a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  // The LHS of a constant expr is always evaluated and needed.
230247a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  CCValue LHSVal;
2303c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  if (!EvaluateIntegerOrLValue(E->getLHS(), LHSVal, Info))
2304a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    return false; // error in subexpression.
2305d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman
2306c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  if (!Visit(E->getRHS()))
230730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return false;
230847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  CCValue &RHSVal = Result;
230942edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman
231042edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  // Handle cases like (unsigned long)&a + 4.
2311c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  if (E->isAdditiveOp() && LHSVal.isLValue() && RHSVal.isInt()) {
2312a73058324197b7bdfd19307965954f626e26199dKen Dyck    CharUnits AdditionalOffset = CharUnits::fromQuantity(
2313a73058324197b7bdfd19307965954f626e26199dKen Dyck                                     RHSVal.getInt().getZExtValue());
23142de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    if (E->getOpcode() == BO_Add)
231547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith      LHSVal.getLValueOffset() += AdditionalOffset;
231642edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman    else
231747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith      LHSVal.getLValueOffset() -= AdditionalOffset;
231847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    Result = LHSVal;
231942edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman    return true;
232042edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  }
232142edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman
232242edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  // Handle cases like 4 + (unsigned long)&a
23232de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  if (E->getOpcode() == BO_Add &&
2324c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith        RHSVal.isLValue() && LHSVal.isInt()) {
232547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    RHSVal.getLValueOffset() += CharUnits::fromQuantity(
232647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith                                    LHSVal.getInt().getZExtValue());
232747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    // Note that RHSVal is Result.
232842edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman    return true;
232942edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  }
233042edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman
233142edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  // All the following cases expect both operands to be an integer
2332c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  if (!LHSVal.isInt() || !RHSVal.isInt())
2333b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner    return false;
2334a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
2335c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  APSInt &LHS = LHSVal.getInt();
2336c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  APSInt &RHS = RHSVal.getInt();
233742edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman
2338a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  switch (E->getOpcode()) {
233932fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner  default:
23400e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E);
2341c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  case BO_Mul: return Success(LHS * RHS, E);
2342c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  case BO_Add: return Success(LHS + RHS, E);
2343c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  case BO_Sub: return Success(LHS - RHS, E);
2344c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  case BO_And: return Success(LHS & RHS, E);
2345c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  case BO_Xor: return Success(LHS ^ RHS, E);
2346c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  case BO_Or:  return Success(LHS | RHS, E);
23472de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Div:
234854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    if (RHS == 0)
23490e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson      return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E);
2350c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return Success(LHS / RHS, E);
23512de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Rem:
235254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    if (RHS == 0)
23530e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson      return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E);
2354c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return Success(LHS % RHS, E);
23552de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Shl: {
2356091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall    // During constant-folding, a negative shift is an opposite shift.
2357091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall    if (RHS.isSigned() && RHS.isNegative()) {
2358091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall      RHS = -RHS;
2359091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall      goto shift_right;
2360091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall    }
2361091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall
2362091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall  shift_left:
2363091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall    unsigned SA
2364c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith      = (unsigned) RHS.getLimitedValue(LHS.getBitWidth()-1);
2365c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return Success(LHS << SA, E);
23663f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  }
23672de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Shr: {
2368091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall    // During constant-folding, a negative shift is an opposite shift.
2369091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall    if (RHS.isSigned() && RHS.isNegative()) {
2370091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall      RHS = -RHS;
2371091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall      goto shift_left;
2372091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall    }
2373091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall
2374091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall  shift_right:
23751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    unsigned SA =
2376c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith      (unsigned) RHS.getLimitedValue(LHS.getBitWidth()-1);
2377c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return Success(LHS >> SA, E);
23783f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  }
23791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2380c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  case BO_LT: return Success(LHS < RHS, E);
2381c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  case BO_GT: return Success(LHS > RHS, E);
2382c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  case BO_LE: return Success(LHS <= RHS, E);
2383c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  case BO_GE: return Success(LHS >= RHS, E);
2384c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  case BO_EQ: return Success(LHS == RHS, E);
2385c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  case BO_NE: return Success(LHS != RHS, E);
2386b11e77836dd0867955c5abf32baf1c3e6c7f81e1Eli Friedman  }
2387a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson}
2388a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson
23898b752f10c394b140f9ef89e049cbad1a7676fc25Ken DyckCharUnits IntExprEvaluator::GetAlignOfType(QualType T) {
23905d484e8cf710207010720589d89602233de61d01Sebastian Redl  // C++ [expr.sizeof]p2: "When applied to a reference or a reference type,
23915d484e8cf710207010720589d89602233de61d01Sebastian Redl  //   the result is the size of the referenced type."
23925d484e8cf710207010720589d89602233de61d01Sebastian Redl  // C++ [expr.alignof]p3: "When alignof is applied to a reference type, the
23935d484e8cf710207010720589d89602233de61d01Sebastian Redl  //   result shall be the alignment of the referenced type."
23945d484e8cf710207010720589d89602233de61d01Sebastian Redl  if (const ReferenceType *Ref = T->getAs<ReferenceType>())
23955d484e8cf710207010720589d89602233de61d01Sebastian Redl    T = Ref->getPointeeType();
23969f1210c3280104417a4ad30f0a00825ac8fa718aChad Rosier
23979f1210c3280104417a4ad30f0a00825ac8fa718aChad Rosier  // __alignof is defined to return the preferred alignment.
23989f1210c3280104417a4ad30f0a00825ac8fa718aChad Rosier  return Info.Ctx.toCharUnitsFromBits(
23999f1210c3280104417a4ad30f0a00825ac8fa718aChad Rosier    Info.Ctx.getPreferredTypeAlign(T.getTypePtr()));
2400e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner}
2401e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
24028b752f10c394b140f9ef89e049cbad1a7676fc25Ken DyckCharUnits IntExprEvaluator::GetAlignOfExpr(const Expr *E) {
2403af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  E = E->IgnoreParens();
2404af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner
2405af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  // alignof decl is always accepted, even if it doesn't make sense: we default
24061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // to 1 in those cases.
2407af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
24088b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck    return Info.Ctx.getDeclAlign(DRE->getDecl(),
24098b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck                                 /*RefAsPointee*/true);
2410a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
2411af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  if (const MemberExpr *ME = dyn_cast<MemberExpr>(E))
24128b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck    return Info.Ctx.getDeclAlign(ME->getMemberDecl(),
24138b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck                                 /*RefAsPointee*/true);
2414af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner
2415e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  return GetAlignOfType(E->getType());
2416e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner}
2417e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
2418e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
2419f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne/// VisitUnaryExprOrTypeTraitExpr - Evaluate a sizeof, alignof or vec_step with
2420f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne/// a result as the expression's type.
2421f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbournebool IntExprEvaluator::VisitUnaryExprOrTypeTraitExpr(
2422f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne                                    const UnaryExprOrTypeTraitExpr *E) {
2423f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  switch(E->getKind()) {
2424f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  case UETT_AlignOf: {
2425e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner    if (E->isArgumentType())
24264f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck      return Success(GetAlignOfType(E->getArgumentType()), E);
2427e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner    else
24284f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck      return Success(GetAlignOfExpr(E->getArgumentExpr()), E);
2429e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  }
2430a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
2431f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  case UETT_VecStep: {
2432f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    QualType Ty = E->getTypeOfArgument();
24330518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl
2434f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    if (Ty->isVectorType()) {
2435f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne      unsigned n = Ty->getAs<VectorType>()->getNumElements();
2436a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
2437f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne      // The vec_step built-in functions that take a 3-component
2438f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne      // vector return 4. (OpenCL 1.1 spec 6.11.12)
2439f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne      if (n == 3)
2440f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne        n = 4;
2441f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne
2442f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne      return Success(n, E);
2443f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    } else
2444f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne      return Success(1, E);
2445f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  }
2446f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne
2447f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  case UETT_SizeOf: {
2448f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    QualType SrcTy = E->getTypeOfArgument();
2449f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    // C++ [expr.sizeof]p2: "When applied to a reference or a reference type,
2450f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    //   the result is the size of the referenced type."
2451f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    // C++ [expr.alignof]p3: "When alignof is applied to a reference type, the
2452f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    //   result shall be the alignment of the referenced type."
2453f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    if (const ReferenceType *Ref = SrcTy->getAs<ReferenceType>())
2454f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne      SrcTy = Ref->getPointeeType();
2455f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman
2456f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    // sizeof(void), __alignof__(void), sizeof(function) = 1 as a gcc
2457f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    // extension.
2458f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    if (SrcTy->isVoidType() || SrcTy->isFunctionType())
2459f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne      return Success(1, E);
2460f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne
2461f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    // sizeof(vla) is not a constantexpr: C99 6.5.3.4p2.
2462f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    if (!SrcTy->isConstantSizeType())
2463f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne      return false;
2464f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne
2465f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    // Get information about the size.
2466f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    return Success(Info.Ctx.getTypeSizeInChars(SrcTy), E);
2467f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  }
2468f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  }
2469f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne
2470f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  llvm_unreachable("unknown expr/type trait");
2471f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  return false;
2472fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner}
2473fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner
24748cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool IntExprEvaluator::VisitOffsetOfExpr(const OffsetOfExpr *OOE) {
24758ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  CharUnits Result;
24768cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  unsigned n = OOE->getNumComponents();
24778ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  if (n == 0)
24788ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return false;
24798cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  QualType CurrentType = OOE->getTypeSourceInfo()->getType();
24808ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  for (unsigned i = 0; i != n; ++i) {
24818ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    OffsetOfExpr::OffsetOfNode ON = OOE->getComponent(i);
24828ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    switch (ON.getKind()) {
24838ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case OffsetOfExpr::OffsetOfNode::Array: {
24848cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne      const Expr *Idx = OOE->getIndexExpr(ON.getArrayExprIndex());
24858ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      APSInt IdxResult;
24868ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      if (!EvaluateInteger(Idx, IdxResult, Info))
24878ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor        return false;
24888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      const ArrayType *AT = Info.Ctx.getAsArrayType(CurrentType);
24898ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      if (!AT)
24908ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor        return false;
24918ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      CurrentType = AT->getElementType();
24928ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      CharUnits ElementSize = Info.Ctx.getTypeSizeInChars(CurrentType);
24938ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Result += IdxResult.getSExtValue() * ElementSize;
24948ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor        break;
24958ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
24968ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
24978ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case OffsetOfExpr::OffsetOfNode::Field: {
24988ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      FieldDecl *MemberDecl = ON.getField();
24998ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      const RecordType *RT = CurrentType->getAs<RecordType>();
25008ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      if (!RT)
25018ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor        return false;
25028ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      RecordDecl *RD = RT->getDecl();
25038ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD);
2504ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall      unsigned i = MemberDecl->getFieldIndex();
2505cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      assert(i < RL.getFieldCount() && "offsetof field in wrong type");
2506fb1e3bc29b667f4275e1d5a43d64ec173f4f9a7dKen Dyck      Result += Info.Ctx.toCharUnitsFromBits(RL.getFieldOffset(i));
25078ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      CurrentType = MemberDecl->getType().getNonReferenceType();
25088ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
25098ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
25108ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
25118ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case OffsetOfExpr::OffsetOfNode::Identifier:
25128ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      llvm_unreachable("dependent __builtin_offsetof");
2513cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      return false;
2514cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor
2515cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor    case OffsetOfExpr::OffsetOfNode::Base: {
2516cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      CXXBaseSpecifier *BaseSpec = ON.getBase();
2517cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      if (BaseSpec->isVirtual())
2518cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor        return false;
2519cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor
2520cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      // Find the layout of the class whose base we are looking into.
2521cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      const RecordType *RT = CurrentType->getAs<RecordType>();
2522cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      if (!RT)
2523cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor        return false;
2524cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      RecordDecl *RD = RT->getDecl();
2525cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD);
2526cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor
2527cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      // Find the base class itself.
2528cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      CurrentType = BaseSpec->getType();
2529cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      const RecordType *BaseRT = CurrentType->getAs<RecordType>();
2530cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      if (!BaseRT)
2531cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor        return false;
2532cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor
2533cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      // Add the offset to the base.
25347c7f820d70c925b29290a8563b59615816a827fcKen Dyck      Result += RL.getBaseClassOffset(cast<CXXRecordDecl>(BaseRT->getDecl()));
2535cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      break;
2536cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor    }
25378ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
25388ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
25398cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  return Success(Result, OOE);
25408ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
25418ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
2542b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
25432de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  if (E->getOpcode() == UO_LNot) {
2544a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // LNot's operand isn't necessarily an integer, so we handle it specially.
2545a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    bool bres;
2546c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    if (!EvaluateAsBooleanCondition(E->getSubExpr(), bres, Info))
2547a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman      return false;
2548131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(!bres, E);
2549a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  }
2550a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
25514fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar  // Only handle integral operations...
25522ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor  if (!E->getSubExpr()->getType()->isIntegralOrEnumerationType())
25534fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar    return false;
25544fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar
2555c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  // Get the operand value.
255647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  CCValue Val;
2557c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  if (!Evaluate(Val, Info, E->getSubExpr()))
255875a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    return false;
2559a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson
256075a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  switch (E->getOpcode()) {
25614c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  default:
256275a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    // Address, indirect, pre/post inc/dec, etc are not valid constant exprs.
256375a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    // See C99 6.6p3.
25640e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E);
25652de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Extension:
25664c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    // FIXME: Should extension allow i-c-e extension expressions in its scope?
25674c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    // If so, we could clear the diagnostic ID.
2568c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return Success(Val, E);
25692de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Plus:
2570c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    // The result is just the value.
2571c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return Success(Val, E);
25722de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Minus:
2573c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    if (!Val.isInt()) return false;
2574c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return Success(-Val.getInt(), E);
25752de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Not:
2576c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    if (!Val.isInt()) return false;
2577c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return Success(~Val.getInt(), E);
257806a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson  }
2579a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson}
25801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2581732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// HandleCast - This is used to evaluate implicit or explicit casts where the
2582732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// result type is integer.
25838cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool IntExprEvaluator::VisitCastExpr(const CastExpr *E) {
25848cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  const Expr *SubExpr = E->getSubExpr();
258582206e267ce6cc709797127616f64672d255b310Anders Carlsson  QualType DestType = E->getType();
2586b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar  QualType SrcType = SubExpr->getType();
258782206e267ce6cc709797127616f64672d255b310Anders Carlsson
258846a523285928aa07bf14803178dc04616ac85994Eli Friedman  switch (E->getCastKind()) {
258946a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_BaseToDerived:
259046a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_DerivedToBase:
259146a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_UncheckedDerivedToBase:
259246a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_Dynamic:
259346a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_ToUnion:
259446a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_ArrayToPointerDecay:
259546a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_FunctionToPointerDecay:
259646a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_NullToPointer:
259746a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_NullToMemberPointer:
259846a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_BaseToDerivedMemberPointer:
259946a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_DerivedToBaseMemberPointer:
260046a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_ConstructorConversion:
260146a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_IntegralToPointer:
260246a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_ToVoid:
260346a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_VectorSplat:
260446a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_IntegralToFloating:
260546a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_FloatingCast:
26061d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall  case CK_CPointerToObjCPointerCast:
26071d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall  case CK_BlockPointerToObjCPointerCast:
260846a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_AnyPointerToBlockPointerCast:
260946a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_ObjCObjectLValueCast:
261046a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_FloatingRealToComplex:
261146a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_FloatingComplexToReal:
261246a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_FloatingComplexCast:
261346a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_FloatingComplexToIntegralComplex:
261446a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_IntegralRealToComplex:
261546a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_IntegralComplexCast:
261646a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_IntegralComplexToFloatingComplex:
261746a523285928aa07bf14803178dc04616ac85994Eli Friedman    llvm_unreachable("invalid cast kind for integral value");
261846a523285928aa07bf14803178dc04616ac85994Eli Friedman
2619e50c297f92914ca996deb8b597624193273b62e4Eli Friedman  case CK_BitCast:
262046a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_Dependent:
262146a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_LValueBitCast:
262246a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_UserDefinedConversion:
262333e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall  case CK_ARCProduceObject:
262433e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall  case CK_ARCConsumeObject:
262533e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall  case CK_ARCReclaimReturnedObject:
262633e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall  case CK_ARCExtendBlockObject:
262746a523285928aa07bf14803178dc04616ac85994Eli Friedman    return false;
262846a523285928aa07bf14803178dc04616ac85994Eli Friedman
262946a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_LValueToRValue:
263046a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_NoOp:
2631c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return ExprEvaluatorBaseTy::VisitCastExpr(E);
263246a523285928aa07bf14803178dc04616ac85994Eli Friedman
263346a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_MemberPointerToBoolean:
263446a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_PointerToBoolean:
263546a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_IntegralToBoolean:
263646a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_FloatingToBoolean:
263746a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_FloatingComplexToBoolean:
263846a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_IntegralComplexToBoolean: {
26394efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    bool BoolResult;
2640c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    if (!EvaluateAsBooleanCondition(SubExpr, BoolResult, Info))
26414efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
2642131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(BoolResult, E);
26434efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
26444efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
264546a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_IntegralCast: {
2646732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner    if (!Visit(SubExpr))
2647b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner      return false;
2648a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
2649be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    if (!Result.isInt()) {
2650be26570e3faa009bdcefedfaf04473e518940520Eli Friedman      // Only allow casts of lvalues if they are lossless.
2651be26570e3faa009bdcefedfaf04473e518940520Eli Friedman      return Info.Ctx.getTypeSize(DestType) == Info.Ctx.getTypeSize(SrcType);
2652be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    }
265330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar
2654dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar    return Success(HandleIntToIntCast(DestType, SrcType,
265530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar                                      Result.getInt(), Info.Ctx), E);
2656732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner  }
26571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
265846a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_PointerToIntegral: {
2659efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    LValue LV;
266087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner    if (!EvaluatePointer(SubExpr, LV, Info))
2661b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner      return false;
26624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2663dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar    if (LV.getLValueBase()) {
2664dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar      // Only allow based lvalue casts if they are lossless.
2665dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar      if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(SrcType))
2666dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar        return false;
2667dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar
2668efdb83e26f9a1fd2566afe54461216cd84814d42John McCall      LV.moveInto(Result);
2669dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar      return true;
2670dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar    }
26714efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2672a73058324197b7bdfd19307965954f626e26199dKen Dyck    APSInt AsInt = Info.Ctx.MakeIntValue(LV.getLValueOffset().getQuantity(),
2673a73058324197b7bdfd19307965954f626e26199dKen Dyck                                         SrcType);
2674dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar    return Success(HandleIntToIntCast(DestType, SrcType, AsInt, Info.Ctx), E);
26752bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  }
26764efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
267746a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_IntegralComplexToReal: {
2678f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    ComplexValue C;
26791725f683432715e5afe34d476024bd6f16eac3fcEli Friedman    if (!EvaluateComplex(SubExpr, C, Info))
26801725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      return false;
268146a523285928aa07bf14803178dc04616ac85994Eli Friedman    return Success(C.getComplexIntReal(), E);
26821725f683432715e5afe34d476024bd6f16eac3fcEli Friedman  }
26832217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman
268446a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_FloatingToIntegral: {
268546a523285928aa07bf14803178dc04616ac85994Eli Friedman    APFloat F(0.0);
268646a523285928aa07bf14803178dc04616ac85994Eli Friedman    if (!EvaluateFloat(SubExpr, F, Info))
268746a523285928aa07bf14803178dc04616ac85994Eli Friedman      return false;
2688732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner
268946a523285928aa07bf14803178dc04616ac85994Eli Friedman    return Success(HandleFloatToIntCast(DestType, SrcType, F, Info.Ctx), E);
269046a523285928aa07bf14803178dc04616ac85994Eli Friedman  }
269146a523285928aa07bf14803178dc04616ac85994Eli Friedman  }
26921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
269346a523285928aa07bf14803178dc04616ac85994Eli Friedman  llvm_unreachable("unknown cast resulting in integral value");
269446a523285928aa07bf14803178dc04616ac85994Eli Friedman  return false;
2695a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson}
26962bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
2697722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedmanbool IntExprEvaluator::VisitUnaryReal(const UnaryOperator *E) {
2698722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  if (E->getSubExpr()->getType()->isAnyComplexType()) {
2699f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    ComplexValue LV;
2700722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman    if (!EvaluateComplex(E->getSubExpr(), LV, Info) || !LV.isComplexInt())
2701722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman      return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
2702722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman    return Success(LV.getComplexIntReal(), E);
2703722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  }
2704722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman
2705722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  return Visit(E->getSubExpr());
2706722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman}
2707722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman
2708664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedmanbool IntExprEvaluator::VisitUnaryImag(const UnaryOperator *E) {
2709722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  if (E->getSubExpr()->getType()->isComplexIntegerType()) {
2710f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    ComplexValue LV;
2711722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman    if (!EvaluateComplex(E->getSubExpr(), LV, Info) || !LV.isComplexInt())
2712722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman      return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
2713722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman    return Success(LV.getComplexIntImag(), E);
2714722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  }
2715722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman
27168327fad71da34492d82c532f42a58cb4baff81a3Richard Smith  VisitIgnoredValue(E->getSubExpr());
2717664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman  return Success(0, E);
2718664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman}
2719664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman
2720ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregorbool IntExprEvaluator::VisitSizeOfPackExpr(const SizeOfPackExpr *E) {
2721ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  return Success(E->getPackLength(), E);
2722ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor}
2723ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor
2724295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlbool IntExprEvaluator::VisitCXXNoexceptExpr(const CXXNoexceptExpr *E) {
2725295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  return Success(E->getValue(), E);
2726295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl}
2727295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl
2728f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
2729d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman// Float Evaluation
2730d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===//
2731d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
2732d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmannamespace {
2733770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass FloatExprEvaluator
27348cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  : public ExprEvaluatorBase<FloatExprEvaluator, bool> {
2735d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  APFloat &Result;
2736d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanpublic:
2737d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  FloatExprEvaluator(EvalInfo &info, APFloat &result)
27388cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    : ExprEvaluatorBaseTy(info), Result(result) {}
2739d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
274047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  bool Success(const CCValue &V, const Expr *e) {
27418cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    Result = V.getFloat();
27428cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    return true;
27438cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  }
27448cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool Error(const Stmt *S) {
2745d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return false;
2746d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  }
2747d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
2748f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith  bool ValueInitialization(const Expr *E) {
2749f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith    Result = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(E->getType()));
2750f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith    return true;
2751f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith  }
2752f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith
2753019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  bool VisitCallExpr(const CallExpr *E);
2754d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
27555db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  bool VisitUnaryOperator(const UnaryOperator *E);
2756d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitBinaryOperator(const BinaryOperator *E);
2757d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitFloatingLiteral(const FloatingLiteral *E);
27588cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitCastExpr(const CastExpr *E);
27592217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman
2760abd3a857ace59100305790545d1baae5877b8945John McCall  bool VisitUnaryReal(const UnaryOperator *E);
2761abd3a857ace59100305790545d1baae5877b8945John McCall  bool VisitUnaryImag(const UnaryOperator *E);
2762ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman
2763abd3a857ace59100305790545d1baae5877b8945John McCall  // FIXME: Missing: array subscript of vector, member of vector,
2764abd3a857ace59100305790545d1baae5877b8945John McCall  //                 ImplicitValueInitExpr
2765d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman};
2766d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} // end anonymous namespace
2767d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
2768d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr* E, APFloat& Result, EvalInfo &Info) {
2769c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  assert(E->isRValue() && E->getType()->isRealFloatingType());
27708cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  return FloatExprEvaluator(Info, Result).Visit(E);
2771d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}
2772d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
27734ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadstatic bool TryEvaluateBuiltinNaN(const ASTContext &Context,
2774db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall                                  QualType ResultTy,
2775db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall                                  const Expr *Arg,
2776db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall                                  bool SNaN,
2777db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall                                  llvm::APFloat &Result) {
2778db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall  const StringLiteral *S = dyn_cast<StringLiteral>(Arg->IgnoreParenCasts());
2779db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall  if (!S) return false;
2780db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall
2781db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall  const llvm::fltSemantics &Sem = Context.getFloatTypeSemantics(ResultTy);
2782db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall
2783db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall  llvm::APInt fill;
2784db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall
2785db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall  // Treat empty strings as if they were zero.
2786db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall  if (S->getString().empty())
2787db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall    fill = llvm::APInt(32, 0);
2788db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall  else if (S->getString().getAsInteger(0, fill))
2789db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall    return false;
2790db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall
2791db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall  if (SNaN)
2792db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall    Result = llvm::APFloat::getSNaN(Sem, false, &fill);
2793db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall  else
2794db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall    Result = llvm::APFloat::getQNaN(Sem, false, &fill);
2795db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall  return true;
2796db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall}
2797db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall
2798019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattnerbool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) {
27993c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  switch (E->isBuiltinCall(Info.Ctx)) {
28008cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  default:
28018cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    return ExprEvaluatorBaseTy::VisitCallExpr(E);
28028cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
2803019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_huge_val:
2804019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_huge_valf:
2805019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_huge_vall:
2806019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_inf:
2807019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_inff:
28087cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar  case Builtin::BI__builtin_infl: {
28097cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar    const llvm::fltSemantics &Sem =
28107cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar      Info.Ctx.getFloatTypeSemantics(E->getType());
281134a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner    Result = llvm::APFloat::getInf(Sem);
281234a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner    return true;
28137cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar  }
28141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2815db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall  case Builtin::BI__builtin_nans:
2816db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall  case Builtin::BI__builtin_nansf:
2817db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall  case Builtin::BI__builtin_nansl:
2818db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall    return TryEvaluateBuiltinNaN(Info.Ctx, E->getType(), E->getArg(0),
2819db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall                                 true, Result);
2820db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall
28219e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner  case Builtin::BI__builtin_nan:
28229e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner  case Builtin::BI__builtin_nanf:
28239e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner  case Builtin::BI__builtin_nanl:
28244572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump    // If this is __builtin_nan() turn this into a nan, otherwise we
28259e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    // can't constant fold it.
2826db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall    return TryEvaluateBuiltinNaN(Info.Ctx, E->getType(), E->getArg(0),
2827db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall                                 false, Result);
28285db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar
28295db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_fabs:
28305db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_fabsf:
28315db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_fabsl:
28325db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    if (!EvaluateFloat(E->getArg(0), Result, Info))
28335db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar      return false;
28341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28355db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    if (Result.isNegative())
28365db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar      Result.changeSign();
28375db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
28385db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar
28391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  case Builtin::BI__builtin_copysign:
28401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  case Builtin::BI__builtin_copysignf:
28415db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_copysignl: {
28425db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    APFloat RHS(0.);
28435db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    if (!EvaluateFloat(E->getArg(0), Result, Info) ||
28445db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar        !EvaluateFloat(E->getArg(1), RHS, Info))
28455db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar      return false;
28465db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    Result.copySign(RHS);
28475db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
28485db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  }
2849019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  }
2850019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner}
2851019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner
2852abd3a857ace59100305790545d1baae5877b8945John McCallbool FloatExprEvaluator::VisitUnaryReal(const UnaryOperator *E) {
285343efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman  if (E->getSubExpr()->getType()->isAnyComplexType()) {
285443efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman    ComplexValue CV;
285543efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman    if (!EvaluateComplex(E->getSubExpr(), CV, Info))
285643efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman      return false;
285743efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman    Result = CV.FloatReal;
285843efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman    return true;
285943efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman  }
286043efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman
286143efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman  return Visit(E->getSubExpr());
2862abd3a857ace59100305790545d1baae5877b8945John McCall}
2863abd3a857ace59100305790545d1baae5877b8945John McCall
2864abd3a857ace59100305790545d1baae5877b8945John McCallbool FloatExprEvaluator::VisitUnaryImag(const UnaryOperator *E) {
286543efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman  if (E->getSubExpr()->getType()->isAnyComplexType()) {
286643efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman    ComplexValue CV;
286743efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman    if (!EvaluateComplex(E->getSubExpr(), CV, Info))
286843efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman      return false;
286943efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman    Result = CV.FloatImag;
287043efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman    return true;
287143efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman  }
287243efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman
28738327fad71da34492d82c532f42a58cb4baff81a3Richard Smith  VisitIgnoredValue(E->getSubExpr());
287443efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman  const llvm::fltSemantics &Sem = Info.Ctx.getFloatTypeSemantics(E->getType());
287543efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman  Result = llvm::APFloat::getZero(Sem);
2876abd3a857ace59100305790545d1baae5877b8945John McCall  return true;
2877abd3a857ace59100305790545d1baae5877b8945John McCall}
2878abd3a857ace59100305790545d1baae5877b8945John McCall
28795db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbarbool FloatExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
28805db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  switch (E->getOpcode()) {
28815db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  default: return false;
28822de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Plus:
28837993e8a2a26bf408c2a6d45f24fffa12db336b2bRichard Smith    return EvaluateFloat(E->getSubExpr(), Result, Info);
28842de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Minus:
28857993e8a2a26bf408c2a6d45f24fffa12db336b2bRichard Smith    if (!EvaluateFloat(E->getSubExpr(), Result, Info))
28867993e8a2a26bf408c2a6d45f24fffa12db336b2bRichard Smith      return false;
28875db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    Result.changeSign();
28885db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
28895db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  }
28905db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar}
2891019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner
2892d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
28932de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  if (E->getOpcode() == BO_Comma) {
28948327fad71da34492d82c532f42a58cb4baff81a3Richard Smith    VisitIgnoredValue(E->getLHS());
28958327fad71da34492d82c532f42a58cb4baff81a3Richard Smith    return Visit(E->getRHS());
28967f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman  }
28977f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman
2898ee591a90c2e26c1ba33a4befb364a1c35fb2c311Richard Smith  // We can't evaluate pointer-to-member operations or assignments.
2899ee591a90c2e26c1ba33a4befb364a1c35fb2c311Richard Smith  if (E->isPtrMemOp() || E->isAssignmentOp())
290096e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson    return false;
290196e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson
2902d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  // FIXME: Diagnostics?  I really don't understand how the warnings
2903d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  // and errors are supposed to work.
29045db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  APFloat RHS(0.0);
2905d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  if (!EvaluateFloat(E->getLHS(), Result, Info))
2906d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return false;
2907d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  if (!EvaluateFloat(E->getRHS(), RHS, Info))
2908d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return false;
2909d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
2910d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  switch (E->getOpcode()) {
2911d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  default: return false;
29122de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Mul:
2913d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.multiply(RHS, APFloat::rmNearestTiesToEven);
2914d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
29152de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Add:
2916d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.add(RHS, APFloat::rmNearestTiesToEven);
2917d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
29182de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Sub:
2919d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.subtract(RHS, APFloat::rmNearestTiesToEven);
2920d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
29212de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Div:
2922d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.divide(RHS, APFloat::rmNearestTiesToEven);
2923d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
2924d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  }
2925d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}
2926d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
2927d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitFloatingLiteral(const FloatingLiteral *E) {
2928d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  Result = E->getValue();
2929d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  return true;
2930d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}
2931d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
29328cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool FloatExprEvaluator::VisitCastExpr(const CastExpr *E) {
29338cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  const Expr* SubExpr = E->getSubExpr();
29341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
29352a523eec6a31955be876625819b89e8dc5def707Eli Friedman  switch (E->getCastKind()) {
29362a523eec6a31955be876625819b89e8dc5def707Eli Friedman  default:
2937c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return ExprEvaluatorBaseTy::VisitCastExpr(E);
29382a523eec6a31955be876625819b89e8dc5def707Eli Friedman
29392a523eec6a31955be876625819b89e8dc5def707Eli Friedman  case CK_IntegralToFloating: {
29404efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APSInt IntResult;
29413f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    if (!EvaluateInteger(SubExpr, IntResult, Info))
29424efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
29431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Result = HandleIntToFloatCast(E->getType(), SubExpr->getType(),
2944a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                  IntResult, Info.Ctx);
29454efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
29464efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
29472a523eec6a31955be876625819b89e8dc5def707Eli Friedman
29482a523eec6a31955be876625819b89e8dc5def707Eli Friedman  case CK_FloatingCast: {
29494efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!Visit(SubExpr))
29504efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
2951a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    Result = HandleFloatToFloatCast(E->getType(), SubExpr->getType(),
2952a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                    Result, Info.Ctx);
29534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
29544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
2955f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall
29562a523eec6a31955be876625819b89e8dc5def707Eli Friedman  case CK_FloatingComplexToReal: {
2957f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall    ComplexValue V;
2958f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall    if (!EvaluateComplex(SubExpr, V, Info))
2959f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall      return false;
2960f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall    Result = V.getComplexFloatReal();
2961f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall    return true;
2962f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall  }
29632a523eec6a31955be876625819b89e8dc5def707Eli Friedman  }
29644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
29654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return false;
29664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
29674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2968d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===//
2969a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar// Complex Evaluation (for float and integer)
29709ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===//
29719ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
29729ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonnamespace {
2973770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass ComplexExprEvaluator
29748cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  : public ExprEvaluatorBase<ComplexExprEvaluator, bool> {
2975f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall  ComplexValue &Result;
29761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
29779ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonpublic:
2978f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall  ComplexExprEvaluator(EvalInfo &info, ComplexValue &Result)
29798cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    : ExprEvaluatorBaseTy(info), Result(Result) {}
29801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
298147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  bool Success(const CCValue &V, const Expr *e) {
29828cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    Result.setFrom(V);
29838cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    return true;
29848cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  }
29858cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool Error(const Expr *E) {
2986f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    return false;
29879ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  }
29881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
29898cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  //===--------------------------------------------------------------------===//
29908cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  //                            Visitor Methods
29918cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  //===--------------------------------------------------------------------===//
29929ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
29938cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitImaginaryLiteral(const ImaginaryLiteral *E);
2994a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
29958cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitCastExpr(const CastExpr *E);
2996b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman
2997b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman  bool VisitBinaryOperator(const BinaryOperator *E);
299896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara  bool VisitUnaryOperator(const UnaryOperator *E);
2999cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl  // FIXME Missing: ImplicitValueInitExpr, InitListExpr
3000b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman};
3001b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman} // end anonymous namespace
30021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3003b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedmanstatic bool EvaluateComplex(const Expr *E, ComplexValue &Result,
3004b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman                            EvalInfo &Info) {
3005c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  assert(E->isRValue() && E->getType()->isAnyComplexType());
30068cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  return ComplexExprEvaluator(Info, Result).Visit(E);
3007b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman}
3008b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman
30098cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool ComplexExprEvaluator::VisitImaginaryLiteral(const ImaginaryLiteral *E) {
30108cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  const Expr* SubExpr = E->getSubExpr();
3011b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman
3012b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman  if (SubExpr->getType()->isRealFloatingType()) {
3013b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman    Result.makeComplexFloat();
3014b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman    APFloat &Imag = Result.FloatImag;
3015b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman    if (!EvaluateFloat(SubExpr, Imag, Info))
3016b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman      return false;
3017b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman
3018b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman    Result.FloatReal = APFloat(Imag.getSemantics());
3019b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman    return true;
3020b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman  } else {
3021b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman    assert(SubExpr->getType()->isIntegerType() &&
3022b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman           "Unexpected imaginary literal.");
3023b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman
3024b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman    Result.makeComplexInt();
3025b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman    APSInt &Imag = Result.IntImag;
3026b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman    if (!EvaluateInteger(SubExpr, Imag, Info))
3027b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman      return false;
3028b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman
3029b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman    Result.IntReal = APSInt(Imag.getBitWidth(), !Imag.isSigned());
3030b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman    return true;
3031b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman  }
3032b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman}
3033b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman
30348cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool ComplexExprEvaluator::VisitCastExpr(const CastExpr *E) {
3035b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman
30368786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  switch (E->getCastKind()) {
30378786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_BitCast:
30388786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_BaseToDerived:
30398786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_DerivedToBase:
30408786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_UncheckedDerivedToBase:
30418786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_Dynamic:
30428786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_ToUnion:
30438786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_ArrayToPointerDecay:
30448786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_FunctionToPointerDecay:
30458786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_NullToPointer:
30468786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_NullToMemberPointer:
30478786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_BaseToDerivedMemberPointer:
30488786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_DerivedToBaseMemberPointer:
30498786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_MemberPointerToBoolean:
30508786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_ConstructorConversion:
30518786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_IntegralToPointer:
30528786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_PointerToIntegral:
30538786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_PointerToBoolean:
30548786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_ToVoid:
30558786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_VectorSplat:
30568786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_IntegralCast:
30578786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_IntegralToBoolean:
30588786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_IntegralToFloating:
30598786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_FloatingToIntegral:
30608786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_FloatingToBoolean:
30618786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_FloatingCast:
30621d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall  case CK_CPointerToObjCPointerCast:
30631d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall  case CK_BlockPointerToObjCPointerCast:
30648786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_AnyPointerToBlockPointerCast:
30658786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_ObjCObjectLValueCast:
30668786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_FloatingComplexToReal:
30678786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_FloatingComplexToBoolean:
30688786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_IntegralComplexToReal:
30698786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_IntegralComplexToBoolean:
307033e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall  case CK_ARCProduceObject:
307133e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall  case CK_ARCConsumeObject:
307233e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall  case CK_ARCReclaimReturnedObject:
307333e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall  case CK_ARCExtendBlockObject:
30748786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    llvm_unreachable("invalid cast kind for complex value");
30758786da77984e81d48e0e1b2bd339809b1efc19f3John McCall
30768786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_LValueToRValue:
30778786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_NoOp:
3078c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return ExprEvaluatorBaseTy::VisitCastExpr(E);
30792bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall
30808786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_Dependent:
308146a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_LValueBitCast:
30828786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_UserDefinedConversion:
30838786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    return false;
30848786da77984e81d48e0e1b2bd339809b1efc19f3John McCall
30858786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_FloatingRealToComplex: {
3086b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman    APFloat &Real = Result.FloatReal;
30878786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    if (!EvaluateFloat(E->getSubExpr(), Real, Info))
3088b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman      return false;
3089b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman
30908786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    Result.makeComplexFloat();
30918786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    Result.FloatImag = APFloat(Real.getSemantics());
30928786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    return true;
30938786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  }
30948786da77984e81d48e0e1b2bd339809b1efc19f3John McCall
30958786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_FloatingComplexCast: {
30968786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    if (!Visit(E->getSubExpr()))
30978786da77984e81d48e0e1b2bd339809b1efc19f3John McCall      return false;
30988786da77984e81d48e0e1b2bd339809b1efc19f3John McCall
30998786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    QualType To = E->getType()->getAs<ComplexType>()->getElementType();
31008786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    QualType From
31018786da77984e81d48e0e1b2bd339809b1efc19f3John McCall      = E->getSubExpr()->getType()->getAs<ComplexType>()->getElementType();
31028786da77984e81d48e0e1b2bd339809b1efc19f3John McCall
31038786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    Result.FloatReal
31048786da77984e81d48e0e1b2bd339809b1efc19f3John McCall      = HandleFloatToFloatCast(To, From, Result.FloatReal, Info.Ctx);
31058786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    Result.FloatImag
31068786da77984e81d48e0e1b2bd339809b1efc19f3John McCall      = HandleFloatToFloatCast(To, From, Result.FloatImag, Info.Ctx);
31078786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    return true;
31088786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  }
31098786da77984e81d48e0e1b2bd339809b1efc19f3John McCall
31108786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_FloatingComplexToIntegralComplex: {
31118786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    if (!Visit(E->getSubExpr()))
31128786da77984e81d48e0e1b2bd339809b1efc19f3John McCall      return false;
31138786da77984e81d48e0e1b2bd339809b1efc19f3John McCall
31148786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    QualType To = E->getType()->getAs<ComplexType>()->getElementType();
31158786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    QualType From
31168786da77984e81d48e0e1b2bd339809b1efc19f3John McCall      = E->getSubExpr()->getType()->getAs<ComplexType>()->getElementType();
31178786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    Result.makeComplexInt();
31188786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    Result.IntReal = HandleFloatToIntCast(To, From, Result.FloatReal, Info.Ctx);
31198786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    Result.IntImag = HandleFloatToIntCast(To, From, Result.FloatImag, Info.Ctx);
31208786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    return true;
31218786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  }
31228786da77984e81d48e0e1b2bd339809b1efc19f3John McCall
31238786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_IntegralRealToComplex: {
3124b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman    APSInt &Real = Result.IntReal;
31258786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    if (!EvaluateInteger(E->getSubExpr(), Real, Info))
3126b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman      return false;
31279ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
31288786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    Result.makeComplexInt();
31298786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    Result.IntImag = APSInt(Real.getBitWidth(), !Real.isSigned());
31308786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    return true;
31318786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  }
31328786da77984e81d48e0e1b2bd339809b1efc19f3John McCall
31338786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_IntegralComplexCast: {
31348786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    if (!Visit(E->getSubExpr()))
3135b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman      return false;
3136ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
31378786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    QualType To = E->getType()->getAs<ComplexType>()->getElementType();
31388786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    QualType From
31398786da77984e81d48e0e1b2bd339809b1efc19f3John McCall      = E->getSubExpr()->getType()->getAs<ComplexType>()->getElementType();
31401725f683432715e5afe34d476024bd6f16eac3fcEli Friedman
31418786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    Result.IntReal = HandleIntToIntCast(To, From, Result.IntReal, Info.Ctx);
31428786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    Result.IntImag = HandleIntToIntCast(To, From, Result.IntImag, Info.Ctx);
31438786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    return true;
31448786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  }
31458786da77984e81d48e0e1b2bd339809b1efc19f3John McCall
31468786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_IntegralComplexToFloatingComplex: {
31478786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    if (!Visit(E->getSubExpr()))
31488786da77984e81d48e0e1b2bd339809b1efc19f3John McCall      return false;
31498786da77984e81d48e0e1b2bd339809b1efc19f3John McCall
31508786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    QualType To = E->getType()->getAs<ComplexType>()->getElementType();
31518786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    QualType From
31528786da77984e81d48e0e1b2bd339809b1efc19f3John McCall      = E->getSubExpr()->getType()->getAs<ComplexType>()->getElementType();
31538786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    Result.makeComplexFloat();
31548786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    Result.FloatReal = HandleIntToFloatCast(To, From, Result.IntReal, Info.Ctx);
31558786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    Result.FloatImag = HandleIntToFloatCast(To, From, Result.IntImag, Info.Ctx);
31568786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    return true;
31578786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  }
3158ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  }
31591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
31608786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  llvm_unreachable("unknown cast resulting in complex value");
3161b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman  return false;
31629ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson}
31639ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
3164f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCallbool ComplexExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
316596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara  if (E->getOpcode() == BO_Comma) {
31668327fad71da34492d82c532f42a58cb4baff81a3Richard Smith    VisitIgnoredValue(E->getLHS());
31678327fad71da34492d82c532f42a58cb4baff81a3Richard Smith    return Visit(E->getRHS());
316896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara  }
3169f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall  if (!Visit(E->getLHS()))
3170f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    return false;
31711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3172f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall  ComplexValue RHS;
3173a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  if (!EvaluateComplex(E->getRHS(), RHS, Info))
3174f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    return false;
3175a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
31763f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar  assert(Result.isComplexFloat() == RHS.isComplexFloat() &&
31773f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar         "Invalid operands to binary operator.");
3178ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  switch (E->getOpcode()) {
3179f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall  default: return false;
31802de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Add:
3181a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    if (Result.isComplexFloat()) {
3182a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatReal().add(RHS.getComplexFloatReal(),
3183a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                       APFloat::rmNearestTiesToEven);
3184a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatImag().add(RHS.getComplexFloatImag(),
3185a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                       APFloat::rmNearestTiesToEven);
3186a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    } else {
3187a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntReal() += RHS.getComplexIntReal();
3188a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntImag() += RHS.getComplexIntImag();
3189a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    }
31903f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    break;
31912de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Sub:
3192a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    if (Result.isComplexFloat()) {
3193a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatReal().subtract(RHS.getComplexFloatReal(),
3194a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                            APFloat::rmNearestTiesToEven);
3195a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatImag().subtract(RHS.getComplexFloatImag(),
3196a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                            APFloat::rmNearestTiesToEven);
3197a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    } else {
3198a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntReal() -= RHS.getComplexIntReal();
3199a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntImag() -= RHS.getComplexIntImag();
3200a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    }
32013f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    break;
32022de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Mul:
32033f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    if (Result.isComplexFloat()) {
3204f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall      ComplexValue LHS = Result;
32053f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &LHS_r = LHS.getComplexFloatReal();
32063f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &LHS_i = LHS.getComplexFloatImag();
32073f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &RHS_r = RHS.getComplexFloatReal();
32083f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &RHS_i = RHS.getComplexFloatImag();
32091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
32103f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat Tmp = LHS_r;
32113f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven);
32123f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatReal() = Tmp;
32133f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp = LHS_i;
32143f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven);
32153f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatReal().subtract(Tmp, APFloat::rmNearestTiesToEven);
32163f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar
32173f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp = LHS_r;
32183f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven);
32193f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatImag() = Tmp;
32203f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp = LHS_i;
32213f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven);
32223f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatImag().add(Tmp, APFloat::rmNearestTiesToEven);
32233f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    } else {
3224f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall      ComplexValue LHS = Result;
32251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Result.getComplexIntReal() =
32263f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar        (LHS.getComplexIntReal() * RHS.getComplexIntReal() -
32273f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar         LHS.getComplexIntImag() * RHS.getComplexIntImag());
32281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Result.getComplexIntImag() =
32293f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar        (LHS.getComplexIntReal() * RHS.getComplexIntImag() +
32303f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar         LHS.getComplexIntImag() * RHS.getComplexIntReal());
32313f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    }
32323f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    break;
323396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara  case BO_Div:
323496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    if (Result.isComplexFloat()) {
323596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      ComplexValue LHS = Result;
323696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      APFloat &LHS_r = LHS.getComplexFloatReal();
323796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      APFloat &LHS_i = LHS.getComplexFloatImag();
323896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      APFloat &RHS_r = RHS.getComplexFloatReal();
323996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      APFloat &RHS_i = RHS.getComplexFloatImag();
324096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      APFloat &Res_r = Result.getComplexFloatReal();
324196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      APFloat &Res_i = Result.getComplexFloatImag();
324296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara
324396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      APFloat Den = RHS_r;
324496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Den.multiply(RHS_r, APFloat::rmNearestTiesToEven);
324596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      APFloat Tmp = RHS_i;
324696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven);
324796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Den.add(Tmp, APFloat::rmNearestTiesToEven);
324896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara
324996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Res_r = LHS_r;
325096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Res_r.multiply(RHS_r, APFloat::rmNearestTiesToEven);
325196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Tmp = LHS_i;
325296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven);
325396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Res_r.add(Tmp, APFloat::rmNearestTiesToEven);
325496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Res_r.divide(Den, APFloat::rmNearestTiesToEven);
325596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara
325696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Res_i = LHS_i;
325796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Res_i.multiply(RHS_r, APFloat::rmNearestTiesToEven);
325896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Tmp = LHS_r;
325996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven);
326096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Res_i.subtract(Tmp, APFloat::rmNearestTiesToEven);
326196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Res_i.divide(Den, APFloat::rmNearestTiesToEven);
326296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    } else {
326396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      if (RHS.getComplexIntReal() == 0 && RHS.getComplexIntImag() == 0) {
326496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara        // FIXME: what about diagnostics?
326596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara        return false;
326696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      }
326796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      ComplexValue LHS = Result;
326896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      APSInt Den = RHS.getComplexIntReal() * RHS.getComplexIntReal() +
326996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara        RHS.getComplexIntImag() * RHS.getComplexIntImag();
327096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Result.getComplexIntReal() =
327196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara        (LHS.getComplexIntReal() * RHS.getComplexIntReal() +
327296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara         LHS.getComplexIntImag() * RHS.getComplexIntImag()) / Den;
327396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Result.getComplexIntImag() =
327496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara        (LHS.getComplexIntImag() * RHS.getComplexIntReal() -
327596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara         LHS.getComplexIntReal() * RHS.getComplexIntImag()) / Den;
327696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    }
327796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    break;
3278ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  }
3279ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
3280f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall  return true;
3281ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson}
3282ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
328396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnarabool ComplexExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
328496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara  // Get the operand value into 'Result'.
328596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara  if (!Visit(E->getSubExpr()))
328696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    return false;
328796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara
328896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara  switch (E->getOpcode()) {
328996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara  default:
329096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    // FIXME: what about diagnostics?
329196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    return false;
329296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara  case UO_Extension:
329396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    return true;
329496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara  case UO_Plus:
329596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    // The result is always just the subexpr.
329696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    return true;
329796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara  case UO_Minus:
329896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    if (Result.isComplexFloat()) {
329996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Result.getComplexFloatReal().changeSign();
330096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Result.getComplexFloatImag().changeSign();
330196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    }
330296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    else {
330396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Result.getComplexIntReal() = -Result.getComplexIntReal();
330496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Result.getComplexIntImag() = -Result.getComplexIntImag();
330596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    }
330696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    return true;
330796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara  case UO_Not:
330896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    if (Result.isComplexFloat())
330996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Result.getComplexFloatImag().changeSign();
331096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    else
331196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Result.getComplexIntImag() = -Result.getComplexIntImag();
331296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    return true;
331396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara  }
331496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara}
331596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara
33169ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===//
331751f4708c00110940ca3f337961915f2ca1668375Richard Smith// Top level Expr::EvaluateAsRValue method.
3318f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
3319f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
332047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smithstatic bool Evaluate(CCValue &Result, EvalInfo &Info, const Expr *E) {
3321c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  // In C, function designators are not lvalues, but we evaluate them as if they
3322c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  // are.
3323c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  if (E->isGLValue() || E->getType()->isFunctionType()) {
3324c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    LValue LV;
3325c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    if (!EvaluateLValue(E, LV, Info))
3326c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith      return false;
3327c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    LV.moveInto(Result);
3328c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  } else if (E->getType()->isVectorType()) {
33291e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith    if (!EvaluateVector(E, Result, Info))
333059b5da6d853b4368b984700315adf7b37de05764Nate Begeman      return false;
3331575a1c9dc8dc5b4977194993e289f9eda7295c39Douglas Gregor  } else if (E->getType()->isIntegralOrEnumerationType()) {
33321e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith    if (!IntExprEvaluator(Info, Result).Visit(E))
33336dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
3334efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  } else if (E->getType()->hasPointerRepresentation()) {
3335efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    LValue LV;
3336efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    if (!EvaluatePointer(E, LV, Info))
33376dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
33381e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith    LV.moveInto(Result);
3339efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  } else if (E->getType()->isRealFloatingType()) {
3340efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    llvm::APFloat F(0.0);
3341efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    if (!EvaluateFloat(E, F, Info))
33426dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
334347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    Result = CCValue(F);
3344efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  } else if (E->getType()->isAnyComplexType()) {
3345efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    ComplexValue C;
3346efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    if (!EvaluateComplex(E, C, Info))
3347660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump      return false;
33481e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith    C.moveInto(Result);
334969c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith  } else if (E->getType()->isMemberPointerType()) {
335069c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith    // FIXME: Implement evaluation of pointer-to-member types.
335169c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith    return false;
335269c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith  } else if (E->getType()->isArrayType() && E->getType()->isLiteralType()) {
3353cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    if (!EvaluateArray(E, Result, Info))
3354cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith      return false;
335569c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith  } else if (E->getType()->isRecordType() && E->getType()->isLiteralType()) {
335669c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith    // FIXME: Implement evaluation of record rvalues.
335769c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith    return false;
3358660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump  } else
3359660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump    return false;
3360660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump
3361660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump  return true;
3362660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump}
3363660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump
336469c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith/// EvaluateConstantExpression - Evaluate an expression as a constant expression
336569c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith/// in-place in an APValue. In some cases, the in-place evaluation is essential,
336669c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith/// since later initializers for an object can indirectly refer to subobjects
336769c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith/// which were initialized earlier.
336869c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smithstatic bool EvaluateConstantExpression(APValue &Result, EvalInfo &Info,
336969c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith                                       const Expr *E) {
337069c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith  if (E->isRValue() && E->getType()->isLiteralType()) {
337169c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith    // Evaluate arrays and record types in-place, so that later initializers can
337269c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith    // refer to earlier-initialized members of the object.
3373cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    if (E->getType()->isArrayType()) {
3374cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith      if (!EvaluateArray(E, Result, Info))
3375cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith        return false;
3376cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    } else if (E->getType()->isRecordType())
337769c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith      // FIXME: Implement evaluation of record rvalues.
337869c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith      return false;
337969c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith  }
338069c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith
338169c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith  // For any other type, in-place evaluation is unimportant.
338269c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith  CCValue CoreConstResult;
338369c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith  return Evaluate(CoreConstResult, Info, E) &&
338469c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith         CheckConstantExpression(CoreConstResult, Result);
338569c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith}
338669c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith
3387c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
338851f4708c00110940ca3f337961915f2ca1668375Richard Smith/// EvaluateAsRValue - Return true if this is a constant which we can fold using
338956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// any crazy technique (that has nothing to do with language standards) that
339056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// we want to.  If this function returns true, it returns the folded constant
3391c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// in Result. If this expression is a glvalue, an lvalue-to-rvalue conversion
3392c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// will be applied to the result.
339351f4708c00110940ca3f337961915f2ca1668375Richard Smithbool Expr::EvaluateAsRValue(EvalResult &Result, const ASTContext &Ctx) const {
339456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  EvalInfo Info(Ctx, Result);
3395c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
339647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  CCValue Value;
339747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  if (!::Evaluate(Value, Info, this))
3398c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return false;
3399c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
3400c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  if (isGLValue()) {
3401c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    LValue LV;
340247a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    LV.setFrom(Value);
340347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    if (!HandleLValueToRValueConversion(Info, getType(), LV, Value))
340447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith      return false;
3405c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  }
3406c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
3407cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  // Don't produce array constants until CodeGen is taught to handle them.
3408cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  if (Value.isArray())
3409cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    return false;
3410cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith
341147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  // Check this core constant expression is a constant expression, and if so,
341269c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith  // convert it to one.
341369c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith  return CheckConstantExpression(Value, Result.Val);
341456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall}
341556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
34164ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool Expr::EvaluateAsBooleanCondition(bool &Result,
34174ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                      const ASTContext &Ctx) const {
3418c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  EvalResult Scratch;
341951f4708c00110940ca3f337961915f2ca1668375Richard Smith  return EvaluateAsRValue(Scratch, Ctx) &&
3420177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith         HandleConversionToBool(CCValue(Scratch.Val, CCValue::GlobalValue()),
342147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith                                Result);
3422cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall}
3423cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall
3424a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smithbool Expr::EvaluateAsInt(APSInt &Result, const ASTContext &Ctx) const {
3425c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  EvalResult ExprResult;
342651f4708c00110940ca3f337961915f2ca1668375Richard Smith  if (!EvaluateAsRValue(ExprResult, Ctx) || ExprResult.HasSideEffects ||
3427c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith      !ExprResult.Val.isInt()) {
3428c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return false;
3429c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  }
3430c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  Result = ExprResult.Val.getInt();
3431c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  return true;
3432a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith}
3433a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith
34344ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool Expr::EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx) const {
34351b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson  EvalInfo Info(Ctx, Result);
34361b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson
3437efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  LValue LV;
34389a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith  return EvaluateLValue(this, LV, Info) && !Result.HasSideEffects &&
34399a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith         CheckLValueConstantExpression(LV, Result.Val);
3440b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman}
3441b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman
344251f4708c00110940ca3f337961915f2ca1668375Richard Smith/// isEvaluatable - Call EvaluateAsRValue to see if this expression can be
344351f4708c00110940ca3f337961915f2ca1668375Richard Smith/// constant folded, but discard the result.
34444ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool Expr::isEvaluatable(const ASTContext &Ctx) const {
34454fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson  EvalResult Result;
344651f4708c00110940ca3f337961915f2ca1668375Richard Smith  return EvaluateAsRValue(Result, Ctx) && !Result.HasSideEffects;
344745b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner}
344851fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson
34494ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool Expr::HasSideEffects(const ASTContext &Ctx) const {
34501e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith  return HasSideEffect(Ctx).Visit(this);
3451393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian}
3452393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian
3453a6b8b2c09610b8bc4330e948ece8b940c2386406Richard SmithAPSInt Expr::EvaluateKnownConstInt(const ASTContext &Ctx) const {
34541c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  EvalResult EvalResult;
345551f4708c00110940ca3f337961915f2ca1668375Richard Smith  bool Result = EvaluateAsRValue(EvalResult, Ctx);
3456c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin  (void)Result;
345751fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson  assert(Result && "Could not evaluate expression");
34581c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer");
345951fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson
34601c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  return EvalResult.Val.getInt();
346151fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson}
3462d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
3463e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara bool Expr::EvalResult::isGlobalLValue() const {
3464e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara   assert(Val.isLValue());
3465e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara   return IsGlobalLValue(Val.getLValueBase());
3466e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara }
3467e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara
3468e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara
3469d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// isIntegerConstantExpr - this recursive routine will test if an expression is
3470d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// an integer constant expression.
3471d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
3472d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// FIXME: Pass up a reason why! Invalid operation in i-c-e, division by zero,
3473d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// comma, etc
3474d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall///
3475d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// FIXME: Handle offsetof.  Two things to do:  Handle GCC's __builtin_offsetof
3476d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// to support gcc 4.0+  and handle the idiom GCC recognizes with a null pointer
3477d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// cast+dereference.
3478d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
3479d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// CheckICE - This function does the fundamental ICE checking: the returned
3480d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// ICEDiag contains a Val of 0, 1, or 2, and a possibly null SourceLocation.
3481d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// Note that to reduce code duplication, this helper does no evaluation
3482d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// itself; the caller checks whether the expression is evaluatable, and
3483d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// in the rare cases where CheckICE actually cares about the evaluated
3484d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// value, it calls into Evalute.
3485d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall//
3486d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// Meanings of Val:
348751f4708c00110940ca3f337961915f2ca1668375Richard Smith// 0: This expression is an ICE.
3488d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// 1: This expression is not an ICE, but if it isn't evaluated, it's
3489d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall//    a legal subexpression for an ICE. This return value is used to handle
3490d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall//    the comma operator in C99 mode.
3491d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// 2: This expression is not an ICE, and is not a legal subexpression for one.
3492d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
34933c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohmannamespace {
34943c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohman
3495d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCallstruct ICEDiag {
3496d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  unsigned Val;
3497d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  SourceLocation Loc;
3498d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
3499d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  public:
3500d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  ICEDiag(unsigned v, SourceLocation l) : Val(v), Loc(l) {}
3501d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  ICEDiag() : Val(0) {}
3502d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall};
3503d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
35043c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohman}
35053c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohman
35063c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohmanstatic ICEDiag NoDiag() { return ICEDiag(); }
3507d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
3508d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCallstatic ICEDiag CheckEvalInICE(const Expr* E, ASTContext &Ctx) {
3509d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  Expr::EvalResult EVResult;
351051f4708c00110940ca3f337961915f2ca1668375Richard Smith  if (!E->EvaluateAsRValue(EVResult, Ctx) || EVResult.HasSideEffects ||
3511d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      !EVResult.Val.isInt()) {
3512d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    return ICEDiag(2, E->getLocStart());
3513d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  }
3514d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  return NoDiag();
3515d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall}
3516d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
3517d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCallstatic ICEDiag CheckICE(const Expr* E, ASTContext &Ctx) {
3518d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  assert(!E->isValueDependent() && "Should not see value dependent exprs!");
35192ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor  if (!E->getType()->isIntegralOrEnumerationType()) {
3520d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    return ICEDiag(2, E->getLocStart());
3521d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  }
3522d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
3523d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  switch (E->getStmtClass()) {
352463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall#define ABSTRACT_STMT(Node)
3525d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall#define STMT(Node, Base) case Expr::Node##Class:
3526d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall#define EXPR(Node, Base)
3527d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall#include "clang/AST/StmtNodes.inc"
3528d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::PredefinedExprClass:
3529d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::FloatingLiteralClass:
3530d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ImaginaryLiteralClass:
3531d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::StringLiteralClass:
3532d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ArraySubscriptExprClass:
3533d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::MemberExprClass:
3534d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CompoundAssignOperatorClass:
3535d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CompoundLiteralExprClass:
3536d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ExtVectorElementExprClass:
3537d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::DesignatedInitExprClass:
3538d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ImplicitValueInitExprClass:
3539d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ParenListExprClass:
3540d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::VAArgExprClass:
3541d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::AddrLabelExprClass:
3542d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::StmtExprClass:
3543d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXMemberCallExprClass:
3544e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  case Expr::CUDAKernelCallExprClass:
3545d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXDynamicCastExprClass:
3546d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXTypeidExprClass:
35479be88403e965cc49af76c9d33d818781d44b333eFrancois Pichet  case Expr::CXXUuidofExprClass:
3548d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXNullPtrLiteralExprClass:
3549d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXThisExprClass:
3550d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXThrowExprClass:
3551d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXNewExprClass:
3552d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXDeleteExprClass:
3553d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXPseudoDestructorExprClass:
3554d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::UnresolvedLookupExprClass:
3555d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::DependentScopeDeclRefExprClass:
3556d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXConstructExprClass:
3557d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXBindTemporaryExprClass:
35584765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall  case Expr::ExprWithCleanupsClass:
3559d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXTemporaryObjectExprClass:
3560d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXUnresolvedConstructExprClass:
3561d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXDependentScopeMemberExprClass:
3562d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::UnresolvedMemberExprClass:
3563d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ObjCStringLiteralClass:
3564d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ObjCEncodeExprClass:
3565d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ObjCMessageExprClass:
3566d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ObjCSelectorExprClass:
3567d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ObjCProtocolExprClass:
3568d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ObjCIvarRefExprClass:
3569d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ObjCPropertyRefExprClass:
3570d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ObjCIsaExprClass:
3571d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ShuffleVectorExprClass:
3572d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::BlockExprClass:
3573d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::BlockDeclRefExprClass:
3574d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::NoStmtClass:
35757cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall  case Expr::OpaqueValueExprClass:
3576be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor  case Expr::PackExpansionExprClass:
3577c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  case Expr::SubstNonTypeTemplateParmPackExprClass:
357861eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner  case Expr::AsTypeExprClass:
3579f85e193739c953358c865005855253af4f68a497John McCall  case Expr::ObjCIndirectCopyRestoreExprClass:
358003e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor  case Expr::MaterializeTemporaryExprClass:
35814b9c2d235fb9449e249d74f48ecfec601650de93John McCall  case Expr::PseudoObjectExprClass:
3582276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  case Expr::AtomicExprClass:
3583d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    return ICEDiag(2, E->getLocStart());
3584d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
3585cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl  case Expr::InitListExprClass:
3586cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl    if (Ctx.getLangOptions().CPlusPlus0x) {
3587cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl      const InitListExpr *ILE = cast<InitListExpr>(E);
3588cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl      if (ILE->getNumInits() == 0)
3589cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl        return NoDiag();
3590cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl      if (ILE->getNumInits() == 1)
3591cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl        return CheckICE(ILE->getInit(0), Ctx);
3592cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl      // Fall through for more than 1 expression.
3593cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl    }
3594cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl    return ICEDiag(2, E->getLocStart());
3595cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl
3596ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  case Expr::SizeOfPackExprClass:
3597d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::GNUNullExprClass:
3598d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    // GCC considers the GNU __null value to be an integral constant expression.
3599d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    return NoDiag();
3600d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
360191a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall  case Expr::SubstNonTypeTemplateParmExprClass:
360291a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall    return
360391a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall      CheckICE(cast<SubstNonTypeTemplateParmExpr>(E)->getReplacement(), Ctx);
360491a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall
3605d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ParenExprClass:
3606d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    return CheckICE(cast<ParenExpr>(E)->getSubExpr(), Ctx);
3607f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  case Expr::GenericSelectionExprClass:
3608f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    return CheckICE(cast<GenericSelectionExpr>(E)->getResultExpr(), Ctx);
3609d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::IntegerLiteralClass:
3610d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CharacterLiteralClass:
3611d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXBoolLiteralExprClass:
3612ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor  case Expr::CXXScalarValueInitExprClass:
3613d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::UnaryTypeTraitExprClass:
36146ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  case Expr::BinaryTypeTraitExprClass:
361521ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  case Expr::ArrayTypeTraitExprClass:
3616552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  case Expr::ExpressionTraitExprClass:
36172e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  case Expr::CXXNoexceptExprClass:
3618d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    return NoDiag();
3619d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CallExprClass:
36206cf750298d3621d8a10a6dd07fcee8e274b9d94dSean Hunt  case Expr::CXXOperatorCallExprClass: {
362105830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith    // C99 6.6/3 allows function calls within unevaluated subexpressions of
362205830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith    // constant expressions, but they can never be ICEs because an ICE cannot
362305830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith    // contain an operand of (pointer to) function type.
3624d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    const CallExpr *CE = cast<CallExpr>(E);
3625d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    if (CE->isBuiltinCall(Ctx))
3626d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      return CheckEvalInICE(E, Ctx);
3627d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    return ICEDiag(2, E->getLocStart());
3628d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  }
3629d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::DeclRefExprClass:
3630d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    if (isa<EnumConstantDecl>(cast<DeclRefExpr>(E)->getDecl()))
3631d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      return NoDiag();
363203f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith    if (Ctx.getLangOptions().CPlusPlus && IsConstNonVolatile(E->getType())) {
3633d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      const NamedDecl *D = cast<DeclRefExpr>(E)->getDecl();
3634d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
3635d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      // Parameter variables are never constants.  Without this check,
3636d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      // getAnyInitializer() can find a default argument, which leads
3637d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      // to chaos.
3638d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      if (isa<ParmVarDecl>(D))
3639d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        return ICEDiag(2, cast<DeclRefExpr>(E)->getLocation());
3640d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
3641d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      // C++ 7.1.5.1p2
3642d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      //   A variable of non-volatile const-qualified integral or enumeration
3643d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      //   type initialized by an ICE can be used in ICEs.
3644d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      if (const VarDecl *Dcl = dyn_cast<VarDecl>(D)) {
3645db1822c6de43ff4aa5fa00234bf8222f6f4816e8Richard Smith        if (!Dcl->getType()->isIntegralOrEnumerationType())
3646db1822c6de43ff4aa5fa00234bf8222f6f4816e8Richard Smith          return ICEDiag(2, cast<DeclRefExpr>(E)->getLocation());
3647db1822c6de43ff4aa5fa00234bf8222f6f4816e8Richard Smith
3648d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        // Look for a declaration of this variable that has an initializer.
3649d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        const VarDecl *ID = 0;
3650d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        const Expr *Init = Dcl->getAnyInitializer(ID);
3651d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        if (Init) {
3652d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          if (ID->isInitKnownICE()) {
3653d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall            // We have already checked whether this subexpression is an
3654d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall            // integral constant expression.
3655d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall            if (ID->isInitICE())
3656d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall              return NoDiag();
3657d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall            else
3658d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall              return ICEDiag(2, cast<DeclRefExpr>(E)->getLocation());
3659d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          }
3660d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
3661d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          // It's an ICE whether or not the definition we found is
3662d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          // out-of-line.  See DR 721 and the discussion in Clang PR
3663d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          // 6206 for details.
3664d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
3665d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          if (Dcl->isCheckingICE()) {
3666d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall            return ICEDiag(2, cast<DeclRefExpr>(E)->getLocation());
3667d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          }
3668d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
3669d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          Dcl->setCheckingICE();
3670d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          ICEDiag Result = CheckICE(Init, Ctx);
3671d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          // Cache the result of the ICE test.
3672d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          Dcl->setInitKnownICE(Result.Val == 0);
3673d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          return Result;
3674d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        }
3675d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      }
3676d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    }
3677d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    return ICEDiag(2, E->getLocStart());
3678d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::UnaryOperatorClass: {
3679d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    const UnaryOperator *Exp = cast<UnaryOperator>(E);
3680d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    switch (Exp->getOpcode()) {
36812de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_PostInc:
36822de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_PostDec:
36832de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_PreInc:
36842de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_PreDec:
36852de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_AddrOf:
36862de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Deref:
368705830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith      // C99 6.6/3 allows increment and decrement within unevaluated
368805830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith      // subexpressions of constant expressions, but they can never be ICEs
368905830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith      // because an ICE cannot contain an lvalue operand.
3690d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      return ICEDiag(2, E->getLocStart());
36912de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Extension:
36922de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_LNot:
36932de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Plus:
36942de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Minus:
36952de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Not:
36962de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Real:
36972de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Imag:
3698d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      return CheckICE(Exp->getSubExpr(), Ctx);
3699d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    }
3700d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
3701d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    // OffsetOf falls through here.
3702d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  }
3703d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::OffsetOfExprClass: {
3704d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      // Note that per C99, offsetof must be an ICE. And AFAIK, using
370551f4708c00110940ca3f337961915f2ca1668375Richard Smith      // EvaluateAsRValue matches the proposed gcc behavior for cases like
370605830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith      // "offsetof(struct s{int x[4];}, x[1.0])".  This doesn't affect
3707d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      // compliance: we should warn earlier for offsetof expressions with
3708d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      // array subscripts that aren't ICEs, and if the array subscripts
3709d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      // are ICEs, the value of the offsetof must be an integer constant.
3710d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      return CheckEvalInICE(E, Ctx);
3711d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  }
3712f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  case Expr::UnaryExprOrTypeTraitExprClass: {
3713f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    const UnaryExprOrTypeTraitExpr *Exp = cast<UnaryExprOrTypeTraitExpr>(E);
3714f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    if ((Exp->getKind() ==  UETT_SizeOf) &&
3715f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne        Exp->getTypeOfArgument()->isVariableArrayType())
3716d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      return ICEDiag(2, E->getLocStart());
3717d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    return NoDiag();
3718d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  }
3719d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::BinaryOperatorClass: {
3720d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    const BinaryOperator *Exp = cast<BinaryOperator>(E);
3721d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    switch (Exp->getOpcode()) {
37222de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_PtrMemD:
37232de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_PtrMemI:
37242de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Assign:
37252de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_MulAssign:
37262de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_DivAssign:
37272de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_RemAssign:
37282de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_AddAssign:
37292de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_SubAssign:
37302de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_ShlAssign:
37312de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_ShrAssign:
37322de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_AndAssign:
37332de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_XorAssign:
37342de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_OrAssign:
373505830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith      // C99 6.6/3 allows assignments within unevaluated subexpressions of
373605830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith      // constant expressions, but they can never be ICEs because an ICE cannot
373705830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith      // contain an lvalue operand.
3738d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      return ICEDiag(2, E->getLocStart());
3739d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
37402de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Mul:
37412de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Div:
37422de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Rem:
37432de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Add:
37442de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Sub:
37452de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Shl:
37462de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Shr:
37472de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_LT:
37482de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_GT:
37492de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_LE:
37502de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_GE:
37512de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_EQ:
37522de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_NE:
37532de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_And:
37542de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Xor:
37552de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Or:
37562de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Comma: {
3757d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      ICEDiag LHSResult = CheckICE(Exp->getLHS(), Ctx);
3758d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      ICEDiag RHSResult = CheckICE(Exp->getRHS(), Ctx);
37592de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      if (Exp->getOpcode() == BO_Div ||
37602de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall          Exp->getOpcode() == BO_Rem) {
376151f4708c00110940ca3f337961915f2ca1668375Richard Smith        // EvaluateAsRValue gives an error for undefined Div/Rem, so make sure
3762d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        // we don't evaluate one.
37633b332ab132fa85c83833d74d400f6e126f52fbd2John McCall        if (LHSResult.Val == 0 && RHSResult.Val == 0) {
3764a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith          llvm::APSInt REval = Exp->getRHS()->EvaluateKnownConstInt(Ctx);
3765d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          if (REval == 0)
3766d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall            return ICEDiag(1, E->getLocStart());
3767d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          if (REval.isSigned() && REval.isAllOnesValue()) {
3768a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith            llvm::APSInt LEval = Exp->getLHS()->EvaluateKnownConstInt(Ctx);
3769d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall            if (LEval.isMinSignedValue())
3770d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall              return ICEDiag(1, E->getLocStart());
3771d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          }
3772d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        }
3773d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      }
37742de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      if (Exp->getOpcode() == BO_Comma) {
3775d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        if (Ctx.getLangOptions().C99) {
3776d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          // C99 6.6p3 introduces a strange edge case: comma can be in an ICE
3777d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          // if it isn't evaluated.
3778d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          if (LHSResult.Val == 0 && RHSResult.Val == 0)
3779d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall            return ICEDiag(1, E->getLocStart());
3780d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        } else {
3781d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          // In both C89 and C++, commas in ICEs are illegal.
3782d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          return ICEDiag(2, E->getLocStart());
3783d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        }
3784d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      }
3785d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      if (LHSResult.Val >= RHSResult.Val)
3786d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        return LHSResult;
3787d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      return RHSResult;
3788d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    }
37892de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_LAnd:
37902de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_LOr: {
3791d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      ICEDiag LHSResult = CheckICE(Exp->getLHS(), Ctx);
379263fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor
379363fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor      // C++0x [expr.const]p2:
379463fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor      //   [...] subexpressions of logical AND (5.14), logical OR
379563fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor      //   (5.15), and condi- tional (5.16) operations that are not
379663fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor      //   evaluated are not considered.
379763fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor      if (Ctx.getLangOptions().CPlusPlus0x && LHSResult.Val == 0) {
379863fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor        if (Exp->getOpcode() == BO_LAnd &&
3799a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith            Exp->getLHS()->EvaluateKnownConstInt(Ctx) == 0)
380063fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor          return LHSResult;
380163fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor
380263fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor        if (Exp->getOpcode() == BO_LOr &&
3803a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith            Exp->getLHS()->EvaluateKnownConstInt(Ctx) != 0)
380463fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor          return LHSResult;
380563fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor      }
380663fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor
3807d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      ICEDiag RHSResult = CheckICE(Exp->getRHS(), Ctx);
3808d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      if (LHSResult.Val == 0 && RHSResult.Val == 1) {
3809d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        // Rare case where the RHS has a comma "side-effect"; we need
3810d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        // to actually check the condition to see whether the side
3811d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        // with the comma is evaluated.
38122de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall        if ((Exp->getOpcode() == BO_LAnd) !=
3813a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith            (Exp->getLHS()->EvaluateKnownConstInt(Ctx) == 0))
3814d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          return RHSResult;
3815d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        return NoDiag();
3816d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      }
3817d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
3818d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      if (LHSResult.Val >= RHSResult.Val)
3819d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        return LHSResult;
3820d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      return RHSResult;
3821d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    }
3822d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    }
3823d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  }
3824d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ImplicitCastExprClass:
3825d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CStyleCastExprClass:
3826d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXFunctionalCastExprClass:
3827d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXStaticCastExprClass:
3828d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXReinterpretCastExprClass:
382932cb47174304bc7ec11478b9497c4e10f48273d9Richard Smith  case Expr::CXXConstCastExprClass:
3830f85e193739c953358c865005855253af4f68a497John McCall  case Expr::ObjCBridgedCastExprClass: {
3831d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    const Expr *SubExpr = cast<CastExpr>(E)->getSubExpr();
383298326ede499696f85d9f7bc1fbc7a628fc22f1ecRichard Smith    if (isa<ExplicitCastExpr>(E) &&
383332cb47174304bc7ec11478b9497c4e10f48273d9Richard Smith        isa<FloatingLiteral>(SubExpr->IgnoreParenImpCasts()))
383432cb47174304bc7ec11478b9497c4e10f48273d9Richard Smith      return NoDiag();
3835eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman    switch (cast<CastExpr>(E)->getCastKind()) {
3836eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman    case CK_LValueToRValue:
3837eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman    case CK_NoOp:
3838eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman    case CK_IntegralToBoolean:
3839eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman    case CK_IntegralCast:
3840d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      return CheckICE(SubExpr, Ctx);
3841eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman    default:
3842eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman      return ICEDiag(2, E->getLocStart());
3843eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman    }
3844d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  }
384556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  case Expr::BinaryConditionalOperatorClass: {
384656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    const BinaryConditionalOperator *Exp = cast<BinaryConditionalOperator>(E);
384756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    ICEDiag CommonResult = CheckICE(Exp->getCommon(), Ctx);
384856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    if (CommonResult.Val == 2) return CommonResult;
384956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    ICEDiag FalseResult = CheckICE(Exp->getFalseExpr(), Ctx);
385056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    if (FalseResult.Val == 2) return FalseResult;
385156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    if (CommonResult.Val == 1) return CommonResult;
385256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    if (FalseResult.Val == 1 &&
3853a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith        Exp->getCommon()->EvaluateKnownConstInt(Ctx) == 0) return NoDiag();
385456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    return FalseResult;
385556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  }
3856d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ConditionalOperatorClass: {
3857d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    const ConditionalOperator *Exp = cast<ConditionalOperator>(E);
3858d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    // If the condition (ignoring parens) is a __builtin_constant_p call,
3859d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    // then only the true side is actually considered in an integer constant
3860d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    // expression, and it is fully evaluated.  This is an important GNU
3861d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    // extension.  See GCC PR38377 for discussion.
3862d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    if (const CallExpr *CallCE
3863d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        = dyn_cast<CallExpr>(Exp->getCond()->IgnoreParenCasts()))
3864d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      if (CallCE->isBuiltinCall(Ctx) == Builtin::BI__builtin_constant_p) {
3865d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        Expr::EvalResult EVResult;
386651f4708c00110940ca3f337961915f2ca1668375Richard Smith        if (!E->EvaluateAsRValue(EVResult, Ctx) || EVResult.HasSideEffects ||
3867d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall            !EVResult.Val.isInt()) {
3868d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          return ICEDiag(2, E->getLocStart());
3869d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        }
3870d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        return NoDiag();
3871d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      }
3872d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    ICEDiag CondResult = CheckICE(Exp->getCond(), Ctx);
3873d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    if (CondResult.Val == 2)
3874d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      return CondResult;
387563fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor
387663fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor    // C++0x [expr.const]p2:
387763fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor    //   subexpressions of [...] conditional (5.16) operations that
387863fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor    //   are not evaluated are not considered
387963fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor    bool TrueBranch = Ctx.getLangOptions().CPlusPlus0x
3880a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith      ? Exp->getCond()->EvaluateKnownConstInt(Ctx) != 0
388163fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor      : false;
388263fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor    ICEDiag TrueResult = NoDiag();
388363fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor    if (!Ctx.getLangOptions().CPlusPlus0x || TrueBranch)
388463fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor      TrueResult = CheckICE(Exp->getTrueExpr(), Ctx);
388563fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor    ICEDiag FalseResult = NoDiag();
388663fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor    if (!Ctx.getLangOptions().CPlusPlus0x || !TrueBranch)
388763fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor      FalseResult = CheckICE(Exp->getFalseExpr(), Ctx);
388863fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor
3889d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    if (TrueResult.Val == 2)
3890d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      return TrueResult;
3891d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    if (FalseResult.Val == 2)
3892d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      return FalseResult;
3893d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    if (CondResult.Val == 1)
3894d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      return CondResult;
3895d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    if (TrueResult.Val == 0 && FalseResult.Val == 0)
3896d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      return NoDiag();
3897d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    // Rare case where the diagnostics depend on which side is evaluated
3898d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    // Note that if we get here, CondResult is 0, and at least one of
3899d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    // TrueResult and FalseResult is non-zero.
3900a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith    if (Exp->getCond()->EvaluateKnownConstInt(Ctx) == 0) {
3901d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      return FalseResult;
3902d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    }
3903d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    return TrueResult;
3904d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  }
3905d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXDefaultArgExprClass:
3906d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    return CheckICE(cast<CXXDefaultArgExpr>(E)->getExpr(), Ctx);
3907d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ChooseExprClass: {
3908d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    return CheckICE(cast<ChooseExpr>(E)->getChosenSubExpr(Ctx), Ctx);
3909d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  }
3910d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  }
3911d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
3912d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  // Silence a GCC warning
3913d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  return ICEDiag(2, E->getLocStart());
3914d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall}
3915d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
3916d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCallbool Expr::isIntegerConstantExpr(llvm::APSInt &Result, ASTContext &Ctx,
3917d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall                                 SourceLocation *Loc, bool isEvaluated) const {
3918d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  ICEDiag d = CheckICE(this, Ctx);
3919d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  if (d.Val != 0) {
3920d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    if (Loc) *Loc = d.Loc;
3921d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    return false;
3922d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  }
3923c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  if (!EvaluateAsInt(Result, Ctx))
3924d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    llvm_unreachable("ICE cannot be evaluated!");
3925d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  return true;
3926d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall}
3927