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//
12745f5147e065900267c85a5568785a1991d4838fRichard Smith// Constant expression evaluation produces four main results:
13745f5147e065900267c85a5568785a1991d4838fRichard Smith//
14745f5147e065900267c85a5568785a1991d4838fRichard Smith//  * A success/failure flag indicating whether constant folding was successful.
15745f5147e065900267c85a5568785a1991d4838fRichard Smith//    This is the 'bool' return value used by most of the code in this file. A
16745f5147e065900267c85a5568785a1991d4838fRichard Smith//    'false' return value indicates that constant folding has failed, and any
17745f5147e065900267c85a5568785a1991d4838fRichard Smith//    appropriate diagnostic has already been produced.
18745f5147e065900267c85a5568785a1991d4838fRichard Smith//
19745f5147e065900267c85a5568785a1991d4838fRichard Smith//  * An evaluated result, valid only if constant folding has not failed.
20745f5147e065900267c85a5568785a1991d4838fRichard Smith//
21745f5147e065900267c85a5568785a1991d4838fRichard Smith//  * A flag indicating if evaluation encountered (unevaluated) side-effects.
22745f5147e065900267c85a5568785a1991d4838fRichard Smith//    These arise in cases such as (sideEffect(), 0) and (sideEffect() || 1),
23745f5147e065900267c85a5568785a1991d4838fRichard Smith//    where it is possible to determine the evaluated result regardless.
24745f5147e065900267c85a5568785a1991d4838fRichard Smith//
25745f5147e065900267c85a5568785a1991d4838fRichard Smith//  * A set of notes indicating why the evaluation was not a constant expression
26a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith//    (under the C++11 / C++1y rules only, at the moment), or, if folding failed
27a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith//    too, why the expression could not be folded.
28745f5147e065900267c85a5568785a1991d4838fRichard Smith//
29745f5147e065900267c85a5568785a1991d4838fRichard Smith// If we are checking for a potential constant expression, failure to constant
30745f5147e065900267c85a5568785a1991d4838fRichard Smith// fold a potential constant sub-expression will be indicated by a 'false'
31745f5147e065900267c85a5568785a1991d4838fRichard Smith// return value (the expression could not be folded) and no diagnostic (the
32745f5147e065900267c85a5568785a1991d4838fRichard Smith// expression is not necessarily non-constant).
33745f5147e065900267c85a5568785a1991d4838fRichard Smith//
34c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//===----------------------------------------------------------------------===//
35c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson
36c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson#include "clang/AST/APValue.h"
37c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson#include "clang/AST/ASTContext.h"
38a93d0f280693b8418bc88cf7a8c93325f7fcf4c6Benjamin Kramer#include "clang/AST/ASTDiagnostic.h"
39199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck#include "clang/AST/CharUnits.h"
40a93d0f280693b8418bc88cf7a8c93325f7fcf4c6Benjamin Kramer#include "clang/AST/Expr.h"
4119cc4abea06a9b49e0e16a50d335c064cd723572Anders Carlsson#include "clang/AST/RecordLayout.h"
420fe52e1bcaa69ba127f1bda036f057fec1f478deSeo Sanghyeon#include "clang/AST/StmtVisitor.h"
438ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor#include "clang/AST/TypeLoc.h"
441b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner#include "clang/Basic/Builtins.h"
4506a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson#include "clang/Basic/TargetInfo.h"
467462b39a9bccaf4392687831036713f09f9c0681Mike Stump#include "llvm/ADT/SmallString.h"
47a93d0f280693b8418bc88cf7a8c93325f7fcf4c6Benjamin Kramer#include "llvm/Support/raw_ostream.h"
484572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump#include <cstring>
497b48a2986345480241f3b8209f71bb21b0530b4fRichard Smith#include <functional>
504572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump
51c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlssonusing namespace clang;
52f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerusing llvm::APSInt;
53d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanusing llvm::APFloat;
54c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson
5583587db1bda97f45d2b5a4189e584e2a18be511aRichard Smithstatic bool IsGlobalLValue(APValue::LValueBase B);
5683587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith
57c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramernamespace {
58180f47959a066795cc0f409433023af448bb0328Richard Smith  struct LValue;
59d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  struct CallStackFrame;
60bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith  struct EvalInfo;
61d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
6283587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  static QualType getType(APValue::LValueBase B) {
631bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith    if (!B) return QualType();
641bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith    if (const ValueDecl *D = B.dyn_cast<const ValueDecl*>())
651bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith      return D->getType();
668a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith
678a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    const Expr *Base = B.get<const Expr*>();
688a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith
698a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    // For a materialized temporary, the type of the temporary we materialized
708a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    // may not be the type of the expression.
718a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    if (const MaterializeTemporaryExpr *MTE =
728a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith            dyn_cast<MaterializeTemporaryExpr>(Base)) {
738a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      SmallVector<const Expr *, 2> CommaLHSs;
748a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      SmallVector<SubobjectAdjustment, 2> Adjustments;
758a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      const Expr *Temp = MTE->GetTemporaryExpr();
768a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      const Expr *Inner = Temp->skipRValueSubobjectAdjustments(CommaLHSs,
778a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith                                                               Adjustments);
788a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      // Keep any cv-qualifiers from the reference if we generated a temporary
798a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      // for it.
808a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      if (Inner != Temp)
818a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith        return Inner->getType();
828a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    }
838a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith
848a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    return Base->getType();
851bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith  }
861bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith
87180f47959a066795cc0f409433023af448bb0328Richard Smith  /// Get an LValue path entry, which is known to not be an array index, as a
88f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith  /// field or base class.
8983587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  static
90f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith  APValue::BaseOrMemberType getAsBaseOrMember(APValue::LValuePathEntry E) {
91180f47959a066795cc0f409433023af448bb0328Richard Smith    APValue::BaseOrMemberType Value;
92180f47959a066795cc0f409433023af448bb0328Richard Smith    Value.setFromOpaqueValue(E.BaseOrMember);
93f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith    return Value;
94f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith  }
95f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith
96f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith  /// Get an LValue path entry, which is known to not be an array index, as a
97f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith  /// field declaration.
9883587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  static const FieldDecl *getAsField(APValue::LValuePathEntry E) {
99f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith    return dyn_cast<FieldDecl>(getAsBaseOrMember(E).getPointer());
100180f47959a066795cc0f409433023af448bb0328Richard Smith  }
101180f47959a066795cc0f409433023af448bb0328Richard Smith  /// Get an LValue path entry, which is known to not be an array index, as a
102180f47959a066795cc0f409433023af448bb0328Richard Smith  /// base class declaration.
10383587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  static const CXXRecordDecl *getAsBaseClass(APValue::LValuePathEntry E) {
104f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith    return dyn_cast<CXXRecordDecl>(getAsBaseOrMember(E).getPointer());
105180f47959a066795cc0f409433023af448bb0328Richard Smith  }
106180f47959a066795cc0f409433023af448bb0328Richard Smith  /// Determine whether this LValue path entry for a base class names a virtual
107180f47959a066795cc0f409433023af448bb0328Richard Smith  /// base class.
10883587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  static bool isVirtualBaseClass(APValue::LValuePathEntry E) {
109f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith    return getAsBaseOrMember(E).getInt();
110180f47959a066795cc0f409433023af448bb0328Richard Smith  }
111180f47959a066795cc0f409433023af448bb0328Richard Smith
112b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  /// Find the path length and type of the most-derived subobject in the given
113b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  /// path, and find the size of the containing array, if any.
114b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  static
115b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  unsigned findMostDerivedSubobject(ASTContext &Ctx, QualType Base,
116b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith                                    ArrayRef<APValue::LValuePathEntry> Path,
117b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith                                    uint64_t &ArraySize, QualType &Type) {
118b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    unsigned MostDerivedLength = 0;
119b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    Type = Base;
1209a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith    for (unsigned I = 0, N = Path.size(); I != N; ++I) {
121b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      if (Type->isArrayType()) {
122b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith        const ConstantArrayType *CAT =
123b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith          cast<ConstantArrayType>(Ctx.getAsArrayType(Type));
124b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith        Type = CAT->getElementType();
125b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith        ArraySize = CAT->getSize().getZExtValue();
126b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith        MostDerivedLength = I + 1;
12786024013d4c3728122c58fa07a2a67e6c15837efRichard Smith      } else if (Type->isAnyComplexType()) {
12886024013d4c3728122c58fa07a2a67e6c15837efRichard Smith        const ComplexType *CT = Type->castAs<ComplexType>();
12986024013d4c3728122c58fa07a2a67e6c15837efRichard Smith        Type = CT->getElementType();
13086024013d4c3728122c58fa07a2a67e6c15837efRichard Smith        ArraySize = 2;
13186024013d4c3728122c58fa07a2a67e6c15837efRichard Smith        MostDerivedLength = I + 1;
132b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      } else if (const FieldDecl *FD = getAsField(Path[I])) {
133b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith        Type = FD->getType();
134b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith        ArraySize = 0;
135b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith        MostDerivedLength = I + 1;
136b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      } else {
1379a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith        // Path[I] describes a base class.
138b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith        ArraySize = 0;
139b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      }
1409a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith    }
141b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    return MostDerivedLength;
1429a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith  }
1439a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith
144b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  // The order of this enum is important for diagnostics.
145b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  enum CheckSubobjectKind {
146b04035a7b1a3c9b93cea72ae56dd2ea6e787bae9Richard Smith    CSK_Base, CSK_Derived, CSK_Field, CSK_ArrayToPointer, CSK_ArrayIndex,
14786024013d4c3728122c58fa07a2a67e6c15837efRichard Smith    CSK_This, CSK_Real, CSK_Imag
148b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  };
149b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith
1500a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith  /// A path from a glvalue to a subobject of that glvalue.
1510a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith  struct SubobjectDesignator {
1520a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    /// True if the subobject was named in a manner not supported by C++11. Such
1530a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    /// lvalues can still be folded, but they are not core constant expressions
1540a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    /// and we cannot perform lvalue-to-rvalue conversions on them.
1550a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    bool Invalid : 1;
1560a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith
157b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    /// Is this a pointer one past the end of an object?
158b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    bool IsOnePastTheEnd : 1;
159b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith
160b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    /// The length of the path to the most-derived object of which this is a
161b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    /// subobject.
162b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    unsigned MostDerivedPathLength : 30;
163b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith
164b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    /// The size of the array of which the most-derived object is an element, or
165b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    /// 0 if the most-derived object is not an array element.
166b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    uint64_t MostDerivedArraySize;
1670a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith
168b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    /// The type of the most derived object referred to by this address.
169b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    QualType MostDerivedType;
1700a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith
1719a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith    typedef APValue::LValuePathEntry PathEntry;
1729a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith
1730a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    /// The entries on the path from the glvalue to the designated subobject.
1740a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    SmallVector<PathEntry, 8> Entries;
1750a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith
176b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    SubobjectDesignator() : Invalid(true) {}
1770a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith
178b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    explicit SubobjectDesignator(QualType T)
179b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      : Invalid(false), IsOnePastTheEnd(false), MostDerivedPathLength(0),
180b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith        MostDerivedArraySize(0), MostDerivedType(T) {}
181b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith
182b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    SubobjectDesignator(ASTContext &Ctx, const APValue &V)
183b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      : Invalid(!V.isLValue() || !V.hasLValuePath()), IsOnePastTheEnd(false),
184b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith        MostDerivedPathLength(0), MostDerivedArraySize(0) {
1859a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith      if (!Invalid) {
186b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith        IsOnePastTheEnd = V.isLValueOnePastTheEnd();
1879a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith        ArrayRef<PathEntry> VEntries = V.getLValuePath();
1889a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith        Entries.insert(Entries.end(), VEntries.begin(), VEntries.end());
1899a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith        if (V.getLValueBase())
190b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith          MostDerivedPathLength =
191b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith              findMostDerivedSubobject(Ctx, getType(V.getLValueBase()),
192b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith                                       V.getLValuePath(), MostDerivedArraySize,
193b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith                                       MostDerivedType);
1949a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith      }
1959a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith    }
1969a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith
1970a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    void setInvalid() {
1980a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      Invalid = true;
1990a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      Entries.clear();
2000a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    }
201b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith
202b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    /// Determine whether this is a one-past-the-end pointer.
203b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    bool isOnePastTheEnd() const {
204b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      if (IsOnePastTheEnd)
205b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith        return true;
206b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      if (MostDerivedArraySize &&
207b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith          Entries[MostDerivedPathLength - 1].ArrayIndex == MostDerivedArraySize)
208b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith        return true;
209b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      return false;
210b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    }
211b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith
212b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    /// Check that this refers to a valid subobject.
213b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    bool isValidSubobject() const {
214b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      if (Invalid)
215b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith        return false;
216b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      return !isOnePastTheEnd();
217b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    }
218b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    /// Check that this refers to a valid subobject, and if not, produce a
219b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    /// relevant diagnostic and set the designator as invalid.
220b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    bool checkSubobject(EvalInfo &Info, const Expr *E, CheckSubobjectKind CSK);
221b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith
222b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    /// Update this designator to refer to the first element within this array.
223b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    void addArrayUnchecked(const ConstantArrayType *CAT) {
2240a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      PathEntry Entry;
225b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      Entry.ArrayIndex = 0;
2260a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      Entries.push_back(Entry);
227b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith
228b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      // This is a most-derived object.
229b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      MostDerivedType = CAT->getElementType();
230b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      MostDerivedArraySize = CAT->getSize().getZExtValue();
231b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      MostDerivedPathLength = Entries.size();
2320a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    }
2330a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    /// Update this designator to refer to the given base or member of this
2340a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    /// object.
235b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    void addDeclUnchecked(const Decl *D, bool Virtual = false) {
2360a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      PathEntry Entry;
237180f47959a066795cc0f409433023af448bb0328Richard Smith      APValue::BaseOrMemberType Value(D, Virtual);
238180f47959a066795cc0f409433023af448bb0328Richard Smith      Entry.BaseOrMember = Value.getOpaqueValue();
2390a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      Entries.push_back(Entry);
240b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith
241b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      // If this isn't a base class, it's a new most-derived object.
242b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      if (const FieldDecl *FD = dyn_cast<FieldDecl>(D)) {
243b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith        MostDerivedType = FD->getType();
244b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith        MostDerivedArraySize = 0;
245b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith        MostDerivedPathLength = Entries.size();
246b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      }
2470a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    }
24886024013d4c3728122c58fa07a2a67e6c15837efRichard Smith    /// Update this designator to refer to the given complex component.
24986024013d4c3728122c58fa07a2a67e6c15837efRichard Smith    void addComplexUnchecked(QualType EltTy, bool Imag) {
25086024013d4c3728122c58fa07a2a67e6c15837efRichard Smith      PathEntry Entry;
25186024013d4c3728122c58fa07a2a67e6c15837efRichard Smith      Entry.ArrayIndex = Imag;
25286024013d4c3728122c58fa07a2a67e6c15837efRichard Smith      Entries.push_back(Entry);
25386024013d4c3728122c58fa07a2a67e6c15837efRichard Smith
25486024013d4c3728122c58fa07a2a67e6c15837efRichard Smith      // This is technically a most-derived object, though in practice this
25586024013d4c3728122c58fa07a2a67e6c15837efRichard Smith      // is unlikely to matter.
25686024013d4c3728122c58fa07a2a67e6c15837efRichard Smith      MostDerivedType = EltTy;
25786024013d4c3728122c58fa07a2a67e6c15837efRichard Smith      MostDerivedArraySize = 2;
25886024013d4c3728122c58fa07a2a67e6c15837efRichard Smith      MostDerivedPathLength = Entries.size();
25986024013d4c3728122c58fa07a2a67e6c15837efRichard Smith    }
260b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    void diagnosePointerArithmetic(EvalInfo &Info, const Expr *E, uint64_t N);
2610a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    /// Add N to the address of this subobject.
262b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    void adjustIndex(EvalInfo &Info, const Expr *E, uint64_t N) {
2630a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      if (Invalid) return;
264b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      if (MostDerivedPathLength == Entries.size() && MostDerivedArraySize) {
2659a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith        Entries.back().ArrayIndex += N;
266b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith        if (Entries.back().ArrayIndex > MostDerivedArraySize) {
267b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith          diagnosePointerArithmetic(Info, E, Entries.back().ArrayIndex);
268b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith          setInvalid();
269b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith        }
2700a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith        return;
2710a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      }
272b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      // [expr.add]p4: For the purposes of these operators, a pointer to a
273b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      // nonarray object behaves the same as a pointer to the first element of
274b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      // an array of length one with the type of the object as its element type.
275b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      if (IsOnePastTheEnd && N == (uint64_t)-1)
276b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith        IsOnePastTheEnd = false;
277b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      else if (!IsOnePastTheEnd && N == 1)
278b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith        IsOnePastTheEnd = true;
279b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      else if (N != 0) {
280b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith        diagnosePointerArithmetic(Info, E, uint64_t(IsOnePastTheEnd) + N);
2810a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith        setInvalid();
282b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      }
2830a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    }
2840a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith  };
2850a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith
286bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith  /// A stack frame in the constexpr call stack.
287bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith  struct CallStackFrame {
288bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    EvalInfo &Info;
289bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith
290bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    /// Parent - The caller of this stack frame.
291bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    CallStackFrame *Caller;
292bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith
29308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith    /// CallLoc - The location of the call expression for this call.
29408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith    SourceLocation CallLoc;
29508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith
29608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith    /// Callee - The function which was called.
29708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith    const FunctionDecl *Callee;
29808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith
29983587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    /// Index - The call index of this call.
30083587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    unsigned Index;
30183587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith
302180f47959a066795cc0f409433023af448bb0328Richard Smith    /// This - The binding for the this pointer in this call, if any.
303180f47959a066795cc0f409433023af448bb0328Richard Smith    const LValue *This;
304180f47959a066795cc0f409433023af448bb0328Richard Smith
305bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    /// ParmBindings - Parameter bindings for this function call, indexed by
306bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    /// parameters' function scope indices.
307bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    APValue *Arguments;
308bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith
309f6172aee547241427e6dabdd0bd6fcaf1c046689Eli Friedman    // Note that we intentionally use std::map here so that references to
310f6172aee547241427e6dabdd0bd6fcaf1c046689Eli Friedman    // values are stable.
311a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    typedef std::map<const void*, APValue> MapTy;
312bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    typedef MapTy::const_iterator temp_iterator;
313bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    /// Temporaries - Temporary lvalues materialized within this stack frame.
314bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    MapTy Temporaries;
315bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith
31608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith    CallStackFrame(EvalInfo &Info, SourceLocation CallLoc,
31708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith                   const FunctionDecl *Callee, const LValue *This,
318bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith                   APValue *Arguments);
319bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    ~CallStackFrame();
32003ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith
32103ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    APValue *getTemporary(const void *Key) {
32203ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      MapTy::iterator I = Temporaries.find(Key);
32303ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      return I == Temporaries.end() ? 0 : &I->second;
32403ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    }
32503ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    APValue &createTemporary(const void *Key, bool IsLifetimeExtended);
326bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith  };
327bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith
328c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith  /// Temporarily override 'this'.
329c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith  class ThisOverrideRAII {
330c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith  public:
331c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith    ThisOverrideRAII(CallStackFrame &Frame, const LValue *NewThis, bool Enable)
332c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith        : Frame(Frame), OldThis(Frame.This) {
333c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith      if (Enable)
334c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith        Frame.This = NewThis;
335c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith    }
336c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith    ~ThisOverrideRAII() {
337c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith      Frame.This = OldThis;
338c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith    }
339c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith  private:
340c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith    CallStackFrame &Frame;
341c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith    const LValue *OldThis;
342c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith  };
343c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith
344dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith  /// A partial diagnostic which we might know in advance that we are not going
345dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith  /// to emit.
346dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith  class OptionalDiagnostic {
347dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith    PartialDiagnostic *Diag;
348dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith
349dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith  public:
350dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith    explicit OptionalDiagnostic(PartialDiagnostic *Diag = 0) : Diag(Diag) {}
351dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith
352dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith    template<typename T>
353dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith    OptionalDiagnostic &operator<<(const T &v) {
354dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith      if (Diag)
355dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith        *Diag << v;
356dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith      return *this;
357dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith    }
358789f9b6be5df6e5151ac35e68416cdf550db1196Richard Smith
359789f9b6be5df6e5151ac35e68416cdf550db1196Richard Smith    OptionalDiagnostic &operator<<(const APSInt &I) {
360789f9b6be5df6e5151ac35e68416cdf550db1196Richard Smith      if (Diag) {
361cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko        SmallVector<char, 32> Buffer;
362789f9b6be5df6e5151ac35e68416cdf550db1196Richard Smith        I.toString(Buffer);
363789f9b6be5df6e5151ac35e68416cdf550db1196Richard Smith        *Diag << StringRef(Buffer.data(), Buffer.size());
364789f9b6be5df6e5151ac35e68416cdf550db1196Richard Smith      }
365789f9b6be5df6e5151ac35e68416cdf550db1196Richard Smith      return *this;
366789f9b6be5df6e5151ac35e68416cdf550db1196Richard Smith    }
367789f9b6be5df6e5151ac35e68416cdf550db1196Richard Smith
368789f9b6be5df6e5151ac35e68416cdf550db1196Richard Smith    OptionalDiagnostic &operator<<(const APFloat &F) {
369789f9b6be5df6e5151ac35e68416cdf550db1196Richard Smith      if (Diag) {
370cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko        SmallVector<char, 32> Buffer;
371789f9b6be5df6e5151ac35e68416cdf550db1196Richard Smith        F.toString(Buffer);
372789f9b6be5df6e5151ac35e68416cdf550db1196Richard Smith        *Diag << StringRef(Buffer.data(), Buffer.size());
373789f9b6be5df6e5151ac35e68416cdf550db1196Richard Smith      }
374789f9b6be5df6e5151ac35e68416cdf550db1196Richard Smith      return *this;
375789f9b6be5df6e5151ac35e68416cdf550db1196Richard Smith    }
376dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith  };
377dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith
37803ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith  /// A cleanup, and a flag indicating whether it is lifetime-extended.
37903ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith  class Cleanup {
38003ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    llvm::PointerIntPair<APValue*, 1, bool> Value;
38103ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith
38203ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith  public:
38303ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    Cleanup(APValue *Val, bool IsLifetimeExtended)
38403ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith        : Value(Val, IsLifetimeExtended) {}
38503ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith
38603ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    bool isLifetimeExtended() const { return Value.getInt(); }
38703ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    void endLifetime() {
38803ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      *Value.getPointer() = APValue();
38903ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    }
39003ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith  };
39103ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith
39283587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  /// EvalInfo - This is a private struct used by the evaluator to capture
39383587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  /// information about a subexpression as it is folded.  It retains information
39483587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  /// about the AST context, but also maintains information about the folded
39583587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  /// expression.
39683587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  ///
39783587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  /// If an expression could be evaluated, it is still possible it is not a C
39883587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  /// "integer constant expression" or constant expression.  If not, this struct
39983587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  /// captures information about how and why not.
40083587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  ///
40183587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  /// One bit of information passed *into* the request for constant folding
40283587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  /// indicates whether the subexpression is "evaluated" or not according to C
40383587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  /// rules.  For example, the RHS of (0 && foo()) is not evaluated.  We can
40483587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  /// evaluate the expression regardless of what the RHS is, but C only allows
40583587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  /// certain things in certain situations.
406c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer  struct EvalInfo {
407dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith    ASTContext &Ctx;
408d411a4b23077b29e19c9371bbb19b054a374d922Argyrios Kyrtzidis
4091e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith    /// EvalStatus - Contains information about the evaluation.
4101e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith    Expr::EvalStatus &EvalStatus;
411f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson
412d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    /// CurrentCall - The top of the constexpr call stack.
413bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    CallStackFrame *CurrentCall;
414d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
415d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    /// CallStackDepth - The number of calls in the call stack right now.
416d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    unsigned CallStackDepth;
417d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
41883587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    /// NextCallIndex - The next call index to assign.
41983587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    unsigned NextCallIndex;
42083587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith
421e7565635002ce0daaaf4b714cdb472507af462eeRichard Smith    /// StepsLeft - The remaining number of evaluation steps we're permitted
422e7565635002ce0daaaf4b714cdb472507af462eeRichard Smith    /// to perform. This is essentially a limit for the number of statements
423e7565635002ce0daaaf4b714cdb472507af462eeRichard Smith    /// we will evaluate.
424e7565635002ce0daaaf4b714cdb472507af462eeRichard Smith    unsigned StepsLeft;
425e7565635002ce0daaaf4b714cdb472507af462eeRichard Smith
426bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    /// BottomFrame - The frame in which evaluation started. This must be
427745f5147e065900267c85a5568785a1991d4838fRichard Smith    /// initialized after CurrentCall and CallStackDepth.
428bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    CallStackFrame BottomFrame;
429bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith
43003ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    /// A stack of values whose lifetimes end at the end of some surrounding
43103ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    /// evaluation frame.
43203ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    llvm::SmallVector<Cleanup, 16> CleanupStack;
43303ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith
434180f47959a066795cc0f409433023af448bb0328Richard Smith    /// EvaluatingDecl - This is the declaration whose initializer is being
435180f47959a066795cc0f409433023af448bb0328Richard Smith    /// evaluated, if any.
4366391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith    APValue::LValueBase EvaluatingDecl;
437180f47959a066795cc0f409433023af448bb0328Richard Smith
438180f47959a066795cc0f409433023af448bb0328Richard Smith    /// EvaluatingDeclValue - This is the value being constructed for the
439180f47959a066795cc0f409433023af448bb0328Richard Smith    /// declaration whose initializer is being evaluated, if any.
440180f47959a066795cc0f409433023af448bb0328Richard Smith    APValue *EvaluatingDeclValue;
441180f47959a066795cc0f409433023af448bb0328Richard Smith
442c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    /// HasActiveDiagnostic - Was the previous diagnostic stored? If so, further
443c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    /// notes attached to it will also be stored, otherwise they will not be.
444c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    bool HasActiveDiagnostic;
445c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
446745f5147e065900267c85a5568785a1991d4838fRichard Smith    /// CheckingPotentialConstantExpression - Are we checking whether the
447745f5147e065900267c85a5568785a1991d4838fRichard Smith    /// expression is a potential constant expression? If so, some diagnostics
448745f5147e065900267c85a5568785a1991d4838fRichard Smith    /// are suppressed.
449745f5147e065900267c85a5568785a1991d4838fRichard Smith    bool CheckingPotentialConstantExpression;
45003ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith
451ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian    bool IntOverflowCheckMode;
452745f5147e065900267c85a5568785a1991d4838fRichard Smith
453ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian    EvalInfo(const ASTContext &C, Expr::EvalStatus &S,
454e7565635002ce0daaaf4b714cdb472507af462eeRichard Smith             bool OverflowCheckMode = false)
455dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith      : Ctx(const_cast<ASTContext&>(C)), EvalStatus(S), CurrentCall(0),
45683587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith        CallStackDepth(0), NextCallIndex(1),
457e7565635002ce0daaaf4b714cdb472507af462eeRichard Smith        StepsLeft(getLangOpts().ConstexprStepLimit),
45883587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith        BottomFrame(*this, SourceLocation(), 0, 0, 0),
4596391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith        EvaluatingDecl((const ValueDecl*)0), EvaluatingDeclValue(0),
4606391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith        HasActiveDiagnostic(false), CheckingPotentialConstantExpression(false),
461ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian        IntOverflowCheckMode(OverflowCheckMode) {}
462bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith
4636391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith    void setEvaluatingDecl(APValue::LValueBase Base, APValue &Value) {
4646391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith      EvaluatingDecl = Base;
465180f47959a066795cc0f409433023af448bb0328Richard Smith      EvaluatingDeclValue = &Value;
466180f47959a066795cc0f409433023af448bb0328Richard Smith    }
467180f47959a066795cc0f409433023af448bb0328Richard Smith
4684e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie    const LangOptions &getLangOpts() const { return Ctx.getLangOpts(); }
469c18c42345636e2866fed75c7e434fb659d747672Richard Smith
470c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    bool CheckCallLimit(SourceLocation Loc) {
471745f5147e065900267c85a5568785a1991d4838fRichard Smith      // Don't perform any constexpr calls (other than the call we're checking)
472745f5147e065900267c85a5568785a1991d4838fRichard Smith      // when checking a potential constant expression.
473745f5147e065900267c85a5568785a1991d4838fRichard Smith      if (CheckingPotentialConstantExpression && CallStackDepth > 1)
474745f5147e065900267c85a5568785a1991d4838fRichard Smith        return false;
47583587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith      if (NextCallIndex == 0) {
47683587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith        // NextCallIndex has wrapped around.
47783587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith        Diag(Loc, diag::note_constexpr_call_limit_exceeded);
47883587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith        return false;
47983587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith      }
480c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      if (CallStackDepth <= getLangOpts().ConstexprCallDepth)
481c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith        return true;
482c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      Diag(Loc, diag::note_constexpr_depth_limit_exceeded)
483c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith        << getLangOpts().ConstexprCallDepth;
484c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      return false;
485c18c42345636e2866fed75c7e434fb659d747672Richard Smith    }
486f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith
48783587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    CallStackFrame *getCallFrame(unsigned CallIndex) {
48883587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith      assert(CallIndex && "no call index in getCallFrame");
48983587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith      // We will eventually hit BottomFrame, which has Index 1, so Frame can't
49083587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith      // be null in this loop.
49183587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith      CallStackFrame *Frame = CurrentCall;
49283587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith      while (Frame->Index > CallIndex)
49383587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith        Frame = Frame->Caller;
49483587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith      return (Frame->Index == CallIndex) ? Frame : 0;
49583587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    }
49683587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith
497e7565635002ce0daaaf4b714cdb472507af462eeRichard Smith    bool nextStep(const Stmt *S) {
498e7565635002ce0daaaf4b714cdb472507af462eeRichard Smith      if (!StepsLeft) {
499e7565635002ce0daaaf4b714cdb472507af462eeRichard Smith        Diag(S->getLocStart(), diag::note_constexpr_step_limit_exceeded);
500e7565635002ce0daaaf4b714cdb472507af462eeRichard Smith        return false;
501e7565635002ce0daaaf4b714cdb472507af462eeRichard Smith      }
502e7565635002ce0daaaf4b714cdb472507af462eeRichard Smith      --StepsLeft;
503e7565635002ce0daaaf4b714cdb472507af462eeRichard Smith      return true;
504e7565635002ce0daaaf4b714cdb472507af462eeRichard Smith    }
505e7565635002ce0daaaf4b714cdb472507af462eeRichard Smith
506c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  private:
507c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    /// Add a diagnostic to the diagnostics list.
508c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    PartialDiagnostic &addDiag(SourceLocation Loc, diag::kind DiagId) {
509c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      PartialDiagnostic PD(DiagId, Ctx.getDiagAllocator());
510c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      EvalStatus.Diag->push_back(std::make_pair(Loc, PD));
511c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      return EvalStatus.Diag->back().second;
512c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    }
513c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
51408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith    /// Add notes containing a call stack to the current point of evaluation.
51508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith    void addCallStack(unsigned Limit);
51608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith
517c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  public:
518f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    /// Diagnose that the evaluation cannot be folded.
5197098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith    OptionalDiagnostic Diag(SourceLocation Loc, diag::kind DiagId
5207098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith                              = diag::note_invalid_subexpr_in_const_expr,
521c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith                            unsigned ExtraNotes = 0) {
522f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      // If we have a prior diagnostic, it will be noting that the expression
523f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      // isn't a constant expression. This diagnostic is more important.
524f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      // FIXME: We might want to show both diagnostics to the user.
525dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith      if (EvalStatus.Diag) {
52608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith        unsigned CallStackNotes = CallStackDepth - 1;
52708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith        unsigned Limit = Ctx.getDiagnostics().getConstexprBacktraceLimit();
52808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith        if (Limit)
52908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith          CallStackNotes = std::min(CallStackNotes, Limit + 1);
530745f5147e065900267c85a5568785a1991d4838fRichard Smith        if (CheckingPotentialConstantExpression)
531745f5147e065900267c85a5568785a1991d4838fRichard Smith          CallStackNotes = 0;
53208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith
533c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith        HasActiveDiagnostic = true;
534dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith        EvalStatus.Diag->clear();
53508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith        EvalStatus.Diag->reserve(1 + ExtraNotes + CallStackNotes);
53608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith        addDiag(Loc, DiagId);
537745f5147e065900267c85a5568785a1991d4838fRichard Smith        if (!CheckingPotentialConstantExpression)
538745f5147e065900267c85a5568785a1991d4838fRichard Smith          addCallStack(Limit);
53908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith        return OptionalDiagnostic(&(*EvalStatus.Diag)[0].second);
540dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith      }
541c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      HasActiveDiagnostic = false;
542dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith      return OptionalDiagnostic();
543dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith    }
544dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith
5455cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith    OptionalDiagnostic Diag(const Expr *E, diag::kind DiagId
5465cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith                              = diag::note_invalid_subexpr_in_const_expr,
5475cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith                            unsigned ExtraNotes = 0) {
5485cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith      if (EvalStatus.Diag)
5495cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith        return Diag(E->getExprLoc(), DiagId, ExtraNotes);
5505cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith      HasActiveDiagnostic = false;
5515cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith      return OptionalDiagnostic();
5525cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith    }
5535cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith
554ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian    bool getIntOverflowCheckMode() { return IntOverflowCheckMode; }
555ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian
556dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith    /// Diagnose that the evaluation does not produce a C++11 core constant
557dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith    /// expression.
5585cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith    template<typename LocArg>
5595cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith    OptionalDiagnostic CCEDiag(LocArg Loc, diag::kind DiagId
5607098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith                                 = diag::note_invalid_subexpr_in_const_expr,
561c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith                               unsigned ExtraNotes = 0) {
562dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith      // Don't override a previous diagnostic.
56351e47df5a57430f1b691b04258e663cce68aef9dEli Friedman      if (!EvalStatus.Diag || !EvalStatus.Diag->empty()) {
56451e47df5a57430f1b691b04258e663cce68aef9dEli Friedman        HasActiveDiagnostic = false;
565dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith        return OptionalDiagnostic();
56651e47df5a57430f1b691b04258e663cce68aef9dEli Friedman      }
567c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      return Diag(Loc, DiagId, ExtraNotes);
568c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    }
569c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
570c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    /// Add a note to a prior diagnostic.
571c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    OptionalDiagnostic Note(SourceLocation Loc, diag::kind DiagId) {
572c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      if (!HasActiveDiagnostic)
573c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith        return OptionalDiagnostic();
574c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      return OptionalDiagnostic(&addDiag(Loc, DiagId));
575f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    }
576099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith
577099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith    /// Add a stack of notes to a prior diagnostic.
578099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith    void addNotes(ArrayRef<PartialDiagnosticAt> Diags) {
579099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith      if (HasActiveDiagnostic) {
580099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith        EvalStatus.Diag->insert(EvalStatus.Diag->end(),
581099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith                                Diags.begin(), Diags.end());
582099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith      }
583099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith    }
584745f5147e065900267c85a5568785a1991d4838fRichard Smith
585745f5147e065900267c85a5568785a1991d4838fRichard Smith    /// Should we continue evaluation as much as possible after encountering a
586745f5147e065900267c85a5568785a1991d4838fRichard Smith    /// construct which can't be folded?
587745f5147e065900267c85a5568785a1991d4838fRichard Smith    bool keepEvaluatingAfterFailure() {
588ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian      // Should return true in IntOverflowCheckMode, so that we check for
589ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian      // overflow even if some subexpressions can't be evaluated as constants.
590e7565635002ce0daaaf4b714cdb472507af462eeRichard Smith      return StepsLeft && (IntOverflowCheckMode ||
591e7565635002ce0daaaf4b714cdb472507af462eeRichard Smith                           (CheckingPotentialConstantExpression &&
592e7565635002ce0daaaf4b714cdb472507af462eeRichard Smith                            EvalStatus.Diag && EvalStatus.Diag->empty()));
593745f5147e065900267c85a5568785a1991d4838fRichard Smith    }
594c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer  };
595f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith
596f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith  /// Object used to treat all foldable expressions as constant expressions.
597f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith  struct FoldConstant {
598f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith    bool Enabled;
599f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith
600f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith    explicit FoldConstant(EvalInfo &Info)
601f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith      : Enabled(Info.EvalStatus.Diag && Info.EvalStatus.Diag->empty() &&
602f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith                !Info.EvalStatus.HasSideEffects) {
603f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith    }
604f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith    // Treat the value we've computed since this object was created as constant.
605f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith    void Fold(EvalInfo &Info) {
606f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith      if (Enabled && !Info.EvalStatus.Diag->empty() &&
607f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith          !Info.EvalStatus.HasSideEffects)
608f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith        Info.EvalStatus.Diag->clear();
609f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith    }
610f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith  };
61174e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith
61274e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith  /// RAII object used to suppress diagnostics and side-effects from a
61374e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith  /// speculative evaluation.
61474e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith  class SpeculativeEvaluationRAII {
61574e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith    EvalInfo &Info;
61674e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith    Expr::EvalStatus Old;
61774e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith
61874e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith  public:
61974e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith    SpeculativeEvaluationRAII(EvalInfo &Info,
620cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko                              SmallVectorImpl<PartialDiagnosticAt> *NewDiag = 0)
62174e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith      : Info(Info), Old(Info.EvalStatus) {
62274e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith      Info.EvalStatus.Diag = NewDiag;
62374e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith    }
62474e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith    ~SpeculativeEvaluationRAII() {
62574e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith      Info.EvalStatus = Old;
62674e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith    }
62774e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith  };
62803ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith
62903ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith  /// RAII object wrapping a full-expression or block scope, and handling
63003ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith  /// the ending of the lifetime of temporaries created within it.
63103ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith  template<bool IsFullExpression>
63203ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith  class ScopeRAII {
63303ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    EvalInfo &Info;
63403ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    unsigned OldStackSize;
63503ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith  public:
63603ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    ScopeRAII(EvalInfo &Info)
63703ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith        : Info(Info), OldStackSize(Info.CleanupStack.size()) {}
63803ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    ~ScopeRAII() {
63903ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      // Body moved to a static method to encourage the compiler to inline away
64003ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      // instances of this class.
64103ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      cleanup(Info, OldStackSize);
64203ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    }
64303ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith  private:
64403ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    static void cleanup(EvalInfo &Info, unsigned OldStackSize) {
64503ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      unsigned NewEnd = OldStackSize;
64603ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      for (unsigned I = OldStackSize, N = Info.CleanupStack.size();
64703ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith           I != N; ++I) {
64803ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith        if (IsFullExpression && Info.CleanupStack[I].isLifetimeExtended()) {
64903ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith          // Full-expression cleanup of a lifetime-extended temporary: nothing
65003ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith          // to do, just move this cleanup to the right place in the stack.
65103ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith          std::swap(Info.CleanupStack[I], Info.CleanupStack[NewEnd]);
65203ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith          ++NewEnd;
65303ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith        } else {
65403ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith          // End the lifetime of the object.
65503ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith          Info.CleanupStack[I].endLifetime();
65603ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith        }
65703ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      }
65803ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      Info.CleanupStack.erase(Info.CleanupStack.begin() + NewEnd,
65903ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith                              Info.CleanupStack.end());
66003ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    }
66103ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith  };
66203ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith  typedef ScopeRAII<false> BlockScopeRAII;
66303ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith  typedef ScopeRAII<true> FullExpressionRAII;
66408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith}
66508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith
666b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smithbool SubobjectDesignator::checkSubobject(EvalInfo &Info, const Expr *E,
667b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith                                         CheckSubobjectKind CSK) {
668b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  if (Invalid)
669b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    return false;
670b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  if (isOnePastTheEnd()) {
6715cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith    Info.CCEDiag(E, diag::note_constexpr_past_end_subobject)
672b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      << CSK;
673b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    setInvalid();
674b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    return false;
675b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  }
676b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  return true;
677b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith}
678b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith
679b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smithvoid SubobjectDesignator::diagnosePointerArithmetic(EvalInfo &Info,
680b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith                                                    const Expr *E, uint64_t N) {
681b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  if (MostDerivedPathLength == Entries.size() && MostDerivedArraySize)
6825cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith    Info.CCEDiag(E, diag::note_constexpr_array_index)
683b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      << static_cast<int>(N) << /*array*/ 0
684b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      << static_cast<unsigned>(MostDerivedArraySize);
685b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  else
6865cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith    Info.CCEDiag(E, diag::note_constexpr_array_index)
687b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      << static_cast<int>(N) << /*non-array*/ 1;
688b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  setInvalid();
689b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith}
690b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith
69108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard SmithCallStackFrame::CallStackFrame(EvalInfo &Info, SourceLocation CallLoc,
69208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith                               const FunctionDecl *Callee, const LValue *This,
693bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith                               APValue *Arguments)
69408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith    : Info(Info), Caller(Info.CurrentCall), CallLoc(CallLoc), Callee(Callee),
69583587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith      Index(Info.NextCallIndex++), This(This), Arguments(Arguments) {
69608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  Info.CurrentCall = this;
69708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  ++Info.CallStackDepth;
69808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith}
69908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith
70008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard SmithCallStackFrame::~CallStackFrame() {
70108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  assert(Info.CurrentCall == this && "calls retired out of order");
70208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  --Info.CallStackDepth;
70308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  Info.CurrentCall = Caller;
70408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith}
70587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner
70603ce5f8c68f55405db6001e82bdb18581d0dadceRichard SmithAPValue &CallStackFrame::createTemporary(const void *Key,
70703ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith                                         bool IsLifetimeExtended) {
70803ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith  APValue &Result = Temporaries[Key];
70903ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith  assert(Result.isUninit() && "temporary created multiple times");
71003ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith  Info.CleanupStack.push_back(Cleanup(&Result, IsLifetimeExtended));
71103ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith  return Result;
71203ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith}
71303ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith
7148a66bf78becf05a24e8251379f3843d1fceb627fRichard Smithstatic void describeCall(CallStackFrame *Frame, raw_ostream &Out);
71508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith
71608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithvoid EvalInfo::addCallStack(unsigned Limit) {
71708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  // Determine which calls to skip, if any.
71808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  unsigned ActiveCalls = CallStackDepth - 1;
71908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  unsigned SkipStart = ActiveCalls, SkipEnd = SkipStart;
72008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  if (Limit && Limit < ActiveCalls) {
72108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith    SkipStart = Limit / 2 + Limit % 2;
72208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith    SkipEnd = ActiveCalls - Limit / 2;
72308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  }
72408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith
72508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  // Walk the call stack and add the diagnostics.
72608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  unsigned CallIdx = 0;
72708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  for (CallStackFrame *Frame = CurrentCall; Frame != &BottomFrame;
72808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith       Frame = Frame->Caller, ++CallIdx) {
72908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith    // Skip this call?
73008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith    if (CallIdx >= SkipStart && CallIdx < SkipEnd) {
73108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith      if (CallIdx == SkipStart) {
73208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith        // Note that we're skipping calls.
73308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith        addDiag(Frame->CallLoc, diag::note_constexpr_calls_suppressed)
73408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith          << unsigned(ActiveCalls - Limit);
73508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith      }
73608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith      continue;
73708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith    }
73808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith
739cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko    SmallVector<char, 128> Buffer;
74008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith    llvm::raw_svector_ostream Out(Buffer);
74108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith    describeCall(Frame, Out);
74208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith    addDiag(Frame->CallLoc, diag::note_constexpr_call_here) << Out.str();
743bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith  }
74408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith}
745d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
74608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithnamespace {
747f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall  struct ComplexValue {
748f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall  private:
749f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    bool IsInt;
750f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall
751f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall  public:
752f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    APSInt IntReal, IntImag;
753f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    APFloat FloatReal, FloatImag;
754f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall
755f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    ComplexValue() : FloatReal(APFloat::Bogus), FloatImag(APFloat::Bogus) {}
756f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall
757f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    void makeComplexFloat() { IsInt = false; }
758f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    bool isComplexFloat() const { return !IsInt; }
759f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    APFloat &getComplexFloatReal() { return FloatReal; }
760f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    APFloat &getComplexFloatImag() { return FloatImag; }
761f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall
762f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    void makeComplexInt() { IsInt = true; }
763f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    bool isComplexInt() const { return IsInt; }
764f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    APSInt &getComplexIntReal() { return IntReal; }
765f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    APSInt &getComplexIntImag() { return IntImag; }
766f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall
7671aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith    void moveInto(APValue &v) const {
768f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall      if (isComplexFloat())
7691aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith        v = APValue(FloatReal, FloatImag);
770f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall      else
7711aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith        v = APValue(IntReal, IntImag);
772f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    }
7731aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith    void setFrom(const APValue &v) {
77456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      assert(v.isComplexFloat() || v.isComplexInt());
77556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      if (v.isComplexFloat()) {
77656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall        makeComplexFloat();
77756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall        FloatReal = v.getComplexFloatReal();
77856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall        FloatImag = v.getComplexFloatImag();
77956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      } else {
78056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall        makeComplexInt();
78156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall        IntReal = v.getComplexIntReal();
78256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall        IntImag = v.getComplexIntImag();
78356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      }
78456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    }
785f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall  };
786efdb83e26f9a1fd2566afe54461216cd84814d42John McCall
787efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  struct LValue {
7881bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith    APValue::LValueBase Base;
789efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    CharUnits Offset;
79083587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    unsigned CallIndex;
7910a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    SubobjectDesignator Designator;
792efdb83e26f9a1fd2566afe54461216cd84814d42John McCall
7931bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith    const APValue::LValueBase getLValueBase() const { return Base; }
79447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    CharUnits &getLValueOffset() { return Offset; }
795625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith    const CharUnits &getLValueOffset() const { return Offset; }
79683587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    unsigned getLValueCallIndex() const { return CallIndex; }
7970a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    SubobjectDesignator &getLValueDesignator() { return Designator; }
7980a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    const SubobjectDesignator &getLValueDesignator() const { return Designator;}
799efdb83e26f9a1fd2566afe54461216cd84814d42John McCall
8001aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith    void moveInto(APValue &V) const {
8011aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith      if (Designator.Invalid)
8021aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith        V = APValue(Base, Offset, APValue::NoLValuePath(), CallIndex);
8031aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith      else
8041aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith        V = APValue(Base, Offset, Designator.Entries,
8051aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith                    Designator.IsOnePastTheEnd, CallIndex);
806efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    }
8071aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith    void setFrom(ASTContext &Ctx, const APValue &V) {
80847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith      assert(V.isLValue());
80947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith      Base = V.getLValueBase();
81047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith      Offset = V.getLValueOffset();
81183587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith      CallIndex = V.getLValueCallIndex();
8121aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith      Designator = SubobjectDesignator(Ctx, V);
8130a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    }
8140a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith
81583587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    void set(APValue::LValueBase B, unsigned I = 0) {
8161bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith      Base = B;
8170a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      Offset = CharUnits::Zero();
81883587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith      CallIndex = I;
819b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      Designator = SubobjectDesignator(getType(B));
820b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    }
821b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith
822b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    // Check that this LValue is not based on a null pointer. If it is, produce
823b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    // a diagnostic and mark the designator as invalid.
824b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    bool checkNullPointer(EvalInfo &Info, const Expr *E,
825b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith                          CheckSubobjectKind CSK) {
826b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      if (Designator.Invalid)
827b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith        return false;
828b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      if (!Base) {
8295cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith        Info.CCEDiag(E, diag::note_constexpr_null_subobject)
830b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith          << CSK;
831b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith        Designator.setInvalid();
832b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith        return false;
833b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      }
834b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      return true;
835b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    }
836b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith
837b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    // Check this LValue refers to an object. If not, set the designator to be
838b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    // invalid and emit a diagnostic.
839b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    bool checkSubobject(EvalInfo &Info, const Expr *E, CheckSubobjectKind CSK) {
8405cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith      // Outside C++11, do not build a designator referring to a subobject of
8415cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith      // any object: we won't use such a designator for anything.
84280ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith      if (!Info.getLangOpts().CPlusPlus11)
8435cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith        Designator.setInvalid();
844b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      return checkNullPointer(Info, E, CSK) &&
845b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith             Designator.checkSubobject(Info, E, CSK);
846b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    }
847b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith
848b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    void addDecl(EvalInfo &Info, const Expr *E,
849b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith                 const Decl *D, bool Virtual = false) {
8505cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith      if (checkSubobject(Info, E, isa<FieldDecl>(D) ? CSK_Field : CSK_Base))
8515cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith        Designator.addDeclUnchecked(D, Virtual);
852b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    }
853b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    void addArray(EvalInfo &Info, const Expr *E, const ConstantArrayType *CAT) {
8545cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith      if (checkSubobject(Info, E, CSK_ArrayToPointer))
8555cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith        Designator.addArrayUnchecked(CAT);
856b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    }
85786024013d4c3728122c58fa07a2a67e6c15837efRichard Smith    void addComplex(EvalInfo &Info, const Expr *E, QualType EltTy, bool Imag) {
8585cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith      if (checkSubobject(Info, E, Imag ? CSK_Imag : CSK_Real))
8595cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith        Designator.addComplexUnchecked(EltTy, Imag);
86086024013d4c3728122c58fa07a2a67e6c15837efRichard Smith    }
861b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    void adjustIndex(EvalInfo &Info, const Expr *E, uint64_t N) {
8625cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith      if (checkNullPointer(Info, E, CSK_ArrayIndex))
8635cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith        Designator.adjustIndex(Info, E, N);
86456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    }
865efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  };
866e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
867e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  struct MemberPtr {
868e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    MemberPtr() {}
869e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    explicit MemberPtr(const ValueDecl *Decl) :
870e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      DeclAndIsDerivedMember(Decl, false), Path() {}
871e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
872e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    /// The member or (direct or indirect) field referred to by this member
873e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    /// pointer, or 0 if this is a null member pointer.
874e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    const ValueDecl *getDecl() const {
875e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      return DeclAndIsDerivedMember.getPointer();
876e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    }
877e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    /// Is this actually a member of some type derived from the relevant class?
878e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    bool isDerivedMember() const {
879e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      return DeclAndIsDerivedMember.getInt();
880e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    }
881e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    /// Get the class which the declaration actually lives in.
882e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    const CXXRecordDecl *getContainingRecord() const {
883e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      return cast<CXXRecordDecl>(
884e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith          DeclAndIsDerivedMember.getPointer()->getDeclContext());
885e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    }
886e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
8871aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith    void moveInto(APValue &V) const {
8881aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith      V = APValue(getDecl(), isDerivedMember(), Path);
889e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    }
8901aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith    void setFrom(const APValue &V) {
891e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      assert(V.isMemberPointer());
892e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      DeclAndIsDerivedMember.setPointer(V.getMemberPointerDecl());
893e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      DeclAndIsDerivedMember.setInt(V.isMemberPointerToDerivedMember());
894e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      Path.clear();
895e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      ArrayRef<const CXXRecordDecl*> P = V.getMemberPointerPath();
896e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      Path.insert(Path.end(), P.begin(), P.end());
897e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    }
898e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
899e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    /// DeclAndIsDerivedMember - The member declaration, and a flag indicating
900e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    /// whether the member is a member of some class derived from the class type
901e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    /// of the member pointer.
902e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    llvm::PointerIntPair<const ValueDecl*, 1, bool> DeclAndIsDerivedMember;
903e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    /// Path - The path of base/derived classes from the member declaration's
904e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    /// class (exclusive) to the class type of the member pointer (inclusive).
905e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    SmallVector<const CXXRecordDecl*, 4> Path;
906e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
907e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    /// Perform a cast towards the class of the Decl (either up or down the
908e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    /// hierarchy).
909e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    bool castBack(const CXXRecordDecl *Class) {
910e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      assert(!Path.empty());
911e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      const CXXRecordDecl *Expected;
912e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      if (Path.size() >= 2)
913e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        Expected = Path[Path.size() - 2];
914e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      else
915e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        Expected = getContainingRecord();
916e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      if (Expected->getCanonicalDecl() != Class->getCanonicalDecl()) {
917e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        // C++11 [expr.static.cast]p12: In a conversion from (D::*) to (B::*),
918e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        // if B does not contain the original member and is not a base or
919e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        // derived class of the class containing the original member, the result
920e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        // of the cast is undefined.
921e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        // C++11 [conv.mem]p2 does not cover this case for a cast from (B::*) to
922e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        // (D::*). We consider that to be a language defect.
923e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        return false;
924e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      }
925e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      Path.pop_back();
926e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      return true;
927e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    }
928e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    /// Perform a base-to-derived member pointer cast.
929e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    bool castToDerived(const CXXRecordDecl *Derived) {
930e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      if (!getDecl())
931e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        return true;
932e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      if (!isDerivedMember()) {
933e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        Path.push_back(Derived);
934e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        return true;
935e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      }
936e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      if (!castBack(Derived))
937e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        return false;
938e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      if (Path.empty())
939e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        DeclAndIsDerivedMember.setInt(false);
940e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      return true;
941e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    }
942e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    /// Perform a derived-to-base member pointer cast.
943e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    bool castToBase(const CXXRecordDecl *Base) {
944e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      if (!getDecl())
945e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        return true;
946e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      if (Path.empty())
947e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        DeclAndIsDerivedMember.setInt(true);
948e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      if (isDerivedMember()) {
949e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        Path.push_back(Base);
950e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        return true;
951e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      }
952e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      return castBack(Base);
953e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    }
954e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  };
955c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
956b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith  /// Compare two member pointers, which are assumed to be of the same type.
957b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith  static bool operator==(const MemberPtr &LHS, const MemberPtr &RHS) {
958b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith    if (!LHS.getDecl() || !RHS.getDecl())
959b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith      return !LHS.getDecl() && !RHS.getDecl();
960b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith    if (LHS.getDecl()->getCanonicalDecl() != RHS.getDecl()->getCanonicalDecl())
961b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith      return false;
962b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith    return LHS.Path == RHS.Path;
963b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith  }
964f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall}
96587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner
9661aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smithstatic bool Evaluate(APValue &Result, EvalInfo &Info, const Expr *E);
96783587db1bda97f45d2b5a4189e584e2a18be511aRichard Smithstatic bool EvaluateInPlace(APValue &Result, EvalInfo &Info,
96883587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith                            const LValue &This, const Expr *E,
96983587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith                            bool AllowNonLiteralTypes = false);
970efdb83e26f9a1fd2566afe54461216cd84814d42John McCallstatic bool EvaluateLValue(const Expr *E, LValue &Result, EvalInfo &Info);
971efdb83e26f9a1fd2566afe54461216cd84814d42John McCallstatic bool EvaluatePointer(const Expr *E, LValue &Result, EvalInfo &Info);
972e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstatic bool EvaluateMemberPointer(const Expr *E, MemberPtr &Result,
973e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith                                  EvalInfo &Info);
974e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstatic bool EvaluateTemporary(const Expr *E, LValue &Result, EvalInfo &Info);
97587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluateInteger(const Expr *E, APSInt  &Result, EvalInfo &Info);
9761aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smithstatic bool EvaluateIntegerOrLValue(const Expr *E, APValue &Result,
977d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner                                    EvalInfo &Info);
978d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr *E, APFloat &Result, EvalInfo &Info);
979f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCallstatic bool EvaluateComplex(const Expr *E, ComplexValue &Res, EvalInfo &Info);
9805705f211472f19fc38e58d81365f9261024b3ba3Richard Smithstatic bool EvaluateAtomic(const Expr *E, APValue &Result, EvalInfo &Info);
981f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
982f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
9834efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// Misc utilities
9844efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
9854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
9868a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith/// Produce a string describing the given constexpr call.
9878a66bf78becf05a24e8251379f3843d1fceb627fRichard Smithstatic void describeCall(CallStackFrame *Frame, raw_ostream &Out) {
9888a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  unsigned ArgIndex = 0;
9898a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  bool IsMemberCall = isa<CXXMethodDecl>(Frame->Callee) &&
9908a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith                      !isa<CXXConstructorDecl>(Frame->Callee) &&
9918a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith                      cast<CXXMethodDecl>(Frame->Callee)->isInstance();
9928a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith
9938a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  if (!IsMemberCall)
9948a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    Out << *Frame->Callee << '(';
9958a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith
9968a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  if (Frame->This && IsMemberCall) {
9978a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    APValue Val;
9988a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    Frame->This->moveInto(Val);
9998a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    Val.printPretty(Out, Frame->Info.Ctx,
10008a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith                    Frame->This->Designator.MostDerivedType);
10018a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    // FIXME: Add parens around Val if needed.
10028a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    Out << "->" << *Frame->Callee << '(';
10038a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    IsMemberCall = false;
10048a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  }
10058a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith
10068a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  for (FunctionDecl::param_const_iterator I = Frame->Callee->param_begin(),
10078a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith       E = Frame->Callee->param_end(); I != E; ++I, ++ArgIndex) {
10088a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    if (ArgIndex > (unsigned)IsMemberCall)
10098a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      Out << ", ";
10108a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith
10118a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    const ParmVarDecl *Param = *I;
10128a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    const APValue &Arg = Frame->Arguments[ArgIndex];
10138a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    Arg.printPretty(Out, Frame->Info.Ctx, Param->getType());
10148a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith
10158a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    if (ArgIndex == 0 && IsMemberCall)
10168a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      Out << "->" << *Frame->Callee << '(';
10178a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  }
10188a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith
10198a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  Out << ')';
10208a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith}
10218a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith
1022a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith/// Evaluate an expression to see if it had side-effects, and discard its
1023a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith/// result.
1024ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith/// \return \c true if the caller should keep evaluating.
1025ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smithstatic bool EvaluateIgnoredValue(EvalInfo &Info, const Expr *E) {
1026a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith  APValue Scratch;
1027ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith  if (!Evaluate(Scratch, Info, E)) {
1028a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    Info.EvalStatus.HasSideEffects = true;
1029ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith    return Info.keepEvaluatingAfterFailure();
1030ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith  }
1031ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith  return true;
1032a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith}
1033a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith
1034a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith/// Sign- or zero-extend a value to 64 bits. If it's already 64 bits, just
1035a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith/// return its existing value.
1036a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smithstatic int64_t getExtValue(const APSInt &Value) {
1037a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith  return Value.isSigned() ? Value.getSExtValue()
1038a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith                          : static_cast<int64_t>(Value.getZExtValue());
1039a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith}
1040a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith
1041180f47959a066795cc0f409433023af448bb0328Richard Smith/// Should this call expression be treated as a string literal?
1042180f47959a066795cc0f409433023af448bb0328Richard Smithstatic bool IsStringLiteralCall(const CallExpr *E) {
1043180f47959a066795cc0f409433023af448bb0328Richard Smith  unsigned Builtin = E->isBuiltinCall();
1044180f47959a066795cc0f409433023af448bb0328Richard Smith  return (Builtin == Builtin::BI__builtin___CFStringMakeConstantString ||
1045180f47959a066795cc0f409433023af448bb0328Richard Smith          Builtin == Builtin::BI__builtin___NSStringMakeConstantString);
1046180f47959a066795cc0f409433023af448bb0328Richard Smith}
1047180f47959a066795cc0f409433023af448bb0328Richard Smith
10481bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smithstatic bool IsGlobalLValue(APValue::LValueBase B) {
1049180f47959a066795cc0f409433023af448bb0328Richard Smith  // C++11 [expr.const]p3 An address constant expression is a prvalue core
1050180f47959a066795cc0f409433023af448bb0328Richard Smith  // constant expression of pointer type that evaluates to...
1051180f47959a066795cc0f409433023af448bb0328Richard Smith
1052180f47959a066795cc0f409433023af448bb0328Richard Smith  // ... a null pointer value, or a prvalue core constant expression of type
1053180f47959a066795cc0f409433023af448bb0328Richard Smith  // std::nullptr_t.
10541bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith  if (!B) return true;
105542c8f87eb60958170c46767273bf93e6c96125bfJohn McCall
10561bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith  if (const ValueDecl *D = B.dyn_cast<const ValueDecl*>()) {
1057180f47959a066795cc0f409433023af448bb0328Richard Smith    // ... the address of an object with static storage duration,
10581bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith    if (const VarDecl *VD = dyn_cast<VarDecl>(D))
105942c8f87eb60958170c46767273bf93e6c96125bfJohn McCall      return VD->hasGlobalStorage();
10601bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith    // ... the address of a function,
10611bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith    return isa<FunctionDecl>(D);
106242c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  }
10631bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith
10641bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith  const Expr *E = B.get<const Expr*>();
10651bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith  switch (E->getStmtClass()) {
10661bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith  default:
10671bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith    return false;
1068b78ae9716576399145786b93f687943f8b197170Richard Smith  case Expr::CompoundLiteralExprClass: {
1069b78ae9716576399145786b93f687943f8b197170Richard Smith    const CompoundLiteralExpr *CLE = cast<CompoundLiteralExpr>(E);
1070b78ae9716576399145786b93f687943f8b197170Richard Smith    return CLE->isFileScope() && CLE->isLValue();
1071b78ae9716576399145786b93f687943f8b197170Richard Smith  }
1072211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith  case Expr::MaterializeTemporaryExprClass:
1073211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith    // A materialized temporary might have been lifetime-extended to static
1074211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith    // storage duration.
1075211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith    return cast<MaterializeTemporaryExpr>(E)->getStorageDuration() == SD_Static;
1076180f47959a066795cc0f409433023af448bb0328Richard Smith  // A string literal has static storage duration.
1077180f47959a066795cc0f409433023af448bb0328Richard Smith  case Expr::StringLiteralClass:
1078180f47959a066795cc0f409433023af448bb0328Richard Smith  case Expr::PredefinedExprClass:
1079180f47959a066795cc0f409433023af448bb0328Richard Smith  case Expr::ObjCStringLiteralClass:
1080180f47959a066795cc0f409433023af448bb0328Richard Smith  case Expr::ObjCEncodeExprClass:
108147d2145675099893d702be4bc06bd9f26d8ddd13Richard Smith  case Expr::CXXTypeidExprClass:
1082e275a1845b9e32bd3034f2593dee1780855c8fd6Francois Pichet  case Expr::CXXUuidofExprClass:
1083180f47959a066795cc0f409433023af448bb0328Richard Smith    return true;
1084180f47959a066795cc0f409433023af448bb0328Richard Smith  case Expr::CallExprClass:
1085180f47959a066795cc0f409433023af448bb0328Richard Smith    return IsStringLiteralCall(cast<CallExpr>(E));
1086180f47959a066795cc0f409433023af448bb0328Richard Smith  // For GCC compatibility, &&label has static storage duration.
1087180f47959a066795cc0f409433023af448bb0328Richard Smith  case Expr::AddrLabelExprClass:
1088180f47959a066795cc0f409433023af448bb0328Richard Smith    return true;
1089180f47959a066795cc0f409433023af448bb0328Richard Smith  // A Block literal expression may be used as the initialization value for
1090180f47959a066795cc0f409433023af448bb0328Richard Smith  // Block variables at global or local static scope.
1091180f47959a066795cc0f409433023af448bb0328Richard Smith  case Expr::BlockExprClass:
1092180f47959a066795cc0f409433023af448bb0328Richard Smith    return !cast<BlockExpr>(E)->getBlockDecl()->hasCaptures();
1093745f5147e065900267c85a5568785a1991d4838fRichard Smith  case Expr::ImplicitValueInitExprClass:
1094745f5147e065900267c85a5568785a1991d4838fRichard Smith    // FIXME:
1095745f5147e065900267c85a5568785a1991d4838fRichard Smith    // We can never form an lvalue with an implicit value initialization as its
1096745f5147e065900267c85a5568785a1991d4838fRichard Smith    // base through expression evaluation, so these only appear in one case: the
1097745f5147e065900267c85a5568785a1991d4838fRichard Smith    // implicit variable declaration we invent when checking whether a constexpr
1098745f5147e065900267c85a5568785a1991d4838fRichard Smith    // constructor can produce a constant expression. We must assume that such
1099745f5147e065900267c85a5568785a1991d4838fRichard Smith    // an expression might be a global lvalue.
1100745f5147e065900267c85a5568785a1991d4838fRichard Smith    return true;
1101180f47959a066795cc0f409433023af448bb0328Richard Smith  }
110242c8f87eb60958170c46767273bf93e6c96125bfJohn McCall}
110342c8f87eb60958170c46767273bf93e6c96125bfJohn McCall
110483587db1bda97f45d2b5a4189e584e2a18be511aRichard Smithstatic void NoteLValueLocation(EvalInfo &Info, APValue::LValueBase Base) {
110583587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  assert(Base && "no location for a null lvalue");
110683587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  const ValueDecl *VD = Base.dyn_cast<const ValueDecl*>();
110783587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  if (VD)
110883587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    Info.Note(VD->getLocation(), diag::note_declared_at);
110983587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  else
1110890f0f1612b0028b8b16730ae7ed07e295600c76Ted Kremenek    Info.Note(Base.get<const Expr*>()->getExprLoc(),
111183587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith              diag::note_constexpr_temporary_here);
111283587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith}
111383587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith
11149a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith/// Check that this reference or pointer core constant expression is a valid
11151aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith/// value for an address or reference constant expression. Return true if we
11161aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith/// can fold this expression, whether or not it's a constant expression.
111783587db1bda97f45d2b5a4189e584e2a18be511aRichard Smithstatic bool CheckLValueConstantExpression(EvalInfo &Info, SourceLocation Loc,
111883587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith                                          QualType Type, const LValue &LVal) {
111983587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  bool IsReferenceType = Type->isReferenceType();
112083587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith
1121c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  APValue::LValueBase Base = LVal.getLValueBase();
1122c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  const SubobjectDesignator &Designator = LVal.getLValueDesignator();
1123c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
1124b78ae9716576399145786b93f687943f8b197170Richard Smith  // Check that the object is a global. Note that the fake 'this' object we
1125b78ae9716576399145786b93f687943f8b197170Richard Smith  // manufacture when checking potential constant expressions is conservatively
1126b78ae9716576399145786b93f687943f8b197170Richard Smith  // assumed to be global here.
1127c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  if (!IsGlobalLValue(Base)) {
112880ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith    if (Info.getLangOpts().CPlusPlus11) {
1129c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      const ValueDecl *VD = Base.dyn_cast<const ValueDecl*>();
113083587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith      Info.Diag(Loc, diag::note_constexpr_non_global, 1)
113183587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith        << IsReferenceType << !Designator.Entries.empty()
113283587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith        << !!VD << VD;
113383587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith      NoteLValueLocation(Info, Base);
1134c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    } else {
113583587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith      Info.Diag(Loc);
1136c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    }
113761e616206413d1779c7545c7a8ad1ce1129ad9c1Richard Smith    // Don't allow references to temporaries to escape.
113869c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith    return false;
1139f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  }
114083587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  assert((Info.CheckingPotentialConstantExpression ||
114183587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith          LVal.getLValueCallIndex() == 0) &&
114283587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith         "have call index for global lvalue");
1143b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith
114448def65d1cfbd020c5d4a7e542a00d63808c6060Hans Wennborg  // Check if this is a thread-local variable.
114548def65d1cfbd020c5d4a7e542a00d63808c6060Hans Wennborg  if (const ValueDecl *VD = Base.dyn_cast<const ValueDecl*>()) {
114648def65d1cfbd020c5d4a7e542a00d63808c6060Hans Wennborg    if (const VarDecl *Var = dyn_cast<const VarDecl>(VD)) {
114738afbc7361d861968232defaeaf8e302af75b5eeRichard Smith      if (Var->getTLSKind())
114848def65d1cfbd020c5d4a7e542a00d63808c6060Hans Wennborg        return false;
114948def65d1cfbd020c5d4a7e542a00d63808c6060Hans Wennborg    }
115048def65d1cfbd020c5d4a7e542a00d63808c6060Hans Wennborg  }
115148def65d1cfbd020c5d4a7e542a00d63808c6060Hans Wennborg
1152b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  // Allow address constant expressions to be past-the-end pointers. This is
1153b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  // an extension: the standard requires them to point to an object.
1154b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  if (!IsReferenceType)
1155b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    return true;
1156b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith
1157b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  // A reference constant expression must refer to an object.
1158b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  if (!Base) {
1159b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    // FIXME: diagnostic
116083587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    Info.CCEDiag(Loc);
116161e616206413d1779c7545c7a8ad1ce1129ad9c1Richard Smith    return true;
1162b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  }
1163b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith
1164c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // Does this refer one past the end of some object?
1165b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  if (Designator.isOnePastTheEnd()) {
1166c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    const ValueDecl *VD = Base.dyn_cast<const ValueDecl*>();
116783587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    Info.Diag(Loc, diag::note_constexpr_past_end, 1)
1168c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      << !Designator.Entries.empty() << !!VD << VD;
116983587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    NoteLValueLocation(Info, Base);
1170c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  }
1171c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
117269c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith  return true;
117347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith}
117447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith
117551201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith/// Check that this core constant expression is of literal type, and if not,
117651201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith/// produce an appropriate diagnostic.
11776391ea2897b595178a8a97e5080f59a6f55ce442Richard Smithstatic bool CheckLiteralType(EvalInfo &Info, const Expr *E,
11786391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith                             const LValue *This = 0) {
1179a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith  if (!E->isRValue() || E->getType()->isLiteralType(Info.Ctx))
118051201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    return true;
118151201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith
11826391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith  // C++1y: A constant initializer for an object o [...] may also invoke
11836391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith  // constexpr constructors for o and its subobjects even if those objects
11846391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith  // are of non-literal class types.
11856391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith  if (Info.getLangOpts().CPlusPlus1y && This &&
1186c45c8dd54bc54f9be46546fdf002dc9fe07d1715Richard Smith      Info.EvaluatingDecl == This->getLValueBase())
11876391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith    return true;
11886391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith
118951201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  // Prvalue constant expressions must be of literal types.
119080ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith  if (Info.getLangOpts().CPlusPlus11)
11915cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith    Info.Diag(E, diag::note_constexpr_nonliteral)
119251201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith      << E->getType();
119351201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  else
11945cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith    Info.Diag(E, diag::note_invalid_subexpr_in_const_expr);
119551201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  return false;
119651201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith}
119751201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith
11989a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith/// Check that this core constant expression value is a valid value for a
119983587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith/// constant expression. If not, report an appropriate diagnostic. Does not
120083587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith/// check that the expression is of literal type.
120183587db1bda97f45d2b5a4189e584e2a18be511aRichard Smithstatic bool CheckConstantExpression(EvalInfo &Info, SourceLocation DiagLoc,
120283587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith                                    QualType Type, const APValue &Value) {
12033ed4d1cbaad763c103771bdefb8b986a08f165fcRichard Smith  if (Value.isUninit()) {
120437a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith    Info.Diag(DiagLoc, diag::note_constexpr_uninitialized)
120537a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith      << true << Type;
12063ed4d1cbaad763c103771bdefb8b986a08f165fcRichard Smith    return false;
12073ed4d1cbaad763c103771bdefb8b986a08f165fcRichard Smith  }
12083ed4d1cbaad763c103771bdefb8b986a08f165fcRichard Smith
120983587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  // Core issue 1454: For a literal constant expression of array or class type,
121083587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  // each subobject of its value shall have been initialized by a constant
121183587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  // expression.
121283587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  if (Value.isArray()) {
121383587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    QualType EltTy = Type->castAsArrayTypeUnsafe()->getElementType();
121483587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    for (unsigned I = 0, N = Value.getArrayInitializedElts(); I != N; ++I) {
121583587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith      if (!CheckConstantExpression(Info, DiagLoc, EltTy,
121683587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith                                   Value.getArrayInitializedElt(I)))
121783587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith        return false;
121883587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    }
121983587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    if (!Value.hasArrayFiller())
122083587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith      return true;
122183587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    return CheckConstantExpression(Info, DiagLoc, EltTy,
122283587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith                                   Value.getArrayFiller());
122383587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  }
122483587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  if (Value.isUnion() && Value.getUnionField()) {
122583587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    return CheckConstantExpression(Info, DiagLoc,
122683587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith                                   Value.getUnionField()->getType(),
122783587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith                                   Value.getUnionValue());
122883587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  }
122983587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  if (Value.isStruct()) {
123083587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    RecordDecl *RD = Type->castAs<RecordType>()->getDecl();
123183587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    if (const CXXRecordDecl *CD = dyn_cast<CXXRecordDecl>(RD)) {
123283587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith      unsigned BaseIndex = 0;
123383587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith      for (CXXRecordDecl::base_class_const_iterator I = CD->bases_begin(),
123483587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith             End = CD->bases_end(); I != End; ++I, ++BaseIndex) {
123583587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith        if (!CheckConstantExpression(Info, DiagLoc, I->getType(),
123683587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith                                     Value.getStructBase(BaseIndex)))
123783587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith          return false;
123883587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith      }
123983587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    }
124083587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    for (RecordDecl::field_iterator I = RD->field_begin(), E = RD->field_end();
124183587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith         I != E; ++I) {
1242262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie      if (!CheckConstantExpression(Info, DiagLoc, I->getType(),
1243262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie                                   Value.getStructField(I->getFieldIndex())))
124483587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith        return false;
124583587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    }
124683587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  }
124783587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith
124883587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  if (Value.isLValue()) {
124983587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    LValue LVal;
12501aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith    LVal.setFrom(Info.Ctx, Value);
125183587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    return CheckLValueConstantExpression(Info, DiagLoc, Type, LVal);
12529a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith  }
125383587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith
125483587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  // Everything else is fine.
125583587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  return true;
12569a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith}
12579a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith
12589e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smithconst ValueDecl *GetLValueBaseDecl(const LValue &LVal) {
12591bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith  return LVal.Base.dyn_cast<const ValueDecl*>();
12609e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith}
12619e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith
12629e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smithstatic bool IsLiteralLValue(const LValue &Value) {
1263211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith  if (Value.CallIndex)
1264211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith    return false;
1265211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith  const Expr *E = Value.Base.dyn_cast<const Expr*>();
1266211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith  return E && !isa<MaterializeTemporaryExpr>(E);
12679e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith}
12689e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith
126965ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smithstatic bool IsWeakLValue(const LValue &Value) {
127065ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith  const ValueDecl *Decl = GetLValueBaseDecl(Value);
12710dd7a25e8d679de1dc0ce788222d6dee0e879885Lang Hames  return Decl && Decl->isWeak();
127265ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith}
127365ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith
12741aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smithstatic bool EvalPointerValueAsBool(const APValue &Value, bool &Result) {
12753554283157190e67918fad4221a5e6faf9317362John McCall  // A null base expression indicates a null pointer.  These are always
12763554283157190e67918fad4221a5e6faf9317362John McCall  // evaluatable, and they are false unless the offset is zero.
1277e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  if (!Value.getLValueBase()) {
1278e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    Result = !Value.getLValueOffset().isZero();
12793554283157190e67918fad4221a5e6faf9317362John McCall    return true;
12803554283157190e67918fad4221a5e6faf9317362John McCall  }
12813554283157190e67918fad4221a5e6faf9317362John McCall
1282e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  // We have a non-null base.  These are generally known to be true, but if it's
1283e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  // a weak declaration it can be null at runtime.
12843554283157190e67918fad4221a5e6faf9317362John McCall  Result = true;
1285e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  const ValueDecl *Decl = Value.getLValueBase().dyn_cast<const ValueDecl*>();
12860dd7a25e8d679de1dc0ce788222d6dee0e879885Lang Hames  return !Decl || !Decl->isWeak();
12875bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman}
12885bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman
12891aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smithstatic bool HandleConversionToBool(const APValue &Val, bool &Result) {
1290c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  switch (Val.getKind()) {
1291c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  case APValue::Uninitialized:
1292c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return false;
1293c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  case APValue::Int:
1294c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    Result = Val.getInt().getBoolValue();
129541bf4f38348561a0f12c10d34f1673cd19a6eb04Richard Smith    return true;
1296c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  case APValue::Float:
1297c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    Result = !Val.getFloat().isZero();
1298a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman    return true;
1299c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  case APValue::ComplexInt:
1300c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    Result = Val.getComplexIntReal().getBoolValue() ||
1301c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith             Val.getComplexIntImag().getBoolValue();
1302c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return true;
1303c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  case APValue::ComplexFloat:
1304c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    Result = !Val.getComplexFloatReal().isZero() ||
1305c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith             !Val.getComplexFloatImag().isZero();
1306436c8898cd1c93c5bacd3fcc4ac586bc5cd77062Richard Smith    return true;
1307e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  case APValue::LValue:
1308e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    return EvalPointerValueAsBool(Val, Result);
1309e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  case APValue::MemberPointer:
1310e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    Result = Val.getMemberPointerDecl();
1311e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    return true;
1312c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  case APValue::Vector:
1313cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  case APValue::Array:
1314180f47959a066795cc0f409433023af448bb0328Richard Smith  case APValue::Struct:
1315180f47959a066795cc0f409433023af448bb0328Richard Smith  case APValue::Union:
131665639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman  case APValue::AddrLabelDiff:
1317c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return false;
13184efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
13194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1320c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  llvm_unreachable("unknown APValue kind");
1321c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith}
1322c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
1323c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smithstatic bool EvaluateAsBooleanCondition(const Expr *E, bool &Result,
1324c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith                                       EvalInfo &Info) {
1325c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  assert(E->isRValue() && "missing lvalue-to-rvalue conv in bool condition");
13261aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith  APValue Val;
1327d411a4b23077b29e19c9371bbb19b054a374d922Argyrios Kyrtzidis  if (!Evaluate(Val, Info, E))
1328c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return false;
1329d411a4b23077b29e19c9371bbb19b054a374d922Argyrios Kyrtzidis  return HandleConversionToBool(Val, Result);
13304efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
13314efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1332c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithtemplate<typename T>
133326dc97cbeba8ced19972a259720a71aefa01ef43Eli Friedmanstatic void HandleOverflow(EvalInfo &Info, const Expr *E,
1334c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith                           const T &SrcValue, QualType DestType) {
133526dc97cbeba8ced19972a259720a71aefa01ef43Eli Friedman  Info.CCEDiag(E, diag::note_constexpr_overflow)
1336789f9b6be5df6e5151ac35e68416cdf550db1196Richard Smith    << SrcValue << DestType;
1337c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
1338c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
1339c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithstatic bool HandleFloatToIntCast(EvalInfo &Info, const Expr *E,
1340c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith                                 QualType SrcType, const APFloat &Value,
1341c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith                                 QualType DestType, APSInt &Result) {
1342c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  unsigned DestWidth = Info.Ctx.getIntWidth(DestType);
1343a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  // Determine whether we are converting to unsigned or signed.
1344575a1c9dc8dc5b4977194993e289f9eda7295c39Douglas Gregor  bool DestSigned = DestType->isSignedIntegerOrEnumerationType();
13451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1346c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  Result = APSInt(DestWidth, !DestSigned);
1347a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  bool ignored;
1348c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  if (Value.convertToInteger(Result, llvm::APFloat::rmTowardZero, &ignored)
1349c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      & APFloat::opInvalidOp)
135026dc97cbeba8ced19972a259720a71aefa01ef43Eli Friedman    HandleOverflow(Info, E, Value, DestType);
1351c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  return true;
1352a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar}
1353a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1354c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithstatic bool HandleFloatToFloatCast(EvalInfo &Info, const Expr *E,
1355c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith                                   QualType SrcType, QualType DestType,
1356c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith                                   APFloat &Result) {
1357c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  APFloat Value = Result;
1358a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  bool ignored;
1359c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  if (Result.convert(Info.Ctx.getFloatTypeSemantics(DestType),
1360c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith                     APFloat::rmNearestTiesToEven, &ignored)
1361c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      & APFloat::opOverflow)
136226dc97cbeba8ced19972a259720a71aefa01ef43Eli Friedman    HandleOverflow(Info, E, Value, DestType);
1363c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  return true;
1364a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar}
1365a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1366f72fccf533bca206af8e75d041c29db99e6a7f2cRichard Smithstatic APSInt HandleIntToIntCast(EvalInfo &Info, const Expr *E,
1367f72fccf533bca206af8e75d041c29db99e6a7f2cRichard Smith                                 QualType DestType, QualType SrcType,
1368f72fccf533bca206af8e75d041c29db99e6a7f2cRichard Smith                                 APSInt &Value) {
1369f72fccf533bca206af8e75d041c29db99e6a7f2cRichard Smith  unsigned DestWidth = Info.Ctx.getIntWidth(DestType);
1370a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  APSInt Result = Value;
1371a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  // Figure out if this is a truncate, extend or noop cast.
1372a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  // If the input is signed, do a sign extend, noop, or truncate.
13739f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad  Result = Result.extOrTrunc(DestWidth);
1374575a1c9dc8dc5b4977194993e289f9eda7295c39Douglas Gregor  Result.setIsUnsigned(DestType->isUnsignedIntegerOrEnumerationType());
1375a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  return Result;
1376a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar}
1377a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1378c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithstatic bool HandleIntToFloatCast(EvalInfo &Info, const Expr *E,
1379c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith                                 QualType SrcType, const APSInt &Value,
1380c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith                                 QualType DestType, APFloat &Result) {
1381c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  Result = APFloat(Info.Ctx.getFloatTypeSemantics(DestType), 1);
1382c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  if (Result.convertFromAPInt(Value, Value.isSigned(),
1383c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith                              APFloat::rmNearestTiesToEven)
1384c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      & APFloat::opOverflow)
138526dc97cbeba8ced19972a259720a71aefa01ef43Eli Friedman    HandleOverflow(Info, E, Value, DestType);
1386c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  return true;
1387a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar}
1388a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
13893835a4ef050da466038844274d79f1fc9d77c0f1Richard Smithstatic bool truncateBitfieldValue(EvalInfo &Info, const Expr *E,
13903835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith                                  APValue &Value, const FieldDecl *FD) {
13913835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith  assert(FD->isBitField() && "truncateBitfieldValue on non-bitfield");
13923835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith
13933835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith  if (!Value.isInt()) {
13943835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith    // Trying to store a pointer-cast-to-integer into a bitfield.
13953835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith    // FIXME: In this case, we should provide the diagnostic for casting
13963835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith    // a pointer to an integer.
13973835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith    assert(Value.isLValue() && "integral value neither int nor lvalue?");
13983835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith    Info.Diag(E);
13993835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith    return false;
14003835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith  }
14013835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith
14023835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith  APSInt &Int = Value.getInt();
14033835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith  unsigned OldBitWidth = Int.getBitWidth();
14043835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith  unsigned NewBitWidth = FD->getBitWidthValue(Info.Ctx);
14053835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith  if (NewBitWidth < OldBitWidth)
14063835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith    Int = Int.trunc(NewBitWidth).extend(OldBitWidth);
14073835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith  return true;
14083835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith}
14093835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith
1410e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedmanstatic bool EvalAndBitcastToAPInt(EvalInfo &Info, const Expr *E,
1411e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman                                  llvm::APInt &Res) {
14121aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith  APValue SVal;
1413e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman  if (!Evaluate(SVal, Info, E))
1414e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman    return false;
1415e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman  if (SVal.isInt()) {
1416e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman    Res = SVal.getInt();
1417e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman    return true;
1418e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman  }
1419e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman  if (SVal.isFloat()) {
1420e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman    Res = SVal.getFloat().bitcastToAPInt();
1421e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman    return true;
1422e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman  }
1423e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman  if (SVal.isVector()) {
1424e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman    QualType VecTy = E->getType();
1425e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman    unsigned VecSize = Info.Ctx.getTypeSize(VecTy);
1426e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman    QualType EltTy = VecTy->castAs<VectorType>()->getElementType();
1427e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman    unsigned EltSize = Info.Ctx.getTypeSize(EltTy);
1428e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman    bool BigEndian = Info.Ctx.getTargetInfo().isBigEndian();
1429e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman    Res = llvm::APInt::getNullValue(VecSize);
1430e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman    for (unsigned i = 0; i < SVal.getVectorLength(); i++) {
1431e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman      APValue &Elt = SVal.getVectorElt(i);
1432e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman      llvm::APInt EltAsInt;
1433e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman      if (Elt.isInt()) {
1434e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman        EltAsInt = Elt.getInt();
1435e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman      } else if (Elt.isFloat()) {
1436e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman        EltAsInt = Elt.getFloat().bitcastToAPInt();
1437e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman      } else {
1438e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman        // Don't try to handle vectors of anything other than int or float
1439e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman        // (not sure if it's possible to hit this case).
14405cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith        Info.Diag(E, diag::note_invalid_subexpr_in_const_expr);
1441e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman        return false;
1442e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman      }
1443e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman      unsigned BaseEltSize = EltAsInt.getBitWidth();
1444e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman      if (BigEndian)
1445e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman        Res |= EltAsInt.zextOrTrunc(VecSize).rotr(i*EltSize+BaseEltSize);
1446e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman      else
1447e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman        Res |= EltAsInt.zextOrTrunc(VecSize).rotl(i*EltSize);
1448e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman    }
1449e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman    return true;
1450e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman  }
1451e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman  // Give up if the input isn't an int, float, or vector.  For example, we
1452e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman  // reject "(v4i16)(intptr_t)&a".
14535cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith  Info.Diag(E, diag::note_invalid_subexpr_in_const_expr);
1454e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman  return false;
1455e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman}
1456e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman
1457d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith/// Perform the given integer operation, which is known to need at most BitWidth
1458d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith/// bits, and check for overflow in the original type (if that type was not an
1459d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith/// unsigned type).
1460d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smithtemplate<typename Operation>
1461d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smithstatic APSInt CheckedIntArithmetic(EvalInfo &Info, const Expr *E,
1462d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith                                   const APSInt &LHS, const APSInt &RHS,
1463d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith                                   unsigned BitWidth, Operation Op) {
1464d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  if (LHS.isUnsigned())
1465d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    return Op(LHS, RHS);
1466d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith
1467d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  APSInt Value(Op(LHS.extend(BitWidth), RHS.extend(BitWidth)), false);
1468d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  APSInt Result = Value.trunc(LHS.getBitWidth());
1469d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  if (Result.extend(BitWidth) != Value) {
1470d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    if (Info.getIntOverflowCheckMode())
1471d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      Info.Ctx.getDiagnostics().Report(E->getExprLoc(),
1472d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith        diag::warn_integer_constant_overflow)
1473d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith          << Result.toString(10) << E->getType();
1474d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    else
1475d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      HandleOverflow(Info, E, Value, E->getType());
1476d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  }
1477d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  return Result;
1478d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith}
1479d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith
1480d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith/// Perform the given binary integer operation.
1481d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smithstatic bool handleIntIntBinOp(EvalInfo &Info, const Expr *E, const APSInt &LHS,
1482d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith                              BinaryOperatorKind Opcode, APSInt RHS,
1483d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith                              APSInt &Result) {
1484d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  switch (Opcode) {
1485d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  default:
1486d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    Info.Diag(E);
1487d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    return false;
1488d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  case BO_Mul:
1489d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    Result = CheckedIntArithmetic(Info, E, LHS, RHS, LHS.getBitWidth() * 2,
1490d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith                                  std::multiplies<APSInt>());
1491d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    return true;
1492d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  case BO_Add:
1493d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    Result = CheckedIntArithmetic(Info, E, LHS, RHS, LHS.getBitWidth() + 1,
1494d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith                                  std::plus<APSInt>());
1495d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    return true;
1496d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  case BO_Sub:
1497d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    Result = CheckedIntArithmetic(Info, E, LHS, RHS, LHS.getBitWidth() + 1,
1498d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith                                  std::minus<APSInt>());
1499d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    return true;
1500d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  case BO_And: Result = LHS & RHS; return true;
1501d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  case BO_Xor: Result = LHS ^ RHS; return true;
1502d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  case BO_Or:  Result = LHS | RHS; return true;
1503d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  case BO_Div:
1504d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  case BO_Rem:
1505d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    if (RHS == 0) {
1506d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      Info.Diag(E, diag::note_expr_divide_by_zero);
1507d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      return false;
1508d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    }
1509d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    // Check for overflow case: INT_MIN / -1 or INT_MIN % -1.
1510d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    if (RHS.isNegative() && RHS.isAllOnesValue() &&
1511d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith        LHS.isSigned() && LHS.isMinSignedValue())
1512d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      HandleOverflow(Info, E, -LHS.extend(LHS.getBitWidth() + 1), E->getType());
1513d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    Result = (Opcode == BO_Rem ? LHS % RHS : LHS / RHS);
1514d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    return true;
1515d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  case BO_Shl: {
1516d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    if (Info.getLangOpts().OpenCL)
1517d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      // OpenCL 6.3j: shift values are effectively % word size of LHS.
1518d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      RHS &= APSInt(llvm::APInt(RHS.getBitWidth(),
1519d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith                    static_cast<uint64_t>(LHS.getBitWidth() - 1)),
1520d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith                    RHS.isUnsigned());
1521d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    else if (RHS.isSigned() && RHS.isNegative()) {
1522d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      // During constant-folding, a negative shift is an opposite shift. Such
1523d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      // a shift is not a constant expression.
1524d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      Info.CCEDiag(E, diag::note_constexpr_negative_shift) << RHS;
1525d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      RHS = -RHS;
1526d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      goto shift_right;
1527d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    }
1528d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  shift_left:
1529d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    // C++11 [expr.shift]p1: Shift width must be less than the bit width of
1530d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    // the shifted type.
1531d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    unsigned SA = (unsigned) RHS.getLimitedValue(LHS.getBitWidth()-1);
1532d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    if (SA != RHS) {
1533d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      Info.CCEDiag(E, diag::note_constexpr_large_shift)
1534d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith        << RHS << E->getType() << LHS.getBitWidth();
1535d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    } else if (LHS.isSigned()) {
1536d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      // C++11 [expr.shift]p2: A signed left shift must have a non-negative
1537d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      // operand, and must not overflow the corresponding unsigned type.
1538d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      if (LHS.isNegative())
1539d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith        Info.CCEDiag(E, diag::note_constexpr_lshift_of_negative) << LHS;
1540d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      else if (LHS.countLeadingZeros() < SA)
1541d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith        Info.CCEDiag(E, diag::note_constexpr_lshift_discards);
1542d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    }
1543d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    Result = LHS << SA;
1544d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    return true;
1545d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  }
1546d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  case BO_Shr: {
1547d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    if (Info.getLangOpts().OpenCL)
1548d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      // OpenCL 6.3j: shift values are effectively % word size of LHS.
1549d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      RHS &= APSInt(llvm::APInt(RHS.getBitWidth(),
1550d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith                    static_cast<uint64_t>(LHS.getBitWidth() - 1)),
1551d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith                    RHS.isUnsigned());
1552d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    else if (RHS.isSigned() && RHS.isNegative()) {
1553d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      // During constant-folding, a negative shift is an opposite shift. Such a
1554d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      // shift is not a constant expression.
1555d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      Info.CCEDiag(E, diag::note_constexpr_negative_shift) << RHS;
1556d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      RHS = -RHS;
1557d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      goto shift_left;
1558d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    }
1559d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  shift_right:
1560d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    // C++11 [expr.shift]p1: Shift width must be less than the bit width of the
1561d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    // shifted type.
1562d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    unsigned SA = (unsigned) RHS.getLimitedValue(LHS.getBitWidth()-1);
1563d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    if (SA != RHS)
1564d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      Info.CCEDiag(E, diag::note_constexpr_large_shift)
1565d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith        << RHS << E->getType() << LHS.getBitWidth();
1566d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    Result = LHS >> SA;
1567d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    return true;
1568d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  }
1569d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith
1570d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  case BO_LT: Result = LHS < RHS; return true;
1571d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  case BO_GT: Result = LHS > RHS; return true;
1572d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  case BO_LE: Result = LHS <= RHS; return true;
1573d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  case BO_GE: Result = LHS >= RHS; return true;
1574d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  case BO_EQ: Result = LHS == RHS; return true;
1575d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  case BO_NE: Result = LHS != RHS; return true;
1576d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  }
1577d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith}
1578d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith
1579a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith/// Perform the given binary floating-point operation, in-place, on LHS.
1580a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smithstatic bool handleFloatFloatBinOp(EvalInfo &Info, const Expr *E,
1581a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith                                  APFloat &LHS, BinaryOperatorKind Opcode,
1582a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith                                  const APFloat &RHS) {
1583a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith  switch (Opcode) {
1584a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith  default:
1585a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith    Info.Diag(E);
1586a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith    return false;
1587a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith  case BO_Mul:
1588a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith    LHS.multiply(RHS, APFloat::rmNearestTiesToEven);
1589a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith    break;
1590a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith  case BO_Add:
1591a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith    LHS.add(RHS, APFloat::rmNearestTiesToEven);
1592a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith    break;
1593a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith  case BO_Sub:
1594a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith    LHS.subtract(RHS, APFloat::rmNearestTiesToEven);
1595a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith    break;
1596a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith  case BO_Div:
1597a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith    LHS.divide(RHS, APFloat::rmNearestTiesToEven);
1598a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith    break;
1599a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith  }
1600a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith
1601a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith  if (LHS.isInfinity() || LHS.isNaN())
1602a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith    Info.CCEDiag(E, diag::note_constexpr_float_arithmetic) << LHS.isNaN();
1603a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith  return true;
1604a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith}
1605a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith
1606b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith/// Cast an lvalue referring to a base subobject to a derived class, by
1607b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith/// truncating the lvalue's path to the given length.
1608b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smithstatic bool CastToDerivedClass(EvalInfo &Info, const Expr *E, LValue &Result,
1609b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith                               const RecordDecl *TruncatedType,
1610b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith                               unsigned TruncatedElements) {
1611b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  SubobjectDesignator &D = Result.Designator;
1612180f47959a066795cc0f409433023af448bb0328Richard Smith
1613b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  // Check we actually point to a derived class object.
1614b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  if (TruncatedElements == D.Entries.size())
1615b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    return true;
1616b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  assert(TruncatedElements >= D.MostDerivedPathLength &&
1617b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith         "not casting to a derived class");
1618b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  if (!Result.checkSubobject(Info, E, CSK_Derived))
1619180f47959a066795cc0f409433023af448bb0328Richard Smith    return false;
1620180f47959a066795cc0f409433023af448bb0328Richard Smith
1621b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  // Truncate the path to the subobject, and remove any derived-to-base offsets.
1622e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  const RecordDecl *RD = TruncatedType;
1623e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  for (unsigned I = TruncatedElements, N = D.Entries.size(); I != N; ++I) {
16248d59deec807ed53efcd07855199cdc9c979f447fJohn McCall    if (RD->isInvalidDecl()) return false;
1625180f47959a066795cc0f409433023af448bb0328Richard Smith    const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD);
1626180f47959a066795cc0f409433023af448bb0328Richard Smith    const CXXRecordDecl *Base = getAsBaseClass(D.Entries[I]);
1627e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    if (isVirtualBaseClass(D.Entries[I]))
1628180f47959a066795cc0f409433023af448bb0328Richard Smith      Result.Offset -= Layout.getVBaseClassOffset(Base);
1629e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    else
1630180f47959a066795cc0f409433023af448bb0328Richard Smith      Result.Offset -= Layout.getBaseClassOffset(Base);
1631180f47959a066795cc0f409433023af448bb0328Richard Smith    RD = Base;
1632180f47959a066795cc0f409433023af448bb0328Richard Smith  }
1633e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  D.Entries.resize(TruncatedElements);
1634180f47959a066795cc0f409433023af448bb0328Richard Smith  return true;
1635180f47959a066795cc0f409433023af448bb0328Richard Smith}
1636180f47959a066795cc0f409433023af448bb0328Richard Smith
16378d59deec807ed53efcd07855199cdc9c979f447fJohn McCallstatic bool HandleLValueDirectBase(EvalInfo &Info, const Expr *E, LValue &Obj,
1638180f47959a066795cc0f409433023af448bb0328Richard Smith                                   const CXXRecordDecl *Derived,
1639180f47959a066795cc0f409433023af448bb0328Richard Smith                                   const CXXRecordDecl *Base,
1640180f47959a066795cc0f409433023af448bb0328Richard Smith                                   const ASTRecordLayout *RL = 0) {
16418d59deec807ed53efcd07855199cdc9c979f447fJohn McCall  if (!RL) {
16428d59deec807ed53efcd07855199cdc9c979f447fJohn McCall    if (Derived->isInvalidDecl()) return false;
16438d59deec807ed53efcd07855199cdc9c979f447fJohn McCall    RL = &Info.Ctx.getASTRecordLayout(Derived);
16448d59deec807ed53efcd07855199cdc9c979f447fJohn McCall  }
16458d59deec807ed53efcd07855199cdc9c979f447fJohn McCall
1646180f47959a066795cc0f409433023af448bb0328Richard Smith  Obj.getLValueOffset() += RL->getBaseClassOffset(Base);
1647b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  Obj.addDecl(Info, E, Base, /*Virtual*/ false);
16488d59deec807ed53efcd07855199cdc9c979f447fJohn McCall  return true;
1649180f47959a066795cc0f409433023af448bb0328Richard Smith}
1650180f47959a066795cc0f409433023af448bb0328Richard Smith
1651b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smithstatic bool HandleLValueBase(EvalInfo &Info, const Expr *E, LValue &Obj,
1652180f47959a066795cc0f409433023af448bb0328Richard Smith                             const CXXRecordDecl *DerivedDecl,
1653180f47959a066795cc0f409433023af448bb0328Richard Smith                             const CXXBaseSpecifier *Base) {
1654180f47959a066795cc0f409433023af448bb0328Richard Smith  const CXXRecordDecl *BaseDecl = Base->getType()->getAsCXXRecordDecl();
1655180f47959a066795cc0f409433023af448bb0328Richard Smith
16568d59deec807ed53efcd07855199cdc9c979f447fJohn McCall  if (!Base->isVirtual())
16578d59deec807ed53efcd07855199cdc9c979f447fJohn McCall    return HandleLValueDirectBase(Info, E, Obj, DerivedDecl, BaseDecl);
1658180f47959a066795cc0f409433023af448bb0328Richard Smith
1659b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  SubobjectDesignator &D = Obj.Designator;
1660b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  if (D.Invalid)
1661b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    return false;
1662b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith
1663180f47959a066795cc0f409433023af448bb0328Richard Smith  // Extract most-derived object and corresponding type.
1664b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  DerivedDecl = D.MostDerivedType->getAsCXXRecordDecl();
1665b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  if (!CastToDerivedClass(Info, E, Obj, DerivedDecl, D.MostDerivedPathLength))
1666180f47959a066795cc0f409433023af448bb0328Richard Smith    return false;
1667180f47959a066795cc0f409433023af448bb0328Richard Smith
1668b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  // Find the virtual base class.
16698d59deec807ed53efcd07855199cdc9c979f447fJohn McCall  if (DerivedDecl->isInvalidDecl()) return false;
1670180f47959a066795cc0f409433023af448bb0328Richard Smith  const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(DerivedDecl);
1671180f47959a066795cc0f409433023af448bb0328Richard Smith  Obj.getLValueOffset() += Layout.getVBaseClassOffset(BaseDecl);
1672b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  Obj.addDecl(Info, E, BaseDecl, /*Virtual*/ true);
1673180f47959a066795cc0f409433023af448bb0328Richard Smith  return true;
1674180f47959a066795cc0f409433023af448bb0328Richard Smith}
1675180f47959a066795cc0f409433023af448bb0328Richard Smith
16768a66bf78becf05a24e8251379f3843d1fceb627fRichard Smithstatic bool HandleLValueBasePath(EvalInfo &Info, const CastExpr *E,
16778a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith                                 QualType Type, LValue &Result) {
16788a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  for (CastExpr::path_const_iterator PathI = E->path_begin(),
16798a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith                                     PathE = E->path_end();
16808a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith       PathI != PathE; ++PathI) {
16818a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    if (!HandleLValueBase(Info, E, Result, Type->getAsCXXRecordDecl(),
16828a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith                          *PathI))
16838a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      return false;
16848a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    Type = (*PathI)->getType();
16858a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  }
16868a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  return true;
16878a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith}
16888a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith
1689180f47959a066795cc0f409433023af448bb0328Richard Smith/// Update LVal to refer to the given field, which must be a member of the type
1690180f47959a066795cc0f409433023af448bb0328Richard Smith/// currently described by LVal.
16918d59deec807ed53efcd07855199cdc9c979f447fJohn McCallstatic bool HandleLValueMember(EvalInfo &Info, const Expr *E, LValue &LVal,
1692180f47959a066795cc0f409433023af448bb0328Richard Smith                               const FieldDecl *FD,
1693180f47959a066795cc0f409433023af448bb0328Richard Smith                               const ASTRecordLayout *RL = 0) {
16948d59deec807ed53efcd07855199cdc9c979f447fJohn McCall  if (!RL) {
16958d59deec807ed53efcd07855199cdc9c979f447fJohn McCall    if (FD->getParent()->isInvalidDecl()) return false;
1696180f47959a066795cc0f409433023af448bb0328Richard Smith    RL = &Info.Ctx.getASTRecordLayout(FD->getParent());
16978d59deec807ed53efcd07855199cdc9c979f447fJohn McCall  }
1698180f47959a066795cc0f409433023af448bb0328Richard Smith
1699180f47959a066795cc0f409433023af448bb0328Richard Smith  unsigned I = FD->getFieldIndex();
1700180f47959a066795cc0f409433023af448bb0328Richard Smith  LVal.Offset += Info.Ctx.toCharUnitsFromBits(RL->getFieldOffset(I));
1701b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  LVal.addDecl(Info, E, FD);
17028d59deec807ed53efcd07855199cdc9c979f447fJohn McCall  return true;
1703180f47959a066795cc0f409433023af448bb0328Richard Smith}
1704180f47959a066795cc0f409433023af448bb0328Richard Smith
1705d9b02e726262e4009dda830998bb934172ac0020Richard Smith/// Update LVal to refer to the given indirect field.
17068d59deec807ed53efcd07855199cdc9c979f447fJohn McCallstatic bool HandleLValueIndirectMember(EvalInfo &Info, const Expr *E,
1707d9b02e726262e4009dda830998bb934172ac0020Richard Smith                                       LValue &LVal,
1708d9b02e726262e4009dda830998bb934172ac0020Richard Smith                                       const IndirectFieldDecl *IFD) {
1709d9b02e726262e4009dda830998bb934172ac0020Richard Smith  for (IndirectFieldDecl::chain_iterator C = IFD->chain_begin(),
1710d9b02e726262e4009dda830998bb934172ac0020Richard Smith                                         CE = IFD->chain_end(); C != CE; ++C)
17118d59deec807ed53efcd07855199cdc9c979f447fJohn McCall    if (!HandleLValueMember(Info, E, LVal, cast<FieldDecl>(*C)))
17128d59deec807ed53efcd07855199cdc9c979f447fJohn McCall      return false;
17138d59deec807ed53efcd07855199cdc9c979f447fJohn McCall  return true;
1714d9b02e726262e4009dda830998bb934172ac0020Richard Smith}
1715d9b02e726262e4009dda830998bb934172ac0020Richard Smith
1716180f47959a066795cc0f409433023af448bb0328Richard Smith/// Get the size of the given type in char units.
171774e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smithstatic bool HandleSizeof(EvalInfo &Info, SourceLocation Loc,
171874e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith                         QualType Type, CharUnits &Size) {
1719180f47959a066795cc0f409433023af448bb0328Richard Smith  // sizeof(void), __alignof__(void), sizeof(function) = 1 as a gcc
1720180f47959a066795cc0f409433023af448bb0328Richard Smith  // extension.
1721180f47959a066795cc0f409433023af448bb0328Richard Smith  if (Type->isVoidType() || Type->isFunctionType()) {
1722180f47959a066795cc0f409433023af448bb0328Richard Smith    Size = CharUnits::One();
1723180f47959a066795cc0f409433023af448bb0328Richard Smith    return true;
1724180f47959a066795cc0f409433023af448bb0328Richard Smith  }
1725180f47959a066795cc0f409433023af448bb0328Richard Smith
1726180f47959a066795cc0f409433023af448bb0328Richard Smith  if (!Type->isConstantSizeType()) {
1727180f47959a066795cc0f409433023af448bb0328Richard Smith    // sizeof(vla) is not a constantexpr: C99 6.5.3.4p2.
172874e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith    // FIXME: Better diagnostic.
172974e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith    Info.Diag(Loc);
1730180f47959a066795cc0f409433023af448bb0328Richard Smith    return false;
1731180f47959a066795cc0f409433023af448bb0328Richard Smith  }
1732180f47959a066795cc0f409433023af448bb0328Richard Smith
1733180f47959a066795cc0f409433023af448bb0328Richard Smith  Size = Info.Ctx.getTypeSizeInChars(Type);
1734180f47959a066795cc0f409433023af448bb0328Richard Smith  return true;
1735180f47959a066795cc0f409433023af448bb0328Richard Smith}
1736180f47959a066795cc0f409433023af448bb0328Richard Smith
1737180f47959a066795cc0f409433023af448bb0328Richard Smith/// Update a pointer value to model pointer arithmetic.
1738180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param Info - Information about the ongoing evaluation.
1739b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith/// \param E - The expression being evaluated, for diagnostic purposes.
1740180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param LVal - The pointer value to be updated.
1741180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param EltTy - The pointee type represented by LVal.
1742180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param Adjustment - The adjustment, in objects of type EltTy, to add.
1743b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smithstatic bool HandleLValueArrayAdjustment(EvalInfo &Info, const Expr *E,
1744b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith                                        LValue &LVal, QualType EltTy,
1745b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith                                        int64_t Adjustment) {
1746180f47959a066795cc0f409433023af448bb0328Richard Smith  CharUnits SizeOfPointee;
174774e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith  if (!HandleSizeof(Info, E->getExprLoc(), EltTy, SizeOfPointee))
1748180f47959a066795cc0f409433023af448bb0328Richard Smith    return false;
1749180f47959a066795cc0f409433023af448bb0328Richard Smith
1750180f47959a066795cc0f409433023af448bb0328Richard Smith  // Compute the new offset in the appropriate width.
1751180f47959a066795cc0f409433023af448bb0328Richard Smith  LVal.Offset += Adjustment * SizeOfPointee;
1752b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  LVal.adjustIndex(Info, E, Adjustment);
1753180f47959a066795cc0f409433023af448bb0328Richard Smith  return true;
1754180f47959a066795cc0f409433023af448bb0328Richard Smith}
1755180f47959a066795cc0f409433023af448bb0328Richard Smith
175686024013d4c3728122c58fa07a2a67e6c15837efRichard Smith/// Update an lvalue to refer to a component of a complex number.
175786024013d4c3728122c58fa07a2a67e6c15837efRichard Smith/// \param Info - Information about the ongoing evaluation.
175886024013d4c3728122c58fa07a2a67e6c15837efRichard Smith/// \param LVal - The lvalue to be updated.
175986024013d4c3728122c58fa07a2a67e6c15837efRichard Smith/// \param EltTy - The complex number's component type.
176086024013d4c3728122c58fa07a2a67e6c15837efRichard Smith/// \param Imag - False for the real component, true for the imaginary.
176186024013d4c3728122c58fa07a2a67e6c15837efRichard Smithstatic bool HandleLValueComplexElement(EvalInfo &Info, const Expr *E,
176286024013d4c3728122c58fa07a2a67e6c15837efRichard Smith                                       LValue &LVal, QualType EltTy,
176386024013d4c3728122c58fa07a2a67e6c15837efRichard Smith                                       bool Imag) {
176486024013d4c3728122c58fa07a2a67e6c15837efRichard Smith  if (Imag) {
176586024013d4c3728122c58fa07a2a67e6c15837efRichard Smith    CharUnits SizeOfComponent;
176686024013d4c3728122c58fa07a2a67e6c15837efRichard Smith    if (!HandleSizeof(Info, E->getExprLoc(), EltTy, SizeOfComponent))
176786024013d4c3728122c58fa07a2a67e6c15837efRichard Smith      return false;
176886024013d4c3728122c58fa07a2a67e6c15837efRichard Smith    LVal.Offset += SizeOfComponent;
176986024013d4c3728122c58fa07a2a67e6c15837efRichard Smith  }
177086024013d4c3728122c58fa07a2a67e6c15837efRichard Smith  LVal.addComplex(Info, E, EltTy, Imag);
177186024013d4c3728122c58fa07a2a67e6c15837efRichard Smith  return true;
177286024013d4c3728122c58fa07a2a67e6c15837efRichard Smith}
177386024013d4c3728122c58fa07a2a67e6c15837efRichard Smith
177403f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith/// Try to evaluate the initializer for a variable declaration.
1775b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith///
1776b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith/// \param Info   Information about the ongoing evaluation.
1777b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith/// \param E      An expression to be used when printing diagnostics.
1778b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith/// \param VD     The variable whose initializer should be obtained.
1779b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith/// \param Frame  The frame in which the variable was created. Must be null
1780b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith///               if this variable is not local to the evaluation.
1781b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith/// \param Result Filled in with a pointer to the value of the variable.
1782b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smithstatic bool evaluateVarDeclInit(EvalInfo &Info, const Expr *E,
1783b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith                                const VarDecl *VD, CallStackFrame *Frame,
1784b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith                                APValue *&Result) {
1785d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  // If this is a parameter to an active constexpr function call, perform
1786d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  // argument substitution.
1787d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  if (const ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(VD)) {
1788745f5147e065900267c85a5568785a1991d4838fRichard Smith    // Assume arguments of a potential constant expression are unknown
1789745f5147e065900267c85a5568785a1991d4838fRichard Smith    // constant expressions.
1790745f5147e065900267c85a5568785a1991d4838fRichard Smith    if (Info.CheckingPotentialConstantExpression)
1791745f5147e065900267c85a5568785a1991d4838fRichard Smith      return false;
1792f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    if (!Frame || !Frame->Arguments) {
17935cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith      Info.Diag(E, diag::note_invalid_subexpr_in_const_expr);
1794177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith      return false;
1795f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    }
1796b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    Result = &Frame->Arguments[PVD->getFunctionScopeIndex()];
1797177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith    return true;
1798d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  }
179903f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith
1800a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith  // If this is a local variable, dig out its value.
1801b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  if (Frame) {
180203ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    Result = Frame->getTemporary(VD);
180303ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    assert(Result && "missing value for local variable");
180403ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    return true;
1805a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith  }
1806a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith
1807099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith  // Dig out the initializer, and use the declaration which it's attached to.
1808099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith  const Expr *Init = VD->getAnyInitializer(VD);
1809099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith  if (!Init || Init->isValueDependent()) {
1810745f5147e065900267c85a5568785a1991d4838fRichard Smith    // If we're checking a potential constant expression, the variable could be
1811745f5147e065900267c85a5568785a1991d4838fRichard Smith    // initialized later.
1812745f5147e065900267c85a5568785a1991d4838fRichard Smith    if (!Info.CheckingPotentialConstantExpression)
18135cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith      Info.Diag(E, diag::note_invalid_subexpr_in_const_expr);
1814099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith    return false;
1815099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith  }
1816099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith
1817180f47959a066795cc0f409433023af448bb0328Richard Smith  // If we're currently evaluating the initializer of this declaration, use that
1818180f47959a066795cc0f409433023af448bb0328Richard Smith  // in-flight value.
18196391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith  if (Info.EvaluatingDecl.dyn_cast<const ValueDecl*>() == VD) {
1820b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    Result = Info.EvaluatingDeclValue;
182103ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    return true;
1822180f47959a066795cc0f409433023af448bb0328Richard Smith  }
1823180f47959a066795cc0f409433023af448bb0328Richard Smith
182465ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith  // Never evaluate the initializer of a weak variable. We can't be sure that
182565ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith  // this is the definition which will be used.
1826f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  if (VD->isWeak()) {
18275cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith    Info.Diag(E, diag::note_invalid_subexpr_in_const_expr);
182865ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith    return false;
1829f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  }
183065ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith
1831099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith  // Check that we can fold the initializer. In C++, we will have already done
1832099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith  // this in the cases where it matters for conformance.
1833cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko  SmallVector<PartialDiagnosticAt, 8> Notes;
1834099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith  if (!VD->evaluateValue(Notes)) {
18355cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith    Info.Diag(E, diag::note_constexpr_var_init_non_constant,
1836099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith              Notes.size() + 1) << VD;
1837099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith    Info.Note(VD->getLocation(), diag::note_declared_at);
1838099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith    Info.addNotes(Notes);
183947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    return false;
1840099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith  } else if (!VD->checkInitIsICE()) {
18415cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith    Info.CCEDiag(E, diag::note_constexpr_var_init_non_constant,
1842099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith                 Notes.size() + 1) << VD;
1843099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith    Info.Note(VD->getLocation(), diag::note_declared_at);
1844099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith    Info.addNotes(Notes);
1845f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  }
184603f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith
1847b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  Result = VD->getEvaluatedValue();
184847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  return true;
184903f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith}
185003f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith
1851c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smithstatic bool IsConstNonVolatile(QualType T) {
185203f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith  Qualifiers Quals = T.getQualifiers();
185303f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith  return Quals.hasConst() && !Quals.hasVolatile();
185403f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith}
185503f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith
185659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith/// Get the base index of the given base class within an APValue representing
185759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith/// the given derived class.
185859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithstatic unsigned getBaseIndex(const CXXRecordDecl *Derived,
185959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith                             const CXXRecordDecl *Base) {
186059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith  Base = Base->getCanonicalDecl();
186159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith  unsigned Index = 0;
186259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith  for (CXXRecordDecl::base_class_const_iterator I = Derived->bases_begin(),
186359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith         E = Derived->bases_end(); I != E; ++I, ++Index) {
186459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith    if (I->getType()->getAsCXXRecordDecl()->getCanonicalDecl() == Base)
186559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith      return Index;
186659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith  }
186759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith
186859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith  llvm_unreachable("base class missing from derived class's bases list");
186959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith}
187059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith
1871bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith/// Extract the value of a character from a string literal.
1872bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smithstatic APSInt extractStringLiteralCharacter(EvalInfo &Info, const Expr *Lit,
1873bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith                                            uint64_t Index) {
1874f3908f2ae111b1b12ade2524dda71c669ed6f121Richard Smith  // FIXME: Support PredefinedExpr, ObjCEncodeExpr, MakeStringConstant
1875bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  const StringLiteral *S = cast<StringLiteral>(Lit);
1876bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  const ConstantArrayType *CAT =
1877bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith      Info.Ctx.getAsConstantArrayType(S->getType());
1878bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  assert(CAT && "string literal isn't an array");
1879bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  QualType CharType = CAT->getElementType();
1880fe587201feaebc69e6d18858bea85c77926b6ecfRichard Smith  assert(CharType->isIntegerType() && "unexpected character type");
1881f3908f2ae111b1b12ade2524dda71c669ed6f121Richard Smith
1882f3908f2ae111b1b12ade2524dda71c669ed6f121Richard Smith  APSInt Value(S->getCharByteWidth() * Info.Ctx.getCharWidth(),
1883fe587201feaebc69e6d18858bea85c77926b6ecfRichard Smith               CharType->isUnsignedIntegerType());
1884f3908f2ae111b1b12ade2524dda71c669ed6f121Richard Smith  if (Index < S->getLength())
1885f3908f2ae111b1b12ade2524dda71c669ed6f121Richard Smith    Value = S->getCodeUnit(Index);
1886f3908f2ae111b1b12ade2524dda71c669ed6f121Richard Smith  return Value;
1887f3908f2ae111b1b12ade2524dda71c669ed6f121Richard Smith}
1888f3908f2ae111b1b12ade2524dda71c669ed6f121Richard Smith
1889bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith// Expand a string literal into an array of characters.
1890bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smithstatic void expandStringLiteral(EvalInfo &Info, const Expr *Lit,
1891bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith                                APValue &Result) {
1892bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  const StringLiteral *S = cast<StringLiteral>(Lit);
1893bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  const ConstantArrayType *CAT =
1894bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith      Info.Ctx.getAsConstantArrayType(S->getType());
1895bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  assert(CAT && "string literal isn't an array");
1896bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  QualType CharType = CAT->getElementType();
1897bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  assert(CharType->isIntegerType() && "unexpected character type");
1898bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
1899bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  unsigned Elts = CAT->getSize().getZExtValue();
1900bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  Result = APValue(APValue::UninitArray(),
1901bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith                   std::min(S->getLength(), Elts), Elts);
1902bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  APSInt Value(S->getCharByteWidth() * Info.Ctx.getCharWidth(),
1903bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith               CharType->isUnsignedIntegerType());
1904bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  if (Result.hasArrayFiller())
1905bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    Result.getArrayFiller() = APValue(Value);
1906bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  for (unsigned I = 0, N = Result.getArrayInitializedElts(); I != N; ++I) {
1907bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    Value = S->getCodeUnit(I);
1908bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    Result.getArrayInitializedElt(I) = APValue(Value);
1909bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  }
1910bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith}
1911bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
1912bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith// Expand an array so that it has more than Index filled elements.
1913bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smithstatic void expandArray(APValue &Array, unsigned Index) {
1914bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  unsigned Size = Array.getArraySize();
1915bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  assert(Index < Size);
1916bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
1917bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  // Always at least double the number of elements for which we store a value.
1918bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  unsigned OldElts = Array.getArrayInitializedElts();
1919bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  unsigned NewElts = std::max(Index+1, OldElts * 2);
1920bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  NewElts = std::min(Size, std::max(NewElts, 8u));
1921bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
1922bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  // Copy the data across.
1923bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  APValue NewValue(APValue::UninitArray(), NewElts, Size);
1924bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  for (unsigned I = 0; I != OldElts; ++I)
1925bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    NewValue.getArrayInitializedElt(I).swap(Array.getArrayInitializedElt(I));
1926bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  for (unsigned I = OldElts; I != NewElts; ++I)
1927bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    NewValue.getArrayInitializedElt(I) = Array.getArrayFiller();
1928bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  if (NewValue.hasArrayFiller())
1929bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    NewValue.getArrayFiller() = Array.getArrayFiller();
1930bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  Array.swap(NewValue);
1931bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith}
1932bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
1933a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith/// Kinds of access we can perform on an object, for diagnostics.
1934bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smithenum AccessKinds {
1935bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  AK_Read,
19365528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  AK_Assign,
19375528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  AK_Increment,
19385528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  AK_Decrement
1939bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith};
1940bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
1941b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith/// A handle to a complete object (an object that is not a subobject of
1942b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith/// another object).
1943b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smithstruct CompleteObject {
1944b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  /// The value of the complete object.
1945b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  APValue *Value;
1946b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  /// The type of the complete object.
1947b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  QualType Type;
1948b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith
1949b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  CompleteObject() : Value(0) {}
1950b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  CompleteObject(APValue *Value, QualType Type)
1951b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      : Value(Value), Type(Type) {
1952b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    assert(Value && "missing value for complete object");
1953b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  }
1954b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith
19557247c88d1e41514a41085f83ebf03dd5220e054aDavid Blaikie  LLVM_EXPLICIT operator bool() const { return Value; }
1956b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith};
1957b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith
1958bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith/// Find the designated sub-object of an rvalue.
1959bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smithtemplate<typename SubobjectHandler>
1960bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smithtypename SubobjectHandler::result_type
1961b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard SmithfindSubobject(EvalInfo &Info, const Expr *E, const CompleteObject &Obj,
1962bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith              const SubobjectDesignator &Sub, SubobjectHandler &handler) {
1963b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  if (Sub.Invalid)
1964b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    // A diagnostic will have already been produced.
1965bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    return handler.failed();
1966b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  if (Sub.isOnePastTheEnd()) {
1967bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    if (Info.getLangOpts().CPlusPlus11)
1968bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith      Info.Diag(E, diag::note_constexpr_access_past_end)
1969bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith        << handler.AccessKind;
1970bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    else
1971bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith      Info.Diag(E);
1972bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    return handler.failed();
19737098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  }
1974cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith
1975b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  APValue *O = Obj.Value;
1976b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  QualType ObjType = Obj.Type;
19773835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith  const FieldDecl *LastField = 0;
19783835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith
1979180f47959a066795cc0f409433023af448bb0328Richard Smith  // Walk the designator's path to find the subobject.
198003ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith  for (unsigned I = 0, N = Sub.Entries.size(); /**/; ++I) {
198103ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    if (O->isUninit()) {
198203ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      if (!Info.CheckingPotentialConstantExpression)
198303ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith        Info.Diag(E, diag::note_constexpr_access_uninit) << handler.AccessKind;
198403ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      return handler.failed();
198503ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    }
198603ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith
19873835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith    if (I == N) {
19883835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith      if (!handler.found(*O, ObjType))
19893835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith        return false;
19903835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith
19913835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith      // If we modified a bit-field, truncate it to the right width.
19923835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith      if (handler.AccessKind != AK_Read &&
19933835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith          LastField && LastField->isBitField() &&
19943835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith          !truncateBitfieldValue(Info, E, *O, LastField))
19953835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith        return false;
199603ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith
19973835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith      return true;
19983835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith    }
19993835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith
20003835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith    LastField = 0;
2001cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    if (ObjType->isArrayType()) {
2002180f47959a066795cc0f409433023af448bb0328Richard Smith      // Next subobject is an array element.
2003cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith      const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType(ObjType);
2004f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      assert(CAT && "vla in literal type?");
2005cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith      uint64_t Index = Sub.Entries[I].ArrayIndex;
2006f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      if (CAT->getSize().ule(Index)) {
20077098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith        // Note, it should not be possible to form a pointer with a valid
20087098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith        // designator which points more than one past the end of the array.
2009bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith        if (Info.getLangOpts().CPlusPlus11)
2010bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith          Info.Diag(E, diag::note_constexpr_access_past_end)
2011bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith            << handler.AccessKind;
2012bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith        else
2013bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith          Info.Diag(E);
2014bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith        return handler.failed();
2015f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      }
2016bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
2017bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith      ObjType = CAT->getElementType();
2018bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
2019f3908f2ae111b1b12ade2524dda71c669ed6f121Richard Smith      // An array object is represented as either an Array APValue or as an
2020f3908f2ae111b1b12ade2524dda71c669ed6f121Richard Smith      // LValue which refers to a string literal.
2021f3908f2ae111b1b12ade2524dda71c669ed6f121Richard Smith      if (O->isLValue()) {
2022f3908f2ae111b1b12ade2524dda71c669ed6f121Richard Smith        assert(I == N - 1 && "extracting subobject of character?");
2023f3908f2ae111b1b12ade2524dda71c669ed6f121Richard Smith        assert(!O->hasLValuePath() || O->getLValuePath().empty());
2024bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith        if (handler.AccessKind != AK_Read)
2025bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith          expandStringLiteral(Info, O->getLValueBase().get<const Expr *>(),
2026bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith                              *O);
2027bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith        else
2028bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith          return handler.foundString(*O, ObjType, Index);
2029bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith      }
2030bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
2031bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith      if (O->getArrayInitializedElts() > Index)
2032cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith        O = &O->getArrayInitializedElt(Index);
2033bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith      else if (handler.AccessKind != AK_Read) {
2034bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith        expandArray(*O, Index);
2035bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith        O = &O->getArrayInitializedElt(Index);
2036bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith      } else
2037cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith        O = &O->getArrayFiller();
203886024013d4c3728122c58fa07a2a67e6c15837efRichard Smith    } else if (ObjType->isAnyComplexType()) {
203986024013d4c3728122c58fa07a2a67e6c15837efRichard Smith      // Next subobject is a complex number.
204086024013d4c3728122c58fa07a2a67e6c15837efRichard Smith      uint64_t Index = Sub.Entries[I].ArrayIndex;
204186024013d4c3728122c58fa07a2a67e6c15837efRichard Smith      if (Index > 1) {
2042bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith        if (Info.getLangOpts().CPlusPlus11)
2043bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith          Info.Diag(E, diag::note_constexpr_access_past_end)
2044bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith            << handler.AccessKind;
2045bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith        else
2046bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith          Info.Diag(E);
2047bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith        return handler.failed();
204886024013d4c3728122c58fa07a2a67e6c15837efRichard Smith      }
2049bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
2050bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith      bool WasConstQualified = ObjType.isConstQualified();
2051bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith      ObjType = ObjType->castAs<ComplexType>()->getElementType();
2052bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith      if (WasConstQualified)
2053bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith        ObjType.addConst();
2054bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
205586024013d4c3728122c58fa07a2a67e6c15837efRichard Smith      assert(I == N - 1 && "extracting subobject of scalar?");
205686024013d4c3728122c58fa07a2a67e6c15837efRichard Smith      if (O->isComplexInt()) {
2057bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith        return handler.found(Index ? O->getComplexIntImag()
2058bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith                                   : O->getComplexIntReal(), ObjType);
205986024013d4c3728122c58fa07a2a67e6c15837efRichard Smith      } else {
206086024013d4c3728122c58fa07a2a67e6c15837efRichard Smith        assert(O->isComplexFloat());
2061bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith        return handler.found(Index ? O->getComplexFloatImag()
2062bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith                                   : O->getComplexFloatReal(), ObjType);
206386024013d4c3728122c58fa07a2a67e6c15837efRichard Smith      }
2064180f47959a066795cc0f409433023af448bb0328Richard Smith    } else if (const FieldDecl *Field = getAsField(Sub.Entries[I])) {
2065bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith      if (Field->isMutable() && handler.AccessKind == AK_Read) {
20665cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith        Info.Diag(E, diag::note_constexpr_ltor_mutable, 1)
2067b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smith          << Field;
2068b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smith        Info.Note(Field->getLocation(), diag::note_declared_at);
2069bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith        return handler.failed();
2070b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smith      }
2071b4e5e286a5cd156247720b1eb204abaa8e09568dRichard Smith
2072180f47959a066795cc0f409433023af448bb0328Richard Smith      // Next subobject is a class, struct or union field.
2073180f47959a066795cc0f409433023af448bb0328Richard Smith      RecordDecl *RD = ObjType->castAs<RecordType>()->getDecl();
2074180f47959a066795cc0f409433023af448bb0328Richard Smith      if (RD->isUnion()) {
2075180f47959a066795cc0f409433023af448bb0328Richard Smith        const FieldDecl *UnionField = O->getUnionField();
2076180f47959a066795cc0f409433023af448bb0328Richard Smith        if (!UnionField ||
2077f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith            UnionField->getCanonicalDecl() != Field->getCanonicalDecl()) {
2078bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith          Info.Diag(E, diag::note_constexpr_access_inactive_union_member)
2079bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith            << handler.AccessKind << Field << !UnionField << UnionField;
2080bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith          return handler.failed();
2081f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith        }
2082180f47959a066795cc0f409433023af448bb0328Richard Smith        O = &O->getUnionValue();
2083180f47959a066795cc0f409433023af448bb0328Richard Smith      } else
2084180f47959a066795cc0f409433023af448bb0328Richard Smith        O = &O->getStructField(Field->getFieldIndex());
2085bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
2086bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith      bool WasConstQualified = ObjType.isConstQualified();
2087180f47959a066795cc0f409433023af448bb0328Richard Smith      ObjType = Field->getType();
2088bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith      if (WasConstQualified && !Field->isMutable())
2089bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith        ObjType.addConst();
20907098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith
20917098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith      if (ObjType.isVolatileQualified()) {
20927098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith        if (Info.getLangOpts().CPlusPlus) {
20937098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith          // FIXME: Include a description of the path to the volatile subobject.
2094bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith          Info.Diag(E, diag::note_constexpr_access_volatile_obj, 1)
2095bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith            << handler.AccessKind << 2 << Field;
20967098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith          Info.Note(Field->getLocation(), diag::note_declared_at);
20977098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith        } else {
20985cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith          Info.Diag(E, diag::note_invalid_subexpr_in_const_expr);
20997098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith        }
2100bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith        return handler.failed();
21017098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith      }
21023835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith
21033835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith      LastField = Field;
2104cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    } else {
2105180f47959a066795cc0f409433023af448bb0328Richard Smith      // Next subobject is a base class.
210659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith      const CXXRecordDecl *Derived = ObjType->getAsCXXRecordDecl();
210759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith      const CXXRecordDecl *Base = getAsBaseClass(Sub.Entries[I]);
210859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith      O = &O->getStructBase(getBaseIndex(Derived, Base));
2109bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
2110bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith      bool WasConstQualified = ObjType.isConstQualified();
211159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith      ObjType = Info.Ctx.getRecordType(Base);
2112bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith      if (WasConstQualified)
2113bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith        ObjType.addConst();
2114cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    }
2115bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  }
2116bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith}
2117bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
2118888d34566a4de6097896863a2f6660ed1537ddb9Benjamin Kramernamespace {
2119bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smithstruct ExtractSubobjectHandler {
2120bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  EvalInfo &Info;
2121b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  APValue &Result;
2122bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
2123bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  static const AccessKinds AccessKind = AK_Read;
2124bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
2125bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  typedef bool result_type;
2126bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  bool failed() { return false; }
2127bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  bool found(APValue &Subobj, QualType SubobjType) {
2128b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    Result = Subobj;
2129bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    return true;
2130bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  }
2131bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  bool found(APSInt &Value, QualType SubobjType) {
2132b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    Result = APValue(Value);
2133bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    return true;
2134bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  }
2135bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  bool found(APFloat &Value, QualType SubobjType) {
2136b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    Result = APValue(Value);
2137bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    return true;
2138bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  }
2139bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  bool foundString(APValue &Subobj, QualType SubobjType, uint64_t Character) {
2140b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    Result = APValue(extractStringLiteralCharacter(
2141bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith        Info, Subobj.getLValueBase().get<const Expr *>(), Character));
2142bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    return true;
2143bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  }
2144bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith};
2145b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith} // end anonymous namespace
2146b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith
2147bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smithconst AccessKinds ExtractSubobjectHandler::AccessKind;
2148bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
2149bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith/// Extract the designated sub-object of an rvalue.
2150bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smithstatic bool extractSubobject(EvalInfo &Info, const Expr *E,
2151b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith                             const CompleteObject &Obj,
2152b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith                             const SubobjectDesignator &Sub,
2153b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith                             APValue &Result) {
2154b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  ExtractSubobjectHandler Handler = { Info, Result };
2155b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  return findSubobject(Info, E, Obj, Sub, Handler);
2156bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith}
2157bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
2158b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smithnamespace {
2159bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smithstruct ModifySubobjectHandler {
2160bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  EvalInfo &Info;
2161bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  APValue &NewVal;
2162bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  const Expr *E;
2163bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
2164bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  typedef bool result_type;
2165bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  static const AccessKinds AccessKind = AK_Assign;
2166bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
2167bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  bool checkConst(QualType QT) {
2168bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    // Assigning to a const object has undefined behavior.
2169bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    if (QT.isConstQualified()) {
2170bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith      Info.Diag(E, diag::note_constexpr_modify_const_type) << QT;
2171180f47959a066795cc0f409433023af448bb0328Richard Smith      return false;
2172f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    }
2173bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    return true;
2174cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  }
2175cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith
2176bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  bool failed() { return false; }
2177bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  bool found(APValue &Subobj, QualType SubobjType) {
2178bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    if (!checkConst(SubobjType))
2179bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith      return false;
2180bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    // We've been given ownership of NewVal, so just swap it in.
2181bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    Subobj.swap(NewVal);
2182bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    return true;
2183bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  }
2184bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  bool found(APSInt &Value, QualType SubobjType) {
2185bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    if (!checkConst(SubobjType))
2186bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith      return false;
2187bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    if (!NewVal.isInt()) {
2188bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith      // Maybe trying to write a cast pointer value into a complex?
2189bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith      Info.Diag(E);
2190bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith      return false;
2191bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    }
2192bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    Value = NewVal.getInt();
2193bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    return true;
2194bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  }
2195bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  bool found(APFloat &Value, QualType SubobjType) {
2196bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    if (!checkConst(SubobjType))
2197bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith      return false;
2198bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    Value = NewVal.getFloat();
2199bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    return true;
2200bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  }
2201bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  bool foundString(APValue &Subobj, QualType SubobjType, uint64_t Character) {
2202bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    llvm_unreachable("shouldn't encounter string elements with ExpandArrays");
2203bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  }
2204bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith};
2205888d34566a4de6097896863a2f6660ed1537ddb9Benjamin Kramer} // end anonymous namespace
2206bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
2207b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smithconst AccessKinds ModifySubobjectHandler::AccessKind;
2208b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith
2209bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith/// Update the designated sub-object of an rvalue to the given value.
2210bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smithstatic bool modifySubobject(EvalInfo &Info, const Expr *E,
2211b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith                            const CompleteObject &Obj,
2212bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith                            const SubobjectDesignator &Sub,
2213bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith                            APValue &NewVal) {
2214bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  ModifySubobjectHandler Handler = { Info, NewVal, E };
2215b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  return findSubobject(Info, E, Obj, Sub, Handler);
2216cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith}
2217cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith
2218f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith/// Find the position where two subobject designators diverge, or equivalently
2219f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith/// the length of the common initial subsequence.
2220f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smithstatic unsigned FindDesignatorMismatch(QualType ObjType,
2221f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith                                       const SubobjectDesignator &A,
2222f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith                                       const SubobjectDesignator &B,
2223f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith                                       bool &WasArrayIndex) {
2224f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith  unsigned I = 0, N = std::min(A.Entries.size(), B.Entries.size());
2225f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith  for (/**/; I != N; ++I) {
222686024013d4c3728122c58fa07a2a67e6c15837efRichard Smith    if (!ObjType.isNull() &&
222786024013d4c3728122c58fa07a2a67e6c15837efRichard Smith        (ObjType->isArrayType() || ObjType->isAnyComplexType())) {
2228f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith      // Next subobject is an array element.
2229f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith      if (A.Entries[I].ArrayIndex != B.Entries[I].ArrayIndex) {
2230f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith        WasArrayIndex = true;
2231f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith        return I;
2232f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith      }
223386024013d4c3728122c58fa07a2a67e6c15837efRichard Smith      if (ObjType->isAnyComplexType())
223486024013d4c3728122c58fa07a2a67e6c15837efRichard Smith        ObjType = ObjType->castAs<ComplexType>()->getElementType();
223586024013d4c3728122c58fa07a2a67e6c15837efRichard Smith      else
223686024013d4c3728122c58fa07a2a67e6c15837efRichard Smith        ObjType = ObjType->castAsArrayTypeUnsafe()->getElementType();
2237f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith    } else {
2238f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith      if (A.Entries[I].BaseOrMember != B.Entries[I].BaseOrMember) {
2239f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith        WasArrayIndex = false;
2240f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith        return I;
2241f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith      }
2242f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith      if (const FieldDecl *FD = getAsField(A.Entries[I]))
2243f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith        // Next subobject is a field.
2244f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith        ObjType = FD->getType();
2245f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith      else
2246f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith        // Next subobject is a base class.
2247f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith        ObjType = QualType();
2248f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith    }
2249f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith  }
2250f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith  WasArrayIndex = false;
2251f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith  return I;
2252f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith}
2253f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith
2254f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith/// Determine whether the given subobject designators refer to elements of the
2255f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith/// same array object.
2256f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smithstatic bool AreElementsOfSameArray(QualType ObjType,
2257f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith                                   const SubobjectDesignator &A,
2258f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith                                   const SubobjectDesignator &B) {
2259f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith  if (A.Entries.size() != B.Entries.size())
2260f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith    return false;
2261f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith
2262f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith  bool IsArray = A.MostDerivedArraySize != 0;
2263f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith  if (IsArray && A.MostDerivedPathLength != A.Entries.size())
2264f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith    // A is a subobject of the array element.
2265f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith    return false;
2266f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith
2267f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith  // If A (and B) designates an array element, the last entry will be the array
2268f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith  // index. That doesn't have to match. Otherwise, we're in the 'implicit array
2269f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith  // of length 1' case, and the entire path must match.
2270f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith  bool WasArrayIndex;
2271f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith  unsigned CommonLength = FindDesignatorMismatch(ObjType, A, B, WasArrayIndex);
2272f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith  return CommonLength >= A.Entries.size() - IsArray;
2273f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith}
2274f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith
2275b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith/// Find the complete object to which an LValue refers.
2276b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard SmithCompleteObject findCompleteObject(EvalInfo &Info, const Expr *E, AccessKinds AK,
2277b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith                                  const LValue &LVal, QualType LValType) {
2278f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  if (!LVal.Base) {
2279b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    Info.Diag(E, diag::note_constexpr_access_null) << AK;
2280b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    return CompleteObject();
22817098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  }
22827098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith
228383587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  CallStackFrame *Frame = 0;
228483587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  if (LVal.CallIndex) {
228583587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    Frame = Info.getCallFrame(LVal.CallIndex);
228683587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    if (!Frame) {
2287b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      Info.Diag(E, diag::note_constexpr_lifetime_ended, 1)
2288b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith        << AK << LVal.Base.is<const ValueDecl*>();
228983587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith      NoteLValueLocation(Info, LVal.Base);
2290b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      return CompleteObject();
229183587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    }
229283587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  }
229383587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith
22947098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  // C++11 DR1311: An lvalue-to-rvalue conversion on a volatile-qualified type
22957098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  // is not a constant expression (even if the object is non-volatile). We also
22967098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  // apply this rule to C++98, in order to conform to the expected 'volatile'
22977098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith  // semantics.
2298b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  if (LValType.isVolatileQualified()) {
22997098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith    if (Info.getLangOpts().CPlusPlus)
2300b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      Info.Diag(E, diag::note_constexpr_access_volatile_type)
2301b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith        << AK << LValType;
23027098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith    else
2303b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      Info.Diag(E);
2304b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    return CompleteObject();
2305f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  }
2306c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
2307b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  // Compute value storage location and type of base object.
2308b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  APValue *BaseVal = 0;
23098a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  QualType BaseType = getType(LVal.Base);
2310b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith
23111bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith  if (const ValueDecl *D = LVal.Base.dyn_cast<const ValueDecl*>()) {
2312c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    // In C++98, const, non-volatile integers initialized with ICEs are ICEs.
2313c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    // In C++11, constexpr, non-volatile variables initialized with constant
2314d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    // expressions are constant expressions too. Inside constexpr functions,
2315d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    // parameters are constant expressions even if they're non-const.
2316b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    // In C++1y, objects local to a constant expression (those with a Frame) are
2317b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    // both readable and writable inside constant expressions.
2318c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    // In C, such things can also be folded, although they are not ICEs.
2319c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    const VarDecl *VD = dyn_cast<VarDecl>(D);
2320d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor    if (VD) {
2321d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor      if (const VarDecl *VDef = VD->getDefinition(Info.Ctx))
2322d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor        VD = VDef;
2323d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor    }
2324f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    if (!VD || VD->isInvalidDecl()) {
2325b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      Info.Diag(E);
2326b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      return CompleteObject();
2327f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    }
2328f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith
2329b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    // Accesses of volatile-qualified objects are not allowed.
2330b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    if (BaseType.isVolatileQualified()) {
23317098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith      if (Info.getLangOpts().CPlusPlus) {
2332b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith        Info.Diag(E, diag::note_constexpr_access_volatile_obj, 1)
2333b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith          << AK << 1 << VD;
23347098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith        Info.Note(VD->getLocation(), diag::note_declared_at);
23357098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith      } else {
2336b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith        Info.Diag(E);
2337f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      }
2338b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      return CompleteObject();
23397098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith    }
23407098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith
2341a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    // Unless we're looking at a local variable or argument in a constexpr call,
2342a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    // the variable we're reading must be const.
2343b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    if (!Frame) {
23446391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith      if (Info.getLangOpts().CPlusPlus1y &&
23456391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith          VD == Info.EvaluatingDecl.dyn_cast<const ValueDecl *>()) {
23466391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith        // OK, we can read and modify an object if we're in the process of
23476391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith        // evaluating its initializer, because its lifetime began in this
23486391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith        // evaluation.
23496391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith      } else if (AK != AK_Read) {
23506391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith        // All the remaining cases only permit reading.
23516391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith        Info.Diag(E, diag::note_constexpr_modify_global);
23526391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith        return CompleteObject();
23536391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith      } else if (VD->isConstexpr()) {
23547098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith        // OK, we can read this variable.
2355b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      } else if (BaseType->isIntegralOrEnumerationType()) {
2356b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith        if (!BaseType.isConstQualified()) {
23577098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith          if (Info.getLangOpts().CPlusPlus) {
2358b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith            Info.Diag(E, diag::note_constexpr_ltor_non_const_int, 1) << VD;
23597098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith            Info.Note(VD->getLocation(), diag::note_declared_at);
23607098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith          } else {
2361b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith            Info.Diag(E);
23627098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith          }
2363b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith          return CompleteObject();
23647098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith        }
2365b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      } else if (BaseType->isFloatingType() && BaseType.isConstQualified()) {
23667098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith        // We support folding of const floating-point types, in order to make
23677098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith        // static const data members of such types (supported as an extension)
23687098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith        // more useful.
236980ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith        if (Info.getLangOpts().CPlusPlus11) {
2370b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith          Info.CCEDiag(E, diag::note_constexpr_ltor_non_constexpr, 1) << VD;
23717098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith          Info.Note(VD->getLocation(), diag::note_declared_at);
23727098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith        } else {
2373b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith          Info.CCEDiag(E);
23747098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith        }
23757098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith      } else {
23767098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith        // FIXME: Allow folding of values of any literal type in all languages.
237780ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith        if (Info.getLangOpts().CPlusPlus11) {
2378b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith          Info.Diag(E, diag::note_constexpr_ltor_non_constexpr, 1) << VD;
23797098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith          Info.Note(VD->getLocation(), diag::note_declared_at);
23807098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith        } else {
2381b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith          Info.Diag(E);
23827098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith        }
2383b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith        return CompleteObject();
2384f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      }
23850a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    }
23867098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith
2387b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    if (!evaluateVarDeclInit(Info, E, VD, Frame, BaseVal))
2388b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      return CompleteObject();
2389b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  } else {
2390b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    const Expr *Base = LVal.Base.dyn_cast<const Expr*>();
2391c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
2392b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    if (!Frame) {
2393211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith      if (const MaterializeTemporaryExpr *MTE =
2394211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith              dyn_cast<MaterializeTemporaryExpr>(Base)) {
2395211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith        assert(MTE->getStorageDuration() == SD_Static &&
2396211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith               "should have a frame for a non-global materialized temporary");
2397211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith
2398211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith        // Per C++1y [expr.const]p2:
2399211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith        //  an lvalue-to-rvalue conversion [is not allowed unless it applies to]
2400211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith        //   - a [...] glvalue of integral or enumeration type that refers to
2401211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith        //     a non-volatile const object [...]
2402211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith        //   [...]
2403211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith        //   - a [...] glvalue of literal type that refers to a non-volatile
2404211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith        //     object whose lifetime began within the evaluation of e.
2405211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith        //
2406211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith        // C++11 misses the 'began within the evaluation of e' check and
2407211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith        // instead allows all temporaries, including things like:
2408211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith        //   int &&r = 1;
2409211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith        //   int x = ++r;
2410211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith        //   constexpr int k = r;
2411211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith        // Therefore we use the C++1y rules in C++11 too.
2412211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith        const ValueDecl *VD = Info.EvaluatingDecl.dyn_cast<const ValueDecl*>();
2413211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith        const ValueDecl *ED = MTE->getExtendingDecl();
2414211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith        if (!(BaseType.isConstQualified() &&
2415211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith              BaseType->isIntegralOrEnumerationType()) &&
2416211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith            !(VD && VD->getCanonicalDecl() == ED->getCanonicalDecl())) {
2417211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith          Info.Diag(E, diag::note_constexpr_access_static_temporary, 1) << AK;
2418211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith          Info.Note(MTE->getExprLoc(), diag::note_constexpr_temporary_here);
2419211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith          return CompleteObject();
2420211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith        }
2421bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
2422211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith        BaseVal = Info.Ctx.getMaterializedTemporaryValue(MTE, false);
2423211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith        assert(BaseVal && "got reference to unevaluated temporary");
2424211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith      } else {
2425211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith        Info.Diag(E);
2426211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith        return CompleteObject();
2427211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith      }
2428211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith    } else {
242903ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      BaseVal = Frame->getTemporary(Base);
243003ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      assert(BaseVal && "missing value for temporary");
2431211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith    }
2432bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
2433b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    // Volatile temporary objects cannot be accessed in constant expressions.
2434b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    if (BaseType.isVolatileQualified()) {
2435b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      if (Info.getLangOpts().CPlusPlus) {
2436b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith        Info.Diag(E, diag::note_constexpr_access_volatile_obj, 1)
2437b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith          << AK << 0;
2438b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith        Info.Note(Base->getExprLoc(), diag::note_constexpr_temporary_here);
2439b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      } else {
2440b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith        Info.Diag(E);
2441b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      }
2442b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      return CompleteObject();
2443b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    }
2444f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  }
2445c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
24466391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith  // During the construction of an object, it is not yet 'const'.
24476391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith  // FIXME: We don't set up EvaluatingDecl for local variables or temporaries,
24486391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith  // and this doesn't do quite the right thing for const subobjects of the
24496391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith  // object under construction.
24506391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith  if (LVal.getLValueBase() == Info.EvaluatingDecl) {
24516391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith    BaseType = Info.Ctx.getCanonicalType(BaseType);
24526391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith    BaseType.removeLocalConst();
24536391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith  }
24546391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith
2455b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  // In C++1y, we can't safely access any mutable state when checking a
2456b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  // potential constant expression.
2457b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  if (Frame && Info.getLangOpts().CPlusPlus1y &&
2458b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      Info.CheckingPotentialConstantExpression)
2459b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    return CompleteObject();
2460bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
2461b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  return CompleteObject(BaseVal, BaseType);
2462b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith}
2463bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
24645528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith/// \brief Perform an lvalue-to-rvalue conversion on the given glvalue. This
24655528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith/// can also be used for 'lvalue-to-lvalue' conversions for looking up the
24665528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith/// glvalue referred to by an entity of reference type.
2467b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith///
2468b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith/// \param Info - Information about the ongoing evaluation.
2469b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith/// \param Conv - The expression for which we are performing the conversion.
2470b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith///               Used for diagnostics.
2471b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith/// \param Type - The type of the glvalue (before stripping cv-qualifiers in the
2472b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith///               case of a non-class type).
2473b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith/// \param LVal - The glvalue on which we are attempting to perform this action.
2474b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith/// \param RVal - The produced value will be placed here.
24755528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smithstatic bool handleLValueToRValueConversion(EvalInfo &Info, const Expr *Conv,
2476b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith                                           QualType Type,
2477b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith                                           const LValue &LVal, APValue &RVal) {
2478bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  if (LVal.Designator.Invalid)
2479bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    return false;
2480bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
2481b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  // Check for special cases where there is no existing APValue to look at.
2482bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  const Expr *Base = LVal.Base.dyn_cast<const Expr*>();
2483b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  if (!LVal.Designator.Invalid && Base && !LVal.CallIndex &&
2484b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      !Type.isVolatileQualified()) {
2485b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    if (const CompoundLiteralExpr *CLE = dyn_cast<CompoundLiteralExpr>(Base)) {
2486b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      // In C99, a CompoundLiteralExpr is an lvalue, and we defer evaluating the
2487b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      // initializer until now for such expressions. Such an expression can't be
2488b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      // an ICE in C, so this only matters for fold.
2489b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      assert(!Info.getLangOpts().CPlusPlus && "lvalue compound literal in c++?");
2490b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      if (Type.isVolatileQualified()) {
2491b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith        Info.Diag(Conv);
2492b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith        return false;
2493b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      }
2494b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      APValue Lit;
2495b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      if (!Evaluate(Lit, Info, CLE->getInitializer()))
2496b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith        return false;
2497b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      CompleteObject LitObj(&Lit, Base->getType());
2498b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      return extractSubobject(Info, Conv, LitObj, LVal.Designator, RVal);
2499b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    } else if (isa<StringLiteral>(Base)) {
2500b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      // We represent a string literal array as an lvalue pointing at the
2501b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      // corresponding expression, rather than building an array of chars.
2502b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      // FIXME: Support PredefinedExpr, ObjCEncodeExpr, MakeStringConstant
2503b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      APValue Str(Base, CharUnits::Zero(), APValue::NoLValuePath(), 0);
2504b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      CompleteObject StrObj(&Str, Base->getType());
2505b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      return extractSubobject(Info, Conv, StrObj, LVal.Designator, RVal);
2506b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    }
2507bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  }
2508bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
2509b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  CompleteObject Obj = findCompleteObject(Info, Conv, AK_Read, LVal, Type);
2510b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  return Obj && extractSubobject(Info, Conv, Obj, LVal.Designator, RVal);
2511b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith}
2512bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
2513b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith/// Perform an assignment of Val to LVal. Takes ownership of Val.
25145528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smithstatic bool handleAssignment(EvalInfo &Info, const Expr *E, const LValue &LVal,
2515b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith                             QualType LValType, APValue &Val) {
2516b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  if (LVal.Designator.Invalid)
2517bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    return false;
2518bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
2519b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  if (!Info.getLangOpts().CPlusPlus1y) {
2520b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    Info.Diag(E);
2521bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    return false;
2522bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  }
2523bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith
2524b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  CompleteObject Obj = findCompleteObject(Info, E, AK_Assign, LVal, LValType);
2525b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  return Obj && modifySubobject(Info, E, Obj, LVal.Designator, Val);
2526c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith}
2527c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
25285528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smithstatic bool isOverflowingIntegerType(ASTContext &Ctx, QualType T) {
25295528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  return T->isSignedIntegerType() &&
25305528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith         Ctx.getIntWidth(T) >= Ctx.getIntWidth(Ctx.IntTy);
25315528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith}
25325528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith
25335528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smithnamespace {
2534d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smithstruct CompoundAssignSubobjectHandler {
2535d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  EvalInfo &Info;
2536d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  const Expr *E;
2537d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  QualType PromotedLHSType;
2538d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  BinaryOperatorKind Opcode;
2539d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  const APValue &RHS;
2540d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith
2541d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  static const AccessKinds AccessKind = AK_Assign;
2542d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith
2543d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  typedef bool result_type;
2544d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith
2545d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  bool checkConst(QualType QT) {
2546d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    // Assigning to a const object has undefined behavior.
2547d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    if (QT.isConstQualified()) {
2548d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      Info.Diag(E, diag::note_constexpr_modify_const_type) << QT;
2549d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      return false;
2550d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    }
2551d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    return true;
2552d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  }
2553d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith
2554d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  bool failed() { return false; }
2555d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  bool found(APValue &Subobj, QualType SubobjType) {
2556d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    switch (Subobj.getKind()) {
2557d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    case APValue::Int:
2558d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      return found(Subobj.getInt(), SubobjType);
2559d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    case APValue::Float:
2560d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      return found(Subobj.getFloat(), SubobjType);
2561d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    case APValue::ComplexInt:
2562d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    case APValue::ComplexFloat:
2563d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      // FIXME: Implement complex compound assignment.
2564d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      Info.Diag(E);
2565d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      return false;
2566d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    case APValue::LValue:
2567d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      return foundPointer(Subobj, SubobjType);
2568d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    default:
2569d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      // FIXME: can this happen?
2570d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      Info.Diag(E);
2571d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      return false;
2572d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    }
2573d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  }
2574d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  bool found(APSInt &Value, QualType SubobjType) {
2575d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    if (!checkConst(SubobjType))
2576d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      return false;
2577d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith
2578d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    if (!SubobjType->isIntegerType() || !RHS.isInt()) {
2579d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      // We don't support compound assignment on integer-cast-to-pointer
2580d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      // values.
2581d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      Info.Diag(E);
2582d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      return false;
2583d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    }
2584d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith
2585d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    APSInt LHS = HandleIntToIntCast(Info, E, PromotedLHSType,
2586d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith                                    SubobjType, Value);
2587d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    if (!handleIntIntBinOp(Info, E, LHS, Opcode, RHS.getInt(), LHS))
2588d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      return false;
2589d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    Value = HandleIntToIntCast(Info, E, SubobjType, PromotedLHSType, LHS);
2590d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    return true;
2591d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  }
2592d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  bool found(APFloat &Value, QualType SubobjType) {
2593a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith    return checkConst(SubobjType) &&
2594a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith           HandleFloatToFloatCast(Info, E, SubobjType, PromotedLHSType,
2595a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith                                  Value) &&
2596a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith           handleFloatFloatBinOp(Info, E, Value, Opcode, RHS.getFloat()) &&
2597a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith           HandleFloatToFloatCast(Info, E, PromotedLHSType, SubobjType, Value);
2598d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  }
2599d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  bool foundPointer(APValue &Subobj, QualType SubobjType) {
2600d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    if (!checkConst(SubobjType))
2601d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      return false;
2602d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith
2603d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    QualType PointeeType;
2604d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    if (const PointerType *PT = SubobjType->getAs<PointerType>())
2605d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      PointeeType = PT->getPointeeType();
2606a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith
2607a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith    if (PointeeType.isNull() || !RHS.isInt() ||
2608a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith        (Opcode != BO_Add && Opcode != BO_Sub)) {
2609d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      Info.Diag(E);
2610d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      return false;
2611d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    }
2612d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith
2613a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith    int64_t Offset = getExtValue(RHS.getInt());
2614a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith    if (Opcode == BO_Sub)
2615a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith      Offset = -Offset;
2616a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith
2617a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith    LValue LVal;
2618a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith    LVal.setFrom(Info.Ctx, Subobj);
2619a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith    if (!HandleLValueArrayAdjustment(Info, E, LVal, PointeeType, Offset))
2620a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith      return false;
2621a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith    LVal.moveInto(Subobj);
2622a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith    return true;
2623d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  }
2624d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  bool foundString(APValue &Subobj, QualType SubobjType, uint64_t Character) {
2625d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    llvm_unreachable("shouldn't encounter string elements here");
2626d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  }
2627d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith};
2628d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith} // end anonymous namespace
2629d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith
2630d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smithconst AccessKinds CompoundAssignSubobjectHandler::AccessKind;
2631d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith
2632d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith/// Perform a compound assignment of LVal <op>= RVal.
2633d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smithstatic bool handleCompoundAssignment(
2634d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    EvalInfo &Info, const Expr *E,
2635d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    const LValue &LVal, QualType LValType, QualType PromotedLValType,
2636d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    BinaryOperatorKind Opcode, const APValue &RVal) {
2637d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  if (LVal.Designator.Invalid)
2638d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    return false;
2639d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith
2640d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  if (!Info.getLangOpts().CPlusPlus1y) {
2641d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    Info.Diag(E);
2642d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    return false;
2643d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  }
2644d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith
2645d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  CompleteObject Obj = findCompleteObject(Info, E, AK_Assign, LVal, LValType);
2646d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  CompoundAssignSubobjectHandler Handler = { Info, E, PromotedLValType, Opcode,
2647d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith                                             RVal };
2648d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  return Obj && findSubobject(Info, E, Obj, LVal.Designator, Handler);
2649d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith}
2650d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith
2651d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smithnamespace {
26525528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smithstruct IncDecSubobjectHandler {
26535528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  EvalInfo &Info;
26545528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  const Expr *E;
26555528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  AccessKinds AccessKind;
26565528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  APValue *Old;
26575528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith
26585528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  typedef bool result_type;
26595528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith
26605528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  bool checkConst(QualType QT) {
26615528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    // Assigning to a const object has undefined behavior.
26625528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    if (QT.isConstQualified()) {
26635528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      Info.Diag(E, diag::note_constexpr_modify_const_type) << QT;
26645528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      return false;
26655528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    }
26665528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    return true;
26675528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  }
26685528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith
26695528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  bool failed() { return false; }
26705528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  bool found(APValue &Subobj, QualType SubobjType) {
26715528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    // Stash the old value. Also clear Old, so we don't clobber it later
26725528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    // if we're post-incrementing a complex.
26735528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    if (Old) {
26745528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      *Old = Subobj;
26755528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      Old = 0;
26765528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    }
26775528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith
26785528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    switch (Subobj.getKind()) {
26795528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    case APValue::Int:
26805528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      return found(Subobj.getInt(), SubobjType);
26815528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    case APValue::Float:
26825528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      return found(Subobj.getFloat(), SubobjType);
26835528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    case APValue::ComplexInt:
26845528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      return found(Subobj.getComplexIntReal(),
26855528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith                   SubobjType->castAs<ComplexType>()->getElementType()
26865528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith                     .withCVRQualifiers(SubobjType.getCVRQualifiers()));
26875528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    case APValue::ComplexFloat:
26885528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      return found(Subobj.getComplexFloatReal(),
26895528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith                   SubobjType->castAs<ComplexType>()->getElementType()
26905528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith                     .withCVRQualifiers(SubobjType.getCVRQualifiers()));
26915528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    case APValue::LValue:
26925528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      return foundPointer(Subobj, SubobjType);
26935528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    default:
26945528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      // FIXME: can this happen?
26955528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      Info.Diag(E);
26965528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      return false;
26975528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    }
26985528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  }
26995528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  bool found(APSInt &Value, QualType SubobjType) {
27005528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    if (!checkConst(SubobjType))
27015528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      return false;
27025528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith
27035528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    if (!SubobjType->isIntegerType()) {
27045528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      // We don't support increment / decrement on integer-cast-to-pointer
27055528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      // values.
27065528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      Info.Diag(E);
27075528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      return false;
27085528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    }
27095528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith
27105528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    if (Old) *Old = APValue(Value);
27115528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith
27125528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    // bool arithmetic promotes to int, and the conversion back to bool
27135528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    // doesn't reduce mod 2^n, so special-case it.
27145528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    if (SubobjType->isBooleanType()) {
27155528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      if (AccessKind == AK_Increment)
27165528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith        Value = 1;
27175528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      else
27185528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith        Value = !Value;
27195528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      return true;
27205528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    }
27215528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith
27225528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    bool WasNegative = Value.isNegative();
27235528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    if (AccessKind == AK_Increment) {
27245528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      ++Value;
27255528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith
27265528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      if (!WasNegative && Value.isNegative() &&
27275528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith          isOverflowingIntegerType(Info.Ctx, SubobjType)) {
27285528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith        APSInt ActualValue(Value, /*IsUnsigned*/true);
27295528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith        HandleOverflow(Info, E, ActualValue, SubobjType);
27305528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      }
27315528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    } else {
27325528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      --Value;
27335528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith
27345528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      if (WasNegative && !Value.isNegative() &&
27355528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith          isOverflowingIntegerType(Info.Ctx, SubobjType)) {
27365528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith        unsigned BitWidth = Value.getBitWidth();
27375528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith        APSInt ActualValue(Value.sext(BitWidth + 1), /*IsUnsigned*/false);
27385528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith        ActualValue.setBit(BitWidth);
27395528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith        HandleOverflow(Info, E, ActualValue, SubobjType);
27405528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      }
27415528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    }
27425528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    return true;
27435528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  }
27445528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  bool found(APFloat &Value, QualType SubobjType) {
27455528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    if (!checkConst(SubobjType))
27465528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      return false;
27475528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith
27485528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    if (Old) *Old = APValue(Value);
27495528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith
27505528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    APFloat One(Value.getSemantics(), 1);
27515528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    if (AccessKind == AK_Increment)
27525528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      Value.add(One, APFloat::rmNearestTiesToEven);
27535528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    else
27545528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      Value.subtract(One, APFloat::rmNearestTiesToEven);
27555528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    return true;
27565528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  }
27575528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  bool foundPointer(APValue &Subobj, QualType SubobjType) {
27585528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    if (!checkConst(SubobjType))
27595528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      return false;
27605528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith
27615528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    QualType PointeeType;
27625528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    if (const PointerType *PT = SubobjType->getAs<PointerType>())
27635528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      PointeeType = PT->getPointeeType();
27645528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    else {
27655528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      Info.Diag(E);
27665528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      return false;
27675528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    }
27685528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith
27695528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    LValue LVal;
27705528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    LVal.setFrom(Info.Ctx, Subobj);
27715528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    if (!HandleLValueArrayAdjustment(Info, E, LVal, PointeeType,
27725528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith                                     AccessKind == AK_Increment ? 1 : -1))
27735528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      return false;
27745528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    LVal.moveInto(Subobj);
27755528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    return true;
27765528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  }
27775528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  bool foundString(APValue &Subobj, QualType SubobjType, uint64_t Character) {
27785528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    llvm_unreachable("shouldn't encounter string elements here");
27795528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  }
27805528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith};
27815528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith} // end anonymous namespace
27825528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith
27835528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith/// Perform an increment or decrement on LVal.
27845528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smithstatic bool handleIncDec(EvalInfo &Info, const Expr *E, const LValue &LVal,
27855528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith                         QualType LValType, bool IsIncrement, APValue *Old) {
27865528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  if (LVal.Designator.Invalid)
27875528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    return false;
27885528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith
27895528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  if (!Info.getLangOpts().CPlusPlus1y) {
27905528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    Info.Diag(E);
27915528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    return false;
27925528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  }
27935528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith
27945528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  AccessKinds AK = IsIncrement ? AK_Increment : AK_Decrement;
27955528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  CompleteObject Obj = findCompleteObject(Info, E, AK, LVal, LValType);
27965528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  IncDecSubobjectHandler Handler = { Info, E, AK, Old };
27975528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  return Obj && findSubobject(Info, E, Obj, LVal.Designator, Handler);
27985528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith}
27995528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith
280059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith/// Build an lvalue for the object argument of a member function call.
280159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithstatic bool EvaluateObjectArgument(EvalInfo &Info, const Expr *Object,
280259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith                                   LValue &This) {
280359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith  if (Object->getType()->isPointerType())
280459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith    return EvaluatePointer(Object, This, Info);
280559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith
280659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith  if (Object->isGLValue())
280759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith    return EvaluateLValue(Object, This, Info);
280859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith
2809a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith  if (Object->getType()->isLiteralType(Info.Ctx))
2810e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    return EvaluateTemporary(Object, This, Info);
2811e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
2812e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  return false;
2813e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith}
2814e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
2815e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// HandleMemberPointerAccess - Evaluate a member access operation and build an
2816e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// lvalue referring to the result.
2817e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith///
2818e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// \param Info - Information about the ongoing evaluation.
28198a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith/// \param LV - An lvalue referring to the base of the member pointer.
28208a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith/// \param RHS - The member pointer expression.
2821e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// \param IncludeMember - Specifies whether the member itself is included in
2822e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith///        the resulting LValue subobject designator. This is not possible when
2823e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith///        creating a bound member function.
2824e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// \return The field or method declaration to which the member pointer refers,
2825e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith///         or 0 if evaluation fails.
2826e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstatic const ValueDecl *HandleMemberPointerAccess(EvalInfo &Info,
28278a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith                                                  QualType LVType,
2828e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith                                                  LValue &LV,
28298a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith                                                  const Expr *RHS,
2830e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith                                                  bool IncludeMember = true) {
2831e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  MemberPtr MemPtr;
28328a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  if (!EvaluateMemberPointer(RHS, MemPtr, Info))
2833e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    return 0;
2834e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
2835e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  // C++11 [expr.mptr.oper]p6: If the second operand is the null pointer to
2836e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  // member value, the behavior is undefined.
28378a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  if (!MemPtr.getDecl()) {
28388a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    // FIXME: Specific diagnostic.
28398a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    Info.Diag(RHS);
2840745f5147e065900267c85a5568785a1991d4838fRichard Smith    return 0;
28418a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  }
2842745f5147e065900267c85a5568785a1991d4838fRichard Smith
2843e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  if (MemPtr.isDerivedMember()) {
2844e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    // This is a member of some derived class. Truncate LV appropriately.
2845e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    // The end of the derived-to-base path for the base object must match the
2846e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    // derived-to-base path for the member pointer.
2847b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    if (LV.Designator.MostDerivedPathLength + MemPtr.Path.size() >
28488a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith        LV.Designator.Entries.size()) {
28498a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      Info.Diag(RHS);
2850e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      return 0;
28518a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    }
2852e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    unsigned PathLengthToMember =
2853e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        LV.Designator.Entries.size() - MemPtr.Path.size();
2854e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    for (unsigned I = 0, N = MemPtr.Path.size(); I != N; ++I) {
2855e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      const CXXRecordDecl *LVDecl = getAsBaseClass(
2856e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith          LV.Designator.Entries[PathLengthToMember + I]);
2857e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      const CXXRecordDecl *MPDecl = MemPtr.Path[I];
28588a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      if (LVDecl->getCanonicalDecl() != MPDecl->getCanonicalDecl()) {
28598a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith        Info.Diag(RHS);
2860e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        return 0;
28618a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      }
2862e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    }
2863e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
2864e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    // Truncate the lvalue to the appropriate derived class.
28658a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    if (!CastToDerivedClass(Info, RHS, LV, MemPtr.getContainingRecord(),
2866b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith                            PathLengthToMember))
2867b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      return 0;
2868e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  } else if (!MemPtr.Path.empty()) {
2869e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    // Extend the LValue path with the member pointer's path.
2870e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    LV.Designator.Entries.reserve(LV.Designator.Entries.size() +
2871e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith                                  MemPtr.Path.size() + IncludeMember);
2872e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
2873e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    // Walk down to the appropriate base class.
2874e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    if (const PointerType *PT = LVType->getAs<PointerType>())
2875e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      LVType = PT->getPointeeType();
2876e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    const CXXRecordDecl *RD = LVType->getAsCXXRecordDecl();
2877e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    assert(RD && "member pointer access on non-class-type expression");
2878e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    // The first class in the path is that of the lvalue.
2879e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    for (unsigned I = 1, N = MemPtr.Path.size(); I != N; ++I) {
2880e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      const CXXRecordDecl *Base = MemPtr.Path[N - I - 1];
28818a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      if (!HandleLValueDirectBase(Info, RHS, LV, RD, Base))
28828d59deec807ed53efcd07855199cdc9c979f447fJohn McCall        return 0;
2883e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      RD = Base;
2884e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    }
2885e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    // Finally cast to the class containing the member.
28868a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    if (!HandleLValueDirectBase(Info, RHS, LV, RD,
28878a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith                                MemPtr.getContainingRecord()))
28888d59deec807ed53efcd07855199cdc9c979f447fJohn McCall      return 0;
2889e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  }
2890e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
2891e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  // Add the member. Note that we cannot build bound member functions here.
2892e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  if (IncludeMember) {
28938d59deec807ed53efcd07855199cdc9c979f447fJohn McCall    if (const FieldDecl *FD = dyn_cast<FieldDecl>(MemPtr.getDecl())) {
28948a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      if (!HandleLValueMember(Info, RHS, LV, FD))
28958d59deec807ed53efcd07855199cdc9c979f447fJohn McCall        return 0;
28968d59deec807ed53efcd07855199cdc9c979f447fJohn McCall    } else if (const IndirectFieldDecl *IFD =
28978d59deec807ed53efcd07855199cdc9c979f447fJohn McCall                 dyn_cast<IndirectFieldDecl>(MemPtr.getDecl())) {
28988a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      if (!HandleLValueIndirectMember(Info, RHS, LV, IFD))
28998d59deec807ed53efcd07855199cdc9c979f447fJohn McCall        return 0;
29008d59deec807ed53efcd07855199cdc9c979f447fJohn McCall    } else {
2901d9b02e726262e4009dda830998bb934172ac0020Richard Smith      llvm_unreachable("can't construct reference to bound member function");
29028d59deec807ed53efcd07855199cdc9c979f447fJohn McCall    }
2903e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  }
2904e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
2905e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  return MemPtr.getDecl();
2906e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith}
2907e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
29088a66bf78becf05a24e8251379f3843d1fceb627fRichard Smithstatic const ValueDecl *HandleMemberPointerAccess(EvalInfo &Info,
29098a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith                                                  const BinaryOperator *BO,
29108a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith                                                  LValue &LV,
29118a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith                                                  bool IncludeMember = true) {
29128a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  assert(BO->getOpcode() == BO_PtrMemD || BO->getOpcode() == BO_PtrMemI);
29138a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith
29148a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  if (!EvaluateObjectArgument(Info, BO->getLHS(), LV)) {
29158a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    if (Info.keepEvaluatingAfterFailure()) {
29168a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      MemberPtr MemPtr;
29178a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      EvaluateMemberPointer(BO->getRHS(), MemPtr, Info);
29188a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    }
29198a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    return 0;
29208a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  }
29218a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith
29228a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  return HandleMemberPointerAccess(Info, BO->getLHS()->getType(), LV,
29238a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith                                   BO->getRHS(), IncludeMember);
29248a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith}
29258a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith
2926e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// HandleBaseToDerivedCast - Apply the given base-to-derived cast operation on
2927e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// the provided lvalue, which currently refers to the base object.
2928e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstatic bool HandleBaseToDerivedCast(EvalInfo &Info, const CastExpr *E,
2929e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith                                    LValue &Result) {
2930e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  SubobjectDesignator &D = Result.Designator;
2931b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  if (D.Invalid || !Result.checkNullPointer(Info, E, CSK_Derived))
2932e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    return false;
2933e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
2934e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  QualType TargetQT = E->getType();
2935e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  if (const PointerType *PT = TargetQT->getAs<PointerType>())
2936e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    TargetQT = PT->getPointeeType();
2937b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith
2938b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  // Check this cast lands within the final derived-to-base subobject path.
2939b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  if (D.MostDerivedPathLength + E->path_size() > D.Entries.size()) {
29405cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith    Info.CCEDiag(E, diag::note_constexpr_invalid_downcast)
2941b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      << D.MostDerivedType << TargetQT;
2942b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    return false;
2943b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  }
2944b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith
2945b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  // Check the type of the final cast. We don't need to check the path,
2946b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  // since a cast can only be formed if the path is unique.
2947b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  unsigned NewEntriesSize = D.Entries.size() - E->path_size();
2948e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  const CXXRecordDecl *TargetType = TargetQT->getAsCXXRecordDecl();
2949e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  const CXXRecordDecl *FinalType;
2950b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  if (NewEntriesSize == D.MostDerivedPathLength)
2951b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    FinalType = D.MostDerivedType->getAsCXXRecordDecl();
2952b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  else
2953e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    FinalType = getAsBaseClass(D.Entries[NewEntriesSize - 1]);
2954b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  if (FinalType->getCanonicalDecl() != TargetType->getCanonicalDecl()) {
29555cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith    Info.CCEDiag(E, diag::note_constexpr_invalid_downcast)
2956b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      << D.MostDerivedType << TargetQT;
2957e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    return false;
2958b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  }
2959e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
2960e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  // Truncate the lvalue to the appropriate derived class.
2961b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  return CastToDerivedClass(Info, E, Result, TargetType, NewEntriesSize);
296259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith}
296359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith
2964c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stumpnamespace {
2965d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smithenum EvalStmtResult {
2966d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  /// Evaluation failed.
2967d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  ESR_Failed,
2968d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  /// Hit a 'return' statement.
2969d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  ESR_Returned,
2970d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  /// Evaluation succeeded.
2971ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith  ESR_Succeeded,
2972ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith  /// Hit a 'continue' statement.
2973ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith  ESR_Continue,
2974ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith  /// Hit a 'break' statement.
2975284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  ESR_Break,
2976284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  /// Still scanning for 'case' or 'default' statement.
2977284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  ESR_CaseNotFound
2978d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith};
2979d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith}
2980d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
2981a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smithstatic bool EvaluateDecl(EvalInfo &Info, const Decl *D) {
2982a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith  if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
2983a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    // We don't need to evaluate the initializer for a static local.
2984a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    if (!VD->hasLocalStorage())
2985a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith      return true;
2986a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith
2987a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    LValue Result;
2988a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    Result.set(VD, Info.CurrentCall->Index);
298903ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    APValue &Val = Info.CurrentCall->createTemporary(VD, true);
2990a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith
299137a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith    if (!VD->getInit()) {
299237a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith      Info.Diag(D->getLocStart(), diag::note_constexpr_uninitialized)
299337a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith        << false << VD->getType();
299437a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith      Val = APValue();
299537a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith      return false;
299637a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith    }
299737a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith
2998a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    if (!EvaluateInPlace(Val, Info, Result, VD->getInit())) {
2999a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith      // Wipe out any partially-computed value, to allow tracking that this
3000a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith      // evaluation failed.
3001a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith      Val = APValue();
3002a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith      return false;
3003a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    }
3004a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith  }
3005a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith
3006a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith  return true;
3007a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith}
3008a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith
3009ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith/// Evaluate a condition (either a variable declaration or an expression).
3010ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smithstatic bool EvaluateCond(EvalInfo &Info, const VarDecl *CondDecl,
3011ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith                         const Expr *Cond, bool &Result) {
301203ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith  FullExpressionRAII Scope(Info);
3013ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith  if (CondDecl && !EvaluateDecl(Info, CondDecl))
3014ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith    return false;
3015ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith  return EvaluateAsBooleanCondition(Cond, Result, Info);
3016ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith}
3017ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith
3018ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smithstatic EvalStmtResult EvaluateStmt(APValue &Result, EvalInfo &Info,
3019284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith                                   const Stmt *S, const SwitchCase *SC = 0);
3020ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith
3021ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith/// Evaluate the body of a loop, and translate the result as appropriate.
3022ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smithstatic EvalStmtResult EvaluateLoopBody(APValue &Result, EvalInfo &Info,
3023284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith                                       const Stmt *Body,
3024284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith                                       const SwitchCase *Case = 0) {
302503ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith  BlockScopeRAII Scope(Info);
3026284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  switch (EvalStmtResult ESR = EvaluateStmt(Result, Info, Body, Case)) {
3027ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith  case ESR_Break:
3028ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith    return ESR_Succeeded;
3029ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith  case ESR_Succeeded:
3030ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith  case ESR_Continue:
3031ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith    return ESR_Continue;
3032ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith  case ESR_Failed:
3033ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith  case ESR_Returned:
3034284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  case ESR_CaseNotFound:
3035ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith    return ESR;
3036ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith  }
3037dbce2c6771d3d1e8ca42989122a5edf8fb5a93d7Hans Wennborg  llvm_unreachable("Invalid EvalStmtResult!");
3038ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith}
3039ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith
3040284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith/// Evaluate a switch statement.
3041284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smithstatic EvalStmtResult EvaluateSwitch(APValue &Result, EvalInfo &Info,
3042284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith                                     const SwitchStmt *SS) {
304303ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith  BlockScopeRAII Scope(Info);
304403ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith
3045284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  // Evaluate the switch condition.
3046284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  APSInt Value;
304703ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith  {
304803ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    FullExpressionRAII Scope(Info);
304903ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    if (SS->getConditionVariable() &&
305003ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith        !EvaluateDecl(Info, SS->getConditionVariable()))
305103ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      return ESR_Failed;
305203ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    if (!EvaluateInteger(SS->getCond(), Value, Info))
305303ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      return ESR_Failed;
305403ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith  }
3055284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith
3056284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  // Find the switch case corresponding to the value of the condition.
3057284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  // FIXME: Cache this lookup.
3058284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  const SwitchCase *Found = 0;
3059284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  for (const SwitchCase *SC = SS->getSwitchCaseList(); SC;
3060284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith       SC = SC->getNextSwitchCase()) {
3061284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    if (isa<DefaultStmt>(SC)) {
3062284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      Found = SC;
3063284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      continue;
3064284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    }
3065284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith
3066284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    const CaseStmt *CS = cast<CaseStmt>(SC);
3067284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    APSInt LHS = CS->getLHS()->EvaluateKnownConstInt(Info.Ctx);
3068284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    APSInt RHS = CS->getRHS() ? CS->getRHS()->EvaluateKnownConstInt(Info.Ctx)
3069284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith                              : LHS;
3070284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    if (LHS <= Value && Value <= RHS) {
3071284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      Found = SC;
3072284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      break;
3073284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    }
3074284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  }
3075284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith
3076284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  if (!Found)
3077284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    return ESR_Succeeded;
3078284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith
3079284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  // Search the switch body for the switch case and evaluate it from there.
3080284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  switch (EvalStmtResult ESR = EvaluateStmt(Result, Info, SS->getBody(), Found)) {
3081284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  case ESR_Break:
3082284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    return ESR_Succeeded;
3083284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  case ESR_Succeeded:
3084284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  case ESR_Continue:
3085284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  case ESR_Failed:
3086284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  case ESR_Returned:
3087284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    return ESR;
3088284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  case ESR_CaseNotFound:
308937a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith    // This can only happen if the switch case is nested within a statement
309037a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith    // expression. We have no intention of supporting that.
309137a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith    Info.Diag(Found->getLocStart(), diag::note_constexpr_stmt_expr_unsupported);
309237a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith    return ESR_Failed;
3093284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  }
30941071b9f2d38f8177e54f20412a36450462c19186Richard Smith  llvm_unreachable("Invalid EvalStmtResult!");
3095284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith}
3096284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith
3097d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith// Evaluate a statement.
30981aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smithstatic EvalStmtResult EvaluateStmt(APValue &Result, EvalInfo &Info,
3099284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith                                   const Stmt *S, const SwitchCase *Case) {
3100e7565635002ce0daaaf4b714cdb472507af462eeRichard Smith  if (!Info.nextStep(S))
3101e7565635002ce0daaaf4b714cdb472507af462eeRichard Smith    return ESR_Failed;
3102e7565635002ce0daaaf4b714cdb472507af462eeRichard Smith
3103284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  // If we're hunting down a 'case' or 'default' label, recurse through
3104284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  // substatements until we hit the label.
3105284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  if (Case) {
3106284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    // FIXME: We don't start the lifetime of objects whose initialization we
3107284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    // jump over. However, such objects must be of class type with a trivial
3108284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    // default constructor that initialize all subobjects, so must be empty,
3109284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    // so this almost never matters.
3110284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    switch (S->getStmtClass()) {
3111284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    case Stmt::CompoundStmtClass:
3112284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      // FIXME: Precompute which substatement of a compound statement we
3113284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      // would jump to, and go straight there rather than performing a
3114284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      // linear scan each time.
3115284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    case Stmt::LabelStmtClass:
3116284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    case Stmt::AttributedStmtClass:
3117284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    case Stmt::DoStmtClass:
3118284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      break;
3119284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith
3120284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    case Stmt::CaseStmtClass:
3121284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    case Stmt::DefaultStmtClass:
3122284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      if (Case == S)
3123284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith        Case = 0;
3124284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      break;
3125284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith
3126284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    case Stmt::IfStmtClass: {
3127284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      // FIXME: Precompute which side of an 'if' we would jump to, and go
3128284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      // straight there rather than scanning both sides.
3129284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      const IfStmt *IS = cast<IfStmt>(S);
313003ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith
313103ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      // Wrap the evaluation in a block scope, in case it's a DeclStmt
313203ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      // preceded by our switch label.
313303ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      BlockScopeRAII Scope(Info);
313403ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith
3135284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      EvalStmtResult ESR = EvaluateStmt(Result, Info, IS->getThen(), Case);
3136284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      if (ESR != ESR_CaseNotFound || !IS->getElse())
3137284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith        return ESR;
3138284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      return EvaluateStmt(Result, Info, IS->getElse(), Case);
3139284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    }
3140284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith
3141284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    case Stmt::WhileStmtClass: {
3142284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      EvalStmtResult ESR =
3143284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith          EvaluateLoopBody(Result, Info, cast<WhileStmt>(S)->getBody(), Case);
3144284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      if (ESR != ESR_Continue)
3145284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith        return ESR;
3146284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      break;
3147284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    }
3148284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith
3149284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    case Stmt::ForStmtClass: {
3150284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      const ForStmt *FS = cast<ForStmt>(S);
3151284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      EvalStmtResult ESR =
3152284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith          EvaluateLoopBody(Result, Info, FS->getBody(), Case);
3153284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      if (ESR != ESR_Continue)
3154284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith        return ESR;
315503ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      if (FS->getInc()) {
315603ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith        FullExpressionRAII IncScope(Info);
315703ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith        if (!EvaluateIgnoredValue(Info, FS->getInc()))
315803ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith          return ESR_Failed;
315903ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      }
3160284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      break;
3161284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    }
3162284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith
3163284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    case Stmt::DeclStmtClass:
3164284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      // FIXME: If the variable has initialization that can't be jumped over,
3165284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      // bail out of any immediately-surrounding compound-statement too.
3166284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    default:
3167284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      return ESR_CaseNotFound;
3168284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    }
3169284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  }
3170284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith
3171d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  switch (S->getStmtClass()) {
3172d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  default:
3173a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    if (const Expr *E = dyn_cast<Expr>(S)) {
3174a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith      // Don't bother evaluating beyond an expression-statement which couldn't
3175a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith      // be evaluated.
317603ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      FullExpressionRAII Scope(Info);
3177ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith      if (!EvaluateIgnoredValue(Info, E))
3178a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith        return ESR_Failed;
3179a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith      return ESR_Succeeded;
3180a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    }
3181a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith
3182a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    Info.Diag(S->getLocStart());
3183d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    return ESR_Failed;
3184d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
3185d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  case Stmt::NullStmtClass:
3186d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    return ESR_Succeeded;
3187d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
3188a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith  case Stmt::DeclStmtClass: {
3189a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    const DeclStmt *DS = cast<DeclStmt>(S);
3190a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    for (DeclStmt::const_decl_iterator DclIt = DS->decl_begin(),
319103ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith           DclEnd = DS->decl_end(); DclIt != DclEnd; ++DclIt) {
319203ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      // Each declaration initialization is its own full-expression.
319303ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      // FIXME: This isn't quite right; if we're performing aggregate
319403ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      // initialization, each braced subexpression is its own full-expression.
319503ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      FullExpressionRAII Scope(Info);
3196a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith      if (!EvaluateDecl(Info, *DclIt) && !Info.keepEvaluatingAfterFailure())
3197a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith        return ESR_Failed;
319803ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    }
3199a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    return ESR_Succeeded;
3200a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith  }
3201a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith
3202c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  case Stmt::ReturnStmtClass: {
3203c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    const Expr *RetExpr = cast<ReturnStmt>(S)->getRetValue();
320403ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    FullExpressionRAII Scope(Info);
3205a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    if (RetExpr && !Evaluate(Result, Info, RetExpr))
3206c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      return ESR_Failed;
3207c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    return ESR_Returned;
3208c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  }
3209d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
3210d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  case Stmt::CompoundStmtClass: {
321103ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    BlockScopeRAII Scope(Info);
321203ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith
3213d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    const CompoundStmt *CS = cast<CompoundStmt>(S);
3214d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    for (CompoundStmt::const_body_iterator BI = CS->body_begin(),
3215d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith           BE = CS->body_end(); BI != BE; ++BI) {
3216284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      EvalStmtResult ESR = EvaluateStmt(Result, Info, *BI, Case);
3217284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      if (ESR == ESR_Succeeded)
3218284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith        Case = 0;
3219284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      else if (ESR != ESR_CaseNotFound)
3220d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith        return ESR;
3221d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    }
3222284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    return Case ? ESR_CaseNotFound : ESR_Succeeded;
3223d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  }
3224a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith
3225a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith  case Stmt::IfStmtClass: {
3226a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    const IfStmt *IS = cast<IfStmt>(S);
3227a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith
3228a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    // Evaluate the condition, as either a var decl or as an expression.
322903ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    BlockScopeRAII Scope(Info);
3230a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    bool Cond;
3231ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith    if (!EvaluateCond(Info, IS->getConditionVariable(), IS->getCond(), Cond))
3232a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith      return ESR_Failed;
3233a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith
3234a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    if (const Stmt *SubStmt = Cond ? IS->getThen() : IS->getElse()) {
3235a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith      EvalStmtResult ESR = EvaluateStmt(Result, Info, SubStmt);
3236a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith      if (ESR != ESR_Succeeded)
3237a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith        return ESR;
3238a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    }
3239a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    return ESR_Succeeded;
3240a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith  }
3241ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith
3242ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith  case Stmt::WhileStmtClass: {
3243ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith    const WhileStmt *WS = cast<WhileStmt>(S);
3244ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith    while (true) {
324503ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      BlockScopeRAII Scope(Info);
3246ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith      bool Continue;
3247ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith      if (!EvaluateCond(Info, WS->getConditionVariable(), WS->getCond(),
3248ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith                        Continue))
3249ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith        return ESR_Failed;
3250ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith      if (!Continue)
3251ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith        break;
3252ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith
3253ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith      EvalStmtResult ESR = EvaluateLoopBody(Result, Info, WS->getBody());
3254ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith      if (ESR != ESR_Continue)
3255ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith        return ESR;
3256ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith    }
3257ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith    return ESR_Succeeded;
3258ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith  }
3259ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith
3260ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith  case Stmt::DoStmtClass: {
3261ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith    const DoStmt *DS = cast<DoStmt>(S);
3262ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith    bool Continue;
3263ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith    do {
3264284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      EvalStmtResult ESR = EvaluateLoopBody(Result, Info, DS->getBody(), Case);
3265ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith      if (ESR != ESR_Continue)
3266ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith        return ESR;
3267284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith      Case = 0;
3268ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith
326903ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      FullExpressionRAII CondScope(Info);
3270ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith      if (!EvaluateAsBooleanCondition(DS->getCond(), Continue, Info))
3271ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith        return ESR_Failed;
3272ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith    } while (Continue);
3273ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith    return ESR_Succeeded;
3274ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith  }
3275ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith
3276ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith  case Stmt::ForStmtClass: {
3277ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith    const ForStmt *FS = cast<ForStmt>(S);
327803ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    BlockScopeRAII Scope(Info);
3279ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith    if (FS->getInit()) {
3280ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith      EvalStmtResult ESR = EvaluateStmt(Result, Info, FS->getInit());
3281ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith      if (ESR != ESR_Succeeded)
3282ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith        return ESR;
3283ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith    }
3284ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith    while (true) {
328503ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      BlockScopeRAII Scope(Info);
3286ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith      bool Continue = true;
3287ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith      if (FS->getCond() && !EvaluateCond(Info, FS->getConditionVariable(),
3288ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith                                         FS->getCond(), Continue))
3289ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith        return ESR_Failed;
3290ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith      if (!Continue)
3291ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith        break;
3292ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith
3293ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith      EvalStmtResult ESR = EvaluateLoopBody(Result, Info, FS->getBody());
3294ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith      if (ESR != ESR_Continue)
3295ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith        return ESR;
3296ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith
329703ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      if (FS->getInc()) {
329803ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith        FullExpressionRAII IncScope(Info);
329903ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith        if (!EvaluateIgnoredValue(Info, FS->getInc()))
330003ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith          return ESR_Failed;
330103ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      }
3302ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith    }
3303ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith    return ESR_Succeeded;
3304ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith  }
3305ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith
3306692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith  case Stmt::CXXForRangeStmtClass: {
3307692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith    const CXXForRangeStmt *FS = cast<CXXForRangeStmt>(S);
330803ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    BlockScopeRAII Scope(Info);
3309692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith
3310692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith    // Initialize the __range variable.
3311692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith    EvalStmtResult ESR = EvaluateStmt(Result, Info, FS->getRangeStmt());
3312692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith    if (ESR != ESR_Succeeded)
3313692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith      return ESR;
3314692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith
3315692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith    // Create the __begin and __end iterators.
3316692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith    ESR = EvaluateStmt(Result, Info, FS->getBeginEndStmt());
3317692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith    if (ESR != ESR_Succeeded)
3318692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith      return ESR;
3319692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith
3320692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith    while (true) {
3321692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith      // Condition: __begin != __end.
332203ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      {
332303ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith        bool Continue = true;
332403ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith        FullExpressionRAII CondExpr(Info);
332503ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith        if (!EvaluateAsBooleanCondition(FS->getCond(), Continue, Info))
332603ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith          return ESR_Failed;
332703ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith        if (!Continue)
332803ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith          break;
332903ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      }
3330692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith
3331692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith      // User's variable declaration, initialized by *__begin.
333203ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      BlockScopeRAII InnerScope(Info);
3333692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith      ESR = EvaluateStmt(Result, Info, FS->getLoopVarStmt());
3334692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith      if (ESR != ESR_Succeeded)
3335692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith        return ESR;
3336692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith
3337692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith      // Loop body.
3338692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith      ESR = EvaluateLoopBody(Result, Info, FS->getBody());
3339692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith      if (ESR != ESR_Continue)
3340692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith        return ESR;
3341692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith
3342692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith      // Increment: ++__begin
3343692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith      if (!EvaluateIgnoredValue(Info, FS->getInc()))
3344692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith        return ESR_Failed;
3345692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith    }
3346692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith
3347692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith    return ESR_Succeeded;
3348692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith  }
3349692eafd2052fb6ca581530d6f3569eea9520a508Richard Smith
3350284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  case Stmt::SwitchStmtClass:
3351284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    return EvaluateSwitch(Result, Info, cast<SwitchStmt>(S));
3352284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith
3353ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith  case Stmt::ContinueStmtClass:
3354ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith    return ESR_Continue;
3355ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith
3356ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith  case Stmt::BreakStmtClass:
3357ce61715606b5f55ccc023720cdf9c1a796b0d526Richard Smith    return ESR_Break;
3358284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith
3359284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  case Stmt::LabelStmtClass:
3360284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    return EvaluateStmt(Result, Info, cast<LabelStmt>(S)->getSubStmt(), Case);
3361284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith
3362284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  case Stmt::AttributedStmtClass:
3363284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    // As a general principle, C++11 attributes can be ignored without
3364284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    // any semantic impact.
3365284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    return EvaluateStmt(Result, Info, cast<AttributedStmt>(S)->getSubStmt(),
3366284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith                        Case);
3367284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith
3368284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  case Stmt::CaseStmtClass:
3369284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith  case Stmt::DefaultStmtClass:
3370284b3cbfd1cd5b6585437fbb8b95fe136f273efbRichard Smith    return EvaluateStmt(Result, Info, cast<SwitchCase>(S)->getSubStmt(), Case);
3371d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  }
3372d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith}
3373d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
33746180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith/// CheckTrivialDefaultConstructor - Check whether a constructor is a trivial
33756180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith/// default constructor. If so, we'll fold it whether or not it's marked as
33766180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith/// constexpr. If it is marked as constexpr, we will never implicitly define it,
33776180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith/// so we need special handling.
33786180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithstatic bool CheckTrivialDefaultConstructor(EvalInfo &Info, SourceLocation Loc,
337951201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith                                           const CXXConstructorDecl *CD,
338051201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith                                           bool IsValueInitialization) {
33816180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  if (!CD->isTrivial() || !CD->isDefaultConstructor())
33826180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith    return false;
33836180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
33844c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith  // Value-initialization does not call a trivial default constructor, so such a
33854c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith  // call is a core constant expression whether or not the constructor is
33864c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith  // constexpr.
33874c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith  if (!CD->isConstexpr() && !IsValueInitialization) {
338880ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith    if (Info.getLangOpts().CPlusPlus11) {
33894c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith      // FIXME: If DiagDecl is an implicitly-declared special member function,
33904c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith      // we should be much more explicit about why it's not constexpr.
33914c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith      Info.CCEDiag(Loc, diag::note_constexpr_invalid_function, 1)
33924c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith        << /*IsConstexpr*/0 << /*IsConstructor*/1 << CD;
33934c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith      Info.Note(CD->getLocation(), diag::note_declared_at);
33946180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith    } else {
33956180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith      Info.CCEDiag(Loc, diag::note_invalid_subexpr_in_const_expr);
33966180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith    }
33976180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  }
33986180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  return true;
33996180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith}
34006180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
3401c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith/// CheckConstexprFunction - Check that a function can be called in a constant
3402c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith/// expression.
3403c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithstatic bool CheckConstexprFunction(EvalInfo &Info, SourceLocation CallLoc,
3404c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith                                   const FunctionDecl *Declaration,
3405c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith                                   const FunctionDecl *Definition) {
3406745f5147e065900267c85a5568785a1991d4838fRichard Smith  // Potential constant expressions can contain calls to declared, but not yet
3407745f5147e065900267c85a5568785a1991d4838fRichard Smith  // defined, constexpr functions.
3408745f5147e065900267c85a5568785a1991d4838fRichard Smith  if (Info.CheckingPotentialConstantExpression && !Definition &&
3409745f5147e065900267c85a5568785a1991d4838fRichard Smith      Declaration->isConstexpr())
3410745f5147e065900267c85a5568785a1991d4838fRichard Smith    return false;
3411745f5147e065900267c85a5568785a1991d4838fRichard Smith
3412f039e3eb0ffa87aae0e38cec48f367ee179b4de6Richard Smith  // Bail out with no diagnostic if the function declaration itself is invalid.
3413f039e3eb0ffa87aae0e38cec48f367ee179b4de6Richard Smith  // We will have produced a relevant diagnostic while parsing it.
3414f039e3eb0ffa87aae0e38cec48f367ee179b4de6Richard Smith  if (Declaration->isInvalidDecl())
3415f039e3eb0ffa87aae0e38cec48f367ee179b4de6Richard Smith    return false;
3416f039e3eb0ffa87aae0e38cec48f367ee179b4de6Richard Smith
3417c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  // Can we evaluate this function call?
3418c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  if (Definition && Definition->isConstexpr() && !Definition->isInvalidDecl())
3419c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    return true;
3420c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
342180ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith  if (Info.getLangOpts().CPlusPlus11) {
3422c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    const FunctionDecl *DiagDecl = Definition ? Definition : Declaration;
3423099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith    // FIXME: If DiagDecl is an implicitly-declared special member function, we
3424099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith    // should be much more explicit about why it's not constexpr.
3425c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    Info.Diag(CallLoc, diag::note_constexpr_invalid_function, 1)
3426c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      << DiagDecl->isConstexpr() << isa<CXXConstructorDecl>(DiagDecl)
3427c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      << DiagDecl;
3428c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    Info.Note(DiagDecl->getLocation(), diag::note_declared_at);
3429c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  } else {
3430c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    Info.Diag(CallLoc, diag::note_invalid_subexpr_in_const_expr);
3431c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  }
3432c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  return false;
3433c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith}
3434c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith
3435180f47959a066795cc0f409433023af448bb0328Richard Smithnamespace {
34361aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smithtypedef SmallVector<APValue, 8> ArgVector;
3437180f47959a066795cc0f409433023af448bb0328Richard Smith}
3438180f47959a066795cc0f409433023af448bb0328Richard Smith
3439180f47959a066795cc0f409433023af448bb0328Richard Smith/// EvaluateArgs - Evaluate the arguments to a function call.
3440180f47959a066795cc0f409433023af448bb0328Richard Smithstatic bool EvaluateArgs(ArrayRef<const Expr*> Args, ArgVector &ArgValues,
3441180f47959a066795cc0f409433023af448bb0328Richard Smith                         EvalInfo &Info) {
3442745f5147e065900267c85a5568785a1991d4838fRichard Smith  bool Success = true;
3443180f47959a066795cc0f409433023af448bb0328Richard Smith  for (ArrayRef<const Expr*>::iterator I = Args.begin(), E = Args.end();
3444745f5147e065900267c85a5568785a1991d4838fRichard Smith       I != E; ++I) {
3445745f5147e065900267c85a5568785a1991d4838fRichard Smith    if (!Evaluate(ArgValues[I - Args.begin()], Info, *I)) {
3446745f5147e065900267c85a5568785a1991d4838fRichard Smith      // If we're checking for a potential constant expression, evaluate all
3447745f5147e065900267c85a5568785a1991d4838fRichard Smith      // initializers even if some of them fail.
3448745f5147e065900267c85a5568785a1991d4838fRichard Smith      if (!Info.keepEvaluatingAfterFailure())
3449745f5147e065900267c85a5568785a1991d4838fRichard Smith        return false;
3450745f5147e065900267c85a5568785a1991d4838fRichard Smith      Success = false;
3451745f5147e065900267c85a5568785a1991d4838fRichard Smith    }
3452745f5147e065900267c85a5568785a1991d4838fRichard Smith  }
3453745f5147e065900267c85a5568785a1991d4838fRichard Smith  return Success;
3454180f47959a066795cc0f409433023af448bb0328Richard Smith}
3455180f47959a066795cc0f409433023af448bb0328Richard Smith
3456d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith/// Evaluate a function call.
3457745f5147e065900267c85a5568785a1991d4838fRichard Smithstatic bool HandleFunctionCall(SourceLocation CallLoc,
3458745f5147e065900267c85a5568785a1991d4838fRichard Smith                               const FunctionDecl *Callee, const LValue *This,
3459f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith                               ArrayRef<const Expr*> Args, const Stmt *Body,
34601aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith                               EvalInfo &Info, APValue &Result) {
3461180f47959a066795cc0f409433023af448bb0328Richard Smith  ArgVector ArgValues(Args.size());
3462180f47959a066795cc0f409433023af448bb0328Richard Smith  if (!EvaluateArgs(Args, ArgValues, Info))
3463180f47959a066795cc0f409433023af448bb0328Richard Smith    return false;
3464d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
3465745f5147e065900267c85a5568785a1991d4838fRichard Smith  if (!Info.CheckCallLimit(CallLoc))
3466745f5147e065900267c85a5568785a1991d4838fRichard Smith    return false;
3467745f5147e065900267c85a5568785a1991d4838fRichard Smith
3468745f5147e065900267c85a5568785a1991d4838fRichard Smith  CallStackFrame Frame(Info, CallLoc, Callee, This, ArgValues.data());
3469a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith
3470a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith  // For a trivial copy or move assignment, perform an APValue copy. This is
3471a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith  // essential for unions, where the operations performed by the assignment
3472a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith  // operator cannot be represented as statements.
3473a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith  const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(Callee);
3474a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith  if (MD && MD->isDefaulted() && MD->isTrivial()) {
3475a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith    assert(This &&
3476a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith           (MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator()));
3477a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith    LValue RHS;
3478a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith    RHS.setFrom(Info.Ctx, ArgValues[0]);
3479a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith    APValue RHSValue;
3480a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith    if (!handleLValueToRValueConversion(Info, Args[0], Args[0]->getType(),
3481a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith                                        RHS, RHSValue))
3482a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith      return false;
3483a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith    if (!handleAssignment(Info, Args[0], *This, MD->getThisType(Info.Ctx),
3484a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith                          RHSValue))
3485a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith      return false;
3486a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith    This->moveInto(Result);
3487a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith    return true;
3488a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith  }
3489a8942d7686dde6d221a176c502ce857bdc409dabRichard Smith
3490a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith  EvalStmtResult ESR = EvaluateStmt(Result, Info, Body);
3491bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  if (ESR == ESR_Succeeded) {
3492bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith    if (Callee->getResultType()->isVoidType())
3493bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith      return true;
3494a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    Info.Diag(Callee->getLocEnd(), diag::note_constexpr_no_return);
3495bebf5b1bcfbf591dd3cd80c4aebd6486bb34f41cRichard Smith  }
3496a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith  return ESR == ESR_Returned;
3497d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith}
3498d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
3499180f47959a066795cc0f409433023af448bb0328Richard Smith/// Evaluate a constructor call.
3500745f5147e065900267c85a5568785a1991d4838fRichard Smithstatic bool HandleConstructorCall(SourceLocation CallLoc, const LValue &This,
350159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith                                  ArrayRef<const Expr*> Args,
3502180f47959a066795cc0f409433023af448bb0328Richard Smith                                  const CXXConstructorDecl *Definition,
350351201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith                                  EvalInfo &Info, APValue &Result) {
3504180f47959a066795cc0f409433023af448bb0328Richard Smith  ArgVector ArgValues(Args.size());
3505180f47959a066795cc0f409433023af448bb0328Richard Smith  if (!EvaluateArgs(Args, ArgValues, Info))
3506180f47959a066795cc0f409433023af448bb0328Richard Smith    return false;
3507180f47959a066795cc0f409433023af448bb0328Richard Smith
3508745f5147e065900267c85a5568785a1991d4838fRichard Smith  if (!Info.CheckCallLimit(CallLoc))
3509745f5147e065900267c85a5568785a1991d4838fRichard Smith    return false;
3510745f5147e065900267c85a5568785a1991d4838fRichard Smith
351186c3ae46250cdcc57778c27826060779a92f3815Richard Smith  const CXXRecordDecl *RD = Definition->getParent();
351286c3ae46250cdcc57778c27826060779a92f3815Richard Smith  if (RD->getNumVBases()) {
351386c3ae46250cdcc57778c27826060779a92f3815Richard Smith    Info.Diag(CallLoc, diag::note_constexpr_virtual_base) << RD;
351486c3ae46250cdcc57778c27826060779a92f3815Richard Smith    return false;
351586c3ae46250cdcc57778c27826060779a92f3815Richard Smith  }
351686c3ae46250cdcc57778c27826060779a92f3815Richard Smith
3517745f5147e065900267c85a5568785a1991d4838fRichard Smith  CallStackFrame Frame(Info, CallLoc, Definition, &This, ArgValues.data());
3518180f47959a066795cc0f409433023af448bb0328Richard Smith
3519180f47959a066795cc0f409433023af448bb0328Richard Smith  // If it's a delegating constructor, just delegate.
3520180f47959a066795cc0f409433023af448bb0328Richard Smith  if (Definition->isDelegatingConstructor()) {
3521180f47959a066795cc0f409433023af448bb0328Richard Smith    CXXConstructorDecl::init_const_iterator I = Definition->init_begin();
3522a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    if (!EvaluateInPlace(Result, Info, This, (*I)->getInit()))
3523a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith      return false;
3524a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    return EvaluateStmt(Result, Info, Definition->getBody()) != ESR_Failed;
3525180f47959a066795cc0f409433023af448bb0328Richard Smith  }
3526180f47959a066795cc0f409433023af448bb0328Richard Smith
3527610a60c0e68e34db5a5247d6102e58f37510fef8Richard Smith  // For a trivial copy or move constructor, perform an APValue copy. This is
3528610a60c0e68e34db5a5247d6102e58f37510fef8Richard Smith  // essential for unions, where the operations performed by the constructor
3529610a60c0e68e34db5a5247d6102e58f37510fef8Richard Smith  // cannot be represented by ctor-initializers.
3530610a60c0e68e34db5a5247d6102e58f37510fef8Richard Smith  if (Definition->isDefaulted() &&
3531f6cfe8ba2b4d98c20181568e449edf0b60904b03Douglas Gregor      ((Definition->isCopyConstructor() && Definition->isTrivial()) ||
3532f6cfe8ba2b4d98c20181568e449edf0b60904b03Douglas Gregor       (Definition->isMoveConstructor() && Definition->isTrivial()))) {
3533610a60c0e68e34db5a5247d6102e58f37510fef8Richard Smith    LValue RHS;
35341aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith    RHS.setFrom(Info.Ctx, ArgValues[0]);
35355528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    return handleLValueToRValueConversion(Info, Args[0], Args[0]->getType(),
35361aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith                                          RHS, Result);
3537610a60c0e68e34db5a5247d6102e58f37510fef8Richard Smith  }
3538610a60c0e68e34db5a5247d6102e58f37510fef8Richard Smith
3539610a60c0e68e34db5a5247d6102e58f37510fef8Richard Smith  // Reserve space for the struct members.
354051201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  if (!RD->isUnion() && Result.isUninit())
3541180f47959a066795cc0f409433023af448bb0328Richard Smith    Result = APValue(APValue::UninitStruct(), RD->getNumBases(),
3542180f47959a066795cc0f409433023af448bb0328Richard Smith                     std::distance(RD->field_begin(), RD->field_end()));
3543180f47959a066795cc0f409433023af448bb0328Richard Smith
35448d59deec807ed53efcd07855199cdc9c979f447fJohn McCall  if (RD->isInvalidDecl()) return false;
3545180f47959a066795cc0f409433023af448bb0328Richard Smith  const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD);
3546180f47959a066795cc0f409433023af448bb0328Richard Smith
354703ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith  // A scope for temporaries lifetime-extended by reference members.
354803ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith  BlockScopeRAII LifetimeExtendedScope(Info);
354903ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith
3550745f5147e065900267c85a5568785a1991d4838fRichard Smith  bool Success = true;
3551180f47959a066795cc0f409433023af448bb0328Richard Smith  unsigned BasesSeen = 0;
3552180f47959a066795cc0f409433023af448bb0328Richard Smith#ifndef NDEBUG
3553180f47959a066795cc0f409433023af448bb0328Richard Smith  CXXRecordDecl::base_class_const_iterator BaseIt = RD->bases_begin();
3554180f47959a066795cc0f409433023af448bb0328Richard Smith#endif
3555180f47959a066795cc0f409433023af448bb0328Richard Smith  for (CXXConstructorDecl::init_const_iterator I = Definition->init_begin(),
3556180f47959a066795cc0f409433023af448bb0328Richard Smith       E = Definition->init_end(); I != E; ++I) {
3557745f5147e065900267c85a5568785a1991d4838fRichard Smith    LValue Subobject = This;
3558745f5147e065900267c85a5568785a1991d4838fRichard Smith    APValue *Value = &Result;
3559745f5147e065900267c85a5568785a1991d4838fRichard Smith
3560745f5147e065900267c85a5568785a1991d4838fRichard Smith    // Determine the subobject to initialize.
35613835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith    FieldDecl *FD = 0;
3562180f47959a066795cc0f409433023af448bb0328Richard Smith    if ((*I)->isBaseInitializer()) {
3563180f47959a066795cc0f409433023af448bb0328Richard Smith      QualType BaseType((*I)->getBaseClass(), 0);
3564180f47959a066795cc0f409433023af448bb0328Richard Smith#ifndef NDEBUG
3565180f47959a066795cc0f409433023af448bb0328Richard Smith      // Non-virtual base classes are initialized in the order in the class
356686c3ae46250cdcc57778c27826060779a92f3815Richard Smith      // definition. We have already checked for virtual base classes.
3567180f47959a066795cc0f409433023af448bb0328Richard Smith      assert(!BaseIt->isVirtual() && "virtual base for literal type");
3568180f47959a066795cc0f409433023af448bb0328Richard Smith      assert(Info.Ctx.hasSameType(BaseIt->getType(), BaseType) &&
3569180f47959a066795cc0f409433023af448bb0328Richard Smith             "base class initializers not in expected order");
3570180f47959a066795cc0f409433023af448bb0328Richard Smith      ++BaseIt;
3571180f47959a066795cc0f409433023af448bb0328Richard Smith#endif
35728d59deec807ed53efcd07855199cdc9c979f447fJohn McCall      if (!HandleLValueDirectBase(Info, (*I)->getInit(), Subobject, RD,
35738d59deec807ed53efcd07855199cdc9c979f447fJohn McCall                                  BaseType->getAsCXXRecordDecl(), &Layout))
35748d59deec807ed53efcd07855199cdc9c979f447fJohn McCall        return false;
3575745f5147e065900267c85a5568785a1991d4838fRichard Smith      Value = &Result.getStructBase(BasesSeen++);
35763835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith    } else if ((FD = (*I)->getMember())) {
35778d59deec807ed53efcd07855199cdc9c979f447fJohn McCall      if (!HandleLValueMember(Info, (*I)->getInit(), Subobject, FD, &Layout))
35788d59deec807ed53efcd07855199cdc9c979f447fJohn McCall        return false;
3579180f47959a066795cc0f409433023af448bb0328Richard Smith      if (RD->isUnion()) {
3580180f47959a066795cc0f409433023af448bb0328Richard Smith        Result = APValue(FD);
3581745f5147e065900267c85a5568785a1991d4838fRichard Smith        Value = &Result.getUnionValue();
3582745f5147e065900267c85a5568785a1991d4838fRichard Smith      } else {
3583745f5147e065900267c85a5568785a1991d4838fRichard Smith        Value = &Result.getStructField(FD->getFieldIndex());
3584745f5147e065900267c85a5568785a1991d4838fRichard Smith      }
3585d9b02e726262e4009dda830998bb934172ac0020Richard Smith    } else if (IndirectFieldDecl *IFD = (*I)->getIndirectMember()) {
3586d9b02e726262e4009dda830998bb934172ac0020Richard Smith      // Walk the indirect field decl's chain to find the object to initialize,
3587d9b02e726262e4009dda830998bb934172ac0020Richard Smith      // and make sure we've initialized every step along it.
3588d9b02e726262e4009dda830998bb934172ac0020Richard Smith      for (IndirectFieldDecl::chain_iterator C = IFD->chain_begin(),
3589d9b02e726262e4009dda830998bb934172ac0020Richard Smith                                             CE = IFD->chain_end();
3590d9b02e726262e4009dda830998bb934172ac0020Richard Smith           C != CE; ++C) {
35913835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith        FD = cast<FieldDecl>(*C);
3592d9b02e726262e4009dda830998bb934172ac0020Richard Smith        CXXRecordDecl *CD = cast<CXXRecordDecl>(FD->getParent());
3593d9b02e726262e4009dda830998bb934172ac0020Richard Smith        // Switch the union field if it differs. This happens if we had
3594d9b02e726262e4009dda830998bb934172ac0020Richard Smith        // preceding zero-initialization, and we're now initializing a union
3595d9b02e726262e4009dda830998bb934172ac0020Richard Smith        // subobject other than the first.
3596d9b02e726262e4009dda830998bb934172ac0020Richard Smith        // FIXME: In this case, the values of the other subobjects are
3597d9b02e726262e4009dda830998bb934172ac0020Richard Smith        // specified, since zero-initialization sets all padding bits to zero.
3598d9b02e726262e4009dda830998bb934172ac0020Richard Smith        if (Value->isUninit() ||
3599d9b02e726262e4009dda830998bb934172ac0020Richard Smith            (Value->isUnion() && Value->getUnionField() != FD)) {
3600d9b02e726262e4009dda830998bb934172ac0020Richard Smith          if (CD->isUnion())
3601d9b02e726262e4009dda830998bb934172ac0020Richard Smith            *Value = APValue(FD);
3602d9b02e726262e4009dda830998bb934172ac0020Richard Smith          else
3603d9b02e726262e4009dda830998bb934172ac0020Richard Smith            *Value = APValue(APValue::UninitStruct(), CD->getNumBases(),
3604d9b02e726262e4009dda830998bb934172ac0020Richard Smith                             std::distance(CD->field_begin(), CD->field_end()));
3605d9b02e726262e4009dda830998bb934172ac0020Richard Smith        }
36068d59deec807ed53efcd07855199cdc9c979f447fJohn McCall        if (!HandleLValueMember(Info, (*I)->getInit(), Subobject, FD))
36078d59deec807ed53efcd07855199cdc9c979f447fJohn McCall          return false;
3608d9b02e726262e4009dda830998bb934172ac0020Richard Smith        if (CD->isUnion())
3609d9b02e726262e4009dda830998bb934172ac0020Richard Smith          Value = &Value->getUnionValue();
3610d9b02e726262e4009dda830998bb934172ac0020Richard Smith        else
3611d9b02e726262e4009dda830998bb934172ac0020Richard Smith          Value = &Value->getStructField(FD->getFieldIndex());
3612d9b02e726262e4009dda830998bb934172ac0020Richard Smith      }
3613180f47959a066795cc0f409433023af448bb0328Richard Smith    } else {
3614d9b02e726262e4009dda830998bb934172ac0020Richard Smith      llvm_unreachable("unknown base initializer kind");
3615180f47959a066795cc0f409433023af448bb0328Richard Smith    }
3616745f5147e065900267c85a5568785a1991d4838fRichard Smith
361703ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    FullExpressionRAII InitScope(Info);
36183835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith    if (!EvaluateInPlace(*Value, Info, Subobject, (*I)->getInit()) ||
36193835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith        (FD && FD->isBitField() && !truncateBitfieldValue(Info, (*I)->getInit(),
36203835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith                                                          *Value, FD))) {
3621745f5147e065900267c85a5568785a1991d4838fRichard Smith      // If we're checking for a potential constant expression, evaluate all
3622745f5147e065900267c85a5568785a1991d4838fRichard Smith      // initializers even if some of them fail.
3623745f5147e065900267c85a5568785a1991d4838fRichard Smith      if (!Info.keepEvaluatingAfterFailure())
3624745f5147e065900267c85a5568785a1991d4838fRichard Smith        return false;
3625745f5147e065900267c85a5568785a1991d4838fRichard Smith      Success = false;
3626745f5147e065900267c85a5568785a1991d4838fRichard Smith    }
3627180f47959a066795cc0f409433023af448bb0328Richard Smith  }
3628180f47959a066795cc0f409433023af448bb0328Richard Smith
3629a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith  return Success &&
3630a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith         EvaluateStmt(Result, Info, Definition->getBody()) != ESR_Failed;
3631180f47959a066795cc0f409433023af448bb0328Richard Smith}
3632180f47959a066795cc0f409433023af448bb0328Richard Smith
36334efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
36348cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne// Generic Evaluation
36358cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne//===----------------------------------------------------------------------===//
36368cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournenamespace {
36378cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
3638f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith// FIXME: RetTy is always bool. Remove it.
3639f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithtemplate <class Derived, typename RetTy=bool>
36408cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourneclass ExprEvaluatorBase
36418cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  : public ConstStmtVisitor<Derived, RetTy> {
36428cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourneprivate:
36431aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith  RetTy DerivedSuccess(const APValue &V, const Expr *E) {
36448cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    return static_cast<Derived*>(this)->Success(V, E);
36458cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  }
364651201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  RetTy DerivedZeroInitialization(const Expr *E) {
364751201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    return static_cast<Derived*>(this)->ZeroInitialization(E);
3648f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith  }
36498cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
365074e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith  // Check whether a conditional operator with a non-constant condition is a
365174e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith  // potential constant expression. If neither arm is a potential constant
365274e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith  // expression, then the conditional operator is not either.
365374e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith  template<typename ConditionalOperator>
365474e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith  void CheckPotentialConstantConditional(const ConditionalOperator *E) {
365574e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith    assert(Info.CheckingPotentialConstantExpression);
365674e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith
365774e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith    // Speculatively evaluate both arms.
365874e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith    {
3659cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko      SmallVector<PartialDiagnosticAt, 8> Diag;
366074e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith      SpeculativeEvaluationRAII Speculate(Info, &Diag);
366174e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith
366274e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith      StmtVisitorTy::Visit(E->getFalseExpr());
366374e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith      if (Diag.empty())
366474e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith        return;
366574e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith
366674e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith      Diag.clear();
366774e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith      StmtVisitorTy::Visit(E->getTrueExpr());
366874e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith      if (Diag.empty())
366974e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith        return;
367074e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith    }
367174e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith
367274e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith    Error(E, diag::note_constexpr_conditional_never_const);
367374e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith  }
367474e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith
367574e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith
367674e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith  template<typename ConditionalOperator>
367774e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith  bool HandleConditionalOperator(const ConditionalOperator *E) {
367874e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith    bool BoolResult;
367974e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith    if (!EvaluateAsBooleanCondition(E->getCond(), BoolResult, Info)) {
368074e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith      if (Info.CheckingPotentialConstantExpression)
368174e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith        CheckPotentialConstantConditional(E);
368274e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith      return false;
368374e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith    }
368474e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith
368574e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith    Expr *EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr();
368674e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith    return StmtVisitorTy::Visit(EvalExpr);
368774e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith  }
368874e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith
36898cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourneprotected:
36908cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  EvalInfo &Info;
36918cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  typedef ConstStmtVisitor<Derived, RetTy> StmtVisitorTy;
36928cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  typedef ExprEvaluatorBase ExprEvaluatorBaseTy;
36938cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
3694dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith  OptionalDiagnostic CCEDiag(const Expr *E, diag::kind D) {
36955cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith    return Info.CCEDiag(E, D);
3696f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  }
3697f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith
3698cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  RetTy ZeroInitialization(const Expr *E) { return Error(E); }
3699cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
3700cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidispublic:
3701cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  ExprEvaluatorBase(EvalInfo &Info) : Info(Info) {}
3702cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
3703cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  EvalInfo &getEvalInfo() { return Info; }
3704cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
3705f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  /// Report an evaluation error. This should only be called when an error is
3706f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  /// first discovered. When propagating an error, just return false.
3707f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  bool Error(const Expr *E, diag::kind D) {
37085cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith    Info.Diag(E, D);
3709f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return false;
3710f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  }
3711f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  bool Error(const Expr *E) {
3712f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return Error(E, diag::note_invalid_subexpr_in_const_expr);
3713f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  }
3714f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith
37158cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  RetTy VisitStmt(const Stmt *) {
3716b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("Expression evaluator should not be called on stmts");
37178cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  }
37188cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  RetTy VisitExpr(const Expr *E) {
3719f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return Error(E);
37208cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  }
37218cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
37228cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  RetTy VisitParenExpr(const ParenExpr *E)
37238cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    { return StmtVisitorTy::Visit(E->getSubExpr()); }
37248cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  RetTy VisitUnaryExtension(const UnaryOperator *E)
37258cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    { return StmtVisitorTy::Visit(E->getSubExpr()); }
37268cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  RetTy VisitUnaryPlus(const UnaryOperator *E)
37278cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    { return StmtVisitorTy::Visit(E->getSubExpr()); }
37288cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  RetTy VisitChooseExpr(const ChooseExpr *E)
3729a5e660188a3c654cf0c88ed1093b28207e870b2bEli Friedman    { return StmtVisitorTy::Visit(E->getChosenSubExpr()); }
37308cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  RetTy VisitGenericSelectionExpr(const GenericSelectionExpr *E)
37318cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    { return StmtVisitorTy::Visit(E->getResultExpr()); }
373291a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall  RetTy VisitSubstNonTypeTemplateParmExpr(const SubstNonTypeTemplateParmExpr *E)
373391a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall    { return StmtVisitorTy::Visit(E->getReplacement()); }
37343d75ca836205856077c18e30e9447accbd85f751Richard Smith  RetTy VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *E)
37353d75ca836205856077c18e30e9447accbd85f751Richard Smith    { return StmtVisitorTy::Visit(E->getExpr()); }
3736c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith  RetTy VisitCXXDefaultInitExpr(const CXXDefaultInitExpr *E)
3737c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith    { return StmtVisitorTy::Visit(E->getExpr()); }
3738bc6abe93a5d6b1305411f8b6f54c2caa686ddc69Richard Smith  // We cannot create any objects for which cleanups are required, so there is
3739bc6abe93a5d6b1305411f8b6f54c2caa686ddc69Richard Smith  // nothing to do here; all cleanups must come from unevaluated subexpressions.
3740bc6abe93a5d6b1305411f8b6f54c2caa686ddc69Richard Smith  RetTy VisitExprWithCleanups(const ExprWithCleanups *E)
3741bc6abe93a5d6b1305411f8b6f54c2caa686ddc69Richard Smith    { return StmtVisitorTy::Visit(E->getSubExpr()); }
37428cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
3743c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith  RetTy VisitCXXReinterpretCastExpr(const CXXReinterpretCastExpr *E) {
3744c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith    CCEDiag(E, diag::note_constexpr_invalid_cast) << 0;
3745c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith    return static_cast<Derived*>(this)->VisitCastExpr(E);
3746c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith  }
3747c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith  RetTy VisitCXXDynamicCastExpr(const CXXDynamicCastExpr *E) {
3748c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith    CCEDiag(E, diag::note_constexpr_invalid_cast) << 1;
3749c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith    return static_cast<Derived*>(this)->VisitCastExpr(E);
3750c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith  }
3751c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith
3752e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  RetTy VisitBinaryOperator(const BinaryOperator *E) {
3753e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    switch (E->getOpcode()) {
3754e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    default:
3755f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      return Error(E);
3756e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
3757e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    case BO_Comma:
3758e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      VisitIgnoredValue(E->getLHS());
3759e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      return StmtVisitorTy::Visit(E->getRHS());
3760e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
3761e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    case BO_PtrMemD:
3762e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    case BO_PtrMemI: {
3763e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      LValue Obj;
3764e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      if (!HandleMemberPointerAccess(Info, E, Obj))
3765e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        return false;
37661aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith      APValue Result;
37675528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      if (!handleLValueToRValueConversion(Info, E, E->getType(), Obj, Result))
3768e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        return false;
3769e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      return DerivedSuccess(Result, E);
3770e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    }
3771e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    }
3772e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  }
3773e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
37748cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  RetTy VisitBinaryConditionalOperator(const BinaryConditionalOperator *E) {
3775e92b1f4917bfb669a09d220dc979fc3676df4da8Richard Smith    // Evaluate and cache the common expression. We treat it as a temporary,
3776e92b1f4917bfb669a09d220dc979fc3676df4da8Richard Smith    // even though it's not quite the same thing.
377703ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    if (!Evaluate(Info.CurrentCall->createTemporary(E->getOpaqueValue(), false),
3778e92b1f4917bfb669a09d220dc979fc3676df4da8Richard Smith                  Info, E->getCommon()))
3779f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      return false;
37808cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
378174e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith    return HandleConditionalOperator(E);
37828cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  }
37838cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
37848cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  RetTy VisitConditionalOperator(const ConditionalOperator *E) {
3785f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith    bool IsBcpCall = false;
3786f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith    // If the condition (ignoring parens) is a __builtin_constant_p call,
3787f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith    // the result is a constant expression if it can be folded without
3788f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith    // side-effects. This is an important GNU extension. See GCC PR38377
3789f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith    // for discussion.
3790f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith    if (const CallExpr *CallCE =
3791f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith          dyn_cast<CallExpr>(E->getCond()->IgnoreParenCasts()))
3792f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith      if (CallCE->isBuiltinCall() == Builtin::BI__builtin_constant_p)
3793f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith        IsBcpCall = true;
3794f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith
3795f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith    // Always assume __builtin_constant_p(...) ? ... : ... is a potential
3796f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith    // constant expression; we can't check whether it's potentially foldable.
3797f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith    if (Info.CheckingPotentialConstantExpression && IsBcpCall)
3798f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith      return false;
3799f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith
3800f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith    FoldConstant Fold(Info);
3801f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith
380274e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith    if (!HandleConditionalOperator(E))
3803f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith      return false;
3804f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith
3805f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith    if (IsBcpCall)
3806f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith      Fold.Fold(Info);
3807f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith
3808f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith    return true;
38098cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  }
38108cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
38118cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  RetTy VisitOpaqueValueExpr(const OpaqueValueExpr *E) {
381203ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    if (APValue *Value = Info.CurrentCall->getTemporary(E))
381303ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      return DerivedSuccess(*Value, E);
381403ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith
381503ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    const Expr *Source = E->getSourceExpr();
381603ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    if (!Source)
381703ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      return Error(E);
381803ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    if (Source == E) { // sanity checking.
381903ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      assert(0 && "OpaqueValueExpr recursively refers to itself");
382003ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      return Error(E);
382142786839cff1ccbe4d883b81d01846c5d774ffc6Argyrios Kyrtzidis    }
382203ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    return StmtVisitorTy::Visit(Source);
38238cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  }
3824f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith
3825d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  RetTy VisitCallExpr(const CallExpr *E) {
3826e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    const Expr *Callee = E->getCallee()->IgnoreParens();
3827d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    QualType CalleeType = Callee->getType();
3828d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
38296142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel    const FunctionDecl *FD = 0;
383059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith    LValue *This = 0, ThisVal;
3831cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko    ArrayRef<const Expr *> Args(E->getArgs(), E->getNumArgs());
383286c3ae46250cdcc57778c27826060779a92f3815Richard Smith    bool HasQualifier = false;
383359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith
383459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith    // Extract function decl and 'this' pointer from the callee.
383559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith    if (CalleeType->isSpecificBuiltinType(BuiltinType::BoundMember)) {
3836f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      const ValueDecl *Member = 0;
3837e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      if (const MemberExpr *ME = dyn_cast<MemberExpr>(Callee)) {
3838e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        // Explicit bound member calls, such as x.f() or p->g();
3839e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        if (!EvaluateObjectArgument(Info, ME->getBase(), ThisVal))
3840f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith          return false;
3841f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith        Member = ME->getMemberDecl();
3842e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        This = &ThisVal;
384386c3ae46250cdcc57778c27826060779a92f3815Richard Smith        HasQualifier = ME->hasQualifier();
3844e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      } else if (const BinaryOperator *BE = dyn_cast<BinaryOperator>(Callee)) {
3845e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        // Indirect bound member calls ('.*' or '->*').
3846f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith        Member = HandleMemberPointerAccess(Info, BE, ThisVal, false);
3847f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith        if (!Member) return false;
3848e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        This = &ThisVal;
3849e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      } else
3850f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith        return Error(Callee);
3851f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith
3852f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      FD = dyn_cast<FunctionDecl>(Member);
3853f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      if (!FD)
3854f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith        return Error(Callee);
385559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith    } else if (CalleeType->isFunctionPointerType()) {
3856b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      LValue Call;
3857b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      if (!EvaluatePointer(Callee, Call, Info))
3858f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith        return false;
385959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith
3860b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      if (!Call.getLValueOffset().isZero())
3861f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith        return Error(Callee);
38621bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith      FD = dyn_cast_or_null<FunctionDecl>(
38631bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith                             Call.getLValueBase().dyn_cast<const ValueDecl*>());
386459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith      if (!FD)
3865f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith        return Error(Callee);
386659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith
386759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith      // Overloaded operator calls to member functions are represented as normal
386859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith      // calls with '*this' as the first argument.
386959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith      const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD);
387059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith      if (MD && !MD->isStatic()) {
3871f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith        // FIXME: When selecting an implicit conversion for an overloaded
3872f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith        // operator delete, we sometimes try to evaluate calls to conversion
3873f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith        // operators without a 'this' parameter!
3874f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith        if (Args.empty())
3875f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith          return Error(E);
3876f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith
387759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith        if (!EvaluateObjectArgument(Info, Args[0], ThisVal))
387859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith          return false;
387959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith        This = &ThisVal;
388059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith        Args = Args.slice(1);
388159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith      }
3882d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
388359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith      // Don't call function pointers which have been cast to some other type.
388459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith      if (!Info.Ctx.hasSameType(CalleeType->getPointeeType(), FD->getType()))
3885f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith        return Error(E);
388659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith    } else
3887f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      return Error(E);
3888d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
3889b04035a7b1a3c9b93cea72ae56dd2ea6e787bae9Richard Smith    if (This && !This->checkSubobject(Info, E, CSK_This))
3890b04035a7b1a3c9b93cea72ae56dd2ea6e787bae9Richard Smith      return false;
3891b04035a7b1a3c9b93cea72ae56dd2ea6e787bae9Richard Smith
389286c3ae46250cdcc57778c27826060779a92f3815Richard Smith    // DR1358 allows virtual constexpr functions in some cases. Don't allow
389386c3ae46250cdcc57778c27826060779a92f3815Richard Smith    // calls to such functions in constant expressions.
389486c3ae46250cdcc57778c27826060779a92f3815Richard Smith    if (This && !HasQualifier &&
389586c3ae46250cdcc57778c27826060779a92f3815Richard Smith        isa<CXXMethodDecl>(FD) && cast<CXXMethodDecl>(FD)->isVirtual())
389686c3ae46250cdcc57778c27826060779a92f3815Richard Smith      return Error(E, diag::note_constexpr_virtual_call);
389786c3ae46250cdcc57778c27826060779a92f3815Richard Smith
3898c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    const FunctionDecl *Definition = 0;
3899d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    Stmt *Body = FD->getBody(Definition);
39001aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith    APValue Result;
3901d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
3902c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    if (!CheckConstexprFunction(Info, E->getExprLoc(), FD, Definition) ||
3903745f5147e065900267c85a5568785a1991d4838fRichard Smith        !HandleFunctionCall(E->getExprLoc(), Definition, This, Args, Body,
3904745f5147e065900267c85a5568785a1991d4838fRichard Smith                            Info, Result))
3905f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      return false;
3906d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
390783587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    return DerivedSuccess(Result, E);
3908d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  }
3909d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
3910c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  RetTy VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) {
3911c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return StmtVisitorTy::Visit(E->getInitializer());
3912c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  }
3913f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith  RetTy VisitInitListExpr(const InitListExpr *E) {
391471523d6c41e1599fc42f420d02dd2895fd8f65d4Eli Friedman    if (E->getNumInits() == 0)
391571523d6c41e1599fc42f420d02dd2895fd8f65d4Eli Friedman      return DerivedZeroInitialization(E);
391671523d6c41e1599fc42f420d02dd2895fd8f65d4Eli Friedman    if (E->getNumInits() == 1)
391771523d6c41e1599fc42f420d02dd2895fd8f65d4Eli Friedman      return StmtVisitorTy::Visit(E->getInit(0));
3918f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return Error(E);
3919f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith  }
3920f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith  RetTy VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) {
392151201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    return DerivedZeroInitialization(E);
3922f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith  }
3923f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith  RetTy VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr *E) {
392451201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    return DerivedZeroInitialization(E);
3925f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith  }
3926e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  RetTy VisitCXXNullPtrLiteralExpr(const CXXNullPtrLiteralExpr *E) {
392751201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    return DerivedZeroInitialization(E);
3928e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  }
3929f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith
3930180f47959a066795cc0f409433023af448bb0328Richard Smith  /// A member expression where the object is a prvalue is itself a prvalue.
3931180f47959a066795cc0f409433023af448bb0328Richard Smith  RetTy VisitMemberExpr(const MemberExpr *E) {
3932180f47959a066795cc0f409433023af448bb0328Richard Smith    assert(!E->isArrow() && "missing call to bound member function?");
3933180f47959a066795cc0f409433023af448bb0328Richard Smith
39341aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith    APValue Val;
3935180f47959a066795cc0f409433023af448bb0328Richard Smith    if (!Evaluate(Val, Info, E->getBase()))
3936180f47959a066795cc0f409433023af448bb0328Richard Smith      return false;
3937180f47959a066795cc0f409433023af448bb0328Richard Smith
3938180f47959a066795cc0f409433023af448bb0328Richard Smith    QualType BaseTy = E->getBase()->getType();
3939180f47959a066795cc0f409433023af448bb0328Richard Smith
3940180f47959a066795cc0f409433023af448bb0328Richard Smith    const FieldDecl *FD = dyn_cast<FieldDecl>(E->getMemberDecl());
3941f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    if (!FD) return Error(E);
3942180f47959a066795cc0f409433023af448bb0328Richard Smith    assert(!FD->getType()->isReferenceType() && "prvalue reference?");
3943890f0f1612b0028b8b16730ae7ed07e295600c76Ted Kremenek    assert(BaseTy->castAs<RecordType>()->getDecl()->getCanonicalDecl() ==
3944180f47959a066795cc0f409433023af448bb0328Richard Smith           FD->getParent()->getCanonicalDecl() && "record / field mismatch");
3945180f47959a066795cc0f409433023af448bb0328Richard Smith
3946b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    CompleteObject Obj(&Val, BaseTy);
3947b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    SubobjectDesignator Designator(BaseTy);
3948b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    Designator.addDeclUnchecked(FD);
3949180f47959a066795cc0f409433023af448bb0328Richard Smith
3950b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    APValue Result;
3951b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    return extractSubobject(Info, E, Obj, Designator, Result) &&
3952b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith           DerivedSuccess(Result, E);
3953180f47959a066795cc0f409433023af448bb0328Richard Smith  }
3954180f47959a066795cc0f409433023af448bb0328Richard Smith
3955c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  RetTy VisitCastExpr(const CastExpr *E) {
3956c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    switch (E->getCastKind()) {
3957c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    default:
3958c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith      break;
3959c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
39605705f211472f19fc38e58d81365f9261024b3ba3Richard Smith    case CK_AtomicToNonAtomic: {
39615705f211472f19fc38e58d81365f9261024b3ba3Richard Smith      APValue AtomicVal;
39625705f211472f19fc38e58d81365f9261024b3ba3Richard Smith      if (!EvaluateAtomic(E->getSubExpr(), AtomicVal, Info))
39635705f211472f19fc38e58d81365f9261024b3ba3Richard Smith        return false;
39645705f211472f19fc38e58d81365f9261024b3ba3Richard Smith      return DerivedSuccess(AtomicVal, E);
39655705f211472f19fc38e58d81365f9261024b3ba3Richard Smith    }
39665705f211472f19fc38e58d81365f9261024b3ba3Richard Smith
3967c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    case CK_NoOp:
39687d580a4e9e47dffc3c17aa2b957ac57ca3c4e451Richard Smith    case CK_UserDefinedConversion:
3969c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith      return StmtVisitorTy::Visit(E->getSubExpr());
3970c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
3971c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    case CK_LValueToRValue: {
3972c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith      LValue LVal;
3973f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      if (!EvaluateLValue(E->getSubExpr(), LVal, Info))
3974f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith        return false;
39751aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith      APValue RVal;
39769ec7197796a2730d54ae7f632553b5311b2ba3b5Richard Smith      // Note, we use the subexpression's type in order to retain cv-qualifiers.
39775528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      if (!handleLValueToRValueConversion(Info, E, E->getSubExpr()->getType(),
39789ec7197796a2730d54ae7f632553b5311b2ba3b5Richard Smith                                          LVal, RVal))
3979f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith        return false;
3980f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      return DerivedSuccess(RVal, E);
3981c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    }
3982c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    }
3983c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
3984f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return Error(E);
3985c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  }
3986c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
39875528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  RetTy VisitUnaryPostInc(const UnaryOperator *UO) {
39885528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    return VisitUnaryPostIncDec(UO);
39895528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  }
39905528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  RetTy VisitUnaryPostDec(const UnaryOperator *UO) {
39915528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    return VisitUnaryPostIncDec(UO);
39925528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  }
39935528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  RetTy VisitUnaryPostIncDec(const UnaryOperator *UO) {
39945528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    if (!Info.getLangOpts().CPlusPlus1y && !Info.keepEvaluatingAfterFailure())
39955528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      return Error(UO);
39965528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith
39975528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    LValue LVal;
39985528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    if (!EvaluateLValue(UO->getSubExpr(), LVal, Info))
39995528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      return false;
40005528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    APValue RVal;
40015528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    if (!handleIncDec(this->Info, UO, LVal, UO->getSubExpr()->getType(),
40025528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith                      UO->isIncrementOp(), &RVal))
40035528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      return false;
40045528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    return DerivedSuccess(RVal, UO);
40055528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  }
40065528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith
400737a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith  RetTy VisitStmtExpr(const StmtExpr *E) {
400837a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith    // We will have checked the full-expressions inside the statement expression
400937a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith    // when they were completed, and don't need to check them again now.
401037a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith    if (Info.getIntOverflowCheckMode())
401137a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith      return Error(E);
401237a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith
401303ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    BlockScopeRAII Scope(Info);
401437a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith    const CompoundStmt *CS = E->getSubStmt();
401537a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith    for (CompoundStmt::const_body_iterator BI = CS->body_begin(),
401637a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith                                           BE = CS->body_end();
401737a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith         /**/; ++BI) {
401837a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith      if (BI + 1 == BE) {
401937a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith        const Expr *FinalExpr = dyn_cast<Expr>(*BI);
402037a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith        if (!FinalExpr) {
402137a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith          Info.Diag((*BI)->getLocStart(),
402237a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith                    diag::note_constexpr_stmt_expr_unsupported);
402337a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith          return false;
402437a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith        }
402537a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith        return this->Visit(FinalExpr);
402637a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith      }
402737a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith
402837a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith      APValue ReturnValue;
402937a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith      EvalStmtResult ESR = EvaluateStmt(ReturnValue, Info, *BI);
403037a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith      if (ESR != ESR_Succeeded) {
403137a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith        // FIXME: If the statement-expression terminated due to 'return',
403237a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith        // 'break', or 'continue', it would be nice to propagate that to
403337a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith        // the outer statement evaluation rather than bailing out.
403437a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith        if (ESR != ESR_Failed)
403537a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith          Info.Diag((*BI)->getLocStart(),
403637a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith                    diag::note_constexpr_stmt_expr_unsupported);
403737a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith        return false;
403837a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith      }
403937a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith    }
404037a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith  }
404137a84f653c196aa0b73fad96707175a62dcb6a12Richard Smith
40428327fad71da34492d82c532f42a58cb4baff81a3Richard Smith  /// Visit a value which is evaluated, but whose value is ignored.
40438327fad71da34492d82c532f42a58cb4baff81a3Richard Smith  void VisitIgnoredValue(const Expr *E) {
4044a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith    EvaluateIgnoredValue(Info, E);
40458327fad71da34492d82c532f42a58cb4baff81a3Richard Smith  }
40468cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne};
40478cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
40488cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne}
40498cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
40508cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne//===----------------------------------------------------------------------===//
4051e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith// Common base class for lvalue and temporary evaluation.
4052e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith//===----------------------------------------------------------------------===//
4053e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithnamespace {
4054e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithtemplate<class Derived>
4055e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithclass LValueExprEvaluatorBase
4056e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  : public ExprEvaluatorBase<Derived, bool> {
4057e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithprotected:
4058e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  LValue &Result;
4059e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  typedef LValueExprEvaluatorBase LValueExprEvaluatorBaseTy;
4060e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  typedef ExprEvaluatorBase<Derived, bool> ExprEvaluatorBaseTy;
4061e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
4062e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  bool Success(APValue::LValueBase B) {
4063e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    Result.set(B);
4064e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    return true;
4065e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  }
4066e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
4067e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithpublic:
4068e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  LValueExprEvaluatorBase(EvalInfo &Info, LValue &Result) :
4069e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    ExprEvaluatorBaseTy(Info), Result(Result) {}
4070e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
40711aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith  bool Success(const APValue &V, const Expr *E) {
40721aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith    Result.setFrom(this->Info.Ctx, V);
4073e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    return true;
4074e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  }
4075e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
4076e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  bool VisitMemberExpr(const MemberExpr *E) {
4077e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    // Handle non-static data members.
4078e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    QualType BaseTy;
4079e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    if (E->isArrow()) {
4080e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      if (!EvaluatePointer(E->getBase(), Result, this->Info))
4081e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        return false;
4082890f0f1612b0028b8b16730ae7ed07e295600c76Ted Kremenek      BaseTy = E->getBase()->getType()->castAs<PointerType>()->getPointeeType();
4083c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    } else if (E->getBase()->isRValue()) {
4084af2c7a194592401394233b7cbcdd3cfd0a7a38ddRichard Smith      assert(E->getBase()->getType()->isRecordType());
4085c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      if (!EvaluateTemporary(E->getBase(), Result, this->Info))
4086c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith        return false;
4087c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      BaseTy = E->getBase()->getType();
4088e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    } else {
4089e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      if (!this->Visit(E->getBase()))
4090e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        return false;
4091e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      BaseTy = E->getBase()->getType();
4092e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    }
4093e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
4094d9b02e726262e4009dda830998bb934172ac0020Richard Smith    const ValueDecl *MD = E->getMemberDecl();
4095d9b02e726262e4009dda830998bb934172ac0020Richard Smith    if (const FieldDecl *FD = dyn_cast<FieldDecl>(E->getMemberDecl())) {
4096d9b02e726262e4009dda830998bb934172ac0020Richard Smith      assert(BaseTy->getAs<RecordType>()->getDecl()->getCanonicalDecl() ==
4097d9b02e726262e4009dda830998bb934172ac0020Richard Smith             FD->getParent()->getCanonicalDecl() && "record / field mismatch");
4098d9b02e726262e4009dda830998bb934172ac0020Richard Smith      (void)BaseTy;
40998d59deec807ed53efcd07855199cdc9c979f447fJohn McCall      if (!HandleLValueMember(this->Info, E, Result, FD))
41008d59deec807ed53efcd07855199cdc9c979f447fJohn McCall        return false;
4101d9b02e726262e4009dda830998bb934172ac0020Richard Smith    } else if (const IndirectFieldDecl *IFD = dyn_cast<IndirectFieldDecl>(MD)) {
41028d59deec807ed53efcd07855199cdc9c979f447fJohn McCall      if (!HandleLValueIndirectMember(this->Info, E, Result, IFD))
41038d59deec807ed53efcd07855199cdc9c979f447fJohn McCall        return false;
4104d9b02e726262e4009dda830998bb934172ac0020Richard Smith    } else
4105d9b02e726262e4009dda830998bb934172ac0020Richard Smith      return this->Error(E);
4106e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
4107d9b02e726262e4009dda830998bb934172ac0020Richard Smith    if (MD->getType()->isReferenceType()) {
41081aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith      APValue RefValue;
41095528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      if (!handleLValueToRValueConversion(this->Info, E, MD->getType(), Result,
4110e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith                                          RefValue))
4111e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        return false;
4112e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      return Success(RefValue, E);
4113e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    }
4114e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    return true;
4115e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  }
4116e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
4117e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  bool VisitBinaryOperator(const BinaryOperator *E) {
4118e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    switch (E->getOpcode()) {
4119e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    default:
4120e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      return ExprEvaluatorBaseTy::VisitBinaryOperator(E);
4121e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
4122e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    case BO_PtrMemD:
4123e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    case BO_PtrMemI:
4124e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      return HandleMemberPointerAccess(this->Info, E, Result);
4125e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    }
4126e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  }
4127e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
4128e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  bool VisitCastExpr(const CastExpr *E) {
4129e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    switch (E->getCastKind()) {
4130e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    default:
4131e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      return ExprEvaluatorBaseTy::VisitCastExpr(E);
4132e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
4133e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    case CK_DerivedToBase:
41348a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    case CK_UncheckedDerivedToBase:
4135e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      if (!this->Visit(E->getSubExpr()))
4136e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        return false;
4137e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
4138e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      // Now figure out the necessary offset to add to the base LV to get from
4139e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      // the derived class to the base class.
41408a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      return HandleLValueBasePath(this->Info, E, E->getSubExpr()->getType(),
41418a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith                                  Result);
4142e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    }
4143e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  }
4144e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith};
4145e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith}
4146e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
4147e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith//===----------------------------------------------------------------------===//
41484efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// LValue Evaluation
4149c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith//
4150c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// This is used for evaluating lvalues (in C and C++), xvalues (in C++11),
4151c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// function designators (in C), decl references to void objects (in C), and
4152c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// temporaries (if building with -Wno-address-of-temporary).
4153c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith//
4154c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// LValue evaluation produces values comprising a base expression of one of the
4155c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// following types:
41561bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith// - Declarations
41571bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith//  * VarDecl
41581bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith//  * FunctionDecl
41591bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith// - Literals
4160c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith//  * CompoundLiteralExpr in C
4161c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith//  * StringLiteral
416247d2145675099893d702be4bc06bd9f26d8ddd13Richard Smith//  * CXXTypeidExpr
4163c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith//  * PredefinedExpr
4164180f47959a066795cc0f409433023af448bb0328Richard Smith//  * ObjCStringLiteralExpr
4165c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith//  * ObjCEncodeExpr
4166c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith//  * AddrLabelExpr
4167c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith//  * BlockExpr
4168c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith//  * CallExpr for a MakeStringConstant builtin
41691bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith// - Locals and temporaries
41708a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith//  * MaterializeTemporaryExpr
417183587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith//  * Any Expr, with a CallIndex indicating the function in which the temporary
41728a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith//    was evaluated, for cases where the MaterializeTemporaryExpr is missing
41738a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith//    from the AST (FIXME).
4174211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith//  * A MaterializeTemporaryExpr that has static storage duration, with no
4175211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith//    CallIndex, for a lifetime-extended temporary.
41761bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith// plus an offset in bytes.
41774efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
41784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmannamespace {
4179770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass LValueExprEvaluator
4180e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  : public LValueExprEvaluatorBase<LValueExprEvaluator> {
41814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanpublic:
4182e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  LValueExprEvaluator(EvalInfo &Info, LValue &Result) :
4183e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    LValueExprEvaluatorBaseTy(Info, Result) {}
41841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4185c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  bool VisitVarDecl(const Expr *E, const VarDecl *VD);
41865528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  bool VisitUnaryPreIncDec(const UnaryOperator *UO);
4187c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
41888cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitDeclRefExpr(const DeclRefExpr *E);
41898cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitPredefinedExpr(const PredefinedExpr *E) { return Success(E); }
4190bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith  bool VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *E);
41918cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitCompoundLiteralExpr(const CompoundLiteralExpr *E);
41928cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitMemberExpr(const MemberExpr *E);
41938cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitStringLiteral(const StringLiteral *E) { return Success(E); }
41948cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitObjCEncodeExpr(const ObjCEncodeExpr *E) { return Success(E); }
419547d2145675099893d702be4bc06bd9f26d8ddd13Richard Smith  bool VisitCXXTypeidExpr(const CXXTypeidExpr *E);
4196e275a1845b9e32bd3034f2593dee1780855c8fd6Francois Pichet  bool VisitCXXUuidofExpr(const CXXUuidofExpr *E);
41978cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitArraySubscriptExpr(const ArraySubscriptExpr *E);
41988cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitUnaryDeref(const UnaryOperator *E);
419986024013d4c3728122c58fa07a2a67e6c15837efRichard Smith  bool VisitUnaryReal(const UnaryOperator *E);
420086024013d4c3728122c58fa07a2a67e6c15837efRichard Smith  bool VisitUnaryImag(const UnaryOperator *E);
42015528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  bool VisitUnaryPreInc(const UnaryOperator *UO) {
42025528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    return VisitUnaryPreIncDec(UO);
42035528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  }
42045528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  bool VisitUnaryPreDec(const UnaryOperator *UO) {
42055528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    return VisitUnaryPreIncDec(UO);
42065528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  }
4207b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  bool VisitBinAssign(const BinaryOperator *BO);
4208b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  bool VisitCompoundAssignOperator(const CompoundAssignOperator *CAO);
42098cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
42108cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitCastExpr(const CastExpr *E) {
421126bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson    switch (E->getCastKind()) {
421226bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson    default:
4213e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      return LValueExprEvaluatorBaseTy::VisitCastExpr(E);
421426bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson
4215db924224b51b153f24fbe492102d4edebcbbb7f4Eli Friedman    case CK_LValueBitCast:
4216c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith      this->CCEDiag(E, diag::note_constexpr_invalid_cast) << 2;
42170a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      if (!Visit(E->getSubExpr()))
42180a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith        return false;
42190a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      Result.Designator.setInvalid();
42200a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      return true;
4221db924224b51b153f24fbe492102d4edebcbbb7f4Eli Friedman
4222e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    case CK_BaseToDerived:
4223180f47959a066795cc0f409433023af448bb0328Richard Smith      if (!Visit(E->getSubExpr()))
4224180f47959a066795cc0f409433023af448bb0328Richard Smith        return false;
4225e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      return HandleBaseToDerivedCast(Info, E, Result);
422626bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson    }
422726bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson  }
42284efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman};
42294efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} // end anonymous namespace
42304efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
4231c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// Evaluate an expression as an lvalue. This can be legitimately called on
4232a07a6c3e756d0a6a5baa2cad9d165f79f0fb1b42Richard Smith/// expressions which are not glvalues, in two cases:
4233a07a6c3e756d0a6a5baa2cad9d165f79f0fb1b42Richard Smith///  * function designators in C, and
4234a07a6c3e756d0a6a5baa2cad9d165f79f0fb1b42Richard Smith///  * "extern void" objects
4235a07a6c3e756d0a6a5baa2cad9d165f79f0fb1b42Richard Smithstatic bool EvaluateLValue(const Expr *E, LValue &Result, EvalInfo &Info) {
4236a07a6c3e756d0a6a5baa2cad9d165f79f0fb1b42Richard Smith  assert(E->isGLValue() || E->getType()->isFunctionType() ||
4237a07a6c3e756d0a6a5baa2cad9d165f79f0fb1b42Richard Smith         E->getType()->isVoidType());
42388cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  return LValueExprEvaluator(Info, Result).Visit(E);
42394efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
42404efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
42418cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool LValueExprEvaluator::VisitDeclRefExpr(const DeclRefExpr *E) {
42421bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(E->getDecl()))
42431bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith    return Success(FD);
42441bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith  if (const VarDecl *VD = dyn_cast<VarDecl>(E->getDecl()))
4245c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return VisitVarDecl(E, VD);
4246c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  return Error(E);
4247c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith}
4248436c8898cd1c93c5bacd3fcc4ac586bc5cd77062Richard Smith
4249c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smithbool LValueExprEvaluator::VisitVarDecl(const Expr *E, const VarDecl *VD) {
4250b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  CallStackFrame *Frame = 0;
4251b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  if (VD->hasLocalStorage() && Info.CurrentCall->Index > 1)
4252b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    Frame = Info.CurrentCall;
4253b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith
4254177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith  if (!VD->getType()->isReferenceType()) {
4255b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    if (Frame) {
4256b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith      Result.set(VD, Frame->Index);
4257177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith      return true;
4258177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith    }
42591bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith    return Success(VD);
4260177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith  }
426150c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman
4262b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  APValue *V;
4263b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  if (!evaluateVarDeclInit(Info, E, VD, Frame, V))
4264f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return false;
426503ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith  if (V->isUninit()) {
426603ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    if (!Info.CheckingPotentialConstantExpression)
426703ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      Info.Diag(E, diag::note_constexpr_use_uninit_reference);
426803ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    return false;
426903ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith  }
4270b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  return Success(*V, E);
427135873c49adad211ff466e34342a52665742794f5Anders Carlsson}
427235873c49adad211ff466e34342a52665742794f5Anders Carlsson
4273bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smithbool LValueExprEvaluator::VisitMaterializeTemporaryExpr(
4274bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith    const MaterializeTemporaryExpr *E) {
42758a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  // Walk through the expression to find the materialized temporary itself.
42768a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  SmallVector<const Expr *, 2> CommaLHSs;
42778a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  SmallVector<SubobjectAdjustment, 2> Adjustments;
42788a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  const Expr *Inner = E->GetTemporaryExpr()->
42798a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      skipRValueSubobjectAdjustments(CommaLHSs, Adjustments);
42808a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith
42818a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  // If we passed any comma operators, evaluate their LHSs.
42828a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  for (unsigned I = 0, N = CommaLHSs.size(); I != N; ++I)
42838a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    if (!EvaluateIgnoredValue(Info, CommaLHSs[I]))
42848a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      return false;
4285e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
4286211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith  // A materialized temporary with static storage duration can appear within the
4287211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith  // result of a constant expression evaluation, so we need to preserve its
4288211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith  // value for use outside this evaluation.
4289211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith  APValue *Value;
4290211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith  if (E->getStorageDuration() == SD_Static) {
4291211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith    Value = Info.Ctx.getMaterializedTemporaryValue(E, true);
42923282b84296dba58e811741b63e4429980a98df8bRichard Smith    *Value = APValue();
4293211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith    Result.set(E);
4294211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith  } else {
429503ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    Value = &Info.CurrentCall->
429603ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith        createTemporary(E, E->getStorageDuration() == SD_Automatic);
4297211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith    Result.set(E, Info.CurrentCall->Index);
4298211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith  }
4299211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith
4300f69dd33cfc0b1f2a6c88d10951dbd29c4dc806c2Richard Smith  QualType Type = Inner->getType();
4301f69dd33cfc0b1f2a6c88d10951dbd29c4dc806c2Richard Smith
43028a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  // Materialize the temporary itself.
4303f69dd33cfc0b1f2a6c88d10951dbd29c4dc806c2Richard Smith  if (!EvaluateInPlace(*Value, Info, Result, Inner) ||
4304f69dd33cfc0b1f2a6c88d10951dbd29c4dc806c2Richard Smith      (E->getStorageDuration() == SD_Static &&
4305f69dd33cfc0b1f2a6c88d10951dbd29c4dc806c2Richard Smith       !CheckConstantExpression(Info, E->getExprLoc(), Type, *Value))) {
4306f69dd33cfc0b1f2a6c88d10951dbd29c4dc806c2Richard Smith    *Value = APValue();
43078a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    return false;
4308f69dd33cfc0b1f2a6c88d10951dbd29c4dc806c2Richard Smith  }
43098a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith
43108a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  // Adjust our lvalue to refer to the desired subobject.
43118a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  for (unsigned I = Adjustments.size(); I != 0; /**/) {
43128a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    --I;
43138a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    switch (Adjustments[I].Kind) {
43148a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    case SubobjectAdjustment::DerivedToBaseAdjustment:
43158a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      if (!HandleLValueBasePath(Info, Adjustments[I].DerivedToBase.BasePath,
43168a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith                                Type, Result))
43178a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith        return false;
43188a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      Type = Adjustments[I].DerivedToBase.BasePath->getType();
43198a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      break;
43208a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith
43218a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    case SubobjectAdjustment::FieldAdjustment:
43228a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      if (!HandleLValueMember(Info, E, Result, Adjustments[I].Field))
43238a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith        return false;
43248a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      Type = Adjustments[I].Field->getType();
43258a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      break;
43268a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith
43278a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    case SubobjectAdjustment::MemberPointerAdjustment:
43288a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      if (!HandleMemberPointerAccess(this->Info, Type, Result,
43298a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith                                     Adjustments[I].Ptr.RHS))
43308a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith        return false;
43318a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      Type = Adjustments[I].Ptr.MPT->getPointeeType();
43328a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      break;
43338a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    }
43348a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  }
43358a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith
43368a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  return true;
4337bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith}
4338bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith
43398cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool
43408cad3046be06ea73ff8892d947697a21d7a440d3Peter CollingbourneLValueExprEvaluator::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) {
4341c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  assert(!Info.getLangOpts().CPlusPlus && "lvalue compound literal in c++?");
4342c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  // Defer visiting the literal until the lvalue-to-rvalue conversion. We can
4343c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  // only see this when folding in C, so there's no standard to follow here.
4344efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  return Success(E);
43454efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
43464efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
434747d2145675099893d702be4bc06bd9f26d8ddd13Richard Smithbool LValueExprEvaluator::VisitCXXTypeidExpr(const CXXTypeidExpr *E) {
43489be36ab27b874b404099650e0c29bc92f3c7662dRichard Smith  if (!E->isPotentiallyEvaluated())
434947d2145675099893d702be4bc06bd9f26d8ddd13Richard Smith    return Success(E);
43509be36ab27b874b404099650e0c29bc92f3c7662dRichard Smith
43519be36ab27b874b404099650e0c29bc92f3c7662dRichard Smith  Info.Diag(E, diag::note_constexpr_typeid_polymorphic)
43529be36ab27b874b404099650e0c29bc92f3c7662dRichard Smith    << E->getExprOperand()->getType()
43539be36ab27b874b404099650e0c29bc92f3c7662dRichard Smith    << E->getExprOperand()->getSourceRange();
43549be36ab27b874b404099650e0c29bc92f3c7662dRichard Smith  return false;
435547d2145675099893d702be4bc06bd9f26d8ddd13Richard Smith}
435647d2145675099893d702be4bc06bd9f26d8ddd13Richard Smith
4357e275a1845b9e32bd3034f2593dee1780855c8fd6Francois Pichetbool LValueExprEvaluator::VisitCXXUuidofExpr(const CXXUuidofExpr *E) {
4358e275a1845b9e32bd3034f2593dee1780855c8fd6Francois Pichet  return Success(E);
4359b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith}
4360e275a1845b9e32bd3034f2593dee1780855c8fd6Francois Pichet
43618cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool LValueExprEvaluator::VisitMemberExpr(const MemberExpr *E) {
4362c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  // Handle static data members.
4363c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  if (const VarDecl *VD = dyn_cast<VarDecl>(E->getMemberDecl())) {
4364c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    VisitIgnoredValue(E->getBase());
4365c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return VisitVarDecl(E, VD);
4366c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  }
4367c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
4368d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  // Handle static member functions.
4369d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(E->getMemberDecl())) {
4370d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    if (MD->isStatic()) {
4371d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith      VisitIgnoredValue(E->getBase());
43721bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith      return Success(MD);
4373d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith    }
4374d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith  }
4375d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith
4376180f47959a066795cc0f409433023af448bb0328Richard Smith  // Handle non-static data members.
4377e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  return LValueExprEvaluatorBaseTy::VisitMemberExpr(E);
43784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
43794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
43808cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool LValueExprEvaluator::VisitArraySubscriptExpr(const ArraySubscriptExpr *E) {
4381c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  // FIXME: Deal with vectors as array subscript bases.
4382c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  if (E->getBase()->getType()->isVectorType())
4383f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return Error(E);
4384c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
43853068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  if (!EvaluatePointer(E->getBase(), Result, Info))
4386efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    return false;
43871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43883068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  APSInt Index;
43893068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  if (!EvaluateInteger(E->getIdx(), Index, Info))
4390efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    return false;
43913068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
4392a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith  return HandleLValueArrayAdjustment(Info, E, Result, E->getType(),
4393a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith                                     getExtValue(Index));
43943068d117951a8df54bae9db039b56201ab10962bAnders Carlsson}
43954efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
43968cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool LValueExprEvaluator::VisitUnaryDeref(const UnaryOperator *E) {
4397efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  return EvaluatePointer(E->getSubExpr(), Result, Info);
4398e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman}
4399e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman
440086024013d4c3728122c58fa07a2a67e6c15837efRichard Smithbool LValueExprEvaluator::VisitUnaryReal(const UnaryOperator *E) {
440186024013d4c3728122c58fa07a2a67e6c15837efRichard Smith  if (!Visit(E->getSubExpr()))
440286024013d4c3728122c58fa07a2a67e6c15837efRichard Smith    return false;
440386024013d4c3728122c58fa07a2a67e6c15837efRichard Smith  // __real is a no-op on scalar lvalues.
440486024013d4c3728122c58fa07a2a67e6c15837efRichard Smith  if (E->getSubExpr()->getType()->isAnyComplexType())
440586024013d4c3728122c58fa07a2a67e6c15837efRichard Smith    HandleLValueComplexElement(Info, E, Result, E->getType(), false);
440686024013d4c3728122c58fa07a2a67e6c15837efRichard Smith  return true;
440786024013d4c3728122c58fa07a2a67e6c15837efRichard Smith}
440886024013d4c3728122c58fa07a2a67e6c15837efRichard Smith
440986024013d4c3728122c58fa07a2a67e6c15837efRichard Smithbool LValueExprEvaluator::VisitUnaryImag(const UnaryOperator *E) {
441086024013d4c3728122c58fa07a2a67e6c15837efRichard Smith  assert(E->getSubExpr()->getType()->isAnyComplexType() &&
441186024013d4c3728122c58fa07a2a67e6c15837efRichard Smith         "lvalue __imag__ on scalar?");
441286024013d4c3728122c58fa07a2a67e6c15837efRichard Smith  if (!Visit(E->getSubExpr()))
441386024013d4c3728122c58fa07a2a67e6c15837efRichard Smith    return false;
441486024013d4c3728122c58fa07a2a67e6c15837efRichard Smith  HandleLValueComplexElement(Info, E, Result, E->getType(), true);
441586024013d4c3728122c58fa07a2a67e6c15837efRichard Smith  return true;
441686024013d4c3728122c58fa07a2a67e6c15837efRichard Smith}
441786024013d4c3728122c58fa07a2a67e6c15837efRichard Smith
44185528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smithbool LValueExprEvaluator::VisitUnaryPreIncDec(const UnaryOperator *UO) {
44195528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  if (!Info.getLangOpts().CPlusPlus1y && !Info.keepEvaluatingAfterFailure())
4420b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    return Error(UO);
4421b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith
4422b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  if (!this->Visit(UO->getSubExpr()))
4423b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    return false;
4424b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith
44255528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  return handleIncDec(
44265528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      this->Info, UO, Result, UO->getSubExpr()->getType(),
44275528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      UO->isIncrementOp(), 0);
4428b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith}
4429b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith
4430b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smithbool LValueExprEvaluator::VisitCompoundAssignOperator(
4431b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    const CompoundAssignOperator *CAO) {
44325528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  if (!Info.getLangOpts().CPlusPlus1y && !Info.keepEvaluatingAfterFailure())
4433b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    return Error(CAO);
4434b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith
44355528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  APValue RHS;
44365528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith
4437b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  // The overall lvalue result is the result of evaluating the LHS.
44385528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  if (!this->Visit(CAO->getLHS())) {
44395528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    if (Info.keepEvaluatingAfterFailure())
44405528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      Evaluate(RHS, this->Info, CAO->getRHS());
4441b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    return false;
44425528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  }
4443b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith
4444b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  if (!Evaluate(RHS, this->Info, CAO->getRHS()))
4445b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    return false;
4446b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith
4447d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  return handleCompoundAssignment(
4448d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      this->Info, CAO,
4449d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      Result, CAO->getLHS()->getType(), CAO->getComputationLHSType(),
4450d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith      CAO->getOpForCompoundAssignment(CAO->getOpcode()), RHS);
4451b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith}
4452b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith
4453b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smithbool LValueExprEvaluator::VisitBinAssign(const BinaryOperator *E) {
44545528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  if (!Info.getLangOpts().CPlusPlus1y && !Info.keepEvaluatingAfterFailure())
44555528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    return Error(E);
44565528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith
4457b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  APValue NewVal;
44585528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith
44595528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  if (!this->Visit(E->getLHS())) {
44605528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    if (Info.keepEvaluatingAfterFailure())
44615528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith      Evaluate(NewVal, this->Info, E->getRHS());
44625528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    return false;
44635528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  }
44645528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith
4465b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith  if (!Evaluate(NewVal, this->Info, E->getRHS()))
4466b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith    return false;
44675528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith
44685528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith  return handleAssignment(this->Info, E, Result, E->getLHS()->getType(),
4469b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith                          NewVal);
4470b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith}
4471b476a14e9b35ef2448b42b033e1f0cceaa3f2778Richard Smith
44724efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
4473f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Pointer Evaluation
4474f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
4475f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
4476c754aa62643e66ab967ca32ae8b0b3fc419bba25Anders Carlssonnamespace {
4477770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass PointerExprEvaluator
44788cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  : public ExprEvaluatorBase<PointerExprEvaluator, bool> {
4479efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  LValue &Result;
4480efdb83e26f9a1fd2566afe54461216cd84814d42John McCall
44818cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool Success(const Expr *E) {
44821bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith    Result.set(E);
4483efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    return true;
4484efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  }
44852bad1687fe6f00e10767a691a33b070b151902b6Anders Carlssonpublic:
44861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4487efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  PointerExprEvaluator(EvalInfo &info, LValue &Result)
44888cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    : ExprEvaluatorBaseTy(info), Result(Result) {}
4489f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
44901aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith  bool Success(const APValue &V, const Expr *E) {
44911aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith    Result.setFrom(Info.Ctx, V);
44928cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    return true;
44932bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  }
449451201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  bool ZeroInitialization(const Expr *E) {
4495f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith    return Success((Expr*)0);
4496f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith  }
44972bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
4498efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  bool VisitBinaryOperator(const BinaryOperator *E);
44998cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitCastExpr(const CastExpr* E);
4500efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  bool VisitUnaryAddrOf(const UnaryOperator *E);
45018cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitObjCStringLiteral(const ObjCStringLiteral *E)
4502efdb83e26f9a1fd2566afe54461216cd84814d42John McCall      { return Success(E); }
4503eb382ec1507cf2c8c12d7443d0b67c076223aec6Patrick Beard  bool VisitObjCBoxedExpr(const ObjCBoxedExpr *E)
4504ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      { return Success(E); }
45058cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitAddrLabelExpr(const AddrLabelExpr *E)
4506efdb83e26f9a1fd2566afe54461216cd84814d42John McCall      { return Success(E); }
45078cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitCallExpr(const CallExpr *E);
45088cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitBlockExpr(const BlockExpr *E) {
4509469a1eb996e1cb0be54f9b210f836afbddcbb2ccJohn McCall    if (!E->getBlockDecl()->hasCaptures())
4510efdb83e26f9a1fd2566afe54461216cd84814d42John McCall      return Success(E);
4511f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return Error(E);
4512b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump  }
4513180f47959a066795cc0f409433023af448bb0328Richard Smith  bool VisitCXXThisExpr(const CXXThisExpr *E) {
45148a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    // Can't look at 'this' when checking a potential constant expression.
45158a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    if (Info.CheckingPotentialConstantExpression)
45168a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith      return false;
4517180f47959a066795cc0f409433023af448bb0328Richard Smith    if (!Info.CurrentCall->This)
4518f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      return Error(E);
4519180f47959a066795cc0f409433023af448bb0328Richard Smith    Result = *Info.CurrentCall->This;
4520180f47959a066795cc0f409433023af448bb0328Richard Smith    return true;
4521180f47959a066795cc0f409433023af448bb0328Richard Smith  }
452256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
4523ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  // FIXME: Missing: @protocol, @selector
45242bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson};
4525f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace
45262bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
4527efdb83e26f9a1fd2566afe54461216cd84814d42John McCallstatic bool EvaluatePointer(const Expr* E, LValue& Result, EvalInfo &Info) {
4528c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  assert(E->isRValue() && E->getType()->hasPointerRepresentation());
45298cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  return PointerExprEvaluator(Info, Result).Visit(E);
4530f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner}
4531650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
4532efdb83e26f9a1fd2566afe54461216cd84814d42John McCallbool PointerExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
45332de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  if (E->getOpcode() != BO_Add &&
45342de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      E->getOpcode() != BO_Sub)
4535e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    return ExprEvaluatorBaseTy::VisitBinaryOperator(E);
45361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4537650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  const Expr *PExp = E->getLHS();
4538650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  const Expr *IExp = E->getRHS();
4539650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  if (IExp->getType()->isPointerType())
4540f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner    std::swap(PExp, IExp);
45411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4542745f5147e065900267c85a5568785a1991d4838fRichard Smith  bool EvalPtrOK = EvaluatePointer(PExp, Result, Info);
4543745f5147e065900267c85a5568785a1991d4838fRichard Smith  if (!EvalPtrOK && !Info.keepEvaluatingAfterFailure())
4544efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    return false;
45451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4546efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  llvm::APSInt Offset;
4547745f5147e065900267c85a5568785a1991d4838fRichard Smith  if (!EvaluateInteger(IExp, Offset, Info) || !EvalPtrOK)
4548efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    return false;
4549a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith
4550a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith  int64_t AdditionalOffset = getExtValue(Offset);
45510a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith  if (E->getOpcode() == BO_Sub)
45520a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    AdditionalOffset = -AdditionalOffset;
4553650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
4554890f0f1612b0028b8b16730ae7ed07e295600c76Ted Kremenek  QualType Pointee = PExp->getType()->castAs<PointerType>()->getPointeeType();
4555b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  return HandleLValueArrayAdjustment(Info, E, Result, Pointee,
4556b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith                                     AdditionalOffset);
4557650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson}
45584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
4559efdb83e26f9a1fd2566afe54461216cd84814d42John McCallbool PointerExprEvaluator::VisitUnaryAddrOf(const UnaryOperator *E) {
4560efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  return EvaluateLValue(E->getSubExpr(), Result, Info);
45614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
45621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45638cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool PointerExprEvaluator::VisitCastExpr(const CastExpr* E) {
45648cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  const Expr* SubExpr = E->getSubExpr();
4565650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
456609a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman  switch (E->getCastKind()) {
456709a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman  default:
456809a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman    break;
456909a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman
45702de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_BitCast:
45711d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall  case CK_CPointerToObjCPointerCast:
45721d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall  case CK_BlockPointerToObjCPointerCast:
45732de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_AnyPointerToBlockPointerCast:
457428c1ce789322ab99f9b5887015d63ec5f088957aRichard Smith    if (!Visit(SubExpr))
457528c1ce789322ab99f9b5887015d63ec5f088957aRichard Smith      return false;
4576c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith    // Bitcasts to cv void* are static_casts, not reinterpret_casts, so are
4577c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith    // permitted in constant expressions in C++11. Bitcasts from cv void* are
4578c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith    // also static_casts, but we disallow them as a resolution to DR1312.
45794cd9b8f7fb2cebf614e6e2bc766fad27ffd2e9deRichard Smith    if (!E->getType()->isVoidPointerType()) {
458028c1ce789322ab99f9b5887015d63ec5f088957aRichard Smith      Result.Designator.setInvalid();
45814cd9b8f7fb2cebf614e6e2bc766fad27ffd2e9deRichard Smith      if (SubExpr->getType()->isVoidPointerType())
45824cd9b8f7fb2cebf614e6e2bc766fad27ffd2e9deRichard Smith        CCEDiag(E, diag::note_constexpr_invalid_cast)
45834cd9b8f7fb2cebf614e6e2bc766fad27ffd2e9deRichard Smith          << 3 << SubExpr->getType();
45844cd9b8f7fb2cebf614e6e2bc766fad27ffd2e9deRichard Smith      else
45854cd9b8f7fb2cebf614e6e2bc766fad27ffd2e9deRichard Smith        CCEDiag(E, diag::note_constexpr_invalid_cast) << 2;
45864cd9b8f7fb2cebf614e6e2bc766fad27ffd2e9deRichard Smith    }
45870a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    return true;
458809a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman
45895c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson  case CK_DerivedToBase:
45908a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith  case CK_UncheckedDerivedToBase:
459147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith    if (!EvaluatePointer(E->getSubExpr(), Result, Info))
45925c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson      return false;
4593e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    if (!Result.Base && Result.Offset.isZero())
4594e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      return true;
45955c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson
4596180f47959a066795cc0f409433023af448bb0328Richard Smith    // Now figure out the necessary offset to add to the base LV to get from
45975c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson    // the derived class to the base class.
45988a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith    return HandleLValueBasePath(Info, E, E->getSubExpr()->getType()->
45998a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith                                  castAs<PointerType>()->getPointeeType(),
46008a66bf78becf05a24e8251379f3843d1fceb627fRichard Smith                                Result);
46015c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson
4602e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  case CK_BaseToDerived:
4603e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    if (!Visit(E->getSubExpr()))
4604e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      return false;
4605e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    if (!Result.Base && Result.Offset.isZero())
4606e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      return true;
4607e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    return HandleBaseToDerivedCast(Info, E, Result);
4608e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
460947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith  case CK_NullToPointer:
461049149fe0d2be06ce1ceed1e9d2548a0b75a59c47Richard Smith    VisitIgnoredValue(E->getSubExpr());
461151201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    return ZeroInitialization(E);
4612404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall
46132de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_IntegralToPointer: {
4614c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith    CCEDiag(E, diag::note_constexpr_invalid_cast) << 2;
4615c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith
46161aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith    APValue Value;
4617efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    if (!EvaluateIntegerOrLValue(SubExpr, Value, Info))
461809a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman      break;
461969ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar
4620efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    if (Value.isInt()) {
462147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith      unsigned Size = Info.Ctx.getTypeSize(E->getType());
462247a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith      uint64_t N = Value.getInt().extOrTrunc(Size).getZExtValue();
46231bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith      Result.Base = (Expr*)0;
462447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith      Result.Offset = CharUnits::fromQuantity(N);
462583587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith      Result.CallIndex = 0;
46260a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith      Result.Designator.setInvalid();
4627efdb83e26f9a1fd2566afe54461216cd84814d42John McCall      return true;
4628efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    } else {
4629efdb83e26f9a1fd2566afe54461216cd84814d42John McCall      // Cast is of an lvalue, no need to change value.
46301aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith      Result.setFrom(Info.Ctx, Value);
4631efdb83e26f9a1fd2566afe54461216cd84814d42John McCall      return true;
4632650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    }
4633650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  }
46342de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_ArrayToPointerDecay:
4635e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    if (SubExpr->isGLValue()) {
4636e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      if (!EvaluateLValue(SubExpr, Result, Info))
4637e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        return false;
4638e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    } else {
463983587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith      Result.set(SubExpr, Info.CurrentCall->Index);
464003ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith      if (!EvaluateInPlace(Info.CurrentCall->createTemporary(SubExpr, false),
464183587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith                           Info, Result, SubExpr))
4642e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith        return false;
4643e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    }
46440a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    // The result is a pointer to the first element of the array.
4645b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    if (const ConstantArrayType *CAT
4646b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith          = Info.Ctx.getAsConstantArrayType(SubExpr->getType()))
4647b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      Result.addArray(Info, E, CAT);
4648b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith    else
4649b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      Result.Designator.setInvalid();
46500a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith    return true;
46516a7c94af983717e2c2d6aebe42cb4737c1c7b9e6Richard Smith
46522de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_FunctionToPointerDecay:
46536a7c94af983717e2c2d6aebe42cb4737c1c7b9e6Richard Smith    return EvaluateLValue(SubExpr, Result, Info);
46544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
46554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
4656c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  return ExprEvaluatorBaseTy::VisitCastExpr(E);
46571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
4658650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
46598cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool PointerExprEvaluator::VisitCallExpr(const CallExpr *E) {
4660180f47959a066795cc0f409433023af448bb0328Richard Smith  if (IsStringLiteralCall(E))
4661efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    return Success(E);
466256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
46635154dce6388e3aaa445467030df7a45ed1211abeRichard Smith  switch (E->isBuiltinCall()) {
46645154dce6388e3aaa445467030df7a45ed1211abeRichard Smith  case Builtin::BI__builtin_addressof:
46655154dce6388e3aaa445467030df7a45ed1211abeRichard Smith    return EvaluateLValue(E->getArg(0), Result, Info);
46665154dce6388e3aaa445467030df7a45ed1211abeRichard Smith
46675154dce6388e3aaa445467030df7a45ed1211abeRichard Smith  default:
46685154dce6388e3aaa445467030df7a45ed1211abeRichard Smith    return ExprEvaluatorBaseTy::VisitCallExpr(E);
46695154dce6388e3aaa445467030df7a45ed1211abeRichard Smith  }
46704efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
4671f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
4672f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
4673e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith// Member Pointer Evaluation
4674e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith//===----------------------------------------------------------------------===//
4675e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
4676e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithnamespace {
4677e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithclass MemberPointerExprEvaluator
4678e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  : public ExprEvaluatorBase<MemberPointerExprEvaluator, bool> {
4679e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  MemberPtr &Result;
4680e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
4681e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  bool Success(const ValueDecl *D) {
4682e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    Result = MemberPtr(D);
4683e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    return true;
4684e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  }
4685e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithpublic:
4686e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
4687e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  MemberPointerExprEvaluator(EvalInfo &Info, MemberPtr &Result)
4688e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    : ExprEvaluatorBaseTy(Info), Result(Result) {}
4689e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
46901aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith  bool Success(const APValue &V, const Expr *E) {
4691e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    Result.setFrom(V);
4692e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    return true;
4693e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  }
469451201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  bool ZeroInitialization(const Expr *E) {
4695e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    return Success((const ValueDecl*)0);
4696e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  }
4697e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
4698e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  bool VisitCastExpr(const CastExpr *E);
4699e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  bool VisitUnaryAddrOf(const UnaryOperator *E);
4700e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith};
4701e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} // end anonymous namespace
4702e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
4703e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstatic bool EvaluateMemberPointer(const Expr *E, MemberPtr &Result,
4704e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith                                  EvalInfo &Info) {
4705e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  assert(E->isRValue() && E->getType()->isMemberPointerType());
4706e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  return MemberPointerExprEvaluator(Info, Result).Visit(E);
4707e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith}
4708e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
4709e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithbool MemberPointerExprEvaluator::VisitCastExpr(const CastExpr *E) {
4710e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  switch (E->getCastKind()) {
4711e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  default:
4712e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    return ExprEvaluatorBaseTy::VisitCastExpr(E);
4713e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
4714e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  case CK_NullToMemberPointer:
471549149fe0d2be06ce1ceed1e9d2548a0b75a59c47Richard Smith    VisitIgnoredValue(E->getSubExpr());
471651201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    return ZeroInitialization(E);
4717e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
4718e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  case CK_BaseToDerivedMemberPointer: {
4719e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    if (!Visit(E->getSubExpr()))
4720e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      return false;
4721e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    if (E->path_empty())
4722e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      return true;
4723e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    // Base-to-derived member pointer casts store the path in derived-to-base
4724e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    // order, so iterate backwards. The CXXBaseSpecifier also provides us with
4725e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    // the wrong end of the derived->base arc, so stagger the path by one class.
4726e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    typedef std::reverse_iterator<CastExpr::path_const_iterator> ReverseIter;
4727e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    for (ReverseIter PathI(E->path_end() - 1), PathE(E->path_begin());
4728e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith         PathI != PathE; ++PathI) {
4729e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      assert(!(*PathI)->isVirtual() && "memptr cast through vbase");
4730e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      const CXXRecordDecl *Derived = (*PathI)->getType()->getAsCXXRecordDecl();
4731e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      if (!Result.castToDerived(Derived))
4732f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith        return Error(E);
4733e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    }
4734e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    const Type *FinalTy = E->getType()->castAs<MemberPointerType>()->getClass();
4735e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    if (!Result.castToDerived(FinalTy->getAsCXXRecordDecl()))
4736f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      return Error(E);
4737e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    return true;
4738e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  }
4739e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
4740e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  case CK_DerivedToBaseMemberPointer:
4741e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    if (!Visit(E->getSubExpr()))
4742e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      return false;
4743e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    for (CastExpr::path_const_iterator PathI = E->path_begin(),
4744e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith         PathE = E->path_end(); PathI != PathE; ++PathI) {
4745e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      assert(!(*PathI)->isVirtual() && "memptr cast through vbase");
4746e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      const CXXRecordDecl *Base = (*PathI)->getType()->getAsCXXRecordDecl();
4747e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      if (!Result.castToBase(Base))
4748f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith        return Error(E);
4749e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    }
4750e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    return true;
4751e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  }
4752e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith}
4753e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
4754e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithbool MemberPointerExprEvaluator::VisitUnaryAddrOf(const UnaryOperator *E) {
4755e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  // C++11 [expr.unary.op]p3 has very strict rules on how the address of a
4756e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  // member can be formed.
4757e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  return Success(cast<DeclRefExpr>(E->getSubExpr())->getDecl());
4758e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith}
4759e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
4760e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith//===----------------------------------------------------------------------===//
4761180f47959a066795cc0f409433023af448bb0328Richard Smith// Record Evaluation
4762180f47959a066795cc0f409433023af448bb0328Richard Smith//===----------------------------------------------------------------------===//
4763180f47959a066795cc0f409433023af448bb0328Richard Smith
4764180f47959a066795cc0f409433023af448bb0328Richard Smithnamespace {
4765180f47959a066795cc0f409433023af448bb0328Richard Smith  class RecordExprEvaluator
4766180f47959a066795cc0f409433023af448bb0328Richard Smith  : public ExprEvaluatorBase<RecordExprEvaluator, bool> {
4767180f47959a066795cc0f409433023af448bb0328Richard Smith    const LValue &This;
4768180f47959a066795cc0f409433023af448bb0328Richard Smith    APValue &Result;
4769180f47959a066795cc0f409433023af448bb0328Richard Smith  public:
4770180f47959a066795cc0f409433023af448bb0328Richard Smith
4771180f47959a066795cc0f409433023af448bb0328Richard Smith    RecordExprEvaluator(EvalInfo &info, const LValue &This, APValue &Result)
4772180f47959a066795cc0f409433023af448bb0328Richard Smith      : ExprEvaluatorBaseTy(info), This(This), Result(Result) {}
4773180f47959a066795cc0f409433023af448bb0328Richard Smith
47741aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith    bool Success(const APValue &V, const Expr *E) {
477583587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith      Result = V;
477683587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith      return true;
4777180f47959a066795cc0f409433023af448bb0328Richard Smith    }
477851201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    bool ZeroInitialization(const Expr *E);
4779180f47959a066795cc0f409433023af448bb0328Richard Smith
478059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith    bool VisitCastExpr(const CastExpr *E);
4781180f47959a066795cc0f409433023af448bb0328Richard Smith    bool VisitInitListExpr(const InitListExpr *E);
4782180f47959a066795cc0f409433023af448bb0328Richard Smith    bool VisitCXXConstructExpr(const CXXConstructExpr *E);
47837c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith    bool VisitCXXStdInitializerListExpr(const CXXStdInitializerListExpr *E);
4784180f47959a066795cc0f409433023af448bb0328Richard Smith  };
4785180f47959a066795cc0f409433023af448bb0328Richard Smith}
4786180f47959a066795cc0f409433023af448bb0328Richard Smith
478751201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith/// Perform zero-initialization on an object of non-union class type.
478851201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith/// C++11 [dcl.init]p5:
478951201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith///  To zero-initialize an object or reference of type T means:
479051201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith///    [...]
479151201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith///    -- if T is a (possibly cv-qualified) non-union class type,
479251201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith///       each non-static data member and each base-class subobject is
479351201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith///       zero-initialized
4794b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smithstatic bool HandleClassZeroInitialization(EvalInfo &Info, const Expr *E,
4795b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith                                          const RecordDecl *RD,
479651201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith                                          const LValue &This, APValue &Result) {
479751201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  assert(!RD->isUnion() && "Expected non-union class type");
479851201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  const CXXRecordDecl *CD = dyn_cast<CXXRecordDecl>(RD);
479951201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  Result = APValue(APValue::UninitStruct(), CD ? CD->getNumBases() : 0,
480051201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith                   std::distance(RD->field_begin(), RD->field_end()));
480151201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith
48028d59deec807ed53efcd07855199cdc9c979f447fJohn McCall  if (RD->isInvalidDecl()) return false;
480351201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD);
480451201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith
480551201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  if (CD) {
480651201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    unsigned Index = 0;
480751201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    for (CXXRecordDecl::base_class_const_iterator I = CD->bases_begin(),
4808b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith           End = CD->bases_end(); I != End; ++I, ++Index) {
480951201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith      const CXXRecordDecl *Base = I->getType()->getAsCXXRecordDecl();
481051201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith      LValue Subobject = This;
48118d59deec807ed53efcd07855199cdc9c979f447fJohn McCall      if (!HandleLValueDirectBase(Info, E, Subobject, CD, Base, &Layout))
48128d59deec807ed53efcd07855199cdc9c979f447fJohn McCall        return false;
4813b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      if (!HandleClassZeroInitialization(Info, E, Base, Subobject,
481451201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith                                         Result.getStructBase(Index)))
481551201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith        return false;
481651201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    }
481751201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  }
481851201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith
4819b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  for (RecordDecl::field_iterator I = RD->field_begin(), End = RD->field_end();
4820b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith       I != End; ++I) {
482151201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    // -- if T is a reference type, no initialization is performed.
4822262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie    if (I->getType()->isReferenceType())
482351201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith      continue;
482451201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith
482551201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    LValue Subobject = This;
4826581deb3da481053c4993c7600f97acf7768caac5David Blaikie    if (!HandleLValueMember(Info, E, Subobject, *I, &Layout))
48278d59deec807ed53efcd07855199cdc9c979f447fJohn McCall      return false;
482851201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith
4829262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie    ImplicitValueInitExpr VIE(I->getType());
483083587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    if (!EvaluateInPlace(
4831262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie          Result.getStructField(I->getFieldIndex()), Info, Subobject, &VIE))
483251201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith      return false;
483351201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  }
483451201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith
483551201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  return true;
483651201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith}
483751201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith
483851201882382fb40c9456a06c7f93d6ddd4a57712Richard Smithbool RecordExprEvaluator::ZeroInitialization(const Expr *E) {
483951201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  const RecordDecl *RD = E->getType()->castAs<RecordType>()->getDecl();
48401de9d7de172379d6af75fd11dda2a713e4f36f62John McCall  if (RD->isInvalidDecl()) return false;
484151201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  if (RD->isUnion()) {
484251201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    // C++11 [dcl.init]p5: If T is a (possibly cv-qualified) union type, the
484351201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    // object's first non-static named data member is zero-initialized
484451201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    RecordDecl::field_iterator I = RD->field_begin();
484551201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    if (I == RD->field_end()) {
484651201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith      Result = APValue((const FieldDecl*)0);
484751201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith      return true;
484851201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    }
484951201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith
485051201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    LValue Subobject = This;
4851581deb3da481053c4993c7600f97acf7768caac5David Blaikie    if (!HandleLValueMember(Info, E, Subobject, *I))
48528d59deec807ed53efcd07855199cdc9c979f447fJohn McCall      return false;
4853581deb3da481053c4993c7600f97acf7768caac5David Blaikie    Result = APValue(*I);
4854262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie    ImplicitValueInitExpr VIE(I->getType());
485583587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    return EvaluateInPlace(Result.getUnionValue(), Info, Subobject, &VIE);
485651201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  }
485751201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith
4858ce582fe2a7aad8b14b3636ad9cac0a3b8bbb219bRichard Smith  if (isa<CXXRecordDecl>(RD) && cast<CXXRecordDecl>(RD)->getNumVBases()) {
48595cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith    Info.Diag(E, diag::note_constexpr_virtual_base) << RD;
4860ce582fe2a7aad8b14b3636ad9cac0a3b8bbb219bRichard Smith    return false;
4861ce582fe2a7aad8b14b3636ad9cac0a3b8bbb219bRichard Smith  }
4862ce582fe2a7aad8b14b3636ad9cac0a3b8bbb219bRichard Smith
4863b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  return HandleClassZeroInitialization(Info, E, RD, This, Result);
486451201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith}
486551201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith
486659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithbool RecordExprEvaluator::VisitCastExpr(const CastExpr *E) {
486759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith  switch (E->getCastKind()) {
486859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith  default:
486959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith    return ExprEvaluatorBaseTy::VisitCastExpr(E);
487059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith
487159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith  case CK_ConstructorConversion:
487259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith    return Visit(E->getSubExpr());
487359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith
487459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith  case CK_DerivedToBase:
487559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith  case CK_UncheckedDerivedToBase: {
48761aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith    APValue DerivedObject;
4877f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    if (!Evaluate(DerivedObject, Info, E->getSubExpr()))
487859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith      return false;
4879f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    if (!DerivedObject.isStruct())
4880f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      return Error(E->getSubExpr());
488159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith
488259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith    // Derived-to-base rvalue conversion: just slice off the derived part.
488359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith    APValue *Value = &DerivedObject;
488459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith    const CXXRecordDecl *RD = E->getSubExpr()->getType()->getAsCXXRecordDecl();
488559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith    for (CastExpr::path_const_iterator PathI = E->path_begin(),
488659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith         PathE = E->path_end(); PathI != PathE; ++PathI) {
488759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith      assert(!(*PathI)->isVirtual() && "record rvalue with virtual base");
488859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith      const CXXRecordDecl *Base = (*PathI)->getType()->getAsCXXRecordDecl();
488959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith      Value = &Value->getStructBase(getBaseIndex(RD, Base));
489059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith      RD = Base;
489159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith    }
489259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith    Result = *Value;
489359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith    return true;
489459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith  }
489559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith  }
489659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith}
489759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith
4898180f47959a066795cc0f409433023af448bb0328Richard Smithbool RecordExprEvaluator::VisitInitListExpr(const InitListExpr *E) {
4899180f47959a066795cc0f409433023af448bb0328Richard Smith  const RecordDecl *RD = E->getType()->castAs<RecordType>()->getDecl();
49001de9d7de172379d6af75fd11dda2a713e4f36f62John McCall  if (RD->isInvalidDecl()) return false;
4901180f47959a066795cc0f409433023af448bb0328Richard Smith  const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD);
4902180f47959a066795cc0f409433023af448bb0328Richard Smith
4903180f47959a066795cc0f409433023af448bb0328Richard Smith  if (RD->isUnion()) {
4904ec789163a42a7be654ac34aadb750b508954d53cRichard Smith    const FieldDecl *Field = E->getInitializedFieldInUnion();
4905ec789163a42a7be654ac34aadb750b508954d53cRichard Smith    Result = APValue(Field);
4906ec789163a42a7be654ac34aadb750b508954d53cRichard Smith    if (!Field)
4907180f47959a066795cc0f409433023af448bb0328Richard Smith      return true;
4908ec789163a42a7be654ac34aadb750b508954d53cRichard Smith
4909ec789163a42a7be654ac34aadb750b508954d53cRichard Smith    // If the initializer list for a union does not contain any elements, the
4910ec789163a42a7be654ac34aadb750b508954d53cRichard Smith    // first element of the union is value-initialized.
4911c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith    // FIXME: The element should be initialized from an initializer list.
4912c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith    //        Is this difference ever observable for initializer lists which
4913c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith    //        we don't build?
4914ec789163a42a7be654ac34aadb750b508954d53cRichard Smith    ImplicitValueInitExpr VIE(Field->getType());
4915ec789163a42a7be654ac34aadb750b508954d53cRichard Smith    const Expr *InitExpr = E->getNumInits() ? E->getInit(0) : &VIE;
4916ec789163a42a7be654ac34aadb750b508954d53cRichard Smith
4917180f47959a066795cc0f409433023af448bb0328Richard Smith    LValue Subobject = This;
49188d59deec807ed53efcd07855199cdc9c979f447fJohn McCall    if (!HandleLValueMember(Info, InitExpr, Subobject, Field, &Layout))
49198d59deec807ed53efcd07855199cdc9c979f447fJohn McCall      return false;
4920c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith
4921c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith    // Temporarily override This, in case there's a CXXDefaultInitExpr in here.
4922c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith    ThisOverrideRAII ThisOverride(*Info.CurrentCall, &This,
4923c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith                                  isa<CXXDefaultInitExpr>(InitExpr));
4924c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith
492583587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    return EvaluateInPlace(Result.getUnionValue(), Info, Subobject, InitExpr);
4926180f47959a066795cc0f409433023af448bb0328Richard Smith  }
4927180f47959a066795cc0f409433023af448bb0328Richard Smith
4928180f47959a066795cc0f409433023af448bb0328Richard Smith  assert((!isa<CXXRecordDecl>(RD) || !cast<CXXRecordDecl>(RD)->getNumBases()) &&
4929180f47959a066795cc0f409433023af448bb0328Richard Smith         "initializer list for class with base classes");
4930180f47959a066795cc0f409433023af448bb0328Richard Smith  Result = APValue(APValue::UninitStruct(), 0,
4931180f47959a066795cc0f409433023af448bb0328Richard Smith                   std::distance(RD->field_begin(), RD->field_end()));
4932180f47959a066795cc0f409433023af448bb0328Richard Smith  unsigned ElementNo = 0;
4933745f5147e065900267c85a5568785a1991d4838fRichard Smith  bool Success = true;
4934180f47959a066795cc0f409433023af448bb0328Richard Smith  for (RecordDecl::field_iterator Field = RD->field_begin(),
4935180f47959a066795cc0f409433023af448bb0328Richard Smith       FieldEnd = RD->field_end(); Field != FieldEnd; ++Field) {
4936180f47959a066795cc0f409433023af448bb0328Richard Smith    // Anonymous bit-fields are not considered members of the class for
4937180f47959a066795cc0f409433023af448bb0328Richard Smith    // purposes of aggregate initialization.
4938180f47959a066795cc0f409433023af448bb0328Richard Smith    if (Field->isUnnamedBitfield())
4939180f47959a066795cc0f409433023af448bb0328Richard Smith      continue;
4940180f47959a066795cc0f409433023af448bb0328Richard Smith
4941180f47959a066795cc0f409433023af448bb0328Richard Smith    LValue Subobject = This;
4942180f47959a066795cc0f409433023af448bb0328Richard Smith
4943745f5147e065900267c85a5568785a1991d4838fRichard Smith    bool HaveInit = ElementNo < E->getNumInits();
4944745f5147e065900267c85a5568785a1991d4838fRichard Smith
4945745f5147e065900267c85a5568785a1991d4838fRichard Smith    // FIXME: Diagnostics here should point to the end of the initializer
4946745f5147e065900267c85a5568785a1991d4838fRichard Smith    // list, not the start.
49478d59deec807ed53efcd07855199cdc9c979f447fJohn McCall    if (!HandleLValueMember(Info, HaveInit ? E->getInit(ElementNo) : E,
4948581deb3da481053c4993c7600f97acf7768caac5David Blaikie                            Subobject, *Field, &Layout))
49498d59deec807ed53efcd07855199cdc9c979f447fJohn McCall      return false;
4950745f5147e065900267c85a5568785a1991d4838fRichard Smith
4951745f5147e065900267c85a5568785a1991d4838fRichard Smith    // Perform an implicit value-initialization for members beyond the end of
4952745f5147e065900267c85a5568785a1991d4838fRichard Smith    // the initializer list.
4953745f5147e065900267c85a5568785a1991d4838fRichard Smith    ImplicitValueInitExpr VIE(HaveInit ? Info.Ctx.IntTy : Field->getType());
4954c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith    const Expr *Init = HaveInit ? E->getInit(ElementNo++) : &VIE;
4955745f5147e065900267c85a5568785a1991d4838fRichard Smith
4956c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith    // Temporarily override This, in case there's a CXXDefaultInitExpr in here.
4957c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith    ThisOverrideRAII ThisOverride(*Info.CurrentCall, &This,
4958c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith                                  isa<CXXDefaultInitExpr>(Init));
4959c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith
49603835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith    APValue &FieldVal = Result.getStructField(Field->getFieldIndex());
49613835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith    if (!EvaluateInPlace(FieldVal, Info, Subobject, Init) ||
49623835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith        (Field->isBitField() && !truncateBitfieldValue(Info, Init,
49633835a4ef050da466038844274d79f1fc9d77c0f1Richard Smith                                                       FieldVal, *Field))) {
4964745f5147e065900267c85a5568785a1991d4838fRichard Smith      if (!Info.keepEvaluatingAfterFailure())
4965180f47959a066795cc0f409433023af448bb0328Richard Smith        return false;
4966745f5147e065900267c85a5568785a1991d4838fRichard Smith      Success = false;
4967180f47959a066795cc0f409433023af448bb0328Richard Smith    }
4968180f47959a066795cc0f409433023af448bb0328Richard Smith  }
4969180f47959a066795cc0f409433023af448bb0328Richard Smith
4970745f5147e065900267c85a5568785a1991d4838fRichard Smith  return Success;
4971180f47959a066795cc0f409433023af448bb0328Richard Smith}
4972180f47959a066795cc0f409433023af448bb0328Richard Smith
4973180f47959a066795cc0f409433023af448bb0328Richard Smithbool RecordExprEvaluator::VisitCXXConstructExpr(const CXXConstructExpr *E) {
4974180f47959a066795cc0f409433023af448bb0328Richard Smith  const CXXConstructorDecl *FD = E->getConstructor();
49751de9d7de172379d6af75fd11dda2a713e4f36f62John McCall  if (FD->isInvalidDecl() || FD->getParent()->isInvalidDecl()) return false;
49761de9d7de172379d6af75fd11dda2a713e4f36f62John McCall
497751201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  bool ZeroInit = E->requiresZeroInitialization();
497851201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  if (CheckTrivialDefaultConstructor(Info, E->getExprLoc(), FD, ZeroInit)) {
4979ec789163a42a7be654ac34aadb750b508954d53cRichard Smith    // If we've already performed zero-initialization, we're already done.
4980ec789163a42a7be654ac34aadb750b508954d53cRichard Smith    if (!Result.isUninit())
4981ec789163a42a7be654ac34aadb750b508954d53cRichard Smith      return true;
4982ec789163a42a7be654ac34aadb750b508954d53cRichard Smith
498351201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    if (ZeroInit)
498451201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith      return ZeroInitialization(E);
498551201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith
49866180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith    const CXXRecordDecl *RD = FD->getParent();
49876180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith    if (RD->isUnion())
49886180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith      Result = APValue((FieldDecl*)0);
49896180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith    else
49906180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith      Result = APValue(APValue::UninitStruct(), RD->getNumBases(),
49916180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith                       std::distance(RD->field_begin(), RD->field_end()));
49926180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith    return true;
49936180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  }
49946180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
4995180f47959a066795cc0f409433023af448bb0328Richard Smith  const FunctionDecl *Definition = 0;
4996180f47959a066795cc0f409433023af448bb0328Richard Smith  FD->getBody(Definition);
4997180f47959a066795cc0f409433023af448bb0328Richard Smith
4998c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  if (!CheckConstexprFunction(Info, E->getExprLoc(), FD, Definition))
4999c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    return false;
5000180f47959a066795cc0f409433023af448bb0328Richard Smith
5001610a60c0e68e34db5a5247d6102e58f37510fef8Richard Smith  // Avoid materializing a temporary for an elidable copy/move constructor.
500251201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  if (E->isElidable() && !ZeroInit)
5003180f47959a066795cc0f409433023af448bb0328Richard Smith    if (const MaterializeTemporaryExpr *ME
5004180f47959a066795cc0f409433023af448bb0328Richard Smith          = dyn_cast<MaterializeTemporaryExpr>(E->getArg(0)))
5005180f47959a066795cc0f409433023af448bb0328Richard Smith      return Visit(ME->GetTemporaryExpr());
5006180f47959a066795cc0f409433023af448bb0328Richard Smith
500751201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  if (ZeroInit && !ZeroInitialization(E))
500851201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    return false;
500951201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith
5010cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko  ArrayRef<const Expr *> Args(E->getArgs(), E->getNumArgs());
5011745f5147e065900267c85a5568785a1991d4838fRichard Smith  return HandleConstructorCall(E->getExprLoc(), This, Args,
5012f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith                               cast<CXXConstructorDecl>(Definition), Info,
5013f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith                               Result);
5014180f47959a066795cc0f409433023af448bb0328Richard Smith}
5015180f47959a066795cc0f409433023af448bb0328Richard Smith
50167c3e615f01e8f9f587315800fdaf2305ed824568Richard Smithbool RecordExprEvaluator::VisitCXXStdInitializerListExpr(
50177c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith    const CXXStdInitializerListExpr *E) {
50187c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith  const ConstantArrayType *ArrayType =
50197c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith      Info.Ctx.getAsConstantArrayType(E->getSubExpr()->getType());
50207c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith
50217c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith  LValue Array;
50227c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith  if (!EvaluateLValue(E->getSubExpr(), Array, Info))
50237c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith    return false;
50247c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith
50257c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith  // Get a pointer to the first element of the array.
50267c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith  Array.addArray(Info, E, ArrayType);
50277c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith
50287c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith  // FIXME: Perform the checks on the field types in SemaInit.
50297c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith  RecordDecl *Record = E->getType()->castAs<RecordType>()->getDecl();
50307c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith  RecordDecl::field_iterator Field = Record->field_begin();
50317c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith  if (Field == Record->field_end())
50327c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith    return Error(E);
50337c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith
50347c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith  // Start pointer.
50357c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith  if (!Field->getType()->isPointerType() ||
50367c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith      !Info.Ctx.hasSameType(Field->getType()->getPointeeType(),
50377c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith                            ArrayType->getElementType()))
50387c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith    return Error(E);
50397c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith
50407c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith  // FIXME: What if the initializer_list type has base classes, etc?
50417c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith  Result = APValue(APValue::UninitStruct(), 0, 2);
50427c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith  Array.moveInto(Result.getStructField(0));
50437c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith
50447c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith  if (++Field == Record->field_end())
50457c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith    return Error(E);
50467c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith
50477c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith  if (Field->getType()->isPointerType() &&
50487c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith      Info.Ctx.hasSameType(Field->getType()->getPointeeType(),
50497c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith                           ArrayType->getElementType())) {
50507c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith    // End pointer.
50517c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith    if (!HandleLValueArrayAdjustment(Info, E, Array,
50527c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith                                     ArrayType->getElementType(),
50537c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith                                     ArrayType->getSize().getZExtValue()))
50547c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith      return false;
50557c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith    Array.moveInto(Result.getStructField(1));
50567c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith  } else if (Info.Ctx.hasSameType(Field->getType(), Info.Ctx.getSizeType()))
50577c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith    // Length.
50587c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith    Result.getStructField(1) = APValue(APSInt(ArrayType->getSize()));
50597c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith  else
50607c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith    return Error(E);
50617c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith
50627c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith  if (++Field != Record->field_end())
50637c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith    return Error(E);
50647c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith
50657c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith  return true;
50667c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith}
50677c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith
5068180f47959a066795cc0f409433023af448bb0328Richard Smithstatic bool EvaluateRecord(const Expr *E, const LValue &This,
5069180f47959a066795cc0f409433023af448bb0328Richard Smith                           APValue &Result, EvalInfo &Info) {
5070180f47959a066795cc0f409433023af448bb0328Richard Smith  assert(E->isRValue() && E->getType()->isRecordType() &&
5071180f47959a066795cc0f409433023af448bb0328Richard Smith         "can't evaluate expression as a record rvalue");
5072180f47959a066795cc0f409433023af448bb0328Richard Smith  return RecordExprEvaluator(Info, This, Result).Visit(E);
5073180f47959a066795cc0f409433023af448bb0328Richard Smith}
5074180f47959a066795cc0f409433023af448bb0328Richard Smith
5075180f47959a066795cc0f409433023af448bb0328Richard Smith//===----------------------------------------------------------------------===//
5076e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith// Temporary Evaluation
5077e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith//
5078e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith// Temporaries are represented in the AST as rvalues, but generally behave like
5079e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith// lvalues. The full-object of which the temporary is a subobject is implicitly
5080e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith// materialized so that a reference can bind to it.
5081e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith//===----------------------------------------------------------------------===//
5082e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithnamespace {
5083e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithclass TemporaryExprEvaluator
5084e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  : public LValueExprEvaluatorBase<TemporaryExprEvaluator> {
5085e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithpublic:
5086e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  TemporaryExprEvaluator(EvalInfo &Info, LValue &Result) :
5087e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    LValueExprEvaluatorBaseTy(Info, Result) {}
5088e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
5089e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  /// Visit an expression which constructs the value of this temporary.
5090e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  bool VisitConstructExpr(const Expr *E) {
509183587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    Result.set(E, Info.CurrentCall->Index);
509203ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    return EvaluateInPlace(Info.CurrentCall->createTemporary(E, false),
509303ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith                           Info, Result, E);
5094e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  }
5095e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
5096e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  bool VisitCastExpr(const CastExpr *E) {
5097e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    switch (E->getCastKind()) {
5098e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    default:
5099e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      return LValueExprEvaluatorBaseTy::VisitCastExpr(E);
5100e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
5101e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    case CK_ConstructorConversion:
5102e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      return VisitConstructExpr(E->getSubExpr());
5103e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    }
5104e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  }
5105e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  bool VisitInitListExpr(const InitListExpr *E) {
5106e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    return VisitConstructExpr(E);
5107e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  }
5108e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  bool VisitCXXConstructExpr(const CXXConstructExpr *E) {
5109e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    return VisitConstructExpr(E);
5110e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  }
5111e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  bool VisitCallExpr(const CallExpr *E) {
5112e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    return VisitConstructExpr(E);
5113e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  }
5114e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith};
5115e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} // end anonymous namespace
5116e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
5117e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// Evaluate an expression of record type as a temporary.
5118e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstatic bool EvaluateTemporary(const Expr *E, LValue &Result, EvalInfo &Info) {
5119af2c7a194592401394233b7cbcdd3cfd0a7a38ddRichard Smith  assert(E->isRValue() && E->getType()->isRecordType());
5120e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  return TemporaryExprEvaluator(Info, Result).Visit(E);
5121e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith}
5122e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
5123e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith//===----------------------------------------------------------------------===//
512459b5da6d853b4368b984700315adf7b37de05764Nate Begeman// Vector Evaluation
512559b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===//
512659b5da6d853b4368b984700315adf7b37de05764Nate Begeman
512759b5da6d853b4368b984700315adf7b37de05764Nate Begemannamespace {
5128770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramer  class VectorExprEvaluator
512907fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith  : public ExprEvaluatorBase<VectorExprEvaluator, bool> {
513007fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    APValue &Result;
513159b5da6d853b4368b984700315adf7b37de05764Nate Begeman  public:
51321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
513307fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    VectorExprEvaluator(EvalInfo &info, APValue &Result)
513407fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith      : ExprEvaluatorBaseTy(info), Result(Result) {}
51351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
513607fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    bool Success(const ArrayRef<APValue> &V, const Expr *E) {
513707fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith      assert(V.size() == E->getType()->castAs<VectorType>()->getNumElements());
513807fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith      // FIXME: remove this APValue copy.
513907fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith      Result = APValue(V.data(), V.size());
514007fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith      return true;
514107fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    }
51421aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith    bool Success(const APValue &V, const Expr *E) {
514369c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith      assert(V.isVector());
514407fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith      Result = V;
514507fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith      return true;
514607fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    }
514751201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    bool ZeroInitialization(const Expr *E);
51481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
514907fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    bool VisitUnaryReal(const UnaryOperator *E)
515091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      { return Visit(E->getSubExpr()); }
515107fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    bool VisitCastExpr(const CastExpr* E);
515207fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    bool VisitInitListExpr(const InitListExpr *E);
515307fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    bool VisitUnaryImag(const UnaryOperator *E);
515491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    // FIXME: Missing: unary -, unary ~, binary add/sub/mul/div,
51552217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman    //                 binary comparisons, binary and/or/xor,
515691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    //                 shufflevector, ExtVectorElementExpr
515759b5da6d853b4368b984700315adf7b37de05764Nate Begeman  };
515859b5da6d853b4368b984700315adf7b37de05764Nate Begeman} // end anonymous namespace
515959b5da6d853b4368b984700315adf7b37de05764Nate Begeman
516059b5da6d853b4368b984700315adf7b37de05764Nate Begemanstatic bool EvaluateVector(const Expr* E, APValue& Result, EvalInfo &Info) {
5161c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  assert(E->isRValue() && E->getType()->isVectorType() &&"not a vector rvalue");
516207fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith  return VectorExprEvaluator(Info, Result).Visit(E);
516359b5da6d853b4368b984700315adf7b37de05764Nate Begeman}
516459b5da6d853b4368b984700315adf7b37de05764Nate Begeman
516507fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smithbool VectorExprEvaluator::VisitCastExpr(const CastExpr* E) {
516607fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith  const VectorType *VTy = E->getType()->castAs<VectorType>();
5167c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  unsigned NElts = VTy->getNumElements();
51681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5169d62ca370b03b8c6ad58002d3399383baf744e32bRichard Smith  const Expr *SE = E->getSubExpr();
5170e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman  QualType SETy = SE->getType();
517159b5da6d853b4368b984700315adf7b37de05764Nate Begeman
517246a523285928aa07bf14803178dc04616ac85994Eli Friedman  switch (E->getCastKind()) {
517346a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_VectorSplat: {
517407fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    APValue Val = APValue();
517546a523285928aa07bf14803178dc04616ac85994Eli Friedman    if (SETy->isIntegerType()) {
517646a523285928aa07bf14803178dc04616ac85994Eli Friedman      APSInt IntResult;
517746a523285928aa07bf14803178dc04616ac85994Eli Friedman      if (!EvaluateInteger(SE, IntResult, Info))
5178f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith         return false;
517907fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith      Val = APValue(IntResult);
518046a523285928aa07bf14803178dc04616ac85994Eli Friedman    } else if (SETy->isRealFloatingType()) {
518146a523285928aa07bf14803178dc04616ac85994Eli Friedman       APFloat F(0.0);
518246a523285928aa07bf14803178dc04616ac85994Eli Friedman       if (!EvaluateFloat(SE, F, Info))
5183f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith         return false;
518407fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith       Val = APValue(F);
518546a523285928aa07bf14803178dc04616ac85994Eli Friedman    } else {
518607fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith      return Error(E);
518746a523285928aa07bf14803178dc04616ac85994Eli Friedman    }
5188c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman
5189c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    // Splat and create vector APValue.
519007fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    SmallVector<APValue, 4> Elts(NElts, Val);
519107fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith    return Success(Elts, E);
5192e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman  }
5193e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman  case CK_BitCast: {
5194e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman    // Evaluate the operand into an APInt we can extract from.
5195e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman    llvm::APInt SValInt;
5196e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman    if (!EvalAndBitcastToAPInt(Info, SE, SValInt))
5197e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman      return false;
5198e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman    // Extract the elements
5199e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman    QualType EltTy = VTy->getElementType();
5200e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman    unsigned EltSize = Info.Ctx.getTypeSize(EltTy);
5201e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman    bool BigEndian = Info.Ctx.getTargetInfo().isBigEndian();
5202e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman    SmallVector<APValue, 4> Elts;
5203e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman    if (EltTy->isRealFloatingType()) {
5204e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman      const llvm::fltSemantics &Sem = Info.Ctx.getFloatTypeSemantics(EltTy);
5205e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman      unsigned FloatEltSize = EltSize;
5206e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman      if (&Sem == &APFloat::x87DoubleExtended)
5207e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman        FloatEltSize = 80;
5208e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman      for (unsigned i = 0; i < NElts; i++) {
5209e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman        llvm::APInt Elt;
5210e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman        if (BigEndian)
5211e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman          Elt = SValInt.rotl(i*EltSize+FloatEltSize).trunc(FloatEltSize);
5212e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman        else
5213e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman          Elt = SValInt.rotr(i*EltSize).trunc(FloatEltSize);
52149ec55f24b8f848bb37a9971100cf2fca379d5572Tim Northover        Elts.push_back(APValue(APFloat(Sem, Elt)));
5215e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman      }
5216e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman    } else if (EltTy->isIntegerType()) {
5217e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman      for (unsigned i = 0; i < NElts; i++) {
5218e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman        llvm::APInt Elt;
5219e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman        if (BigEndian)
5220e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman          Elt = SValInt.rotl(i*EltSize+EltSize).zextOrTrunc(EltSize);
5221e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman        else
5222e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman          Elt = SValInt.rotr(i*EltSize).zextOrTrunc(EltSize);
5223e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman        Elts.push_back(APValue(APSInt(Elt, EltTy->isSignedIntegerType())));
5224e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman      }
5225e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman    } else {
5226e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman      return Error(E);
5227e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman    }
5228e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman    return Success(Elts, E);
5229e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman  }
523046a523285928aa07bf14803178dc04616ac85994Eli Friedman  default:
5231c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return ExprEvaluatorBaseTy::VisitCastExpr(E);
5232c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  }
523359b5da6d853b4368b984700315adf7b37de05764Nate Begeman}
523459b5da6d853b4368b984700315adf7b37de05764Nate Begeman
523507fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smithbool
523659b5da6d853b4368b984700315adf7b37de05764Nate BegemanVectorExprEvaluator::VisitInitListExpr(const InitListExpr *E) {
523707fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith  const VectorType *VT = E->getType()->castAs<VectorType>();
523859b5da6d853b4368b984700315adf7b37de05764Nate Begeman  unsigned NumInits = E->getNumInits();
523991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  unsigned NumElements = VT->getNumElements();
52401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
524159b5da6d853b4368b984700315adf7b37de05764Nate Begeman  QualType EltTy = VT->getElementType();
52425f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<APValue, 4> Elements;
524359b5da6d853b4368b984700315adf7b37de05764Nate Begeman
52443edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman  // The number of initializers can be less than the number of
52453edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman  // vector elements. For OpenCL, this can be due to nested vector
52463edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman  // initialization. For GCC compatibility, missing trailing elements
52473edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman  // should be initialized with zeroes.
52483edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman  unsigned CountInits = 0, CountElts = 0;
52493edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman  while (CountElts < NumElements) {
52503edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman    // Handle nested vector initialization.
52513edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman    if (CountInits < NumInits
52523edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman        && E->getInit(CountInits)->getType()->isExtVectorType()) {
52533edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman      APValue v;
52543edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman      if (!EvaluateVector(E->getInit(CountInits), v, Info))
52553edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman        return Error(E);
52563edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman      unsigned vlen = v.getVectorLength();
52573edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman      for (unsigned j = 0; j < vlen; j++)
52583edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman        Elements.push_back(v.getVectorElt(j));
52593edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman      CountElts += vlen;
52603edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman    } else if (EltTy->isIntegerType()) {
526159b5da6d853b4368b984700315adf7b37de05764Nate Begeman      llvm::APSInt sInt(32);
52623edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman      if (CountInits < NumInits) {
52633edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman        if (!EvaluateInteger(E->getInit(CountInits), sInt, Info))
52644b1f684416980ef6f1a7cb9e6af9c4fa4a164617Richard Smith          return false;
52653edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman      } else // trailing integer zero.
52663edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman        sInt = Info.Ctx.MakeIntValue(0, EltTy);
52673edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman      Elements.push_back(APValue(sInt));
52683edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman      CountElts++;
526959b5da6d853b4368b984700315adf7b37de05764Nate Begeman    } else {
527059b5da6d853b4368b984700315adf7b37de05764Nate Begeman      llvm::APFloat f(0.0);
52713edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman      if (CountInits < NumInits) {
52723edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman        if (!EvaluateFloat(E->getInit(CountInits), f, Info))
52734b1f684416980ef6f1a7cb9e6af9c4fa4a164617Richard Smith          return false;
52743edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman      } else // trailing float zero.
52753edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman        f = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy));
52763edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman      Elements.push_back(APValue(f));
52773edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman      CountElts++;
527859b5da6d853b4368b984700315adf7b37de05764Nate Begeman    }
52793edd5a99332dd8ec94a545476dc3c9ed50dec78fEli Friedman    CountInits++;
528059b5da6d853b4368b984700315adf7b37de05764Nate Begeman  }
528107fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith  return Success(Elements, E);
528259b5da6d853b4368b984700315adf7b37de05764Nate Begeman}
528359b5da6d853b4368b984700315adf7b37de05764Nate Begeman
528407fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smithbool
528551201882382fb40c9456a06c7f93d6ddd4a57712Richard SmithVectorExprEvaluator::ZeroInitialization(const Expr *E) {
528607fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith  const VectorType *VT = E->getType()->getAs<VectorType>();
528791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  QualType EltTy = VT->getElementType();
528891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  APValue ZeroElement;
528991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  if (EltTy->isIntegerType())
529091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    ZeroElement = APValue(Info.Ctx.MakeIntValue(0, EltTy));
529191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  else
529291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    ZeroElement =
529391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman        APValue(APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy)));
529491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman
52955f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<APValue, 4> Elements(VT->getNumElements(), ZeroElement);
529607fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith  return Success(Elements, E);
529791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman}
529891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman
529907fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smithbool VectorExprEvaluator::VisitUnaryImag(const UnaryOperator *E) {
53008327fad71da34492d82c532f42a58cb4baff81a3Richard Smith  VisitIgnoredValue(E->getSubExpr());
530151201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  return ZeroInitialization(E);
530291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman}
530391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman
530459b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===//
5305cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith// Array Evaluation
5306cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith//===----------------------------------------------------------------------===//
5307cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith
5308cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smithnamespace {
5309cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  class ArrayExprEvaluator
5310cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  : public ExprEvaluatorBase<ArrayExprEvaluator, bool> {
5311180f47959a066795cc0f409433023af448bb0328Richard Smith    const LValue &This;
5312cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    APValue &Result;
5313cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  public:
5314cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith
5315180f47959a066795cc0f409433023af448bb0328Richard Smith    ArrayExprEvaluator(EvalInfo &Info, const LValue &This, APValue &Result)
5316180f47959a066795cc0f409433023af448bb0328Richard Smith      : ExprEvaluatorBaseTy(Info), This(This), Result(Result) {}
5317cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith
5318cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    bool Success(const APValue &V, const Expr *E) {
5319f3908f2ae111b1b12ade2524dda71c669ed6f121Richard Smith      assert((V.isArray() || V.isLValue()) &&
5320f3908f2ae111b1b12ade2524dda71c669ed6f121Richard Smith             "expected array or string literal");
5321cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith      Result = V;
5322cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith      return true;
5323cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    }
5324cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith
532551201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    bool ZeroInitialization(const Expr *E) {
5326180f47959a066795cc0f409433023af448bb0328Richard Smith      const ConstantArrayType *CAT =
5327180f47959a066795cc0f409433023af448bb0328Richard Smith          Info.Ctx.getAsConstantArrayType(E->getType());
5328180f47959a066795cc0f409433023af448bb0328Richard Smith      if (!CAT)
5329f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith        return Error(E);
5330180f47959a066795cc0f409433023af448bb0328Richard Smith
5331180f47959a066795cc0f409433023af448bb0328Richard Smith      Result = APValue(APValue::UninitArray(), 0,
5332180f47959a066795cc0f409433023af448bb0328Richard Smith                       CAT->getSize().getZExtValue());
5333180f47959a066795cc0f409433023af448bb0328Richard Smith      if (!Result.hasArrayFiller()) return true;
5334180f47959a066795cc0f409433023af448bb0328Richard Smith
533551201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith      // Zero-initialize all elements.
5336180f47959a066795cc0f409433023af448bb0328Richard Smith      LValue Subobject = This;
5337b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith      Subobject.addArray(Info, E, CAT);
5338180f47959a066795cc0f409433023af448bb0328Richard Smith      ImplicitValueInitExpr VIE(CAT->getElementType());
533983587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith      return EvaluateInPlace(Result.getArrayFiller(), Info, Subobject, &VIE);
5340180f47959a066795cc0f409433023af448bb0328Richard Smith    }
5341180f47959a066795cc0f409433023af448bb0328Richard Smith
5342cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith    bool VisitInitListExpr(const InitListExpr *E);
5343e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    bool VisitCXXConstructExpr(const CXXConstructExpr *E);
534499ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith    bool VisitCXXConstructExpr(const CXXConstructExpr *E,
534599ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith                               const LValue &Subobject,
534699ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith                               APValue *Value, QualType Type);
5347cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  };
5348cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith} // end anonymous namespace
5349cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith
5350180f47959a066795cc0f409433023af448bb0328Richard Smithstatic bool EvaluateArray(const Expr *E, const LValue &This,
5351180f47959a066795cc0f409433023af448bb0328Richard Smith                          APValue &Result, EvalInfo &Info) {
535251201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  assert(E->isRValue() && E->getType()->isArrayType() && "not an array rvalue");
5353180f47959a066795cc0f409433023af448bb0328Richard Smith  return ArrayExprEvaluator(Info, This, Result).Visit(E);
5354cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith}
5355cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith
5356cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smithbool ArrayExprEvaluator::VisitInitListExpr(const InitListExpr *E) {
5357cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType(E->getType());
5358cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith  if (!CAT)
5359f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return Error(E);
5360cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith
5361974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith  // C++11 [dcl.init.string]p1: A char array [...] can be initialized by [...]
5362974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith  // an appropriately-typed string literal enclosed in braces.
5363fe587201feaebc69e6d18858bea85c77926b6ecfRichard Smith  if (E->isStringLiteralInit()) {
5364974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith    LValue LV;
5365974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith    if (!EvaluateLValue(E->getInit(0), LV, Info))
5366974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith      return false;
53671aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith    APValue Val;
5368f3908f2ae111b1b12ade2524dda71c669ed6f121Richard Smith    LV.moveInto(Val);
5369f3908f2ae111b1b12ade2524dda71c669ed6f121Richard Smith    return Success(Val, E);
5370974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith  }
5371974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith
5372745f5147e065900267c85a5568785a1991d4838fRichard Smith  bool Success = true;
5373745f5147e065900267c85a5568785a1991d4838fRichard Smith
5374de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smith  assert((!Result.isArray() || Result.getArrayInitializedElts() == 0) &&
5375de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smith         "zero-initialized array shouldn't have any initialized elts");
5376de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smith  APValue Filler;
5377de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smith  if (Result.isArray() && Result.hasArrayFiller())
5378de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smith    Filler = Result.getArrayFiller();
5379de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smith
538099ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith  unsigned NumEltsToInit = E->getNumInits();
538199ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith  unsigned NumElts = CAT->getSize().getZExtValue();
538299ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith  const Expr *FillerExpr = E->hasArrayFiller() ? E->getArrayFiller() : 0;
538399ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith
538499ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith  // If the initializer might depend on the array index, run it for each
538599ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith  // array element. For now, just whitelist non-class value-initialization.
538699ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith  if (NumEltsToInit != NumElts && !isa<ImplicitValueInitExpr>(FillerExpr))
538799ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith    NumEltsToInit = NumElts;
538899ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith
538999ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith  Result = APValue(APValue::UninitArray(), NumEltsToInit, NumElts);
5390de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smith
5391de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smith  // If the array was previously zero-initialized, preserve the
5392de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smith  // zero-initialized values.
5393de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smith  if (!Filler.isUninit()) {
5394de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smith    for (unsigned I = 0, E = Result.getArrayInitializedElts(); I != E; ++I)
5395de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smith      Result.getArrayInitializedElt(I) = Filler;
5396de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smith    if (Result.hasArrayFiller())
5397de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smith      Result.getArrayFiller() = Filler;
5398de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smith  }
5399de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smith
5400180f47959a066795cc0f409433023af448bb0328Richard Smith  LValue Subobject = This;
5401b4e85ed51905fc94378d7b4ff62b06e0d08042b7Richard Smith  Subobject.addArray(Info, E, CAT);
540299ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith  for (unsigned Index = 0; Index != NumEltsToInit; ++Index) {
540399ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith    const Expr *Init =
540499ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith        Index < E->getNumInits() ? E->getInit(Index) : FillerExpr;
540583587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    if (!EvaluateInPlace(Result.getArrayInitializedElt(Index),
540699ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith                         Info, Subobject, Init) ||
540799ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith        !HandleLValueArrayAdjustment(Info, Init, Subobject,
5408745f5147e065900267c85a5568785a1991d4838fRichard Smith                                     CAT->getElementType(), 1)) {
5409745f5147e065900267c85a5568785a1991d4838fRichard Smith      if (!Info.keepEvaluatingAfterFailure())
5410745f5147e065900267c85a5568785a1991d4838fRichard Smith        return false;
5411745f5147e065900267c85a5568785a1991d4838fRichard Smith      Success = false;
5412745f5147e065900267c85a5568785a1991d4838fRichard Smith    }
5413180f47959a066795cc0f409433023af448bb0328Richard Smith  }
5414cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith
541599ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith  if (!Result.hasArrayFiller())
541699ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith    return Success;
541799ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith
541899ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith  // If we get here, we have a trivial filler, which we can just evaluate
541999ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith  // once and splat over the rest of the array elements.
542099ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith  assert(FillerExpr && "no array filler for incomplete init list");
542199ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith  return EvaluateInPlace(Result.getArrayFiller(), Info, Subobject,
542299ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith                         FillerExpr) && Success;
5423cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith}
5424cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith
5425e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithbool ArrayExprEvaluator::VisitCXXConstructExpr(const CXXConstructExpr *E) {
542699ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith  return VisitCXXConstructExpr(E, This, &Result, E->getType());
542799ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith}
5428de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smith
542999ad35921aa6c1b200b6432c066961f930fce1e1Richard Smithbool ArrayExprEvaluator::VisitCXXConstructExpr(const CXXConstructExpr *E,
543099ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith                                               const LValue &Subobject,
543199ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith                                               APValue *Value,
543299ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith                                               QualType Type) {
543399ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith  bool HadZeroInit = !Value->isUninit();
543499ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith
543599ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith  if (const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType(Type)) {
543699ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith    unsigned N = CAT->getSize().getZExtValue();
543799ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith
543899ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith    // Preserve the array filler if we had prior zero-initialization.
543999ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith    APValue Filler =
544099ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith      HadZeroInit && Value->hasArrayFiller() ? Value->getArrayFiller()
544199ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith                                             : APValue();
544299ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith
544399ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith    *Value = APValue(APValue::UninitArray(), N, N);
544499ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith
544599ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith    if (HadZeroInit)
544699ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith      for (unsigned I = 0; I != N; ++I)
544799ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith        Value->getArrayInitializedElt(I) = Filler;
544899ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith
544999ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith    // Initialize the elements.
545099ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith    LValue ArrayElt = Subobject;
545199ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith    ArrayElt.addArray(Info, E, CAT);
545299ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith    for (unsigned I = 0; I != N; ++I)
545399ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith      if (!VisitCXXConstructExpr(E, ArrayElt, &Value->getArrayInitializedElt(I),
545499ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith                                 CAT->getElementType()) ||
545599ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith          !HandleLValueArrayAdjustment(Info, E, ArrayElt,
545699ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith                                       CAT->getElementType(), 1))
545799ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith        return false;
545899ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith
545999ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith    return true;
5460de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smith  }
5461e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
546299ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith  if (!Type->isRecordType())
5463a4334dffde250c22c339a974a7131914fe723180Richard Smith    return Error(E);
5464a4334dffde250c22c339a974a7131914fe723180Richard Smith
5465e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  const CXXConstructorDecl *FD = E->getConstructor();
54666180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
546751201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  bool ZeroInit = E->requiresZeroInitialization();
546851201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  if (CheckTrivialDefaultConstructor(Info, E->getExprLoc(), FD, ZeroInit)) {
5469ec789163a42a7be654ac34aadb750b508954d53cRichard Smith    if (HadZeroInit)
5470ec789163a42a7be654ac34aadb750b508954d53cRichard Smith      return true;
5471ec789163a42a7be654ac34aadb750b508954d53cRichard Smith
547251201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    if (ZeroInit) {
547399ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith      ImplicitValueInitExpr VIE(Type);
5474de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smith      return EvaluateInPlace(*Value, Info, Subobject, &VIE);
547551201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    }
547651201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith
54776180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith    const CXXRecordDecl *RD = FD->getParent();
54786180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith    if (RD->isUnion())
5479de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smith      *Value = APValue((FieldDecl*)0);
54806180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith    else
5481de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smith      *Value =
54826180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith          APValue(APValue::UninitStruct(), RD->getNumBases(),
54836180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith                  std::distance(RD->field_begin(), RD->field_end()));
54846180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith    return true;
54856180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  }
54866180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
5487e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  const FunctionDecl *Definition = 0;
5488e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  FD->getBody(Definition);
5489e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
5490c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith  if (!CheckConstexprFunction(Info, E->getExprLoc(), FD, Definition))
5491c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    return false;
5492e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
5493ec789163a42a7be654ac34aadb750b508954d53cRichard Smith  if (ZeroInit && !HadZeroInit) {
549499ad35921aa6c1b200b6432c066961f930fce1e1Richard Smith    ImplicitValueInitExpr VIE(Type);
5495de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smith    if (!EvaluateInPlace(*Value, Info, Subobject, &VIE))
549651201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith      return false;
549751201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  }
549851201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith
5499cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko  ArrayRef<const Expr *> Args(E->getArgs(), E->getNumArgs());
5500745f5147e065900267c85a5568785a1991d4838fRichard Smith  return HandleConstructorCall(E->getExprLoc(), Subobject, Args,
5501e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith                               cast<CXXConstructorDecl>(Definition),
5502de31aa7f0ef71f5c162372e319cbc03c0924f074Richard Smith                               Info, *Value);
5503e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith}
5504e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith
5505cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith//===----------------------------------------------------------------------===//
5506f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Integer Evaluation
5507c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith//
5508c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// As a GNU extension, we support casting pointers to sufficiently-wide integer
5509c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// types and back in constant folding. Integer values are thus represented
5510c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// either as an integer-valued APValue, or as an lvalue-valued APValue.
5511f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
5512f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
5513f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnernamespace {
5514770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass IntExprEvaluator
55158cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  : public ExprEvaluatorBase<IntExprEvaluator, bool> {
55161aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith  APValue &Result;
5517f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerpublic:
55181aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith  IntExprEvaluator(EvalInfo &info, APValue &result)
55198cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    : ExprEvaluatorBaseTy(info), Result(result) {}
5520f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
5521cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  bool Success(const llvm::APSInt &SI, const Expr *E, APValue &Result) {
5522973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara    assert(E->getType()->isIntegralOrEnumerationType() &&
55232ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor           "Invalid evaluation result.");
5524973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara    assert(SI.isSigned() == E->getType()->isSignedIntegerOrEnumerationType() &&
55253f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar           "Invalid evaluation result.");
5526973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara    assert(SI.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) &&
55273f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar           "Invalid evaluation result.");
55281aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith    Result = APValue(SI);
55293f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    return true;
55303f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  }
5531cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  bool Success(const llvm::APSInt &SI, const Expr *E) {
5532cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    return Success(SI, E, Result);
5533cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  }
55343f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar
5535cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  bool Success(const llvm::APInt &I, const Expr *E, APValue &Result) {
55362ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor    assert(E->getType()->isIntegralOrEnumerationType() &&
55372ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor           "Invalid evaluation result.");
553830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    assert(I.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) &&
55393f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar           "Invalid evaluation result.");
55401aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith    Result = APValue(APSInt(I));
5541575a1c9dc8dc5b4977194993e289f9eda7295c39Douglas Gregor    Result.getInt().setIsUnsigned(
5542575a1c9dc8dc5b4977194993e289f9eda7295c39Douglas Gregor                            E->getType()->isUnsignedIntegerOrEnumerationType());
5543131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return true;
5544131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  }
5545cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  bool Success(const llvm::APInt &I, const Expr *E) {
5546cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    return Success(I, E, Result);
5547cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  }
5548131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar
5549cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  bool Success(uint64_t Value, const Expr *E, APValue &Result) {
55502ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor    assert(E->getType()->isIntegralOrEnumerationType() &&
55512ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor           "Invalid evaluation result.");
55521aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith    Result = APValue(Info.Ctx.MakeIntValue(Value, E->getType()));
5553131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return true;
5554131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  }
5555cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  bool Success(uint64_t Value, const Expr *E) {
5556cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    return Success(Value, E, Result);
5557cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  }
5558131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar
55594f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck  bool Success(CharUnits Size, const Expr *E) {
55604f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck    return Success(Size.getQuantity(), E);
55614f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck  }
55624f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck
55631aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith  bool Success(const APValue &V, const Expr *E) {
55645930a4c5224eea3b0558655f7f8c9ea027ef573eEli Friedman    if (V.isLValue() || V.isAddrLabelDiff()) {
5565342f1f8b0a402c5a7f8c5055db7f60a7808f1687Richard Smith      Result = V;
5566342f1f8b0a402c5a7f8c5055db7f60a7808f1687Richard Smith      return true;
5567342f1f8b0a402c5a7f8c5055db7f60a7808f1687Richard Smith    }
55688cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    return Success(V.getInt(), E);
556932fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner  }
55701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
557151201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  bool ZeroInitialization(const Expr *E) { return Success(0, E); }
5572f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith
55738cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  //===--------------------------------------------------------------------===//
55748cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  //                            Visitor Methods
55758cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  //===--------------------------------------------------------------------===//
5576f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
55774c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitIntegerLiteral(const IntegerLiteral *E) {
5578131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(E->getValue(), E);
55794c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  }
55804c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitCharacterLiteral(const CharacterLiteral *E) {
5581131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(E->getValue(), E);
55824c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  }
5583043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman
5584043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman  bool CheckReferencedDecl(const Expr *E, const Decl *D);
5585043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman  bool VisitDeclRefExpr(const DeclRefExpr *E) {
55868cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    if (CheckReferencedDecl(E, E->getDecl()))
55878cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne      return true;
55888cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
55898cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    return ExprEvaluatorBaseTy::VisitDeclRefExpr(E);
5590043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman  }
5591043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman  bool VisitMemberExpr(const MemberExpr *E) {
5592043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman    if (CheckReferencedDecl(E, E->getMemberDecl())) {
5593c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith      VisitIgnoredValue(E->getBase());
5594043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman      return true;
5595043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman    }
55968cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
55978cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    return ExprEvaluatorBaseTy::VisitMemberExpr(E);
5598043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman  }
5599043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman
56008cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitCallExpr(const CallExpr *E);
5601b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  bool VisitBinaryOperator(const BinaryOperator *E);
56028ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  bool VisitOffsetOfExpr(const OffsetOfExpr *E);
5603b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  bool VisitUnaryOperator(const UnaryOperator *E);
5604f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
56058cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitCastExpr(const CastExpr* E);
5606f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  bool VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *E);
56070518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl
56083068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  bool VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) {
5609131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(E->getValue(), E);
56103068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  }
56111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5612ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  bool VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *E) {
5613ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    return Success(E->getValue(), E);
5614ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  }
5615ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
5616f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith  // Note, GNU defines __null as an integer, not a pointer.
56173f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson  bool VisitGNUNullExpr(const GNUNullExpr *E) {
561851201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    return ZeroInitialization(E);
5619664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman  }
5620664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman
562164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  bool VisitUnaryTypeTraitExpr(const UnaryTypeTraitExpr *E) {
56220dfd848fa4c9664852ba8c929a8bd3fce93ddca2Sebastian Redl    return Success(E->getValue(), E);
562364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  }
562464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl
56256ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  bool VisitBinaryTypeTraitExpr(const BinaryTypeTraitExpr *E) {
56266ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet    return Success(E->getValue(), E);
56276ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  }
56286ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet
56294ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  bool VisitTypeTraitExpr(const TypeTraitExpr *E) {
56304ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor    return Success(E->getValue(), E);
56314ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  }
56324ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor
563321ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  bool VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *E) {
563421ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley    return Success(E->getValue(), E);
563521ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  }
563621ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley
5637552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  bool VisitExpressionTraitExpr(const ExpressionTraitExpr *E) {
5638552622067dc45013d240f73952fece703f5e63bdJohn Wiegley    return Success(E->getValue(), E);
5639552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  }
5640552622067dc45013d240f73952fece703f5e63bdJohn Wiegley
5641722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  bool VisitUnaryReal(const UnaryOperator *E);
5642664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman  bool VisitUnaryImag(const UnaryOperator *E);
5643664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman
5644295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  bool VisitCXXNoexceptExpr(const CXXNoexceptExpr *E);
5645ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  bool VisitSizeOfPackExpr(const SizeOfPackExpr *E);
5646cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl
5647fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattnerprivate:
56488b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck  CharUnits GetAlignOfExpr(const Expr *E);
56498b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck  CharUnits GetAlignOfType(QualType T);
56501bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith  static QualType GetObjectType(APValue::LValueBase B);
56518cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool TryEvaluateBuiltinObjectSize(const CallExpr *E);
5652664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman  // FIXME: Missing: array subscript of vector, member of vector
5653f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner};
5654f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace
5655f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
5656c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// EvaluateIntegerOrLValue - Evaluate an rvalue integral-typed expression, and
5657c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// produce either the integer value or a pointer.
5658c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith///
5659c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// GCC has a heinous extension which folds casts between pointer types and
5660c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// pointer-sized integral types. We support this by allowing the evaluation of
5661c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// an integer rvalue to produce a pointer (represented as an lvalue) instead.
5662c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// Some simple arithmetic on such values is supported (they are treated much
5663c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// like char*).
56641aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smithstatic bool EvaluateIntegerOrLValue(const Expr *E, APValue &Result,
566547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith                                    EvalInfo &Info) {
5666c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  assert(E->isRValue() && E->getType()->isIntegralOrEnumerationType());
56678cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  return IntExprEvaluator(Info, Result).Visit(E);
566869ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar}
566969ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar
5670f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithstatic bool EvaluateInteger(const Expr *E, APSInt &Result, EvalInfo &Info) {
56711aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith  APValue Val;
5672f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  if (!EvaluateIntegerOrLValue(E, Val, Info))
5673f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return false;
5674f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  if (!Val.isInt()) {
5675f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    // FIXME: It would be better to produce the diagnostic for casting
5676f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    //        a pointer to an integer.
56775cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith    Info.Diag(E, diag::note_invalid_subexpr_in_const_expr);
567830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return false;
5679f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  }
568030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  Result = Val.getInt();
568130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  return true;
5682f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner}
5683f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
5684f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith/// Check whether the given declaration can be directly converted to an integral
5685f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith/// rvalue. If not, no diagnostic is produced; there are other things we can
5686f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith/// try.
5687043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedmanbool IntExprEvaluator::CheckReferencedDecl(const Expr* E, const Decl* D) {
56884c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  // Enums are integer constant exprs.
5689bfbdcd861a4364bfc21a9e5047bdbd56812d6693Abramo Bagnara  if (const EnumConstantDecl *ECD = dyn_cast<EnumConstantDecl>(D)) {
5690973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara    // Check for signedness/width mismatches between E type and ECD value.
5691973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara    bool SameSign = (ECD->getInitVal().isSigned()
5692973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara                     == E->getType()->isSignedIntegerOrEnumerationType());
5693973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara    bool SameWidth = (ECD->getInitVal().getBitWidth()
5694973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara                      == Info.Ctx.getIntWidth(E->getType()));
5695973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara    if (SameSign && SameWidth)
5696973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara      return Success(ECD->getInitVal(), E);
5697973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara    else {
5698973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara      // Get rid of mismatch (otherwise Success assertions will fail)
5699973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara      // by computing a new value matching the type of E.
5700973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara      llvm::APSInt Val = ECD->getInitVal();
5701973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara      if (!SameSign)
5702973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara        Val.setIsSigned(!ECD->getInitVal().isSigned());
5703973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara      if (!SameWidth)
5704973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara        Val = Val.extOrTrunc(Info.Ctx.getIntWidth(E->getType()));
5705973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara      return Success(Val, E);
5706973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara    }
5707bfbdcd861a4364bfc21a9e5047bdbd56812d6693Abramo Bagnara  }
57088cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  return false;
57094c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner}
57104c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner
5711a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way
5712a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// as GCC.
5713a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattnerstatic int EvaluateBuiltinClassifyType(const CallExpr *E) {
5714a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  // The following enum mimics the values returned by GCC.
57157c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  // FIXME: Does GCC differ between lvalue and rvalue references here?
5716a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  enum gcc_type_class {
5717a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    no_type_class = -1,
5718a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    void_type_class, integer_type_class, char_type_class,
5719a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    enumeral_type_class, boolean_type_class,
5720a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    pointer_type_class, reference_type_class, offset_type_class,
5721a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    real_type_class, complex_type_class,
5722a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    function_type_class, method_type_class,
5723a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    record_type_class, union_type_class,
5724a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    array_type_class, string_type_class,
5725a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    lang_type_class
5726a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  };
57271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
57281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // If no argument was supplied, default to "no_type_class". This isn't
5729a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  // ideal, however it is what gcc does.
5730a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  if (E->getNumArgs() == 0)
5731a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return no_type_class;
57321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5733a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  QualType ArgTy = E->getArg(0)->getType();
5734a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  if (ArgTy->isVoidType())
5735a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return void_type_class;
5736a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isEnumeralType())
5737a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return enumeral_type_class;
5738a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isBooleanType())
5739a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return boolean_type_class;
5740a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isCharType())
5741a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return string_type_class; // gcc doesn't appear to use char_type_class
5742a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isIntegerType())
5743a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return integer_type_class;
5744a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isPointerType())
5745a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return pointer_type_class;
5746a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isReferenceType())
5747a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return reference_type_class;
5748a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isRealType())
5749a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return real_type_class;
5750a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isComplexType())
5751a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return complex_type_class;
5752a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isFunctionType())
5753a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return function_type_class;
5754fb87b89fc9eb103e19fb8e4b925c23f0bd091b99Douglas Gregor  else if (ArgTy->isStructureOrClassType())
5755a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return record_type_class;
5756a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isUnionType())
5757a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return union_type_class;
5758a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isArrayType())
5759a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return array_type_class;
5760a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isUnionType())
5761a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return union_type_class;
5762a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else  // FIXME: offset_type_class, method_type_class, & lang_type_class?
5763b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("CallExpr::isBuiltinClassifyType(): unimplemented type");
5764a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner}
5765a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner
576680d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith/// EvaluateBuiltinConstantPForLValue - Determine the result of
576780d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith/// __builtin_constant_p when applied to the given lvalue.
576880d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith///
576980d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith/// An lvalue is only "constant" if it is a pointer or reference to the first
577080d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith/// character of a string literal.
577180d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smithtemplate<typename LValue>
577280d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smithstatic bool EvaluateBuiltinConstantPForLValue(const LValue &LV) {
57738e55ed1ad3acf9c7f8424aa7d326b3b2c18e943bDouglas Gregor  const Expr *E = LV.getLValueBase().template dyn_cast<const Expr*>();
577480d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith  return E && isa<StringLiteral>(E) && LV.getLValueOffset().isZero();
577580d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith}
577680d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith
577780d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith/// EvaluateBuiltinConstantP - Evaluate __builtin_constant_p as similarly to
577880d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith/// GCC as we can manage.
577980d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smithstatic bool EvaluateBuiltinConstantP(ASTContext &Ctx, const Expr *Arg) {
578080d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith  QualType ArgType = Arg->getType();
578180d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith
578280d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith  // __builtin_constant_p always has one operand. The rules which gcc follows
578380d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith  // are not precisely documented, but are as follows:
578480d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith  //
578580d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith  //  - If the operand is of integral, floating, complex or enumeration type,
578680d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith  //    and can be folded to a known value of that type, it returns 1.
578780d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith  //  - If the operand and can be folded to a pointer to the first character
578880d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith  //    of a string literal (or such a pointer cast to an integral type), it
578980d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith  //    returns 1.
579080d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith  //
579180d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith  // Otherwise, it returns 0.
579280d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith  //
579380d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith  // FIXME: GCC also intends to return 1 for literals of aggregate types, but
579480d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith  // its support for this does not currently work.
579580d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith  if (ArgType->isIntegralOrEnumerationType()) {
579680d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith    Expr::EvalResult Result;
579780d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith    if (!Arg->EvaluateAsRValue(Result, Ctx) || Result.HasSideEffects)
579880d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith      return false;
579980d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith
580080d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith    APValue &V = Result.Val;
580180d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith    if (V.getKind() == APValue::Int)
580280d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith      return true;
580380d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith
580480d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith    return EvaluateBuiltinConstantPForLValue(V);
580580d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith  } else if (ArgType->isFloatingType() || ArgType->isAnyComplexType()) {
580680d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith    return Arg->isEvaluatable(Ctx);
580780d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith  } else if (ArgType->isPointerType() || Arg->isGLValue()) {
580880d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith    LValue LV;
580980d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith    Expr::EvalStatus Status;
581080d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith    EvalInfo Info(Ctx, Status);
581180d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith    if ((Arg->isGLValue() ? EvaluateLValue(Arg, LV, Info)
581280d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith                          : EvaluatePointer(Arg, LV, Info)) &&
581380d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith        !Status.HasSideEffects)
581480d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith      return EvaluateBuiltinConstantPForLValue(LV);
581580d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith  }
581680d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith
581780d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith  // Anything else isn't considered to be sufficiently constant.
581880d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith  return false;
581980d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith}
582080d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith
582142c8f87eb60958170c46767273bf93e6c96125bfJohn McCall/// Retrieves the "underlying object type" of the given expression,
582242c8f87eb60958170c46767273bf93e6c96125bfJohn McCall/// as used by __builtin_object_size.
58231bf9a9e6a5bdc0de7939908855dcddf46b661800Richard SmithQualType IntExprEvaluator::GetObjectType(APValue::LValueBase B) {
58241bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith  if (const ValueDecl *D = B.dyn_cast<const ValueDecl*>()) {
58251bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith    if (const VarDecl *VD = dyn_cast<VarDecl>(D))
582642c8f87eb60958170c46767273bf93e6c96125bfJohn McCall      return VD->getType();
58271bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith  } else if (const Expr *E = B.get<const Expr*>()) {
58281bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith    if (isa<CompoundLiteralExpr>(E))
58291bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith      return E->getType();
583042c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  }
583142c8f87eb60958170c46767273bf93e6c96125bfJohn McCall
583242c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  return QualType();
583342c8f87eb60958170c46767273bf93e6c96125bfJohn McCall}
583442c8f87eb60958170c46767273bf93e6c96125bfJohn McCall
58358cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool IntExprEvaluator::TryEvaluateBuiltinObjectSize(const CallExpr *E) {
583642c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  LValue Base;
5837c6794850a570a91c5f224b6f0293db9f560f4213Richard Smith
5838c6794850a570a91c5f224b6f0293db9f560f4213Richard Smith  {
5839c6794850a570a91c5f224b6f0293db9f560f4213Richard Smith    // The operand of __builtin_object_size is never evaluated for side-effects.
5840c6794850a570a91c5f224b6f0293db9f560f4213Richard Smith    // If there are any, but we can determine the pointed-to object anyway, then
5841c6794850a570a91c5f224b6f0293db9f560f4213Richard Smith    // ignore the side-effects.
5842c6794850a570a91c5f224b6f0293db9f560f4213Richard Smith    SpeculativeEvaluationRAII SpeculativeEval(Info);
5843c6794850a570a91c5f224b6f0293db9f560f4213Richard Smith    if (!EvaluatePointer(E->getArg(0), Base, Info))
5844c6794850a570a91c5f224b6f0293db9f560f4213Richard Smith      return false;
5845c6794850a570a91c5f224b6f0293db9f560f4213Richard Smith  }
584642c8f87eb60958170c46767273bf93e6c96125bfJohn McCall
584742c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  // If we can prove the base is null, lower to zero now.
58481bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith  if (!Base.getLValueBase()) return Success(0, E);
584942c8f87eb60958170c46767273bf93e6c96125bfJohn McCall
58501bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith  QualType T = GetObjectType(Base.getLValueBase());
585142c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  if (T.isNull() ||
585242c8f87eb60958170c46767273bf93e6c96125bfJohn McCall      T->isIncompleteType() ||
58531357869bc5983cdfbc986db1f3d18265bb34cb0eEli Friedman      T->isFunctionType() ||
585442c8f87eb60958170c46767273bf93e6c96125bfJohn McCall      T->isVariablyModifiedType() ||
585542c8f87eb60958170c46767273bf93e6c96125bfJohn McCall      T->isDependentType())
5856f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return Error(E);
585742c8f87eb60958170c46767273bf93e6c96125bfJohn McCall
585842c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  CharUnits Size = Info.Ctx.getTypeSizeInChars(T);
585942c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  CharUnits Offset = Base.getLValueOffset();
586042c8f87eb60958170c46767273bf93e6c96125bfJohn McCall
586142c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  if (!Offset.isNegative() && Offset <= Size)
586242c8f87eb60958170c46767273bf93e6c96125bfJohn McCall    Size -= Offset;
586342c8f87eb60958170c46767273bf93e6c96125bfJohn McCall  else
586442c8f87eb60958170c46767273bf93e6c96125bfJohn McCall    Size = CharUnits::Zero();
58654f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck  return Success(Size, E);
586642c8f87eb60958170c46767273bf93e6c96125bfJohn McCall}
586742c8f87eb60958170c46767273bf93e6c96125bfJohn McCall
58688cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool IntExprEvaluator::VisitCallExpr(const CallExpr *E) {
58692c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith  switch (unsigned BuiltinOp = E->isBuiltinCall()) {
5870019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  default:
58718cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    return ExprEvaluatorBaseTy::VisitCallExpr(E);
587264eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump
587364eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump  case Builtin::BI__builtin_object_size: {
587442c8f87eb60958170c46767273bf93e6c96125bfJohn McCall    if (TryEvaluateBuiltinObjectSize(E))
587542c8f87eb60958170c46767273bf93e6c96125bfJohn McCall      return true;
587664eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump
58778ae4ec28451a16a57718286da3e476fc2f495c3fRichard Smith    // If evaluating the argument has side-effects, we can't determine the size
58788ae4ec28451a16a57718286da3e476fc2f495c3fRichard Smith    // of the object, and so we lower it to unknown now. CodeGen relies on us to
58798ae4ec28451a16a57718286da3e476fc2f495c3fRichard Smith    // handle all cases where the expression has side-effects.
5880393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian    if (E->getArg(0)->HasSideEffects(Info.Ctx)) {
5881a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith      if (E->getArg(1)->EvaluateKnownConstInt(Info.Ctx).getZExtValue() <= 1)
5882cf184655319cf7a5b811067cff9d26a5741fd161Chris Lattner        return Success(-1ULL, E);
588364eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump      return Success(0, E);
588464eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump    }
5885c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump
5886c6794850a570a91c5f224b6f0293db9f560f4213Richard Smith    // Expression had no side effects, but we couldn't statically determine the
5887c6794850a570a91c5f224b6f0293db9f560f4213Richard Smith    // size of the referenced object.
5888f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return Error(E);
588964eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump  }
589064eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump
5891d190057934331390ff67ebf51d66186dd5e392f0Benjamin Kramer  case Builtin::BI__builtin_bswap16:
589270d38f3179251bb3e7253a52bf54f8fa2314590aRichard Smith  case Builtin::BI__builtin_bswap32:
589370d38f3179251bb3e7253a52bf54f8fa2314590aRichard Smith  case Builtin::BI__builtin_bswap64: {
589470d38f3179251bb3e7253a52bf54f8fa2314590aRichard Smith    APSInt Val;
589570d38f3179251bb3e7253a52bf54f8fa2314590aRichard Smith    if (!EvaluateInteger(E->getArg(0), Val, Info))
589670d38f3179251bb3e7253a52bf54f8fa2314590aRichard Smith      return false;
589770d38f3179251bb3e7253a52bf54f8fa2314590aRichard Smith
589870d38f3179251bb3e7253a52bf54f8fa2314590aRichard Smith    return Success(Val.byteSwap(), E);
589970d38f3179251bb3e7253a52bf54f8fa2314590aRichard Smith  }
590070d38f3179251bb3e7253a52bf54f8fa2314590aRichard Smith
5901acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith  case Builtin::BI__builtin_classify_type:
5902acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith    return Success(EvaluateBuiltinClassifyType(E), E);
5903acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith
5904acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith  // FIXME: BI__builtin_clrsb
5905acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith  // FIXME: BI__builtin_clrsbl
5906acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith  // FIXME: BI__builtin_clrsbll
5907acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith
59084dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith  case Builtin::BI__builtin_clz:
59094dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith  case Builtin::BI__builtin_clzl:
59104dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith  case Builtin::BI__builtin_clzll: {
59114dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith    APSInt Val;
59124dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith    if (!EvaluateInteger(E->getArg(0), Val, Info))
59134dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith      return false;
59144dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith    if (!Val)
59154dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith      return Error(E);
59164dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith
59174dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith    return Success(Val.countLeadingZeros(), E);
59184dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith  }
59194dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith
5920acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith  case Builtin::BI__builtin_constant_p:
5921acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith    return Success(EvaluateBuiltinConstantP(Info.Ctx, E->getArg(0)), E);
5922acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith
59234dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith  case Builtin::BI__builtin_ctz:
59244dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith  case Builtin::BI__builtin_ctzl:
59254dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith  case Builtin::BI__builtin_ctzll: {
59264dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith    APSInt Val;
59274dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith    if (!EvaluateInteger(E->getArg(0), Val, Info))
59284dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith      return false;
59294dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith    if (!Val)
59304dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith      return Error(E);
59314dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith
59324dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith    return Success(Val.countTrailingZeros(), E);
59334dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith  }
59344dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith
5935acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith  case Builtin::BI__builtin_eh_return_data_regno: {
5936acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith    int Operand = E->getArg(0)->EvaluateKnownConstInt(Info.Ctx).getZExtValue();
5937acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith    Operand = Info.Ctx.getTargetInfo().getEHDataRegisterNumber(Operand);
5938acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith    return Success(Operand, E);
5939acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith  }
5940acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith
5941acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith  case Builtin::BI__builtin_expect:
5942acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith    return Visit(E->getArg(0));
5943acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith
5944acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith  case Builtin::BI__builtin_ffs:
5945acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith  case Builtin::BI__builtin_ffsl:
5946acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith  case Builtin::BI__builtin_ffsll: {
59474dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith    APSInt Val;
59484dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith    if (!EvaluateInteger(E->getArg(0), Val, Info))
59494dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith      return false;
59504dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith
5951acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith    unsigned N = Val.countTrailingZeros();
5952acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith    return Success(N == Val.getBitWidth() ? 0 : N + 1, E);
59534dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith  }
59544dbf408ee91a35f7c703ab279e7eaa1803215936Richard Smith
5955acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith  case Builtin::BI__builtin_fpclassify: {
5956acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith    APFloat Val(0.0);
5957acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith    if (!EvaluateFloat(E->getArg(5), Val, Info))
5958acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith      return false;
5959acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith    unsigned Arg;
5960acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith    switch (Val.getCategory()) {
5961acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith    case APFloat::fcNaN: Arg = 0; break;
5962acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith    case APFloat::fcInfinity: Arg = 1; break;
5963acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith    case APFloat::fcNormal: Arg = Val.isDenormal() ? 3 : 2; break;
5964acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith    case APFloat::fcZero: Arg = 4; break;
5965acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith    }
5966acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith    return Visit(E->getArg(Arg));
5967acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith  }
59681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5969acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith  case Builtin::BI__builtin_isinf_sign: {
5970acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith    APFloat Val(0.0);
59715350ded82a4e93a79c99a322e11360e096e2f852Richard Smith    return EvaluateFloat(E->getArg(0), Val, Info) &&
5972acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith           Success(Val.isInfinity() ? (Val.isNegative() ? -1 : 1) : 0, E);
5973acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith  }
5974e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith
5975acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith  case Builtin::BI__builtin_parity:
5976acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith  case Builtin::BI__builtin_parityl:
5977acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith  case Builtin::BI__builtin_parityll: {
5978acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith    APSInt Val;
5979acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith    if (!EvaluateInteger(E->getArg(0), Val, Info))
5980acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith      return false;
5981acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith
5982acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith    return Success(Val.countPopulation() % 2, E);
598321fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner  }
5984c4a2638b5ef3e2d35d872614ceb655a7a22c58beEli Friedman
5985acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith  case Builtin::BI__builtin_popcount:
5986acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith  case Builtin::BI__builtin_popcountl:
5987acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith  case Builtin::BI__builtin_popcountll: {
5988acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith    APSInt Val;
5989acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith    if (!EvaluateInteger(E->getArg(0), Val, Info))
5990acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith      return false;
5991acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith
5992acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith    return Success(Val.countPopulation(), E);
5993acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith  }
599440b993a826728214c869ee4fbc9d296a2e1e1f71Richard Smith
59955726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor  case Builtin::BIstrlen:
599640b993a826728214c869ee4fbc9d296a2e1e1f71Richard Smith    // A call to strlen is not a constant expression.
599780ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith    if (Info.getLangOpts().CPlusPlus11)
59985cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith      Info.CCEDiag(E, diag::note_constexpr_invalid_function)
599940b993a826728214c869ee4fbc9d296a2e1e1f71Richard Smith        << /*isConstexpr*/0 << /*isConstructor*/0 << "'strlen'";
600040b993a826728214c869ee4fbc9d296a2e1e1f71Richard Smith    else
60015cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith      Info.CCEDiag(E, diag::note_invalid_subexpr_in_const_expr);
600240b993a826728214c869ee4fbc9d296a2e1e1f71Richard Smith    // Fall through.
60035726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor  case Builtin::BI__builtin_strlen:
60045726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor    // As an extension, we support strlen() and __builtin_strlen() as constant
60055726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor    // expressions when the argument is a string literal.
60068cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    if (const StringLiteral *S
60075726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor               = dyn_cast<StringLiteral>(E->getArg(0)->IgnoreParenImpCasts())) {
60085726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor      // The string literal may have embedded null characters. Find the first
60095726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor      // one and truncate there.
60105f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      StringRef Str = S->getString();
60115f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      StringRef::size_type Pos = Str.find(0);
60125f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      if (Pos != StringRef::npos)
60135726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor        Str = Str.substr(0, Pos);
60145726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor
60155726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor      return Success(Str.size(), E);
60165726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor    }
60175726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor
6018f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return Error(E);
6019454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman
60202c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith  case Builtin::BI__atomic_always_lock_free:
6021fafbf06732746f3ceca21d452d77b144ba8652aeRichard Smith  case Builtin::BI__atomic_is_lock_free:
6022fafbf06732746f3ceca21d452d77b144ba8652aeRichard Smith  case Builtin::BI__c11_atomic_is_lock_free: {
6023454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    APSInt SizeVal;
6024454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    if (!EvaluateInteger(E->getArg(0), SizeVal, Info))
6025454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman      return false;
6026454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman
6027454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    // For __atomic_is_lock_free(sizeof(_Atomic(T))), if the size is a power
6028454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    // of two less than the maximum inline atomic width, we know it is
6029454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    // lock-free.  If the size isn't a power of two, or greater than the
6030454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    // maximum alignment where we promote atomics, we know it is not lock-free
6031454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    // (at least not in the sense of atomic_is_lock_free).  Otherwise,
6032454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    // the answer can only be determined at runtime; for example, 16-byte
6033454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    // atomics have lock-free implementations on some, but not all,
6034454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    // x86-64 processors.
6035454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman
6036454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    // Check power-of-two.
6037454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman    CharUnits Size = CharUnits::fromQuantity(SizeVal.getZExtValue());
60382c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith    if (Size.isPowerOfTwo()) {
60392c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith      // Check against inlining width.
60402c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith      unsigned InlineWidthBits =
60412c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith          Info.Ctx.getTargetInfo().getMaxAtomicInlineWidth();
60422c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith      if (Size <= Info.Ctx.toCharUnitsFromBits(InlineWidthBits)) {
60432c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith        if (BuiltinOp == Builtin::BI__c11_atomic_is_lock_free ||
60442c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith            Size == CharUnits::One() ||
60452c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith            E->getArg(1)->isNullPointerConstant(Info.Ctx,
60462c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith                                                Expr::NPC_NeverValueDependent))
60472c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith          // OK, we will inline appropriately-aligned operations of this size,
60482c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith          // and _Atomic(T) is appropriately-aligned.
60492c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith          return Success(1, E);
60502c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith
60512c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith        QualType PointeeType = E->getArg(1)->IgnoreImpCasts()->getType()->
60522c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith          castAs<PointerType>()->getPointeeType();
60532c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith        if (!PointeeType->isIncompleteType() &&
60542c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith            Info.Ctx.getTypeAlignInChars(PointeeType) >= Size) {
60552c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith          // OK, we will inline operations on this object.
60562c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith          return Success(1, E);
60572c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith        }
60582c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith      }
60592c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith    }
6060454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman
60612c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith    return BuiltinOp == Builtin::BI__atomic_always_lock_free ?
60622c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith        Success(0, E) : Error(E);
6063454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman  }
6064019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  }
60654c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner}
6066f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
6067625b80755b603d28f36fb4212c81484d87ad08d3Richard Smithstatic bool HasSameBase(const LValue &A, const LValue &B) {
6068625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith  if (!A.getLValueBase())
6069625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith    return !B.getLValueBase();
6070625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith  if (!B.getLValueBase())
6071625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith    return false;
6072625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith
60731bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith  if (A.getLValueBase().getOpaqueValue() !=
60741bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith      B.getLValueBase().getOpaqueValue()) {
6075625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith    const Decl *ADecl = GetLValueBaseDecl(A);
6076625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith    if (!ADecl)
6077625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith      return false;
6078625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith    const Decl *BDecl = GetLValueBaseDecl(B);
60799a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith    if (!BDecl || ADecl->getCanonicalDecl() != BDecl->getCanonicalDecl())
6080625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith      return false;
6081625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith  }
6082625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith
6083625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith  return IsGlobalLValue(A.getLValueBase()) ||
608483587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith         A.getLValueCallIndex() == B.getLValueCallIndex();
6085625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith}
6086625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith
6087cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidisnamespace {
6088c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
6089cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis/// \brief Data recursive integer evaluator of certain binary operators.
6090cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis///
6091cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis/// We use a data recursive algorithm for binary operators so that we are able
6092cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis/// to handle extreme cases of chained binary operators without causing stack
6093cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis/// overflow.
6094cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidisclass DataRecursiveIntBinOpEvaluator {
6095cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  struct EvalResult {
6096cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    APValue Val;
6097cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    bool Failed;
6098cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6099cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    EvalResult() : Failed(false) { }
6100cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6101cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    void swap(EvalResult &RHS) {
6102cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      Val.swap(RHS.Val);
6103cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      Failed = RHS.Failed;
6104cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      RHS.Failed = false;
6105cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    }
6106cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  };
6107cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6108cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  struct Job {
6109cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    const Expr *E;
6110cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    EvalResult LHSResult; // meaningful only for binary operator expression.
6111cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    enum { AnyExprKind, BinOpKind, BinOpVisitedLHSKind } Kind;
6112cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6113cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    Job() : StoredInfo(0) { }
6114cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    void startSpeculativeEval(EvalInfo &Info) {
6115cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      OldEvalStatus = Info.EvalStatus;
6116cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      Info.EvalStatus.Diag = 0;
6117cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      StoredInfo = &Info;
6118cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    }
6119cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    ~Job() {
6120cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      if (StoredInfo) {
6121cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis        StoredInfo->EvalStatus = OldEvalStatus;
6122cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      }
6123cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    }
6124cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  private:
6125cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    EvalInfo *StoredInfo; // non-null if status changed.
6126cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    Expr::EvalStatus OldEvalStatus;
6127cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  };
6128cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6129cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  SmallVector<Job, 16> Queue;
6130cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6131cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  IntExprEvaluator &IntEval;
6132cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  EvalInfo &Info;
6133cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  APValue &FinalResult;
6134cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6135cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidispublic:
6136cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  DataRecursiveIntBinOpEvaluator(IntExprEvaluator &IntEval, APValue &Result)
6137cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    : IntEval(IntEval), Info(IntEval.getEvalInfo()), FinalResult(Result) { }
6138cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6139cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  /// \brief True if \param E is a binary operator that we are going to handle
6140cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  /// data recursively.
6141cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  /// We handle binary operators that are comma, logical, or that have operands
6142cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  /// with integral or enumeration type.
6143cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  static bool shouldEnqueue(const BinaryOperator *E) {
6144cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    return E->getOpcode() == BO_Comma ||
6145cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis           E->isLogicalOp() ||
6146cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis           (E->getLHS()->getType()->isIntegralOrEnumerationType() &&
6147cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis            E->getRHS()->getType()->isIntegralOrEnumerationType());
6148cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  }
6149cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6150cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  bool Traverse(const BinaryOperator *E) {
6151cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    enqueue(E);
6152cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    EvalResult PrevResult;
6153b778305e95f9977e6710f2b04830ecc36398ab5eRichard Trieu    while (!Queue.empty())
6154b778305e95f9977e6710f2b04830ecc36398ab5eRichard Trieu      process(PrevResult);
6155b778305e95f9977e6710f2b04830ecc36398ab5eRichard Trieu
6156b778305e95f9977e6710f2b04830ecc36398ab5eRichard Trieu    if (PrevResult.Failed) return false;
6157cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6158cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    FinalResult.swap(PrevResult.Val);
6159cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    return true;
6160a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  }
6161a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
6162cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidisprivate:
6163cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  bool Success(uint64_t Value, const Expr *E, APValue &Result) {
6164cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    return IntEval.Success(Value, E, Result);
6165cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  }
6166cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  bool Success(const APSInt &Value, const Expr *E, APValue &Result) {
6167cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    return IntEval.Success(Value, E, Result);
6168cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  }
6169cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  bool Error(const Expr *E) {
6170cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    return IntEval.Error(E);
6171cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  }
6172cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  bool Error(const Expr *E, diag::kind D) {
6173cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    return IntEval.Error(E, D);
6174cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  }
6175cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6176cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  OptionalDiagnostic CCEDiag(const Expr *E, diag::kind D) {
6177cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    return Info.CCEDiag(E, D);
6178cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  }
6179cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
61809293fff58aa0198fa7a6bb504169bcac01dbbff7Argyrios Kyrtzidis  // \brief Returns true if visiting the RHS is necessary, false otherwise.
61819293fff58aa0198fa7a6bb504169bcac01dbbff7Argyrios Kyrtzidis  bool VisitBinOpLHSOnly(EvalResult &LHSResult, const BinaryOperator *E,
6182cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis                         bool &SuppressRHSDiags);
61832fa975c94027c6565cb112ffcf93c05b22922c0eArgyrios Kyrtzidis
6184cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  bool VisitBinOp(const EvalResult &LHSResult, const EvalResult &RHSResult,
6185cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis                  const BinaryOperator *E, APValue &Result);
6186cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6187cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  void EvaluateExpr(const Expr *E, EvalResult &Result) {
6188cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    Result.Failed = !Evaluate(Result.Val, Info, E);
6189cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    if (Result.Failed)
6190cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      Result.Val = APValue();
6191cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  }
6192cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6193b778305e95f9977e6710f2b04830ecc36398ab5eRichard Trieu  void process(EvalResult &Result);
6194cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6195cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  void enqueue(const Expr *E) {
6196cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    E = E->IgnoreParens();
6197cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    Queue.resize(Queue.size()+1);
6198cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    Queue.back().E = E;
6199cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    Queue.back().Kind = Job::AnyExprKind;
6200cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  }
6201cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis};
6202cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6203cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis}
6204cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6205cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidisbool DataRecursiveIntBinOpEvaluator::
62069293fff58aa0198fa7a6bb504169bcac01dbbff7Argyrios Kyrtzidis       VisitBinOpLHSOnly(EvalResult &LHSResult, const BinaryOperator *E,
6207cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis                         bool &SuppressRHSDiags) {
6208cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  if (E->getOpcode() == BO_Comma) {
6209cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    // Ignore LHS but note if we could not evaluate it.
6210cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    if (LHSResult.Failed)
6211cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      Info.EvalStatus.HasSideEffects = true;
6212cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    return true;
6213cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  }
6214cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6215cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  if (E->isLogicalOp()) {
6216cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    bool lhsResult;
6217cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    if (HandleConversionToBool(LHSResult.Val, lhsResult)) {
62182fa975c94027c6565cb112ffcf93c05b22922c0eArgyrios Kyrtzidis      // We were able to evaluate the LHS, see if we can get away with not
62192fa975c94027c6565cb112ffcf93c05b22922c0eArgyrios Kyrtzidis      // evaluating the RHS: 0 && X -> 0, 1 || X -> 1
6220cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      if (lhsResult == (E->getOpcode() == BO_LOr)) {
62219293fff58aa0198fa7a6bb504169bcac01dbbff7Argyrios Kyrtzidis        Success(lhsResult, E, LHSResult.Val);
62229293fff58aa0198fa7a6bb504169bcac01dbbff7Argyrios Kyrtzidis        return false; // Ignore RHS
62232fa975c94027c6565cb112ffcf93c05b22922c0eArgyrios Kyrtzidis      }
62242fa975c94027c6565cb112ffcf93c05b22922c0eArgyrios Kyrtzidis    } else {
62252fa975c94027c6565cb112ffcf93c05b22922c0eArgyrios Kyrtzidis      // Since we weren't able to evaluate the left hand side, it
62262fa975c94027c6565cb112ffcf93c05b22922c0eArgyrios Kyrtzidis      // must have had side effects.
62272fa975c94027c6565cb112ffcf93c05b22922c0eArgyrios Kyrtzidis      Info.EvalStatus.HasSideEffects = true;
6228cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6229cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      // We can't evaluate the LHS; however, sometimes the result
6230cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      // is determined by the RHS: X && 0 -> 0, X || 1 -> 1.
6231cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      // Don't ignore RHS and suppress diagnostics from this arm.
6232cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      SuppressRHSDiags = true;
6233cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    }
6234cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6235cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    return true;
6236cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  }
6237cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6238cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  assert(E->getLHS()->getType()->isIntegralOrEnumerationType() &&
6239cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis         E->getRHS()->getType()->isIntegralOrEnumerationType());
6240cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6241cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  if (LHSResult.Failed && !Info.keepEvaluatingAfterFailure())
62429293fff58aa0198fa7a6bb504169bcac01dbbff7Argyrios Kyrtzidis    return false; // Ignore RHS;
62439293fff58aa0198fa7a6bb504169bcac01dbbff7Argyrios Kyrtzidis
6244cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  return true;
6245cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis}
62462fa975c94027c6565cb112ffcf93c05b22922c0eArgyrios Kyrtzidis
6247cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidisbool DataRecursiveIntBinOpEvaluator::
6248cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis       VisitBinOp(const EvalResult &LHSResult, const EvalResult &RHSResult,
6249cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis                  const BinaryOperator *E, APValue &Result) {
6250cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  if (E->getOpcode() == BO_Comma) {
6251cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    if (RHSResult.Failed)
6252cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      return false;
6253cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    Result = RHSResult.Val;
6254cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    return true;
6255cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  }
6256cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6257cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  if (E->isLogicalOp()) {
6258cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    bool lhsResult, rhsResult;
6259cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    bool LHSIsOK = HandleConversionToBool(LHSResult.Val, lhsResult);
6260cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    bool RHSIsOK = HandleConversionToBool(RHSResult.Val, rhsResult);
6261cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6262cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    if (LHSIsOK) {
6263cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      if (RHSIsOK) {
6264cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis        if (E->getOpcode() == BO_LOr)
6265cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis          return Success(lhsResult || rhsResult, E, Result);
6266cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis        else
6267cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis          return Success(lhsResult && rhsResult, E, Result);
6268cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      }
6269cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    } else {
6270cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      if (RHSIsOK) {
62712fa975c94027c6565cb112ffcf93c05b22922c0eArgyrios Kyrtzidis        // We can't evaluate the LHS; however, sometimes the result
62722fa975c94027c6565cb112ffcf93c05b22922c0eArgyrios Kyrtzidis        // is determined by the RHS: X && 0 -> 0, X || 1 -> 1.
62732fa975c94027c6565cb112ffcf93c05b22922c0eArgyrios Kyrtzidis        if (rhsResult == (E->getOpcode() == BO_LOr))
6274cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis          return Success(rhsResult, E, Result);
62752fa975c94027c6565cb112ffcf93c05b22922c0eArgyrios Kyrtzidis      }
62762fa975c94027c6565cb112ffcf93c05b22922c0eArgyrios Kyrtzidis    }
6277cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
62782fa975c94027c6565cb112ffcf93c05b22922c0eArgyrios Kyrtzidis    return false;
62792fa975c94027c6565cb112ffcf93c05b22922c0eArgyrios Kyrtzidis  }
6280cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6281cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  assert(E->getLHS()->getType()->isIntegralOrEnumerationType() &&
6282cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis         E->getRHS()->getType()->isIntegralOrEnumerationType());
6283cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6284cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  if (LHSResult.Failed || RHSResult.Failed)
6285cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    return false;
6286cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6287cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  const APValue &LHSVal = LHSResult.Val;
6288cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  const APValue &RHSVal = RHSResult.Val;
6289cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6290cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  // Handle cases like (unsigned long)&a + 4.
6291cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  if (E->isAdditiveOp() && LHSVal.isLValue() && RHSVal.isInt()) {
6292cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    Result = LHSVal;
6293cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    CharUnits AdditionalOffset = CharUnits::fromQuantity(
6294cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis                                                         RHSVal.getInt().getZExtValue());
6295cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    if (E->getOpcode() == BO_Add)
6296cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      Result.getLValueOffset() += AdditionalOffset;
6297cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    else
6298cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      Result.getLValueOffset() -= AdditionalOffset;
6299cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    return true;
6300cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  }
6301cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6302cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  // Handle cases like 4 + (unsigned long)&a
6303cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  if (E->getOpcode() == BO_Add &&
6304cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      RHSVal.isLValue() && LHSVal.isInt()) {
6305cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    Result = RHSVal;
6306cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    Result.getLValueOffset() += CharUnits::fromQuantity(
6307cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis                                                        LHSVal.getInt().getZExtValue());
6308cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    return true;
6309cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  }
6310cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6311cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  if (E->getOpcode() == BO_Sub && LHSVal.isLValue() && RHSVal.isLValue()) {
6312cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    // Handle (intptr_t)&&A - (intptr_t)&&B.
6313cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    if (!LHSVal.getLValueOffset().isZero() ||
6314cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis        !RHSVal.getLValueOffset().isZero())
6315cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      return false;
6316cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    const Expr *LHSExpr = LHSVal.getLValueBase().dyn_cast<const Expr*>();
6317cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    const Expr *RHSExpr = RHSVal.getLValueBase().dyn_cast<const Expr*>();
6318cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    if (!LHSExpr || !RHSExpr)
6319cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      return false;
6320cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    const AddrLabelExpr *LHSAddrExpr = dyn_cast<AddrLabelExpr>(LHSExpr);
6321cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    const AddrLabelExpr *RHSAddrExpr = dyn_cast<AddrLabelExpr>(RHSExpr);
6322cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    if (!LHSAddrExpr || !RHSAddrExpr)
6323cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      return false;
6324cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    // Make sure both labels come from the same function.
6325cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    if (LHSAddrExpr->getLabel()->getDeclContext() !=
6326cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis        RHSAddrExpr->getLabel()->getDeclContext())
6327cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      return false;
6328cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    Result = APValue(LHSAddrExpr, RHSAddrExpr);
6329cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    return true;
6330cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  }
6331d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith
6332d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  // All the remaining cases expect both operands to be an integer
6333cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  if (!LHSVal.isInt() || !RHSVal.isInt())
6334cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    return Error(E);
6335d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith
6336d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  // Set up the width and signedness manually, in case it can't be deduced
6337d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  // from the operation we're performing.
6338d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  // FIXME: Don't do this in the cases where we can deduce it.
6339d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  APSInt Value(Info.Ctx.getIntWidth(E->getType()),
6340d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith               E->getType()->isUnsignedIntegerOrEnumerationType());
6341d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  if (!handleIntIntBinOp(Info, E, LHSVal.getInt(), E->getOpcode(),
6342d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith                         RHSVal.getInt(), Value))
6343d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith    return false;
6344d20afcbe94f0daed15d040d98d2aa8ef8ed368e4Richard Smith  return Success(Value, E, Result);
6345cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis}
6346cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6347b778305e95f9977e6710f2b04830ecc36398ab5eRichard Trieuvoid DataRecursiveIntBinOpEvaluator::process(EvalResult &Result) {
6348cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  Job &job = Queue.back();
6349cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6350cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  switch (job.Kind) {
6351cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    case Job::AnyExprKind: {
6352cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      if (const BinaryOperator *Bop = dyn_cast<BinaryOperator>(job.E)) {
6353cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis        if (shouldEnqueue(Bop)) {
6354cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis          job.Kind = Job::BinOpKind;
6355cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis          enqueue(Bop->getLHS());
6356b778305e95f9977e6710f2b04830ecc36398ab5eRichard Trieu          return;
6357cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis        }
6358cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      }
6359cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6360cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      EvaluateExpr(job.E, Result);
6361cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      Queue.pop_back();
6362b778305e95f9977e6710f2b04830ecc36398ab5eRichard Trieu      return;
6363cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    }
6364cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6365cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    case Job::BinOpKind: {
6366cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      const BinaryOperator *Bop = cast<BinaryOperator>(job.E);
6367cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      bool SuppressRHSDiags = false;
63689293fff58aa0198fa7a6bb504169bcac01dbbff7Argyrios Kyrtzidis      if (!VisitBinOpLHSOnly(Result, Bop, SuppressRHSDiags)) {
6369cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis        Queue.pop_back();
6370b778305e95f9977e6710f2b04830ecc36398ab5eRichard Trieu        return;
6371cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      }
6372cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      if (SuppressRHSDiags)
6373cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis        job.startSpeculativeEval(Info);
63749293fff58aa0198fa7a6bb504169bcac01dbbff7Argyrios Kyrtzidis      job.LHSResult.swap(Result);
6375cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      job.Kind = Job::BinOpVisitedLHSKind;
6376cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      enqueue(Bop->getRHS());
6377b778305e95f9977e6710f2b04830ecc36398ab5eRichard Trieu      return;
6378cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    }
6379cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6380cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    case Job::BinOpVisitedLHSKind: {
6381cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      const BinaryOperator *Bop = cast<BinaryOperator>(job.E);
6382cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      EvalResult RHS;
6383cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      RHS.swap(Result);
6384b778305e95f9977e6710f2b04830ecc36398ab5eRichard Trieu      Result.Failed = !VisitBinOp(job.LHSResult, RHS, Bop, Result.Val);
6385cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis      Queue.pop_back();
6386b778305e95f9977e6710f2b04830ecc36398ab5eRichard Trieu      return;
6387cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    }
6388cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  }
6389cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6390cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  llvm_unreachable("Invalid Job::Kind!");
6391cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis}
6392cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6393cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidisbool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
6394cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  if (E->isAssignmentOp())
6395cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    return Error(E);
6396cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis
6397cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  if (DataRecursiveIntBinOpEvaluator::shouldEnqueue(E))
6398cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis    return DataRecursiveIntBinOpEvaluator(*this, Result).Traverse(E);
639954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner
6400286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  QualType LHSTy = E->getLHS()->getType();
6401286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  QualType RHSTy = E->getRHS()->getType();
64024087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
64034087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar  if (LHSTy->isAnyComplexType()) {
64044087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    assert(RHSTy->isAnyComplexType() && "Invalid comparison");
6405f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    ComplexValue LHS, RHS;
64064087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
6407745f5147e065900267c85a5568785a1991d4838fRichard Smith    bool LHSOK = EvaluateComplex(E->getLHS(), LHS, Info);
6408745f5147e065900267c85a5568785a1991d4838fRichard Smith    if (!LHSOK && !Info.keepEvaluatingAfterFailure())
64094087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      return false;
64104087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
6411745f5147e065900267c85a5568785a1991d4838fRichard Smith    if (!EvaluateComplex(E->getRHS(), RHS, Info) || !LHSOK)
64124087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      return false;
64134087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
64144087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    if (LHS.isComplexFloat()) {
64151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      APFloat::cmpResult CR_r =
64164087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar        LHS.getComplexFloatReal().compare(RHS.getComplexFloatReal());
64171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      APFloat::cmpResult CR_i =
64184087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar        LHS.getComplexFloatImag().compare(RHS.getComplexFloatImag());
64194087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
64202de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      if (E->getOpcode() == BO_EQ)
6421131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        return Success((CR_r == APFloat::cmpEqual &&
6422131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                        CR_i == APFloat::cmpEqual), E);
6423131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      else {
64242de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall        assert(E->getOpcode() == BO_NE &&
6425131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar               "Invalid complex comparison.");
64261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        return Success(((CR_r == APFloat::cmpGreaterThan ||
6427fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang                         CR_r == APFloat::cmpLessThan ||
6428fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang                         CR_r == APFloat::cmpUnordered) ||
64291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                        (CR_i == APFloat::cmpGreaterThan ||
6430fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang                         CR_i == APFloat::cmpLessThan ||
6431fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang                         CR_i == APFloat::cmpUnordered)), E);
6432131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      }
64334087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    } else {
64342de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      if (E->getOpcode() == BO_EQ)
6435131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        return Success((LHS.getComplexIntReal() == RHS.getComplexIntReal() &&
6436131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                        LHS.getComplexIntImag() == RHS.getComplexIntImag()), E);
6437131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      else {
64382de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall        assert(E->getOpcode() == BO_NE &&
6439131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar               "Invalid compex comparison.");
6440131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        return Success((LHS.getComplexIntReal() != RHS.getComplexIntReal() ||
6441131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                        LHS.getComplexIntImag() != RHS.getComplexIntImag()), E);
6442131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      }
64434087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    }
64444087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar  }
64451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6446286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  if (LHSTy->isRealFloatingType() &&
6447286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      RHSTy->isRealFloatingType()) {
6448286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    APFloat RHS(0.0), LHS(0.0);
64491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6450745f5147e065900267c85a5568785a1991d4838fRichard Smith    bool LHSOK = EvaluateFloat(E->getRHS(), RHS, Info);
6451745f5147e065900267c85a5568785a1991d4838fRichard Smith    if (!LHSOK && !Info.keepEvaluatingAfterFailure())
6452286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      return false;
64531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6454745f5147e065900267c85a5568785a1991d4838fRichard Smith    if (!EvaluateFloat(E->getLHS(), LHS, Info) || !LHSOK)
6455286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      return false;
64561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6457286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    APFloat::cmpResult CR = LHS.compare(RHS);
6458529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson
6459286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    switch (E->getOpcode()) {
6460286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    default:
6461b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie      llvm_unreachable("Invalid binary operator!");
64622de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_LT:
6463131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpLessThan, E);
64642de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_GT:
6465131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpGreaterThan, E);
64662de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_LE:
6467131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpLessThan || CR == APFloat::cmpEqual, E);
64682de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_GE:
64691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return Success(CR == APFloat::cmpGreaterThan || CR == APFloat::cmpEqual,
6470131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                     E);
64712de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_EQ:
6472131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpEqual, E);
64732de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_NE:
64741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return Success(CR == APFloat::cmpGreaterThan
6475fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang                     || CR == APFloat::cmpLessThan
6476fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang                     || CR == APFloat::cmpUnordered, E);
6477286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    }
6478286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  }
64791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6480ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman  if (LHSTy->isPointerType() && RHSTy->isPointerType()) {
6481625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith    if (E->getOpcode() == BO_Sub || E->isComparisonOp()) {
6482745f5147e065900267c85a5568785a1991d4838fRichard Smith      LValue LHSValue, RHSValue;
6483745f5147e065900267c85a5568785a1991d4838fRichard Smith
6484745f5147e065900267c85a5568785a1991d4838fRichard Smith      bool LHSOK = EvaluatePointer(E->getLHS(), LHSValue, Info);
6485745f5147e065900267c85a5568785a1991d4838fRichard Smith      if (!LHSOK && Info.keepEvaluatingAfterFailure())
64863068d117951a8df54bae9db039b56201ab10962bAnders Carlsson        return false;
6487a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
6488745f5147e065900267c85a5568785a1991d4838fRichard Smith      if (!EvaluatePointer(E->getRHS(), RHSValue, Info) || !LHSOK)
64893068d117951a8df54bae9db039b56201ab10962bAnders Carlsson        return false;
6490a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
6491625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith      // Reject differing bases from the normal codepath; we special-case
6492625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith      // comparisons to null.
6493625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith      if (!HasSameBase(LHSValue, RHSValue)) {
649465639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman        if (E->getOpcode() == BO_Sub) {
649565639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman          // Handle &&A - &&B.
649665639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman          if (!LHSValue.Offset.isZero() || !RHSValue.Offset.isZero())
649765639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman            return false;
649865639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman          const Expr *LHSExpr = LHSValue.Base.dyn_cast<const Expr*>();
64997b2f93c8b63f59d429731aaf16d14f0cd32f98c8Benjamin Kramer          const Expr *RHSExpr = RHSValue.Base.dyn_cast<const Expr*>();
650065639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman          if (!LHSExpr || !RHSExpr)
650165639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman            return false;
650265639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman          const AddrLabelExpr *LHSAddrExpr = dyn_cast<AddrLabelExpr>(LHSExpr);
650365639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman          const AddrLabelExpr *RHSAddrExpr = dyn_cast<AddrLabelExpr>(RHSExpr);
650465639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman          if (!LHSAddrExpr || !RHSAddrExpr)
650565639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman            return false;
65065930a4c5224eea3b0558655f7f8c9ea027ef573eEli Friedman          // Make sure both labels come from the same function.
65075930a4c5224eea3b0558655f7f8c9ea027ef573eEli Friedman          if (LHSAddrExpr->getLabel()->getDeclContext() !=
65085930a4c5224eea3b0558655f7f8c9ea027ef573eEli Friedman              RHSAddrExpr->getLabel()->getDeclContext())
65095930a4c5224eea3b0558655f7f8c9ea027ef573eEli Friedman            return false;
65101aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith          Result = APValue(LHSAddrExpr, RHSAddrExpr);
651165639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman          return true;
651265639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman        }
65139e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith        // Inequalities and subtractions between unrelated pointers have
65149e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith        // unspecified or undefined behavior.
65155bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman        if (!E->isEqualityOp())
6516f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith          return Error(E);
6517ffbda40a1fb7169591dc01771f3511178a2f727cEli Friedman        // A constant address may compare equal to the address of a symbol.
6518ffbda40a1fb7169591dc01771f3511178a2f727cEli Friedman        // The one exception is that address of an object cannot compare equal
6519c45061bd0c0fdad4df8eea7e9e5af186d11427e5Eli Friedman        // to a null pointer constant.
6520ffbda40a1fb7169591dc01771f3511178a2f727cEli Friedman        if ((!LHSValue.Base && !LHSValue.Offset.isZero()) ||
6521ffbda40a1fb7169591dc01771f3511178a2f727cEli Friedman            (!RHSValue.Base && !RHSValue.Offset.isZero()))
6522f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith          return Error(E);
65239e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith        // It's implementation-defined whether distinct literals will have
6524b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith        // distinct addresses. In clang, the result of such a comparison is
6525b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith        // unspecified, so it is not a constant expression. However, we do know
6526b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith        // that the address of a literal will be non-null.
652774f4634781cee06e28eb741bda5d0f936fdd1948Richard Smith        if ((IsLiteralLValue(LHSValue) || IsLiteralLValue(RHSValue)) &&
652874f4634781cee06e28eb741bda5d0f936fdd1948Richard Smith            LHSValue.Base && RHSValue.Base)
6529f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith          return Error(E);
65309e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith        // We can't tell whether weak symbols will end up pointing to the same
65319e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith        // object.
65329e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith        if (IsWeakLValue(LHSValue) || IsWeakLValue(RHSValue))
6533f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith          return Error(E);
65349e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith        // Pointers with different bases cannot represent the same object.
6535c45061bd0c0fdad4df8eea7e9e5af186d11427e5Eli Friedman        // (Note that clang defaults to -fmerge-all-constants, which can
6536c45061bd0c0fdad4df8eea7e9e5af186d11427e5Eli Friedman        // lead to inconsistent results for comparisons involving the address
6537c45061bd0c0fdad4df8eea7e9e5af186d11427e5Eli Friedman        // of a constant; this generally doesn't matter in practice.)
65389e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith        return Success(E->getOpcode() == BO_NE, E);
65395bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman      }
6540a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
654115efc4d597a47e6ba5794d4fd8d561bf6947233cRichard Smith      const CharUnits &LHSOffset = LHSValue.getLValueOffset();
654215efc4d597a47e6ba5794d4fd8d561bf6947233cRichard Smith      const CharUnits &RHSOffset = RHSValue.getLValueOffset();
654315efc4d597a47e6ba5794d4fd8d561bf6947233cRichard Smith
6544f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith      SubobjectDesignator &LHSDesignator = LHSValue.getLValueDesignator();
6545f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith      SubobjectDesignator &RHSDesignator = RHSValue.getLValueDesignator();
6546f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith
65472de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      if (E->getOpcode() == BO_Sub) {
6548f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith        // C++11 [expr.add]p6:
6549f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith        //   Unless both pointers point to elements of the same array object, or
6550f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith        //   one past the last element of the array object, the behavior is
6551f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith        //   undefined.
6552f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith        if (!LHSDesignator.Invalid && !RHSDesignator.Invalid &&
6553f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith            !AreElementsOfSameArray(getType(LHSValue.Base),
6554f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith                                    LHSDesignator, RHSDesignator))
6555f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith          CCEDiag(E, diag::note_constexpr_pointer_subtraction_not_same_array);
6556f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith
65574992bdde387c5f033bb450a716eaabc0fda52688Chris Lattner        QualType Type = E->getLHS()->getType();
65584992bdde387c5f033bb450a716eaabc0fda52688Chris Lattner        QualType ElementType = Type->getAs<PointerType>()->getPointeeType();
65593068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
6560180f47959a066795cc0f409433023af448bb0328Richard Smith        CharUnits ElementSize;
656174e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith        if (!HandleSizeof(Info, E->getExprLoc(), ElementType, ElementSize))
6562180f47959a066795cc0f409433023af448bb0328Richard Smith          return false;
6563a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
656415efc4d597a47e6ba5794d4fd8d561bf6947233cRichard Smith        // FIXME: LLVM and GCC both compute LHSOffset - RHSOffset at runtime,
656515efc4d597a47e6ba5794d4fd8d561bf6947233cRichard Smith        // and produce incorrect results when it overflows. Such behavior
656615efc4d597a47e6ba5794d4fd8d561bf6947233cRichard Smith        // appears to be non-conforming, but is common, so perhaps we should
656715efc4d597a47e6ba5794d4fd8d561bf6947233cRichard Smith        // assume the standard intended for such cases to be undefined behavior
656815efc4d597a47e6ba5794d4fd8d561bf6947233cRichard Smith        // and check for them.
656915efc4d597a47e6ba5794d4fd8d561bf6947233cRichard Smith
657015efc4d597a47e6ba5794d4fd8d561bf6947233cRichard Smith        // Compute (LHSOffset - RHSOffset) / Size carefully, checking for
657115efc4d597a47e6ba5794d4fd8d561bf6947233cRichard Smith        // overflow in the final conversion to ptrdiff_t.
657215efc4d597a47e6ba5794d4fd8d561bf6947233cRichard Smith        APSInt LHS(
657315efc4d597a47e6ba5794d4fd8d561bf6947233cRichard Smith          llvm::APInt(65, (int64_t)LHSOffset.getQuantity(), true), false);
657415efc4d597a47e6ba5794d4fd8d561bf6947233cRichard Smith        APSInt RHS(
657515efc4d597a47e6ba5794d4fd8d561bf6947233cRichard Smith          llvm::APInt(65, (int64_t)RHSOffset.getQuantity(), true), false);
657615efc4d597a47e6ba5794d4fd8d561bf6947233cRichard Smith        APSInt ElemSize(
657715efc4d597a47e6ba5794d4fd8d561bf6947233cRichard Smith          llvm::APInt(65, (int64_t)ElementSize.getQuantity(), true), false);
657815efc4d597a47e6ba5794d4fd8d561bf6947233cRichard Smith        APSInt TrueResult = (LHS - RHS) / ElemSize;
657915efc4d597a47e6ba5794d4fd8d561bf6947233cRichard Smith        APSInt Result = TrueResult.trunc(Info.Ctx.getIntWidth(E->getType()));
658015efc4d597a47e6ba5794d4fd8d561bf6947233cRichard Smith
658115efc4d597a47e6ba5794d4fd8d561bf6947233cRichard Smith        if (Result.extend(65) != TrueResult)
658215efc4d597a47e6ba5794d4fd8d561bf6947233cRichard Smith          HandleOverflow(Info, E, TrueResult, E->getType());
658315efc4d597a47e6ba5794d4fd8d561bf6947233cRichard Smith        return Success(Result, E);
6584ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman      }
6585625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith
658682f28583b8e81ae9b61635a0652f6a45623df16dRichard Smith      // C++11 [expr.rel]p3:
658782f28583b8e81ae9b61635a0652f6a45623df16dRichard Smith      //   Pointers to void (after pointer conversions) can be compared, with a
658882f28583b8e81ae9b61635a0652f6a45623df16dRichard Smith      //   result defined as follows: If both pointers represent the same
658982f28583b8e81ae9b61635a0652f6a45623df16dRichard Smith      //   address or are both the null pointer value, the result is true if the
659082f28583b8e81ae9b61635a0652f6a45623df16dRichard Smith      //   operator is <= or >= and false otherwise; otherwise the result is
659182f28583b8e81ae9b61635a0652f6a45623df16dRichard Smith      //   unspecified.
659282f28583b8e81ae9b61635a0652f6a45623df16dRichard Smith      // We interpret this as applying to pointers to *cv* void.
659382f28583b8e81ae9b61635a0652f6a45623df16dRichard Smith      if (LHSTy->isVoidPointerType() && LHSOffset != RHSOffset &&
6594f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith          E->isRelationalOp())
659582f28583b8e81ae9b61635a0652f6a45623df16dRichard Smith        CCEDiag(E, diag::note_constexpr_void_comparison);
659682f28583b8e81ae9b61635a0652f6a45623df16dRichard Smith
6597f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith      // C++11 [expr.rel]p2:
6598f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith      // - If two pointers point to non-static data members of the same object,
6599f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith      //   or to subobjects or array elements fo such members, recursively, the
6600f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith      //   pointer to the later declared member compares greater provided the
6601f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith      //   two members have the same access control and provided their class is
6602f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith      //   not a union.
6603f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith      //   [...]
6604f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith      // - Otherwise pointer comparisons are unspecified.
6605f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith      if (!LHSDesignator.Invalid && !RHSDesignator.Invalid &&
6606f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith          E->isRelationalOp()) {
6607f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith        bool WasArrayIndex;
6608f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith        unsigned Mismatch =
6609f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith          FindDesignatorMismatch(getType(LHSValue.Base), LHSDesignator,
6610f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith                                 RHSDesignator, WasArrayIndex);
6611f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith        // At the point where the designators diverge, the comparison has a
6612f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith        // specified value if:
6613f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith        //  - we are comparing array indices
6614f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith        //  - we are comparing fields of a union, or fields with the same access
6615f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith        // Otherwise, the result is unspecified and thus the comparison is not a
6616f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith        // constant expression.
6617f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith        if (!WasArrayIndex && Mismatch < LHSDesignator.Entries.size() &&
6618f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith            Mismatch < RHSDesignator.Entries.size()) {
6619f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith          const FieldDecl *LF = getAsField(LHSDesignator.Entries[Mismatch]);
6620f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith          const FieldDecl *RF = getAsField(RHSDesignator.Entries[Mismatch]);
6621f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith          if (!LF && !RF)
6622f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith            CCEDiag(E, diag::note_constexpr_pointer_comparison_base_classes);
6623f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith          else if (!LF)
6624f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith            CCEDiag(E, diag::note_constexpr_pointer_comparison_base_field)
6625f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith              << getAsBaseClass(LHSDesignator.Entries[Mismatch])
6626f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith              << RF->getParent() << RF;
6627f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith          else if (!RF)
6628f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith            CCEDiag(E, diag::note_constexpr_pointer_comparison_base_field)
6629f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith              << getAsBaseClass(RHSDesignator.Entries[Mismatch])
6630f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith              << LF->getParent() << LF;
6631f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith          else if (!LF->getParent()->isUnion() &&
6632f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith                   LF->getAccess() != RF->getAccess())
6633f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith            CCEDiag(E, diag::note_constexpr_pointer_comparison_differing_access)
6634f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith              << LF << LF->getAccess() << RF << RF->getAccess()
6635f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith              << LF->getParent();
6636f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith        }
6637f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith      }
6638f15fda02e9c8c82b4a716618f4010b9af8bff796Richard Smith
6639a31698842e9893559d58a7bf1a987f2ae90bea0bEli Friedman      // The comparison here must be unsigned, and performed with the same
6640a31698842e9893559d58a7bf1a987f2ae90bea0bEli Friedman      // width as the pointer.
6641a31698842e9893559d58a7bf1a987f2ae90bea0bEli Friedman      unsigned PtrSize = Info.Ctx.getTypeSize(LHSTy);
6642a31698842e9893559d58a7bf1a987f2ae90bea0bEli Friedman      uint64_t CompareLHS = LHSOffset.getQuantity();
6643a31698842e9893559d58a7bf1a987f2ae90bea0bEli Friedman      uint64_t CompareRHS = RHSOffset.getQuantity();
6644a31698842e9893559d58a7bf1a987f2ae90bea0bEli Friedman      assert(PtrSize <= 64 && "Unexpected pointer width");
6645a31698842e9893559d58a7bf1a987f2ae90bea0bEli Friedman      uint64_t Mask = ~0ULL >> (64 - PtrSize);
6646a31698842e9893559d58a7bf1a987f2ae90bea0bEli Friedman      CompareLHS &= Mask;
6647a31698842e9893559d58a7bf1a987f2ae90bea0bEli Friedman      CompareRHS &= Mask;
6648a31698842e9893559d58a7bf1a987f2ae90bea0bEli Friedman
66492850376184b7e7aa81b5034ba44b001f8c55e07aEli Friedman      // If there is a base and this is a relational operator, we can only
66502850376184b7e7aa81b5034ba44b001f8c55e07aEli Friedman      // compare pointers within the object in question; otherwise, the result
66512850376184b7e7aa81b5034ba44b001f8c55e07aEli Friedman      // depends on where the object is located in memory.
66522850376184b7e7aa81b5034ba44b001f8c55e07aEli Friedman      if (!LHSValue.Base.isNull() && E->isRelationalOp()) {
66532850376184b7e7aa81b5034ba44b001f8c55e07aEli Friedman        QualType BaseTy = getType(LHSValue.Base);
66542850376184b7e7aa81b5034ba44b001f8c55e07aEli Friedman        if (BaseTy->isIncompleteType())
66552850376184b7e7aa81b5034ba44b001f8c55e07aEli Friedman          return Error(E);
66562850376184b7e7aa81b5034ba44b001f8c55e07aEli Friedman        CharUnits Size = Info.Ctx.getTypeSizeInChars(BaseTy);
66572850376184b7e7aa81b5034ba44b001f8c55e07aEli Friedman        uint64_t OffsetLimit = Size.getQuantity();
66582850376184b7e7aa81b5034ba44b001f8c55e07aEli Friedman        if (CompareLHS > OffsetLimit || CompareRHS > OffsetLimit)
66592850376184b7e7aa81b5034ba44b001f8c55e07aEli Friedman          return Error(E);
66602850376184b7e7aa81b5034ba44b001f8c55e07aEli Friedman      }
66612850376184b7e7aa81b5034ba44b001f8c55e07aEli Friedman
6662625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith      switch (E->getOpcode()) {
6663625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith      default: llvm_unreachable("missing comparison operator");
6664a31698842e9893559d58a7bf1a987f2ae90bea0bEli Friedman      case BO_LT: return Success(CompareLHS < CompareRHS, E);
6665a31698842e9893559d58a7bf1a987f2ae90bea0bEli Friedman      case BO_GT: return Success(CompareLHS > CompareRHS, E);
6666a31698842e9893559d58a7bf1a987f2ae90bea0bEli Friedman      case BO_LE: return Success(CompareLHS <= CompareRHS, E);
6667a31698842e9893559d58a7bf1a987f2ae90bea0bEli Friedman      case BO_GE: return Success(CompareLHS >= CompareRHS, E);
6668a31698842e9893559d58a7bf1a987f2ae90bea0bEli Friedman      case BO_EQ: return Success(CompareLHS == CompareRHS, E);
6669a31698842e9893559d58a7bf1a987f2ae90bea0bEli Friedman      case BO_NE: return Success(CompareLHS != CompareRHS, E);
6670ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman      }
66713068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    }
66723068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  }
6673b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith
6674b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith  if (LHSTy->isMemberPointerType()) {
6675b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith    assert(E->isEqualityOp() && "unexpected member pointer operation");
6676b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith    assert(RHSTy->isMemberPointerType() && "invalid comparison");
6677b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith
6678b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith    MemberPtr LHSValue, RHSValue;
6679b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith
6680b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith    bool LHSOK = EvaluateMemberPointer(E->getLHS(), LHSValue, Info);
6681b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith    if (!LHSOK && Info.keepEvaluatingAfterFailure())
6682b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith      return false;
6683b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith
6684b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith    if (!EvaluateMemberPointer(E->getRHS(), RHSValue, Info) || !LHSOK)
6685b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith      return false;
6686b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith
6687b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith    // C++11 [expr.eq]p2:
6688b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith    //   If both operands are null, they compare equal. Otherwise if only one is
6689b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith    //   null, they compare unequal.
6690b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith    if (!LHSValue.getDecl() || !RHSValue.getDecl()) {
6691b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith      bool Equal = !LHSValue.getDecl() && !RHSValue.getDecl();
6692b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith      return Success(E->getOpcode() == BO_EQ ? Equal : !Equal, E);
6693b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith    }
6694b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith
6695b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith    //   Otherwise if either is a pointer to a virtual member function, the
6696b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith    //   result is unspecified.
6697b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith    if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(LHSValue.getDecl()))
6698b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith      if (MD->isVirtual())
6699b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith        CCEDiag(E, diag::note_constexpr_compare_virtual_mem_ptr) << MD;
6700b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith    if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(RHSValue.getDecl()))
6701b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith      if (MD->isVirtual())
6702b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith        CCEDiag(E, diag::note_constexpr_compare_virtual_mem_ptr) << MD;
6703b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith
6704b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith    //   Otherwise they compare equal if and only if they would refer to the
6705b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith    //   same member of the same most derived object or the same subobject if
6706b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith    //   they were dereferenced with a hypothetical object of the associated
6707b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith    //   class type.
6708b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith    bool Equal = LHSValue == RHSValue;
6709b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith    return Success(E->getOpcode() == BO_EQ ? Equal : !Equal, E);
6710b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith  }
6711b02e4629f78a0c0c0adf9d66b644e5932a781c7eRichard Smith
671226f2cac83eeb4317738d74b9e567d3d58aa04ed9Richard Smith  if (LHSTy->isNullPtrType()) {
671326f2cac83eeb4317738d74b9e567d3d58aa04ed9Richard Smith    assert(E->isComparisonOp() && "unexpected nullptr operation");
671426f2cac83eeb4317738d74b9e567d3d58aa04ed9Richard Smith    assert(RHSTy->isNullPtrType() && "missing pointer conversion");
671526f2cac83eeb4317738d74b9e567d3d58aa04ed9Richard Smith    // C++11 [expr.rel]p4, [expr.eq]p3: If two operands of type std::nullptr_t
671626f2cac83eeb4317738d74b9e567d3d58aa04ed9Richard Smith    // are compared, the result is true of the operator is <=, >= or ==, and
671726f2cac83eeb4317738d74b9e567d3d58aa04ed9Richard Smith    // false otherwise.
671826f2cac83eeb4317738d74b9e567d3d58aa04ed9Richard Smith    BinaryOperator::Opcode Opcode = E->getOpcode();
671926f2cac83eeb4317738d74b9e567d3d58aa04ed9Richard Smith    return Success(Opcode == BO_EQ || Opcode == BO_LE || Opcode == BO_GE, E);
672026f2cac83eeb4317738d74b9e567d3d58aa04ed9Richard Smith  }
672126f2cac83eeb4317738d74b9e567d3d58aa04ed9Richard Smith
6722cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  assert((!LHSTy->isIntegralOrEnumerationType() ||
6723cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis          !RHSTy->isIntegralOrEnumerationType()) &&
6724cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis         "DataRecursiveIntBinOpEvaluator should have handled integral types");
6725cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  // We can't continue from here for non-integral types.
6726cc2f77a7dbc5fb58fe188d55fbfb074e80fe5663Argyrios Kyrtzidis  return ExprEvaluatorBaseTy::VisitBinaryOperator(E);
6727a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson}
6728a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson
67298b752f10c394b140f9ef89e049cbad1a7676fc25Ken DyckCharUnits IntExprEvaluator::GetAlignOfType(QualType T) {
67305d484e8cf710207010720589d89602233de61d01Sebastian Redl  // C++ [expr.alignof]p3: "When alignof is applied to a reference type, the
67315d484e8cf710207010720589d89602233de61d01Sebastian Redl  //   result shall be the alignment of the referenced type."
67325d484e8cf710207010720589d89602233de61d01Sebastian Redl  if (const ReferenceType *Ref = T->getAs<ReferenceType>())
67335d484e8cf710207010720589d89602233de61d01Sebastian Redl    T = Ref->getPointeeType();
67349f1210c3280104417a4ad30f0a00825ac8fa718aChad Rosier
67359f1210c3280104417a4ad30f0a00825ac8fa718aChad Rosier  // __alignof is defined to return the preferred alignment.
67369f1210c3280104417a4ad30f0a00825ac8fa718aChad Rosier  return Info.Ctx.toCharUnitsFromBits(
67379f1210c3280104417a4ad30f0a00825ac8fa718aChad Rosier    Info.Ctx.getPreferredTypeAlign(T.getTypePtr()));
6738e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner}
6739e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
67408b752f10c394b140f9ef89e049cbad1a7676fc25Ken DyckCharUnits IntExprEvaluator::GetAlignOfExpr(const Expr *E) {
6741af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  E = E->IgnoreParens();
6742af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner
674310f6f065456a2cfb6c2ab5dfedefb930e5e52e9dJohn McCall  // The kinds of expressions that we have special-case logic here for
674410f6f065456a2cfb6c2ab5dfedefb930e5e52e9dJohn McCall  // should be kept up to date with the special checks for those
674510f6f065456a2cfb6c2ab5dfedefb930e5e52e9dJohn McCall  // expressions in Sema.
674610f6f065456a2cfb6c2ab5dfedefb930e5e52e9dJohn McCall
6747af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  // alignof decl is always accepted, even if it doesn't make sense: we default
67481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // to 1 in those cases.
6749af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
67508b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck    return Info.Ctx.getDeclAlign(DRE->getDecl(),
67518b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck                                 /*RefAsPointee*/true);
6752a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
6753af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  if (const MemberExpr *ME = dyn_cast<MemberExpr>(E))
67548b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck    return Info.Ctx.getDeclAlign(ME->getMemberDecl(),
67558b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck                                 /*RefAsPointee*/true);
6756af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner
6757e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  return GetAlignOfType(E->getType());
6758e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner}
6759e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
6760e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
6761f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne/// VisitUnaryExprOrTypeTraitExpr - Evaluate a sizeof, alignof or vec_step with
6762f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne/// a result as the expression's type.
6763f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbournebool IntExprEvaluator::VisitUnaryExprOrTypeTraitExpr(
6764f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne                                    const UnaryExprOrTypeTraitExpr *E) {
6765f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  switch(E->getKind()) {
6766f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  case UETT_AlignOf: {
6767e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner    if (E->isArgumentType())
67684f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck      return Success(GetAlignOfType(E->getArgumentType()), E);
6769e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner    else
67704f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck      return Success(GetAlignOfExpr(E->getArgumentExpr()), E);
6771e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  }
6772a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
6773f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  case UETT_VecStep: {
6774f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    QualType Ty = E->getTypeOfArgument();
67750518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl
6776f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    if (Ty->isVectorType()) {
6777890f0f1612b0028b8b16730ae7ed07e295600c76Ted Kremenek      unsigned n = Ty->castAs<VectorType>()->getNumElements();
6778a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
6779f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne      // The vec_step built-in functions that take a 3-component
6780f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne      // vector return 4. (OpenCL 1.1 spec 6.11.12)
6781f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne      if (n == 3)
6782f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne        n = 4;
6783f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne
6784f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne      return Success(n, E);
6785f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    } else
6786f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne      return Success(1, E);
6787f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  }
6788f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne
6789f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  case UETT_SizeOf: {
6790f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    QualType SrcTy = E->getTypeOfArgument();
6791f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    // C++ [expr.sizeof]p2: "When applied to a reference or a reference type,
6792f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    //   the result is the size of the referenced type."
6793f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    if (const ReferenceType *Ref = SrcTy->getAs<ReferenceType>())
6794f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne      SrcTy = Ref->getPointeeType();
6795f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman
6796180f47959a066795cc0f409433023af448bb0328Richard Smith    CharUnits Sizeof;
679774e1ad93fa8d6347549bcb10279fdf1fbc775321Richard Smith    if (!HandleSizeof(Info, E->getExprLoc(), SrcTy, Sizeof))
6798f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne      return false;
6799180f47959a066795cc0f409433023af448bb0328Richard Smith    return Success(Sizeof, E);
6800f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  }
6801f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  }
6802f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne
6803f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  llvm_unreachable("unknown expr/type trait");
6804fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner}
6805fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner
68068cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool IntExprEvaluator::VisitOffsetOfExpr(const OffsetOfExpr *OOE) {
68078ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  CharUnits Result;
68088cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  unsigned n = OOE->getNumComponents();
68098ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  if (n == 0)
6810f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return Error(OOE);
68118cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  QualType CurrentType = OOE->getTypeSourceInfo()->getType();
68128ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  for (unsigned i = 0; i != n; ++i) {
68138ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    OffsetOfExpr::OffsetOfNode ON = OOE->getComponent(i);
68148ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    switch (ON.getKind()) {
68158ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case OffsetOfExpr::OffsetOfNode::Array: {
68168cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne      const Expr *Idx = OOE->getIndexExpr(ON.getArrayExprIndex());
68178ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      APSInt IdxResult;
68188ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      if (!EvaluateInteger(Idx, IdxResult, Info))
68198ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor        return false;
68208ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      const ArrayType *AT = Info.Ctx.getAsArrayType(CurrentType);
68218ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      if (!AT)
6822f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith        return Error(OOE);
68238ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      CurrentType = AT->getElementType();
68248ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      CharUnits ElementSize = Info.Ctx.getTypeSizeInChars(CurrentType);
68258ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Result += IdxResult.getSExtValue() * ElementSize;
6826a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith      break;
68278ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
6828f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith
68298ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case OffsetOfExpr::OffsetOfNode::Field: {
68308ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      FieldDecl *MemberDecl = ON.getField();
68318ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      const RecordType *RT = CurrentType->getAs<RecordType>();
6832f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      if (!RT)
6833f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith        return Error(OOE);
68348ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      RecordDecl *RD = RT->getDecl();
68358d59deec807ed53efcd07855199cdc9c979f447fJohn McCall      if (RD->isInvalidDecl()) return false;
68368ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD);
6837ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall      unsigned i = MemberDecl->getFieldIndex();
6838cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      assert(i < RL.getFieldCount() && "offsetof field in wrong type");
6839fb1e3bc29b667f4275e1d5a43d64ec173f4f9a7dKen Dyck      Result += Info.Ctx.toCharUnitsFromBits(RL.getFieldOffset(i));
68408ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      CurrentType = MemberDecl->getType().getNonReferenceType();
68418ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
68428ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
6843f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith
68448ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case OffsetOfExpr::OffsetOfNode::Identifier:
68458ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      llvm_unreachable("dependent __builtin_offsetof");
6846f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith
6847cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor    case OffsetOfExpr::OffsetOfNode::Base: {
6848cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      CXXBaseSpecifier *BaseSpec = ON.getBase();
6849cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      if (BaseSpec->isVirtual())
6850f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith        return Error(OOE);
6851cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor
6852cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      // Find the layout of the class whose base we are looking into.
6853cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      const RecordType *RT = CurrentType->getAs<RecordType>();
6854f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      if (!RT)
6855f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith        return Error(OOE);
6856cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      RecordDecl *RD = RT->getDecl();
68578d59deec807ed53efcd07855199cdc9c979f447fJohn McCall      if (RD->isInvalidDecl()) return false;
6858cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD);
6859cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor
6860cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      // Find the base class itself.
6861cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      CurrentType = BaseSpec->getType();
6862cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      const RecordType *BaseRT = CurrentType->getAs<RecordType>();
6863cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      if (!BaseRT)
6864f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith        return Error(OOE);
6865cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor
6866cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      // Add the offset to the base.
68677c7f820d70c925b29290a8563b59615816a827fcKen Dyck      Result += RL.getBaseClassOffset(cast<CXXRecordDecl>(BaseRT->getDecl()));
6868cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      break;
6869cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor    }
68708ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
68718ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
68728cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  return Success(Result, OOE);
68738ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
68748ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
6875b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
687675a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  switch (E->getOpcode()) {
68774c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  default:
687875a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    // Address, indirect, pre/post inc/dec, etc are not valid constant exprs.
687975a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    // See C99 6.6p3.
6880f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return Error(E);
68812de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Extension:
68824c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    // FIXME: Should extension allow i-c-e extension expressions in its scope?
68834c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    // If so, we could clear the diagnostic ID.
6884f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return Visit(E->getSubExpr());
68852de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Plus:
6886c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    // The result is just the value.
6887f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return Visit(E->getSubExpr());
6888f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  case UO_Minus: {
6889f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    if (!Visit(E->getSubExpr()))
6890f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      return false;
6891f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    if (!Result.isInt()) return Error(E);
6892789f9b6be5df6e5151ac35e68416cdf550db1196Richard Smith    const APSInt &Value = Result.getInt();
6893789f9b6be5df6e5151ac35e68416cdf550db1196Richard Smith    if (Value.isSigned() && Value.isMinSignedValue())
6894789f9b6be5df6e5151ac35e68416cdf550db1196Richard Smith      HandleOverflow(Info, E, -Value.extend(Value.getBitWidth() + 1),
6895789f9b6be5df6e5151ac35e68416cdf550db1196Richard Smith                     E->getType());
6896789f9b6be5df6e5151ac35e68416cdf550db1196Richard Smith    return Success(-Value, E);
6897f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  }
6898f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  case UO_Not: {
6899f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    if (!Visit(E->getSubExpr()))
6900f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      return false;
6901f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    if (!Result.isInt()) return Error(E);
6902f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return Success(~Result.getInt(), E);
6903f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  }
6904f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  case UO_LNot: {
6905f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    bool bres;
6906f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    if (!EvaluateAsBooleanCondition(E->getSubExpr(), bres, Info))
6907f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      return false;
6908f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return Success(!bres, E);
6909f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  }
691006a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson  }
6911a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson}
69121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6913732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// HandleCast - This is used to evaluate implicit or explicit casts where the
6914732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// result type is integer.
69158cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool IntExprEvaluator::VisitCastExpr(const CastExpr *E) {
69168cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  const Expr *SubExpr = E->getSubExpr();
691782206e267ce6cc709797127616f64672d255b310Anders Carlsson  QualType DestType = E->getType();
6918b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar  QualType SrcType = SubExpr->getType();
691982206e267ce6cc709797127616f64672d255b310Anders Carlsson
692046a523285928aa07bf14803178dc04616ac85994Eli Friedman  switch (E->getCastKind()) {
692146a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_BaseToDerived:
692246a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_DerivedToBase:
692346a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_UncheckedDerivedToBase:
692446a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_Dynamic:
692546a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_ToUnion:
692646a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_ArrayToPointerDecay:
692746a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_FunctionToPointerDecay:
692846a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_NullToPointer:
692946a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_NullToMemberPointer:
693046a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_BaseToDerivedMemberPointer:
693146a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_DerivedToBaseMemberPointer:
69324d4e5c1ae83f4510caa486b3ad19de13048f9f04John McCall  case CK_ReinterpretMemberPointer:
693346a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_ConstructorConversion:
693446a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_IntegralToPointer:
693546a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_ToVoid:
693646a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_VectorSplat:
693746a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_IntegralToFloating:
693846a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_FloatingCast:
69391d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall  case CK_CPointerToObjCPointerCast:
69401d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall  case CK_BlockPointerToObjCPointerCast:
694146a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_AnyPointerToBlockPointerCast:
694246a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_ObjCObjectLValueCast:
694346a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_FloatingRealToComplex:
694446a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_FloatingComplexToReal:
694546a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_FloatingComplexCast:
694646a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_FloatingComplexToIntegralComplex:
694746a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_IntegralRealToComplex:
694846a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_IntegralComplexCast:
694946a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_IntegralComplexToFloatingComplex:
6950a6c66cedc022c9e5d45a937d6b8cff491a6bf81bEli Friedman  case CK_BuiltinFnToFnPtr:
6951e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei  case CK_ZeroToOCLEvent:
69525705f211472f19fc38e58d81365f9261024b3ba3Richard Smith  case CK_NonAtomicToAtomic:
695346a523285928aa07bf14803178dc04616ac85994Eli Friedman    llvm_unreachable("invalid cast kind for integral value");
695446a523285928aa07bf14803178dc04616ac85994Eli Friedman
6955e50c297f92914ca996deb8b597624193273b62e4Eli Friedman  case CK_BitCast:
695646a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_Dependent:
695746a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_LValueBitCast:
695833e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall  case CK_ARCProduceObject:
695933e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall  case CK_ARCConsumeObject:
696033e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall  case CK_ARCReclaimReturnedObject:
696133e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall  case CK_ARCExtendBlockObject:
6962ac1303eca6cbe3e623fb5ec6fe7ec184ef4b0dfaDouglas Gregor  case CK_CopyAndAutoreleaseBlockObject:
6963f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return Error(E);
696446a523285928aa07bf14803178dc04616ac85994Eli Friedman
69657d580a4e9e47dffc3c17aa2b957ac57ca3c4e451Richard Smith  case CK_UserDefinedConversion:
696646a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_LValueToRValue:
69677a7ee3033e44b45630981355460ef89efa0bdcc4David Chisnall  case CK_AtomicToNonAtomic:
696846a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_NoOp:
6969c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return ExprEvaluatorBaseTy::VisitCastExpr(E);
697046a523285928aa07bf14803178dc04616ac85994Eli Friedman
697146a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_MemberPointerToBoolean:
697246a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_PointerToBoolean:
697346a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_IntegralToBoolean:
697446a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_FloatingToBoolean:
697546a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_FloatingComplexToBoolean:
697646a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_IntegralComplexToBoolean: {
69774efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    bool BoolResult;
6978c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    if (!EvaluateAsBooleanCondition(SubExpr, BoolResult, Info))
69794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
6980131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(BoolResult, E);
69814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
69824efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
698346a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_IntegralCast: {
6984732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner    if (!Visit(SubExpr))
6985b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner      return false;
6986a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
6987be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    if (!Result.isInt()) {
698865639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman      // Allow casts of address-of-label differences if they are no-ops
698965639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman      // or narrowing.  (The narrowing case isn't actually guaranteed to
699065639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman      // be constant-evaluatable except in some narrow cases which are hard
699165639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman      // to detect here.  We let it through on the assumption the user knows
699265639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman      // what they are doing.)
699365639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman      if (Result.isAddrLabelDiff())
699465639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman        return Info.Ctx.getTypeSize(DestType) <= Info.Ctx.getTypeSize(SrcType);
6995be26570e3faa009bdcefedfaf04473e518940520Eli Friedman      // Only allow casts of lvalues if they are lossless.
6996be26570e3faa009bdcefedfaf04473e518940520Eli Friedman      return Info.Ctx.getTypeSize(DestType) == Info.Ctx.getTypeSize(SrcType);
6997be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    }
699830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar
6999f72fccf533bca206af8e75d041c29db99e6a7f2cRichard Smith    return Success(HandleIntToIntCast(Info, E, DestType, SrcType,
7000f72fccf533bca206af8e75d041c29db99e6a7f2cRichard Smith                                      Result.getInt()), E);
7001732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner  }
70021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
700346a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_PointerToIntegral: {
7004c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith    CCEDiag(E, diag::note_constexpr_invalid_cast) << 2;
7005c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith
7006efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    LValue LV;
700787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner    if (!EvaluatePointer(SubExpr, LV, Info))
7008b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner      return false;
70094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
7010dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar    if (LV.getLValueBase()) {
7011dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar      // Only allow based lvalue casts if they are lossless.
7012f72fccf533bca206af8e75d041c29db99e6a7f2cRichard Smith      // FIXME: Allow a larger integer size than the pointer size, and allow
7013f72fccf533bca206af8e75d041c29db99e6a7f2cRichard Smith      // narrowing back down to pointer width in subsequent integral casts.
7014f72fccf533bca206af8e75d041c29db99e6a7f2cRichard Smith      // FIXME: Check integer type's active bits, not its type size.
7015dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar      if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(SrcType))
7016f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith        return Error(E);
7017dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar
7018b755a9da095d2f2f04444797f1e1a9511693815bRichard Smith      LV.Designator.setInvalid();
7019efdb83e26f9a1fd2566afe54461216cd84814d42John McCall      LV.moveInto(Result);
7020dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar      return true;
7021dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar    }
70224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
7023a73058324197b7bdfd19307965954f626e26199dKen Dyck    APSInt AsInt = Info.Ctx.MakeIntValue(LV.getLValueOffset().getQuantity(),
7024a73058324197b7bdfd19307965954f626e26199dKen Dyck                                         SrcType);
7025f72fccf533bca206af8e75d041c29db99e6a7f2cRichard Smith    return Success(HandleIntToIntCast(Info, E, DestType, SrcType, AsInt), E);
70262bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  }
70274efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
702846a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_IntegralComplexToReal: {
7029f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    ComplexValue C;
70301725f683432715e5afe34d476024bd6f16eac3fcEli Friedman    if (!EvaluateComplex(SubExpr, C, Info))
70311725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      return false;
703246a523285928aa07bf14803178dc04616ac85994Eli Friedman    return Success(C.getComplexIntReal(), E);
70331725f683432715e5afe34d476024bd6f16eac3fcEli Friedman  }
70342217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman
703546a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_FloatingToIntegral: {
703646a523285928aa07bf14803178dc04616ac85994Eli Friedman    APFloat F(0.0);
703746a523285928aa07bf14803178dc04616ac85994Eli Friedman    if (!EvaluateFloat(SubExpr, F, Info))
703846a523285928aa07bf14803178dc04616ac85994Eli Friedman      return false;
7039732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner
7040c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    APSInt Value;
7041c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    if (!HandleFloatToIntCast(Info, E, SrcType, F, DestType, Value))
7042c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith      return false;
7043c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    return Success(Value, E);
704446a523285928aa07bf14803178dc04616ac85994Eli Friedman  }
704546a523285928aa07bf14803178dc04616ac85994Eli Friedman  }
70461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
704746a523285928aa07bf14803178dc04616ac85994Eli Friedman  llvm_unreachable("unknown cast resulting in integral value");
7048a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson}
70492bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
7050722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedmanbool IntExprEvaluator::VisitUnaryReal(const UnaryOperator *E) {
7051722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  if (E->getSubExpr()->getType()->isAnyComplexType()) {
7052f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    ComplexValue LV;
7053f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    if (!EvaluateComplex(E->getSubExpr(), LV, Info))
7054f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      return false;
7055f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    if (!LV.isComplexInt())
7056f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      return Error(E);
7057722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman    return Success(LV.getComplexIntReal(), E);
7058722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  }
7059722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman
7060722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  return Visit(E->getSubExpr());
7061722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman}
7062722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman
7063664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedmanbool IntExprEvaluator::VisitUnaryImag(const UnaryOperator *E) {
7064722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  if (E->getSubExpr()->getType()->isComplexIntegerType()) {
7065f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    ComplexValue LV;
7066f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    if (!EvaluateComplex(E->getSubExpr(), LV, Info))
7067f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      return false;
7068f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    if (!LV.isComplexInt())
7069f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      return Error(E);
7070722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman    return Success(LV.getComplexIntImag(), E);
7071722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  }
7072722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman
70738327fad71da34492d82c532f42a58cb4baff81a3Richard Smith  VisitIgnoredValue(E->getSubExpr());
7074664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman  return Success(0, E);
7075664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman}
7076664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman
7077ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregorbool IntExprEvaluator::VisitSizeOfPackExpr(const SizeOfPackExpr *E) {
7078ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  return Success(E->getPackLength(), E);
7079ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor}
7080ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor
7081295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlbool IntExprEvaluator::VisitCXXNoexceptExpr(const CXXNoexceptExpr *E) {
7082295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  return Success(E->getValue(), E);
7083295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl}
7084295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl
7085f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
7086d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman// Float Evaluation
7087d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===//
7088d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
7089d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmannamespace {
7090770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass FloatExprEvaluator
70918cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  : public ExprEvaluatorBase<FloatExprEvaluator, bool> {
7092d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  APFloat &Result;
7093d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanpublic:
7094d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  FloatExprEvaluator(EvalInfo &info, APFloat &result)
70958cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    : ExprEvaluatorBaseTy(info), Result(result) {}
7096d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
70971aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith  bool Success(const APValue &V, const Expr *e) {
70988cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    Result = V.getFloat();
70998cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    return true;
71008cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  }
7101d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
710251201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  bool ZeroInitialization(const Expr *E) {
7103f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith    Result = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(E->getType()));
7104f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith    return true;
7105f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith  }
7106f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith
7107019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  bool VisitCallExpr(const CallExpr *E);
7108d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
71095db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  bool VisitUnaryOperator(const UnaryOperator *E);
7110d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitBinaryOperator(const BinaryOperator *E);
7111d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitFloatingLiteral(const FloatingLiteral *E);
71128cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitCastExpr(const CastExpr *E);
71132217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman
7114abd3a857ace59100305790545d1baae5877b8945John McCall  bool VisitUnaryReal(const UnaryOperator *E);
7115abd3a857ace59100305790545d1baae5877b8945John McCall  bool VisitUnaryImag(const UnaryOperator *E);
7116ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman
711751201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  // FIXME: Missing: array subscript of vector, member of vector
7118d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman};
7119d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} // end anonymous namespace
7120d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
7121d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr* E, APFloat& Result, EvalInfo &Info) {
7122c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  assert(E->isRValue() && E->getType()->isRealFloatingType());
71238cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  return FloatExprEvaluator(Info, Result).Visit(E);
7124d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}
7125d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
71264ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadstatic bool TryEvaluateBuiltinNaN(const ASTContext &Context,
7127db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall                                  QualType ResultTy,
7128db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall                                  const Expr *Arg,
7129db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall                                  bool SNaN,
7130db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall                                  llvm::APFloat &Result) {
7131db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall  const StringLiteral *S = dyn_cast<StringLiteral>(Arg->IgnoreParenCasts());
7132db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall  if (!S) return false;
7133db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall
7134db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall  const llvm::fltSemantics &Sem = Context.getFloatTypeSemantics(ResultTy);
7135db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall
7136db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall  llvm::APInt fill;
7137db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall
7138db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall  // Treat empty strings as if they were zero.
7139db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall  if (S->getString().empty())
7140db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall    fill = llvm::APInt(32, 0);
7141db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall  else if (S->getString().getAsInteger(0, fill))
7142db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall    return false;
7143db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall
7144db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall  if (SNaN)
7145db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall    Result = llvm::APFloat::getSNaN(Sem, false, &fill);
7146db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall  else
7147db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall    Result = llvm::APFloat::getQNaN(Sem, false, &fill);
7148db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall  return true;
7149db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall}
7150db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall
7151019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattnerbool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) {
7152180f47959a066795cc0f409433023af448bb0328Richard Smith  switch (E->isBuiltinCall()) {
71538cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  default:
71548cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    return ExprEvaluatorBaseTy::VisitCallExpr(E);
71558cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne
7156019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_huge_val:
7157019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_huge_valf:
7158019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_huge_vall:
7159019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_inf:
7160019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_inff:
71617cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar  case Builtin::BI__builtin_infl: {
71627cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar    const llvm::fltSemantics &Sem =
71637cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar      Info.Ctx.getFloatTypeSemantics(E->getType());
716434a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner    Result = llvm::APFloat::getInf(Sem);
716534a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner    return true;
71667cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar  }
71671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7168db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall  case Builtin::BI__builtin_nans:
7169db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall  case Builtin::BI__builtin_nansf:
7170db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall  case Builtin::BI__builtin_nansl:
7171f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    if (!TryEvaluateBuiltinNaN(Info.Ctx, E->getType(), E->getArg(0),
7172f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith                               true, Result))
7173f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      return Error(E);
7174f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return true;
7175db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall
71769e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner  case Builtin::BI__builtin_nan:
71779e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner  case Builtin::BI__builtin_nanf:
71789e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner  case Builtin::BI__builtin_nanl:
71794572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump    // If this is __builtin_nan() turn this into a nan, otherwise we
71809e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    // can't constant fold it.
7181f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    if (!TryEvaluateBuiltinNaN(Info.Ctx, E->getType(), E->getArg(0),
7182f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith                               false, Result))
7183f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      return Error(E);
7184f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return true;
71855db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar
71865db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_fabs:
71875db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_fabsf:
71885db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_fabsl:
71895db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    if (!EvaluateFloat(E->getArg(0), Result, Info))
71905db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar      return false;
71911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
71925db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    if (Result.isNegative())
71935db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar      Result.changeSign();
71945db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
71955db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar
7196acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith  // FIXME: Builtin::BI__builtin_powi
7197acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith  // FIXME: Builtin::BI__builtin_powif
7198acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith  // FIXME: Builtin::BI__builtin_powil
7199acaf72adaed7b320fdec8c09f70ec9ac46df3563Richard Smith
72001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  case Builtin::BI__builtin_copysign:
72011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  case Builtin::BI__builtin_copysignf:
72025db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_copysignl: {
72035db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    APFloat RHS(0.);
72045db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    if (!EvaluateFloat(E->getArg(0), Result, Info) ||
72055db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar        !EvaluateFloat(E->getArg(1), RHS, Info))
72065db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar      return false;
72075db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    Result.copySign(RHS);
72085db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
72095db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  }
7210019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  }
7211019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner}
7212019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner
7213abd3a857ace59100305790545d1baae5877b8945John McCallbool FloatExprEvaluator::VisitUnaryReal(const UnaryOperator *E) {
721443efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman  if (E->getSubExpr()->getType()->isAnyComplexType()) {
721543efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman    ComplexValue CV;
721643efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman    if (!EvaluateComplex(E->getSubExpr(), CV, Info))
721743efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman      return false;
721843efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman    Result = CV.FloatReal;
721943efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman    return true;
722043efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman  }
722143efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman
722243efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman  return Visit(E->getSubExpr());
7223abd3a857ace59100305790545d1baae5877b8945John McCall}
7224abd3a857ace59100305790545d1baae5877b8945John McCall
7225abd3a857ace59100305790545d1baae5877b8945John McCallbool FloatExprEvaluator::VisitUnaryImag(const UnaryOperator *E) {
722643efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman  if (E->getSubExpr()->getType()->isAnyComplexType()) {
722743efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman    ComplexValue CV;
722843efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman    if (!EvaluateComplex(E->getSubExpr(), CV, Info))
722943efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman      return false;
723043efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman    Result = CV.FloatImag;
723143efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman    return true;
723243efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman  }
723343efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman
72348327fad71da34492d82c532f42a58cb4baff81a3Richard Smith  VisitIgnoredValue(E->getSubExpr());
723543efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman  const llvm::fltSemantics &Sem = Info.Ctx.getFloatTypeSemantics(E->getType());
723643efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman  Result = llvm::APFloat::getZero(Sem);
7237abd3a857ace59100305790545d1baae5877b8945John McCall  return true;
7238abd3a857ace59100305790545d1baae5877b8945John McCall}
7239abd3a857ace59100305790545d1baae5877b8945John McCall
72405db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbarbool FloatExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
72415db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  switch (E->getOpcode()) {
7242f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  default: return Error(E);
72432de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Plus:
72447993e8a2a26bf408c2a6d45f24fffa12db336b2bRichard Smith    return EvaluateFloat(E->getSubExpr(), Result, Info);
72452de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Minus:
72467993e8a2a26bf408c2a6d45f24fffa12db336b2bRichard Smith    if (!EvaluateFloat(E->getSubExpr(), Result, Info))
72477993e8a2a26bf408c2a6d45f24fffa12db336b2bRichard Smith      return false;
72485db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    Result.changeSign();
72495db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
72505db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  }
72515db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar}
7252019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner
7253d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
7254e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  if (E->isPtrMemOp() || E->isAssignmentOp() || E->getOpcode() == BO_Comma)
7255e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    return ExprEvaluatorBaseTy::VisitBinaryOperator(E);
725696e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson
72575db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  APFloat RHS(0.0);
7258745f5147e065900267c85a5568785a1991d4838fRichard Smith  bool LHSOK = EvaluateFloat(E->getLHS(), Result, Info);
7259745f5147e065900267c85a5568785a1991d4838fRichard Smith  if (!LHSOK && !Info.keepEvaluatingAfterFailure())
7260d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return false;
7261a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith  return EvaluateFloat(E->getRHS(), RHS, Info) && LHSOK &&
7262a49a7fe2a7c1881402be25ca9124d3883637198fRichard Smith         handleFloatFloatBinOp(Info, E, Result, E->getOpcode(), RHS);
7263d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}
7264d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
7265d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitFloatingLiteral(const FloatingLiteral *E) {
7266d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  Result = E->getValue();
7267d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  return true;
7268d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}
7269d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
72708cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool FloatExprEvaluator::VisitCastExpr(const CastExpr *E) {
72718cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  const Expr* SubExpr = E->getSubExpr();
72721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
72732a523eec6a31955be876625819b89e8dc5def707Eli Friedman  switch (E->getCastKind()) {
72742a523eec6a31955be876625819b89e8dc5def707Eli Friedman  default:
7275c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return ExprEvaluatorBaseTy::VisitCastExpr(E);
72762a523eec6a31955be876625819b89e8dc5def707Eli Friedman
72772a523eec6a31955be876625819b89e8dc5def707Eli Friedman  case CK_IntegralToFloating: {
72784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APSInt IntResult;
7279c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    return EvaluateInteger(SubExpr, IntResult, Info) &&
7280c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith           HandleIntToFloatCast(Info, E, SubExpr->getType(), IntResult,
7281c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith                                E->getType(), Result);
72824efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
72832a523eec6a31955be876625819b89e8dc5def707Eli Friedman
72842a523eec6a31955be876625819b89e8dc5def707Eli Friedman  case CK_FloatingCast: {
72854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!Visit(SubExpr))
72864efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
7287c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    return HandleFloatToFloatCast(Info, E, SubExpr->getType(), E->getType(),
7288c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith                                  Result);
72894efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
7290f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall
72912a523eec6a31955be876625819b89e8dc5def707Eli Friedman  case CK_FloatingComplexToReal: {
7292f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall    ComplexValue V;
7293f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall    if (!EvaluateComplex(SubExpr, V, Info))
7294f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall      return false;
7295f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall    Result = V.getComplexFloatReal();
7296f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall    return true;
7297f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall  }
72982a523eec6a31955be876625819b89e8dc5def707Eli Friedman  }
72994efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
73004efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
7301d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===//
7302a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar// Complex Evaluation (for float and integer)
73039ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===//
73049ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
73059ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonnamespace {
7306770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass ComplexExprEvaluator
73078cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  : public ExprEvaluatorBase<ComplexExprEvaluator, bool> {
7308f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall  ComplexValue &Result;
73091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
73109ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonpublic:
7311f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall  ComplexExprEvaluator(EvalInfo &info, ComplexValue &Result)
73128cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    : ExprEvaluatorBaseTy(info), Result(Result) {}
73131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
73141aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith  bool Success(const APValue &V, const Expr *e) {
73158cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    Result.setFrom(V);
73168cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne    return true;
73178cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  }
73181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
73197ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman  bool ZeroInitialization(const Expr *E);
73207ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman
73218cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  //===--------------------------------------------------------------------===//
73228cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  //                            Visitor Methods
73238cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  //===--------------------------------------------------------------------===//
73249ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
73258cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitImaginaryLiteral(const ImaginaryLiteral *E);
73268cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  bool VisitCastExpr(const CastExpr *E);
7327b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman  bool VisitBinaryOperator(const BinaryOperator *E);
732896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara  bool VisitUnaryOperator(const UnaryOperator *E);
73297ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman  bool VisitInitListExpr(const InitListExpr *E);
7330b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman};
7331b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman} // end anonymous namespace
73321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7333b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedmanstatic bool EvaluateComplex(const Expr *E, ComplexValue &Result,
7334b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman                            EvalInfo &Info) {
7335c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  assert(E->isRValue() && E->getType()->isAnyComplexType());
73368cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  return ComplexExprEvaluator(Info, Result).Visit(E);
7337b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman}
7338b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman
73397ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedmanbool ComplexExprEvaluator::ZeroInitialization(const Expr *E) {
7340890f0f1612b0028b8b16730ae7ed07e295600c76Ted Kremenek  QualType ElemTy = E->getType()->castAs<ComplexType>()->getElementType();
73417ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman  if (ElemTy->isRealFloatingType()) {
73427ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman    Result.makeComplexFloat();
73437ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman    APFloat Zero = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(ElemTy));
73447ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman    Result.FloatReal = Zero;
73457ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman    Result.FloatImag = Zero;
73467ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman  } else {
73477ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman    Result.makeComplexInt();
73487ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman    APSInt Zero = Info.Ctx.MakeIntValue(0, ElemTy);
73497ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman    Result.IntReal = Zero;
73507ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman    Result.IntImag = Zero;
73517ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman  }
73527ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman  return true;
73537ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman}
73547ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman
73558cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool ComplexExprEvaluator::VisitImaginaryLiteral(const ImaginaryLiteral *E) {
73568cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne  const Expr* SubExpr = E->getSubExpr();
7357b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman
7358b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman  if (SubExpr->getType()->isRealFloatingType()) {
7359b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman    Result.makeComplexFloat();
7360b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman    APFloat &Imag = Result.FloatImag;
7361b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman    if (!EvaluateFloat(SubExpr, Imag, Info))
7362b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman      return false;
7363b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman
7364b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman    Result.FloatReal = APFloat(Imag.getSemantics());
7365b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman    return true;
7366b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman  } else {
7367b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman    assert(SubExpr->getType()->isIntegerType() &&
7368b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman           "Unexpected imaginary literal.");
7369b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman
7370b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman    Result.makeComplexInt();
7371b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman    APSInt &Imag = Result.IntImag;
7372b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman    if (!EvaluateInteger(SubExpr, Imag, Info))
7373b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman      return false;
7374b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman
7375b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman    Result.IntReal = APSInt(Imag.getBitWidth(), !Imag.isSigned());
7376b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman    return true;
7377b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman  }
7378b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman}
7379b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman
73808cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool ComplexExprEvaluator::VisitCastExpr(const CastExpr *E) {
7381b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman
73828786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  switch (E->getCastKind()) {
73838786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_BitCast:
73848786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_BaseToDerived:
73858786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_DerivedToBase:
73868786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_UncheckedDerivedToBase:
73878786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_Dynamic:
73888786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_ToUnion:
73898786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_ArrayToPointerDecay:
73908786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_FunctionToPointerDecay:
73918786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_NullToPointer:
73928786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_NullToMemberPointer:
73938786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_BaseToDerivedMemberPointer:
73948786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_DerivedToBaseMemberPointer:
73958786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_MemberPointerToBoolean:
73964d4e5c1ae83f4510caa486b3ad19de13048f9f04John McCall  case CK_ReinterpretMemberPointer:
73978786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_ConstructorConversion:
73988786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_IntegralToPointer:
73998786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_PointerToIntegral:
74008786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_PointerToBoolean:
74018786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_ToVoid:
74028786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_VectorSplat:
74038786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_IntegralCast:
74048786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_IntegralToBoolean:
74058786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_IntegralToFloating:
74068786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_FloatingToIntegral:
74078786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_FloatingToBoolean:
74088786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_FloatingCast:
74091d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall  case CK_CPointerToObjCPointerCast:
74101d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall  case CK_BlockPointerToObjCPointerCast:
74118786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_AnyPointerToBlockPointerCast:
74128786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_ObjCObjectLValueCast:
74138786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_FloatingComplexToReal:
74148786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_FloatingComplexToBoolean:
74158786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_IntegralComplexToReal:
74168786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_IntegralComplexToBoolean:
741733e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall  case CK_ARCProduceObject:
741833e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall  case CK_ARCConsumeObject:
741933e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall  case CK_ARCReclaimReturnedObject:
742033e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall  case CK_ARCExtendBlockObject:
7421ac1303eca6cbe3e623fb5ec6fe7ec184ef4b0dfaDouglas Gregor  case CK_CopyAndAutoreleaseBlockObject:
7422a6c66cedc022c9e5d45a937d6b8cff491a6bf81bEli Friedman  case CK_BuiltinFnToFnPtr:
7423e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei  case CK_ZeroToOCLEvent:
74245705f211472f19fc38e58d81365f9261024b3ba3Richard Smith  case CK_NonAtomicToAtomic:
74258786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    llvm_unreachable("invalid cast kind for complex value");
74268786da77984e81d48e0e1b2bd339809b1efc19f3John McCall
74278786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_LValueToRValue:
74287a7ee3033e44b45630981355460ef89efa0bdcc4David Chisnall  case CK_AtomicToNonAtomic:
74298786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_NoOp:
7430c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return ExprEvaluatorBaseTy::VisitCastExpr(E);
74312bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall
74328786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_Dependent:
743346a523285928aa07bf14803178dc04616ac85994Eli Friedman  case CK_LValueBitCast:
74348786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_UserDefinedConversion:
7435f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return Error(E);
74368786da77984e81d48e0e1b2bd339809b1efc19f3John McCall
74378786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_FloatingRealToComplex: {
7438b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman    APFloat &Real = Result.FloatReal;
74398786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    if (!EvaluateFloat(E->getSubExpr(), Real, Info))
7440b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman      return false;
7441b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman
74428786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    Result.makeComplexFloat();
74438786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    Result.FloatImag = APFloat(Real.getSemantics());
74448786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    return true;
74458786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  }
74468786da77984e81d48e0e1b2bd339809b1efc19f3John McCall
74478786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_FloatingComplexCast: {
74488786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    if (!Visit(E->getSubExpr()))
74498786da77984e81d48e0e1b2bd339809b1efc19f3John McCall      return false;
74508786da77984e81d48e0e1b2bd339809b1efc19f3John McCall
74518786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    QualType To = E->getType()->getAs<ComplexType>()->getElementType();
74528786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    QualType From
74538786da77984e81d48e0e1b2bd339809b1efc19f3John McCall      = E->getSubExpr()->getType()->getAs<ComplexType>()->getElementType();
74548786da77984e81d48e0e1b2bd339809b1efc19f3John McCall
7455c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    return HandleFloatToFloatCast(Info, E, From, To, Result.FloatReal) &&
7456c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith           HandleFloatToFloatCast(Info, E, From, To, Result.FloatImag);
74578786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  }
74588786da77984e81d48e0e1b2bd339809b1efc19f3John McCall
74598786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_FloatingComplexToIntegralComplex: {
74608786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    if (!Visit(E->getSubExpr()))
74618786da77984e81d48e0e1b2bd339809b1efc19f3John McCall      return false;
74628786da77984e81d48e0e1b2bd339809b1efc19f3John McCall
74638786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    QualType To = E->getType()->getAs<ComplexType>()->getElementType();
74648786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    QualType From
74658786da77984e81d48e0e1b2bd339809b1efc19f3John McCall      = E->getSubExpr()->getType()->getAs<ComplexType>()->getElementType();
74668786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    Result.makeComplexInt();
7467c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    return HandleFloatToIntCast(Info, E, From, Result.FloatReal,
7468c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith                                To, Result.IntReal) &&
7469c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith           HandleFloatToIntCast(Info, E, From, Result.FloatImag,
7470c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith                                To, Result.IntImag);
74718786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  }
74728786da77984e81d48e0e1b2bd339809b1efc19f3John McCall
74738786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_IntegralRealToComplex: {
7474b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman    APSInt &Real = Result.IntReal;
74758786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    if (!EvaluateInteger(E->getSubExpr(), Real, Info))
7476b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman      return false;
74779ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
74788786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    Result.makeComplexInt();
74798786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    Result.IntImag = APSInt(Real.getBitWidth(), !Real.isSigned());
74808786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    return true;
74818786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  }
74828786da77984e81d48e0e1b2bd339809b1efc19f3John McCall
74838786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_IntegralComplexCast: {
74848786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    if (!Visit(E->getSubExpr()))
7485b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman      return false;
7486ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
74878786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    QualType To = E->getType()->getAs<ComplexType>()->getElementType();
74888786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    QualType From
74898786da77984e81d48e0e1b2bd339809b1efc19f3John McCall      = E->getSubExpr()->getType()->getAs<ComplexType>()->getElementType();
74901725f683432715e5afe34d476024bd6f16eac3fcEli Friedman
7491f72fccf533bca206af8e75d041c29db99e6a7f2cRichard Smith    Result.IntReal = HandleIntToIntCast(Info, E, To, From, Result.IntReal);
7492f72fccf533bca206af8e75d041c29db99e6a7f2cRichard Smith    Result.IntImag = HandleIntToIntCast(Info, E, To, From, Result.IntImag);
74938786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    return true;
74948786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  }
74958786da77984e81d48e0e1b2bd339809b1efc19f3John McCall
74968786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  case CK_IntegralComplexToFloatingComplex: {
74978786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    if (!Visit(E->getSubExpr()))
74988786da77984e81d48e0e1b2bd339809b1efc19f3John McCall      return false;
74998786da77984e81d48e0e1b2bd339809b1efc19f3John McCall
7500890f0f1612b0028b8b16730ae7ed07e295600c76Ted Kremenek    QualType To = E->getType()->castAs<ComplexType>()->getElementType();
75018786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    QualType From
7502890f0f1612b0028b8b16730ae7ed07e295600c76Ted Kremenek      = E->getSubExpr()->getType()->castAs<ComplexType>()->getElementType();
75038786da77984e81d48e0e1b2bd339809b1efc19f3John McCall    Result.makeComplexFloat();
7504c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    return HandleIntToFloatCast(Info, E, From, Result.IntReal,
7505c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith                                To, Result.FloatReal) &&
7506c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith           HandleIntToFloatCast(Info, E, From, Result.IntImag,
7507c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith                                To, Result.FloatImag);
75088786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  }
7509ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  }
75101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
75118786da77984e81d48e0e1b2bd339809b1efc19f3John McCall  llvm_unreachable("unknown cast resulting in complex value");
75129ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson}
75139ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
7514f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCallbool ComplexExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
7515e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith  if (E->isPtrMemOp() || E->isAssignmentOp() || E->getOpcode() == BO_Comma)
75162ad226bdc847df6b6b6e4f832856478ab63bb3dcRichard Smith    return ExprEvaluatorBaseTy::VisitBinaryOperator(E);
75172ad226bdc847df6b6b6e4f832856478ab63bb3dcRichard Smith
7518745f5147e065900267c85a5568785a1991d4838fRichard Smith  bool LHSOK = Visit(E->getLHS());
7519745f5147e065900267c85a5568785a1991d4838fRichard Smith  if (!LHSOK && !Info.keepEvaluatingAfterFailure())
7520f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    return false;
75211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7522f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall  ComplexValue RHS;
7523745f5147e065900267c85a5568785a1991d4838fRichard Smith  if (!EvaluateComplex(E->getRHS(), RHS, Info) || !LHSOK)
7524f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall    return false;
7525a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
75263f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar  assert(Result.isComplexFloat() == RHS.isComplexFloat() &&
75273f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar         "Invalid operands to binary operator.");
7528ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  switch (E->getOpcode()) {
7529f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  default: return Error(E);
75302de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Add:
7531a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    if (Result.isComplexFloat()) {
7532a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatReal().add(RHS.getComplexFloatReal(),
7533a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                       APFloat::rmNearestTiesToEven);
7534a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatImag().add(RHS.getComplexFloatImag(),
7535a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                       APFloat::rmNearestTiesToEven);
7536a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    } else {
7537a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntReal() += RHS.getComplexIntReal();
7538a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntImag() += RHS.getComplexIntImag();
7539a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    }
75403f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    break;
75412de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Sub:
7542a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    if (Result.isComplexFloat()) {
7543a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatReal().subtract(RHS.getComplexFloatReal(),
7544a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                            APFloat::rmNearestTiesToEven);
7545a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatImag().subtract(RHS.getComplexFloatImag(),
7546a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                            APFloat::rmNearestTiesToEven);
7547a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    } else {
7548a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntReal() -= RHS.getComplexIntReal();
7549a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntImag() -= RHS.getComplexIntImag();
7550a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    }
75513f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    break;
75522de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Mul:
75533f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    if (Result.isComplexFloat()) {
7554f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall      ComplexValue LHS = Result;
75553f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &LHS_r = LHS.getComplexFloatReal();
75563f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &LHS_i = LHS.getComplexFloatImag();
75573f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &RHS_r = RHS.getComplexFloatReal();
75583f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &RHS_i = RHS.getComplexFloatImag();
75591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
75603f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat Tmp = LHS_r;
75613f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven);
75623f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatReal() = Tmp;
75633f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp = LHS_i;
75643f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven);
75653f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatReal().subtract(Tmp, APFloat::rmNearestTiesToEven);
75663f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar
75673f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp = LHS_r;
75683f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven);
75693f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatImag() = Tmp;
75703f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp = LHS_i;
75713f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven);
75723f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatImag().add(Tmp, APFloat::rmNearestTiesToEven);
75733f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    } else {
7574f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall      ComplexValue LHS = Result;
75751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Result.getComplexIntReal() =
75763f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar        (LHS.getComplexIntReal() * RHS.getComplexIntReal() -
75773f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar         LHS.getComplexIntImag() * RHS.getComplexIntImag());
75781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Result.getComplexIntImag() =
75793f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar        (LHS.getComplexIntReal() * RHS.getComplexIntImag() +
75803f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar         LHS.getComplexIntImag() * RHS.getComplexIntReal());
75813f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    }
75823f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    break;
758396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara  case BO_Div:
758496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    if (Result.isComplexFloat()) {
758596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      ComplexValue LHS = Result;
758696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      APFloat &LHS_r = LHS.getComplexFloatReal();
758796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      APFloat &LHS_i = LHS.getComplexFloatImag();
758896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      APFloat &RHS_r = RHS.getComplexFloatReal();
758996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      APFloat &RHS_i = RHS.getComplexFloatImag();
759096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      APFloat &Res_r = Result.getComplexFloatReal();
759196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      APFloat &Res_i = Result.getComplexFloatImag();
759296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara
759396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      APFloat Den = RHS_r;
759496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Den.multiply(RHS_r, APFloat::rmNearestTiesToEven);
759596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      APFloat Tmp = RHS_i;
759696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven);
759796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Den.add(Tmp, APFloat::rmNearestTiesToEven);
759896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara
759996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Res_r = LHS_r;
760096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Res_r.multiply(RHS_r, APFloat::rmNearestTiesToEven);
760196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Tmp = LHS_i;
760296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven);
760396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Res_r.add(Tmp, APFloat::rmNearestTiesToEven);
760496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Res_r.divide(Den, APFloat::rmNearestTiesToEven);
760596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara
760696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Res_i = LHS_i;
760796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Res_i.multiply(RHS_r, APFloat::rmNearestTiesToEven);
760896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Tmp = LHS_r;
760996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven);
761096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Res_i.subtract(Tmp, APFloat::rmNearestTiesToEven);
761196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Res_i.divide(Den, APFloat::rmNearestTiesToEven);
761296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    } else {
7613f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      if (RHS.getComplexIntReal() == 0 && RHS.getComplexIntImag() == 0)
7614f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith        return Error(E, diag::note_expr_divide_by_zero);
7615f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith
761696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      ComplexValue LHS = Result;
761796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      APSInt Den = RHS.getComplexIntReal() * RHS.getComplexIntReal() +
761896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara        RHS.getComplexIntImag() * RHS.getComplexIntImag();
761996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Result.getComplexIntReal() =
762096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara        (LHS.getComplexIntReal() * RHS.getComplexIntReal() +
762196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara         LHS.getComplexIntImag() * RHS.getComplexIntImag()) / Den;
762296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Result.getComplexIntImag() =
762396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara        (LHS.getComplexIntImag() * RHS.getComplexIntReal() -
762496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara         LHS.getComplexIntReal() * RHS.getComplexIntImag()) / Den;
762596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    }
762696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    break;
7627ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  }
7628ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
7629f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall  return true;
7630ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson}
7631ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
763296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnarabool ComplexExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
763396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara  // Get the operand value into 'Result'.
763496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara  if (!Visit(E->getSubExpr()))
763596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    return false;
763696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara
763796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara  switch (E->getOpcode()) {
763896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara  default:
7639f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return Error(E);
764096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara  case UO_Extension:
764196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    return true;
764296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara  case UO_Plus:
764396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    // The result is always just the subexpr.
764496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    return true;
764596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara  case UO_Minus:
764696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    if (Result.isComplexFloat()) {
764796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Result.getComplexFloatReal().changeSign();
764896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Result.getComplexFloatImag().changeSign();
764996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    }
765096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    else {
765196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Result.getComplexIntReal() = -Result.getComplexIntReal();
765296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Result.getComplexIntImag() = -Result.getComplexIntImag();
765396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    }
765496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    return true;
765596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara  case UO_Not:
765696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    if (Result.isComplexFloat())
765796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Result.getComplexFloatImag().changeSign();
765896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    else
765996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara      Result.getComplexIntImag() = -Result.getComplexIntImag();
766096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara    return true;
766196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara  }
766296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara}
766396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara
76647ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedmanbool ComplexExprEvaluator::VisitInitListExpr(const InitListExpr *E) {
76657ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman  if (E->getNumInits() == 2) {
76667ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman    if (E->getType()->isComplexType()) {
76677ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman      Result.makeComplexFloat();
76687ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman      if (!EvaluateFloat(E->getInit(0), Result.FloatReal, Info))
76697ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman        return false;
76707ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman      if (!EvaluateFloat(E->getInit(1), Result.FloatImag, Info))
76717ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman        return false;
76727ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman    } else {
76737ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman      Result.makeComplexInt();
76747ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman      if (!EvaluateInteger(E->getInit(0), Result.IntReal, Info))
76757ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman        return false;
76767ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman      if (!EvaluateInteger(E->getInit(1), Result.IntImag, Info))
76777ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman        return false;
76787ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman    }
76797ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman    return true;
76807ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman  }
76817ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman  return ExprEvaluatorBaseTy::VisitInitListExpr(E);
76827ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman}
76837ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman
76849ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===//
76855705f211472f19fc38e58d81365f9261024b3ba3Richard Smith// Atomic expression evaluation, essentially just handling the NonAtomicToAtomic
76865705f211472f19fc38e58d81365f9261024b3ba3Richard Smith// implicit conversion.
76875705f211472f19fc38e58d81365f9261024b3ba3Richard Smith//===----------------------------------------------------------------------===//
76885705f211472f19fc38e58d81365f9261024b3ba3Richard Smith
76895705f211472f19fc38e58d81365f9261024b3ba3Richard Smithnamespace {
76905705f211472f19fc38e58d81365f9261024b3ba3Richard Smithclass AtomicExprEvaluator :
76915705f211472f19fc38e58d81365f9261024b3ba3Richard Smith    public ExprEvaluatorBase<AtomicExprEvaluator, bool> {
76925705f211472f19fc38e58d81365f9261024b3ba3Richard Smith  APValue &Result;
76935705f211472f19fc38e58d81365f9261024b3ba3Richard Smithpublic:
76945705f211472f19fc38e58d81365f9261024b3ba3Richard Smith  AtomicExprEvaluator(EvalInfo &Info, APValue &Result)
76955705f211472f19fc38e58d81365f9261024b3ba3Richard Smith      : ExprEvaluatorBaseTy(Info), Result(Result) {}
76965705f211472f19fc38e58d81365f9261024b3ba3Richard Smith
76975705f211472f19fc38e58d81365f9261024b3ba3Richard Smith  bool Success(const APValue &V, const Expr *E) {
76985705f211472f19fc38e58d81365f9261024b3ba3Richard Smith    Result = V;
76995705f211472f19fc38e58d81365f9261024b3ba3Richard Smith    return true;
77005705f211472f19fc38e58d81365f9261024b3ba3Richard Smith  }
77015705f211472f19fc38e58d81365f9261024b3ba3Richard Smith
77025705f211472f19fc38e58d81365f9261024b3ba3Richard Smith  bool ZeroInitialization(const Expr *E) {
77035705f211472f19fc38e58d81365f9261024b3ba3Richard Smith    ImplicitValueInitExpr VIE(
77045705f211472f19fc38e58d81365f9261024b3ba3Richard Smith        E->getType()->castAs<AtomicType>()->getValueType());
77055705f211472f19fc38e58d81365f9261024b3ba3Richard Smith    return Evaluate(Result, Info, &VIE);
77065705f211472f19fc38e58d81365f9261024b3ba3Richard Smith  }
77075705f211472f19fc38e58d81365f9261024b3ba3Richard Smith
77085705f211472f19fc38e58d81365f9261024b3ba3Richard Smith  bool VisitCastExpr(const CastExpr *E) {
77095705f211472f19fc38e58d81365f9261024b3ba3Richard Smith    switch (E->getCastKind()) {
77105705f211472f19fc38e58d81365f9261024b3ba3Richard Smith    default:
77115705f211472f19fc38e58d81365f9261024b3ba3Richard Smith      return ExprEvaluatorBaseTy::VisitCastExpr(E);
77125705f211472f19fc38e58d81365f9261024b3ba3Richard Smith    case CK_NonAtomicToAtomic:
77135705f211472f19fc38e58d81365f9261024b3ba3Richard Smith      return Evaluate(Result, Info, E->getSubExpr());
77145705f211472f19fc38e58d81365f9261024b3ba3Richard Smith    }
77155705f211472f19fc38e58d81365f9261024b3ba3Richard Smith  }
77165705f211472f19fc38e58d81365f9261024b3ba3Richard Smith};
77175705f211472f19fc38e58d81365f9261024b3ba3Richard Smith} // end anonymous namespace
77185705f211472f19fc38e58d81365f9261024b3ba3Richard Smith
77195705f211472f19fc38e58d81365f9261024b3ba3Richard Smithstatic bool EvaluateAtomic(const Expr *E, APValue &Result, EvalInfo &Info) {
77205705f211472f19fc38e58d81365f9261024b3ba3Richard Smith  assert(E->isRValue() && E->getType()->isAtomicType());
77215705f211472f19fc38e58d81365f9261024b3ba3Richard Smith  return AtomicExprEvaluator(Info, Result).Visit(E);
77225705f211472f19fc38e58d81365f9261024b3ba3Richard Smith}
77235705f211472f19fc38e58d81365f9261024b3ba3Richard Smith
77245705f211472f19fc38e58d81365f9261024b3ba3Richard Smith//===----------------------------------------------------------------------===//
7725aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith// Void expression evaluation, primarily for a cast to void on the LHS of a
7726aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith// comma operator
7727aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith//===----------------------------------------------------------------------===//
7728aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith
7729aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smithnamespace {
7730aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smithclass VoidExprEvaluator
7731aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith  : public ExprEvaluatorBase<VoidExprEvaluator, bool> {
7732aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smithpublic:
7733aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith  VoidExprEvaluator(EvalInfo &Info) : ExprEvaluatorBaseTy(Info) {}
7734aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith
77351aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith  bool Success(const APValue &V, const Expr *e) { return true; }
7736aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith
7737aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith  bool VisitCastExpr(const CastExpr *E) {
7738aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith    switch (E->getCastKind()) {
7739aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith    default:
7740aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith      return ExprEvaluatorBaseTy::VisitCastExpr(E);
7741aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith    case CK_ToVoid:
7742aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith      VisitIgnoredValue(E->getSubExpr());
7743aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith      return true;
7744aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith    }
7745aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith  }
7746aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith};
7747aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith} // end anonymous namespace
7748aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith
7749aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smithstatic bool EvaluateVoid(const Expr *E, EvalInfo &Info) {
7750aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith  assert(E->isRValue() && E->getType()->isVoidType());
7751aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith  return VoidExprEvaluator(Info).Visit(E);
7752aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith}
7753aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith
7754aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith//===----------------------------------------------------------------------===//
775551f4708c00110940ca3f337961915f2ca1668375Richard Smith// Top level Expr::EvaluateAsRValue method.
7756f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
7757f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
77581aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smithstatic bool Evaluate(APValue &Result, EvalInfo &Info, const Expr *E) {
7759c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  // In C, function designators are not lvalues, but we evaluate them as if they
7760c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  // are.
77615705f211472f19fc38e58d81365f9261024b3ba3Richard Smith  QualType T = E->getType();
77625705f211472f19fc38e58d81365f9261024b3ba3Richard Smith  if (E->isGLValue() || T->isFunctionType()) {
7763c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    LValue LV;
7764c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    if (!EvaluateLValue(E, LV, Info))
7765c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith      return false;
7766c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    LV.moveInto(Result);
77675705f211472f19fc38e58d81365f9261024b3ba3Richard Smith  } else if (T->isVectorType()) {
77681e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith    if (!EvaluateVector(E, Result, Info))
776959b5da6d853b4368b984700315adf7b37de05764Nate Begeman      return false;
77705705f211472f19fc38e58d81365f9261024b3ba3Richard Smith  } else if (T->isIntegralOrEnumerationType()) {
77711e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith    if (!IntExprEvaluator(Info, Result).Visit(E))
77726dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
77735705f211472f19fc38e58d81365f9261024b3ba3Richard Smith  } else if (T->hasPointerRepresentation()) {
7774efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    LValue LV;
7775efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    if (!EvaluatePointer(E, LV, Info))
77766dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
77771e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith    LV.moveInto(Result);
77785705f211472f19fc38e58d81365f9261024b3ba3Richard Smith  } else if (T->isRealFloatingType()) {
7779efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    llvm::APFloat F(0.0);
7780efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    if (!EvaluateFloat(E, F, Info))
77816dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
77821aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith    Result = APValue(F);
77835705f211472f19fc38e58d81365f9261024b3ba3Richard Smith  } else if (T->isAnyComplexType()) {
7784efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    ComplexValue C;
7785efdb83e26f9a1fd2566afe54461216cd84814d42John McCall    if (!EvaluateComplex(E, C, Info))
7786660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump      return false;
77871e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith    C.moveInto(Result);
77885705f211472f19fc38e58d81365f9261024b3ba3Richard Smith  } else if (T->isMemberPointerType()) {
7789e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    MemberPtr P;
7790e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    if (!EvaluateMemberPointer(E, P, Info))
7791e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith      return false;
7792e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    P.moveInto(Result);
7793e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith    return true;
77945705f211472f19fc38e58d81365f9261024b3ba3Richard Smith  } else if (T->isArrayType()) {
7795180f47959a066795cc0f409433023af448bb0328Richard Smith    LValue LV;
779683587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    LV.set(E, Info.CurrentCall->Index);
779703ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    APValue &Value = Info.CurrentCall->createTemporary(E, false);
779803ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    if (!EvaluateArray(E, LV, Value, Info))
7799cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith      return false;
780003ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    Result = Value;
78015705f211472f19fc38e58d81365f9261024b3ba3Richard Smith  } else if (T->isRecordType()) {
7802180f47959a066795cc0f409433023af448bb0328Richard Smith    LValue LV;
780383587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    LV.set(E, Info.CurrentCall->Index);
780403ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    APValue &Value = Info.CurrentCall->createTemporary(E, false);
780503ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    if (!EvaluateRecord(E, LV, Value, Info))
7806180f47959a066795cc0f409433023af448bb0328Richard Smith      return false;
780703ce5f8c68f55405db6001e82bdb18581d0dadceRichard Smith    Result = Value;
78085705f211472f19fc38e58d81365f9261024b3ba3Richard Smith  } else if (T->isVoidType()) {
780980ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith    if (!Info.getLangOpts().CPlusPlus11)
78105cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith      Info.CCEDiag(E, diag::note_constexpr_nonliteral)
7811c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith        << E->getType();
7812aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith    if (!EvaluateVoid(E, Info))
7813aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith      return false;
78145705f211472f19fc38e58d81365f9261024b3ba3Richard Smith  } else if (T->isAtomicType()) {
78155705f211472f19fc38e58d81365f9261024b3ba3Richard Smith    if (!EvaluateAtomic(E, Result, Info))
78165705f211472f19fc38e58d81365f9261024b3ba3Richard Smith      return false;
781780ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith  } else if (Info.getLangOpts().CPlusPlus11) {
78185cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith    Info.Diag(E, diag::note_constexpr_nonliteral) << E->getType();
7819c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith    return false;
7820f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  } else {
78215cfc7d85fe13f144c9a8b264d6de9d38dfebc383Richard Smith    Info.Diag(E, diag::note_invalid_subexpr_in_const_expr);
7822660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump    return false;
7823f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  }
7824660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump
7825660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump  return true;
7826660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump}
7827660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump
782883587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith/// EvaluateInPlace - Evaluate an expression in-place in an APValue. In some
782983587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith/// cases, the in-place evaluation is essential, since later initializers for
783083587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith/// an object can indirectly refer to subobjects which were initialized earlier.
783183587db1bda97f45d2b5a4189e584e2a18be511aRichard Smithstatic bool EvaluateInPlace(APValue &Result, EvalInfo &Info, const LValue &This,
78326391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith                            const Expr *E, bool AllowNonLiteralTypes) {
78336391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith  if (!AllowNonLiteralTypes && !CheckLiteralType(Info, E, &This))
783451201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    return false;
783551201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith
783651201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  if (E->isRValue()) {
783769c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith    // Evaluate arrays and record types in-place, so that later initializers can
783869c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith    // refer to earlier-initialized members of the object.
7839180f47959a066795cc0f409433023af448bb0328Richard Smith    if (E->getType()->isArrayType())
7840180f47959a066795cc0f409433023af448bb0328Richard Smith      return EvaluateArray(E, This, Result, Info);
7841180f47959a066795cc0f409433023af448bb0328Richard Smith    else if (E->getType()->isRecordType())
7842180f47959a066795cc0f409433023af448bb0328Richard Smith      return EvaluateRecord(E, This, Result, Info);
784369c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith  }
784469c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith
784569c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith  // For any other type, in-place evaluation is unimportant.
78461aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith  return Evaluate(Result, Info, E);
784769c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith}
784869c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith
7849f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith/// EvaluateAsRValue - Try to evaluate this expression, performing an implicit
7850f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith/// lvalue-to-rvalue cast if it is an lvalue.
7851f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithstatic bool EvaluateAsRValue(EvalInfo &Info, const Expr *E, APValue &Result) {
785251201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  if (!CheckLiteralType(Info, E))
785351201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    return false;
785451201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith
78551aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith  if (!::Evaluate(Result, Info, E))
7856f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return false;
7857f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith
7858f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  if (E->isGLValue()) {
7859f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    LValue LV;
78601aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith    LV.setFrom(Info.Ctx, Result);
78615528ac9f40ec6cb54e7096908bf2beeed511bce4Richard Smith    if (!handleLValueToRValueConversion(Info, E, E->getType(), LV, Result))
7862f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith      return false;
7863f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  }
7864f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith
78651aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith  // Check this core constant expression is a constant expression.
786683587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  return CheckConstantExpression(Info, E->getExprLoc(), E->getType(), Result);
7867f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith}
7868c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
7869ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanianstatic bool FastEvaluateAsRValue(const Expr *Exp, Expr::EvalResult &Result,
7870ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian                                 const ASTContext &Ctx, bool &IsConst) {
7871ee19f43bf8973bfcccb7329e32a4198641767949Richard Smith  // Fast-path evaluations of integer literals, since we sometimes see files
7872ee19f43bf8973bfcccb7329e32a4198641767949Richard Smith  // containing vast quantities of these.
7873ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian  if (const IntegerLiteral *L = dyn_cast<IntegerLiteral>(Exp)) {
7874ee19f43bf8973bfcccb7329e32a4198641767949Richard Smith    Result.Val = APValue(APSInt(L->getValue(),
7875ee19f43bf8973bfcccb7329e32a4198641767949Richard Smith                                L->getType()->isUnsignedIntegerType()));
7876ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian    IsConst = true;
7877ee19f43bf8973bfcccb7329e32a4198641767949Richard Smith    return true;
7878ee19f43bf8973bfcccb7329e32a4198641767949Richard Smith  }
7879ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian
78802d6a5670465cb3f1d811695a9f23e372508240d2Richard Smith  // FIXME: Evaluating values of large array and record types can cause
78812d6a5670465cb3f1d811695a9f23e372508240d2Richard Smith  // performance problems. Only do so in C++11 for now.
7882ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian  if (Exp->isRValue() && (Exp->getType()->isArrayType() ||
7883ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian                          Exp->getType()->isRecordType()) &&
7884ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian      !Ctx.getLangOpts().CPlusPlus11) {
7885ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian    IsConst = false;
7886ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian    return true;
7887ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian  }
7888ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian  return false;
7889ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian}
7890ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian
78911445bbacf4c8de5f208ff4ccb302424a4d9e233eRichard Smith
7892ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian/// EvaluateAsRValue - Return true if this is a constant which we can fold using
7893ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian/// any crazy technique (that has nothing to do with language standards) that
7894ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian/// we want to.  If this function returns true, it returns the folded constant
7895ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian/// in Result. If this expression is a glvalue, an lvalue-to-rvalue conversion
7896ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian/// will be applied to the result.
7897ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanianbool Expr::EvaluateAsRValue(EvalResult &Result, const ASTContext &Ctx) const {
7898ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian  bool IsConst;
7899ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian  if (FastEvaluateAsRValue(this, Result, Ctx, IsConst))
7900ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian    return IsConst;
7901ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian
7902f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  EvalInfo Info(Ctx, Result);
7903f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  return ::EvaluateAsRValue(Info, this, Result.Val);
790456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall}
790556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
79064ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool Expr::EvaluateAsBooleanCondition(bool &Result,
79074ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                      const ASTContext &Ctx) const {
7908c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  EvalResult Scratch;
790951f4708c00110940ca3f337961915f2ca1668375Richard Smith  return EvaluateAsRValue(Scratch, Ctx) &&
79101aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith         HandleConversionToBool(Scratch.Val, Result);
7911cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall}
7912cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall
791380d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smithbool Expr::EvaluateAsInt(APSInt &Result, const ASTContext &Ctx,
791480d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith                         SideEffectsKind AllowSideEffects) const {
791580d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith  if (!getType()->isIntegralOrEnumerationType())
791680d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith    return false;
791780d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith
7918c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  EvalResult ExprResult;
791980d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith  if (!EvaluateAsRValue(ExprResult, Ctx) || !ExprResult.Val.isInt() ||
792080d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith      (!AllowSideEffects && ExprResult.HasSideEffects))
7921c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return false;
7922f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith
7923c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  Result = ExprResult.Val.getInt();
7924c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  return true;
7925a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith}
7926a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith
79274ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool Expr::EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx) const {
79281b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson  EvalInfo Info(Ctx, Result);
79291b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson
7930efdb83e26f9a1fd2566afe54461216cd84814d42John McCall  LValue LV;
793183587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  if (!EvaluateLValue(this, LV, Info) || Result.HasSideEffects ||
793283587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith      !CheckLValueConstantExpression(Info, getExprLoc(),
793383587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith                                     Ctx.getLValueReferenceType(getType()), LV))
793483587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    return false;
793583587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith
79361aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith  LV.moveInto(Result.Val);
793783587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  return true;
7938b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman}
7939b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman
7940099e7f647ccda915513f2b2ec53352dc756082d3Richard Smithbool Expr::EvaluateAsInitializer(APValue &Value, const ASTContext &Ctx,
7941099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith                                 const VarDecl *VD,
7942cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko                            SmallVectorImpl<PartialDiagnosticAt> &Notes) const {
79432d6a5670465cb3f1d811695a9f23e372508240d2Richard Smith  // FIXME: Evaluating initializers for large array and record types can cause
79442d6a5670465cb3f1d811695a9f23e372508240d2Richard Smith  // performance problems. Only do so in C++11 for now.
79452d6a5670465cb3f1d811695a9f23e372508240d2Richard Smith  if (isRValue() && (getType()->isArrayType() || getType()->isRecordType()) &&
794680ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith      !Ctx.getLangOpts().CPlusPlus11)
79472d6a5670465cb3f1d811695a9f23e372508240d2Richard Smith    return false;
79482d6a5670465cb3f1d811695a9f23e372508240d2Richard Smith
7949099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith  Expr::EvalStatus EStatus;
7950099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith  EStatus.Diag = &Notes;
7951099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith
7952099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith  EvalInfo InitInfo(Ctx, EStatus);
7953099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith  InitInfo.setEvaluatingDecl(VD, Value);
7954099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith
7955099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith  LValue LVal;
7956099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith  LVal.set(VD);
7957099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith
795851201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  // C++11 [basic.start.init]p2:
795951201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  //  Variables with static storage duration or thread storage duration shall be
796051201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  //  zero-initialized before any other initialization takes place.
796151201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  // This behavior is not present in C.
79624e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (Ctx.getLangOpts().CPlusPlus && !VD->hasLocalStorage() &&
796351201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith      !VD->getType()->isReferenceType()) {
796451201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith    ImplicitValueInitExpr VIE(VD->getType());
79656391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith    if (!EvaluateInPlace(Value, InitInfo, LVal, &VIE,
796683587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith                         /*AllowNonLiteralTypes=*/true))
796751201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith      return false;
796851201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith  }
796951201882382fb40c9456a06c7f93d6ddd4a57712Richard Smith
79706391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith  if (!EvaluateInPlace(Value, InitInfo, LVal, this,
79716391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith                       /*AllowNonLiteralTypes=*/true) ||
797283587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith      EStatus.HasSideEffects)
797383587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith    return false;
797483587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith
797583587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  return CheckConstantExpression(InitInfo, VD->getLocation(), VD->getType(),
797683587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith                                 Value);
7977099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith}
7978099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith
797951f4708c00110940ca3f337961915f2ca1668375Richard Smith/// isEvaluatable - Call EvaluateAsRValue to see if this expression can be
798051f4708c00110940ca3f337961915f2ca1668375Richard Smith/// constant folded, but discard the result.
79814ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool Expr::isEvaluatable(const ASTContext &Ctx) const {
79824fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson  EvalResult Result;
798351f4708c00110940ca3f337961915f2ca1668375Richard Smith  return EvaluateAsRValue(Result, Ctx) && !Result.HasSideEffects;
798445b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner}
798551fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson
7986a18e70b25c85d7e653e642b5e6e58d6063af3d83Fariborz JahanianAPSInt Expr::EvaluateKnownConstInt(const ASTContext &Ctx,
7987cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko                    SmallVectorImpl<PartialDiagnosticAt> *Diag) const {
79881c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  EvalResult EvalResult;
7989a18e70b25c85d7e653e642b5e6e58d6063af3d83Fariborz Jahanian  EvalResult.Diag = Diag;
799051f4708c00110940ca3f337961915f2ca1668375Richard Smith  bool Result = EvaluateAsRValue(EvalResult, Ctx);
7991c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin  (void)Result;
799251fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson  assert(Result && "Could not evaluate expression");
79931c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer");
799451fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson
79951c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  return EvalResult.Val.getInt();
799651fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson}
7997d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
7998ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanianvoid Expr::EvaluateForOverflow(const ASTContext &Ctx,
7999ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian                    SmallVectorImpl<PartialDiagnosticAt> *Diags) const {
8000ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian  bool IsConst;
8001ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian  EvalResult EvalResult;
8002ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian  EvalResult.Diag = Diags;
8003ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian  if (!FastEvaluateAsRValue(this, EvalResult, Ctx, IsConst)) {
8004ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian    EvalInfo Info(Ctx, EvalResult, true);
8005ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian    (void)::EvaluateAsRValue(Info, this, EvalResult.Val);
8006ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian  }
8007ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian}
8008ad48a500596d7d678b99c7f94326cfa856c3b49fFariborz Jahanian
8009211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smithbool Expr::EvalResult::isGlobalLValue() const {
8010211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith  assert(Val.isLValue());
8011211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith  return IsGlobalLValue(Val.getLValueBase());
8012211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith}
8013e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara
8014e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara
8015d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// isIntegerConstantExpr - this recursive routine will test if an expression is
8016d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// an integer constant expression.
8017d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
8018d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// FIXME: Pass up a reason why! Invalid operation in i-c-e, division by zero,
8019d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// comma, etc
8020d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
8021d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// CheckICE - This function does the fundamental ICE checking: the returned
8022ceb59d91b3a7def4297ec8468621805777741963Richard Smith// ICEDiag contains an ICEKind indicating whether the expression is an ICE,
8023ceb59d91b3a7def4297ec8468621805777741963Richard Smith// and a (possibly null) SourceLocation indicating the location of the problem.
8024ceb59d91b3a7def4297ec8468621805777741963Richard Smith//
8025d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// Note that to reduce code duplication, this helper does no evaluation
8026d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// itself; the caller checks whether the expression is evaluatable, and
8027d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// in the rare cases where CheckICE actually cares about the evaluated
8028d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// value, it calls into Evalute.
8029d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
80303c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohmannamespace {
80313c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohman
8032ceb59d91b3a7def4297ec8468621805777741963Richard Smithenum ICEKind {
8033ceb59d91b3a7def4297ec8468621805777741963Richard Smith  /// This expression is an ICE.
8034ceb59d91b3a7def4297ec8468621805777741963Richard Smith  IK_ICE,
8035ceb59d91b3a7def4297ec8468621805777741963Richard Smith  /// This expression is not an ICE, but if it isn't evaluated, it's
8036ceb59d91b3a7def4297ec8468621805777741963Richard Smith  /// a legal subexpression for an ICE. This return value is used to handle
8037ceb59d91b3a7def4297ec8468621805777741963Richard Smith  /// the comma operator in C99 mode, and non-constant subexpressions.
8038ceb59d91b3a7def4297ec8468621805777741963Richard Smith  IK_ICEIfUnevaluated,
8039ceb59d91b3a7def4297ec8468621805777741963Richard Smith  /// This expression is not an ICE, and is not a legal subexpression for one.
8040ceb59d91b3a7def4297ec8468621805777741963Richard Smith  IK_NotICE
8041ceb59d91b3a7def4297ec8468621805777741963Richard Smith};
8042ceb59d91b3a7def4297ec8468621805777741963Richard Smith
8043d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCallstruct ICEDiag {
8044ceb59d91b3a7def4297ec8468621805777741963Richard Smith  ICEKind Kind;
8045d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  SourceLocation Loc;
8046d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
8047ceb59d91b3a7def4297ec8468621805777741963Richard Smith  ICEDiag(ICEKind IK, SourceLocation l) : Kind(IK), Loc(l) {}
8048d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall};
8049d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
80503c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohman}
80513c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohman
8052ceb59d91b3a7def4297ec8468621805777741963Richard Smithstatic ICEDiag NoDiag() { return ICEDiag(IK_ICE, SourceLocation()); }
8053ceb59d91b3a7def4297ec8468621805777741963Richard Smith
8054ceb59d91b3a7def4297ec8468621805777741963Richard Smithstatic ICEDiag Worst(ICEDiag A, ICEDiag B) { return A.Kind >= B.Kind ? A : B; }
8055d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
8056d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCallstatic ICEDiag CheckEvalInICE(const Expr* E, ASTContext &Ctx) {
8057d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  Expr::EvalResult EVResult;
805851f4708c00110940ca3f337961915f2ca1668375Richard Smith  if (!E->EvaluateAsRValue(EVResult, Ctx) || EVResult.HasSideEffects ||
8059ceb59d91b3a7def4297ec8468621805777741963Richard Smith      !EVResult.Val.isInt())
8060ceb59d91b3a7def4297ec8468621805777741963Richard Smith    return ICEDiag(IK_NotICE, E->getLocStart());
8061ceb59d91b3a7def4297ec8468621805777741963Richard Smith
8062d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  return NoDiag();
8063d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall}
8064d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
8065d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCallstatic ICEDiag CheckICE(const Expr* E, ASTContext &Ctx) {
8066d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  assert(!E->isValueDependent() && "Should not see value dependent exprs!");
8067ceb59d91b3a7def4297ec8468621805777741963Richard Smith  if (!E->getType()->isIntegralOrEnumerationType())
8068ceb59d91b3a7def4297ec8468621805777741963Richard Smith    return ICEDiag(IK_NotICE, E->getLocStart());
8069d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
8070d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  switch (E->getStmtClass()) {
807163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall#define ABSTRACT_STMT(Node)
8072d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall#define STMT(Node, Base) case Expr::Node##Class:
8073d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall#define EXPR(Node, Base)
8074d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall#include "clang/AST/StmtNodes.inc"
8075d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::PredefinedExprClass:
8076d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::FloatingLiteralClass:
8077d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ImaginaryLiteralClass:
8078d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::StringLiteralClass:
8079d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ArraySubscriptExprClass:
8080d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::MemberExprClass:
8081d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CompoundAssignOperatorClass:
8082d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CompoundLiteralExprClass:
8083d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ExtVectorElementExprClass:
8084d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::DesignatedInitExprClass:
8085d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ImplicitValueInitExprClass:
8086d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ParenListExprClass:
8087d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::VAArgExprClass:
8088d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::AddrLabelExprClass:
8089d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::StmtExprClass:
8090d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXMemberCallExprClass:
8091e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  case Expr::CUDAKernelCallExprClass:
8092d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXDynamicCastExprClass:
8093d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXTypeidExprClass:
80949be88403e965cc49af76c9d33d818781d44b333eFrancois Pichet  case Expr::CXXUuidofExprClass:
809576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  case Expr::MSPropertyRefExprClass:
8096d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXNullPtrLiteralExprClass:
80979fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  case Expr::UserDefinedLiteralClass:
8098d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXThisExprClass:
8099d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXThrowExprClass:
8100d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXNewExprClass:
8101d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXDeleteExprClass:
8102d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXPseudoDestructorExprClass:
8103d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::UnresolvedLookupExprClass:
8104d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::DependentScopeDeclRefExprClass:
8105d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXConstructExprClass:
81067c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith  case Expr::CXXStdInitializerListExprClass:
8107d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXBindTemporaryExprClass:
81084765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall  case Expr::ExprWithCleanupsClass:
8109d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXTemporaryObjectExprClass:
8110d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXUnresolvedConstructExprClass:
8111d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXDependentScopeMemberExprClass:
8112d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::UnresolvedMemberExprClass:
8113d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ObjCStringLiteralClass:
8114eb382ec1507cf2c8c12d7443d0b67c076223aec6Patrick Beard  case Expr::ObjCBoxedExprClass:
8115ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  case Expr::ObjCArrayLiteralClass:
8116ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  case Expr::ObjCDictionaryLiteralClass:
8117d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ObjCEncodeExprClass:
8118d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ObjCMessageExprClass:
8119d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ObjCSelectorExprClass:
8120d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ObjCProtocolExprClass:
8121d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ObjCIvarRefExprClass:
8122d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ObjCPropertyRefExprClass:
8123ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  case Expr::ObjCSubscriptRefExprClass:
8124d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ObjCIsaExprClass:
8125d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ShuffleVectorExprClass:
8126d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::BlockExprClass:
8127d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::NoStmtClass:
81287cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall  case Expr::OpaqueValueExprClass:
8129be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor  case Expr::PackExpansionExprClass:
8130c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  case Expr::SubstNonTypeTemplateParmPackExprClass:
81319a4db032ecd991626d236a502e770126db32bd31Richard Smith  case Expr::FunctionParmPackExprClass:
813261eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner  case Expr::AsTypeExprClass:
8133f85e193739c953358c865005855253af4f68a497John McCall  case Expr::ObjCIndirectCopyRestoreExprClass:
813403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor  case Expr::MaterializeTemporaryExprClass:
81354b9c2d235fb9449e249d74f48ecfec601650de93John McCall  case Expr::PseudoObjectExprClass:
8136276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  case Expr::AtomicExprClass:
8137cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl  case Expr::InitListExprClass:
813801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  case Expr::LambdaExprClass:
8139ceb59d91b3a7def4297ec8468621805777741963Richard Smith    return ICEDiag(IK_NotICE, E->getLocStart());
8140cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl
8141ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  case Expr::SizeOfPackExprClass:
8142d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::GNUNullExprClass:
8143d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    // GCC considers the GNU __null value to be an integral constant expression.
8144d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    return NoDiag();
8145d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
814691a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall  case Expr::SubstNonTypeTemplateParmExprClass:
814791a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall    return
814891a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall      CheckICE(cast<SubstNonTypeTemplateParmExpr>(E)->getReplacement(), Ctx);
814991a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall
8150d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ParenExprClass:
8151d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    return CheckICE(cast<ParenExpr>(E)->getSubExpr(), Ctx);
8152f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  case Expr::GenericSelectionExprClass:
8153f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    return CheckICE(cast<GenericSelectionExpr>(E)->getResultExpr(), Ctx);
8154d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::IntegerLiteralClass:
8155d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CharacterLiteralClass:
8156ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  case Expr::ObjCBoolLiteralExprClass:
8157d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXBoolLiteralExprClass:
8158ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor  case Expr::CXXScalarValueInitExprClass:
8159d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::UnaryTypeTraitExprClass:
81606ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  case Expr::BinaryTypeTraitExprClass:
81614ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  case Expr::TypeTraitExprClass:
816221ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  case Expr::ArrayTypeTraitExprClass:
8163552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  case Expr::ExpressionTraitExprClass:
81642e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  case Expr::CXXNoexceptExprClass:
8165d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    return NoDiag();
8166d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CallExprClass:
81676cf750298d3621d8a10a6dd07fcee8e274b9d94dSean Hunt  case Expr::CXXOperatorCallExprClass: {
816805830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith    // C99 6.6/3 allows function calls within unevaluated subexpressions of
816905830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith    // constant expressions, but they can never be ICEs because an ICE cannot
817005830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith    // contain an operand of (pointer to) function type.
8171d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    const CallExpr *CE = cast<CallExpr>(E);
8172180f47959a066795cc0f409433023af448bb0328Richard Smith    if (CE->isBuiltinCall())
8173d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      return CheckEvalInICE(E, Ctx);
8174ceb59d91b3a7def4297ec8468621805777741963Richard Smith    return ICEDiag(IK_NotICE, E->getLocStart());
8175d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  }
8176359c89df5479810c9d4784fc0b6ab592eb136777Richard Smith  case Expr::DeclRefExprClass: {
8177d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    if (isa<EnumConstantDecl>(cast<DeclRefExpr>(E)->getDecl()))
8178d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      return NoDiag();
8179359c89df5479810c9d4784fc0b6ab592eb136777Richard Smith    const ValueDecl *D = dyn_cast<ValueDecl>(cast<DeclRefExpr>(E)->getDecl());
81804e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie    if (Ctx.getLangOpts().CPlusPlus &&
8181359c89df5479810c9d4784fc0b6ab592eb136777Richard Smith        D && IsConstNonVolatile(D->getType())) {
8182d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      // Parameter variables are never constants.  Without this check,
8183d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      // getAnyInitializer() can find a default argument, which leads
8184d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      // to chaos.
8185d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      if (isa<ParmVarDecl>(D))
8186ceb59d91b3a7def4297ec8468621805777741963Richard Smith        return ICEDiag(IK_NotICE, cast<DeclRefExpr>(E)->getLocation());
8187d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
8188d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      // C++ 7.1.5.1p2
8189d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      //   A variable of non-volatile const-qualified integral or enumeration
8190d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      //   type initialized by an ICE can be used in ICEs.
8191d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      if (const VarDecl *Dcl = dyn_cast<VarDecl>(D)) {
8192db1822c6de43ff4aa5fa00234bf8222f6f4816e8Richard Smith        if (!Dcl->getType()->isIntegralOrEnumerationType())
8193ceb59d91b3a7def4297ec8468621805777741963Richard Smith          return ICEDiag(IK_NotICE, cast<DeclRefExpr>(E)->getLocation());
8194db1822c6de43ff4aa5fa00234bf8222f6f4816e8Richard Smith
8195099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith        const VarDecl *VD;
8196099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith        // Look for a declaration of this variable that has an initializer, and
8197099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith        // check whether it is an ICE.
8198099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith        if (Dcl->getAnyInitializer(VD) && VD->checkInitIsICE())
8199099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith          return NoDiag();
8200099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith        else
8201ceb59d91b3a7def4297ec8468621805777741963Richard Smith          return ICEDiag(IK_NotICE, cast<DeclRefExpr>(E)->getLocation());
8202d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      }
8203d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    }
8204ceb59d91b3a7def4297ec8468621805777741963Richard Smith    return ICEDiag(IK_NotICE, E->getLocStart());
8205359c89df5479810c9d4784fc0b6ab592eb136777Richard Smith  }
8206d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::UnaryOperatorClass: {
8207d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    const UnaryOperator *Exp = cast<UnaryOperator>(E);
8208d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    switch (Exp->getOpcode()) {
82092de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_PostInc:
82102de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_PostDec:
82112de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_PreInc:
82122de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_PreDec:
82132de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_AddrOf:
82142de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Deref:
821505830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith      // C99 6.6/3 allows increment and decrement within unevaluated
821605830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith      // subexpressions of constant expressions, but they can never be ICEs
821705830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith      // because an ICE cannot contain an lvalue operand.
8218ceb59d91b3a7def4297ec8468621805777741963Richard Smith      return ICEDiag(IK_NotICE, E->getLocStart());
82192de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Extension:
82202de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_LNot:
82212de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Plus:
82222de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Minus:
82232de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Not:
82242de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Real:
82252de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Imag:
8226d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      return CheckICE(Exp->getSubExpr(), Ctx);
8227d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    }
8228ceb59d91b3a7def4297ec8468621805777741963Richard Smith
8229d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    // OffsetOf falls through here.
8230d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  }
8231d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::OffsetOfExprClass: {
8232ceb59d91b3a7def4297ec8468621805777741963Richard Smith    // Note that per C99, offsetof must be an ICE. And AFAIK, using
8233ceb59d91b3a7def4297ec8468621805777741963Richard Smith    // EvaluateAsRValue matches the proposed gcc behavior for cases like
8234ceb59d91b3a7def4297ec8468621805777741963Richard Smith    // "offsetof(struct s{int x[4];}, x[1.0])".  This doesn't affect
8235ceb59d91b3a7def4297ec8468621805777741963Richard Smith    // compliance: we should warn earlier for offsetof expressions with
8236ceb59d91b3a7def4297ec8468621805777741963Richard Smith    // array subscripts that aren't ICEs, and if the array subscripts
8237ceb59d91b3a7def4297ec8468621805777741963Richard Smith    // are ICEs, the value of the offsetof must be an integer constant.
8238ceb59d91b3a7def4297ec8468621805777741963Richard Smith    return CheckEvalInICE(E, Ctx);
8239d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  }
8240f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  case Expr::UnaryExprOrTypeTraitExprClass: {
8241f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    const UnaryExprOrTypeTraitExpr *Exp = cast<UnaryExprOrTypeTraitExpr>(E);
8242f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    if ((Exp->getKind() ==  UETT_SizeOf) &&
8243f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne        Exp->getTypeOfArgument()->isVariableArrayType())
8244ceb59d91b3a7def4297ec8468621805777741963Richard Smith      return ICEDiag(IK_NotICE, E->getLocStart());
8245d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    return NoDiag();
8246d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  }
8247d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::BinaryOperatorClass: {
8248d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    const BinaryOperator *Exp = cast<BinaryOperator>(E);
8249d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    switch (Exp->getOpcode()) {
82502de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_PtrMemD:
82512de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_PtrMemI:
82522de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Assign:
82532de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_MulAssign:
82542de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_DivAssign:
82552de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_RemAssign:
82562de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_AddAssign:
82572de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_SubAssign:
82582de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_ShlAssign:
82592de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_ShrAssign:
82602de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_AndAssign:
82612de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_XorAssign:
82622de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_OrAssign:
826305830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith      // C99 6.6/3 allows assignments within unevaluated subexpressions of
826405830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith      // constant expressions, but they can never be ICEs because an ICE cannot
826505830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith      // contain an lvalue operand.
8266ceb59d91b3a7def4297ec8468621805777741963Richard Smith      return ICEDiag(IK_NotICE, E->getLocStart());
8267d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
82682de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Mul:
82692de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Div:
82702de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Rem:
82712de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Add:
82722de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Sub:
82732de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Shl:
82742de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Shr:
82752de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_LT:
82762de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_GT:
82772de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_LE:
82782de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_GE:
82792de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_EQ:
82802de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_NE:
82812de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_And:
82822de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Xor:
82832de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Or:
82842de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Comma: {
8285d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      ICEDiag LHSResult = CheckICE(Exp->getLHS(), Ctx);
8286d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      ICEDiag RHSResult = CheckICE(Exp->getRHS(), Ctx);
82872de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      if (Exp->getOpcode() == BO_Div ||
82882de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall          Exp->getOpcode() == BO_Rem) {
828951f4708c00110940ca3f337961915f2ca1668375Richard Smith        // EvaluateAsRValue gives an error for undefined Div/Rem, so make sure
8290d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        // we don't evaluate one.
8291ceb59d91b3a7def4297ec8468621805777741963Richard Smith        if (LHSResult.Kind == IK_ICE && RHSResult.Kind == IK_ICE) {
8292a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith          llvm::APSInt REval = Exp->getRHS()->EvaluateKnownConstInt(Ctx);
8293d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          if (REval == 0)
8294ceb59d91b3a7def4297ec8468621805777741963Richard Smith            return ICEDiag(IK_ICEIfUnevaluated, E->getLocStart());
8295d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          if (REval.isSigned() && REval.isAllOnesValue()) {
8296a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith            llvm::APSInt LEval = Exp->getLHS()->EvaluateKnownConstInt(Ctx);
8297d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall            if (LEval.isMinSignedValue())
8298ceb59d91b3a7def4297ec8468621805777741963Richard Smith              return ICEDiag(IK_ICEIfUnevaluated, E->getLocStart());
8299d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          }
8300d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        }
8301d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      }
83022de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      if (Exp->getOpcode() == BO_Comma) {
83034e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie        if (Ctx.getLangOpts().C99) {
8304d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          // C99 6.6p3 introduces a strange edge case: comma can be in an ICE
8305d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          // if it isn't evaluated.
8306ceb59d91b3a7def4297ec8468621805777741963Richard Smith          if (LHSResult.Kind == IK_ICE && RHSResult.Kind == IK_ICE)
8307ceb59d91b3a7def4297ec8468621805777741963Richard Smith            return ICEDiag(IK_ICEIfUnevaluated, E->getLocStart());
8308d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        } else {
8309d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          // In both C89 and C++, commas in ICEs are illegal.
8310ceb59d91b3a7def4297ec8468621805777741963Richard Smith          return ICEDiag(IK_NotICE, E->getLocStart());
8311d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        }
8312d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      }
8313ceb59d91b3a7def4297ec8468621805777741963Richard Smith      return Worst(LHSResult, RHSResult);
8314d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    }
83152de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_LAnd:
83162de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_LOr: {
8317d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      ICEDiag LHSResult = CheckICE(Exp->getLHS(), Ctx);
8318d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      ICEDiag RHSResult = CheckICE(Exp->getRHS(), Ctx);
8319ceb59d91b3a7def4297ec8468621805777741963Richard Smith      if (LHSResult.Kind == IK_ICE && RHSResult.Kind == IK_ICEIfUnevaluated) {
8320d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        // Rare case where the RHS has a comma "side-effect"; we need
8321d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        // to actually check the condition to see whether the side
8322d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        // with the comma is evaluated.
83232de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall        if ((Exp->getOpcode() == BO_LAnd) !=
8324a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith            (Exp->getLHS()->EvaluateKnownConstInt(Ctx) == 0))
8325d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall          return RHSResult;
8326d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        return NoDiag();
8327d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      }
8328d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
8329ceb59d91b3a7def4297ec8468621805777741963Richard Smith      return Worst(LHSResult, RHSResult);
8330d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    }
8331d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    }
8332d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  }
8333d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ImplicitCastExprClass:
8334d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CStyleCastExprClass:
8335d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXFunctionalCastExprClass:
8336d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXStaticCastExprClass:
8337d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXReinterpretCastExprClass:
833832cb47174304bc7ec11478b9497c4e10f48273d9Richard Smith  case Expr::CXXConstCastExprClass:
8339f85e193739c953358c865005855253af4f68a497John McCall  case Expr::ObjCBridgedCastExprClass: {
8340d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    const Expr *SubExpr = cast<CastExpr>(E)->getSubExpr();
83412116b144cf07f2574d20517187eb8863645376ebRichard Smith    if (isa<ExplicitCastExpr>(E)) {
83422116b144cf07f2574d20517187eb8863645376ebRichard Smith      if (const FloatingLiteral *FL
83432116b144cf07f2574d20517187eb8863645376ebRichard Smith            = dyn_cast<FloatingLiteral>(SubExpr->IgnoreParenImpCasts())) {
83442116b144cf07f2574d20517187eb8863645376ebRichard Smith        unsigned DestWidth = Ctx.getIntWidth(E->getType());
83452116b144cf07f2574d20517187eb8863645376ebRichard Smith        bool DestSigned = E->getType()->isSignedIntegerOrEnumerationType();
83462116b144cf07f2574d20517187eb8863645376ebRichard Smith        APSInt IgnoredVal(DestWidth, !DestSigned);
83472116b144cf07f2574d20517187eb8863645376ebRichard Smith        bool Ignored;
83482116b144cf07f2574d20517187eb8863645376ebRichard Smith        // If the value does not fit in the destination type, the behavior is
83492116b144cf07f2574d20517187eb8863645376ebRichard Smith        // undefined, so we are not required to treat it as a constant
83502116b144cf07f2574d20517187eb8863645376ebRichard Smith        // expression.
83512116b144cf07f2574d20517187eb8863645376ebRichard Smith        if (FL->getValue().convertToInteger(IgnoredVal,
83522116b144cf07f2574d20517187eb8863645376ebRichard Smith                                            llvm::APFloat::rmTowardZero,
83532116b144cf07f2574d20517187eb8863645376ebRichard Smith                                            &Ignored) & APFloat::opInvalidOp)
8354ceb59d91b3a7def4297ec8468621805777741963Richard Smith          return ICEDiag(IK_NotICE, E->getLocStart());
83552116b144cf07f2574d20517187eb8863645376ebRichard Smith        return NoDiag();
83562116b144cf07f2574d20517187eb8863645376ebRichard Smith      }
83572116b144cf07f2574d20517187eb8863645376ebRichard Smith    }
8358eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman    switch (cast<CastExpr>(E)->getCastKind()) {
8359eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman    case CK_LValueToRValue:
83607a7ee3033e44b45630981355460ef89efa0bdcc4David Chisnall    case CK_AtomicToNonAtomic:
83617a7ee3033e44b45630981355460ef89efa0bdcc4David Chisnall    case CK_NonAtomicToAtomic:
8362eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman    case CK_NoOp:
8363eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman    case CK_IntegralToBoolean:
8364eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman    case CK_IntegralCast:
8365d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      return CheckICE(SubExpr, Ctx);
8366eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman    default:
8367ceb59d91b3a7def4297ec8468621805777741963Richard Smith      return ICEDiag(IK_NotICE, E->getLocStart());
8368eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman    }
8369d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  }
837056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  case Expr::BinaryConditionalOperatorClass: {
837156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    const BinaryConditionalOperator *Exp = cast<BinaryConditionalOperator>(E);
837256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    ICEDiag CommonResult = CheckICE(Exp->getCommon(), Ctx);
8373ceb59d91b3a7def4297ec8468621805777741963Richard Smith    if (CommonResult.Kind == IK_NotICE) return CommonResult;
837456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    ICEDiag FalseResult = CheckICE(Exp->getFalseExpr(), Ctx);
8375ceb59d91b3a7def4297ec8468621805777741963Richard Smith    if (FalseResult.Kind == IK_NotICE) return FalseResult;
8376ceb59d91b3a7def4297ec8468621805777741963Richard Smith    if (CommonResult.Kind == IK_ICEIfUnevaluated) return CommonResult;
8377ceb59d91b3a7def4297ec8468621805777741963Richard Smith    if (FalseResult.Kind == IK_ICEIfUnevaluated &&
83789b403c555a294530305f40dfee859b73070de542Richard Smith        Exp->getCommon()->EvaluateKnownConstInt(Ctx) != 0) return NoDiag();
837956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    return FalseResult;
838056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  }
8381d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ConditionalOperatorClass: {
8382d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    const ConditionalOperator *Exp = cast<ConditionalOperator>(E);
8383d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    // If the condition (ignoring parens) is a __builtin_constant_p call,
8384d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    // then only the true side is actually considered in an integer constant
8385d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    // expression, and it is fully evaluated.  This is an important GNU
8386d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    // extension.  See GCC PR38377 for discussion.
8387d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    if (const CallExpr *CallCE
8388d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall        = dyn_cast<CallExpr>(Exp->getCond()->IgnoreParenCasts()))
838980d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith      if (CallCE->isBuiltinCall() == Builtin::BI__builtin_constant_p)
839080d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith        return CheckEvalInICE(E, Ctx);
8391d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    ICEDiag CondResult = CheckICE(Exp->getCond(), Ctx);
8392ceb59d91b3a7def4297ec8468621805777741963Richard Smith    if (CondResult.Kind == IK_NotICE)
8393d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      return CondResult;
839463fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor
8395f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    ICEDiag TrueResult = CheckICE(Exp->getTrueExpr(), Ctx);
8396f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    ICEDiag FalseResult = CheckICE(Exp->getFalseExpr(), Ctx);
839763fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor
8398ceb59d91b3a7def4297ec8468621805777741963Richard Smith    if (TrueResult.Kind == IK_NotICE)
8399d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      return TrueResult;
8400ceb59d91b3a7def4297ec8468621805777741963Richard Smith    if (FalseResult.Kind == IK_NotICE)
8401d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      return FalseResult;
8402ceb59d91b3a7def4297ec8468621805777741963Richard Smith    if (CondResult.Kind == IK_ICEIfUnevaluated)
8403d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      return CondResult;
8404ceb59d91b3a7def4297ec8468621805777741963Richard Smith    if (TrueResult.Kind == IK_ICE && FalseResult.Kind == IK_ICE)
8405d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      return NoDiag();
8406d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    // Rare case where the diagnostics depend on which side is evaluated
8407d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    // Note that if we get here, CondResult is 0, and at least one of
8408d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    // TrueResult and FalseResult is non-zero.
8409ceb59d91b3a7def4297ec8468621805777741963Richard Smith    if (Exp->getCond()->EvaluateKnownConstInt(Ctx) == 0)
8410d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall      return FalseResult;
8411d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    return TrueResult;
8412d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  }
8413d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::CXXDefaultArgExprClass:
8414d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    return CheckICE(cast<CXXDefaultArgExpr>(E)->getExpr(), Ctx);
8415c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith  case Expr::CXXDefaultInitExprClass:
8416c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith    return CheckICE(cast<CXXDefaultInitExpr>(E)->getExpr(), Ctx);
8417d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  case Expr::ChooseExprClass: {
8418a5e660188a3c654cf0c88ed1093b28207e870b2bEli Friedman    return CheckICE(cast<ChooseExpr>(E)->getChosenSubExpr(), Ctx);
8419d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  }
8420d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  }
8421d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
84223026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid StmtClass!");
8423d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall}
8424d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall
8425f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith/// Evaluate an expression as a C++11 integral constant expression.
8426f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithstatic bool EvaluateCPlusPlus11IntegralConstantExpr(ASTContext &Ctx,
8427f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith                                                    const Expr *E,
8428f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith                                                    llvm::APSInt *Value,
8429f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith                                                    SourceLocation *Loc) {
8430f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  if (!E->getType()->isIntegralOrEnumerationType()) {
8431f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    if (Loc) *Loc = E->getExprLoc();
8432f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return false;
8433f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  }
8434f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith
84354c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith  APValue Result;
84364c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith  if (!E->isCXX11ConstantExpr(Ctx, &Result, Loc))
8437dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith    return false;
8438dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith
84394c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith  assert(Result.isInt() && "pointer cast to int is not an ICE");
84404c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith  if (Value) *Value = Result.getInt();
8441dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith  return true;
8442f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith}
8443f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith
8444dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smithbool Expr::isIntegerConstantExpr(ASTContext &Ctx, SourceLocation *Loc) const {
844580ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith  if (Ctx.getLangOpts().CPlusPlus11)
8446f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return EvaluateCPlusPlus11IntegralConstantExpr(Ctx, this, 0, Loc);
8447f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith
8448ceb59d91b3a7def4297ec8468621805777741963Richard Smith  ICEDiag D = CheckICE(this, Ctx);
8449ceb59d91b3a7def4297ec8468621805777741963Richard Smith  if (D.Kind != IK_ICE) {
8450ceb59d91b3a7def4297ec8468621805777741963Richard Smith    if (Loc) *Loc = D.Loc;
8451d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    return false;
8452d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  }
8453f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  return true;
8454f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith}
8455f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith
8456f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithbool Expr::isIntegerConstantExpr(llvm::APSInt &Value, ASTContext &Ctx,
8457f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith                                 SourceLocation *Loc, bool isEvaluated) const {
845880ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith  if (Ctx.getLangOpts().CPlusPlus11)
8459f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return EvaluateCPlusPlus11IntegralConstantExpr(Ctx, this, &Value, Loc);
8460f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith
8461f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  if (!isIntegerConstantExpr(Ctx, Loc))
8462f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith    return false;
8463f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith  if (!EvaluateAsInt(Value, Ctx))
8464d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall    llvm_unreachable("ICE cannot be evaluated!");
8465d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall  return true;
8466d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall}
84674c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith
846870488e201ccd94d4bb1ef0868cc13cca2b7d4ff6Richard Smithbool Expr::isCXX98IntegralConstantExpr(ASTContext &Ctx) const {
8469ceb59d91b3a7def4297ec8468621805777741963Richard Smith  return CheckICE(this, Ctx).Kind == IK_ICE;
847070488e201ccd94d4bb1ef0868cc13cca2b7d4ff6Richard Smith}
847170488e201ccd94d4bb1ef0868cc13cca2b7d4ff6Richard Smith
84724c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smithbool Expr::isCXX11ConstantExpr(ASTContext &Ctx, APValue *Result,
84734c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith                               SourceLocation *Loc) const {
84744c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith  // We support this checking in C++98 mode in order to diagnose compatibility
84754c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith  // issues.
84764e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  assert(Ctx.getLangOpts().CPlusPlus);
84774c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith
847870488e201ccd94d4bb1ef0868cc13cca2b7d4ff6Richard Smith  // Build evaluation settings.
84794c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith  Expr::EvalStatus Status;
8480cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko  SmallVector<PartialDiagnosticAt, 8> Diags;
84814c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith  Status.Diag = &Diags;
84824c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith  EvalInfo Info(Ctx, Status);
84834c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith
84844c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith  APValue Scratch;
84854c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith  bool IsConstExpr = ::EvaluateAsRValue(Info, this, Result ? *Result : Scratch);
84864c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith
84874c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith  if (!Diags.empty()) {
84884c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith    IsConstExpr = false;
84894c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith    if (Loc) *Loc = Diags[0].first;
84904c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith  } else if (!IsConstExpr) {
84914c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith    // FIXME: This shouldn't happen.
84924c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith    if (Loc) *Loc = getExprLoc();
84934c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith  }
84944c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith
84954c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith  return IsConstExpr;
84964c3fc9b38d3723f73e4ded594cebf38c76f91d93Richard Smith}
8497745f5147e065900267c85a5568785a1991d4838fRichard Smith
8498745f5147e065900267c85a5568785a1991d4838fRichard Smithbool Expr::isPotentialConstantExpr(const FunctionDecl *FD,
8499cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko                                   SmallVectorImpl<
8500745f5147e065900267c85a5568785a1991d4838fRichard Smith                                     PartialDiagnosticAt> &Diags) {
8501745f5147e065900267c85a5568785a1991d4838fRichard Smith  // FIXME: It would be useful to check constexpr function templates, but at the
8502745f5147e065900267c85a5568785a1991d4838fRichard Smith  // moment the constant expression evaluator cannot cope with the non-rigorous
8503745f5147e065900267c85a5568785a1991d4838fRichard Smith  // ASTs which we build for dependent expressions.
8504745f5147e065900267c85a5568785a1991d4838fRichard Smith  if (FD->isDependentContext())
8505745f5147e065900267c85a5568785a1991d4838fRichard Smith    return true;
8506745f5147e065900267c85a5568785a1991d4838fRichard Smith
8507745f5147e065900267c85a5568785a1991d4838fRichard Smith  Expr::EvalStatus Status;
8508745f5147e065900267c85a5568785a1991d4838fRichard Smith  Status.Diag = &Diags;
8509745f5147e065900267c85a5568785a1991d4838fRichard Smith
8510745f5147e065900267c85a5568785a1991d4838fRichard Smith  EvalInfo Info(FD->getASTContext(), Status);
8511745f5147e065900267c85a5568785a1991d4838fRichard Smith  Info.CheckingPotentialConstantExpression = true;
8512745f5147e065900267c85a5568785a1991d4838fRichard Smith
8513745f5147e065900267c85a5568785a1991d4838fRichard Smith  const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD);
8514745f5147e065900267c85a5568785a1991d4838fRichard Smith  const CXXRecordDecl *RD = MD ? MD->getParent()->getCanonicalDecl() : 0;
8515745f5147e065900267c85a5568785a1991d4838fRichard Smith
85166391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith  // Fabricate an arbitrary expression on the stack and pretend that it
8517745f5147e065900267c85a5568785a1991d4838fRichard Smith  // is a temporary being used as the 'this' pointer.
8518745f5147e065900267c85a5568785a1991d4838fRichard Smith  LValue This;
8519745f5147e065900267c85a5568785a1991d4838fRichard Smith  ImplicitValueInitExpr VIE(RD ? Info.Ctx.getRecordType(RD) : Info.Ctx.IntTy);
852083587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith  This.set(&VIE, Info.CurrentCall->Index);
8521745f5147e065900267c85a5568785a1991d4838fRichard Smith
8522745f5147e065900267c85a5568785a1991d4838fRichard Smith  ArrayRef<const Expr*> Args;
8523745f5147e065900267c85a5568785a1991d4838fRichard Smith
8524745f5147e065900267c85a5568785a1991d4838fRichard Smith  SourceLocation Loc = FD->getLocation();
8525745f5147e065900267c85a5568785a1991d4838fRichard Smith
85261aa0be86358002fe876e5a4a00c3038c96be28eeRichard Smith  APValue Scratch;
85276391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith  if (const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(FD)) {
85286391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith    // Evaluate the call as a constant initializer, to allow the construction
85296391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith    // of objects of non-literal types.
85306391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith    Info.setEvaluatingDecl(This.getLValueBase(), Scratch);
8531745f5147e065900267c85a5568785a1991d4838fRichard Smith    HandleConstructorCall(Loc, This, Args, CD, Info, Scratch);
85326391ea2897b595178a8a97e5080f59a6f55ce442Richard Smith  } else
8533745f5147e065900267c85a5568785a1991d4838fRichard Smith    HandleFunctionCall(Loc, FD, (MD && MD->isInstance()) ? &This : 0,
8534745f5147e065900267c85a5568785a1991d4838fRichard Smith                       Args, FD->getBody(), Info, Scratch);
8535745f5147e065900267c85a5568785a1991d4838fRichard Smith
8536745f5147e065900267c85a5568785a1991d4838fRichard Smith  return Diags.empty();
8537745f5147e065900267c85a5568785a1991d4838fRichard Smith}
8538