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