ExprConstant.cpp revision 4cd9b8f7fb2cebf614e6e2bc766fad27ffd2e9de
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 234180f47959a066795cc0f409433023af448bb0328Richard Smith /// This - The binding for the this pointer in this call, if any. 235180f47959a066795cc0f409433023af448bb0328Richard Smith const LValue *This; 236180f47959a066795cc0f409433023af448bb0328Richard Smith 237bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith /// ParmBindings - Parameter bindings for this function call, indexed by 238bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith /// parameters' function scope indices. 239bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith const CCValue *Arguments; 240bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 241bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith typedef llvm::DenseMap<const Expr*, CCValue> MapTy; 242bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith typedef MapTy::const_iterator temp_iterator; 243bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith /// Temporaries - Temporary lvalues materialized within this stack frame. 244bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith MapTy Temporaries; 245bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 246180f47959a066795cc0f409433023af448bb0328Richard Smith CallStackFrame(EvalInfo &Info, const LValue *This, 247180f47959a066795cc0f409433023af448bb0328Richard Smith const CCValue *Arguments); 248bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith ~CallStackFrame(); 249bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith }; 250bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 251dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith /// A partial diagnostic which we might know in advance that we are not going 252dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith /// to emit. 253dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith class OptionalDiagnostic { 254dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith PartialDiagnostic *Diag; 255dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith 256dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith public: 257dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith explicit OptionalDiagnostic(PartialDiagnostic *Diag = 0) : Diag(Diag) {} 258dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith 259dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith template<typename T> 260dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith OptionalDiagnostic &operator<<(const T &v) { 261dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith if (Diag) 262dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith *Diag << v; 263dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith return *this; 264dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith } 265dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith }; 266dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith 267c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer struct EvalInfo { 268dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith ASTContext &Ctx; 2691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2701e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith /// EvalStatus - Contains information about the evaluation. 2711e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith Expr::EvalStatus &EvalStatus; 272f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson 273d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith /// CurrentCall - The top of the constexpr call stack. 274bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith CallStackFrame *CurrentCall; 275d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 276d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith /// CallStackDepth - The number of calls in the call stack right now. 277d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith unsigned CallStackDepth; 278d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 27947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith typedef llvm::DenseMap<const OpaqueValueExpr*, CCValue> MapTy; 280bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith /// OpaqueValues - Values used as the common expression in a 281bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith /// BinaryConditionalOperator. 282c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer MapTy OpaqueValues; 283bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 284bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith /// BottomFrame - The frame in which evaluation started. This must be 285bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith /// initialized last. 286bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith CallStackFrame BottomFrame; 287bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 288180f47959a066795cc0f409433023af448bb0328Richard Smith /// EvaluatingDecl - This is the declaration whose initializer is being 289180f47959a066795cc0f409433023af448bb0328Richard Smith /// evaluated, if any. 290180f47959a066795cc0f409433023af448bb0328Richard Smith const VarDecl *EvaluatingDecl; 291180f47959a066795cc0f409433023af448bb0328Richard Smith 292180f47959a066795cc0f409433023af448bb0328Richard Smith /// EvaluatingDeclValue - This is the value being constructed for the 293180f47959a066795cc0f409433023af448bb0328Richard Smith /// declaration whose initializer is being evaluated, if any. 294180f47959a066795cc0f409433023af448bb0328Richard Smith APValue *EvaluatingDeclValue; 295180f47959a066795cc0f409433023af448bb0328Richard Smith 296bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 297bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith EvalInfo(const ASTContext &C, Expr::EvalStatus &S) 298dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith : Ctx(const_cast<ASTContext&>(C)), EvalStatus(S), CurrentCall(0), 299dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith CallStackDepth(0), BottomFrame(*this, 0, 0), EvaluatingDecl(0), 300dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith EvaluatingDeclValue(0) {} 301bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 30247a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith const CCValue *getOpaqueValue(const OpaqueValueExpr *e) const { 303c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer MapTy::const_iterator i = OpaqueValues.find(e); 304c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer if (i == OpaqueValues.end()) return 0; 305c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer return &i->second; 306c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer } 30756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 308180f47959a066795cc0f409433023af448bb0328Richard Smith void setEvaluatingDecl(const VarDecl *VD, APValue &Value) { 309180f47959a066795cc0f409433023af448bb0328Richard Smith EvaluatingDecl = VD; 310180f47959a066795cc0f409433023af448bb0328Richard Smith EvaluatingDeclValue = &Value; 311180f47959a066795cc0f409433023af448bb0328Richard Smith } 312180f47959a066795cc0f409433023af448bb0328Richard Smith 313c18c42345636e2866fed75c7e434fb659d747672Richard Smith const LangOptions &getLangOpts() const { return Ctx.getLangOptions(); } 314c18c42345636e2866fed75c7e434fb659d747672Richard Smith 315c18c42345636e2866fed75c7e434fb659d747672Richard Smith bool atCallLimit() const { 316c18c42345636e2866fed75c7e434fb659d747672Richard Smith return CallStackDepth > getLangOpts().ConstexprCallDepth; 317c18c42345636e2866fed75c7e434fb659d747672Richard Smith } 318f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 319f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith /// Diagnose that the evaluation cannot be folded. 320dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith OptionalDiagnostic Diag(SourceLocation Loc, diag::kind DiagId) { 321f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // If we have a prior diagnostic, it will be noting that the expression 322f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // isn't a constant expression. This diagnostic is more important. 323f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // FIXME: We might want to show both diagnostics to the user. 324dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith if (EvalStatus.Diag) { 325dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith EvalStatus.Diag->clear(); 326dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith EvalStatus.Diag->reserve(1); 327dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith PartialDiagnostic PD(DiagId, Ctx.getDiagAllocator()); 328dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith EvalStatus.Diag->push_back(std::make_pair(Loc, PD)); 329dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith // FIXME: Add a call stack for constexpr evaluation. 330dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith return OptionalDiagnostic(&EvalStatus.Diag->back().second); 331dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith } 332dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith return OptionalDiagnostic(); 333dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith } 334dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith 335dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith /// Diagnose that the evaluation does not produce a C++11 core constant 336dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith /// expression. 337dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith OptionalDiagnostic CCEDiag(SourceLocation Loc, diag::kind DiagId) { 338dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith // Don't override a previous diagnostic. 339dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith if (!EvalStatus.Diag || !EvalStatus.Diag->empty()) 340dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith return OptionalDiagnostic(); 341dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith return Diag(Loc, DiagId); 342f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 343c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer }; 34487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 345180f47959a066795cc0f409433023af448bb0328Richard Smith CallStackFrame::CallStackFrame(EvalInfo &Info, const LValue *This, 346180f47959a066795cc0f409433023af448bb0328Richard Smith const CCValue *Arguments) 347180f47959a066795cc0f409433023af448bb0328Richard Smith : Info(Info), Caller(Info.CurrentCall), This(This), Arguments(Arguments) { 348bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith Info.CurrentCall = this; 349bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith ++Info.CallStackDepth; 350bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith } 351d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 352bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith CallStackFrame::~CallStackFrame() { 353bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith assert(Info.CurrentCall == this && "calls retired out of order"); 354bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith --Info.CallStackDepth; 355bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith Info.CurrentCall = Caller; 356bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith } 357d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 358f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall struct ComplexValue { 359f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall private: 360f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall bool IsInt; 361f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall 362f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall public: 363f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall APSInt IntReal, IntImag; 364f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall APFloat FloatReal, FloatImag; 365f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall 366f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexValue() : FloatReal(APFloat::Bogus), FloatImag(APFloat::Bogus) {} 367f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall 368f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall void makeComplexFloat() { IsInt = false; } 369f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall bool isComplexFloat() const { return !IsInt; } 370f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall APFloat &getComplexFloatReal() { return FloatReal; } 371f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall APFloat &getComplexFloatImag() { return FloatImag; } 372f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall 373f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall void makeComplexInt() { IsInt = true; } 374f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall bool isComplexInt() const { return IsInt; } 375f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall APSInt &getComplexIntReal() { return IntReal; } 376f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall APSInt &getComplexIntImag() { return IntImag; } 377f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall 37847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith void moveInto(CCValue &v) const { 379f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall if (isComplexFloat()) 38047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith v = CCValue(FloatReal, FloatImag); 381f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall else 38247a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith v = CCValue(IntReal, IntImag); 383f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall } 38447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith void setFrom(const CCValue &v) { 38556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall assert(v.isComplexFloat() || v.isComplexInt()); 38656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (v.isComplexFloat()) { 38756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall makeComplexFloat(); 38856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall FloatReal = v.getComplexFloatReal(); 38956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall FloatImag = v.getComplexFloatImag(); 39056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } else { 39156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall makeComplexInt(); 39256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall IntReal = v.getComplexIntReal(); 39356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall IntImag = v.getComplexIntImag(); 39456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 39556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 396f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall }; 397efdb83e26f9a1fd2566afe54461216cd84814d42John McCall 398efdb83e26f9a1fd2566afe54461216cd84814d42John McCall struct LValue { 3991bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith APValue::LValueBase Base; 400efdb83e26f9a1fd2566afe54461216cd84814d42John McCall CharUnits Offset; 401177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith CallStackFrame *Frame; 4020a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith SubobjectDesignator Designator; 403efdb83e26f9a1fd2566afe54461216cd84814d42John McCall 4041bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith const APValue::LValueBase getLValueBase() const { return Base; } 40547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CharUnits &getLValueOffset() { return Offset; } 406625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith const CharUnits &getLValueOffset() const { return Offset; } 407177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith CallStackFrame *getLValueFrame() const { return Frame; } 4080a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith SubobjectDesignator &getLValueDesignator() { return Designator; } 4090a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith const SubobjectDesignator &getLValueDesignator() const { return Designator;} 410efdb83e26f9a1fd2566afe54461216cd84814d42John McCall 41147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith void moveInto(CCValue &V) const { 4120a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith V = CCValue(Base, Offset, Frame, Designator); 413efdb83e26f9a1fd2566afe54461216cd84814d42John McCall } 41447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith void setFrom(const CCValue &V) { 41547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith assert(V.isLValue()); 41647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Base = V.getLValueBase(); 41747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Offset = V.getLValueOffset(); 418177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith Frame = V.getLValueFrame(); 4190a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Designator = V.getLValueDesignator(); 4200a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith } 4210a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith 4221bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith void set(APValue::LValueBase B, CallStackFrame *F = 0) { 4231bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith Base = B; 4240a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Offset = CharUnits::Zero(); 4250a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Frame = F; 4260a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Designator = SubobjectDesignator(); 42756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 428efdb83e26f9a1fd2566afe54461216cd84814d42John McCall }; 429e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 430e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith struct MemberPtr { 431e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MemberPtr() {} 432e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith explicit MemberPtr(const ValueDecl *Decl) : 433e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith DeclAndIsDerivedMember(Decl, false), Path() {} 434e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 435e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// The member or (direct or indirect) field referred to by this member 436e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// pointer, or 0 if this is a null member pointer. 437e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const ValueDecl *getDecl() const { 438e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return DeclAndIsDerivedMember.getPointer(); 439e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 440e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// Is this actually a member of some type derived from the relevant class? 441e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool isDerivedMember() const { 442e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return DeclAndIsDerivedMember.getInt(); 443e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 444e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// Get the class which the declaration actually lives in. 445e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *getContainingRecord() const { 446e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return cast<CXXRecordDecl>( 447e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith DeclAndIsDerivedMember.getPointer()->getDeclContext()); 448e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 449e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 450e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith void moveInto(CCValue &V) const { 451e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith V = CCValue(getDecl(), isDerivedMember(), Path); 452e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 453e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith void setFrom(const CCValue &V) { 454e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith assert(V.isMemberPointer()); 455e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith DeclAndIsDerivedMember.setPointer(V.getMemberPointerDecl()); 456e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith DeclAndIsDerivedMember.setInt(V.isMemberPointerToDerivedMember()); 457e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Path.clear(); 458e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith ArrayRef<const CXXRecordDecl*> P = V.getMemberPointerPath(); 459e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Path.insert(Path.end(), P.begin(), P.end()); 460e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 461e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 462e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// DeclAndIsDerivedMember - The member declaration, and a flag indicating 463e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// whether the member is a member of some class derived from the class type 464e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// of the member pointer. 465e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith llvm::PointerIntPair<const ValueDecl*, 1, bool> DeclAndIsDerivedMember; 466e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// Path - The path of base/derived classes from the member declaration's 467e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// class (exclusive) to the class type of the member pointer (inclusive). 468e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith SmallVector<const CXXRecordDecl*, 4> Path; 469e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 470e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// Perform a cast towards the class of the Decl (either up or down the 471e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// hierarchy). 472e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool castBack(const CXXRecordDecl *Class) { 473e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith assert(!Path.empty()); 474e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *Expected; 475e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (Path.size() >= 2) 476e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Expected = Path[Path.size() - 2]; 477e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith else 478e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Expected = getContainingRecord(); 479e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (Expected->getCanonicalDecl() != Class->getCanonicalDecl()) { 480e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // C++11 [expr.static.cast]p12: In a conversion from (D::*) to (B::*), 481e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // if B does not contain the original member and is not a base or 482e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // derived class of the class containing the original member, the result 483e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // of the cast is undefined. 484e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // C++11 [conv.mem]p2 does not cover this case for a cast from (B::*) to 485e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // (D::*). We consider that to be a language defect. 486e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 487e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 488e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Path.pop_back(); 489e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 490e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 491e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// Perform a base-to-derived member pointer cast. 492e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool castToDerived(const CXXRecordDecl *Derived) { 493e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!getDecl()) 494e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 495e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!isDerivedMember()) { 496e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Path.push_back(Derived); 497e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 498e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 499e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!castBack(Derived)) 500e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 501e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (Path.empty()) 502e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith DeclAndIsDerivedMember.setInt(false); 503e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 504e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 505e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// Perform a derived-to-base member pointer cast. 506e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool castToBase(const CXXRecordDecl *Base) { 507e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!getDecl()) 508e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 509e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (Path.empty()) 510e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith DeclAndIsDerivedMember.setInt(true); 511e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (isDerivedMember()) { 512e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Path.push_back(Base); 513e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 514e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 515e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return castBack(Base); 516e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 517e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith }; 518f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall} 51987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 52047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smithstatic bool Evaluate(CCValue &Result, EvalInfo &Info, const Expr *E); 52169c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smithstatic bool EvaluateConstantExpression(APValue &Result, EvalInfo &Info, 522180f47959a066795cc0f409433023af448bb0328Richard Smith const LValue &This, const Expr *E); 523efdb83e26f9a1fd2566afe54461216cd84814d42John McCallstatic bool EvaluateLValue(const Expr *E, LValue &Result, EvalInfo &Info); 524efdb83e26f9a1fd2566afe54461216cd84814d42John McCallstatic bool EvaluatePointer(const Expr *E, LValue &Result, EvalInfo &Info); 525e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstatic bool EvaluateMemberPointer(const Expr *E, MemberPtr &Result, 526e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith EvalInfo &Info); 527e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstatic bool EvaluateTemporary(const Expr *E, LValue &Result, EvalInfo &Info); 52887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluateInteger(const Expr *E, APSInt &Result, EvalInfo &Info); 52947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smithstatic bool EvaluateIntegerOrLValue(const Expr *E, CCValue &Result, 530d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner EvalInfo &Info); 531d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr *E, APFloat &Result, EvalInfo &Info); 532f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCallstatic bool EvaluateComplex(const Expr *E, ComplexValue &Res, EvalInfo &Info); 533f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 534f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 5354efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// Misc utilities 5364efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 5374efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 538180f47959a066795cc0f409433023af448bb0328Richard Smith/// Should this call expression be treated as a string literal? 539180f47959a066795cc0f409433023af448bb0328Richard Smithstatic bool IsStringLiteralCall(const CallExpr *E) { 540180f47959a066795cc0f409433023af448bb0328Richard Smith unsigned Builtin = E->isBuiltinCall(); 541180f47959a066795cc0f409433023af448bb0328Richard Smith return (Builtin == Builtin::BI__builtin___CFStringMakeConstantString || 542180f47959a066795cc0f409433023af448bb0328Richard Smith Builtin == Builtin::BI__builtin___NSStringMakeConstantString); 543180f47959a066795cc0f409433023af448bb0328Richard Smith} 544180f47959a066795cc0f409433023af448bb0328Richard Smith 5451bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smithstatic bool IsGlobalLValue(APValue::LValueBase B) { 546180f47959a066795cc0f409433023af448bb0328Richard Smith // C++11 [expr.const]p3 An address constant expression is a prvalue core 547180f47959a066795cc0f409433023af448bb0328Richard Smith // constant expression of pointer type that evaluates to... 548180f47959a066795cc0f409433023af448bb0328Richard Smith 549180f47959a066795cc0f409433023af448bb0328Richard Smith // ... a null pointer value, or a prvalue core constant expression of type 550180f47959a066795cc0f409433023af448bb0328Richard Smith // std::nullptr_t. 5511bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith if (!B) return true; 55242c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 5531bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith if (const ValueDecl *D = B.dyn_cast<const ValueDecl*>()) { 554180f47959a066795cc0f409433023af448bb0328Richard Smith // ... the address of an object with static storage duration, 5551bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith if (const VarDecl *VD = dyn_cast<VarDecl>(D)) 55642c8f87eb60958170c46767273bf93e6c96125bfJohn McCall return VD->hasGlobalStorage(); 5571bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith // ... the address of a function, 5581bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith return isa<FunctionDecl>(D); 55942c8f87eb60958170c46767273bf93e6c96125bfJohn McCall } 5601bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith 5611bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith const Expr *E = B.get<const Expr*>(); 5621bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith switch (E->getStmtClass()) { 5631bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith default: 5641bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith return false; 565180f47959a066795cc0f409433023af448bb0328Richard Smith case Expr::CompoundLiteralExprClass: 566180f47959a066795cc0f409433023af448bb0328Richard Smith return cast<CompoundLiteralExpr>(E)->isFileScope(); 567180f47959a066795cc0f409433023af448bb0328Richard Smith // A string literal has static storage duration. 568180f47959a066795cc0f409433023af448bb0328Richard Smith case Expr::StringLiteralClass: 569180f47959a066795cc0f409433023af448bb0328Richard Smith case Expr::PredefinedExprClass: 570180f47959a066795cc0f409433023af448bb0328Richard Smith case Expr::ObjCStringLiteralClass: 571180f47959a066795cc0f409433023af448bb0328Richard Smith case Expr::ObjCEncodeExprClass: 572180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 573180f47959a066795cc0f409433023af448bb0328Richard Smith case Expr::CallExprClass: 574180f47959a066795cc0f409433023af448bb0328Richard Smith return IsStringLiteralCall(cast<CallExpr>(E)); 575180f47959a066795cc0f409433023af448bb0328Richard Smith // For GCC compatibility, &&label has static storage duration. 576180f47959a066795cc0f409433023af448bb0328Richard Smith case Expr::AddrLabelExprClass: 577180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 578180f47959a066795cc0f409433023af448bb0328Richard Smith // A Block literal expression may be used as the initialization value for 579180f47959a066795cc0f409433023af448bb0328Richard Smith // Block variables at global or local static scope. 580180f47959a066795cc0f409433023af448bb0328Richard Smith case Expr::BlockExprClass: 581180f47959a066795cc0f409433023af448bb0328Richard Smith return !cast<BlockExpr>(E)->getBlockDecl()->hasCaptures(); 582180f47959a066795cc0f409433023af448bb0328Richard Smith } 58342c8f87eb60958170c46767273bf93e6c96125bfJohn McCall} 58442c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 5859a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith/// Check that this reference or pointer core constant expression is a valid 5869a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith/// value for a constant expression. Type T should be either LValue or CCValue. 5879a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smithtemplate<typename T> 588f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithstatic bool CheckLValueConstantExpression(EvalInfo &Info, const Expr *E, 589f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith const T &LVal, APValue &Value) { 590f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!IsGlobalLValue(LVal.getLValueBase())) { 591dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(E->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 59269c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith return false; 593f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 59469c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith 5959a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith const SubobjectDesignator &Designator = LVal.getLValueDesignator(); 5969a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith // A constant expression must refer to an object or be a null pointer. 597e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (Designator.Invalid || 5989a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith (!LVal.getLValueBase() && !Designator.Entries.empty())) { 5999a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith // FIXME: This is not a constant expression. 6009a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith Value = APValue(LVal.getLValueBase(), LVal.getLValueOffset(), 6019a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith APValue::NoLValuePath()); 6029a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith return true; 6039a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith } 6049a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith 6059a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith Value = APValue(LVal.getLValueBase(), LVal.getLValueOffset(), 606e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Designator.Entries, Designator.OnePastTheEnd); 60769c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith return true; 60847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith} 60947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith 6109a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith/// Check that this core constant expression value is a valid value for a 6119a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith/// constant expression, and if it is, produce the corresponding constant value. 612f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith/// If not, report an appropriate diagnostic. 613f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithstatic bool CheckConstantExpression(EvalInfo &Info, const Expr *E, 614f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith const CCValue &CCValue, APValue &Value) { 6159a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith if (!CCValue.isLValue()) { 6169a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith Value = CCValue; 6179a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith return true; 6189a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith } 619f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return CheckLValueConstantExpression(Info, E, CCValue, Value); 6209a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith} 6219a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith 6229e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smithconst ValueDecl *GetLValueBaseDecl(const LValue &LVal) { 6231bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith return LVal.Base.dyn_cast<const ValueDecl*>(); 6249e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith} 6259e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith 6269e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smithstatic bool IsLiteralLValue(const LValue &Value) { 6271bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith return Value.Base.dyn_cast<const Expr*>() && !Value.Frame; 6289e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith} 6299e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith 63065ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smithstatic bool IsWeakLValue(const LValue &Value) { 63165ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith const ValueDecl *Decl = GetLValueBaseDecl(Value); 6320dd7a25e8d679de1dc0ce788222d6dee0e879885Lang Hames return Decl && Decl->isWeak(); 63365ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith} 63465ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith 635e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstatic bool EvalPointerValueAsBool(const CCValue &Value, bool &Result) { 6363554283157190e67918fad4221a5e6faf9317362John McCall // A null base expression indicates a null pointer. These are always 6373554283157190e67918fad4221a5e6faf9317362John McCall // evaluatable, and they are false unless the offset is zero. 638e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!Value.getLValueBase()) { 639e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Result = !Value.getLValueOffset().isZero(); 6403554283157190e67918fad4221a5e6faf9317362John McCall return true; 6413554283157190e67918fad4221a5e6faf9317362John McCall } 6423554283157190e67918fad4221a5e6faf9317362John McCall 64342c8f87eb60958170c46767273bf93e6c96125bfJohn McCall // Require the base expression to be a global l-value. 64447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith // FIXME: C++11 requires such conversions. Remove this check. 645e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!IsGlobalLValue(Value.getLValueBase())) return false; 64642c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 647e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // We have a non-null base. These are generally known to be true, but if it's 648e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // a weak declaration it can be null at runtime. 6493554283157190e67918fad4221a5e6faf9317362John McCall Result = true; 650e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const ValueDecl *Decl = Value.getLValueBase().dyn_cast<const ValueDecl*>(); 6510dd7a25e8d679de1dc0ce788222d6dee0e879885Lang Hames return !Decl || !Decl->isWeak(); 6525bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman} 6535bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman 65447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smithstatic bool HandleConversionToBool(const CCValue &Val, bool &Result) { 655c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith switch (Val.getKind()) { 656c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case APValue::Uninitialized: 657c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return false; 658c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case APValue::Int: 659c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith Result = Val.getInt().getBoolValue(); 66041bf4f38348561a0f12c10d34f1673cd19a6eb04Richard Smith return true; 661c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case APValue::Float: 662c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith Result = !Val.getFloat().isZero(); 663a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman return true; 664c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case APValue::ComplexInt: 665c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith Result = Val.getComplexIntReal().getBoolValue() || 666c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith Val.getComplexIntImag().getBoolValue(); 667c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return true; 668c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case APValue::ComplexFloat: 669c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith Result = !Val.getComplexFloatReal().isZero() || 670c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith !Val.getComplexFloatImag().isZero(); 671436c8898cd1c93c5bacd3fcc4ac586bc5cd77062Richard Smith return true; 672e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case APValue::LValue: 673e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return EvalPointerValueAsBool(Val, Result); 674e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case APValue::MemberPointer: 675e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Result = Val.getMemberPointerDecl(); 676e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 677c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case APValue::Vector: 678cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith case APValue::Array: 679180f47959a066795cc0f409433023af448bb0328Richard Smith case APValue::Struct: 680180f47959a066795cc0f409433023af448bb0328Richard Smith case APValue::Union: 681c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return false; 6824efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 6834efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 684c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith llvm_unreachable("unknown APValue kind"); 685c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith} 686c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 687c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smithstatic bool EvaluateAsBooleanCondition(const Expr *E, bool &Result, 688c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith EvalInfo &Info) { 689c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith assert(E->isRValue() && "missing lvalue-to-rvalue conv in bool condition"); 69047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue Val; 691c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!Evaluate(Val, Info, E)) 692c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return false; 693c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return HandleConversionToBool(Val, Result); 6944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 6954efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 6961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APSInt HandleFloatToIntCast(QualType DestType, QualType SrcType, 6974ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad APFloat &Value, const ASTContext &Ctx) { 698a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar unsigned DestWidth = Ctx.getIntWidth(DestType); 699a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // Determine whether we are converting to unsigned or signed. 700575a1c9dc8dc5b4977194993e289f9eda7295c39Douglas Gregor bool DestSigned = DestType->isSignedIntegerOrEnumerationType(); 7011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 702a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // FIXME: Warning for overflow. 7033e1ef7849845a9e7bf79156bbb8a2c26d77a1d2eJeffrey Yasskin APSInt Result(DestWidth, !DestSigned); 704a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar bool ignored; 7053e1ef7849845a9e7bf79156bbb8a2c26d77a1d2eJeffrey Yasskin (void)Value.convertToInteger(Result, llvm::APFloat::rmTowardZero, &ignored); 7063e1ef7849845a9e7bf79156bbb8a2c26d77a1d2eJeffrey Yasskin return Result; 707a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 708a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 7091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APFloat HandleFloatToFloatCast(QualType DestType, QualType SrcType, 7104ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad APFloat &Value, const ASTContext &Ctx) { 711a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar bool ignored; 712a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat Result = Value; 7131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.convert(Ctx.getFloatTypeSemantics(DestType), 714a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat::rmNearestTiesToEven, &ignored); 715a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return Result; 716a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 717a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 7181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APSInt HandleIntToIntCast(QualType DestType, QualType SrcType, 7194ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad APSInt &Value, const ASTContext &Ctx) { 720a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar unsigned DestWidth = Ctx.getIntWidth(DestType); 721a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APSInt Result = Value; 722a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // Figure out if this is a truncate, extend or noop cast. 723a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // If the input is signed, do a sign extend, noop, or truncate. 7249f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad Result = Result.extOrTrunc(DestWidth); 725575a1c9dc8dc5b4977194993e289f9eda7295c39Douglas Gregor Result.setIsUnsigned(DestType->isUnsignedIntegerOrEnumerationType()); 726a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return Result; 727a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 728a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 7291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APFloat HandleIntToFloatCast(QualType DestType, QualType SrcType, 7304ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad APSInt &Value, const ASTContext &Ctx) { 731a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 732a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat Result(Ctx.getFloatTypeSemantics(DestType), 1); 733a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result.convertFromAPInt(Value, Value.isSigned(), 734a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat::rmNearestTiesToEven); 735a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return Result; 736a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 737a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 738e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstatic bool FindMostDerivedObject(EvalInfo &Info, const LValue &LVal, 739e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *&MostDerivedType, 740e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith unsigned &MostDerivedPathLength, 741e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool &MostDerivedIsArrayElement) { 742e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const SubobjectDesignator &D = LVal.Designator; 743e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (D.Invalid || !LVal.Base) 744180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 745180f47959a066795cc0f409433023af448bb0328Richard Smith 746e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const Type *T = getType(LVal.Base).getTypePtr(); 747180f47959a066795cc0f409433023af448bb0328Richard Smith 748180f47959a066795cc0f409433023af448bb0328Richard Smith // Find path prefix which leads to the most-derived subobject. 749180f47959a066795cc0f409433023af448bb0328Richard Smith MostDerivedType = T->getAsCXXRecordDecl(); 750e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MostDerivedPathLength = 0; 751e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MostDerivedIsArrayElement = false; 752180f47959a066795cc0f409433023af448bb0328Richard Smith 753180f47959a066795cc0f409433023af448bb0328Richard Smith for (unsigned I = 0, N = D.Entries.size(); I != N; ++I) { 754180f47959a066795cc0f409433023af448bb0328Richard Smith bool IsArray = T && T->isArrayType(); 755180f47959a066795cc0f409433023af448bb0328Richard Smith if (IsArray) 756180f47959a066795cc0f409433023af448bb0328Richard Smith T = T->getBaseElementTypeUnsafe(); 757180f47959a066795cc0f409433023af448bb0328Richard Smith else if (const FieldDecl *FD = getAsField(D.Entries[I])) 758180f47959a066795cc0f409433023af448bb0328Richard Smith T = FD->getType().getTypePtr(); 759180f47959a066795cc0f409433023af448bb0328Richard Smith else 760180f47959a066795cc0f409433023af448bb0328Richard Smith T = 0; 761180f47959a066795cc0f409433023af448bb0328Richard Smith 762180f47959a066795cc0f409433023af448bb0328Richard Smith if (T) { 763180f47959a066795cc0f409433023af448bb0328Richard Smith MostDerivedType = T->getAsCXXRecordDecl(); 764180f47959a066795cc0f409433023af448bb0328Richard Smith MostDerivedPathLength = I + 1; 765180f47959a066795cc0f409433023af448bb0328Richard Smith MostDerivedIsArrayElement = IsArray; 766180f47959a066795cc0f409433023af448bb0328Richard Smith } 767180f47959a066795cc0f409433023af448bb0328Richard Smith } 768180f47959a066795cc0f409433023af448bb0328Richard Smith 769180f47959a066795cc0f409433023af448bb0328Richard Smith // (B*)&d + 1 has no most-derived object. 770180f47959a066795cc0f409433023af448bb0328Richard Smith if (D.OnePastTheEnd && MostDerivedPathLength != D.Entries.size()) 771180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 772180f47959a066795cc0f409433023af448bb0328Richard Smith 773e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return MostDerivedType != 0; 774e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 775e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 776e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstatic void TruncateLValueBasePath(EvalInfo &Info, LValue &Result, 777e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const RecordDecl *TruncatedType, 778e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith unsigned TruncatedElements, 779e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool IsArrayElement) { 780e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith SubobjectDesignator &D = Result.Designator; 781e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const RecordDecl *RD = TruncatedType; 782e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith for (unsigned I = TruncatedElements, N = D.Entries.size(); I != N; ++I) { 783180f47959a066795cc0f409433023af448bb0328Richard Smith const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); 784180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXRecordDecl *Base = getAsBaseClass(D.Entries[I]); 785e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (isVirtualBaseClass(D.Entries[I])) 786180f47959a066795cc0f409433023af448bb0328Richard Smith Result.Offset -= Layout.getVBaseClassOffset(Base); 787e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith else 788180f47959a066795cc0f409433023af448bb0328Richard Smith Result.Offset -= Layout.getBaseClassOffset(Base); 789180f47959a066795cc0f409433023af448bb0328Richard Smith RD = Base; 790180f47959a066795cc0f409433023af448bb0328Richard Smith } 791e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith D.Entries.resize(TruncatedElements); 792e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith D.ArrayElement = IsArrayElement; 793e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 794e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 795e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// If the given LValue refers to a base subobject of some object, find the most 796e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// derived object and the corresponding complete record type. This is necessary 797e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// in order to find the offset of a virtual base class. 798e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstatic bool ExtractMostDerivedObject(EvalInfo &Info, LValue &Result, 799e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *&MostDerivedType) { 800e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith unsigned MostDerivedPathLength; 801e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool MostDerivedIsArrayElement; 802e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!FindMostDerivedObject(Info, Result, MostDerivedType, 803e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MostDerivedPathLength, MostDerivedIsArrayElement)) 804e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 805e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 806e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Remove the trailing base class path entries and their offsets. 807e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith TruncateLValueBasePath(Info, Result, MostDerivedType, MostDerivedPathLength, 808e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MostDerivedIsArrayElement); 809180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 810180f47959a066795cc0f409433023af448bb0328Richard Smith} 811180f47959a066795cc0f409433023af448bb0328Richard Smith 812180f47959a066795cc0f409433023af448bb0328Richard Smithstatic void HandleLValueDirectBase(EvalInfo &Info, LValue &Obj, 813180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXRecordDecl *Derived, 814180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXRecordDecl *Base, 815180f47959a066795cc0f409433023af448bb0328Richard Smith const ASTRecordLayout *RL = 0) { 816180f47959a066795cc0f409433023af448bb0328Richard Smith if (!RL) RL = &Info.Ctx.getASTRecordLayout(Derived); 817180f47959a066795cc0f409433023af448bb0328Richard Smith Obj.getLValueOffset() += RL->getBaseClassOffset(Base); 818180f47959a066795cc0f409433023af448bb0328Richard Smith Obj.Designator.addDecl(Base, /*Virtual*/ false); 819180f47959a066795cc0f409433023af448bb0328Richard Smith} 820180f47959a066795cc0f409433023af448bb0328Richard Smith 821180f47959a066795cc0f409433023af448bb0328Richard Smithstatic bool HandleLValueBase(EvalInfo &Info, LValue &Obj, 822180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXRecordDecl *DerivedDecl, 823180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXBaseSpecifier *Base) { 824180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXRecordDecl *BaseDecl = Base->getType()->getAsCXXRecordDecl(); 825180f47959a066795cc0f409433023af448bb0328Richard Smith 826180f47959a066795cc0f409433023af448bb0328Richard Smith if (!Base->isVirtual()) { 827180f47959a066795cc0f409433023af448bb0328Richard Smith HandleLValueDirectBase(Info, Obj, DerivedDecl, BaseDecl); 828180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 829180f47959a066795cc0f409433023af448bb0328Richard Smith } 830180f47959a066795cc0f409433023af448bb0328Richard Smith 831180f47959a066795cc0f409433023af448bb0328Richard Smith // Extract most-derived object and corresponding type. 832180f47959a066795cc0f409433023af448bb0328Richard Smith if (!ExtractMostDerivedObject(Info, Obj, DerivedDecl)) 833180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 834180f47959a066795cc0f409433023af448bb0328Richard Smith 835180f47959a066795cc0f409433023af448bb0328Richard Smith const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(DerivedDecl); 836180f47959a066795cc0f409433023af448bb0328Richard Smith Obj.getLValueOffset() += Layout.getVBaseClassOffset(BaseDecl); 837180f47959a066795cc0f409433023af448bb0328Richard Smith Obj.Designator.addDecl(BaseDecl, /*Virtual*/ true); 838180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 839180f47959a066795cc0f409433023af448bb0328Richard Smith} 840180f47959a066795cc0f409433023af448bb0328Richard Smith 841180f47959a066795cc0f409433023af448bb0328Richard Smith/// Update LVal to refer to the given field, which must be a member of the type 842180f47959a066795cc0f409433023af448bb0328Richard Smith/// currently described by LVal. 843180f47959a066795cc0f409433023af448bb0328Richard Smithstatic void HandleLValueMember(EvalInfo &Info, LValue &LVal, 844180f47959a066795cc0f409433023af448bb0328Richard Smith const FieldDecl *FD, 845180f47959a066795cc0f409433023af448bb0328Richard Smith const ASTRecordLayout *RL = 0) { 846180f47959a066795cc0f409433023af448bb0328Richard Smith if (!RL) 847180f47959a066795cc0f409433023af448bb0328Richard Smith RL = &Info.Ctx.getASTRecordLayout(FD->getParent()); 848180f47959a066795cc0f409433023af448bb0328Richard Smith 849180f47959a066795cc0f409433023af448bb0328Richard Smith unsigned I = FD->getFieldIndex(); 850180f47959a066795cc0f409433023af448bb0328Richard Smith LVal.Offset += Info.Ctx.toCharUnitsFromBits(RL->getFieldOffset(I)); 851180f47959a066795cc0f409433023af448bb0328Richard Smith LVal.Designator.addDecl(FD); 852180f47959a066795cc0f409433023af448bb0328Richard Smith} 853180f47959a066795cc0f409433023af448bb0328Richard Smith 854180f47959a066795cc0f409433023af448bb0328Richard Smith/// Get the size of the given type in char units. 855180f47959a066795cc0f409433023af448bb0328Richard Smithstatic bool HandleSizeof(EvalInfo &Info, QualType Type, CharUnits &Size) { 856180f47959a066795cc0f409433023af448bb0328Richard Smith // sizeof(void), __alignof__(void), sizeof(function) = 1 as a gcc 857180f47959a066795cc0f409433023af448bb0328Richard Smith // extension. 858180f47959a066795cc0f409433023af448bb0328Richard Smith if (Type->isVoidType() || Type->isFunctionType()) { 859180f47959a066795cc0f409433023af448bb0328Richard Smith Size = CharUnits::One(); 860180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 861180f47959a066795cc0f409433023af448bb0328Richard Smith } 862180f47959a066795cc0f409433023af448bb0328Richard Smith 863180f47959a066795cc0f409433023af448bb0328Richard Smith if (!Type->isConstantSizeType()) { 864180f47959a066795cc0f409433023af448bb0328Richard Smith // sizeof(vla) is not a constantexpr: C99 6.5.3.4p2. 865180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 866180f47959a066795cc0f409433023af448bb0328Richard Smith } 867180f47959a066795cc0f409433023af448bb0328Richard Smith 868180f47959a066795cc0f409433023af448bb0328Richard Smith Size = Info.Ctx.getTypeSizeInChars(Type); 869180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 870180f47959a066795cc0f409433023af448bb0328Richard Smith} 871180f47959a066795cc0f409433023af448bb0328Richard Smith 872180f47959a066795cc0f409433023af448bb0328Richard Smith/// Update a pointer value to model pointer arithmetic. 873180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param Info - Information about the ongoing evaluation. 874180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param LVal - The pointer value to be updated. 875180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param EltTy - The pointee type represented by LVal. 876180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param Adjustment - The adjustment, in objects of type EltTy, to add. 877180f47959a066795cc0f409433023af448bb0328Richard Smithstatic bool HandleLValueArrayAdjustment(EvalInfo &Info, LValue &LVal, 878180f47959a066795cc0f409433023af448bb0328Richard Smith QualType EltTy, int64_t Adjustment) { 879180f47959a066795cc0f409433023af448bb0328Richard Smith CharUnits SizeOfPointee; 880180f47959a066795cc0f409433023af448bb0328Richard Smith if (!HandleSizeof(Info, EltTy, SizeOfPointee)) 881180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 882180f47959a066795cc0f409433023af448bb0328Richard Smith 883180f47959a066795cc0f409433023af448bb0328Richard Smith // Compute the new offset in the appropriate width. 884180f47959a066795cc0f409433023af448bb0328Richard Smith LVal.Offset += Adjustment * SizeOfPointee; 885180f47959a066795cc0f409433023af448bb0328Richard Smith LVal.Designator.adjustIndex(Adjustment); 886180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 887180f47959a066795cc0f409433023af448bb0328Richard Smith} 888180f47959a066795cc0f409433023af448bb0328Richard Smith 88903f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith/// Try to evaluate the initializer for a variable declaration. 890f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithstatic bool EvaluateVarDeclInit(EvalInfo &Info, const Expr *E, 891f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith const VarDecl *VD, 892177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith CallStackFrame *Frame, CCValue &Result) { 893d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith // If this is a parameter to an active constexpr function call, perform 894d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith // argument substitution. 895d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith if (const ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(VD)) { 896f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!Frame || !Frame->Arguments) { 897dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(E->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 898177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith return false; 899f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 900177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith Result = Frame->Arguments[PVD->getFunctionScopeIndex()]; 901177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith return true; 902d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith } 90303f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith 904180f47959a066795cc0f409433023af448bb0328Richard Smith // If we're currently evaluating the initializer of this declaration, use that 905180f47959a066795cc0f409433023af448bb0328Richard Smith // in-flight value. 906180f47959a066795cc0f409433023af448bb0328Richard Smith if (Info.EvaluatingDecl == VD) { 907180f47959a066795cc0f409433023af448bb0328Richard Smith Result = CCValue(*Info.EvaluatingDeclValue, CCValue::GlobalValue()); 908180f47959a066795cc0f409433023af448bb0328Richard Smith return !Result.isUninit(); 909180f47959a066795cc0f409433023af448bb0328Richard Smith } 910180f47959a066795cc0f409433023af448bb0328Richard Smith 91165ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith // Never evaluate the initializer of a weak variable. We can't be sure that 91265ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith // this is the definition which will be used. 913f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (VD->isWeak()) { 914dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(E->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 91565ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith return false; 916f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 91765ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith 91803f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith const Expr *Init = VD->getAnyInitializer(); 919f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!Init || Init->isValueDependent()) { 920dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(E->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 92147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith return false; 922f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 92303f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith 92447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith if (APValue *V = VD->getEvaluatedValue()) { 925177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith Result = CCValue(*V, CCValue::GlobalValue()); 92647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith return !Result.isUninit(); 92747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith } 92803f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith 929f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (VD->isEvaluatingValue()) { 930dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(E->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 93147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith return false; 932f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 93303f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith 93403f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith VD->setEvaluatingValue(); 93503f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith 93647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Expr::EvalStatus EStatus; 93747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith EvalInfo InitInfo(Info.Ctx, EStatus); 938180f47959a066795cc0f409433023af448bb0328Richard Smith APValue EvalResult; 939180f47959a066795cc0f409433023af448bb0328Richard Smith InitInfo.setEvaluatingDecl(VD, EvalResult); 940180f47959a066795cc0f409433023af448bb0328Richard Smith LValue LVal; 9411bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith LVal.set(VD); 942c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // FIXME: The caller will need to know whether the value was a constant 943c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // expression. If not, we should propagate up a diagnostic. 944180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateConstantExpression(EvalResult, InitInfo, LVal, Init)) { 945cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // FIXME: If the evaluation failure was not permanent (for instance, if we 946cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // hit a variable with no declaration yet, or a constexpr function with no 947cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // definition yet), the standard is unclear as to how we should behave. 948cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // 949cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // Either the initializer should be evaluated when the variable is defined, 950cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // or a failed evaluation of the initializer should be reattempted each time 951cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // it is used. 95203f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith VD->setEvaluatedValue(APValue()); 953dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(E->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 95447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith return false; 95547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith } 95603f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith 95769c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith VD->setEvaluatedValue(EvalResult); 95869c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith Result = CCValue(EvalResult, CCValue::GlobalValue()); 95947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith return true; 96003f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith} 96103f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith 962c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smithstatic bool IsConstNonVolatile(QualType T) { 96303f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith Qualifiers Quals = T.getQualifiers(); 96403f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith return Quals.hasConst() && !Quals.hasVolatile(); 96503f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith} 96603f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith 96759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith/// Get the base index of the given base class within an APValue representing 96859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith/// the given derived class. 96959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithstatic unsigned getBaseIndex(const CXXRecordDecl *Derived, 97059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith const CXXRecordDecl *Base) { 97159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith Base = Base->getCanonicalDecl(); 97259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith unsigned Index = 0; 97359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith for (CXXRecordDecl::base_class_const_iterator I = Derived->bases_begin(), 97459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith E = Derived->bases_end(); I != E; ++I, ++Index) { 97559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith if (I->getType()->getAsCXXRecordDecl()->getCanonicalDecl() == Base) 97659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return Index; 97759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } 97859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 97959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith llvm_unreachable("base class missing from derived class's bases list"); 98059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 98159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 982cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith/// Extract the designated sub-object of an rvalue. 983f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithstatic bool ExtractSubobject(EvalInfo &Info, const Expr *E, 984f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith CCValue &Obj, QualType ObjType, 985cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith const SubobjectDesignator &Sub, QualType SubType) { 986f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (Sub.Invalid || Sub.OnePastTheEnd) { 987dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(E->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 988cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return false; 989f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 990f64699e8db3946e21b5f4a0421cbc58a3e439599Richard Smith if (Sub.Entries.empty()) 991cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return true; 992cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 993cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith assert(!Obj.isLValue() && "extracting subobject of lvalue"); 994cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith const APValue *O = &Obj; 995180f47959a066795cc0f409433023af448bb0328Richard Smith // Walk the designator's path to find the subobject. 996cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith for (unsigned I = 0, N = Sub.Entries.size(); I != N; ++I) { 997cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith if (ObjType->isArrayType()) { 998180f47959a066795cc0f409433023af448bb0328Richard Smith // Next subobject is an array element. 999cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType(ObjType); 1000f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith assert(CAT && "vla in literal type?"); 1001cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith uint64_t Index = Sub.Entries[I].ArrayIndex; 1002f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (CAT->getSize().ule(Index)) { 1003dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(E->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 1004cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return false; 1005f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 1006cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith if (O->getArrayInitializedElts() > Index) 1007cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith O = &O->getArrayInitializedElt(Index); 1008cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith else 1009cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith O = &O->getArrayFiller(); 1010cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith ObjType = CAT->getElementType(); 1011180f47959a066795cc0f409433023af448bb0328Richard Smith } else if (const FieldDecl *Field = getAsField(Sub.Entries[I])) { 1012180f47959a066795cc0f409433023af448bb0328Richard Smith // Next subobject is a class, struct or union field. 1013180f47959a066795cc0f409433023af448bb0328Richard Smith RecordDecl *RD = ObjType->castAs<RecordType>()->getDecl(); 1014180f47959a066795cc0f409433023af448bb0328Richard Smith if (RD->isUnion()) { 1015180f47959a066795cc0f409433023af448bb0328Richard Smith const FieldDecl *UnionField = O->getUnionField(); 1016180f47959a066795cc0f409433023af448bb0328Richard Smith if (!UnionField || 1017f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith UnionField->getCanonicalDecl() != Field->getCanonicalDecl()) { 1018dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(E->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 1019180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1020f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 1021180f47959a066795cc0f409433023af448bb0328Richard Smith O = &O->getUnionValue(); 1022180f47959a066795cc0f409433023af448bb0328Richard Smith } else 1023180f47959a066795cc0f409433023af448bb0328Richard Smith O = &O->getStructField(Field->getFieldIndex()); 1024180f47959a066795cc0f409433023af448bb0328Richard Smith ObjType = Field->getType(); 1025cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith } else { 1026180f47959a066795cc0f409433023af448bb0328Richard Smith // Next subobject is a base class. 102759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith const CXXRecordDecl *Derived = ObjType->getAsCXXRecordDecl(); 102859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith const CXXRecordDecl *Base = getAsBaseClass(Sub.Entries[I]); 102959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith O = &O->getStructBase(getBaseIndex(Derived, Base)); 103059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith ObjType = Info.Ctx.getRecordType(Base); 1031cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith } 1032180f47959a066795cc0f409433023af448bb0328Richard Smith 1033f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (O->isUninit()) { 1034dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(E->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 1035180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1036f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 1037cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith } 1038cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 1039cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith Obj = CCValue(*O, CCValue::GlobalValue()); 1040cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return true; 1041cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith} 1042cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 1043180f47959a066795cc0f409433023af448bb0328Richard Smith/// HandleLValueToRValueConversion - Perform an lvalue-to-rvalue conversion on 1044180f47959a066795cc0f409433023af448bb0328Richard Smith/// the given lvalue. This can also be used for 'lvalue-to-lvalue' conversions 1045180f47959a066795cc0f409433023af448bb0328Richard Smith/// for looking up the glvalue referred to by an entity of reference type. 1046180f47959a066795cc0f409433023af448bb0328Richard Smith/// 1047180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param Info - Information about the ongoing evaluation. 1048f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith/// \param Conv - The expression for which we are performing the conversion. 1049f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith/// Used for diagnostics. 1050180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param Type - The type we expect this conversion to produce. 1051180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param LVal - The glvalue on which we are attempting to perform this action. 1052180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param RVal - The produced value will be placed here. 1053f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithstatic bool HandleLValueToRValueConversion(EvalInfo &Info, const Expr *Conv, 1054f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith QualType Type, 1055cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith const LValue &LVal, CCValue &RVal) { 10561bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith const Expr *Base = LVal.Base.dyn_cast<const Expr*>(); 1057177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith CallStackFrame *Frame = LVal.Frame; 1058c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 1059f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!LVal.Base) { 1060f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // FIXME: Indirection through a null pointer deserves a specific diagnostic. 1061dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(Conv->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 1062c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return false; 1063f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 1064c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 10651bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith if (const ValueDecl *D = LVal.Base.dyn_cast<const ValueDecl*>()) { 1066c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // In C++98, const, non-volatile integers initialized with ICEs are ICEs. 1067c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // In C++11, constexpr, non-volatile variables initialized with constant 1068d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith // expressions are constant expressions too. Inside constexpr functions, 1069d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith // parameters are constant expressions even if they're non-const. 1070c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // In C, such things can also be folded, although they are not ICEs. 1071c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // 1072d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith // FIXME: volatile-qualified ParmVarDecls need special handling. A literal 1073d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith // interpretation of C++11 suggests that volatile parameters are OK if 1074d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith // they're never read (there's no prohibition against constructing volatile 1075d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith // objects in constant expressions), but lvalue-to-rvalue conversions on 1076d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith // them are not permitted. 1077c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith const VarDecl *VD = dyn_cast<VarDecl>(D); 1078f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!VD || VD->isInvalidDecl()) { 1079dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(Conv->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 10800a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return false; 1081f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 1082f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 10831bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith QualType VT = VD->getType(); 10840a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (!isa<ParmVarDecl>(VD)) { 1085f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!IsConstNonVolatile(VT)) { 1086dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(Conv->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 10870a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return false; 1088f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 1089cd689927139d3ab52c0c088521633c661bd2d807Richard Smith // FIXME: Allow folding of values of any literal type in all languages. 1090cd689927139d3ab52c0c088521633c661bd2d807Richard Smith if (!VT->isIntegralOrEnumerationType() && !VT->isRealFloatingType() && 1091f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith !VD->isConstexpr()) { 1092dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(Conv->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 10930a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return false; 1094f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 10950a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith } 1096f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!EvaluateVarDeclInit(Info, Conv, VD, Frame, RVal)) 1097c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return false; 1098c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 109947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith if (isa<ParmVarDecl>(VD) || !VD->getAnyInitializer()->isLValue()) 1100f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return ExtractSubobject(Info, Conv, RVal, VT, LVal.Designator, Type); 1101c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 1102c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // The declaration was initialized by an lvalue, with no lvalue-to-rvalue 1103c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // conversion. This happens when the declaration and the lvalue should be 1104c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // considered synonymous, for instance when initializing an array of char 1105c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // from a string literal. Continue as if the initializer lvalue was the 1106c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // value we were originally given. 11070a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith assert(RVal.getLValueOffset().isZero() && 11080a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith "offset for lvalue init of non-reference"); 11091bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith Base = RVal.getLValueBase().get<const Expr*>(); 1110177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith Frame = RVal.getLValueFrame(); 1111c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith } 1112c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 11130a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith // FIXME: Support PredefinedExpr, ObjCEncodeExpr, MakeStringConstant 11140a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (const StringLiteral *S = dyn_cast<StringLiteral>(Base)) { 11150a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith const SubobjectDesignator &Designator = LVal.Designator; 1116f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (Designator.Invalid || Designator.Entries.size() != 1) { 1117dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(Conv->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 11180a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return false; 1119f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 11200a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith 11210a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith assert(Type->isIntegerType() && "string element not integer type"); 11229a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith uint64_t Index = Designator.Entries[0].ArrayIndex; 1123f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (Index > S->getLength()) { 1124dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(Conv->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 11250a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return false; 1126f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 11270a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith APSInt Value(S->getCharByteWidth() * Info.Ctx.getCharWidth(), 11280a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Type->isUnsignedIntegerType()); 11290a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (Index < S->getLength()) 11300a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Value = S->getCodeUnit(Index); 11310a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith RVal = CCValue(Value); 11320a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return true; 11330a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith } 11340a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith 1135177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith if (Frame) { 1136cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // If this is a temporary expression with a nontrivial initializer, grab the 1137cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // value from the relevant stack frame. 1138177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith RVal = Frame->Temporaries[Base]; 1139cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith } else if (const CompoundLiteralExpr *CLE 1140cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith = dyn_cast<CompoundLiteralExpr>(Base)) { 1141cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // In C99, a CompoundLiteralExpr is an lvalue, and we defer evaluating the 1142cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // initializer until now for such expressions. Such an expression can't be 1143cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // an ICE in C, so this only matters for fold. 1144c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith assert(!Info.getLangOpts().CPlusPlus && "lvalue compound literal in c++?"); 1145cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith if (!Evaluate(RVal, Info, CLE->getInitializer())) 1146cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return false; 1147f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } else { 1148dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(Conv->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 1149cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return false; 1150f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 1151c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 1152f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return ExtractSubobject(Info, Conv, RVal, Base->getType(), LVal.Designator, 1153f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith Type); 1154c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith} 1155c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 115659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith/// Build an lvalue for the object argument of a member function call. 115759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithstatic bool EvaluateObjectArgument(EvalInfo &Info, const Expr *Object, 115859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith LValue &This) { 115959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith if (Object->getType()->isPointerType()) 116059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return EvaluatePointer(Object, This, Info); 116159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 116259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith if (Object->isGLValue()) 116359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return EvaluateLValue(Object, This, Info); 116459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 1165e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (Object->getType()->isLiteralType()) 1166e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return EvaluateTemporary(Object, This, Info); 1167e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1168e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 1169e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 1170e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1171e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// HandleMemberPointerAccess - Evaluate a member access operation and build an 1172e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// lvalue referring to the result. 1173e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// 1174e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// \param Info - Information about the ongoing evaluation. 1175e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// \param BO - The member pointer access operation. 1176e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// \param LV - Filled in with a reference to the resulting object. 1177e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// \param IncludeMember - Specifies whether the member itself is included in 1178e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// the resulting LValue subobject designator. This is not possible when 1179e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// creating a bound member function. 1180e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// \return The field or method declaration to which the member pointer refers, 1181e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// or 0 if evaluation fails. 1182e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstatic const ValueDecl *HandleMemberPointerAccess(EvalInfo &Info, 1183e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const BinaryOperator *BO, 1184e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LValue &LV, 1185e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool IncludeMember = true) { 1186e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith assert(BO->getOpcode() == BO_PtrMemD || BO->getOpcode() == BO_PtrMemI); 1187e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1188e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!EvaluateObjectArgument(Info, BO->getLHS(), LV)) 1189e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return 0; 1190e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1191e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MemberPtr MemPtr; 1192e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!EvaluateMemberPointer(BO->getRHS(), MemPtr, Info)) 1193e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return 0; 1194e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1195e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // C++11 [expr.mptr.oper]p6: If the second operand is the null pointer to 1196e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // member value, the behavior is undefined. 1197e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!MemPtr.getDecl()) 1198e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return 0; 1199e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1200e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (MemPtr.isDerivedMember()) { 1201e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // This is a member of some derived class. Truncate LV appropriately. 1202e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *MostDerivedType; 1203e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith unsigned MostDerivedPathLength; 1204e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool MostDerivedIsArrayElement; 1205e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!FindMostDerivedObject(Info, LV, MostDerivedType, MostDerivedPathLength, 1206e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MostDerivedIsArrayElement)) 1207e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return 0; 1208e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1209e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // The end of the derived-to-base path for the base object must match the 1210e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // derived-to-base path for the member pointer. 1211e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (MostDerivedPathLength + MemPtr.Path.size() > 1212e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LV.Designator.Entries.size()) 1213e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return 0; 1214e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith unsigned PathLengthToMember = 1215e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LV.Designator.Entries.size() - MemPtr.Path.size(); 1216e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith for (unsigned I = 0, N = MemPtr.Path.size(); I != N; ++I) { 1217e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *LVDecl = getAsBaseClass( 1218e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LV.Designator.Entries[PathLengthToMember + I]); 1219e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *MPDecl = MemPtr.Path[I]; 1220e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (LVDecl->getCanonicalDecl() != MPDecl->getCanonicalDecl()) 1221e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return 0; 1222e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 1223e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1224e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Truncate the lvalue to the appropriate derived class. 1225e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool ResultIsArray = false; 1226e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (PathLengthToMember == MostDerivedPathLength) 1227e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith ResultIsArray = MostDerivedIsArrayElement; 1228e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith TruncateLValueBasePath(Info, LV, MemPtr.getContainingRecord(), 1229e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith PathLengthToMember, ResultIsArray); 1230e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } else if (!MemPtr.Path.empty()) { 1231e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Extend the LValue path with the member pointer's path. 1232e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LV.Designator.Entries.reserve(LV.Designator.Entries.size() + 1233e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MemPtr.Path.size() + IncludeMember); 1234e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1235e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Walk down to the appropriate base class. 1236e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith QualType LVType = BO->getLHS()->getType(); 1237e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (const PointerType *PT = LVType->getAs<PointerType>()) 1238e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LVType = PT->getPointeeType(); 1239e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *RD = LVType->getAsCXXRecordDecl(); 1240e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith assert(RD && "member pointer access on non-class-type expression"); 1241e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // The first class in the path is that of the lvalue. 1242e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith for (unsigned I = 1, N = MemPtr.Path.size(); I != N; ++I) { 1243e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *Base = MemPtr.Path[N - I - 1]; 1244e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith HandleLValueDirectBase(Info, LV, RD, Base); 1245e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith RD = Base; 1246e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 1247e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Finally cast to the class containing the member. 1248e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith HandleLValueDirectBase(Info, LV, RD, MemPtr.getContainingRecord()); 1249e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 1250e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1251e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Add the member. Note that we cannot build bound member functions here. 1252e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (IncludeMember) { 1253e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // FIXME: Deal with IndirectFieldDecls. 1254e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const FieldDecl *FD = dyn_cast<FieldDecl>(MemPtr.getDecl()); 1255e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!FD) return 0; 1256e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith HandleLValueMember(Info, LV, FD); 1257e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 1258e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1259e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return MemPtr.getDecl(); 1260e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 1261e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1262e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// HandleBaseToDerivedCast - Apply the given base-to-derived cast operation on 1263e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// the provided lvalue, which currently refers to the base object. 1264e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstatic bool HandleBaseToDerivedCast(EvalInfo &Info, const CastExpr *E, 1265e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LValue &Result) { 1266e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *MostDerivedType; 1267e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith unsigned MostDerivedPathLength; 1268e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool MostDerivedIsArrayElement; 1269e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1270e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Check this cast doesn't take us outside the object. 1271e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!FindMostDerivedObject(Info, Result, MostDerivedType, 1272e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MostDerivedPathLength, 1273e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MostDerivedIsArrayElement)) 1274e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 1275e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith SubobjectDesignator &D = Result.Designator; 1276e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (MostDerivedPathLength + E->path_size() > D.Entries.size()) 1277e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 1278e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1279e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Check the type of the final cast. We don't need to check the path, 1280e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // since a cast can only be formed if the path is unique. 1281e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith unsigned NewEntriesSize = D.Entries.size() - E->path_size(); 1282e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool ResultIsArray = false; 1283e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith QualType TargetQT = E->getType(); 1284e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (const PointerType *PT = TargetQT->getAs<PointerType>()) 1285e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith TargetQT = PT->getPointeeType(); 1286e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *TargetType = TargetQT->getAsCXXRecordDecl(); 1287e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *FinalType; 1288e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (NewEntriesSize == MostDerivedPathLength) { 1289e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith ResultIsArray = MostDerivedIsArrayElement; 1290e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith FinalType = MostDerivedType; 1291e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } else 1292e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith FinalType = getAsBaseClass(D.Entries[NewEntriesSize - 1]); 1293e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (FinalType->getCanonicalDecl() != TargetType->getCanonicalDecl()) 1294e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 1295e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1296e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Truncate the lvalue to the appropriate derived class. 1297e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith TruncateLValueBasePath(Info, Result, TargetType, NewEntriesSize, 1298e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith ResultIsArray); 1299e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 130059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 130159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 1302c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stumpnamespace { 1303d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smithenum EvalStmtResult { 1304d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith /// Evaluation failed. 1305d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith ESR_Failed, 1306d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith /// Hit a 'return' statement. 1307d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith ESR_Returned, 1308d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith /// Evaluation succeeded. 1309d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith ESR_Succeeded 1310d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith}; 1311d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith} 1312d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 1313d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith// Evaluate a statement. 131447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smithstatic EvalStmtResult EvaluateStmt(CCValue &Result, EvalInfo &Info, 1315d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith const Stmt *S) { 1316d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith switch (S->getStmtClass()) { 1317d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith default: 1318d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith return ESR_Failed; 1319d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 1320d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith case Stmt::NullStmtClass: 1321d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith case Stmt::DeclStmtClass: 1322d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith return ESR_Succeeded; 1323d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 1324d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith case Stmt::ReturnStmtClass: 1325d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith if (Evaluate(Result, Info, cast<ReturnStmt>(S)->getRetValue())) 1326d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith return ESR_Returned; 1327d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith return ESR_Failed; 1328d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 1329d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith case Stmt::CompoundStmtClass: { 1330d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith const CompoundStmt *CS = cast<CompoundStmt>(S); 1331d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith for (CompoundStmt::const_body_iterator BI = CS->body_begin(), 1332d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith BE = CS->body_end(); BI != BE; ++BI) { 1333d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith EvalStmtResult ESR = EvaluateStmt(Result, Info, *BI); 1334d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith if (ESR != ESR_Succeeded) 1335d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith return ESR; 1336d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith } 1337d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith return ESR_Succeeded; 1338d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith } 1339d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith } 1340d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith} 1341d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 1342180f47959a066795cc0f409433023af448bb0328Richard Smithnamespace { 1343cd99b072e8b32075da6233cbf14ea58a5c82de4fRichard Smithtypedef SmallVector<CCValue, 8> ArgVector; 1344180f47959a066795cc0f409433023af448bb0328Richard Smith} 1345180f47959a066795cc0f409433023af448bb0328Richard Smith 1346180f47959a066795cc0f409433023af448bb0328Richard Smith/// EvaluateArgs - Evaluate the arguments to a function call. 1347180f47959a066795cc0f409433023af448bb0328Richard Smithstatic bool EvaluateArgs(ArrayRef<const Expr*> Args, ArgVector &ArgValues, 1348180f47959a066795cc0f409433023af448bb0328Richard Smith EvalInfo &Info) { 1349180f47959a066795cc0f409433023af448bb0328Richard Smith for (ArrayRef<const Expr*>::iterator I = Args.begin(), E = Args.end(); 1350180f47959a066795cc0f409433023af448bb0328Richard Smith I != E; ++I) 1351180f47959a066795cc0f409433023af448bb0328Richard Smith if (!Evaluate(ArgValues[I - Args.begin()], Info, *I)) 1352180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1353180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 1354180f47959a066795cc0f409433023af448bb0328Richard Smith} 1355180f47959a066795cc0f409433023af448bb0328Richard Smith 1356d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith/// Evaluate a function call. 1357f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithstatic bool HandleFunctionCall(const Expr *CallExpr, const LValue *This, 1358f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith ArrayRef<const Expr*> Args, const Stmt *Body, 1359f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith EvalInfo &Info, CCValue &Result) { 1360f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (Info.atCallLimit()) { 1361f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // FIXME: Add a specific proper diagnostic for this. 1362dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(CallExpr->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 1363d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith return false; 1364f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 1365d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 1366180f47959a066795cc0f409433023af448bb0328Richard Smith ArgVector ArgValues(Args.size()); 1367180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateArgs(Args, ArgValues, Info)) 1368180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1369d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 1370180f47959a066795cc0f409433023af448bb0328Richard Smith CallStackFrame Frame(Info, This, ArgValues.data()); 1371d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith return EvaluateStmt(Result, Info, Body) == ESR_Returned; 1372d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith} 1373d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 1374180f47959a066795cc0f409433023af448bb0328Richard Smith/// Evaluate a constructor call. 1375f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithstatic bool HandleConstructorCall(const Expr *CallExpr, const LValue &This, 137659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith ArrayRef<const Expr*> Args, 1377180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXConstructorDecl *Definition, 137859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith EvalInfo &Info, 1379180f47959a066795cc0f409433023af448bb0328Richard Smith APValue &Result) { 1380f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (Info.atCallLimit()) { 1381f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // FIXME: Add a specific diagnostic for this. 1382dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(CallExpr->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 1383180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1384f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 1385180f47959a066795cc0f409433023af448bb0328Richard Smith 1386180f47959a066795cc0f409433023af448bb0328Richard Smith ArgVector ArgValues(Args.size()); 1387180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateArgs(Args, ArgValues, Info)) 1388180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1389180f47959a066795cc0f409433023af448bb0328Richard Smith 1390180f47959a066795cc0f409433023af448bb0328Richard Smith CallStackFrame Frame(Info, &This, ArgValues.data()); 1391180f47959a066795cc0f409433023af448bb0328Richard Smith 1392180f47959a066795cc0f409433023af448bb0328Richard Smith // If it's a delegating constructor, just delegate. 1393180f47959a066795cc0f409433023af448bb0328Richard Smith if (Definition->isDelegatingConstructor()) { 1394180f47959a066795cc0f409433023af448bb0328Richard Smith CXXConstructorDecl::init_const_iterator I = Definition->init_begin(); 1395180f47959a066795cc0f409433023af448bb0328Richard Smith return EvaluateConstantExpression(Result, Info, This, (*I)->getInit()); 1396180f47959a066795cc0f409433023af448bb0328Richard Smith } 1397180f47959a066795cc0f409433023af448bb0328Richard Smith 1398180f47959a066795cc0f409433023af448bb0328Richard Smith // Reserve space for the struct members. 1399180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXRecordDecl *RD = Definition->getParent(); 1400180f47959a066795cc0f409433023af448bb0328Richard Smith if (!RD->isUnion()) 1401180f47959a066795cc0f409433023af448bb0328Richard Smith Result = APValue(APValue::UninitStruct(), RD->getNumBases(), 1402180f47959a066795cc0f409433023af448bb0328Richard Smith std::distance(RD->field_begin(), RD->field_end())); 1403180f47959a066795cc0f409433023af448bb0328Richard Smith 1404180f47959a066795cc0f409433023af448bb0328Richard Smith const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); 1405180f47959a066795cc0f409433023af448bb0328Richard Smith 1406180f47959a066795cc0f409433023af448bb0328Richard Smith unsigned BasesSeen = 0; 1407180f47959a066795cc0f409433023af448bb0328Richard Smith#ifndef NDEBUG 1408180f47959a066795cc0f409433023af448bb0328Richard Smith CXXRecordDecl::base_class_const_iterator BaseIt = RD->bases_begin(); 1409180f47959a066795cc0f409433023af448bb0328Richard Smith#endif 1410180f47959a066795cc0f409433023af448bb0328Richard Smith for (CXXConstructorDecl::init_const_iterator I = Definition->init_begin(), 1411180f47959a066795cc0f409433023af448bb0328Richard Smith E = Definition->init_end(); I != E; ++I) { 1412180f47959a066795cc0f409433023af448bb0328Richard Smith if ((*I)->isBaseInitializer()) { 1413180f47959a066795cc0f409433023af448bb0328Richard Smith QualType BaseType((*I)->getBaseClass(), 0); 1414180f47959a066795cc0f409433023af448bb0328Richard Smith#ifndef NDEBUG 1415180f47959a066795cc0f409433023af448bb0328Richard Smith // Non-virtual base classes are initialized in the order in the class 1416180f47959a066795cc0f409433023af448bb0328Richard Smith // definition. We cannot have a virtual base class for a literal type. 1417180f47959a066795cc0f409433023af448bb0328Richard Smith assert(!BaseIt->isVirtual() && "virtual base for literal type"); 1418180f47959a066795cc0f409433023af448bb0328Richard Smith assert(Info.Ctx.hasSameType(BaseIt->getType(), BaseType) && 1419180f47959a066795cc0f409433023af448bb0328Richard Smith "base class initializers not in expected order"); 1420180f47959a066795cc0f409433023af448bb0328Richard Smith ++BaseIt; 1421180f47959a066795cc0f409433023af448bb0328Richard Smith#endif 1422180f47959a066795cc0f409433023af448bb0328Richard Smith LValue Subobject = This; 1423180f47959a066795cc0f409433023af448bb0328Richard Smith HandleLValueDirectBase(Info, Subobject, RD, 1424180f47959a066795cc0f409433023af448bb0328Richard Smith BaseType->getAsCXXRecordDecl(), &Layout); 1425180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateConstantExpression(Result.getStructBase(BasesSeen++), Info, 1426180f47959a066795cc0f409433023af448bb0328Richard Smith Subobject, (*I)->getInit())) 1427180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1428180f47959a066795cc0f409433023af448bb0328Richard Smith } else if (FieldDecl *FD = (*I)->getMember()) { 1429180f47959a066795cc0f409433023af448bb0328Richard Smith LValue Subobject = This; 1430180f47959a066795cc0f409433023af448bb0328Richard Smith HandleLValueMember(Info, Subobject, FD, &Layout); 1431180f47959a066795cc0f409433023af448bb0328Richard Smith if (RD->isUnion()) { 1432180f47959a066795cc0f409433023af448bb0328Richard Smith Result = APValue(FD); 1433180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateConstantExpression(Result.getUnionValue(), Info, 1434180f47959a066795cc0f409433023af448bb0328Richard Smith Subobject, (*I)->getInit())) 1435180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1436180f47959a066795cc0f409433023af448bb0328Richard Smith } else if (!EvaluateConstantExpression( 1437180f47959a066795cc0f409433023af448bb0328Richard Smith Result.getStructField(FD->getFieldIndex()), 1438180f47959a066795cc0f409433023af448bb0328Richard Smith Info, Subobject, (*I)->getInit())) 1439180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1440180f47959a066795cc0f409433023af448bb0328Richard Smith } else { 1441180f47959a066795cc0f409433023af448bb0328Richard Smith // FIXME: handle indirect field initializers 1442dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag((*I)->getInit()->getExprLoc(), 1443f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith diag::note_invalid_subexpr_in_const_expr); 1444180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1445180f47959a066795cc0f409433023af448bb0328Richard Smith } 1446180f47959a066795cc0f409433023af448bb0328Richard Smith } 1447180f47959a066795cc0f409433023af448bb0328Richard Smith 1448180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 1449180f47959a066795cc0f409433023af448bb0328Richard Smith} 1450180f47959a066795cc0f409433023af448bb0328Richard Smith 1451d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smithnamespace { 1452770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass HasSideEffect 14538cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : public ConstStmtVisitor<HasSideEffect, bool> { 14541e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith const ASTContext &Ctx; 1455c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stumppublic: 1456c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 14571e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith HasSideEffect(const ASTContext &C) : Ctx(C) {} 1458c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 1459c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump // Unhandled nodes conservatively default to having side effects. 14608cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitStmt(const Stmt *S) { 1461c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump return true; 1462c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump } 1463c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 14648cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitParenExpr(const ParenExpr *E) { return Visit(E->getSubExpr()); } 14658cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitGenericSelectionExpr(const GenericSelectionExpr *E) { 1466f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne return Visit(E->getResultExpr()); 1467f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne } 14688cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitDeclRefExpr(const DeclRefExpr *E) { 14691e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith if (Ctx.getCanonicalType(E->getType()).isVolatileQualified()) 1470c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump return true; 1471c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump return false; 1472c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump } 1473f85e193739c953358c865005855253af4f68a497John McCall bool VisitObjCIvarRefExpr(const ObjCIvarRefExpr *E) { 14741e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith if (Ctx.getCanonicalType(E->getType()).isVolatileQualified()) 1475f85e193739c953358c865005855253af4f68a497John McCall return true; 1476f85e193739c953358c865005855253af4f68a497John McCall return false; 1477f85e193739c953358c865005855253af4f68a497John McCall } 1478f85e193739c953358c865005855253af4f68a497John McCall bool VisitBlockDeclRefExpr (const BlockDeclRefExpr *E) { 14791e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith if (Ctx.getCanonicalType(E->getType()).isVolatileQualified()) 1480f85e193739c953358c865005855253af4f68a497John McCall return true; 1481f85e193739c953358c865005855253af4f68a497John McCall return false; 1482f85e193739c953358c865005855253af4f68a497John McCall } 1483f85e193739c953358c865005855253af4f68a497John McCall 1484c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump // We don't want to evaluate BlockExprs multiple times, as they generate 1485c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump // a ton of code. 14868cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitBlockExpr(const BlockExpr *E) { return true; } 14878cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitPredefinedExpr(const PredefinedExpr *E) { return false; } 14888cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) 1489c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump { return Visit(E->getInitializer()); } 14908cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitMemberExpr(const MemberExpr *E) { return Visit(E->getBase()); } 14918cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitIntegerLiteral(const IntegerLiteral *E) { return false; } 14928cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitFloatingLiteral(const FloatingLiteral *E) { return false; } 14938cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitStringLiteral(const StringLiteral *E) { return false; } 14948cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCharacterLiteral(const CharacterLiteral *E) { return false; } 14958cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *E) 1496f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne { return false; } 14978cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitArraySubscriptExpr(const ArraySubscriptExpr *E) 1498980ca220848d27ef55ef4c2d37423461a8ed0da3Mike Stump { return Visit(E->getLHS()) || Visit(E->getRHS()); } 14998cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitChooseExpr(const ChooseExpr *E) 15001e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith { return Visit(E->getChosenSubExpr(Ctx)); } 15018cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCastExpr(const CastExpr *E) { return Visit(E->getSubExpr()); } 15028cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitBinAssign(const BinaryOperator *E) { return true; } 15038cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCompoundAssignOperator(const BinaryOperator *E) { return true; } 15048cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitBinaryOperator(const BinaryOperator *E) 1505980ca220848d27ef55ef4c2d37423461a8ed0da3Mike Stump { return Visit(E->getLHS()) || Visit(E->getRHS()); } 15068cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitUnaryPreInc(const UnaryOperator *E) { return true; } 15078cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitUnaryPostInc(const UnaryOperator *E) { return true; } 15088cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitUnaryPreDec(const UnaryOperator *E) { return true; } 15098cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitUnaryPostDec(const UnaryOperator *E) { return true; } 15108cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitUnaryDeref(const UnaryOperator *E) { 15111e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith if (Ctx.getCanonicalType(E->getType()).isVolatileQualified()) 1512c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump return true; 1513980ca220848d27ef55ef4c2d37423461a8ed0da3Mike Stump return Visit(E->getSubExpr()); 1514c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump } 15158cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitUnaryOperator(const UnaryOperator *E) { return Visit(E->getSubExpr()); } 1516363ff23cfddb51abe4ee4212a6dd3c9b534fcc8bChris Lattner 1517363ff23cfddb51abe4ee4212a6dd3c9b534fcc8bChris Lattner // Has side effects if any element does. 15188cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitInitListExpr(const InitListExpr *E) { 1519363ff23cfddb51abe4ee4212a6dd3c9b534fcc8bChris Lattner for (unsigned i = 0, e = E->getNumInits(); i != e; ++i) 1520363ff23cfddb51abe4ee4212a6dd3c9b534fcc8bChris Lattner if (Visit(E->getInit(i))) return true; 15218cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne if (const Expr *filler = E->getArrayFiller()) 15224423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis return Visit(filler); 1523363ff23cfddb51abe4ee4212a6dd3c9b534fcc8bChris Lattner return false; 1524363ff23cfddb51abe4ee4212a6dd3c9b534fcc8bChris Lattner } 1525ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor 15268cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitSizeOfPackExpr(const SizeOfPackExpr *) { return false; } 1527c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump}; 1528c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 152956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallclass OpaqueValueEvaluation { 153056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall EvalInfo &info; 153156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall OpaqueValueExpr *opaqueValue; 153256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 153356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallpublic: 153456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall OpaqueValueEvaluation(EvalInfo &info, OpaqueValueExpr *opaqueValue, 153556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *value) 153656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall : info(info), opaqueValue(opaqueValue) { 153756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 153856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // If evaluation fails, fail immediately. 15391e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith if (!Evaluate(info.OpaqueValues[opaqueValue], info, value)) { 154056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall this->opaqueValue = 0; 154156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return; 154256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 154356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 154456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 154556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall bool hasError() const { return opaqueValue == 0; } 154656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 154756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall ~OpaqueValueEvaluation() { 15481e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith // FIXME: This will not work for recursive constexpr functions using opaque 15491e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith // values. Restore the former value. 155056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (opaqueValue) info.OpaqueValues.erase(opaqueValue); 155156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 155256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall}; 155356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 1554c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump} // end anonymous namespace 1555c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 15564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 15578cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne// Generic Evaluation 15588cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne//===----------------------------------------------------------------------===// 15598cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournenamespace { 15608cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 1561f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith// FIXME: RetTy is always bool. Remove it. 1562f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithtemplate <class Derived, typename RetTy=bool> 15638cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourneclass ExprEvaluatorBase 15648cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : public ConstStmtVisitor<Derived, RetTy> { 15658cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourneprivate: 156647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith RetTy DerivedSuccess(const CCValue &V, const Expr *E) { 15678cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return static_cast<Derived*>(this)->Success(V, E); 15688cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 1569f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith RetTy DerivedValueInitialization(const Expr *E) { 1570f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith return static_cast<Derived*>(this)->ValueInitialization(E); 1571f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith } 15728cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 15738cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourneprotected: 15748cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne EvalInfo &Info; 15758cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne typedef ConstStmtVisitor<Derived, RetTy> StmtVisitorTy; 15768cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne typedef ExprEvaluatorBase ExprEvaluatorBaseTy; 15778cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 1578dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith OptionalDiagnostic CCEDiag(const Expr *E, diag::kind D) { 1579d5093420308784e31071c8cd723a58d74159f393Richard Smith return Info.CCEDiag(E->getExprLoc(), D); 1580f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 1581f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 1582f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith /// Report an evaluation error. This should only be called when an error is 1583f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith /// first discovered. When propagating an error, just return false. 1584f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith bool Error(const Expr *E, diag::kind D) { 1585dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(E->getExprLoc(), D); 1586f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 1587f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 1588f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith bool Error(const Expr *E) { 1589f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E, diag::note_invalid_subexpr_in_const_expr); 1590f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 1591f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 1592f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith RetTy ValueInitialization(const Expr *E) { return Error(E); } 1593f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith 15948cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournepublic: 15958cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne ExprEvaluatorBase(EvalInfo &Info) : Info(Info) {} 15968cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 15978cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitStmt(const Stmt *) { 1598b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Expression evaluator should not be called on stmts"); 15998cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 16008cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitExpr(const Expr *E) { 1601f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 16028cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 16038cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 16048cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitParenExpr(const ParenExpr *E) 16058cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne { return StmtVisitorTy::Visit(E->getSubExpr()); } 16068cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitUnaryExtension(const UnaryOperator *E) 16078cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne { return StmtVisitorTy::Visit(E->getSubExpr()); } 16088cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitUnaryPlus(const UnaryOperator *E) 16098cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne { return StmtVisitorTy::Visit(E->getSubExpr()); } 16108cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitChooseExpr(const ChooseExpr *E) 16118cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne { return StmtVisitorTy::Visit(E->getChosenSubExpr(Info.Ctx)); } 16128cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitGenericSelectionExpr(const GenericSelectionExpr *E) 16138cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne { return StmtVisitorTy::Visit(E->getResultExpr()); } 161491a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall RetTy VisitSubstNonTypeTemplateParmExpr(const SubstNonTypeTemplateParmExpr *E) 161591a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall { return StmtVisitorTy::Visit(E->getReplacement()); } 16163d75ca836205856077c18e30e9447accbd85f751Richard Smith RetTy VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *E) 16173d75ca836205856077c18e30e9447accbd85f751Richard Smith { return StmtVisitorTy::Visit(E->getExpr()); } 16188cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 1619c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith RetTy VisitCXXReinterpretCastExpr(const CXXReinterpretCastExpr *E) { 1620c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith CCEDiag(E, diag::note_constexpr_invalid_cast) << 0; 1621c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith return static_cast<Derived*>(this)->VisitCastExpr(E); 1622c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith } 1623c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith RetTy VisitCXXDynamicCastExpr(const CXXDynamicCastExpr *E) { 1624c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith CCEDiag(E, diag::note_constexpr_invalid_cast) << 1; 1625c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith return static_cast<Derived*>(this)->VisitCastExpr(E); 1626c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith } 1627c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith 1628e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith RetTy VisitBinaryOperator(const BinaryOperator *E) { 1629e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith switch (E->getOpcode()) { 1630e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith default: 1631f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 1632e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1633e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case BO_Comma: 1634e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith VisitIgnoredValue(E->getLHS()); 1635e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return StmtVisitorTy::Visit(E->getRHS()); 1636e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1637e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case BO_PtrMemD: 1638e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case BO_PtrMemI: { 1639e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LValue Obj; 1640e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!HandleMemberPointerAccess(Info, E, Obj)) 1641e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 1642e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith CCValue Result; 1643f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!HandleLValueToRValueConversion(Info, E, E->getType(), Obj, Result)) 1644e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 1645e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return DerivedSuccess(Result, E); 1646e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 1647e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 1648e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 1649e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 16508cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitBinaryConditionalOperator(const BinaryConditionalOperator *E) { 16518cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne OpaqueValueEvaluation opaque(Info, E->getOpaqueValue(), E->getCommon()); 16528cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne if (opaque.hasError()) 1653f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 16548cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 16558cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool cond; 1656c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!EvaluateAsBooleanCondition(E->getCond(), cond, Info)) 1657f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 16588cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 16598cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return StmtVisitorTy::Visit(cond ? E->getTrueExpr() : E->getFalseExpr()); 16608cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 16618cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 16628cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitConditionalOperator(const ConditionalOperator *E) { 16638cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool BoolResult; 1664c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!EvaluateAsBooleanCondition(E->getCond(), BoolResult, Info)) 1665f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 16668cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 1667c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith Expr *EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr(); 16688cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return StmtVisitorTy::Visit(EvalExpr); 16698cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 16708cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 16718cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitOpaqueValueExpr(const OpaqueValueExpr *E) { 167247a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith const CCValue *Value = Info.getOpaqueValue(E); 167342786839cff1ccbe4d883b81d01846c5d774ffc6Argyrios Kyrtzidis if (!Value) { 167442786839cff1ccbe4d883b81d01846c5d774ffc6Argyrios Kyrtzidis const Expr *Source = E->getSourceExpr(); 167542786839cff1ccbe4d883b81d01846c5d774ffc6Argyrios Kyrtzidis if (!Source) 1676f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 167742786839cff1ccbe4d883b81d01846c5d774ffc6Argyrios Kyrtzidis if (Source == E) { // sanity checking. 167842786839cff1ccbe4d883b81d01846c5d774ffc6Argyrios Kyrtzidis assert(0 && "OpaqueValueExpr recursively refers to itself"); 1679f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 168042786839cff1ccbe4d883b81d01846c5d774ffc6Argyrios Kyrtzidis } 168142786839cff1ccbe4d883b81d01846c5d774ffc6Argyrios Kyrtzidis return StmtVisitorTy::Visit(Source); 168242786839cff1ccbe4d883b81d01846c5d774ffc6Argyrios Kyrtzidis } 168347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith return DerivedSuccess(*Value, E); 16848cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 1685f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith 1686d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith RetTy VisitCallExpr(const CallExpr *E) { 1687e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const Expr *Callee = E->getCallee()->IgnoreParens(); 1688d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith QualType CalleeType = Callee->getType(); 1689d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 16906142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel const FunctionDecl *FD = 0; 169159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith LValue *This = 0, ThisVal; 169259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith llvm::ArrayRef<const Expr*> Args(E->getArgs(), E->getNumArgs()); 169359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 169459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith // Extract function decl and 'this' pointer from the callee. 169559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith if (CalleeType->isSpecificBuiltinType(BuiltinType::BoundMember)) { 1696f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith const ValueDecl *Member = 0; 1697e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (const MemberExpr *ME = dyn_cast<MemberExpr>(Callee)) { 1698e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Explicit bound member calls, such as x.f() or p->g(); 1699e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!EvaluateObjectArgument(Info, ME->getBase(), ThisVal)) 1700f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 1701f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith Member = ME->getMemberDecl(); 1702e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith This = &ThisVal; 1703e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } else if (const BinaryOperator *BE = dyn_cast<BinaryOperator>(Callee)) { 1704e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Indirect bound member calls ('.*' or '->*'). 1705f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith Member = HandleMemberPointerAccess(Info, BE, ThisVal, false); 1706f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!Member) return false; 1707e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith This = &ThisVal; 1708e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } else 1709f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(Callee); 1710f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 1711f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith FD = dyn_cast<FunctionDecl>(Member); 1712f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!FD) 1713f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(Callee); 171459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } else if (CalleeType->isFunctionPointerType()) { 171559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith CCValue Call; 1716f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!Evaluate(Call, Info, Callee)) 1717f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 171859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 1719f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!Call.isLValue() || !Call.getLValueOffset().isZero()) 1720f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(Callee); 17211bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith FD = dyn_cast_or_null<FunctionDecl>( 17221bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith Call.getLValueBase().dyn_cast<const ValueDecl*>()); 172359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith if (!FD) 1724f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(Callee); 172559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 172659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith // Overloaded operator calls to member functions are represented as normal 172759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith // calls with '*this' as the first argument. 172859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD); 172959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith if (MD && !MD->isStatic()) { 1730f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // FIXME: When selecting an implicit conversion for an overloaded 1731f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // operator delete, we sometimes try to evaluate calls to conversion 1732f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // operators without a 'this' parameter! 1733f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (Args.empty()) 1734f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 1735f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 173659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith if (!EvaluateObjectArgument(Info, Args[0], ThisVal)) 173759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return false; 173859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith This = &ThisVal; 173959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith Args = Args.slice(1); 174059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } 1741d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 174259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith // Don't call function pointers which have been cast to some other type. 174359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith if (!Info.Ctx.hasSameType(CalleeType->getPointeeType(), FD->getType())) 1744f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 174559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } else 1746f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 1747d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 1748d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith const FunctionDecl *Definition; 1749d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith Stmt *Body = FD->getBody(Definition); 175069c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith CCValue CCResult; 175169c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith APValue Result; 1752d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 1753f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!Body || !Definition->isConstexpr() || Definition->isInvalidDecl()) 1754f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 1755f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 1756f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!HandleFunctionCall(E, This, Args, Body, Info, CCResult) || 1757f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith !CheckConstantExpression(Info, E, CCResult, Result)) 1758f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 1759d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 1760f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return DerivedSuccess(CCValue(Result, CCValue::GlobalValue()), E); 1761d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith } 1762d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 1763c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith RetTy VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) { 1764c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return StmtVisitorTy::Visit(E->getInitializer()); 1765c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith } 1766f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith RetTy VisitInitListExpr(const InitListExpr *E) { 1767f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith if (Info.getLangOpts().CPlusPlus0x) { 1768f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith if (E->getNumInits() == 0) 1769f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith return DerivedValueInitialization(E); 1770f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith if (E->getNumInits() == 1) 1771f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith return StmtVisitorTy::Visit(E->getInit(0)); 1772f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith } 1773f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 1774f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith } 1775f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith RetTy VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) { 1776f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith return DerivedValueInitialization(E); 1777f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith } 1778f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith RetTy VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr *E) { 1779f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith return DerivedValueInitialization(E); 1780f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith } 1781e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith RetTy VisitCXXNullPtrLiteralExpr(const CXXNullPtrLiteralExpr *E) { 1782e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return DerivedValueInitialization(E); 1783e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 1784f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith 1785180f47959a066795cc0f409433023af448bb0328Richard Smith /// A member expression where the object is a prvalue is itself a prvalue. 1786180f47959a066795cc0f409433023af448bb0328Richard Smith RetTy VisitMemberExpr(const MemberExpr *E) { 1787180f47959a066795cc0f409433023af448bb0328Richard Smith assert(!E->isArrow() && "missing call to bound member function?"); 1788180f47959a066795cc0f409433023af448bb0328Richard Smith 1789180f47959a066795cc0f409433023af448bb0328Richard Smith CCValue Val; 1790180f47959a066795cc0f409433023af448bb0328Richard Smith if (!Evaluate(Val, Info, E->getBase())) 1791180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1792180f47959a066795cc0f409433023af448bb0328Richard Smith 1793180f47959a066795cc0f409433023af448bb0328Richard Smith QualType BaseTy = E->getBase()->getType(); 1794180f47959a066795cc0f409433023af448bb0328Richard Smith 1795180f47959a066795cc0f409433023af448bb0328Richard Smith const FieldDecl *FD = dyn_cast<FieldDecl>(E->getMemberDecl()); 1796f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!FD) return Error(E); 1797180f47959a066795cc0f409433023af448bb0328Richard Smith assert(!FD->getType()->isReferenceType() && "prvalue reference?"); 1798180f47959a066795cc0f409433023af448bb0328Richard Smith assert(BaseTy->getAs<RecordType>()->getDecl()->getCanonicalDecl() == 1799180f47959a066795cc0f409433023af448bb0328Richard Smith FD->getParent()->getCanonicalDecl() && "record / field mismatch"); 1800180f47959a066795cc0f409433023af448bb0328Richard Smith 1801180f47959a066795cc0f409433023af448bb0328Richard Smith SubobjectDesignator Designator; 1802180f47959a066795cc0f409433023af448bb0328Richard Smith Designator.addDecl(FD); 1803180f47959a066795cc0f409433023af448bb0328Richard Smith 1804f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return ExtractSubobject(Info, E, Val, BaseTy, Designator, E->getType()) && 1805180f47959a066795cc0f409433023af448bb0328Richard Smith DerivedSuccess(Val, E); 1806180f47959a066795cc0f409433023af448bb0328Richard Smith } 1807180f47959a066795cc0f409433023af448bb0328Richard Smith 1808c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith RetTy VisitCastExpr(const CastExpr *E) { 1809c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith switch (E->getCastKind()) { 1810c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith default: 1811c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith break; 1812c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 1813c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case CK_NoOp: 1814c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return StmtVisitorTy::Visit(E->getSubExpr()); 1815c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 1816c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case CK_LValueToRValue: { 1817c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith LValue LVal; 1818f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!EvaluateLValue(E->getSubExpr(), LVal, Info)) 1819f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 1820f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith CCValue RVal; 1821f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!HandleLValueToRValueConversion(Info, E, E->getType(), LVal, RVal)) 1822f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 1823f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return DerivedSuccess(RVal, E); 1824c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith } 1825c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith } 1826c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 1827f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 1828c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith } 1829c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 18308327fad71da34492d82c532f42a58cb4baff81a3Richard Smith /// Visit a value which is evaluated, but whose value is ignored. 18318327fad71da34492d82c532f42a58cb4baff81a3Richard Smith void VisitIgnoredValue(const Expr *E) { 183247a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue Scratch; 18338327fad71da34492d82c532f42a58cb4baff81a3Richard Smith if (!Evaluate(Scratch, Info, E)) 18348327fad71da34492d82c532f42a58cb4baff81a3Richard Smith Info.EvalStatus.HasSideEffects = true; 18358327fad71da34492d82c532f42a58cb4baff81a3Richard Smith } 18368cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne}; 18378cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 18388cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne} 18398cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 18408cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne//===----------------------------------------------------------------------===// 1841e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith// Common base class for lvalue and temporary evaluation. 1842e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith//===----------------------------------------------------------------------===// 1843e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithnamespace { 1844e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithtemplate<class Derived> 1845e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithclass LValueExprEvaluatorBase 1846e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith : public ExprEvaluatorBase<Derived, bool> { 1847e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithprotected: 1848e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LValue &Result; 1849e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith typedef LValueExprEvaluatorBase LValueExprEvaluatorBaseTy; 1850e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith typedef ExprEvaluatorBase<Derived, bool> ExprEvaluatorBaseTy; 1851e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1852e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool Success(APValue::LValueBase B) { 1853e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Result.set(B); 1854e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 1855e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 1856e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1857e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithpublic: 1858e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LValueExprEvaluatorBase(EvalInfo &Info, LValue &Result) : 1859e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith ExprEvaluatorBaseTy(Info), Result(Result) {} 1860e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1861e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool Success(const CCValue &V, const Expr *E) { 1862e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Result.setFrom(V); 1863e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 1864e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 1865e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1866e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool CheckValidLValue() { 1867e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // C++11 [basic.lval]p1: An lvalue designates a function or an object. Hence 1868e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // there are no null references, nor once-past-the-end references. 1869e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // FIXME: Check for one-past-the-end array indices 1870e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return Result.Base && !Result.Designator.Invalid && 1871e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith !Result.Designator.OnePastTheEnd; 1872e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 1873e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1874e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool VisitMemberExpr(const MemberExpr *E) { 1875e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Handle non-static data members. 1876e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith QualType BaseTy; 1877e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (E->isArrow()) { 1878e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!EvaluatePointer(E->getBase(), Result, this->Info)) 1879e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 1880e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith BaseTy = E->getBase()->getType()->getAs<PointerType>()->getPointeeType(); 1881e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } else { 1882e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!this->Visit(E->getBase())) 1883e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 1884e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith BaseTy = E->getBase()->getType(); 1885e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 1886e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // FIXME: In C++11, require the result to be a valid lvalue. 1887e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1888e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const FieldDecl *FD = dyn_cast<FieldDecl>(E->getMemberDecl()); 1889e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // FIXME: Handle IndirectFieldDecls 1890f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!FD) return this->Error(E); 1891e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith assert(BaseTy->getAs<RecordType>()->getDecl()->getCanonicalDecl() == 1892e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith FD->getParent()->getCanonicalDecl() && "record / field mismatch"); 1893e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith (void)BaseTy; 1894e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1895e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith HandleLValueMember(this->Info, Result, FD); 1896e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1897e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (FD->getType()->isReferenceType()) { 1898e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith CCValue RefValue; 1899f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!HandleLValueToRValueConversion(this->Info, E, FD->getType(), Result, 1900e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith RefValue)) 1901e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 1902e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return Success(RefValue, E); 1903e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 1904e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 1905e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 1906e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1907e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool VisitBinaryOperator(const BinaryOperator *E) { 1908e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith switch (E->getOpcode()) { 1909e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith default: 1910e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return ExprEvaluatorBaseTy::VisitBinaryOperator(E); 1911e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1912e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case BO_PtrMemD: 1913e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case BO_PtrMemI: 1914e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return HandleMemberPointerAccess(this->Info, E, Result); 1915e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 1916e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 1917e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1918e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool VisitCastExpr(const CastExpr *E) { 1919e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith switch (E->getCastKind()) { 1920e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith default: 1921e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return ExprEvaluatorBaseTy::VisitCastExpr(E); 1922e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1923e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case CK_DerivedToBase: 1924e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case CK_UncheckedDerivedToBase: { 1925e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!this->Visit(E->getSubExpr())) 1926e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 1927e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!CheckValidLValue()) 1928e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 1929e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1930e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Now figure out the necessary offset to add to the base LV to get from 1931e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // the derived class to the base class. 1932e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith QualType Type = E->getSubExpr()->getType(); 1933e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1934e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith for (CastExpr::path_const_iterator PathI = E->path_begin(), 1935e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith PathE = E->path_end(); PathI != PathE; ++PathI) { 1936e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!HandleLValueBase(this->Info, Result, Type->getAsCXXRecordDecl(), 1937e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith *PathI)) 1938e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 1939e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Type = (*PathI)->getType(); 1940e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 1941e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1942e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 1943e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 1944e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 1945e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 1946e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith}; 1947e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 1948e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 1949e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith//===----------------------------------------------------------------------===// 19504efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// LValue Evaluation 1951c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// 1952c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// This is used for evaluating lvalues (in C and C++), xvalues (in C++11), 1953c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// function designators (in C), decl references to void objects (in C), and 1954c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// temporaries (if building with -Wno-address-of-temporary). 1955c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// 1956c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// LValue evaluation produces values comprising a base expression of one of the 1957c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// following types: 19581bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith// - Declarations 19591bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith// * VarDecl 19601bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith// * FunctionDecl 19611bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith// - Literals 1962c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// * CompoundLiteralExpr in C 1963c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// * StringLiteral 1964c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// * PredefinedExpr 1965180f47959a066795cc0f409433023af448bb0328Richard Smith// * ObjCStringLiteralExpr 1966c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// * ObjCEncodeExpr 1967c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// * AddrLabelExpr 1968c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// * BlockExpr 1969c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// * CallExpr for a MakeStringConstant builtin 19701bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith// - Locals and temporaries 19711bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith// * Any Expr, with a Frame indicating the function in which the temporary was 19721bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith// evaluated. 19731bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith// plus an offset in bytes. 19744efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 19754efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmannamespace { 1976770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass LValueExprEvaluator 1977e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith : public LValueExprEvaluatorBase<LValueExprEvaluator> { 19784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanpublic: 1979e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LValueExprEvaluator(EvalInfo &Info, LValue &Result) : 1980e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LValueExprEvaluatorBaseTy(Info, Result) {} 19811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1982c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith bool VisitVarDecl(const Expr *E, const VarDecl *VD); 1983c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 19848cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitDeclRefExpr(const DeclRefExpr *E); 19858cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitPredefinedExpr(const PredefinedExpr *E) { return Success(E); } 1986bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith bool VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *E); 19878cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCompoundLiteralExpr(const CompoundLiteralExpr *E); 19888cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitMemberExpr(const MemberExpr *E); 19898cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitStringLiteral(const StringLiteral *E) { return Success(E); } 19908cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitObjCEncodeExpr(const ObjCEncodeExpr *E) { return Success(E); } 19918cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitArraySubscriptExpr(const ArraySubscriptExpr *E); 19928cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitUnaryDeref(const UnaryOperator *E); 19938cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 19948cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCastExpr(const CastExpr *E) { 199526bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson switch (E->getCastKind()) { 199626bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson default: 1997e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return LValueExprEvaluatorBaseTy::VisitCastExpr(E); 199826bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson 1999db924224b51b153f24fbe492102d4edebcbbb7f4Eli Friedman case CK_LValueBitCast: 2000c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith this->CCEDiag(E, diag::note_constexpr_invalid_cast) << 2; 20010a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (!Visit(E->getSubExpr())) 20020a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return false; 20030a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Result.Designator.setInvalid(); 20040a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return true; 2005db924224b51b153f24fbe492102d4edebcbbb7f4Eli Friedman 2006e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case CK_BaseToDerived: 2007180f47959a066795cc0f409433023af448bb0328Richard Smith if (!Visit(E->getSubExpr())) 2008180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 2009e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!CheckValidLValue()) 2010e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 2011e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return HandleBaseToDerivedCast(Info, E, Result); 201226bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson } 201326bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson } 2014cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl 2015ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman // FIXME: Missing: __real__, __imag__ 20168cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 20174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}; 20184efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} // end anonymous namespace 20194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2020c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// Evaluate an expression as an lvalue. This can be legitimately called on 2021c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// expressions which are not glvalues, in a few cases: 2022c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// * function designators in C, 2023c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// * "extern void" objects, 2024c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// * temporaries, if building with -Wno-address-of-temporary. 2025efdb83e26f9a1fd2566afe54461216cd84814d42John McCallstatic bool EvaluateLValue(const Expr* E, LValue& Result, EvalInfo &Info) { 2026c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith assert((E->isGLValue() || E->getType()->isFunctionType() || 2027c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith E->getType()->isVoidType() || isa<CXXTemporaryObjectExpr>(E)) && 2028c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith "can't evaluate expression as an lvalue"); 20298cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return LValueExprEvaluator(Info, Result).Visit(E); 20304efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 20314efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 20328cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool LValueExprEvaluator::VisitDeclRefExpr(const DeclRefExpr *E) { 20331bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(E->getDecl())) 20341bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith return Success(FD); 20351bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith if (const VarDecl *VD = dyn_cast<VarDecl>(E->getDecl())) 2036c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return VisitVarDecl(E, VD); 2037c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return Error(E); 2038c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith} 2039436c8898cd1c93c5bacd3fcc4ac586bc5cd77062Richard Smith 2040c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smithbool LValueExprEvaluator::VisitVarDecl(const Expr *E, const VarDecl *VD) { 2041177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith if (!VD->getType()->isReferenceType()) { 2042177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith if (isa<ParmVarDecl>(VD)) { 20431bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith Result.set(VD, Info.CurrentCall); 2044177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith return true; 2045177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith } 20461bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith return Success(VD); 2047177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith } 204850c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman 204947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue V; 2050f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!EvaluateVarDeclInit(Info, E, VD, Info.CurrentCall, V)) 2051f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 2052f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Success(V, E); 205335873c49adad211ff466e34342a52665742794f5Anders Carlsson} 205435873c49adad211ff466e34342a52665742794f5Anders Carlsson 2055bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smithbool LValueExprEvaluator::VisitMaterializeTemporaryExpr( 2056bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith const MaterializeTemporaryExpr *E) { 2057e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (E->GetTemporaryExpr()->isRValue()) { 2058e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (E->getType()->isRecordType() && E->getType()->isLiteralType()) 2059e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return EvaluateTemporary(E->GetTemporaryExpr(), Result, Info); 2060e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2061e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Result.set(E, Info.CurrentCall); 2062e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return EvaluateConstantExpression(Info.CurrentCall->Temporaries[E], Info, 2063e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Result, E->GetTemporaryExpr()); 2064e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2065e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2066e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Materialization of an lvalue temporary occurs when we need to force a copy 2067e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // (for instance, if it's a bitfield). 2068e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // FIXME: The AST should contain an lvalue-to-rvalue node for such cases. 2069e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!Visit(E->GetTemporaryExpr())) 2070e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 2071f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!HandleLValueToRValueConversion(Info, E, E->getType(), Result, 2072e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Info.CurrentCall->Temporaries[E])) 2073e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 20741bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith Result.set(E, Info.CurrentCall); 2075e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 2076bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith} 2077bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 20788cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool 20798cad3046be06ea73ff8892d947697a21d7a440d3Peter CollingbourneLValueExprEvaluator::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) { 2080c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith assert(!Info.getLangOpts().CPlusPlus && "lvalue compound literal in c++?"); 2081c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // Defer visiting the literal until the lvalue-to-rvalue conversion. We can 2082c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // only see this when folding in C, so there's no standard to follow here. 2083efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return Success(E); 20844efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 20854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 20868cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool LValueExprEvaluator::VisitMemberExpr(const MemberExpr *E) { 2087c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // Handle static data members. 2088c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (const VarDecl *VD = dyn_cast<VarDecl>(E->getMemberDecl())) { 2089c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith VisitIgnoredValue(E->getBase()); 2090c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return VisitVarDecl(E, VD); 2091c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith } 2092c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 2093d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith // Handle static member functions. 2094d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(E->getMemberDecl())) { 2095d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith if (MD->isStatic()) { 2096d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith VisitIgnoredValue(E->getBase()); 20971bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith return Success(MD); 2098d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith } 2099d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith } 2100d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 2101180f47959a066795cc0f409433023af448bb0328Richard Smith // Handle non-static data members. 2102e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return LValueExprEvaluatorBaseTy::VisitMemberExpr(E); 21034efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 21044efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 21058cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool LValueExprEvaluator::VisitArraySubscriptExpr(const ArraySubscriptExpr *E) { 2106c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // FIXME: Deal with vectors as array subscript bases. 2107c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (E->getBase()->getType()->isVectorType()) 2108f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 2109c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 21103068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getBase(), Result, Info)) 2111efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return false; 21121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21133068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APSInt Index; 21143068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluateInteger(E->getIdx(), Index, Info)) 2115efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return false; 2116180f47959a066795cc0f409433023af448bb0328Richard Smith int64_t IndexValue 2117180f47959a066795cc0f409433023af448bb0328Richard Smith = Index.isSigned() ? Index.getSExtValue() 2118180f47959a066795cc0f409433023af448bb0328Richard Smith : static_cast<int64_t>(Index.getZExtValue()); 21193068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 2120e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // FIXME: In C++11, require the result to be a valid lvalue. 2121180f47959a066795cc0f409433023af448bb0328Richard Smith return HandleLValueArrayAdjustment(Info, Result, E->getType(), IndexValue); 21223068d117951a8df54bae9db039b56201ab10962bAnders Carlsson} 21234efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 21248cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool LValueExprEvaluator::VisitUnaryDeref(const UnaryOperator *E) { 2125e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // FIXME: In C++11, require the result to be a valid lvalue. 2126efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return EvaluatePointer(E->getSubExpr(), Result, Info); 2127e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman} 2128e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman 21294efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 2130f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Pointer Evaluation 2131f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 2132f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 2133c754aa62643e66ab967ca32ae8b0b3fc419bba25Anders Carlssonnamespace { 2134770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass PointerExprEvaluator 21358cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : public ExprEvaluatorBase<PointerExprEvaluator, bool> { 2136efdb83e26f9a1fd2566afe54461216cd84814d42John McCall LValue &Result; 2137efdb83e26f9a1fd2566afe54461216cd84814d42John McCall 21388cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool Success(const Expr *E) { 21391bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith Result.set(E); 2140efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return true; 2141efdb83e26f9a1fd2566afe54461216cd84814d42John McCall } 21422bad1687fe6f00e10767a691a33b070b151902b6Anders Carlssonpublic: 21431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2144efdb83e26f9a1fd2566afe54461216cd84814d42John McCall PointerExprEvaluator(EvalInfo &info, LValue &Result) 21458cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : ExprEvaluatorBaseTy(info), Result(Result) {} 2146f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 214747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith bool Success(const CCValue &V, const Expr *E) { 21488cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne Result.setFrom(V); 21498cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return true; 21502bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson } 2151f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith bool ValueInitialization(const Expr *E) { 2152f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith return Success((Expr*)0); 2153f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith } 21542bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 2155efdb83e26f9a1fd2566afe54461216cd84814d42John McCall bool VisitBinaryOperator(const BinaryOperator *E); 21568cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCastExpr(const CastExpr* E); 2157efdb83e26f9a1fd2566afe54461216cd84814d42John McCall bool VisitUnaryAddrOf(const UnaryOperator *E); 21588cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitObjCStringLiteral(const ObjCStringLiteral *E) 2159efdb83e26f9a1fd2566afe54461216cd84814d42John McCall { return Success(E); } 21608cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitAddrLabelExpr(const AddrLabelExpr *E) 2161efdb83e26f9a1fd2566afe54461216cd84814d42John McCall { return Success(E); } 21628cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCallExpr(const CallExpr *E); 21638cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitBlockExpr(const BlockExpr *E) { 2164469a1eb996e1cb0be54f9b210f836afbddcbb2ccJohn McCall if (!E->getBlockDecl()->hasCaptures()) 2165efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return Success(E); 2166f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 2167b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump } 2168180f47959a066795cc0f409433023af448bb0328Richard Smith bool VisitCXXThisExpr(const CXXThisExpr *E) { 2169180f47959a066795cc0f409433023af448bb0328Richard Smith if (!Info.CurrentCall->This) 2170f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 2171180f47959a066795cc0f409433023af448bb0328Richard Smith Result = *Info.CurrentCall->This; 2172180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 2173180f47959a066795cc0f409433023af448bb0328Richard Smith } 217456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 2175ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman // FIXME: Missing: @protocol, @selector 21762bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson}; 2177f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace 21782bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 2179efdb83e26f9a1fd2566afe54461216cd84814d42John McCallstatic bool EvaluatePointer(const Expr* E, LValue& Result, EvalInfo &Info) { 2180c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith assert(E->isRValue() && E->getType()->hasPointerRepresentation()); 21818cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return PointerExprEvaluator(Info, Result).Visit(E); 2182f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} 2183650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 2184efdb83e26f9a1fd2566afe54461216cd84814d42John McCallbool PointerExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 21852de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (E->getOpcode() != BO_Add && 21862de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall E->getOpcode() != BO_Sub) 2187e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return ExprEvaluatorBaseTy::VisitBinaryOperator(E); 21881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2189650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson const Expr *PExp = E->getLHS(); 2190650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson const Expr *IExp = E->getRHS(); 2191650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (IExp->getType()->isPointerType()) 2192f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner std::swap(PExp, IExp); 21931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2194efdb83e26f9a1fd2566afe54461216cd84814d42John McCall if (!EvaluatePointer(PExp, Result, Info)) 2195efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return false; 21961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2197efdb83e26f9a1fd2566afe54461216cd84814d42John McCall llvm::APSInt Offset; 2198efdb83e26f9a1fd2566afe54461216cd84814d42John McCall if (!EvaluateInteger(IExp, Offset, Info)) 2199efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return false; 2200efdb83e26f9a1fd2566afe54461216cd84814d42John McCall int64_t AdditionalOffset 2201efdb83e26f9a1fd2566afe54461216cd84814d42John McCall = Offset.isSigned() ? Offset.getSExtValue() 2202efdb83e26f9a1fd2566afe54461216cd84814d42John McCall : static_cast<int64_t>(Offset.getZExtValue()); 22030a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (E->getOpcode() == BO_Sub) 22040a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith AdditionalOffset = -AdditionalOffset; 2205650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 2206180f47959a066795cc0f409433023af448bb0328Richard Smith QualType Pointee = PExp->getType()->getAs<PointerType>()->getPointeeType(); 2207e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // FIXME: In C++11, require the result to be a valid lvalue. 2208180f47959a066795cc0f409433023af448bb0328Richard Smith return HandleLValueArrayAdjustment(Info, Result, Pointee, AdditionalOffset); 2209650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson} 22104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2211efdb83e26f9a1fd2566afe54461216cd84814d42John McCallbool PointerExprEvaluator::VisitUnaryAddrOf(const UnaryOperator *E) { 2212efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return EvaluateLValue(E->getSubExpr(), Result, Info); 22134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 22141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22158cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool PointerExprEvaluator::VisitCastExpr(const CastExpr* E) { 22168cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne const Expr* SubExpr = E->getSubExpr(); 2217650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 221809a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman switch (E->getCastKind()) { 221909a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman default: 222009a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman break; 222109a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman 22222de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_BitCast: 22231d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall case CK_CPointerToObjCPointerCast: 22241d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall case CK_BlockPointerToObjCPointerCast: 22252de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_AnyPointerToBlockPointerCast: 2226c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith // Bitcasts to cv void* are static_casts, not reinterpret_casts, so are 2227c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith // permitted in constant expressions in C++11. Bitcasts from cv void* are 2228c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith // also static_casts, but we disallow them as a resolution to DR1312. 22294cd9b8f7fb2cebf614e6e2bc766fad27ffd2e9deRichard Smith if (!E->getType()->isVoidPointerType()) { 22304cd9b8f7fb2cebf614e6e2bc766fad27ffd2e9deRichard Smith if (SubExpr->getType()->isVoidPointerType()) 22314cd9b8f7fb2cebf614e6e2bc766fad27ffd2e9deRichard Smith CCEDiag(E, diag::note_constexpr_invalid_cast) 22324cd9b8f7fb2cebf614e6e2bc766fad27ffd2e9deRichard Smith << 3 << SubExpr->getType(); 22334cd9b8f7fb2cebf614e6e2bc766fad27ffd2e9deRichard Smith else 22344cd9b8f7fb2cebf614e6e2bc766fad27ffd2e9deRichard Smith CCEDiag(E, diag::note_constexpr_invalid_cast) << 2; 22354cd9b8f7fb2cebf614e6e2bc766fad27ffd2e9deRichard Smith } 22360a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (!Visit(SubExpr)) 22370a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return false; 22380a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Result.Designator.setInvalid(); 22390a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return true; 224009a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman 22415c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson case CK_DerivedToBase: 22425c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson case CK_UncheckedDerivedToBase: { 224347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith if (!EvaluatePointer(E->getSubExpr(), Result, Info)) 22445c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson return false; 2245e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!Result.Base && Result.Offset.isZero()) 2246e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 22475c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson 2248180f47959a066795cc0f409433023af448bb0328Richard Smith // Now figure out the necessary offset to add to the base LV to get from 22495c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson // the derived class to the base class. 2250180f47959a066795cc0f409433023af448bb0328Richard Smith QualType Type = 2251180f47959a066795cc0f409433023af448bb0328Richard Smith E->getSubExpr()->getType()->castAs<PointerType>()->getPointeeType(); 22525c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson 2253180f47959a066795cc0f409433023af448bb0328Richard Smith for (CastExpr::path_const_iterator PathI = E->path_begin(), 22545c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson PathE = E->path_end(); PathI != PathE; ++PathI) { 2255180f47959a066795cc0f409433023af448bb0328Richard Smith if (!HandleLValueBase(Info, Result, Type->getAsCXXRecordDecl(), *PathI)) 22565c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson return false; 2257180f47959a066795cc0f409433023af448bb0328Richard Smith Type = (*PathI)->getType(); 22585c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson } 22595c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson 22605c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson return true; 22615c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson } 22625c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson 2263e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case CK_BaseToDerived: 2264e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!Visit(E->getSubExpr())) 2265e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 2266e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!Result.Base && Result.Offset.isZero()) 2267e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 2268e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return HandleBaseToDerivedCast(Info, E, Result); 2269e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 227047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith case CK_NullToPointer: 227147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith return ValueInitialization(E); 2272404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall 22732de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_IntegralToPointer: { 2274c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith CCEDiag(E, diag::note_constexpr_invalid_cast) << 2; 2275c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith 227647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue Value; 2277efdb83e26f9a1fd2566afe54461216cd84814d42John McCall if (!EvaluateIntegerOrLValue(SubExpr, Value, Info)) 227809a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman break; 227969ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar 2280efdb83e26f9a1fd2566afe54461216cd84814d42John McCall if (Value.isInt()) { 228147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith unsigned Size = Info.Ctx.getTypeSize(E->getType()); 228247a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith uint64_t N = Value.getInt().extOrTrunc(Size).getZExtValue(); 22831bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith Result.Base = (Expr*)0; 228447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Result.Offset = CharUnits::fromQuantity(N); 2285177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith Result.Frame = 0; 22860a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Result.Designator.setInvalid(); 2287efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return true; 2288efdb83e26f9a1fd2566afe54461216cd84814d42John McCall } else { 2289efdb83e26f9a1fd2566afe54461216cd84814d42John McCall // Cast is of an lvalue, no need to change value. 229047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Result.setFrom(Value); 2291efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return true; 2292650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson } 2293650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson } 22942de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_ArrayToPointerDecay: 2295e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (SubExpr->isGLValue()) { 2296e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!EvaluateLValue(SubExpr, Result, Info)) 2297e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 2298e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } else { 2299e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Result.set(SubExpr, Info.CurrentCall); 2300e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!EvaluateConstantExpression(Info.CurrentCall->Temporaries[SubExpr], 2301e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Info, Result, SubExpr)) 2302e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 2303e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 23040a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith // The result is a pointer to the first element of the array. 23050a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Result.Designator.addIndex(0); 23060a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return true; 23076a7c94af983717e2c2d6aebe42cb4737c1c7b9e6Richard Smith 23082de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_FunctionToPointerDecay: 23096a7c94af983717e2c2d6aebe42cb4737c1c7b9e6Richard Smith return EvaluateLValue(SubExpr, Result, Info); 23104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 23114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2312c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return ExprEvaluatorBaseTy::VisitCastExpr(E); 23131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 2314650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 23158cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool PointerExprEvaluator::VisitCallExpr(const CallExpr *E) { 2316180f47959a066795cc0f409433023af448bb0328Richard Smith if (IsStringLiteralCall(E)) 2317efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return Success(E); 231856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 23198cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return ExprEvaluatorBaseTy::VisitCallExpr(E); 23204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 2321f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 2322f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 2323e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith// Member Pointer Evaluation 2324e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith//===----------------------------------------------------------------------===// 2325e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2326e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithnamespace { 2327e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithclass MemberPointerExprEvaluator 2328e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith : public ExprEvaluatorBase<MemberPointerExprEvaluator, bool> { 2329e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MemberPtr &Result; 2330e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2331e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool Success(const ValueDecl *D) { 2332e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Result = MemberPtr(D); 2333e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 2334e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2335e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithpublic: 2336e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2337e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MemberPointerExprEvaluator(EvalInfo &Info, MemberPtr &Result) 2338e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith : ExprEvaluatorBaseTy(Info), Result(Result) {} 2339e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2340e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool Success(const CCValue &V, const Expr *E) { 2341e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Result.setFrom(V); 2342e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 2343e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2344e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool ValueInitialization(const Expr *E) { 2345e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return Success((const ValueDecl*)0); 2346e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2347e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2348e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool VisitCastExpr(const CastExpr *E); 2349e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool VisitUnaryAddrOf(const UnaryOperator *E); 2350e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith}; 2351e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} // end anonymous namespace 2352e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2353e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstatic bool EvaluateMemberPointer(const Expr *E, MemberPtr &Result, 2354e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith EvalInfo &Info) { 2355e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith assert(E->isRValue() && E->getType()->isMemberPointerType()); 2356e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return MemberPointerExprEvaluator(Info, Result).Visit(E); 2357e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 2358e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2359e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithbool MemberPointerExprEvaluator::VisitCastExpr(const CastExpr *E) { 2360e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith switch (E->getCastKind()) { 2361e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith default: 2362e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return ExprEvaluatorBaseTy::VisitCastExpr(E); 2363e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2364e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case CK_NullToMemberPointer: 2365e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return ValueInitialization(E); 2366e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2367e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case CK_BaseToDerivedMemberPointer: { 2368e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!Visit(E->getSubExpr())) 2369e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 2370e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (E->path_empty()) 2371e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 2372e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // Base-to-derived member pointer casts store the path in derived-to-base 2373e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // order, so iterate backwards. The CXXBaseSpecifier also provides us with 2374e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // the wrong end of the derived->base arc, so stagger the path by one class. 2375e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith typedef std::reverse_iterator<CastExpr::path_const_iterator> ReverseIter; 2376e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith for (ReverseIter PathI(E->path_end() - 1), PathE(E->path_begin()); 2377e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith PathI != PathE; ++PathI) { 2378e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith assert(!(*PathI)->isVirtual() && "memptr cast through vbase"); 2379e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *Derived = (*PathI)->getType()->getAsCXXRecordDecl(); 2380e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!Result.castToDerived(Derived)) 2381f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 2382e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2383e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const Type *FinalTy = E->getType()->castAs<MemberPointerType>()->getClass(); 2384e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!Result.castToDerived(FinalTy->getAsCXXRecordDecl())) 2385f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 2386e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 2387e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2388e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2389e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case CK_DerivedToBaseMemberPointer: 2390e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!Visit(E->getSubExpr())) 2391e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 2392e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith for (CastExpr::path_const_iterator PathI = E->path_begin(), 2393e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith PathE = E->path_end(); PathI != PathE; ++PathI) { 2394e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith assert(!(*PathI)->isVirtual() && "memptr cast through vbase"); 2395e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXRecordDecl *Base = (*PathI)->getType()->getAsCXXRecordDecl(); 2396e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!Result.castToBase(Base)) 2397f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 2398e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2399e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 2400e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2401e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 2402e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2403e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithbool MemberPointerExprEvaluator::VisitUnaryAddrOf(const UnaryOperator *E) { 2404e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // C++11 [expr.unary.op]p3 has very strict rules on how the address of a 2405e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // member can be formed. 2406e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return Success(cast<DeclRefExpr>(E->getSubExpr())->getDecl()); 2407e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 2408e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2409e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith//===----------------------------------------------------------------------===// 2410180f47959a066795cc0f409433023af448bb0328Richard Smith// Record Evaluation 2411180f47959a066795cc0f409433023af448bb0328Richard Smith//===----------------------------------------------------------------------===// 2412180f47959a066795cc0f409433023af448bb0328Richard Smith 2413180f47959a066795cc0f409433023af448bb0328Richard Smithnamespace { 2414180f47959a066795cc0f409433023af448bb0328Richard Smith class RecordExprEvaluator 2415180f47959a066795cc0f409433023af448bb0328Richard Smith : public ExprEvaluatorBase<RecordExprEvaluator, bool> { 2416180f47959a066795cc0f409433023af448bb0328Richard Smith const LValue &This; 2417180f47959a066795cc0f409433023af448bb0328Richard Smith APValue &Result; 2418180f47959a066795cc0f409433023af448bb0328Richard Smith public: 2419180f47959a066795cc0f409433023af448bb0328Richard Smith 2420180f47959a066795cc0f409433023af448bb0328Richard Smith RecordExprEvaluator(EvalInfo &info, const LValue &This, APValue &Result) 2421180f47959a066795cc0f409433023af448bb0328Richard Smith : ExprEvaluatorBaseTy(info), This(This), Result(Result) {} 2422180f47959a066795cc0f409433023af448bb0328Richard Smith 2423180f47959a066795cc0f409433023af448bb0328Richard Smith bool Success(const CCValue &V, const Expr *E) { 2424f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return CheckConstantExpression(Info, E, V, Result); 2425180f47959a066795cc0f409433023af448bb0328Richard Smith } 2426180f47959a066795cc0f409433023af448bb0328Richard Smith 242759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith bool VisitCastExpr(const CastExpr *E); 2428180f47959a066795cc0f409433023af448bb0328Richard Smith bool VisitInitListExpr(const InitListExpr *E); 2429180f47959a066795cc0f409433023af448bb0328Richard Smith bool VisitCXXConstructExpr(const CXXConstructExpr *E); 2430180f47959a066795cc0f409433023af448bb0328Richard Smith }; 2431180f47959a066795cc0f409433023af448bb0328Richard Smith} 2432180f47959a066795cc0f409433023af448bb0328Richard Smith 243359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smithbool RecordExprEvaluator::VisitCastExpr(const CastExpr *E) { 243459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith switch (E->getCastKind()) { 243559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith default: 243659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return ExprEvaluatorBaseTy::VisitCastExpr(E); 243759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 243859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith case CK_ConstructorConversion: 243959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return Visit(E->getSubExpr()); 244059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 244159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith case CK_DerivedToBase: 244259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith case CK_UncheckedDerivedToBase: { 244359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith CCValue DerivedObject; 2444f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!Evaluate(DerivedObject, Info, E->getSubExpr())) 244559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return false; 2446f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!DerivedObject.isStruct()) 2447f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E->getSubExpr()); 244859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 244959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith // Derived-to-base rvalue conversion: just slice off the derived part. 245059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith APValue *Value = &DerivedObject; 245159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith const CXXRecordDecl *RD = E->getSubExpr()->getType()->getAsCXXRecordDecl(); 245259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith for (CastExpr::path_const_iterator PathI = E->path_begin(), 245359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith PathE = E->path_end(); PathI != PathE; ++PathI) { 245459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith assert(!(*PathI)->isVirtual() && "record rvalue with virtual base"); 245559efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith const CXXRecordDecl *Base = (*PathI)->getType()->getAsCXXRecordDecl(); 245659efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith Value = &Value->getStructBase(getBaseIndex(RD, Base)); 245759efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith RD = Base; 245859efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } 245959efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith Result = *Value; 246059efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith return true; 246159efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } 246259efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith } 246359efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith} 246459efe266b804330f4c1f3a1b0ff783e67dd90378Richard Smith 2465180f47959a066795cc0f409433023af448bb0328Richard Smithbool RecordExprEvaluator::VisitInitListExpr(const InitListExpr *E) { 2466180f47959a066795cc0f409433023af448bb0328Richard Smith const RecordDecl *RD = E->getType()->castAs<RecordType>()->getDecl(); 2467180f47959a066795cc0f409433023af448bb0328Richard Smith const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); 2468180f47959a066795cc0f409433023af448bb0328Richard Smith 2469180f47959a066795cc0f409433023af448bb0328Richard Smith if (RD->isUnion()) { 2470180f47959a066795cc0f409433023af448bb0328Richard Smith Result = APValue(E->getInitializedFieldInUnion()); 2471180f47959a066795cc0f409433023af448bb0328Richard Smith if (!E->getNumInits()) 2472180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 2473180f47959a066795cc0f409433023af448bb0328Richard Smith LValue Subobject = This; 2474180f47959a066795cc0f409433023af448bb0328Richard Smith HandleLValueMember(Info, Subobject, E->getInitializedFieldInUnion(), 2475180f47959a066795cc0f409433023af448bb0328Richard Smith &Layout); 2476180f47959a066795cc0f409433023af448bb0328Richard Smith return EvaluateConstantExpression(Result.getUnionValue(), Info, 2477180f47959a066795cc0f409433023af448bb0328Richard Smith Subobject, E->getInit(0)); 2478180f47959a066795cc0f409433023af448bb0328Richard Smith } 2479180f47959a066795cc0f409433023af448bb0328Richard Smith 2480180f47959a066795cc0f409433023af448bb0328Richard Smith assert((!isa<CXXRecordDecl>(RD) || !cast<CXXRecordDecl>(RD)->getNumBases()) && 2481180f47959a066795cc0f409433023af448bb0328Richard Smith "initializer list for class with base classes"); 2482180f47959a066795cc0f409433023af448bb0328Richard Smith Result = APValue(APValue::UninitStruct(), 0, 2483180f47959a066795cc0f409433023af448bb0328Richard Smith std::distance(RD->field_begin(), RD->field_end())); 2484180f47959a066795cc0f409433023af448bb0328Richard Smith unsigned ElementNo = 0; 2485180f47959a066795cc0f409433023af448bb0328Richard Smith for (RecordDecl::field_iterator Field = RD->field_begin(), 2486180f47959a066795cc0f409433023af448bb0328Richard Smith FieldEnd = RD->field_end(); Field != FieldEnd; ++Field) { 2487180f47959a066795cc0f409433023af448bb0328Richard Smith // Anonymous bit-fields are not considered members of the class for 2488180f47959a066795cc0f409433023af448bb0328Richard Smith // purposes of aggregate initialization. 2489180f47959a066795cc0f409433023af448bb0328Richard Smith if (Field->isUnnamedBitfield()) 2490180f47959a066795cc0f409433023af448bb0328Richard Smith continue; 2491180f47959a066795cc0f409433023af448bb0328Richard Smith 2492180f47959a066795cc0f409433023af448bb0328Richard Smith LValue Subobject = This; 2493180f47959a066795cc0f409433023af448bb0328Richard Smith HandleLValueMember(Info, Subobject, *Field, &Layout); 2494180f47959a066795cc0f409433023af448bb0328Richard Smith 2495180f47959a066795cc0f409433023af448bb0328Richard Smith if (ElementNo < E->getNumInits()) { 2496180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateConstantExpression( 2497180f47959a066795cc0f409433023af448bb0328Richard Smith Result.getStructField((*Field)->getFieldIndex()), 2498180f47959a066795cc0f409433023af448bb0328Richard Smith Info, Subobject, E->getInit(ElementNo++))) 2499180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 2500180f47959a066795cc0f409433023af448bb0328Richard Smith } else { 2501180f47959a066795cc0f409433023af448bb0328Richard Smith // Perform an implicit value-initialization for members beyond the end of 2502180f47959a066795cc0f409433023af448bb0328Richard Smith // the initializer list. 2503180f47959a066795cc0f409433023af448bb0328Richard Smith ImplicitValueInitExpr VIE(Field->getType()); 2504180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateConstantExpression( 2505180f47959a066795cc0f409433023af448bb0328Richard Smith Result.getStructField((*Field)->getFieldIndex()), 2506180f47959a066795cc0f409433023af448bb0328Richard Smith Info, Subobject, &VIE)) 2507180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 2508180f47959a066795cc0f409433023af448bb0328Richard Smith } 2509180f47959a066795cc0f409433023af448bb0328Richard Smith } 2510180f47959a066795cc0f409433023af448bb0328Richard Smith 2511180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 2512180f47959a066795cc0f409433023af448bb0328Richard Smith} 2513180f47959a066795cc0f409433023af448bb0328Richard Smith 2514180f47959a066795cc0f409433023af448bb0328Richard Smithbool RecordExprEvaluator::VisitCXXConstructExpr(const CXXConstructExpr *E) { 2515180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXConstructorDecl *FD = E->getConstructor(); 2516180f47959a066795cc0f409433023af448bb0328Richard Smith const FunctionDecl *Definition = 0; 2517180f47959a066795cc0f409433023af448bb0328Richard Smith FD->getBody(Definition); 2518180f47959a066795cc0f409433023af448bb0328Richard Smith 2519180f47959a066795cc0f409433023af448bb0328Richard Smith if (!Definition || !Definition->isConstexpr() || Definition->isInvalidDecl()) 2520f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 2521180f47959a066795cc0f409433023af448bb0328Richard Smith 2522180f47959a066795cc0f409433023af448bb0328Richard Smith // FIXME: Elide the copy/move construction wherever we can. 2523180f47959a066795cc0f409433023af448bb0328Richard Smith if (E->isElidable()) 2524180f47959a066795cc0f409433023af448bb0328Richard Smith if (const MaterializeTemporaryExpr *ME 2525180f47959a066795cc0f409433023af448bb0328Richard Smith = dyn_cast<MaterializeTemporaryExpr>(E->getArg(0))) 2526180f47959a066795cc0f409433023af448bb0328Richard Smith return Visit(ME->GetTemporaryExpr()); 2527180f47959a066795cc0f409433023af448bb0328Richard Smith 2528180f47959a066795cc0f409433023af448bb0328Richard Smith llvm::ArrayRef<const Expr*> Args(E->getArgs(), E->getNumArgs()); 2529f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return HandleConstructorCall(E, This, Args, 2530f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith cast<CXXConstructorDecl>(Definition), Info, 2531f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith Result); 2532180f47959a066795cc0f409433023af448bb0328Richard Smith} 2533180f47959a066795cc0f409433023af448bb0328Richard Smith 2534180f47959a066795cc0f409433023af448bb0328Richard Smithstatic bool EvaluateRecord(const Expr *E, const LValue &This, 2535180f47959a066795cc0f409433023af448bb0328Richard Smith APValue &Result, EvalInfo &Info) { 2536180f47959a066795cc0f409433023af448bb0328Richard Smith assert(E->isRValue() && E->getType()->isRecordType() && 2537180f47959a066795cc0f409433023af448bb0328Richard Smith E->getType()->isLiteralType() && 2538180f47959a066795cc0f409433023af448bb0328Richard Smith "can't evaluate expression as a record rvalue"); 2539180f47959a066795cc0f409433023af448bb0328Richard Smith return RecordExprEvaluator(Info, This, Result).Visit(E); 2540180f47959a066795cc0f409433023af448bb0328Richard Smith} 2541180f47959a066795cc0f409433023af448bb0328Richard Smith 2542180f47959a066795cc0f409433023af448bb0328Richard Smith//===----------------------------------------------------------------------===// 2543e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith// Temporary Evaluation 2544e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith// 2545e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith// Temporaries are represented in the AST as rvalues, but generally behave like 2546e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith// lvalues. The full-object of which the temporary is a subobject is implicitly 2547e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith// materialized so that a reference can bind to it. 2548e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith//===----------------------------------------------------------------------===// 2549e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithnamespace { 2550e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithclass TemporaryExprEvaluator 2551e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith : public LValueExprEvaluatorBase<TemporaryExprEvaluator> { 2552e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithpublic: 2553e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith TemporaryExprEvaluator(EvalInfo &Info, LValue &Result) : 2554e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LValueExprEvaluatorBaseTy(Info, Result) {} 2555e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2556e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith /// Visit an expression which constructs the value of this temporary. 2557e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool VisitConstructExpr(const Expr *E) { 2558e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Result.set(E, Info.CurrentCall); 2559e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return EvaluateConstantExpression(Info.CurrentCall->Temporaries[E], Info, 2560e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Result, E); 2561e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2562e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2563e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool VisitCastExpr(const CastExpr *E) { 2564e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith switch (E->getCastKind()) { 2565e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith default: 2566e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return LValueExprEvaluatorBaseTy::VisitCastExpr(E); 2567e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2568e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case CK_ConstructorConversion: 2569e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return VisitConstructExpr(E->getSubExpr()); 2570e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2571e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2572e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool VisitInitListExpr(const InitListExpr *E) { 2573e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return VisitConstructExpr(E); 2574e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2575e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool VisitCXXConstructExpr(const CXXConstructExpr *E) { 2576e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return VisitConstructExpr(E); 2577e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2578e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool VisitCallExpr(const CallExpr *E) { 2579e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return VisitConstructExpr(E); 2580e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 2581e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith}; 2582e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} // end anonymous namespace 2583e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2584e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith/// Evaluate an expression of record type as a temporary. 2585e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstatic bool EvaluateTemporary(const Expr *E, LValue &Result, EvalInfo &Info) { 2586e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith assert(E->isRValue() && E->getType()->isRecordType() && 2587e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith E->getType()->isLiteralType()); 2588e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return TemporaryExprEvaluator(Info, Result).Visit(E); 2589e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 2590e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2591e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith//===----------------------------------------------------------------------===// 259259b5da6d853b4368b984700315adf7b37de05764Nate Begeman// Vector Evaluation 259359b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===// 259459b5da6d853b4368b984700315adf7b37de05764Nate Begeman 259559b5da6d853b4368b984700315adf7b37de05764Nate Begemannamespace { 2596770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramer class VectorExprEvaluator 259707fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith : public ExprEvaluatorBase<VectorExprEvaluator, bool> { 259807fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith APValue &Result; 259959b5da6d853b4368b984700315adf7b37de05764Nate Begeman public: 26001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 260107fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith VectorExprEvaluator(EvalInfo &info, APValue &Result) 260207fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith : ExprEvaluatorBaseTy(info), Result(Result) {} 26031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 260407fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith bool Success(const ArrayRef<APValue> &V, const Expr *E) { 260507fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith assert(V.size() == E->getType()->castAs<VectorType>()->getNumElements()); 260607fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith // FIXME: remove this APValue copy. 260707fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith Result = APValue(V.data(), V.size()); 260807fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return true; 260907fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith } 261069c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith bool Success(const CCValue &V, const Expr *E) { 261169c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith assert(V.isVector()); 261207fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith Result = V; 261307fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return true; 261407fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith } 261507fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith bool ValueInitialization(const Expr *E); 26161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 261707fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith bool VisitUnaryReal(const UnaryOperator *E) 261891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman { return Visit(E->getSubExpr()); } 261907fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith bool VisitCastExpr(const CastExpr* E); 262007fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith bool VisitInitListExpr(const InitListExpr *E); 262107fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith bool VisitUnaryImag(const UnaryOperator *E); 262291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // FIXME: Missing: unary -, unary ~, binary add/sub/mul/div, 26232217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman // binary comparisons, binary and/or/xor, 262491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // shufflevector, ExtVectorElementExpr 262591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // (Note that these require implementing conversions 262691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // between vector types.) 262759b5da6d853b4368b984700315adf7b37de05764Nate Begeman }; 262859b5da6d853b4368b984700315adf7b37de05764Nate Begeman} // end anonymous namespace 262959b5da6d853b4368b984700315adf7b37de05764Nate Begeman 263059b5da6d853b4368b984700315adf7b37de05764Nate Begemanstatic bool EvaluateVector(const Expr* E, APValue& Result, EvalInfo &Info) { 2631c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith assert(E->isRValue() && E->getType()->isVectorType() &&"not a vector rvalue"); 263207fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return VectorExprEvaluator(Info, Result).Visit(E); 263359b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 263459b5da6d853b4368b984700315adf7b37de05764Nate Begeman 263507fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smithbool VectorExprEvaluator::VisitCastExpr(const CastExpr* E) { 263607fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith const VectorType *VTy = E->getType()->castAs<VectorType>(); 2637c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman unsigned NElts = VTy->getNumElements(); 26381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2639d62ca370b03b8c6ad58002d3399383baf744e32bRichard Smith const Expr *SE = E->getSubExpr(); 2640e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman QualType SETy = SE->getType(); 264159b5da6d853b4368b984700315adf7b37de05764Nate Begeman 264246a523285928aa07bf14803178dc04616ac85994Eli Friedman switch (E->getCastKind()) { 264346a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_VectorSplat: { 264407fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith APValue Val = APValue(); 264546a523285928aa07bf14803178dc04616ac85994Eli Friedman if (SETy->isIntegerType()) { 264646a523285928aa07bf14803178dc04616ac85994Eli Friedman APSInt IntResult; 264746a523285928aa07bf14803178dc04616ac85994Eli Friedman if (!EvaluateInteger(SE, IntResult, Info)) 2648f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 264907fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith Val = APValue(IntResult); 265046a523285928aa07bf14803178dc04616ac85994Eli Friedman } else if (SETy->isRealFloatingType()) { 265146a523285928aa07bf14803178dc04616ac85994Eli Friedman APFloat F(0.0); 265246a523285928aa07bf14803178dc04616ac85994Eli Friedman if (!EvaluateFloat(SE, F, Info)) 2653f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 265407fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith Val = APValue(F); 265546a523285928aa07bf14803178dc04616ac85994Eli Friedman } else { 265607fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return Error(E); 265746a523285928aa07bf14803178dc04616ac85994Eli Friedman } 2658c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman 2659c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman // Splat and create vector APValue. 266007fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith SmallVector<APValue, 4> Elts(NElts, Val); 266107fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return Success(Elts, E); 2662e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman } 266346a523285928aa07bf14803178dc04616ac85994Eli Friedman default: 2664c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return ExprEvaluatorBaseTy::VisitCastExpr(E); 2665c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman } 266659b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 266759b5da6d853b4368b984700315adf7b37de05764Nate Begeman 266807fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smithbool 266959b5da6d853b4368b984700315adf7b37de05764Nate BegemanVectorExprEvaluator::VisitInitListExpr(const InitListExpr *E) { 267007fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith const VectorType *VT = E->getType()->castAs<VectorType>(); 267159b5da6d853b4368b984700315adf7b37de05764Nate Begeman unsigned NumInits = E->getNumInits(); 267291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman unsigned NumElements = VT->getNumElements(); 26731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 267459b5da6d853b4368b984700315adf7b37de05764Nate Begeman QualType EltTy = VT->getElementType(); 26755f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<APValue, 4> Elements; 267659b5da6d853b4368b984700315adf7b37de05764Nate Begeman 2677a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall // If a vector is initialized with a single element, that value 2678a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall // becomes every element of the vector, not just the first. 2679a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall // This is the behavior described in the IBM AltiVec documentation. 2680a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall if (NumInits == 1) { 268107fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith 268207fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith // Handle the case where the vector is initialized by another 2683b92ae0e31126e5630d7022f2d6abe7eed2e17746Tanya Lattner // vector (OpenCL 6.1.6). 2684b92ae0e31126e5630d7022f2d6abe7eed2e17746Tanya Lattner if (E->getInit(0)->getType()->isVectorType()) 268507fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return Visit(E->getInit(0)); 268607fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith 2687a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall APValue InitValue; 268859b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (EltTy->isIntegerType()) { 268959b5da6d853b4368b984700315adf7b37de05764Nate Begeman llvm::APSInt sInt(32); 2690a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall if (!EvaluateInteger(E->getInit(0), sInt, Info)) 2691f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 2692a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall InitValue = APValue(sInt); 269359b5da6d853b4368b984700315adf7b37de05764Nate Begeman } else { 269459b5da6d853b4368b984700315adf7b37de05764Nate Begeman llvm::APFloat f(0.0); 2695a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall if (!EvaluateFloat(E->getInit(0), f, Info)) 2696f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 2697a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall InitValue = APValue(f); 2698a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall } 2699a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall for (unsigned i = 0; i < NumElements; i++) { 2700a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall Elements.push_back(InitValue); 2701a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall } 2702a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall } else { 2703a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall for (unsigned i = 0; i < NumElements; i++) { 2704a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall if (EltTy->isIntegerType()) { 2705a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall llvm::APSInt sInt(32); 2706a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall if (i < NumInits) { 2707a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall if (!EvaluateInteger(E->getInit(i), sInt, Info)) 2708f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 2709a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall } else { 2710a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall sInt = Info.Ctx.MakeIntValue(0, EltTy); 2711a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall } 2712a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall Elements.push_back(APValue(sInt)); 271391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman } else { 2714a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall llvm::APFloat f(0.0); 2715a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall if (i < NumInits) { 2716a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall if (!EvaluateFloat(E->getInit(i), f, Info)) 2717f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 2718a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall } else { 2719a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall f = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy)); 2720a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall } 2721a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall Elements.push_back(APValue(f)); 272291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman } 272359b5da6d853b4368b984700315adf7b37de05764Nate Begeman } 272459b5da6d853b4368b984700315adf7b37de05764Nate Begeman } 272507fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return Success(Elements, E); 272659b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 272759b5da6d853b4368b984700315adf7b37de05764Nate Begeman 272807fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smithbool 272907fc657e3077531805b0e2dbf8f8964d48daa38bRichard SmithVectorExprEvaluator::ValueInitialization(const Expr *E) { 273007fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith const VectorType *VT = E->getType()->getAs<VectorType>(); 273191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman QualType EltTy = VT->getElementType(); 273291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue ZeroElement; 273391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (EltTy->isIntegerType()) 273491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman ZeroElement = APValue(Info.Ctx.MakeIntValue(0, EltTy)); 273591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman else 273691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman ZeroElement = 273791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue(APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy))); 273891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 27395f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<APValue, 4> Elements(VT->getNumElements(), ZeroElement); 274007fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return Success(Elements, E); 274191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman} 274291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 274307fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smithbool VectorExprEvaluator::VisitUnaryImag(const UnaryOperator *E) { 27448327fad71da34492d82c532f42a58cb4baff81a3Richard Smith VisitIgnoredValue(E->getSubExpr()); 274507fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return ValueInitialization(E); 274691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman} 274791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 274859b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===// 2749cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith// Array Evaluation 2750cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith//===----------------------------------------------------------------------===// 2751cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 2752cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smithnamespace { 2753cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith class ArrayExprEvaluator 2754cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith : public ExprEvaluatorBase<ArrayExprEvaluator, bool> { 2755180f47959a066795cc0f409433023af448bb0328Richard Smith const LValue &This; 2756cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith APValue &Result; 2757cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith public: 2758cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 2759180f47959a066795cc0f409433023af448bb0328Richard Smith ArrayExprEvaluator(EvalInfo &Info, const LValue &This, APValue &Result) 2760180f47959a066795cc0f409433023af448bb0328Richard Smith : ExprEvaluatorBaseTy(Info), This(This), Result(Result) {} 2761cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 2762cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith bool Success(const APValue &V, const Expr *E) { 2763cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith assert(V.isArray() && "Expected array type"); 2764cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith Result = V; 2765cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return true; 2766cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith } 2767cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 2768180f47959a066795cc0f409433023af448bb0328Richard Smith bool ValueInitialization(const Expr *E) { 2769180f47959a066795cc0f409433023af448bb0328Richard Smith const ConstantArrayType *CAT = 2770180f47959a066795cc0f409433023af448bb0328Richard Smith Info.Ctx.getAsConstantArrayType(E->getType()); 2771180f47959a066795cc0f409433023af448bb0328Richard Smith if (!CAT) 2772f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 2773180f47959a066795cc0f409433023af448bb0328Richard Smith 2774180f47959a066795cc0f409433023af448bb0328Richard Smith Result = APValue(APValue::UninitArray(), 0, 2775180f47959a066795cc0f409433023af448bb0328Richard Smith CAT->getSize().getZExtValue()); 2776180f47959a066795cc0f409433023af448bb0328Richard Smith if (!Result.hasArrayFiller()) return true; 2777180f47959a066795cc0f409433023af448bb0328Richard Smith 2778180f47959a066795cc0f409433023af448bb0328Richard Smith // Value-initialize all elements. 2779180f47959a066795cc0f409433023af448bb0328Richard Smith LValue Subobject = This; 2780180f47959a066795cc0f409433023af448bb0328Richard Smith Subobject.Designator.addIndex(0); 2781180f47959a066795cc0f409433023af448bb0328Richard Smith ImplicitValueInitExpr VIE(CAT->getElementType()); 2782180f47959a066795cc0f409433023af448bb0328Richard Smith return EvaluateConstantExpression(Result.getArrayFiller(), Info, 2783180f47959a066795cc0f409433023af448bb0328Richard Smith Subobject, &VIE); 2784180f47959a066795cc0f409433023af448bb0328Richard Smith } 2785180f47959a066795cc0f409433023af448bb0328Richard Smith 2786cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith bool VisitInitListExpr(const InitListExpr *E); 2787e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool VisitCXXConstructExpr(const CXXConstructExpr *E); 2788cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith }; 2789cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith} // end anonymous namespace 2790cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 2791180f47959a066795cc0f409433023af448bb0328Richard Smithstatic bool EvaluateArray(const Expr *E, const LValue &This, 2792180f47959a066795cc0f409433023af448bb0328Richard Smith APValue &Result, EvalInfo &Info) { 2793cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith assert(E->isRValue() && E->getType()->isArrayType() && 2794cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith E->getType()->isLiteralType() && "not a literal array rvalue"); 2795180f47959a066795cc0f409433023af448bb0328Richard Smith return ArrayExprEvaluator(Info, This, Result).Visit(E); 2796cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith} 2797cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 2798cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smithbool ArrayExprEvaluator::VisitInitListExpr(const InitListExpr *E) { 2799cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType(E->getType()); 2800cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith if (!CAT) 2801f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 2802cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 2803cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith Result = APValue(APValue::UninitArray(), E->getNumInits(), 2804cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith CAT->getSize().getZExtValue()); 2805180f47959a066795cc0f409433023af448bb0328Richard Smith LValue Subobject = This; 2806180f47959a066795cc0f409433023af448bb0328Richard Smith Subobject.Designator.addIndex(0); 2807180f47959a066795cc0f409433023af448bb0328Richard Smith unsigned Index = 0; 2808cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith for (InitListExpr::const_iterator I = E->begin(), End = E->end(); 2809180f47959a066795cc0f409433023af448bb0328Richard Smith I != End; ++I, ++Index) { 2810180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateConstantExpression(Result.getArrayInitializedElt(Index), 2811180f47959a066795cc0f409433023af448bb0328Richard Smith Info, Subobject, cast<Expr>(*I))) 2812180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 2813180f47959a066795cc0f409433023af448bb0328Richard Smith if (!HandleLValueArrayAdjustment(Info, Subobject, CAT->getElementType(), 1)) 2814cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return false; 2815180f47959a066795cc0f409433023af448bb0328Richard Smith } 2816cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 2817cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith if (!Result.hasArrayFiller()) return true; 2818cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith assert(E->hasArrayFiller() && "no array filler for incomplete init list"); 2819180f47959a066795cc0f409433023af448bb0328Richard Smith // FIXME: The Subobject here isn't necessarily right. This rarely matters, 2820180f47959a066795cc0f409433023af448bb0328Richard Smith // but sometimes does: 2821180f47959a066795cc0f409433023af448bb0328Richard Smith // struct S { constexpr S() : p(&p) {} void *p; }; 2822180f47959a066795cc0f409433023af448bb0328Richard Smith // S s[10] = {}; 2823cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return EvaluateConstantExpression(Result.getArrayFiller(), Info, 2824180f47959a066795cc0f409433023af448bb0328Richard Smith Subobject, E->getArrayFiller()); 2825cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith} 2826cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 2827e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithbool ArrayExprEvaluator::VisitCXXConstructExpr(const CXXConstructExpr *E) { 2828e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType(E->getType()); 2829e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!CAT) 2830f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 2831e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2832e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Result = APValue(APValue::UninitArray(), 0, CAT->getSize().getZExtValue()); 2833e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!Result.hasArrayFiller()) 2834e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 2835e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2836e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const CXXConstructorDecl *FD = E->getConstructor(); 2837e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const FunctionDecl *Definition = 0; 2838e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith FD->getBody(Definition); 2839e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2840e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!Definition || !Definition->isConstexpr() || Definition->isInvalidDecl()) 2841f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 2842e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2843e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // FIXME: The Subobject here isn't necessarily right. This rarely matters, 2844e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // but sometimes does: 2845e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // struct S { constexpr S() : p(&p) {} void *p; }; 2846e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // S s[10]; 2847e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LValue Subobject = This; 2848e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Subobject.Designator.addIndex(0); 2849e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith llvm::ArrayRef<const Expr*> Args(E->getArgs(), E->getNumArgs()); 2850f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return HandleConstructorCall(E, Subobject, Args, 2851e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith cast<CXXConstructorDecl>(Definition), 2852e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Info, Result.getArrayFiller()); 2853e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 2854e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 2855cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith//===----------------------------------------------------------------------===// 2856f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Integer Evaluation 2857c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// 2858c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// As a GNU extension, we support casting pointers to sufficiently-wide integer 2859c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// types and back in constant folding. Integer values are thus represented 2860c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// either as an integer-valued APValue, or as an lvalue-valued APValue. 2861f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 2862f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 2863f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnernamespace { 2864770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass IntExprEvaluator 28658cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : public ExprEvaluatorBase<IntExprEvaluator, bool> { 286647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue &Result; 2867f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerpublic: 286847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith IntExprEvaluator(EvalInfo &info, CCValue &result) 28698cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : ExprEvaluatorBaseTy(info), Result(result) {} 2870f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 2871973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara bool Success(const llvm::APSInt &SI, const Expr *E) { 2872973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara assert(E->getType()->isIntegralOrEnumerationType() && 28732ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor "Invalid evaluation result."); 2874973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara assert(SI.isSigned() == E->getType()->isSignedIntegerOrEnumerationType() && 28753f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar "Invalid evaluation result."); 2876973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara assert(SI.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) && 28773f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar "Invalid evaluation result."); 287847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Result = CCValue(SI); 28793f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return true; 28803f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar } 28813f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar 2882131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar bool Success(const llvm::APInt &I, const Expr *E) { 28832ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor assert(E->getType()->isIntegralOrEnumerationType() && 28842ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor "Invalid evaluation result."); 288530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar assert(I.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) && 28863f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar "Invalid evaluation result."); 288747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Result = CCValue(APSInt(I)); 2888575a1c9dc8dc5b4977194993e289f9eda7295c39Douglas Gregor Result.getInt().setIsUnsigned( 2889575a1c9dc8dc5b4977194993e289f9eda7295c39Douglas Gregor E->getType()->isUnsignedIntegerOrEnumerationType()); 2890131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return true; 2891131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 2892131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar 2893131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar bool Success(uint64_t Value, const Expr *E) { 28942ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor assert(E->getType()->isIntegralOrEnumerationType() && 28952ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor "Invalid evaluation result."); 289647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Result = CCValue(Info.Ctx.MakeIntValue(Value, E->getType())); 2897131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return true; 2898131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 2899131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar 29004f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck bool Success(CharUnits Size, const Expr *E) { 29014f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck return Success(Size.getQuantity(), E); 29024f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck } 29034f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck 290447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith bool Success(const CCValue &V, const Expr *E) { 2905342f1f8b0a402c5a7f8c5055db7f60a7808f1687Richard Smith if (V.isLValue()) { 2906342f1f8b0a402c5a7f8c5055db7f60a7808f1687Richard Smith Result = V; 2907342f1f8b0a402c5a7f8c5055db7f60a7808f1687Richard Smith return true; 2908342f1f8b0a402c5a7f8c5055db7f60a7808f1687Richard Smith } 29098cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return Success(V.getInt(), E); 291032fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner } 29111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2912f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith bool ValueInitialization(const Expr *E) { return Success(0, E); } 2913f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith 29148cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne //===--------------------------------------------------------------------===// 29158cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne // Visitor Methods 29168cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne //===--------------------------------------------------------------------===// 2917f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 29184c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitIntegerLiteral(const IntegerLiteral *E) { 2919131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(E->getValue(), E); 29204c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 29214c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitCharacterLiteral(const CharacterLiteral *E) { 2922131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(E->getValue(), E); 29234c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 2924043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman 2925043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman bool CheckReferencedDecl(const Expr *E, const Decl *D); 2926043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman bool VisitDeclRefExpr(const DeclRefExpr *E) { 29278cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne if (CheckReferencedDecl(E, E->getDecl())) 29288cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return true; 29298cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 29308cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return ExprEvaluatorBaseTy::VisitDeclRefExpr(E); 2931043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman } 2932043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman bool VisitMemberExpr(const MemberExpr *E) { 2933043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman if (CheckReferencedDecl(E, E->getMemberDecl())) { 2934c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith VisitIgnoredValue(E->getBase()); 2935043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman return true; 2936043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman } 29378cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 29388cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return ExprEvaluatorBaseTy::VisitMemberExpr(E); 2939043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman } 2940043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman 29418cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCallExpr(const CallExpr *E); 2942b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner bool VisitBinaryOperator(const BinaryOperator *E); 29438ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor bool VisitOffsetOfExpr(const OffsetOfExpr *E); 2944b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner bool VisitUnaryOperator(const UnaryOperator *E); 2945f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 29468cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCastExpr(const CastExpr* E); 2947f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne bool VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *E); 29480518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl 29493068d117951a8df54bae9db039b56201ab10962bAnders Carlsson bool VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) { 2950131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(E->getValue(), E); 29513068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 29521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2953f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith // Note, GNU defines __null as an integer, not a pointer. 29543f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson bool VisitGNUNullExpr(const GNUNullExpr *E) { 2955f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith return ValueInitialization(E); 2956664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman } 2957664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman 295864b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl bool VisitUnaryTypeTraitExpr(const UnaryTypeTraitExpr *E) { 29590dfd848fa4c9664852ba8c929a8bd3fce93ddca2Sebastian Redl return Success(E->getValue(), E); 296064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl } 296164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl 29626ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet bool VisitBinaryTypeTraitExpr(const BinaryTypeTraitExpr *E) { 29636ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet return Success(E->getValue(), E); 29646ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet } 29656ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet 296621ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley bool VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *E) { 296721ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley return Success(E->getValue(), E); 296821ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley } 296921ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 2970552622067dc45013d240f73952fece703f5e63bdJohn Wiegley bool VisitExpressionTraitExpr(const ExpressionTraitExpr *E) { 2971552622067dc45013d240f73952fece703f5e63bdJohn Wiegley return Success(E->getValue(), E); 2972552622067dc45013d240f73952fece703f5e63bdJohn Wiegley } 2973552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 2974722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman bool VisitUnaryReal(const UnaryOperator *E); 2975664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman bool VisitUnaryImag(const UnaryOperator *E); 2976664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman 2977295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl bool VisitCXXNoexceptExpr(const CXXNoexceptExpr *E); 2978ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor bool VisitSizeOfPackExpr(const SizeOfPackExpr *E); 2979cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl 2980fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattnerprivate: 29818b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck CharUnits GetAlignOfExpr(const Expr *E); 29828b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck CharUnits GetAlignOfType(QualType T); 29831bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith static QualType GetObjectType(APValue::LValueBase B); 29848cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool TryEvaluateBuiltinObjectSize(const CallExpr *E); 2985664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman // FIXME: Missing: array subscript of vector, member of vector 2986f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner}; 2987f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace 2988f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 2989c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// EvaluateIntegerOrLValue - Evaluate an rvalue integral-typed expression, and 2990c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// produce either the integer value or a pointer. 2991c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// 2992c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// GCC has a heinous extension which folds casts between pointer types and 2993c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// pointer-sized integral types. We support this by allowing the evaluation of 2994c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// an integer rvalue to produce a pointer (represented as an lvalue) instead. 2995c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// Some simple arithmetic on such values is supported (they are treated much 2996c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// like char*). 2997f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithstatic bool EvaluateIntegerOrLValue(const Expr *E, CCValue &Result, 299847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith EvalInfo &Info) { 2999c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith assert(E->isRValue() && E->getType()->isIntegralOrEnumerationType()); 30008cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return IntExprEvaluator(Info, Result).Visit(E); 300169ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar} 300269ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar 3003f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithstatic bool EvaluateInteger(const Expr *E, APSInt &Result, EvalInfo &Info) { 300447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue Val; 3005f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!EvaluateIntegerOrLValue(E, Val, Info)) 3006f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 3007f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!Val.isInt()) { 3008f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // FIXME: It would be better to produce the diagnostic for casting 3009f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // a pointer to an integer. 3010dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(E->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 301130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return false; 3012f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 301330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result = Val.getInt(); 301430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return true; 3015f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} 3016f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 3017f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith/// Check whether the given declaration can be directly converted to an integral 3018f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith/// rvalue. If not, no diagnostic is produced; there are other things we can 3019f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith/// try. 3020043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedmanbool IntExprEvaluator::CheckReferencedDecl(const Expr* E, const Decl* D) { 30214c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // Enums are integer constant exprs. 3022bfbdcd861a4364bfc21a9e5047bdbd56812d6693Abramo Bagnara if (const EnumConstantDecl *ECD = dyn_cast<EnumConstantDecl>(D)) { 3023973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara // Check for signedness/width mismatches between E type and ECD value. 3024973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara bool SameSign = (ECD->getInitVal().isSigned() 3025973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara == E->getType()->isSignedIntegerOrEnumerationType()); 3026973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara bool SameWidth = (ECD->getInitVal().getBitWidth() 3027973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara == Info.Ctx.getIntWidth(E->getType())); 3028973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara if (SameSign && SameWidth) 3029973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara return Success(ECD->getInitVal(), E); 3030973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara else { 3031973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara // Get rid of mismatch (otherwise Success assertions will fail) 3032973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara // by computing a new value matching the type of E. 3033973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara llvm::APSInt Val = ECD->getInitVal(); 3034973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara if (!SameSign) 3035973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara Val.setIsSigned(!ECD->getInitVal().isSigned()); 3036973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara if (!SameWidth) 3037973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara Val = Val.extOrTrunc(Info.Ctx.getIntWidth(E->getType())); 3038973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara return Success(Val, E); 3039973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara } 3040bfbdcd861a4364bfc21a9e5047bdbd56812d6693Abramo Bagnara } 30418cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return false; 30424c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner} 30434c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner 3044a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way 3045a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// as GCC. 3046a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattnerstatic int EvaluateBuiltinClassifyType(const CallExpr *E) { 3047a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // The following enum mimics the values returned by GCC. 30487c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // FIXME: Does GCC differ between lvalue and rvalue references here? 3049a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner enum gcc_type_class { 3050a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner no_type_class = -1, 3051a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner void_type_class, integer_type_class, char_type_class, 3052a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner enumeral_type_class, boolean_type_class, 3053a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner pointer_type_class, reference_type_class, offset_type_class, 3054a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner real_type_class, complex_type_class, 3055a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner function_type_class, method_type_class, 3056a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner record_type_class, union_type_class, 3057a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner array_type_class, string_type_class, 3058a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner lang_type_class 3059a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner }; 30601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 30611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If no argument was supplied, default to "no_type_class". This isn't 3062a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // ideal, however it is what gcc does. 3063a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner if (E->getNumArgs() == 0) 3064a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return no_type_class; 30651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3066a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner QualType ArgTy = E->getArg(0)->getType(); 3067a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner if (ArgTy->isVoidType()) 3068a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return void_type_class; 3069a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isEnumeralType()) 3070a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return enumeral_type_class; 3071a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isBooleanType()) 3072a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return boolean_type_class; 3073a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isCharType()) 3074a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return string_type_class; // gcc doesn't appear to use char_type_class 3075a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isIntegerType()) 3076a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return integer_type_class; 3077a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isPointerType()) 3078a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return pointer_type_class; 3079a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isReferenceType()) 3080a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return reference_type_class; 3081a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isRealType()) 3082a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return real_type_class; 3083a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isComplexType()) 3084a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return complex_type_class; 3085a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isFunctionType()) 3086a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return function_type_class; 3087fb87b89fc9eb103e19fb8e4b925c23f0bd091b99Douglas Gregor else if (ArgTy->isStructureOrClassType()) 3088a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return record_type_class; 3089a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isUnionType()) 3090a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return union_type_class; 3091a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isArrayType()) 3092a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return array_type_class; 3093a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isUnionType()) 3094a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return union_type_class; 3095a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else // FIXME: offset_type_class, method_type_class, & lang_type_class? 3096b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("CallExpr::isBuiltinClassifyType(): unimplemented type"); 3097a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return -1; 3098a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner} 3099a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 310042c8f87eb60958170c46767273bf93e6c96125bfJohn McCall/// Retrieves the "underlying object type" of the given expression, 310142c8f87eb60958170c46767273bf93e6c96125bfJohn McCall/// as used by __builtin_object_size. 31021bf9a9e6a5bdc0de7939908855dcddf46b661800Richard SmithQualType IntExprEvaluator::GetObjectType(APValue::LValueBase B) { 31031bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith if (const ValueDecl *D = B.dyn_cast<const ValueDecl*>()) { 31041bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith if (const VarDecl *VD = dyn_cast<VarDecl>(D)) 310542c8f87eb60958170c46767273bf93e6c96125bfJohn McCall return VD->getType(); 31061bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith } else if (const Expr *E = B.get<const Expr*>()) { 31071bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith if (isa<CompoundLiteralExpr>(E)) 31081bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith return E->getType(); 310942c8f87eb60958170c46767273bf93e6c96125bfJohn McCall } 311042c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 311142c8f87eb60958170c46767273bf93e6c96125bfJohn McCall return QualType(); 311242c8f87eb60958170c46767273bf93e6c96125bfJohn McCall} 311342c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 31148cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool IntExprEvaluator::TryEvaluateBuiltinObjectSize(const CallExpr *E) { 311542c8f87eb60958170c46767273bf93e6c96125bfJohn McCall // TODO: Perhaps we should let LLVM lower this? 311642c8f87eb60958170c46767273bf93e6c96125bfJohn McCall LValue Base; 311742c8f87eb60958170c46767273bf93e6c96125bfJohn McCall if (!EvaluatePointer(E->getArg(0), Base, Info)) 311842c8f87eb60958170c46767273bf93e6c96125bfJohn McCall return false; 311942c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 312042c8f87eb60958170c46767273bf93e6c96125bfJohn McCall // If we can prove the base is null, lower to zero now. 31211bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith if (!Base.getLValueBase()) return Success(0, E); 312242c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 31231bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith QualType T = GetObjectType(Base.getLValueBase()); 312442c8f87eb60958170c46767273bf93e6c96125bfJohn McCall if (T.isNull() || 312542c8f87eb60958170c46767273bf93e6c96125bfJohn McCall T->isIncompleteType() || 31261357869bc5983cdfbc986db1f3d18265bb34cb0eEli Friedman T->isFunctionType() || 312742c8f87eb60958170c46767273bf93e6c96125bfJohn McCall T->isVariablyModifiedType() || 312842c8f87eb60958170c46767273bf93e6c96125bfJohn McCall T->isDependentType()) 3129f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 313042c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 313142c8f87eb60958170c46767273bf93e6c96125bfJohn McCall CharUnits Size = Info.Ctx.getTypeSizeInChars(T); 313242c8f87eb60958170c46767273bf93e6c96125bfJohn McCall CharUnits Offset = Base.getLValueOffset(); 313342c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 313442c8f87eb60958170c46767273bf93e6c96125bfJohn McCall if (!Offset.isNegative() && Offset <= Size) 313542c8f87eb60958170c46767273bf93e6c96125bfJohn McCall Size -= Offset; 313642c8f87eb60958170c46767273bf93e6c96125bfJohn McCall else 313742c8f87eb60958170c46767273bf93e6c96125bfJohn McCall Size = CharUnits::Zero(); 31384f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck return Success(Size, E); 313942c8f87eb60958170c46767273bf93e6c96125bfJohn McCall} 314042c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 31418cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool IntExprEvaluator::VisitCallExpr(const CallExpr *E) { 3142180f47959a066795cc0f409433023af448bb0328Richard Smith switch (E->isBuiltinCall()) { 3143019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner default: 31448cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return ExprEvaluatorBaseTy::VisitCallExpr(E); 314564eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump 314664eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump case Builtin::BI__builtin_object_size: { 314742c8f87eb60958170c46767273bf93e6c96125bfJohn McCall if (TryEvaluateBuiltinObjectSize(E)) 314842c8f87eb60958170c46767273bf93e6c96125bfJohn McCall return true; 314964eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump 3150b2aaf51ed73a4774322a39a0dd59d0fe7e3258c0Eric Christopher // If evaluating the argument has side-effects we can't determine 3151b2aaf51ed73a4774322a39a0dd59d0fe7e3258c0Eric Christopher // the size of the object and lower it to unknown now. 3152393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian if (E->getArg(0)->HasSideEffects(Info.Ctx)) { 3153a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith if (E->getArg(1)->EvaluateKnownConstInt(Info.Ctx).getZExtValue() <= 1) 3154cf184655319cf7a5b811067cff9d26a5741fd161Chris Lattner return Success(-1ULL, E); 315564eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump return Success(0, E); 315664eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump } 3157c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 3158f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 315964eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump } 316064eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump 3161019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_classify_type: 3162131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(EvaluateBuiltinClassifyType(E), E); 31631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3164e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith case Builtin::BI__builtin_constant_p: { 3165e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith const Expr *Arg = E->getArg(0); 3166e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith QualType ArgType = Arg->getType(); 3167e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith // __builtin_constant_p always has one operand. The rules which gcc follows 3168e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith // are not precisely documented, but are as follows: 3169e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith // 3170e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith // - If the operand is of integral, floating, complex or enumeration type, 3171e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith // and can be folded to a known value of that type, it returns 1. 3172e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith // - If the operand and can be folded to a pointer to the first character 3173e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith // of a string literal (or such a pointer cast to an integral type), it 3174e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith // returns 1. 3175e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith // 3176e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith // Otherwise, it returns 0. 3177e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith // 3178e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith // FIXME: GCC also intends to return 1 for literals of aggregate types, but 3179e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith // its support for this does not currently work. 3180e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith int IsConstant = 0; 3181e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith if (ArgType->isIntegralOrEnumerationType()) { 3182e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith // Note, a pointer cast to an integral type is only a constant if it is 3183e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith // a pointer to the first character of a string literal. 3184e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith Expr::EvalResult Result; 3185e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith if (Arg->EvaluateAsRValue(Result, Info.Ctx) && !Result.HasSideEffects) { 3186e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith APValue &V = Result.Val; 3187e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith if (V.getKind() == APValue::LValue) { 3188e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith if (const Expr *E = V.getLValueBase().dyn_cast<const Expr*>()) 3189e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith IsConstant = isa<StringLiteral>(E) && V.getLValueOffset().isZero(); 3190e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith } else { 3191e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith IsConstant = 1; 3192e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith } 3193e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith } 3194e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith } else if (ArgType->isFloatingType() || ArgType->isAnyComplexType()) { 3195e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith IsConstant = Arg->isEvaluatable(Info.Ctx); 3196e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith } else if (ArgType->isPointerType() || Arg->isGLValue()) { 3197e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith LValue LV; 3198e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith // Use a separate EvalInfo: ignore constexpr parameter and 'this' bindings 3199e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith // during the check. 3200e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith Expr::EvalStatus Status; 3201e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith EvalInfo SubInfo(Info.Ctx, Status); 3202e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith if ((Arg->isGLValue() ? EvaluateLValue(Arg, LV, SubInfo) 3203e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith : EvaluatePointer(Arg, LV, SubInfo)) && 3204e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith !Status.HasSideEffects) 3205e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith if (const Expr *E = LV.getLValueBase().dyn_cast<const Expr*>()) 3206e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith IsConstant = isa<StringLiteral>(E) && LV.getLValueOffset().isZero(); 3207e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith } 3208e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith 3209e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith return Success(IsConstant, E); 3210e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith } 321121fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner case Builtin::BI__builtin_eh_return_data_regno: { 3212a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith int Operand = E->getArg(0)->EvaluateKnownConstInt(Info.Ctx).getZExtValue(); 3213bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Operand = Info.Ctx.getTargetInfo().getEHDataRegisterNumber(Operand); 321421fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner return Success(Operand, E); 321521fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner } 3216c4a2638b5ef3e2d35d872614ceb655a7a22c58beEli Friedman 3217c4a2638b5ef3e2d35d872614ceb655a7a22c58beEli Friedman case Builtin::BI__builtin_expect: 3218c4a2638b5ef3e2d35d872614ceb655a7a22c58beEli Friedman return Visit(E->getArg(0)); 32195726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor 32205726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor case Builtin::BIstrlen: 32215726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor case Builtin::BI__builtin_strlen: 32225726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor // As an extension, we support strlen() and __builtin_strlen() as constant 32235726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor // expressions when the argument is a string literal. 32248cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne if (const StringLiteral *S 32255726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor = dyn_cast<StringLiteral>(E->getArg(0)->IgnoreParenImpCasts())) { 32265726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor // The string literal may have embedded null characters. Find the first 32275726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor // one and truncate there. 32285f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Str = S->getString(); 32295f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef::size_type Pos = Str.find(0); 32305f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner if (Pos != StringRef::npos) 32315726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor Str = Str.substr(0, Pos); 32325726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor 32335726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor return Success(Str.size(), E); 32345726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor } 32355726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor 3236f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 3237454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman 3238454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman case Builtin::BI__atomic_is_lock_free: { 3239454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman APSInt SizeVal; 3240454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman if (!EvaluateInteger(E->getArg(0), SizeVal, Info)) 3241454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman return false; 3242454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman 3243454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // For __atomic_is_lock_free(sizeof(_Atomic(T))), if the size is a power 3244454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // of two less than the maximum inline atomic width, we know it is 3245454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // lock-free. If the size isn't a power of two, or greater than the 3246454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // maximum alignment where we promote atomics, we know it is not lock-free 3247454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // (at least not in the sense of atomic_is_lock_free). Otherwise, 3248454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // the answer can only be determined at runtime; for example, 16-byte 3249454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // atomics have lock-free implementations on some, but not all, 3250454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // x86-64 processors. 3251454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman 3252454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // Check power-of-two. 3253454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman CharUnits Size = CharUnits::fromQuantity(SizeVal.getZExtValue()); 3254454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman if (!Size.isPowerOfTwo()) 3255454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman#if 0 3256454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // FIXME: Suppress this folding until the ABI for the promotion width 3257454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // settles. 3258454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman return Success(0, E); 3259454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman#else 3260f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 3261454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman#endif 3262454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman 3263454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman#if 0 3264454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // Check against promotion width. 3265454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // FIXME: Suppress this folding until the ABI for the promotion width 3266454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // settles. 3267454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman unsigned PromoteWidthBits = 3268454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman Info.Ctx.getTargetInfo().getMaxAtomicPromoteWidth(); 3269454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman if (Size > Info.Ctx.toCharUnitsFromBits(PromoteWidthBits)) 3270454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman return Success(0, E); 3271454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman#endif 3272454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman 3273454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // Check against inlining width. 3274454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman unsigned InlineWidthBits = 3275454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman Info.Ctx.getTargetInfo().getMaxAtomicInlineWidth(); 3276454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman if (Size <= Info.Ctx.toCharUnitsFromBits(InlineWidthBits)) 3277454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman return Success(1, E); 3278454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman 3279f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 3280454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman } 3281019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner } 32824c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner} 3283f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 3284625b80755b603d28f36fb4212c81484d87ad08d3Richard Smithstatic bool HasSameBase(const LValue &A, const LValue &B) { 3285625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith if (!A.getLValueBase()) 3286625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith return !B.getLValueBase(); 3287625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith if (!B.getLValueBase()) 3288625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith return false; 3289625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith 32901bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith if (A.getLValueBase().getOpaqueValue() != 32911bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith B.getLValueBase().getOpaqueValue()) { 3292625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith const Decl *ADecl = GetLValueBaseDecl(A); 3293625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith if (!ADecl) 3294625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith return false; 3295625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith const Decl *BDecl = GetLValueBaseDecl(B); 32969a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith if (!BDecl || ADecl->getCanonicalDecl() != BDecl->getCanonicalDecl()) 3297625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith return false; 3298625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith } 3299625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith 3300625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith return IsGlobalLValue(A.getLValueBase()) || 3301177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith A.getLValueFrame() == B.getLValueFrame(); 3302625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith} 3303625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith 3304b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 3305c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (E->isAssignmentOp()) 3306f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 3307c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 33082de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (E->getOpcode() == BO_Comma) { 33098327fad71da34492d82c532f42a58cb4baff81a3Richard Smith VisitIgnoredValue(E->getLHS()); 33108327fad71da34492d82c532f42a58cb4baff81a3Richard Smith return Visit(E->getRHS()); 3311a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 3312a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 3313a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (E->isLogicalOp()) { 3314a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // These need to be handled specially because the operands aren't 3315a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // necessarily integral 3316fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson bool lhsResult, rhsResult; 33171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3318c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (EvaluateAsBooleanCondition(E->getLHS(), lhsResult, Info)) { 331951fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson // We were able to evaluate the LHS, see if we can get away with not 332051fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson // evaluating the RHS: 0 && X -> 0, 1 || X -> 1 33212de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (lhsResult == (E->getOpcode() == BO_LOr)) 33223f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return Success(lhsResult, E); 3323a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 3324c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (EvaluateAsBooleanCondition(E->getRHS(), rhsResult, Info)) { 33252de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (E->getOpcode() == BO_LOr) 3326131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(lhsResult || rhsResult, E); 33274bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson else 3328131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(lhsResult && rhsResult, E); 33294bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } 33304bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } else { 3331f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // FIXME: If both evaluations fail, we should produce the diagnostic from 3332f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // the LHS. If the LHS is non-constant and the RHS is unevaluatable, it's 3333f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // less clear how to diagnose this. 3334c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (EvaluateAsBooleanCondition(E->getRHS(), rhsResult, Info)) { 33354bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson // We can't evaluate the LHS; however, sometimes the result 33364bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson // is determined by the RHS: X && 0 -> 0, X || 1 -> 1. 3337f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (rhsResult == (E->getOpcode() == BO_LOr)) { 3338131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar // Since we weren't able to evaluate the left hand side, it 3339fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson // must have had side effects. 33401e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith Info.EvalStatus.HasSideEffects = true; 3341131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar 3342131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(rhsResult, E); 33434bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } 33444bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } 3345a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 3346a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 3347a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; 3348c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner } 334954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner 3350286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson QualType LHSTy = E->getLHS()->getType(); 3351286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson QualType RHSTy = E->getRHS()->getType(); 33524087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 33534087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (LHSTy->isAnyComplexType()) { 33544087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar assert(RHSTy->isAnyComplexType() && "Invalid comparison"); 3355f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexValue LHS, RHS; 33564087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 33574087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (!EvaluateComplex(E->getLHS(), LHS, Info)) 33584087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar return false; 33594087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 33604087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (!EvaluateComplex(E->getRHS(), RHS, Info)) 33614087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar return false; 33624087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 33634087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (LHS.isComplexFloat()) { 33641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump APFloat::cmpResult CR_r = 33654087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar LHS.getComplexFloatReal().compare(RHS.getComplexFloatReal()); 33661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump APFloat::cmpResult CR_i = 33674087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar LHS.getComplexFloatImag().compare(RHS.getComplexFloatImag()); 33684087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 33692de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (E->getOpcode() == BO_EQ) 3370131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success((CR_r == APFloat::cmpEqual && 3371131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar CR_i == APFloat::cmpEqual), E); 3372131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar else { 33732de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall assert(E->getOpcode() == BO_NE && 3374131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar "Invalid complex comparison."); 33751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return Success(((CR_r == APFloat::cmpGreaterThan || 3376fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang CR_r == APFloat::cmpLessThan || 3377fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang CR_r == APFloat::cmpUnordered) || 33781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump (CR_i == APFloat::cmpGreaterThan || 3379fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang CR_i == APFloat::cmpLessThan || 3380fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang CR_i == APFloat::cmpUnordered)), E); 3381131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 33824087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar } else { 33832de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (E->getOpcode() == BO_EQ) 3384131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success((LHS.getComplexIntReal() == RHS.getComplexIntReal() && 3385131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar LHS.getComplexIntImag() == RHS.getComplexIntImag()), E); 3386131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar else { 33872de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall assert(E->getOpcode() == BO_NE && 3388131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar "Invalid compex comparison."); 3389131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success((LHS.getComplexIntReal() != RHS.getComplexIntReal() || 3390131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar LHS.getComplexIntImag() != RHS.getComplexIntImag()), E); 3391131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 33924087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar } 33934087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar } 33941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3395286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (LHSTy->isRealFloatingType() && 3396286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson RHSTy->isRealFloatingType()) { 3397286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson APFloat RHS(0.0), LHS(0.0); 33981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3399286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (!EvaluateFloat(E->getRHS(), RHS, Info)) 3400286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson return false; 34011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3402286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (!EvaluateFloat(E->getLHS(), LHS, Info)) 3403286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson return false; 34041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3405286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson APFloat::cmpResult CR = LHS.compare(RHS); 3406529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson 3407286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson switch (E->getOpcode()) { 3408286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson default: 3409b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Invalid binary operator!"); 34102de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LT: 3411131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpLessThan, E); 34122de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_GT: 3413131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpGreaterThan, E); 34142de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LE: 3415131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpLessThan || CR == APFloat::cmpEqual, E); 34162de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_GE: 34171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return Success(CR == APFloat::cmpGreaterThan || CR == APFloat::cmpEqual, 3418131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar E); 34192de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_EQ: 3420131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpEqual, E); 34212de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_NE: 34221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return Success(CR == APFloat::cmpGreaterThan 3423fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang || CR == APFloat::cmpLessThan 3424fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang || CR == APFloat::cmpUnordered, E); 3425286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson } 3426286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson } 34271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3428ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman if (LHSTy->isPointerType() && RHSTy->isPointerType()) { 3429625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith if (E->getOpcode() == BO_Sub || E->isComparisonOp()) { 3430efdb83e26f9a1fd2566afe54461216cd84814d42John McCall LValue LHSValue; 34313068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getLHS(), LHSValue, Info)) 34323068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return false; 3433a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 3434efdb83e26f9a1fd2566afe54461216cd84814d42John McCall LValue RHSValue; 34353068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getRHS(), RHSValue, Info)) 34363068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return false; 3437a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 3438625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith // Reject differing bases from the normal codepath; we special-case 3439625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith // comparisons to null. 3440625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith if (!HasSameBase(LHSValue, RHSValue)) { 34419e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith // Inequalities and subtractions between unrelated pointers have 34429e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith // unspecified or undefined behavior. 34435bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman if (!E->isEqualityOp()) 3444f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 3445ffbda40a1fb7169591dc01771f3511178a2f727cEli Friedman // A constant address may compare equal to the address of a symbol. 3446ffbda40a1fb7169591dc01771f3511178a2f727cEli Friedman // The one exception is that address of an object cannot compare equal 3447c45061bd0c0fdad4df8eea7e9e5af186d11427e5Eli Friedman // to a null pointer constant. 3448ffbda40a1fb7169591dc01771f3511178a2f727cEli Friedman if ((!LHSValue.Base && !LHSValue.Offset.isZero()) || 3449ffbda40a1fb7169591dc01771f3511178a2f727cEli Friedman (!RHSValue.Base && !RHSValue.Offset.isZero())) 3450f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 34519e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith // It's implementation-defined whether distinct literals will have 3452c45061bd0c0fdad4df8eea7e9e5af186d11427e5Eli Friedman // distinct addresses. In clang, we do not guarantee the addresses are 345374f4634781cee06e28eb741bda5d0f936fdd1948Richard Smith // distinct. However, we do know that the address of a literal will be 345474f4634781cee06e28eb741bda5d0f936fdd1948Richard Smith // non-null. 345574f4634781cee06e28eb741bda5d0f936fdd1948Richard Smith if ((IsLiteralLValue(LHSValue) || IsLiteralLValue(RHSValue)) && 345674f4634781cee06e28eb741bda5d0f936fdd1948Richard Smith LHSValue.Base && RHSValue.Base) 3457f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 34589e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith // We can't tell whether weak symbols will end up pointing to the same 34599e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith // object. 34609e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith if (IsWeakLValue(LHSValue) || IsWeakLValue(RHSValue)) 3461f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 34629e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith // Pointers with different bases cannot represent the same object. 3463c45061bd0c0fdad4df8eea7e9e5af186d11427e5Eli Friedman // (Note that clang defaults to -fmerge-all-constants, which can 3464c45061bd0c0fdad4df8eea7e9e5af186d11427e5Eli Friedman // lead to inconsistent results for comparisons involving the address 3465c45061bd0c0fdad4df8eea7e9e5af186d11427e5Eli Friedman // of a constant; this generally doesn't matter in practice.) 34669e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith return Success(E->getOpcode() == BO_NE, E); 34675bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman } 3468a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 3469cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // FIXME: Implement the C++11 restrictions: 3470cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // - Pointer subtractions must be on elements of the same array. 3471cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // - Pointer comparisons must be between members with the same access. 3472cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 34732de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (E->getOpcode() == BO_Sub) { 34744992bdde387c5f033bb450a716eaabc0fda52688Chris Lattner QualType Type = E->getLHS()->getType(); 34754992bdde387c5f033bb450a716eaabc0fda52688Chris Lattner QualType ElementType = Type->getAs<PointerType>()->getPointeeType(); 34763068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 3477180f47959a066795cc0f409433023af448bb0328Richard Smith CharUnits ElementSize; 3478180f47959a066795cc0f409433023af448bb0328Richard Smith if (!HandleSizeof(Info, ElementType, ElementSize)) 3479180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 3480a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 3481180f47959a066795cc0f409433023af448bb0328Richard Smith CharUnits Diff = LHSValue.getLValueOffset() - 3482a73058324197b7bdfd19307965954f626e26199dKen Dyck RHSValue.getLValueOffset(); 3483a73058324197b7bdfd19307965954f626e26199dKen Dyck return Success(Diff / ElementSize, E); 3484ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman } 3485625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith 3486625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith const CharUnits &LHSOffset = LHSValue.getLValueOffset(); 3487625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith const CharUnits &RHSOffset = RHSValue.getLValueOffset(); 3488625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith switch (E->getOpcode()) { 3489625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith default: llvm_unreachable("missing comparison operator"); 3490625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith case BO_LT: return Success(LHSOffset < RHSOffset, E); 3491625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith case BO_GT: return Success(LHSOffset > RHSOffset, E); 3492625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith case BO_LE: return Success(LHSOffset <= RHSOffset, E); 3493625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith case BO_GE: return Success(LHSOffset >= RHSOffset, E); 3494625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith case BO_EQ: return Success(LHSOffset == RHSOffset, E); 3495625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith case BO_NE: return Success(LHSOffset != RHSOffset, E); 3496ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman } 34973068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 34983068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 34992ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor if (!LHSTy->isIntegralOrEnumerationType() || 35002ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor !RHSTy->isIntegralOrEnumerationType()) { 3501e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // We can't continue from here for non-integral types. 3502e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return ExprEvaluatorBaseTy::VisitBinaryOperator(E); 3503a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 3504a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 3505a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // The LHS of a constant expr is always evaluated and needed. 350647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue LHSVal; 3507c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!EvaluateIntegerOrLValue(E->getLHS(), LHSVal, Info)) 3508f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 3509d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman 3510c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!Visit(E->getRHS())) 351130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return false; 351247a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue &RHSVal = Result; 351342edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 351442edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman // Handle cases like (unsigned long)&a + 4. 3515c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (E->isAdditiveOp() && LHSVal.isLValue() && RHSVal.isInt()) { 3516a73058324197b7bdfd19307965954f626e26199dKen Dyck CharUnits AdditionalOffset = CharUnits::fromQuantity( 3517a73058324197b7bdfd19307965954f626e26199dKen Dyck RHSVal.getInt().getZExtValue()); 35182de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (E->getOpcode() == BO_Add) 351947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith LHSVal.getLValueOffset() += AdditionalOffset; 352042edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman else 352147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith LHSVal.getLValueOffset() -= AdditionalOffset; 352247a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Result = LHSVal; 352342edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman return true; 352442edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman } 352542edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 352642edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman // Handle cases like 4 + (unsigned long)&a 35272de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (E->getOpcode() == BO_Add && 3528c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith RHSVal.isLValue() && LHSVal.isInt()) { 352947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith RHSVal.getLValueOffset() += CharUnits::fromQuantity( 353047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith LHSVal.getInt().getZExtValue()); 353147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith // Note that RHSVal is Result. 353242edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman return true; 353342edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman } 353442edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 353542edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman // All the following cases expect both operands to be an integer 3536c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!LHSVal.isInt() || !RHSVal.isInt()) 3537f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 3538a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 3539c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith APSInt &LHS = LHSVal.getInt(); 3540c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith APSInt &RHS = RHSVal.getInt(); 354142edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 3542a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson switch (E->getOpcode()) { 354332fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner default: 3544f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 3545c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_Mul: return Success(LHS * RHS, E); 3546c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_Add: return Success(LHS + RHS, E); 3547c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_Sub: return Success(LHS - RHS, E); 3548c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_And: return Success(LHS & RHS, E); 3549c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_Xor: return Success(LHS ^ RHS, E); 3550c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_Or: return Success(LHS | RHS, E); 35512de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Div: 355254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner if (RHS == 0) 3553f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E, diag::note_expr_divide_by_zero); 3554c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return Success(LHS / RHS, E); 35552de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Rem: 355654176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner if (RHS == 0) 3557f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E, diag::note_expr_divide_by_zero); 3558c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return Success(LHS % RHS, E); 35592de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Shl: { 3560091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall // During constant-folding, a negative shift is an opposite shift. 3561091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall if (RHS.isSigned() && RHS.isNegative()) { 3562091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall RHS = -RHS; 3563091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall goto shift_right; 3564091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall } 3565091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall 3566091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall shift_left: 3567091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall unsigned SA 3568c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith = (unsigned) RHS.getLimitedValue(LHS.getBitWidth()-1); 3569c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return Success(LHS << SA, E); 35703f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar } 35712de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Shr: { 3572091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall // During constant-folding, a negative shift is an opposite shift. 3573091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall if (RHS.isSigned() && RHS.isNegative()) { 3574091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall RHS = -RHS; 3575091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall goto shift_left; 3576091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall } 3577091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall 3578091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall shift_right: 35791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned SA = 3580c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith (unsigned) RHS.getLimitedValue(LHS.getBitWidth()-1); 3581c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return Success(LHS >> SA, E); 35823f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar } 35831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3584c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_LT: return Success(LHS < RHS, E); 3585c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_GT: return Success(LHS > RHS, E); 3586c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_LE: return Success(LHS <= RHS, E); 3587c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_GE: return Success(LHS >= RHS, E); 3588c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_EQ: return Success(LHS == RHS, E); 3589c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_NE: return Success(LHS != RHS, E); 3590b11e77836dd0867955c5abf32baf1c3e6c7f81e1Eli Friedman } 3591a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 3592a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson 35938b752f10c394b140f9ef89e049cbad1a7676fc25Ken DyckCharUnits IntExprEvaluator::GetAlignOfType(QualType T) { 35945d484e8cf710207010720589d89602233de61d01Sebastian Redl // C++ [expr.sizeof]p2: "When applied to a reference or a reference type, 35955d484e8cf710207010720589d89602233de61d01Sebastian Redl // the result is the size of the referenced type." 35965d484e8cf710207010720589d89602233de61d01Sebastian Redl // C++ [expr.alignof]p3: "When alignof is applied to a reference type, the 35975d484e8cf710207010720589d89602233de61d01Sebastian Redl // result shall be the alignment of the referenced type." 35985d484e8cf710207010720589d89602233de61d01Sebastian Redl if (const ReferenceType *Ref = T->getAs<ReferenceType>()) 35995d484e8cf710207010720589d89602233de61d01Sebastian Redl T = Ref->getPointeeType(); 36009f1210c3280104417a4ad30f0a00825ac8fa718aChad Rosier 36019f1210c3280104417a4ad30f0a00825ac8fa718aChad Rosier // __alignof is defined to return the preferred alignment. 36029f1210c3280104417a4ad30f0a00825ac8fa718aChad Rosier return Info.Ctx.toCharUnitsFromBits( 36039f1210c3280104417a4ad30f0a00825ac8fa718aChad Rosier Info.Ctx.getPreferredTypeAlign(T.getTypePtr())); 3604e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner} 3605e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 36068b752f10c394b140f9ef89e049cbad1a7676fc25Ken DyckCharUnits IntExprEvaluator::GetAlignOfExpr(const Expr *E) { 3607af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner E = E->IgnoreParens(); 3608af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner 3609af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner // alignof decl is always accepted, even if it doesn't make sense: we default 36101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // to 1 in those cases. 3611af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) 36128b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck return Info.Ctx.getDeclAlign(DRE->getDecl(), 36138b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck /*RefAsPointee*/true); 3614a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 3615af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner if (const MemberExpr *ME = dyn_cast<MemberExpr>(E)) 36168b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck return Info.Ctx.getDeclAlign(ME->getMemberDecl(), 36178b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck /*RefAsPointee*/true); 3618af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner 3619e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner return GetAlignOfType(E->getType()); 3620e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner} 3621e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 3622e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 3623f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne/// VisitUnaryExprOrTypeTraitExpr - Evaluate a sizeof, alignof or vec_step with 3624f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne/// a result as the expression's type. 3625f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbournebool IntExprEvaluator::VisitUnaryExprOrTypeTraitExpr( 3626f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne const UnaryExprOrTypeTraitExpr *E) { 3627f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne switch(E->getKind()) { 3628f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case UETT_AlignOf: { 3629e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner if (E->isArgumentType()) 36304f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck return Success(GetAlignOfType(E->getArgumentType()), E); 3631e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner else 36324f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck return Success(GetAlignOfExpr(E->getArgumentExpr()), E); 3633e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner } 3634a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 3635f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case UETT_VecStep: { 3636f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne QualType Ty = E->getTypeOfArgument(); 36370518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl 3638f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne if (Ty->isVectorType()) { 3639f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne unsigned n = Ty->getAs<VectorType>()->getNumElements(); 3640a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 3641f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne // The vec_step built-in functions that take a 3-component 3642f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne // vector return 4. (OpenCL 1.1 spec 6.11.12) 3643f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne if (n == 3) 3644f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne n = 4; 3645f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne 3646f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne return Success(n, E); 3647f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne } else 3648f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne return Success(1, E); 3649f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne } 3650f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne 3651f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case UETT_SizeOf: { 3652f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne QualType SrcTy = E->getTypeOfArgument(); 3653f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne // C++ [expr.sizeof]p2: "When applied to a reference or a reference type, 3654f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne // the result is the size of the referenced type." 3655f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne // C++ [expr.alignof]p3: "When alignof is applied to a reference type, the 3656f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne // result shall be the alignment of the referenced type." 3657f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne if (const ReferenceType *Ref = SrcTy->getAs<ReferenceType>()) 3658f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne SrcTy = Ref->getPointeeType(); 3659f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman 3660180f47959a066795cc0f409433023af448bb0328Richard Smith CharUnits Sizeof; 3661180f47959a066795cc0f409433023af448bb0328Richard Smith if (!HandleSizeof(Info, SrcTy, Sizeof)) 3662f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne return false; 3663180f47959a066795cc0f409433023af448bb0328Richard Smith return Success(Sizeof, E); 3664f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne } 3665f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne } 3666f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne 3667f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne llvm_unreachable("unknown expr/type trait"); 3668f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 3669fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner} 3670fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner 36718cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool IntExprEvaluator::VisitOffsetOfExpr(const OffsetOfExpr *OOE) { 36728ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor CharUnits Result; 36738cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne unsigned n = OOE->getNumComponents(); 36748ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (n == 0) 3675f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(OOE); 36768cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne QualType CurrentType = OOE->getTypeSourceInfo()->getType(); 36778ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor for (unsigned i = 0; i != n; ++i) { 36788ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor OffsetOfExpr::OffsetOfNode ON = OOE->getComponent(i); 36798ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor switch (ON.getKind()) { 36808ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor case OffsetOfExpr::OffsetOfNode::Array: { 36818cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne const Expr *Idx = OOE->getIndexExpr(ON.getArrayExprIndex()); 36828ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor APSInt IdxResult; 36838ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (!EvaluateInteger(Idx, IdxResult, Info)) 36848ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return false; 36858ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor const ArrayType *AT = Info.Ctx.getAsArrayType(CurrentType); 36868ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (!AT) 3687f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(OOE); 36888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor CurrentType = AT->getElementType(); 36898ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor CharUnits ElementSize = Info.Ctx.getTypeSizeInChars(CurrentType); 36908ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Result += IdxResult.getSExtValue() * ElementSize; 36918ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor break; 36928ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 3693f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 36948ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor case OffsetOfExpr::OffsetOfNode::Field: { 36958ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor FieldDecl *MemberDecl = ON.getField(); 36968ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor const RecordType *RT = CurrentType->getAs<RecordType>(); 3697f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!RT) 3698f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(OOE); 36998ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor RecordDecl *RD = RT->getDecl(); 37008ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD); 3701ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall unsigned i = MemberDecl->getFieldIndex(); 3702cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor assert(i < RL.getFieldCount() && "offsetof field in wrong type"); 3703fb1e3bc29b667f4275e1d5a43d64ec173f4f9a7dKen Dyck Result += Info.Ctx.toCharUnitsFromBits(RL.getFieldOffset(i)); 37048ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor CurrentType = MemberDecl->getType().getNonReferenceType(); 37058ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor break; 37068ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 3707f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 37088ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor case OffsetOfExpr::OffsetOfNode::Identifier: 37098ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor llvm_unreachable("dependent __builtin_offsetof"); 3710f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(OOE); 3711f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 3712cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor case OffsetOfExpr::OffsetOfNode::Base: { 3713cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor CXXBaseSpecifier *BaseSpec = ON.getBase(); 3714cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor if (BaseSpec->isVirtual()) 3715f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(OOE); 3716cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor 3717cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor // Find the layout of the class whose base we are looking into. 3718cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor const RecordType *RT = CurrentType->getAs<RecordType>(); 3719f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!RT) 3720f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(OOE); 3721cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor RecordDecl *RD = RT->getDecl(); 3722cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD); 3723cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor 3724cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor // Find the base class itself. 3725cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor CurrentType = BaseSpec->getType(); 3726cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor const RecordType *BaseRT = CurrentType->getAs<RecordType>(); 3727cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor if (!BaseRT) 3728f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(OOE); 3729cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor 3730cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor // Add the offset to the base. 37317c7f820d70c925b29290a8563b59615816a827fcKen Dyck Result += RL.getBaseClassOffset(cast<CXXRecordDecl>(BaseRT->getDecl())); 3732cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor break; 3733cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor } 37348ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 37358ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 37368cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return Success(Result, OOE); 37378ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor} 37388ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 3739b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { 374075a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner switch (E->getOpcode()) { 37414c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner default: 374275a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner // Address, indirect, pre/post inc/dec, etc are not valid constant exprs. 374375a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner // See C99 6.6p3. 3744f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 37452de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Extension: 37464c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // FIXME: Should extension allow i-c-e extension expressions in its scope? 37474c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // If so, we could clear the diagnostic ID. 3748f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Visit(E->getSubExpr()); 37492de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Plus: 3750c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // The result is just the value. 3751f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Visit(E->getSubExpr()); 3752f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith case UO_Minus: { 3753f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!Visit(E->getSubExpr())) 3754f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 3755f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!Result.isInt()) return Error(E); 3756f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Success(-Result.getInt(), E); 3757f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 3758f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith case UO_Not: { 3759f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!Visit(E->getSubExpr())) 3760f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 3761f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!Result.isInt()) return Error(E); 3762f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Success(~Result.getInt(), E); 3763f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 3764f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith case UO_LNot: { 3765f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith bool bres; 3766f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!EvaluateAsBooleanCondition(E->getSubExpr(), bres, Info)) 3767f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 3768f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Success(!bres, E); 3769f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 377006a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson } 3771a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 37721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3773732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// HandleCast - This is used to evaluate implicit or explicit casts where the 3774732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// result type is integer. 37758cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool IntExprEvaluator::VisitCastExpr(const CastExpr *E) { 37768cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne const Expr *SubExpr = E->getSubExpr(); 377782206e267ce6cc709797127616f64672d255b310Anders Carlsson QualType DestType = E->getType(); 3778b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar QualType SrcType = SubExpr->getType(); 377982206e267ce6cc709797127616f64672d255b310Anders Carlsson 378046a523285928aa07bf14803178dc04616ac85994Eli Friedman switch (E->getCastKind()) { 378146a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_BaseToDerived: 378246a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_DerivedToBase: 378346a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_UncheckedDerivedToBase: 378446a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_Dynamic: 378546a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_ToUnion: 378646a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_ArrayToPointerDecay: 378746a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_FunctionToPointerDecay: 378846a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_NullToPointer: 378946a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_NullToMemberPointer: 379046a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_BaseToDerivedMemberPointer: 379146a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_DerivedToBaseMemberPointer: 379246a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_ConstructorConversion: 379346a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_IntegralToPointer: 379446a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_ToVoid: 379546a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_VectorSplat: 379646a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_IntegralToFloating: 379746a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_FloatingCast: 37981d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall case CK_CPointerToObjCPointerCast: 37991d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall case CK_BlockPointerToObjCPointerCast: 380046a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_AnyPointerToBlockPointerCast: 380146a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_ObjCObjectLValueCast: 380246a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_FloatingRealToComplex: 380346a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_FloatingComplexToReal: 380446a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_FloatingComplexCast: 380546a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_FloatingComplexToIntegralComplex: 380646a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_IntegralRealToComplex: 380746a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_IntegralComplexCast: 380846a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_IntegralComplexToFloatingComplex: 380946a523285928aa07bf14803178dc04616ac85994Eli Friedman llvm_unreachable("invalid cast kind for integral value"); 381046a523285928aa07bf14803178dc04616ac85994Eli Friedman 3811e50c297f92914ca996deb8b597624193273b62e4Eli Friedman case CK_BitCast: 381246a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_Dependent: 381346a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_LValueBitCast: 381446a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_UserDefinedConversion: 381533e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall case CK_ARCProduceObject: 381633e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall case CK_ARCConsumeObject: 381733e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall case CK_ARCReclaimReturnedObject: 381833e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall case CK_ARCExtendBlockObject: 3819f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 382046a523285928aa07bf14803178dc04616ac85994Eli Friedman 382146a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_LValueToRValue: 382246a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_NoOp: 3823c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return ExprEvaluatorBaseTy::VisitCastExpr(E); 382446a523285928aa07bf14803178dc04616ac85994Eli Friedman 382546a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_MemberPointerToBoolean: 382646a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_PointerToBoolean: 382746a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_IntegralToBoolean: 382846a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_FloatingToBoolean: 382946a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_FloatingComplexToBoolean: 383046a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_IntegralComplexToBoolean: { 38314efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool BoolResult; 3832c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!EvaluateAsBooleanCondition(SubExpr, BoolResult, Info)) 38334efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 3834131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(BoolResult, E); 38354efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 38364efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 383746a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_IntegralCast: { 3838732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner if (!Visit(SubExpr)) 3839b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 3840a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 3841be26570e3faa009bdcefedfaf04473e518940520Eli Friedman if (!Result.isInt()) { 3842be26570e3faa009bdcefedfaf04473e518940520Eli Friedman // Only allow casts of lvalues if they are lossless. 3843be26570e3faa009bdcefedfaf04473e518940520Eli Friedman return Info.Ctx.getTypeSize(DestType) == Info.Ctx.getTypeSize(SrcType); 3844be26570e3faa009bdcefedfaf04473e518940520Eli Friedman } 384530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar 3846dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar return Success(HandleIntToIntCast(DestType, SrcType, 384730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result.getInt(), Info.Ctx), E); 3848732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner } 38491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 385046a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_PointerToIntegral: { 3851c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith CCEDiag(E, diag::note_constexpr_invalid_cast) << 2; 3852c216a01c96d83bd9a90e214af64913e93d39aaccRichard Smith 3853efdb83e26f9a1fd2566afe54461216cd84814d42John McCall LValue LV; 385487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!EvaluatePointer(SubExpr, LV, Info)) 3855b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 38564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3857dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar if (LV.getLValueBase()) { 3858dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar // Only allow based lvalue casts if they are lossless. 3859dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(SrcType)) 3860f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 3861dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar 3862b755a9da095d2f2f04444797f1e1a9511693815bRichard Smith LV.Designator.setInvalid(); 3863efdb83e26f9a1fd2566afe54461216cd84814d42John McCall LV.moveInto(Result); 3864dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar return true; 3865dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar } 38664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3867a73058324197b7bdfd19307965954f626e26199dKen Dyck APSInt AsInt = Info.Ctx.MakeIntValue(LV.getLValueOffset().getQuantity(), 3868a73058324197b7bdfd19307965954f626e26199dKen Dyck SrcType); 3869dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar return Success(HandleIntToIntCast(DestType, SrcType, AsInt, Info.Ctx), E); 38702bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson } 38714efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 387246a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_IntegralComplexToReal: { 3873f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexValue C; 38741725f683432715e5afe34d476024bd6f16eac3fcEli Friedman if (!EvaluateComplex(SubExpr, C, Info)) 38751725f683432715e5afe34d476024bd6f16eac3fcEli Friedman return false; 387646a523285928aa07bf14803178dc04616ac85994Eli Friedman return Success(C.getComplexIntReal(), E); 38771725f683432715e5afe34d476024bd6f16eac3fcEli Friedman } 38782217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman 387946a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_FloatingToIntegral: { 388046a523285928aa07bf14803178dc04616ac85994Eli Friedman APFloat F(0.0); 388146a523285928aa07bf14803178dc04616ac85994Eli Friedman if (!EvaluateFloat(SubExpr, F, Info)) 388246a523285928aa07bf14803178dc04616ac85994Eli Friedman return false; 3883732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner 388446a523285928aa07bf14803178dc04616ac85994Eli Friedman return Success(HandleFloatToIntCast(DestType, SrcType, F, Info.Ctx), E); 388546a523285928aa07bf14803178dc04616ac85994Eli Friedman } 388646a523285928aa07bf14803178dc04616ac85994Eli Friedman } 38871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 388846a523285928aa07bf14803178dc04616ac85994Eli Friedman llvm_unreachable("unknown cast resulting in integral value"); 3889f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 3890a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 38912bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 3892722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedmanbool IntExprEvaluator::VisitUnaryReal(const UnaryOperator *E) { 3893722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman if (E->getSubExpr()->getType()->isAnyComplexType()) { 3894f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexValue LV; 3895f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!EvaluateComplex(E->getSubExpr(), LV, Info)) 3896f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 3897f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!LV.isComplexInt()) 3898f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 3899722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Success(LV.getComplexIntReal(), E); 3900722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman } 3901722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman 3902722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Visit(E->getSubExpr()); 3903722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman} 3904722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman 3905664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedmanbool IntExprEvaluator::VisitUnaryImag(const UnaryOperator *E) { 3906722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman if (E->getSubExpr()->getType()->isComplexIntegerType()) { 3907f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexValue LV; 3908f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!EvaluateComplex(E->getSubExpr(), LV, Info)) 3909f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 3910f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!LV.isComplexInt()) 3911f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 3912722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Success(LV.getComplexIntImag(), E); 3913722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman } 3914722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman 39158327fad71da34492d82c532f42a58cb4baff81a3Richard Smith VisitIgnoredValue(E->getSubExpr()); 3916664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman return Success(0, E); 3917664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman} 3918664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman 3919ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregorbool IntExprEvaluator::VisitSizeOfPackExpr(const SizeOfPackExpr *E) { 3920ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor return Success(E->getPackLength(), E); 3921ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor} 3922ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor 3923295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlbool IntExprEvaluator::VisitCXXNoexceptExpr(const CXXNoexceptExpr *E) { 3924295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl return Success(E->getValue(), E); 3925295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl} 3926295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl 3927f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 3928d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman// Float Evaluation 3929d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===// 3930d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 3931d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmannamespace { 3932770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass FloatExprEvaluator 39338cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : public ExprEvaluatorBase<FloatExprEvaluator, bool> { 3934d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman APFloat &Result; 3935d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanpublic: 3936d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman FloatExprEvaluator(EvalInfo &info, APFloat &result) 39378cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : ExprEvaluatorBaseTy(info), Result(result) {} 3938d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 393947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith bool Success(const CCValue &V, const Expr *e) { 39408cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne Result = V.getFloat(); 39418cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return true; 39428cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 3943d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 3944f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith bool ValueInitialization(const Expr *E) { 3945f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith Result = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(E->getType())); 3946f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith return true; 3947f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith } 3948f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith 3949019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner bool VisitCallExpr(const CallExpr *E); 3950d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 39515db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar bool VisitUnaryOperator(const UnaryOperator *E); 3952d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitBinaryOperator(const BinaryOperator *E); 3953d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitFloatingLiteral(const FloatingLiteral *E); 39548cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCastExpr(const CastExpr *E); 39552217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman 3956abd3a857ace59100305790545d1baae5877b8945John McCall bool VisitUnaryReal(const UnaryOperator *E); 3957abd3a857ace59100305790545d1baae5877b8945John McCall bool VisitUnaryImag(const UnaryOperator *E); 3958ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman 3959abd3a857ace59100305790545d1baae5877b8945John McCall // FIXME: Missing: array subscript of vector, member of vector, 3960abd3a857ace59100305790545d1baae5877b8945John McCall // ImplicitValueInitExpr 3961d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}; 3962d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} // end anonymous namespace 3963d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 3964d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr* E, APFloat& Result, EvalInfo &Info) { 3965c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith assert(E->isRValue() && E->getType()->isRealFloatingType()); 39668cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return FloatExprEvaluator(Info, Result).Visit(E); 3967d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 3968d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 39694ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadstatic bool TryEvaluateBuiltinNaN(const ASTContext &Context, 3970db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall QualType ResultTy, 3971db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall const Expr *Arg, 3972db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall bool SNaN, 3973db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall llvm::APFloat &Result) { 3974db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall const StringLiteral *S = dyn_cast<StringLiteral>(Arg->IgnoreParenCasts()); 3975db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall if (!S) return false; 3976db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall 3977db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall const llvm::fltSemantics &Sem = Context.getFloatTypeSemantics(ResultTy); 3978db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall 3979db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall llvm::APInt fill; 3980db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall 3981db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall // Treat empty strings as if they were zero. 3982db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall if (S->getString().empty()) 3983db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall fill = llvm::APInt(32, 0); 3984db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall else if (S->getString().getAsInteger(0, fill)) 3985db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall return false; 3986db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall 3987db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall if (SNaN) 3988db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall Result = llvm::APFloat::getSNaN(Sem, false, &fill); 3989db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall else 3990db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall Result = llvm::APFloat::getQNaN(Sem, false, &fill); 3991db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall return true; 3992db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall} 3993db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall 3994019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattnerbool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) { 3995180f47959a066795cc0f409433023af448bb0328Richard Smith switch (E->isBuiltinCall()) { 39968cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne default: 39978cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return ExprEvaluatorBaseTy::VisitCallExpr(E); 39988cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 3999019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_val: 4000019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_valf: 4001019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_vall: 4002019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_inf: 4003019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_inff: 40047cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar case Builtin::BI__builtin_infl: { 40057cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar const llvm::fltSemantics &Sem = 40067cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar Info.Ctx.getFloatTypeSemantics(E->getType()); 400734a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner Result = llvm::APFloat::getInf(Sem); 400834a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner return true; 40097cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar } 40101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4011db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall case Builtin::BI__builtin_nans: 4012db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall case Builtin::BI__builtin_nansf: 4013db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall case Builtin::BI__builtin_nansl: 4014f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!TryEvaluateBuiltinNaN(Info.Ctx, E->getType(), E->getArg(0), 4015f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith true, Result)) 4016f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 4017f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return true; 4018db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall 40199e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nan: 40209e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nanf: 40219e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nanl: 40224572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump // If this is __builtin_nan() turn this into a nan, otherwise we 40239e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner // can't constant fold it. 4024f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!TryEvaluateBuiltinNaN(Info.Ctx, E->getType(), E->getArg(0), 4025f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith false, Result)) 4026f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 4027f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return true; 40285db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 40295db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabs: 40305db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabsf: 40315db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabsl: 40325db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (!EvaluateFloat(E->getArg(0), Result, Info)) 40335db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return false; 40341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 40355db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (Result.isNegative()) 40365db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.changeSign(); 40375db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 40385db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 40391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case Builtin::BI__builtin_copysign: 40401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case Builtin::BI__builtin_copysignf: 40415db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_copysignl: { 40425db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar APFloat RHS(0.); 40435db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (!EvaluateFloat(E->getArg(0), Result, Info) || 40445db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar !EvaluateFloat(E->getArg(1), RHS, Info)) 40455db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return false; 40465db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.copySign(RHS); 40475db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 40485db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar } 4049019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner } 4050019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner} 4051019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner 4052abd3a857ace59100305790545d1baae5877b8945John McCallbool FloatExprEvaluator::VisitUnaryReal(const UnaryOperator *E) { 405343efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman if (E->getSubExpr()->getType()->isAnyComplexType()) { 405443efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman ComplexValue CV; 405543efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman if (!EvaluateComplex(E->getSubExpr(), CV, Info)) 405643efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman return false; 405743efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman Result = CV.FloatReal; 405843efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman return true; 405943efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman } 406043efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman 406143efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman return Visit(E->getSubExpr()); 4062abd3a857ace59100305790545d1baae5877b8945John McCall} 4063abd3a857ace59100305790545d1baae5877b8945John McCall 4064abd3a857ace59100305790545d1baae5877b8945John McCallbool FloatExprEvaluator::VisitUnaryImag(const UnaryOperator *E) { 406543efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman if (E->getSubExpr()->getType()->isAnyComplexType()) { 406643efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman ComplexValue CV; 406743efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman if (!EvaluateComplex(E->getSubExpr(), CV, Info)) 406843efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman return false; 406943efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman Result = CV.FloatImag; 407043efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman return true; 407143efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman } 407243efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman 40738327fad71da34492d82c532f42a58cb4baff81a3Richard Smith VisitIgnoredValue(E->getSubExpr()); 407443efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman const llvm::fltSemantics &Sem = Info.Ctx.getFloatTypeSemantics(E->getType()); 407543efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman Result = llvm::APFloat::getZero(Sem); 4076abd3a857ace59100305790545d1baae5877b8945John McCall return true; 4077abd3a857ace59100305790545d1baae5877b8945John McCall} 4078abd3a857ace59100305790545d1baae5877b8945John McCall 40795db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbarbool FloatExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { 40805db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar switch (E->getOpcode()) { 4081f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith default: return Error(E); 40822de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Plus: 40837993e8a2a26bf408c2a6d45f24fffa12db336b2bRichard Smith return EvaluateFloat(E->getSubExpr(), Result, Info); 40842de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Minus: 40857993e8a2a26bf408c2a6d45f24fffa12db336b2bRichard Smith if (!EvaluateFloat(E->getSubExpr(), Result, Info)) 40867993e8a2a26bf408c2a6d45f24fffa12db336b2bRichard Smith return false; 40875db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.changeSign(); 40885db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 40895db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar } 40905db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar} 4091019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner 4092d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 4093e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (E->isPtrMemOp() || E->isAssignmentOp() || E->getOpcode() == BO_Comma) 4094e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return ExprEvaluatorBaseTy::VisitBinaryOperator(E); 409596e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson 40965db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar APFloat RHS(0.0); 4097d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (!EvaluateFloat(E->getLHS(), Result, Info)) 4098d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 4099d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (!EvaluateFloat(E->getRHS(), RHS, Info)) 4100d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 4101d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 4102d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman switch (E->getOpcode()) { 4103f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith default: return Error(E); 41042de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Mul: 4105d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.multiply(RHS, APFloat::rmNearestTiesToEven); 4106d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 41072de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Add: 4108d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.add(RHS, APFloat::rmNearestTiesToEven); 4109d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 41102de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Sub: 4111d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.subtract(RHS, APFloat::rmNearestTiesToEven); 4112d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 41132de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Div: 4114d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.divide(RHS, APFloat::rmNearestTiesToEven); 4115d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 4116d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } 4117d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 4118d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 4119d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitFloatingLiteral(const FloatingLiteral *E) { 4120d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result = E->getValue(); 4121d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 4122d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 4123d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 41248cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool FloatExprEvaluator::VisitCastExpr(const CastExpr *E) { 41258cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne const Expr* SubExpr = E->getSubExpr(); 41261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 41272a523eec6a31955be876625819b89e8dc5def707Eli Friedman switch (E->getCastKind()) { 41282a523eec6a31955be876625819b89e8dc5def707Eli Friedman default: 4129c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return ExprEvaluatorBaseTy::VisitCastExpr(E); 41302a523eec6a31955be876625819b89e8dc5def707Eli Friedman 41312a523eec6a31955be876625819b89e8dc5def707Eli Friedman case CK_IntegralToFloating: { 41324efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APSInt IntResult; 41333f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar if (!EvaluateInteger(SubExpr, IntResult, Info)) 41344efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 41351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result = HandleIntToFloatCast(E->getType(), SubExpr->getType(), 4136a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar IntResult, Info.Ctx); 41374efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 41384efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 41392a523eec6a31955be876625819b89e8dc5def707Eli Friedman 41402a523eec6a31955be876625819b89e8dc5def707Eli Friedman case CK_FloatingCast: { 41414efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!Visit(SubExpr)) 41424efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 4143a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result = HandleFloatToFloatCast(E->getType(), SubExpr->getType(), 4144a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result, Info.Ctx); 41454efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 41464efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 4147f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall 41482a523eec6a31955be876625819b89e8dc5def707Eli Friedman case CK_FloatingComplexToReal: { 4149f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall ComplexValue V; 4150f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall if (!EvaluateComplex(SubExpr, V, Info)) 4151f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall return false; 4152f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall Result = V.getComplexFloatReal(); 4153f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall return true; 4154f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall } 41552a523eec6a31955be876625819b89e8dc5def707Eli Friedman } 41564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 4157f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 41584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 41594efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 4160d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===// 4161a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar// Complex Evaluation (for float and integer) 41629ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===// 41639ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 41649ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonnamespace { 4165770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass ComplexExprEvaluator 41668cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : public ExprEvaluatorBase<ComplexExprEvaluator, bool> { 4167f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexValue &Result; 41681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 41699ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonpublic: 4170f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexExprEvaluator(EvalInfo &info, ComplexValue &Result) 41718cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : ExprEvaluatorBaseTy(info), Result(Result) {} 41721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 417347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith bool Success(const CCValue &V, const Expr *e) { 41748cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne Result.setFrom(V); 41758cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return true; 41768cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 41771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 41788cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne //===--------------------------------------------------------------------===// 41798cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne // Visitor Methods 41808cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne //===--------------------------------------------------------------------===// 41819ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 41828cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitImaginaryLiteral(const ImaginaryLiteral *E); 4183a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 41848cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCastExpr(const CastExpr *E); 4185b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman 4186b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman bool VisitBinaryOperator(const BinaryOperator *E); 418796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara bool VisitUnaryOperator(const UnaryOperator *E); 4188cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl // FIXME Missing: ImplicitValueInitExpr, InitListExpr 4189b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman}; 4190b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman} // end anonymous namespace 41911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4192b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedmanstatic bool EvaluateComplex(const Expr *E, ComplexValue &Result, 4193b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman EvalInfo &Info) { 4194c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith assert(E->isRValue() && E->getType()->isAnyComplexType()); 41958cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return ComplexExprEvaluator(Info, Result).Visit(E); 4196b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman} 4197b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman 41988cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool ComplexExprEvaluator::VisitImaginaryLiteral(const ImaginaryLiteral *E) { 41998cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne const Expr* SubExpr = E->getSubExpr(); 4200b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman 4201b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman if (SubExpr->getType()->isRealFloatingType()) { 4202b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman Result.makeComplexFloat(); 4203b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman APFloat &Imag = Result.FloatImag; 4204b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman if (!EvaluateFloat(SubExpr, Imag, Info)) 4205b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman return false; 4206b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman 4207b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman Result.FloatReal = APFloat(Imag.getSemantics()); 4208b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman return true; 4209b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman } else { 4210b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman assert(SubExpr->getType()->isIntegerType() && 4211b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman "Unexpected imaginary literal."); 4212b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman 4213b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman Result.makeComplexInt(); 4214b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman APSInt &Imag = Result.IntImag; 4215b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman if (!EvaluateInteger(SubExpr, Imag, Info)) 4216b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman return false; 4217b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman 4218b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman Result.IntReal = APSInt(Imag.getBitWidth(), !Imag.isSigned()); 4219b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman return true; 4220b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman } 4221b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman} 4222b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman 42238cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool ComplexExprEvaluator::VisitCastExpr(const CastExpr *E) { 4224b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman 42258786da77984e81d48e0e1b2bd339809b1efc19f3John McCall switch (E->getCastKind()) { 42268786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_BitCast: 42278786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_BaseToDerived: 42288786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_DerivedToBase: 42298786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_UncheckedDerivedToBase: 42308786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_Dynamic: 42318786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_ToUnion: 42328786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_ArrayToPointerDecay: 42338786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_FunctionToPointerDecay: 42348786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_NullToPointer: 42358786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_NullToMemberPointer: 42368786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_BaseToDerivedMemberPointer: 42378786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_DerivedToBaseMemberPointer: 42388786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_MemberPointerToBoolean: 42398786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_ConstructorConversion: 42408786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_IntegralToPointer: 42418786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_PointerToIntegral: 42428786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_PointerToBoolean: 42438786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_ToVoid: 42448786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_VectorSplat: 42458786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_IntegralCast: 42468786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_IntegralToBoolean: 42478786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_IntegralToFloating: 42488786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_FloatingToIntegral: 42498786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_FloatingToBoolean: 42508786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_FloatingCast: 42511d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall case CK_CPointerToObjCPointerCast: 42521d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall case CK_BlockPointerToObjCPointerCast: 42538786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_AnyPointerToBlockPointerCast: 42548786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_ObjCObjectLValueCast: 42558786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_FloatingComplexToReal: 42568786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_FloatingComplexToBoolean: 42578786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_IntegralComplexToReal: 42588786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_IntegralComplexToBoolean: 425933e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall case CK_ARCProduceObject: 426033e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall case CK_ARCConsumeObject: 426133e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall case CK_ARCReclaimReturnedObject: 426233e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall case CK_ARCExtendBlockObject: 42638786da77984e81d48e0e1b2bd339809b1efc19f3John McCall llvm_unreachable("invalid cast kind for complex value"); 42648786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 42658786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_LValueToRValue: 42668786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_NoOp: 4267c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return ExprEvaluatorBaseTy::VisitCastExpr(E); 42682bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall 42698786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_Dependent: 427046a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_LValueBitCast: 42718786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_UserDefinedConversion: 4272f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 42738786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 42748786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_FloatingRealToComplex: { 4275b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman APFloat &Real = Result.FloatReal; 42768786da77984e81d48e0e1b2bd339809b1efc19f3John McCall if (!EvaluateFloat(E->getSubExpr(), Real, Info)) 4277b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman return false; 4278b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman 42798786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.makeComplexFloat(); 42808786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.FloatImag = APFloat(Real.getSemantics()); 42818786da77984e81d48e0e1b2bd339809b1efc19f3John McCall return true; 42828786da77984e81d48e0e1b2bd339809b1efc19f3John McCall } 42838786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 42848786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_FloatingComplexCast: { 42858786da77984e81d48e0e1b2bd339809b1efc19f3John McCall if (!Visit(E->getSubExpr())) 42868786da77984e81d48e0e1b2bd339809b1efc19f3John McCall return false; 42878786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 42888786da77984e81d48e0e1b2bd339809b1efc19f3John McCall QualType To = E->getType()->getAs<ComplexType>()->getElementType(); 42898786da77984e81d48e0e1b2bd339809b1efc19f3John McCall QualType From 42908786da77984e81d48e0e1b2bd339809b1efc19f3John McCall = E->getSubExpr()->getType()->getAs<ComplexType>()->getElementType(); 42918786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 42928786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.FloatReal 42938786da77984e81d48e0e1b2bd339809b1efc19f3John McCall = HandleFloatToFloatCast(To, From, Result.FloatReal, Info.Ctx); 42948786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.FloatImag 42958786da77984e81d48e0e1b2bd339809b1efc19f3John McCall = HandleFloatToFloatCast(To, From, Result.FloatImag, Info.Ctx); 42968786da77984e81d48e0e1b2bd339809b1efc19f3John McCall return true; 42978786da77984e81d48e0e1b2bd339809b1efc19f3John McCall } 42988786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 42998786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_FloatingComplexToIntegralComplex: { 43008786da77984e81d48e0e1b2bd339809b1efc19f3John McCall if (!Visit(E->getSubExpr())) 43018786da77984e81d48e0e1b2bd339809b1efc19f3John McCall return false; 43028786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 43038786da77984e81d48e0e1b2bd339809b1efc19f3John McCall QualType To = E->getType()->getAs<ComplexType>()->getElementType(); 43048786da77984e81d48e0e1b2bd339809b1efc19f3John McCall QualType From 43058786da77984e81d48e0e1b2bd339809b1efc19f3John McCall = E->getSubExpr()->getType()->getAs<ComplexType>()->getElementType(); 43068786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.makeComplexInt(); 43078786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.IntReal = HandleFloatToIntCast(To, From, Result.FloatReal, Info.Ctx); 43088786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.IntImag = HandleFloatToIntCast(To, From, Result.FloatImag, Info.Ctx); 43098786da77984e81d48e0e1b2bd339809b1efc19f3John McCall return true; 43108786da77984e81d48e0e1b2bd339809b1efc19f3John McCall } 43118786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 43128786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_IntegralRealToComplex: { 4313b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman APSInt &Real = Result.IntReal; 43148786da77984e81d48e0e1b2bd339809b1efc19f3John McCall if (!EvaluateInteger(E->getSubExpr(), Real, Info)) 4315b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman return false; 43169ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 43178786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.makeComplexInt(); 43188786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.IntImag = APSInt(Real.getBitWidth(), !Real.isSigned()); 43198786da77984e81d48e0e1b2bd339809b1efc19f3John McCall return true; 43208786da77984e81d48e0e1b2bd339809b1efc19f3John McCall } 43218786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 43228786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_IntegralComplexCast: { 43238786da77984e81d48e0e1b2bd339809b1efc19f3John McCall if (!Visit(E->getSubExpr())) 4324b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman return false; 4325ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 43268786da77984e81d48e0e1b2bd339809b1efc19f3John McCall QualType To = E->getType()->getAs<ComplexType>()->getElementType(); 43278786da77984e81d48e0e1b2bd339809b1efc19f3John McCall QualType From 43288786da77984e81d48e0e1b2bd339809b1efc19f3John McCall = E->getSubExpr()->getType()->getAs<ComplexType>()->getElementType(); 43291725f683432715e5afe34d476024bd6f16eac3fcEli Friedman 43308786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.IntReal = HandleIntToIntCast(To, From, Result.IntReal, Info.Ctx); 43318786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.IntImag = HandleIntToIntCast(To, From, Result.IntImag, Info.Ctx); 43328786da77984e81d48e0e1b2bd339809b1efc19f3John McCall return true; 43338786da77984e81d48e0e1b2bd339809b1efc19f3John McCall } 43348786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 43358786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_IntegralComplexToFloatingComplex: { 43368786da77984e81d48e0e1b2bd339809b1efc19f3John McCall if (!Visit(E->getSubExpr())) 43378786da77984e81d48e0e1b2bd339809b1efc19f3John McCall return false; 43388786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 43398786da77984e81d48e0e1b2bd339809b1efc19f3John McCall QualType To = E->getType()->getAs<ComplexType>()->getElementType(); 43408786da77984e81d48e0e1b2bd339809b1efc19f3John McCall QualType From 43418786da77984e81d48e0e1b2bd339809b1efc19f3John McCall = E->getSubExpr()->getType()->getAs<ComplexType>()->getElementType(); 43428786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.makeComplexFloat(); 43438786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.FloatReal = HandleIntToFloatCast(To, From, Result.IntReal, Info.Ctx); 43448786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.FloatImag = HandleIntToFloatCast(To, From, Result.IntImag, Info.Ctx); 43458786da77984e81d48e0e1b2bd339809b1efc19f3John McCall return true; 43468786da77984e81d48e0e1b2bd339809b1efc19f3John McCall } 4347ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson } 43481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 43498786da77984e81d48e0e1b2bd339809b1efc19f3John McCall llvm_unreachable("unknown cast resulting in complex value"); 4350f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 43519ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson} 43529ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 4353f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCallbool ComplexExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 4354e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (E->isPtrMemOp() || E->isAssignmentOp() || E->getOpcode() == BO_Comma) 43552ad226bdc847df6b6b6e4f832856478ab63bb3dcRichard Smith return ExprEvaluatorBaseTy::VisitBinaryOperator(E); 43562ad226bdc847df6b6b6e4f832856478ab63bb3dcRichard Smith 4357f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall if (!Visit(E->getLHS())) 4358f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall return false; 43591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4360f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexValue RHS; 4361a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateComplex(E->getRHS(), RHS, Info)) 4362f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall return false; 4363a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 43643f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar assert(Result.isComplexFloat() == RHS.isComplexFloat() && 43653f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar "Invalid operands to binary operator."); 4366ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson switch (E->getOpcode()) { 4367f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith default: return Error(E); 43682de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Add: 4369a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (Result.isComplexFloat()) { 4370a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatReal().add(RHS.getComplexFloatReal(), 4371a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 4372a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatImag().add(RHS.getComplexFloatImag(), 4373a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 4374a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else { 4375a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntReal() += RHS.getComplexIntReal(); 4376a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntImag() += RHS.getComplexIntImag(); 4377a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } 43783f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar break; 43792de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Sub: 4380a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (Result.isComplexFloat()) { 4381a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatReal().subtract(RHS.getComplexFloatReal(), 4382a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 4383a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatImag().subtract(RHS.getComplexFloatImag(), 4384a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 4385a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else { 4386a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntReal() -= RHS.getComplexIntReal(); 4387a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntImag() -= RHS.getComplexIntImag(); 4388a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } 43893f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar break; 43902de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Mul: 43913f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar if (Result.isComplexFloat()) { 4392f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexValue LHS = Result; 43933f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &LHS_r = LHS.getComplexFloatReal(); 43943f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &LHS_i = LHS.getComplexFloatImag(); 43953f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &RHS_r = RHS.getComplexFloatReal(); 43963f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &RHS_i = RHS.getComplexFloatImag(); 43971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 43983f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat Tmp = LHS_r; 43993f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven); 44003f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatReal() = Tmp; 44013f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp = LHS_i; 44023f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven); 44033f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatReal().subtract(Tmp, APFloat::rmNearestTiesToEven); 44043f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar 44053f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp = LHS_r; 44063f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven); 44073f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatImag() = Tmp; 44083f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp = LHS_i; 44093f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven); 44103f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatImag().add(Tmp, APFloat::rmNearestTiesToEven); 44113f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar } else { 4412f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexValue LHS = Result; 44131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.getComplexIntReal() = 44143f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar (LHS.getComplexIntReal() * RHS.getComplexIntReal() - 44153f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar LHS.getComplexIntImag() * RHS.getComplexIntImag()); 44161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.getComplexIntImag() = 44173f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar (LHS.getComplexIntReal() * RHS.getComplexIntImag() + 44183f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar LHS.getComplexIntImag() * RHS.getComplexIntReal()); 44193f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar } 44203f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar break; 442196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara case BO_Div: 442296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara if (Result.isComplexFloat()) { 442396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara ComplexValue LHS = Result; 442496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara APFloat &LHS_r = LHS.getComplexFloatReal(); 442596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara APFloat &LHS_i = LHS.getComplexFloatImag(); 442696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara APFloat &RHS_r = RHS.getComplexFloatReal(); 442796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara APFloat &RHS_i = RHS.getComplexFloatImag(); 442896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara APFloat &Res_r = Result.getComplexFloatReal(); 442996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara APFloat &Res_i = Result.getComplexFloatImag(); 443096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara 443196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara APFloat Den = RHS_r; 443296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Den.multiply(RHS_r, APFloat::rmNearestTiesToEven); 443396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara APFloat Tmp = RHS_i; 443496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven); 443596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Den.add(Tmp, APFloat::rmNearestTiesToEven); 443696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara 443796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Res_r = LHS_r; 443896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Res_r.multiply(RHS_r, APFloat::rmNearestTiesToEven); 443996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Tmp = LHS_i; 444096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven); 444196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Res_r.add(Tmp, APFloat::rmNearestTiesToEven); 444296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Res_r.divide(Den, APFloat::rmNearestTiesToEven); 444396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara 444496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Res_i = LHS_i; 444596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Res_i.multiply(RHS_r, APFloat::rmNearestTiesToEven); 444696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Tmp = LHS_r; 444796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven); 444896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Res_i.subtract(Tmp, APFloat::rmNearestTiesToEven); 444996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Res_i.divide(Den, APFloat::rmNearestTiesToEven); 445096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara } else { 4451f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (RHS.getComplexIntReal() == 0 && RHS.getComplexIntImag() == 0) 4452f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E, diag::note_expr_divide_by_zero); 4453f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 445496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara ComplexValue LHS = Result; 445596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara APSInt Den = RHS.getComplexIntReal() * RHS.getComplexIntReal() + 445696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara RHS.getComplexIntImag() * RHS.getComplexIntImag(); 445796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Result.getComplexIntReal() = 445896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara (LHS.getComplexIntReal() * RHS.getComplexIntReal() + 445996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara LHS.getComplexIntImag() * RHS.getComplexIntImag()) / Den; 446096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Result.getComplexIntImag() = 446196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara (LHS.getComplexIntImag() * RHS.getComplexIntReal() - 446296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara LHS.getComplexIntReal() * RHS.getComplexIntImag()) / Den; 446396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara } 446496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara break; 4465ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson } 4466ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 4467f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall return true; 4468ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson} 4469ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 447096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnarabool ComplexExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { 447196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara // Get the operand value into 'Result'. 447296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara if (!Visit(E->getSubExpr())) 447396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara return false; 447496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara 447596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara switch (E->getOpcode()) { 447696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara default: 4477f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return Error(E); 447896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara case UO_Extension: 447996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara return true; 448096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara case UO_Plus: 448196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara // The result is always just the subexpr. 448296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara return true; 448396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara case UO_Minus: 448496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara if (Result.isComplexFloat()) { 448596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Result.getComplexFloatReal().changeSign(); 448696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Result.getComplexFloatImag().changeSign(); 448796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara } 448896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara else { 448996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Result.getComplexIntReal() = -Result.getComplexIntReal(); 449096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Result.getComplexIntImag() = -Result.getComplexIntImag(); 449196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara } 449296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara return true; 449396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara case UO_Not: 449496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara if (Result.isComplexFloat()) 449596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Result.getComplexFloatImag().changeSign(); 449696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara else 449796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Result.getComplexIntImag() = -Result.getComplexIntImag(); 449896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara return true; 449996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara } 450096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara} 450196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara 45029ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===// 4503aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith// Void expression evaluation, primarily for a cast to void on the LHS of a 4504aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith// comma operator 4505aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith//===----------------------------------------------------------------------===// 4506aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith 4507aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smithnamespace { 4508aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smithclass VoidExprEvaluator 4509aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith : public ExprEvaluatorBase<VoidExprEvaluator, bool> { 4510aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smithpublic: 4511aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith VoidExprEvaluator(EvalInfo &Info) : ExprEvaluatorBaseTy(Info) {} 4512aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith 4513aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith bool Success(const CCValue &V, const Expr *e) { return true; } 4514aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith 4515aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith bool VisitCastExpr(const CastExpr *E) { 4516aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith switch (E->getCastKind()) { 4517aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith default: 4518aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith return ExprEvaluatorBaseTy::VisitCastExpr(E); 4519aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith case CK_ToVoid: 4520aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith VisitIgnoredValue(E->getSubExpr()); 4521aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith return true; 4522aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith } 4523aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith } 4524aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith}; 4525aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith} // end anonymous namespace 4526aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith 4527aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smithstatic bool EvaluateVoid(const Expr *E, EvalInfo &Info) { 4528aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith assert(E->isRValue() && E->getType()->isVoidType()); 4529aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith return VoidExprEvaluator(Info).Visit(E); 4530aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith} 4531aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith 4532aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith//===----------------------------------------------------------------------===// 453351f4708c00110940ca3f337961915f2ca1668375Richard Smith// Top level Expr::EvaluateAsRValue method. 4534f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 4535f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 453647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smithstatic bool Evaluate(CCValue &Result, EvalInfo &Info, const Expr *E) { 4537c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // In C, function designators are not lvalues, but we evaluate them as if they 4538c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // are. 4539c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (E->isGLValue() || E->getType()->isFunctionType()) { 4540c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith LValue LV; 4541c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!EvaluateLValue(E, LV, Info)) 4542c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return false; 4543c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith LV.moveInto(Result); 4544c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith } else if (E->getType()->isVectorType()) { 45451e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith if (!EvaluateVector(E, Result, Info)) 454659b5da6d853b4368b984700315adf7b37de05764Nate Begeman return false; 4547575a1c9dc8dc5b4977194993e289f9eda7295c39Douglas Gregor } else if (E->getType()->isIntegralOrEnumerationType()) { 45481e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith if (!IntExprEvaluator(Info, Result).Visit(E)) 45496dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 4550efdb83e26f9a1fd2566afe54461216cd84814d42John McCall } else if (E->getType()->hasPointerRepresentation()) { 4551efdb83e26f9a1fd2566afe54461216cd84814d42John McCall LValue LV; 4552efdb83e26f9a1fd2566afe54461216cd84814d42John McCall if (!EvaluatePointer(E, LV, Info)) 45536dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 45541e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith LV.moveInto(Result); 4555efdb83e26f9a1fd2566afe54461216cd84814d42John McCall } else if (E->getType()->isRealFloatingType()) { 4556efdb83e26f9a1fd2566afe54461216cd84814d42John McCall llvm::APFloat F(0.0); 4557efdb83e26f9a1fd2566afe54461216cd84814d42John McCall if (!EvaluateFloat(E, F, Info)) 45586dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 455947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Result = CCValue(F); 4560efdb83e26f9a1fd2566afe54461216cd84814d42John McCall } else if (E->getType()->isAnyComplexType()) { 4561efdb83e26f9a1fd2566afe54461216cd84814d42John McCall ComplexValue C; 4562efdb83e26f9a1fd2566afe54461216cd84814d42John McCall if (!EvaluateComplex(E, C, Info)) 4563660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump return false; 45641e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith C.moveInto(Result); 456569c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith } else if (E->getType()->isMemberPointerType()) { 4566e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MemberPtr P; 4567e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (!EvaluateMemberPointer(E, P, Info)) 4568e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return false; 4569e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith P.moveInto(Result); 4570e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return true; 457169c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith } else if (E->getType()->isArrayType() && E->getType()->isLiteralType()) { 4572180f47959a066795cc0f409433023af448bb0328Richard Smith LValue LV; 45731bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith LV.set(E, Info.CurrentCall); 4574180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateArray(E, LV, Info.CurrentCall->Temporaries[E], Info)) 4575cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return false; 4576180f47959a066795cc0f409433023af448bb0328Richard Smith Result = Info.CurrentCall->Temporaries[E]; 457769c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith } else if (E->getType()->isRecordType() && E->getType()->isLiteralType()) { 4578180f47959a066795cc0f409433023af448bb0328Richard Smith LValue LV; 45791bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smith LV.set(E, Info.CurrentCall); 4580180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateRecord(E, LV, Info.CurrentCall->Temporaries[E], Info)) 4581180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 4582180f47959a066795cc0f409433023af448bb0328Richard Smith Result = Info.CurrentCall->Temporaries[E]; 4583aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith } else if (E->getType()->isVoidType()) { 4584aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith if (!EvaluateVoid(E, Info)) 4585aa9c3503867bc52e1f61c4da676116db1b1cdf01Richard Smith return false; 4586f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } else { 4587dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Info.Diag(E->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); 4588660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump return false; 4589f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 4590660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump 4591660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump return true; 4592660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump} 4593660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump 459469c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith/// EvaluateConstantExpression - Evaluate an expression as a constant expression 459569c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith/// in-place in an APValue. In some cases, the in-place evaluation is essential, 459669c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith/// since later initializers for an object can indirectly refer to subobjects 459769c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith/// which were initialized earlier. 459869c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smithstatic bool EvaluateConstantExpression(APValue &Result, EvalInfo &Info, 4599180f47959a066795cc0f409433023af448bb0328Richard Smith const LValue &This, const Expr *E) { 460069c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith if (E->isRValue() && E->getType()->isLiteralType()) { 460169c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith // Evaluate arrays and record types in-place, so that later initializers can 460269c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith // refer to earlier-initialized members of the object. 4603180f47959a066795cc0f409433023af448bb0328Richard Smith if (E->getType()->isArrayType()) 4604180f47959a066795cc0f409433023af448bb0328Richard Smith return EvaluateArray(E, This, Result, Info); 4605180f47959a066795cc0f409433023af448bb0328Richard Smith else if (E->getType()->isRecordType()) 4606180f47959a066795cc0f409433023af448bb0328Richard Smith return EvaluateRecord(E, This, Result, Info); 460769c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith } 460869c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith 460969c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith // For any other type, in-place evaluation is unimportant. 461069c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith CCValue CoreConstResult; 461169c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith return Evaluate(CoreConstResult, Info, E) && 4612f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith CheckConstantExpression(Info, E, CoreConstResult, Result); 461369c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith} 461469c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith 4615f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith/// EvaluateAsRValue - Try to evaluate this expression, performing an implicit 4616f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith/// lvalue-to-rvalue cast if it is an lvalue. 4617f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithstatic bool EvaluateAsRValue(EvalInfo &Info, const Expr *E, APValue &Result) { 4618f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith CCValue Value; 4619f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!::Evaluate(Value, Info, E)) 4620f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 4621f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 4622f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (E->isGLValue()) { 4623f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith LValue LV; 4624f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith LV.setFrom(Value); 4625f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!HandleLValueToRValueConversion(Info, E, E->getType(), LV, Value)) 4626f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 4627f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 4628f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 4629f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // Check this core constant expression is a constant expression, and if so, 4630f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith // convert it to one. 4631f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return CheckConstantExpression(Info, E, Value, Result); 4632f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith} 4633c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 463451f4708c00110940ca3f337961915f2ca1668375Richard Smith/// EvaluateAsRValue - Return true if this is a constant which we can fold using 463556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// any crazy technique (that has nothing to do with language standards) that 463656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// we want to. If this function returns true, it returns the folded constant 4637c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// in Result. If this expression is a glvalue, an lvalue-to-rvalue conversion 4638c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// will be applied to the result. 463951f4708c00110940ca3f337961915f2ca1668375Richard Smithbool Expr::EvaluateAsRValue(EvalResult &Result, const ASTContext &Ctx) const { 4640ee19f43bf8973bfcccb7329e32a4198641767949Richard Smith // Fast-path evaluations of integer literals, since we sometimes see files 4641ee19f43bf8973bfcccb7329e32a4198641767949Richard Smith // containing vast quantities of these. 4642ee19f43bf8973bfcccb7329e32a4198641767949Richard Smith if (const IntegerLiteral *L = dyn_cast<IntegerLiteral>(this)) { 4643ee19f43bf8973bfcccb7329e32a4198641767949Richard Smith Result.Val = APValue(APSInt(L->getValue(), 4644ee19f43bf8973bfcccb7329e32a4198641767949Richard Smith L->getType()->isUnsignedIntegerType())); 4645ee19f43bf8973bfcccb7329e32a4198641767949Richard Smith return true; 4646ee19f43bf8973bfcccb7329e32a4198641767949Richard Smith } 4647ee19f43bf8973bfcccb7329e32a4198641767949Richard Smith 46481445bbacf4c8de5f208ff4ccb302424a4d9e233eRichard Smith // FIXME: Evaluating initializers for large arrays can cause performance 46491445bbacf4c8de5f208ff4ccb302424a4d9e233eRichard Smith // problems, and we don't use such values yet. Once we have a more efficient 46501445bbacf4c8de5f208ff4ccb302424a4d9e233eRichard Smith // array representation, this should be reinstated, and used by CodeGen. 4651e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith // The same problem affects large records. 4652e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (isRValue() && (getType()->isArrayType() || getType()->isRecordType()) && 4653e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith !Ctx.getLangOptions().CPlusPlus0x) 46541445bbacf4c8de5f208ff4ccb302424a4d9e233eRichard Smith return false; 46551445bbacf4c8de5f208ff4ccb302424a4d9e233eRichard Smith 4656180f47959a066795cc0f409433023af448bb0328Richard Smith // FIXME: If this is the initializer for an lvalue, pass that in. 4657f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith EvalInfo Info(Ctx, Result); 4658f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return ::EvaluateAsRValue(Info, this, Result.Val); 465956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall} 466056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 46614ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool Expr::EvaluateAsBooleanCondition(bool &Result, 46624ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const ASTContext &Ctx) const { 4663c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith EvalResult Scratch; 466451f4708c00110940ca3f337961915f2ca1668375Richard Smith return EvaluateAsRValue(Scratch, Ctx) && 4665177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith HandleConversionToBool(CCValue(Scratch.Val, CCValue::GlobalValue()), 466647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Result); 4667cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall} 4668cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall 4669a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smithbool Expr::EvaluateAsInt(APSInt &Result, const ASTContext &Ctx) const { 4670c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith EvalResult ExprResult; 467151f4708c00110940ca3f337961915f2ca1668375Richard Smith if (!EvaluateAsRValue(ExprResult, Ctx) || ExprResult.HasSideEffects || 4672f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith !ExprResult.Val.isInt()) 4673c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return false; 4674f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 4675c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith Result = ExprResult.Val.getInt(); 4676c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return true; 4677a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith} 4678a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith 46794ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool Expr::EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx) const { 46801b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson EvalInfo Info(Ctx, Result); 46811b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson 4682efdb83e26f9a1fd2566afe54461216cd84814d42John McCall LValue LV; 46839a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith return EvaluateLValue(this, LV, Info) && !Result.HasSideEffects && 4684f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith CheckLValueConstantExpression(Info, this, LV, Result.Val); 4685b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman} 4686b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman 468751f4708c00110940ca3f337961915f2ca1668375Richard Smith/// isEvaluatable - Call EvaluateAsRValue to see if this expression can be 468851f4708c00110940ca3f337961915f2ca1668375Richard Smith/// constant folded, but discard the result. 46894ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool Expr::isEvaluatable(const ASTContext &Ctx) const { 46904fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson EvalResult Result; 469151f4708c00110940ca3f337961915f2ca1668375Richard Smith return EvaluateAsRValue(Result, Ctx) && !Result.HasSideEffects; 469245b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner} 469351fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson 46944ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool Expr::HasSideEffects(const ASTContext &Ctx) const { 46951e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith return HasSideEffect(Ctx).Visit(this); 4696393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian} 4697393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian 4698a6b8b2c09610b8bc4330e948ece8b940c2386406Richard SmithAPSInt Expr::EvaluateKnownConstInt(const ASTContext &Ctx) const { 46991c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson EvalResult EvalResult; 470051f4708c00110940ca3f337961915f2ca1668375Richard Smith bool Result = EvaluateAsRValue(EvalResult, Ctx); 4701c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin (void)Result; 470251fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson assert(Result && "Could not evaluate expression"); 47031c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer"); 470451fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson 47051c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson return EvalResult.Val.getInt(); 470651fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson} 4707d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 4708e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara bool Expr::EvalResult::isGlobalLValue() const { 4709e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara assert(Val.isLValue()); 4710e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara return IsGlobalLValue(Val.getLValueBase()); 4711e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara } 4712e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara 4713e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara 4714d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// isIntegerConstantExpr - this recursive routine will test if an expression is 4715d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// an integer constant expression. 4716d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 4717d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// FIXME: Pass up a reason why! Invalid operation in i-c-e, division by zero, 4718d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// comma, etc 4719d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// 4720d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// FIXME: Handle offsetof. Two things to do: Handle GCC's __builtin_offsetof 4721d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// to support gcc 4.0+ and handle the idiom GCC recognizes with a null pointer 4722d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// cast+dereference. 4723d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 4724d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// CheckICE - This function does the fundamental ICE checking: the returned 4725d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// ICEDiag contains a Val of 0, 1, or 2, and a possibly null SourceLocation. 4726d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// Note that to reduce code duplication, this helper does no evaluation 4727d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// itself; the caller checks whether the expression is evaluatable, and 4728d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// in the rare cases where CheckICE actually cares about the evaluated 4729d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// value, it calls into Evalute. 4730d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// 4731d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// Meanings of Val: 473251f4708c00110940ca3f337961915f2ca1668375Richard Smith// 0: This expression is an ICE. 4733d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// 1: This expression is not an ICE, but if it isn't evaluated, it's 4734d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// a legal subexpression for an ICE. This return value is used to handle 4735d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// the comma operator in C99 mode. 4736d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// 2: This expression is not an ICE, and is not a legal subexpression for one. 4737d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 47383c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohmannamespace { 47393c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohman 4740d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCallstruct ICEDiag { 4741d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall unsigned Val; 4742d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall SourceLocation Loc; 4743d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 4744d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall public: 4745d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall ICEDiag(unsigned v, SourceLocation l) : Val(v), Loc(l) {} 4746d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall ICEDiag() : Val(0) {} 4747d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall}; 4748d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 47493c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohman} 47503c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohman 47513c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohmanstatic ICEDiag NoDiag() { return ICEDiag(); } 4752d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 4753d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCallstatic ICEDiag CheckEvalInICE(const Expr* E, ASTContext &Ctx) { 4754d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall Expr::EvalResult EVResult; 475551f4708c00110940ca3f337961915f2ca1668375Richard Smith if (!E->EvaluateAsRValue(EVResult, Ctx) || EVResult.HasSideEffects || 4756d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall !EVResult.Val.isInt()) { 4757d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 4758d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4759d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return NoDiag(); 4760d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall} 4761d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 4762d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCallstatic ICEDiag CheckICE(const Expr* E, ASTContext &Ctx) { 4763d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall assert(!E->isValueDependent() && "Should not see value dependent exprs!"); 47642ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor if (!E->getType()->isIntegralOrEnumerationType()) { 4765d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 4766d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4767d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 4768d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall switch (E->getStmtClass()) { 476963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall#define ABSTRACT_STMT(Node) 4770d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall#define STMT(Node, Base) case Expr::Node##Class: 4771d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall#define EXPR(Node, Base) 4772d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall#include "clang/AST/StmtNodes.inc" 4773d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::PredefinedExprClass: 4774d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::FloatingLiteralClass: 4775d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ImaginaryLiteralClass: 4776d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::StringLiteralClass: 4777d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ArraySubscriptExprClass: 4778d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::MemberExprClass: 4779d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CompoundAssignOperatorClass: 4780d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CompoundLiteralExprClass: 4781d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ExtVectorElementExprClass: 4782d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::DesignatedInitExprClass: 4783d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ImplicitValueInitExprClass: 4784d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ParenListExprClass: 4785d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::VAArgExprClass: 4786d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::AddrLabelExprClass: 4787d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::StmtExprClass: 4788d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXMemberCallExprClass: 4789e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne case Expr::CUDAKernelCallExprClass: 4790d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXDynamicCastExprClass: 4791d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXTypeidExprClass: 47929be88403e965cc49af76c9d33d818781d44b333eFrancois Pichet case Expr::CXXUuidofExprClass: 4793d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXNullPtrLiteralExprClass: 4794d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXThisExprClass: 4795d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXThrowExprClass: 4796d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXNewExprClass: 4797d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXDeleteExprClass: 4798d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXPseudoDestructorExprClass: 4799d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::UnresolvedLookupExprClass: 4800d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::DependentScopeDeclRefExprClass: 4801d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXConstructExprClass: 4802d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXBindTemporaryExprClass: 48034765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall case Expr::ExprWithCleanupsClass: 4804d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXTemporaryObjectExprClass: 4805d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXUnresolvedConstructExprClass: 4806d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXDependentScopeMemberExprClass: 4807d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::UnresolvedMemberExprClass: 4808d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ObjCStringLiteralClass: 4809d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ObjCEncodeExprClass: 4810d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ObjCMessageExprClass: 4811d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ObjCSelectorExprClass: 4812d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ObjCProtocolExprClass: 4813d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ObjCIvarRefExprClass: 4814d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ObjCPropertyRefExprClass: 4815d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ObjCIsaExprClass: 4816d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ShuffleVectorExprClass: 4817d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::BlockExprClass: 4818d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::BlockDeclRefExprClass: 4819d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::NoStmtClass: 48207cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall case Expr::OpaqueValueExprClass: 4821be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor case Expr::PackExpansionExprClass: 4822c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor case Expr::SubstNonTypeTemplateParmPackExprClass: 482361eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner case Expr::AsTypeExprClass: 4824f85e193739c953358c865005855253af4f68a497John McCall case Expr::ObjCIndirectCopyRestoreExprClass: 482503e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor case Expr::MaterializeTemporaryExprClass: 48264b9c2d235fb9449e249d74f48ecfec601650de93John McCall case Expr::PseudoObjectExprClass: 4827276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman case Expr::AtomicExprClass: 4828cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl case Expr::InitListExprClass: 4829cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl return ICEDiag(2, E->getLocStart()); 4830cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl 4831ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor case Expr::SizeOfPackExprClass: 4832d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::GNUNullExprClass: 4833d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // GCC considers the GNU __null value to be an integral constant expression. 4834d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return NoDiag(); 4835d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 483691a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall case Expr::SubstNonTypeTemplateParmExprClass: 483791a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall return 483891a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall CheckICE(cast<SubstNonTypeTemplateParmExpr>(E)->getReplacement(), Ctx); 483991a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall 4840d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ParenExprClass: 4841d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return CheckICE(cast<ParenExpr>(E)->getSubExpr(), Ctx); 4842f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne case Expr::GenericSelectionExprClass: 4843f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne return CheckICE(cast<GenericSelectionExpr>(E)->getResultExpr(), Ctx); 4844d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::IntegerLiteralClass: 4845d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CharacterLiteralClass: 4846d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXBoolLiteralExprClass: 4847ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor case Expr::CXXScalarValueInitExprClass: 4848d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::UnaryTypeTraitExprClass: 48496ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet case Expr::BinaryTypeTraitExprClass: 485021ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley case Expr::ArrayTypeTraitExprClass: 4851552622067dc45013d240f73952fece703f5e63bdJohn Wiegley case Expr::ExpressionTraitExprClass: 48522e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl case Expr::CXXNoexceptExprClass: 4853d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return NoDiag(); 4854d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CallExprClass: 48556cf750298d3621d8a10a6dd07fcee8e274b9d94dSean Hunt case Expr::CXXOperatorCallExprClass: { 485605830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // C99 6.6/3 allows function calls within unevaluated subexpressions of 485705830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // constant expressions, but they can never be ICEs because an ICE cannot 485805830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // contain an operand of (pointer to) function type. 4859d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall const CallExpr *CE = cast<CallExpr>(E); 4860180f47959a066795cc0f409433023af448bb0328Richard Smith if (CE->isBuiltinCall()) 4861d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return CheckEvalInICE(E, Ctx); 4862d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 4863d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4864d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::DeclRefExprClass: 4865d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (isa<EnumConstantDecl>(cast<DeclRefExpr>(E)->getDecl())) 4866d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return NoDiag(); 486703f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith if (Ctx.getLangOptions().CPlusPlus && IsConstNonVolatile(E->getType())) { 4868d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall const NamedDecl *D = cast<DeclRefExpr>(E)->getDecl(); 4869d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 4870d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // Parameter variables are never constants. Without this check, 4871d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // getAnyInitializer() can find a default argument, which leads 4872d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // to chaos. 4873d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (isa<ParmVarDecl>(D)) 4874d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, cast<DeclRefExpr>(E)->getLocation()); 4875d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 4876d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // C++ 7.1.5.1p2 4877d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // A variable of non-volatile const-qualified integral or enumeration 4878d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // type initialized by an ICE can be used in ICEs. 4879d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (const VarDecl *Dcl = dyn_cast<VarDecl>(D)) { 4880db1822c6de43ff4aa5fa00234bf8222f6f4816e8Richard Smith if (!Dcl->getType()->isIntegralOrEnumerationType()) 4881db1822c6de43ff4aa5fa00234bf8222f6f4816e8Richard Smith return ICEDiag(2, cast<DeclRefExpr>(E)->getLocation()); 4882db1822c6de43ff4aa5fa00234bf8222f6f4816e8Richard Smith 4883d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // Look for a declaration of this variable that has an initializer. 4884d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall const VarDecl *ID = 0; 4885d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall const Expr *Init = Dcl->getAnyInitializer(ID); 4886d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (Init) { 4887d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (ID->isInitKnownICE()) { 4888d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // We have already checked whether this subexpression is an 4889d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // integral constant expression. 4890d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (ID->isInitICE()) 4891d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return NoDiag(); 4892d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall else 4893d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, cast<DeclRefExpr>(E)->getLocation()); 4894d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4895d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 4896d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // It's an ICE whether or not the definition we found is 4897d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // out-of-line. See DR 721 and the discussion in Clang PR 4898d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // 6206 for details. 4899d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 4900d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (Dcl->isCheckingICE()) { 4901d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, cast<DeclRefExpr>(E)->getLocation()); 4902d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4903d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 4904d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall Dcl->setCheckingICE(); 4905d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall ICEDiag Result = CheckICE(Init, Ctx); 4906d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // Cache the result of the ICE test. 4907d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall Dcl->setInitKnownICE(Result.Val == 0); 4908d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return Result; 4909d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4910d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4911d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4912d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 4913d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::UnaryOperatorClass: { 4914d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall const UnaryOperator *Exp = cast<UnaryOperator>(E); 4915d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall switch (Exp->getOpcode()) { 49162de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_PostInc: 49172de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_PostDec: 49182de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_PreInc: 49192de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_PreDec: 49202de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_AddrOf: 49212de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Deref: 492205830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // C99 6.6/3 allows increment and decrement within unevaluated 492305830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // subexpressions of constant expressions, but they can never be ICEs 492405830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // because an ICE cannot contain an lvalue operand. 4925d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 49262de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Extension: 49272de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_LNot: 49282de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Plus: 49292de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Minus: 49302de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Not: 49312de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Real: 49322de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Imag: 4933d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return CheckICE(Exp->getSubExpr(), Ctx); 4934d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4935d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 4936d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // OffsetOf falls through here. 4937d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4938d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::OffsetOfExprClass: { 4939d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // Note that per C99, offsetof must be an ICE. And AFAIK, using 494051f4708c00110940ca3f337961915f2ca1668375Richard Smith // EvaluateAsRValue matches the proposed gcc behavior for cases like 494105830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // "offsetof(struct s{int x[4];}, x[1.0])". This doesn't affect 4942d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // compliance: we should warn earlier for offsetof expressions with 4943d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // array subscripts that aren't ICEs, and if the array subscripts 4944d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // are ICEs, the value of the offsetof must be an integer constant. 4945d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return CheckEvalInICE(E, Ctx); 4946d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4947f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case Expr::UnaryExprOrTypeTraitExprClass: { 4948f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne const UnaryExprOrTypeTraitExpr *Exp = cast<UnaryExprOrTypeTraitExpr>(E); 4949f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne if ((Exp->getKind() == UETT_SizeOf) && 4950f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne Exp->getTypeOfArgument()->isVariableArrayType()) 4951d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 4952d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return NoDiag(); 4953d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4954d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::BinaryOperatorClass: { 4955d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall const BinaryOperator *Exp = cast<BinaryOperator>(E); 4956d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall switch (Exp->getOpcode()) { 49572de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_PtrMemD: 49582de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_PtrMemI: 49592de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Assign: 49602de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_MulAssign: 49612de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_DivAssign: 49622de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_RemAssign: 49632de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_AddAssign: 49642de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_SubAssign: 49652de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_ShlAssign: 49662de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_ShrAssign: 49672de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_AndAssign: 49682de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_XorAssign: 49692de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_OrAssign: 497005830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // C99 6.6/3 allows assignments within unevaluated subexpressions of 497105830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // constant expressions, but they can never be ICEs because an ICE cannot 497205830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // contain an lvalue operand. 4973d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 4974d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 49752de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Mul: 49762de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Div: 49772de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Rem: 49782de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Add: 49792de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Sub: 49802de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Shl: 49812de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Shr: 49822de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LT: 49832de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_GT: 49842de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LE: 49852de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_GE: 49862de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_EQ: 49872de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_NE: 49882de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_And: 49892de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Xor: 49902de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Or: 49912de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Comma: { 4992d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall ICEDiag LHSResult = CheckICE(Exp->getLHS(), Ctx); 4993d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall ICEDiag RHSResult = CheckICE(Exp->getRHS(), Ctx); 49942de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (Exp->getOpcode() == BO_Div || 49952de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall Exp->getOpcode() == BO_Rem) { 499651f4708c00110940ca3f337961915f2ca1668375Richard Smith // EvaluateAsRValue gives an error for undefined Div/Rem, so make sure 4997d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // we don't evaluate one. 49983b332ab132fa85c83833d74d400f6e126f52fbd2John McCall if (LHSResult.Val == 0 && RHSResult.Val == 0) { 4999a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith llvm::APSInt REval = Exp->getRHS()->EvaluateKnownConstInt(Ctx); 5000d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (REval == 0) 5001d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(1, E->getLocStart()); 5002d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (REval.isSigned() && REval.isAllOnesValue()) { 5003a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith llvm::APSInt LEval = Exp->getLHS()->EvaluateKnownConstInt(Ctx); 5004d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (LEval.isMinSignedValue()) 5005d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(1, E->getLocStart()); 5006d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5007d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5008d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 50092de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (Exp->getOpcode() == BO_Comma) { 5010d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (Ctx.getLangOptions().C99) { 5011d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // C99 6.6p3 introduces a strange edge case: comma can be in an ICE 5012d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // if it isn't evaluated. 5013d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (LHSResult.Val == 0 && RHSResult.Val == 0) 5014d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(1, E->getLocStart()); 5015d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } else { 5016d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // In both C89 and C++, commas in ICEs are illegal. 5017d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 5018d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5019d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5020d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (LHSResult.Val >= RHSResult.Val) 5021d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return LHSResult; 5022d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return RHSResult; 5023d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 50242de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LAnd: 50252de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LOr: { 5026d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall ICEDiag LHSResult = CheckICE(Exp->getLHS(), Ctx); 5027d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall ICEDiag RHSResult = CheckICE(Exp->getRHS(), Ctx); 5028d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (LHSResult.Val == 0 && RHSResult.Val == 1) { 5029d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // Rare case where the RHS has a comma "side-effect"; we need 5030d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // to actually check the condition to see whether the side 5031d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // with the comma is evaluated. 50322de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if ((Exp->getOpcode() == BO_LAnd) != 5033a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith (Exp->getLHS()->EvaluateKnownConstInt(Ctx) == 0)) 5034d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return RHSResult; 5035d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return NoDiag(); 5036d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5037d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 5038d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (LHSResult.Val >= RHSResult.Val) 5039d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return LHSResult; 5040d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return RHSResult; 5041d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5042d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5043d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5044d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ImplicitCastExprClass: 5045d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CStyleCastExprClass: 5046d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXFunctionalCastExprClass: 5047d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXStaticCastExprClass: 5048d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXReinterpretCastExprClass: 504932cb47174304bc7ec11478b9497c4e10f48273d9Richard Smith case Expr::CXXConstCastExprClass: 5050f85e193739c953358c865005855253af4f68a497John McCall case Expr::ObjCBridgedCastExprClass: { 5051d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall const Expr *SubExpr = cast<CastExpr>(E)->getSubExpr(); 505298326ede499696f85d9f7bc1fbc7a628fc22f1ecRichard Smith if (isa<ExplicitCastExpr>(E) && 505332cb47174304bc7ec11478b9497c4e10f48273d9Richard Smith isa<FloatingLiteral>(SubExpr->IgnoreParenImpCasts())) 505432cb47174304bc7ec11478b9497c4e10f48273d9Richard Smith return NoDiag(); 5055eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman switch (cast<CastExpr>(E)->getCastKind()) { 5056eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman case CK_LValueToRValue: 5057eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman case CK_NoOp: 5058eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman case CK_IntegralToBoolean: 5059eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman case CK_IntegralCast: 5060d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return CheckICE(SubExpr, Ctx); 5061eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman default: 5062eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman return ICEDiag(2, E->getLocStart()); 5063eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman } 5064d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 506556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall case Expr::BinaryConditionalOperatorClass: { 506656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall const BinaryConditionalOperator *Exp = cast<BinaryConditionalOperator>(E); 506756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall ICEDiag CommonResult = CheckICE(Exp->getCommon(), Ctx); 506856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (CommonResult.Val == 2) return CommonResult; 506956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall ICEDiag FalseResult = CheckICE(Exp->getFalseExpr(), Ctx); 507056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (FalseResult.Val == 2) return FalseResult; 507156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (CommonResult.Val == 1) return CommonResult; 507256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (FalseResult.Val == 1 && 5073a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith Exp->getCommon()->EvaluateKnownConstInt(Ctx) == 0) return NoDiag(); 507456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return FalseResult; 507556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 5076d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ConditionalOperatorClass: { 5077d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall const ConditionalOperator *Exp = cast<ConditionalOperator>(E); 5078d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // If the condition (ignoring parens) is a __builtin_constant_p call, 5079d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // then only the true side is actually considered in an integer constant 5080d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // expression, and it is fully evaluated. This is an important GNU 5081d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // extension. See GCC PR38377 for discussion. 5082d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (const CallExpr *CallCE 5083d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall = dyn_cast<CallExpr>(Exp->getCond()->IgnoreParenCasts())) 5084180f47959a066795cc0f409433023af448bb0328Richard Smith if (CallCE->isBuiltinCall() == Builtin::BI__builtin_constant_p) { 5085d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall Expr::EvalResult EVResult; 508651f4708c00110940ca3f337961915f2ca1668375Richard Smith if (!E->EvaluateAsRValue(EVResult, Ctx) || EVResult.HasSideEffects || 5087d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall !EVResult.Val.isInt()) { 5088d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 5089d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5090d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return NoDiag(); 5091d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5092d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall ICEDiag CondResult = CheckICE(Exp->getCond(), Ctx); 5093d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (CondResult.Val == 2) 5094d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return CondResult; 509563fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor 5096f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith ICEDiag TrueResult = CheckICE(Exp->getTrueExpr(), Ctx); 5097f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith ICEDiag FalseResult = CheckICE(Exp->getFalseExpr(), Ctx); 509863fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor 5099d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (TrueResult.Val == 2) 5100d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return TrueResult; 5101d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (FalseResult.Val == 2) 5102d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return FalseResult; 5103d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (CondResult.Val == 1) 5104d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return CondResult; 5105d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (TrueResult.Val == 0 && FalseResult.Val == 0) 5106d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return NoDiag(); 5107d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // Rare case where the diagnostics depend on which side is evaluated 5108d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // Note that if we get here, CondResult is 0, and at least one of 5109d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // TrueResult and FalseResult is non-zero. 5110a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith if (Exp->getCond()->EvaluateKnownConstInt(Ctx) == 0) { 5111d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return FalseResult; 5112d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5113d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return TrueResult; 5114d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5115d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXDefaultArgExprClass: 5116d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return CheckICE(cast<CXXDefaultArgExpr>(E)->getExpr(), Ctx); 5117d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ChooseExprClass: { 5118d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return CheckICE(cast<ChooseExpr>(E)->getChosenSubExpr(Ctx), Ctx); 5119d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5120d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5121d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 5122d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // Silence a GCC warning 5123d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 5124d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall} 5125d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 5126f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith/// Evaluate an expression as a C++11 integral constant expression. 5127f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithstatic bool EvaluateCPlusPlus11IntegralConstantExpr(ASTContext &Ctx, 5128f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith const Expr *E, 5129f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith llvm::APSInt *Value, 5130f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith SourceLocation *Loc) { 5131f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!E->getType()->isIntegralOrEnumerationType()) { 5132f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (Loc) *Loc = E->getExprLoc(); 5133f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 5134f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 5135f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 5136f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith Expr::EvalResult Result; 5137dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith llvm::SmallVector<PartialDiagnosticAt, 8> Diags; 5138dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith Result.Diag = &Diags; 5139dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith EvalInfo Info(Ctx, Result); 5140dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith 5141dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith bool IsICE = EvaluateAsRValue(Info, E, Result.Val); 5142dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith if (!Diags.empty()) { 5143dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith IsICE = false; 5144dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith if (Loc) *Loc = Diags[0].first; 5145dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith } else if (!IsICE && Loc) { 5146dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith *Loc = E->getExprLoc(); 5147f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith } 5148dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith 5149dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith if (!IsICE) 5150dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith return false; 5151dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith 5152dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith assert(Result.Val.isInt() && "pointer cast to int is not an ICE"); 5153dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith if (Value) *Value = Result.Val.getInt(); 5154dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smith return true; 5155f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith} 5156f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 5157dd1f29b6d686899bfd033f26e16cb1621e5549e8Richard Smithbool Expr::isIntegerConstantExpr(ASTContext &Ctx, SourceLocation *Loc) const { 5158f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (Ctx.getLangOptions().CPlusPlus0x) 5159f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return EvaluateCPlusPlus11IntegralConstantExpr(Ctx, this, 0, Loc); 5160f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 5161d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall ICEDiag d = CheckICE(this, Ctx); 5162d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (d.Val != 0) { 5163d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (Loc) *Loc = d.Loc; 5164d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return false; 5165d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 5166f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return true; 5167f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith} 5168f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 5169f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smithbool Expr::isIntegerConstantExpr(llvm::APSInt &Value, ASTContext &Ctx, 5170f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith SourceLocation *Loc, bool isEvaluated) const { 5171f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (Ctx.getLangOptions().CPlusPlus0x) 5172f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return EvaluateCPlusPlus11IntegralConstantExpr(Ctx, this, &Value, Loc); 5173f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith 5174f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!isIntegerConstantExpr(Ctx, Loc)) 5175f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith return false; 5176f48fdb0937e67f691393f9ffdf75653e5128ea13Richard Smith if (!EvaluateAsInt(Value, Ctx)) 5177d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall llvm_unreachable("ICE cannot be evaluated!"); 5178d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return true; 5179d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall} 5180