ExprConstant.cpp revision 6142ca7790aa09a6e13592b70f142cc4bbcadcae
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 50180f47959a066795cc0f409433023af448bb0328Richard Smith /// Get an LValue path entry, which is known to not be an array index, as a 51180f47959a066795cc0f409433023af448bb0328Richard Smith /// field declaration. 52180f47959a066795cc0f409433023af448bb0328Richard Smith const FieldDecl *getAsField(APValue::LValuePathEntry E) { 53180f47959a066795cc0f409433023af448bb0328Richard Smith APValue::BaseOrMemberType Value; 54180f47959a066795cc0f409433023af448bb0328Richard Smith Value.setFromOpaqueValue(E.BaseOrMember); 55180f47959a066795cc0f409433023af448bb0328Richard Smith return dyn_cast<FieldDecl>(Value.getPointer()); 56180f47959a066795cc0f409433023af448bb0328Richard Smith } 57180f47959a066795cc0f409433023af448bb0328Richard Smith /// Get an LValue path entry, which is known to not be an array index, as a 58180f47959a066795cc0f409433023af448bb0328Richard Smith /// base class declaration. 59180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXRecordDecl *getAsBaseClass(APValue::LValuePathEntry E) { 60180f47959a066795cc0f409433023af448bb0328Richard Smith APValue::BaseOrMemberType Value; 61180f47959a066795cc0f409433023af448bb0328Richard Smith Value.setFromOpaqueValue(E.BaseOrMember); 62180f47959a066795cc0f409433023af448bb0328Richard Smith return dyn_cast<CXXRecordDecl>(Value.getPointer()); 63180f47959a066795cc0f409433023af448bb0328Richard Smith } 64180f47959a066795cc0f409433023af448bb0328Richard Smith /// Determine whether this LValue path entry for a base class names a virtual 65180f47959a066795cc0f409433023af448bb0328Richard Smith /// base class. 66180f47959a066795cc0f409433023af448bb0328Richard Smith bool isVirtualBaseClass(APValue::LValuePathEntry E) { 67180f47959a066795cc0f409433023af448bb0328Richard Smith APValue::BaseOrMemberType Value; 68180f47959a066795cc0f409433023af448bb0328Richard Smith Value.setFromOpaqueValue(E.BaseOrMember); 69180f47959a066795cc0f409433023af448bb0328Richard Smith return Value.getInt(); 70180f47959a066795cc0f409433023af448bb0328Richard Smith } 71180f47959a066795cc0f409433023af448bb0328Richard Smith 729a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith /// Determine whether the described subobject is an array element. 739a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith static bool SubobjectIsArrayElement(QualType Base, 749a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith ArrayRef<APValue::LValuePathEntry> Path) { 759a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith bool IsArrayElement = false; 769a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith const Type *T = Base.getTypePtr(); 779a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith for (unsigned I = 0, N = Path.size(); I != N; ++I) { 789a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith IsArrayElement = T && T->isArrayType(); 799a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith if (IsArrayElement) 809a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith T = T->getBaseElementTypeUnsafe(); 81180f47959a066795cc0f409433023af448bb0328Richard Smith else if (const FieldDecl *FD = getAsField(Path[I])) 829a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith T = FD->getType().getTypePtr(); 839a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith else 849a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith // Path[I] describes a base class. 859a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith T = 0; 869a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith } 879a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith return IsArrayElement; 889a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith } 899a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith 900a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith /// A path from a glvalue to a subobject of that glvalue. 910a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith struct SubobjectDesignator { 920a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith /// True if the subobject was named in a manner not supported by C++11. Such 930a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith /// lvalues can still be folded, but they are not core constant expressions 940a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith /// and we cannot perform lvalue-to-rvalue conversions on them. 950a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith bool Invalid : 1; 960a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith 970a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith /// Whether this designates an array element. 980a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith bool ArrayElement : 1; 990a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith 1000a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith /// Whether this designates 'one past the end' of the current subobject. 1010a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith bool OnePastTheEnd : 1; 1020a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith 1039a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith typedef APValue::LValuePathEntry PathEntry; 1049a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith 1050a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith /// The entries on the path from the glvalue to the designated subobject. 1060a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith SmallVector<PathEntry, 8> Entries; 1070a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith 1080a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith SubobjectDesignator() : 1090a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Invalid(false), ArrayElement(false), OnePastTheEnd(false) {} 1100a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith 1119a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith SubobjectDesignator(const APValue &V) : 1129a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith Invalid(!V.isLValue() || !V.hasLValuePath()), ArrayElement(false), 1139a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith OnePastTheEnd(false) { 1149a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith if (!Invalid) { 1159a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith ArrayRef<PathEntry> VEntries = V.getLValuePath(); 1169a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith Entries.insert(Entries.end(), VEntries.begin(), VEntries.end()); 1179a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith if (V.getLValueBase()) 1189a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith ArrayElement = SubobjectIsArrayElement(V.getLValueBase()->getType(), 1199a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith V.getLValuePath()); 1209a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith else 1219a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith assert(V.getLValuePath().empty() &&"Null pointer with nonempty path"); 1229a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith } 1239a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith } 1249a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith 1250a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith void setInvalid() { 1260a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Invalid = true; 1270a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Entries.clear(); 1280a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith } 1290a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith /// Update this designator to refer to the given element within this array. 1300a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith void addIndex(uint64_t N) { 1310a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (Invalid) return; 1320a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (OnePastTheEnd) { 1330a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith setInvalid(); 1340a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return; 1350a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith } 1360a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith PathEntry Entry; 1379a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith Entry.ArrayIndex = N; 1380a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Entries.push_back(Entry); 1390a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith ArrayElement = true; 1400a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith } 1410a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith /// Update this designator to refer to the given base or member of this 1420a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith /// object. 143180f47959a066795cc0f409433023af448bb0328Richard Smith void addDecl(const Decl *D, bool Virtual = false) { 1440a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (Invalid) return; 1450a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (OnePastTheEnd) { 1460a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith setInvalid(); 1470a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return; 1480a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith } 1490a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith PathEntry Entry; 150180f47959a066795cc0f409433023af448bb0328Richard Smith APValue::BaseOrMemberType Value(D, Virtual); 151180f47959a066795cc0f409433023af448bb0328Richard Smith Entry.BaseOrMember = Value.getOpaqueValue(); 1520a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Entries.push_back(Entry); 1530a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith ArrayElement = false; 1540a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith } 1550a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith /// Add N to the address of this subobject. 1560a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith void adjustIndex(uint64_t N) { 1570a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (Invalid) return; 1580a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (ArrayElement) { 159cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // FIXME: Make sure the index stays within bounds, or one past the end. 1609a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith Entries.back().ArrayIndex += N; 1610a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return; 1620a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith } 1630a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (OnePastTheEnd && N == (uint64_t)-1) 1640a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith OnePastTheEnd = false; 1650a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith else if (!OnePastTheEnd && N == 1) 1660a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith OnePastTheEnd = true; 1670a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith else if (N != 0) 1680a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith setInvalid(); 1690a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith } 1700a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith }; 1710a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith 17247a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith /// A core constant value. This can be the value of any constant expression, 17347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith /// or a pointer or reference to a non-static object or function parameter. 17447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith class CCValue : public APValue { 17547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith typedef llvm::APSInt APSInt; 17647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith typedef llvm::APFloat APFloat; 177177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith /// If the value is a reference or pointer into a parameter or temporary, 178177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith /// this is the corresponding call stack frame. 179177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith CallStackFrame *CallFrame; 1800a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith /// If the value is a reference or pointer, this is a description of how the 1810a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith /// subobject was specified. 1820a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith SubobjectDesignator Designator; 18347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith public: 184177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith struct GlobalValue {}; 185177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith 18647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue() {} 18747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith explicit CCValue(const APSInt &I) : APValue(I) {} 18847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith explicit CCValue(const APFloat &F) : APValue(F) {} 18947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue(const APValue *E, unsigned N) : APValue(E, N) {} 19047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue(const APSInt &R, const APSInt &I) : APValue(R, I) {} 19147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue(const APFloat &R, const APFloat &I) : APValue(R, I) {} 192177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith CCValue(const CCValue &V) : APValue(V), CallFrame(V.CallFrame) {} 1930a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith CCValue(const Expr *B, const CharUnits &O, CallStackFrame *F, 1940a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith const SubobjectDesignator &D) : 1959a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith APValue(B, O, APValue::NoLValuePath()), CallFrame(F), Designator(D) {} 196177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith CCValue(const APValue &V, GlobalValue) : 1979a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith APValue(V), CallFrame(0), Designator(V) {} 19847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith 199177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith CallStackFrame *getLValueFrame() const { 20047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith assert(getKind() == LValue); 201177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith return CallFrame; 20247a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith } 2030a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith SubobjectDesignator &getLValueDesignator() { 2040a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith assert(getKind() == LValue); 2050a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return Designator; 2060a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith } 2070a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith const SubobjectDesignator &getLValueDesignator() const { 2080a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return const_cast<CCValue*>(this)->getLValueDesignator(); 2090a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith } 21047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith }; 21147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith 212bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith /// A stack frame in the constexpr call stack. 213bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith struct CallStackFrame { 214bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith EvalInfo &Info; 215bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 216bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith /// Parent - The caller of this stack frame. 217bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith CallStackFrame *Caller; 218bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 219180f47959a066795cc0f409433023af448bb0328Richard Smith /// This - The binding for the this pointer in this call, if any. 220180f47959a066795cc0f409433023af448bb0328Richard Smith const LValue *This; 221180f47959a066795cc0f409433023af448bb0328Richard Smith 222bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith /// ParmBindings - Parameter bindings for this function call, indexed by 223bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith /// parameters' function scope indices. 224bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith const CCValue *Arguments; 225bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 226bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith typedef llvm::DenseMap<const Expr*, CCValue> MapTy; 227bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith typedef MapTy::const_iterator temp_iterator; 228bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith /// Temporaries - Temporary lvalues materialized within this stack frame. 229bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith MapTy Temporaries; 230bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 231180f47959a066795cc0f409433023af448bb0328Richard Smith CallStackFrame(EvalInfo &Info, const LValue *This, 232180f47959a066795cc0f409433023af448bb0328Richard Smith const CCValue *Arguments); 233bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith ~CallStackFrame(); 234bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith }; 235bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 236c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer struct EvalInfo { 237c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer const ASTContext &Ctx; 2381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2391e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith /// EvalStatus - Contains information about the evaluation. 2401e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith Expr::EvalStatus &EvalStatus; 241f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson 242d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith /// CurrentCall - The top of the constexpr call stack. 243bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith CallStackFrame *CurrentCall; 244d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 245d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith /// NumCalls - The number of calls we've evaluated so far. 246d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith unsigned NumCalls; 247d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 248d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith /// CallStackDepth - The number of calls in the call stack right now. 249d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith unsigned CallStackDepth; 250d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 25147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith typedef llvm::DenseMap<const OpaqueValueExpr*, CCValue> MapTy; 252bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith /// OpaqueValues - Values used as the common expression in a 253bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith /// BinaryConditionalOperator. 254c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer MapTy OpaqueValues; 255bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 256bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith /// BottomFrame - The frame in which evaluation started. This must be 257bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith /// initialized last. 258bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith CallStackFrame BottomFrame; 259bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 260180f47959a066795cc0f409433023af448bb0328Richard Smith /// EvaluatingDecl - This is the declaration whose initializer is being 261180f47959a066795cc0f409433023af448bb0328Richard Smith /// evaluated, if any. 262180f47959a066795cc0f409433023af448bb0328Richard Smith const VarDecl *EvaluatingDecl; 263180f47959a066795cc0f409433023af448bb0328Richard Smith 264180f47959a066795cc0f409433023af448bb0328Richard Smith /// EvaluatingDeclValue - This is the value being constructed for the 265180f47959a066795cc0f409433023af448bb0328Richard Smith /// declaration whose initializer is being evaluated, if any. 266180f47959a066795cc0f409433023af448bb0328Richard Smith APValue *EvaluatingDeclValue; 267180f47959a066795cc0f409433023af448bb0328Richard Smith 268bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 269bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith EvalInfo(const ASTContext &C, Expr::EvalStatus &S) 270bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith : Ctx(C), EvalStatus(S), CurrentCall(0), NumCalls(0), CallStackDepth(0), 271180f47959a066795cc0f409433023af448bb0328Richard Smith BottomFrame(*this, 0, 0), EvaluatingDecl(0), EvaluatingDeclValue(0) {} 272bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 27347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith const CCValue *getOpaqueValue(const OpaqueValueExpr *e) const { 274c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer MapTy::const_iterator i = OpaqueValues.find(e); 275c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer if (i == OpaqueValues.end()) return 0; 276c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer return &i->second; 277c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer } 27856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 279180f47959a066795cc0f409433023af448bb0328Richard Smith void setEvaluatingDecl(const VarDecl *VD, APValue &Value) { 280180f47959a066795cc0f409433023af448bb0328Richard Smith EvaluatingDecl = VD; 281180f47959a066795cc0f409433023af448bb0328Richard Smith EvaluatingDeclValue = &Value; 282180f47959a066795cc0f409433023af448bb0328Richard Smith } 283180f47959a066795cc0f409433023af448bb0328Richard Smith 284f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith const LangOptions &getLangOpts() { return Ctx.getLangOptions(); } 285c54061a679d8db4169438b2f97f81e3f443c6a25Benjamin Kramer }; 28687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 287180f47959a066795cc0f409433023af448bb0328Richard Smith CallStackFrame::CallStackFrame(EvalInfo &Info, const LValue *This, 288180f47959a066795cc0f409433023af448bb0328Richard Smith const CCValue *Arguments) 289180f47959a066795cc0f409433023af448bb0328Richard Smith : Info(Info), Caller(Info.CurrentCall), This(This), Arguments(Arguments) { 290bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith Info.CurrentCall = this; 291bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith ++Info.CallStackDepth; 292bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith } 293d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 294bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith CallStackFrame::~CallStackFrame() { 295bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith assert(Info.CurrentCall == this && "calls retired out of order"); 296bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith --Info.CallStackDepth; 297bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith Info.CurrentCall = Caller; 298bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith } 299d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 300f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall struct ComplexValue { 301f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall private: 302f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall bool IsInt; 303f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall 304f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall public: 305f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall APSInt IntReal, IntImag; 306f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall APFloat FloatReal, FloatImag; 307f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall 308f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexValue() : FloatReal(APFloat::Bogus), FloatImag(APFloat::Bogus) {} 309f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall 310f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall void makeComplexFloat() { IsInt = false; } 311f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall bool isComplexFloat() const { return !IsInt; } 312f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall APFloat &getComplexFloatReal() { return FloatReal; } 313f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall APFloat &getComplexFloatImag() { return FloatImag; } 314f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall 315f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall void makeComplexInt() { IsInt = true; } 316f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall bool isComplexInt() const { return IsInt; } 317f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall APSInt &getComplexIntReal() { return IntReal; } 318f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall APSInt &getComplexIntImag() { return IntImag; } 319f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall 32047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith void moveInto(CCValue &v) const { 321f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall if (isComplexFloat()) 32247a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith v = CCValue(FloatReal, FloatImag); 323f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall else 32447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith v = CCValue(IntReal, IntImag); 325f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall } 32647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith void setFrom(const CCValue &v) { 32756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall assert(v.isComplexFloat() || v.isComplexInt()); 32856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (v.isComplexFloat()) { 32956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall makeComplexFloat(); 33056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall FloatReal = v.getComplexFloatReal(); 33156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall FloatImag = v.getComplexFloatImag(); 33256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } else { 33356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall makeComplexInt(); 33456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall IntReal = v.getComplexIntReal(); 33556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall IntImag = v.getComplexIntImag(); 33656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 33756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 338f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall }; 339efdb83e26f9a1fd2566afe54461216cd84814d42John McCall 340efdb83e26f9a1fd2566afe54461216cd84814d42John McCall struct LValue { 3418cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne const Expr *Base; 342efdb83e26f9a1fd2566afe54461216cd84814d42John McCall CharUnits Offset; 343177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith CallStackFrame *Frame; 3440a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith SubobjectDesignator Designator; 345efdb83e26f9a1fd2566afe54461216cd84814d42John McCall 346625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith const Expr *getLValueBase() const { return Base; } 34747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CharUnits &getLValueOffset() { return Offset; } 348625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith const CharUnits &getLValueOffset() const { return Offset; } 349177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith CallStackFrame *getLValueFrame() const { return Frame; } 3500a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith SubobjectDesignator &getLValueDesignator() { return Designator; } 3510a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith const SubobjectDesignator &getLValueDesignator() const { return Designator;} 352efdb83e26f9a1fd2566afe54461216cd84814d42John McCall 35347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith void moveInto(CCValue &V) const { 3540a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith V = CCValue(Base, Offset, Frame, Designator); 355efdb83e26f9a1fd2566afe54461216cd84814d42John McCall } 35647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith void setFrom(const CCValue &V) { 35747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith assert(V.isLValue()); 35847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Base = V.getLValueBase(); 35947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Offset = V.getLValueOffset(); 360177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith Frame = V.getLValueFrame(); 3610a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Designator = V.getLValueDesignator(); 3620a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith } 3630a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith 3640a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith void setExpr(const Expr *E, CallStackFrame *F = 0) { 3650a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Base = E; 3660a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Offset = CharUnits::Zero(); 3670a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Frame = F; 3680a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Designator = SubobjectDesignator(); 36956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 370efdb83e26f9a1fd2566afe54461216cd84814d42John McCall }; 371f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall} 37287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 37347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smithstatic bool Evaluate(CCValue &Result, EvalInfo &Info, const Expr *E); 37469c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smithstatic bool EvaluateConstantExpression(APValue &Result, EvalInfo &Info, 375180f47959a066795cc0f409433023af448bb0328Richard Smith const LValue &This, const Expr *E); 376efdb83e26f9a1fd2566afe54461216cd84814d42John McCallstatic bool EvaluateLValue(const Expr *E, LValue &Result, EvalInfo &Info); 377efdb83e26f9a1fd2566afe54461216cd84814d42John McCallstatic bool EvaluatePointer(const Expr *E, LValue &Result, EvalInfo &Info); 37887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluateInteger(const Expr *E, APSInt &Result, EvalInfo &Info); 37947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smithstatic bool EvaluateIntegerOrLValue(const Expr *E, CCValue &Result, 380d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner EvalInfo &Info); 381d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr *E, APFloat &Result, EvalInfo &Info); 382f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCallstatic bool EvaluateComplex(const Expr *E, ComplexValue &Res, EvalInfo &Info); 383f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 384f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 3854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// Misc utilities 3864efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 3874efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 388180f47959a066795cc0f409433023af448bb0328Richard Smith/// Should this call expression be treated as a string literal? 389180f47959a066795cc0f409433023af448bb0328Richard Smithstatic bool IsStringLiteralCall(const CallExpr *E) { 390180f47959a066795cc0f409433023af448bb0328Richard Smith unsigned Builtin = E->isBuiltinCall(); 391180f47959a066795cc0f409433023af448bb0328Richard Smith return (Builtin == Builtin::BI__builtin___CFStringMakeConstantString || 392180f47959a066795cc0f409433023af448bb0328Richard Smith Builtin == Builtin::BI__builtin___NSStringMakeConstantString); 393180f47959a066795cc0f409433023af448bb0328Richard Smith} 394180f47959a066795cc0f409433023af448bb0328Richard Smith 395e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnarastatic bool IsGlobalLValue(const Expr* E) { 396180f47959a066795cc0f409433023af448bb0328Richard Smith // C++11 [expr.const]p3 An address constant expression is a prvalue core 397180f47959a066795cc0f409433023af448bb0328Richard Smith // constant expression of pointer type that evaluates to... 398180f47959a066795cc0f409433023af448bb0328Richard Smith 399180f47959a066795cc0f409433023af448bb0328Richard Smith // ... a null pointer value, or a prvalue core constant expression of type 400180f47959a066795cc0f409433023af448bb0328Richard Smith // std::nullptr_t. 40142c8f87eb60958170c46767273bf93e6c96125bfJohn McCall if (!E) return true; 40242c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 403180f47959a066795cc0f409433023af448bb0328Richard Smith switch (E->getStmtClass()) { 404180f47959a066795cc0f409433023af448bb0328Richard Smith default: 405180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 406180f47959a066795cc0f409433023af448bb0328Richard Smith case Expr::DeclRefExprClass: { 407180f47959a066795cc0f409433023af448bb0328Richard Smith const DeclRefExpr *DRE = cast<DeclRefExpr>(E); 408180f47959a066795cc0f409433023af448bb0328Richard Smith // ... the address of an object with static storage duration, 40942c8f87eb60958170c46767273bf93e6c96125bfJohn McCall if (const VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl())) 41042c8f87eb60958170c46767273bf93e6c96125bfJohn McCall return VD->hasGlobalStorage(); 411180f47959a066795cc0f409433023af448bb0328Richard Smith // ... to the address of a function, 412180f47959a066795cc0f409433023af448bb0328Richard Smith if (isa<FunctionDecl>(DRE->getDecl())) 413180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 41442c8f87eb60958170c46767273bf93e6c96125bfJohn McCall return false; 41542c8f87eb60958170c46767273bf93e6c96125bfJohn McCall } 416180f47959a066795cc0f409433023af448bb0328Richard Smith case Expr::CompoundLiteralExprClass: 417180f47959a066795cc0f409433023af448bb0328Richard Smith return cast<CompoundLiteralExpr>(E)->isFileScope(); 418180f47959a066795cc0f409433023af448bb0328Richard Smith // A string literal has static storage duration. 419180f47959a066795cc0f409433023af448bb0328Richard Smith case Expr::StringLiteralClass: 420180f47959a066795cc0f409433023af448bb0328Richard Smith case Expr::PredefinedExprClass: 421180f47959a066795cc0f409433023af448bb0328Richard Smith case Expr::ObjCStringLiteralClass: 422180f47959a066795cc0f409433023af448bb0328Richard Smith case Expr::ObjCEncodeExprClass: 423180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 424180f47959a066795cc0f409433023af448bb0328Richard Smith case Expr::CallExprClass: 425180f47959a066795cc0f409433023af448bb0328Richard Smith return IsStringLiteralCall(cast<CallExpr>(E)); 426180f47959a066795cc0f409433023af448bb0328Richard Smith // For GCC compatibility, &&label has static storage duration. 427180f47959a066795cc0f409433023af448bb0328Richard Smith case Expr::AddrLabelExprClass: 428180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 429180f47959a066795cc0f409433023af448bb0328Richard Smith // A Block literal expression may be used as the initialization value for 430180f47959a066795cc0f409433023af448bb0328Richard Smith // Block variables at global or local static scope. 431180f47959a066795cc0f409433023af448bb0328Richard Smith case Expr::BlockExprClass: 432180f47959a066795cc0f409433023af448bb0328Richard Smith return !cast<BlockExpr>(E)->getBlockDecl()->hasCaptures(); 433180f47959a066795cc0f409433023af448bb0328Richard Smith } 43442c8f87eb60958170c46767273bf93e6c96125bfJohn McCall} 43542c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 4369a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith/// Check that this reference or pointer core constant expression is a valid 4379a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith/// value for a constant expression. Type T should be either LValue or CCValue. 4389a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smithtemplate<typename T> 4399a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smithstatic bool CheckLValueConstantExpression(const T &LVal, APValue &Value) { 4409a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith if (!IsGlobalLValue(LVal.getLValueBase())) 44169c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith return false; 44269c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith 4439a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith const SubobjectDesignator &Designator = LVal.getLValueDesignator(); 4449a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith // A constant expression must refer to an object or be a null pointer. 4459a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith if (Designator.Invalid || Designator.OnePastTheEnd || 4469a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith (!LVal.getLValueBase() && !Designator.Entries.empty())) { 4479a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith // FIXME: Check for out-of-bounds array indices. 4489a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith // FIXME: This is not a constant expression. 4499a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith Value = APValue(LVal.getLValueBase(), LVal.getLValueOffset(), 4509a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith APValue::NoLValuePath()); 4519a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith return true; 4529a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith } 4539a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith 454180f47959a066795cc0f409433023af448bb0328Richard Smith // FIXME: Null references are not constant expressions. 455180f47959a066795cc0f409433023af448bb0328Richard Smith 4569a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith Value = APValue(LVal.getLValueBase(), LVal.getLValueOffset(), 4579a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith Designator.Entries); 45869c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith return true; 45947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith} 46047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith 4619a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith/// Check that this core constant expression value is a valid value for a 4629a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith/// constant expression, and if it is, produce the corresponding constant value. 4639a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smithstatic bool CheckConstantExpression(const CCValue &CCValue, APValue &Value) { 4649a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith if (!CCValue.isLValue()) { 4659a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith Value = CCValue; 4669a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith return true; 4679a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith } 4689a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith return CheckLValueConstantExpression(CCValue, Value); 4699a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith} 4709a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith 4719e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smithconst ValueDecl *GetLValueBaseDecl(const LValue &LVal) { 4729e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith if (!LVal.Base) 4739e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith return 0; 4749e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith 4759e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(LVal.Base)) 4769e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith return DRE->getDecl(); 4779e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith 4789e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith // FIXME: Static data members accessed via a MemberExpr are represented as 4799e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith // that MemberExpr. We should use the Decl directly instead. 4809e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith if (const MemberExpr *ME = dyn_cast<MemberExpr>(LVal.Base)) { 4819e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith assert(!isa<FieldDecl>(ME->getMemberDecl()) && "shouldn't see fields here"); 4829e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith return ME->getMemberDecl(); 4839e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith } 4849e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith 4859e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith return 0; 4869e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith} 4879e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith 4889e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smithstatic bool IsLiteralLValue(const LValue &Value) { 4899e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith return Value.Base && 4909e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith !isa<DeclRefExpr>(Value.Base) && 491bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith !isa<MemberExpr>(Value.Base) && 492bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith !isa<MaterializeTemporaryExpr>(Value.Base); 4939e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith} 4949e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith 49565ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smithstatic bool IsWeakDecl(const ValueDecl *Decl) { 4969e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith return Decl->hasAttr<WeakAttr>() || 4979e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith Decl->hasAttr<WeakRefAttr>() || 4989e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith Decl->isWeakImported(); 4999e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith} 5009e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith 50165ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smithstatic bool IsWeakLValue(const LValue &Value) { 50265ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith const ValueDecl *Decl = GetLValueBaseDecl(Value); 50365ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith return Decl && IsWeakDecl(Decl); 50465ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith} 50565ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith 506c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smithstatic bool EvalPointerValueAsBool(const LValue &Value, bool &Result) { 507efdb83e26f9a1fd2566afe54461216cd84814d42John McCall const Expr* Base = Value.Base; 508a7d3c04fcfe9d4af2f7758f46aef26b1a8f8ac09Rafael Espindola 5093554283157190e67918fad4221a5e6faf9317362John McCall // A null base expression indicates a null pointer. These are always 5103554283157190e67918fad4221a5e6faf9317362John McCall // evaluatable, and they are false unless the offset is zero. 5113554283157190e67918fad4221a5e6faf9317362John McCall if (!Base) { 5123554283157190e67918fad4221a5e6faf9317362John McCall Result = !Value.Offset.isZero(); 5133554283157190e67918fad4221a5e6faf9317362John McCall return true; 5143554283157190e67918fad4221a5e6faf9317362John McCall } 5153554283157190e67918fad4221a5e6faf9317362John McCall 51642c8f87eb60958170c46767273bf93e6c96125bfJohn McCall // Require the base expression to be a global l-value. 51747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith // FIXME: C++11 requires such conversions. Remove this check. 518e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara if (!IsGlobalLValue(Base)) return false; 51942c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 5203554283157190e67918fad4221a5e6faf9317362John McCall // We have a non-null base expression. These are generally known to 5213554283157190e67918fad4221a5e6faf9317362John McCall // be true, but if it'a decl-ref to a weak symbol it can be null at 5223554283157190e67918fad4221a5e6faf9317362John McCall // runtime. 5233554283157190e67918fad4221a5e6faf9317362John McCall Result = true; 5249e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith return !IsWeakLValue(Value); 5255bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman} 5265bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman 52747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smithstatic bool HandleConversionToBool(const CCValue &Val, bool &Result) { 528c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith switch (Val.getKind()) { 529c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case APValue::Uninitialized: 530c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return false; 531c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case APValue::Int: 532c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith Result = Val.getInt().getBoolValue(); 53341bf4f38348561a0f12c10d34f1673cd19a6eb04Richard Smith return true; 534c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case APValue::Float: 535c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith Result = !Val.getFloat().isZero(); 536a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman return true; 537c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case APValue::ComplexInt: 538c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith Result = Val.getComplexIntReal().getBoolValue() || 539c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith Val.getComplexIntImag().getBoolValue(); 540c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return true; 541c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case APValue::ComplexFloat: 542c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith Result = !Val.getComplexFloatReal().isZero() || 543c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith !Val.getComplexFloatImag().isZero(); 544436c8898cd1c93c5bacd3fcc4ac586bc5cd77062Richard Smith return true; 54547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith case APValue::LValue: { 54647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith LValue PointerResult; 54747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith PointerResult.setFrom(Val); 54847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith return EvalPointerValueAsBool(PointerResult, Result); 54947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith } 550c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case APValue::Vector: 551cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith case APValue::Array: 552180f47959a066795cc0f409433023af448bb0328Richard Smith case APValue::Struct: 553180f47959a066795cc0f409433023af448bb0328Richard Smith case APValue::Union: 554c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return false; 5554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 5564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 557c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith llvm_unreachable("unknown APValue kind"); 558c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith} 559c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 560c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smithstatic bool EvaluateAsBooleanCondition(const Expr *E, bool &Result, 561c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith EvalInfo &Info) { 562c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith assert(E->isRValue() && "missing lvalue-to-rvalue conv in bool condition"); 56347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue Val; 564c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!Evaluate(Val, Info, E)) 565c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return false; 566c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return HandleConversionToBool(Val, Result); 5674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 5684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 5691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APSInt HandleFloatToIntCast(QualType DestType, QualType SrcType, 5704ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad APFloat &Value, const ASTContext &Ctx) { 571a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar unsigned DestWidth = Ctx.getIntWidth(DestType); 572a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // Determine whether we are converting to unsigned or signed. 573575a1c9dc8dc5b4977194993e289f9eda7295c39Douglas Gregor bool DestSigned = DestType->isSignedIntegerOrEnumerationType(); 5741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 575a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // FIXME: Warning for overflow. 5763e1ef7849845a9e7bf79156bbb8a2c26d77a1d2eJeffrey Yasskin APSInt Result(DestWidth, !DestSigned); 577a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar bool ignored; 5783e1ef7849845a9e7bf79156bbb8a2c26d77a1d2eJeffrey Yasskin (void)Value.convertToInteger(Result, llvm::APFloat::rmTowardZero, &ignored); 5793e1ef7849845a9e7bf79156bbb8a2c26d77a1d2eJeffrey Yasskin return Result; 580a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 581a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 5821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APFloat HandleFloatToFloatCast(QualType DestType, QualType SrcType, 5834ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad APFloat &Value, const ASTContext &Ctx) { 584a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar bool ignored; 585a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat Result = Value; 5861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.convert(Ctx.getFloatTypeSemantics(DestType), 587a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat::rmNearestTiesToEven, &ignored); 588a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return Result; 589a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 590a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 5911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APSInt HandleIntToIntCast(QualType DestType, QualType SrcType, 5924ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad APSInt &Value, const ASTContext &Ctx) { 593a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar unsigned DestWidth = Ctx.getIntWidth(DestType); 594a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APSInt Result = Value; 595a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // Figure out if this is a truncate, extend or noop cast. 596a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // If the input is signed, do a sign extend, noop, or truncate. 5979f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad Result = Result.extOrTrunc(DestWidth); 598575a1c9dc8dc5b4977194993e289f9eda7295c39Douglas Gregor Result.setIsUnsigned(DestType->isUnsignedIntegerOrEnumerationType()); 599a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return Result; 600a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 601a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 6021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APFloat HandleIntToFloatCast(QualType DestType, QualType SrcType, 6034ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad APSInt &Value, const ASTContext &Ctx) { 604a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 605a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat Result(Ctx.getFloatTypeSemantics(DestType), 1); 606a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result.convertFromAPInt(Value, Value.isSigned(), 607a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat::rmNearestTiesToEven); 608a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return Result; 609a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 610a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 611180f47959a066795cc0f409433023af448bb0328Richard Smith/// If the given LValue refers to a base subobject of some object, find the most 612180f47959a066795cc0f409433023af448bb0328Richard Smith/// derived object and the corresponding complete record type. This is necessary 613180f47959a066795cc0f409433023af448bb0328Richard Smith/// in order to find the offset of a virtual base class. 614180f47959a066795cc0f409433023af448bb0328Richard Smithstatic bool ExtractMostDerivedObject(EvalInfo &Info, LValue &Result, 615180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXRecordDecl *&MostDerivedType) { 616180f47959a066795cc0f409433023af448bb0328Richard Smith SubobjectDesignator &D = Result.Designator; 617180f47959a066795cc0f409433023af448bb0328Richard Smith if (D.Invalid || !Result.Base) 618180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 619180f47959a066795cc0f409433023af448bb0328Richard Smith 620180f47959a066795cc0f409433023af448bb0328Richard Smith const Type *T = Result.Base->getType().getTypePtr(); 621180f47959a066795cc0f409433023af448bb0328Richard Smith 622180f47959a066795cc0f409433023af448bb0328Richard Smith // Find path prefix which leads to the most-derived subobject. 623180f47959a066795cc0f409433023af448bb0328Richard Smith unsigned MostDerivedPathLength = 0; 624180f47959a066795cc0f409433023af448bb0328Richard Smith MostDerivedType = T->getAsCXXRecordDecl(); 625180f47959a066795cc0f409433023af448bb0328Richard Smith bool MostDerivedIsArrayElement = false; 626180f47959a066795cc0f409433023af448bb0328Richard Smith 627180f47959a066795cc0f409433023af448bb0328Richard Smith for (unsigned I = 0, N = D.Entries.size(); I != N; ++I) { 628180f47959a066795cc0f409433023af448bb0328Richard Smith bool IsArray = T && T->isArrayType(); 629180f47959a066795cc0f409433023af448bb0328Richard Smith if (IsArray) 630180f47959a066795cc0f409433023af448bb0328Richard Smith T = T->getBaseElementTypeUnsafe(); 631180f47959a066795cc0f409433023af448bb0328Richard Smith else if (const FieldDecl *FD = getAsField(D.Entries[I])) 632180f47959a066795cc0f409433023af448bb0328Richard Smith T = FD->getType().getTypePtr(); 633180f47959a066795cc0f409433023af448bb0328Richard Smith else 634180f47959a066795cc0f409433023af448bb0328Richard Smith T = 0; 635180f47959a066795cc0f409433023af448bb0328Richard Smith 636180f47959a066795cc0f409433023af448bb0328Richard Smith if (T) { 637180f47959a066795cc0f409433023af448bb0328Richard Smith MostDerivedType = T->getAsCXXRecordDecl(); 638180f47959a066795cc0f409433023af448bb0328Richard Smith MostDerivedPathLength = I + 1; 639180f47959a066795cc0f409433023af448bb0328Richard Smith MostDerivedIsArrayElement = IsArray; 640180f47959a066795cc0f409433023af448bb0328Richard Smith } 641180f47959a066795cc0f409433023af448bb0328Richard Smith } 642180f47959a066795cc0f409433023af448bb0328Richard Smith 643180f47959a066795cc0f409433023af448bb0328Richard Smith if (!MostDerivedType) 644180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 645180f47959a066795cc0f409433023af448bb0328Richard Smith 646180f47959a066795cc0f409433023af448bb0328Richard Smith // (B*)&d + 1 has no most-derived object. 647180f47959a066795cc0f409433023af448bb0328Richard Smith if (D.OnePastTheEnd && MostDerivedPathLength != D.Entries.size()) 648180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 649180f47959a066795cc0f409433023af448bb0328Richard Smith 650180f47959a066795cc0f409433023af448bb0328Richard Smith // Remove the trailing base class path entries and their offsets. 651180f47959a066795cc0f409433023af448bb0328Richard Smith const RecordDecl *RD = MostDerivedType; 652180f47959a066795cc0f409433023af448bb0328Richard Smith for (unsigned I = MostDerivedPathLength, N = D.Entries.size(); I != N; ++I) { 653180f47959a066795cc0f409433023af448bb0328Richard Smith const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); 654180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXRecordDecl *Base = getAsBaseClass(D.Entries[I]); 655180f47959a066795cc0f409433023af448bb0328Richard Smith if (isVirtualBaseClass(D.Entries[I])) { 656180f47959a066795cc0f409433023af448bb0328Richard Smith assert(I == MostDerivedPathLength && 657180f47959a066795cc0f409433023af448bb0328Richard Smith "virtual base class must be immediately after most-derived class"); 658180f47959a066795cc0f409433023af448bb0328Richard Smith Result.Offset -= Layout.getVBaseClassOffset(Base); 659180f47959a066795cc0f409433023af448bb0328Richard Smith } else 660180f47959a066795cc0f409433023af448bb0328Richard Smith Result.Offset -= Layout.getBaseClassOffset(Base); 661180f47959a066795cc0f409433023af448bb0328Richard Smith RD = Base; 662180f47959a066795cc0f409433023af448bb0328Richard Smith } 663180f47959a066795cc0f409433023af448bb0328Richard Smith D.Entries.resize(MostDerivedPathLength); 664180f47959a066795cc0f409433023af448bb0328Richard Smith D.ArrayElement = MostDerivedIsArrayElement; 665180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 666180f47959a066795cc0f409433023af448bb0328Richard Smith} 667180f47959a066795cc0f409433023af448bb0328Richard Smith 668180f47959a066795cc0f409433023af448bb0328Richard Smithstatic void HandleLValueDirectBase(EvalInfo &Info, LValue &Obj, 669180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXRecordDecl *Derived, 670180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXRecordDecl *Base, 671180f47959a066795cc0f409433023af448bb0328Richard Smith const ASTRecordLayout *RL = 0) { 672180f47959a066795cc0f409433023af448bb0328Richard Smith if (!RL) RL = &Info.Ctx.getASTRecordLayout(Derived); 673180f47959a066795cc0f409433023af448bb0328Richard Smith Obj.getLValueOffset() += RL->getBaseClassOffset(Base); 674180f47959a066795cc0f409433023af448bb0328Richard Smith Obj.Designator.addDecl(Base, /*Virtual*/ false); 675180f47959a066795cc0f409433023af448bb0328Richard Smith} 676180f47959a066795cc0f409433023af448bb0328Richard Smith 677180f47959a066795cc0f409433023af448bb0328Richard Smithstatic bool HandleLValueBase(EvalInfo &Info, LValue &Obj, 678180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXRecordDecl *DerivedDecl, 679180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXBaseSpecifier *Base) { 680180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXRecordDecl *BaseDecl = Base->getType()->getAsCXXRecordDecl(); 681180f47959a066795cc0f409433023af448bb0328Richard Smith 682180f47959a066795cc0f409433023af448bb0328Richard Smith if (!Base->isVirtual()) { 683180f47959a066795cc0f409433023af448bb0328Richard Smith HandleLValueDirectBase(Info, Obj, DerivedDecl, BaseDecl); 684180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 685180f47959a066795cc0f409433023af448bb0328Richard Smith } 686180f47959a066795cc0f409433023af448bb0328Richard Smith 687180f47959a066795cc0f409433023af448bb0328Richard Smith // Extract most-derived object and corresponding type. 688180f47959a066795cc0f409433023af448bb0328Richard Smith if (!ExtractMostDerivedObject(Info, Obj, DerivedDecl)) 689180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 690180f47959a066795cc0f409433023af448bb0328Richard Smith 691180f47959a066795cc0f409433023af448bb0328Richard Smith const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(DerivedDecl); 692180f47959a066795cc0f409433023af448bb0328Richard Smith Obj.getLValueOffset() += Layout.getVBaseClassOffset(BaseDecl); 693180f47959a066795cc0f409433023af448bb0328Richard Smith Obj.Designator.addDecl(BaseDecl, /*Virtual*/ true); 694180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 695180f47959a066795cc0f409433023af448bb0328Richard Smith} 696180f47959a066795cc0f409433023af448bb0328Richard Smith 697180f47959a066795cc0f409433023af448bb0328Richard Smith/// Update LVal to refer to the given field, which must be a member of the type 698180f47959a066795cc0f409433023af448bb0328Richard Smith/// currently described by LVal. 699180f47959a066795cc0f409433023af448bb0328Richard Smithstatic void HandleLValueMember(EvalInfo &Info, LValue &LVal, 700180f47959a066795cc0f409433023af448bb0328Richard Smith const FieldDecl *FD, 701180f47959a066795cc0f409433023af448bb0328Richard Smith const ASTRecordLayout *RL = 0) { 702180f47959a066795cc0f409433023af448bb0328Richard Smith if (!RL) 703180f47959a066795cc0f409433023af448bb0328Richard Smith RL = &Info.Ctx.getASTRecordLayout(FD->getParent()); 704180f47959a066795cc0f409433023af448bb0328Richard Smith 705180f47959a066795cc0f409433023af448bb0328Richard Smith unsigned I = FD->getFieldIndex(); 706180f47959a066795cc0f409433023af448bb0328Richard Smith LVal.Offset += Info.Ctx.toCharUnitsFromBits(RL->getFieldOffset(I)); 707180f47959a066795cc0f409433023af448bb0328Richard Smith LVal.Designator.addDecl(FD); 708180f47959a066795cc0f409433023af448bb0328Richard Smith} 709180f47959a066795cc0f409433023af448bb0328Richard Smith 710180f47959a066795cc0f409433023af448bb0328Richard Smith/// Get the size of the given type in char units. 711180f47959a066795cc0f409433023af448bb0328Richard Smithstatic bool HandleSizeof(EvalInfo &Info, QualType Type, CharUnits &Size) { 712180f47959a066795cc0f409433023af448bb0328Richard Smith // sizeof(void), __alignof__(void), sizeof(function) = 1 as a gcc 713180f47959a066795cc0f409433023af448bb0328Richard Smith // extension. 714180f47959a066795cc0f409433023af448bb0328Richard Smith if (Type->isVoidType() || Type->isFunctionType()) { 715180f47959a066795cc0f409433023af448bb0328Richard Smith Size = CharUnits::One(); 716180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 717180f47959a066795cc0f409433023af448bb0328Richard Smith } 718180f47959a066795cc0f409433023af448bb0328Richard Smith 719180f47959a066795cc0f409433023af448bb0328Richard Smith if (!Type->isConstantSizeType()) { 720180f47959a066795cc0f409433023af448bb0328Richard Smith // sizeof(vla) is not a constantexpr: C99 6.5.3.4p2. 721180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 722180f47959a066795cc0f409433023af448bb0328Richard Smith } 723180f47959a066795cc0f409433023af448bb0328Richard Smith 724180f47959a066795cc0f409433023af448bb0328Richard Smith Size = Info.Ctx.getTypeSizeInChars(Type); 725180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 726180f47959a066795cc0f409433023af448bb0328Richard Smith} 727180f47959a066795cc0f409433023af448bb0328Richard Smith 728180f47959a066795cc0f409433023af448bb0328Richard Smith/// Update a pointer value to model pointer arithmetic. 729180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param Info - Information about the ongoing evaluation. 730180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param LVal - The pointer value to be updated. 731180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param EltTy - The pointee type represented by LVal. 732180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param Adjustment - The adjustment, in objects of type EltTy, to add. 733180f47959a066795cc0f409433023af448bb0328Richard Smithstatic bool HandleLValueArrayAdjustment(EvalInfo &Info, LValue &LVal, 734180f47959a066795cc0f409433023af448bb0328Richard Smith QualType EltTy, int64_t Adjustment) { 735180f47959a066795cc0f409433023af448bb0328Richard Smith CharUnits SizeOfPointee; 736180f47959a066795cc0f409433023af448bb0328Richard Smith if (!HandleSizeof(Info, EltTy, SizeOfPointee)) 737180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 738180f47959a066795cc0f409433023af448bb0328Richard Smith 739180f47959a066795cc0f409433023af448bb0328Richard Smith // Compute the new offset in the appropriate width. 740180f47959a066795cc0f409433023af448bb0328Richard Smith LVal.Offset += Adjustment * SizeOfPointee; 741180f47959a066795cc0f409433023af448bb0328Richard Smith LVal.Designator.adjustIndex(Adjustment); 742180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 743180f47959a066795cc0f409433023af448bb0328Richard Smith} 744180f47959a066795cc0f409433023af448bb0328Richard Smith 74503f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith/// Try to evaluate the initializer for a variable declaration. 746180f47959a066795cc0f409433023af448bb0328Richard Smithstatic bool EvaluateVarDeclInit(EvalInfo &Info, const Expr *E,const VarDecl *VD, 747177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith CallStackFrame *Frame, CCValue &Result) { 748d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith // If this is a parameter to an active constexpr function call, perform 749d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith // argument substitution. 750d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith if (const ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(VD)) { 751177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith if (!Frame || !Frame->Arguments) 752177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith return false; 753177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith Result = Frame->Arguments[PVD->getFunctionScopeIndex()]; 754177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith return true; 755d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith } 75603f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith 757180f47959a066795cc0f409433023af448bb0328Richard Smith // If we're currently evaluating the initializer of this declaration, use that 758180f47959a066795cc0f409433023af448bb0328Richard Smith // in-flight value. 759180f47959a066795cc0f409433023af448bb0328Richard Smith if (Info.EvaluatingDecl == VD) { 760180f47959a066795cc0f409433023af448bb0328Richard Smith Result = CCValue(*Info.EvaluatingDeclValue, CCValue::GlobalValue()); 761180f47959a066795cc0f409433023af448bb0328Richard Smith return !Result.isUninit(); 762180f47959a066795cc0f409433023af448bb0328Richard Smith } 763180f47959a066795cc0f409433023af448bb0328Richard Smith 76465ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith // Never evaluate the initializer of a weak variable. We can't be sure that 76565ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith // this is the definition which will be used. 76665ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith if (IsWeakDecl(VD)) 76765ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith return false; 76865ac598c7ba7e36f2ad611f2bb39cc957053be5dRichard Smith 76903f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith const Expr *Init = VD->getAnyInitializer(); 770db1822c6de43ff4aa5fa00234bf8222f6f4816e8Richard Smith if (!Init || Init->isValueDependent()) 77147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith return false; 77203f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith 77347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith if (APValue *V = VD->getEvaluatedValue()) { 774177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith Result = CCValue(*V, CCValue::GlobalValue()); 77547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith return !Result.isUninit(); 77647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith } 77703f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith 77803f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith if (VD->isEvaluatingValue()) 77947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith return false; 78003f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith 78103f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith VD->setEvaluatingValue(); 78203f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith 78347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Expr::EvalStatus EStatus; 78447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith EvalInfo InitInfo(Info.Ctx, EStatus); 785180f47959a066795cc0f409433023af448bb0328Richard Smith APValue EvalResult; 786180f47959a066795cc0f409433023af448bb0328Richard Smith InitInfo.setEvaluatingDecl(VD, EvalResult); 787180f47959a066795cc0f409433023af448bb0328Richard Smith LValue LVal; 788180f47959a066795cc0f409433023af448bb0328Richard Smith LVal.setExpr(E); 789c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // FIXME: The caller will need to know whether the value was a constant 790c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // expression. If not, we should propagate up a diagnostic. 791180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateConstantExpression(EvalResult, InitInfo, LVal, Init)) { 792cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // FIXME: If the evaluation failure was not permanent (for instance, if we 793cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // hit a variable with no declaration yet, or a constexpr function with no 794cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // definition yet), the standard is unclear as to how we should behave. 795cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // 796cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // Either the initializer should be evaluated when the variable is defined, 797cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // or a failed evaluation of the initializer should be reattempted each time 798cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // it is used. 79903f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith VD->setEvaluatedValue(APValue()); 80047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith return false; 80147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith } 80203f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith 80369c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith VD->setEvaluatedValue(EvalResult); 80469c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith Result = CCValue(EvalResult, CCValue::GlobalValue()); 80547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith return true; 80603f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith} 80703f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith 808c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smithstatic bool IsConstNonVolatile(QualType T) { 80903f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith Qualifiers Quals = T.getQualifiers(); 81003f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith return Quals.hasConst() && !Quals.hasVolatile(); 81103f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith} 81203f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith 813cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith/// Extract the designated sub-object of an rvalue. 814cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smithstatic bool ExtractSubobject(EvalInfo &Info, CCValue &Obj, QualType ObjType, 815cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith const SubobjectDesignator &Sub, QualType SubType) { 816cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith if (Sub.Invalid || Sub.OnePastTheEnd) 817cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return false; 818cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith if (Sub.Entries.empty()) { 819cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith assert(Info.Ctx.hasSameUnqualifiedType(ObjType, SubType) && 820cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith "Unexpected subobject type"); 821cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return true; 822cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith } 823cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 824cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith assert(!Obj.isLValue() && "extracting subobject of lvalue"); 825cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith const APValue *O = &Obj; 826180f47959a066795cc0f409433023af448bb0328Richard Smith // Walk the designator's path to find the subobject. 827cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith for (unsigned I = 0, N = Sub.Entries.size(); I != N; ++I) { 828cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith if (ObjType->isArrayType()) { 829180f47959a066795cc0f409433023af448bb0328Richard Smith // Next subobject is an array element. 830cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType(ObjType); 831cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith if (!CAT) 832cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return false; 833cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith uint64_t Index = Sub.Entries[I].ArrayIndex; 834cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith if (CAT->getSize().ule(Index)) 835cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return false; 836cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith if (O->getArrayInitializedElts() > Index) 837cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith O = &O->getArrayInitializedElt(Index); 838cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith else 839cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith O = &O->getArrayFiller(); 840cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith ObjType = CAT->getElementType(); 841180f47959a066795cc0f409433023af448bb0328Richard Smith } else if (const FieldDecl *Field = getAsField(Sub.Entries[I])) { 842180f47959a066795cc0f409433023af448bb0328Richard Smith // Next subobject is a class, struct or union field. 843180f47959a066795cc0f409433023af448bb0328Richard Smith RecordDecl *RD = ObjType->castAs<RecordType>()->getDecl(); 844180f47959a066795cc0f409433023af448bb0328Richard Smith if (RD->isUnion()) { 845180f47959a066795cc0f409433023af448bb0328Richard Smith const FieldDecl *UnionField = O->getUnionField(); 846180f47959a066795cc0f409433023af448bb0328Richard Smith if (!UnionField || 847180f47959a066795cc0f409433023af448bb0328Richard Smith UnionField->getCanonicalDecl() != Field->getCanonicalDecl()) 848180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 849180f47959a066795cc0f409433023af448bb0328Richard Smith O = &O->getUnionValue(); 850180f47959a066795cc0f409433023af448bb0328Richard Smith } else 851180f47959a066795cc0f409433023af448bb0328Richard Smith O = &O->getStructField(Field->getFieldIndex()); 852180f47959a066795cc0f409433023af448bb0328Richard Smith ObjType = Field->getType(); 853cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith } else { 854180f47959a066795cc0f409433023af448bb0328Richard Smith // Next subobject is a base class. 855180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXRecordDecl *RD = 856180f47959a066795cc0f409433023af448bb0328Richard Smith cast<CXXRecordDecl>(ObjType->castAs<RecordType>()->getDecl()); 857180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXRecordDecl *Base = 858180f47959a066795cc0f409433023af448bb0328Richard Smith getAsBaseClass(Sub.Entries[I])->getCanonicalDecl(); 859180f47959a066795cc0f409433023af448bb0328Richard Smith unsigned Index = 0; 860180f47959a066795cc0f409433023af448bb0328Richard Smith for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), 861180f47959a066795cc0f409433023af448bb0328Richard Smith E = RD->bases_end(); I != E; ++I, ++Index) { 862180f47959a066795cc0f409433023af448bb0328Richard Smith QualType BT = I->getType(); 863180f47959a066795cc0f409433023af448bb0328Richard Smith if (BT->castAs<RecordType>()->getDecl()->getCanonicalDecl() == Base) { 864180f47959a066795cc0f409433023af448bb0328Richard Smith O = &O->getStructBase(Index); 865180f47959a066795cc0f409433023af448bb0328Richard Smith ObjType = BT; 866180f47959a066795cc0f409433023af448bb0328Richard Smith break; 867180f47959a066795cc0f409433023af448bb0328Richard Smith } 868180f47959a066795cc0f409433023af448bb0328Richard Smith } 869180f47959a066795cc0f409433023af448bb0328Richard Smith if (Index == RD->getNumBases()) 870180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 871cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith } 872180f47959a066795cc0f409433023af448bb0328Richard Smith 873180f47959a066795cc0f409433023af448bb0328Richard Smith if (O->isUninit()) 874180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 875cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith } 876cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 877cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith assert(Info.Ctx.hasSameUnqualifiedType(ObjType, SubType) && 878cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith "Unexpected subobject type"); 879cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith Obj = CCValue(*O, CCValue::GlobalValue()); 880cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return true; 881cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith} 882cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 883180f47959a066795cc0f409433023af448bb0328Richard Smith/// HandleLValueToRValueConversion - Perform an lvalue-to-rvalue conversion on 884180f47959a066795cc0f409433023af448bb0328Richard Smith/// the given lvalue. This can also be used for 'lvalue-to-lvalue' conversions 885180f47959a066795cc0f409433023af448bb0328Richard Smith/// for looking up the glvalue referred to by an entity of reference type. 886180f47959a066795cc0f409433023af448bb0328Richard Smith/// 887180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param Info - Information about the ongoing evaluation. 888180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param Type - The type we expect this conversion to produce. 889180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param LVal - The glvalue on which we are attempting to perform this action. 890180f47959a066795cc0f409433023af448bb0328Richard Smith/// \param RVal - The produced value will be placed here. 891cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smithstatic bool HandleLValueToRValueConversion(EvalInfo &Info, QualType Type, 892cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith const LValue &LVal, CCValue &RVal) { 893c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith const Expr *Base = LVal.Base; 894177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith CallStackFrame *Frame = LVal.Frame; 895c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 896c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // FIXME: Indirection through a null pointer deserves a diagnostic. 897c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!Base) 898c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return false; 899c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 900625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith if (const ValueDecl *D = GetLValueBaseDecl(LVal)) { 901c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // In C++98, const, non-volatile integers initialized with ICEs are ICEs. 902c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // In C++11, constexpr, non-volatile variables initialized with constant 903d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith // expressions are constant expressions too. Inside constexpr functions, 904d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith // parameters are constant expressions even if they're non-const. 905c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // In C, such things can also be folded, although they are not ICEs. 906c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // 907d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith // FIXME: volatile-qualified ParmVarDecls need special handling. A literal 908d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith // interpretation of C++11 suggests that volatile parameters are OK if 909d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith // they're never read (there's no prohibition against constructing volatile 910d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith // objects in constant expressions), but lvalue-to-rvalue conversions on 911d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith // them are not permitted. 912c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith const VarDecl *VD = dyn_cast<VarDecl>(D); 9130a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith QualType VT = VD->getType(); 914cd689927139d3ab52c0c088521633c661bd2d807Richard Smith if (!VD || VD->isInvalidDecl()) 9150a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return false; 9160a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (!isa<ParmVarDecl>(VD)) { 9170a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (!IsConstNonVolatile(VT)) 9180a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return false; 919cd689927139d3ab52c0c088521633c661bd2d807Richard Smith // FIXME: Allow folding of values of any literal type in all languages. 920cd689927139d3ab52c0c088521633c661bd2d807Richard Smith if (!VT->isIntegralOrEnumerationType() && !VT->isRealFloatingType() && 921cd689927139d3ab52c0c088521633c661bd2d807Richard Smith !VD->isConstexpr()) 9220a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return false; 9230a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith } 924180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateVarDeclInit(Info, LVal.Base, VD, Frame, RVal)) 925c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return false; 926c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 92747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith if (isa<ParmVarDecl>(VD) || !VD->getAnyInitializer()->isLValue()) 928cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return ExtractSubobject(Info, RVal, VT, LVal.Designator, Type); 929c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 930c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // The declaration was initialized by an lvalue, with no lvalue-to-rvalue 931c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // conversion. This happens when the declaration and the lvalue should be 932c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // considered synonymous, for instance when initializing an array of char 933c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // from a string literal. Continue as if the initializer lvalue was the 934c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // value we were originally given. 9350a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith assert(RVal.getLValueOffset().isZero() && 9360a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith "offset for lvalue init of non-reference"); 93747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Base = RVal.getLValueBase(); 938177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith Frame = RVal.getLValueFrame(); 939c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith } 940c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 9410a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith // FIXME: Support PredefinedExpr, ObjCEncodeExpr, MakeStringConstant 9420a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (const StringLiteral *S = dyn_cast<StringLiteral>(Base)) { 9430a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith const SubobjectDesignator &Designator = LVal.Designator; 9440a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (Designator.Invalid || Designator.Entries.size() != 1) 9450a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return false; 9460a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith 9470a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith assert(Type->isIntegerType() && "string element not integer type"); 9489a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith uint64_t Index = Designator.Entries[0].ArrayIndex; 9490a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (Index > S->getLength()) 9500a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return false; 9510a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith APSInt Value(S->getCharByteWidth() * Info.Ctx.getCharWidth(), 9520a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Type->isUnsignedIntegerType()); 9530a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (Index < S->getLength()) 9540a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Value = S->getCodeUnit(Index); 9550a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith RVal = CCValue(Value); 9560a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return true; 9570a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith } 9580a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith 959177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith if (Frame) { 960cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // If this is a temporary expression with a nontrivial initializer, grab the 961cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // value from the relevant stack frame. 962177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith RVal = Frame->Temporaries[Base]; 963cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith } else if (const CompoundLiteralExpr *CLE 964cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith = dyn_cast<CompoundLiteralExpr>(Base)) { 965cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // In C99, a CompoundLiteralExpr is an lvalue, and we defer evaluating the 966cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // initializer until now for such expressions. Such an expression can't be 967cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // an ICE in C, so this only matters for fold. 968c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith assert(!Info.getLangOpts().CPlusPlus && "lvalue compound literal in c++?"); 969cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith if (!Evaluate(RVal, Info, CLE->getInitializer())) 970cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return false; 971cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith } else 972cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return false; 973c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 974cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return ExtractSubobject(Info, RVal, Base->getType(), LVal.Designator, Type); 975c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith} 976c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 977c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stumpnamespace { 978d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smithenum EvalStmtResult { 979d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith /// Evaluation failed. 980d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith ESR_Failed, 981d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith /// Hit a 'return' statement. 982d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith ESR_Returned, 983d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith /// Evaluation succeeded. 984d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith ESR_Succeeded 985d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith}; 986d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith} 987d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 988d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith// Evaluate a statement. 98947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smithstatic EvalStmtResult EvaluateStmt(CCValue &Result, EvalInfo &Info, 990d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith const Stmt *S) { 991d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith switch (S->getStmtClass()) { 992d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith default: 993d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith return ESR_Failed; 994d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 995d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith case Stmt::NullStmtClass: 996d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith case Stmt::DeclStmtClass: 997d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith return ESR_Succeeded; 998d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 999d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith case Stmt::ReturnStmtClass: 1000d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith if (Evaluate(Result, Info, cast<ReturnStmt>(S)->getRetValue())) 1001d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith return ESR_Returned; 1002d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith return ESR_Failed; 1003d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 1004d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith case Stmt::CompoundStmtClass: { 1005d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith const CompoundStmt *CS = cast<CompoundStmt>(S); 1006d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith for (CompoundStmt::const_body_iterator BI = CS->body_begin(), 1007d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith BE = CS->body_end(); BI != BE; ++BI) { 1008d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith EvalStmtResult ESR = EvaluateStmt(Result, Info, *BI); 1009d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith if (ESR != ESR_Succeeded) 1010d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith return ESR; 1011d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith } 1012d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith return ESR_Succeeded; 1013d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith } 1014d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith } 1015d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith} 1016d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 1017180f47959a066795cc0f409433023af448bb0328Richard Smithnamespace { 1018180f47959a066795cc0f409433023af448bb0328Richard Smithtypedef SmallVector<CCValue, 16> ArgVector; 1019180f47959a066795cc0f409433023af448bb0328Richard Smith} 1020180f47959a066795cc0f409433023af448bb0328Richard Smith 1021180f47959a066795cc0f409433023af448bb0328Richard Smith/// EvaluateArgs - Evaluate the arguments to a function call. 1022180f47959a066795cc0f409433023af448bb0328Richard Smithstatic bool EvaluateArgs(ArrayRef<const Expr*> Args, ArgVector &ArgValues, 1023180f47959a066795cc0f409433023af448bb0328Richard Smith EvalInfo &Info) { 1024180f47959a066795cc0f409433023af448bb0328Richard Smith for (ArrayRef<const Expr*>::iterator I = Args.begin(), E = Args.end(); 1025180f47959a066795cc0f409433023af448bb0328Richard Smith I != E; ++I) 1026180f47959a066795cc0f409433023af448bb0328Richard Smith if (!Evaluate(ArgValues[I - Args.begin()], Info, *I)) 1027180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1028180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 1029180f47959a066795cc0f409433023af448bb0328Richard Smith} 1030180f47959a066795cc0f409433023af448bb0328Richard Smith 1031d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith/// Evaluate a function call. 10326142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patelstatic bool HandleFunctionCall(ArrayRef<const Expr*> Args, const Stmt *Body, 10336142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel EvalInfo &Info, CCValue &Result) { 1034d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith // FIXME: Implement a proper call limit, along with a command-line flag. 1035d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith if (Info.NumCalls >= 1000000 || Info.CallStackDepth >= 512) 1036d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith return false; 1037d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 1038180f47959a066795cc0f409433023af448bb0328Richard Smith ArgVector ArgValues(Args.size()); 1039180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateArgs(Args, ArgValues, Info)) 1040180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1041d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 10426142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel // FIXME: Pass in 'this' for member functions. 10436142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel const LValue *This = 0; 1044180f47959a066795cc0f409433023af448bb0328Richard Smith CallStackFrame Frame(Info, This, ArgValues.data()); 1045d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith return EvaluateStmt(Result, Info, Body) == ESR_Returned; 1046d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith} 1047d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 1048180f47959a066795cc0f409433023af448bb0328Richard Smith/// Evaluate a constructor call. 10496142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patelstatic bool HandleConstructorCall(ArrayRef<const Expr*> Args, 1050180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXConstructorDecl *Definition, 10516142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel EvalInfo &Info, const LValue &This, 1052180f47959a066795cc0f409433023af448bb0328Richard Smith APValue &Result) { 1053180f47959a066795cc0f409433023af448bb0328Richard Smith if (Info.NumCalls >= 1000000 || Info.CallStackDepth >= 512) 1054180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1055180f47959a066795cc0f409433023af448bb0328Richard Smith 1056180f47959a066795cc0f409433023af448bb0328Richard Smith ArgVector ArgValues(Args.size()); 1057180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateArgs(Args, ArgValues, Info)) 1058180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1059180f47959a066795cc0f409433023af448bb0328Richard Smith 1060180f47959a066795cc0f409433023af448bb0328Richard Smith CallStackFrame Frame(Info, &This, ArgValues.data()); 1061180f47959a066795cc0f409433023af448bb0328Richard Smith 1062180f47959a066795cc0f409433023af448bb0328Richard Smith // If it's a delegating constructor, just delegate. 1063180f47959a066795cc0f409433023af448bb0328Richard Smith if (Definition->isDelegatingConstructor()) { 1064180f47959a066795cc0f409433023af448bb0328Richard Smith CXXConstructorDecl::init_const_iterator I = Definition->init_begin(); 1065180f47959a066795cc0f409433023af448bb0328Richard Smith return EvaluateConstantExpression(Result, Info, This, (*I)->getInit()); 1066180f47959a066795cc0f409433023af448bb0328Richard Smith } 1067180f47959a066795cc0f409433023af448bb0328Richard Smith 1068180f47959a066795cc0f409433023af448bb0328Richard Smith // Reserve space for the struct members. 1069180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXRecordDecl *RD = Definition->getParent(); 1070180f47959a066795cc0f409433023af448bb0328Richard Smith if (!RD->isUnion()) 1071180f47959a066795cc0f409433023af448bb0328Richard Smith Result = APValue(APValue::UninitStruct(), RD->getNumBases(), 1072180f47959a066795cc0f409433023af448bb0328Richard Smith std::distance(RD->field_begin(), RD->field_end())); 1073180f47959a066795cc0f409433023af448bb0328Richard Smith 1074180f47959a066795cc0f409433023af448bb0328Richard Smith const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); 1075180f47959a066795cc0f409433023af448bb0328Richard Smith 1076180f47959a066795cc0f409433023af448bb0328Richard Smith unsigned BasesSeen = 0; 1077180f47959a066795cc0f409433023af448bb0328Richard Smith#ifndef NDEBUG 1078180f47959a066795cc0f409433023af448bb0328Richard Smith CXXRecordDecl::base_class_const_iterator BaseIt = RD->bases_begin(); 1079180f47959a066795cc0f409433023af448bb0328Richard Smith#endif 1080180f47959a066795cc0f409433023af448bb0328Richard Smith for (CXXConstructorDecl::init_const_iterator I = Definition->init_begin(), 1081180f47959a066795cc0f409433023af448bb0328Richard Smith E = Definition->init_end(); I != E; ++I) { 1082180f47959a066795cc0f409433023af448bb0328Richard Smith if ((*I)->isBaseInitializer()) { 1083180f47959a066795cc0f409433023af448bb0328Richard Smith QualType BaseType((*I)->getBaseClass(), 0); 1084180f47959a066795cc0f409433023af448bb0328Richard Smith#ifndef NDEBUG 1085180f47959a066795cc0f409433023af448bb0328Richard Smith // Non-virtual base classes are initialized in the order in the class 1086180f47959a066795cc0f409433023af448bb0328Richard Smith // definition. We cannot have a virtual base class for a literal type. 1087180f47959a066795cc0f409433023af448bb0328Richard Smith assert(!BaseIt->isVirtual() && "virtual base for literal type"); 1088180f47959a066795cc0f409433023af448bb0328Richard Smith assert(Info.Ctx.hasSameType(BaseIt->getType(), BaseType) && 1089180f47959a066795cc0f409433023af448bb0328Richard Smith "base class initializers not in expected order"); 1090180f47959a066795cc0f409433023af448bb0328Richard Smith ++BaseIt; 1091180f47959a066795cc0f409433023af448bb0328Richard Smith#endif 1092180f47959a066795cc0f409433023af448bb0328Richard Smith LValue Subobject = This; 1093180f47959a066795cc0f409433023af448bb0328Richard Smith HandleLValueDirectBase(Info, Subobject, RD, 1094180f47959a066795cc0f409433023af448bb0328Richard Smith BaseType->getAsCXXRecordDecl(), &Layout); 1095180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateConstantExpression(Result.getStructBase(BasesSeen++), Info, 1096180f47959a066795cc0f409433023af448bb0328Richard Smith Subobject, (*I)->getInit())) 1097180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1098180f47959a066795cc0f409433023af448bb0328Richard Smith } else if (FieldDecl *FD = (*I)->getMember()) { 1099180f47959a066795cc0f409433023af448bb0328Richard Smith LValue Subobject = This; 1100180f47959a066795cc0f409433023af448bb0328Richard Smith HandleLValueMember(Info, Subobject, FD, &Layout); 1101180f47959a066795cc0f409433023af448bb0328Richard Smith if (RD->isUnion()) { 1102180f47959a066795cc0f409433023af448bb0328Richard Smith Result = APValue(FD); 1103180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateConstantExpression(Result.getUnionValue(), Info, 1104180f47959a066795cc0f409433023af448bb0328Richard Smith Subobject, (*I)->getInit())) 1105180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1106180f47959a066795cc0f409433023af448bb0328Richard Smith } else if (!EvaluateConstantExpression( 1107180f47959a066795cc0f409433023af448bb0328Richard Smith Result.getStructField(FD->getFieldIndex()), 1108180f47959a066795cc0f409433023af448bb0328Richard Smith Info, Subobject, (*I)->getInit())) 1109180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1110180f47959a066795cc0f409433023af448bb0328Richard Smith } else { 1111180f47959a066795cc0f409433023af448bb0328Richard Smith // FIXME: handle indirect field initializers 1112180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1113180f47959a066795cc0f409433023af448bb0328Richard Smith } 1114180f47959a066795cc0f409433023af448bb0328Richard Smith } 1115180f47959a066795cc0f409433023af448bb0328Richard Smith 1116180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 1117180f47959a066795cc0f409433023af448bb0328Richard Smith} 1118180f47959a066795cc0f409433023af448bb0328Richard Smith 1119d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smithnamespace { 1120770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass HasSideEffect 11218cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : public ConstStmtVisitor<HasSideEffect, bool> { 11221e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith const ASTContext &Ctx; 1123c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stumppublic: 1124c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 11251e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith HasSideEffect(const ASTContext &C) : Ctx(C) {} 1126c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 1127c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump // Unhandled nodes conservatively default to having side effects. 11288cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitStmt(const Stmt *S) { 1129c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump return true; 1130c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump } 1131c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 11328cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitParenExpr(const ParenExpr *E) { return Visit(E->getSubExpr()); } 11338cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitGenericSelectionExpr(const GenericSelectionExpr *E) { 1134f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne return Visit(E->getResultExpr()); 1135f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne } 11368cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitDeclRefExpr(const DeclRefExpr *E) { 11371e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith if (Ctx.getCanonicalType(E->getType()).isVolatileQualified()) 1138c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump return true; 1139c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump return false; 1140c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump } 1141f85e193739c953358c865005855253af4f68a497John McCall bool VisitObjCIvarRefExpr(const ObjCIvarRefExpr *E) { 11421e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith if (Ctx.getCanonicalType(E->getType()).isVolatileQualified()) 1143f85e193739c953358c865005855253af4f68a497John McCall return true; 1144f85e193739c953358c865005855253af4f68a497John McCall return false; 1145f85e193739c953358c865005855253af4f68a497John McCall } 1146f85e193739c953358c865005855253af4f68a497John McCall bool VisitBlockDeclRefExpr (const BlockDeclRefExpr *E) { 11471e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith if (Ctx.getCanonicalType(E->getType()).isVolatileQualified()) 1148f85e193739c953358c865005855253af4f68a497John McCall return true; 1149f85e193739c953358c865005855253af4f68a497John McCall return false; 1150f85e193739c953358c865005855253af4f68a497John McCall } 1151f85e193739c953358c865005855253af4f68a497John McCall 1152c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump // We don't want to evaluate BlockExprs multiple times, as they generate 1153c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump // a ton of code. 11548cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitBlockExpr(const BlockExpr *E) { return true; } 11558cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitPredefinedExpr(const PredefinedExpr *E) { return false; } 11568cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) 1157c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump { return Visit(E->getInitializer()); } 11588cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitMemberExpr(const MemberExpr *E) { return Visit(E->getBase()); } 11598cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitIntegerLiteral(const IntegerLiteral *E) { return false; } 11608cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitFloatingLiteral(const FloatingLiteral *E) { return false; } 11618cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitStringLiteral(const StringLiteral *E) { return false; } 11628cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCharacterLiteral(const CharacterLiteral *E) { return false; } 11638cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *E) 1164f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne { return false; } 11658cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitArraySubscriptExpr(const ArraySubscriptExpr *E) 1166980ca220848d27ef55ef4c2d37423461a8ed0da3Mike Stump { return Visit(E->getLHS()) || Visit(E->getRHS()); } 11678cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitChooseExpr(const ChooseExpr *E) 11681e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith { return Visit(E->getChosenSubExpr(Ctx)); } 11698cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCastExpr(const CastExpr *E) { return Visit(E->getSubExpr()); } 11708cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitBinAssign(const BinaryOperator *E) { return true; } 11718cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCompoundAssignOperator(const BinaryOperator *E) { return true; } 11728cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitBinaryOperator(const BinaryOperator *E) 1173980ca220848d27ef55ef4c2d37423461a8ed0da3Mike Stump { return Visit(E->getLHS()) || Visit(E->getRHS()); } 11748cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitUnaryPreInc(const UnaryOperator *E) { return true; } 11758cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitUnaryPostInc(const UnaryOperator *E) { return true; } 11768cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitUnaryPreDec(const UnaryOperator *E) { return true; } 11778cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitUnaryPostDec(const UnaryOperator *E) { return true; } 11788cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitUnaryDeref(const UnaryOperator *E) { 11791e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith if (Ctx.getCanonicalType(E->getType()).isVolatileQualified()) 1180c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump return true; 1181980ca220848d27ef55ef4c2d37423461a8ed0da3Mike Stump return Visit(E->getSubExpr()); 1182c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump } 11838cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitUnaryOperator(const UnaryOperator *E) { return Visit(E->getSubExpr()); } 1184363ff23cfddb51abe4ee4212a6dd3c9b534fcc8bChris Lattner 1185363ff23cfddb51abe4ee4212a6dd3c9b534fcc8bChris Lattner // Has side effects if any element does. 11868cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitInitListExpr(const InitListExpr *E) { 1187363ff23cfddb51abe4ee4212a6dd3c9b534fcc8bChris Lattner for (unsigned i = 0, e = E->getNumInits(); i != e; ++i) 1188363ff23cfddb51abe4ee4212a6dd3c9b534fcc8bChris Lattner if (Visit(E->getInit(i))) return true; 11898cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne if (const Expr *filler = E->getArrayFiller()) 11904423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis return Visit(filler); 1191363ff23cfddb51abe4ee4212a6dd3c9b534fcc8bChris Lattner return false; 1192363ff23cfddb51abe4ee4212a6dd3c9b534fcc8bChris Lattner } 1193ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor 11948cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitSizeOfPackExpr(const SizeOfPackExpr *) { return false; } 1195c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump}; 1196c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 119756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallclass OpaqueValueEvaluation { 119856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall EvalInfo &info; 119956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall OpaqueValueExpr *opaqueValue; 120056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 120156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallpublic: 120256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall OpaqueValueEvaluation(EvalInfo &info, OpaqueValueExpr *opaqueValue, 120356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *value) 120456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall : info(info), opaqueValue(opaqueValue) { 120556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 120656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // If evaluation fails, fail immediately. 12071e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith if (!Evaluate(info.OpaqueValues[opaqueValue], info, value)) { 120856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall this->opaqueValue = 0; 120956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return; 121056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 121156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 121256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 121356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall bool hasError() const { return opaqueValue == 0; } 121456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 121556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall ~OpaqueValueEvaluation() { 12161e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith // FIXME: This will not work for recursive constexpr functions using opaque 12171e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith // values. Restore the former value. 121856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (opaqueValue) info.OpaqueValues.erase(opaqueValue); 121956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 122056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall}; 122156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 1222c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump} // end anonymous namespace 1223c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 12244efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 12258cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne// Generic Evaluation 12268cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne//===----------------------------------------------------------------------===// 12278cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournenamespace { 12288cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 12298cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournetemplate <class Derived, typename RetTy=void> 12308cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourneclass ExprEvaluatorBase 12318cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : public ConstStmtVisitor<Derived, RetTy> { 12328cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourneprivate: 123347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith RetTy DerivedSuccess(const CCValue &V, const Expr *E) { 12348cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return static_cast<Derived*>(this)->Success(V, E); 12358cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 12368cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy DerivedError(const Expr *E) { 12378cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return static_cast<Derived*>(this)->Error(E); 12388cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 1239f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith RetTy DerivedValueInitialization(const Expr *E) { 1240f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith return static_cast<Derived*>(this)->ValueInitialization(E); 1241f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith } 12428cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 12438cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourneprotected: 12448cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne EvalInfo &Info; 12458cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne typedef ConstStmtVisitor<Derived, RetTy> StmtVisitorTy; 12468cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne typedef ExprEvaluatorBase ExprEvaluatorBaseTy; 12478cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 1248f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith RetTy ValueInitialization(const Expr *E) { return DerivedError(E); } 1249f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith 12508cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournepublic: 12518cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne ExprEvaluatorBase(EvalInfo &Info) : Info(Info) {} 12528cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 12538cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitStmt(const Stmt *) { 1254b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Expression evaluator should not be called on stmts"); 12558cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 12568cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitExpr(const Expr *E) { 12578cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return DerivedError(E); 12588cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 12598cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 12608cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitParenExpr(const ParenExpr *E) 12618cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne { return StmtVisitorTy::Visit(E->getSubExpr()); } 12628cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitUnaryExtension(const UnaryOperator *E) 12638cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne { return StmtVisitorTy::Visit(E->getSubExpr()); } 12648cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitUnaryPlus(const UnaryOperator *E) 12658cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne { return StmtVisitorTy::Visit(E->getSubExpr()); } 12668cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitChooseExpr(const ChooseExpr *E) 12678cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne { return StmtVisitorTy::Visit(E->getChosenSubExpr(Info.Ctx)); } 12688cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitGenericSelectionExpr(const GenericSelectionExpr *E) 12698cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne { return StmtVisitorTy::Visit(E->getResultExpr()); } 127091a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall RetTy VisitSubstNonTypeTemplateParmExpr(const SubstNonTypeTemplateParmExpr *E) 127191a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall { return StmtVisitorTy::Visit(E->getReplacement()); } 12723d75ca836205856077c18e30e9447accbd85f751Richard Smith RetTy VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *E) 12733d75ca836205856077c18e30e9447accbd85f751Richard Smith { return StmtVisitorTy::Visit(E->getExpr()); } 12748cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 12758cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitBinaryConditionalOperator(const BinaryConditionalOperator *E) { 12768cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne OpaqueValueEvaluation opaque(Info, E->getOpaqueValue(), E->getCommon()); 12778cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne if (opaque.hasError()) 12788cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return DerivedError(E); 12798cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 12808cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool cond; 1281c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!EvaluateAsBooleanCondition(E->getCond(), cond, Info)) 12828cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return DerivedError(E); 12838cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 12848cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return StmtVisitorTy::Visit(cond ? E->getTrueExpr() : E->getFalseExpr()); 12858cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 12868cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 12878cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitConditionalOperator(const ConditionalOperator *E) { 12888cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool BoolResult; 1289c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!EvaluateAsBooleanCondition(E->getCond(), BoolResult, Info)) 12908cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return DerivedError(E); 12918cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 1292c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith Expr *EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr(); 12938cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return StmtVisitorTy::Visit(EvalExpr); 12948cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 12958cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 12968cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne RetTy VisitOpaqueValueExpr(const OpaqueValueExpr *E) { 129747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith const CCValue *Value = Info.getOpaqueValue(E); 129847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith if (!Value) 12998cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return (E->getSourceExpr() ? StmtVisitorTy::Visit(E->getSourceExpr()) 13008cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : DerivedError(E)); 130147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith return DerivedSuccess(*Value, E); 13028cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 1303f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith 1304d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith RetTy VisitCallExpr(const CallExpr *E) { 1305d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith const Expr *Callee = E->getCallee(); 1306d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith QualType CalleeType = Callee->getType(); 1307d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 13086142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel // FIXME: Handle the case where Callee is a (parenthesized) MemberExpr for a 13096142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel // non-static member function. 13106142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel if (CalleeType->isSpecificBuiltinType(BuiltinType::BoundMember)) 13116142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel return DerivedError(E); 13126c95787b25c72a1c2421e349ef3459912362714aRichard Smith 13136142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel if (!CalleeType->isFunctionType() && !CalleeType->isFunctionPointerType()) 13146142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel return DerivedError(E); 13156142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel 13166142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel CCValue Call; 13176142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel if (!Evaluate(Call, Info, Callee) || !Call.isLValue() || 13186142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel !Call.getLValueBase() || !Call.getLValueOffset().isZero()) 13196142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel return DerivedError(Callee); 13206142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel 13216142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel const FunctionDecl *FD = 0; 13226142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Call.getLValueBase())) 13236142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel FD = dyn_cast<FunctionDecl>(DRE->getDecl()); 13246142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel else if (const MemberExpr *ME = dyn_cast<MemberExpr>(Call.getLValueBase())) 1325d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith FD = dyn_cast<FunctionDecl>(ME->getMemberDecl()); 13266142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel if (!FD) 13276142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel return DerivedError(Callee); 1328d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 13296142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel // Don't call function pointers which have been cast to some other type. 13306142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel if (!Info.Ctx.hasSameType(CalleeType->getPointeeType(), FD->getType())) 13316142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel return DerivedError(E); 1332d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 1333d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith const FunctionDecl *Definition; 1334d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith Stmt *Body = FD->getBody(Definition); 133569c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith CCValue CCResult; 133669c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith APValue Result; 13376142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel llvm::ArrayRef<const Expr*> Args(E->getArgs(), E->getNumArgs()); 1338d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 1339d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith if (Body && Definition->isConstexpr() && !Definition->isInvalidDecl() && 13406142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel HandleFunctionCall(Args, Body, Info, CCResult) && 134169c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith CheckConstantExpression(CCResult, Result)) 134269c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith return DerivedSuccess(CCValue(Result, CCValue::GlobalValue()), E); 1343d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 1344d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith return DerivedError(E); 1345d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith } 1346d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 1347c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith RetTy VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) { 1348c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return StmtVisitorTy::Visit(E->getInitializer()); 1349c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith } 1350f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith RetTy VisitInitListExpr(const InitListExpr *E) { 1351f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith if (Info.getLangOpts().CPlusPlus0x) { 1352f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith if (E->getNumInits() == 0) 1353f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith return DerivedValueInitialization(E); 1354f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith if (E->getNumInits() == 1) 1355f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith return StmtVisitorTy::Visit(E->getInit(0)); 1356f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith } 1357f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith return DerivedError(E); 1358f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith } 1359f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith RetTy VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) { 1360f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith return DerivedValueInitialization(E); 1361f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith } 1362f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith RetTy VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr *E) { 1363f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith return DerivedValueInitialization(E); 1364f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith } 1365f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith 1366180f47959a066795cc0f409433023af448bb0328Richard Smith /// A member expression where the object is a prvalue is itself a prvalue. 1367180f47959a066795cc0f409433023af448bb0328Richard Smith RetTy VisitMemberExpr(const MemberExpr *E) { 1368180f47959a066795cc0f409433023af448bb0328Richard Smith assert(!E->isArrow() && "missing call to bound member function?"); 1369180f47959a066795cc0f409433023af448bb0328Richard Smith 1370180f47959a066795cc0f409433023af448bb0328Richard Smith CCValue Val; 1371180f47959a066795cc0f409433023af448bb0328Richard Smith if (!Evaluate(Val, Info, E->getBase())) 1372180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1373180f47959a066795cc0f409433023af448bb0328Richard Smith 1374180f47959a066795cc0f409433023af448bb0328Richard Smith QualType BaseTy = E->getBase()->getType(); 1375180f47959a066795cc0f409433023af448bb0328Richard Smith 1376180f47959a066795cc0f409433023af448bb0328Richard Smith const FieldDecl *FD = dyn_cast<FieldDecl>(E->getMemberDecl()); 1377180f47959a066795cc0f409433023af448bb0328Richard Smith if (!FD) return false; 1378180f47959a066795cc0f409433023af448bb0328Richard Smith assert(!FD->getType()->isReferenceType() && "prvalue reference?"); 1379180f47959a066795cc0f409433023af448bb0328Richard Smith assert(BaseTy->getAs<RecordType>()->getDecl()->getCanonicalDecl() == 1380180f47959a066795cc0f409433023af448bb0328Richard Smith FD->getParent()->getCanonicalDecl() && "record / field mismatch"); 1381180f47959a066795cc0f409433023af448bb0328Richard Smith 1382180f47959a066795cc0f409433023af448bb0328Richard Smith SubobjectDesignator Designator; 1383180f47959a066795cc0f409433023af448bb0328Richard Smith Designator.addDecl(FD); 1384180f47959a066795cc0f409433023af448bb0328Richard Smith 1385180f47959a066795cc0f409433023af448bb0328Richard Smith return ExtractSubobject(Info, Val, BaseTy, Designator, E->getType()) && 1386180f47959a066795cc0f409433023af448bb0328Richard Smith DerivedSuccess(Val, E); 1387180f47959a066795cc0f409433023af448bb0328Richard Smith } 1388180f47959a066795cc0f409433023af448bb0328Richard Smith 1389c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith RetTy VisitCastExpr(const CastExpr *E) { 1390c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith switch (E->getCastKind()) { 1391c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith default: 1392c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith break; 1393c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 1394c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case CK_NoOp: 1395c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return StmtVisitorTy::Visit(E->getSubExpr()); 1396c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 1397c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case CK_LValueToRValue: { 1398c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith LValue LVal; 1399c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (EvaluateLValue(E->getSubExpr(), LVal, Info)) { 140047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue RVal; 1401c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (HandleLValueToRValueConversion(Info, E->getType(), LVal, RVal)) 1402c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return DerivedSuccess(RVal, E); 1403c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith } 1404c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith break; 1405c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith } 1406c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith } 1407c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 1408c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return DerivedError(E); 1409c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith } 1410c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 14118327fad71da34492d82c532f42a58cb4baff81a3Richard Smith /// Visit a value which is evaluated, but whose value is ignored. 14128327fad71da34492d82c532f42a58cb4baff81a3Richard Smith void VisitIgnoredValue(const Expr *E) { 141347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue Scratch; 14148327fad71da34492d82c532f42a58cb4baff81a3Richard Smith if (!Evaluate(Scratch, Info, E)) 14158327fad71da34492d82c532f42a58cb4baff81a3Richard Smith Info.EvalStatus.HasSideEffects = true; 14168327fad71da34492d82c532f42a58cb4baff81a3Richard Smith } 14178cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne}; 14188cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 14198cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne} 14208cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 14218cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne//===----------------------------------------------------------------------===// 14224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// LValue Evaluation 1423c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// 1424c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// This is used for evaluating lvalues (in C and C++), xvalues (in C++11), 1425c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// function designators (in C), decl references to void objects (in C), and 1426c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// temporaries (if building with -Wno-address-of-temporary). 1427c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// 1428c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// LValue evaluation produces values comprising a base expression of one of the 1429c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// following types: 1430c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// * DeclRefExpr 1431c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// * MemberExpr for a static member 1432c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// * CompoundLiteralExpr in C 1433c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// * StringLiteral 1434c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// * PredefinedExpr 1435180f47959a066795cc0f409433023af448bb0328Richard Smith// * ObjCStringLiteralExpr 1436c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// * ObjCEncodeExpr 1437c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// * AddrLabelExpr 1438c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// * BlockExpr 1439c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// * CallExpr for a MakeStringConstant builtin 1440177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith// plus an offset in bytes. It can also produce lvalues referring to locals. In 1441177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith// that case, the Frame will point to a stack frame, and the Expr is used as a 1442177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith// key to find the relevant temporary's value. 14434efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 14444efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmannamespace { 1445770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass LValueExprEvaluator 14468cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : public ExprEvaluatorBase<LValueExprEvaluator, bool> { 1447efdb83e26f9a1fd2566afe54461216cd84814d42John McCall LValue &Result; 14480124839d7fb3d846795190ba2ccf3951f27784feChandler Carruth const Decl *PrevDecl; 1449efdb83e26f9a1fd2566afe54461216cd84814d42John McCall 14508cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool Success(const Expr *E) { 14510a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Result.setExpr(E); 1452efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return true; 1453efdb83e26f9a1fd2566afe54461216cd84814d42John McCall } 14544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanpublic: 14551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1456efdb83e26f9a1fd2566afe54461216cd84814d42John McCall LValueExprEvaluator(EvalInfo &info, LValue &Result) : 14570124839d7fb3d846795190ba2ccf3951f27784feChandler Carruth ExprEvaluatorBaseTy(info), Result(Result), PrevDecl(0) {} 14584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 145947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith bool Success(const CCValue &V, const Expr *E) { 14608cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne Result.setFrom(V); 14618cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return true; 14628cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 14638cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool Error(const Expr *E) { 1464efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return false; 14654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 14668ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 1467c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith bool VisitVarDecl(const Expr *E, const VarDecl *VD); 1468c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 14698cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitDeclRefExpr(const DeclRefExpr *E); 14708cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitPredefinedExpr(const PredefinedExpr *E) { return Success(E); } 1471bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith bool VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *E); 14728cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCompoundLiteralExpr(const CompoundLiteralExpr *E); 14738cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitMemberExpr(const MemberExpr *E); 14748cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitStringLiteral(const StringLiteral *E) { return Success(E); } 14758cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitObjCEncodeExpr(const ObjCEncodeExpr *E) { return Success(E); } 14768cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitArraySubscriptExpr(const ArraySubscriptExpr *E); 14778cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitUnaryDeref(const UnaryOperator *E); 14788cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 14798cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCastExpr(const CastExpr *E) { 148026bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson switch (E->getCastKind()) { 148126bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson default: 1482c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return ExprEvaluatorBaseTy::VisitCastExpr(E); 148326bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson 1484db924224b51b153f24fbe492102d4edebcbbb7f4Eli Friedman case CK_LValueBitCast: 14850a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (!Visit(E->getSubExpr())) 14860a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return false; 14870a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Result.Designator.setInvalid(); 14880a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return true; 1489db924224b51b153f24fbe492102d4edebcbbb7f4Eli Friedman 1490180f47959a066795cc0f409433023af448bb0328Richard Smith case CK_DerivedToBase: 1491180f47959a066795cc0f409433023af448bb0328Richard Smith case CK_UncheckedDerivedToBase: { 1492180f47959a066795cc0f409433023af448bb0328Richard Smith if (!Visit(E->getSubExpr())) 1493180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1494180f47959a066795cc0f409433023af448bb0328Richard Smith 1495180f47959a066795cc0f409433023af448bb0328Richard Smith // Now figure out the necessary offset to add to the base LV to get from 1496180f47959a066795cc0f409433023af448bb0328Richard Smith // the derived class to the base class. 1497180f47959a066795cc0f409433023af448bb0328Richard Smith QualType Type = E->getSubExpr()->getType(); 1498180f47959a066795cc0f409433023af448bb0328Richard Smith 1499180f47959a066795cc0f409433023af448bb0328Richard Smith for (CastExpr::path_const_iterator PathI = E->path_begin(), 1500180f47959a066795cc0f409433023af448bb0328Richard Smith PathE = E->path_end(); PathI != PathE; ++PathI) { 1501180f47959a066795cc0f409433023af448bb0328Richard Smith if (!HandleLValueBase(Info, Result, Type->getAsCXXRecordDecl(), *PathI)) 1502180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1503180f47959a066795cc0f409433023af448bb0328Richard Smith Type = (*PathI)->getType(); 1504180f47959a066795cc0f409433023af448bb0328Richard Smith } 1505180f47959a066795cc0f409433023af448bb0328Richard Smith 1506180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 1507180f47959a066795cc0f409433023af448bb0328Richard Smith } 150826bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson } 150926bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson } 1510cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl 1511ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman // FIXME: Missing: __real__, __imag__ 15128cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 15134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}; 15144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} // end anonymous namespace 15154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1516c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// Evaluate an expression as an lvalue. This can be legitimately called on 1517c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// expressions which are not glvalues, in a few cases: 1518c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// * function designators in C, 1519c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// * "extern void" objects, 1520c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// * temporaries, if building with -Wno-address-of-temporary. 1521efdb83e26f9a1fd2566afe54461216cd84814d42John McCallstatic bool EvaluateLValue(const Expr* E, LValue& Result, EvalInfo &Info) { 1522c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith assert((E->isGLValue() || E->getType()->isFunctionType() || 1523c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith E->getType()->isVoidType() || isa<CXXTemporaryObjectExpr>(E)) && 1524c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith "can't evaluate expression as an lvalue"); 15258cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return LValueExprEvaluator(Info, Result).Visit(E); 15264efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 15274efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 15288cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool LValueExprEvaluator::VisitDeclRefExpr(const DeclRefExpr *E) { 1529c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (isa<FunctionDecl>(E->getDecl())) 1530efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return Success(E); 1531c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (const VarDecl* VD = dyn_cast<VarDecl>(E->getDecl())) 1532c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return VisitVarDecl(E, VD); 1533c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return Error(E); 1534c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith} 1535436c8898cd1c93c5bacd3fcc4ac586bc5cd77062Richard Smith 1536c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smithbool LValueExprEvaluator::VisitVarDecl(const Expr *E, const VarDecl *VD) { 1537177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith if (!VD->getType()->isReferenceType()) { 1538177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith if (isa<ParmVarDecl>(VD)) { 15390a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Result.setExpr(E, Info.CurrentCall); 1540177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith return true; 1541177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith } 1542c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return Success(E); 1543177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith } 154450c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman 154547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue V; 1546180f47959a066795cc0f409433023af448bb0328Richard Smith if (EvaluateVarDeclInit(Info, E, VD, Info.CurrentCall, V)) 154747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith return Success(V, E); 1548c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 1549c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return Error(E); 155035873c49adad211ff466e34342a52665742794f5Anders Carlsson} 155135873c49adad211ff466e34342a52665742794f5Anders Carlsson 1552bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smithbool LValueExprEvaluator::VisitMaterializeTemporaryExpr( 1553bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith const MaterializeTemporaryExpr *E) { 1554180f47959a066795cc0f409433023af448bb0328Richard Smith Result.setExpr(E, Info.CurrentCall); 1555180f47959a066795cc0f409433023af448bb0328Richard Smith return EvaluateConstantExpression(Info.CurrentCall->Temporaries[E], Info, 1556180f47959a066795cc0f409433023af448bb0328Richard Smith Result, E->GetTemporaryExpr()); 1557bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith} 1558bd552efbeff3a64a1c400d2bba18f13f84abd8abRichard Smith 15598cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool 15608cad3046be06ea73ff8892d947697a21d7a440d3Peter CollingbourneLValueExprEvaluator::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) { 1561c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith assert(!Info.getLangOpts().CPlusPlus && "lvalue compound literal in c++?"); 1562c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // Defer visiting the literal until the lvalue-to-rvalue conversion. We can 1563c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // only see this when folding in C, so there's no standard to follow here. 1564efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return Success(E); 15654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 15664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 15678cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool LValueExprEvaluator::VisitMemberExpr(const MemberExpr *E) { 1568c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // Handle static data members. 1569c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (const VarDecl *VD = dyn_cast<VarDecl>(E->getMemberDecl())) { 1570c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith VisitIgnoredValue(E->getBase()); 1571c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return VisitVarDecl(E, VD); 1572c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith } 1573c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 1574d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith // Handle static member functions. 1575d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(E->getMemberDecl())) { 1576d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith if (MD->isStatic()) { 1577d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith VisitIgnoredValue(E->getBase()); 1578d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith return Success(E); 1579d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith } 1580d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith } 1581d0dcceae2a8ca0e37b5dd471a704de8583d49c95Richard Smith 1582180f47959a066795cc0f409433023af448bb0328Richard Smith // Handle non-static data members. 1583180f47959a066795cc0f409433023af448bb0328Richard Smith QualType BaseTy; 15844efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (E->isArrow()) { 1585efdb83e26f9a1fd2566afe54461216cd84814d42John McCall if (!EvaluatePointer(E->getBase(), Result, Info)) 1586efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return false; 1587180f47959a066795cc0f409433023af448bb0328Richard Smith BaseTy = E->getBase()->getType()->getAs<PointerType>()->getPointeeType(); 15884efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } else { 1589efdb83e26f9a1fd2566afe54461216cd84814d42John McCall if (!Visit(E->getBase())) 1590efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return false; 1591180f47959a066795cc0f409433023af448bb0328Richard Smith BaseTy = E->getBase()->getType(); 15924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 15934efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 15948cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne const FieldDecl *FD = dyn_cast<FieldDecl>(E->getMemberDecl()); 1595180f47959a066795cc0f409433023af448bb0328Richard Smith if (!FD) return false; 1596180f47959a066795cc0f409433023af448bb0328Richard Smith assert(BaseTy->getAs<RecordType>()->getDecl()->getCanonicalDecl() == 1597180f47959a066795cc0f409433023af448bb0328Richard Smith FD->getParent()->getCanonicalDecl() && "record / field mismatch"); 1598180f47959a066795cc0f409433023af448bb0328Richard Smith (void)BaseTy; 15992be586108bb401019647791feca19ea03fd477ceEli Friedman 1600180f47959a066795cc0f409433023af448bb0328Richard Smith HandleLValueMember(Info, Result, FD); 16012be586108bb401019647791feca19ea03fd477ceEli Friedman 1602180f47959a066795cc0f409433023af448bb0328Richard Smith if (FD->getType()->isReferenceType()) { 1603180f47959a066795cc0f409433023af448bb0328Richard Smith CCValue RefValue; 1604180f47959a066795cc0f409433023af448bb0328Richard Smith if (!HandleLValueToRValueConversion(Info, FD->getType(), Result, RefValue)) 1605180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1606180f47959a066795cc0f409433023af448bb0328Richard Smith return Success(RefValue, E); 1607180f47959a066795cc0f409433023af448bb0328Richard Smith } 1608efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return true; 16094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 16104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 16118cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool LValueExprEvaluator::VisitArraySubscriptExpr(const ArraySubscriptExpr *E) { 1612c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // FIXME: Deal with vectors as array subscript bases. 1613c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (E->getBase()->getType()->isVectorType()) 1614c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return false; 1615c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 16163068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getBase(), Result, Info)) 1617efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return false; 16181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16193068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APSInt Index; 16203068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluateInteger(E->getIdx(), Index, Info)) 1621efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return false; 1622180f47959a066795cc0f409433023af448bb0328Richard Smith int64_t IndexValue 1623180f47959a066795cc0f409433023af448bb0328Richard Smith = Index.isSigned() ? Index.getSExtValue() 1624180f47959a066795cc0f409433023af448bb0328Richard Smith : static_cast<int64_t>(Index.getZExtValue()); 16253068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 1626180f47959a066795cc0f409433023af448bb0328Richard Smith return HandleLValueArrayAdjustment(Info, Result, E->getType(), IndexValue); 16273068d117951a8df54bae9db039b56201ab10962bAnders Carlsson} 16284efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 16298cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool LValueExprEvaluator::VisitUnaryDeref(const UnaryOperator *E) { 1630efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return EvaluatePointer(E->getSubExpr(), Result, Info); 1631e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman} 1632e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman 16334efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 1634f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Pointer Evaluation 1635f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 1636f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 1637c754aa62643e66ab967ca32ae8b0b3fc419bba25Anders Carlssonnamespace { 1638770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass PointerExprEvaluator 16398cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : public ExprEvaluatorBase<PointerExprEvaluator, bool> { 1640efdb83e26f9a1fd2566afe54461216cd84814d42John McCall LValue &Result; 1641efdb83e26f9a1fd2566afe54461216cd84814d42John McCall 16428cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool Success(const Expr *E) { 16430a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Result.setExpr(E); 1644efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return true; 1645efdb83e26f9a1fd2566afe54461216cd84814d42John McCall } 16462bad1687fe6f00e10767a691a33b070b151902b6Anders Carlssonpublic: 16471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1648efdb83e26f9a1fd2566afe54461216cd84814d42John McCall PointerExprEvaluator(EvalInfo &info, LValue &Result) 16498cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : ExprEvaluatorBaseTy(info), Result(Result) {} 1650f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 165147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith bool Success(const CCValue &V, const Expr *E) { 16528cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne Result.setFrom(V); 16538cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return true; 16542bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson } 16558cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool Error(const Stmt *S) { 16568cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return false; 1657f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne } 1658f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith bool ValueInitialization(const Expr *E) { 1659f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith return Success((Expr*)0); 1660f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith } 16612bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 1662efdb83e26f9a1fd2566afe54461216cd84814d42John McCall bool VisitBinaryOperator(const BinaryOperator *E); 16638cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCastExpr(const CastExpr* E); 1664efdb83e26f9a1fd2566afe54461216cd84814d42John McCall bool VisitUnaryAddrOf(const UnaryOperator *E); 16658cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitObjCStringLiteral(const ObjCStringLiteral *E) 1666efdb83e26f9a1fd2566afe54461216cd84814d42John McCall { return Success(E); } 16678cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitAddrLabelExpr(const AddrLabelExpr *E) 1668efdb83e26f9a1fd2566afe54461216cd84814d42John McCall { return Success(E); } 16698cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCallExpr(const CallExpr *E); 16708cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitBlockExpr(const BlockExpr *E) { 1671469a1eb996e1cb0be54f9b210f836afbddcbb2ccJohn McCall if (!E->getBlockDecl()->hasCaptures()) 1672efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return Success(E); 1673efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return false; 1674b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump } 16758cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCXXNullPtrLiteralExpr(const CXXNullPtrLiteralExpr *E) 1676f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith { return ValueInitialization(E); } 1677180f47959a066795cc0f409433023af448bb0328Richard Smith bool VisitCXXThisExpr(const CXXThisExpr *E) { 1678180f47959a066795cc0f409433023af448bb0328Richard Smith if (!Info.CurrentCall->This) 1679180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1680180f47959a066795cc0f409433023af448bb0328Richard Smith Result = *Info.CurrentCall->This; 1681180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 1682180f47959a066795cc0f409433023af448bb0328Richard Smith } 168356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 1684ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman // FIXME: Missing: @protocol, @selector 16852bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson}; 1686f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace 16872bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 1688efdb83e26f9a1fd2566afe54461216cd84814d42John McCallstatic bool EvaluatePointer(const Expr* E, LValue& Result, EvalInfo &Info) { 1689c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith assert(E->isRValue() && E->getType()->hasPointerRepresentation()); 16908cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return PointerExprEvaluator(Info, Result).Visit(E); 1691f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} 1692650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 1693efdb83e26f9a1fd2566afe54461216cd84814d42John McCallbool PointerExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 16942de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (E->getOpcode() != BO_Add && 16952de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall E->getOpcode() != BO_Sub) 1696efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return false; 16971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1698650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson const Expr *PExp = E->getLHS(); 1699650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson const Expr *IExp = E->getRHS(); 1700650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (IExp->getType()->isPointerType()) 1701f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner std::swap(PExp, IExp); 17021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1703efdb83e26f9a1fd2566afe54461216cd84814d42John McCall if (!EvaluatePointer(PExp, Result, Info)) 1704efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return false; 17051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1706efdb83e26f9a1fd2566afe54461216cd84814d42John McCall llvm::APSInt Offset; 1707efdb83e26f9a1fd2566afe54461216cd84814d42John McCall if (!EvaluateInteger(IExp, Offset, Info)) 1708efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return false; 1709efdb83e26f9a1fd2566afe54461216cd84814d42John McCall int64_t AdditionalOffset 1710efdb83e26f9a1fd2566afe54461216cd84814d42John McCall = Offset.isSigned() ? Offset.getSExtValue() 1711efdb83e26f9a1fd2566afe54461216cd84814d42John McCall : static_cast<int64_t>(Offset.getZExtValue()); 17120a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (E->getOpcode() == BO_Sub) 17130a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith AdditionalOffset = -AdditionalOffset; 1714650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 1715180f47959a066795cc0f409433023af448bb0328Richard Smith QualType Pointee = PExp->getType()->getAs<PointerType>()->getPointeeType(); 1716180f47959a066795cc0f409433023af448bb0328Richard Smith return HandleLValueArrayAdjustment(Info, Result, Pointee, AdditionalOffset); 1717650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson} 17184efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1719efdb83e26f9a1fd2566afe54461216cd84814d42John McCallbool PointerExprEvaluator::VisitUnaryAddrOf(const UnaryOperator *E) { 1720efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return EvaluateLValue(E->getSubExpr(), Result, Info); 17214efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 17221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17238cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool PointerExprEvaluator::VisitCastExpr(const CastExpr* E) { 17248cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne const Expr* SubExpr = E->getSubExpr(); 1725650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 172609a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman switch (E->getCastKind()) { 172709a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman default: 172809a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman break; 172909a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman 17302de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_BitCast: 17311d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall case CK_CPointerToObjCPointerCast: 17321d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall case CK_BlockPointerToObjCPointerCast: 17332de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_AnyPointerToBlockPointerCast: 17340a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (!Visit(SubExpr)) 17350a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return false; 17360a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Result.Designator.setInvalid(); 17370a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return true; 173809a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman 17395c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson case CK_DerivedToBase: 17405c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson case CK_UncheckedDerivedToBase: { 174147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith if (!EvaluatePointer(E->getSubExpr(), Result, Info)) 17425c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson return false; 17435c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson 1744180f47959a066795cc0f409433023af448bb0328Richard Smith // Now figure out the necessary offset to add to the base LV to get from 17455c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson // the derived class to the base class. 1746180f47959a066795cc0f409433023af448bb0328Richard Smith QualType Type = 1747180f47959a066795cc0f409433023af448bb0328Richard Smith E->getSubExpr()->getType()->castAs<PointerType>()->getPointeeType(); 17485c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson 1749180f47959a066795cc0f409433023af448bb0328Richard Smith for (CastExpr::path_const_iterator PathI = E->path_begin(), 17505c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson PathE = E->path_end(); PathI != PathE; ++PathI) { 1751180f47959a066795cc0f409433023af448bb0328Richard Smith if (!HandleLValueBase(Info, Result, Type->getAsCXXRecordDecl(), *PathI)) 17525c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson return false; 1753180f47959a066795cc0f409433023af448bb0328Richard Smith Type = (*PathI)->getType(); 17545c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson } 17555c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson 17565c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson return true; 17575c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson } 17585c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95Anders Carlsson 175947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith case CK_NullToPointer: 176047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith return ValueInitialization(E); 1761404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall 17622de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_IntegralToPointer: { 176347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue Value; 1764efdb83e26f9a1fd2566afe54461216cd84814d42John McCall if (!EvaluateIntegerOrLValue(SubExpr, Value, Info)) 176509a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman break; 176669ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar 1767efdb83e26f9a1fd2566afe54461216cd84814d42John McCall if (Value.isInt()) { 176847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith unsigned Size = Info.Ctx.getTypeSize(E->getType()); 176947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith uint64_t N = Value.getInt().extOrTrunc(Size).getZExtValue(); 1770efdb83e26f9a1fd2566afe54461216cd84814d42John McCall Result.Base = 0; 177147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Result.Offset = CharUnits::fromQuantity(N); 1772177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith Result.Frame = 0; 17730a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Result.Designator.setInvalid(); 1774efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return true; 1775efdb83e26f9a1fd2566afe54461216cd84814d42John McCall } else { 1776efdb83e26f9a1fd2566afe54461216cd84814d42John McCall // Cast is of an lvalue, no need to change value. 177747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Result.setFrom(Value); 1778efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return true; 1779650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson } 1780650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson } 17812de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_ArrayToPointerDecay: 17826a7c94af983717e2c2d6aebe42cb4737c1c7b9e6Richard Smith // FIXME: Support array-to-pointer decay on array rvalues. 17836a7c94af983717e2c2d6aebe42cb4737c1c7b9e6Richard Smith if (!SubExpr->isGLValue()) 17846a7c94af983717e2c2d6aebe42cb4737c1c7b9e6Richard Smith return Error(E); 17850a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith if (!EvaluateLValue(SubExpr, Result, Info)) 17860a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return false; 17870a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith // The result is a pointer to the first element of the array. 17880a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith Result.Designator.addIndex(0); 17890a3bdb646ee0318667f4cebec6792d2548fb9950Richard Smith return true; 17906a7c94af983717e2c2d6aebe42cb4737c1c7b9e6Richard Smith 17912de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_FunctionToPointerDecay: 17926a7c94af983717e2c2d6aebe42cb4737c1c7b9e6Richard Smith return EvaluateLValue(SubExpr, Result, Info); 17934efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 17944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1795c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return ExprEvaluatorBaseTy::VisitCastExpr(E); 17961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 1797650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 17988cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool PointerExprEvaluator::VisitCallExpr(const CallExpr *E) { 1799180f47959a066795cc0f409433023af448bb0328Richard Smith if (IsStringLiteralCall(E)) 1800efdb83e26f9a1fd2566afe54461216cd84814d42John McCall return Success(E); 180156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 18028cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return ExprEvaluatorBaseTy::VisitCallExpr(E); 18034efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 1804f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 1805f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 1806180f47959a066795cc0f409433023af448bb0328Richard Smith// Record Evaluation 1807180f47959a066795cc0f409433023af448bb0328Richard Smith//===----------------------------------------------------------------------===// 1808180f47959a066795cc0f409433023af448bb0328Richard Smith 1809180f47959a066795cc0f409433023af448bb0328Richard Smithnamespace { 1810180f47959a066795cc0f409433023af448bb0328Richard Smith class RecordExprEvaluator 1811180f47959a066795cc0f409433023af448bb0328Richard Smith : public ExprEvaluatorBase<RecordExprEvaluator, bool> { 1812180f47959a066795cc0f409433023af448bb0328Richard Smith const LValue &This; 1813180f47959a066795cc0f409433023af448bb0328Richard Smith APValue &Result; 1814180f47959a066795cc0f409433023af448bb0328Richard Smith public: 1815180f47959a066795cc0f409433023af448bb0328Richard Smith 1816180f47959a066795cc0f409433023af448bb0328Richard Smith RecordExprEvaluator(EvalInfo &info, const LValue &This, APValue &Result) 1817180f47959a066795cc0f409433023af448bb0328Richard Smith : ExprEvaluatorBaseTy(info), This(This), Result(Result) {} 1818180f47959a066795cc0f409433023af448bb0328Richard Smith 1819180f47959a066795cc0f409433023af448bb0328Richard Smith bool Success(const CCValue &V, const Expr *E) { 1820180f47959a066795cc0f409433023af448bb0328Richard Smith return CheckConstantExpression(V, Result); 1821180f47959a066795cc0f409433023af448bb0328Richard Smith } 1822180f47959a066795cc0f409433023af448bb0328Richard Smith bool Error(const Expr *E) { return false; } 1823180f47959a066795cc0f409433023af448bb0328Richard Smith 1824180f47959a066795cc0f409433023af448bb0328Richard Smith bool VisitInitListExpr(const InitListExpr *E); 1825180f47959a066795cc0f409433023af448bb0328Richard Smith bool VisitCXXConstructExpr(const CXXConstructExpr *E); 1826180f47959a066795cc0f409433023af448bb0328Richard Smith }; 1827180f47959a066795cc0f409433023af448bb0328Richard Smith} 1828180f47959a066795cc0f409433023af448bb0328Richard Smith 1829180f47959a066795cc0f409433023af448bb0328Richard Smithbool RecordExprEvaluator::VisitInitListExpr(const InitListExpr *E) { 1830180f47959a066795cc0f409433023af448bb0328Richard Smith const RecordDecl *RD = E->getType()->castAs<RecordType>()->getDecl(); 1831180f47959a066795cc0f409433023af448bb0328Richard Smith const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); 1832180f47959a066795cc0f409433023af448bb0328Richard Smith 1833180f47959a066795cc0f409433023af448bb0328Richard Smith if (RD->isUnion()) { 1834180f47959a066795cc0f409433023af448bb0328Richard Smith Result = APValue(E->getInitializedFieldInUnion()); 1835180f47959a066795cc0f409433023af448bb0328Richard Smith if (!E->getNumInits()) 1836180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 1837180f47959a066795cc0f409433023af448bb0328Richard Smith LValue Subobject = This; 1838180f47959a066795cc0f409433023af448bb0328Richard Smith HandleLValueMember(Info, Subobject, E->getInitializedFieldInUnion(), 1839180f47959a066795cc0f409433023af448bb0328Richard Smith &Layout); 1840180f47959a066795cc0f409433023af448bb0328Richard Smith return EvaluateConstantExpression(Result.getUnionValue(), Info, 1841180f47959a066795cc0f409433023af448bb0328Richard Smith Subobject, E->getInit(0)); 1842180f47959a066795cc0f409433023af448bb0328Richard Smith } 1843180f47959a066795cc0f409433023af448bb0328Richard Smith 1844180f47959a066795cc0f409433023af448bb0328Richard Smith assert((!isa<CXXRecordDecl>(RD) || !cast<CXXRecordDecl>(RD)->getNumBases()) && 1845180f47959a066795cc0f409433023af448bb0328Richard Smith "initializer list for class with base classes"); 1846180f47959a066795cc0f409433023af448bb0328Richard Smith Result = APValue(APValue::UninitStruct(), 0, 1847180f47959a066795cc0f409433023af448bb0328Richard Smith std::distance(RD->field_begin(), RD->field_end())); 1848180f47959a066795cc0f409433023af448bb0328Richard Smith unsigned ElementNo = 0; 1849180f47959a066795cc0f409433023af448bb0328Richard Smith for (RecordDecl::field_iterator Field = RD->field_begin(), 1850180f47959a066795cc0f409433023af448bb0328Richard Smith FieldEnd = RD->field_end(); Field != FieldEnd; ++Field) { 1851180f47959a066795cc0f409433023af448bb0328Richard Smith // Anonymous bit-fields are not considered members of the class for 1852180f47959a066795cc0f409433023af448bb0328Richard Smith // purposes of aggregate initialization. 1853180f47959a066795cc0f409433023af448bb0328Richard Smith if (Field->isUnnamedBitfield()) 1854180f47959a066795cc0f409433023af448bb0328Richard Smith continue; 1855180f47959a066795cc0f409433023af448bb0328Richard Smith 1856180f47959a066795cc0f409433023af448bb0328Richard Smith LValue Subobject = This; 1857180f47959a066795cc0f409433023af448bb0328Richard Smith HandleLValueMember(Info, Subobject, *Field, &Layout); 1858180f47959a066795cc0f409433023af448bb0328Richard Smith 1859180f47959a066795cc0f409433023af448bb0328Richard Smith if (ElementNo < E->getNumInits()) { 1860180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateConstantExpression( 1861180f47959a066795cc0f409433023af448bb0328Richard Smith Result.getStructField((*Field)->getFieldIndex()), 1862180f47959a066795cc0f409433023af448bb0328Richard Smith Info, Subobject, E->getInit(ElementNo++))) 1863180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1864180f47959a066795cc0f409433023af448bb0328Richard Smith } else { 1865180f47959a066795cc0f409433023af448bb0328Richard Smith // Perform an implicit value-initialization for members beyond the end of 1866180f47959a066795cc0f409433023af448bb0328Richard Smith // the initializer list. 1867180f47959a066795cc0f409433023af448bb0328Richard Smith ImplicitValueInitExpr VIE(Field->getType()); 1868180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateConstantExpression( 1869180f47959a066795cc0f409433023af448bb0328Richard Smith Result.getStructField((*Field)->getFieldIndex()), 1870180f47959a066795cc0f409433023af448bb0328Richard Smith Info, Subobject, &VIE)) 1871180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1872180f47959a066795cc0f409433023af448bb0328Richard Smith } 1873180f47959a066795cc0f409433023af448bb0328Richard Smith } 1874180f47959a066795cc0f409433023af448bb0328Richard Smith 1875180f47959a066795cc0f409433023af448bb0328Richard Smith return true; 1876180f47959a066795cc0f409433023af448bb0328Richard Smith} 1877180f47959a066795cc0f409433023af448bb0328Richard Smith 1878180f47959a066795cc0f409433023af448bb0328Richard Smithbool RecordExprEvaluator::VisitCXXConstructExpr(const CXXConstructExpr *E) { 1879180f47959a066795cc0f409433023af448bb0328Richard Smith const CXXConstructorDecl *FD = E->getConstructor(); 1880180f47959a066795cc0f409433023af448bb0328Richard Smith const FunctionDecl *Definition = 0; 1881180f47959a066795cc0f409433023af448bb0328Richard Smith FD->getBody(Definition); 1882180f47959a066795cc0f409433023af448bb0328Richard Smith 1883180f47959a066795cc0f409433023af448bb0328Richard Smith if (!Definition || !Definition->isConstexpr() || Definition->isInvalidDecl()) 1884180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 1885180f47959a066795cc0f409433023af448bb0328Richard Smith 1886180f47959a066795cc0f409433023af448bb0328Richard Smith // FIXME: Elide the copy/move construction wherever we can. 1887180f47959a066795cc0f409433023af448bb0328Richard Smith if (E->isElidable()) 1888180f47959a066795cc0f409433023af448bb0328Richard Smith if (const MaterializeTemporaryExpr *ME 1889180f47959a066795cc0f409433023af448bb0328Richard Smith = dyn_cast<MaterializeTemporaryExpr>(E->getArg(0))) 1890180f47959a066795cc0f409433023af448bb0328Richard Smith return Visit(ME->GetTemporaryExpr()); 1891180f47959a066795cc0f409433023af448bb0328Richard Smith 1892180f47959a066795cc0f409433023af448bb0328Richard Smith llvm::ArrayRef<const Expr*> Args(E->getArgs(), E->getNumArgs()); 18936142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel return HandleConstructorCall(Args, cast<CXXConstructorDecl>(Definition), 18946142ca7790aa09a6e13592b70f142cc4bbcadcaeDevang Patel Info, This, Result); 1895180f47959a066795cc0f409433023af448bb0328Richard Smith} 1896180f47959a066795cc0f409433023af448bb0328Richard Smith 1897180f47959a066795cc0f409433023af448bb0328Richard Smithstatic bool EvaluateRecord(const Expr *E, const LValue &This, 1898180f47959a066795cc0f409433023af448bb0328Richard Smith APValue &Result, EvalInfo &Info) { 1899180f47959a066795cc0f409433023af448bb0328Richard Smith assert(E->isRValue() && E->getType()->isRecordType() && 1900180f47959a066795cc0f409433023af448bb0328Richard Smith E->getType()->isLiteralType() && 1901180f47959a066795cc0f409433023af448bb0328Richard Smith "can't evaluate expression as a record rvalue"); 1902180f47959a066795cc0f409433023af448bb0328Richard Smith return RecordExprEvaluator(Info, This, Result).Visit(E); 1903180f47959a066795cc0f409433023af448bb0328Richard Smith} 1904180f47959a066795cc0f409433023af448bb0328Richard Smith 1905180f47959a066795cc0f409433023af448bb0328Richard Smith//===----------------------------------------------------------------------===// 190659b5da6d853b4368b984700315adf7b37de05764Nate Begeman// Vector Evaluation 190759b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===// 190859b5da6d853b4368b984700315adf7b37de05764Nate Begeman 190959b5da6d853b4368b984700315adf7b37de05764Nate Begemannamespace { 1910770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramer class VectorExprEvaluator 191107fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith : public ExprEvaluatorBase<VectorExprEvaluator, bool> { 191207fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith APValue &Result; 191359b5da6d853b4368b984700315adf7b37de05764Nate Begeman public: 19141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 191507fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith VectorExprEvaluator(EvalInfo &info, APValue &Result) 191607fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith : ExprEvaluatorBaseTy(info), Result(Result) {} 19171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 191807fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith bool Success(const ArrayRef<APValue> &V, const Expr *E) { 191907fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith assert(V.size() == E->getType()->castAs<VectorType>()->getNumElements()); 192007fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith // FIXME: remove this APValue copy. 192107fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith Result = APValue(V.data(), V.size()); 192207fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return true; 192307fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith } 192469c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith bool Success(const CCValue &V, const Expr *E) { 192569c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith assert(V.isVector()); 192607fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith Result = V; 192707fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return true; 192807fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith } 192907fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith bool Error(const Expr *E) { return false; } 193007fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith bool ValueInitialization(const Expr *E); 19311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 193207fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith bool VisitUnaryReal(const UnaryOperator *E) 193391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman { return Visit(E->getSubExpr()); } 193407fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith bool VisitCastExpr(const CastExpr* E); 193507fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith bool VisitInitListExpr(const InitListExpr *E); 193607fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith bool VisitUnaryImag(const UnaryOperator *E); 193791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // FIXME: Missing: unary -, unary ~, binary add/sub/mul/div, 19382217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman // binary comparisons, binary and/or/xor, 193991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // shufflevector, ExtVectorElementExpr 194091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // (Note that these require implementing conversions 194191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // between vector types.) 194259b5da6d853b4368b984700315adf7b37de05764Nate Begeman }; 194359b5da6d853b4368b984700315adf7b37de05764Nate Begeman} // end anonymous namespace 194459b5da6d853b4368b984700315adf7b37de05764Nate Begeman 194559b5da6d853b4368b984700315adf7b37de05764Nate Begemanstatic bool EvaluateVector(const Expr* E, APValue& Result, EvalInfo &Info) { 1946c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith assert(E->isRValue() && E->getType()->isVectorType() &&"not a vector rvalue"); 194707fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return VectorExprEvaluator(Info, Result).Visit(E); 194859b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 194959b5da6d853b4368b984700315adf7b37de05764Nate Begeman 195007fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smithbool VectorExprEvaluator::VisitCastExpr(const CastExpr* E) { 195107fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith const VectorType *VTy = E->getType()->castAs<VectorType>(); 1952c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman QualType EltTy = VTy->getElementType(); 1953c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman unsigned NElts = VTy->getNumElements(); 1954c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman unsigned EltWidth = Info.Ctx.getTypeSize(EltTy); 19551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 195659b5da6d853b4368b984700315adf7b37de05764Nate Begeman const Expr* SE = E->getSubExpr(); 1957e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman QualType SETy = SE->getType(); 195859b5da6d853b4368b984700315adf7b37de05764Nate Begeman 195946a523285928aa07bf14803178dc04616ac85994Eli Friedman switch (E->getCastKind()) { 196046a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_VectorSplat: { 196107fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith APValue Val = APValue(); 196246a523285928aa07bf14803178dc04616ac85994Eli Friedman if (SETy->isIntegerType()) { 196346a523285928aa07bf14803178dc04616ac85994Eli Friedman APSInt IntResult; 196446a523285928aa07bf14803178dc04616ac85994Eli Friedman if (!EvaluateInteger(SE, IntResult, Info)) 196507fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return Error(E); 196607fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith Val = APValue(IntResult); 196746a523285928aa07bf14803178dc04616ac85994Eli Friedman } else if (SETy->isRealFloatingType()) { 196846a523285928aa07bf14803178dc04616ac85994Eli Friedman APFloat F(0.0); 196946a523285928aa07bf14803178dc04616ac85994Eli Friedman if (!EvaluateFloat(SE, F, Info)) 197007fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return Error(E); 197107fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith Val = APValue(F); 197246a523285928aa07bf14803178dc04616ac85994Eli Friedman } else { 197307fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return Error(E); 197446a523285928aa07bf14803178dc04616ac85994Eli Friedman } 1975c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman 1976c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman // Splat and create vector APValue. 197707fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith SmallVector<APValue, 4> Elts(NElts, Val); 197807fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return Success(Elts, E); 1979e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman } 198046a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_BitCast: { 198107fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith // FIXME: this is wrong for any cast other than a no-op cast. 198246a523285928aa07bf14803178dc04616ac85994Eli Friedman if (SETy->isVectorType()) 19838cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return Visit(SE); 1984c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman 198546a523285928aa07bf14803178dc04616ac85994Eli Friedman if (!SETy->isIntegerType()) 198607fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return Error(E); 19871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 198846a523285928aa07bf14803178dc04616ac85994Eli Friedman APSInt Init; 198946a523285928aa07bf14803178dc04616ac85994Eli Friedman if (!EvaluateInteger(SE, Init, Info)) 199007fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return Error(E); 1991c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman 199246a523285928aa07bf14803178dc04616ac85994Eli Friedman assert((EltTy->isIntegerType() || EltTy->isRealFloatingType()) && 199346a523285928aa07bf14803178dc04616ac85994Eli Friedman "Vectors must be composed of ints or floats"); 199446a523285928aa07bf14803178dc04616ac85994Eli Friedman 19955f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<APValue, 4> Elts; 199646a523285928aa07bf14803178dc04616ac85994Eli Friedman for (unsigned i = 0; i != NElts; ++i) { 199746a523285928aa07bf14803178dc04616ac85994Eli Friedman APSInt Tmp = Init.extOrTrunc(EltWidth); 199846a523285928aa07bf14803178dc04616ac85994Eli Friedman 199946a523285928aa07bf14803178dc04616ac85994Eli Friedman if (EltTy->isIntegerType()) 200046a523285928aa07bf14803178dc04616ac85994Eli Friedman Elts.push_back(APValue(Tmp)); 200146a523285928aa07bf14803178dc04616ac85994Eli Friedman else 200246a523285928aa07bf14803178dc04616ac85994Eli Friedman Elts.push_back(APValue(APFloat(Tmp))); 200346a523285928aa07bf14803178dc04616ac85994Eli Friedman 200446a523285928aa07bf14803178dc04616ac85994Eli Friedman Init >>= EltWidth; 200546a523285928aa07bf14803178dc04616ac85994Eli Friedman } 200607fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return Success(Elts, E); 200746a523285928aa07bf14803178dc04616ac85994Eli Friedman } 200846a523285928aa07bf14803178dc04616ac85994Eli Friedman default: 2009c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return ExprEvaluatorBaseTy::VisitCastExpr(E); 2010c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman } 201159b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 201259b5da6d853b4368b984700315adf7b37de05764Nate Begeman 201307fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smithbool 201459b5da6d853b4368b984700315adf7b37de05764Nate BegemanVectorExprEvaluator::VisitInitListExpr(const InitListExpr *E) { 201507fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith const VectorType *VT = E->getType()->castAs<VectorType>(); 201659b5da6d853b4368b984700315adf7b37de05764Nate Begeman unsigned NumInits = E->getNumInits(); 201791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman unsigned NumElements = VT->getNumElements(); 20181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 201959b5da6d853b4368b984700315adf7b37de05764Nate Begeman QualType EltTy = VT->getElementType(); 20205f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<APValue, 4> Elements; 202159b5da6d853b4368b984700315adf7b37de05764Nate Begeman 2022a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall // If a vector is initialized with a single element, that value 2023a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall // becomes every element of the vector, not just the first. 2024a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall // This is the behavior described in the IBM AltiVec documentation. 2025a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall if (NumInits == 1) { 202607fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith 202707fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith // Handle the case where the vector is initialized by another 2028b92ae0e31126e5630d7022f2d6abe7eed2e17746Tanya Lattner // vector (OpenCL 6.1.6). 2029b92ae0e31126e5630d7022f2d6abe7eed2e17746Tanya Lattner if (E->getInit(0)->getType()->isVectorType()) 203007fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return Visit(E->getInit(0)); 203107fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith 2032a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall APValue InitValue; 203359b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (EltTy->isIntegerType()) { 203459b5da6d853b4368b984700315adf7b37de05764Nate Begeman llvm::APSInt sInt(32); 2035a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall if (!EvaluateInteger(E->getInit(0), sInt, Info)) 203607fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return Error(E); 2037a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall InitValue = APValue(sInt); 203859b5da6d853b4368b984700315adf7b37de05764Nate Begeman } else { 203959b5da6d853b4368b984700315adf7b37de05764Nate Begeman llvm::APFloat f(0.0); 2040a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall if (!EvaluateFloat(E->getInit(0), f, Info)) 204107fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return Error(E); 2042a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall InitValue = APValue(f); 2043a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall } 2044a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall for (unsigned i = 0; i < NumElements; i++) { 2045a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall Elements.push_back(InitValue); 2046a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall } 2047a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall } else { 2048a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall for (unsigned i = 0; i < NumElements; i++) { 2049a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall if (EltTy->isIntegerType()) { 2050a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall llvm::APSInt sInt(32); 2051a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall if (i < NumInits) { 2052a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall if (!EvaluateInteger(E->getInit(i), sInt, Info)) 205307fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return Error(E); 2054a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall } else { 2055a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall sInt = Info.Ctx.MakeIntValue(0, EltTy); 2056a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall } 2057a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall Elements.push_back(APValue(sInt)); 205891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman } else { 2059a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall llvm::APFloat f(0.0); 2060a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall if (i < NumInits) { 2061a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall if (!EvaluateFloat(E->getInit(i), f, Info)) 206207fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return Error(E); 2063a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall } else { 2064a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall f = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy)); 2065a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall } 2066a7d6c221558fa8117aa1d1fd41cf0046c5c9fadeJohn McCall Elements.push_back(APValue(f)); 206791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman } 206859b5da6d853b4368b984700315adf7b37de05764Nate Begeman } 206959b5da6d853b4368b984700315adf7b37de05764Nate Begeman } 207007fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return Success(Elements, E); 207159b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 207259b5da6d853b4368b984700315adf7b37de05764Nate Begeman 207307fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smithbool 207407fc657e3077531805b0e2dbf8f8964d48daa38bRichard SmithVectorExprEvaluator::ValueInitialization(const Expr *E) { 207507fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith const VectorType *VT = E->getType()->getAs<VectorType>(); 207691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman QualType EltTy = VT->getElementType(); 207791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue ZeroElement; 207891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (EltTy->isIntegerType()) 207991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman ZeroElement = APValue(Info.Ctx.MakeIntValue(0, EltTy)); 208091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman else 208191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman ZeroElement = 208291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue(APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy))); 208391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 20845f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<APValue, 4> Elements(VT->getNumElements(), ZeroElement); 208507fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return Success(Elements, E); 208691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman} 208791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 208807fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smithbool VectorExprEvaluator::VisitUnaryImag(const UnaryOperator *E) { 20898327fad71da34492d82c532f42a58cb4baff81a3Richard Smith VisitIgnoredValue(E->getSubExpr()); 209007fc657e3077531805b0e2dbf8f8964d48daa38bRichard Smith return ValueInitialization(E); 209191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman} 209291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 209359b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===// 2094cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith// Array Evaluation 2095cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith//===----------------------------------------------------------------------===// 2096cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 2097cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smithnamespace { 2098cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith class ArrayExprEvaluator 2099cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith : public ExprEvaluatorBase<ArrayExprEvaluator, bool> { 2100180f47959a066795cc0f409433023af448bb0328Richard Smith const LValue &This; 2101cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith APValue &Result; 2102cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith public: 2103cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 2104180f47959a066795cc0f409433023af448bb0328Richard Smith ArrayExprEvaluator(EvalInfo &Info, const LValue &This, APValue &Result) 2105180f47959a066795cc0f409433023af448bb0328Richard Smith : ExprEvaluatorBaseTy(Info), This(This), Result(Result) {} 2106cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 2107cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith bool Success(const APValue &V, const Expr *E) { 2108cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith assert(V.isArray() && "Expected array type"); 2109cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith Result = V; 2110cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return true; 2111cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith } 2112cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith bool Error(const Expr *E) { return false; } 2113cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 2114180f47959a066795cc0f409433023af448bb0328Richard Smith bool ValueInitialization(const Expr *E) { 2115180f47959a066795cc0f409433023af448bb0328Richard Smith const ConstantArrayType *CAT = 2116180f47959a066795cc0f409433023af448bb0328Richard Smith Info.Ctx.getAsConstantArrayType(E->getType()); 2117180f47959a066795cc0f409433023af448bb0328Richard Smith if (!CAT) 2118180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 2119180f47959a066795cc0f409433023af448bb0328Richard Smith 2120180f47959a066795cc0f409433023af448bb0328Richard Smith Result = APValue(APValue::UninitArray(), 0, 2121180f47959a066795cc0f409433023af448bb0328Richard Smith CAT->getSize().getZExtValue()); 2122180f47959a066795cc0f409433023af448bb0328Richard Smith if (!Result.hasArrayFiller()) return true; 2123180f47959a066795cc0f409433023af448bb0328Richard Smith 2124180f47959a066795cc0f409433023af448bb0328Richard Smith // Value-initialize all elements. 2125180f47959a066795cc0f409433023af448bb0328Richard Smith LValue Subobject = This; 2126180f47959a066795cc0f409433023af448bb0328Richard Smith Subobject.Designator.addIndex(0); 2127180f47959a066795cc0f409433023af448bb0328Richard Smith ImplicitValueInitExpr VIE(CAT->getElementType()); 2128180f47959a066795cc0f409433023af448bb0328Richard Smith return EvaluateConstantExpression(Result.getArrayFiller(), Info, 2129180f47959a066795cc0f409433023af448bb0328Richard Smith Subobject, &VIE); 2130180f47959a066795cc0f409433023af448bb0328Richard Smith } 2131180f47959a066795cc0f409433023af448bb0328Richard Smith 2132180f47959a066795cc0f409433023af448bb0328Richard Smith // FIXME: We also get CXXConstructExpr, in cases like: 2133180f47959a066795cc0f409433023af448bb0328Richard Smith // struct S { constexpr S(); }; constexpr S s[10]; 2134cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith bool VisitInitListExpr(const InitListExpr *E); 2135cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith }; 2136cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith} // end anonymous namespace 2137cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 2138180f47959a066795cc0f409433023af448bb0328Richard Smithstatic bool EvaluateArray(const Expr *E, const LValue &This, 2139180f47959a066795cc0f409433023af448bb0328Richard Smith APValue &Result, EvalInfo &Info) { 2140cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith assert(E->isRValue() && E->getType()->isArrayType() && 2141cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith E->getType()->isLiteralType() && "not a literal array rvalue"); 2142180f47959a066795cc0f409433023af448bb0328Richard Smith return ArrayExprEvaluator(Info, This, Result).Visit(E); 2143cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith} 2144cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 2145cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smithbool ArrayExprEvaluator::VisitInitListExpr(const InitListExpr *E) { 2146cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType(E->getType()); 2147cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith if (!CAT) 2148cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return false; 2149cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 2150cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith Result = APValue(APValue::UninitArray(), E->getNumInits(), 2151cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith CAT->getSize().getZExtValue()); 2152180f47959a066795cc0f409433023af448bb0328Richard Smith LValue Subobject = This; 2153180f47959a066795cc0f409433023af448bb0328Richard Smith Subobject.Designator.addIndex(0); 2154180f47959a066795cc0f409433023af448bb0328Richard Smith unsigned Index = 0; 2155cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith for (InitListExpr::const_iterator I = E->begin(), End = E->end(); 2156180f47959a066795cc0f409433023af448bb0328Richard Smith I != End; ++I, ++Index) { 2157180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateConstantExpression(Result.getArrayInitializedElt(Index), 2158180f47959a066795cc0f409433023af448bb0328Richard Smith Info, Subobject, cast<Expr>(*I))) 2159180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 2160180f47959a066795cc0f409433023af448bb0328Richard Smith if (!HandleLValueArrayAdjustment(Info, Subobject, CAT->getElementType(), 1)) 2161cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return false; 2162180f47959a066795cc0f409433023af448bb0328Richard Smith } 2163cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 2164cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith if (!Result.hasArrayFiller()) return true; 2165cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith assert(E->hasArrayFiller() && "no array filler for incomplete init list"); 2166180f47959a066795cc0f409433023af448bb0328Richard Smith // FIXME: The Subobject here isn't necessarily right. This rarely matters, 2167180f47959a066795cc0f409433023af448bb0328Richard Smith // but sometimes does: 2168180f47959a066795cc0f409433023af448bb0328Richard Smith // struct S { constexpr S() : p(&p) {} void *p; }; 2169180f47959a066795cc0f409433023af448bb0328Richard Smith // S s[10] = {}; 2170cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return EvaluateConstantExpression(Result.getArrayFiller(), Info, 2171180f47959a066795cc0f409433023af448bb0328Richard Smith Subobject, E->getArrayFiller()); 2172cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith} 2173cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 2174cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith//===----------------------------------------------------------------------===// 2175f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Integer Evaluation 2176c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// 2177c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// As a GNU extension, we support casting pointers to sufficiently-wide integer 2178c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// types and back in constant folding. Integer values are thus represented 2179c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// either as an integer-valued APValue, or as an lvalue-valued APValue. 2180f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 2181f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 2182f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnernamespace { 2183770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass IntExprEvaluator 21848cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : public ExprEvaluatorBase<IntExprEvaluator, bool> { 218547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue &Result; 2186f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerpublic: 218747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith IntExprEvaluator(EvalInfo &info, CCValue &result) 21888cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : ExprEvaluatorBaseTy(info), Result(result) {} 2189f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 2190973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara bool Success(const llvm::APSInt &SI, const Expr *E) { 2191973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara assert(E->getType()->isIntegralOrEnumerationType() && 21922ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor "Invalid evaluation result."); 2193973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara assert(SI.isSigned() == E->getType()->isSignedIntegerOrEnumerationType() && 21943f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar "Invalid evaluation result."); 2195973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara assert(SI.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) && 21963f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar "Invalid evaluation result."); 219747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Result = CCValue(SI); 21983f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return true; 21993f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar } 22003f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar 2201131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar bool Success(const llvm::APInt &I, const Expr *E) { 22022ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor assert(E->getType()->isIntegralOrEnumerationType() && 22032ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor "Invalid evaluation result."); 220430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar assert(I.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) && 22053f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar "Invalid evaluation result."); 220647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Result = CCValue(APSInt(I)); 2207575a1c9dc8dc5b4977194993e289f9eda7295c39Douglas Gregor Result.getInt().setIsUnsigned( 2208575a1c9dc8dc5b4977194993e289f9eda7295c39Douglas Gregor E->getType()->isUnsignedIntegerOrEnumerationType()); 2209131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return true; 2210131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 2211131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar 2212131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar bool Success(uint64_t Value, const Expr *E) { 22132ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor assert(E->getType()->isIntegralOrEnumerationType() && 22142ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor "Invalid evaluation result."); 221547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Result = CCValue(Info.Ctx.MakeIntValue(Value, E->getType())); 2216131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return true; 2217131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 2218131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar 22194f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck bool Success(CharUnits Size, const Expr *E) { 22204f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck return Success(Size.getQuantity(), E); 22214f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck } 22224f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck 22234f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck 222482206e267ce6cc709797127616f64672d255b310Anders Carlsson bool Error(SourceLocation L, diag::kind D, const Expr *E) { 222532fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner // Take the first error. 22261e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith if (Info.EvalStatus.Diag == 0) { 22271e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith Info.EvalStatus.DiagLoc = L; 22281e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith Info.EvalStatus.Diag = D; 22291e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith Info.EvalStatus.DiagExpr = E; 223032fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner } 223154176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner return false; 22327a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner } 22331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 223447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith bool Success(const CCValue &V, const Expr *E) { 2235342f1f8b0a402c5a7f8c5055db7f60a7808f1687Richard Smith if (V.isLValue()) { 2236342f1f8b0a402c5a7f8c5055db7f60a7808f1687Richard Smith Result = V; 2237342f1f8b0a402c5a7f8c5055db7f60a7808f1687Richard Smith return true; 2238342f1f8b0a402c5a7f8c5055db7f60a7808f1687Richard Smith } 22398cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return Success(V.getInt(), E); 224032fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner } 22418cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool Error(const Expr *E) { 22420e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E); 2243f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner } 22441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2245f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith bool ValueInitialization(const Expr *E) { return Success(0, E); } 2246f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith 22478cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne //===--------------------------------------------------------------------===// 22488cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne // Visitor Methods 22498cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne //===--------------------------------------------------------------------===// 2250f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 22514c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitIntegerLiteral(const IntegerLiteral *E) { 2252131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(E->getValue(), E); 22534c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 22544c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitCharacterLiteral(const CharacterLiteral *E) { 2255131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(E->getValue(), E); 22564c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 2257043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman 2258043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman bool CheckReferencedDecl(const Expr *E, const Decl *D); 2259043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman bool VisitDeclRefExpr(const DeclRefExpr *E) { 22608cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne if (CheckReferencedDecl(E, E->getDecl())) 22618cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return true; 22628cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 22638cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return ExprEvaluatorBaseTy::VisitDeclRefExpr(E); 2264043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman } 2265043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman bool VisitMemberExpr(const MemberExpr *E) { 2266043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman if (CheckReferencedDecl(E, E->getMemberDecl())) { 2267c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith VisitIgnoredValue(E->getBase()); 2268043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman return true; 2269043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman } 22708cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 22718cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return ExprEvaluatorBaseTy::VisitMemberExpr(E); 2272043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman } 2273043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman 22748cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCallExpr(const CallExpr *E); 2275b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner bool VisitBinaryOperator(const BinaryOperator *E); 22768ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor bool VisitOffsetOfExpr(const OffsetOfExpr *E); 2277b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner bool VisitUnaryOperator(const UnaryOperator *E); 2278f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 22798cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCastExpr(const CastExpr* E); 2280f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne bool VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *E); 22810518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl 22823068d117951a8df54bae9db039b56201ab10962bAnders Carlsson bool VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) { 2283131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(E->getValue(), E); 22843068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 22851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2286f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith // Note, GNU defines __null as an integer, not a pointer. 22873f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson bool VisitGNUNullExpr(const GNUNullExpr *E) { 2288f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith return ValueInitialization(E); 2289664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman } 2290664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman 229164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl bool VisitUnaryTypeTraitExpr(const UnaryTypeTraitExpr *E) { 22920dfd848fa4c9664852ba8c929a8bd3fce93ddca2Sebastian Redl return Success(E->getValue(), E); 229364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl } 229464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl 22956ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet bool VisitBinaryTypeTraitExpr(const BinaryTypeTraitExpr *E) { 22966ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet return Success(E->getValue(), E); 22976ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet } 22986ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet 229921ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley bool VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *E) { 230021ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley return Success(E->getValue(), E); 230121ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley } 230221ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 2303552622067dc45013d240f73952fece703f5e63bdJohn Wiegley bool VisitExpressionTraitExpr(const ExpressionTraitExpr *E) { 2304552622067dc45013d240f73952fece703f5e63bdJohn Wiegley return Success(E->getValue(), E); 2305552622067dc45013d240f73952fece703f5e63bdJohn Wiegley } 2306552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 2307722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman bool VisitUnaryReal(const UnaryOperator *E); 2308664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman bool VisitUnaryImag(const UnaryOperator *E); 2309664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman 2310295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl bool VisitCXXNoexceptExpr(const CXXNoexceptExpr *E); 2311ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor bool VisitSizeOfPackExpr(const SizeOfPackExpr *E); 2312cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl 2313fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattnerprivate: 23148b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck CharUnits GetAlignOfExpr(const Expr *E); 23158b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck CharUnits GetAlignOfType(QualType T); 231642c8f87eb60958170c46767273bf93e6c96125bfJohn McCall static QualType GetObjectType(const Expr *E); 23178cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool TryEvaluateBuiltinObjectSize(const CallExpr *E); 2318664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman // FIXME: Missing: array subscript of vector, member of vector 2319f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner}; 2320f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace 2321f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 2322c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// EvaluateIntegerOrLValue - Evaluate an rvalue integral-typed expression, and 2323c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// produce either the integer value or a pointer. 2324c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// 2325c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// GCC has a heinous extension which folds casts between pointer types and 2326c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// pointer-sized integral types. We support this by allowing the evaluation of 2327c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// an integer rvalue to produce a pointer (represented as an lvalue) instead. 2328c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// Some simple arithmetic on such values is supported (they are treated much 2329c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// like char*). 233047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smithstatic bool EvaluateIntegerOrLValue(const Expr* E, CCValue &Result, 233147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith EvalInfo &Info) { 2332c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith assert(E->isRValue() && E->getType()->isIntegralOrEnumerationType()); 23338cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return IntExprEvaluator(Info, Result).Visit(E); 233469ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar} 233569ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar 233669ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbarstatic bool EvaluateInteger(const Expr* E, APSInt &Result, EvalInfo &Info) { 233747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue Val; 233869ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar if (!EvaluateIntegerOrLValue(E, Val, Info) || !Val.isInt()) 233930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return false; 234030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result = Val.getInt(); 234130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return true; 2342f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} 2343f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 2344043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedmanbool IntExprEvaluator::CheckReferencedDecl(const Expr* E, const Decl* D) { 23454c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // Enums are integer constant exprs. 2346bfbdcd861a4364bfc21a9e5047bdbd56812d6693Abramo Bagnara if (const EnumConstantDecl *ECD = dyn_cast<EnumConstantDecl>(D)) { 2347973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara // Check for signedness/width mismatches between E type and ECD value. 2348973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara bool SameSign = (ECD->getInitVal().isSigned() 2349973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara == E->getType()->isSignedIntegerOrEnumerationType()); 2350973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara bool SameWidth = (ECD->getInitVal().getBitWidth() 2351973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara == Info.Ctx.getIntWidth(E->getType())); 2352973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara if (SameSign && SameWidth) 2353973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara return Success(ECD->getInitVal(), E); 2354973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara else { 2355973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara // Get rid of mismatch (otherwise Success assertions will fail) 2356973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara // by computing a new value matching the type of E. 2357973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara llvm::APSInt Val = ECD->getInitVal(); 2358973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara if (!SameSign) 2359973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara Val.setIsSigned(!ECD->getInitVal().isSigned()); 2360973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara if (!SameWidth) 2361973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara Val = Val.extOrTrunc(Info.Ctx.getIntWidth(E->getType())); 2362973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara return Success(Val, E); 2363973c4fc0b0a88f9cea273b16f2082788a6e57d74Abramo Bagnara } 2364bfbdcd861a4364bfc21a9e5047bdbd56812d6693Abramo Bagnara } 23658cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return false; 23664c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner} 23674c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner 2368a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way 2369a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// as GCC. 2370a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattnerstatic int EvaluateBuiltinClassifyType(const CallExpr *E) { 2371a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // The following enum mimics the values returned by GCC. 23727c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // FIXME: Does GCC differ between lvalue and rvalue references here? 2373a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner enum gcc_type_class { 2374a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner no_type_class = -1, 2375a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner void_type_class, integer_type_class, char_type_class, 2376a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner enumeral_type_class, boolean_type_class, 2377a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner pointer_type_class, reference_type_class, offset_type_class, 2378a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner real_type_class, complex_type_class, 2379a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner function_type_class, method_type_class, 2380a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner record_type_class, union_type_class, 2381a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner array_type_class, string_type_class, 2382a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner lang_type_class 2383a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner }; 23841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If no argument was supplied, default to "no_type_class". This isn't 2386a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // ideal, however it is what gcc does. 2387a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner if (E->getNumArgs() == 0) 2388a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return no_type_class; 23891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2390a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner QualType ArgTy = E->getArg(0)->getType(); 2391a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner if (ArgTy->isVoidType()) 2392a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return void_type_class; 2393a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isEnumeralType()) 2394a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return enumeral_type_class; 2395a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isBooleanType()) 2396a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return boolean_type_class; 2397a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isCharType()) 2398a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return string_type_class; // gcc doesn't appear to use char_type_class 2399a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isIntegerType()) 2400a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return integer_type_class; 2401a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isPointerType()) 2402a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return pointer_type_class; 2403a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isReferenceType()) 2404a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return reference_type_class; 2405a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isRealType()) 2406a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return real_type_class; 2407a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isComplexType()) 2408a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return complex_type_class; 2409a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isFunctionType()) 2410a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return function_type_class; 2411fb87b89fc9eb103e19fb8e4b925c23f0bd091b99Douglas Gregor else if (ArgTy->isStructureOrClassType()) 2412a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return record_type_class; 2413a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isUnionType()) 2414a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return union_type_class; 2415a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isArrayType()) 2416a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return array_type_class; 2417a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isUnionType()) 2418a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return union_type_class; 2419a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else // FIXME: offset_type_class, method_type_class, & lang_type_class? 2420b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("CallExpr::isBuiltinClassifyType(): unimplemented type"); 2421a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return -1; 2422a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner} 2423a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 242442c8f87eb60958170c46767273bf93e6c96125bfJohn McCall/// Retrieves the "underlying object type" of the given expression, 242542c8f87eb60958170c46767273bf93e6c96125bfJohn McCall/// as used by __builtin_object_size. 242642c8f87eb60958170c46767273bf93e6c96125bfJohn McCallQualType IntExprEvaluator::GetObjectType(const Expr *E) { 242742c8f87eb60958170c46767273bf93e6c96125bfJohn McCall if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) { 242842c8f87eb60958170c46767273bf93e6c96125bfJohn McCall if (const VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl())) 242942c8f87eb60958170c46767273bf93e6c96125bfJohn McCall return VD->getType(); 243042c8f87eb60958170c46767273bf93e6c96125bfJohn McCall } else if (isa<CompoundLiteralExpr>(E)) { 243142c8f87eb60958170c46767273bf93e6c96125bfJohn McCall return E->getType(); 243242c8f87eb60958170c46767273bf93e6c96125bfJohn McCall } 243342c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 243442c8f87eb60958170c46767273bf93e6c96125bfJohn McCall return QualType(); 243542c8f87eb60958170c46767273bf93e6c96125bfJohn McCall} 243642c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 24378cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool IntExprEvaluator::TryEvaluateBuiltinObjectSize(const CallExpr *E) { 243842c8f87eb60958170c46767273bf93e6c96125bfJohn McCall // TODO: Perhaps we should let LLVM lower this? 243942c8f87eb60958170c46767273bf93e6c96125bfJohn McCall LValue Base; 244042c8f87eb60958170c46767273bf93e6c96125bfJohn McCall if (!EvaluatePointer(E->getArg(0), Base, Info)) 244142c8f87eb60958170c46767273bf93e6c96125bfJohn McCall return false; 244242c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 244342c8f87eb60958170c46767273bf93e6c96125bfJohn McCall // If we can prove the base is null, lower to zero now. 244442c8f87eb60958170c46767273bf93e6c96125bfJohn McCall const Expr *LVBase = Base.getLValueBase(); 244542c8f87eb60958170c46767273bf93e6c96125bfJohn McCall if (!LVBase) return Success(0, E); 244642c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 244742c8f87eb60958170c46767273bf93e6c96125bfJohn McCall QualType T = GetObjectType(LVBase); 244842c8f87eb60958170c46767273bf93e6c96125bfJohn McCall if (T.isNull() || 244942c8f87eb60958170c46767273bf93e6c96125bfJohn McCall T->isIncompleteType() || 24501357869bc5983cdfbc986db1f3d18265bb34cb0eEli Friedman T->isFunctionType() || 245142c8f87eb60958170c46767273bf93e6c96125bfJohn McCall T->isVariablyModifiedType() || 245242c8f87eb60958170c46767273bf93e6c96125bfJohn McCall T->isDependentType()) 245342c8f87eb60958170c46767273bf93e6c96125bfJohn McCall return false; 245442c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 245542c8f87eb60958170c46767273bf93e6c96125bfJohn McCall CharUnits Size = Info.Ctx.getTypeSizeInChars(T); 245642c8f87eb60958170c46767273bf93e6c96125bfJohn McCall CharUnits Offset = Base.getLValueOffset(); 245742c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 245842c8f87eb60958170c46767273bf93e6c96125bfJohn McCall if (!Offset.isNegative() && Offset <= Size) 245942c8f87eb60958170c46767273bf93e6c96125bfJohn McCall Size -= Offset; 246042c8f87eb60958170c46767273bf93e6c96125bfJohn McCall else 246142c8f87eb60958170c46767273bf93e6c96125bfJohn McCall Size = CharUnits::Zero(); 24624f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck return Success(Size, E); 246342c8f87eb60958170c46767273bf93e6c96125bfJohn McCall} 246442c8f87eb60958170c46767273bf93e6c96125bfJohn McCall 24658cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool IntExprEvaluator::VisitCallExpr(const CallExpr *E) { 2466180f47959a066795cc0f409433023af448bb0328Richard Smith switch (E->isBuiltinCall()) { 2467019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner default: 24688cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return ExprEvaluatorBaseTy::VisitCallExpr(E); 246964eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump 247064eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump case Builtin::BI__builtin_object_size: { 247142c8f87eb60958170c46767273bf93e6c96125bfJohn McCall if (TryEvaluateBuiltinObjectSize(E)) 247242c8f87eb60958170c46767273bf93e6c96125bfJohn McCall return true; 247364eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump 2474b2aaf51ed73a4774322a39a0dd59d0fe7e3258c0Eric Christopher // If evaluating the argument has side-effects we can't determine 2475b2aaf51ed73a4774322a39a0dd59d0fe7e3258c0Eric Christopher // the size of the object and lower it to unknown now. 2476393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian if (E->getArg(0)->HasSideEffects(Info.Ctx)) { 2477a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith if (E->getArg(1)->EvaluateKnownConstInt(Info.Ctx).getZExtValue() <= 1) 2478cf184655319cf7a5b811067cff9d26a5741fd161Chris Lattner return Success(-1ULL, E); 247964eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump return Success(0, E); 248064eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump } 2481c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 248264eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E); 248364eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump } 248464eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump 2485019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_classify_type: 2486131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(EvaluateBuiltinClassifyType(E), E); 24871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24884bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson case Builtin::BI__builtin_constant_p: 2489019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner // __builtin_constant_p always has one operand: it returns true if that 2490019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner // operand can be folded, false otherwise. 2491131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(E->getArg(0)->isEvaluatable(Info.Ctx), E); 249221fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner 249321fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner case Builtin::BI__builtin_eh_return_data_regno: { 2494a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith int Operand = E->getArg(0)->EvaluateKnownConstInt(Info.Ctx).getZExtValue(); 2495bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Operand = Info.Ctx.getTargetInfo().getEHDataRegisterNumber(Operand); 249621fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner return Success(Operand, E); 249721fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner } 2498c4a2638b5ef3e2d35d872614ceb655a7a22c58beEli Friedman 2499c4a2638b5ef3e2d35d872614ceb655a7a22c58beEli Friedman case Builtin::BI__builtin_expect: 2500c4a2638b5ef3e2d35d872614ceb655a7a22c58beEli Friedman return Visit(E->getArg(0)); 25015726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor 25025726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor case Builtin::BIstrlen: 25035726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor case Builtin::BI__builtin_strlen: 25045726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor // As an extension, we support strlen() and __builtin_strlen() as constant 25055726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor // expressions when the argument is a string literal. 25068cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne if (const StringLiteral *S 25075726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor = dyn_cast<StringLiteral>(E->getArg(0)->IgnoreParenImpCasts())) { 25085726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor // The string literal may have embedded null characters. Find the first 25095726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor // one and truncate there. 25105f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Str = S->getString(); 25115f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef::size_type Pos = Str.find(0); 25125f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner if (Pos != StringRef::npos) 25135726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor Str = Str.substr(0, Pos); 25145726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor 25155726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor return Success(Str.size(), E); 25165726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor } 25175726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor 25185726d405e71f11feaaf0c8f518abe26e909537a4Douglas Gregor return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E); 2519454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman 2520454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman case Builtin::BI__atomic_is_lock_free: { 2521454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman APSInt SizeVal; 2522454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman if (!EvaluateInteger(E->getArg(0), SizeVal, Info)) 2523454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman return false; 2524454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman 2525454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // For __atomic_is_lock_free(sizeof(_Atomic(T))), if the size is a power 2526454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // of two less than the maximum inline atomic width, we know it is 2527454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // lock-free. If the size isn't a power of two, or greater than the 2528454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // maximum alignment where we promote atomics, we know it is not lock-free 2529454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // (at least not in the sense of atomic_is_lock_free). Otherwise, 2530454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // the answer can only be determined at runtime; for example, 16-byte 2531454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // atomics have lock-free implementations on some, but not all, 2532454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // x86-64 processors. 2533454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman 2534454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // Check power-of-two. 2535454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman CharUnits Size = CharUnits::fromQuantity(SizeVal.getZExtValue()); 2536454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman if (!Size.isPowerOfTwo()) 2537454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman#if 0 2538454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // FIXME: Suppress this folding until the ABI for the promotion width 2539454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // settles. 2540454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman return Success(0, E); 2541454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman#else 2542454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E); 2543454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman#endif 2544454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman 2545454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman#if 0 2546454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // Check against promotion width. 2547454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // FIXME: Suppress this folding until the ABI for the promotion width 2548454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // settles. 2549454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman unsigned PromoteWidthBits = 2550454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman Info.Ctx.getTargetInfo().getMaxAtomicPromoteWidth(); 2551454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman if (Size > Info.Ctx.toCharUnitsFromBits(PromoteWidthBits)) 2552454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman return Success(0, E); 2553454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman#endif 2554454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman 2555454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman // Check against inlining width. 2556454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman unsigned InlineWidthBits = 2557454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman Info.Ctx.getTargetInfo().getMaxAtomicInlineWidth(); 2558454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman if (Size <= Info.Ctx.toCharUnitsFromBits(InlineWidthBits)) 2559454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman return Success(1, E); 2560454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman 2561454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E); 2562454b57ac42c9ce0bed9b7a99c2ed5a18fbcd286bEli Friedman } 2563019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner } 25644c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner} 2565f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 2566625b80755b603d28f36fb4212c81484d87ad08d3Richard Smithstatic bool HasSameBase(const LValue &A, const LValue &B) { 2567625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith if (!A.getLValueBase()) 2568625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith return !B.getLValueBase(); 2569625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith if (!B.getLValueBase()) 2570625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith return false; 2571625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith 2572625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith if (A.getLValueBase() != B.getLValueBase()) { 2573625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith const Decl *ADecl = GetLValueBaseDecl(A); 2574625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith if (!ADecl) 2575625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith return false; 2576625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith const Decl *BDecl = GetLValueBaseDecl(B); 25779a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith if (!BDecl || ADecl->getCanonicalDecl() != BDecl->getCanonicalDecl()) 2578625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith return false; 2579625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith } 2580625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith 2581625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith return IsGlobalLValue(A.getLValueBase()) || 2582177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith A.getLValueFrame() == B.getLValueFrame(); 2583625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith} 2584625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith 2585b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 2586c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (E->isAssignmentOp()) 2587c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E); 2588c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 25892de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (E->getOpcode() == BO_Comma) { 25908327fad71da34492d82c532f42a58cb4baff81a3Richard Smith VisitIgnoredValue(E->getLHS()); 25918327fad71da34492d82c532f42a58cb4baff81a3Richard Smith return Visit(E->getRHS()); 2592a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 2593a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 2594a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (E->isLogicalOp()) { 2595a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // These need to be handled specially because the operands aren't 2596a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // necessarily integral 2597fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson bool lhsResult, rhsResult; 25981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2599c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (EvaluateAsBooleanCondition(E->getLHS(), lhsResult, Info)) { 260051fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson // We were able to evaluate the LHS, see if we can get away with not 260151fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson // evaluating the RHS: 0 && X -> 0, 1 || X -> 1 26022de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (lhsResult == (E->getOpcode() == BO_LOr)) 26033f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return Success(lhsResult, E); 2604a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 2605c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (EvaluateAsBooleanCondition(E->getRHS(), rhsResult, Info)) { 26062de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (E->getOpcode() == BO_LOr) 2607131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(lhsResult || rhsResult, E); 26084bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson else 2609131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(lhsResult && rhsResult, E); 26104bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } 26114bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } else { 2612c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (EvaluateAsBooleanCondition(E->getRHS(), rhsResult, Info)) { 26134bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson // We can't evaluate the LHS; however, sometimes the result 26144bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson // is determined by the RHS: X && 0 -> 0, X || 1 -> 1. 26152de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (rhsResult == (E->getOpcode() == BO_LOr) || 26162de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall !rhsResult == (E->getOpcode() == BO_LAnd)) { 2617131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar // Since we weren't able to evaluate the left hand side, it 2618fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson // must have had side effects. 26191e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith Info.EvalStatus.HasSideEffects = true; 2620131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar 2621131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(rhsResult, E); 26224bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } 26234bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } 2624a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 2625a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 2626a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; 2627c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner } 262854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner 2629286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson QualType LHSTy = E->getLHS()->getType(); 2630286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson QualType RHSTy = E->getRHS()->getType(); 26314087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 26324087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (LHSTy->isAnyComplexType()) { 26334087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar assert(RHSTy->isAnyComplexType() && "Invalid comparison"); 2634f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexValue LHS, RHS; 26354087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 26364087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (!EvaluateComplex(E->getLHS(), LHS, Info)) 26374087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar return false; 26384087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 26394087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (!EvaluateComplex(E->getRHS(), RHS, Info)) 26404087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar return false; 26414087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 26424087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (LHS.isComplexFloat()) { 26431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump APFloat::cmpResult CR_r = 26444087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar LHS.getComplexFloatReal().compare(RHS.getComplexFloatReal()); 26451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump APFloat::cmpResult CR_i = 26464087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar LHS.getComplexFloatImag().compare(RHS.getComplexFloatImag()); 26474087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 26482de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (E->getOpcode() == BO_EQ) 2649131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success((CR_r == APFloat::cmpEqual && 2650131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar CR_i == APFloat::cmpEqual), E); 2651131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar else { 26522de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall assert(E->getOpcode() == BO_NE && 2653131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar "Invalid complex comparison."); 26541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return Success(((CR_r == APFloat::cmpGreaterThan || 2655fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang CR_r == APFloat::cmpLessThan || 2656fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang CR_r == APFloat::cmpUnordered) || 26571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump (CR_i == APFloat::cmpGreaterThan || 2658fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang CR_i == APFloat::cmpLessThan || 2659fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang CR_i == APFloat::cmpUnordered)), E); 2660131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 26614087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar } else { 26622de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (E->getOpcode() == BO_EQ) 2663131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success((LHS.getComplexIntReal() == RHS.getComplexIntReal() && 2664131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar LHS.getComplexIntImag() == RHS.getComplexIntImag()), E); 2665131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar else { 26662de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall assert(E->getOpcode() == BO_NE && 2667131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar "Invalid compex comparison."); 2668131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success((LHS.getComplexIntReal() != RHS.getComplexIntReal() || 2669131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar LHS.getComplexIntImag() != RHS.getComplexIntImag()), E); 2670131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 26714087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar } 26724087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar } 26731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2674286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (LHSTy->isRealFloatingType() && 2675286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson RHSTy->isRealFloatingType()) { 2676286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson APFloat RHS(0.0), LHS(0.0); 26771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2678286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (!EvaluateFloat(E->getRHS(), RHS, Info)) 2679286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson return false; 26801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2681286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (!EvaluateFloat(E->getLHS(), LHS, Info)) 2682286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson return false; 26831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2684286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson APFloat::cmpResult CR = LHS.compare(RHS); 2685529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson 2686286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson switch (E->getOpcode()) { 2687286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson default: 2688b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Invalid binary operator!"); 26892de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LT: 2690131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpLessThan, E); 26912de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_GT: 2692131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpGreaterThan, E); 26932de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LE: 2694131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpLessThan || CR == APFloat::cmpEqual, E); 26952de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_GE: 26961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return Success(CR == APFloat::cmpGreaterThan || CR == APFloat::cmpEqual, 2697131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar E); 26982de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_EQ: 2699131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpEqual, E); 27002de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_NE: 27011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return Success(CR == APFloat::cmpGreaterThan 2702fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang || CR == APFloat::cmpLessThan 2703fc39dc4c7886723310419b1869cf651ca55b7af4Mon P Wang || CR == APFloat::cmpUnordered, E); 2704286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson } 2705286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson } 27061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2707ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman if (LHSTy->isPointerType() && RHSTy->isPointerType()) { 2708625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith if (E->getOpcode() == BO_Sub || E->isComparisonOp()) { 2709efdb83e26f9a1fd2566afe54461216cd84814d42John McCall LValue LHSValue; 27103068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getLHS(), LHSValue, Info)) 27113068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return false; 2712a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 2713efdb83e26f9a1fd2566afe54461216cd84814d42John McCall LValue RHSValue; 27143068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getRHS(), RHSValue, Info)) 27153068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return false; 2716a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 2717625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith // Reject differing bases from the normal codepath; we special-case 2718625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith // comparisons to null. 2719625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith if (!HasSameBase(LHSValue, RHSValue)) { 27209e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith // Inequalities and subtractions between unrelated pointers have 27219e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith // unspecified or undefined behavior. 27225bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman if (!E->isEqualityOp()) 27235bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return false; 2724ffbda40a1fb7169591dc01771f3511178a2f727cEli Friedman // A constant address may compare equal to the address of a symbol. 2725ffbda40a1fb7169591dc01771f3511178a2f727cEli Friedman // The one exception is that address of an object cannot compare equal 2726c45061bd0c0fdad4df8eea7e9e5af186d11427e5Eli Friedman // to a null pointer constant. 2727ffbda40a1fb7169591dc01771f3511178a2f727cEli Friedman if ((!LHSValue.Base && !LHSValue.Offset.isZero()) || 2728ffbda40a1fb7169591dc01771f3511178a2f727cEli Friedman (!RHSValue.Base && !RHSValue.Offset.isZero())) 2729ffbda40a1fb7169591dc01771f3511178a2f727cEli Friedman return false; 27309e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith // It's implementation-defined whether distinct literals will have 2731c45061bd0c0fdad4df8eea7e9e5af186d11427e5Eli Friedman // distinct addresses. In clang, we do not guarantee the addresses are 273274f4634781cee06e28eb741bda5d0f936fdd1948Richard Smith // distinct. However, we do know that the address of a literal will be 273374f4634781cee06e28eb741bda5d0f936fdd1948Richard Smith // non-null. 273474f4634781cee06e28eb741bda5d0f936fdd1948Richard Smith if ((IsLiteralLValue(LHSValue) || IsLiteralLValue(RHSValue)) && 273574f4634781cee06e28eb741bda5d0f936fdd1948Richard Smith LHSValue.Base && RHSValue.Base) 27365bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return false; 27379e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith // We can't tell whether weak symbols will end up pointing to the same 27389e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith // object. 27399e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith if (IsWeakLValue(LHSValue) || IsWeakLValue(RHSValue)) 27405bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return false; 27419e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith // Pointers with different bases cannot represent the same object. 2742c45061bd0c0fdad4df8eea7e9e5af186d11427e5Eli Friedman // (Note that clang defaults to -fmerge-all-constants, which can 2743c45061bd0c0fdad4df8eea7e9e5af186d11427e5Eli Friedman // lead to inconsistent results for comparisons involving the address 2744c45061bd0c0fdad4df8eea7e9e5af186d11427e5Eli Friedman // of a constant; this generally doesn't matter in practice.) 27459e36b533af1b2fa9f32c4372c4081abdd86f47e0Richard Smith return Success(E->getOpcode() == BO_NE, E); 27465bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman } 2747a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 2748cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // FIXME: Implement the C++11 restrictions: 2749cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // - Pointer subtractions must be on elements of the same array. 2750cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith // - Pointer comparisons must be between members with the same access. 2751cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 27522de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (E->getOpcode() == BO_Sub) { 27534992bdde387c5f033bb450a716eaabc0fda52688Chris Lattner QualType Type = E->getLHS()->getType(); 27544992bdde387c5f033bb450a716eaabc0fda52688Chris Lattner QualType ElementType = Type->getAs<PointerType>()->getPointeeType(); 27553068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 2756180f47959a066795cc0f409433023af448bb0328Richard Smith CharUnits ElementSize; 2757180f47959a066795cc0f409433023af448bb0328Richard Smith if (!HandleSizeof(Info, ElementType, ElementSize)) 2758180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 2759a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 2760180f47959a066795cc0f409433023af448bb0328Richard Smith CharUnits Diff = LHSValue.getLValueOffset() - 2761a73058324197b7bdfd19307965954f626e26199dKen Dyck RHSValue.getLValueOffset(); 2762a73058324197b7bdfd19307965954f626e26199dKen Dyck return Success(Diff / ElementSize, E); 2763ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman } 2764625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith 2765625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith const CharUnits &LHSOffset = LHSValue.getLValueOffset(); 2766625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith const CharUnits &RHSOffset = RHSValue.getLValueOffset(); 2767625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith switch (E->getOpcode()) { 2768625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith default: llvm_unreachable("missing comparison operator"); 2769625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith case BO_LT: return Success(LHSOffset < RHSOffset, E); 2770625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith case BO_GT: return Success(LHSOffset > RHSOffset, E); 2771625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith case BO_LE: return Success(LHSOffset <= RHSOffset, E); 2772625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith case BO_GE: return Success(LHSOffset >= RHSOffset, E); 2773625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith case BO_EQ: return Success(LHSOffset == RHSOffset, E); 2774625b80755b603d28f36fb4212c81484d87ad08d3Richard Smith case BO_NE: return Success(LHSOffset != RHSOffset, E); 2775ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman } 27763068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 27773068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 27782ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor if (!LHSTy->isIntegralOrEnumerationType() || 27792ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor !RHSTy->isIntegralOrEnumerationType()) { 2780a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // We can't continue from here for non-integral types, and they 2781a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // could potentially confuse the following operations. 2782a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; 2783a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 2784a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 2785a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // The LHS of a constant expr is always evaluated and needed. 278647a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue LHSVal; 2787c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!EvaluateIntegerOrLValue(E->getLHS(), LHSVal, Info)) 2788a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; // error in subexpression. 2789d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman 2790c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!Visit(E->getRHS())) 279130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return false; 279247a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue &RHSVal = Result; 279342edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 279442edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman // Handle cases like (unsigned long)&a + 4. 2795c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (E->isAdditiveOp() && LHSVal.isLValue() && RHSVal.isInt()) { 2796a73058324197b7bdfd19307965954f626e26199dKen Dyck CharUnits AdditionalOffset = CharUnits::fromQuantity( 2797a73058324197b7bdfd19307965954f626e26199dKen Dyck RHSVal.getInt().getZExtValue()); 27982de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (E->getOpcode() == BO_Add) 279947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith LHSVal.getLValueOffset() += AdditionalOffset; 280042edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman else 280147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith LHSVal.getLValueOffset() -= AdditionalOffset; 280247a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Result = LHSVal; 280342edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman return true; 280442edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman } 280542edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 280642edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman // Handle cases like 4 + (unsigned long)&a 28072de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (E->getOpcode() == BO_Add && 2808c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith RHSVal.isLValue() && LHSVal.isInt()) { 280947a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith RHSVal.getLValueOffset() += CharUnits::fromQuantity( 281047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith LHSVal.getInt().getZExtValue()); 281147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith // Note that RHSVal is Result. 281242edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman return true; 281342edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman } 281442edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 281542edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman // All the following cases expect both operands to be an integer 2816c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!LHSVal.isInt() || !RHSVal.isInt()) 2817b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 2818a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 2819c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith APSInt &LHS = LHSVal.getInt(); 2820c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith APSInt &RHS = RHSVal.getInt(); 282142edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 2822a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson switch (E->getOpcode()) { 282332fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner default: 28240e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E); 2825c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_Mul: return Success(LHS * RHS, E); 2826c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_Add: return Success(LHS + RHS, E); 2827c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_Sub: return Success(LHS - RHS, E); 2828c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_And: return Success(LHS & RHS, E); 2829c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_Xor: return Success(LHS ^ RHS, E); 2830c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_Or: return Success(LHS | RHS, E); 28312de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Div: 283254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner if (RHS == 0) 28330e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E); 2834c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return Success(LHS / RHS, E); 28352de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Rem: 283654176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner if (RHS == 0) 28370e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E); 2838c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return Success(LHS % RHS, E); 28392de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Shl: { 2840091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall // During constant-folding, a negative shift is an opposite shift. 2841091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall if (RHS.isSigned() && RHS.isNegative()) { 2842091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall RHS = -RHS; 2843091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall goto shift_right; 2844091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall } 2845091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall 2846091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall shift_left: 2847091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall unsigned SA 2848c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith = (unsigned) RHS.getLimitedValue(LHS.getBitWidth()-1); 2849c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return Success(LHS << SA, E); 28503f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar } 28512de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Shr: { 2852091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall // During constant-folding, a negative shift is an opposite shift. 2853091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall if (RHS.isSigned() && RHS.isNegative()) { 2854091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall RHS = -RHS; 2855091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall goto shift_left; 2856091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall } 2857091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall 2858091f23f1d6d4bcffd6641cda72a6831e08c02ea7John McCall shift_right: 28591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned SA = 2860c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith (unsigned) RHS.getLimitedValue(LHS.getBitWidth()-1); 2861c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return Success(LHS >> SA, E); 28623f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar } 28631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2864c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_LT: return Success(LHS < RHS, E); 2865c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_GT: return Success(LHS > RHS, E); 2866c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_LE: return Success(LHS <= RHS, E); 2867c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_GE: return Success(LHS >= RHS, E); 2868c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_EQ: return Success(LHS == RHS, E); 2869c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith case BO_NE: return Success(LHS != RHS, E); 2870b11e77836dd0867955c5abf32baf1c3e6c7f81e1Eli Friedman } 2871a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 2872a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson 28738b752f10c394b140f9ef89e049cbad1a7676fc25Ken DyckCharUnits IntExprEvaluator::GetAlignOfType(QualType T) { 28745d484e8cf710207010720589d89602233de61d01Sebastian Redl // C++ [expr.sizeof]p2: "When applied to a reference or a reference type, 28755d484e8cf710207010720589d89602233de61d01Sebastian Redl // the result is the size of the referenced type." 28765d484e8cf710207010720589d89602233de61d01Sebastian Redl // C++ [expr.alignof]p3: "When alignof is applied to a reference type, the 28775d484e8cf710207010720589d89602233de61d01Sebastian Redl // result shall be the alignment of the referenced type." 28785d484e8cf710207010720589d89602233de61d01Sebastian Redl if (const ReferenceType *Ref = T->getAs<ReferenceType>()) 28795d484e8cf710207010720589d89602233de61d01Sebastian Redl T = Ref->getPointeeType(); 28809f1210c3280104417a4ad30f0a00825ac8fa718aChad Rosier 28819f1210c3280104417a4ad30f0a00825ac8fa718aChad Rosier // __alignof is defined to return the preferred alignment. 28829f1210c3280104417a4ad30f0a00825ac8fa718aChad Rosier return Info.Ctx.toCharUnitsFromBits( 28839f1210c3280104417a4ad30f0a00825ac8fa718aChad Rosier Info.Ctx.getPreferredTypeAlign(T.getTypePtr())); 2884e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner} 2885e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 28868b752f10c394b140f9ef89e049cbad1a7676fc25Ken DyckCharUnits IntExprEvaluator::GetAlignOfExpr(const Expr *E) { 2887af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner E = E->IgnoreParens(); 2888af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner 2889af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner // alignof decl is always accepted, even if it doesn't make sense: we default 28901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // to 1 in those cases. 2891af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) 28928b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck return Info.Ctx.getDeclAlign(DRE->getDecl(), 28938b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck /*RefAsPointee*/true); 2894a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 2895af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner if (const MemberExpr *ME = dyn_cast<MemberExpr>(E)) 28968b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck return Info.Ctx.getDeclAlign(ME->getMemberDecl(), 28978b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck /*RefAsPointee*/true); 2898af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner 2899e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner return GetAlignOfType(E->getType()); 2900e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner} 2901e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 2902e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 2903f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne/// VisitUnaryExprOrTypeTraitExpr - Evaluate a sizeof, alignof or vec_step with 2904f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne/// a result as the expression's type. 2905f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbournebool IntExprEvaluator::VisitUnaryExprOrTypeTraitExpr( 2906f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne const UnaryExprOrTypeTraitExpr *E) { 2907f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne switch(E->getKind()) { 2908f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case UETT_AlignOf: { 2909e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner if (E->isArgumentType()) 29104f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck return Success(GetAlignOfType(E->getArgumentType()), E); 2911e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner else 29124f3bc8f7aa90b72832b03bee9201c98f4bb6b4d1Ken Dyck return Success(GetAlignOfExpr(E->getArgumentExpr()), E); 2913e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner } 2914a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 2915f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case UETT_VecStep: { 2916f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne QualType Ty = E->getTypeOfArgument(); 29170518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl 2918f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne if (Ty->isVectorType()) { 2919f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne unsigned n = Ty->getAs<VectorType>()->getNumElements(); 2920a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 2921f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne // The vec_step built-in functions that take a 3-component 2922f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne // vector return 4. (OpenCL 1.1 spec 6.11.12) 2923f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne if (n == 3) 2924f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne n = 4; 2925f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne 2926f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne return Success(n, E); 2927f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne } else 2928f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne return Success(1, E); 2929f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne } 2930f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne 2931f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case UETT_SizeOf: { 2932f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne QualType SrcTy = E->getTypeOfArgument(); 2933f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne // C++ [expr.sizeof]p2: "When applied to a reference or a reference type, 2934f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne // the result is the size of the referenced type." 2935f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne // C++ [expr.alignof]p3: "When alignof is applied to a reference type, the 2936f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne // result shall be the alignment of the referenced type." 2937f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne if (const ReferenceType *Ref = SrcTy->getAs<ReferenceType>()) 2938f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne SrcTy = Ref->getPointeeType(); 2939f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman 2940180f47959a066795cc0f409433023af448bb0328Richard Smith CharUnits Sizeof; 2941180f47959a066795cc0f409433023af448bb0328Richard Smith if (!HandleSizeof(Info, SrcTy, Sizeof)) 2942f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne return false; 2943180f47959a066795cc0f409433023af448bb0328Richard Smith return Success(Sizeof, E); 2944f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne } 2945f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne } 2946f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne 2947f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne llvm_unreachable("unknown expr/type trait"); 2948f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne return false; 2949fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner} 2950fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner 29518cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool IntExprEvaluator::VisitOffsetOfExpr(const OffsetOfExpr *OOE) { 29528ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor CharUnits Result; 29538cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne unsigned n = OOE->getNumComponents(); 29548ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (n == 0) 29558ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return false; 29568cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne QualType CurrentType = OOE->getTypeSourceInfo()->getType(); 29578ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor for (unsigned i = 0; i != n; ++i) { 29588ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor OffsetOfExpr::OffsetOfNode ON = OOE->getComponent(i); 29598ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor switch (ON.getKind()) { 29608ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor case OffsetOfExpr::OffsetOfNode::Array: { 29618cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne const Expr *Idx = OOE->getIndexExpr(ON.getArrayExprIndex()); 29628ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor APSInt IdxResult; 29638ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (!EvaluateInteger(Idx, IdxResult, Info)) 29648ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return false; 29658ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor const ArrayType *AT = Info.Ctx.getAsArrayType(CurrentType); 29668ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (!AT) 29678ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return false; 29688ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor CurrentType = AT->getElementType(); 29698ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor CharUnits ElementSize = Info.Ctx.getTypeSizeInChars(CurrentType); 29708ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Result += IdxResult.getSExtValue() * ElementSize; 29718ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor break; 29728ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 29738ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 29748ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor case OffsetOfExpr::OffsetOfNode::Field: { 29758ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor FieldDecl *MemberDecl = ON.getField(); 29768ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor const RecordType *RT = CurrentType->getAs<RecordType>(); 29778ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (!RT) 29788ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return false; 29798ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor RecordDecl *RD = RT->getDecl(); 29808ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD); 2981ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall unsigned i = MemberDecl->getFieldIndex(); 2982cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor assert(i < RL.getFieldCount() && "offsetof field in wrong type"); 2983fb1e3bc29b667f4275e1d5a43d64ec173f4f9a7dKen Dyck Result += Info.Ctx.toCharUnitsFromBits(RL.getFieldOffset(i)); 29848ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor CurrentType = MemberDecl->getType().getNonReferenceType(); 29858ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor break; 29868ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 29878ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 29888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor case OffsetOfExpr::OffsetOfNode::Identifier: 29898ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor llvm_unreachable("dependent __builtin_offsetof"); 2990cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor return false; 2991cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor 2992cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor case OffsetOfExpr::OffsetOfNode::Base: { 2993cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor CXXBaseSpecifier *BaseSpec = ON.getBase(); 2994cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor if (BaseSpec->isVirtual()) 2995cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor return false; 2996cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor 2997cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor // Find the layout of the class whose base we are looking into. 2998cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor const RecordType *RT = CurrentType->getAs<RecordType>(); 2999cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor if (!RT) 3000cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor return false; 3001cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor RecordDecl *RD = RT->getDecl(); 3002cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD); 3003cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor 3004cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor // Find the base class itself. 3005cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor CurrentType = BaseSpec->getType(); 3006cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor const RecordType *BaseRT = CurrentType->getAs<RecordType>(); 3007cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor if (!BaseRT) 3008cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor return false; 3009cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor 3010cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor // Add the offset to the base. 30117c7f820d70c925b29290a8563b59615816a827fcKen Dyck Result += RL.getBaseClassOffset(cast<CXXRecordDecl>(BaseRT->getDecl())); 3012cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor break; 3013cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor } 30148ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 30158ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 30168cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return Success(Result, OOE); 30178ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor} 30188ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 3019b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { 30202de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (E->getOpcode() == UO_LNot) { 3021a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // LNot's operand isn't necessarily an integer, so we handle it specially. 3022a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman bool bres; 3023c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!EvaluateAsBooleanCondition(E->getSubExpr(), bres, Info)) 3024a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; 3025131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(!bres, E); 3026a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 3027a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 30284fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar // Only handle integral operations... 30292ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor if (!E->getSubExpr()->getType()->isIntegralOrEnumerationType()) 30304fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar return false; 30314fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar 3032c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // Get the operand value. 303347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue Val; 3034c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!Evaluate(Val, Info, E->getSubExpr())) 303575a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner return false; 3036a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson 303775a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner switch (E->getOpcode()) { 30384c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner default: 303975a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner // Address, indirect, pre/post inc/dec, etc are not valid constant exprs. 304075a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner // See C99 6.6p3. 30410e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E); 30422de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Extension: 30434c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // FIXME: Should extension allow i-c-e extension expressions in its scope? 30444c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // If so, we could clear the diagnostic ID. 3045c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return Success(Val, E); 30462de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Plus: 3047c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // The result is just the value. 3048c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return Success(Val, E); 30492de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Minus: 3050c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!Val.isInt()) return false; 3051c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return Success(-Val.getInt(), E); 30522de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Not: 3053c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!Val.isInt()) return false; 3054c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return Success(~Val.getInt(), E); 305506a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson } 3056a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 30571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3058732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// HandleCast - This is used to evaluate implicit or explicit casts where the 3059732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// result type is integer. 30608cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool IntExprEvaluator::VisitCastExpr(const CastExpr *E) { 30618cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne const Expr *SubExpr = E->getSubExpr(); 306282206e267ce6cc709797127616f64672d255b310Anders Carlsson QualType DestType = E->getType(); 3063b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar QualType SrcType = SubExpr->getType(); 306482206e267ce6cc709797127616f64672d255b310Anders Carlsson 306546a523285928aa07bf14803178dc04616ac85994Eli Friedman switch (E->getCastKind()) { 306646a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_BaseToDerived: 306746a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_DerivedToBase: 306846a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_UncheckedDerivedToBase: 306946a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_Dynamic: 307046a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_ToUnion: 307146a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_ArrayToPointerDecay: 307246a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_FunctionToPointerDecay: 307346a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_NullToPointer: 307446a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_NullToMemberPointer: 307546a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_BaseToDerivedMemberPointer: 307646a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_DerivedToBaseMemberPointer: 307746a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_ConstructorConversion: 307846a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_IntegralToPointer: 307946a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_ToVoid: 308046a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_VectorSplat: 308146a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_IntegralToFloating: 308246a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_FloatingCast: 30831d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall case CK_CPointerToObjCPointerCast: 30841d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall case CK_BlockPointerToObjCPointerCast: 308546a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_AnyPointerToBlockPointerCast: 308646a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_ObjCObjectLValueCast: 308746a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_FloatingRealToComplex: 308846a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_FloatingComplexToReal: 308946a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_FloatingComplexCast: 309046a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_FloatingComplexToIntegralComplex: 309146a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_IntegralRealToComplex: 309246a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_IntegralComplexCast: 309346a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_IntegralComplexToFloatingComplex: 309446a523285928aa07bf14803178dc04616ac85994Eli Friedman llvm_unreachable("invalid cast kind for integral value"); 309546a523285928aa07bf14803178dc04616ac85994Eli Friedman 3096e50c297f92914ca996deb8b597624193273b62e4Eli Friedman case CK_BitCast: 309746a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_Dependent: 309846a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_LValueBitCast: 309946a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_UserDefinedConversion: 310033e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall case CK_ARCProduceObject: 310133e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall case CK_ARCConsumeObject: 310233e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall case CK_ARCReclaimReturnedObject: 310333e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall case CK_ARCExtendBlockObject: 310446a523285928aa07bf14803178dc04616ac85994Eli Friedman return false; 310546a523285928aa07bf14803178dc04616ac85994Eli Friedman 310646a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_LValueToRValue: 310746a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_NoOp: 3108c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return ExprEvaluatorBaseTy::VisitCastExpr(E); 310946a523285928aa07bf14803178dc04616ac85994Eli Friedman 311046a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_MemberPointerToBoolean: 311146a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_PointerToBoolean: 311246a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_IntegralToBoolean: 311346a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_FloatingToBoolean: 311446a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_FloatingComplexToBoolean: 311546a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_IntegralComplexToBoolean: { 31164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool BoolResult; 3117c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!EvaluateAsBooleanCondition(SubExpr, BoolResult, Info)) 31184efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 3119131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(BoolResult, E); 31204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 31214efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 312246a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_IntegralCast: { 3123732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner if (!Visit(SubExpr)) 3124b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 3125a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 3126be26570e3faa009bdcefedfaf04473e518940520Eli Friedman if (!Result.isInt()) { 3127be26570e3faa009bdcefedfaf04473e518940520Eli Friedman // Only allow casts of lvalues if they are lossless. 3128be26570e3faa009bdcefedfaf04473e518940520Eli Friedman return Info.Ctx.getTypeSize(DestType) == Info.Ctx.getTypeSize(SrcType); 3129be26570e3faa009bdcefedfaf04473e518940520Eli Friedman } 313030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar 3131dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar return Success(HandleIntToIntCast(DestType, SrcType, 313230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result.getInt(), Info.Ctx), E); 3133732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner } 31341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 313546a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_PointerToIntegral: { 3136efdb83e26f9a1fd2566afe54461216cd84814d42John McCall LValue LV; 313787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!EvaluatePointer(SubExpr, LV, Info)) 3138b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 31394efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3140dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar if (LV.getLValueBase()) { 3141dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar // Only allow based lvalue casts if they are lossless. 3142dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(SrcType)) 3143dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar return false; 3144dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar 3145efdb83e26f9a1fd2566afe54461216cd84814d42John McCall LV.moveInto(Result); 3146dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar return true; 3147dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar } 31484efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3149a73058324197b7bdfd19307965954f626e26199dKen Dyck APSInt AsInt = Info.Ctx.MakeIntValue(LV.getLValueOffset().getQuantity(), 3150a73058324197b7bdfd19307965954f626e26199dKen Dyck SrcType); 3151dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar return Success(HandleIntToIntCast(DestType, SrcType, AsInt, Info.Ctx), E); 31522bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson } 31534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 315446a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_IntegralComplexToReal: { 3155f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexValue C; 31561725f683432715e5afe34d476024bd6f16eac3fcEli Friedman if (!EvaluateComplex(SubExpr, C, Info)) 31571725f683432715e5afe34d476024bd6f16eac3fcEli Friedman return false; 315846a523285928aa07bf14803178dc04616ac85994Eli Friedman return Success(C.getComplexIntReal(), E); 31591725f683432715e5afe34d476024bd6f16eac3fcEli Friedman } 31602217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman 316146a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_FloatingToIntegral: { 316246a523285928aa07bf14803178dc04616ac85994Eli Friedman APFloat F(0.0); 316346a523285928aa07bf14803178dc04616ac85994Eli Friedman if (!EvaluateFloat(SubExpr, F, Info)) 316446a523285928aa07bf14803178dc04616ac85994Eli Friedman return false; 3165732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner 316646a523285928aa07bf14803178dc04616ac85994Eli Friedman return Success(HandleFloatToIntCast(DestType, SrcType, F, Info.Ctx), E); 316746a523285928aa07bf14803178dc04616ac85994Eli Friedman } 316846a523285928aa07bf14803178dc04616ac85994Eli Friedman } 31691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 317046a523285928aa07bf14803178dc04616ac85994Eli Friedman llvm_unreachable("unknown cast resulting in integral value"); 317146a523285928aa07bf14803178dc04616ac85994Eli Friedman return false; 3172a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 31732bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 3174722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedmanbool IntExprEvaluator::VisitUnaryReal(const UnaryOperator *E) { 3175722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman if (E->getSubExpr()->getType()->isAnyComplexType()) { 3176f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexValue LV; 3177722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman if (!EvaluateComplex(E->getSubExpr(), LV, Info) || !LV.isComplexInt()) 3178722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E); 3179722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Success(LV.getComplexIntReal(), E); 3180722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman } 3181722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman 3182722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Visit(E->getSubExpr()); 3183722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman} 3184722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman 3185664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedmanbool IntExprEvaluator::VisitUnaryImag(const UnaryOperator *E) { 3186722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman if (E->getSubExpr()->getType()->isComplexIntegerType()) { 3187f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexValue LV; 3188722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman if (!EvaluateComplex(E->getSubExpr(), LV, Info) || !LV.isComplexInt()) 3189722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E); 3190722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Success(LV.getComplexIntImag(), E); 3191722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman } 3192722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman 31938327fad71da34492d82c532f42a58cb4baff81a3Richard Smith VisitIgnoredValue(E->getSubExpr()); 3194664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman return Success(0, E); 3195664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman} 3196664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman 3197ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregorbool IntExprEvaluator::VisitSizeOfPackExpr(const SizeOfPackExpr *E) { 3198ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor return Success(E->getPackLength(), E); 3199ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor} 3200ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor 3201295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlbool IntExprEvaluator::VisitCXXNoexceptExpr(const CXXNoexceptExpr *E) { 3202295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl return Success(E->getValue(), E); 3203295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl} 3204295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl 3205f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 3206d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman// Float Evaluation 3207d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===// 3208d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 3209d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmannamespace { 3210770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass FloatExprEvaluator 32118cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : public ExprEvaluatorBase<FloatExprEvaluator, bool> { 3212d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman APFloat &Result; 3213d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanpublic: 3214d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman FloatExprEvaluator(EvalInfo &info, APFloat &result) 32158cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : ExprEvaluatorBaseTy(info), Result(result) {} 3216d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 321747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith bool Success(const CCValue &V, const Expr *e) { 32188cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne Result = V.getFloat(); 32198cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return true; 32208cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 32218cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool Error(const Stmt *S) { 3222d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 3223d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } 3224d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 3225f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith bool ValueInitialization(const Expr *E) { 3226f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith Result = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(E->getType())); 3227f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith return true; 3228f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith } 3229f10d9171ac24380ca94c71847a9270a05b791cefRichard Smith 3230019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner bool VisitCallExpr(const CallExpr *E); 3231d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 32325db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar bool VisitUnaryOperator(const UnaryOperator *E); 3233d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitBinaryOperator(const BinaryOperator *E); 3234d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitFloatingLiteral(const FloatingLiteral *E); 32358cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCastExpr(const CastExpr *E); 32362217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman 3237abd3a857ace59100305790545d1baae5877b8945John McCall bool VisitUnaryReal(const UnaryOperator *E); 3238abd3a857ace59100305790545d1baae5877b8945John McCall bool VisitUnaryImag(const UnaryOperator *E); 3239ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman 3240abd3a857ace59100305790545d1baae5877b8945John McCall // FIXME: Missing: array subscript of vector, member of vector, 3241abd3a857ace59100305790545d1baae5877b8945John McCall // ImplicitValueInitExpr 3242d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}; 3243d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} // end anonymous namespace 3244d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 3245d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr* E, APFloat& Result, EvalInfo &Info) { 3246c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith assert(E->isRValue() && E->getType()->isRealFloatingType()); 32478cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return FloatExprEvaluator(Info, Result).Visit(E); 3248d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 3249d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 32504ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadstatic bool TryEvaluateBuiltinNaN(const ASTContext &Context, 3251db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall QualType ResultTy, 3252db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall const Expr *Arg, 3253db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall bool SNaN, 3254db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall llvm::APFloat &Result) { 3255db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall const StringLiteral *S = dyn_cast<StringLiteral>(Arg->IgnoreParenCasts()); 3256db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall if (!S) return false; 3257db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall 3258db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall const llvm::fltSemantics &Sem = Context.getFloatTypeSemantics(ResultTy); 3259db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall 3260db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall llvm::APInt fill; 3261db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall 3262db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall // Treat empty strings as if they were zero. 3263db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall if (S->getString().empty()) 3264db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall fill = llvm::APInt(32, 0); 3265db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall else if (S->getString().getAsInteger(0, fill)) 3266db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall return false; 3267db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall 3268db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall if (SNaN) 3269db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall Result = llvm::APFloat::getSNaN(Sem, false, &fill); 3270db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall else 3271db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall Result = llvm::APFloat::getQNaN(Sem, false, &fill); 3272db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall return true; 3273db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall} 3274db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall 3275019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattnerbool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) { 3276180f47959a066795cc0f409433023af448bb0328Richard Smith switch (E->isBuiltinCall()) { 32778cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne default: 32788cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return ExprEvaluatorBaseTy::VisitCallExpr(E); 32798cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne 3280019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_val: 3281019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_valf: 3282019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_vall: 3283019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_inf: 3284019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_inff: 32857cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar case Builtin::BI__builtin_infl: { 32867cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar const llvm::fltSemantics &Sem = 32877cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar Info.Ctx.getFloatTypeSemantics(E->getType()); 328834a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner Result = llvm::APFloat::getInf(Sem); 328934a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner return true; 32907cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar } 32911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3292db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall case Builtin::BI__builtin_nans: 3293db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall case Builtin::BI__builtin_nansf: 3294db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall case Builtin::BI__builtin_nansl: 3295db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall return TryEvaluateBuiltinNaN(Info.Ctx, E->getType(), E->getArg(0), 3296db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall true, Result); 3297db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall 32989e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nan: 32999e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nanf: 33009e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nanl: 33014572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump // If this is __builtin_nan() turn this into a nan, otherwise we 33029e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner // can't constant fold it. 3303db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall return TryEvaluateBuiltinNaN(Info.Ctx, E->getType(), E->getArg(0), 3304db7b72a82a6834680ccf1eeb51dc57e6d935c655John McCall false, Result); 33055db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 33065db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabs: 33075db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabsf: 33085db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabsl: 33095db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (!EvaluateFloat(E->getArg(0), Result, Info)) 33105db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return false; 33111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 33125db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (Result.isNegative()) 33135db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.changeSign(); 33145db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 33155db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 33161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case Builtin::BI__builtin_copysign: 33171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case Builtin::BI__builtin_copysignf: 33185db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_copysignl: { 33195db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar APFloat RHS(0.); 33205db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (!EvaluateFloat(E->getArg(0), Result, Info) || 33215db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar !EvaluateFloat(E->getArg(1), RHS, Info)) 33225db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return false; 33235db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.copySign(RHS); 33245db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 33255db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar } 3326019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner } 3327019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner} 3328019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner 3329abd3a857ace59100305790545d1baae5877b8945John McCallbool FloatExprEvaluator::VisitUnaryReal(const UnaryOperator *E) { 333043efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman if (E->getSubExpr()->getType()->isAnyComplexType()) { 333143efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman ComplexValue CV; 333243efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman if (!EvaluateComplex(E->getSubExpr(), CV, Info)) 333343efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman return false; 333443efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman Result = CV.FloatReal; 333543efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman return true; 333643efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman } 333743efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman 333843efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman return Visit(E->getSubExpr()); 3339abd3a857ace59100305790545d1baae5877b8945John McCall} 3340abd3a857ace59100305790545d1baae5877b8945John McCall 3341abd3a857ace59100305790545d1baae5877b8945John McCallbool FloatExprEvaluator::VisitUnaryImag(const UnaryOperator *E) { 334243efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman if (E->getSubExpr()->getType()->isAnyComplexType()) { 334343efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman ComplexValue CV; 334443efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman if (!EvaluateComplex(E->getSubExpr(), CV, Info)) 334543efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman return false; 334643efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman Result = CV.FloatImag; 334743efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman return true; 334843efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman } 334943efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman 33508327fad71da34492d82c532f42a58cb4baff81a3Richard Smith VisitIgnoredValue(E->getSubExpr()); 335143efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman const llvm::fltSemantics &Sem = Info.Ctx.getFloatTypeSemantics(E->getType()); 335243efa31fe601bb7c3f132f02246dc3c903d9f361Eli Friedman Result = llvm::APFloat::getZero(Sem); 3353abd3a857ace59100305790545d1baae5877b8945John McCall return true; 3354abd3a857ace59100305790545d1baae5877b8945John McCall} 3355abd3a857ace59100305790545d1baae5877b8945John McCall 33565db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbarbool FloatExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { 33575db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar switch (E->getOpcode()) { 33585db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar default: return false; 33592de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Plus: 33607993e8a2a26bf408c2a6d45f24fffa12db336b2bRichard Smith return EvaluateFloat(E->getSubExpr(), Result, Info); 33612de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Minus: 33627993e8a2a26bf408c2a6d45f24fffa12db336b2bRichard Smith if (!EvaluateFloat(E->getSubExpr(), Result, Info)) 33637993e8a2a26bf408c2a6d45f24fffa12db336b2bRichard Smith return false; 33645db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.changeSign(); 33655db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 33665db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar } 33675db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar} 3368019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner 3369d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 33702de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (E->getOpcode() == BO_Comma) { 33718327fad71da34492d82c532f42a58cb4baff81a3Richard Smith VisitIgnoredValue(E->getLHS()); 33728327fad71da34492d82c532f42a58cb4baff81a3Richard Smith return Visit(E->getRHS()); 33737f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman } 33747f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman 3375ee591a90c2e26c1ba33a4befb364a1c35fb2c311Richard Smith // We can't evaluate pointer-to-member operations or assignments. 3376ee591a90c2e26c1ba33a4befb364a1c35fb2c311Richard Smith if (E->isPtrMemOp() || E->isAssignmentOp()) 337796e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson return false; 337896e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson 3379d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman // FIXME: Diagnostics? I really don't understand how the warnings 3380d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman // and errors are supposed to work. 33815db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar APFloat RHS(0.0); 3382d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (!EvaluateFloat(E->getLHS(), Result, Info)) 3383d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 3384d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (!EvaluateFloat(E->getRHS(), RHS, Info)) 3385d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 3386d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 3387d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman switch (E->getOpcode()) { 3388d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman default: return false; 33892de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Mul: 3390d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.multiply(RHS, APFloat::rmNearestTiesToEven); 3391d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 33922de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Add: 3393d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.add(RHS, APFloat::rmNearestTiesToEven); 3394d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 33952de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Sub: 3396d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.subtract(RHS, APFloat::rmNearestTiesToEven); 3397d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 33982de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Div: 3399d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.divide(RHS, APFloat::rmNearestTiesToEven); 3400d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 3401d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } 3402d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 3403d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 3404d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitFloatingLiteral(const FloatingLiteral *E) { 3405d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result = E->getValue(); 3406d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 3407d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 3408d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 34098cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool FloatExprEvaluator::VisitCastExpr(const CastExpr *E) { 34108cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne const Expr* SubExpr = E->getSubExpr(); 34111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34122a523eec6a31955be876625819b89e8dc5def707Eli Friedman switch (E->getCastKind()) { 34132a523eec6a31955be876625819b89e8dc5def707Eli Friedman default: 3414c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return ExprEvaluatorBaseTy::VisitCastExpr(E); 34152a523eec6a31955be876625819b89e8dc5def707Eli Friedman 34162a523eec6a31955be876625819b89e8dc5def707Eli Friedman case CK_IntegralToFloating: { 34174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APSInt IntResult; 34183f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar if (!EvaluateInteger(SubExpr, IntResult, Info)) 34194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 34201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result = HandleIntToFloatCast(E->getType(), SubExpr->getType(), 3421a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar IntResult, Info.Ctx); 34224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 34234efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 34242a523eec6a31955be876625819b89e8dc5def707Eli Friedman 34252a523eec6a31955be876625819b89e8dc5def707Eli Friedman case CK_FloatingCast: { 34264efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!Visit(SubExpr)) 34274efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 3428a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result = HandleFloatToFloatCast(E->getType(), SubExpr->getType(), 3429a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result, Info.Ctx); 34304efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 34314efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 3432f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall 34332a523eec6a31955be876625819b89e8dc5def707Eli Friedman case CK_FloatingComplexToReal: { 3434f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall ComplexValue V; 3435f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall if (!EvaluateComplex(SubExpr, V, Info)) 3436f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall return false; 3437f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall Result = V.getComplexFloatReal(); 3438f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall return true; 3439f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall } 34402a523eec6a31955be876625819b89e8dc5def707Eli Friedman } 34414efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 34424efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 34434efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 34444efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3445d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===// 3446a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar// Complex Evaluation (for float and integer) 34479ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===// 34489ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 34499ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonnamespace { 3450770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass ComplexExprEvaluator 34518cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : public ExprEvaluatorBase<ComplexExprEvaluator, bool> { 3452f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexValue &Result; 34531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34549ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonpublic: 3455f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexExprEvaluator(EvalInfo &info, ComplexValue &Result) 34568cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne : ExprEvaluatorBaseTy(info), Result(Result) {} 34571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 345847a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith bool Success(const CCValue &V, const Expr *e) { 34598cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne Result.setFrom(V); 34608cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return true; 34618cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 34628cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool Error(const Expr *E) { 3463f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall return false; 34649ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson } 34651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34668cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne //===--------------------------------------------------------------------===// 34678cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne // Visitor Methods 34688cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne //===--------------------------------------------------------------------===// 34699ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 34708cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitImaginaryLiteral(const ImaginaryLiteral *E); 3471a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 34728cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne bool VisitCastExpr(const CastExpr *E); 3473b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman 3474b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman bool VisitBinaryOperator(const BinaryOperator *E); 347596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara bool VisitUnaryOperator(const UnaryOperator *E); 3476cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl // FIXME Missing: ImplicitValueInitExpr, InitListExpr 3477b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman}; 3478b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman} // end anonymous namespace 34791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3480b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedmanstatic bool EvaluateComplex(const Expr *E, ComplexValue &Result, 3481b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman EvalInfo &Info) { 3482c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith assert(E->isRValue() && E->getType()->isAnyComplexType()); 34838cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return ComplexExprEvaluator(Info, Result).Visit(E); 3484b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman} 3485b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman 34868cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool ComplexExprEvaluator::VisitImaginaryLiteral(const ImaginaryLiteral *E) { 34878cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne const Expr* SubExpr = E->getSubExpr(); 3488b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman 3489b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman if (SubExpr->getType()->isRealFloatingType()) { 3490b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman Result.makeComplexFloat(); 3491b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman APFloat &Imag = Result.FloatImag; 3492b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman if (!EvaluateFloat(SubExpr, Imag, Info)) 3493b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman return false; 3494b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman 3495b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman Result.FloatReal = APFloat(Imag.getSemantics()); 3496b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman return true; 3497b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman } else { 3498b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman assert(SubExpr->getType()->isIntegerType() && 3499b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman "Unexpected imaginary literal."); 3500b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman 3501b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman Result.makeComplexInt(); 3502b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman APSInt &Imag = Result.IntImag; 3503b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman if (!EvaluateInteger(SubExpr, Imag, Info)) 3504b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman return false; 3505b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman 3506b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman Result.IntReal = APSInt(Imag.getBitWidth(), !Imag.isSigned()); 3507b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman return true; 3508b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman } 3509b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman} 3510b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman 35118cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbournebool ComplexExprEvaluator::VisitCastExpr(const CastExpr *E) { 3512b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman 35138786da77984e81d48e0e1b2bd339809b1efc19f3John McCall switch (E->getCastKind()) { 35148786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_BitCast: 35158786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_BaseToDerived: 35168786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_DerivedToBase: 35178786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_UncheckedDerivedToBase: 35188786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_Dynamic: 35198786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_ToUnion: 35208786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_ArrayToPointerDecay: 35218786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_FunctionToPointerDecay: 35228786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_NullToPointer: 35238786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_NullToMemberPointer: 35248786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_BaseToDerivedMemberPointer: 35258786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_DerivedToBaseMemberPointer: 35268786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_MemberPointerToBoolean: 35278786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_ConstructorConversion: 35288786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_IntegralToPointer: 35298786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_PointerToIntegral: 35308786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_PointerToBoolean: 35318786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_ToVoid: 35328786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_VectorSplat: 35338786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_IntegralCast: 35348786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_IntegralToBoolean: 35358786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_IntegralToFloating: 35368786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_FloatingToIntegral: 35378786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_FloatingToBoolean: 35388786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_FloatingCast: 35391d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall case CK_CPointerToObjCPointerCast: 35401d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall case CK_BlockPointerToObjCPointerCast: 35418786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_AnyPointerToBlockPointerCast: 35428786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_ObjCObjectLValueCast: 35438786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_FloatingComplexToReal: 35448786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_FloatingComplexToBoolean: 35458786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_IntegralComplexToReal: 35468786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_IntegralComplexToBoolean: 354733e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall case CK_ARCProduceObject: 354833e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall case CK_ARCConsumeObject: 354933e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall case CK_ARCReclaimReturnedObject: 355033e56f3273457bfa22c7c50bc46cf5a18216863dJohn McCall case CK_ARCExtendBlockObject: 35518786da77984e81d48e0e1b2bd339809b1efc19f3John McCall llvm_unreachable("invalid cast kind for complex value"); 35528786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 35538786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_LValueToRValue: 35548786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_NoOp: 3555c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return ExprEvaluatorBaseTy::VisitCastExpr(E); 35562bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall 35578786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_Dependent: 355846a523285928aa07bf14803178dc04616ac85994Eli Friedman case CK_LValueBitCast: 35598786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_UserDefinedConversion: 35608786da77984e81d48e0e1b2bd339809b1efc19f3John McCall return false; 35618786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 35628786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_FloatingRealToComplex: { 3563b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman APFloat &Real = Result.FloatReal; 35648786da77984e81d48e0e1b2bd339809b1efc19f3John McCall if (!EvaluateFloat(E->getSubExpr(), Real, Info)) 3565b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman return false; 3566b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman 35678786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.makeComplexFloat(); 35688786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.FloatImag = APFloat(Real.getSemantics()); 35698786da77984e81d48e0e1b2bd339809b1efc19f3John McCall return true; 35708786da77984e81d48e0e1b2bd339809b1efc19f3John McCall } 35718786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 35728786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_FloatingComplexCast: { 35738786da77984e81d48e0e1b2bd339809b1efc19f3John McCall if (!Visit(E->getSubExpr())) 35748786da77984e81d48e0e1b2bd339809b1efc19f3John McCall return false; 35758786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 35768786da77984e81d48e0e1b2bd339809b1efc19f3John McCall QualType To = E->getType()->getAs<ComplexType>()->getElementType(); 35778786da77984e81d48e0e1b2bd339809b1efc19f3John McCall QualType From 35788786da77984e81d48e0e1b2bd339809b1efc19f3John McCall = E->getSubExpr()->getType()->getAs<ComplexType>()->getElementType(); 35798786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 35808786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.FloatReal 35818786da77984e81d48e0e1b2bd339809b1efc19f3John McCall = HandleFloatToFloatCast(To, From, Result.FloatReal, Info.Ctx); 35828786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.FloatImag 35838786da77984e81d48e0e1b2bd339809b1efc19f3John McCall = HandleFloatToFloatCast(To, From, Result.FloatImag, Info.Ctx); 35848786da77984e81d48e0e1b2bd339809b1efc19f3John McCall return true; 35858786da77984e81d48e0e1b2bd339809b1efc19f3John McCall } 35868786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 35878786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_FloatingComplexToIntegralComplex: { 35888786da77984e81d48e0e1b2bd339809b1efc19f3John McCall if (!Visit(E->getSubExpr())) 35898786da77984e81d48e0e1b2bd339809b1efc19f3John McCall return false; 35908786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 35918786da77984e81d48e0e1b2bd339809b1efc19f3John McCall QualType To = E->getType()->getAs<ComplexType>()->getElementType(); 35928786da77984e81d48e0e1b2bd339809b1efc19f3John McCall QualType From 35938786da77984e81d48e0e1b2bd339809b1efc19f3John McCall = E->getSubExpr()->getType()->getAs<ComplexType>()->getElementType(); 35948786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.makeComplexInt(); 35958786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.IntReal = HandleFloatToIntCast(To, From, Result.FloatReal, Info.Ctx); 35968786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.IntImag = HandleFloatToIntCast(To, From, Result.FloatImag, Info.Ctx); 35978786da77984e81d48e0e1b2bd339809b1efc19f3John McCall return true; 35988786da77984e81d48e0e1b2bd339809b1efc19f3John McCall } 35998786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 36008786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_IntegralRealToComplex: { 3601b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman APSInt &Real = Result.IntReal; 36028786da77984e81d48e0e1b2bd339809b1efc19f3John McCall if (!EvaluateInteger(E->getSubExpr(), Real, Info)) 3603b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman return false; 36049ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 36058786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.makeComplexInt(); 36068786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.IntImag = APSInt(Real.getBitWidth(), !Real.isSigned()); 36078786da77984e81d48e0e1b2bd339809b1efc19f3John McCall return true; 36088786da77984e81d48e0e1b2bd339809b1efc19f3John McCall } 36098786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 36108786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_IntegralComplexCast: { 36118786da77984e81d48e0e1b2bd339809b1efc19f3John McCall if (!Visit(E->getSubExpr())) 3612b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman return false; 3613ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 36148786da77984e81d48e0e1b2bd339809b1efc19f3John McCall QualType To = E->getType()->getAs<ComplexType>()->getElementType(); 36158786da77984e81d48e0e1b2bd339809b1efc19f3John McCall QualType From 36168786da77984e81d48e0e1b2bd339809b1efc19f3John McCall = E->getSubExpr()->getType()->getAs<ComplexType>()->getElementType(); 36171725f683432715e5afe34d476024bd6f16eac3fcEli Friedman 36188786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.IntReal = HandleIntToIntCast(To, From, Result.IntReal, Info.Ctx); 36198786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.IntImag = HandleIntToIntCast(To, From, Result.IntImag, Info.Ctx); 36208786da77984e81d48e0e1b2bd339809b1efc19f3John McCall return true; 36218786da77984e81d48e0e1b2bd339809b1efc19f3John McCall } 36228786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 36238786da77984e81d48e0e1b2bd339809b1efc19f3John McCall case CK_IntegralComplexToFloatingComplex: { 36248786da77984e81d48e0e1b2bd339809b1efc19f3John McCall if (!Visit(E->getSubExpr())) 36258786da77984e81d48e0e1b2bd339809b1efc19f3John McCall return false; 36268786da77984e81d48e0e1b2bd339809b1efc19f3John McCall 36278786da77984e81d48e0e1b2bd339809b1efc19f3John McCall QualType To = E->getType()->getAs<ComplexType>()->getElementType(); 36288786da77984e81d48e0e1b2bd339809b1efc19f3John McCall QualType From 36298786da77984e81d48e0e1b2bd339809b1efc19f3John McCall = E->getSubExpr()->getType()->getAs<ComplexType>()->getElementType(); 36308786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.makeComplexFloat(); 36318786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.FloatReal = HandleIntToFloatCast(To, From, Result.IntReal, Info.Ctx); 36328786da77984e81d48e0e1b2bd339809b1efc19f3John McCall Result.FloatImag = HandleIntToFloatCast(To, From, Result.IntImag, Info.Ctx); 36338786da77984e81d48e0e1b2bd339809b1efc19f3John McCall return true; 36348786da77984e81d48e0e1b2bd339809b1efc19f3John McCall } 3635ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson } 36361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36378786da77984e81d48e0e1b2bd339809b1efc19f3John McCall llvm_unreachable("unknown cast resulting in complex value"); 3638b2dc7f59fe4c762cba73badc3bbc6f356fcd7b5bEli Friedman return false; 36399ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson} 36409ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 3641f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCallbool ComplexExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 364296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara if (E->getOpcode() == BO_Comma) { 36438327fad71da34492d82c532f42a58cb4baff81a3Richard Smith VisitIgnoredValue(E->getLHS()); 36448327fad71da34492d82c532f42a58cb4baff81a3Richard Smith return Visit(E->getRHS()); 364596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara } 3646f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall if (!Visit(E->getLHS())) 3647f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall return false; 36481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3649f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexValue RHS; 3650a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateComplex(E->getRHS(), RHS, Info)) 3651f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall return false; 3652a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 36533f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar assert(Result.isComplexFloat() == RHS.isComplexFloat() && 36543f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar "Invalid operands to binary operator."); 3655ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson switch (E->getOpcode()) { 3656f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall default: return false; 36572de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Add: 3658a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (Result.isComplexFloat()) { 3659a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatReal().add(RHS.getComplexFloatReal(), 3660a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 3661a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatImag().add(RHS.getComplexFloatImag(), 3662a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 3663a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else { 3664a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntReal() += RHS.getComplexIntReal(); 3665a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntImag() += RHS.getComplexIntImag(); 3666a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } 36673f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar break; 36682de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Sub: 3669a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (Result.isComplexFloat()) { 3670a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatReal().subtract(RHS.getComplexFloatReal(), 3671a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 3672a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatImag().subtract(RHS.getComplexFloatImag(), 3673a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 3674a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else { 3675a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntReal() -= RHS.getComplexIntReal(); 3676a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntImag() -= RHS.getComplexIntImag(); 3677a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } 36783f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar break; 36792de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Mul: 36803f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar if (Result.isComplexFloat()) { 3681f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexValue LHS = Result; 36823f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &LHS_r = LHS.getComplexFloatReal(); 36833f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &LHS_i = LHS.getComplexFloatImag(); 36843f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &RHS_r = RHS.getComplexFloatReal(); 36853f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &RHS_i = RHS.getComplexFloatImag(); 36861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36873f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat Tmp = LHS_r; 36883f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven); 36893f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatReal() = Tmp; 36903f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp = LHS_i; 36913f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven); 36923f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatReal().subtract(Tmp, APFloat::rmNearestTiesToEven); 36933f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar 36943f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp = LHS_r; 36953f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven); 36963f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatImag() = Tmp; 36973f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp = LHS_i; 36983f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven); 36993f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatImag().add(Tmp, APFloat::rmNearestTiesToEven); 37003f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar } else { 3701f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall ComplexValue LHS = Result; 37021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.getComplexIntReal() = 37033f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar (LHS.getComplexIntReal() * RHS.getComplexIntReal() - 37043f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar LHS.getComplexIntImag() * RHS.getComplexIntImag()); 37051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.getComplexIntImag() = 37063f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar (LHS.getComplexIntReal() * RHS.getComplexIntImag() + 37073f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar LHS.getComplexIntImag() * RHS.getComplexIntReal()); 37083f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar } 37093f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar break; 371096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara case BO_Div: 371196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara if (Result.isComplexFloat()) { 371296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara ComplexValue LHS = Result; 371396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara APFloat &LHS_r = LHS.getComplexFloatReal(); 371496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara APFloat &LHS_i = LHS.getComplexFloatImag(); 371596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara APFloat &RHS_r = RHS.getComplexFloatReal(); 371696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara APFloat &RHS_i = RHS.getComplexFloatImag(); 371796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara APFloat &Res_r = Result.getComplexFloatReal(); 371896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara APFloat &Res_i = Result.getComplexFloatImag(); 371996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara 372096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara APFloat Den = RHS_r; 372196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Den.multiply(RHS_r, APFloat::rmNearestTiesToEven); 372296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara APFloat Tmp = RHS_i; 372396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven); 372496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Den.add(Tmp, APFloat::rmNearestTiesToEven); 372596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara 372696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Res_r = LHS_r; 372796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Res_r.multiply(RHS_r, APFloat::rmNearestTiesToEven); 372896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Tmp = LHS_i; 372996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven); 373096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Res_r.add(Tmp, APFloat::rmNearestTiesToEven); 373196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Res_r.divide(Den, APFloat::rmNearestTiesToEven); 373296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara 373396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Res_i = LHS_i; 373496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Res_i.multiply(RHS_r, APFloat::rmNearestTiesToEven); 373596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Tmp = LHS_r; 373696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven); 373796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Res_i.subtract(Tmp, APFloat::rmNearestTiesToEven); 373896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Res_i.divide(Den, APFloat::rmNearestTiesToEven); 373996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara } else { 374096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara if (RHS.getComplexIntReal() == 0 && RHS.getComplexIntImag() == 0) { 374196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara // FIXME: what about diagnostics? 374296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara return false; 374396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara } 374496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara ComplexValue LHS = Result; 374596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara APSInt Den = RHS.getComplexIntReal() * RHS.getComplexIntReal() + 374696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara RHS.getComplexIntImag() * RHS.getComplexIntImag(); 374796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Result.getComplexIntReal() = 374896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara (LHS.getComplexIntReal() * RHS.getComplexIntReal() + 374996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara LHS.getComplexIntImag() * RHS.getComplexIntImag()) / Den; 375096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Result.getComplexIntImag() = 375196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara (LHS.getComplexIntImag() * RHS.getComplexIntReal() - 375296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara LHS.getComplexIntReal() * RHS.getComplexIntImag()) / Den; 375396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara } 375496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara break; 3755ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson } 3756ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 3757f4cf1a18d09d57b757b3cb47eab36c1457091ef7John McCall return true; 3758ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson} 3759ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 376096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnarabool ComplexExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { 376196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara // Get the operand value into 'Result'. 376296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara if (!Visit(E->getSubExpr())) 376396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara return false; 376496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara 376596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara switch (E->getOpcode()) { 376696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara default: 376796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara // FIXME: what about diagnostics? 376896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara return false; 376996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara case UO_Extension: 377096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara return true; 377196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara case UO_Plus: 377296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara // The result is always just the subexpr. 377396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara return true; 377496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara case UO_Minus: 377596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara if (Result.isComplexFloat()) { 377696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Result.getComplexFloatReal().changeSign(); 377796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Result.getComplexFloatImag().changeSign(); 377896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara } 377996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara else { 378096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Result.getComplexIntReal() = -Result.getComplexIntReal(); 378196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Result.getComplexIntImag() = -Result.getComplexIntImag(); 378296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara } 378396fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara return true; 378496fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara case UO_Not: 378596fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara if (Result.isComplexFloat()) 378696fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Result.getComplexFloatImag().changeSign(); 378796fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara else 378896fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara Result.getComplexIntImag() = -Result.getComplexIntImag(); 378996fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara return true; 379096fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara } 379196fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara} 379296fc8e4086df323c49f17cac594db1d2f066a2e9Abramo Bagnara 37939ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===// 379451f4708c00110940ca3f337961915f2ca1668375Richard Smith// Top level Expr::EvaluateAsRValue method. 3795f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 3796f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 379747a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smithstatic bool Evaluate(CCValue &Result, EvalInfo &Info, const Expr *E) { 3798c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // In C, function designators are not lvalues, but we evaluate them as if they 3799c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith // are. 3800c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (E->isGLValue() || E->getType()->isFunctionType()) { 3801c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith LValue LV; 3802c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!EvaluateLValue(E, LV, Info)) 3803c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return false; 3804c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith LV.moveInto(Result); 3805c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith } else if (E->getType()->isVectorType()) { 38061e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith if (!EvaluateVector(E, Result, Info)) 380759b5da6d853b4368b984700315adf7b37de05764Nate Begeman return false; 3808575a1c9dc8dc5b4977194993e289f9eda7295c39Douglas Gregor } else if (E->getType()->isIntegralOrEnumerationType()) { 38091e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith if (!IntExprEvaluator(Info, Result).Visit(E)) 38106dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 3811efdb83e26f9a1fd2566afe54461216cd84814d42John McCall } else if (E->getType()->hasPointerRepresentation()) { 3812efdb83e26f9a1fd2566afe54461216cd84814d42John McCall LValue LV; 3813efdb83e26f9a1fd2566afe54461216cd84814d42John McCall if (!EvaluatePointer(E, LV, Info)) 38146dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 38151e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith LV.moveInto(Result); 3816efdb83e26f9a1fd2566afe54461216cd84814d42John McCall } else if (E->getType()->isRealFloatingType()) { 3817efdb83e26f9a1fd2566afe54461216cd84814d42John McCall llvm::APFloat F(0.0); 3818efdb83e26f9a1fd2566afe54461216cd84814d42John McCall if (!EvaluateFloat(E, F, Info)) 38196dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 382047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Result = CCValue(F); 3821efdb83e26f9a1fd2566afe54461216cd84814d42John McCall } else if (E->getType()->isAnyComplexType()) { 3822efdb83e26f9a1fd2566afe54461216cd84814d42John McCall ComplexValue C; 3823efdb83e26f9a1fd2566afe54461216cd84814d42John McCall if (!EvaluateComplex(E, C, Info)) 3824660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump return false; 38251e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith C.moveInto(Result); 382669c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith } else if (E->getType()->isMemberPointerType()) { 382769c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith // FIXME: Implement evaluation of pointer-to-member types. 382869c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith return false; 382969c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith } else if (E->getType()->isArrayType() && E->getType()->isLiteralType()) { 3830180f47959a066795cc0f409433023af448bb0328Richard Smith LValue LV; 3831180f47959a066795cc0f409433023af448bb0328Richard Smith LV.setExpr(E, Info.CurrentCall); 3832180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateArray(E, LV, Info.CurrentCall->Temporaries[E], Info)) 3833cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return false; 3834180f47959a066795cc0f409433023af448bb0328Richard Smith Result = Info.CurrentCall->Temporaries[E]; 383569c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith } else if (E->getType()->isRecordType() && E->getType()->isLiteralType()) { 3836180f47959a066795cc0f409433023af448bb0328Richard Smith LValue LV; 3837180f47959a066795cc0f409433023af448bb0328Richard Smith LV.setExpr(E, Info.CurrentCall); 3838180f47959a066795cc0f409433023af448bb0328Richard Smith if (!EvaluateRecord(E, LV, Info.CurrentCall->Temporaries[E], Info)) 3839180f47959a066795cc0f409433023af448bb0328Richard Smith return false; 3840180f47959a066795cc0f409433023af448bb0328Richard Smith Result = Info.CurrentCall->Temporaries[E]; 3841660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump } else 3842660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump return false; 3843660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump 3844660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump return true; 3845660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump} 3846660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump 384769c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith/// EvaluateConstantExpression - Evaluate an expression as a constant expression 384869c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith/// in-place in an APValue. In some cases, the in-place evaluation is essential, 384969c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith/// since later initializers for an object can indirectly refer to subobjects 385069c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith/// which were initialized earlier. 385169c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smithstatic bool EvaluateConstantExpression(APValue &Result, EvalInfo &Info, 3852180f47959a066795cc0f409433023af448bb0328Richard Smith const LValue &This, const Expr *E) { 385369c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith if (E->isRValue() && E->getType()->isLiteralType()) { 385469c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith // Evaluate arrays and record types in-place, so that later initializers can 385569c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith // refer to earlier-initialized members of the object. 3856180f47959a066795cc0f409433023af448bb0328Richard Smith if (E->getType()->isArrayType()) 3857180f47959a066795cc0f409433023af448bb0328Richard Smith return EvaluateArray(E, This, Result, Info); 3858180f47959a066795cc0f409433023af448bb0328Richard Smith else if (E->getType()->isRecordType()) 3859180f47959a066795cc0f409433023af448bb0328Richard Smith return EvaluateRecord(E, This, Result, Info); 386069c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith } 386169c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith 386269c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith // For any other type, in-place evaluation is unimportant. 386369c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith CCValue CoreConstResult; 386469c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith return Evaluate(CoreConstResult, Info, E) && 386569c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith CheckConstantExpression(CoreConstResult, Result); 386669c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith} 386769c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith 3868c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 386951f4708c00110940ca3f337961915f2ca1668375Richard Smith/// EvaluateAsRValue - Return true if this is a constant which we can fold using 387056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// any crazy technique (that has nothing to do with language standards) that 387156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// we want to. If this function returns true, it returns the folded constant 3872c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// in Result. If this expression is a glvalue, an lvalue-to-rvalue conversion 3873c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith/// will be applied to the result. 387451f4708c00110940ca3f337961915f2ca1668375Richard Smithbool Expr::EvaluateAsRValue(EvalResult &Result, const ASTContext &Ctx) const { 38751445bbacf4c8de5f208ff4ccb302424a4d9e233eRichard Smith // FIXME: Evaluating initializers for large arrays can cause performance 38761445bbacf4c8de5f208ff4ccb302424a4d9e233eRichard Smith // problems, and we don't use such values yet. Once we have a more efficient 38771445bbacf4c8de5f208ff4ccb302424a4d9e233eRichard Smith // array representation, this should be reinstated, and used by CodeGen. 38781445bbacf4c8de5f208ff4ccb302424a4d9e233eRichard Smith if (isRValue() && getType()->isArrayType()) 38791445bbacf4c8de5f208ff4ccb302424a4d9e233eRichard Smith return false; 38801445bbacf4c8de5f208ff4ccb302424a4d9e233eRichard Smith 388156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall EvalInfo Info(Ctx, Result); 3882c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 3883180f47959a066795cc0f409433023af448bb0328Richard Smith // FIXME: If this is the initializer for an lvalue, pass that in. 388447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith CCValue Value; 388547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith if (!::Evaluate(Value, Info, this)) 3886c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return false; 3887c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 3888c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (isGLValue()) { 3889c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith LValue LV; 389047a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith LV.setFrom(Value); 389147a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith if (!HandleLValueToRValueConversion(Info, getType(), LV, Value)) 389247a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith return false; 3893c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith } 3894c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith 389547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith // Check this core constant expression is a constant expression, and if so, 389669c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith // convert it to one. 389769c2c50498dadfa6bb99baba52187e3cfa0ac78aRichard Smith return CheckConstantExpression(Value, Result.Val); 389856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall} 389956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 39004ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool Expr::EvaluateAsBooleanCondition(bool &Result, 39014ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const ASTContext &Ctx) const { 3902c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith EvalResult Scratch; 390351f4708c00110940ca3f337961915f2ca1668375Richard Smith return EvaluateAsRValue(Scratch, Ctx) && 3904177dce777596e68d111d6d3e6046f3ddfc96bd07Richard Smith HandleConversionToBool(CCValue(Scratch.Val, CCValue::GlobalValue()), 390547a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith Result); 3906cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall} 3907cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall 3908a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smithbool Expr::EvaluateAsInt(APSInt &Result, const ASTContext &Ctx) const { 3909c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith EvalResult ExprResult; 391051f4708c00110940ca3f337961915f2ca1668375Richard Smith if (!EvaluateAsRValue(ExprResult, Ctx) || ExprResult.HasSideEffects || 3911c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith !ExprResult.Val.isInt()) { 3912c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return false; 3913c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith } 3914c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith Result = ExprResult.Val.getInt(); 3915c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith return true; 3916a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith} 3917a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith 39184ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool Expr::EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx) const { 39191b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson EvalInfo Info(Ctx, Result); 39201b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson 3921efdb83e26f9a1fd2566afe54461216cd84814d42John McCall LValue LV; 39229a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith return EvaluateLValue(this, LV, Info) && !Result.HasSideEffects && 39239a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith CheckLValueConstantExpression(LV, Result.Val); 3924b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman} 3925b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman 392651f4708c00110940ca3f337961915f2ca1668375Richard Smith/// isEvaluatable - Call EvaluateAsRValue to see if this expression can be 392751f4708c00110940ca3f337961915f2ca1668375Richard Smith/// constant folded, but discard the result. 39284ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool Expr::isEvaluatable(const ASTContext &Ctx) const { 39294fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson EvalResult Result; 393051f4708c00110940ca3f337961915f2ca1668375Richard Smith return EvaluateAsRValue(Result, Ctx) && !Result.HasSideEffects; 393145b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner} 393251fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson 39334ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool Expr::HasSideEffects(const ASTContext &Ctx) const { 39341e12c59e8f9bb76c23628c4e0d0a1dfced0b1fa0Richard Smith return HasSideEffect(Ctx).Visit(this); 3935393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian} 3936393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian 3937a6b8b2c09610b8bc4330e948ece8b940c2386406Richard SmithAPSInt Expr::EvaluateKnownConstInt(const ASTContext &Ctx) const { 39381c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson EvalResult EvalResult; 393951f4708c00110940ca3f337961915f2ca1668375Richard Smith bool Result = EvaluateAsRValue(EvalResult, Ctx); 3940c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin (void)Result; 394151fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson assert(Result && "Could not evaluate expression"); 39421c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer"); 394351fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson 39441c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson return EvalResult.Val.getInt(); 394551fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson} 3946d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 3947e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara bool Expr::EvalResult::isGlobalLValue() const { 3948e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara assert(Val.isLValue()); 3949e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara return IsGlobalLValue(Val.getLValueBase()); 3950e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara } 3951e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara 3952e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara 3953d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// isIntegerConstantExpr - this recursive routine will test if an expression is 3954d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// an integer constant expression. 3955d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 3956d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// FIXME: Pass up a reason why! Invalid operation in i-c-e, division by zero, 3957d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// comma, etc 3958d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// 3959d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// FIXME: Handle offsetof. Two things to do: Handle GCC's __builtin_offsetof 3960d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// to support gcc 4.0+ and handle the idiom GCC recognizes with a null pointer 3961d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall/// cast+dereference. 3962d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 3963d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// CheckICE - This function does the fundamental ICE checking: the returned 3964d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// ICEDiag contains a Val of 0, 1, or 2, and a possibly null SourceLocation. 3965d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// Note that to reduce code duplication, this helper does no evaluation 3966d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// itself; the caller checks whether the expression is evaluatable, and 3967d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// in the rare cases where CheckICE actually cares about the evaluated 3968d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// value, it calls into Evalute. 3969d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// 3970d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// Meanings of Val: 397151f4708c00110940ca3f337961915f2ca1668375Richard Smith// 0: This expression is an ICE. 3972d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// 1: This expression is not an ICE, but if it isn't evaluated, it's 3973d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// a legal subexpression for an ICE. This return value is used to handle 3974d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// the comma operator in C99 mode. 3975d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall// 2: This expression is not an ICE, and is not a legal subexpression for one. 3976d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 39773c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohmannamespace { 39783c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohman 3979d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCallstruct ICEDiag { 3980d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall unsigned Val; 3981d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall SourceLocation Loc; 3982d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 3983d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall public: 3984d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall ICEDiag(unsigned v, SourceLocation l) : Val(v), Loc(l) {} 3985d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall ICEDiag() : Val(0) {} 3986d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall}; 3987d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 39883c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohman} 39893c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohman 39903c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohmanstatic ICEDiag NoDiag() { return ICEDiag(); } 3991d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 3992d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCallstatic ICEDiag CheckEvalInICE(const Expr* E, ASTContext &Ctx) { 3993d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall Expr::EvalResult EVResult; 399451f4708c00110940ca3f337961915f2ca1668375Richard Smith if (!E->EvaluateAsRValue(EVResult, Ctx) || EVResult.HasSideEffects || 3995d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall !EVResult.Val.isInt()) { 3996d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 3997d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 3998d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return NoDiag(); 3999d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall} 4000d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 4001d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCallstatic ICEDiag CheckICE(const Expr* E, ASTContext &Ctx) { 4002d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall assert(!E->isValueDependent() && "Should not see value dependent exprs!"); 40032ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor if (!E->getType()->isIntegralOrEnumerationType()) { 4004d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 4005d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4006d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 4007d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall switch (E->getStmtClass()) { 400863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall#define ABSTRACT_STMT(Node) 4009d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall#define STMT(Node, Base) case Expr::Node##Class: 4010d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall#define EXPR(Node, Base) 4011d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall#include "clang/AST/StmtNodes.inc" 4012d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::PredefinedExprClass: 4013d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::FloatingLiteralClass: 4014d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ImaginaryLiteralClass: 4015d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::StringLiteralClass: 4016d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ArraySubscriptExprClass: 4017d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::MemberExprClass: 4018d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CompoundAssignOperatorClass: 4019d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CompoundLiteralExprClass: 4020d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ExtVectorElementExprClass: 4021d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::DesignatedInitExprClass: 4022d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ImplicitValueInitExprClass: 4023d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ParenListExprClass: 4024d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::VAArgExprClass: 4025d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::AddrLabelExprClass: 4026d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::StmtExprClass: 4027d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXMemberCallExprClass: 4028e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne case Expr::CUDAKernelCallExprClass: 4029d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXDynamicCastExprClass: 4030d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXTypeidExprClass: 40319be88403e965cc49af76c9d33d818781d44b333eFrancois Pichet case Expr::CXXUuidofExprClass: 4032d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXNullPtrLiteralExprClass: 4033d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXThisExprClass: 4034d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXThrowExprClass: 4035d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXNewExprClass: 4036d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXDeleteExprClass: 4037d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXPseudoDestructorExprClass: 4038d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::UnresolvedLookupExprClass: 4039d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::DependentScopeDeclRefExprClass: 4040d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXConstructExprClass: 4041d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXBindTemporaryExprClass: 40424765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall case Expr::ExprWithCleanupsClass: 4043d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXTemporaryObjectExprClass: 4044d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXUnresolvedConstructExprClass: 4045d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXDependentScopeMemberExprClass: 4046d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::UnresolvedMemberExprClass: 4047d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ObjCStringLiteralClass: 4048d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ObjCEncodeExprClass: 4049d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ObjCMessageExprClass: 4050d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ObjCSelectorExprClass: 4051d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ObjCProtocolExprClass: 4052d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ObjCIvarRefExprClass: 4053d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ObjCPropertyRefExprClass: 4054d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ObjCIsaExprClass: 4055d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ShuffleVectorExprClass: 4056d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::BlockExprClass: 4057d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::BlockDeclRefExprClass: 4058d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::NoStmtClass: 40597cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall case Expr::OpaqueValueExprClass: 4060be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor case Expr::PackExpansionExprClass: 4061c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor case Expr::SubstNonTypeTemplateParmPackExprClass: 406261eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner case Expr::AsTypeExprClass: 4063f85e193739c953358c865005855253af4f68a497John McCall case Expr::ObjCIndirectCopyRestoreExprClass: 406403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor case Expr::MaterializeTemporaryExprClass: 40654b9c2d235fb9449e249d74f48ecfec601650de93John McCall case Expr::PseudoObjectExprClass: 4066276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman case Expr::AtomicExprClass: 4067d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 4068d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 4069cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl case Expr::InitListExprClass: 4070cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl if (Ctx.getLangOptions().CPlusPlus0x) { 4071cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl const InitListExpr *ILE = cast<InitListExpr>(E); 4072cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl if (ILE->getNumInits() == 0) 4073cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl return NoDiag(); 4074cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl if (ILE->getNumInits() == 1) 4075cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl return CheckICE(ILE->getInit(0), Ctx); 4076cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl // Fall through for more than 1 expression. 4077cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl } 4078cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl return ICEDiag(2, E->getLocStart()); 4079cea8d966f826554f0679595e9371e314e8dbc1cfSebastian Redl 4080ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor case Expr::SizeOfPackExprClass: 4081d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::GNUNullExprClass: 4082d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // GCC considers the GNU __null value to be an integral constant expression. 4083d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return NoDiag(); 4084d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 408591a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall case Expr::SubstNonTypeTemplateParmExprClass: 408691a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall return 408791a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall CheckICE(cast<SubstNonTypeTemplateParmExpr>(E)->getReplacement(), Ctx); 408891a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall 4089d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ParenExprClass: 4090d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return CheckICE(cast<ParenExpr>(E)->getSubExpr(), Ctx); 4091f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne case Expr::GenericSelectionExprClass: 4092f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne return CheckICE(cast<GenericSelectionExpr>(E)->getResultExpr(), Ctx); 4093d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::IntegerLiteralClass: 4094d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CharacterLiteralClass: 4095d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXBoolLiteralExprClass: 4096ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor case Expr::CXXScalarValueInitExprClass: 4097d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::UnaryTypeTraitExprClass: 40986ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet case Expr::BinaryTypeTraitExprClass: 409921ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley case Expr::ArrayTypeTraitExprClass: 4100552622067dc45013d240f73952fece703f5e63bdJohn Wiegley case Expr::ExpressionTraitExprClass: 41012e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl case Expr::CXXNoexceptExprClass: 4102d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return NoDiag(); 4103d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CallExprClass: 41046cf750298d3621d8a10a6dd07fcee8e274b9d94dSean Hunt case Expr::CXXOperatorCallExprClass: { 410505830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // C99 6.6/3 allows function calls within unevaluated subexpressions of 410605830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // constant expressions, but they can never be ICEs because an ICE cannot 410705830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // contain an operand of (pointer to) function type. 4108d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall const CallExpr *CE = cast<CallExpr>(E); 4109180f47959a066795cc0f409433023af448bb0328Richard Smith if (CE->isBuiltinCall()) 4110d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return CheckEvalInICE(E, Ctx); 4111d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 4112d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4113d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::DeclRefExprClass: 4114d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (isa<EnumConstantDecl>(cast<DeclRefExpr>(E)->getDecl())) 4115d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return NoDiag(); 411603f96110bc2c2c773e06a42982b17a03dd2e5379Richard Smith if (Ctx.getLangOptions().CPlusPlus && IsConstNonVolatile(E->getType())) { 4117d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall const NamedDecl *D = cast<DeclRefExpr>(E)->getDecl(); 4118d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 4119d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // Parameter variables are never constants. Without this check, 4120d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // getAnyInitializer() can find a default argument, which leads 4121d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // to chaos. 4122d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (isa<ParmVarDecl>(D)) 4123d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, cast<DeclRefExpr>(E)->getLocation()); 4124d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 4125d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // C++ 7.1.5.1p2 4126d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // A variable of non-volatile const-qualified integral or enumeration 4127d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // type initialized by an ICE can be used in ICEs. 4128d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (const VarDecl *Dcl = dyn_cast<VarDecl>(D)) { 4129db1822c6de43ff4aa5fa00234bf8222f6f4816e8Richard Smith if (!Dcl->getType()->isIntegralOrEnumerationType()) 4130db1822c6de43ff4aa5fa00234bf8222f6f4816e8Richard Smith return ICEDiag(2, cast<DeclRefExpr>(E)->getLocation()); 4131db1822c6de43ff4aa5fa00234bf8222f6f4816e8Richard Smith 4132d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // Look for a declaration of this variable that has an initializer. 4133d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall const VarDecl *ID = 0; 4134d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall const Expr *Init = Dcl->getAnyInitializer(ID); 4135d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (Init) { 4136d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (ID->isInitKnownICE()) { 4137d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // We have already checked whether this subexpression is an 4138d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // integral constant expression. 4139d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (ID->isInitICE()) 4140d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return NoDiag(); 4141d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall else 4142d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, cast<DeclRefExpr>(E)->getLocation()); 4143d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4144d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 4145d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // It's an ICE whether or not the definition we found is 4146d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // out-of-line. See DR 721 and the discussion in Clang PR 4147d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // 6206 for details. 4148d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 4149d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (Dcl->isCheckingICE()) { 4150d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, cast<DeclRefExpr>(E)->getLocation()); 4151d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4152d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 4153d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall Dcl->setCheckingICE(); 4154d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall ICEDiag Result = CheckICE(Init, Ctx); 4155d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // Cache the result of the ICE test. 4156d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall Dcl->setInitKnownICE(Result.Val == 0); 4157d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return Result; 4158d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4159d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4160d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4161d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 4162d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::UnaryOperatorClass: { 4163d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall const UnaryOperator *Exp = cast<UnaryOperator>(E); 4164d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall switch (Exp->getOpcode()) { 41652de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_PostInc: 41662de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_PostDec: 41672de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_PreInc: 41682de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_PreDec: 41692de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_AddrOf: 41702de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Deref: 417105830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // C99 6.6/3 allows increment and decrement within unevaluated 417205830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // subexpressions of constant expressions, but they can never be ICEs 417305830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // because an ICE cannot contain an lvalue operand. 4174d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 41752de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Extension: 41762de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_LNot: 41772de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Plus: 41782de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Minus: 41792de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Not: 41802de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Real: 41812de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Imag: 4182d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return CheckICE(Exp->getSubExpr(), Ctx); 4183d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4184d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 4185d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // OffsetOf falls through here. 4186d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4187d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::OffsetOfExprClass: { 4188d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // Note that per C99, offsetof must be an ICE. And AFAIK, using 418951f4708c00110940ca3f337961915f2ca1668375Richard Smith // EvaluateAsRValue matches the proposed gcc behavior for cases like 419005830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // "offsetof(struct s{int x[4];}, x[1.0])". This doesn't affect 4191d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // compliance: we should warn earlier for offsetof expressions with 4192d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // array subscripts that aren't ICEs, and if the array subscripts 4193d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // are ICEs, the value of the offsetof must be an integer constant. 4194d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return CheckEvalInICE(E, Ctx); 4195d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4196f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case Expr::UnaryExprOrTypeTraitExprClass: { 4197f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne const UnaryExprOrTypeTraitExpr *Exp = cast<UnaryExprOrTypeTraitExpr>(E); 4198f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne if ((Exp->getKind() == UETT_SizeOf) && 4199f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne Exp->getTypeOfArgument()->isVariableArrayType()) 4200d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 4201d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return NoDiag(); 4202d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4203d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::BinaryOperatorClass: { 4204d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall const BinaryOperator *Exp = cast<BinaryOperator>(E); 4205d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall switch (Exp->getOpcode()) { 42062de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_PtrMemD: 42072de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_PtrMemI: 42082de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Assign: 42092de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_MulAssign: 42102de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_DivAssign: 42112de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_RemAssign: 42122de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_AddAssign: 42132de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_SubAssign: 42142de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_ShlAssign: 42152de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_ShrAssign: 42162de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_AndAssign: 42172de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_XorAssign: 42182de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_OrAssign: 421905830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // C99 6.6/3 allows assignments within unevaluated subexpressions of 422005830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // constant expressions, but they can never be ICEs because an ICE cannot 422105830143fa8c70b8bc46c96b93018455d8a2ca92Richard Smith // contain an lvalue operand. 4222d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 4223d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 42242de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Mul: 42252de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Div: 42262de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Rem: 42272de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Add: 42282de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Sub: 42292de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Shl: 42302de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Shr: 42312de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LT: 42322de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_GT: 42332de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LE: 42342de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_GE: 42352de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_EQ: 42362de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_NE: 42372de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_And: 42382de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Xor: 42392de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Or: 42402de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Comma: { 4241d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall ICEDiag LHSResult = CheckICE(Exp->getLHS(), Ctx); 4242d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall ICEDiag RHSResult = CheckICE(Exp->getRHS(), Ctx); 42432de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (Exp->getOpcode() == BO_Div || 42442de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall Exp->getOpcode() == BO_Rem) { 424551f4708c00110940ca3f337961915f2ca1668375Richard Smith // EvaluateAsRValue gives an error for undefined Div/Rem, so make sure 4246d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // we don't evaluate one. 42473b332ab132fa85c83833d74d400f6e126f52fbd2John McCall if (LHSResult.Val == 0 && RHSResult.Val == 0) { 4248a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith llvm::APSInt REval = Exp->getRHS()->EvaluateKnownConstInt(Ctx); 4249d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (REval == 0) 4250d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(1, E->getLocStart()); 4251d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (REval.isSigned() && REval.isAllOnesValue()) { 4252a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith llvm::APSInt LEval = Exp->getLHS()->EvaluateKnownConstInt(Ctx); 4253d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (LEval.isMinSignedValue()) 4254d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(1, E->getLocStart()); 4255d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4256d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4257d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 42582de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (Exp->getOpcode() == BO_Comma) { 4259d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (Ctx.getLangOptions().C99) { 4260d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // C99 6.6p3 introduces a strange edge case: comma can be in an ICE 4261d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // if it isn't evaluated. 4262d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (LHSResult.Val == 0 && RHSResult.Val == 0) 4263d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(1, E->getLocStart()); 4264d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } else { 4265d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // In both C89 and C++, commas in ICEs are illegal. 4266d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 4267d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4268d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4269d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (LHSResult.Val >= RHSResult.Val) 4270d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return LHSResult; 4271d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return RHSResult; 4272d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 42732de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LAnd: 42742de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LOr: { 4275d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall ICEDiag LHSResult = CheckICE(Exp->getLHS(), Ctx); 427663fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor 427763fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor // C++0x [expr.const]p2: 427863fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor // [...] subexpressions of logical AND (5.14), logical OR 427963fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor // (5.15), and condi- tional (5.16) operations that are not 428063fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor // evaluated are not considered. 428163fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor if (Ctx.getLangOptions().CPlusPlus0x && LHSResult.Val == 0) { 428263fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor if (Exp->getOpcode() == BO_LAnd && 4283a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith Exp->getLHS()->EvaluateKnownConstInt(Ctx) == 0) 428463fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor return LHSResult; 428563fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor 428663fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor if (Exp->getOpcode() == BO_LOr && 4287a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith Exp->getLHS()->EvaluateKnownConstInt(Ctx) != 0) 428863fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor return LHSResult; 428963fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor } 429063fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor 4291d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall ICEDiag RHSResult = CheckICE(Exp->getRHS(), Ctx); 4292d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (LHSResult.Val == 0 && RHSResult.Val == 1) { 4293d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // Rare case where the RHS has a comma "side-effect"; we need 4294d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // to actually check the condition to see whether the side 4295d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // with the comma is evaluated. 42962de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if ((Exp->getOpcode() == BO_LAnd) != 4297a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith (Exp->getLHS()->EvaluateKnownConstInt(Ctx) == 0)) 4298d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return RHSResult; 4299d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return NoDiag(); 4300d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4301d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 4302d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (LHSResult.Val >= RHSResult.Val) 4303d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return LHSResult; 4304d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return RHSResult; 4305d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4306d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4307d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4308d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ImplicitCastExprClass: 4309d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CStyleCastExprClass: 4310d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXFunctionalCastExprClass: 4311d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXStaticCastExprClass: 4312d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXReinterpretCastExprClass: 431332cb47174304bc7ec11478b9497c4e10f48273d9Richard Smith case Expr::CXXConstCastExprClass: 4314f85e193739c953358c865005855253af4f68a497John McCall case Expr::ObjCBridgedCastExprClass: { 4315d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall const Expr *SubExpr = cast<CastExpr>(E)->getSubExpr(); 431698326ede499696f85d9f7bc1fbc7a628fc22f1ecRichard Smith if (isa<ExplicitCastExpr>(E) && 431732cb47174304bc7ec11478b9497c4e10f48273d9Richard Smith isa<FloatingLiteral>(SubExpr->IgnoreParenImpCasts())) 431832cb47174304bc7ec11478b9497c4e10f48273d9Richard Smith return NoDiag(); 4319eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman switch (cast<CastExpr>(E)->getCastKind()) { 4320eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman case CK_LValueToRValue: 4321eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman case CK_NoOp: 4322eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman case CK_IntegralToBoolean: 4323eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman case CK_IntegralCast: 4324d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return CheckICE(SubExpr, Ctx); 4325eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman default: 4326eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman return ICEDiag(2, E->getLocStart()); 4327eea0e817c609c662f3fef61bb257fddf1ae8f7b7Eli Friedman } 4328d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 432956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall case Expr::BinaryConditionalOperatorClass: { 433056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall const BinaryConditionalOperator *Exp = cast<BinaryConditionalOperator>(E); 433156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall ICEDiag CommonResult = CheckICE(Exp->getCommon(), Ctx); 433256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (CommonResult.Val == 2) return CommonResult; 433356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall ICEDiag FalseResult = CheckICE(Exp->getFalseExpr(), Ctx); 433456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (FalseResult.Val == 2) return FalseResult; 433556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (CommonResult.Val == 1) return CommonResult; 433656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (FalseResult.Val == 1 && 4337a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith Exp->getCommon()->EvaluateKnownConstInt(Ctx) == 0) return NoDiag(); 433856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return FalseResult; 433956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 4340d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ConditionalOperatorClass: { 4341d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall const ConditionalOperator *Exp = cast<ConditionalOperator>(E); 4342d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // If the condition (ignoring parens) is a __builtin_constant_p call, 4343d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // then only the true side is actually considered in an integer constant 4344d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // expression, and it is fully evaluated. This is an important GNU 4345d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // extension. See GCC PR38377 for discussion. 4346d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (const CallExpr *CallCE 4347d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall = dyn_cast<CallExpr>(Exp->getCond()->IgnoreParenCasts())) 4348180f47959a066795cc0f409433023af448bb0328Richard Smith if (CallCE->isBuiltinCall() == Builtin::BI__builtin_constant_p) { 4349d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall Expr::EvalResult EVResult; 435051f4708c00110940ca3f337961915f2ca1668375Richard Smith if (!E->EvaluateAsRValue(EVResult, Ctx) || EVResult.HasSideEffects || 4351d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall !EVResult.Val.isInt()) { 4352d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 4353d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4354d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return NoDiag(); 4355d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4356d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall ICEDiag CondResult = CheckICE(Exp->getCond(), Ctx); 4357d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (CondResult.Val == 2) 4358d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return CondResult; 435963fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor 436063fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor // C++0x [expr.const]p2: 436163fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor // subexpressions of [...] conditional (5.16) operations that 436263fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor // are not evaluated are not considered 436363fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor bool TrueBranch = Ctx.getLangOptions().CPlusPlus0x 4364a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith ? Exp->getCond()->EvaluateKnownConstInt(Ctx) != 0 436563fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor : false; 436663fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor ICEDiag TrueResult = NoDiag(); 436763fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor if (!Ctx.getLangOptions().CPlusPlus0x || TrueBranch) 436863fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor TrueResult = CheckICE(Exp->getTrueExpr(), Ctx); 436963fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor ICEDiag FalseResult = NoDiag(); 437063fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor if (!Ctx.getLangOptions().CPlusPlus0x || !TrueBranch) 437163fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor FalseResult = CheckICE(Exp->getFalseExpr(), Ctx); 437263fe6814f339df30b8463b39995947cbdf920e48Douglas Gregor 4373d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (TrueResult.Val == 2) 4374d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return TrueResult; 4375d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (FalseResult.Val == 2) 4376d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return FalseResult; 4377d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (CondResult.Val == 1) 4378d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return CondResult; 4379d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (TrueResult.Val == 0 && FalseResult.Val == 0) 4380d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return NoDiag(); 4381d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // Rare case where the diagnostics depend on which side is evaluated 4382d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // Note that if we get here, CondResult is 0, and at least one of 4383d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // TrueResult and FalseResult is non-zero. 4384a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith if (Exp->getCond()->EvaluateKnownConstInt(Ctx) == 0) { 4385d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return FalseResult; 4386d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4387d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return TrueResult; 4388d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4389d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::CXXDefaultArgExprClass: 4390d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return CheckICE(cast<CXXDefaultArgExpr>(E)->getExpr(), Ctx); 4391d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall case Expr::ChooseExprClass: { 4392d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return CheckICE(cast<ChooseExpr>(E)->getChosenSubExpr(Ctx), Ctx); 4393d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4394d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4395d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 4396d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall // Silence a GCC warning 4397d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return ICEDiag(2, E->getLocStart()); 4398d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall} 4399d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall 4400d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCallbool Expr::isIntegerConstantExpr(llvm::APSInt &Result, ASTContext &Ctx, 4401d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall SourceLocation *Loc, bool isEvaluated) const { 4402d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall ICEDiag d = CheckICE(this, Ctx); 4403d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (d.Val != 0) { 4404d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall if (Loc) *Loc = d.Loc; 4405d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return false; 4406d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall } 4407c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith if (!EvaluateAsInt(Result, Ctx)) 4408d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall llvm_unreachable("ICE cannot be evaluated!"); 4409d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall return true; 4410d905f5ad540c415d1a21b4f8b7bd715bfb7bb920John McCall} 4411