Lines Matching refs:Info

221     bool checkSubobject(EvalInfo &Info, const Expr *E, CheckSubobjectKind CSK);
261 void diagnosePointerArithmetic(EvalInfo &Info, const Expr *E, uint64_t N);
263 void adjustIndex(EvalInfo &Info, const Expr *E, uint64_t N) { in adjustIndex()
268 diagnosePointerArithmetic(Info, E, Entries.back().ArrayIndex); in adjustIndex()
281 diagnosePointerArithmetic(Info, E, uint64_t(IsOnePastTheEnd) + N); in adjustIndex()
289 EvalInfo &Info; member
317 CallStackFrame(EvalInfo &Info, SourceLocation CallLoc,
713 EvalInfo &Info; member
718 explicit FoldConstant(EvalInfo &Info, bool Enabled) in FoldConstant()
719 : Info(Info), in FoldConstant()
721 HadNoPriorDiags(Info.EvalStatus.Diag && in FoldConstant()
722 Info.EvalStatus.Diag->empty() && in FoldConstant()
723 !Info.EvalStatus.HasSideEffects), in FoldConstant()
724 OldMode(Info.EvalMode) { in FoldConstant()
726 (Info.EvalMode == EvalInfo::EM_ConstantExpression || in FoldConstant()
727 Info.EvalMode == EvalInfo::EM_ConstantExpressionUnevaluated)) in FoldConstant()
728 Info.EvalMode = EvalInfo::EM_ConstantFold; in FoldConstant()
732 if (Enabled && HadNoPriorDiags && !Info.EvalStatus.Diag->empty() && in ~FoldConstant()
733 !Info.EvalStatus.HasSideEffects) in ~FoldConstant()
734 Info.EvalStatus.Diag->clear(); in ~FoldConstant()
735 Info.EvalMode = OldMode; in ~FoldConstant()
742 EvalInfo &Info; member in __anon0751fa450111::SpeculativeEvaluationRAII
746 SpeculativeEvaluationRAII(EvalInfo &Info, in SpeculativeEvaluationRAII() argument
748 : Info(Info), Old(Info.EvalStatus) { in SpeculativeEvaluationRAII()
749 Info.EvalStatus.Diag = NewDiag; in SpeculativeEvaluationRAII()
752 Info.EvalStatus.HasSideEffects = true; in SpeculativeEvaluationRAII()
755 Info.EvalStatus = Old; in ~SpeculativeEvaluationRAII()
763 EvalInfo &Info; member in __anon0751fa450111::ScopeRAII
766 ScopeRAII(EvalInfo &Info) in ScopeRAII() argument
767 : Info(Info), OldStackSize(Info.CleanupStack.size()) {} in ScopeRAII()
771 cleanup(Info, OldStackSize); in ~ScopeRAII()
774 static void cleanup(EvalInfo &Info, unsigned OldStackSize) { in cleanup() argument
776 for (unsigned I = OldStackSize, N = Info.CleanupStack.size(); in cleanup()
778 if (IsFullExpression && Info.CleanupStack[I].isLifetimeExtended()) { in cleanup()
781 std::swap(Info.CleanupStack[I], Info.CleanupStack[NewEnd]); in cleanup()
785 Info.CleanupStack[I].endLifetime(); in cleanup()
788 Info.CleanupStack.erase(Info.CleanupStack.begin() + NewEnd, in cleanup()
789 Info.CleanupStack.end()); in cleanup()
796 bool SubobjectDesignator::checkSubobject(EvalInfo &Info, const Expr *E, in checkSubobject() argument
801 Info.CCEDiag(E, diag::note_constexpr_past_end_subobject) in checkSubobject()
809 void SubobjectDesignator::diagnosePointerArithmetic(EvalInfo &Info, in diagnosePointerArithmetic() argument
812 Info.CCEDiag(E, diag::note_constexpr_array_index) in diagnosePointerArithmetic()
816 Info.CCEDiag(E, diag::note_constexpr_array_index) in diagnosePointerArithmetic()
821 CallStackFrame::CallStackFrame(EvalInfo &Info, SourceLocation CallLoc, in CallStackFrame() argument
824 : Info(Info), Caller(Info.CurrentCall), CallLoc(CallLoc), Callee(Callee), in CallStackFrame()
825 Index(Info.NextCallIndex++), This(This), Arguments(Arguments) { in CallStackFrame()
826 Info.CurrentCall = this; in CallStackFrame()
827 ++Info.CallStackDepth; in CallStackFrame()
831 assert(Info.CurrentCall == this && "calls retired out of order"); in ~CallStackFrame()
832 --Info.CallStackDepth; in ~CallStackFrame()
833 Info.CurrentCall = Caller; in ~CallStackFrame()
840 Info.CleanupStack.push_back(Cleanup(&Result, IsLifetimeExtended)); in createTemporary()
954 bool checkNullPointer(EvalInfo &Info, const Expr *E, in checkNullPointer()
959 Info.CCEDiag(E, diag::note_constexpr_null_subobject) in checkNullPointer()
969 bool checkSubobject(EvalInfo &Info, const Expr *E, CheckSubobjectKind CSK) { in checkSubobject()
972 if (!Info.getLangOpts().CPlusPlus11) in checkSubobject()
974 return (CSK == CSK_ArrayToPointer || checkNullPointer(Info, E, CSK)) && in checkSubobject()
975 Designator.checkSubobject(Info, E, CSK); in checkSubobject()
978 void addDecl(EvalInfo &Info, const Expr *E, in addDecl()
980 if (checkSubobject(Info, E, isa<FieldDecl>(D) ? CSK_Field : CSK_Base)) in addDecl()
983 void addArray(EvalInfo &Info, const Expr *E, const ConstantArrayType *CAT) { in addArray()
984 if (checkSubobject(Info, E, CSK_ArrayToPointer)) in addArray()
987 void addComplex(EvalInfo &Info, const Expr *E, QualType EltTy, bool Imag) { in addComplex()
988 if (checkSubobject(Info, E, Imag ? CSK_Imag : CSK_Real)) in addComplex()
991 void adjustIndex(EvalInfo &Info, const Expr *E, uint64_t N) { in adjustIndex()
992 if (N && checkNullPointer(Info, E, CSK_ArrayIndex)) in adjustIndex()
993 Designator.adjustIndex(Info, E, N); in adjustIndex()
1096 static bool Evaluate(APValue &Result, EvalInfo &Info, const Expr *E);
1097 static bool EvaluateInPlace(APValue &Result, EvalInfo &Info,
1100 static bool EvaluateLValue(const Expr *E, LValue &Result, EvalInfo &Info);
1101 static bool EvaluatePointer(const Expr *E, LValue &Result, EvalInfo &Info);
1103 EvalInfo &Info);
1104 static bool EvaluateTemporary(const Expr *E, LValue &Result, EvalInfo &Info);
1105 static bool EvaluateInteger(const Expr *E, APSInt &Result, EvalInfo &Info);
1107 EvalInfo &Info);
1108 static bool EvaluateFloat(const Expr *E, APFloat &Result, EvalInfo &Info);
1109 static bool EvaluateComplex(const Expr *E, ComplexValue &Res, EvalInfo &Info);
1110 static bool EvaluateAtomic(const Expr *E, APValue &Result, EvalInfo &Info);
1129 Val.printPretty(Out, Frame->Info.Ctx, in describeCall()
1143 Arg.printPretty(Out, Frame->Info.Ctx, Param->getType()); in describeCall()
1155 static bool EvaluateIgnoredValue(EvalInfo &Info, const Expr *E) { in EvaluateIgnoredValue() argument
1157 if (!Evaluate(Scratch, Info, E)) in EvaluateIgnoredValue()
1159 return Info.noteSideEffect(); in EvaluateIgnoredValue()
1233 static void NoteLValueLocation(EvalInfo &Info, APValue::LValueBase Base) { in NoteLValueLocation() argument
1237 Info.Note(VD->getLocation(), diag::note_declared_at); in NoteLValueLocation()
1239 Info.Note(Base.get<const Expr*>()->getExprLoc(), in NoteLValueLocation()
1246 static bool CheckLValueConstantExpression(EvalInfo &Info, SourceLocation Loc, in CheckLValueConstantExpression() argument
1257 if (Info.getLangOpts().CPlusPlus11) { in CheckLValueConstantExpression()
1259 Info.Diag(Loc, diag::note_constexpr_non_global, 1) in CheckLValueConstantExpression()
1262 NoteLValueLocation(Info, Base); in CheckLValueConstantExpression()
1264 Info.Diag(Loc); in CheckLValueConstantExpression()
1269 assert((Info.checkingPotentialConstantExpression() || in CheckLValueConstantExpression()
1294 if (Info.getLangOpts().CPlusPlus && FD->hasAttr<DLLImportAttr>()) in CheckLValueConstantExpression()
1307 Info.CCEDiag(Loc); in CheckLValueConstantExpression()
1314 Info.Diag(Loc, diag::note_constexpr_past_end, 1) in CheckLValueConstantExpression()
1316 NoteLValueLocation(Info, Base); in CheckLValueConstantExpression()
1324 static bool CheckLiteralType(EvalInfo &Info, const Expr *E, in CheckLiteralType() argument
1326 if (!E->isRValue() || E->getType()->isLiteralType(Info.Ctx)) in CheckLiteralType()
1332 if (Info.getLangOpts().CPlusPlus14 && This && in CheckLiteralType()
1333 Info.EvaluatingDecl == This->getLValueBase()) in CheckLiteralType()
1337 if (Info.getLangOpts().CPlusPlus11) in CheckLiteralType()
1338 Info.Diag(E, diag::note_constexpr_nonliteral) in CheckLiteralType()
1341 Info.Diag(E, diag::note_invalid_subexpr_in_const_expr); in CheckLiteralType()
1348 static bool CheckConstantExpression(EvalInfo &Info, SourceLocation DiagLoc, in CheckConstantExpression() argument
1351 Info.Diag(DiagLoc, diag::note_constexpr_uninitialized) in CheckConstantExpression()
1367 if (!CheckConstantExpression(Info, DiagLoc, EltTy, in CheckConstantExpression()
1373 return CheckConstantExpression(Info, DiagLoc, EltTy, in CheckConstantExpression()
1377 return CheckConstantExpression(Info, DiagLoc, in CheckConstantExpression()
1387 if (!CheckConstantExpression(Info, DiagLoc, I->getType(), in CheckConstantExpression()
1393 if (!CheckConstantExpression(Info, DiagLoc, I->getType(), in CheckConstantExpression()
1401 LVal.setFrom(Info.Ctx, Value); in CheckConstantExpression()
1402 return CheckLValueConstantExpression(Info, DiagLoc, Type, LVal); in CheckConstantExpression()
1486 EvalInfo &Info) { in EvaluateAsBooleanCondition() argument
1489 if (!Evaluate(Val, Info, E)) in EvaluateAsBooleanCondition()
1495 static void HandleOverflow(EvalInfo &Info, const Expr *E, in HandleOverflow() argument
1497 Info.CCEDiag(E, diag::note_constexpr_overflow) in HandleOverflow()
1501 static bool HandleFloatToIntCast(EvalInfo &Info, const Expr *E, in HandleFloatToIntCast() argument
1504 unsigned DestWidth = Info.Ctx.getIntWidth(DestType); in HandleFloatToIntCast()
1512 HandleOverflow(Info, E, Value, DestType); in HandleFloatToIntCast()
1516 static bool HandleFloatToFloatCast(EvalInfo &Info, const Expr *E, in HandleFloatToFloatCast() argument
1521 if (Result.convert(Info.Ctx.getFloatTypeSemantics(DestType), in HandleFloatToFloatCast()
1524 HandleOverflow(Info, E, Value, DestType); in HandleFloatToFloatCast()
1528 static APSInt HandleIntToIntCast(EvalInfo &Info, const Expr *E, in HandleIntToIntCast() argument
1531 unsigned DestWidth = Info.Ctx.getIntWidth(DestType); in HandleIntToIntCast()
1540 static bool HandleIntToFloatCast(EvalInfo &Info, const Expr *E, in HandleIntToFloatCast() argument
1543 Result = APFloat(Info.Ctx.getFloatTypeSemantics(DestType), 1); in HandleIntToFloatCast()
1547 HandleOverflow(Info, E, Value, DestType); in HandleIntToFloatCast()
1551 static bool truncateBitfieldValue(EvalInfo &Info, const Expr *E, in truncateBitfieldValue() argument
1560 Info.Diag(E); in truncateBitfieldValue()
1566 unsigned NewBitWidth = FD->getBitWidthValue(Info.Ctx); in truncateBitfieldValue()
1572 static bool EvalAndBitcastToAPInt(EvalInfo &Info, const Expr *E, in EvalAndBitcastToAPInt() argument
1575 if (!Evaluate(SVal, Info, E)) in EvalAndBitcastToAPInt()
1587 unsigned VecSize = Info.Ctx.getTypeSize(VecTy); in EvalAndBitcastToAPInt()
1589 unsigned EltSize = Info.Ctx.getTypeSize(EltTy); in EvalAndBitcastToAPInt()
1590 bool BigEndian = Info.Ctx.getTargetInfo().isBigEndian(); in EvalAndBitcastToAPInt()
1602 Info.Diag(E, diag::note_invalid_subexpr_in_const_expr); in EvalAndBitcastToAPInt()
1615 Info.Diag(E, diag::note_invalid_subexpr_in_const_expr); in EvalAndBitcastToAPInt()
1623 static APSInt CheckedIntArithmetic(EvalInfo &Info, const Expr *E, in CheckedIntArithmetic() argument
1632 if (Info.checkingForOverflow()) in CheckedIntArithmetic()
1633 Info.Ctx.getDiagnostics().Report(E->getExprLoc(), in CheckedIntArithmetic()
1637 HandleOverflow(Info, E, Value, E->getType()); in CheckedIntArithmetic()
1643 static bool handleIntIntBinOp(EvalInfo &Info, const Expr *E, const APSInt &LHS, in handleIntIntBinOp() argument
1648 Info.Diag(E); in handleIntIntBinOp()
1651 Result = CheckedIntArithmetic(Info, E, LHS, RHS, LHS.getBitWidth() * 2, in handleIntIntBinOp()
1655 Result = CheckedIntArithmetic(Info, E, LHS, RHS, LHS.getBitWidth() + 1, in handleIntIntBinOp()
1659 Result = CheckedIntArithmetic(Info, E, LHS, RHS, LHS.getBitWidth() + 1, in handleIntIntBinOp()
1668 Info.Diag(E, diag::note_expr_divide_by_zero); in handleIntIntBinOp()
1674 HandleOverflow(Info, E, -LHS.extend(LHS.getBitWidth() + 1), E->getType()); in handleIntIntBinOp()
1678 if (Info.getLangOpts().OpenCL) in handleIntIntBinOp()
1686 Info.CCEDiag(E, diag::note_constexpr_negative_shift) << RHS; in handleIntIntBinOp()
1695 Info.CCEDiag(E, diag::note_constexpr_large_shift) in handleIntIntBinOp()
1701 Info.CCEDiag(E, diag::note_constexpr_lshift_of_negative) << LHS; in handleIntIntBinOp()
1703 Info.CCEDiag(E, diag::note_constexpr_lshift_discards); in handleIntIntBinOp()
1709 if (Info.getLangOpts().OpenCL) in handleIntIntBinOp()
1717 Info.CCEDiag(E, diag::note_constexpr_negative_shift) << RHS; in handleIntIntBinOp()
1726 Info.CCEDiag(E, diag::note_constexpr_large_shift) in handleIntIntBinOp()
1742 static bool handleFloatFloatBinOp(EvalInfo &Info, const Expr *E, in handleFloatFloatBinOp() argument
1747 Info.Diag(E); in handleFloatFloatBinOp()
1764 Info.CCEDiag(E, diag::note_constexpr_float_arithmetic) << LHS.isNaN(); in handleFloatFloatBinOp()
1770 static bool CastToDerivedClass(EvalInfo &Info, const Expr *E, LValue &Result, in CastToDerivedClass() argument
1780 if (!Result.checkSubobject(Info, E, CSK_Derived)) in CastToDerivedClass()
1787 const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); in CastToDerivedClass()
1799 static bool HandleLValueDirectBase(EvalInfo &Info, const Expr *E, LValue &Obj, in HandleLValueDirectBase() argument
1805 RL = &Info.Ctx.getASTRecordLayout(Derived); in HandleLValueDirectBase()
1809 Obj.addDecl(Info, E, Base, /*Virtual*/ false); in HandleLValueDirectBase()
1813 static bool HandleLValueBase(EvalInfo &Info, const Expr *E, LValue &Obj, in HandleLValueBase() argument
1819 return HandleLValueDirectBase(Info, E, Obj, DerivedDecl, BaseDecl); in HandleLValueBase()
1827 if (!CastToDerivedClass(Info, E, Obj, DerivedDecl, D.MostDerivedPathLength)) in HandleLValueBase()
1832 const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(DerivedDecl); in HandleLValueBase()
1834 Obj.addDecl(Info, E, BaseDecl, /*Virtual*/ true); in HandleLValueBase()
1838 static bool HandleLValueBasePath(EvalInfo &Info, const CastExpr *E, in HandleLValueBasePath() argument
1843 if (!HandleLValueBase(Info, E, Result, Type->getAsCXXRecordDecl(), in HandleLValueBasePath()
1853 static bool HandleLValueMember(EvalInfo &Info, const Expr *E, LValue &LVal, in HandleLValueMember() argument
1858 RL = &Info.Ctx.getASTRecordLayout(FD->getParent()); in HandleLValueMember()
1862 LVal.Offset += Info.Ctx.toCharUnitsFromBits(RL->getFieldOffset(I)); in HandleLValueMember()
1863 LVal.addDecl(Info, E, FD); in HandleLValueMember()
1868 static bool HandleLValueIndirectMember(EvalInfo &Info, const Expr *E, in HandleLValueIndirectMember() argument
1872 if (!HandleLValueMember(Info, E, LVal, cast<FieldDecl>(C))) in HandleLValueIndirectMember()
1878 static bool HandleSizeof(EvalInfo &Info, SourceLocation Loc, in HandleSizeof() argument
1890 Info.Diag(Loc); in HandleSizeof()
1894 Size = Info.Ctx.getTypeSizeInChars(Type); in HandleSizeof()
1904 static bool HandleLValueArrayAdjustment(EvalInfo &Info, const Expr *E, in HandleLValueArrayAdjustment() argument
1908 if (!HandleSizeof(Info, E->getExprLoc(), EltTy, SizeOfPointee)) in HandleLValueArrayAdjustment()
1913 LVal.adjustIndex(Info, E, Adjustment); in HandleLValueArrayAdjustment()
1922 static bool HandleLValueComplexElement(EvalInfo &Info, const Expr *E, in HandleLValueComplexElement() argument
1927 if (!HandleSizeof(Info, E->getExprLoc(), EltTy, SizeOfComponent)) in HandleLValueComplexElement()
1931 LVal.addComplex(Info, E, EltTy, Imag); in HandleLValueComplexElement()
1943 static bool evaluateVarDeclInit(EvalInfo &Info, const Expr *E, in evaluateVarDeclInit() argument
1951 if (Info.checkingPotentialConstantExpression()) in evaluateVarDeclInit()
1954 Info.Diag(E, diag::note_invalid_subexpr_in_const_expr); in evaluateVarDeclInit()
1973 if (!Info.checkingPotentialConstantExpression()) in evaluateVarDeclInit()
1974 Info.Diag(E, diag::note_invalid_subexpr_in_const_expr); in evaluateVarDeclInit()
1980 if (Info.EvaluatingDecl.dyn_cast<const ValueDecl*>() == VD) { in evaluateVarDeclInit()
1981 Result = Info.EvaluatingDeclValue; in evaluateVarDeclInit()
1988 Info.Diag(E, diag::note_invalid_subexpr_in_const_expr); in evaluateVarDeclInit()
1996 Info.Diag(E, diag::note_constexpr_var_init_non_constant, in evaluateVarDeclInit()
1998 Info.Note(VD->getLocation(), diag::note_declared_at); in evaluateVarDeclInit()
1999 Info.addNotes(Notes); in evaluateVarDeclInit()
2002 Info.CCEDiag(E, diag::note_constexpr_var_init_non_constant, in evaluateVarDeclInit()
2004 Info.Note(VD->getLocation(), diag::note_declared_at); in evaluateVarDeclInit()
2005 Info.addNotes(Notes); in evaluateVarDeclInit()
2033 static APSInt extractStringLiteralCharacter(EvalInfo &Info, const Expr *Lit, in extractStringLiteralCharacter() argument
2040 Info.Ctx.getAsConstantArrayType(S->getType()); in extractStringLiteralCharacter()
2045 APSInt Value(S->getCharByteWidth() * Info.Ctx.getCharWidth(), in extractStringLiteralCharacter()
2053 static void expandStringLiteral(EvalInfo &Info, const Expr *Lit, in expandStringLiteral() argument
2057 Info.Ctx.getAsConstantArrayType(S->getType()); in expandStringLiteral()
2065 APSInt Value(S->getCharByteWidth() * Info.Ctx.getCharWidth(), in expandStringLiteral()
2121 static bool diagnoseUnreadableFields(EvalInfo &Info, const Expr *E, in diagnoseUnreadableFields() argument
2137 Info.Diag(E, diag::note_constexpr_ltor_mutable, 1) << Field; in diagnoseUnreadableFields()
2138 Info.Note(Field->getLocation(), diag::note_declared_at); in diagnoseUnreadableFields()
2142 if (diagnoseUnreadableFields(Info, E, Field->getType())) in diagnoseUnreadableFields()
2147 if (diagnoseUnreadableFields(Info, E, BaseSpec.getType())) in diagnoseUnreadableFields()
2182 findSubobject(EvalInfo &Info, const Expr *E, const CompleteObject &Obj, in findSubobject() argument
2188 if (Info.getLangOpts().CPlusPlus11) in findSubobject()
2189 Info.Diag(E, diag::note_constexpr_access_past_end) in findSubobject()
2192 Info.Diag(E); in findSubobject()
2203 if (!Info.checkingPotentialConstantExpression()) in findSubobject()
2204 Info.Diag(E, diag::note_constexpr_access_uninit) << handler.AccessKind; in findSubobject()
2214 diagnoseUnreadableFields(Info, E, ObjType)) in findSubobject()
2223 !truncateBitfieldValue(Info, E, *O, LastField)) in findSubobject()
2232 const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType(ObjType); in findSubobject()
2238 if (Info.getLangOpts().CPlusPlus11) in findSubobject()
2239 Info.Diag(E, diag::note_constexpr_access_past_end) in findSubobject()
2242 Info.Diag(E); in findSubobject()
2254 expandStringLiteral(Info, O->getLValueBase().get<const Expr *>(), in findSubobject()
2271 if (Info.getLangOpts().CPlusPlus11) in findSubobject()
2272 Info.Diag(E, diag::note_constexpr_access_past_end) in findSubobject()
2275 Info.Diag(E); in findSubobject()
2295 Info.Diag(E, diag::note_constexpr_ltor_mutable, 1) in findSubobject()
2297 Info.Note(Field->getLocation(), diag::note_declared_at); in findSubobject()
2307 Info.Diag(E, diag::note_constexpr_access_inactive_union_member) in findSubobject()
2321 if (Info.getLangOpts().CPlusPlus) { in findSubobject()
2323 Info.Diag(E, diag::note_constexpr_access_volatile_obj, 1) in findSubobject()
2325 Info.Note(Field->getLocation(), diag::note_declared_at); in findSubobject()
2327 Info.Diag(E, diag::note_invalid_subexpr_in_const_expr); in findSubobject()
2340 ObjType = Info.Ctx.getRecordType(Base); in findSubobject()
2349 EvalInfo &Info; member
2370 Info, Subobj.getLValueBase().get<const Expr *>(), Character)); in foundString()
2379 static bool extractSubobject(EvalInfo &Info, const Expr *E, in extractSubobject() argument
2383 ExtractSubobjectHandler Handler = { Info, Result }; in extractSubobject()
2384 return findSubobject(Info, E, Obj, Sub, Handler); in extractSubobject()
2389 EvalInfo &Info; member
2399 Info.Diag(E, diag::note_constexpr_modify_const_type) << QT; in checkConst()
2418 Info.Diag(E); in found()
2439 static bool modifySubobject(EvalInfo &Info, const Expr *E, in modifySubobject() argument
2443 ModifySubobjectHandler Handler = { Info, NewVal, E }; in modifySubobject()
2444 return findSubobject(Info, E, Obj, Sub, Handler); in modifySubobject()
2505 CompleteObject findCompleteObject(EvalInfo &Info, const Expr *E, AccessKinds AK, in findCompleteObject() argument
2508 Info.Diag(E, diag::note_constexpr_access_null) << AK; in findCompleteObject()
2514 Frame = Info.getCallFrame(LVal.CallIndex); in findCompleteObject()
2516 Info.Diag(E, diag::note_constexpr_lifetime_ended, 1) in findCompleteObject()
2518 NoteLValueLocation(Info, LVal.Base); in findCompleteObject()
2528 if (Info.getLangOpts().CPlusPlus) in findCompleteObject()
2529 Info.Diag(E, diag::note_constexpr_access_volatile_type) in findCompleteObject()
2532 Info.Diag(E); in findCompleteObject()
2550 if (const VarDecl *VDef = VD->getDefinition(Info.Ctx)) in findCompleteObject()
2554 Info.Diag(E); in findCompleteObject()
2560 if (Info.getLangOpts().CPlusPlus) { in findCompleteObject()
2561 Info.Diag(E, diag::note_constexpr_access_volatile_obj, 1) in findCompleteObject()
2563 Info.Note(VD->getLocation(), diag::note_declared_at); in findCompleteObject()
2565 Info.Diag(E); in findCompleteObject()
2573 if (Info.getLangOpts().CPlusPlus14 && in findCompleteObject()
2574 VD == Info.EvaluatingDecl.dyn_cast<const ValueDecl *>()) { in findCompleteObject()
2580 Info.Diag(E, diag::note_constexpr_modify_global); in findCompleteObject()
2586 if (Info.getLangOpts().CPlusPlus) { in findCompleteObject()
2587 Info.Diag(E, diag::note_constexpr_ltor_non_const_int, 1) << VD; in findCompleteObject()
2588 Info.Note(VD->getLocation(), diag::note_declared_at); in findCompleteObject()
2590 Info.Diag(E); in findCompleteObject()
2598 if (Info.getLangOpts().CPlusPlus11) { in findCompleteObject()
2599 Info.CCEDiag(E, diag::note_constexpr_ltor_non_constexpr, 1) << VD; in findCompleteObject()
2600 Info.Note(VD->getLocation(), diag::note_declared_at); in findCompleteObject()
2602 Info.CCEDiag(E); in findCompleteObject()
2606 if (Info.getLangOpts().CPlusPlus11) { in findCompleteObject()
2607 Info.Diag(E, diag::note_constexpr_ltor_non_constexpr, 1) << VD; in findCompleteObject()
2608 Info.Note(VD->getLocation(), diag::note_declared_at); in findCompleteObject()
2610 Info.Diag(E); in findCompleteObject()
2616 if (!evaluateVarDeclInit(Info, E, VD, Frame, BaseVal)) in findCompleteObject()
2641 const ValueDecl *VD = Info.EvaluatingDecl.dyn_cast<const ValueDecl*>(); in findCompleteObject()
2646 Info.Diag(E, diag::note_constexpr_access_static_temporary, 1) << AK; in findCompleteObject()
2647 Info.Note(MTE->getExprLoc(), diag::note_constexpr_temporary_here); in findCompleteObject()
2651 BaseVal = Info.Ctx.getMaterializedTemporaryValue(MTE, false); in findCompleteObject()
2654 Info.Diag(E); in findCompleteObject()
2664 if (Info.getLangOpts().CPlusPlus) { in findCompleteObject()
2665 Info.Diag(E, diag::note_constexpr_access_volatile_obj, 1) in findCompleteObject()
2667 Info.Note(Base->getExprLoc(), diag::note_constexpr_temporary_here); in findCompleteObject()
2669 Info.Diag(E); in findCompleteObject()
2679 if (LVal.getLValueBase() == Info.EvaluatingDecl) { in findCompleteObject()
2680 BaseType = Info.Ctx.getCanonicalType(BaseType); in findCompleteObject()
2689 if (Frame && Info.getLangOpts().CPlusPlus14 && in findCompleteObject()
2690 (Info.EvalStatus.HasSideEffects || Info.keepEvaluatingAfterFailure())) in findCompleteObject()
2707 static bool handleLValueToRValueConversion(EvalInfo &Info, const Expr *Conv, in handleLValueToRValueConversion() argument
2721 assert(!Info.getLangOpts().CPlusPlus && "lvalue compound literal in c++?"); in handleLValueToRValueConversion()
2723 Info.Diag(Conv); in handleLValueToRValueConversion()
2727 if (!Evaluate(Lit, Info, CLE->getInitializer())) in handleLValueToRValueConversion()
2730 return extractSubobject(Info, Conv, LitObj, LVal.Designator, RVal); in handleLValueToRValueConversion()
2737 return extractSubobject(Info, Conv, StrObj, LVal.Designator, RVal); in handleLValueToRValueConversion()
2741 CompleteObject Obj = findCompleteObject(Info, Conv, AK_Read, LVal, Type); in handleLValueToRValueConversion()
2742 return Obj && extractSubobject(Info, Conv, Obj, LVal.Designator, RVal); in handleLValueToRValueConversion()
2746 static bool handleAssignment(EvalInfo &Info, const Expr *E, const LValue &LVal, in handleAssignment() argument
2751 if (!Info.getLangOpts().CPlusPlus14) { in handleAssignment()
2752 Info.Diag(E); in handleAssignment()
2756 CompleteObject Obj = findCompleteObject(Info, E, AK_Assign, LVal, LValType); in handleAssignment()
2757 return Obj && modifySubobject(Info, E, Obj, LVal.Designator, Val); in handleAssignment()
2767 EvalInfo &Info; member
2780 Info.Diag(E, diag::note_constexpr_modify_const_type) << QT; in checkConst()
2796 Info.Diag(E); in found()
2802 Info.Diag(E); in found()
2813 Info.Diag(E); in found()
2817 APSInt LHS = HandleIntToIntCast(Info, E, PromotedLHSType, in found()
2819 if (!handleIntIntBinOp(Info, E, LHS, Opcode, RHS.getInt(), LHS)) in found()
2821 Value = HandleIntToIntCast(Info, E, SubobjType, PromotedLHSType, LHS); in found()
2826 HandleFloatToFloatCast(Info, E, SubobjType, PromotedLHSType, in found()
2828 handleFloatFloatBinOp(Info, E, Value, Opcode, RHS.getFloat()) && in found()
2829 HandleFloatToFloatCast(Info, E, PromotedLHSType, SubobjType, Value); in found()
2841 Info.Diag(E); in foundPointer()
2850 LVal.setFrom(Info.Ctx, Subobj); in foundPointer()
2851 if (!HandleLValueArrayAdjustment(Info, E, LVal, PointeeType, Offset)) in foundPointer()
2866 EvalInfo &Info, const Expr *E, in handleCompoundAssignment() argument
2872 if (!Info.getLangOpts().CPlusPlus14) { in handleCompoundAssignment()
2873 Info.Diag(E); in handleCompoundAssignment()
2877 CompleteObject Obj = findCompleteObject(Info, E, AK_Assign, LVal, LValType); in handleCompoundAssignment()
2878 CompoundAssignSubobjectHandler Handler = { Info, E, PromotedLValType, Opcode, in handleCompoundAssignment()
2880 return Obj && findSubobject(Info, E, Obj, LVal.Designator, Handler); in handleCompoundAssignment()
2885 EvalInfo &Info; member
2895 Info.Diag(E, diag::note_constexpr_modify_const_type) << QT; in checkConst()
2927 Info.Diag(E); in found()
2938 Info.Diag(E); in found()
2959 isOverflowingIntegerType(Info.Ctx, SubobjType)) { in found()
2961 HandleOverflow(Info, E, ActualValue, SubobjType); in found()
2967 isOverflowingIntegerType(Info.Ctx, SubobjType)) { in found()
2971 HandleOverflow(Info, E, ActualValue, SubobjType); in found()
2997 Info.Diag(E); in foundPointer()
3002 LVal.setFrom(Info.Ctx, Subobj); in foundPointer()
3003 if (!HandleLValueArrayAdjustment(Info, E, LVal, PointeeType, in foundPointer()
3016 static bool handleIncDec(EvalInfo &Info, const Expr *E, const LValue &LVal, in handleIncDec() argument
3021 if (!Info.getLangOpts().CPlusPlus14) { in handleIncDec()
3022 Info.Diag(E); in handleIncDec()
3027 CompleteObject Obj = findCompleteObject(Info, E, AK, LVal, LValType); in handleIncDec()
3028 IncDecSubobjectHandler Handler = { Info, E, AK, Old }; in handleIncDec()
3029 return Obj && findSubobject(Info, E, Obj, LVal.Designator, Handler); in handleIncDec()
3033 static bool EvaluateObjectArgument(EvalInfo &Info, const Expr *Object, in EvaluateObjectArgument() argument
3036 return EvaluatePointer(Object, This, Info); in EvaluateObjectArgument()
3039 return EvaluateLValue(Object, This, Info); in EvaluateObjectArgument()
3041 if (Object->getType()->isLiteralType(Info.Ctx)) in EvaluateObjectArgument()
3042 return EvaluateTemporary(Object, This, Info); in EvaluateObjectArgument()
3044 Info.Diag(Object, diag::note_constexpr_nonliteral) << Object->getType(); in EvaluateObjectArgument()
3059 static const ValueDecl *HandleMemberPointerAccess(EvalInfo &Info, in HandleMemberPointerAccess() argument
3065 if (!EvaluateMemberPointer(RHS, MemPtr, Info)) in HandleMemberPointerAccess()
3072 Info.Diag(RHS); in HandleMemberPointerAccess()
3082 Info.Diag(RHS); in HandleMemberPointerAccess()
3092 Info.Diag(RHS); in HandleMemberPointerAccess()
3098 if (!CastToDerivedClass(Info, RHS, LV, MemPtr.getContainingRecord(), in HandleMemberPointerAccess()
3114 if (!HandleLValueDirectBase(Info, RHS, LV, RD, Base)) in HandleMemberPointerAccess()
3119 if (!HandleLValueDirectBase(Info, RHS, LV, RD, in HandleMemberPointerAccess()
3127 if (!HandleLValueMember(Info, RHS, LV, FD)) in HandleMemberPointerAccess()
3131 if (!HandleLValueIndirectMember(Info, RHS, LV, IFD)) in HandleMemberPointerAccess()
3141 static const ValueDecl *HandleMemberPointerAccess(EvalInfo &Info, in HandleMemberPointerAccess() argument
3147 if (!EvaluateObjectArgument(Info, BO->getLHS(), LV)) { in HandleMemberPointerAccess()
3148 if (Info.keepEvaluatingAfterFailure()) { in HandleMemberPointerAccess()
3150 EvaluateMemberPointer(BO->getRHS(), MemPtr, Info); in HandleMemberPointerAccess()
3155 return HandleMemberPointerAccess(Info, BO->getLHS()->getType(), LV, in HandleMemberPointerAccess()
3161 static bool HandleBaseToDerivedCast(EvalInfo &Info, const CastExpr *E, in HandleBaseToDerivedCast() argument
3164 if (D.Invalid || !Result.checkNullPointer(Info, E, CSK_Derived)) in HandleBaseToDerivedCast()
3173 Info.CCEDiag(E, diag::note_constexpr_invalid_downcast) in HandleBaseToDerivedCast()
3188 Info.CCEDiag(E, diag::note_constexpr_invalid_downcast) in HandleBaseToDerivedCast()
3194 return CastToDerivedClass(Info, E, Result, TargetType, NewEntriesSize); in HandleBaseToDerivedCast()
3214 static bool EvaluateDecl(EvalInfo &Info, const Decl *D) { in EvaluateDecl() argument
3221 Result.set(VD, Info.CurrentCall->Index); in EvaluateDecl()
3222 APValue &Val = Info.CurrentCall->createTemporary(VD, true); in EvaluateDecl()
3226 Info.Diag(D->getLocStart(), diag::note_constexpr_uninitialized) in EvaluateDecl()
3235 if (!EvaluateInPlace(Val, Info, Result, InitE)) { in EvaluateDecl()
3247 static bool EvaluateCond(EvalInfo &Info, const VarDecl *CondDecl, in EvaluateCond() argument
3249 FullExpressionRAII Scope(Info); in EvaluateCond()
3250 if (CondDecl && !EvaluateDecl(Info, CondDecl)) in EvaluateCond()
3252 return EvaluateAsBooleanCondition(Cond, Result, Info); in EvaluateCond()
3255 static EvalStmtResult EvaluateStmt(APValue &Result, EvalInfo &Info,
3260 static EvalStmtResult EvaluateLoopBody(APValue &Result, EvalInfo &Info, in EvaluateLoopBody() argument
3263 BlockScopeRAII Scope(Info); in EvaluateLoopBody()
3264 switch (EvalStmtResult ESR = EvaluateStmt(Result, Info, Body, Case)) { in EvaluateLoopBody()
3279 static EvalStmtResult EvaluateSwitch(APValue &Result, EvalInfo &Info, in EvaluateSwitch() argument
3281 BlockScopeRAII Scope(Info); in EvaluateSwitch()
3286 FullExpressionRAII Scope(Info); in EvaluateSwitch()
3288 !EvaluateDecl(Info, SS->getConditionVariable())) in EvaluateSwitch()
3290 if (!EvaluateInteger(SS->getCond(), Value, Info)) in EvaluateSwitch()
3305 APSInt LHS = CS->getLHS()->EvaluateKnownConstInt(Info.Ctx); in EvaluateSwitch()
3306 APSInt RHS = CS->getRHS() ? CS->getRHS()->EvaluateKnownConstInt(Info.Ctx) in EvaluateSwitch()
3318 switch (EvalStmtResult ESR = EvaluateStmt(Result, Info, SS->getBody(), Found)) { in EvaluateSwitch()
3329 Info.Diag(Found->getLocStart(), diag::note_constexpr_stmt_expr_unsupported); in EvaluateSwitch()
3336 static EvalStmtResult EvaluateStmt(APValue &Result, EvalInfo &Info, in EvaluateStmt() argument
3338 if (!Info.nextStep(S)) in EvaluateStmt()
3371 BlockScopeRAII Scope(Info); in EvaluateStmt()
3373 EvalStmtResult ESR = EvaluateStmt(Result, Info, IS->getThen(), Case); in EvaluateStmt()
3376 return EvaluateStmt(Result, Info, IS->getElse(), Case); in EvaluateStmt()
3381 EvaluateLoopBody(Result, Info, cast<WhileStmt>(S)->getBody(), Case); in EvaluateStmt()
3390 EvaluateLoopBody(Result, Info, FS->getBody(), Case); in EvaluateStmt()
3394 FullExpressionRAII IncScope(Info); in EvaluateStmt()
3395 if (!EvaluateIgnoredValue(Info, FS->getInc())) in EvaluateStmt()
3414 FullExpressionRAII Scope(Info); in EvaluateStmt()
3415 if (!EvaluateIgnoredValue(Info, E)) in EvaluateStmt()
3420 Info.Diag(S->getLocStart()); in EvaluateStmt()
3432 FullExpressionRAII Scope(Info); in EvaluateStmt()
3433 if (!EvaluateDecl(Info, DclIt) && !Info.keepEvaluatingAfterFailure()) in EvaluateStmt()
3441 FullExpressionRAII Scope(Info); in EvaluateStmt()
3442 if (RetExpr && !Evaluate(Result, Info, RetExpr)) in EvaluateStmt()
3448 BlockScopeRAII Scope(Info); in EvaluateStmt()
3452 EvalStmtResult ESR = EvaluateStmt(Result, Info, BI, Case); in EvaluateStmt()
3465 BlockScopeRAII Scope(Info); in EvaluateStmt()
3467 if (!EvaluateCond(Info, IS->getConditionVariable(), IS->getCond(), Cond)) in EvaluateStmt()
3471 EvalStmtResult ESR = EvaluateStmt(Result, Info, SubStmt); in EvaluateStmt()
3481 BlockScopeRAII Scope(Info); in EvaluateStmt()
3483 if (!EvaluateCond(Info, WS->getConditionVariable(), WS->getCond(), in EvaluateStmt()
3489 EvalStmtResult ESR = EvaluateLoopBody(Result, Info, WS->getBody()); in EvaluateStmt()
3500 EvalStmtResult ESR = EvaluateLoopBody(Result, Info, DS->getBody(), Case); in EvaluateStmt()
3505 FullExpressionRAII CondScope(Info); in EvaluateStmt()
3506 if (!EvaluateAsBooleanCondition(DS->getCond(), Continue, Info)) in EvaluateStmt()
3514 BlockScopeRAII Scope(Info); in EvaluateStmt()
3516 EvalStmtResult ESR = EvaluateStmt(Result, Info, FS->getInit()); in EvaluateStmt()
3521 BlockScopeRAII Scope(Info); in EvaluateStmt()
3523 if (FS->getCond() && !EvaluateCond(Info, FS->getConditionVariable(), in EvaluateStmt()
3529 EvalStmtResult ESR = EvaluateLoopBody(Result, Info, FS->getBody()); in EvaluateStmt()
3534 FullExpressionRAII IncScope(Info); in EvaluateStmt()
3535 if (!EvaluateIgnoredValue(Info, FS->getInc())) in EvaluateStmt()
3544 BlockScopeRAII Scope(Info); in EvaluateStmt()
3547 EvalStmtResult ESR = EvaluateStmt(Result, Info, FS->getRangeStmt()); in EvaluateStmt()
3552 ESR = EvaluateStmt(Result, Info, FS->getBeginEndStmt()); in EvaluateStmt()
3560 FullExpressionRAII CondExpr(Info); in EvaluateStmt()
3561 if (!EvaluateAsBooleanCondition(FS->getCond(), Continue, Info)) in EvaluateStmt()
3568 BlockScopeRAII InnerScope(Info); in EvaluateStmt()
3569 ESR = EvaluateStmt(Result, Info, FS->getLoopVarStmt()); in EvaluateStmt()
3574 ESR = EvaluateLoopBody(Result, Info, FS->getBody()); in EvaluateStmt()
3579 if (!EvaluateIgnoredValue(Info, FS->getInc())) in EvaluateStmt()
3587 return EvaluateSwitch(Result, Info, cast<SwitchStmt>(S)); in EvaluateStmt()
3596 return EvaluateStmt(Result, Info, cast<LabelStmt>(S)->getSubStmt(), Case); in EvaluateStmt()
3601 return EvaluateStmt(Result, Info, cast<AttributedStmt>(S)->getSubStmt(), in EvaluateStmt()
3606 return EvaluateStmt(Result, Info, cast<SwitchCase>(S)->getSubStmt(), Case); in EvaluateStmt()
3614 static bool CheckTrivialDefaultConstructor(EvalInfo &Info, SourceLocation Loc, in CheckTrivialDefaultConstructor() argument
3624 if (Info.getLangOpts().CPlusPlus11) { in CheckTrivialDefaultConstructor()
3627 Info.CCEDiag(Loc, diag::note_constexpr_invalid_function, 1) in CheckTrivialDefaultConstructor()
3629 Info.Note(CD->getLocation(), diag::note_declared_at); in CheckTrivialDefaultConstructor()
3631 Info.CCEDiag(Loc, diag::note_invalid_subexpr_in_const_expr); in CheckTrivialDefaultConstructor()
3639 static bool CheckConstexprFunction(EvalInfo &Info, SourceLocation CallLoc, in CheckConstexprFunction() argument
3644 if (Info.checkingPotentialConstantExpression() && !Definition && in CheckConstexprFunction()
3657 if (Info.getLangOpts().CPlusPlus11) { in CheckConstexprFunction()
3661 Info.Diag(CallLoc, diag::note_constexpr_invalid_function, 1) in CheckConstexprFunction()
3664 Info.Note(DiagDecl->getLocation(), diag::note_declared_at); in CheckConstexprFunction()
3666 Info.Diag(CallLoc, diag::note_invalid_subexpr_in_const_expr); in CheckConstexprFunction()
3693 EvalInfo &Info) { in EvaluateArgs() argument
3697 if (!Evaluate(ArgValues[I - Args.begin()], Info, *I)) { in EvaluateArgs()
3700 if (!Info.keepEvaluatingAfterFailure()) in EvaluateArgs()
3712 EvalInfo &Info, APValue &Result) { in HandleFunctionCall() argument
3714 if (!EvaluateArgs(Args, ArgValues, Info)) in HandleFunctionCall()
3717 if (!Info.CheckCallLimit(CallLoc)) in HandleFunctionCall()
3720 CallStackFrame Frame(Info, CallLoc, Callee, This, ArgValues.data()); in HandleFunctionCall()
3734 RHS.setFrom(Info.Ctx, ArgValues[0]); in HandleFunctionCall()
3736 if (!handleLValueToRValueConversion(Info, Args[0], Args[0]->getType(), in HandleFunctionCall()
3739 if (!handleAssignment(Info, Args[0], *This, MD->getThisType(Info.Ctx), in HandleFunctionCall()
3746 EvalStmtResult ESR = EvaluateStmt(Result, Info, Body); in HandleFunctionCall()
3750 Info.Diag(Callee->getLocEnd(), diag::note_constexpr_no_return); in HandleFunctionCall()
3759 EvalInfo &Info, APValue &Result) { in HandleConstructorCall() argument
3761 if (!EvaluateArgs(Args, ArgValues, Info)) in HandleConstructorCall()
3764 if (!Info.CheckCallLimit(CallLoc)) in HandleConstructorCall()
3769 Info.Diag(CallLoc, diag::note_constexpr_virtual_base) << RD; in HandleConstructorCall()
3773 CallStackFrame Frame(Info, CallLoc, Definition, &This, ArgValues.data()); in HandleConstructorCall()
3779 FullExpressionRAII InitScope(Info); in HandleConstructorCall()
3780 if (!EvaluateInPlace(Result, Info, This, (*I)->getInit())) in HandleConstructorCall()
3783 return EvaluateStmt(Result, Info, Definition->getBody()) != ESR_Failed; in HandleConstructorCall()
3800 RHS.setFrom(Info.Ctx, ArgValues[0]); in HandleConstructorCall()
3801 return handleLValueToRValueConversion(Info, Args[0], Args[0]->getType(), in HandleConstructorCall()
3811 const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); in HandleConstructorCall()
3814 BlockScopeRAII LifetimeExtendedScope(Info); in HandleConstructorCall()
3833 assert(Info.Ctx.hasSameType(BaseIt->getType(), BaseType) && in HandleConstructorCall()
3837 if (!HandleLValueDirectBase(Info, I->getInit(), Subobject, RD, in HandleConstructorCall()
3842 if (!HandleLValueMember(Info, I->getInit(), Subobject, FD, &Layout)) in HandleConstructorCall()
3869 if (!HandleLValueMember(Info, I->getInit(), Subobject, FD)) in HandleConstructorCall()
3880 FullExpressionRAII InitScope(Info); in HandleConstructorCall()
3881 if (!EvaluateInPlace(*Value, Info, Subobject, I->getInit()) || in HandleConstructorCall()
3882 (FD && FD->isBitField() && !truncateBitfieldValue(Info, I->getInit(), in HandleConstructorCall()
3886 if (!Info.keepEvaluatingAfterFailure()) in HandleConstructorCall()
3893 EvaluateStmt(Result, Info, Definition->getBody()) != ESR_Failed; in HandleConstructorCall()
3917 assert(Info.checkingPotentialConstantExpression()); in CheckPotentialConstantConditional()
3922 SpeculativeEvaluationRAII Speculate(Info, &Diag); in CheckPotentialConstantConditional()
3941 if (!EvaluateAsBooleanCondition(E->getCond(), BoolResult, Info)) { in HandleConditionalOperator()
3942 if (Info.checkingPotentialConstantExpression()) in HandleConditionalOperator()
3952 EvalInfo &Info; member in __anon0751fa450911::ExprEvaluatorBase
3957 return Info.CCEDiag(E, D); in CCEDiag()
3963 ExprEvaluatorBase(EvalInfo &Info) : Info(Info) {} in ExprEvaluatorBase() argument
3965 EvalInfo &getEvalInfo() { return Info; } in getEvalInfo()
3970 Info.Diag(E, D); in Error()
4030 if (!HandleMemberPointerAccess(Info, E, Obj)) in VisitBinaryOperator()
4033 if (!handleLValueToRValueConversion(Info, E, E->getType(), Obj, Result)) in VisitBinaryOperator()
4043 if (!Evaluate(Info.CurrentCall->createTemporary(E->getOpaqueValue(), false), in VisitBinaryConditionalOperator()
4044 Info, E->getCommon())) in VisitBinaryConditionalOperator()
4063 if (Info.checkingPotentialConstantExpression() && IsBcpCall) in VisitConditionalOperator()
4066 FoldConstant Fold(Info, IsBcpCall); in VisitConditionalOperator()
4076 if (APValue *Value = Info.CurrentCall->getTemporary(E)) in VisitOpaqueValueExpr()
4103 if (!EvaluateObjectArgument(Info, ME->getBase(), ThisVal)) in VisitCallExpr()
4110 Member = HandleMemberPointerAccess(Info, BE, ThisVal, false); in VisitCallExpr()
4121 if (!EvaluatePointer(Callee, Call, Info)) in VisitCallExpr()
4141 if (!EvaluateObjectArgument(Info, Args[0], ThisVal)) in VisitCallExpr()
4148 if (!Info.Ctx.hasSameType(CalleeType->getPointeeType(), FD->getType())) in VisitCallExpr()
4153 if (This && !This->checkSubobject(Info, E, CSK_This)) in VisitCallExpr()
4166 if (!CheckConstexprFunction(Info, E->getExprLoc(), FD, Definition) || in VisitCallExpr()
4168 Info, Result)) in VisitCallExpr()
4199 if (!Evaluate(Val, Info, E->getBase())) in VisitMemberExpr()
4215 return extractSubobject(Info, E, Obj, Designator, Result) && in VisitMemberExpr()
4226 if (!EvaluateAtomic(E->getSubExpr(), AtomicVal, Info)) in VisitCastExpr()
4237 if (!EvaluateLValue(E->getSubExpr(), LVal, Info)) in VisitCastExpr()
4241 if (!handleLValueToRValueConversion(Info, E, E->getSubExpr()->getType(), in VisitCastExpr()
4258 if (!Info.getLangOpts().CPlusPlus14 && !Info.keepEvaluatingAfterFailure()) in VisitUnaryPostIncDec()
4262 if (!EvaluateLValue(UO->getSubExpr(), LVal, Info)) in VisitUnaryPostIncDec()
4265 if (!handleIncDec(this->Info, UO, LVal, UO->getSubExpr()->getType(), in VisitUnaryPostIncDec()
4274 if (Info.checkingForOverflow()) in VisitStmtExpr()
4277 BlockScopeRAII Scope(Info); in VisitStmtExpr()
4285 Info.Diag((*BI)->getLocStart(), in VisitStmtExpr()
4293 EvalStmtResult ESR = EvaluateStmt(ReturnValue, Info, *BI); in VisitStmtExpr()
4299 Info.Diag((*BI)->getLocStart(), in VisitStmtExpr()
4308 EvaluateIgnoredValue(Info, E); in VisitIgnoredValue()
4332 LValueExprEvaluatorBase(EvalInfo &Info, LValue &Result) : in LValueExprEvaluatorBase() argument
4333 ExprEvaluatorBaseTy(Info), Result(Result) {} in LValueExprEvaluatorBase()
4336 Result.setFrom(this->Info.Ctx, V); in Success()
4344 if (!EvaluatePointer(E->getBase(), Result, this->Info)) in VisitMemberExpr()
4349 if (!EvaluateTemporary(E->getBase(), Result, this->Info)) in VisitMemberExpr()
4363 if (!HandleLValueMember(this->Info, E, Result, FD)) in VisitMemberExpr()
4366 if (!HandleLValueIndirectMember(this->Info, E, Result, IFD)) in VisitMemberExpr()
4373 if (!handleLValueToRValueConversion(this->Info, E, MD->getType(), Result, in VisitMemberExpr()
4388 return HandleMemberPointerAccess(this->Info, E, Result); in VisitBinaryOperator()
4404 return HandleLValueBasePath(this->Info, E, E->getSubExpr()->getType(), in VisitCastExpr()
4446 LValueExprEvaluator(EvalInfo &Info, LValue &Result) : in LValueExprEvaluator() argument
4447 LValueExprEvaluatorBaseTy(Info, Result) {} in LValueExprEvaluator()
4489 return HandleBaseToDerivedCast(Info, E, Result); in VisitCastExpr()
4499 static bool EvaluateLValue(const Expr *E, LValue &Result, EvalInfo &Info) { in EvaluateLValue() argument
4502 return LValueExprEvaluator(Info, Result).Visit(E); in EvaluateLValue()
4515 if (VD->hasLocalStorage() && Info.CurrentCall->Index > 1) in VisitVarDecl()
4516 Frame = Info.CurrentCall; in VisitVarDecl()
4527 if (!evaluateVarDeclInit(Info, E, VD, Frame, V)) in VisitVarDecl()
4530 if (!Info.checkingPotentialConstantExpression()) in VisitVarDecl()
4531 Info.Diag(E, diag::note_constexpr_use_uninit_reference); in VisitVarDecl()
4547 if (!EvaluateIgnoredValue(Info, CommaLHSs[I])) in VisitMaterializeTemporaryExpr()
4555 Value = Info.Ctx.getMaterializedTemporaryValue(E, true); in VisitMaterializeTemporaryExpr()
4559 Value = &Info.CurrentCall-> in VisitMaterializeTemporaryExpr()
4561 Result.set(E, Info.CurrentCall->Index); in VisitMaterializeTemporaryExpr()
4567 if (!EvaluateInPlace(*Value, Info, Result, Inner) || in VisitMaterializeTemporaryExpr()
4569 !CheckConstantExpression(Info, E->getExprLoc(), Type, *Value))) { in VisitMaterializeTemporaryExpr()
4579 if (!HandleLValueBasePath(Info, Adjustments[I].DerivedToBase.BasePath, in VisitMaterializeTemporaryExpr()
4586 if (!HandleLValueMember(Info, E, Result, Adjustments[I].Field)) in VisitMaterializeTemporaryExpr()
4592 if (!HandleMemberPointerAccess(this->Info, Type, Result, in VisitMaterializeTemporaryExpr()
4605 assert(!Info.getLangOpts().CPlusPlus && "lvalue compound literal in c++?"); in VisitCompoundLiteralExpr()
4615 Info.Diag(E, diag::note_constexpr_typeid_polymorphic) in VisitCXXTypeidExpr()
4649 if (!EvaluatePointer(E->getBase(), Result, Info)) in VisitArraySubscriptExpr()
4653 if (!EvaluateInteger(E->getIdx(), Index, Info)) in VisitArraySubscriptExpr()
4656 return HandleLValueArrayAdjustment(Info, E, Result, E->getType(), in VisitArraySubscriptExpr()
4661 return EvaluatePointer(E->getSubExpr(), Result, Info); in VisitUnaryDeref()
4669 HandleLValueComplexElement(Info, E, Result, E->getType(), false); in VisitUnaryReal()
4678 HandleLValueComplexElement(Info, E, Result, E->getType(), true); in VisitUnaryImag()
4683 if (!Info.getLangOpts().CPlusPlus14 && !Info.keepEvaluatingAfterFailure()) in VisitUnaryPreIncDec()
4690 this->Info, UO, Result, UO->getSubExpr()->getType(), in VisitUnaryPreIncDec()
4696 if (!Info.getLangOpts().CPlusPlus14 && !Info.keepEvaluatingAfterFailure()) in VisitCompoundAssignOperator()
4703 if (Info.keepEvaluatingAfterFailure()) in VisitCompoundAssignOperator()
4704 Evaluate(RHS, this->Info, CAO->getRHS()); in VisitCompoundAssignOperator()
4708 if (!Evaluate(RHS, this->Info, CAO->getRHS())) in VisitCompoundAssignOperator()
4712 this->Info, CAO, in VisitCompoundAssignOperator()
4718 if (!Info.getLangOpts().CPlusPlus14 && !Info.keepEvaluatingAfterFailure()) in VisitBinAssign()
4724 if (Info.keepEvaluatingAfterFailure()) in VisitBinAssign()
4725 Evaluate(NewVal, this->Info, E->getRHS()); in VisitBinAssign()
4729 if (!Evaluate(NewVal, this->Info, E->getRHS())) in VisitBinAssign()
4732 return handleAssignment(this->Info, E, Result, E->getLHS()->getType(), in VisitBinAssign()
4755 Result.setFrom(Info.Ctx, V); in Success()
4779 if (Info.checkingPotentialConstantExpression()) in VisitCXXThisExpr()
4781 if (!Info.CurrentCall->This) { in VisitCXXThisExpr()
4782 if (Info.getLangOpts().CPlusPlus11) in VisitCXXThisExpr()
4783 Info.Diag(E, diag::note_constexpr_this) << E->isImplicit(); in VisitCXXThisExpr()
4785 Info.Diag(E); in VisitCXXThisExpr()
4788 Result = *Info.CurrentCall->This; in VisitCXXThisExpr()
4796 static bool EvaluatePointer(const Expr* E, LValue& Result, EvalInfo &Info) { in EvaluatePointer() argument
4798 return PointerExprEvaluator(Info, Result).Visit(E); in EvaluatePointer()
4811 bool EvalPtrOK = EvaluatePointer(PExp, Result, Info); in VisitBinaryOperator()
4812 if (!EvalPtrOK && !Info.keepEvaluatingAfterFailure()) in VisitBinaryOperator()
4816 if (!EvaluateInteger(IExp, Offset, Info) || !EvalPtrOK) in VisitBinaryOperator()
4824 return HandleLValueArrayAdjustment(Info, E, Result, Pointee, in VisitBinaryOperator()
4829 return EvaluateLValue(E->getSubExpr(), Result, Info); in VisitUnaryAddrOf()
4861 if (!EvaluatePointer(E->getSubExpr(), Result, Info)) in VisitCastExpr()
4868 return HandleLValueBasePath(Info, E, E->getSubExpr()->getType()-> in VisitCastExpr()
4877 return HandleBaseToDerivedCast(Info, E, Result); in VisitCastExpr()
4887 if (!EvaluateIntegerOrLValue(SubExpr, Value, Info)) in VisitCastExpr()
4891 unsigned Size = Info.Ctx.getTypeSize(E->getType()); in VisitCastExpr()
4900 Result.setFrom(Info.Ctx, Value); in VisitCastExpr()
4906 if (!EvaluateLValue(SubExpr, Result, Info)) in VisitCastExpr()
4909 Result.set(SubExpr, Info.CurrentCall->Index); in VisitCastExpr()
4910 if (!EvaluateInPlace(Info.CurrentCall->createTemporary(SubExpr, false), in VisitCastExpr()
4911 Info, Result, SubExpr)) in VisitCastExpr()
4916 = Info.Ctx.getAsConstantArrayType(SubExpr->getType())) in VisitCastExpr()
4917 Result.addArray(Info, E, CAT); in VisitCastExpr()
4923 return EvaluateLValue(SubExpr, Result, Info); in VisitCastExpr()
4929 static CharUnits GetAlignOfType(EvalInfo &Info, QualType T) { in GetAlignOfType() argument
4937 return Info.Ctx.toCharUnitsFromBits( in GetAlignOfType()
4938 Info.Ctx.getPreferredTypeAlign(T.getTypePtr())); in GetAlignOfType()
4941 static CharUnits GetAlignOfExpr(EvalInfo &Info, const Expr *E) { in GetAlignOfExpr() argument
4951 return Info.Ctx.getDeclAlign(DRE->getDecl(), in GetAlignOfExpr()
4955 return Info.Ctx.getDeclAlign(ME->getMemberDecl(), in GetAlignOfExpr()
4958 return GetAlignOfType(Info, E->getType()); in GetAlignOfExpr()
4967 return EvaluateLValue(E->getArg(0), Result, Info); in VisitCallExpr()
4972 if (!EvaluatePointer(E->getArg(0), Result, Info)) in VisitCallExpr()
4977 if (!EvaluateInteger(E->getArg(1), Alignment, Info)) in VisitCallExpr()
4983 if (!EvaluateInteger(E->getArg(2), Offset, Info)) in VisitCallExpr()
4995 BaseAlignment = Info.Ctx.getDeclAlign(VD); in VisitCallExpr()
4998 GetAlignOfExpr(Info, OffsetResult.Base.get<const Expr*>()); in VisitCallExpr()
5053 MemberPointerExprEvaluator(EvalInfo &Info, MemberPtr &Result) in MemberPointerExprEvaluator() argument
5054 : ExprEvaluatorBaseTy(Info), Result(Result) {} in MemberPointerExprEvaluator()
5070 EvalInfo &Info) { in EvaluateMemberPointer() argument
5072 return MemberPointerExprEvaluator(Info, Result).Visit(E); in EvaluateMemberPointer()
5160 static bool HandleClassZeroInitialization(EvalInfo &Info, const Expr *E, in HandleClassZeroInitialization() argument
5169 const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); in HandleClassZeroInitialization()
5177 if (!HandleLValueDirectBase(Info, E, Subobject, CD, Base, &Layout)) in HandleClassZeroInitialization()
5179 if (!HandleClassZeroInitialization(Info, E, Base, Subobject, in HandleClassZeroInitialization()
5191 if (!HandleLValueMember(Info, E, Subobject, I, &Layout)) in HandleClassZeroInitialization()
5196 Result.getStructField(I->getFieldIndex()), Info, Subobject, &VIE)) in HandleClassZeroInitialization()
5216 if (!HandleLValueMember(Info, E, Subobject, *I)) in ZeroInitialization()
5220 return EvaluateInPlace(Result.getUnionValue(), Info, Subobject, &VIE); in ZeroInitialization()
5224 Info.Diag(E, diag::note_constexpr_virtual_base) << RD; in ZeroInitialization()
5228 return HandleClassZeroInitialization(Info, E, RD, This, Result); in ZeroInitialization()
5242 if (!Evaluate(DerivedObject, Info, E->getSubExpr())) in VisitCastExpr()
5266 const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); in VisitInitListExpr()
5283 if (!HandleLValueMember(Info, InitExpr, Subobject, Field, &Layout)) in VisitInitListExpr()
5287 ThisOverrideRAII ThisOverride(*Info.CurrentCall, &This, in VisitInitListExpr()
5290 return EvaluateInPlace(Result.getUnionValue(), Info, Subobject, InitExpr); in VisitInitListExpr()
5311 if (!HandleLValueMember(Info, HaveInit ? E->getInit(ElementNo) : E, in VisitInitListExpr()
5317 ImplicitValueInitExpr VIE(HaveInit ? Info.Ctx.IntTy : Field->getType()); in VisitInitListExpr()
5321 ThisOverrideRAII ThisOverride(*Info.CurrentCall, &This, in VisitInitListExpr()
5325 if (!EvaluateInPlace(FieldVal, Info, Subobject, Init) || in VisitInitListExpr()
5326 (Field->isBitField() && !truncateBitfieldValue(Info, Init, in VisitInitListExpr()
5328 if (!Info.keepEvaluatingAfterFailure()) in VisitInitListExpr()
5342 if (CheckTrivialDefaultConstructor(Info, E->getExprLoc(), FD, ZeroInit)) { in VisitCXXConstructExpr()
5361 if (!CheckConstexprFunction(Info, E->getExprLoc(), FD, Definition)) in VisitCXXConstructExpr()
5375 cast<CXXConstructorDecl>(Definition), Info, in VisitCXXConstructExpr()
5382 Info.Ctx.getAsConstantArrayType(E->getSubExpr()->getType()); in VisitCXXStdInitializerListExpr()
5385 if (!EvaluateLValue(E->getSubExpr(), Array, Info)) in VisitCXXStdInitializerListExpr()
5389 Array.addArray(Info, E, ArrayType); in VisitCXXStdInitializerListExpr()
5399 !Info.Ctx.hasSameType(Field->getType()->getPointeeType(), in VisitCXXStdInitializerListExpr()
5411 Info.Ctx.hasSameType(Field->getType()->getPointeeType(), in VisitCXXStdInitializerListExpr()
5414 if (!HandleLValueArrayAdjustment(Info, E, Array, in VisitCXXStdInitializerListExpr()
5419 } else if (Info.Ctx.hasSameType(Field->getType(), Info.Ctx.getSizeType())) in VisitCXXStdInitializerListExpr()
5432 APValue &Result, EvalInfo &Info) { in EvaluateRecord() argument
5435 return RecordExprEvaluator(Info, This, Result).Visit(E); in EvaluateRecord()
5449 TemporaryExprEvaluator(EvalInfo &Info, LValue &Result) : in TemporaryExprEvaluator() argument
5450 LValueExprEvaluatorBaseTy(Info, Result) {} in TemporaryExprEvaluator()
5454 Result.set(E, Info.CurrentCall->Index); in VisitConstructExpr()
5455 return EvaluateInPlace(Info.CurrentCall->createTemporary(E, false), in VisitConstructExpr()
5456 Info, Result, E); in VisitConstructExpr()
5484 static bool EvaluateTemporary(const Expr *E, LValue &Result, EvalInfo &Info) { in EvaluateTemporary() argument
5486 return TemporaryExprEvaluator(Info, Result).Visit(E); in EvaluateTemporary()
5526 static bool EvaluateVector(const Expr* E, APValue& Result, EvalInfo &Info) { in EvaluateVector() argument
5528 return VectorExprEvaluator(Info, Result).Visit(E); in EvaluateVector()
5543 if (!EvaluateInteger(SE, IntResult, Info)) in VisitCastExpr()
5548 if (!EvaluateFloat(SE, F, Info)) in VisitCastExpr()
5562 if (!EvalAndBitcastToAPInt(Info, SE, SValInt)) in VisitCastExpr()
5566 unsigned EltSize = Info.Ctx.getTypeSize(EltTy); in VisitCastExpr()
5567 bool BigEndian = Info.Ctx.getTargetInfo().isBigEndian(); in VisitCastExpr()
5570 const llvm::fltSemantics &Sem = Info.Ctx.getFloatTypeSemantics(EltTy); in VisitCastExpr()
5620 if (!EvaluateVector(E->getInit(CountInits), v, Info)) in VisitInitListExpr()
5629 if (!EvaluateInteger(E->getInit(CountInits), sInt, Info)) in VisitInitListExpr()
5632 sInt = Info.Ctx.MakeIntValue(0, EltTy); in VisitInitListExpr()
5638 if (!EvaluateFloat(E->getInit(CountInits), f, Info)) in VisitInitListExpr()
5641 f = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy)); in VisitInitListExpr()
5656 ZeroElement = APValue(Info.Ctx.MakeIntValue(0, EltTy)); in ZeroInitialization()
5659 APValue(APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy))); in ZeroInitialization()
5681 ArrayExprEvaluator(EvalInfo &Info, const LValue &This, APValue &Result) in ArrayExprEvaluator() argument
5682 : ExprEvaluatorBaseTy(Info), This(This), Result(Result) {} in ArrayExprEvaluator()
5693 Info.Ctx.getAsConstantArrayType(E->getType()); in ZeroInitialization()
5703 Subobject.addArray(Info, E, CAT); in ZeroInitialization()
5705 return EvaluateInPlace(Result.getArrayFiller(), Info, Subobject, &VIE); in ZeroInitialization()
5717 APValue &Result, EvalInfo &Info) { in EvaluateArray() argument
5719 return ArrayExprEvaluator(Info, This, Result).Visit(E); in EvaluateArray()
5723 const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType(E->getType()); in VisitInitListExpr()
5731 if (!EvaluateLValue(E->getInit(0), LV, Info)) in VisitInitListExpr()
5767 Subobject.addArray(Info, E, CAT); in VisitInitListExpr()
5772 Info, Subobject, Init) || in VisitInitListExpr()
5773 !HandleLValueArrayAdjustment(Info, Init, Subobject, in VisitInitListExpr()
5775 if (!Info.keepEvaluatingAfterFailure()) in VisitInitListExpr()
5787 return EvaluateInPlace(Result.getArrayFiller(), Info, Subobject, in VisitInitListExpr()
5801 if (const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType(Type)) { in VisitCXXConstructExpr()
5817 ArrayElt.addArray(Info, E, CAT); in VisitCXXConstructExpr()
5821 !HandleLValueArrayAdjustment(Info, E, ArrayElt, in VisitCXXConstructExpr()
5834 if (CheckTrivialDefaultConstructor(Info, E->getExprLoc(), FD, ZeroInit)) { in VisitCXXConstructExpr()
5840 return EvaluateInPlace(*Value, Info, Subobject, &VIE); in VisitCXXConstructExpr()
5846 if (!CheckConstexprFunction(Info, E->getExprLoc(), FD, Definition)) in VisitCXXConstructExpr()
5851 if (!EvaluateInPlace(*Value, Info, Subobject, &VIE)) in VisitCXXConstructExpr()
5858 Info, *Value); in VisitCXXConstructExpr()
5882 assert(SI.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) && in Success()
5894 assert(I.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) && in Success()
5908 Result = APValue(Info.Ctx.MakeIntValue(Value, E->getType())); in Success()
6011 EvalInfo &Info) { in EvaluateIntegerOrLValue() argument
6013 return IntExprEvaluator(Info, Result).Visit(E); in EvaluateIntegerOrLValue()
6016 static bool EvaluateInteger(const Expr *E, APSInt &Result, EvalInfo &Info) { in EvaluateInteger() argument
6018 if (!EvaluateIntegerOrLValue(E, Val, Info)) in EvaluateInteger()
6023 Info.Diag(E, diag::note_invalid_subexpr_in_const_expr); in EvaluateInteger()
6040 == Info.Ctx.getIntWidth(E->getType())); in CheckReferencedDecl()
6050 Val = Val.extOrTrunc(Info.Ctx.getIntWidth(E->getType())); in CheckReferencedDecl()
6156 EvalInfo Info(Ctx, Status, EvalInfo::EM_ConstantFold); in EvaluateBuiltinConstantP() local
6157 if ((Arg->isGLValue() ? EvaluateLValue(Arg, LV, Info) in EvaluateBuiltinConstantP()
6158 : EvaluatePointer(Arg, LV, Info)) && in EvaluateBuiltinConstantP()
6188 SpeculativeEvaluationRAII SpeculativeEval(Info); in TryEvaluateBuiltinObjectSize()
6189 if (!EvaluatePointer(E->getArg(0), Base, Info)) in TryEvaluateBuiltinObjectSize()
6199 if (!ExprType->EvaluateAsInt(TypeIntVaue, Info.Ctx)) in TryEvaluateBuiltinObjectSize()
6216 CharUnits Size = Info.Ctx.getTypeSizeInChars(T); in TryEvaluateBuiltinObjectSize()
6238 if (E->getArg(0)->HasSideEffects(Info.Ctx)) { in VisitCallExpr()
6239 if (E->getArg(1)->EvaluateKnownConstInt(Info.Ctx).getZExtValue() <= 1) in VisitCallExpr()
6246 switch (Info.EvalMode) { in VisitCallExpr()
6263 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitCallExpr()
6281 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitCallExpr()
6290 return Success(EvaluateBuiltinConstantP(Info.Ctx, E->getArg(0)), E); in VisitCallExpr()
6297 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitCallExpr()
6306 int Operand = E->getArg(0)->EvaluateKnownConstInt(Info.Ctx).getZExtValue(); in VisitCallExpr()
6307 Operand = Info.Ctx.getTargetInfo().getEHDataRegisterNumber(Operand); in VisitCallExpr()
6318 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitCallExpr()
6327 if (!EvaluateFloat(E->getArg(5), Val, Info)) in VisitCallExpr()
6341 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitCallExpr()
6347 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitCallExpr()
6353 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitCallExpr()
6359 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitCallExpr()
6365 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitCallExpr()
6373 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitCallExpr()
6383 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitCallExpr()
6391 if (Info.getLangOpts().CPlusPlus11) in VisitCallExpr()
6392 Info.CCEDiag(E, diag::note_constexpr_invalid_function) in VisitCallExpr()
6395 Info.CCEDiag(E, diag::note_invalid_subexpr_in_const_expr); in VisitCallExpr()
6401 if (!EvaluatePointer(E->getArg(0), String, Info)) in VisitCallExpr()
6429 if (!handleLValueToRValueConversion(Info, E, CharTy, String, Char) || in VisitCallExpr()
6434 if (!HandleLValueArrayAdjustment(Info, E, String, CharTy, 1)) in VisitCallExpr()
6443 if (!EvaluateInteger(E->getArg(0), SizeVal, Info)) in VisitCallExpr()
6460 Info.Ctx.getTargetInfo().getMaxAtomicInlineWidth(); in VisitCallExpr()
6461 if (Size <= Info.Ctx.toCharUnitsFromBits(InlineWidthBits)) { in VisitCallExpr()
6464 E->getArg(1)->isNullPointerConstant(Info.Ctx, in VisitCallExpr()
6473 Info.Ctx.getTypeAlignInChars(PointeeType) >= Size) { in VisitCallExpr()
6554 void startSpeculativeEval(EvalInfo &Info) { in startSpeculativeEval()
6555 OldEvalStatus = Info.EvalStatus; in startSpeculativeEval()
6556 Info.EvalStatus.Diag = nullptr; in startSpeculativeEval()
6557 StoredInfo = &Info; in startSpeculativeEval()
6572 EvalInfo &Info; member in __anon0751fa451311::DataRecursiveIntBinOpEvaluator
6577 : IntEval(IntEval), Info(IntEval.getEvalInfo()), FinalResult(Result) { } in DataRecursiveIntBinOpEvaluator()
6617 return Info.CCEDiag(E, D); in CCEDiag()
6628 Result.Failed = !Evaluate(Result.Val, Info, E); in EvaluateExpr()
6651 return Info.noteSideEffect(); in VisitBinOpLHSOnly()
6669 if (!Info.noteSideEffect()) in VisitBinOpLHSOnly()
6684 if (LHSResult.Failed && !Info.keepEvaluatingAfterFailure()) in VisitBinOpLHSOnly()
6782 APSInt Value(Info.Ctx.getIntWidth(E->getType()), in VisitBinOp()
6784 if (!handleIntIntBinOp(Info, E, LHSVal.getInt(), E->getOpcode(), in VisitBinOp()
6816 job.startSpeculativeEval(Info); in process()
6850 LHSOK = EvaluateFloat(E->getLHS(), LHS.FloatReal, Info); in VisitBinaryOperator()
6856 LHSOK = EvaluateComplex(E->getLHS(), LHS, Info); in VisitBinaryOperator()
6858 if (!LHSOK && !Info.keepEvaluatingAfterFailure()) in VisitBinaryOperator()
6862 if (!EvaluateFloat(E->getRHS(), RHS.FloatReal, Info) || !LHSOK) in VisitBinaryOperator()
6866 } else if (!EvaluateComplex(E->getRHS(), RHS, Info) || !LHSOK) in VisitBinaryOperator()
6905 bool LHSOK = EvaluateFloat(E->getRHS(), RHS, Info); in VisitBinaryOperator()
6906 if (!LHSOK && !Info.keepEvaluatingAfterFailure()) in VisitBinaryOperator()
6909 if (!EvaluateFloat(E->getLHS(), LHS, Info) || !LHSOK) in VisitBinaryOperator()
6939 bool LHSOK = EvaluatePointer(E->getLHS(), LHSValue, Info); in VisitBinaryOperator()
6940 if (!LHSOK && Info.keepEvaluatingAfterFailure()) in VisitBinaryOperator()
6943 if (!EvaluatePointer(E->getRHS(), RHSValue, Info) || !LHSOK) in VisitBinaryOperator()
6992 isOnePastTheEndOfCompleteObject(Info.Ctx, RHSValue)) || in VisitBinaryOperator()
6994 isOnePastTheEndOfCompleteObject(Info.Ctx, LHSValue))) in VisitBinaryOperator()
7028 if (!HandleSizeof(Info, E->getExprLoc(), ElementType, ElementSize)) in VisitBinaryOperator()
7035 Info.Diag(E, diag::note_constexpr_pointer_subtraction_zero_size) in VisitBinaryOperator()
7055 APSInt Result = TrueResult.trunc(Info.Ctx.getIntWidth(E->getType())); in VisitBinaryOperator()
7058 HandleOverflow(Info, E, TrueResult, E->getType()); in VisitBinaryOperator()
7117 unsigned PtrSize = Info.Ctx.getTypeSize(LHSTy); in VisitBinaryOperator()
7132 CharUnits Size = Info.Ctx.getTypeSizeInChars(BaseTy); in VisitBinaryOperator()
7156 bool LHSOK = EvaluateMemberPointer(E->getLHS(), LHSValue, Info); in VisitBinaryOperator()
7157 if (!LHSOK && Info.keepEvaluatingAfterFailure()) in VisitBinaryOperator()
7160 if (!EvaluateMemberPointer(E->getRHS(), RHSValue, Info) || !LHSOK) in VisitBinaryOperator()
7212 return Success(GetAlignOfType(Info, E->getArgumentType()), E); in VisitUnaryExprOrTypeTraitExpr()
7214 return Success(GetAlignOfExpr(Info, E->getArgumentExpr()), E); in VisitUnaryExprOrTypeTraitExpr()
7241 if (!HandleSizeof(Info, E->getExprLoc(), SrcTy, Sizeof)) in VisitUnaryExprOrTypeTraitExpr()
7262 if (!EvaluateInteger(Idx, IdxResult, Info)) in VisitOffsetOfExpr()
7264 const ArrayType *AT = Info.Ctx.getAsArrayType(CurrentType); in VisitOffsetOfExpr()
7268 CharUnits ElementSize = Info.Ctx.getTypeSizeInChars(CurrentType); in VisitOffsetOfExpr()
7280 const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD); in VisitOffsetOfExpr()
7283 Result += Info.Ctx.toCharUnitsFromBits(RL.getFieldOffset(i)); in VisitOffsetOfExpr()
7302 const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD); in VisitOffsetOfExpr()
7338 HandleOverflow(Info, E, -Value.extend(Value.getBitWidth() + 1), in VisitUnaryOperator()
7350 if (!EvaluateAsBooleanCondition(E->getSubExpr(), bres, Info)) in VisitUnaryOperator()
7423 if (!EvaluateAsBooleanCondition(SubExpr, BoolResult, Info)) in VisitCastExpr()
7439 return Info.Ctx.getTypeSize(DestType) <= Info.Ctx.getTypeSize(SrcType); in VisitCastExpr()
7441 return Info.Ctx.getTypeSize(DestType) == Info.Ctx.getTypeSize(SrcType); in VisitCastExpr()
7444 return Success(HandleIntToIntCast(Info, E, DestType, SrcType, in VisitCastExpr()
7452 if (!EvaluatePointer(SubExpr, LV, Info)) in VisitCastExpr()
7460 if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(SrcType)) in VisitCastExpr()
7468 APSInt AsInt = Info.Ctx.MakeIntValue(LV.getLValueOffset().getQuantity(), in VisitCastExpr()
7470 return Success(HandleIntToIntCast(Info, E, DestType, SrcType, AsInt), E); in VisitCastExpr()
7475 if (!EvaluateComplex(SubExpr, C, Info)) in VisitCastExpr()
7482 if (!EvaluateFloat(SubExpr, F, Info)) in VisitCastExpr()
7486 if (!HandleFloatToIntCast(Info, E, SrcType, F, DestType, Value)) in VisitCastExpr()
7498 if (!EvaluateComplex(E->getSubExpr(), LV, Info)) in VisitUnaryReal()
7511 if (!EvaluateComplex(E->getSubExpr(), LV, Info)) in VisitUnaryImag()
7548 Result = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(E->getType())); in ZeroInitialization()
7566 static bool EvaluateFloat(const Expr* E, APFloat& Result, EvalInfo &Info) { in EvaluateFloat() argument
7568 return FloatExprEvaluator(Info, Result).Visit(E); in EvaluateFloat()
7608 Info.Ctx.getFloatTypeSemantics(E->getType()); in VisitCallExpr()
7616 if (!TryEvaluateBuiltinNaN(Info.Ctx, E->getType(), E->getArg(0), in VisitCallExpr()
7626 if (!TryEvaluateBuiltinNaN(Info.Ctx, E->getType(), E->getArg(0), in VisitCallExpr()
7634 if (!EvaluateFloat(E->getArg(0), Result, Info)) in VisitCallExpr()
7649 if (!EvaluateFloat(E->getArg(0), Result, Info) || in VisitCallExpr()
7650 !EvaluateFloat(E->getArg(1), RHS, Info)) in VisitCallExpr()
7661 if (!EvaluateComplex(E->getSubExpr(), CV, Info)) in VisitUnaryReal()
7673 if (!EvaluateComplex(E->getSubExpr(), CV, Info)) in VisitUnaryImag()
7680 const llvm::fltSemantics &Sem = Info.Ctx.getFloatTypeSemantics(E->getType()); in VisitUnaryImag()
7689 return EvaluateFloat(E->getSubExpr(), Result, Info); in VisitUnaryOperator()
7691 if (!EvaluateFloat(E->getSubExpr(), Result, Info)) in VisitUnaryOperator()
7703 bool LHSOK = EvaluateFloat(E->getLHS(), Result, Info); in VisitBinaryOperator()
7704 if (!LHSOK && !Info.keepEvaluatingAfterFailure()) in VisitBinaryOperator()
7706 return EvaluateFloat(E->getRHS(), RHS, Info) && LHSOK && in VisitBinaryOperator()
7707 handleFloatFloatBinOp(Info, E, Result, E->getOpcode(), RHS); in VisitBinaryOperator()
7724 return EvaluateInteger(SubExpr, IntResult, Info) && in VisitCastExpr()
7725 HandleIntToFloatCast(Info, E, SubExpr->getType(), IntResult, in VisitCastExpr()
7732 return HandleFloatToFloatCast(Info, E, SubExpr->getType(), E->getType(), in VisitCastExpr()
7738 if (!EvaluateComplex(SubExpr, V, Info)) in VisitCastExpr()
7779 EvalInfo &Info) { in EvaluateComplex() argument
7781 return ComplexExprEvaluator(Info, Result).Visit(E); in EvaluateComplex()
7788 APFloat Zero = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(ElemTy)); in ZeroInitialization()
7793 APSInt Zero = Info.Ctx.MakeIntValue(0, ElemTy); in ZeroInitialization()
7806 if (!EvaluateFloat(SubExpr, Imag, Info)) in VisitImaginaryLiteral()
7817 if (!EvaluateInteger(SubExpr, Imag, Info)) in VisitImaginaryLiteral()
7885 if (!EvaluateFloat(E->getSubExpr(), Real, Info)) in VisitCastExpr()
7901 return HandleFloatToFloatCast(Info, E, From, To, Result.FloatReal) && in VisitCastExpr()
7902 HandleFloatToFloatCast(Info, E, From, To, Result.FloatImag); in VisitCastExpr()
7913 return HandleFloatToIntCast(Info, E, From, Result.FloatReal, in VisitCastExpr()
7915 HandleFloatToIntCast(Info, E, From, Result.FloatImag, in VisitCastExpr()
7921 if (!EvaluateInteger(E->getSubExpr(), Real, Info)) in VisitCastExpr()
7937 Result.IntReal = HandleIntToIntCast(Info, E, To, From, Result.IntReal); in VisitCastExpr()
7938 Result.IntImag = HandleIntToIntCast(Info, E, To, From, Result.IntImag); in VisitCastExpr()
7950 return HandleIntToFloatCast(Info, E, From, Result.IntReal, in VisitCastExpr()
7952 HandleIntToFloatCast(Info, E, From, Result.IntImag, in VisitCastExpr()
7972 LHSOK = EvaluateFloat(E->getLHS(), Real, Info); in VisitBinaryOperator()
7980 if (!LHSOK && !Info.keepEvaluatingAfterFailure()) in VisitBinaryOperator()
7987 if (!EvaluateFloat(E->getRHS(), Real, Info) || !LHSOK) in VisitBinaryOperator()
7991 } else if (!EvaluateComplex(E->getRHS(), RHS, Info) || !LHSOK) in VisitBinaryOperator()
8218 if (!EvaluateFloat(E->getInit(0), Result.FloatReal, Info)) in VisitInitListExpr()
8220 if (!EvaluateFloat(E->getInit(1), Result.FloatImag, Info)) in VisitInitListExpr()
8224 if (!EvaluateInteger(E->getInit(0), Result.IntReal, Info)) in VisitInitListExpr()
8226 if (!EvaluateInteger(E->getInit(1), Result.IntImag, Info)) in VisitInitListExpr()
8244 AtomicExprEvaluator(EvalInfo &Info, APValue &Result) in AtomicExprEvaluator() argument
8245 : ExprEvaluatorBaseTy(Info), Result(Result) {} in AtomicExprEvaluator()
8255 return Evaluate(Result, Info, &VIE); in ZeroInitialization()
8263 return Evaluate(Result, Info, E->getSubExpr()); in VisitCastExpr()
8269 static bool EvaluateAtomic(const Expr *E, APValue &Result, EvalInfo &Info) { in EvaluateAtomic() argument
8271 return AtomicExprEvaluator(Info, Result).Visit(E); in EvaluateAtomic()
8283 VoidExprEvaluator(EvalInfo &Info) : ExprEvaluatorBaseTy(Info) {} in VoidExprEvaluator() argument
8310 static bool EvaluateVoid(const Expr *E, EvalInfo &Info) { in EvaluateVoid() argument
8312 return VoidExprEvaluator(Info).Visit(E); in EvaluateVoid()
8319 static bool Evaluate(APValue &Result, EvalInfo &Info, const Expr *E) { in Evaluate() argument
8325 if (!EvaluateLValue(E, LV, Info)) in Evaluate()
8329 if (!EvaluateVector(E, Result, Info)) in Evaluate()
8332 if (!IntExprEvaluator(Info, Result).Visit(E)) in Evaluate()
8336 if (!EvaluatePointer(E, LV, Info)) in Evaluate()
8341 if (!EvaluateFloat(E, F, Info)) in Evaluate()
8346 if (!EvaluateComplex(E, C, Info)) in Evaluate()
8351 if (!EvaluateMemberPointer(E, P, Info)) in Evaluate()
8357 LV.set(E, Info.CurrentCall->Index); in Evaluate()
8358 APValue &Value = Info.CurrentCall->createTemporary(E, false); in Evaluate()
8359 if (!EvaluateArray(E, LV, Value, Info)) in Evaluate()
8364 LV.set(E, Info.CurrentCall->Index); in Evaluate()
8365 APValue &Value = Info.CurrentCall->createTemporary(E, false); in Evaluate()
8366 if (!EvaluateRecord(E, LV, Value, Info)) in Evaluate()
8370 if (!Info.getLangOpts().CPlusPlus11) in Evaluate()
8371 Info.CCEDiag(E, diag::note_constexpr_nonliteral) in Evaluate()
8373 if (!EvaluateVoid(E, Info)) in Evaluate()
8376 if (!EvaluateAtomic(E, Result, Info)) in Evaluate()
8378 } else if (Info.getLangOpts().CPlusPlus11) { in Evaluate()
8379 Info.Diag(E, diag::note_constexpr_nonliteral) << E->getType(); in Evaluate()
8382 Info.Diag(E, diag::note_invalid_subexpr_in_const_expr); in Evaluate()
8392 static bool EvaluateInPlace(APValue &Result, EvalInfo &Info, const LValue &This, in EvaluateInPlace() argument
8396 if (!AllowNonLiteralTypes && !CheckLiteralType(Info, E, &This)) in EvaluateInPlace()
8403 return EvaluateArray(E, This, Result, Info); in EvaluateInPlace()
8405 return EvaluateRecord(E, This, Result, Info); in EvaluateInPlace()
8409 return Evaluate(Result, Info, E); in EvaluateInPlace()
8414 static bool EvaluateAsRValue(EvalInfo &Info, const Expr *E, APValue &Result) { in EvaluateAsRValue() argument
8418 if (!CheckLiteralType(Info, E)) in EvaluateAsRValue()
8421 if (!::Evaluate(Result, Info, E)) in EvaluateAsRValue()
8426 LV.setFrom(Info.Ctx, Result); in EvaluateAsRValue()
8427 if (!handleLValueToRValueConversion(Info, E, E->getType(), LV, Result)) in EvaluateAsRValue()
8432 return CheckConstantExpression(Info, E->getExprLoc(), E->getType(), Result); in EvaluateAsRValue()
8475 EvalInfo Info(Ctx, Result, EvalInfo::EM_IgnoreSideEffects); in EvaluateAsRValue() local
8476 return ::EvaluateAsRValue(Info, this, Result.Val); in EvaluateAsRValue()
8501 EvalInfo Info(Ctx, Result, EvalInfo::EM_ConstantFold); in EvaluateAsLValue() local
8504 if (!EvaluateLValue(this, LV, Info) || Result.HasSideEffects || in EvaluateAsLValue()
8505 !CheckLValueConstantExpression(Info, getExprLoc(), in EvaluateAsLValue()
8575 EvalInfo Info(Ctx, EvalResult, EvalInfo::EM_EvaluateForOverflow); in EvaluateForOverflow() local
8576 (void)::EvaluateAsRValue(Info, this, EvalResult.Val); in EvaluateForOverflow()
9069 EvalInfo Info(Ctx, Status, EvalInfo::EM_ConstantExpression); in isCXX11ConstantExpr() local
9072 bool IsConstExpr = ::EvaluateAsRValue(Info, this, Result ? *Result : Scratch); in isCXX11ConstantExpr()
9089 EvalInfo Info(Ctx, Status, EvalInfo::EM_ConstantExpressionUnevaluated); in EvaluateWithSubstitution() local
9095 !Evaluate(ArgValues[I - Args.begin()], Info, *I)) in EvaluateWithSubstitution()
9098 if (Info.EvalStatus.HasSideEffects) in EvaluateWithSubstitution()
9103 CallStackFrame Frame(Info, Callee->getLocation(), Callee, /*This*/nullptr, in EvaluateWithSubstitution()
9105 return Evaluate(Value, Info, this) && !Info.EvalStatus.HasSideEffects; in EvaluateWithSubstitution()
9120 EvalInfo Info(FD->getASTContext(), Status, in isPotentialConstantExpr() local
9129 ImplicitValueInitExpr VIE(RD ? Info.Ctx.getRecordType(RD) : Info.Ctx.IntTy); in isPotentialConstantExpr()
9130 This.set(&VIE, Info.CurrentCall->Index); in isPotentialConstantExpr()
9140 Info.setEvaluatingDecl(This.getLValueBase(), Scratch); in isPotentialConstantExpr()
9141 HandleConstructorCall(Loc, This, Args, CD, Info, Scratch); in isPotentialConstantExpr()
9144 Args, FD->getBody(), Info, Scratch); in isPotentialConstantExpr()
9156 EvalInfo Info(FD->getASTContext(), Status, in isPotentialConstantExprUnevaluated() local
9162 bool Success = EvaluateArgs(Args, ArgValues, Info); in isPotentialConstantExprUnevaluated()
9166 CallStackFrame Frame(Info, SourceLocation(), FD, nullptr, ArgValues.data()); in isPotentialConstantExprUnevaluated()
9169 Evaluate(ResultScratch, Info, E); in isPotentialConstantExprUnevaluated()