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