ExprConstant.cpp revision 80d4b55db94db2172a04617d1a80feca6bbcea5c
1b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner//===--- ExprConstant.cpp - Expression Constant Evaluator -----------------===// 2c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// 3c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// The LLVM Compiler Infrastructure 4c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// 5c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// This file is distributed under the University of Illinois Open Source 6c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// License. See LICENSE.TXT for details. 7c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// 8c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//===----------------------------------------------------------------------===// 9c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// 10c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// This file implements the Expr constant evaluator. 11c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// 12c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//===----------------------------------------------------------------------===// 13c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson 14c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson#include "clang/AST/APValue.h" 15c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson#include "clang/AST/ASTContext.h" 16199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck#include "clang/AST/CharUnits.h" 1719cc4abea06a9b49e0e16a50d335c064cd723572Anders Carlsson#include "clang/AST/RecordLayout.h" 180fe52e1bcaa69ba127f1bda036f057fec1f478deSeo Sanghyeon#include "clang/AST/StmtVisitor.h" 198ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor#include "clang/AST/TypeLoc.h" 20500d3297d2a21edeac4d46cbcbe21bc2352c2a28Chris Lattner#include "clang/AST/ASTDiagnostic.h" 218ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor#include "clang/AST/Expr.h" 221b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner#include "clang/Basic/Builtins.h" 2306a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson#include "clang/Basic/TargetInfo.h" 247462b39a9bccaf4392687831036713f09f9c0681Mike Stump#include "llvm/ADT/SmallString.h" 254572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump#include <cstring> 264572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump 27c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlssonusing namespace clang; 28f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerusing llvm::APSInt; 29d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanusing llvm::APFloat; 30c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson 3187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// EvalInfo - This is a private struct used by the evaluator to capture 3287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// information about a subexpression as it is folded. It retains information 3387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// about the AST context, but also maintains information about the folded 3487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// expression. 3587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// 3687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// If an expression could be evaluated, it is still possible it is not a C 3787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// "integer constant expression" or constant expression. If not, this struct 3887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// captures information about how and why not. 3987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// 4087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// One bit of information passed *into* the request for constant folding 4187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// indicates whether the subexpression is "evaluated" or not according to C 4287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// rules. For example, the RHS of (0 && foo()) is not evaluated. We can 4387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// evaluate the expression regardless of what the RHS is, but C only allows 4487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// certain things in certain situations. 45c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramernamespace { 46180f47959a066795cc0f409433023af448bb0328Richard Smith struct LValue; 47d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith struct CallStackFrame; 48bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith struct EvalInfo; 49d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 501bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith QualType getType(APValue::LValueBase B) { 511bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith if (!B) return QualType(); 521bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith if (const ValueDecl *D = B.dyn_cast<const ValueDecl*>()) 531bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith return D->getType(); 541bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith return B.get<const Expr*>()->getType(); 551bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith } 561bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith 57180f47959a066795cc0f409433023af448bb0328Richard Smith /// Get an LValue path entry, which is known to not be an array index, as a 58180f47959a066795cc0f409433023af448bb0328Richard Smith /// field declaration. 59180f47959a066795cc0f409433023af448bb0328Richard Smith const FieldDecl *getAsField(APValue::LValuePathEntry E) { 60180f47959a066795cc0f409433023af448bb0328Richard Smith APValue::BaseOrMemberType Value; 61180f47959a066795cc0f409433023af448bb0328Richard Smith Value.setFromOpaqueValue(E.BaseOrMember); 62180f47959a066795cc0f409433023af448bb0328Richard Smith return dyn_cast<FieldDecl>(Value.getPointer()); 63180f47959a066795cc0f409433023af448bb0328Richard Smith } 64180f47959a066795cc0f409433023af448bb0328Richard Smith /// Get an LValue path entry, which is known to not be an array index, as a 65180f47959a066795cc0f409433023af448bb0328Richard Smith /// base class declaration. 66180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXRecordDecl *getAsBaseClass(APValue::LValuePathEntry E) { 67180f47959a066795cc0f409433023af448bb0328Richard Smith APValue::BaseOrMemberType Value; 68180f47959a066795cc0f409433023af448bb0328Richard Smith Value.setFromOpaqueValue(E.BaseOrMember); 69180f47959a066795cc0f409433023af448bb0328Richard Smith return dyn_cast<CXXRecordDecl>(Value.getPointer()); 70180f47959a066795cc0f409433023af448bb0328Richard Smith } 71180f47959a066795cc0f409433023af448bb0328Richard Smith /// Determine whether this LValue path entry for a base class names a virtual 72180f47959a066795cc0f409433023af448bb0328Richard Smith /// base class. 73180f47959a066795cc0f409433023af448bb0328Richard Smith bool isVirtualBaseClass(APValue::LValuePathEntry E) { 74180f47959a066795cc0f409433023af448bb0328Richard Smith APValue::BaseOrMemberType Value; 75180f47959a066795cc0f409433023af448bb0328Richard Smith Value.setFromOpaqueValue(E.BaseOrMember); 76180f47959a066795cc0f409433023af448bb0328Richard Smith return Value.getInt(); 77180f47959a066795cc0f409433023af448bb0328Richard Smith } 78180f47959a066795cc0f409433023af448bb0328Richard Smith 799a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith /// Determine whether the described subobject is an array element. 809a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith static bool SubobjectIsArrayElement(QualType Base, 819a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith ArrayRef<APValue::LValuePathEntry> Path) { 829a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith bool IsArrayElement = false; 839a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith const Type *T = Base.getTypePtr(); 849a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith for (unsigned I = 0, N = Path.size(); I != N; ++I) { 859a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith IsArrayElement = T && T->isArrayType(); 869a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith if (IsArrayElement) 879a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith T = T->getBaseElementTypeUnsafe(); 88180f47959a066795cc0f409433023af448bb0328Richard Smith else if (const FieldDecl *FD = getAsField(Path[I])) 899a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith T = FD->getType().getTypePtr(); 909a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith else 919a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith // Path[I] describes a base class. 929a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith T = 0; 939a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith } 949a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith return IsArrayElement; 959a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith } 969a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith 970a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith /// A path from a glvalue to a subobject of that glvalue. 980a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith struct SubobjectDesignator { 990a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith /// True if the subobject was named in a manner not supported by C++11. Such 1000a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith /// lvalues can still be folded, but they are not core constant expressions 1010a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith /// and we cannot perform lvalue-to-rvalue conversions on them. 1020a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith bool Invalid : 1; 1030a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith 1040a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith /// Whether this designates an array element. 1050a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith bool ArrayElement : 1; 1060a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith 1070a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith /// Whether this designates 'one past the end' of the current subobject. 1080a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith bool OnePastTheEnd : 1; 1090a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith 1109a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith typedef APValue::LValuePathEntry PathEntry; 1119a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith 1120a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith /// The entries on the path from the glvalue to the designated subobject. 1130a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith SmallVector<PathEntry, 8> Entries; 1140a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith 1150a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith SubobjectDesignator() : 1160a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Invalid(false), ArrayElement(false), OnePastTheEnd(false) {} 1170a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith 1189a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith SubobjectDesignator(const APValue &V) : 1199a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith Invalid(!V.isLValue() || !V.hasLValuePath()), ArrayElement(false), 1209a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith OnePastTheEnd(false) { 1219a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith if (!Invalid) { 1229a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith ArrayRef<PathEntry> VEntries = V.getLValuePath(); 1239a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith Entries.insert(Entries.end(), VEntries.begin(), VEntries.end()); 1249a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith if (V.getLValueBase()) 1251bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith ArrayElement = SubobjectIsArrayElement(getType(V.getLValueBase()), 1269a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith V.getLValuePath()); 1279a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith else 1289a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith assert(V.getLValuePath().empty() &&"Null pointer with nonempty path"); 129e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith OnePastTheEnd = V.isLValueOnePastTheEnd(); 1309a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith } 1319a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith } 1329a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith 1330a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith void setInvalid() { 1340a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Invalid = true; 1350a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Entries.clear(); 1360a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith } 1370a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith /// Update this designator to refer to the given element within this array. 1380a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith void addIndex(uint64_t N) { 1390a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (Invalid) return; 1400a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (OnePastTheEnd) { 1410a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith setInvalid(); 1420a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return; 1430a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith } 1440a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith PathEntry Entry; 1459a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith Entry.ArrayIndex = N; 1460a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Entries.push_back(Entry); 1470a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith ArrayElement = true; 1480a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith } 1490a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith /// Update this designator to refer to the given base or member of this 1500a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith /// object. 151180f47959a066795cc0f409433023af448bb0328Richard Smith void addDecl(const Decl *D, bool Virtual = false) { 1520a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (Invalid) return; 1530a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (OnePastTheEnd) { 1540a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith setInvalid(); 1550a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return; 1560a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith } 1570a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith PathEntry Entry; 158180f47959a066795cc0f409433023af448bb0328Richard Smith APValue::BaseOrMemberType Value(D, Virtual); 159180f47959a066795cc0f409433023af448bb0328Richard Smith Entry.BaseOrMember = Value.getOpaqueValue(); 1600a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Entries.push_back(Entry); 1610a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith ArrayElement = false; 1620a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith } 1630a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith /// Add N to the address of this subobject. 1640a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith void adjustIndex(uint64_t N) { 1650a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (Invalid) return; 1660a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (ArrayElement) { 167cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // FIXME: Make sure the index stays within bounds, or one past the end. 1689a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith Entries.back().ArrayIndex += N; 1690a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return; 1700a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith } 1710a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (OnePastTheEnd && N == (uint64_t)-1) 1720a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith OnePastTheEnd = false; 1730a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith else if (!OnePastTheEnd && N == 1) 1740a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith OnePastTheEnd = true; 1750a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith else if (N != 0) 1760a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith setInvalid(); 1770a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith } 1780a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith }; 1790a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith 18047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith /// A core constant value. This can be the value of any constant expression, 18147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith /// or a pointer or reference to a non-static object or function parameter. 182e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// 183e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// For an LValue, the base and offset are stored in the APValue subobject, 184e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// but the other information is stored in the SubobjectDesignator. For all 185e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// other value kinds, the value is stored directly in the APValue subobject. 18647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith class CCValue : public APValue { 18747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith typedef llvm::APSInt APSInt; 18847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith typedef llvm::APFloat APFloat; 189177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith /// If the value is a reference or pointer into a parameter or temporary, 190177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith /// this is the corresponding call stack frame. 191177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith CallStackFrame *CallFrame; 1920a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith /// If the value is a reference or pointer, this is a description of how the 1930a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith /// subobject was specified. 1940a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith SubobjectDesignator Designator; 19547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith public: 196177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith struct GlobalValue {}; 197177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith 19847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue() {} 19947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith explicit CCValue(const APSInt &I) : APValue(I) {} 20047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith explicit CCValue(const APFloat &F) : APValue(F) {} 20147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue(const APValue *E, unsigned N) : APValue(E, N) {} 20247a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue(const APSInt &R, const APSInt &I) : APValue(R, I) {} 20347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue(const APFloat &R, const APFloat &I) : APValue(R, I) {} 204177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith CCValue(const CCValue &V) : APValue(V), CallFrame(V.CallFrame) {} 2051bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith CCValue(LValueBase B, const CharUnits &O, CallStackFrame *F, 2060a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith const SubobjectDesignator &D) : 2079a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith APValue(B, O, APValue::NoLValuePath()), CallFrame(F), Designator(D) {} 208177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith CCValue(const APValue &V, GlobalValue) : 2099a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith APValue(V), CallFrame(0), Designator(V) {} 210e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith CCValue(const ValueDecl *D, bool IsDerivedMember, 211e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith ArrayRef<const CXXRecordDecl*> Path) : 212e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith APValue(D, IsDerivedMember, Path) {} 21347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith 214177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith CallStackFrame *getLValueFrame() const { 21547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith assert(getKind() == LValue); 216177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith return CallFrame; 21747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith } 2180a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith SubobjectDesignator &getLValueDesignator() { 2190a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith assert(getKind() == LValue); 2200a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return Designator; 2210a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith } 2220a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith const SubobjectDesignator &getLValueDesignator() const { 2230a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return const_cast<CCValue*>(this)->getLValueDesignator(); 2240a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith } 22547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith }; 22647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith 227bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith /// A stack frame in the constexpr call stack. 228bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith struct CallStackFrame { 229bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith EvalInfo &Info; 230bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 231bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith /// Parent - The caller of this stack frame. 232bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith CallStackFrame *Caller; 233bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 23408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith /// CallLoc - The location of the call expression for this call. 23508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith SourceLocation CallLoc; 23608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith 23708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith /// Callee - The function which was called. 23808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith const FunctionDecl *Callee; 23908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith 240180f47959a066795cc0f409433023af448bb0328Richard Smith /// This - The binding for the this pointer in this call, if any. 241180f47959a066795cc0f409433023af448bb0328Richard Smith const LValue *This; 242180f47959a066795cc0f409433023af448bb0328Richard Smith 243bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith /// ParmBindings - Parameter bindings for this function call, indexed by 244bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith /// parameters' function scope indices. 245bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith const CCValue *Arguments; 246bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 247bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith typedef llvm::DenseMap<const Expr*, CCValue> MapTy; 248bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith typedef MapTy::const_iterator temp_iterator; 249bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith /// Temporaries - Temporary lvalues materialized within this stack frame. 250bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith MapTy Temporaries; 251bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 25208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith CallStackFrame(EvalInfo &Info, SourceLocation CallLoc, 25308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith const FunctionDecl *Callee, const LValue *This, 254180f47959a066795cc0f409433023af448bb0328Richard Smith const CCValue *Arguments); 255bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith ~CallStackFrame(); 256bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith }; 257bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 258dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith /// A partial diagnostic which we might know in advance that we are not going 259dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith /// to emit. 260dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith class OptionalDiagnostic { 261dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith PartialDiagnostic *Diag; 262dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith 263dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith public: 264dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith explicit OptionalDiagnostic(PartialDiagnostic *Diag = 0) : Diag(Diag) {} 265dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith 266dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith template<typename T> 267dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith OptionalDiagnostic &operator<<(const T &v) { 268dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith if (Diag) 269dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith *Diag << v; 270dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith return *this; 271dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith } 272dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith }; 273dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith 274c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer struct EvalInfo { 275dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith ASTContext &Ctx; 2761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2771e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith /// EvalStatus - Contains information about the evaluation. 2781e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith Expr::EvalStatus &EvalStatus; 279f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson 280d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith /// CurrentCall - The top of the constexpr call stack. 281bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith CallStackFrame *CurrentCall; 282d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 283d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith /// CallStackDepth - The number of calls in the call stack right now. 284d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith unsigned CallStackDepth; 285d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 28647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith typedef llvm::DenseMap<const OpaqueValueExpr*, CCValue> MapTy; 287bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith /// OpaqueValues - Values used as the common expression in a 288bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith /// BinaryConditionalOperator. 289c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer MapTy OpaqueValues; 290bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 291bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith /// BottomFrame - The frame in which evaluation started. This must be 292bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith /// initialized last. 293bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith CallStackFrame BottomFrame; 294bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 295180f47959a066795cc0f409433023af448bb0328Richard Smith /// EvaluatingDecl - This is the declaration whose initializer is being 296180f47959a066795cc0f409433023af448bb0328Richard Smith /// evaluated, if any. 297180f47959a066795cc0f409433023af448bb0328Richard Smith const VarDecl *EvaluatingDecl; 298180f47959a066795cc0f409433023af448bb0328Richard Smith 299180f47959a066795cc0f409433023af448bb0328Richard Smith /// EvaluatingDeclValue - This is the value being constructed for the 300180f47959a066795cc0f409433023af448bb0328Richard Smith /// declaration whose initializer is being evaluated, if any. 301180f47959a066795cc0f409433023af448bb0328Richard Smith APValue *EvaluatingDeclValue; 302180f47959a066795cc0f409433023af448bb0328Richard Smith 303c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith /// HasActiveDiagnostic - Was the previous diagnostic stored? If so, further 304c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith /// notes attached to it will also be stored, otherwise they will not be. 305c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith bool HasActiveDiagnostic; 306c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith 307bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 308bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith EvalInfo(const ASTContext &C, Expr::EvalStatus &S) 309dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith : Ctx(const_cast<ASTContext&>(C)), EvalStatus(S), CurrentCall(0), 31008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith CallStackDepth(0), BottomFrame(*this, SourceLocation(), 0, 0, 0), 31108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith EvaluatingDecl(0), EvaluatingDeclValue(0), HasActiveDiagnostic(false) {} 312bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 31347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith const CCValue *getOpaqueValue(const OpaqueValueExpr *e) const { 314c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer MapTy::const_iterator i = OpaqueValues.find(e); 315c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer if (i == OpaqueValues.end()) return 0; 316c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer return &i->second; 317c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer } 31856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 319180f47959a066795cc0f409433023af448bb0328Richard Smith void setEvaluatingDecl(const VarDecl *VD, APValue &Value) { 320180f47959a066795cc0f409433023af448bb0328Richard Smith EvaluatingDecl = VD; 321180f47959a066795cc0f409433023af448bb0328Richard Smith EvaluatingDeclValue = &Value; 322180f47959a066795cc0f409433023af448bb0328Richard Smith } 323180f47959a066795cc0f409433023af448bb0328Richard Smith 324c18c42345636e2866fed75c7e434fb659d747672Richard Smith const LangOptions &getLangOpts() const { return Ctx.getLangOptions(); } 325c18c42345636e2866fed75c7e434fb659d747672Richard Smith 326c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith bool CheckCallLimit(SourceLocation Loc) { 327c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith if (CallStackDepth <= getLangOpts().ConstexprCallDepth) 328c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return true; 329c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith Diag(Loc, diag::note_constexpr_depth_limit_exceeded) 330c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith << getLangOpts().ConstexprCallDepth; 331c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return false; 332c18c42345636e2866fed75c7e434fb659d747672Richard Smith } 333f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 334c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith private: 335c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith /// Add a diagnostic to the diagnostics list. 336c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith PartialDiagnostic &addDiag(SourceLocation Loc, diag::kind DiagId) { 337c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith PartialDiagnostic PD(DiagId, Ctx.getDiagAllocator()); 338c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith EvalStatus.Diag->push_back(std::make_pair(Loc, PD)); 339c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return EvalStatus.Diag->back().second; 340c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith } 341c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith 34208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith /// Add notes containing a call stack to the current point of evaluation. 34308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith void addCallStack(unsigned Limit); 34408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith 345c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith public: 346f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith /// Diagnose that the evaluation cannot be folded. 3477098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith OptionalDiagnostic Diag(SourceLocation Loc, diag::kind DiagId 3487098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith = diag::note_invalid_subexpr_in_const_expr, 349c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith unsigned ExtraNotes = 0) { 350f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // If we have a prior diagnostic, it will be noting that the expression 351f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // isn't a constant expression. This diagnostic is more important. 352f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // FIXME: We might want to show both diagnostics to the user. 353dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith if (EvalStatus.Diag) { 35408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith unsigned CallStackNotes = CallStackDepth - 1; 35508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith unsigned Limit = Ctx.getDiagnostics().getConstexprBacktraceLimit(); 35608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (Limit) 35708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith CallStackNotes = std::min(CallStackNotes, Limit + 1); 35808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith 359c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith HasActiveDiagnostic = true; 360dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith EvalStatus.Diag->clear(); 36108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith EvalStatus.Diag->reserve(1 + ExtraNotes + CallStackNotes); 36208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith addDiag(Loc, DiagId); 36308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith addCallStack(Limit); 36408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith return OptionalDiagnostic(&(*EvalStatus.Diag)[0].second); 365dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith } 366c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith HasActiveDiagnostic = false; 367dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith return OptionalDiagnostic(); 368dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith } 369dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith 370dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith /// Diagnose that the evaluation does not produce a C++11 core constant 371dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith /// expression. 3727098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith OptionalDiagnostic CCEDiag(SourceLocation Loc, diag::kind DiagId 3737098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith = diag::note_invalid_subexpr_in_const_expr, 374c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith unsigned ExtraNotes = 0) { 375dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith // Don't override a previous diagnostic. 376dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith if (!EvalStatus.Diag || !EvalStatus.Diag->empty()) 377dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith return OptionalDiagnostic(); 378c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return Diag(Loc, DiagId, ExtraNotes); 379c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith } 380c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith 381c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith /// Add a note to a prior diagnostic. 382c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith OptionalDiagnostic Note(SourceLocation Loc, diag::kind DiagId) { 383c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith if (!HasActiveDiagnostic) 384c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return OptionalDiagnostic(); 385c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return OptionalDiagnostic(&addDiag(Loc, DiagId)); 386f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 387099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith 388099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith /// Add a stack of notes to a prior diagnostic. 389099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith void addNotes(ArrayRef<PartialDiagnosticAt> Diags) { 390099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith if (HasActiveDiagnostic) { 391099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith EvalStatus.Diag->insert(EvalStatus.Diag->end(), 392099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith Diags.begin(), Diags.end()); 393099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith } 394099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith } 395c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer }; 39608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith} 39708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith 39808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard SmithCallStackFrame::CallStackFrame(EvalInfo &Info, SourceLocation CallLoc, 39908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith const FunctionDecl *Callee, const LValue *This, 40008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith const CCValue *Arguments) 40108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith : Info(Info), Caller(Info.CurrentCall), CallLoc(CallLoc), Callee(Callee), 40208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith This(This), Arguments(Arguments) { 40308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Info.CurrentCall = this; 40408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith ++Info.CallStackDepth; 40508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith} 40608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith 40708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard SmithCallStackFrame::~CallStackFrame() { 40808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith assert(Info.CurrentCall == this && "calls retired out of order"); 40908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith --Info.CallStackDepth; 41008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Info.CurrentCall = Caller; 41108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith} 41287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 41308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith/// Produce a string describing the given constexpr call. 41408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithstatic void describeCall(CallStackFrame *Frame, llvm::raw_ostream &Out) { 41508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith unsigned ArgIndex = 0; 41608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith bool IsMemberCall = isa<CXXMethodDecl>(Frame->Callee) && 41708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith !isa<CXXConstructorDecl>(Frame->Callee); 41808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith 41908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (!IsMemberCall) 42008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << *Frame->Callee << '('; 42108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith 42208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith for (FunctionDecl::param_const_iterator I = Frame->Callee->param_begin(), 42308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith E = Frame->Callee->param_end(); I != E; ++I, ++ArgIndex) { 42408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (ArgIndex > IsMemberCall) 42508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << ", "; 42608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith 42708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith const ParmVarDecl *Param = *I; 42808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith const CCValue &Arg = Frame->Arguments[ArgIndex]; 42908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (!Arg.isLValue() || Arg.getLValueDesignator().Invalid) 43008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Arg.printPretty(Out, Frame->Info.Ctx, Param->getType()); 43108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith else { 43208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith // Deliberately slice off the frame to form an APValue we can print. 43308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith APValue Value(Arg.getLValueBase(), Arg.getLValueOffset(), 43408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Arg.getLValueDesignator().Entries, 43508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Arg.getLValueDesignator().OnePastTheEnd); 43608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Value.printPretty(Out, Frame->Info.Ctx, Param->getType()); 43708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 43808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith 43908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (ArgIndex == 0 && IsMemberCall) 44008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << "->" << *Frame->Callee << '('; 441bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith } 442d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 44308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << ')'; 44408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith} 44508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith 44608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithvoid EvalInfo::addCallStack(unsigned Limit) { 44708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith // Determine which calls to skip, if any. 44808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith unsigned ActiveCalls = CallStackDepth - 1; 44908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith unsigned SkipStart = ActiveCalls, SkipEnd = SkipStart; 45008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (Limit && Limit < ActiveCalls) { 45108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith SkipStart = Limit / 2 + Limit % 2; 45208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith SkipEnd = ActiveCalls - Limit / 2; 45308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 45408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith 45508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith // Walk the call stack and add the diagnostics. 45608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith unsigned CallIdx = 0; 45708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith for (CallStackFrame *Frame = CurrentCall; Frame != &BottomFrame; 45808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Frame = Frame->Caller, ++CallIdx) { 45908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith // Skip this call? 46008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (CallIdx >= SkipStart && CallIdx < SkipEnd) { 46108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (CallIdx == SkipStart) { 46208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith // Note that we're skipping calls. 46308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith addDiag(Frame->CallLoc, diag::note_constexpr_calls_suppressed) 46408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith << unsigned(ActiveCalls - Limit); 46508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 46608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith continue; 46708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 46808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith 46908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith llvm::SmallVector<char, 128> Buffer; 47008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith llvm::raw_svector_ostream Out(Buffer); 47108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith describeCall(Frame, Out); 47208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith addDiag(Frame->CallLoc, diag::note_constexpr_call_here) << Out.str(); 473bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith } 47408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith} 475d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 47608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithnamespace { 477f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall struct ComplexValue { 478f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall private: 479f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall bool IsInt; 480f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall 481f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall public: 482f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall APSInt IntReal, IntImag; 483f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall APFloat FloatReal, FloatImag; 484f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall 485f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexValue() : FloatReal(APFloat::Bogus), FloatImag(APFloat::Bogus) {} 486f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall 487f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall void makeComplexFloat() { IsInt = false; } 488f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall bool isComplexFloat() const { return !IsInt; } 489f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall APFloat &getComplexFloatReal() { return FloatReal; } 490f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall APFloat &getComplexFloatImag() { return FloatImag; } 491f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall 492f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall void makeComplexInt() { IsInt = true; } 493f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall bool isComplexInt() const { return IsInt; } 494f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall APSInt &getComplexIntReal() { return IntReal; } 495f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall APSInt &getComplexIntImag() { return IntImag; } 496f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall 49747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith void moveInto(CCValue &v) const { 498f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall if (isComplexFloat()) 49947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith v = CCValue(FloatReal, FloatImag); 500f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall else 50147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith v = CCValue(IntReal, IntImag); 502f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall } 50347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith void setFrom(const CCValue &v) { 50456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall assert(v.isComplexFloat() || v.isComplexInt()); 50556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (v.isComplexFloat()) { 50656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall makeComplexFloat(); 50756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall FloatReal = v.getComplexFloatReal(); 50856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall FloatImag = v.getComplexFloatImag(); 50956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } else { 51056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall makeComplexInt(); 51156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall IntReal = v.getComplexIntReal(); 51256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall IntImag = v.getComplexIntImag(); 51356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 51456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 515f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall }; 516efdb83e26f9a1fd2566afe54461216cd84814d42John McCall 517efdb83e26f9a1fd2566afe54461216cd84814d42John McCall struct LValue { 5181bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith APValue::LValueBase Base; 519efdb83e26f9a1fd2566afe54461216cd84814d42John McCall CharUnits Offset; 520177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith CallStackFrame *Frame; 5210a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith SubobjectDesignator Designator; 522efdb83e26f9a1fd2566afe54461216cd84814d42John McCall 5231bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith const APValue::LValueBase getLValueBase() const { return Base; } 52447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CharUnits &getLValueOffset() { return Offset; } 525625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith const CharUnits &getLValueOffset() const { return Offset; } 526177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith CallStackFrame *getLValueFrame() const { return Frame; } 5270a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith SubobjectDesignator &getLValueDesignator() { return Designator; } 5280a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith const SubobjectDesignator &getLValueDesignator() const { return Designator;} 529efdb83e26f9a1fd2566afe54461216cd84814d42John McCall 53047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith void moveInto(CCValue &V) const { 5310a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith V = CCValue(Base, Offset, Frame, Designator); 532efdb83e26f9a1fd2566afe54461216cd84814d42John McCall } 53347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith void setFrom(const CCValue &V) { 53447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith assert(V.isLValue()); 53547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Base = V.getLValueBase(); 53647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Offset = V.getLValueOffset(); 537177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith Frame = V.getLValueFrame(); 5380a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Designator = V.getLValueDesignator(); 5390a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith } 5400a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith 5411bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith void set(APValue::LValueBase B, CallStackFrame *F = 0) { 5421bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith Base = B; 5430a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Offset = CharUnits::Zero(); 5440a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Frame = F; 5450a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Designator = SubobjectDesignator(); 54656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 547efdb83e26f9a1fd2566afe54461216cd84814d42John McCall }; 548e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 549e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith struct MemberPtr { 550e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MemberPtr() {} 551e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith explicit MemberPtr(const ValueDecl *Decl) : 552e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith DeclAndIsDerivedMember(Decl, false), Path() {} 553e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 554e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// The member or (direct or indirect) field referred to by this member 555e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// pointer, or 0 if this is a null member pointer. 556e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const ValueDecl *getDecl() const { 557e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return DeclAndIsDerivedMember.getPointer(); 558e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 559e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// Is this actually a member of some type derived from the relevant class? 560e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool isDerivedMember() const { 561e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return DeclAndIsDerivedMember.getInt(); 562e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 563e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// Get the class which the declaration actually lives in. 564e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *getContainingRecord() const { 565e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return cast<CXXRecordDecl>( 566e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith DeclAndIsDerivedMember.getPointer()->getDeclContext()); 567e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 568e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 569e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith void moveInto(CCValue &V) const { 570e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith V = CCValue(getDecl(), isDerivedMember(), Path); 571e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 572e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith void setFrom(const CCValue &V) { 573e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith assert(V.isMemberPointer()); 574e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith DeclAndIsDerivedMember.setPointer(V.getMemberPointerDecl()); 575e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith DeclAndIsDerivedMember.setInt(V.isMemberPointerToDerivedMember()); 576e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Path.clear(); 577e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith ArrayRef<const CXXRecordDecl*> P = V.getMemberPointerPath(); 578e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Path.insert(Path.end(), P.begin(), P.end()); 579e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 580e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 581e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// DeclAndIsDerivedMember - The member declaration, and a flag indicating 582e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// whether the member is a member of some class derived from the class type 583e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// of the member pointer. 584e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith llvm::PointerIntPair<const ValueDecl*, 1, bool> DeclAndIsDerivedMember; 585e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// Path - The path of base/derived classes from the member declaration's 586e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// class (exclusive) to the class type of the member pointer (inclusive). 587e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith SmallVector<const CXXRecordDecl*, 4> Path; 588e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 589e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// Perform a cast towards the class of the Decl (either up or down the 590e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// hierarchy). 591e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool castBack(const CXXRecordDecl *Class) { 592e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith assert(!Path.empty()); 593e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *Expected; 594e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (Path.size() >= 2) 595e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Expected = Path[Path.size() - 2]; 596e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith else 597e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Expected = getContainingRecord(); 598e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (Expected->getCanonicalDecl() != Class->getCanonicalDecl()) { 599e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // C++11 [expr.static.cast]p12: In a conversion from (D::*) to (B::*), 600e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // if B does not contain the original member and is not a base or 601e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // derived class of the class containing the original member, the result 602e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // of the cast is undefined. 603e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // C++11 [conv.mem]p2 does not cover this case for a cast from (B::*) to 604e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // (D::*). We consider that to be a language defect. 605e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 606e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 607e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Path.pop_back(); 608e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 609e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 610e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// Perform a base-to-derived member pointer cast. 611e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool castToDerived(const CXXRecordDecl *Derived) { 612e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!getDecl()) 613e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 614e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!isDerivedMember()) { 615e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Path.push_back(Derived); 616e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 617e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 618e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!castBack(Derived)) 619e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 620e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (Path.empty()) 621e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith DeclAndIsDerivedMember.setInt(false); 622e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 623e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 624e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// Perform a derived-to-base member pointer cast. 625e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool castToBase(const CXXRecordDecl *Base) { 626e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!getDecl()) 627e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 628e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (Path.empty()) 629e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith DeclAndIsDerivedMember.setInt(true); 630e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (isDerivedMember()) { 631e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Path.push_back(Base); 632e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 633e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 634e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return castBack(Base); 635e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 636e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith }; 637c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith 638c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith /// Kinds of constant expression checking, for diagnostics. 639c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith enum CheckConstantExpressionKind { 640c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith CCEK_Constant, ///< A normal constant. 641c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith CCEK_ReturnValue, ///< A constexpr function return value. 642c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith CCEK_MemberInit ///< A constexpr constructor mem-initializer. 643c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith }; 644f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall} 64587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 64647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smithstatic bool Evaluate(CCValue &Result, EvalInfo &Info, const Expr *E); 64769c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smithstatic bool EvaluateConstantExpression(APValue &Result, EvalInfo &Info, 648c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith const LValue &This, const Expr *E, 649c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith CheckConstantExpressionKind CCEK 650c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith = CCEK_Constant); 651efdb83e26f9a1fd2566afe54461216cd84814d42John McCallstatic bool EvaluateLValue(const Expr *E, LValue &Result, EvalInfo &Info); 652efdb83e26f9a1fd2566afe54461216cd84814d42John McCallstatic bool EvaluatePointer(const Expr *E, LValue &Result, EvalInfo &Info); 653e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstatic bool EvaluateMemberPointer(const Expr *E, MemberPtr &Result, 654e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith EvalInfo &Info); 655e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstatic bool EvaluateTemporary(const Expr *E, LValue &Result, EvalInfo &Info); 65687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluateInteger(const Expr *E, APSInt &Result, EvalInfo &Info); 65747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smithstatic bool EvaluateIntegerOrLValue(const Expr *E, CCValue &Result, 658d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner EvalInfo &Info); 659d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr *E, APFloat &Result, EvalInfo &Info); 660f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCallstatic bool EvaluateComplex(const Expr *E, ComplexValue &Res, EvalInfo &Info); 661f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 662f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 6634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// Misc utilities 6644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 6654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 666180f47959a066795cc0f409433023af448bb0328Richard Smith/// Should this call expression be treated as a string literal? 667180f47959a066795cc0f409433023af448bb0328Richard Smithstatic bool IsStringLiteralCall(const CallExpr *E) { 668180f47959a066795cc0f409433023af448bb0328Richard Smith unsigned Builtin = E->isBuiltinCall(); 669180f47959a066795cc0f409433023af448bb0328Richard Smith return (Builtin == Builtin::BI__builtin___CFStringMakeConstantString || 670180f47959a066795cc0f409433023af448bb0328Richard Smith Builtin == Builtin::BI__builtin___NSStringMakeConstantString); 671180f47959a066795cc0f409433023af448bb0328Richard Smith} 672180f47959a066795cc0f409433023af448bb0328Richard Smith 6731bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smithstatic bool IsGlobalLValue(APValue::LValueBase B) { 674180f47959a066795cc0f409433023af448bb0328Richard Smith // C++11 [expr.const]p3 An address constant expression is a prvalue core 675180f47959a066795cc0f409433023af448bb0328Richard Smith // constant expression of pointer type that evaluates to... 676180f47959a066795cc0f409433023af448bb0328Richard Smith 677180f47959a066795cc0f409433023af448bb0328Richard Smith // ... a null pointer value, or a prvalue core constant expression of type 678180f47959a066795cc0f409433023af448bb0328Richard Smith // std::nullptr_t. 6791bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith if (!B) return true; 68042c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 6811bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith if (const ValueDecl *D = B.dyn_cast<const ValueDecl*>()) { 682180f47959a066795cc0f409433023af448bb0328Richard Smith // ... the address of an object with static storage duration, 6831bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith if (const VarDecl *VD = dyn_cast<VarDecl>(D)) 68442c8f87eb60958170c46767273bf93e6c96125bfJohn McCall return VD->hasGlobalStorage(); 6851bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith // ... the address of a function, 6861bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith return isa<FunctionDecl>(D); 68742c8f87eb60958170c46767273bf93e6c96125bfJohn McCall } 6881bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith 6891bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith const Expr *E = B.get<const Expr*>(); 6901bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith switch (E->getStmtClass()) { 6911bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith default: 6921bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith return false; 693180f47959a066795cc0f409433023af448bb0328Richard Smith case Expr::CompoundLiteralExprClass: 694180f47959a066795cc0f409433023af448bb0328Richard Smith return cast<CompoundLiteralExpr>(E)->isFileScope(); 695180f47959a066795cc0f409433023af448bb0328Richard Smith // A string literal has static storage duration. 696180f47959a066795cc0f409433023af448bb0328Richard Smith case Expr::StringLiteralClass: 697180f47959a066795cc0f409433023af448bb0328Richard Smith case Expr::PredefinedExprClass: 698180f47959a066795cc0f409433023af448bb0328Richard Smith case Expr::ObjCStringLiteralClass: 699180f47959a066795cc0f409433023af448bb0328Richard Smith case Expr::ObjCEncodeExprClass: 70047d2145675099893d702be4bc06bd9f26d8ddd13Richard Smith case Expr::CXXTypeidExprClass: 701180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 702180f47959a066795cc0f409433023af448bb0328Richard Smith case Expr::CallExprClass: 703180f47959a066795cc0f409433023af448bb0328Richard Smith return IsStringLiteralCall(cast<CallExpr>(E)); 704180f47959a066795cc0f409433023af448bb0328Richard Smith // For GCC compatibility, &&label has static storage duration. 705180f47959a066795cc0f409433023af448bb0328Richard Smith case Expr::AddrLabelExprClass: 706180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 707180f47959a066795cc0f409433023af448bb0328Richard Smith // A Block literal expression may be used as the initialization value for 708180f47959a066795cc0f409433023af448bb0328Richard Smith // Block variables at global or local static scope. 709180f47959a066795cc0f409433023af448bb0328Richard Smith case Expr::BlockExprClass: 710180f47959a066795cc0f409433023af448bb0328Richard Smith return !cast<BlockExpr>(E)->getBlockDecl()->hasCaptures(); 711180f47959a066795cc0f409433023af448bb0328Richard Smith } 71242c8f87eb60958170c46767273bf93e6c96125bfJohn McCall} 71342c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 7149a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith/// Check that this reference or pointer core constant expression is a valid 7159a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith/// value for a constant expression. Type T should be either LValue or CCValue. 7169a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smithtemplate<typename T> 717f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithstatic bool CheckLValueConstantExpression(EvalInfo &Info, const Expr *E, 718c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith const T &LVal, APValue &Value, 719c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith CheckConstantExpressionKind CCEK) { 720c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith APValue::LValueBase Base = LVal.getLValueBase(); 721c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith const SubobjectDesignator &Designator = LVal.getLValueDesignator(); 722c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith 723c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith if (!IsGlobalLValue(Base)) { 724c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith if (Info.getLangOpts().CPlusPlus0x) { 725c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith const ValueDecl *VD = Base.dyn_cast<const ValueDecl*>(); 726c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith Info.Diag(E->getExprLoc(), diag::note_constexpr_non_global, 1) 727c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith << E->isGLValue() << !Designator.Entries.empty() 728c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith << !!VD << CCEK << VD; 729c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith if (VD) 730c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith Info.Note(VD->getLocation(), diag::note_declared_at); 731c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith else 732c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith Info.Note(Base.dyn_cast<const Expr*>()->getExprLoc(), 733c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith diag::note_constexpr_temporary_here); 734c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith } else { 7357098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.Diag(E->getExprLoc()); 736c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith } 73769c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith return false; 738f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 73969c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith 7409a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith // A constant expression must refer to an object or be a null pointer. 741e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (Designator.Invalid || 7429a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith (!LVal.getLValueBase() && !Designator.Entries.empty())) { 743c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith // FIXME: This is not a core constant expression. We should have already 744c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith // produced a CCE diagnostic. 7459a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith Value = APValue(LVal.getLValueBase(), LVal.getLValueOffset(), 7469a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith APValue::NoLValuePath()); 7479a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith return true; 7489a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith } 7499a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith 750c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith // Does this refer one past the end of some object? 751c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith // This is technically not an address constant expression nor a reference 752c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith // constant expression, but we allow it for address constant expressions. 753c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith if (E->isGLValue() && Base && Designator.OnePastTheEnd) { 754c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith const ValueDecl *VD = Base.dyn_cast<const ValueDecl*>(); 755c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith Info.Diag(E->getExprLoc(), diag::note_constexpr_past_end, 1) 756c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith << !Designator.Entries.empty() << !!VD << VD; 757c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith if (VD) 758c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith Info.Note(VD->getLocation(), diag::note_declared_at); 759c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith else 760c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith Info.Note(Base.dyn_cast<const Expr*>()->getExprLoc(), 761c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith diag::note_constexpr_temporary_here); 762c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return false; 763c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith } 764c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith 7659a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith Value = APValue(LVal.getLValueBase(), LVal.getLValueOffset(), 766e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Designator.Entries, Designator.OnePastTheEnd); 76769c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith return true; 76847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith} 76947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith 770eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith/// Check that this core constant expression is of literal type, and if not, 771eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith/// produce an appropriate diagnostic. 772eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smithstatic bool CheckLiteralType(EvalInfo &Info, const Expr *E) { 773eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith if (!E->isRValue() || E->getType()->isLiteralType()) 774eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith return true; 775eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith 776eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith // Prvalue constant expressions must be of literal types. 777eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith if (Info.getLangOpts().CPlusPlus0x) 778eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith Info.Diag(E->getExprLoc(), diag::note_constexpr_nonliteral) 779eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith << E->getType(); 780eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith else 781eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith Info.Diag(E->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 782eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith return false; 783eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith} 784eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith 7859a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith/// Check that this core constant expression value is a valid value for a 7869a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith/// constant expression, and if it is, produce the corresponding constant value. 787eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith/// If not, report an appropriate diagnostic. Does not check that the expression 788eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith/// is of literal type. 789f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithstatic bool CheckConstantExpression(EvalInfo &Info, const Expr *E, 790c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith const CCValue &CCValue, APValue &Value, 791c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith CheckConstantExpressionKind CCEK 792c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith = CCEK_Constant) { 7939a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith if (!CCValue.isLValue()) { 7949a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith Value = CCValue; 7959a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith return true; 7969a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith } 797c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return CheckLValueConstantExpression(Info, E, CCValue, Value, CCEK); 7989a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith} 7999a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith 8009e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smithconst ValueDecl *GetLValueBaseDecl(const LValue &LVal) { 8011bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith return LVal.Base.dyn_cast<const ValueDecl*>(); 8029e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith} 8039e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith 8049e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smithstatic bool IsLiteralLValue(const LValue &Value) { 8051bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith return Value.Base.dyn_cast<const Expr*>() && !Value.Frame; 8069e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith} 8079e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith 80865ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smithstatic bool IsWeakLValue(const LValue &Value) { 80965ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith const ValueDecl *Decl = GetLValueBaseDecl(Value); 8100dd7a25e8d679de1dc0ce788222d6dee0e879885Lang Hames return Decl && Decl->isWeak(); 81165ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith} 81265ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith 813e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstatic bool EvalPointerValueAsBool(const CCValue &Value, bool &Result) { 8143554283157190e67918fad4221a5e6faf9317362John McCall // A null base expression indicates a null pointer. These are always 8153554283157190e67918fad4221a5e6faf9317362John McCall // evaluatable, and they are false unless the offset is zero. 816e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!Value.getLValueBase()) { 817e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Result = !Value.getLValueOffset().isZero(); 8183554283157190e67918fad4221a5e6faf9317362John McCall return true; 8193554283157190e67918fad4221a5e6faf9317362John McCall } 8203554283157190e67918fad4221a5e6faf9317362John McCall 82142c8f87eb60958170c46767273bf93e6c96125bfJohn McCall // Require the base expression to be a global l-value. 82247a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith // FIXME: C++11 requires such conversions. Remove this check. 823e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!IsGlobalLValue(Value.getLValueBase())) return false; 82442c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 825e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // We have a non-null base. These are generally known to be true, but if it's 826e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // a weak declaration it can be null at runtime. 8273554283157190e67918fad4221a5e6faf9317362John McCall Result = true; 828e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const ValueDecl *Decl = Value.getLValueBase().dyn_cast<const ValueDecl*>(); 8290dd7a25e8d679de1dc0ce788222d6dee0e879885Lang Hames return !Decl || !Decl->isWeak(); 8305bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman} 8315bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman 83247a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smithstatic bool HandleConversionToBool(const CCValue &Val, bool &Result) { 833c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith switch (Val.getKind()) { 834c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case APValue::Uninitialized: 835c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return false; 836c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case APValue::Int: 837c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith Result = Val.getInt().getBoolValue(); 83841bf4f38348561a0f12c10d34f1673cd19a6eb04Richard Smith return true; 839c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case APValue::Float: 840c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith Result = !Val.getFloat().isZero(); 841a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman return true; 842c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case APValue::ComplexInt: 843c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith Result = Val.getComplexIntReal().getBoolValue() || 844c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith Val.getComplexIntImag().getBoolValue(); 845c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return true; 846c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case APValue::ComplexFloat: 847c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith Result = !Val.getComplexFloatReal().isZero() || 848c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith !Val.getComplexFloatImag().isZero(); 849436c8898cd1c93c5bacd3fcc4ac586bc5cd77062Richard Smith return true; 850e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case APValue::LValue: 851e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return EvalPointerValueAsBool(Val, Result); 852e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case APValue::MemberPointer: 853e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Result = Val.getMemberPointerDecl(); 854e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 855c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case APValue::Vector: 856cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith case APValue::Array: 857180f47959a066795cc0f409433023af448bb0328Richard Smith case APValue::Struct: 858180f47959a066795cc0f409433023af448bb0328Richard Smith case APValue::Union: 859c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return false; 8604efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 8614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 862c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith llvm_unreachable("unknown APValue kind"); 863c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith} 864c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 865c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smithstatic bool EvaluateAsBooleanCondition(const Expr *E, bool &Result, 866c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith EvalInfo &Info) { 867c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith assert(E->isRValue() && "missing lvalue-to-rvalue conv in bool condition"); 86847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue Val; 869c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!Evaluate(Val, Info, E)) 870c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return false; 871c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return HandleConversionToBool(Val, Result); 8724efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 8734efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 874c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithtemplate<typename T> 875c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithstatic bool HandleOverflow(EvalInfo &Info, const Expr *E, 876c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith const T &SrcValue, QualType DestType) { 877c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith llvm::SmallVector<char, 32> Buffer; 878c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith SrcValue.toString(Buffer); 879c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith Info.Diag(E->getExprLoc(), diag::note_constexpr_overflow) 880c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith << StringRef(Buffer.data(), Buffer.size()) << DestType; 881c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return false; 882c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith} 883c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith 884c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithstatic bool HandleFloatToIntCast(EvalInfo &Info, const Expr *E, 885c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith QualType SrcType, const APFloat &Value, 886c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith QualType DestType, APSInt &Result) { 887c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith unsigned DestWidth = Info.Ctx.getIntWidth(DestType); 888a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // Determine whether we are converting to unsigned or signed. 889575a1c9dc8dc5b4977194993e289f9eda7295c39Douglas Gregor bool DestSigned = DestType->isSignedIntegerOrEnumerationType(); 8901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 891c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith Result = APSInt(DestWidth, !DestSigned); 892a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar bool ignored; 893c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith if (Value.convertToInteger(Result, llvm::APFloat::rmTowardZero, &ignored) 894c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith & APFloat::opInvalidOp) 895c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return HandleOverflow(Info, E, Value, DestType); 896c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return true; 897a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 898a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 899c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithstatic bool HandleFloatToFloatCast(EvalInfo &Info, const Expr *E, 900c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith QualType SrcType, QualType DestType, 901c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith APFloat &Result) { 902c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith APFloat Value = Result; 903a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar bool ignored; 904c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith if (Result.convert(Info.Ctx.getFloatTypeSemantics(DestType), 905c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith APFloat::rmNearestTiesToEven, &ignored) 906c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith & APFloat::opOverflow) 907c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return HandleOverflow(Info, E, Value, DestType); 908c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return true; 909a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 910a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 9111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APSInt HandleIntToIntCast(QualType DestType, QualType SrcType, 9124ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad APSInt &Value, const ASTContext &Ctx) { 913a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar unsigned DestWidth = Ctx.getIntWidth(DestType); 914a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APSInt Result = Value; 915a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // Figure out if this is a truncate, extend or noop cast. 916a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // If the input is signed, do a sign extend, noop, or truncate. 9179f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad Result = Result.extOrTrunc(DestWidth); 918575a1c9dc8dc5b4977194993e289f9eda7295c39Douglas Gregor Result.setIsUnsigned(DestType->isUnsignedIntegerOrEnumerationType()); 919a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return Result; 920a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 921a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 922c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithstatic bool HandleIntToFloatCast(EvalInfo &Info, const Expr *E, 923c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith QualType SrcType, const APSInt &Value, 924c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith QualType DestType, APFloat &Result) { 925c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith Result = APFloat(Info.Ctx.getFloatTypeSemantics(DestType), 1); 926c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith if (Result.convertFromAPInt(Value, Value.isSigned(), 927c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith APFloat::rmNearestTiesToEven) 928c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith & APFloat::opOverflow) 929c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return HandleOverflow(Info, E, Value, DestType); 930c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return true; 931a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 932a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 933e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedmanstatic bool EvalAndBitcastToAPInt(EvalInfo &Info, const Expr *E, 934e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman llvm::APInt &Res) { 935e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman CCValue SVal; 936e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman if (!Evaluate(SVal, Info, E)) 937e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman return false; 938e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman if (SVal.isInt()) { 939e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman Res = SVal.getInt(); 940e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman return true; 941e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman } 942e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman if (SVal.isFloat()) { 943e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman Res = SVal.getFloat().bitcastToAPInt(); 944e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman return true; 945e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman } 946e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman if (SVal.isVector()) { 947e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman QualType VecTy = E->getType(); 948e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman unsigned VecSize = Info.Ctx.getTypeSize(VecTy); 949e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman QualType EltTy = VecTy->castAs<VectorType>()->getElementType(); 950e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman unsigned EltSize = Info.Ctx.getTypeSize(EltTy); 951e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman bool BigEndian = Info.Ctx.getTargetInfo().isBigEndian(); 952e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman Res = llvm::APInt::getNullValue(VecSize); 953e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman for (unsigned i = 0; i < SVal.getVectorLength(); i++) { 954e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman APValue &Elt = SVal.getVectorElt(i); 955e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman llvm::APInt EltAsInt; 956e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman if (Elt.isInt()) { 957e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman EltAsInt = Elt.getInt(); 958e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman } else if (Elt.isFloat()) { 959e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman EltAsInt = Elt.getFloat().bitcastToAPInt(); 960e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman } else { 961e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman // Don't try to handle vectors of anything other than int or float 962e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman // (not sure if it's possible to hit this case). 963e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman Info.Diag(E->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 964e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman return false; 965e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman } 966e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman unsigned BaseEltSize = EltAsInt.getBitWidth(); 967e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman if (BigEndian) 968e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman Res |= EltAsInt.zextOrTrunc(VecSize).rotr(i*EltSize+BaseEltSize); 969e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman else 970e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman Res |= EltAsInt.zextOrTrunc(VecSize).rotl(i*EltSize); 971e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman } 972e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman return true; 973e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman } 974e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman // Give up if the input isn't an int, float, or vector. For example, we 975e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman // reject "(v4i16)(intptr_t)&a". 976e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman Info.Diag(E->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 977e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman return false; 978e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman} 979e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman 980e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstatic bool FindMostDerivedObject(EvalInfo &Info, const LValue &LVal, 981e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *&MostDerivedType, 982e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith unsigned &MostDerivedPathLength, 983e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool &MostDerivedIsArrayElement) { 984e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const SubobjectDesignator &D = LVal.Designator; 985e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (D.Invalid || !LVal.Base) 986180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 987180f47959a066795cc0f409433023af448bb0328Richard Smith 988e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const Type *T = getType(LVal.Base).getTypePtr(); 989180f47959a066795cc0f409433023af448bb0328Richard Smith 990180f47959a066795cc0f409433023af448bb0328Richard Smith // Find path prefix which leads to the most-derived subobject. 991180f47959a066795cc0f409433023af448bb0328Richard Smith MostDerivedType = T->getAsCXXRecordDecl(); 992e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MostDerivedPathLength = 0; 993e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MostDerivedIsArrayElement = false; 994180f47959a066795cc0f409433023af448bb0328Richard Smith 995180f47959a066795cc0f409433023af448bb0328Richard Smith for (unsigned I = 0, N = D.Entries.size(); I != N; ++I) { 996180f47959a066795cc0f409433023af448bb0328Richard Smith bool IsArray = T && T->isArrayType(); 997180f47959a066795cc0f409433023af448bb0328Richard Smith if (IsArray) 998180f47959a066795cc0f409433023af448bb0328Richard Smith T = T->getBaseElementTypeUnsafe(); 999180f47959a066795cc0f409433023af448bb0328Richard Smith else if (const FieldDecl *FD = getAsField(D.Entries[I])) 1000180f47959a066795cc0f409433023af448bb0328Richard Smith T = FD->getType().getTypePtr(); 1001180f47959a066795cc0f409433023af448bb0328Richard Smith else 1002180f47959a066795cc0f409433023af448bb0328Richard Smith T = 0; 1003180f47959a066795cc0f409433023af448bb0328Richard Smith 1004180f47959a066795cc0f409433023af448bb0328Richard Smith if (T) { 1005180f47959a066795cc0f409433023af448bb0328Richard Smith MostDerivedType = T->getAsCXXRecordDecl(); 1006180f47959a066795cc0f409433023af448bb0328Richard Smith MostDerivedPathLength = I + 1; 1007180f47959a066795cc0f409433023af448bb0328Richard Smith MostDerivedIsArrayElement = IsArray; 1008180f47959a066795cc0f409433023af448bb0328Richard Smith } 1009180f47959a066795cc0f409433023af448bb0328Richard Smith } 1010180f47959a066795cc0f409433023af448bb0328Richard Smith 1011180f47959a066795cc0f409433023af448bb0328Richard Smith // (B*)&d + 1 has no most-derived object. 1012180f47959a066795cc0f409433023af448bb0328Richard Smith if (D.OnePastTheEnd && MostDerivedPathLength != D.Entries.size()) 1013180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1014180f47959a066795cc0f409433023af448bb0328Richard Smith 1015e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return MostDerivedType != 0; 1016e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 1017e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1018e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstatic void TruncateLValueBasePath(EvalInfo &Info, LValue &Result, 1019e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const RecordDecl *TruncatedType, 1020e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith unsigned TruncatedElements, 1021e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool IsArrayElement) { 1022e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith SubobjectDesignator &D = Result.Designator; 1023e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const RecordDecl *RD = TruncatedType; 1024e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith for (unsigned I = TruncatedElements, N = D.Entries.size(); I != N; ++I) { 1025180f47959a066795cc0f409433023af448bb0328Richard Smith const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); 1026180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXRecordDecl *Base = getAsBaseClass(D.Entries[I]); 1027e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (isVirtualBaseClass(D.Entries[I])) 1028180f47959a066795cc0f409433023af448bb0328Richard Smith Result.Offset -= Layout.getVBaseClassOffset(Base); 1029e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith else 1030180f47959a066795cc0f409433023af448bb0328Richard Smith Result.Offset -= Layout.getBaseClassOffset(Base); 1031180f47959a066795cc0f409433023af448bb0328Richard Smith RD = Base; 1032180f47959a066795cc0f409433023af448bb0328Richard Smith } 1033e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith D.Entries.resize(TruncatedElements); 1034e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith D.ArrayElement = IsArrayElement; 1035e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 1036e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1037e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// If the given LValue refers to a base subobject of some object, find the most 1038e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// derived object and the corresponding complete record type. This is necessary 1039e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// in order to find the offset of a virtual base class. 1040e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstatic bool ExtractMostDerivedObject(EvalInfo &Info, LValue &Result, 1041e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *&MostDerivedType) { 1042e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith unsigned MostDerivedPathLength; 1043e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool MostDerivedIsArrayElement; 1044e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!FindMostDerivedObject(Info, Result, MostDerivedType, 1045e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MostDerivedPathLength, MostDerivedIsArrayElement)) 1046e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 1047e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1048e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Remove the trailing base class path entries and their offsets. 1049e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith TruncateLValueBasePath(Info, Result, MostDerivedType, MostDerivedPathLength, 1050e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MostDerivedIsArrayElement); 1051180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 1052180f47959a066795cc0f409433023af448bb0328Richard Smith} 1053180f47959a066795cc0f409433023af448bb0328Richard Smith 1054180f47959a066795cc0f409433023af448bb0328Richard Smithstatic void HandleLValueDirectBase(EvalInfo &Info, LValue &Obj, 1055180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXRecordDecl *Derived, 1056180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXRecordDecl *Base, 1057180f47959a066795cc0f409433023af448bb0328Richard Smith const ASTRecordLayout *RL = 0) { 1058180f47959a066795cc0f409433023af448bb0328Richard Smith if (!RL) RL = &Info.Ctx.getASTRecordLayout(Derived); 1059180f47959a066795cc0f409433023af448bb0328Richard Smith Obj.getLValueOffset() += RL->getBaseClassOffset(Base); 1060180f47959a066795cc0f409433023af448bb0328Richard Smith Obj.Designator.addDecl(Base, /*Virtual*/ false); 1061180f47959a066795cc0f409433023af448bb0328Richard Smith} 1062180f47959a066795cc0f409433023af448bb0328Richard Smith 1063180f47959a066795cc0f409433023af448bb0328Richard Smithstatic bool HandleLValueBase(EvalInfo &Info, LValue &Obj, 1064180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXRecordDecl *DerivedDecl, 1065180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXBaseSpecifier *Base) { 1066180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXRecordDecl *BaseDecl = Base->getType()->getAsCXXRecordDecl(); 1067180f47959a066795cc0f409433023af448bb0328Richard Smith 1068180f47959a066795cc0f409433023af448bb0328Richard Smith if (!Base->isVirtual()) { 1069180f47959a066795cc0f409433023af448bb0328Richard Smith HandleLValueDirectBase(Info, Obj, DerivedDecl, BaseDecl); 1070180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 1071180f47959a066795cc0f409433023af448bb0328Richard Smith } 1072180f47959a066795cc0f409433023af448bb0328Richard Smith 1073180f47959a066795cc0f409433023af448bb0328Richard Smith // Extract most-derived object and corresponding type. 1074180f47959a066795cc0f409433023af448bb0328Richard Smith if (!ExtractMostDerivedObject(Info, Obj, DerivedDecl)) 1075180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1076180f47959a066795cc0f409433023af448bb0328Richard Smith 1077180f47959a066795cc0f409433023af448bb0328Richard Smith const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(DerivedDecl); 1078180f47959a066795cc0f409433023af448bb0328Richard Smith Obj.getLValueOffset() += Layout.getVBaseClassOffset(BaseDecl); 1079180f47959a066795cc0f409433023af448bb0328Richard Smith Obj.Designator.addDecl(BaseDecl, /*Virtual*/ true); 1080180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 1081180f47959a066795cc0f409433023af448bb0328Richard Smith} 1082180f47959a066795cc0f409433023af448bb0328Richard Smith 1083180f47959a066795cc0f409433023af448bb0328Richard Smith/// Update LVal to refer to the given field, which must be a member of the type 1084180f47959a066795cc0f409433023af448bb0328Richard Smith/// currently described by LVal. 1085180f47959a066795cc0f409433023af448bb0328Richard Smithstatic void HandleLValueMember(EvalInfo &Info, LValue &LVal, 1086180f47959a066795cc0f409433023af448bb0328Richard Smith const FieldDecl *FD, 1087180f47959a066795cc0f409433023af448bb0328Richard Smith const ASTRecordLayout *RL = 0) { 1088180f47959a066795cc0f409433023af448bb0328Richard Smith if (!RL) 1089180f47959a066795cc0f409433023af448bb0328Richard Smith RL = &Info.Ctx.getASTRecordLayout(FD->getParent()); 1090180f47959a066795cc0f409433023af448bb0328Richard Smith 1091180f47959a066795cc0f409433023af448bb0328Richard Smith unsigned I = FD->getFieldIndex(); 1092180f47959a066795cc0f409433023af448bb0328Richard Smith LVal.Offset += Info.Ctx.toCharUnitsFromBits(RL->getFieldOffset(I)); 1093180f47959a066795cc0f409433023af448bb0328Richard Smith LVal.Designator.addDecl(FD); 1094180f47959a066795cc0f409433023af448bb0328Richard Smith} 1095180f47959a066795cc0f409433023af448bb0328Richard Smith 1096180f47959a066795cc0f409433023af448bb0328Richard Smith/// Get the size of the given type in char units. 1097180f47959a066795cc0f409433023af448bb0328Richard Smithstatic bool HandleSizeof(EvalInfo &Info, QualType Type, CharUnits &Size) { 1098180f47959a066795cc0f409433023af448bb0328Richard Smith // sizeof(void), __alignof__(void), sizeof(function) = 1 as a gcc 1099180f47959a066795cc0f409433023af448bb0328Richard Smith // extension. 1100180f47959a066795cc0f409433023af448bb0328Richard Smith if (Type->isVoidType() || Type->isFunctionType()) { 1101180f47959a066795cc0f409433023af448bb0328Richard Smith Size = CharUnits::One(); 1102180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 1103180f47959a066795cc0f409433023af448bb0328Richard Smith } 1104180f47959a066795cc0f409433023af448bb0328Richard Smith 1105180f47959a066795cc0f409433023af448bb0328Richard Smith if (!Type->isConstantSizeType()) { 1106180f47959a066795cc0f409433023af448bb0328Richard Smith // sizeof(vla) is not a constantexpr: C99 6.5.3.4p2. 1107180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1108180f47959a066795cc0f409433023af448bb0328Richard Smith } 1109180f47959a066795cc0f409433023af448bb0328Richard Smith 1110180f47959a066795cc0f409433023af448bb0328Richard Smith Size = Info.Ctx.getTypeSizeInChars(Type); 1111180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 1112180f47959a066795cc0f409433023af448bb0328Richard Smith} 1113180f47959a066795cc0f409433023af448bb0328Richard Smith 1114180f47959a066795cc0f409433023af448bb0328Richard Smith/// Update a pointer value to model pointer arithmetic. 1115180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param Info - Information about the ongoing evaluation. 1116180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param LVal - The pointer value to be updated. 1117180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param EltTy - The pointee type represented by LVal. 1118180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param Adjustment - The adjustment, in objects of type EltTy, to add. 1119180f47959a066795cc0f409433023af448bb0328Richard Smithstatic bool HandleLValueArrayAdjustment(EvalInfo &Info, LValue &LVal, 1120180f47959a066795cc0f409433023af448bb0328Richard Smith QualType EltTy, int64_t Adjustment) { 1121180f47959a066795cc0f409433023af448bb0328Richard Smith CharUnits SizeOfPointee; 1122180f47959a066795cc0f409433023af448bb0328Richard Smith if (!HandleSizeof(Info, EltTy, SizeOfPointee)) 1123180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1124180f47959a066795cc0f409433023af448bb0328Richard Smith 1125180f47959a066795cc0f409433023af448bb0328Richard Smith // Compute the new offset in the appropriate width. 1126180f47959a066795cc0f409433023af448bb0328Richard Smith LVal.Offset += Adjustment * SizeOfPointee; 1127180f47959a066795cc0f409433023af448bb0328Richard Smith LVal.Designator.adjustIndex(Adjustment); 1128180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 1129180f47959a066795cc0f409433023af448bb0328Richard Smith} 1130180f47959a066795cc0f409433023af448bb0328Richard Smith 113103f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith/// Try to evaluate the initializer for a variable declaration. 1132f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithstatic bool EvaluateVarDeclInit(EvalInfo &Info, const Expr *E, 1133f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith const VarDecl *VD, 1134177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith CallStackFrame *Frame, CCValue &Result) { 1135d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith // If this is a parameter to an active constexpr function call, perform 1136d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith // argument substitution. 1137d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith if (const ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(VD)) { 1138f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!Frame || !Frame->Arguments) { 1139dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(E->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 1140177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith return false; 1141f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 1142177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith Result = Frame->Arguments[PVD->getFunctionScopeIndex()]; 1143177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith return true; 1144d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith } 114503f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith 1146099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith // Dig out the initializer, and use the declaration which it's attached to. 1147099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith const Expr *Init = VD->getAnyInitializer(VD); 1148099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith if (!Init || Init->isValueDependent()) { 1149099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith Info.Diag(E->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 1150099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith return false; 1151099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith } 1152099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith 1153180f47959a066795cc0f409433023af448bb0328Richard Smith // If we're currently evaluating the initializer of this declaration, use that 1154180f47959a066795cc0f409433023af448bb0328Richard Smith // in-flight value. 1155180f47959a066795cc0f409433023af448bb0328Richard Smith if (Info.EvaluatingDecl == VD) { 1156180f47959a066795cc0f409433023af448bb0328Richard Smith Result = CCValue(*Info.EvaluatingDeclValue, CCValue::GlobalValue()); 1157180f47959a066795cc0f409433023af448bb0328Richard Smith return !Result.isUninit(); 1158180f47959a066795cc0f409433023af448bb0328Richard Smith } 1159180f47959a066795cc0f409433023af448bb0328Richard Smith 116065ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith // Never evaluate the initializer of a weak variable. We can't be sure that 116165ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith // this is the definition which will be used. 1162f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (VD->isWeak()) { 1163dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(E->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 116465ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith return false; 1165f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 116665ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith 1167099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith // Check that we can fold the initializer. In C++, we will have already done 1168099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith // this in the cases where it matters for conformance. 1169099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith llvm::SmallVector<PartialDiagnosticAt, 8> Notes; 1170099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith if (!VD->evaluateValue(Notes)) { 1171099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith Info.Diag(E->getExprLoc(), diag::note_constexpr_var_init_non_constant, 1172099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith Notes.size() + 1) << VD; 1173099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith Info.Note(VD->getLocation(), diag::note_declared_at); 1174099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith Info.addNotes(Notes); 117547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith return false; 1176099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith } else if (!VD->checkInitIsICE()) { 1177099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith Info.CCEDiag(E->getExprLoc(), diag::note_constexpr_var_init_non_constant, 1178099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith Notes.size() + 1) << VD; 1179099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith Info.Note(VD->getLocation(), diag::note_declared_at); 1180099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith Info.addNotes(Notes); 1181f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 118203f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith 1183099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith Result = CCValue(*VD->getEvaluatedValue(), CCValue::GlobalValue()); 118447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith return true; 118503f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith} 118603f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith 1187c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smithstatic bool IsConstNonVolatile(QualType T) { 118803f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith Qualifiers Quals = T.getQualifiers(); 118903f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith return Quals.hasConst() && !Quals.hasVolatile(); 119003f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith} 119103f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith 119259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith/// Get the base index of the given base class within an APValue representing 119359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith/// the given derived class. 119459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithstatic unsigned getBaseIndex(const CXXRecordDecl *Derived, 119559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith const CXXRecordDecl *Base) { 119659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith Base = Base->getCanonicalDecl(); 119759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith unsigned Index = 0; 119859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith for (CXXRecordDecl::base_class_const_iterator I = Derived->bases_begin(), 119959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith E = Derived->bases_end(); I != E; ++I, ++Index) { 120059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith if (I->getType()->getAsCXXRecordDecl()->getCanonicalDecl() == Base) 120159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return Index; 120259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } 120359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 120459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith llvm_unreachable("base class missing from derived class's bases list"); 120559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 120659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 1207cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith/// Extract the designated sub-object of an rvalue. 1208f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithstatic bool ExtractSubobject(EvalInfo &Info, const Expr *E, 1209f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith CCValue &Obj, QualType ObjType, 1210cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith const SubobjectDesignator &Sub, QualType SubType) { 12117098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith if (Sub.Invalid) { 1212dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(E->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 1213cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return false; 1214f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 12157098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith if (Sub.OnePastTheEnd) { 12167098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.Diag(E->getExprLoc(), Info.getLangOpts().CPlusPlus0x ? 1217aa5d533427d803e52ee42b250ffd6645ef5ccb0fMatt Beaumont-Gay (unsigned)diag::note_constexpr_read_past_end : 1218aa5d533427d803e52ee42b250ffd6645ef5ccb0fMatt Beaumont-Gay (unsigned)diag::note_invalid_subexpr_in_const_expr); 12197098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith return false; 12207098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith } 1221f64699e8db3946e21b5f4a0421cbc58a3e439599Richard Smith if (Sub.Entries.empty()) 1222cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return true; 1223cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 1224cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith assert(!Obj.isLValue() && "extracting subobject of lvalue"); 1225cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith const APValue *O = &Obj; 1226180f47959a066795cc0f409433023af448bb0328Richard Smith // Walk the designator's path to find the subobject. 1227cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith for (unsigned I = 0, N = Sub.Entries.size(); I != N; ++I) { 1228cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith if (ObjType->isArrayType()) { 1229180f47959a066795cc0f409433023af448bb0328Richard Smith // Next subobject is an array element. 1230cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType(ObjType); 1231f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith assert(CAT && "vla in literal type?"); 1232cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith uint64_t Index = Sub.Entries[I].ArrayIndex; 1233f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (CAT->getSize().ule(Index)) { 12347098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith // Note, it should not be possible to form a pointer with a valid 12357098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith // designator which points more than one past the end of the array. 12367098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.Diag(E->getExprLoc(), Info.getLangOpts().CPlusPlus0x ? 1237aa5d533427d803e52ee42b250ffd6645ef5ccb0fMatt Beaumont-Gay (unsigned)diag::note_constexpr_read_past_end : 1238aa5d533427d803e52ee42b250ffd6645ef5ccb0fMatt Beaumont-Gay (unsigned)diag::note_invalid_subexpr_in_const_expr); 1239cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return false; 1240f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 1241cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith if (O->getArrayInitializedElts() > Index) 1242cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith O = &O->getArrayInitializedElt(Index); 1243cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith else 1244cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith O = &O->getArrayFiller(); 1245cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith ObjType = CAT->getElementType(); 1246180f47959a066795cc0f409433023af448bb0328Richard Smith } else if (const FieldDecl *Field = getAsField(Sub.Entries[I])) { 1247180f47959a066795cc0f409433023af448bb0328Richard Smith // Next subobject is a class, struct or union field. 1248180f47959a066795cc0f409433023af448bb0328Richard Smith RecordDecl *RD = ObjType->castAs<RecordType>()->getDecl(); 1249180f47959a066795cc0f409433023af448bb0328Richard Smith if (RD->isUnion()) { 1250180f47959a066795cc0f409433023af448bb0328Richard Smith const FieldDecl *UnionField = O->getUnionField(); 1251180f47959a066795cc0f409433023af448bb0328Richard Smith if (!UnionField || 1252f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith UnionField->getCanonicalDecl() != Field->getCanonicalDecl()) { 12537098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.Diag(E->getExprLoc(), 12547098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith diag::note_constexpr_read_inactive_union_member) 12557098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith << Field << !UnionField << UnionField; 1256180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1257f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 1258180f47959a066795cc0f409433023af448bb0328Richard Smith O = &O->getUnionValue(); 1259180f47959a066795cc0f409433023af448bb0328Richard Smith } else 1260180f47959a066795cc0f409433023af448bb0328Richard Smith O = &O->getStructField(Field->getFieldIndex()); 1261180f47959a066795cc0f409433023af448bb0328Richard Smith ObjType = Field->getType(); 12627098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith 12637098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith if (ObjType.isVolatileQualified()) { 12647098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith if (Info.getLangOpts().CPlusPlus) { 12657098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith // FIXME: Include a description of the path to the volatile subobject. 12667098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.Diag(E->getExprLoc(), diag::note_constexpr_ltor_volatile_obj, 1) 12677098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith << 2 << Field; 12687098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.Note(Field->getLocation(), diag::note_declared_at); 12697098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith } else { 12707098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.Diag(E->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 12717098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith } 12727098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith return false; 12737098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith } 1274cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith } else { 1275180f47959a066795cc0f409433023af448bb0328Richard Smith // Next subobject is a base class. 127659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith const CXXRecordDecl *Derived = ObjType->getAsCXXRecordDecl(); 127759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith const CXXRecordDecl *Base = getAsBaseClass(Sub.Entries[I]); 127859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith O = &O->getStructBase(getBaseIndex(Derived, Base)); 127959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith ObjType = Info.Ctx.getRecordType(Base); 1280cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith } 1281180f47959a066795cc0f409433023af448bb0328Richard Smith 1282f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (O->isUninit()) { 12837098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.Diag(E->getExprLoc(), diag::note_constexpr_read_uninit); 1284180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1285f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 1286cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith } 1287cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 1288cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith Obj = CCValue(*O, CCValue::GlobalValue()); 1289cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return true; 1290cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith} 1291cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 1292180f47959a066795cc0f409433023af448bb0328Richard Smith/// HandleLValueToRValueConversion - Perform an lvalue-to-rvalue conversion on 1293180f47959a066795cc0f409433023af448bb0328Richard Smith/// the given lvalue. This can also be used for 'lvalue-to-lvalue' conversions 1294180f47959a066795cc0f409433023af448bb0328Richard Smith/// for looking up the glvalue referred to by an entity of reference type. 1295180f47959a066795cc0f409433023af448bb0328Richard Smith/// 1296180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param Info - Information about the ongoing evaluation. 1297f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith/// \param Conv - The expression for which we are performing the conversion. 1298f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith/// Used for diagnostics. 1299180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param Type - The type we expect this conversion to produce. 1300180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param LVal - The glvalue on which we are attempting to perform this action. 1301180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param RVal - The produced value will be placed here. 1302f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithstatic bool HandleLValueToRValueConversion(EvalInfo &Info, const Expr *Conv, 1303f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith QualType Type, 1304cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith const LValue &LVal, CCValue &RVal) { 13057098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith // In C, an lvalue-to-rvalue conversion is never a constant expression. 13067098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith if (!Info.getLangOpts().CPlusPlus) 13077098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.CCEDiag(Conv->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 13087098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith 13091bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith const Expr *Base = LVal.Base.dyn_cast<const Expr*>(); 1310177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith CallStackFrame *Frame = LVal.Frame; 13117098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith SourceLocation Loc = Conv->getExprLoc(); 1312c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 1313f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!LVal.Base) { 1314f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // FIXME: Indirection through a null pointer deserves a specific diagnostic. 13157098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.Diag(Loc, diag::note_invalid_subexpr_in_const_expr); 13167098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith return false; 13177098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith } 13187098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith 13197098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith // C++11 DR1311: An lvalue-to-rvalue conversion on a volatile-qualified type 13207098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith // is not a constant expression (even if the object is non-volatile). We also 13217098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith // apply this rule to C++98, in order to conform to the expected 'volatile' 13227098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith // semantics. 13237098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith if (Type.isVolatileQualified()) { 13247098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith if (Info.getLangOpts().CPlusPlus) 13257098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.Diag(Loc, diag::note_constexpr_ltor_volatile_type) << Type; 13267098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith else 13277098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.Diag(Loc); 1328c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return false; 1329f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 1330c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 13311bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith if (const ValueDecl *D = LVal.Base.dyn_cast<const ValueDecl*>()) { 1332c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // In C++98, const, non-volatile integers initialized with ICEs are ICEs. 1333c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // In C++11, constexpr, non-volatile variables initialized with constant 1334d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith // expressions are constant expressions too. Inside constexpr functions, 1335d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith // parameters are constant expressions even if they're non-const. 1336c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // In C, such things can also be folded, although they are not ICEs. 1337c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith const VarDecl *VD = dyn_cast<VarDecl>(D); 1338f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!VD || VD->isInvalidDecl()) { 13397098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.Diag(Loc); 13400a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return false; 1341f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 1342f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 13437098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith // DR1313: If the object is volatile-qualified but the glvalue was not, 13447098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith // behavior is undefined so the result is not a constant expression. 13451bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith QualType VT = VD->getType(); 13467098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith if (VT.isVolatileQualified()) { 13477098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith if (Info.getLangOpts().CPlusPlus) { 13487098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.Diag(Loc, diag::note_constexpr_ltor_volatile_obj, 1) << 1 << VD; 13497098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.Note(VD->getLocation(), diag::note_declared_at); 13507098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith } else { 13517098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.Diag(Loc); 1352f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 13537098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith return false; 13547098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith } 13557098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith 13567098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith if (!isa<ParmVarDecl>(VD)) { 13577098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith if (VD->isConstexpr()) { 13587098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith // OK, we can read this variable. 13597098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith } else if (VT->isIntegralOrEnumerationType()) { 13607098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith if (!VT.isConstQualified()) { 13617098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith if (Info.getLangOpts().CPlusPlus) { 13627098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.Diag(Loc, diag::note_constexpr_ltor_non_const_int, 1) << VD; 13637098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.Note(VD->getLocation(), diag::note_declared_at); 13647098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith } else { 13657098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.Diag(Loc); 13667098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith } 13677098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith return false; 13687098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith } 13697098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith } else if (VT->isFloatingType() && VT.isConstQualified()) { 13707098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith // We support folding of const floating-point types, in order to make 13717098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith // static const data members of such types (supported as an extension) 13727098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith // more useful. 13737098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith if (Info.getLangOpts().CPlusPlus0x) { 13747098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.CCEDiag(Loc, diag::note_constexpr_ltor_non_constexpr, 1) << VD; 13757098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.Note(VD->getLocation(), diag::note_declared_at); 13767098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith } else { 13777098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.CCEDiag(Loc); 13787098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith } 13797098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith } else { 13807098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith // FIXME: Allow folding of values of any literal type in all languages. 13817098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith if (Info.getLangOpts().CPlusPlus0x) { 13827098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.Diag(Loc, diag::note_constexpr_ltor_non_constexpr, 1) << VD; 13837098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.Note(VD->getLocation(), diag::note_declared_at); 13847098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith } else { 13857098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.Diag(Loc); 13867098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith } 13870a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return false; 1388f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 13890a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith } 13907098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith 1391f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!EvaluateVarDeclInit(Info, Conv, VD, Frame, RVal)) 1392c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return false; 1393c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 139447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith if (isa<ParmVarDecl>(VD) || !VD->getAnyInitializer()->isLValue()) 1395f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return ExtractSubobject(Info, Conv, RVal, VT, LVal.Designator, Type); 1396c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 1397c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // The declaration was initialized by an lvalue, with no lvalue-to-rvalue 1398c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // conversion. This happens when the declaration and the lvalue should be 1399c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // considered synonymous, for instance when initializing an array of char 1400c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // from a string literal. Continue as if the initializer lvalue was the 1401c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // value we were originally given. 14020a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith assert(RVal.getLValueOffset().isZero() && 14030a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith "offset for lvalue init of non-reference"); 14041bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith Base = RVal.getLValueBase().get<const Expr*>(); 1405177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith Frame = RVal.getLValueFrame(); 1406c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith } 1407c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 14087098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith // Volatile temporary objects cannot be read in constant expressions. 14097098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith if (Base->getType().isVolatileQualified()) { 14107098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith if (Info.getLangOpts().CPlusPlus) { 14117098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.Diag(Loc, diag::note_constexpr_ltor_volatile_obj, 1) << 0; 14127098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.Note(Base->getExprLoc(), diag::note_constexpr_temporary_here); 14137098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith } else { 14147098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.Diag(Loc); 14157098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith } 14167098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith return false; 14177098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith } 14187098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith 14190a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith // FIXME: Support PredefinedExpr, ObjCEncodeExpr, MakeStringConstant 14200a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (const StringLiteral *S = dyn_cast<StringLiteral>(Base)) { 14210a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith const SubobjectDesignator &Designator = LVal.Designator; 1422f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (Designator.Invalid || Designator.Entries.size() != 1) { 1423dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(Conv->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 14240a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return false; 1425f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 14260a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith 14270a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith assert(Type->isIntegerType() && "string element not integer type"); 14289a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith uint64_t Index = Designator.Entries[0].ArrayIndex; 14297098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith const ConstantArrayType *CAT = 14307098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.Ctx.getAsConstantArrayType(S->getType()); 14317098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith if (Index >= CAT->getSize().getZExtValue()) { 14327098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith // Note, it should not be possible to form a pointer which points more 14337098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith // than one past the end of the array without producing a prior const expr 14347098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith // diagnostic. 14357098cbd601ad915aed22d4b5850da99359f25bf3Richard Smith Info.Diag(Loc, diag::note_constexpr_read_past_end); 14360a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return false; 1437f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 14380a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith APSInt Value(S->getCharByteWidth() * Info.Ctx.getCharWidth(), 14390a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Type->isUnsignedIntegerType()); 14400a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (Index < S->getLength()) 14410a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Value = S->getCodeUnit(Index); 14420a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith RVal = CCValue(Value); 14430a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return true; 14440a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith } 14450a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith 1446177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith if (Frame) { 1447cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // If this is a temporary expression with a nontrivial initializer, grab the 1448cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // value from the relevant stack frame. 1449177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith RVal = Frame->Temporaries[Base]; 1450cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith } else if (const CompoundLiteralExpr *CLE 1451cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith = dyn_cast<CompoundLiteralExpr>(Base)) { 1452cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // In C99, a CompoundLiteralExpr is an lvalue, and we defer evaluating the 1453cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // initializer until now for such expressions. Such an expression can't be 1454cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // an ICE in C, so this only matters for fold. 1455c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith assert(!Info.getLangOpts().CPlusPlus && "lvalue compound literal in c++?"); 1456cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith if (!Evaluate(RVal, Info, CLE->getInitializer())) 1457cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return false; 1458f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } else { 1459dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(Conv->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 1460cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return false; 1461f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 1462c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 1463f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return ExtractSubobject(Info, Conv, RVal, Base->getType(), LVal.Designator, 1464f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith Type); 1465c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith} 1466c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 146759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith/// Build an lvalue for the object argument of a member function call. 146859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithstatic bool EvaluateObjectArgument(EvalInfo &Info, const Expr *Object, 146959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith LValue &This) { 147059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith if (Object->getType()->isPointerType()) 147159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return EvaluatePointer(Object, This, Info); 147259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 147359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith if (Object->isGLValue()) 147459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return EvaluateLValue(Object, This, Info); 147559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 1476e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (Object->getType()->isLiteralType()) 1477e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return EvaluateTemporary(Object, This, Info); 1478e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1479e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 1480e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 1481e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1482e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// HandleMemberPointerAccess - Evaluate a member access operation and build an 1483e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// lvalue referring to the result. 1484e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// 1485e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// \param Info - Information about the ongoing evaluation. 1486e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// \param BO - The member pointer access operation. 1487e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// \param LV - Filled in with a reference to the resulting object. 1488e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// \param IncludeMember - Specifies whether the member itself is included in 1489e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// the resulting LValue subobject designator. This is not possible when 1490e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// creating a bound member function. 1491e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// \return The field or method declaration to which the member pointer refers, 1492e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// or 0 if evaluation fails. 1493e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstatic const ValueDecl *HandleMemberPointerAccess(EvalInfo &Info, 1494e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const BinaryOperator *BO, 1495e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LValue &LV, 1496e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool IncludeMember = true) { 1497e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith assert(BO->getOpcode() == BO_PtrMemD || BO->getOpcode() == BO_PtrMemI); 1498e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1499e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!EvaluateObjectArgument(Info, BO->getLHS(), LV)) 1500e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return 0; 1501e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1502e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MemberPtr MemPtr; 1503e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!EvaluateMemberPointer(BO->getRHS(), MemPtr, Info)) 1504e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return 0; 1505e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1506e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // C++11 [expr.mptr.oper]p6: If the second operand is the null pointer to 1507e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // member value, the behavior is undefined. 1508e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!MemPtr.getDecl()) 1509e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return 0; 1510e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1511e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (MemPtr.isDerivedMember()) { 1512e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // This is a member of some derived class. Truncate LV appropriately. 1513e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *MostDerivedType; 1514e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith unsigned MostDerivedPathLength; 1515e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool MostDerivedIsArrayElement; 1516e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!FindMostDerivedObject(Info, LV, MostDerivedType, MostDerivedPathLength, 1517e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MostDerivedIsArrayElement)) 1518e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return 0; 1519e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1520e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // The end of the derived-to-base path for the base object must match the 1521e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // derived-to-base path for the member pointer. 1522e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (MostDerivedPathLength + MemPtr.Path.size() > 1523e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LV.Designator.Entries.size()) 1524e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return 0; 1525e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith unsigned PathLengthToMember = 1526e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LV.Designator.Entries.size() - MemPtr.Path.size(); 1527e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith for (unsigned I = 0, N = MemPtr.Path.size(); I != N; ++I) { 1528e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *LVDecl = getAsBaseClass( 1529e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LV.Designator.Entries[PathLengthToMember + I]); 1530e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *MPDecl = MemPtr.Path[I]; 1531e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (LVDecl->getCanonicalDecl() != MPDecl->getCanonicalDecl()) 1532e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return 0; 1533e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 1534e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1535e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Truncate the lvalue to the appropriate derived class. 1536e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool ResultIsArray = false; 1537e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (PathLengthToMember == MostDerivedPathLength) 1538e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith ResultIsArray = MostDerivedIsArrayElement; 1539e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith TruncateLValueBasePath(Info, LV, MemPtr.getContainingRecord(), 1540e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith PathLengthToMember, ResultIsArray); 1541e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } else if (!MemPtr.Path.empty()) { 1542e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Extend the LValue path with the member pointer's path. 1543e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LV.Designator.Entries.reserve(LV.Designator.Entries.size() + 1544e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MemPtr.Path.size() + IncludeMember); 1545e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1546e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Walk down to the appropriate base class. 1547e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith QualType LVType = BO->getLHS()->getType(); 1548e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (const PointerType *PT = LVType->getAs<PointerType>()) 1549e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LVType = PT->getPointeeType(); 1550e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *RD = LVType->getAsCXXRecordDecl(); 1551e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith assert(RD && "member pointer access on non-class-type expression"); 1552e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // The first class in the path is that of the lvalue. 1553e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith for (unsigned I = 1, N = MemPtr.Path.size(); I != N; ++I) { 1554e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *Base = MemPtr.Path[N - I - 1]; 1555e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith HandleLValueDirectBase(Info, LV, RD, Base); 1556e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith RD = Base; 1557e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 1558e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Finally cast to the class containing the member. 1559e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith HandleLValueDirectBase(Info, LV, RD, MemPtr.getContainingRecord()); 1560e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 1561e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1562e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Add the member. Note that we cannot build bound member functions here. 1563e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (IncludeMember) { 1564e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // FIXME: Deal with IndirectFieldDecls. 1565e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const FieldDecl *FD = dyn_cast<FieldDecl>(MemPtr.getDecl()); 1566e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!FD) return 0; 1567e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith HandleLValueMember(Info, LV, FD); 1568e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 1569e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1570e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return MemPtr.getDecl(); 1571e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 1572e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1573e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// HandleBaseToDerivedCast - Apply the given base-to-derived cast operation on 1574e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// the provided lvalue, which currently refers to the base object. 1575e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstatic bool HandleBaseToDerivedCast(EvalInfo &Info, const CastExpr *E, 1576e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LValue &Result) { 1577e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *MostDerivedType; 1578e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith unsigned MostDerivedPathLength; 1579e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool MostDerivedIsArrayElement; 1580e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1581e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Check this cast doesn't take us outside the object. 1582e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!FindMostDerivedObject(Info, Result, MostDerivedType, 1583e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MostDerivedPathLength, 1584e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MostDerivedIsArrayElement)) 1585e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 1586e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith SubobjectDesignator &D = Result.Designator; 1587e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (MostDerivedPathLength + E->path_size() > D.Entries.size()) 1588e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 1589e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1590e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Check the type of the final cast. We don't need to check the path, 1591e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // since a cast can only be formed if the path is unique. 1592e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith unsigned NewEntriesSize = D.Entries.size() - E->path_size(); 1593e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool ResultIsArray = false; 1594e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith QualType TargetQT = E->getType(); 1595e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (const PointerType *PT = TargetQT->getAs<PointerType>()) 1596e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith TargetQT = PT->getPointeeType(); 1597e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *TargetType = TargetQT->getAsCXXRecordDecl(); 1598e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *FinalType; 1599e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (NewEntriesSize == MostDerivedPathLength) { 1600e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith ResultIsArray = MostDerivedIsArrayElement; 1601e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith FinalType = MostDerivedType; 1602e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } else 1603e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith FinalType = getAsBaseClass(D.Entries[NewEntriesSize - 1]); 1604e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (FinalType->getCanonicalDecl() != TargetType->getCanonicalDecl()) 1605e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 1606e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1607e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Truncate the lvalue to the appropriate derived class. 1608e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith TruncateLValueBasePath(Info, Result, TargetType, NewEntriesSize, 1609e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith ResultIsArray); 1610e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 161159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 161259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 1613c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stumpnamespace { 1614d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smithenum EvalStmtResult { 1615d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith /// Evaluation failed. 1616d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith ESR_Failed, 1617d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith /// Hit a 'return' statement. 1618d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith ESR_Returned, 1619d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith /// Evaluation succeeded. 1620d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith ESR_Succeeded 1621d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith}; 1622d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith} 1623d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 1624d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith// Evaluate a statement. 1625c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithstatic EvalStmtResult EvaluateStmt(APValue &Result, EvalInfo &Info, 1626d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith const Stmt *S) { 1627d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith switch (S->getStmtClass()) { 1628d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith default: 1629d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith return ESR_Failed; 1630d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 1631d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith case Stmt::NullStmtClass: 1632d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith case Stmt::DeclStmtClass: 1633d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith return ESR_Succeeded; 1634d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 1635c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith case Stmt::ReturnStmtClass: { 1636c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith CCValue CCResult; 1637c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith const Expr *RetExpr = cast<ReturnStmt>(S)->getRetValue(); 1638c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith if (!Evaluate(CCResult, Info, RetExpr) || 1639c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith !CheckConstantExpression(Info, RetExpr, CCResult, Result, 1640c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith CCEK_ReturnValue)) 1641c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return ESR_Failed; 1642c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return ESR_Returned; 1643c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith } 1644d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 1645d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith case Stmt::CompoundStmtClass: { 1646d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith const CompoundStmt *CS = cast<CompoundStmt>(S); 1647d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith for (CompoundStmt::const_body_iterator BI = CS->body_begin(), 1648d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith BE = CS->body_end(); BI != BE; ++BI) { 1649d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith EvalStmtResult ESR = EvaluateStmt(Result, Info, *BI); 1650d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith if (ESR != ESR_Succeeded) 1651d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith return ESR; 1652d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith } 1653d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith return ESR_Succeeded; 1654d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith } 1655d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith } 1656d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith} 1657d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 16586180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith/// CheckTrivialDefaultConstructor - Check whether a constructor is a trivial 16596180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith/// default constructor. If so, we'll fold it whether or not it's marked as 16606180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith/// constexpr. If it is marked as constexpr, we will never implicitly define it, 16616180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith/// so we need special handling. 16626180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithstatic bool CheckTrivialDefaultConstructor(EvalInfo &Info, SourceLocation Loc, 1663eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith const CXXConstructorDecl *CD, 1664eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith bool IsValueInitialization) { 16656180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith if (!CD->isTrivial() || !CD->isDefaultConstructor()) 16666180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith return false; 16676180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith 16686180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith if (!CD->isConstexpr()) { 16696180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith if (Info.getLangOpts().CPlusPlus0x) { 1670eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith // Value-initialization does not call a trivial default constructor, so 1671eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith // such a call is a core constant expression whether or not the 1672eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith // constructor is constexpr. 1673eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith if (!IsValueInitialization) { 1674eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith // FIXME: If DiagDecl is an implicitly-declared special member function, 1675eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith // we should be much more explicit about why it's not constexpr. 1676eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith Info.CCEDiag(Loc, diag::note_constexpr_invalid_function, 1) 1677eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith << /*IsConstexpr*/0 << /*IsConstructor*/1 << CD; 1678eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith Info.Note(CD->getLocation(), diag::note_declared_at); 1679eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith } 16806180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith } else { 16816180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith Info.CCEDiag(Loc, diag::note_invalid_subexpr_in_const_expr); 16826180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith } 16836180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith } 16846180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith return true; 16856180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith} 16866180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith 1687c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith/// CheckConstexprFunction - Check that a function can be called in a constant 1688c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith/// expression. 1689c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smithstatic bool CheckConstexprFunction(EvalInfo &Info, SourceLocation CallLoc, 1690c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith const FunctionDecl *Declaration, 1691c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith const FunctionDecl *Definition) { 1692c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith // Can we evaluate this function call? 1693c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith if (Definition && Definition->isConstexpr() && !Definition->isInvalidDecl()) 1694c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return true; 1695c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith 1696c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith if (Info.getLangOpts().CPlusPlus0x) { 1697c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith const FunctionDecl *DiagDecl = Definition ? Definition : Declaration; 1698099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith // FIXME: If DiagDecl is an implicitly-declared special member function, we 1699099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith // should be much more explicit about why it's not constexpr. 1700c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith Info.Diag(CallLoc, diag::note_constexpr_invalid_function, 1) 1701c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith << DiagDecl->isConstexpr() << isa<CXXConstructorDecl>(DiagDecl) 1702c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith << DiagDecl; 1703c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith Info.Note(DiagDecl->getLocation(), diag::note_declared_at); 1704c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith } else { 1705c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith Info.Diag(CallLoc, diag::note_invalid_subexpr_in_const_expr); 1706c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith } 1707c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return false; 1708c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith} 1709c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith 1710180f47959a066795cc0f409433023af448bb0328Richard Smithnamespace { 1711cd99b072e8b32075da6233cbf14ea58a5c82de4fRichard Smithtypedef SmallVector<CCValue, 8> ArgVector; 1712180f47959a066795cc0f409433023af448bb0328Richard Smith} 1713180f47959a066795cc0f409433023af448bb0328Richard Smith 1714180f47959a066795cc0f409433023af448bb0328Richard Smith/// EvaluateArgs - Evaluate the arguments to a function call. 1715180f47959a066795cc0f409433023af448bb0328Richard Smithstatic bool EvaluateArgs(ArrayRef<const Expr*> Args, ArgVector &ArgValues, 1716180f47959a066795cc0f409433023af448bb0328Richard Smith EvalInfo &Info) { 1717180f47959a066795cc0f409433023af448bb0328Richard Smith for (ArrayRef<const Expr*>::iterator I = Args.begin(), E = Args.end(); 1718180f47959a066795cc0f409433023af448bb0328Richard Smith I != E; ++I) 1719180f47959a066795cc0f409433023af448bb0328Richard Smith if (!Evaluate(ArgValues[I - Args.begin()], Info, *I)) 1720180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1721180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 1722180f47959a066795cc0f409433023af448bb0328Richard Smith} 1723180f47959a066795cc0f409433023af448bb0328Richard Smith 1724d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith/// Evaluate a function call. 172508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithstatic bool HandleFunctionCall(const Expr *CallExpr, const FunctionDecl *Callee, 172608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith const LValue *This, 1727f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith ArrayRef<const Expr*> Args, const Stmt *Body, 1728c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith EvalInfo &Info, APValue &Result) { 1729c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith if (!Info.CheckCallLimit(CallExpr->getExprLoc())) 1730d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith return false; 1731d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 1732180f47959a066795cc0f409433023af448bb0328Richard Smith ArgVector ArgValues(Args.size()); 1733180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateArgs(Args, ArgValues, Info)) 1734180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1735d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 173608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith CallStackFrame Frame(Info, CallExpr->getExprLoc(), Callee, This, 173708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith ArgValues.data()); 1738d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith return EvaluateStmt(Result, Info, Body) == ESR_Returned; 1739d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith} 1740d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 1741180f47959a066795cc0f409433023af448bb0328Richard Smith/// Evaluate a constructor call. 1742f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithstatic bool HandleConstructorCall(const Expr *CallExpr, const LValue &This, 174359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith ArrayRef<const Expr*> Args, 1744180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXConstructorDecl *Definition, 1745eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith EvalInfo &Info, APValue &Result) { 1746c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith if (!Info.CheckCallLimit(CallExpr->getExprLoc())) 1747180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1748180f47959a066795cc0f409433023af448bb0328Richard Smith 1749180f47959a066795cc0f409433023af448bb0328Richard Smith ArgVector ArgValues(Args.size()); 1750180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateArgs(Args, ArgValues, Info)) 1751180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1752180f47959a066795cc0f409433023af448bb0328Richard Smith 175308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith CallStackFrame Frame(Info, CallExpr->getExprLoc(), Definition, 175408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith &This, ArgValues.data()); 1755180f47959a066795cc0f409433023af448bb0328Richard Smith 1756180f47959a066795cc0f409433023af448bb0328Richard Smith // If it's a delegating constructor, just delegate. 1757180f47959a066795cc0f409433023af448bb0328Richard Smith if (Definition->isDelegatingConstructor()) { 1758180f47959a066795cc0f409433023af448bb0328Richard Smith CXXConstructorDecl::init_const_iterator I = Definition->init_begin(); 1759180f47959a066795cc0f409433023af448bb0328Richard Smith return EvaluateConstantExpression(Result, Info, This, (*I)->getInit()); 1760180f47959a066795cc0f409433023af448bb0328Richard Smith } 1761180f47959a066795cc0f409433023af448bb0328Richard Smith 1762180f47959a066795cc0f409433023af448bb0328Richard Smith // Reserve space for the struct members. 1763180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXRecordDecl *RD = Definition->getParent(); 1764eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith if (!RD->isUnion() && Result.isUninit()) 1765180f47959a066795cc0f409433023af448bb0328Richard Smith Result = APValue(APValue::UninitStruct(), RD->getNumBases(), 1766180f47959a066795cc0f409433023af448bb0328Richard Smith std::distance(RD->field_begin(), RD->field_end())); 1767180f47959a066795cc0f409433023af448bb0328Richard Smith 1768180f47959a066795cc0f409433023af448bb0328Richard Smith const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); 1769180f47959a066795cc0f409433023af448bb0328Richard Smith 1770180f47959a066795cc0f409433023af448bb0328Richard Smith unsigned BasesSeen = 0; 1771180f47959a066795cc0f409433023af448bb0328Richard Smith#ifndef NDEBUG 1772180f47959a066795cc0f409433023af448bb0328Richard Smith CXXRecordDecl::base_class_const_iterator BaseIt = RD->bases_begin(); 1773180f47959a066795cc0f409433023af448bb0328Richard Smith#endif 1774180f47959a066795cc0f409433023af448bb0328Richard Smith for (CXXConstructorDecl::init_const_iterator I = Definition->init_begin(), 1775180f47959a066795cc0f409433023af448bb0328Richard Smith E = Definition->init_end(); I != E; ++I) { 1776180f47959a066795cc0f409433023af448bb0328Richard Smith if ((*I)->isBaseInitializer()) { 1777180f47959a066795cc0f409433023af448bb0328Richard Smith QualType BaseType((*I)->getBaseClass(), 0); 1778180f47959a066795cc0f409433023af448bb0328Richard Smith#ifndef NDEBUG 1779180f47959a066795cc0f409433023af448bb0328Richard Smith // Non-virtual base classes are initialized in the order in the class 1780180f47959a066795cc0f409433023af448bb0328Richard Smith // definition. We cannot have a virtual base class for a literal type. 1781180f47959a066795cc0f409433023af448bb0328Richard Smith assert(!BaseIt->isVirtual() && "virtual base for literal type"); 1782180f47959a066795cc0f409433023af448bb0328Richard Smith assert(Info.Ctx.hasSameType(BaseIt->getType(), BaseType) && 1783180f47959a066795cc0f409433023af448bb0328Richard Smith "base class initializers not in expected order"); 1784180f47959a066795cc0f409433023af448bb0328Richard Smith ++BaseIt; 1785180f47959a066795cc0f409433023af448bb0328Richard Smith#endif 1786180f47959a066795cc0f409433023af448bb0328Richard Smith LValue Subobject = This; 1787180f47959a066795cc0f409433023af448bb0328Richard Smith HandleLValueDirectBase(Info, Subobject, RD, 1788180f47959a066795cc0f409433023af448bb0328Richard Smith BaseType->getAsCXXRecordDecl(), &Layout); 1789180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateConstantExpression(Result.getStructBase(BasesSeen++), Info, 1790180f47959a066795cc0f409433023af448bb0328Richard Smith Subobject, (*I)->getInit())) 1791180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1792180f47959a066795cc0f409433023af448bb0328Richard Smith } else if (FieldDecl *FD = (*I)->getMember()) { 1793180f47959a066795cc0f409433023af448bb0328Richard Smith LValue Subobject = This; 1794180f47959a066795cc0f409433023af448bb0328Richard Smith HandleLValueMember(Info, Subobject, FD, &Layout); 1795180f47959a066795cc0f409433023af448bb0328Richard Smith if (RD->isUnion()) { 1796180f47959a066795cc0f409433023af448bb0328Richard Smith Result = APValue(FD); 1797c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith if (!EvaluateConstantExpression(Result.getUnionValue(), Info, Subobject, 1798c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith (*I)->getInit(), CCEK_MemberInit)) 1799180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1800180f47959a066795cc0f409433023af448bb0328Richard Smith } else if (!EvaluateConstantExpression( 1801180f47959a066795cc0f409433023af448bb0328Richard Smith Result.getStructField(FD->getFieldIndex()), 1802c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith Info, Subobject, (*I)->getInit(), CCEK_MemberInit)) 1803180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1804180f47959a066795cc0f409433023af448bb0328Richard Smith } else { 1805180f47959a066795cc0f409433023af448bb0328Richard Smith // FIXME: handle indirect field initializers 1806dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag((*I)->getInit()->getExprLoc(), 1807f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith diag::note_invalid_subexpr_in_const_expr); 1808180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1809180f47959a066795cc0f409433023af448bb0328Richard Smith } 1810180f47959a066795cc0f409433023af448bb0328Richard Smith } 1811180f47959a066795cc0f409433023af448bb0328Richard Smith 1812180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 1813180f47959a066795cc0f409433023af448bb0328Richard Smith} 1814180f47959a066795cc0f409433023af448bb0328Richard Smith 1815d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smithnamespace { 1816770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass HasSideEffect 18178cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : public ConstStmtVisitor<HasSideEffect, bool> { 18181e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith const ASTContext &Ctx; 1819c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stumppublic: 1820c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 18211e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith HasSideEffect(const ASTContext &C) : Ctx(C) {} 1822c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 1823c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump // Unhandled nodes conservatively default to having side effects. 18248cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitStmt(const Stmt *S) { 1825c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump return true; 1826c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump } 1827c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 18288cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitParenExpr(const ParenExpr *E) { return Visit(E->getSubExpr()); } 18298cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitGenericSelectionExpr(const GenericSelectionExpr *E) { 1830f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne return Visit(E->getResultExpr()); 1831f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne } 18328cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitDeclRefExpr(const DeclRefExpr *E) { 18331e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith if (Ctx.getCanonicalType(E->getType()).isVolatileQualified()) 1834c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump return true; 1835c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump return false; 1836c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump } 1837f85e193739c953358c865005855253af4f68a497John McCall bool VisitObjCIvarRefExpr(const ObjCIvarRefExpr *E) { 18381e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith if (Ctx.getCanonicalType(E->getType()).isVolatileQualified()) 1839f85e193739c953358c865005855253af4f68a497John McCall return true; 1840f85e193739c953358c865005855253af4f68a497John McCall return false; 1841f85e193739c953358c865005855253af4f68a497John McCall } 1842f85e193739c953358c865005855253af4f68a497John McCall bool VisitBlockDeclRefExpr (const BlockDeclRefExpr *E) { 18431e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith if (Ctx.getCanonicalType(E->getType()).isVolatileQualified()) 1844f85e193739c953358c865005855253af4f68a497John McCall return true; 1845f85e193739c953358c865005855253af4f68a497John McCall return false; 1846f85e193739c953358c865005855253af4f68a497John McCall } 1847f85e193739c953358c865005855253af4f68a497John McCall 1848c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump // We don't want to evaluate BlockExprs multiple times, as they generate 1849c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump // a ton of code. 18508cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitBlockExpr(const BlockExpr *E) { return true; } 18518cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitPredefinedExpr(const PredefinedExpr *E) { return false; } 18528cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) 1853c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump { return Visit(E->getInitializer()); } 18548cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitMemberExpr(const MemberExpr *E) { return Visit(E->getBase()); } 18558cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitIntegerLiteral(const IntegerLiteral *E) { return false; } 18568cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitFloatingLiteral(const FloatingLiteral *E) { return false; } 18578cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitStringLiteral(const StringLiteral *E) { return false; } 18588cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCharacterLiteral(const CharacterLiteral *E) { return false; } 18598cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *E) 1860f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne { return false; } 18618cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitArraySubscriptExpr(const ArraySubscriptExpr *E) 1862980ca220848d27ef55ef4c2d37423461a8ed0da3Mike Stump { return Visit(E->getLHS()) || Visit(E->getRHS()); } 18638cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitChooseExpr(const ChooseExpr *E) 18641e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith { return Visit(E->getChosenSubExpr(Ctx)); } 18658cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCastExpr(const CastExpr *E) { return Visit(E->getSubExpr()); } 18668cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitBinAssign(const BinaryOperator *E) { return true; } 18678cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCompoundAssignOperator(const BinaryOperator *E) { return true; } 18688cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitBinaryOperator(const BinaryOperator *E) 1869980ca220848d27ef55ef4c2d37423461a8ed0da3Mike Stump { return Visit(E->getLHS()) || Visit(E->getRHS()); } 18708cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitUnaryPreInc(const UnaryOperator *E) { return true; } 18718cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitUnaryPostInc(const UnaryOperator *E) { return true; } 18728cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitUnaryPreDec(const UnaryOperator *E) { return true; } 18738cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitUnaryPostDec(const UnaryOperator *E) { return true; } 18748cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitUnaryDeref(const UnaryOperator *E) { 18751e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith if (Ctx.getCanonicalType(E->getType()).isVolatileQualified()) 1876c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump return true; 1877980ca220848d27ef55ef4c2d37423461a8ed0da3Mike Stump return Visit(E->getSubExpr()); 1878c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump } 18798cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitUnaryOperator(const UnaryOperator *E) { return Visit(E->getSubExpr()); } 1880363ff23cfddb51abe4ee4212a6dd3c9b534fcc8bChris Lattner 1881363ff23cfddb51abe4ee4212a6dd3c9b534fcc8bChris Lattner // Has side effects if any element does. 18828cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitInitListExpr(const InitListExpr *E) { 1883363ff23cfddb51abe4ee4212a6dd3c9b534fcc8bChris Lattner for (unsigned i = 0, e = E->getNumInits(); i != e; ++i) 1884363ff23cfddb51abe4ee4212a6dd3c9b534fcc8bChris Lattner if (Visit(E->getInit(i))) return true; 18858cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne if (const Expr *filler = E->getArrayFiller()) 18864423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis return Visit(filler); 1887363ff23cfddb51abe4ee4212a6dd3c9b534fcc8bChris Lattner return false; 1888363ff23cfddb51abe4ee4212a6dd3c9b534fcc8bChris Lattner } 1889ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor 18908cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitSizeOfPackExpr(const SizeOfPackExpr *) { return false; } 1891c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump}; 1892c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 189356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallclass OpaqueValueEvaluation { 189456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall EvalInfo &info; 189556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall OpaqueValueExpr *opaqueValue; 189656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 189756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallpublic: 189856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall OpaqueValueEvaluation(EvalInfo &info, OpaqueValueExpr *opaqueValue, 189956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *value) 190056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall : info(info), opaqueValue(opaqueValue) { 190156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 190256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // If evaluation fails, fail immediately. 19031e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith if (!Evaluate(info.OpaqueValues[opaqueValue], info, value)) { 190456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall this->opaqueValue = 0; 190556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return; 190656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 190756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 190856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 190956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall bool hasError() const { return opaqueValue == 0; } 191056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 191156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall ~OpaqueValueEvaluation() { 19121e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith // FIXME: This will not work for recursive constexpr functions using opaque 19131e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith // values. Restore the former value. 191456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (opaqueValue) info.OpaqueValues.erase(opaqueValue); 191556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 191656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall}; 191756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 1918c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump} // end anonymous namespace 1919c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 19204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 19218cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne// Generic Evaluation 19228cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne//===----------------------------------------------------------------------===// 19238cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournenamespace { 19248cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 1925f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith// FIXME: RetTy is always bool. Remove it. 1926f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithtemplate <class Derived, typename RetTy=bool> 19278cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourneclass ExprEvaluatorBase 19288cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : public ConstStmtVisitor<Derived, RetTy> { 19298cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourneprivate: 193047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith RetTy DerivedSuccess(const CCValue &V, const Expr *E) { 19318cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return static_cast<Derived*>(this)->Success(V, E); 19328cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 1933eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith RetTy DerivedZeroInitialization(const Expr *E) { 1934eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith return static_cast<Derived*>(this)->ZeroInitialization(E); 1935f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith } 19368cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 19378cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourneprotected: 19388cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne EvalInfo &Info; 19398cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne typedef ConstStmtVisitor<Derived, RetTy> StmtVisitorTy; 19408cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne typedef ExprEvaluatorBase ExprEvaluatorBaseTy; 19418cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 1942dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith OptionalDiagnostic CCEDiag(const Expr *E, diag::kind D) { 1943d5093420308784e31071c8cd723a58d74159f393Richard Smith return Info.CCEDiag(E->getExprLoc(), D); 1944f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 1945f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 1946f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith /// Report an evaluation error. This should only be called when an error is 1947f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith /// first discovered. When propagating an error, just return false. 1948f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith bool Error(const Expr *E, diag::kind D) { 1949dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(E->getExprLoc(), D); 1950f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 1951f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 1952f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith bool Error(const Expr *E) { 1953f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E, diag::note_invalid_subexpr_in_const_expr); 1954f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 1955f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 1956eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith RetTy ZeroInitialization(const Expr *E) { return Error(E); } 1957f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith 19588cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournepublic: 19598cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne ExprEvaluatorBase(EvalInfo &Info) : Info(Info) {} 19608cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 19618cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitStmt(const Stmt *) { 1962b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Expression evaluator should not be called on stmts"); 19638cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 19648cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitExpr(const Expr *E) { 1965f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 19668cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 19678cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 19688cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitParenExpr(const ParenExpr *E) 19698cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne { return StmtVisitorTy::Visit(E->getSubExpr()); } 19708cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitUnaryExtension(const UnaryOperator *E) 19718cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne { return StmtVisitorTy::Visit(E->getSubExpr()); } 19728cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitUnaryPlus(const UnaryOperator *E) 19738cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne { return StmtVisitorTy::Visit(E->getSubExpr()); } 19748cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitChooseExpr(const ChooseExpr *E) 19758cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne { return StmtVisitorTy::Visit(E->getChosenSubExpr(Info.Ctx)); } 19768cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitGenericSelectionExpr(const GenericSelectionExpr *E) 19778cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne { return StmtVisitorTy::Visit(E->getResultExpr()); } 197891a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall RetTy VisitSubstNonTypeTemplateParmExpr(const SubstNonTypeTemplateParmExpr *E) 197991a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall { return StmtVisitorTy::Visit(E->getReplacement()); } 19803d75ca836205856077c18e30e9447accbd85f751Richard Smith RetTy VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *E) 19813d75ca836205856077c18e30e9447accbd85f751Richard Smith { return StmtVisitorTy::Visit(E->getExpr()); } 1982bc6abe93a5d6b1305411f8b6f54c2caa686ddc69Richard Smith // We cannot create any objects for which cleanups are required, so there is 1983bc6abe93a5d6b1305411f8b6f54c2caa686ddc69Richard Smith // nothing to do here; all cleanups must come from unevaluated subexpressions. 1984bc6abe93a5d6b1305411f8b6f54c2caa686ddc69Richard Smith RetTy VisitExprWithCleanups(const ExprWithCleanups *E) 1985bc6abe93a5d6b1305411f8b6f54c2caa686ddc69Richard Smith { return StmtVisitorTy::Visit(E->getSubExpr()); } 19868cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 1987c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith RetTy VisitCXXReinterpretCastExpr(const CXXReinterpretCastExpr *E) { 1988c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith CCEDiag(E, diag::note_constexpr_invalid_cast) << 0; 1989c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith return static_cast<Derived*>(this)->VisitCastExpr(E); 1990c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith } 1991c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith RetTy VisitCXXDynamicCastExpr(const CXXDynamicCastExpr *E) { 1992c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith CCEDiag(E, diag::note_constexpr_invalid_cast) << 1; 1993c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith return static_cast<Derived*>(this)->VisitCastExpr(E); 1994c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith } 1995c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith 1996e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith RetTy VisitBinaryOperator(const BinaryOperator *E) { 1997e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith switch (E->getOpcode()) { 1998e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith default: 1999f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 2000e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2001e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case BO_Comma: 2002e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith VisitIgnoredValue(E->getLHS()); 2003e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return StmtVisitorTy::Visit(E->getRHS()); 2004e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2005e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case BO_PtrMemD: 2006e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case BO_PtrMemI: { 2007e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LValue Obj; 2008e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!HandleMemberPointerAccess(Info, E, Obj)) 2009e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 2010e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith CCValue Result; 2011f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!HandleLValueToRValueConversion(Info, E, E->getType(), Obj, Result)) 2012e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 2013e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return DerivedSuccess(Result, E); 2014e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2015e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2016e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2017e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 20188cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitBinaryConditionalOperator(const BinaryConditionalOperator *E) { 20198cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne OpaqueValueEvaluation opaque(Info, E->getOpaqueValue(), E->getCommon()); 20208cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne if (opaque.hasError()) 2021f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 20228cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 20238cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool cond; 2024c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!EvaluateAsBooleanCondition(E->getCond(), cond, Info)) 2025f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 20268cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 20278cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return StmtVisitorTy::Visit(cond ? E->getTrueExpr() : E->getFalseExpr()); 20288cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 20298cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 20308cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitConditionalOperator(const ConditionalOperator *E) { 20318cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool BoolResult; 2032c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!EvaluateAsBooleanCondition(E->getCond(), BoolResult, Info)) 2033f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 20348cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 2035c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith Expr *EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr(); 20368cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return StmtVisitorTy::Visit(EvalExpr); 20378cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 20388cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 20398cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitOpaqueValueExpr(const OpaqueValueExpr *E) { 204047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith const CCValue *Value = Info.getOpaqueValue(E); 204142786839cff1ccbe4d883b81d01846c5d774ffc6Argyrios Kyrtzidis if (!Value) { 204242786839cff1ccbe4d883b81d01846c5d774ffc6Argyrios Kyrtzidis const Expr *Source = E->getSourceExpr(); 204342786839cff1ccbe4d883b81d01846c5d774ffc6Argyrios Kyrtzidis if (!Source) 2044f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 204542786839cff1ccbe4d883b81d01846c5d774ffc6Argyrios Kyrtzidis if (Source == E) { // sanity checking. 204642786839cff1ccbe4d883b81d01846c5d774ffc6Argyrios Kyrtzidis assert(0 && "OpaqueValueExpr recursively refers to itself"); 2047f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 204842786839cff1ccbe4d883b81d01846c5d774ffc6Argyrios Kyrtzidis } 204942786839cff1ccbe4d883b81d01846c5d774ffc6Argyrios Kyrtzidis return StmtVisitorTy::Visit(Source); 205042786839cff1ccbe4d883b81d01846c5d774ffc6Argyrios Kyrtzidis } 205147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith return DerivedSuccess(*Value, E); 20528cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 2053f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith 2054d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith RetTy VisitCallExpr(const CallExpr *E) { 2055e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const Expr *Callee = E->getCallee()->IgnoreParens(); 2056d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith QualType CalleeType = Callee->getType(); 2057d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 20586142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel const FunctionDecl *FD = 0; 205959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith LValue *This = 0, ThisVal; 206059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith llvm::ArrayRef<const Expr*> Args(E->getArgs(), E->getNumArgs()); 206159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 206259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith // Extract function decl and 'this' pointer from the callee. 206359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith if (CalleeType->isSpecificBuiltinType(BuiltinType::BoundMember)) { 2064f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith const ValueDecl *Member = 0; 2065e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (const MemberExpr *ME = dyn_cast<MemberExpr>(Callee)) { 2066e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Explicit bound member calls, such as x.f() or p->g(); 2067e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!EvaluateObjectArgument(Info, ME->getBase(), ThisVal)) 2068f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 2069f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith Member = ME->getMemberDecl(); 2070e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith This = &ThisVal; 2071e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } else if (const BinaryOperator *BE = dyn_cast<BinaryOperator>(Callee)) { 2072e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Indirect bound member calls ('.*' or '->*'). 2073f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith Member = HandleMemberPointerAccess(Info, BE, ThisVal, false); 2074f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!Member) return false; 2075e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith This = &ThisVal; 2076e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } else 2077f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(Callee); 2078f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 2079f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith FD = dyn_cast<FunctionDecl>(Member); 2080f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!FD) 2081f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(Callee); 208259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } else if (CalleeType->isFunctionPointerType()) { 208359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith CCValue Call; 2084f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!Evaluate(Call, Info, Callee)) 2085f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 208659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 2087f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!Call.isLValue() || !Call.getLValueOffset().isZero()) 2088f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(Callee); 20891bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith FD = dyn_cast_or_null<FunctionDecl>( 20901bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith Call.getLValueBase().dyn_cast<const ValueDecl*>()); 209159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith if (!FD) 2092f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(Callee); 209359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 209459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith // Overloaded operator calls to member functions are represented as normal 209559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith // calls with '*this' as the first argument. 209659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD); 209759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith if (MD && !MD->isStatic()) { 2098f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // FIXME: When selecting an implicit conversion for an overloaded 2099f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // operator delete, we sometimes try to evaluate calls to conversion 2100f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // operators without a 'this' parameter! 2101f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (Args.empty()) 2102f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 2103f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 210459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith if (!EvaluateObjectArgument(Info, Args[0], ThisVal)) 210559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return false; 210659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith This = &ThisVal; 210759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith Args = Args.slice(1); 210859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } 2109d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 211059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith // Don't call function pointers which have been cast to some other type. 211159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith if (!Info.Ctx.hasSameType(CalleeType->getPointeeType(), FD->getType())) 2112f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 211359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } else 2114f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 2115d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 2116c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith const FunctionDecl *Definition = 0; 2117d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith Stmt *Body = FD->getBody(Definition); 211869c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith APValue Result; 2119d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 2120c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith if (!CheckConstexprFunction(Info, E->getExprLoc(), FD, Definition) || 212108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith !HandleFunctionCall(E, Definition, This, Args, Body, Info, Result)) 2122f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 2123d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 2124f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return DerivedSuccess(CCValue(Result, CCValue::GlobalValue()), E); 2125d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith } 2126d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 2127c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith RetTy VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) { 2128c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return StmtVisitorTy::Visit(E->getInitializer()); 2129c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith } 2130f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith RetTy VisitInitListExpr(const InitListExpr *E) { 2131f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith if (Info.getLangOpts().CPlusPlus0x) { 2132f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith if (E->getNumInits() == 0) 2133eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith return DerivedZeroInitialization(E); 2134f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith if (E->getNumInits() == 1) 2135f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith return StmtVisitorTy::Visit(E->getInit(0)); 2136f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith } 2137f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 2138f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith } 2139f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith RetTy VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) { 2140eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith return DerivedZeroInitialization(E); 2141f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith } 2142f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith RetTy VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr *E) { 2143eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith return DerivedZeroInitialization(E); 2144f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith } 2145e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith RetTy VisitCXXNullPtrLiteralExpr(const CXXNullPtrLiteralExpr *E) { 2146eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith return DerivedZeroInitialization(E); 2147e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2148f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith 2149180f47959a066795cc0f409433023af448bb0328Richard Smith /// A member expression where the object is a prvalue is itself a prvalue. 2150180f47959a066795cc0f409433023af448bb0328Richard Smith RetTy VisitMemberExpr(const MemberExpr *E) { 2151180f47959a066795cc0f409433023af448bb0328Richard Smith assert(!E->isArrow() && "missing call to bound member function?"); 2152180f47959a066795cc0f409433023af448bb0328Richard Smith 2153180f47959a066795cc0f409433023af448bb0328Richard Smith CCValue Val; 2154180f47959a066795cc0f409433023af448bb0328Richard Smith if (!Evaluate(Val, Info, E->getBase())) 2155180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 2156180f47959a066795cc0f409433023af448bb0328Richard Smith 2157180f47959a066795cc0f409433023af448bb0328Richard Smith QualType BaseTy = E->getBase()->getType(); 2158180f47959a066795cc0f409433023af448bb0328Richard Smith 2159180f47959a066795cc0f409433023af448bb0328Richard Smith const FieldDecl *FD = dyn_cast<FieldDecl>(E->getMemberDecl()); 2160f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!FD) return Error(E); 2161180f47959a066795cc0f409433023af448bb0328Richard Smith assert(!FD->getType()->isReferenceType() && "prvalue reference?"); 2162180f47959a066795cc0f409433023af448bb0328Richard Smith assert(BaseTy->getAs<RecordType>()->getDecl()->getCanonicalDecl() == 2163180f47959a066795cc0f409433023af448bb0328Richard Smith FD->getParent()->getCanonicalDecl() && "record / field mismatch"); 2164180f47959a066795cc0f409433023af448bb0328Richard Smith 2165180f47959a066795cc0f409433023af448bb0328Richard Smith SubobjectDesignator Designator; 2166180f47959a066795cc0f409433023af448bb0328Richard Smith Designator.addDecl(FD); 2167180f47959a066795cc0f409433023af448bb0328Richard Smith 2168f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return ExtractSubobject(Info, E, Val, BaseTy, Designator, E->getType()) && 2169180f47959a066795cc0f409433023af448bb0328Richard Smith DerivedSuccess(Val, E); 2170180f47959a066795cc0f409433023af448bb0328Richard Smith } 2171180f47959a066795cc0f409433023af448bb0328Richard Smith 2172c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith RetTy VisitCastExpr(const CastExpr *E) { 2173c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith switch (E->getCastKind()) { 2174c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith default: 2175c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith break; 2176c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 2177c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case CK_NoOp: 2178c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return StmtVisitorTy::Visit(E->getSubExpr()); 2179c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 2180c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case CK_LValueToRValue: { 2181c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith LValue LVal; 2182f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!EvaluateLValue(E->getSubExpr(), LVal, Info)) 2183f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 2184f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith CCValue RVal; 2185f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!HandleLValueToRValueConversion(Info, E, E->getType(), LVal, RVal)) 2186f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 2187f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return DerivedSuccess(RVal, E); 2188c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith } 2189c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith } 2190c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 2191f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 2192c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith } 2193c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 21948327fad71da34492d82c532f42a58cb4baff81a3Richard Smith /// Visit a value which is evaluated, but whose value is ignored. 21958327fad71da34492d82c532f42a58cb4baff81a3Richard Smith void VisitIgnoredValue(const Expr *E) { 219647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue Scratch; 21978327fad71da34492d82c532f42a58cb4baff81a3Richard Smith if (!Evaluate(Scratch, Info, E)) 21988327fad71da34492d82c532f42a58cb4baff81a3Richard Smith Info.EvalStatus.HasSideEffects = true; 21998327fad71da34492d82c532f42a58cb4baff81a3Richard Smith } 22008cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne}; 22018cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 22028cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne} 22038cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 22048cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne//===----------------------------------------------------------------------===// 2205e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith// Common base class for lvalue and temporary evaluation. 2206e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith//===----------------------------------------------------------------------===// 2207e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithnamespace { 2208e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithtemplate<class Derived> 2209e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithclass LValueExprEvaluatorBase 2210e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith : public ExprEvaluatorBase<Derived, bool> { 2211e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithprotected: 2212e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LValue &Result; 2213e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith typedef LValueExprEvaluatorBase LValueExprEvaluatorBaseTy; 2214e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith typedef ExprEvaluatorBase<Derived, bool> ExprEvaluatorBaseTy; 2215e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2216e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool Success(APValue::LValueBase B) { 2217e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Result.set(B); 2218e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 2219e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2220e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2221e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithpublic: 2222e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LValueExprEvaluatorBase(EvalInfo &Info, LValue &Result) : 2223e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith ExprEvaluatorBaseTy(Info), Result(Result) {} 2224e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2225e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool Success(const CCValue &V, const Expr *E) { 2226e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Result.setFrom(V); 2227e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 2228e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2229e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2230e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool CheckValidLValue() { 2231e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // C++11 [basic.lval]p1: An lvalue designates a function or an object. Hence 2232e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // there are no null references, nor once-past-the-end references. 2233e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // FIXME: Check for one-past-the-end array indices 2234e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return Result.Base && !Result.Designator.Invalid && 2235e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith !Result.Designator.OnePastTheEnd; 2236e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2237e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2238e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool VisitMemberExpr(const MemberExpr *E) { 2239e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Handle non-static data members. 2240e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith QualType BaseTy; 2241e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (E->isArrow()) { 2242e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!EvaluatePointer(E->getBase(), Result, this->Info)) 2243e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 2244e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith BaseTy = E->getBase()->getType()->getAs<PointerType>()->getPointeeType(); 2245c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith } else if (E->getBase()->isRValue()) { 2246af2c7a194592401394233b7cbcdd3cfd0a7a38ddRichard Smith assert(E->getBase()->getType()->isRecordType()); 2247c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith if (!EvaluateTemporary(E->getBase(), Result, this->Info)) 2248c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return false; 2249c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith BaseTy = E->getBase()->getType(); 2250e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } else { 2251e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!this->Visit(E->getBase())) 2252e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 2253e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith BaseTy = E->getBase()->getType(); 2254e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2255e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // FIXME: In C++11, require the result to be a valid lvalue. 2256e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2257e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const FieldDecl *FD = dyn_cast<FieldDecl>(E->getMemberDecl()); 2258e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // FIXME: Handle IndirectFieldDecls 2259f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!FD) return this->Error(E); 2260e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith assert(BaseTy->getAs<RecordType>()->getDecl()->getCanonicalDecl() == 2261e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith FD->getParent()->getCanonicalDecl() && "record / field mismatch"); 2262e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith (void)BaseTy; 2263e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2264e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith HandleLValueMember(this->Info, Result, FD); 2265e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2266e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (FD->getType()->isReferenceType()) { 2267e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith CCValue RefValue; 2268f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!HandleLValueToRValueConversion(this->Info, E, FD->getType(), Result, 2269e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith RefValue)) 2270e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 2271e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return Success(RefValue, E); 2272e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2273e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 2274e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2275e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2276e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool VisitBinaryOperator(const BinaryOperator *E) { 2277e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith switch (E->getOpcode()) { 2278e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith default: 2279e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return ExprEvaluatorBaseTy::VisitBinaryOperator(E); 2280e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2281e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case BO_PtrMemD: 2282e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case BO_PtrMemI: 2283e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return HandleMemberPointerAccess(this->Info, E, Result); 2284e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2285e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2286e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2287e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool VisitCastExpr(const CastExpr *E) { 2288e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith switch (E->getCastKind()) { 2289e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith default: 2290e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return ExprEvaluatorBaseTy::VisitCastExpr(E); 2291e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2292e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case CK_DerivedToBase: 2293e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case CK_UncheckedDerivedToBase: { 2294e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!this->Visit(E->getSubExpr())) 2295e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 2296e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!CheckValidLValue()) 2297e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 2298e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2299e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Now figure out the necessary offset to add to the base LV to get from 2300e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // the derived class to the base class. 2301e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith QualType Type = E->getSubExpr()->getType(); 2302e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2303e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith for (CastExpr::path_const_iterator PathI = E->path_begin(), 2304e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith PathE = E->path_end(); PathI != PathE; ++PathI) { 2305e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!HandleLValueBase(this->Info, Result, Type->getAsCXXRecordDecl(), 2306e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith *PathI)) 2307e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 2308e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Type = (*PathI)->getType(); 2309e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2310e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2311e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 2312e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2313e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2314e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2315e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith}; 2316e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 2317e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2318e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith//===----------------------------------------------------------------------===// 23194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// LValue Evaluation 2320c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// 2321c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// This is used for evaluating lvalues (in C and C++), xvalues (in C++11), 2322c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// function designators (in C), decl references to void objects (in C), and 2323c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// temporaries (if building with -Wno-address-of-temporary). 2324c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// 2325c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// LValue evaluation produces values comprising a base expression of one of the 2326c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// following types: 23271bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith// - Declarations 23281bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith// * VarDecl 23291bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith// * FunctionDecl 23301bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith// - Literals 2331c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// * CompoundLiteralExpr in C 2332c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// * StringLiteral 233347d2145675099893d702be4bc06bd9f26d8ddd13Richard Smith// * CXXTypeidExpr 2334c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// * PredefinedExpr 2335180f47959a066795cc0f409433023af448bb0328Richard Smith// * ObjCStringLiteralExpr 2336c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// * ObjCEncodeExpr 2337c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// * AddrLabelExpr 2338c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// * BlockExpr 2339c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// * CallExpr for a MakeStringConstant builtin 23401bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith// - Locals and temporaries 23411bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith// * Any Expr, with a Frame indicating the function in which the temporary was 23421bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith// evaluated. 23431bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith// plus an offset in bytes. 23444efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 23454efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmannamespace { 2346770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass LValueExprEvaluator 2347e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith : public LValueExprEvaluatorBase<LValueExprEvaluator> { 23484efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanpublic: 2349e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LValueExprEvaluator(EvalInfo &Info, LValue &Result) : 2350e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LValueExprEvaluatorBaseTy(Info, Result) {} 23511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2352c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith bool VisitVarDecl(const Expr *E, const VarDecl *VD); 2353c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 23548cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitDeclRefExpr(const DeclRefExpr *E); 23558cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitPredefinedExpr(const PredefinedExpr *E) { return Success(E); } 2356bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith bool VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *E); 23578cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCompoundLiteralExpr(const CompoundLiteralExpr *E); 23588cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitMemberExpr(const MemberExpr *E); 23598cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitStringLiteral(const StringLiteral *E) { return Success(E); } 23608cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitObjCEncodeExpr(const ObjCEncodeExpr *E) { return Success(E); } 236147d2145675099893d702be4bc06bd9f26d8ddd13Richard Smith bool VisitCXXTypeidExpr(const CXXTypeidExpr *E); 23628cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitArraySubscriptExpr(const ArraySubscriptExpr *E); 23638cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitUnaryDeref(const UnaryOperator *E); 23648cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 23658cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCastExpr(const CastExpr *E) { 236626bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson switch (E->getCastKind()) { 236726bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson default: 2368e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return LValueExprEvaluatorBaseTy::VisitCastExpr(E); 236926bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson 2370db924224b51b153f24fbe492102d4edebcbbb7f4Eli Friedman case CK_LValueBitCast: 2371c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith this->CCEDiag(E, diag::note_constexpr_invalid_cast) << 2; 23720a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (!Visit(E->getSubExpr())) 23730a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return false; 23740a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Result.Designator.setInvalid(); 23750a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return true; 2376db924224b51b153f24fbe492102d4edebcbbb7f4Eli Friedman 2377e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case CK_BaseToDerived: 2378180f47959a066795cc0f409433023af448bb0328Richard Smith if (!Visit(E->getSubExpr())) 2379180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 2380e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!CheckValidLValue()) 2381e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 2382e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return HandleBaseToDerivedCast(Info, E, Result); 238326bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson } 238426bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson } 2385cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl 2386ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman // FIXME: Missing: __real__, __imag__ 23878cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 23884efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}; 23894efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} // end anonymous namespace 23904efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2391c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// Evaluate an expression as an lvalue. This can be legitimately called on 2392c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// expressions which are not glvalues, in a few cases: 2393c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// * function designators in C, 2394c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// * "extern void" objects, 2395c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// * temporaries, if building with -Wno-address-of-temporary. 2396efdb83e26f9a1fd2566afe54461216cd84814d42John McCallstatic bool EvaluateLValue(const Expr* E, LValue& Result, EvalInfo &Info) { 2397c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith assert((E->isGLValue() || E->getType()->isFunctionType() || 2398c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith E->getType()->isVoidType() || isa<CXXTemporaryObjectExpr>(E)) && 2399c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith "can't evaluate expression as an lvalue"); 24008cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return LValueExprEvaluator(Info, Result).Visit(E); 24014efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 24024efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 24038cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool LValueExprEvaluator::VisitDeclRefExpr(const DeclRefExpr *E) { 24041bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(E->getDecl())) 24051bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith return Success(FD); 24061bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith if (const VarDecl *VD = dyn_cast<VarDecl>(E->getDecl())) 2407c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return VisitVarDecl(E, VD); 2408c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return Error(E); 2409c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith} 2410436c8898cd1c93c5bacd3fcc4ac586bc5cd77062Richard Smith 2411c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smithbool LValueExprEvaluator::VisitVarDecl(const Expr *E, const VarDecl *VD) { 2412177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith if (!VD->getType()->isReferenceType()) { 2413177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith if (isa<ParmVarDecl>(VD)) { 24141bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith Result.set(VD, Info.CurrentCall); 2415177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith return true; 2416177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith } 24171bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith return Success(VD); 2418177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith } 241950c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman 242047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue V; 2421f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!EvaluateVarDeclInit(Info, E, VD, Info.CurrentCall, V)) 2422f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 2423f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Success(V, E); 242435873c49adad211ff466e34342a52665742794f5Anders Carlsson} 242535873c49adad211ff466e34342a52665742794f5Anders Carlsson 2426bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smithbool LValueExprEvaluator::VisitMaterializeTemporaryExpr( 2427bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith const MaterializeTemporaryExpr *E) { 2428e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (E->GetTemporaryExpr()->isRValue()) { 2429af2c7a194592401394233b7cbcdd3cfd0a7a38ddRichard Smith if (E->getType()->isRecordType()) 2430e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return EvaluateTemporary(E->GetTemporaryExpr(), Result, Info); 2431e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2432e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Result.set(E, Info.CurrentCall); 2433e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return EvaluateConstantExpression(Info.CurrentCall->Temporaries[E], Info, 2434e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Result, E->GetTemporaryExpr()); 2435e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2436e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2437e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Materialization of an lvalue temporary occurs when we need to force a copy 2438e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // (for instance, if it's a bitfield). 2439e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // FIXME: The AST should contain an lvalue-to-rvalue node for such cases. 2440e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!Visit(E->GetTemporaryExpr())) 2441e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 2442f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!HandleLValueToRValueConversion(Info, E, E->getType(), Result, 2443e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Info.CurrentCall->Temporaries[E])) 2444e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 24451bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith Result.set(E, Info.CurrentCall); 2446e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 2447bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith} 2448bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 24498cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool 24508cad3046be06ea73ff8892d947697a21d7a440d3Peter CollingbourneLValueExprEvaluator::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) { 2451c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith assert(!Info.getLangOpts().CPlusPlus && "lvalue compound literal in c++?"); 2452c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // Defer visiting the literal until the lvalue-to-rvalue conversion. We can 2453c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // only see this when folding in C, so there's no standard to follow here. 2454efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return Success(E); 24554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 24564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 245747d2145675099893d702be4bc06bd9f26d8ddd13Richard Smithbool LValueExprEvaluator::VisitCXXTypeidExpr(const CXXTypeidExpr *E) { 245847d2145675099893d702be4bc06bd9f26d8ddd13Richard Smith if (E->isTypeOperand()) 245947d2145675099893d702be4bc06bd9f26d8ddd13Richard Smith return Success(E); 246047d2145675099893d702be4bc06bd9f26d8ddd13Richard Smith CXXRecordDecl *RD = E->getExprOperand()->getType()->getAsCXXRecordDecl(); 246147d2145675099893d702be4bc06bd9f26d8ddd13Richard Smith if (RD && RD->isPolymorphic()) { 246247d2145675099893d702be4bc06bd9f26d8ddd13Richard Smith Info.Diag(E->getExprLoc(), diag::note_constexpr_typeid_polymorphic) 246347d2145675099893d702be4bc06bd9f26d8ddd13Richard Smith << E->getExprOperand()->getType() 246447d2145675099893d702be4bc06bd9f26d8ddd13Richard Smith << E->getExprOperand()->getSourceRange(); 246547d2145675099893d702be4bc06bd9f26d8ddd13Richard Smith return false; 246647d2145675099893d702be4bc06bd9f26d8ddd13Richard Smith } 246747d2145675099893d702be4bc06bd9f26d8ddd13Richard Smith return Success(E); 246847d2145675099893d702be4bc06bd9f26d8ddd13Richard Smith} 246947d2145675099893d702be4bc06bd9f26d8ddd13Richard Smith 24708cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool LValueExprEvaluator::VisitMemberExpr(const MemberExpr *E) { 2471c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // Handle static data members. 2472c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (const VarDecl *VD = dyn_cast<VarDecl>(E->getMemberDecl())) { 2473c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith VisitIgnoredValue(E->getBase()); 2474c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return VisitVarDecl(E, VD); 2475c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith } 2476c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 2477d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith // Handle static member functions. 2478d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(E->getMemberDecl())) { 2479d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith if (MD->isStatic()) { 2480d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith VisitIgnoredValue(E->getBase()); 24811bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith return Success(MD); 2482d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith } 2483d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith } 2484d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 2485180f47959a066795cc0f409433023af448bb0328Richard Smith // Handle non-static data members. 2486e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return LValueExprEvaluatorBaseTy::VisitMemberExpr(E); 24874efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 24884efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 24898cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool LValueExprEvaluator::VisitArraySubscriptExpr(const ArraySubscriptExpr *E) { 2490c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // FIXME: Deal with vectors as array subscript bases. 2491c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (E->getBase()->getType()->isVectorType()) 2492f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 2493c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 24943068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getBase(), Result, Info)) 2495efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return false; 24961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24973068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APSInt Index; 24983068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluateInteger(E->getIdx(), Index, Info)) 2499efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return false; 2500180f47959a066795cc0f409433023af448bb0328Richard Smith int64_t IndexValue 2501180f47959a066795cc0f409433023af448bb0328Richard Smith = Index.isSigned() ? Index.getSExtValue() 2502180f47959a066795cc0f409433023af448bb0328Richard Smith : static_cast<int64_t>(Index.getZExtValue()); 25033068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 2504e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // FIXME: In C++11, require the result to be a valid lvalue. 2505180f47959a066795cc0f409433023af448bb0328Richard Smith return HandleLValueArrayAdjustment(Info, Result, E->getType(), IndexValue); 25063068d117951a8df54bae9db039b56201ab10962bAnders Carlsson} 25074efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 25088cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool LValueExprEvaluator::VisitUnaryDeref(const UnaryOperator *E) { 2509e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // FIXME: In C++11, require the result to be a valid lvalue. 2510efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return EvaluatePointer(E->getSubExpr(), Result, Info); 2511e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman} 2512e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman 25134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 2514f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Pointer Evaluation 2515f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 2516f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 2517c754aa62643e66ab967ca32ae8b0b3fc419bba25Anders Carlssonnamespace { 2518770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass PointerExprEvaluator 25198cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : public ExprEvaluatorBase<PointerExprEvaluator, bool> { 2520efdb83e26f9a1fd2566afe54461216cd84814d42John McCall LValue &Result; 2521efdb83e26f9a1fd2566afe54461216cd84814d42John McCall 25228cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool Success(const Expr *E) { 25231bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith Result.set(E); 2524efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return true; 2525efdb83e26f9a1fd2566afe54461216cd84814d42John McCall } 25262bad1687fe6f00e10767a691a33b070b151902b6Anders Carlssonpublic: 25271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2528efdb83e26f9a1fd2566afe54461216cd84814d42John McCall PointerExprEvaluator(EvalInfo &info, LValue &Result) 25298cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : ExprEvaluatorBaseTy(info), Result(Result) {} 2530f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 253147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith bool Success(const CCValue &V, const Expr *E) { 25328cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne Result.setFrom(V); 25338cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return true; 25342bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson } 2535eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith bool ZeroInitialization(const Expr *E) { 2536f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith return Success((Expr*)0); 2537f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith } 25382bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 2539efdb83e26f9a1fd2566afe54461216cd84814d42John McCall bool VisitBinaryOperator(const BinaryOperator *E); 25408cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCastExpr(const CastExpr* E); 2541efdb83e26f9a1fd2566afe54461216cd84814d42John McCall bool VisitUnaryAddrOf(const UnaryOperator *E); 25428cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitObjCStringLiteral(const ObjCStringLiteral *E) 2543efdb83e26f9a1fd2566afe54461216cd84814d42John McCall { return Success(E); } 25448cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitAddrLabelExpr(const AddrLabelExpr *E) 2545efdb83e26f9a1fd2566afe54461216cd84814d42John McCall { return Success(E); } 25468cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCallExpr(const CallExpr *E); 25478cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitBlockExpr(const BlockExpr *E) { 2548469a1eb996e1cb0be54f9b210f836afbddcbb2ccJohn McCall if (!E->getBlockDecl()->hasCaptures()) 2549efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return Success(E); 2550f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 2551b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump } 2552180f47959a066795cc0f409433023af448bb0328Richard Smith bool VisitCXXThisExpr(const CXXThisExpr *E) { 2553180f47959a066795cc0f409433023af448bb0328Richard Smith if (!Info.CurrentCall->This) 2554f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 2555180f47959a066795cc0f409433023af448bb0328Richard Smith Result = *Info.CurrentCall->This; 2556180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 2557180f47959a066795cc0f409433023af448bb0328Richard Smith } 255856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 2559ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman // FIXME: Missing: @protocol, @selector 25602bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson}; 2561f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace 25622bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 2563efdb83e26f9a1fd2566afe54461216cd84814d42John McCallstatic bool EvaluatePointer(const Expr* E, LValue& Result, EvalInfo &Info) { 2564c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith assert(E->isRValue() && E->getType()->hasPointerRepresentation()); 25658cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return PointerExprEvaluator(Info, Result).Visit(E); 2566f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} 2567650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 2568efdb83e26f9a1fd2566afe54461216cd84814d42John McCallbool PointerExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 25692de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (E->getOpcode() != BO_Add && 25702de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall E->getOpcode() != BO_Sub) 2571e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return ExprEvaluatorBaseTy::VisitBinaryOperator(E); 25721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2573650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson const Expr *PExp = E->getLHS(); 2574650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson const Expr *IExp = E->getRHS(); 2575650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (IExp->getType()->isPointerType()) 2576f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner std::swap(PExp, IExp); 25771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2578efdb83e26f9a1fd2566afe54461216cd84814d42John McCall if (!EvaluatePointer(PExp, Result, Info)) 2579efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return false; 25801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2581efdb83e26f9a1fd2566afe54461216cd84814d42John McCall llvm::APSInt Offset; 2582efdb83e26f9a1fd2566afe54461216cd84814d42John McCall if (!EvaluateInteger(IExp, Offset, Info)) 2583efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return false; 2584efdb83e26f9a1fd2566afe54461216cd84814d42John McCall int64_t AdditionalOffset 2585efdb83e26f9a1fd2566afe54461216cd84814d42John McCall = Offset.isSigned() ? Offset.getSExtValue() 2586efdb83e26f9a1fd2566afe54461216cd84814d42John McCall : static_cast<int64_t>(Offset.getZExtValue()); 25870a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (E->getOpcode() == BO_Sub) 25880a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith AdditionalOffset = -AdditionalOffset; 2589650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 2590180f47959a066795cc0f409433023af448bb0328Richard Smith QualType Pointee = PExp->getType()->getAs<PointerType>()->getPointeeType(); 2591e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // FIXME: In C++11, require the result to be a valid lvalue. 2592180f47959a066795cc0f409433023af448bb0328Richard Smith return HandleLValueArrayAdjustment(Info, Result, Pointee, AdditionalOffset); 2593650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson} 25944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2595efdb83e26f9a1fd2566afe54461216cd84814d42John McCallbool PointerExprEvaluator::VisitUnaryAddrOf(const UnaryOperator *E) { 2596efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return EvaluateLValue(E->getSubExpr(), Result, Info); 25974efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 25981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25998cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool PointerExprEvaluator::VisitCastExpr(const CastExpr* E) { 26008cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne const Expr* SubExpr = E->getSubExpr(); 2601650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 260209a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman switch (E->getCastKind()) { 260309a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman default: 260409a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman break; 260509a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman 26062de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_BitCast: 26071d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall case CK_CPointerToObjCPointerCast: 26081d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall case CK_BlockPointerToObjCPointerCast: 26092de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_AnyPointerToBlockPointerCast: 2610c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith // Bitcasts to cv void* are static_casts, not reinterpret_casts, so are 2611c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith // permitted in constant expressions in C++11. Bitcasts from cv void* are 2612c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith // also static_casts, but we disallow them as a resolution to DR1312. 26134cd9b8f7fb2cebf614e6e2bc766fad27ffd2e9deRichard Smith if (!E->getType()->isVoidPointerType()) { 26144cd9b8f7fb2cebf614e6e2bc766fad27ffd2e9deRichard Smith if (SubExpr->getType()->isVoidPointerType()) 26154cd9b8f7fb2cebf614e6e2bc766fad27ffd2e9deRichard Smith CCEDiag(E, diag::note_constexpr_invalid_cast) 26164cd9b8f7fb2cebf614e6e2bc766fad27ffd2e9deRichard Smith << 3 << SubExpr->getType(); 26174cd9b8f7fb2cebf614e6e2bc766fad27ffd2e9deRichard Smith else 26184cd9b8f7fb2cebf614e6e2bc766fad27ffd2e9deRichard Smith CCEDiag(E, diag::note_constexpr_invalid_cast) << 2; 26194cd9b8f7fb2cebf614e6e2bc766fad27ffd2e9deRichard Smith } 26200a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (!Visit(SubExpr)) 26210a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return false; 26220a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Result.Designator.setInvalid(); 26230a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return true; 262409a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman 26255c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson case CK_DerivedToBase: 26265c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson case CK_UncheckedDerivedToBase: { 262747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith if (!EvaluatePointer(E->getSubExpr(), Result, Info)) 26285c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson return false; 2629e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!Result.Base && Result.Offset.isZero()) 2630e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 26315c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson 2632180f47959a066795cc0f409433023af448bb0328Richard Smith // Now figure out the necessary offset to add to the base LV to get from 26335c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson // the derived class to the base class. 2634180f47959a066795cc0f409433023af448bb0328Richard Smith QualType Type = 2635180f47959a066795cc0f409433023af448bb0328Richard Smith E->getSubExpr()->getType()->castAs<PointerType>()->getPointeeType(); 26365c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson 2637180f47959a066795cc0f409433023af448bb0328Richard Smith for (CastExpr::path_const_iterator PathI = E->path_begin(), 26385c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson PathE = E->path_end(); PathI != PathE; ++PathI) { 2639180f47959a066795cc0f409433023af448bb0328Richard Smith if (!HandleLValueBase(Info, Result, Type->getAsCXXRecordDecl(), *PathI)) 26405c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson return false; 2641180f47959a066795cc0f409433023af448bb0328Richard Smith Type = (*PathI)->getType(); 26425c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson } 26435c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson 26445c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson return true; 26455c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson } 26465c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson 2647e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case CK_BaseToDerived: 2648e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!Visit(E->getSubExpr())) 2649e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 2650e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!Result.Base && Result.Offset.isZero()) 2651e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 2652e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return HandleBaseToDerivedCast(Info, E, Result); 2653e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 265447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith case CK_NullToPointer: 2655eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith return ZeroInitialization(E); 2656404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall 26572de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_IntegralToPointer: { 2658c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith CCEDiag(E, diag::note_constexpr_invalid_cast) << 2; 2659c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith 266047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue Value; 2661efdb83e26f9a1fd2566afe54461216cd84814d42John McCall if (!EvaluateIntegerOrLValue(SubExpr, Value, Info)) 266209a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman break; 266369ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar 2664efdb83e26f9a1fd2566afe54461216cd84814d42John McCall if (Value.isInt()) { 266547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith unsigned Size = Info.Ctx.getTypeSize(E->getType()); 266647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith uint64_t N = Value.getInt().extOrTrunc(Size).getZExtValue(); 26671bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith Result.Base = (Expr*)0; 266847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Result.Offset = CharUnits::fromQuantity(N); 2669177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith Result.Frame = 0; 26700a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Result.Designator.setInvalid(); 2671efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return true; 2672efdb83e26f9a1fd2566afe54461216cd84814d42John McCall } else { 2673efdb83e26f9a1fd2566afe54461216cd84814d42John McCall // Cast is of an lvalue, no need to change value. 267447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Result.setFrom(Value); 2675efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return true; 2676650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson } 2677650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson } 26782de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_ArrayToPointerDecay: 2679e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (SubExpr->isGLValue()) { 2680e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!EvaluateLValue(SubExpr, Result, Info)) 2681e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 2682e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } else { 2683e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Result.set(SubExpr, Info.CurrentCall); 2684e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!EvaluateConstantExpression(Info.CurrentCall->Temporaries[SubExpr], 2685e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Info, Result, SubExpr)) 2686e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 2687e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 26880a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith // The result is a pointer to the first element of the array. 26890a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Result.Designator.addIndex(0); 26900a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return true; 26916a7c94af983717e2c2d6aebe42cb4737c1c7b9e6Richard Smith 26922de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_FunctionToPointerDecay: 26936a7c94af983717e2c2d6aebe42cb4737c1c7b9e6Richard Smith return EvaluateLValue(SubExpr, Result, Info); 26944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 26954efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2696c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return ExprEvaluatorBaseTy::VisitCastExpr(E); 26971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 2698650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 26998cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool PointerExprEvaluator::VisitCallExpr(const CallExpr *E) { 2700180f47959a066795cc0f409433023af448bb0328Richard Smith if (IsStringLiteralCall(E)) 2701efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return Success(E); 270256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 27038cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return ExprEvaluatorBaseTy::VisitCallExpr(E); 27044efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 2705f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 2706f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 2707e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith// Member Pointer Evaluation 2708e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith//===----------------------------------------------------------------------===// 2709e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2710e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithnamespace { 2711e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithclass MemberPointerExprEvaluator 2712e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith : public ExprEvaluatorBase<MemberPointerExprEvaluator, bool> { 2713e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MemberPtr &Result; 2714e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2715e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool Success(const ValueDecl *D) { 2716e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Result = MemberPtr(D); 2717e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 2718e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2719e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithpublic: 2720e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2721e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MemberPointerExprEvaluator(EvalInfo &Info, MemberPtr &Result) 2722e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith : ExprEvaluatorBaseTy(Info), Result(Result) {} 2723e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2724e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool Success(const CCValue &V, const Expr *E) { 2725e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Result.setFrom(V); 2726e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 2727e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2728eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith bool ZeroInitialization(const Expr *E) { 2729e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return Success((const ValueDecl*)0); 2730e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2731e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2732e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool VisitCastExpr(const CastExpr *E); 2733e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool VisitUnaryAddrOf(const UnaryOperator *E); 2734e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith}; 2735e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} // end anonymous namespace 2736e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2737e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstatic bool EvaluateMemberPointer(const Expr *E, MemberPtr &Result, 2738e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith EvalInfo &Info) { 2739e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith assert(E->isRValue() && E->getType()->isMemberPointerType()); 2740e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return MemberPointerExprEvaluator(Info, Result).Visit(E); 2741e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 2742e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2743e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithbool MemberPointerExprEvaluator::VisitCastExpr(const CastExpr *E) { 2744e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith switch (E->getCastKind()) { 2745e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith default: 2746e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return ExprEvaluatorBaseTy::VisitCastExpr(E); 2747e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2748e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case CK_NullToMemberPointer: 2749eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith return ZeroInitialization(E); 2750e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2751e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case CK_BaseToDerivedMemberPointer: { 2752e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!Visit(E->getSubExpr())) 2753e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 2754e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (E->path_empty()) 2755e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 2756e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Base-to-derived member pointer casts store the path in derived-to-base 2757e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // order, so iterate backwards. The CXXBaseSpecifier also provides us with 2758e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // the wrong end of the derived->base arc, so stagger the path by one class. 2759e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith typedef std::reverse_iterator<CastExpr::path_const_iterator> ReverseIter; 2760e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith for (ReverseIter PathI(E->path_end() - 1), PathE(E->path_begin()); 2761e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith PathI != PathE; ++PathI) { 2762e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith assert(!(*PathI)->isVirtual() && "memptr cast through vbase"); 2763e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *Derived = (*PathI)->getType()->getAsCXXRecordDecl(); 2764e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!Result.castToDerived(Derived)) 2765f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 2766e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2767e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const Type *FinalTy = E->getType()->castAs<MemberPointerType>()->getClass(); 2768e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!Result.castToDerived(FinalTy->getAsCXXRecordDecl())) 2769f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 2770e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 2771e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2772e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2773e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case CK_DerivedToBaseMemberPointer: 2774e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!Visit(E->getSubExpr())) 2775e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 2776e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith for (CastExpr::path_const_iterator PathI = E->path_begin(), 2777e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith PathE = E->path_end(); PathI != PathE; ++PathI) { 2778e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith assert(!(*PathI)->isVirtual() && "memptr cast through vbase"); 2779e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *Base = (*PathI)->getType()->getAsCXXRecordDecl(); 2780e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!Result.castToBase(Base)) 2781f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 2782e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2783e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 2784e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2785e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 2786e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2787e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithbool MemberPointerExprEvaluator::VisitUnaryAddrOf(const UnaryOperator *E) { 2788e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // C++11 [expr.unary.op]p3 has very strict rules on how the address of a 2789e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // member can be formed. 2790e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return Success(cast<DeclRefExpr>(E->getSubExpr())->getDecl()); 2791e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 2792e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2793e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith//===----------------------------------------------------------------------===// 2794180f47959a066795cc0f409433023af448bb0328Richard Smith// Record Evaluation 2795180f47959a066795cc0f409433023af448bb0328Richard Smith//===----------------------------------------------------------------------===// 2796180f47959a066795cc0f409433023af448bb0328Richard Smith 2797180f47959a066795cc0f409433023af448bb0328Richard Smithnamespace { 2798180f47959a066795cc0f409433023af448bb0328Richard Smith class RecordExprEvaluator 2799180f47959a066795cc0f409433023af448bb0328Richard Smith : public ExprEvaluatorBase<RecordExprEvaluator, bool> { 2800180f47959a066795cc0f409433023af448bb0328Richard Smith const LValue &This; 2801180f47959a066795cc0f409433023af448bb0328Richard Smith APValue &Result; 2802180f47959a066795cc0f409433023af448bb0328Richard Smith public: 2803180f47959a066795cc0f409433023af448bb0328Richard Smith 2804180f47959a066795cc0f409433023af448bb0328Richard Smith RecordExprEvaluator(EvalInfo &info, const LValue &This, APValue &Result) 2805180f47959a066795cc0f409433023af448bb0328Richard Smith : ExprEvaluatorBaseTy(info), This(This), Result(Result) {} 2806180f47959a066795cc0f409433023af448bb0328Richard Smith 2807180f47959a066795cc0f409433023af448bb0328Richard Smith bool Success(const CCValue &V, const Expr *E) { 2808f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return CheckConstantExpression(Info, E, V, Result); 2809180f47959a066795cc0f409433023af448bb0328Richard Smith } 2810eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith bool ZeroInitialization(const Expr *E); 2811180f47959a066795cc0f409433023af448bb0328Richard Smith 281259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith bool VisitCastExpr(const CastExpr *E); 2813180f47959a066795cc0f409433023af448bb0328Richard Smith bool VisitInitListExpr(const InitListExpr *E); 2814180f47959a066795cc0f409433023af448bb0328Richard Smith bool VisitCXXConstructExpr(const CXXConstructExpr *E); 2815180f47959a066795cc0f409433023af448bb0328Richard Smith }; 2816180f47959a066795cc0f409433023af448bb0328Richard Smith} 2817180f47959a066795cc0f409433023af448bb0328Richard Smith 2818eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith/// Perform zero-initialization on an object of non-union class type. 2819eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith/// C++11 [dcl.init]p5: 2820eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith/// To zero-initialize an object or reference of type T means: 2821eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith/// [...] 2822eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith/// -- if T is a (possibly cv-qualified) non-union class type, 2823eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith/// each non-static data member and each base-class subobject is 2824eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith/// zero-initialized 2825eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smithstatic bool HandleClassZeroInitialization(EvalInfo &Info, const RecordDecl *RD, 2826eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith const LValue &This, APValue &Result) { 2827eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith assert(!RD->isUnion() && "Expected non-union class type"); 2828eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith const CXXRecordDecl *CD = dyn_cast<CXXRecordDecl>(RD); 2829eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith Result = APValue(APValue::UninitStruct(), CD ? CD->getNumBases() : 0, 2830eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith std::distance(RD->field_begin(), RD->field_end())); 2831eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith 2832eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); 2833eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith 2834eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith if (CD) { 2835eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith unsigned Index = 0; 2836eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith for (CXXRecordDecl::base_class_const_iterator I = CD->bases_begin(), 2837eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith E = CD->bases_end(); I != E; ++I, ++Index) { 2838eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith const CXXRecordDecl *Base = I->getType()->getAsCXXRecordDecl(); 2839eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith LValue Subobject = This; 2840eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith HandleLValueDirectBase(Info, Subobject, CD, Base, &Layout); 2841eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith if (!HandleClassZeroInitialization(Info, Base, Subobject, 2842eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith Result.getStructBase(Index))) 2843eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith return false; 2844eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith } 2845eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith } 2846eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith 2847eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith for (RecordDecl::field_iterator I = RD->field_begin(), E = RD->field_end(); 2848eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith I != E; ++I) { 2849eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith // -- if T is a reference type, no initialization is performed. 2850eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith if ((*I)->getType()->isReferenceType()) 2851eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith continue; 2852eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith 2853eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith LValue Subobject = This; 2854eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith HandleLValueMember(Info, Subobject, *I, &Layout); 2855eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith 2856eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith ImplicitValueInitExpr VIE((*I)->getType()); 2857eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith if (!EvaluateConstantExpression( 2858eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith Result.getStructField((*I)->getFieldIndex()), Info, Subobject, &VIE)) 2859eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith return false; 2860eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith } 2861eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith 2862eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith return true; 2863eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith} 2864eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith 2865eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smithbool RecordExprEvaluator::ZeroInitialization(const Expr *E) { 2866eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith const RecordDecl *RD = E->getType()->castAs<RecordType>()->getDecl(); 2867eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith if (RD->isUnion()) { 2868eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith // C++11 [dcl.init]p5: If T is a (possibly cv-qualified) union type, the 2869eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith // object's first non-static named data member is zero-initialized 2870eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith RecordDecl::field_iterator I = RD->field_begin(); 2871eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith if (I == RD->field_end()) { 2872eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith Result = APValue((const FieldDecl*)0); 2873eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith return true; 2874eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith } 2875eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith 2876eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith LValue Subobject = This; 2877eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith HandleLValueMember(Info, Subobject, *I); 2878eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith Result = APValue(*I); 2879eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith ImplicitValueInitExpr VIE((*I)->getType()); 2880eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith return EvaluateConstantExpression(Result.getUnionValue(), Info, 2881eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith Subobject, &VIE); 2882eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith } 2883eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith 2884eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith return HandleClassZeroInitialization(Info, RD, This, Result); 2885eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith} 2886eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith 288759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithbool RecordExprEvaluator::VisitCastExpr(const CastExpr *E) { 288859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith switch (E->getCastKind()) { 288959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith default: 289059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return ExprEvaluatorBaseTy::VisitCastExpr(E); 289159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 289259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith case CK_ConstructorConversion: 289359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return Visit(E->getSubExpr()); 289459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 289559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith case CK_DerivedToBase: 289659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith case CK_UncheckedDerivedToBase: { 289759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith CCValue DerivedObject; 2898f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!Evaluate(DerivedObject, Info, E->getSubExpr())) 289959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return false; 2900f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!DerivedObject.isStruct()) 2901f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E->getSubExpr()); 290259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 290359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith // Derived-to-base rvalue conversion: just slice off the derived part. 290459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith APValue *Value = &DerivedObject; 290559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith const CXXRecordDecl *RD = E->getSubExpr()->getType()->getAsCXXRecordDecl(); 290659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith for (CastExpr::path_const_iterator PathI = E->path_begin(), 290759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith PathE = E->path_end(); PathI != PathE; ++PathI) { 290859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith assert(!(*PathI)->isVirtual() && "record rvalue with virtual base"); 290959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith const CXXRecordDecl *Base = (*PathI)->getType()->getAsCXXRecordDecl(); 291059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith Value = &Value->getStructBase(getBaseIndex(RD, Base)); 291159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith RD = Base; 291259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } 291359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith Result = *Value; 291459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return true; 291559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } 291659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } 291759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 291859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 2919180f47959a066795cc0f409433023af448bb0328Richard Smithbool RecordExprEvaluator::VisitInitListExpr(const InitListExpr *E) { 2920180f47959a066795cc0f409433023af448bb0328Richard Smith const RecordDecl *RD = E->getType()->castAs<RecordType>()->getDecl(); 2921180f47959a066795cc0f409433023af448bb0328Richard Smith const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); 2922180f47959a066795cc0f409433023af448bb0328Richard Smith 2923180f47959a066795cc0f409433023af448bb0328Richard Smith if (RD->isUnion()) { 2924180f47959a066795cc0f409433023af448bb0328Richard Smith Result = APValue(E->getInitializedFieldInUnion()); 2925180f47959a066795cc0f409433023af448bb0328Richard Smith if (!E->getNumInits()) 2926180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 2927180f47959a066795cc0f409433023af448bb0328Richard Smith LValue Subobject = This; 2928180f47959a066795cc0f409433023af448bb0328Richard Smith HandleLValueMember(Info, Subobject, E->getInitializedFieldInUnion(), 2929180f47959a066795cc0f409433023af448bb0328Richard Smith &Layout); 2930180f47959a066795cc0f409433023af448bb0328Richard Smith return EvaluateConstantExpression(Result.getUnionValue(), Info, 2931180f47959a066795cc0f409433023af448bb0328Richard Smith Subobject, E->getInit(0)); 2932180f47959a066795cc0f409433023af448bb0328Richard Smith } 2933180f47959a066795cc0f409433023af448bb0328Richard Smith 2934180f47959a066795cc0f409433023af448bb0328Richard Smith assert((!isa<CXXRecordDecl>(RD) || !cast<CXXRecordDecl>(RD)->getNumBases()) && 2935180f47959a066795cc0f409433023af448bb0328Richard Smith "initializer list for class with base classes"); 2936180f47959a066795cc0f409433023af448bb0328Richard Smith Result = APValue(APValue::UninitStruct(), 0, 2937180f47959a066795cc0f409433023af448bb0328Richard Smith std::distance(RD->field_begin(), RD->field_end())); 2938180f47959a066795cc0f409433023af448bb0328Richard Smith unsigned ElementNo = 0; 2939180f47959a066795cc0f409433023af448bb0328Richard Smith for (RecordDecl::field_iterator Field = RD->field_begin(), 2940180f47959a066795cc0f409433023af448bb0328Richard Smith FieldEnd = RD->field_end(); Field != FieldEnd; ++Field) { 2941180f47959a066795cc0f409433023af448bb0328Richard Smith // Anonymous bit-fields are not considered members of the class for 2942180f47959a066795cc0f409433023af448bb0328Richard Smith // purposes of aggregate initialization. 2943180f47959a066795cc0f409433023af448bb0328Richard Smith if (Field->isUnnamedBitfield()) 2944180f47959a066795cc0f409433023af448bb0328Richard Smith continue; 2945180f47959a066795cc0f409433023af448bb0328Richard Smith 2946180f47959a066795cc0f409433023af448bb0328Richard Smith LValue Subobject = This; 2947180f47959a066795cc0f409433023af448bb0328Richard Smith HandleLValueMember(Info, Subobject, *Field, &Layout); 2948180f47959a066795cc0f409433023af448bb0328Richard Smith 2949180f47959a066795cc0f409433023af448bb0328Richard Smith if (ElementNo < E->getNumInits()) { 2950180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateConstantExpression( 2951180f47959a066795cc0f409433023af448bb0328Richard Smith Result.getStructField((*Field)->getFieldIndex()), 2952180f47959a066795cc0f409433023af448bb0328Richard Smith Info, Subobject, E->getInit(ElementNo++))) 2953180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 2954180f47959a066795cc0f409433023af448bb0328Richard Smith } else { 2955180f47959a066795cc0f409433023af448bb0328Richard Smith // Perform an implicit value-initialization for members beyond the end of 2956180f47959a066795cc0f409433023af448bb0328Richard Smith // the initializer list. 2957180f47959a066795cc0f409433023af448bb0328Richard Smith ImplicitValueInitExpr VIE(Field->getType()); 2958180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateConstantExpression( 2959180f47959a066795cc0f409433023af448bb0328Richard Smith Result.getStructField((*Field)->getFieldIndex()), 2960180f47959a066795cc0f409433023af448bb0328Richard Smith Info, Subobject, &VIE)) 2961180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 2962180f47959a066795cc0f409433023af448bb0328Richard Smith } 2963180f47959a066795cc0f409433023af448bb0328Richard Smith } 2964180f47959a066795cc0f409433023af448bb0328Richard Smith 2965180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 2966180f47959a066795cc0f409433023af448bb0328Richard Smith} 2967180f47959a066795cc0f409433023af448bb0328Richard Smith 2968180f47959a066795cc0f409433023af448bb0328Richard Smithbool RecordExprEvaluator::VisitCXXConstructExpr(const CXXConstructExpr *E) { 2969180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXConstructorDecl *FD = E->getConstructor(); 2970eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith bool ZeroInit = E->requiresZeroInitialization(); 2971eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith if (CheckTrivialDefaultConstructor(Info, E->getExprLoc(), FD, ZeroInit)) { 2972eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith if (ZeroInit) 2973eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith return ZeroInitialization(E); 2974eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith 29756180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith const CXXRecordDecl *RD = FD->getParent(); 29766180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith if (RD->isUnion()) 29776180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith Result = APValue((FieldDecl*)0); 29786180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith else 29796180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith Result = APValue(APValue::UninitStruct(), RD->getNumBases(), 29806180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith std::distance(RD->field_begin(), RD->field_end())); 29816180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith return true; 29826180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith } 29836180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith 2984180f47959a066795cc0f409433023af448bb0328Richard Smith const FunctionDecl *Definition = 0; 2985180f47959a066795cc0f409433023af448bb0328Richard Smith FD->getBody(Definition); 2986180f47959a066795cc0f409433023af448bb0328Richard Smith 2987c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith if (!CheckConstexprFunction(Info, E->getExprLoc(), FD, Definition)) 2988c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return false; 2989180f47959a066795cc0f409433023af448bb0328Richard Smith 2990180f47959a066795cc0f409433023af448bb0328Richard Smith // FIXME: Elide the copy/move construction wherever we can. 2991eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith if (E->isElidable() && !ZeroInit) 2992180f47959a066795cc0f409433023af448bb0328Richard Smith if (const MaterializeTemporaryExpr *ME 2993180f47959a066795cc0f409433023af448bb0328Richard Smith = dyn_cast<MaterializeTemporaryExpr>(E->getArg(0))) 2994180f47959a066795cc0f409433023af448bb0328Richard Smith return Visit(ME->GetTemporaryExpr()); 2995180f47959a066795cc0f409433023af448bb0328Richard Smith 2996eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith if (ZeroInit && !ZeroInitialization(E)) 2997eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith return false; 2998eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith 2999180f47959a066795cc0f409433023af448bb0328Richard Smith llvm::ArrayRef<const Expr*> Args(E->getArgs(), E->getNumArgs()); 3000f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return HandleConstructorCall(E, This, Args, 3001f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith cast<CXXConstructorDecl>(Definition), Info, 3002f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith Result); 3003180f47959a066795cc0f409433023af448bb0328Richard Smith} 3004180f47959a066795cc0f409433023af448bb0328Richard Smith 3005180f47959a066795cc0f409433023af448bb0328Richard Smithstatic bool EvaluateRecord(const Expr *E, const LValue &This, 3006180f47959a066795cc0f409433023af448bb0328Richard Smith APValue &Result, EvalInfo &Info) { 3007180f47959a066795cc0f409433023af448bb0328Richard Smith assert(E->isRValue() && E->getType()->isRecordType() && 3008180f47959a066795cc0f409433023af448bb0328Richard Smith "can't evaluate expression as a record rvalue"); 3009180f47959a066795cc0f409433023af448bb0328Richard Smith return RecordExprEvaluator(Info, This, Result).Visit(E); 3010180f47959a066795cc0f409433023af448bb0328Richard Smith} 3011180f47959a066795cc0f409433023af448bb0328Richard Smith 3012180f47959a066795cc0f409433023af448bb0328Richard Smith//===----------------------------------------------------------------------===// 3013e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith// Temporary Evaluation 3014e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith// 3015e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith// Temporaries are represented in the AST as rvalues, but generally behave like 3016e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith// lvalues. The full-object of which the temporary is a subobject is implicitly 3017e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith// materialized so that a reference can bind to it. 3018e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith//===----------------------------------------------------------------------===// 3019e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithnamespace { 3020e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithclass TemporaryExprEvaluator 3021e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith : public LValueExprEvaluatorBase<TemporaryExprEvaluator> { 3022e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithpublic: 3023e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith TemporaryExprEvaluator(EvalInfo &Info, LValue &Result) : 3024e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LValueExprEvaluatorBaseTy(Info, Result) {} 3025e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 3026e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// Visit an expression which constructs the value of this temporary. 3027e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool VisitConstructExpr(const Expr *E) { 3028e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Result.set(E, Info.CurrentCall); 3029e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return EvaluateConstantExpression(Info.CurrentCall->Temporaries[E], Info, 3030e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Result, E); 3031e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 3032e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 3033e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool VisitCastExpr(const CastExpr *E) { 3034e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith switch (E->getCastKind()) { 3035e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith default: 3036e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return LValueExprEvaluatorBaseTy::VisitCastExpr(E); 3037e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 3038e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case CK_ConstructorConversion: 3039e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return VisitConstructExpr(E->getSubExpr()); 3040e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 3041e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 3042e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool VisitInitListExpr(const InitListExpr *E) { 3043e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return VisitConstructExpr(E); 3044e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 3045e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool VisitCXXConstructExpr(const CXXConstructExpr *E) { 3046e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return VisitConstructExpr(E); 3047e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 3048e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool VisitCallExpr(const CallExpr *E) { 3049e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return VisitConstructExpr(E); 3050e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 3051e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith}; 3052e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} // end anonymous namespace 3053e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 3054e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// Evaluate an expression of record type as a temporary. 3055e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstatic bool EvaluateTemporary(const Expr *E, LValue &Result, EvalInfo &Info) { 3056af2c7a194592401394233b7cbcdd3cfd0a7a38ddRichard Smith assert(E->isRValue() && E->getType()->isRecordType()); 3057e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return TemporaryExprEvaluator(Info, Result).Visit(E); 3058e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 3059e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 3060e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith//===----------------------------------------------------------------------===// 306159b5da6d853b4368b984700315adf7b37de05764Nate Begeman// Vector Evaluation 306259b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===// 306359b5da6d853b4368b984700315adf7b37de05764Nate Begeman 306459b5da6d853b4368b984700315adf7b37de05764Nate Begemannamespace { 3065770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramer class VectorExprEvaluator 306607fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith : public ExprEvaluatorBase<VectorExprEvaluator, bool> { 306707fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith APValue &Result; 306859b5da6d853b4368b984700315adf7b37de05764Nate Begeman public: 30691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 307007fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith VectorExprEvaluator(EvalInfo &info, APValue &Result) 307107fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith : ExprEvaluatorBaseTy(info), Result(Result) {} 30721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 307307fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith bool Success(const ArrayRef<APValue> &V, const Expr *E) { 307407fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith assert(V.size() == E->getType()->castAs<VectorType>()->getNumElements()); 307507fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith // FIXME: remove this APValue copy. 307607fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith Result = APValue(V.data(), V.size()); 307707fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return true; 307807fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith } 307969c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith bool Success(const CCValue &V, const Expr *E) { 308069c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith assert(V.isVector()); 308107fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith Result = V; 308207fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return true; 308307fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith } 3084eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith bool ZeroInitialization(const Expr *E); 30851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 308607fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith bool VisitUnaryReal(const UnaryOperator *E) 308791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman { return Visit(E->getSubExpr()); } 308807fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith bool VisitCastExpr(const CastExpr* E); 308907fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith bool VisitInitListExpr(const InitListExpr *E); 309007fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith bool VisitUnaryImag(const UnaryOperator *E); 309191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // FIXME: Missing: unary -, unary ~, binary add/sub/mul/div, 30922217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman // binary comparisons, binary and/or/xor, 309391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // shufflevector, ExtVectorElementExpr 309491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // (Note that these require implementing conversions 309591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // between vector types.) 309659b5da6d853b4368b984700315adf7b37de05764Nate Begeman }; 309759b5da6d853b4368b984700315adf7b37de05764Nate Begeman} // end anonymous namespace 309859b5da6d853b4368b984700315adf7b37de05764Nate Begeman 309959b5da6d853b4368b984700315adf7b37de05764Nate Begemanstatic bool EvaluateVector(const Expr* E, APValue& Result, EvalInfo &Info) { 3100c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith assert(E->isRValue() && E->getType()->isVectorType() &&"not a vector rvalue"); 310107fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return VectorExprEvaluator(Info, Result).Visit(E); 310259b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 310359b5da6d853b4368b984700315adf7b37de05764Nate Begeman 310407fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smithbool VectorExprEvaluator::VisitCastExpr(const CastExpr* E) { 310507fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith const VectorType *VTy = E->getType()->castAs<VectorType>(); 3106c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman unsigned NElts = VTy->getNumElements(); 31071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3108d62ca370b03b8c6ad58002d3399383baf744e32bRichard Smith const Expr *SE = E->getSubExpr(); 3109e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman QualType SETy = SE->getType(); 311059b5da6d853b4368b984700315adf7b37de05764Nate Begeman 311146a523285928aa07bf14803178dc04616ac85994Eli Friedman switch (E->getCastKind()) { 311246a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_VectorSplat: { 311307fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith APValue Val = APValue(); 311446a523285928aa07bf14803178dc04616ac85994Eli Friedman if (SETy->isIntegerType()) { 311546a523285928aa07bf14803178dc04616ac85994Eli Friedman APSInt IntResult; 311646a523285928aa07bf14803178dc04616ac85994Eli Friedman if (!EvaluateInteger(SE, IntResult, Info)) 3117f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 311807fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith Val = APValue(IntResult); 311946a523285928aa07bf14803178dc04616ac85994Eli Friedman } else if (SETy->isRealFloatingType()) { 312046a523285928aa07bf14803178dc04616ac85994Eli Friedman APFloat F(0.0); 312146a523285928aa07bf14803178dc04616ac85994Eli Friedman if (!EvaluateFloat(SE, F, Info)) 3122f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 312307fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith Val = APValue(F); 312446a523285928aa07bf14803178dc04616ac85994Eli Friedman } else { 312507fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return Error(E); 312646a523285928aa07bf14803178dc04616ac85994Eli Friedman } 3127c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman 3128c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman // Splat and create vector APValue. 312907fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith SmallVector<APValue, 4> Elts(NElts, Val); 313007fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return Success(Elts, E); 3131e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman } 3132e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman case CK_BitCast: { 3133e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman // Evaluate the operand into an APInt we can extract from. 3134e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman llvm::APInt SValInt; 3135e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman if (!EvalAndBitcastToAPInt(Info, SE, SValInt)) 3136e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman return false; 3137e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman // Extract the elements 3138e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman QualType EltTy = VTy->getElementType(); 3139e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman unsigned EltSize = Info.Ctx.getTypeSize(EltTy); 3140e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman bool BigEndian = Info.Ctx.getTargetInfo().isBigEndian(); 3141e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman SmallVector<APValue, 4> Elts; 3142e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman if (EltTy->isRealFloatingType()) { 3143e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman const llvm::fltSemantics &Sem = Info.Ctx.getFloatTypeSemantics(EltTy); 3144e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman bool isIEESem = &Sem != &APFloat::PPCDoubleDouble; 3145e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman unsigned FloatEltSize = EltSize; 3146e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman if (&Sem == &APFloat::x87DoubleExtended) 3147e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman FloatEltSize = 80; 3148e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman for (unsigned i = 0; i < NElts; i++) { 3149e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman llvm::APInt Elt; 3150e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman if (BigEndian) 3151e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman Elt = SValInt.rotl(i*EltSize+FloatEltSize).trunc(FloatEltSize); 3152e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman else 3153e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman Elt = SValInt.rotr(i*EltSize).trunc(FloatEltSize); 3154e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman Elts.push_back(APValue(APFloat(Elt, isIEESem))); 3155e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman } 3156e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman } else if (EltTy->isIntegerType()) { 3157e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman for (unsigned i = 0; i < NElts; i++) { 3158e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman llvm::APInt Elt; 3159e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman if (BigEndian) 3160e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman Elt = SValInt.rotl(i*EltSize+EltSize).zextOrTrunc(EltSize); 3161e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman else 3162e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman Elt = SValInt.rotr(i*EltSize).zextOrTrunc(EltSize); 3163e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman Elts.push_back(APValue(APSInt(Elt, EltTy->isSignedIntegerType()))); 3164e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman } 3165e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman } else { 3166e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman return Error(E); 3167e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman } 3168e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman return Success(Elts, E); 3169e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman } 317046a523285928aa07bf14803178dc04616ac85994Eli Friedman default: 3171c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return ExprEvaluatorBaseTy::VisitCastExpr(E); 3172c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman } 317359b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 317459b5da6d853b4368b984700315adf7b37de05764Nate Begeman 317507fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smithbool 317659b5da6d853b4368b984700315adf7b37de05764Nate BegemanVectorExprEvaluator::VisitInitListExpr(const InitListExpr *E) { 317707fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith const VectorType *VT = E->getType()->castAs<VectorType>(); 317859b5da6d853b4368b984700315adf7b37de05764Nate Begeman unsigned NumInits = E->getNumInits(); 317991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman unsigned NumElements = VT->getNumElements(); 31801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 318159b5da6d853b4368b984700315adf7b37de05764Nate Begeman QualType EltTy = VT->getElementType(); 31825f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<APValue, 4> Elements; 318359b5da6d853b4368b984700315adf7b37de05764Nate Begeman 3184a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall // If a vector is initialized with a single element, that value 3185a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall // becomes every element of the vector, not just the first. 3186a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall // This is the behavior described in the IBM AltiVec documentation. 3187a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall if (NumInits == 1) { 318807fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith 318907fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith // Handle the case where the vector is initialized by another 3190b92ae0e31126e5630d7022f2d6abe7eed2e17746Tanya Lattner // vector (OpenCL 6.1.6). 3191b92ae0e31126e5630d7022f2d6abe7eed2e17746Tanya Lattner if (E->getInit(0)->getType()->isVectorType()) 319207fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return Visit(E->getInit(0)); 319307fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith 3194a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall APValue InitValue; 319559b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (EltTy->isIntegerType()) { 319659b5da6d853b4368b984700315adf7b37de05764Nate Begeman llvm::APSInt sInt(32); 3197a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall if (!EvaluateInteger(E->getInit(0), sInt, Info)) 3198f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 3199a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall InitValue = APValue(sInt); 320059b5da6d853b4368b984700315adf7b37de05764Nate Begeman } else { 320159b5da6d853b4368b984700315adf7b37de05764Nate Begeman llvm::APFloat f(0.0); 3202a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall if (!EvaluateFloat(E->getInit(0), f, Info)) 3203f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 3204a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall InitValue = APValue(f); 3205a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall } 3206a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall for (unsigned i = 0; i < NumElements; i++) { 3207a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall Elements.push_back(InitValue); 3208a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall } 3209a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall } else { 3210a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall for (unsigned i = 0; i < NumElements; i++) { 3211a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall if (EltTy->isIntegerType()) { 3212a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall llvm::APSInt sInt(32); 3213a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall if (i < NumInits) { 3214a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall if (!EvaluateInteger(E->getInit(i), sInt, Info)) 3215f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 3216a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall } else { 3217a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall sInt = Info.Ctx.MakeIntValue(0, EltTy); 3218a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall } 3219a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall Elements.push_back(APValue(sInt)); 322091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman } else { 3221a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall llvm::APFloat f(0.0); 3222a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall if (i < NumInits) { 3223a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall if (!EvaluateFloat(E->getInit(i), f, Info)) 3224f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 3225a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall } else { 3226a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall f = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy)); 3227a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall } 3228a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall Elements.push_back(APValue(f)); 322991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman } 323059b5da6d853b4368b984700315adf7b37de05764Nate Begeman } 323159b5da6d853b4368b984700315adf7b37de05764Nate Begeman } 323207fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return Success(Elements, E); 323359b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 323459b5da6d853b4368b984700315adf7b37de05764Nate Begeman 323507fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smithbool 3236eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard SmithVectorExprEvaluator::ZeroInitialization(const Expr *E) { 323707fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith const VectorType *VT = E->getType()->getAs<VectorType>(); 323891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman QualType EltTy = VT->getElementType(); 323991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue ZeroElement; 324091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (EltTy->isIntegerType()) 324191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman ZeroElement = APValue(Info.Ctx.MakeIntValue(0, EltTy)); 324291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman else 324391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman ZeroElement = 324491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue(APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy))); 324591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 32465f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<APValue, 4> Elements(VT->getNumElements(), ZeroElement); 324707fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return Success(Elements, E); 324891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman} 324991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 325007fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smithbool VectorExprEvaluator::VisitUnaryImag(const UnaryOperator *E) { 32518327fad71da34492d82c532f42a58cb4baff81a3Richard Smith VisitIgnoredValue(E->getSubExpr()); 3252eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith return ZeroInitialization(E); 325391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman} 325491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 325559b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===// 3256cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith// Array Evaluation 3257cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith//===----------------------------------------------------------------------===// 3258cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 3259cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smithnamespace { 3260cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith class ArrayExprEvaluator 3261cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith : public ExprEvaluatorBase<ArrayExprEvaluator, bool> { 3262180f47959a066795cc0f409433023af448bb0328Richard Smith const LValue &This; 3263cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith APValue &Result; 3264cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith public: 3265cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 3266180f47959a066795cc0f409433023af448bb0328Richard Smith ArrayExprEvaluator(EvalInfo &Info, const LValue &This, APValue &Result) 3267180f47959a066795cc0f409433023af448bb0328Richard Smith : ExprEvaluatorBaseTy(Info), This(This), Result(Result) {} 3268cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 3269cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith bool Success(const APValue &V, const Expr *E) { 3270cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith assert(V.isArray() && "Expected array type"); 3271cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith Result = V; 3272cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return true; 3273cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith } 3274cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 3275eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith bool ZeroInitialization(const Expr *E) { 3276180f47959a066795cc0f409433023af448bb0328Richard Smith const ConstantArrayType *CAT = 3277180f47959a066795cc0f409433023af448bb0328Richard Smith Info.Ctx.getAsConstantArrayType(E->getType()); 3278180f47959a066795cc0f409433023af448bb0328Richard Smith if (!CAT) 3279f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 3280180f47959a066795cc0f409433023af448bb0328Richard Smith 3281180f47959a066795cc0f409433023af448bb0328Richard Smith Result = APValue(APValue::UninitArray(), 0, 3282180f47959a066795cc0f409433023af448bb0328Richard Smith CAT->getSize().getZExtValue()); 3283180f47959a066795cc0f409433023af448bb0328Richard Smith if (!Result.hasArrayFiller()) return true; 3284180f47959a066795cc0f409433023af448bb0328Richard Smith 3285eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith // Zero-initialize all elements. 3286180f47959a066795cc0f409433023af448bb0328Richard Smith LValue Subobject = This; 3287180f47959a066795cc0f409433023af448bb0328Richard Smith Subobject.Designator.addIndex(0); 3288180f47959a066795cc0f409433023af448bb0328Richard Smith ImplicitValueInitExpr VIE(CAT->getElementType()); 3289180f47959a066795cc0f409433023af448bb0328Richard Smith return EvaluateConstantExpression(Result.getArrayFiller(), Info, 3290180f47959a066795cc0f409433023af448bb0328Richard Smith Subobject, &VIE); 3291180f47959a066795cc0f409433023af448bb0328Richard Smith } 3292180f47959a066795cc0f409433023af448bb0328Richard Smith 3293cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith bool VisitInitListExpr(const InitListExpr *E); 3294e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool VisitCXXConstructExpr(const CXXConstructExpr *E); 3295cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith }; 3296cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith} // end anonymous namespace 3297cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 3298180f47959a066795cc0f409433023af448bb0328Richard Smithstatic bool EvaluateArray(const Expr *E, const LValue &This, 3299180f47959a066795cc0f409433023af448bb0328Richard Smith APValue &Result, EvalInfo &Info) { 3300eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith assert(E->isRValue() && E->getType()->isArrayType() && "not an array rvalue"); 3301180f47959a066795cc0f409433023af448bb0328Richard Smith return ArrayExprEvaluator(Info, This, Result).Visit(E); 3302cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith} 3303cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 3304cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smithbool ArrayExprEvaluator::VisitInitListExpr(const InitListExpr *E) { 3305cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType(E->getType()); 3306cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith if (!CAT) 3307f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 3308cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 3309974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith // C++11 [dcl.init.string]p1: A char array [...] can be initialized by [...] 3310974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith // an appropriately-typed string literal enclosed in braces. 3311974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith if (E->getNumInits() == 1 && CAT->getElementType()->isAnyCharacterType() && 3312974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith Info.Ctx.hasSameUnqualifiedType(E->getType(), E->getInit(0)->getType())) { 3313974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith LValue LV; 3314974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith if (!EvaluateLValue(E->getInit(0), LV, Info)) 3315974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith return false; 3316974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith uint64_t NumElements = CAT->getSize().getZExtValue(); 3317974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith Result = APValue(APValue::UninitArray(), NumElements, NumElements); 3318974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith 3319974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith // Copy the string literal into the array. FIXME: Do this better. 3320974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith LV.Designator.addIndex(0); 3321974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith for (uint64_t I = 0; I < NumElements; ++I) { 3322974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith CCValue Char; 3323974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith if (!HandleLValueToRValueConversion(Info, E->getInit(0), 3324974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith CAT->getElementType(), LV, Char)) 3325974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith return false; 3326974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith if (!CheckConstantExpression(Info, E->getInit(0), Char, 3327974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith Result.getArrayInitializedElt(I))) 3328974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith return false; 3329974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith if (!HandleLValueArrayAdjustment(Info, LV, CAT->getElementType(), 1)) 3330974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith return false; 3331974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith } 3332974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith return true; 3333974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith } 3334974c5f93d0ce4f0699a6f0a4402f6b367da495e3Richard Smith 3335cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith Result = APValue(APValue::UninitArray(), E->getNumInits(), 3336cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith CAT->getSize().getZExtValue()); 3337180f47959a066795cc0f409433023af448bb0328Richard Smith LValue Subobject = This; 3338180f47959a066795cc0f409433023af448bb0328Richard Smith Subobject.Designator.addIndex(0); 3339180f47959a066795cc0f409433023af448bb0328Richard Smith unsigned Index = 0; 3340cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith for (InitListExpr::const_iterator I = E->begin(), End = E->end(); 3341180f47959a066795cc0f409433023af448bb0328Richard Smith I != End; ++I, ++Index) { 3342180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateConstantExpression(Result.getArrayInitializedElt(Index), 3343180f47959a066795cc0f409433023af448bb0328Richard Smith Info, Subobject, cast<Expr>(*I))) 3344180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 3345180f47959a066795cc0f409433023af448bb0328Richard Smith if (!HandleLValueArrayAdjustment(Info, Subobject, CAT->getElementType(), 1)) 3346cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return false; 3347180f47959a066795cc0f409433023af448bb0328Richard Smith } 3348cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 3349cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith if (!Result.hasArrayFiller()) return true; 3350cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith assert(E->hasArrayFiller() && "no array filler for incomplete init list"); 3351180f47959a066795cc0f409433023af448bb0328Richard Smith // FIXME: The Subobject here isn't necessarily right. This rarely matters, 3352180f47959a066795cc0f409433023af448bb0328Richard Smith // but sometimes does: 3353180f47959a066795cc0f409433023af448bb0328Richard Smith // struct S { constexpr S() : p(&p) {} void *p; }; 3354180f47959a066795cc0f409433023af448bb0328Richard Smith // S s[10] = {}; 3355cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return EvaluateConstantExpression(Result.getArrayFiller(), Info, 3356180f47959a066795cc0f409433023af448bb0328Richard Smith Subobject, E->getArrayFiller()); 3357cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith} 3358cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 3359e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithbool ArrayExprEvaluator::VisitCXXConstructExpr(const CXXConstructExpr *E) { 3360e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType(E->getType()); 3361e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!CAT) 3362f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 3363e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 3364e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Result = APValue(APValue::UninitArray(), 0, CAT->getSize().getZExtValue()); 3365e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!Result.hasArrayFiller()) 3366e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 3367e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 3368e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXConstructorDecl *FD = E->getConstructor(); 33696180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith 3370eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith bool ZeroInit = E->requiresZeroInitialization(); 3371eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith if (CheckTrivialDefaultConstructor(Info, E->getExprLoc(), FD, ZeroInit)) { 3372eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith if (ZeroInit) { 3373eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith LValue Subobject = This; 3374eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith Subobject.Designator.addIndex(0); 3375eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith ImplicitValueInitExpr VIE(CAT->getElementType()); 3376eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith return EvaluateConstantExpression(Result.getArrayFiller(), Info, 3377eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith Subobject, &VIE); 3378eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith } 3379eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith 33806180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith const CXXRecordDecl *RD = FD->getParent(); 33816180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith if (RD->isUnion()) 33826180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith Result.getArrayFiller() = APValue((FieldDecl*)0); 33836180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith else 33846180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith Result.getArrayFiller() = 33856180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith APValue(APValue::UninitStruct(), RD->getNumBases(), 33866180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith std::distance(RD->field_begin(), RD->field_end())); 33876180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith return true; 33886180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith } 33896180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith 3390e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const FunctionDecl *Definition = 0; 3391e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith FD->getBody(Definition); 3392e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 3393c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith if (!CheckConstexprFunction(Info, E->getExprLoc(), FD, Definition)) 3394c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return false; 3395e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 3396e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // FIXME: The Subobject here isn't necessarily right. This rarely matters, 3397e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // but sometimes does: 3398e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // struct S { constexpr S() : p(&p) {} void *p; }; 3399e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // S s[10]; 3400e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LValue Subobject = This; 3401e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Subobject.Designator.addIndex(0); 3402eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith 3403eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith if (ZeroInit) { 3404eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith ImplicitValueInitExpr VIE(CAT->getElementType()); 3405eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith if (!EvaluateConstantExpression(Result.getArrayFiller(), Info, Subobject, 3406eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith &VIE)) 3407eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith return false; 3408eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith } 3409eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith 3410e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith llvm::ArrayRef<const Expr*> Args(E->getArgs(), E->getNumArgs()); 3411f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return HandleConstructorCall(E, Subobject, Args, 3412e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith cast<CXXConstructorDecl>(Definition), 3413e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Info, Result.getArrayFiller()); 3414e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 3415e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 3416cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith//===----------------------------------------------------------------------===// 3417f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Integer Evaluation 3418c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// 3419c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// As a GNU extension, we support casting pointers to sufficiently-wide integer 3420c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// types and back in constant folding. Integer values are thus represented 3421c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// either as an integer-valued APValue, or as an lvalue-valued APValue. 3422f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 3423f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 3424f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnernamespace { 3425770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass IntExprEvaluator 34268cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : public ExprEvaluatorBase<IntExprEvaluator, bool> { 342747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue &Result; 3428f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerpublic: 342947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith IntExprEvaluator(EvalInfo &info, CCValue &result) 34308cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : ExprEvaluatorBaseTy(info), Result(result) {} 3431f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 3432973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara bool Success(const llvm::APSInt &SI, const Expr *E) { 3433973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara assert(E->getType()->isIntegralOrEnumerationType() && 34342ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor "Invalid evaluation result."); 3435973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara assert(SI.isSigned() == E->getType()->isSignedIntegerOrEnumerationType() && 34363f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar "Invalid evaluation result."); 3437973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara assert(SI.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) && 34383f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar "Invalid evaluation result."); 343947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Result = CCValue(SI); 34403f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return true; 34413f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar } 34423f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar 3443131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar bool Success(const llvm::APInt &I, const Expr *E) { 34442ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor assert(E->getType()->isIntegralOrEnumerationType() && 34452ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor "Invalid evaluation result."); 344630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar assert(I.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) && 34473f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar "Invalid evaluation result."); 344847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Result = CCValue(APSInt(I)); 3449575a1c9dc8dc5b4977194993e289f9eda7295c39Douglas Gregor Result.getInt().setIsUnsigned( 3450575a1c9dc8dc5b4977194993e289f9eda7295c39Douglas Gregor E->getType()->isUnsignedIntegerOrEnumerationType()); 3451131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return true; 3452131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 3453131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar 3454131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar bool Success(uint64_t Value, const Expr *E) { 34552ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor assert(E->getType()->isIntegralOrEnumerationType() && 34562ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor "Invalid evaluation result."); 345747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Result = CCValue(Info.Ctx.MakeIntValue(Value, E->getType())); 3458131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return true; 3459131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 3460131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar 34614f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck bool Success(CharUnits Size, const Expr *E) { 34624f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck return Success(Size.getQuantity(), E); 34634f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck } 34644f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck 346547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith bool Success(const CCValue &V, const Expr *E) { 3466342f1f8b0a402c5a7f8c5055db7f60a7808f1687Richard Smith if (V.isLValue()) { 3467342f1f8b0a402c5a7f8c5055db7f60a7808f1687Richard Smith Result = V; 3468342f1f8b0a402c5a7f8c5055db7f60a7808f1687Richard Smith return true; 3469342f1f8b0a402c5a7f8c5055db7f60a7808f1687Richard Smith } 34708cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return Success(V.getInt(), E); 347132fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner } 34721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3473eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith bool ZeroInitialization(const Expr *E) { return Success(0, E); } 3474f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith 34758cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne //===--------------------------------------------------------------------===// 34768cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne // Visitor Methods 34778cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne //===--------------------------------------------------------------------===// 3478f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 34794c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitIntegerLiteral(const IntegerLiteral *E) { 3480131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(E->getValue(), E); 34814c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 34824c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitCharacterLiteral(const CharacterLiteral *E) { 3483131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(E->getValue(), E); 34844c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 3485043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman 3486043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman bool CheckReferencedDecl(const Expr *E, const Decl *D); 3487043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman bool VisitDeclRefExpr(const DeclRefExpr *E) { 34888cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne if (CheckReferencedDecl(E, E->getDecl())) 34898cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return true; 34908cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 34918cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return ExprEvaluatorBaseTy::VisitDeclRefExpr(E); 3492043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman } 3493043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman bool VisitMemberExpr(const MemberExpr *E) { 3494043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman if (CheckReferencedDecl(E, E->getMemberDecl())) { 3495c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith VisitIgnoredValue(E->getBase()); 3496043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman return true; 3497043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman } 34988cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 34998cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return ExprEvaluatorBaseTy::VisitMemberExpr(E); 3500043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman } 3501043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman 35028cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCallExpr(const CallExpr *E); 3503b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner bool VisitBinaryOperator(const BinaryOperator *E); 35048ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor bool VisitOffsetOfExpr(const OffsetOfExpr *E); 3505b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner bool VisitUnaryOperator(const UnaryOperator *E); 3506f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 35078cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCastExpr(const CastExpr* E); 3508f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne bool VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *E); 35090518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl 35103068d117951a8df54bae9db039b56201ab10962bAnders Carlsson bool VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) { 3511131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(E->getValue(), E); 35123068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 35131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3514f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith // Note, GNU defines __null as an integer, not a pointer. 35153f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson bool VisitGNUNullExpr(const GNUNullExpr *E) { 3516eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith return ZeroInitialization(E); 3517664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman } 3518664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman 351964b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl bool VisitUnaryTypeTraitExpr(const UnaryTypeTraitExpr *E) { 35200dfd848fa4c9664852ba8c929a8bd3fce93ddca2Sebastian Redl return Success(E->getValue(), E); 352164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl } 352264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl 35236ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet bool VisitBinaryTypeTraitExpr(const BinaryTypeTraitExpr *E) { 35246ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet return Success(E->getValue(), E); 35256ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet } 35266ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet 352721ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley bool VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *E) { 352821ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley return Success(E->getValue(), E); 352921ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley } 353021ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 3531552622067dc45013d240f73952fece703f5e63bdJohn Wiegley bool VisitExpressionTraitExpr(const ExpressionTraitExpr *E) { 3532552622067dc45013d240f73952fece703f5e63bdJohn Wiegley return Success(E->getValue(), E); 3533552622067dc45013d240f73952fece703f5e63bdJohn Wiegley } 3534552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 3535722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman bool VisitUnaryReal(const UnaryOperator *E); 3536664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman bool VisitUnaryImag(const UnaryOperator *E); 3537664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman 3538295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl bool VisitCXXNoexceptExpr(const CXXNoexceptExpr *E); 3539ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor bool VisitSizeOfPackExpr(const SizeOfPackExpr *E); 3540cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl 3541fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattnerprivate: 35428b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck CharUnits GetAlignOfExpr(const Expr *E); 35438b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck CharUnits GetAlignOfType(QualType T); 35441bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith static QualType GetObjectType(APValue::LValueBase B); 35458cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool TryEvaluateBuiltinObjectSize(const CallExpr *E); 3546664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman // FIXME: Missing: array subscript of vector, member of vector 3547f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner}; 3548f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace 3549f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 3550c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// EvaluateIntegerOrLValue - Evaluate an rvalue integral-typed expression, and 3551c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// produce either the integer value or a pointer. 3552c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// 3553c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// GCC has a heinous extension which folds casts between pointer types and 3554c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// pointer-sized integral types. We support this by allowing the evaluation of 3555c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// an integer rvalue to produce a pointer (represented as an lvalue) instead. 3556c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// Some simple arithmetic on such values is supported (they are treated much 3557c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// like char*). 3558f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithstatic bool EvaluateIntegerOrLValue(const Expr *E, CCValue &Result, 355947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith EvalInfo &Info) { 3560c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith assert(E->isRValue() && E->getType()->isIntegralOrEnumerationType()); 35618cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return IntExprEvaluator(Info, Result).Visit(E); 356269ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar} 356369ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar 3564f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithstatic bool EvaluateInteger(const Expr *E, APSInt &Result, EvalInfo &Info) { 356547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue Val; 3566f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!EvaluateIntegerOrLValue(E, Val, Info)) 3567f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 3568f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!Val.isInt()) { 3569f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // FIXME: It would be better to produce the diagnostic for casting 3570f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // a pointer to an integer. 3571dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(E->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 357230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return false; 3573f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 357430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result = Val.getInt(); 357530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return true; 3576f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} 3577f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 3578f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith/// Check whether the given declaration can be directly converted to an integral 3579f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith/// rvalue. If not, no diagnostic is produced; there are other things we can 3580f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith/// try. 3581043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedmanbool IntExprEvaluator::CheckReferencedDecl(const Expr* E, const Decl* D) { 35824c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // Enums are integer constant exprs. 3583bfbdcd861a4364bfc21a9e5047bdbd56812d6693Abramo Bagnara if (const EnumConstantDecl *ECD = dyn_cast<EnumConstantDecl>(D)) { 3584973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara // Check for signedness/width mismatches between E type and ECD value. 3585973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara bool SameSign = (ECD->getInitVal().isSigned() 3586973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara == E->getType()->isSignedIntegerOrEnumerationType()); 3587973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara bool SameWidth = (ECD->getInitVal().getBitWidth() 3588973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara == Info.Ctx.getIntWidth(E->getType())); 3589973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara if (SameSign && SameWidth) 3590973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara return Success(ECD->getInitVal(), E); 3591973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara else { 3592973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara // Get rid of mismatch (otherwise Success assertions will fail) 3593973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara // by computing a new value matching the type of E. 3594973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara llvm::APSInt Val = ECD->getInitVal(); 3595973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara if (!SameSign) 3596973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara Val.setIsSigned(!ECD->getInitVal().isSigned()); 3597973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara if (!SameWidth) 3598973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara Val = Val.extOrTrunc(Info.Ctx.getIntWidth(E->getType())); 3599973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara return Success(Val, E); 3600973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara } 3601bfbdcd861a4364bfc21a9e5047bdbd56812d6693Abramo Bagnara } 36028cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return false; 36034c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner} 36044c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner 3605a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way 3606a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// as GCC. 3607a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattnerstatic int EvaluateBuiltinClassifyType(const CallExpr *E) { 3608a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // The following enum mimics the values returned by GCC. 36097c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // FIXME: Does GCC differ between lvalue and rvalue references here? 3610a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner enum gcc_type_class { 3611a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner no_type_class = -1, 3612a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner void_type_class, integer_type_class, char_type_class, 3613a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner enumeral_type_class, boolean_type_class, 3614a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner pointer_type_class, reference_type_class, offset_type_class, 3615a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner real_type_class, complex_type_class, 3616a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner function_type_class, method_type_class, 3617a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner record_type_class, union_type_class, 3618a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner array_type_class, string_type_class, 3619a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner lang_type_class 3620a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner }; 36211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If no argument was supplied, default to "no_type_class". This isn't 3623a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // ideal, however it is what gcc does. 3624a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner if (E->getNumArgs() == 0) 3625a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return no_type_class; 36261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3627a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner QualType ArgTy = E->getArg(0)->getType(); 3628a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner if (ArgTy->isVoidType()) 3629a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return void_type_class; 3630a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isEnumeralType()) 3631a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return enumeral_type_class; 3632a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isBooleanType()) 3633a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return boolean_type_class; 3634a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isCharType()) 3635a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return string_type_class; // gcc doesn't appear to use char_type_class 3636a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isIntegerType()) 3637a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return integer_type_class; 3638a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isPointerType()) 3639a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return pointer_type_class; 3640a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isReferenceType()) 3641a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return reference_type_class; 3642a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isRealType()) 3643a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return real_type_class; 3644a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isComplexType()) 3645a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return complex_type_class; 3646a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isFunctionType()) 3647a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return function_type_class; 3648fb87b89fc9eb103e19fb8e4b925c23f0bd091b99Douglas Gregor else if (ArgTy->isStructureOrClassType()) 3649a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return record_type_class; 3650a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isUnionType()) 3651a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return union_type_class; 3652a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isArrayType()) 3653a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return array_type_class; 3654a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isUnionType()) 3655a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return union_type_class; 3656a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else // FIXME: offset_type_class, method_type_class, & lang_type_class? 3657b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("CallExpr::isBuiltinClassifyType(): unimplemented type"); 3658a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return -1; 3659a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner} 3660a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 366180d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith/// EvaluateBuiltinConstantPForLValue - Determine the result of 366280d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith/// __builtin_constant_p when applied to the given lvalue. 366380d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith/// 366480d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith/// An lvalue is only "constant" if it is a pointer or reference to the first 366580d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith/// character of a string literal. 366680d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smithtemplate<typename LValue> 366780d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smithstatic bool EvaluateBuiltinConstantPForLValue(const LValue &LV) { 366880d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith const Expr *E = LV.getLValueBase().dyn_cast<const Expr*>(); 366980d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith return E && isa<StringLiteral>(E) && LV.getLValueOffset().isZero(); 367080d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith} 367180d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith 367280d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith/// EvaluateBuiltinConstantP - Evaluate __builtin_constant_p as similarly to 367380d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith/// GCC as we can manage. 367480d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smithstatic bool EvaluateBuiltinConstantP(ASTContext &Ctx, const Expr *Arg) { 367580d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith QualType ArgType = Arg->getType(); 367680d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith 367780d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith // __builtin_constant_p always has one operand. The rules which gcc follows 367880d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith // are not precisely documented, but are as follows: 367980d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith // 368080d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith // - If the operand is of integral, floating, complex or enumeration type, 368180d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith // and can be folded to a known value of that type, it returns 1. 368280d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith // - If the operand and can be folded to a pointer to the first character 368380d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith // of a string literal (or such a pointer cast to an integral type), it 368480d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith // returns 1. 368580d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith // 368680d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith // Otherwise, it returns 0. 368780d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith // 368880d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith // FIXME: GCC also intends to return 1 for literals of aggregate types, but 368980d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith // its support for this does not currently work. 369080d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith if (ArgType->isIntegralOrEnumerationType()) { 369180d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith Expr::EvalResult Result; 369280d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith if (!Arg->EvaluateAsRValue(Result, Ctx) || Result.HasSideEffects) 369380d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith return false; 369480d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith 369580d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith APValue &V = Result.Val; 369680d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith if (V.getKind() == APValue::Int) 369780d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith return true; 369880d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith 369980d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith return EvaluateBuiltinConstantPForLValue(V); 370080d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith } else if (ArgType->isFloatingType() || ArgType->isAnyComplexType()) { 370180d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith return Arg->isEvaluatable(Ctx); 370280d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith } else if (ArgType->isPointerType() || Arg->isGLValue()) { 370380d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith LValue LV; 370480d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith Expr::EvalStatus Status; 370580d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith EvalInfo Info(Ctx, Status); 370680d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith if ((Arg->isGLValue() ? EvaluateLValue(Arg, LV, Info) 370780d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith : EvaluatePointer(Arg, LV, Info)) && 370880d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith !Status.HasSideEffects) 370980d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith return EvaluateBuiltinConstantPForLValue(LV); 371080d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith } 371180d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith 371280d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith // Anything else isn't considered to be sufficiently constant. 371380d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith return false; 371480d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith} 371580d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith 371642c8f87eb60958170c46767273bf93e6c96125bfJohn McCall/// Retrieves the "underlying object type" of the given expression, 371742c8f87eb60958170c46767273bf93e6c96125bfJohn McCall/// as used by __builtin_object_size. 37181bf9a9e6a5bdc0de7939908855dcddf46b661800Richard SmithQualType IntExprEvaluator::GetObjectType(APValue::LValueBase B) { 37191bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith if (const ValueDecl *D = B.dyn_cast<const ValueDecl*>()) { 37201bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith if (const VarDecl *VD = dyn_cast<VarDecl>(D)) 372142c8f87eb60958170c46767273bf93e6c96125bfJohn McCall return VD->getType(); 37221bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith } else if (const Expr *E = B.get<const Expr*>()) { 37231bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith if (isa<CompoundLiteralExpr>(E)) 37241bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith return E->getType(); 372542c8f87eb60958170c46767273bf93e6c96125bfJohn McCall } 372642c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 372742c8f87eb60958170c46767273bf93e6c96125bfJohn McCall return QualType(); 372842c8f87eb60958170c46767273bf93e6c96125bfJohn McCall} 372942c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 37308cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool IntExprEvaluator::TryEvaluateBuiltinObjectSize(const CallExpr *E) { 373142c8f87eb60958170c46767273bf93e6c96125bfJohn McCall // TODO: Perhaps we should let LLVM lower this? 373242c8f87eb60958170c46767273bf93e6c96125bfJohn McCall LValue Base; 373342c8f87eb60958170c46767273bf93e6c96125bfJohn McCall if (!EvaluatePointer(E->getArg(0), Base, Info)) 373442c8f87eb60958170c46767273bf93e6c96125bfJohn McCall return false; 373542c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 373642c8f87eb60958170c46767273bf93e6c96125bfJohn McCall // If we can prove the base is null, lower to zero now. 37371bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith if (!Base.getLValueBase()) return Success(0, E); 373842c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 37391bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith QualType T = GetObjectType(Base.getLValueBase()); 374042c8f87eb60958170c46767273bf93e6c96125bfJohn McCall if (T.isNull() || 374142c8f87eb60958170c46767273bf93e6c96125bfJohn McCall T->isIncompleteType() || 37421357869bc5983cdfbc986db1f3d18265bb34cb0eEli Friedman T->isFunctionType() || 374342c8f87eb60958170c46767273bf93e6c96125bfJohn McCall T->isVariablyModifiedType() || 374442c8f87eb60958170c46767273bf93e6c96125bfJohn McCall T->isDependentType()) 3745f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 374642c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 374742c8f87eb60958170c46767273bf93e6c96125bfJohn McCall CharUnits Size = Info.Ctx.getTypeSizeInChars(T); 374842c8f87eb60958170c46767273bf93e6c96125bfJohn McCall CharUnits Offset = Base.getLValueOffset(); 374942c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 375042c8f87eb60958170c46767273bf93e6c96125bfJohn McCall if (!Offset.isNegative() && Offset <= Size) 375142c8f87eb60958170c46767273bf93e6c96125bfJohn McCall Size -= Offset; 375242c8f87eb60958170c46767273bf93e6c96125bfJohn McCall else 375342c8f87eb60958170c46767273bf93e6c96125bfJohn McCall Size = CharUnits::Zero(); 37544f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck return Success(Size, E); 375542c8f87eb60958170c46767273bf93e6c96125bfJohn McCall} 375642c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 37578cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool IntExprEvaluator::VisitCallExpr(const CallExpr *E) { 3758180f47959a066795cc0f409433023af448bb0328Richard Smith switch (E->isBuiltinCall()) { 3759019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner default: 37608cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return ExprEvaluatorBaseTy::VisitCallExpr(E); 376164eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump 376264eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump case Builtin::BI__builtin_object_size: { 376342c8f87eb60958170c46767273bf93e6c96125bfJohn McCall if (TryEvaluateBuiltinObjectSize(E)) 376442c8f87eb60958170c46767273bf93e6c96125bfJohn McCall return true; 376564eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump 3766b2aaf51ed73a4774322a39a0dd59d0fe7e3258c0Eric Christopher // If evaluating the argument has side-effects we can't determine 3767b2aaf51ed73a4774322a39a0dd59d0fe7e3258c0Eric Christopher // the size of the object and lower it to unknown now. 3768393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian if (E->getArg(0)->HasSideEffects(Info.Ctx)) { 3769a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith if (E->getArg(1)->EvaluateKnownConstInt(Info.Ctx).getZExtValue() <= 1) 3770cf184655319cf7a5b811067cff9d26a5741fd161Chris Lattner return Success(-1ULL, E); 377164eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump return Success(0, E); 377264eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump } 3773c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 3774f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 377564eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump } 377664eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump 3777019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_classify_type: 3778131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(EvaluateBuiltinClassifyType(E), E); 37791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 378080d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith case Builtin::BI__builtin_constant_p: 378180d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith return Success(EvaluateBuiltinConstantP(Info.Ctx, E->getArg(0)), E); 3782e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith 378321fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner case Builtin::BI__builtin_eh_return_data_regno: { 3784a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith int Operand = E->getArg(0)->EvaluateKnownConstInt(Info.Ctx).getZExtValue(); 3785bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Operand = Info.Ctx.getTargetInfo().getEHDataRegisterNumber(Operand); 378621fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner return Success(Operand, E); 378721fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner } 3788c4a2638b5ef3e2d35d872614ceb655a7a22c58beEli Friedman 3789c4a2638b5ef3e2d35d872614ceb655a7a22c58beEli Friedman case Builtin::BI__builtin_expect: 3790c4a2638b5ef3e2d35d872614ceb655a7a22c58beEli Friedman return Visit(E->getArg(0)); 37915726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor 37925726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor case Builtin::BIstrlen: 37935726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor case Builtin::BI__builtin_strlen: 37945726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor // As an extension, we support strlen() and __builtin_strlen() as constant 37955726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor // expressions when the argument is a string literal. 37968cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne if (const StringLiteral *S 37975726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor = dyn_cast<StringLiteral>(E->getArg(0)->IgnoreParenImpCasts())) { 37985726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor // The string literal may have embedded null characters. Find the first 37995726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor // one and truncate there. 38005f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Str = S->getString(); 38015f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef::size_type Pos = Str.find(0); 38025f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner if (Pos != StringRef::npos) 38035726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor Str = Str.substr(0, Pos); 38045726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor 38055726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor return Success(Str.size(), E); 38065726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor } 38075726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor 3808f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 3809454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman 3810454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman case Builtin::BI__atomic_is_lock_free: { 3811454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman APSInt SizeVal; 3812454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman if (!EvaluateInteger(E->getArg(0), SizeVal, Info)) 3813454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman return false; 3814454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman 3815454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // For __atomic_is_lock_free(sizeof(_Atomic(T))), if the size is a power 3816454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // of two less than the maximum inline atomic width, we know it is 3817454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // lock-free. If the size isn't a power of two, or greater than the 3818454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // maximum alignment where we promote atomics, we know it is not lock-free 3819454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // (at least not in the sense of atomic_is_lock_free). Otherwise, 3820454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // the answer can only be determined at runtime; for example, 16-byte 3821454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // atomics have lock-free implementations on some, but not all, 3822454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // x86-64 processors. 3823454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman 3824454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // Check power-of-two. 3825454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman CharUnits Size = CharUnits::fromQuantity(SizeVal.getZExtValue()); 3826454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman if (!Size.isPowerOfTwo()) 3827454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman#if 0 3828454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // FIXME: Suppress this folding until the ABI for the promotion width 3829454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // settles. 3830454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman return Success(0, E); 3831454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman#else 3832f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 3833454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman#endif 3834454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman 3835454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman#if 0 3836454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // Check against promotion width. 3837454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // FIXME: Suppress this folding until the ABI for the promotion width 3838454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // settles. 3839454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman unsigned PromoteWidthBits = 3840454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman Info.Ctx.getTargetInfo().getMaxAtomicPromoteWidth(); 3841454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman if (Size > Info.Ctx.toCharUnitsFromBits(PromoteWidthBits)) 3842454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman return Success(0, E); 3843454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman#endif 3844454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman 3845454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // Check against inlining width. 3846454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman unsigned InlineWidthBits = 3847454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman Info.Ctx.getTargetInfo().getMaxAtomicInlineWidth(); 3848454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman if (Size <= Info.Ctx.toCharUnitsFromBits(InlineWidthBits)) 3849454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman return Success(1, E); 3850454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman 3851f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 3852454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman } 3853019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner } 38544c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner} 3855f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 3856625b80755b603d28f36fb4212c81484d87ad08d3Richard Smithstatic bool HasSameBase(const LValue &A, const LValue &B) { 3857625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith if (!A.getLValueBase()) 3858625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith return !B.getLValueBase(); 3859625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith if (!B.getLValueBase()) 3860625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith return false; 3861625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith 38621bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith if (A.getLValueBase().getOpaqueValue() != 38631bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith B.getLValueBase().getOpaqueValue()) { 3864625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith const Decl *ADecl = GetLValueBaseDecl(A); 3865625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith if (!ADecl) 3866625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith return false; 3867625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith const Decl *BDecl = GetLValueBaseDecl(B); 38689a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith if (!BDecl || ADecl->getCanonicalDecl() != BDecl->getCanonicalDecl()) 3869625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith return false; 3870625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith } 3871625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith 3872625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith return IsGlobalLValue(A.getLValueBase()) || 3873177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith A.getLValueFrame() == B.getLValueFrame(); 3874625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith} 3875625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith 3876b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 3877c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (E->isAssignmentOp()) 3878f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 3879c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 38802de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (E->getOpcode() == BO_Comma) { 38818327fad71da34492d82c532f42a58cb4baff81a3Richard Smith VisitIgnoredValue(E->getLHS()); 38828327fad71da34492d82c532f42a58cb4baff81a3Richard Smith return Visit(E->getRHS()); 3883a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 3884a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 3885a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (E->isLogicalOp()) { 3886a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // These need to be handled specially because the operands aren't 3887a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // necessarily integral 3888fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson bool lhsResult, rhsResult; 38891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3890c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (EvaluateAsBooleanCondition(E->getLHS(), lhsResult, Info)) { 389151fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson // We were able to evaluate the LHS, see if we can get away with not 389251fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson // evaluating the RHS: 0 && X -> 0, 1 || X -> 1 38932de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (lhsResult == (E->getOpcode() == BO_LOr)) 38943f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return Success(lhsResult, E); 3895a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 3896c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (EvaluateAsBooleanCondition(E->getRHS(), rhsResult, Info)) { 38972de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (E->getOpcode() == BO_LOr) 3898131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(lhsResult || rhsResult, E); 38994bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson else 3900131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(lhsResult && rhsResult, E); 39014bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } 39024bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } else { 3903f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // FIXME: If both evaluations fail, we should produce the diagnostic from 3904f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // the LHS. If the LHS is non-constant and the RHS is unevaluatable, it's 3905f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // less clear how to diagnose this. 3906c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (EvaluateAsBooleanCondition(E->getRHS(), rhsResult, Info)) { 39074bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson // We can't evaluate the LHS; however, sometimes the result 39084bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson // is determined by the RHS: X && 0 -> 0, X || 1 -> 1. 3909f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (rhsResult == (E->getOpcode() == BO_LOr)) { 3910131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar // Since we weren't able to evaluate the left hand side, it 3911fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson // must have had side effects. 39121e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith Info.EvalStatus.HasSideEffects = true; 3913131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar 3914131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(rhsResult, E); 39154bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } 39164bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } 3917a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 3918a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 3919a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; 3920c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner } 392154176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner 3922286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson QualType LHSTy = E->getLHS()->getType(); 3923286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson QualType RHSTy = E->getRHS()->getType(); 39244087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 39254087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (LHSTy->isAnyComplexType()) { 39264087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar assert(RHSTy->isAnyComplexType() && "Invalid comparison"); 3927f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexValue LHS, RHS; 39284087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 39294087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (!EvaluateComplex(E->getLHS(), LHS, Info)) 39304087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar return false; 39314087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 39324087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (!EvaluateComplex(E->getRHS(), RHS, Info)) 39334087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar return false; 39344087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 39354087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (LHS.isComplexFloat()) { 39361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump APFloat::cmpResult CR_r = 39374087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar LHS.getComplexFloatReal().compare(RHS.getComplexFloatReal()); 39381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump APFloat::cmpResult CR_i = 39394087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar LHS.getComplexFloatImag().compare(RHS.getComplexFloatImag()); 39404087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 39412de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (E->getOpcode() == BO_EQ) 3942131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success((CR_r == APFloat::cmpEqual && 3943131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar CR_i == APFloat::cmpEqual), E); 3944131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar else { 39452de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall assert(E->getOpcode() == BO_NE && 3946131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar "Invalid complex comparison."); 39471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return Success(((CR_r == APFloat::cmpGreaterThan || 3948fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang CR_r == APFloat::cmpLessThan || 3949fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang CR_r == APFloat::cmpUnordered) || 39501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump (CR_i == APFloat::cmpGreaterThan || 3951fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang CR_i == APFloat::cmpLessThan || 3952fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang CR_i == APFloat::cmpUnordered)), E); 3953131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 39544087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar } else { 39552de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (E->getOpcode() == BO_EQ) 3956131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success((LHS.getComplexIntReal() == RHS.getComplexIntReal() && 3957131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar LHS.getComplexIntImag() == RHS.getComplexIntImag()), E); 3958131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar else { 39592de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall assert(E->getOpcode() == BO_NE && 3960131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar "Invalid compex comparison."); 3961131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success((LHS.getComplexIntReal() != RHS.getComplexIntReal() || 3962131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar LHS.getComplexIntImag() != RHS.getComplexIntImag()), E); 3963131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 39644087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar } 39654087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar } 39661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3967286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (LHSTy->isRealFloatingType() && 3968286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson RHSTy->isRealFloatingType()) { 3969286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson APFloat RHS(0.0), LHS(0.0); 39701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3971286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (!EvaluateFloat(E->getRHS(), RHS, Info)) 3972286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson return false; 39731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3974286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (!EvaluateFloat(E->getLHS(), LHS, Info)) 3975286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson return false; 39761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3977286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson APFloat::cmpResult CR = LHS.compare(RHS); 3978529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson 3979286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson switch (E->getOpcode()) { 3980286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson default: 3981b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Invalid binary operator!"); 39822de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LT: 3983131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpLessThan, E); 39842de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_GT: 3985131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpGreaterThan, E); 39862de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LE: 3987131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpLessThan || CR == APFloat::cmpEqual, E); 39882de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_GE: 39891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return Success(CR == APFloat::cmpGreaterThan || CR == APFloat::cmpEqual, 3990131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar E); 39912de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_EQ: 3992131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpEqual, E); 39932de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_NE: 39941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return Success(CR == APFloat::cmpGreaterThan 3995fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang || CR == APFloat::cmpLessThan 3996fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang || CR == APFloat::cmpUnordered, E); 3997286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson } 3998286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson } 39991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4000ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman if (LHSTy->isPointerType() && RHSTy->isPointerType()) { 4001625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith if (E->getOpcode() == BO_Sub || E->isComparisonOp()) { 4002efdb83e26f9a1fd2566afe54461216cd84814d42John McCall LValue LHSValue; 40033068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getLHS(), LHSValue, Info)) 40043068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return false; 4005a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 4006efdb83e26f9a1fd2566afe54461216cd84814d42John McCall LValue RHSValue; 40073068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getRHS(), RHSValue, Info)) 40083068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return false; 4009a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 4010625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith // Reject differing bases from the normal codepath; we special-case 4011625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith // comparisons to null. 4012625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith if (!HasSameBase(LHSValue, RHSValue)) { 40139e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith // Inequalities and subtractions between unrelated pointers have 40149e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith // unspecified or undefined behavior. 40155bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman if (!E->isEqualityOp()) 4016f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 4017ffbda40a1fb7169591dc01771f3511178a2f727cEli Friedman // A constant address may compare equal to the address of a symbol. 4018ffbda40a1fb7169591dc01771f3511178a2f727cEli Friedman // The one exception is that address of an object cannot compare equal 4019c45061bd0c0fdad4df8eea7e9e5af186d11427e5Eli Friedman // to a null pointer constant. 4020ffbda40a1fb7169591dc01771f3511178a2f727cEli Friedman if ((!LHSValue.Base && !LHSValue.Offset.isZero()) || 4021ffbda40a1fb7169591dc01771f3511178a2f727cEli Friedman (!RHSValue.Base && !RHSValue.Offset.isZero())) 4022f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 40239e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith // It's implementation-defined whether distinct literals will have 4024c45061bd0c0fdad4df8eea7e9e5af186d11427e5Eli Friedman // distinct addresses. In clang, we do not guarantee the addresses are 402574f4634781cee06e28eb741bda5d0f936fdd1948Richard Smith // distinct. However, we do know that the address of a literal will be 402674f4634781cee06e28eb741bda5d0f936fdd1948Richard Smith // non-null. 402774f4634781cee06e28eb741bda5d0f936fdd1948Richard Smith if ((IsLiteralLValue(LHSValue) || IsLiteralLValue(RHSValue)) && 402874f4634781cee06e28eb741bda5d0f936fdd1948Richard Smith LHSValue.Base && RHSValue.Base) 4029f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 40309e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith // We can't tell whether weak symbols will end up pointing to the same 40319e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith // object. 40329e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith if (IsWeakLValue(LHSValue) || IsWeakLValue(RHSValue)) 4033f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 40349e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith // Pointers with different bases cannot represent the same object. 4035c45061bd0c0fdad4df8eea7e9e5af186d11427e5Eli Friedman // (Note that clang defaults to -fmerge-all-constants, which can 4036c45061bd0c0fdad4df8eea7e9e5af186d11427e5Eli Friedman // lead to inconsistent results for comparisons involving the address 4037c45061bd0c0fdad4df8eea7e9e5af186d11427e5Eli Friedman // of a constant; this generally doesn't matter in practice.) 40389e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith return Success(E->getOpcode() == BO_NE, E); 40395bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman } 4040a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 4041cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // FIXME: Implement the C++11 restrictions: 4042cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // - Pointer subtractions must be on elements of the same array. 4043cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // - Pointer comparisons must be between members with the same access. 4044cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 40452de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (E->getOpcode() == BO_Sub) { 40464992bdde387c5f033bb450a716eaabc0fda52688Chris Lattner QualType Type = E->getLHS()->getType(); 40474992bdde387c5f033bb450a716eaabc0fda52688Chris Lattner QualType ElementType = Type->getAs<PointerType>()->getPointeeType(); 40483068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 4049180f47959a066795cc0f409433023af448bb0328Richard Smith CharUnits ElementSize; 4050180f47959a066795cc0f409433023af448bb0328Richard Smith if (!HandleSizeof(Info, ElementType, ElementSize)) 4051180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 4052a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 4053180f47959a066795cc0f409433023af448bb0328Richard Smith CharUnits Diff = LHSValue.getLValueOffset() - 4054a73058324197b7bdfd19307965954f626e26199dKen Dyck RHSValue.getLValueOffset(); 4055a73058324197b7bdfd19307965954f626e26199dKen Dyck return Success(Diff / ElementSize, E); 4056ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman } 4057625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith 4058625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith const CharUnits &LHSOffset = LHSValue.getLValueOffset(); 4059625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith const CharUnits &RHSOffset = RHSValue.getLValueOffset(); 4060625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith switch (E->getOpcode()) { 4061625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith default: llvm_unreachable("missing comparison operator"); 4062625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith case BO_LT: return Success(LHSOffset < RHSOffset, E); 4063625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith case BO_GT: return Success(LHSOffset > RHSOffset, E); 4064625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith case BO_LE: return Success(LHSOffset <= RHSOffset, E); 4065625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith case BO_GE: return Success(LHSOffset >= RHSOffset, E); 4066625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith case BO_EQ: return Success(LHSOffset == RHSOffset, E); 4067625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith case BO_NE: return Success(LHSOffset != RHSOffset, E); 4068ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman } 40693068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 40703068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 40712ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor if (!LHSTy->isIntegralOrEnumerationType() || 40722ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor !RHSTy->isIntegralOrEnumerationType()) { 4073e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // We can't continue from here for non-integral types. 4074e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return ExprEvaluatorBaseTy::VisitBinaryOperator(E); 4075a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 4076a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 4077a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // The LHS of a constant expr is always evaluated and needed. 407847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue LHSVal; 4079c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!EvaluateIntegerOrLValue(E->getLHS(), LHSVal, Info)) 4080f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 4081d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman 4082c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!Visit(E->getRHS())) 408330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return false; 408447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue &RHSVal = Result; 408542edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 408642edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman // Handle cases like (unsigned long)&a + 4. 4087c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (E->isAdditiveOp() && LHSVal.isLValue() && RHSVal.isInt()) { 4088a73058324197b7bdfd19307965954f626e26199dKen Dyck CharUnits AdditionalOffset = CharUnits::fromQuantity( 4089a73058324197b7bdfd19307965954f626e26199dKen Dyck RHSVal.getInt().getZExtValue()); 40902de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (E->getOpcode() == BO_Add) 409147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith LHSVal.getLValueOffset() += AdditionalOffset; 409242edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman else 409347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith LHSVal.getLValueOffset() -= AdditionalOffset; 409447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Result = LHSVal; 409542edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman return true; 409642edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman } 409742edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 409842edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman // Handle cases like 4 + (unsigned long)&a 40992de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (E->getOpcode() == BO_Add && 4100c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith RHSVal.isLValue() && LHSVal.isInt()) { 410147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith RHSVal.getLValueOffset() += CharUnits::fromQuantity( 410247a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith LHSVal.getInt().getZExtValue()); 410347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith // Note that RHSVal is Result. 410442edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman return true; 410542edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman } 410642edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 410742edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman // All the following cases expect both operands to be an integer 4108c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!LHSVal.isInt() || !RHSVal.isInt()) 4109f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 4110a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 4111c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith APSInt &LHS = LHSVal.getInt(); 4112c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith APSInt &RHS = RHSVal.getInt(); 411342edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 4114a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson switch (E->getOpcode()) { 411532fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner default: 4116f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 4117c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_Mul: return Success(LHS * RHS, E); 4118c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_Add: return Success(LHS + RHS, E); 4119c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_Sub: return Success(LHS - RHS, E); 4120c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_And: return Success(LHS & RHS, E); 4121c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_Xor: return Success(LHS ^ RHS, E); 4122c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_Or: return Success(LHS | RHS, E); 41232de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Div: 412454176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner if (RHS == 0) 4125f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E, diag::note_expr_divide_by_zero); 4126c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return Success(LHS / RHS, E); 41272de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Rem: 412854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner if (RHS == 0) 4129f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E, diag::note_expr_divide_by_zero); 4130c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return Success(LHS % RHS, E); 41312de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Shl: { 4132091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall // During constant-folding, a negative shift is an opposite shift. 4133091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall if (RHS.isSigned() && RHS.isNegative()) { 4134091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall RHS = -RHS; 4135091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall goto shift_right; 4136091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall } 4137091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall 4138091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall shift_left: 4139091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall unsigned SA 4140c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith = (unsigned) RHS.getLimitedValue(LHS.getBitWidth()-1); 4141c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return Success(LHS << SA, E); 41423f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar } 41432de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Shr: { 4144091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall // During constant-folding, a negative shift is an opposite shift. 4145091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall if (RHS.isSigned() && RHS.isNegative()) { 4146091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall RHS = -RHS; 4147091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall goto shift_left; 4148091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall } 4149091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall 4150091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall shift_right: 41511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned SA = 4152c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith (unsigned) RHS.getLimitedValue(LHS.getBitWidth()-1); 4153c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return Success(LHS >> SA, E); 41543f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar } 41551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4156c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_LT: return Success(LHS < RHS, E); 4157c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_GT: return Success(LHS > RHS, E); 4158c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_LE: return Success(LHS <= RHS, E); 4159c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_GE: return Success(LHS >= RHS, E); 4160c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_EQ: return Success(LHS == RHS, E); 4161c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_NE: return Success(LHS != RHS, E); 4162b11e77836dd0867955c5abf32baf1c3e6c7f81e1Eli Friedman } 4163a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 4164a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson 41658b752f10c394b140f9ef89e049cbad1a7676fc25Ken DyckCharUnits IntExprEvaluator::GetAlignOfType(QualType T) { 41665d484e8cf710207010720589d89602233de61d01Sebastian Redl // C++ [expr.sizeof]p2: "When applied to a reference or a reference type, 41675d484e8cf710207010720589d89602233de61d01Sebastian Redl // the result is the size of the referenced type." 41685d484e8cf710207010720589d89602233de61d01Sebastian Redl // C++ [expr.alignof]p3: "When alignof is applied to a reference type, the 41695d484e8cf710207010720589d89602233de61d01Sebastian Redl // result shall be the alignment of the referenced type." 41705d484e8cf710207010720589d89602233de61d01Sebastian Redl if (const ReferenceType *Ref = T->getAs<ReferenceType>()) 41715d484e8cf710207010720589d89602233de61d01Sebastian Redl T = Ref->getPointeeType(); 41729f1210c3280104417a4ad30f0a00825ac8fa718aChad Rosier 41739f1210c3280104417a4ad30f0a00825ac8fa718aChad Rosier // __alignof is defined to return the preferred alignment. 41749f1210c3280104417a4ad30f0a00825ac8fa718aChad Rosier return Info.Ctx.toCharUnitsFromBits( 41759f1210c3280104417a4ad30f0a00825ac8fa718aChad Rosier Info.Ctx.getPreferredTypeAlign(T.getTypePtr())); 4176e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner} 4177e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 41788b752f10c394b140f9ef89e049cbad1a7676fc25Ken DyckCharUnits IntExprEvaluator::GetAlignOfExpr(const Expr *E) { 4179af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner E = E->IgnoreParens(); 4180af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner 4181af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner // alignof decl is always accepted, even if it doesn't make sense: we default 41821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // to 1 in those cases. 4183af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) 41848b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck return Info.Ctx.getDeclAlign(DRE->getDecl(), 41858b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck /*RefAsPointee*/true); 4186a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 4187af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner if (const MemberExpr *ME = dyn_cast<MemberExpr>(E)) 41888b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck return Info.Ctx.getDeclAlign(ME->getMemberDecl(), 41898b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck /*RefAsPointee*/true); 4190af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner 4191e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner return GetAlignOfType(E->getType()); 4192e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner} 4193e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 4194e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 4195f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne/// VisitUnaryExprOrTypeTraitExpr - Evaluate a sizeof, alignof or vec_step with 4196f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne/// a result as the expression's type. 4197f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbournebool IntExprEvaluator::VisitUnaryExprOrTypeTraitExpr( 4198f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne const UnaryExprOrTypeTraitExpr *E) { 4199f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne switch(E->getKind()) { 4200f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case UETT_AlignOf: { 4201e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner if (E->isArgumentType()) 42024f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck return Success(GetAlignOfType(E->getArgumentType()), E); 4203e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner else 42044f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck return Success(GetAlignOfExpr(E->getArgumentExpr()), E); 4205e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner } 4206a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 4207f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case UETT_VecStep: { 4208f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne QualType Ty = E->getTypeOfArgument(); 42090518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl 4210f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne if (Ty->isVectorType()) { 4211f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne unsigned n = Ty->getAs<VectorType>()->getNumElements(); 4212a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 4213f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne // The vec_step built-in functions that take a 3-component 4214f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne // vector return 4. (OpenCL 1.1 spec 6.11.12) 4215f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne if (n == 3) 4216f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne n = 4; 4217f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne 4218f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne return Success(n, E); 4219f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne } else 4220f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne return Success(1, E); 4221f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne } 4222f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne 4223f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case UETT_SizeOf: { 4224f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne QualType SrcTy = E->getTypeOfArgument(); 4225f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne // C++ [expr.sizeof]p2: "When applied to a reference or a reference type, 4226f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne // the result is the size of the referenced type." 4227f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne // C++ [expr.alignof]p3: "When alignof is applied to a reference type, the 4228f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne // result shall be the alignment of the referenced type." 4229f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne if (const ReferenceType *Ref = SrcTy->getAs<ReferenceType>()) 4230f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne SrcTy = Ref->getPointeeType(); 4231f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman 4232180f47959a066795cc0f409433023af448bb0328Richard Smith CharUnits Sizeof; 4233180f47959a066795cc0f409433023af448bb0328Richard Smith if (!HandleSizeof(Info, SrcTy, Sizeof)) 4234f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne return false; 4235180f47959a066795cc0f409433023af448bb0328Richard Smith return Success(Sizeof, E); 4236f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne } 4237f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne } 4238f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne 4239f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne llvm_unreachable("unknown expr/type trait"); 4240f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 4241fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner} 4242fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner 42438cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool IntExprEvaluator::VisitOffsetOfExpr(const OffsetOfExpr *OOE) { 42448ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor CharUnits Result; 42458cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne unsigned n = OOE->getNumComponents(); 42468ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (n == 0) 4247f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(OOE); 42488cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne QualType CurrentType = OOE->getTypeSourceInfo()->getType(); 42498ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor for (unsigned i = 0; i != n; ++i) { 42508ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor OffsetOfExpr::OffsetOfNode ON = OOE->getComponent(i); 42518ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor switch (ON.getKind()) { 42528ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor case OffsetOfExpr::OffsetOfNode::Array: { 42538cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne const Expr *Idx = OOE->getIndexExpr(ON.getArrayExprIndex()); 42548ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor APSInt IdxResult; 42558ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (!EvaluateInteger(Idx, IdxResult, Info)) 42568ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return false; 42578ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor const ArrayType *AT = Info.Ctx.getAsArrayType(CurrentType); 42588ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (!AT) 4259f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(OOE); 42608ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor CurrentType = AT->getElementType(); 42618ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor CharUnits ElementSize = Info.Ctx.getTypeSizeInChars(CurrentType); 42628ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Result += IdxResult.getSExtValue() * ElementSize; 42638ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor break; 42648ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 4265f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 42668ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor case OffsetOfExpr::OffsetOfNode::Field: { 42678ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor FieldDecl *MemberDecl = ON.getField(); 42688ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor const RecordType *RT = CurrentType->getAs<RecordType>(); 4269f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!RT) 4270f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(OOE); 42718ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor RecordDecl *RD = RT->getDecl(); 42728ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD); 4273ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall unsigned i = MemberDecl->getFieldIndex(); 4274cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor assert(i < RL.getFieldCount() && "offsetof field in wrong type"); 4275fb1e3bc29b667f4275e1d5a43d64ec173f4f9a7dKen Dyck Result += Info.Ctx.toCharUnitsFromBits(RL.getFieldOffset(i)); 42768ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor CurrentType = MemberDecl->getType().getNonReferenceType(); 42778ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor break; 42788ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 4279f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 42808ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor case OffsetOfExpr::OffsetOfNode::Identifier: 42818ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor llvm_unreachable("dependent __builtin_offsetof"); 4282f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(OOE); 4283f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 4284cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor case OffsetOfExpr::OffsetOfNode::Base: { 4285cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor CXXBaseSpecifier *BaseSpec = ON.getBase(); 4286cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor if (BaseSpec->isVirtual()) 4287f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(OOE); 4288cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor 4289cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor // Find the layout of the class whose base we are looking into. 4290cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor const RecordType *RT = CurrentType->getAs<RecordType>(); 4291f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!RT) 4292f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(OOE); 4293cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor RecordDecl *RD = RT->getDecl(); 4294cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD); 4295cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor 4296cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor // Find the base class itself. 4297cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor CurrentType = BaseSpec->getType(); 4298cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor const RecordType *BaseRT = CurrentType->getAs<RecordType>(); 4299cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor if (!BaseRT) 4300f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(OOE); 4301cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor 4302cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor // Add the offset to the base. 43037c7f820d70c925b29290a8563b59615816a827fcKen Dyck Result += RL.getBaseClassOffset(cast<CXXRecordDecl>(BaseRT->getDecl())); 4304cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor break; 4305cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor } 43068ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 43078ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 43088cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return Success(Result, OOE); 43098ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor} 43108ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 4311b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { 431275a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner switch (E->getOpcode()) { 43134c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner default: 431475a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner // Address, indirect, pre/post inc/dec, etc are not valid constant exprs. 431575a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner // See C99 6.6p3. 4316f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 43172de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Extension: 43184c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // FIXME: Should extension allow i-c-e extension expressions in its scope? 43194c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // If so, we could clear the diagnostic ID. 4320f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Visit(E->getSubExpr()); 43212de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Plus: 4322c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // The result is just the value. 4323f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Visit(E->getSubExpr()); 4324f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith case UO_Minus: { 4325f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!Visit(E->getSubExpr())) 4326f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 4327f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!Result.isInt()) return Error(E); 4328f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Success(-Result.getInt(), E); 4329f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 4330f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith case UO_Not: { 4331f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!Visit(E->getSubExpr())) 4332f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 4333f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!Result.isInt()) return Error(E); 4334f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Success(~Result.getInt(), E); 4335f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 4336f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith case UO_LNot: { 4337f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith bool bres; 4338f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!EvaluateAsBooleanCondition(E->getSubExpr(), bres, Info)) 4339f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 4340f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Success(!bres, E); 4341f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 434206a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson } 4343a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 43441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4345732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// HandleCast - This is used to evaluate implicit or explicit casts where the 4346732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// result type is integer. 43478cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool IntExprEvaluator::VisitCastExpr(const CastExpr *E) { 43488cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne const Expr *SubExpr = E->getSubExpr(); 434982206e267ce6cc709797127616f64672d255b310Anders Carlsson QualType DestType = E->getType(); 4350b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar QualType SrcType = SubExpr->getType(); 435182206e267ce6cc709797127616f64672d255b310Anders Carlsson 435246a523285928aa07bf14803178dc04616ac85994Eli Friedman switch (E->getCastKind()) { 435346a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_BaseToDerived: 435446a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_DerivedToBase: 435546a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_UncheckedDerivedToBase: 435646a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_Dynamic: 435746a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_ToUnion: 435846a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_ArrayToPointerDecay: 435946a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_FunctionToPointerDecay: 436046a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_NullToPointer: 436146a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_NullToMemberPointer: 436246a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_BaseToDerivedMemberPointer: 436346a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_DerivedToBaseMemberPointer: 436446a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_ConstructorConversion: 436546a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_IntegralToPointer: 436646a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_ToVoid: 436746a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_VectorSplat: 436846a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_IntegralToFloating: 436946a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_FloatingCast: 43701d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall case CK_CPointerToObjCPointerCast: 43711d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall case CK_BlockPointerToObjCPointerCast: 437246a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_AnyPointerToBlockPointerCast: 437346a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_ObjCObjectLValueCast: 437446a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_FloatingRealToComplex: 437546a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_FloatingComplexToReal: 437646a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_FloatingComplexCast: 437746a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_FloatingComplexToIntegralComplex: 437846a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_IntegralRealToComplex: 437946a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_IntegralComplexCast: 438046a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_IntegralComplexToFloatingComplex: 438146a523285928aa07bf14803178dc04616ac85994Eli Friedman llvm_unreachable("invalid cast kind for integral value"); 438246a523285928aa07bf14803178dc04616ac85994Eli Friedman 4383e50c297f92914ca996deb8b597624193273b62e4Eli Friedman case CK_BitCast: 438446a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_Dependent: 438546a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_LValueBitCast: 438646a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_UserDefinedConversion: 438733e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall case CK_ARCProduceObject: 438833e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall case CK_ARCConsumeObject: 438933e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall case CK_ARCReclaimReturnedObject: 439033e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall case CK_ARCExtendBlockObject: 4391f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 439246a523285928aa07bf14803178dc04616ac85994Eli Friedman 439346a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_LValueToRValue: 439446a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_NoOp: 4395c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return ExprEvaluatorBaseTy::VisitCastExpr(E); 439646a523285928aa07bf14803178dc04616ac85994Eli Friedman 439746a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_MemberPointerToBoolean: 439846a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_PointerToBoolean: 439946a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_IntegralToBoolean: 440046a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_FloatingToBoolean: 440146a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_FloatingComplexToBoolean: 440246a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_IntegralComplexToBoolean: { 44034efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool BoolResult; 4404c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!EvaluateAsBooleanCondition(SubExpr, BoolResult, Info)) 44054efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 4406131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(BoolResult, E); 44074efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 44084efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 440946a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_IntegralCast: { 4410732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner if (!Visit(SubExpr)) 4411b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 4412a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 4413be26570e3faa009bdcefedfaf04473e518940520Eli Friedman if (!Result.isInt()) { 4414be26570e3faa009bdcefedfaf04473e518940520Eli Friedman // Only allow casts of lvalues if they are lossless. 4415be26570e3faa009bdcefedfaf04473e518940520Eli Friedman return Info.Ctx.getTypeSize(DestType) == Info.Ctx.getTypeSize(SrcType); 4416be26570e3faa009bdcefedfaf04473e518940520Eli Friedman } 441730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar 4418dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar return Success(HandleIntToIntCast(DestType, SrcType, 441930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result.getInt(), Info.Ctx), E); 4420732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner } 44211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 442246a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_PointerToIntegral: { 4423c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith CCEDiag(E, diag::note_constexpr_invalid_cast) << 2; 4424c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith 4425efdb83e26f9a1fd2566afe54461216cd84814d42John McCall LValue LV; 442687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!EvaluatePointer(SubExpr, LV, Info)) 4427b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 44284efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 4429dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar if (LV.getLValueBase()) { 4430dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar // Only allow based lvalue casts if they are lossless. 4431dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(SrcType)) 4432f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 4433dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar 4434b755a9da095d2f2f04444797f1e1a9511693815bRichard Smith LV.Designator.setInvalid(); 4435efdb83e26f9a1fd2566afe54461216cd84814d42John McCall LV.moveInto(Result); 4436dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar return true; 4437dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar } 44384efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 4439a73058324197b7bdfd19307965954f626e26199dKen Dyck APSInt AsInt = Info.Ctx.MakeIntValue(LV.getLValueOffset().getQuantity(), 4440a73058324197b7bdfd19307965954f626e26199dKen Dyck SrcType); 4441dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar return Success(HandleIntToIntCast(DestType, SrcType, AsInt, Info.Ctx), E); 44422bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson } 44434efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 444446a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_IntegralComplexToReal: { 4445f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexValue C; 44461725f683432715e5afe34d476024bd6f16eac3fcEli Friedman if (!EvaluateComplex(SubExpr, C, Info)) 44471725f683432715e5afe34d476024bd6f16eac3fcEli Friedman return false; 444846a523285928aa07bf14803178dc04616ac85994Eli Friedman return Success(C.getComplexIntReal(), E); 44491725f683432715e5afe34d476024bd6f16eac3fcEli Friedman } 44502217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman 445146a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_FloatingToIntegral: { 445246a523285928aa07bf14803178dc04616ac85994Eli Friedman APFloat F(0.0); 445346a523285928aa07bf14803178dc04616ac85994Eli Friedman if (!EvaluateFloat(SubExpr, F, Info)) 445446a523285928aa07bf14803178dc04616ac85994Eli Friedman return false; 4455732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner 4456c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith APSInt Value; 4457c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith if (!HandleFloatToIntCast(Info, E, SrcType, F, DestType, Value)) 4458c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return false; 4459c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return Success(Value, E); 446046a523285928aa07bf14803178dc04616ac85994Eli Friedman } 446146a523285928aa07bf14803178dc04616ac85994Eli Friedman } 44621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 446346a523285928aa07bf14803178dc04616ac85994Eli Friedman llvm_unreachable("unknown cast resulting in integral value"); 4464f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 4465a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 44662bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 4467722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedmanbool IntExprEvaluator::VisitUnaryReal(const UnaryOperator *E) { 4468722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman if (E->getSubExpr()->getType()->isAnyComplexType()) { 4469f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexValue LV; 4470f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!EvaluateComplex(E->getSubExpr(), LV, Info)) 4471f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 4472f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!LV.isComplexInt()) 4473f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 4474722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Success(LV.getComplexIntReal(), E); 4475722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman } 4476722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman 4477722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Visit(E->getSubExpr()); 4478722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman} 4479722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman 4480664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedmanbool IntExprEvaluator::VisitUnaryImag(const UnaryOperator *E) { 4481722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman if (E->getSubExpr()->getType()->isComplexIntegerType()) { 4482f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexValue LV; 4483f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!EvaluateComplex(E->getSubExpr(), LV, Info)) 4484f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 4485f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!LV.isComplexInt()) 4486f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 4487722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Success(LV.getComplexIntImag(), E); 4488722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman } 4489722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman 44908327fad71da34492d82c532f42a58cb4baff81a3Richard Smith VisitIgnoredValue(E->getSubExpr()); 4491664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman return Success(0, E); 4492664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman} 4493664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman 4494ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregorbool IntExprEvaluator::VisitSizeOfPackExpr(const SizeOfPackExpr *E) { 4495ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor return Success(E->getPackLength(), E); 4496ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor} 4497ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor 4498295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlbool IntExprEvaluator::VisitCXXNoexceptExpr(const CXXNoexceptExpr *E) { 4499295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl return Success(E->getValue(), E); 4500295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl} 4501295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl 4502f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 4503d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman// Float Evaluation 4504d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===// 4505d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 4506d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmannamespace { 4507770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass FloatExprEvaluator 45088cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : public ExprEvaluatorBase<FloatExprEvaluator, bool> { 4509d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman APFloat &Result; 4510d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanpublic: 4511d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman FloatExprEvaluator(EvalInfo &info, APFloat &result) 45128cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : ExprEvaluatorBaseTy(info), Result(result) {} 4513d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 451447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith bool Success(const CCValue &V, const Expr *e) { 45158cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne Result = V.getFloat(); 45168cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return true; 45178cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 4518d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 4519eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith bool ZeroInitialization(const Expr *E) { 4520f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith Result = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(E->getType())); 4521f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith return true; 4522f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith } 4523f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith 4524019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner bool VisitCallExpr(const CallExpr *E); 4525d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 45265db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar bool VisitUnaryOperator(const UnaryOperator *E); 4527d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitBinaryOperator(const BinaryOperator *E); 4528d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitFloatingLiteral(const FloatingLiteral *E); 45298cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCastExpr(const CastExpr *E); 45302217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman 4531abd3a857ace59100305790545d1baae5877b8945John McCall bool VisitUnaryReal(const UnaryOperator *E); 4532abd3a857ace59100305790545d1baae5877b8945John McCall bool VisitUnaryImag(const UnaryOperator *E); 4533ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman 4534eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith // FIXME: Missing: array subscript of vector, member of vector 4535d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}; 4536d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} // end anonymous namespace 4537d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 4538d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr* E, APFloat& Result, EvalInfo &Info) { 4539c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith assert(E->isRValue() && E->getType()->isRealFloatingType()); 45408cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return FloatExprEvaluator(Info, Result).Visit(E); 4541d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 4542d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 45434ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadstatic bool TryEvaluateBuiltinNaN(const ASTContext &Context, 4544db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall QualType ResultTy, 4545db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall const Expr *Arg, 4546db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall bool SNaN, 4547db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall llvm::APFloat &Result) { 4548db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall const StringLiteral *S = dyn_cast<StringLiteral>(Arg->IgnoreParenCasts()); 4549db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall if (!S) return false; 4550db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall 4551db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall const llvm::fltSemantics &Sem = Context.getFloatTypeSemantics(ResultTy); 4552db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall 4553db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall llvm::APInt fill; 4554db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall 4555db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall // Treat empty strings as if they were zero. 4556db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall if (S->getString().empty()) 4557db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall fill = llvm::APInt(32, 0); 4558db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall else if (S->getString().getAsInteger(0, fill)) 4559db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall return false; 4560db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall 4561db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall if (SNaN) 4562db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall Result = llvm::APFloat::getSNaN(Sem, false, &fill); 4563db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall else 4564db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall Result = llvm::APFloat::getQNaN(Sem, false, &fill); 4565db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall return true; 4566db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall} 4567db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall 4568019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattnerbool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) { 4569180f47959a066795cc0f409433023af448bb0328Richard Smith switch (E->isBuiltinCall()) { 45708cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne default: 45718cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return ExprEvaluatorBaseTy::VisitCallExpr(E); 45728cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 4573019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_val: 4574019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_valf: 4575019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_vall: 4576019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_inf: 4577019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_inff: 45787cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar case Builtin::BI__builtin_infl: { 45797cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar const llvm::fltSemantics &Sem = 45807cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar Info.Ctx.getFloatTypeSemantics(E->getType()); 458134a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner Result = llvm::APFloat::getInf(Sem); 458234a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner return true; 45837cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar } 45841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4585db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall case Builtin::BI__builtin_nans: 4586db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall case Builtin::BI__builtin_nansf: 4587db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall case Builtin::BI__builtin_nansl: 4588f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!TryEvaluateBuiltinNaN(Info.Ctx, E->getType(), E->getArg(0), 4589f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith true, Result)) 4590f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 4591f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return true; 4592db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall 45939e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nan: 45949e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nanf: 45959e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nanl: 45964572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump // If this is __builtin_nan() turn this into a nan, otherwise we 45979e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner // can't constant fold it. 4598f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!TryEvaluateBuiltinNaN(Info.Ctx, E->getType(), E->getArg(0), 4599f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith false, Result)) 4600f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 4601f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return true; 46025db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 46035db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabs: 46045db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabsf: 46055db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabsl: 46065db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (!EvaluateFloat(E->getArg(0), Result, Info)) 46075db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return false; 46081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46095db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (Result.isNegative()) 46105db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.changeSign(); 46115db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 46125db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 46131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case Builtin::BI__builtin_copysign: 46141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case Builtin::BI__builtin_copysignf: 46155db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_copysignl: { 46165db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar APFloat RHS(0.); 46175db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (!EvaluateFloat(E->getArg(0), Result, Info) || 46185db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar !EvaluateFloat(E->getArg(1), RHS, Info)) 46195db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return false; 46205db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.copySign(RHS); 46215db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 46225db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar } 4623019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner } 4624019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner} 4625019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner 4626abd3a857ace59100305790545d1baae5877b8945John McCallbool FloatExprEvaluator::VisitUnaryReal(const UnaryOperator *E) { 462743efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman if (E->getSubExpr()->getType()->isAnyComplexType()) { 462843efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman ComplexValue CV; 462943efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman if (!EvaluateComplex(E->getSubExpr(), CV, Info)) 463043efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman return false; 463143efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman Result = CV.FloatReal; 463243efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman return true; 463343efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman } 463443efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman 463543efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman return Visit(E->getSubExpr()); 4636abd3a857ace59100305790545d1baae5877b8945John McCall} 4637abd3a857ace59100305790545d1baae5877b8945John McCall 4638abd3a857ace59100305790545d1baae5877b8945John McCallbool FloatExprEvaluator::VisitUnaryImag(const UnaryOperator *E) { 463943efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman if (E->getSubExpr()->getType()->isAnyComplexType()) { 464043efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman ComplexValue CV; 464143efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman if (!EvaluateComplex(E->getSubExpr(), CV, Info)) 464243efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman return false; 464343efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman Result = CV.FloatImag; 464443efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman return true; 464543efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman } 464643efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman 46478327fad71da34492d82c532f42a58cb4baff81a3Richard Smith VisitIgnoredValue(E->getSubExpr()); 464843efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman const llvm::fltSemantics &Sem = Info.Ctx.getFloatTypeSemantics(E->getType()); 464943efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman Result = llvm::APFloat::getZero(Sem); 4650abd3a857ace59100305790545d1baae5877b8945John McCall return true; 4651abd3a857ace59100305790545d1baae5877b8945John McCall} 4652abd3a857ace59100305790545d1baae5877b8945John McCall 46535db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbarbool FloatExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { 46545db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar switch (E->getOpcode()) { 4655f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith default: return Error(E); 46562de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Plus: 46577993e8a2a26bf408c2a6d45f24fffa12db336b2bRichard Smith return EvaluateFloat(E->getSubExpr(), Result, Info); 46582de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Minus: 46597993e8a2a26bf408c2a6d45f24fffa12db336b2bRichard Smith if (!EvaluateFloat(E->getSubExpr(), Result, Info)) 46607993e8a2a26bf408c2a6d45f24fffa12db336b2bRichard Smith return false; 46615db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.changeSign(); 46625db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 46635db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar } 46645db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar} 4665019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner 4666d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 4667e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (E->isPtrMemOp() || E->isAssignmentOp() || E->getOpcode() == BO_Comma) 4668e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return ExprEvaluatorBaseTy::VisitBinaryOperator(E); 466996e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson 46705db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar APFloat RHS(0.0); 4671d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (!EvaluateFloat(E->getLHS(), Result, Info)) 4672d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 4673d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (!EvaluateFloat(E->getRHS(), RHS, Info)) 4674d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 4675d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 4676d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman switch (E->getOpcode()) { 4677f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith default: return Error(E); 46782de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Mul: 4679d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.multiply(RHS, APFloat::rmNearestTiesToEven); 4680d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 46812de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Add: 4682d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.add(RHS, APFloat::rmNearestTiesToEven); 4683d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 46842de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Sub: 4685d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.subtract(RHS, APFloat::rmNearestTiesToEven); 4686d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 46872de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Div: 4688d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.divide(RHS, APFloat::rmNearestTiesToEven); 4689d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 4690d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } 4691d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 4692d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 4693d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitFloatingLiteral(const FloatingLiteral *E) { 4694d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result = E->getValue(); 4695d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 4696d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 4697d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 46988cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool FloatExprEvaluator::VisitCastExpr(const CastExpr *E) { 46998cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne const Expr* SubExpr = E->getSubExpr(); 47001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47012a523eec6a31955be876625819b89e8dc5def707Eli Friedman switch (E->getCastKind()) { 47022a523eec6a31955be876625819b89e8dc5def707Eli Friedman default: 4703c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return ExprEvaluatorBaseTy::VisitCastExpr(E); 47042a523eec6a31955be876625819b89e8dc5def707Eli Friedman 47052a523eec6a31955be876625819b89e8dc5def707Eli Friedman case CK_IntegralToFloating: { 47064efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APSInt IntResult; 4707c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return EvaluateInteger(SubExpr, IntResult, Info) && 4708c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith HandleIntToFloatCast(Info, E, SubExpr->getType(), IntResult, 4709c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith E->getType(), Result); 47104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 47112a523eec6a31955be876625819b89e8dc5def707Eli Friedman 47122a523eec6a31955be876625819b89e8dc5def707Eli Friedman case CK_FloatingCast: { 47134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!Visit(SubExpr)) 47144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 4715c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return HandleFloatToFloatCast(Info, E, SubExpr->getType(), E->getType(), 4716c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith Result); 47174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 4718f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall 47192a523eec6a31955be876625819b89e8dc5def707Eli Friedman case CK_FloatingComplexToReal: { 4720f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall ComplexValue V; 4721f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall if (!EvaluateComplex(SubExpr, V, Info)) 4722f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall return false; 4723f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall Result = V.getComplexFloatReal(); 4724f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall return true; 4725f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall } 47262a523eec6a31955be876625819b89e8dc5def707Eli Friedman } 47274efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 4728f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 47294efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 47304efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 4731d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===// 4732a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar// Complex Evaluation (for float and integer) 47339ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===// 47349ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 47359ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonnamespace { 4736770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass ComplexExprEvaluator 47378cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : public ExprEvaluatorBase<ComplexExprEvaluator, bool> { 4738f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexValue &Result; 47391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47409ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonpublic: 4741f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexExprEvaluator(EvalInfo &info, ComplexValue &Result) 47428cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : ExprEvaluatorBaseTy(info), Result(Result) {} 47431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 474447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith bool Success(const CCValue &V, const Expr *e) { 47458cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne Result.setFrom(V); 47468cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return true; 47478cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 47481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47498cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne //===--------------------------------------------------------------------===// 47508cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne // Visitor Methods 47518cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne //===--------------------------------------------------------------------===// 47529ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 47538cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitImaginaryLiteral(const ImaginaryLiteral *E); 4754a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 47558cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCastExpr(const CastExpr *E); 4756b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman 4757b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman bool VisitBinaryOperator(const BinaryOperator *E); 475896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara bool VisitUnaryOperator(const UnaryOperator *E); 4759cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl // FIXME Missing: ImplicitValueInitExpr, InitListExpr 4760b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman}; 4761b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman} // end anonymous namespace 47621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4763b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedmanstatic bool EvaluateComplex(const Expr *E, ComplexValue &Result, 4764b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman EvalInfo &Info) { 4765c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith assert(E->isRValue() && E->getType()->isAnyComplexType()); 47668cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return ComplexExprEvaluator(Info, Result).Visit(E); 4767b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman} 4768b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman 47698cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool ComplexExprEvaluator::VisitImaginaryLiteral(const ImaginaryLiteral *E) { 47708cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne const Expr* SubExpr = E->getSubExpr(); 4771b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman 4772b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman if (SubExpr->getType()->isRealFloatingType()) { 4773b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman Result.makeComplexFloat(); 4774b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman APFloat &Imag = Result.FloatImag; 4775b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman if (!EvaluateFloat(SubExpr, Imag, Info)) 4776b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman return false; 4777b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman 4778b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman Result.FloatReal = APFloat(Imag.getSemantics()); 4779b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman return true; 4780b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman } else { 4781b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman assert(SubExpr->getType()->isIntegerType() && 4782b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman "Unexpected imaginary literal."); 4783b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman 4784b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman Result.makeComplexInt(); 4785b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman APSInt &Imag = Result.IntImag; 4786b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman if (!EvaluateInteger(SubExpr, Imag, Info)) 4787b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman return false; 4788b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman 4789b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman Result.IntReal = APSInt(Imag.getBitWidth(), !Imag.isSigned()); 4790b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman return true; 4791b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman } 4792b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman} 4793b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman 47948cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool ComplexExprEvaluator::VisitCastExpr(const CastExpr *E) { 4795b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman 47968786da77984e81d48e0e1b2bd339809b1efc19f3John McCall switch (E->getCastKind()) { 47978786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_BitCast: 47988786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_BaseToDerived: 47998786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_DerivedToBase: 48008786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_UncheckedDerivedToBase: 48018786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_Dynamic: 48028786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_ToUnion: 48038786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_ArrayToPointerDecay: 48048786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_FunctionToPointerDecay: 48058786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_NullToPointer: 48068786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_NullToMemberPointer: 48078786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_BaseToDerivedMemberPointer: 48088786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_DerivedToBaseMemberPointer: 48098786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_MemberPointerToBoolean: 48108786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_ConstructorConversion: 48118786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_IntegralToPointer: 48128786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_PointerToIntegral: 48138786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_PointerToBoolean: 48148786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_ToVoid: 48158786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_VectorSplat: 48168786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_IntegralCast: 48178786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_IntegralToBoolean: 48188786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_IntegralToFloating: 48198786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_FloatingToIntegral: 48208786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_FloatingToBoolean: 48218786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_FloatingCast: 48221d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall case CK_CPointerToObjCPointerCast: 48231d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall case CK_BlockPointerToObjCPointerCast: 48248786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_AnyPointerToBlockPointerCast: 48258786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_ObjCObjectLValueCast: 48268786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_FloatingComplexToReal: 48278786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_FloatingComplexToBoolean: 48288786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_IntegralComplexToReal: 48298786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_IntegralComplexToBoolean: 483033e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall case CK_ARCProduceObject: 483133e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall case CK_ARCConsumeObject: 483233e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall case CK_ARCReclaimReturnedObject: 483333e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall case CK_ARCExtendBlockObject: 48348786da77984e81d48e0e1b2bd339809b1efc19f3John McCall llvm_unreachable("invalid cast kind for complex value"); 48358786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 48368786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_LValueToRValue: 48378786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_NoOp: 4838c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return ExprEvaluatorBaseTy::VisitCastExpr(E); 48392bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall 48408786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_Dependent: 484146a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_LValueBitCast: 48428786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_UserDefinedConversion: 4843f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 48448786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 48458786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_FloatingRealToComplex: { 4846b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman APFloat &Real = Result.FloatReal; 48478786da77984e81d48e0e1b2bd339809b1efc19f3John McCall if (!EvaluateFloat(E->getSubExpr(), Real, Info)) 4848b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman return false; 4849b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman 48508786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.makeComplexFloat(); 48518786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.FloatImag = APFloat(Real.getSemantics()); 48528786da77984e81d48e0e1b2bd339809b1efc19f3John McCall return true; 48538786da77984e81d48e0e1b2bd339809b1efc19f3John McCall } 48548786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 48558786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_FloatingComplexCast: { 48568786da77984e81d48e0e1b2bd339809b1efc19f3John McCall if (!Visit(E->getSubExpr())) 48578786da77984e81d48e0e1b2bd339809b1efc19f3John McCall return false; 48588786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 48598786da77984e81d48e0e1b2bd339809b1efc19f3John McCall QualType To = E->getType()->getAs<ComplexType>()->getElementType(); 48608786da77984e81d48e0e1b2bd339809b1efc19f3John McCall QualType From 48618786da77984e81d48e0e1b2bd339809b1efc19f3John McCall = E->getSubExpr()->getType()->getAs<ComplexType>()->getElementType(); 48628786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 4863c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return HandleFloatToFloatCast(Info, E, From, To, Result.FloatReal) && 4864c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith HandleFloatToFloatCast(Info, E, From, To, Result.FloatImag); 48658786da77984e81d48e0e1b2bd339809b1efc19f3John McCall } 48668786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 48678786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_FloatingComplexToIntegralComplex: { 48688786da77984e81d48e0e1b2bd339809b1efc19f3John McCall if (!Visit(E->getSubExpr())) 48698786da77984e81d48e0e1b2bd339809b1efc19f3John McCall return false; 48708786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 48718786da77984e81d48e0e1b2bd339809b1efc19f3John McCall QualType To = E->getType()->getAs<ComplexType>()->getElementType(); 48728786da77984e81d48e0e1b2bd339809b1efc19f3John McCall QualType From 48738786da77984e81d48e0e1b2bd339809b1efc19f3John McCall = E->getSubExpr()->getType()->getAs<ComplexType>()->getElementType(); 48748786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.makeComplexInt(); 4875c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return HandleFloatToIntCast(Info, E, From, Result.FloatReal, 4876c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith To, Result.IntReal) && 4877c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith HandleFloatToIntCast(Info, E, From, Result.FloatImag, 4878c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith To, Result.IntImag); 48798786da77984e81d48e0e1b2bd339809b1efc19f3John McCall } 48808786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 48818786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_IntegralRealToComplex: { 4882b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman APSInt &Real = Result.IntReal; 48838786da77984e81d48e0e1b2bd339809b1efc19f3John McCall if (!EvaluateInteger(E->getSubExpr(), Real, Info)) 4884b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman return false; 48859ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 48868786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.makeComplexInt(); 48878786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.IntImag = APSInt(Real.getBitWidth(), !Real.isSigned()); 48888786da77984e81d48e0e1b2bd339809b1efc19f3John McCall return true; 48898786da77984e81d48e0e1b2bd339809b1efc19f3John McCall } 48908786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 48918786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_IntegralComplexCast: { 48928786da77984e81d48e0e1b2bd339809b1efc19f3John McCall if (!Visit(E->getSubExpr())) 4893b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman return false; 4894ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 48958786da77984e81d48e0e1b2bd339809b1efc19f3John McCall QualType To = E->getType()->getAs<ComplexType>()->getElementType(); 48968786da77984e81d48e0e1b2bd339809b1efc19f3John McCall QualType From 48978786da77984e81d48e0e1b2bd339809b1efc19f3John McCall = E->getSubExpr()->getType()->getAs<ComplexType>()->getElementType(); 48981725f683432715e5afe34d476024bd6f16eac3fcEli Friedman 48998786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.IntReal = HandleIntToIntCast(To, From, Result.IntReal, Info.Ctx); 49008786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.IntImag = HandleIntToIntCast(To, From, Result.IntImag, Info.Ctx); 49018786da77984e81d48e0e1b2bd339809b1efc19f3John McCall return true; 49028786da77984e81d48e0e1b2bd339809b1efc19f3John McCall } 49038786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 49048786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_IntegralComplexToFloatingComplex: { 49058786da77984e81d48e0e1b2bd339809b1efc19f3John McCall if (!Visit(E->getSubExpr())) 49068786da77984e81d48e0e1b2bd339809b1efc19f3John McCall return false; 49078786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 49088786da77984e81d48e0e1b2bd339809b1efc19f3John McCall QualType To = E->getType()->getAs<ComplexType>()->getElementType(); 49098786da77984e81d48e0e1b2bd339809b1efc19f3John McCall QualType From 49108786da77984e81d48e0e1b2bd339809b1efc19f3John McCall = E->getSubExpr()->getType()->getAs<ComplexType>()->getElementType(); 49118786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.makeComplexFloat(); 4912c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return HandleIntToFloatCast(Info, E, From, Result.IntReal, 4913c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith To, Result.FloatReal) && 4914c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith HandleIntToFloatCast(Info, E, From, Result.IntImag, 4915c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith To, Result.FloatImag); 49168786da77984e81d48e0e1b2bd339809b1efc19f3John McCall } 4917ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson } 49181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49198786da77984e81d48e0e1b2bd339809b1efc19f3John McCall llvm_unreachable("unknown cast resulting in complex value"); 4920f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 49219ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson} 49229ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 4923f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCallbool ComplexExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 4924e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (E->isPtrMemOp() || E->isAssignmentOp() || E->getOpcode() == BO_Comma) 49252ad226bdc847df6b6b6e4f832856478ab63bb3dcRichard Smith return ExprEvaluatorBaseTy::VisitBinaryOperator(E); 49262ad226bdc847df6b6b6e4f832856478ab63bb3dcRichard Smith 4927f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall if (!Visit(E->getLHS())) 4928f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall return false; 49291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4930f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexValue RHS; 4931a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateComplex(E->getRHS(), RHS, Info)) 4932f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall return false; 4933a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 49343f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar assert(Result.isComplexFloat() == RHS.isComplexFloat() && 49353f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar "Invalid operands to binary operator."); 4936ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson switch (E->getOpcode()) { 4937f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith default: return Error(E); 49382de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Add: 4939a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (Result.isComplexFloat()) { 4940a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatReal().add(RHS.getComplexFloatReal(), 4941a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 4942a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatImag().add(RHS.getComplexFloatImag(), 4943a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 4944a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else { 4945a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntReal() += RHS.getComplexIntReal(); 4946a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntImag() += RHS.getComplexIntImag(); 4947a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } 49483f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar break; 49492de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Sub: 4950a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (Result.isComplexFloat()) { 4951a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatReal().subtract(RHS.getComplexFloatReal(), 4952a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 4953a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatImag().subtract(RHS.getComplexFloatImag(), 4954a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 4955a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else { 4956a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntReal() -= RHS.getComplexIntReal(); 4957a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntImag() -= RHS.getComplexIntImag(); 4958a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } 49593f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar break; 49602de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Mul: 49613f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar if (Result.isComplexFloat()) { 4962f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexValue LHS = Result; 49633f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &LHS_r = LHS.getComplexFloatReal(); 49643f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &LHS_i = LHS.getComplexFloatImag(); 49653f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &RHS_r = RHS.getComplexFloatReal(); 49663f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &RHS_i = RHS.getComplexFloatImag(); 49671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49683f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat Tmp = LHS_r; 49693f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven); 49703f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatReal() = Tmp; 49713f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp = LHS_i; 49723f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven); 49733f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatReal().subtract(Tmp, APFloat::rmNearestTiesToEven); 49743f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar 49753f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp = LHS_r; 49763f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven); 49773f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatImag() = Tmp; 49783f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp = LHS_i; 49793f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven); 49803f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatImag().add(Tmp, APFloat::rmNearestTiesToEven); 49813f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar } else { 4982f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexValue LHS = Result; 49831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.getComplexIntReal() = 49843f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar (LHS.getComplexIntReal() * RHS.getComplexIntReal() - 49853f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar LHS.getComplexIntImag() * RHS.getComplexIntImag()); 49861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.getComplexIntImag() = 49873f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar (LHS.getComplexIntReal() * RHS.getComplexIntImag() + 49883f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar LHS.getComplexIntImag() * RHS.getComplexIntReal()); 49893f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar } 49903f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar break; 499196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara case BO_Div: 499296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara if (Result.isComplexFloat()) { 499396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara ComplexValue LHS = Result; 499496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara APFloat &LHS_r = LHS.getComplexFloatReal(); 499596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara APFloat &LHS_i = LHS.getComplexFloatImag(); 499696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara APFloat &RHS_r = RHS.getComplexFloatReal(); 499796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara APFloat &RHS_i = RHS.getComplexFloatImag(); 499896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara APFloat &Res_r = Result.getComplexFloatReal(); 499996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara APFloat &Res_i = Result.getComplexFloatImag(); 500096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara 500196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara APFloat Den = RHS_r; 500296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Den.multiply(RHS_r, APFloat::rmNearestTiesToEven); 500396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara APFloat Tmp = RHS_i; 500496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven); 500596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Den.add(Tmp, APFloat::rmNearestTiesToEven); 500696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara 500796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Res_r = LHS_r; 500896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Res_r.multiply(RHS_r, APFloat::rmNearestTiesToEven); 500996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Tmp = LHS_i; 501096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven); 501196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Res_r.add(Tmp, APFloat::rmNearestTiesToEven); 501296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Res_r.divide(Den, APFloat::rmNearestTiesToEven); 501396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara 501496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Res_i = LHS_i; 501596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Res_i.multiply(RHS_r, APFloat::rmNearestTiesToEven); 501696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Tmp = LHS_r; 501796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven); 501896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Res_i.subtract(Tmp, APFloat::rmNearestTiesToEven); 501996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Res_i.divide(Den, APFloat::rmNearestTiesToEven); 502096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara } else { 5021f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (RHS.getComplexIntReal() == 0 && RHS.getComplexIntImag() == 0) 5022f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E, diag::note_expr_divide_by_zero); 5023f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 502496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara ComplexValue LHS = Result; 502596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara APSInt Den = RHS.getComplexIntReal() * RHS.getComplexIntReal() + 502696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara RHS.getComplexIntImag() * RHS.getComplexIntImag(); 502796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Result.getComplexIntReal() = 502896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara (LHS.getComplexIntReal() * RHS.getComplexIntReal() + 502996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara LHS.getComplexIntImag() * RHS.getComplexIntImag()) / Den; 503096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Result.getComplexIntImag() = 503196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara (LHS.getComplexIntImag() * RHS.getComplexIntReal() - 503296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara LHS.getComplexIntReal() * RHS.getComplexIntImag()) / Den; 503396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara } 503496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara break; 5035ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson } 5036ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 5037f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall return true; 5038ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson} 5039ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 504096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnarabool ComplexExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { 504196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara // Get the operand value into 'Result'. 504296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara if (!Visit(E->getSubExpr())) 504396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara return false; 504496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara 504596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara switch (E->getOpcode()) { 504696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara default: 5047f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 504896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara case UO_Extension: 504996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara return true; 505096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara case UO_Plus: 505196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara // The result is always just the subexpr. 505296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara return true; 505396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara case UO_Minus: 505496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara if (Result.isComplexFloat()) { 505596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Result.getComplexFloatReal().changeSign(); 505696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Result.getComplexFloatImag().changeSign(); 505796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara } 505896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara else { 505996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Result.getComplexIntReal() = -Result.getComplexIntReal(); 506096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Result.getComplexIntImag() = -Result.getComplexIntImag(); 506196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara } 506296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara return true; 506396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara case UO_Not: 506496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara if (Result.isComplexFloat()) 506596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Result.getComplexFloatImag().changeSign(); 506696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara else 506796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Result.getComplexIntImag() = -Result.getComplexIntImag(); 506896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara return true; 506996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara } 507096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara} 507196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara 50729ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===// 5073aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith// Void expression evaluation, primarily for a cast to void on the LHS of a 5074aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith// comma operator 5075aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith//===----------------------------------------------------------------------===// 5076aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith 5077aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smithnamespace { 5078aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smithclass VoidExprEvaluator 5079aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith : public ExprEvaluatorBase<VoidExprEvaluator, bool> { 5080aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smithpublic: 5081aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith VoidExprEvaluator(EvalInfo &Info) : ExprEvaluatorBaseTy(Info) {} 5082aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith 5083aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith bool Success(const CCValue &V, const Expr *e) { return true; } 5084aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith 5085aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith bool VisitCastExpr(const CastExpr *E) { 5086aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith switch (E->getCastKind()) { 5087aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith default: 5088aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith return ExprEvaluatorBaseTy::VisitCastExpr(E); 5089aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith case CK_ToVoid: 5090aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith VisitIgnoredValue(E->getSubExpr()); 5091aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith return true; 5092aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith } 5093aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith } 5094aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith}; 5095aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith} // end anonymous namespace 5096aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith 5097aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smithstatic bool EvaluateVoid(const Expr *E, EvalInfo &Info) { 5098aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith assert(E->isRValue() && E->getType()->isVoidType()); 5099aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith return VoidExprEvaluator(Info).Visit(E); 5100aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith} 5101aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith 5102aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith//===----------------------------------------------------------------------===// 510351f4708c00110940ca3f337961915f2ca1668375Richard Smith// Top level Expr::EvaluateAsRValue method. 5104f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 5105f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 510647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smithstatic bool Evaluate(CCValue &Result, EvalInfo &Info, const Expr *E) { 5107c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // In C, function designators are not lvalues, but we evaluate them as if they 5108c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // are. 5109c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (E->isGLValue() || E->getType()->isFunctionType()) { 5110c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith LValue LV; 5111c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!EvaluateLValue(E, LV, Info)) 5112c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return false; 5113c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith LV.moveInto(Result); 5114c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith } else if (E->getType()->isVectorType()) { 51151e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith if (!EvaluateVector(E, Result, Info)) 511659b5da6d853b4368b984700315adf7b37de05764Nate Begeman return false; 5117575a1c9dc8dc5b4977194993e289f9eda7295c39Douglas Gregor } else if (E->getType()->isIntegralOrEnumerationType()) { 51181e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith if (!IntExprEvaluator(Info, Result).Visit(E)) 51196dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 5120efdb83e26f9a1fd2566afe54461216cd84814d42John McCall } else if (E->getType()->hasPointerRepresentation()) { 5121efdb83e26f9a1fd2566afe54461216cd84814d42John McCall LValue LV; 5122efdb83e26f9a1fd2566afe54461216cd84814d42John McCall if (!EvaluatePointer(E, LV, Info)) 51236dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 51241e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith LV.moveInto(Result); 5125efdb83e26f9a1fd2566afe54461216cd84814d42John McCall } else if (E->getType()->isRealFloatingType()) { 5126efdb83e26f9a1fd2566afe54461216cd84814d42John McCall llvm::APFloat F(0.0); 5127efdb83e26f9a1fd2566afe54461216cd84814d42John McCall if (!EvaluateFloat(E, F, Info)) 51286dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 512947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Result = CCValue(F); 5130efdb83e26f9a1fd2566afe54461216cd84814d42John McCall } else if (E->getType()->isAnyComplexType()) { 5131efdb83e26f9a1fd2566afe54461216cd84814d42John McCall ComplexValue C; 5132efdb83e26f9a1fd2566afe54461216cd84814d42John McCall if (!EvaluateComplex(E, C, Info)) 5133660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump return false; 51341e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith C.moveInto(Result); 513569c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith } else if (E->getType()->isMemberPointerType()) { 5136e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MemberPtr P; 5137e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!EvaluateMemberPointer(E, P, Info)) 5138e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 5139e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith P.moveInto(Result); 5140e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 5141eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith } else if (E->getType()->isArrayType()) { 5142180f47959a066795cc0f409433023af448bb0328Richard Smith LValue LV; 51431bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith LV.set(E, Info.CurrentCall); 5144180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateArray(E, LV, Info.CurrentCall->Temporaries[E], Info)) 5145cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return false; 5146180f47959a066795cc0f409433023af448bb0328Richard Smith Result = Info.CurrentCall->Temporaries[E]; 5147eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith } else if (E->getType()->isRecordType()) { 5148180f47959a066795cc0f409433023af448bb0328Richard Smith LValue LV; 51491bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith LV.set(E, Info.CurrentCall); 5150180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateRecord(E, LV, Info.CurrentCall->Temporaries[E], Info)) 5151180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 5152180f47959a066795cc0f409433023af448bb0328Richard Smith Result = Info.CurrentCall->Temporaries[E]; 5153aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith } else if (E->getType()->isVoidType()) { 5154c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith if (Info.getLangOpts().CPlusPlus0x) 5155c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith Info.CCEDiag(E->getExprLoc(), diag::note_constexpr_nonliteral) 5156c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith << E->getType(); 5157c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith else 5158c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith Info.CCEDiag(E->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 5159aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith if (!EvaluateVoid(E, Info)) 5160aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith return false; 5161c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith } else if (Info.getLangOpts().CPlusPlus0x) { 5162c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith Info.Diag(E->getExprLoc(), diag::note_constexpr_nonliteral) << E->getType(); 5163c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith return false; 5164f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } else { 5165dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(E->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 5166660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump return false; 5167f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 5168660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump 5169660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump return true; 5170660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump} 5171660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump 517269c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith/// EvaluateConstantExpression - Evaluate an expression as a constant expression 517369c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith/// in-place in an APValue. In some cases, the in-place evaluation is essential, 517469c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith/// since later initializers for an object can indirectly refer to subobjects 517569c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith/// which were initialized earlier. 517669c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smithstatic bool EvaluateConstantExpression(APValue &Result, EvalInfo &Info, 5177c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith const LValue &This, const Expr *E, 5178c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith CheckConstantExpressionKind CCEK) { 5179eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith if (!CheckLiteralType(Info, E)) 5180eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith return false; 5181eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith 5182eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith if (E->isRValue()) { 518369c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith // Evaluate arrays and record types in-place, so that later initializers can 518469c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith // refer to earlier-initialized members of the object. 5185180f47959a066795cc0f409433023af448bb0328Richard Smith if (E->getType()->isArrayType()) 5186180f47959a066795cc0f409433023af448bb0328Richard Smith return EvaluateArray(E, This, Result, Info); 5187180f47959a066795cc0f409433023af448bb0328Richard Smith else if (E->getType()->isRecordType()) 5188180f47959a066795cc0f409433023af448bb0328Richard Smith return EvaluateRecord(E, This, Result, Info); 518969c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith } 519069c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith 519169c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith // For any other type, in-place evaluation is unimportant. 519269c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith CCValue CoreConstResult; 519369c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith return Evaluate(CoreConstResult, Info, E) && 5194c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith CheckConstantExpression(Info, E, CoreConstResult, Result, CCEK); 519569c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith} 519669c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith 5197f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith/// EvaluateAsRValue - Try to evaluate this expression, performing an implicit 5198f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith/// lvalue-to-rvalue cast if it is an lvalue. 5199f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithstatic bool EvaluateAsRValue(EvalInfo &Info, const Expr *E, APValue &Result) { 5200eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith if (!CheckLiteralType(Info, E)) 5201eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith return false; 5202eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith 5203f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith CCValue Value; 5204f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!::Evaluate(Value, Info, E)) 5205f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 5206f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 5207f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (E->isGLValue()) { 5208f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith LValue LV; 5209f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith LV.setFrom(Value); 5210f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!HandleLValueToRValueConversion(Info, E, E->getType(), LV, Value)) 5211f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 5212f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 5213f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 5214f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // Check this core constant expression is a constant expression, and if so, 5215f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // convert it to one. 5216f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return CheckConstantExpression(Info, E, Value, Result); 5217f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith} 5218c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 521951f4708c00110940ca3f337961915f2ca1668375Richard Smith/// EvaluateAsRValue - Return true if this is a constant which we can fold using 522056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// any crazy technique (that has nothing to do with language standards) that 522156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// we want to. If this function returns true, it returns the folded constant 5222c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// in Result. If this expression is a glvalue, an lvalue-to-rvalue conversion 5223c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// will be applied to the result. 522451f4708c00110940ca3f337961915f2ca1668375Richard Smithbool Expr::EvaluateAsRValue(EvalResult &Result, const ASTContext &Ctx) const { 5225ee19f43bf8973bfcccb7329e32a4198641767949Richard Smith // Fast-path evaluations of integer literals, since we sometimes see files 5226ee19f43bf8973bfcccb7329e32a4198641767949Richard Smith // containing vast quantities of these. 5227ee19f43bf8973bfcccb7329e32a4198641767949Richard Smith if (const IntegerLiteral *L = dyn_cast<IntegerLiteral>(this)) { 5228ee19f43bf8973bfcccb7329e32a4198641767949Richard Smith Result.Val = APValue(APSInt(L->getValue(), 5229ee19f43bf8973bfcccb7329e32a4198641767949Richard Smith L->getType()->isUnsignedIntegerType())); 5230ee19f43bf8973bfcccb7329e32a4198641767949Richard Smith return true; 5231ee19f43bf8973bfcccb7329e32a4198641767949Richard Smith } 5232ee19f43bf8973bfcccb7329e32a4198641767949Richard Smith 52331445bbacf4c8de5f208ff4ccb302424a4d9e233eRichard Smith // FIXME: Evaluating initializers for large arrays can cause performance 52341445bbacf4c8de5f208ff4ccb302424a4d9e233eRichard Smith // problems, and we don't use such values yet. Once we have a more efficient 52351445bbacf4c8de5f208ff4ccb302424a4d9e233eRichard Smith // array representation, this should be reinstated, and used by CodeGen. 5236e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // The same problem affects large records. 5237e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (isRValue() && (getType()->isArrayType() || getType()->isRecordType()) && 5238e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith !Ctx.getLangOptions().CPlusPlus0x) 52391445bbacf4c8de5f208ff4ccb302424a4d9e233eRichard Smith return false; 52401445bbacf4c8de5f208ff4ccb302424a4d9e233eRichard Smith 5241180f47959a066795cc0f409433023af448bb0328Richard Smith // FIXME: If this is the initializer for an lvalue, pass that in. 5242f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith EvalInfo Info(Ctx, Result); 5243f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return ::EvaluateAsRValue(Info, this, Result.Val); 524456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall} 524556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 52464ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool Expr::EvaluateAsBooleanCondition(bool &Result, 52474ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const ASTContext &Ctx) const { 5248c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith EvalResult Scratch; 524951f4708c00110940ca3f337961915f2ca1668375Richard Smith return EvaluateAsRValue(Scratch, Ctx) && 5250177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith HandleConversionToBool(CCValue(Scratch.Val, CCValue::GlobalValue()), 525147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Result); 5252cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall} 5253cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall 525480d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smithbool Expr::EvaluateAsInt(APSInt &Result, const ASTContext &Ctx, 525580d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith SideEffectsKind AllowSideEffects) const { 525680d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith if (!getType()->isIntegralOrEnumerationType()) 525780d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith return false; 525880d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith 5259c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith EvalResult ExprResult; 526080d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith if (!EvaluateAsRValue(ExprResult, Ctx) || !ExprResult.Val.isInt() || 526180d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith (!AllowSideEffects && ExprResult.HasSideEffects)) 5262c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return false; 5263f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 5264c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith Result = ExprResult.Val.getInt(); 5265c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return true; 5266a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith} 5267a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith 52684ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool Expr::EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx) const { 52691b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson EvalInfo Info(Ctx, Result); 52701b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson 5271efdb83e26f9a1fd2566afe54461216cd84814d42John McCall LValue LV; 52729a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith return EvaluateLValue(this, LV, Info) && !Result.HasSideEffects && 5273c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith CheckLValueConstantExpression(Info, this, LV, Result.Val, 5274c1c5f27c64dfc3332d53ad30e44d626e4f9afac3Richard Smith CCEK_Constant); 5275b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman} 5276b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman 5277099e7f647ccda915513f2b2ec53352dc756082d3Richard Smithbool Expr::EvaluateAsInitializer(APValue &Value, const ASTContext &Ctx, 5278099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith const VarDecl *VD, 5279099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith llvm::SmallVectorImpl<PartialDiagnosticAt> &Notes) const { 5280099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith Expr::EvalStatus EStatus; 5281099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith EStatus.Diag = &Notes; 5282099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith 5283099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith EvalInfo InitInfo(Ctx, EStatus); 5284099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith InitInfo.setEvaluatingDecl(VD, Value); 5285099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith 5286eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith if (!CheckLiteralType(InitInfo, this)) 5287eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith return false; 5288eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith 5289099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith LValue LVal; 5290099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith LVal.set(VD); 5291099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith 5292eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith // C++11 [basic.start.init]p2: 5293eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith // Variables with static storage duration or thread storage duration shall be 5294eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith // zero-initialized before any other initialization takes place. 5295eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith // This behavior is not present in C. 5296eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith if (Ctx.getLangOptions().CPlusPlus && !VD->hasLocalStorage() && 5297eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith !VD->getType()->isReferenceType()) { 5298eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith ImplicitValueInitExpr VIE(VD->getType()); 5299eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith if (!EvaluateConstantExpression(Value, InitInfo, LVal, &VIE)) 5300eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith return false; 5301eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith } 5302eba05b2e396e1474f7bd6e8e8e1bd7752effef4dRichard Smith 5303099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith return EvaluateConstantExpression(Value, InitInfo, LVal, this) && 5304099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith !EStatus.HasSideEffects; 5305099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith} 5306099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith 530751f4708c00110940ca3f337961915f2ca1668375Richard Smith/// isEvaluatable - Call EvaluateAsRValue to see if this expression can be 530851f4708c00110940ca3f337961915f2ca1668375Richard Smith/// constant folded, but discard the result. 53094ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool Expr::isEvaluatable(const ASTContext &Ctx) const { 53104fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson EvalResult Result; 531151f4708c00110940ca3f337961915f2ca1668375Richard Smith return EvaluateAsRValue(Result, Ctx) && !Result.HasSideEffects; 531245b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner} 531351fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson 53144ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool Expr::HasSideEffects(const ASTContext &Ctx) const { 53151e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith return HasSideEffect(Ctx).Visit(this); 5316393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian} 5317393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian 5318a6b8b2c09610b8bc4330e948ece8b940c2386406Richard SmithAPSInt Expr::EvaluateKnownConstInt(const ASTContext &Ctx) const { 53191c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson EvalResult EvalResult; 532051f4708c00110940ca3f337961915f2ca1668375Richard Smith bool Result = EvaluateAsRValue(EvalResult, Ctx); 5321c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin (void)Result; 532251fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson assert(Result && "Could not evaluate expression"); 53231c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer"); 532451fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson 53251c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson return EvalResult.Val.getInt(); 532651fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson} 5327d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 5328e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara bool Expr::EvalResult::isGlobalLValue() const { 5329e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara assert(Val.isLValue()); 5330e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara return IsGlobalLValue(Val.getLValueBase()); 5331e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara } 5332e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara 5333e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara 5334d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// isIntegerConstantExpr - this recursive routine will test if an expression is 5335d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// an integer constant expression. 5336d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 5337d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// FIXME: Pass up a reason why! Invalid operation in i-c-e, division by zero, 5338d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// comma, etc 5339d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// 5340d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// FIXME: Handle offsetof. Two things to do: Handle GCC's __builtin_offsetof 5341d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// to support gcc 4.0+ and handle the idiom GCC recognizes with a null pointer 5342d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// cast+dereference. 5343d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 5344d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// CheckICE - This function does the fundamental ICE checking: the returned 5345d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// ICEDiag contains a Val of 0, 1, or 2, and a possibly null SourceLocation. 5346d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// Note that to reduce code duplication, this helper does no evaluation 5347d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// itself; the caller checks whether the expression is evaluatable, and 5348d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// in the rare cases where CheckICE actually cares about the evaluated 5349d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// value, it calls into Evalute. 5350d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// 5351d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// Meanings of Val: 535251f4708c00110940ca3f337961915f2ca1668375Richard Smith// 0: This expression is an ICE. 5353d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// 1: This expression is not an ICE, but if it isn't evaluated, it's 5354d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// a legal subexpression for an ICE. This return value is used to handle 5355d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// the comma operator in C99 mode. 5356d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// 2: This expression is not an ICE, and is not a legal subexpression for one. 5357d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 53583c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohmannamespace { 53593c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohman 5360d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCallstruct ICEDiag { 5361d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall unsigned Val; 5362d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall SourceLocation Loc; 5363d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 5364d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall public: 5365d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall ICEDiag(unsigned v, SourceLocation l) : Val(v), Loc(l) {} 5366d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall ICEDiag() : Val(0) {} 5367d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall}; 5368d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 53693c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohman} 53703c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohman 53713c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohmanstatic ICEDiag NoDiag() { return ICEDiag(); } 5372d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 5373d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCallstatic ICEDiag CheckEvalInICE(const Expr* E, ASTContext &Ctx) { 5374d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall Expr::EvalResult EVResult; 537551f4708c00110940ca3f337961915f2ca1668375Richard Smith if (!E->EvaluateAsRValue(EVResult, Ctx) || EVResult.HasSideEffects || 5376d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall !EVResult.Val.isInt()) { 5377d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 5378d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5379d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return NoDiag(); 5380d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall} 5381d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 5382d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCallstatic ICEDiag CheckICE(const Expr* E, ASTContext &Ctx) { 5383d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall assert(!E->isValueDependent() && "Should not see value dependent exprs!"); 53842ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor if (!E->getType()->isIntegralOrEnumerationType()) { 5385d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 5386d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5387d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 5388d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall switch (E->getStmtClass()) { 538963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall#define ABSTRACT_STMT(Node) 5390d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall#define STMT(Node, Base) case Expr::Node##Class: 5391d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall#define EXPR(Node, Base) 5392d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall#include "clang/AST/StmtNodes.inc" 5393d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::PredefinedExprClass: 5394d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::FloatingLiteralClass: 5395d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ImaginaryLiteralClass: 5396d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::StringLiteralClass: 5397d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ArraySubscriptExprClass: 5398d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::MemberExprClass: 5399d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CompoundAssignOperatorClass: 5400d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CompoundLiteralExprClass: 5401d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ExtVectorElementExprClass: 5402d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::DesignatedInitExprClass: 5403d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ImplicitValueInitExprClass: 5404d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ParenListExprClass: 5405d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::VAArgExprClass: 5406d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::AddrLabelExprClass: 5407d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::StmtExprClass: 5408d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXMemberCallExprClass: 5409e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne case Expr::CUDAKernelCallExprClass: 5410d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXDynamicCastExprClass: 5411d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXTypeidExprClass: 54129be88403e965cc49af76c9d33d818781d44b333eFrancois Pichet case Expr::CXXUuidofExprClass: 5413d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXNullPtrLiteralExprClass: 5414d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXThisExprClass: 5415d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXThrowExprClass: 5416d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXNewExprClass: 5417d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXDeleteExprClass: 5418d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXPseudoDestructorExprClass: 5419d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::UnresolvedLookupExprClass: 5420d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::DependentScopeDeclRefExprClass: 5421d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXConstructExprClass: 5422d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXBindTemporaryExprClass: 54234765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall case Expr::ExprWithCleanupsClass: 5424d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXTemporaryObjectExprClass: 5425d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXUnresolvedConstructExprClass: 5426d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXDependentScopeMemberExprClass: 5427d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::UnresolvedMemberExprClass: 5428d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ObjCStringLiteralClass: 5429d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ObjCEncodeExprClass: 5430d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ObjCMessageExprClass: 5431d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ObjCSelectorExprClass: 5432d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ObjCProtocolExprClass: 5433d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ObjCIvarRefExprClass: 5434d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ObjCPropertyRefExprClass: 5435d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ObjCIsaExprClass: 5436d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ShuffleVectorExprClass: 5437d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::BlockExprClass: 5438d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::BlockDeclRefExprClass: 5439d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::NoStmtClass: 54407cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall case Expr::OpaqueValueExprClass: 5441be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor case Expr::PackExpansionExprClass: 5442c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor case Expr::SubstNonTypeTemplateParmPackExprClass: 544361eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner case Expr::AsTypeExprClass: 5444f85e193739c953358c865005855253af4f68a497John McCall case Expr::ObjCIndirectCopyRestoreExprClass: 544503e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor case Expr::MaterializeTemporaryExprClass: 54464b9c2d235fb9449e249d74f48ecfec601650de93John McCall case Expr::PseudoObjectExprClass: 5447276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman case Expr::AtomicExprClass: 5448cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl case Expr::InitListExprClass: 5449cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl return ICEDiag(2, E->getLocStart()); 5450cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl 5451ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor case Expr::SizeOfPackExprClass: 5452d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::GNUNullExprClass: 5453d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // GCC considers the GNU __null value to be an integral constant expression. 5454d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return NoDiag(); 5455d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 545691a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall case Expr::SubstNonTypeTemplateParmExprClass: 545791a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall return 545891a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall CheckICE(cast<SubstNonTypeTemplateParmExpr>(E)->getReplacement(), Ctx); 545991a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall 5460d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ParenExprClass: 5461d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return CheckICE(cast<ParenExpr>(E)->getSubExpr(), Ctx); 5462f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne case Expr::GenericSelectionExprClass: 5463f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne return CheckICE(cast<GenericSelectionExpr>(E)->getResultExpr(), Ctx); 5464d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::IntegerLiteralClass: 5465d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CharacterLiteralClass: 5466d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXBoolLiteralExprClass: 5467ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor case Expr::CXXScalarValueInitExprClass: 5468d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::UnaryTypeTraitExprClass: 54696ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet case Expr::BinaryTypeTraitExprClass: 547021ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley case Expr::ArrayTypeTraitExprClass: 5471552622067dc45013d240f73952fece703f5e63bdJohn Wiegley case Expr::ExpressionTraitExprClass: 54722e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl case Expr::CXXNoexceptExprClass: 5473d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return NoDiag(); 5474d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CallExprClass: 54756cf750298d3621d8a10a6dd07fcee8e274b9d94dSean Hunt case Expr::CXXOperatorCallExprClass: { 547605830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // C99 6.6/3 allows function calls within unevaluated subexpressions of 547705830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // constant expressions, but they can never be ICEs because an ICE cannot 547805830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // contain an operand of (pointer to) function type. 5479d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall const CallExpr *CE = cast<CallExpr>(E); 5480180f47959a066795cc0f409433023af448bb0328Richard Smith if (CE->isBuiltinCall()) 5481d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return CheckEvalInICE(E, Ctx); 5482d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 5483d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5484d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::DeclRefExprClass: 5485d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (isa<EnumConstantDecl>(cast<DeclRefExpr>(E)->getDecl())) 5486d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return NoDiag(); 548703f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith if (Ctx.getLangOptions().CPlusPlus && IsConstNonVolatile(E->getType())) { 5488d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall const NamedDecl *D = cast<DeclRefExpr>(E)->getDecl(); 5489d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 5490d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // Parameter variables are never constants. Without this check, 5491d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // getAnyInitializer() can find a default argument, which leads 5492d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // to chaos. 5493d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (isa<ParmVarDecl>(D)) 5494d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, cast<DeclRefExpr>(E)->getLocation()); 5495d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 5496d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // C++ 7.1.5.1p2 5497d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // A variable of non-volatile const-qualified integral or enumeration 5498d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // type initialized by an ICE can be used in ICEs. 5499d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (const VarDecl *Dcl = dyn_cast<VarDecl>(D)) { 5500db1822c6de43ff4aa5fa00234bf8222f6f4816e8Richard Smith if (!Dcl->getType()->isIntegralOrEnumerationType()) 5501db1822c6de43ff4aa5fa00234bf8222f6f4816e8Richard Smith return ICEDiag(2, cast<DeclRefExpr>(E)->getLocation()); 5502db1822c6de43ff4aa5fa00234bf8222f6f4816e8Richard Smith 5503099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith const VarDecl *VD; 5504099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith // Look for a declaration of this variable that has an initializer, and 5505099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith // check whether it is an ICE. 5506099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith if (Dcl->getAnyInitializer(VD) && VD->checkInitIsICE()) 5507099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith return NoDiag(); 5508099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith else 5509099e7f647ccda915513f2b2ec53352dc756082d3Richard Smith return ICEDiag(2, cast<DeclRefExpr>(E)->getLocation()); 5510d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5511d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5512d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 5513d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::UnaryOperatorClass: { 5514d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall const UnaryOperator *Exp = cast<UnaryOperator>(E); 5515d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall switch (Exp->getOpcode()) { 55162de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_PostInc: 55172de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_PostDec: 55182de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_PreInc: 55192de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_PreDec: 55202de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_AddrOf: 55212de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Deref: 552205830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // C99 6.6/3 allows increment and decrement within unevaluated 552305830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // subexpressions of constant expressions, but they can never be ICEs 552405830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // because an ICE cannot contain an lvalue operand. 5525d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 55262de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Extension: 55272de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_LNot: 55282de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Plus: 55292de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Minus: 55302de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Not: 55312de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Real: 55322de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Imag: 5533d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return CheckICE(Exp->getSubExpr(), Ctx); 5534d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5535d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 5536d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // OffsetOf falls through here. 5537d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5538d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::OffsetOfExprClass: { 5539d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // Note that per C99, offsetof must be an ICE. And AFAIK, using 554051f4708c00110940ca3f337961915f2ca1668375Richard Smith // EvaluateAsRValue matches the proposed gcc behavior for cases like 554105830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // "offsetof(struct s{int x[4];}, x[1.0])". This doesn't affect 5542d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // compliance: we should warn earlier for offsetof expressions with 5543d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // array subscripts that aren't ICEs, and if the array subscripts 5544d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // are ICEs, the value of the offsetof must be an integer constant. 5545d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return CheckEvalInICE(E, Ctx); 5546d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5547f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case Expr::UnaryExprOrTypeTraitExprClass: { 5548f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne const UnaryExprOrTypeTraitExpr *Exp = cast<UnaryExprOrTypeTraitExpr>(E); 5549f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne if ((Exp->getKind() == UETT_SizeOf) && 5550f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne Exp->getTypeOfArgument()->isVariableArrayType()) 5551d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 5552d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return NoDiag(); 5553d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5554d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::BinaryOperatorClass: { 5555d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall const BinaryOperator *Exp = cast<BinaryOperator>(E); 5556d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall switch (Exp->getOpcode()) { 55572de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_PtrMemD: 55582de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_PtrMemI: 55592de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Assign: 55602de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_MulAssign: 55612de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_DivAssign: 55622de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_RemAssign: 55632de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_AddAssign: 55642de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_SubAssign: 55652de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_ShlAssign: 55662de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_ShrAssign: 55672de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_AndAssign: 55682de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_XorAssign: 55692de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_OrAssign: 557005830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // C99 6.6/3 allows assignments within unevaluated subexpressions of 557105830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // constant expressions, but they can never be ICEs because an ICE cannot 557205830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // contain an lvalue operand. 5573d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 5574d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 55752de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Mul: 55762de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Div: 55772de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Rem: 55782de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Add: 55792de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Sub: 55802de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Shl: 55812de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Shr: 55822de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LT: 55832de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_GT: 55842de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LE: 55852de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_GE: 55862de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_EQ: 55872de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_NE: 55882de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_And: 55892de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Xor: 55902de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Or: 55912de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Comma: { 5592d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall ICEDiag LHSResult = CheckICE(Exp->getLHS(), Ctx); 5593d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall ICEDiag RHSResult = CheckICE(Exp->getRHS(), Ctx); 55942de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (Exp->getOpcode() == BO_Div || 55952de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall Exp->getOpcode() == BO_Rem) { 559651f4708c00110940ca3f337961915f2ca1668375Richard Smith // EvaluateAsRValue gives an error for undefined Div/Rem, so make sure 5597d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // we don't evaluate one. 55983b332ab132fa85c83833d74d400f6e126f52fbd2John McCall if (LHSResult.Val == 0 && RHSResult.Val == 0) { 5599a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith llvm::APSInt REval = Exp->getRHS()->EvaluateKnownConstInt(Ctx); 5600d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (REval == 0) 5601d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(1, E->getLocStart()); 5602d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (REval.isSigned() && REval.isAllOnesValue()) { 5603a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith llvm::APSInt LEval = Exp->getLHS()->EvaluateKnownConstInt(Ctx); 5604d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (LEval.isMinSignedValue()) 5605d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(1, E->getLocStart()); 5606d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5607d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5608d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 56092de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (Exp->getOpcode() == BO_Comma) { 5610d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (Ctx.getLangOptions().C99) { 5611d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // C99 6.6p3 introduces a strange edge case: comma can be in an ICE 5612d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // if it isn't evaluated. 5613d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (LHSResult.Val == 0 && RHSResult.Val == 0) 5614d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(1, E->getLocStart()); 5615d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } else { 5616d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // In both C89 and C++, commas in ICEs are illegal. 5617d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 5618d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5619d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5620d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (LHSResult.Val >= RHSResult.Val) 5621d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return LHSResult; 5622d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return RHSResult; 5623d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 56242de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LAnd: 56252de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LOr: { 5626d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall ICEDiag LHSResult = CheckICE(Exp->getLHS(), Ctx); 5627d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall ICEDiag RHSResult = CheckICE(Exp->getRHS(), Ctx); 5628d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (LHSResult.Val == 0 && RHSResult.Val == 1) { 5629d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // Rare case where the RHS has a comma "side-effect"; we need 5630d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // to actually check the condition to see whether the side 5631d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // with the comma is evaluated. 56322de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if ((Exp->getOpcode() == BO_LAnd) != 5633a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith (Exp->getLHS()->EvaluateKnownConstInt(Ctx) == 0)) 5634d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return RHSResult; 5635d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return NoDiag(); 5636d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5637d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 5638d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (LHSResult.Val >= RHSResult.Val) 5639d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return LHSResult; 5640d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return RHSResult; 5641d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5642d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5643d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5644d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ImplicitCastExprClass: 5645d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CStyleCastExprClass: 5646d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXFunctionalCastExprClass: 5647d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXStaticCastExprClass: 5648d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXReinterpretCastExprClass: 564932cb47174304bc7ec11478b9497c4e10f48273d9Richard Smith case Expr::CXXConstCastExprClass: 5650f85e193739c953358c865005855253af4f68a497John McCall case Expr::ObjCBridgedCastExprClass: { 5651d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall const Expr *SubExpr = cast<CastExpr>(E)->getSubExpr(); 56522116b144cf07f2574d20517187eb8863645376ebRichard Smith if (isa<ExplicitCastExpr>(E)) { 56532116b144cf07f2574d20517187eb8863645376ebRichard Smith if (const FloatingLiteral *FL 56542116b144cf07f2574d20517187eb8863645376ebRichard Smith = dyn_cast<FloatingLiteral>(SubExpr->IgnoreParenImpCasts())) { 56552116b144cf07f2574d20517187eb8863645376ebRichard Smith unsigned DestWidth = Ctx.getIntWidth(E->getType()); 56562116b144cf07f2574d20517187eb8863645376ebRichard Smith bool DestSigned = E->getType()->isSignedIntegerOrEnumerationType(); 56572116b144cf07f2574d20517187eb8863645376ebRichard Smith APSInt IgnoredVal(DestWidth, !DestSigned); 56582116b144cf07f2574d20517187eb8863645376ebRichard Smith bool Ignored; 56592116b144cf07f2574d20517187eb8863645376ebRichard Smith // If the value does not fit in the destination type, the behavior is 56602116b144cf07f2574d20517187eb8863645376ebRichard Smith // undefined, so we are not required to treat it as a constant 56612116b144cf07f2574d20517187eb8863645376ebRichard Smith // expression. 56622116b144cf07f2574d20517187eb8863645376ebRichard Smith if (FL->getValue().convertToInteger(IgnoredVal, 56632116b144cf07f2574d20517187eb8863645376ebRichard Smith llvm::APFloat::rmTowardZero, 56642116b144cf07f2574d20517187eb8863645376ebRichard Smith &Ignored) & APFloat::opInvalidOp) 56652116b144cf07f2574d20517187eb8863645376ebRichard Smith return ICEDiag(2, E->getLocStart()); 56662116b144cf07f2574d20517187eb8863645376ebRichard Smith return NoDiag(); 56672116b144cf07f2574d20517187eb8863645376ebRichard Smith } 56682116b144cf07f2574d20517187eb8863645376ebRichard Smith } 5669eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman switch (cast<CastExpr>(E)->getCastKind()) { 5670eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman case CK_LValueToRValue: 5671eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman case CK_NoOp: 5672eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman case CK_IntegralToBoolean: 5673eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman case CK_IntegralCast: 5674d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return CheckICE(SubExpr, Ctx); 5675eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman default: 5676eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman return ICEDiag(2, E->getLocStart()); 5677eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman } 5678d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 567956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall case Expr::BinaryConditionalOperatorClass: { 568056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall const BinaryConditionalOperator *Exp = cast<BinaryConditionalOperator>(E); 568156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall ICEDiag CommonResult = CheckICE(Exp->getCommon(), Ctx); 568256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (CommonResult.Val == 2) return CommonResult; 568356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall ICEDiag FalseResult = CheckICE(Exp->getFalseExpr(), Ctx); 568456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (FalseResult.Val == 2) return FalseResult; 568556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (CommonResult.Val == 1) return CommonResult; 568656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (FalseResult.Val == 1 && 5687a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith Exp->getCommon()->EvaluateKnownConstInt(Ctx) == 0) return NoDiag(); 568856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return FalseResult; 568956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 5690d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ConditionalOperatorClass: { 5691d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall const ConditionalOperator *Exp = cast<ConditionalOperator>(E); 5692d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // If the condition (ignoring parens) is a __builtin_constant_p call, 5693d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // then only the true side is actually considered in an integer constant 5694d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // expression, and it is fully evaluated. This is an important GNU 5695d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // extension. See GCC PR38377 for discussion. 5696d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (const CallExpr *CallCE 5697d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall = dyn_cast<CallExpr>(Exp->getCond()->IgnoreParenCasts())) 569880d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith if (CallCE->isBuiltinCall() == Builtin::BI__builtin_constant_p) 569980d4b55db94db2172a04617d1a80feca6bbcea5cRichard Smith return CheckEvalInICE(E, Ctx); 5700d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall ICEDiag CondResult = CheckICE(Exp->getCond(), Ctx); 5701d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (CondResult.Val == 2) 5702d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return CondResult; 570363fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor 5704f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith ICEDiag TrueResult = CheckICE(Exp->getTrueExpr(), Ctx); 5705f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith ICEDiag FalseResult = CheckICE(Exp->getFalseExpr(), Ctx); 570663fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor 5707d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (TrueResult.Val == 2) 5708d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return TrueResult; 5709d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (FalseResult.Val == 2) 5710d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return FalseResult; 5711d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (CondResult.Val == 1) 5712d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return CondResult; 5713d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (TrueResult.Val == 0 && FalseResult.Val == 0) 5714d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return NoDiag(); 5715d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // Rare case where the diagnostics depend on which side is evaluated 5716d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // Note that if we get here, CondResult is 0, and at least one of 5717d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // TrueResult and FalseResult is non-zero. 5718a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith if (Exp->getCond()->EvaluateKnownConstInt(Ctx) == 0) { 5719d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return FalseResult; 5720d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5721d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return TrueResult; 5722d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5723d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXDefaultArgExprClass: 5724d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return CheckICE(cast<CXXDefaultArgExpr>(E)->getExpr(), Ctx); 5725d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ChooseExprClass: { 5726d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return CheckICE(cast<ChooseExpr>(E)->getChosenSubExpr(Ctx), Ctx); 5727d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5728d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5729d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 5730d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // Silence a GCC warning 5731d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 5732d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall} 5733d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 5734f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith/// Evaluate an expression as a C++11 integral constant expression. 5735f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithstatic bool EvaluateCPlusPlus11IntegralConstantExpr(ASTContext &Ctx, 5736f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith const Expr *E, 5737f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith llvm::APSInt *Value, 5738f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith SourceLocation *Loc) { 5739f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!E->getType()->isIntegralOrEnumerationType()) { 5740f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (Loc) *Loc = E->getExprLoc(); 5741f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 5742f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 5743f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 5744f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith Expr::EvalResult Result; 5745dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith llvm::SmallVector<PartialDiagnosticAt, 8> Diags; 5746dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Result.Diag = &Diags; 5747dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith EvalInfo Info(Ctx, Result); 5748dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith 5749dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith bool IsICE = EvaluateAsRValue(Info, E, Result.Val); 5750dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith if (!Diags.empty()) { 5751dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith IsICE = false; 5752dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith if (Loc) *Loc = Diags[0].first; 5753dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith } else if (!IsICE && Loc) { 5754dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith *Loc = E->getExprLoc(); 5755f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 5756dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith 5757dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith if (!IsICE) 5758dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith return false; 5759dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith 5760dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith assert(Result.Val.isInt() && "pointer cast to int is not an ICE"); 5761dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith if (Value) *Value = Result.Val.getInt(); 5762dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith return true; 5763f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith} 5764f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 5765dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smithbool Expr::isIntegerConstantExpr(ASTContext &Ctx, SourceLocation *Loc) const { 5766f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (Ctx.getLangOptions().CPlusPlus0x) 5767f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return EvaluateCPlusPlus11IntegralConstantExpr(Ctx, this, 0, Loc); 5768f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 5769d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall ICEDiag d = CheckICE(this, Ctx); 5770d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (d.Val != 0) { 5771d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (Loc) *Loc = d.Loc; 5772d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return false; 5773d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5774f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return true; 5775f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith} 5776f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 5777f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithbool Expr::isIntegerConstantExpr(llvm::APSInt &Value, ASTContext &Ctx, 5778f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith SourceLocation *Loc, bool isEvaluated) const { 5779f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (Ctx.getLangOptions().CPlusPlus0x) 5780f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return EvaluateCPlusPlus11IntegralConstantExpr(Ctx, this, &Value, Loc); 5781f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 5782f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!isIntegerConstantExpr(Ctx, Loc)) 5783f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 5784f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!EvaluateAsInt(Value, Ctx)) 5785d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall llvm_unreachable("ICE cannot be evaluated!"); 5786d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return true; 5787d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall} 5788