Lines Matching refs:Info

388     bool checkSubobject(EvalInfo &Info, const Expr *E, CheckSubobjectKind CSK);
445 void diagnoseUnsizedArrayPointerArithmetic(EvalInfo &Info, const Expr *E);
446 void diagnosePointerArithmetic(EvalInfo &Info, const Expr *E,
449 void adjustIndex(EvalInfo &Info, const Expr *E, APSInt N) { in adjustIndex()
453 diagnoseUnsizedArrayPointerArithmetic(Info, E); in adjustIndex()
478 diagnosePointerArithmetic(Info, E, N); in adjustIndex()
530 EvalInfo &Info; member in __anonfb577fba0111::CallStackFrame
595 CallStackFrame(EvalInfo &Info, SourceRange CallRange,
701 static bool HandleDestruction(EvalInfo &Info, const Expr *E,
703 static bool HandleDestruction(EvalInfo &Info, SourceLocation Loc,
724 bool endLifetime(EvalInfo &Info, bool RunDestructors) { in endLifetime() argument
731 return HandleDestruction(Info, Loc, Base, *Value.getPointer(), T); in endLifetime()
1297 EvalInfo &Info; member in __anonfb577fba0411::EvalInfo::ArrayInitLoopIndex
1301 ArrayInitLoopIndex(EvalInfo &Info) in ArrayInitLoopIndex() argument
1302 : Info(Info), OuterIndex(Info.ArrayInitIndex) { in ArrayInitLoopIndex()
1303 Info.ArrayInitIndex = 0; in ArrayInitLoopIndex()
1305 ~ArrayInitLoopIndex() { Info.ArrayInitIndex = OuterIndex; } in ~ArrayInitLoopIndex()
1307 operator uint64_t&() { return Info.ArrayInitIndex; } in operator uint64_t&()
1313 EvalInfo &Info; member
1318 explicit FoldConstant(EvalInfo &Info, bool Enabled) in FoldConstant()
1319 : Info(Info), in FoldConstant()
1321 HadNoPriorDiags(Info.EvalStatus.Diag && in FoldConstant()
1322 Info.EvalStatus.Diag->empty() && in FoldConstant()
1323 !Info.EvalStatus.HasSideEffects), in FoldConstant()
1324 OldMode(Info.EvalMode) { in FoldConstant()
1326 Info.EvalMode = EvalInfo::EM_ConstantFold; in FoldConstant()
1330 if (Enabled && HadNoPriorDiags && !Info.EvalStatus.Diag->empty() && in ~FoldConstant()
1331 !Info.EvalStatus.HasSideEffects) in ~FoldConstant()
1332 Info.EvalStatus.Diag->clear(); in ~FoldConstant()
1333 Info.EvalMode = OldMode; in ~FoldConstant()
1340 EvalInfo &Info; member
1342 explicit IgnoreSideEffectsRAII(EvalInfo &Info) in IgnoreSideEffectsRAII()
1343 : Info(Info), OldMode(Info.EvalMode) { in IgnoreSideEffectsRAII()
1344 Info.EvalMode = EvalInfo::EM_IgnoreSideEffects; in IgnoreSideEffectsRAII()
1347 ~IgnoreSideEffectsRAII() { Info.EvalMode = OldMode; } in ~IgnoreSideEffectsRAII()
1353 EvalInfo *Info = nullptr; member in __anonfb577fba0411::SpeculativeEvaluationRAII
1358 Info = Other.Info; in moveFromAndCancel()
1361 Other.Info = nullptr; in moveFromAndCancel()
1365 if (!Info) in maybeRestoreState()
1368 Info->EvalStatus = OldStatus; in maybeRestoreState()
1369 Info->SpeculativeEvaluationDepth = OldSpeculativeEvaluationDepth; in maybeRestoreState()
1376 EvalInfo &Info, SmallVectorImpl<PartialDiagnosticAt> *NewDiag = nullptr) in SpeculativeEvaluationRAII() argument
1377 : Info(&Info), OldStatus(Info.EvalStatus), in SpeculativeEvaluationRAII()
1378 OldSpeculativeEvaluationDepth(Info.SpeculativeEvaluationDepth) { in SpeculativeEvaluationRAII()
1379 Info.EvalStatus.Diag = NewDiag; in SpeculativeEvaluationRAII()
1380 Info.SpeculativeEvaluationDepth = Info.CallStackDepth + 1; in SpeculativeEvaluationRAII()
1401 EvalInfo &Info; member in __anonfb577fba0411::ScopeRAII
1404 ScopeRAII(EvalInfo &Info) in ScopeRAII() argument
1405 : Info(Info), OldStackSize(Info.CleanupStack.size()) { in ScopeRAII()
1408 Info.CurrentCall->pushTempVersion(); in ScopeRAII()
1411 bool OK = cleanup(Info, RunDestructors, OldStackSize); in destroy()
1420 Info.CurrentCall->popTempVersion(); in ~ScopeRAII()
1423 static bool cleanup(EvalInfo &Info, bool RunDestructors, in cleanup() argument
1425 assert(OldStackSize <= Info.CleanupStack.size() && in cleanup()
1431 for (unsigned I = Info.CleanupStack.size(); I > OldStackSize; --I) { in cleanup()
1432 if (Info.CleanupStack[I - 1].isDestroyedAtEndOf(Kind)) { in cleanup()
1433 if (!Info.CleanupStack[I - 1].endLifetime(Info, RunDestructors)) { in cleanup()
1441 auto NewEnd = Info.CleanupStack.begin() + OldStackSize; in cleanup()
1444 std::remove_if(NewEnd, Info.CleanupStack.end(), [](Cleanup &C) { in cleanup()
1447 Info.CleanupStack.erase(NewEnd, Info.CleanupStack.end()); in cleanup()
1456 bool SubobjectDesignator::checkSubobject(EvalInfo &Info, const Expr *E, in checkSubobject() argument
1461 Info.CCEDiag(E, diag::note_constexpr_past_end_subobject) in checkSubobject()
1472 void SubobjectDesignator::diagnoseUnsizedArrayPointerArithmetic(EvalInfo &Info, in diagnoseUnsizedArrayPointerArithmetic() argument
1474 Info.CCEDiag(E, diag::note_constexpr_unsized_array_indexed); in diagnoseUnsizedArrayPointerArithmetic()
1479 void SubobjectDesignator::diagnosePointerArithmetic(EvalInfo &Info, in diagnosePointerArithmetic() argument
1485 Info.CCEDiag(E, diag::note_constexpr_array_index) in diagnosePointerArithmetic()
1489 Info.CCEDiag(E, diag::note_constexpr_array_index) in diagnosePointerArithmetic()
1494 CallStackFrame::CallStackFrame(EvalInfo &Info, SourceRange CallRange, in CallStackFrame() argument
1497 : Info(Info), Caller(Info.CurrentCall), Callee(Callee), This(This), in CallStackFrame()
1499 Index(Info.NextCallIndex++) { in CallStackFrame()
1500 Info.CurrentCall = this; in CallStackFrame()
1501 ++Info.CallStackDepth; in CallStackFrame()
1505 assert(Info.CurrentCall == this && "calls retired out of order"); in ~CallStackFrame()
1506 --Info.CallStackDepth; in ~CallStackFrame()
1507 Info.CurrentCall = Caller; in ~CallStackFrame()
1694 bool checkNullPointer(EvalInfo &Info, const Expr *E, in checkNullPointer()
1696 return checkNullPointerDiagnosingWith([&Info, E, CSK] { in checkNullPointer()
1697 Info.CCEDiag(E, diag::note_constexpr_null_subobject) << CSK; in checkNullPointer()
1701 bool checkNullPointerForFoldAccess(EvalInfo &Info, const Expr *E, in checkNullPointerForFoldAccess()
1703 return checkNullPointerDiagnosingWith([&Info, E, AK] { in checkNullPointerForFoldAccess()
1704 Info.FFDiag(E, diag::note_constexpr_access_null) << AK; in checkNullPointerForFoldAccess()
1710 bool checkSubobject(EvalInfo &Info, const Expr *E, CheckSubobjectKind CSK) { in checkSubobject()
1711 return (CSK == CSK_ArrayToPointer || checkNullPointer(Info, E, CSK)) && in checkSubobject()
1712 Designator.checkSubobject(Info, E, CSK); in checkSubobject()
1715 void addDecl(EvalInfo &Info, const Expr *E, in addDecl()
1717 if (checkSubobject(Info, E, isa<FieldDecl>(D) ? CSK_Field : CSK_Base)) in addDecl()
1720 void addUnsizedArray(EvalInfo &Info, const Expr *E, QualType ElemTy) { in addUnsizedArray()
1722 Info.CCEDiag(E, diag::note_constexpr_unsupported_unsized_array); in addUnsizedArray()
1726 if (checkSubobject(Info, E, CSK_ArrayToPointer)) { in addUnsizedArray()
1732 void addArray(EvalInfo &Info, const Expr *E, const ConstantArrayType *CAT) { in addArray()
1733 if (checkSubobject(Info, E, CSK_ArrayToPointer)) in addArray()
1736 void addComplex(EvalInfo &Info, const Expr *E, QualType EltTy, bool Imag) { in addComplex()
1737 if (checkSubobject(Info, E, Imag ? CSK_Imag : CSK_Real)) in addComplex()
1743 void adjustOffsetAndIndex(EvalInfo &Info, const Expr *E, in adjustOffsetAndIndex()
1758 if (checkNullPointer(Info, E, CSK_ArrayIndex)) in adjustOffsetAndIndex()
1759 Designator.adjustIndex(Info, E, Index); in adjustOffsetAndIndex()
1868 static bool Evaluate(APValue &Result, EvalInfo &Info, const Expr *E);
1869 static bool EvaluateInPlace(APValue &Result, EvalInfo &Info,
1872 static bool EvaluateLValue(const Expr *E, LValue &Result, EvalInfo &Info,
1874 static bool EvaluatePointer(const Expr *E, LValue &Result, EvalInfo &Info,
1877 EvalInfo &Info);
1878 static bool EvaluateTemporary(const Expr *E, LValue &Result, EvalInfo &Info);
1879 static bool EvaluateInteger(const Expr *E, APSInt &Result, EvalInfo &Info);
1881 EvalInfo &Info);
1882 static bool EvaluateFloat(const Expr *E, APFloat &Result, EvalInfo &Info);
1883 static bool EvaluateComplex(const Expr *E, ComplexValue &Res, EvalInfo &Info);
1885 EvalInfo &Info);
1886 static bool EvaluateAsRValue(EvalInfo &Info, const Expr *E, APValue &Result);
1888 EvalInfo &Info,
1893 EvalInfo &Info);
1897 EvalInfo &Info);
1945 if (Index <= Info.SpeculativeEvaluationDepth) { in createLocal()
1947 Info.noteSideEffect(); in createLocal()
1949 Info.CleanupStack.push_back(Cleanup(&Result, Base, T, Scope)); in createLocal()
1977 Callee->getNameForDiagnostic(Out, Info.Ctx.getPrintingPolicy(), in describe()
1983 Object->printPretty(Out, /*Helper=*/nullptr, Info.Ctx.getPrintingPolicy(), in describe()
1992 Info.Ctx.getPrintingPolicy(), in describe()
1999 Out, Info.Ctx, in describe()
2000 Info.Ctx.getLValueReferenceType(This->Designator.MostDerivedType)); in describe()
2003 Callee->getNameForDiagnostic(Out, Info.Ctx.getPrintingPolicy(), in describe()
2016 APValue *V = Info.getParamSlot(Arguments, Param); in describe()
2018 V->printPretty(Out, Info.Ctx, Param->getType()); in describe()
2032 static bool EvaluateIgnoredValue(EvalInfo &Info, const Expr *E) { in EvaluateIgnoredValue() argument
2035 if (!Evaluate(Scratch, Info, E)) in EvaluateIgnoredValue()
2037 return Info.noteSideEffect(); in EvaluateIgnoredValue()
2159 static void NoteLValueLocation(EvalInfo &Info, APValue::LValueBase Base) { in NoteLValueLocation() argument
2168 for (CallStackFrame *F = Info.CurrentCall; F; F = F->Caller) { in NoteLValueLocation()
2179 Info.Note(VD->getLocation(), diag::note_declared_at); in NoteLValueLocation()
2181 Info.Note(E->getExprLoc(), diag::note_constexpr_temporary_here); in NoteLValueLocation()
2184 if (std::optional<DynAlloc *> Alloc = Info.lookupDynamicAlloc(DA)) in NoteLValueLocation()
2185 Info.Note((*Alloc)->AllocExpr->getExprLoc(), in NoteLValueLocation()
2203 EvalInfo &Info, SourceLocation DiagLoc,
2212 static bool CheckLValueConstantExpression(EvalInfo &Info, SourceLocation Loc, in CheckLValueConstantExpression() argument
2243 Info.FFDiag(Loc, diag::note_constexpr_invalid_template_arg) in CheckLValueConstantExpression()
2252 Info.FFDiag(Loc, diag::note_consteval_address_accessible) in CheckLValueConstantExpression()
2254 Info.Note(FD->getLocation(), diag::note_declared_at); in CheckLValueConstantExpression()
2262 if (Info.getLangOpts().CPlusPlus11) { in CheckLValueConstantExpression()
2263 Info.FFDiag(Loc, diag::note_constexpr_non_global, 1) in CheckLValueConstantExpression()
2273 Info.Note(VarD->getLocation(), diag::note_constexpr_not_static) in CheckLValueConstantExpression()
2277 NoteLValueLocation(Info, Base); in CheckLValueConstantExpression()
2280 Info.FFDiag(Loc); in CheckLValueConstantExpression()
2285 assert((Info.checkingPotentialConstantExpression() || in CheckLValueConstantExpression()
2290 Info.FFDiag(Loc, diag::note_constexpr_dynamic_alloc) in CheckLValueConstantExpression()
2292 NoteLValueLocation(Info, Base); in CheckLValueConstantExpression()
2311 if (Info.getCtx().getLangOpts().CUDA && in CheckLValueConstantExpression()
2312 Info.getCtx().getLangOpts().CUDAIsDevice && in CheckLValueConstantExpression()
2313 Info.getCtx().CUDAConstantEvalCtx.NoWrongSidedVars) { in CheckLValueConstantExpression()
2333 if (Info.getLangOpts().CPlusPlus && !isForManglingOnly(Kind) && in CheckLValueConstantExpression()
2343 Info.FFDiag(MTE->getExprLoc(), in CheckLValueConstantExpression()
2352 Info, MTE->getExprLoc(), TempType, *V, Kind, in CheckLValueConstantExpression()
2366 Info.CCEDiag(Loc); in CheckLValueConstantExpression()
2372 Info.FFDiag(Loc, diag::note_constexpr_past_end, 1) in CheckLValueConstantExpression()
2374 NoteLValueLocation(Info, Base); in CheckLValueConstantExpression()
2382 static bool CheckMemberPointerConstantExpression(EvalInfo &Info, in CheckMemberPointerConstantExpression() argument
2392 Info.FFDiag(Loc, diag::note_consteval_address_accessible) << /*pointer*/ 0; in CheckMemberPointerConstantExpression()
2393 Info.Note(FD->getLocation(), diag::note_declared_at); in CheckMemberPointerConstantExpression()
2402 static bool CheckLiteralType(EvalInfo &Info, const Expr *E, in CheckLiteralType() argument
2404 if (!E->isPRValue() || E->getType()->isLiteralType(Info.Ctx)) in CheckLiteralType()
2420 if (This && Info.EvaluatingDecl == This->getLValueBase()) in CheckLiteralType()
2424 if (Info.getLangOpts().CPlusPlus11) in CheckLiteralType()
2425 Info.FFDiag(E, diag::note_constexpr_nonliteral) in CheckLiteralType()
2428 Info.FFDiag(E, diag::note_invalid_subexpr_in_const_expr); in CheckLiteralType()
2433 EvalInfo &Info, SourceLocation DiagLoc, in CheckEvaluationResult() argument
2440 Info.FFDiag(DiagLoc, diag::note_constexpr_uninitialized) in CheckEvaluationResult()
2442 Info.Note(SubobjectDecl->getLocation(), in CheckEvaluationResult()
2445 Info.FFDiag(DiagLoc, diag::note_constexpr_uninitialized) in CheckEvaluationResult()
2462 if (!CheckEvaluationResult(CERK, Info, DiagLoc, EltTy, in CheckEvaluationResult()
2469 return CheckEvaluationResult(CERK, Info, DiagLoc, EltTy, in CheckEvaluationResult()
2475 CERK, Info, DiagLoc, Value.getUnionField()->getType(), in CheckEvaluationResult()
2486 Info.FFDiag(TypeBeginLoc, diag::note_constexpr_uninitialized_base) in CheckEvaluationResult()
2490 if (!CheckEvaluationResult(CERK, Info, DiagLoc, BS.getType(), BaseValue, in CheckEvaluationResult()
2501 if (!CheckEvaluationResult(CERK, Info, DiagLoc, I->getType(), in CheckEvaluationResult()
2511 LVal.setFrom(Info.Ctx, Value); in CheckEvaluationResult()
2512 return CheckLValueConstantExpression(Info, DiagLoc, Type, LVal, Kind, in CheckEvaluationResult()
2518 return CheckMemberPointerConstantExpression(Info, DiagLoc, Type, Value, Kind); in CheckEvaluationResult()
2527 static bool CheckConstantExpression(EvalInfo &Info, SourceLocation DiagLoc, in CheckConstantExpression() argument
2536 Info, DiagLoc, Type, Value, Kind, in CheckConstantExpression()
2542 static bool CheckFullyInitialized(EvalInfo &Info, SourceLocation DiagLoc, in CheckFullyInitialized() argument
2546 CheckEvaluationResultKind::FullyInitialized, Info, DiagLoc, Type, Value, in CheckFullyInitialized()
2552 static bool CheckMemoryLeaks(EvalInfo &Info) { in CheckMemoryLeaks() argument
2553 if (!Info.HeapAllocs.empty()) { in CheckMemoryLeaks()
2557 Info.CCEDiag(Info.HeapAllocs.begin()->second.AllocExpr, in CheckMemoryLeaks()
2559 << unsigned(Info.HeapAllocs.size() - 1); in CheckMemoryLeaks()
2623 EvalInfo &Info) { in EvaluateAsBooleanCondition() argument
2627 if (!Evaluate(Val, Info, E)) in EvaluateAsBooleanCondition()
2633 static bool HandleOverflow(EvalInfo &Info, const Expr *E, in HandleOverflow() argument
2635 Info.CCEDiag(E, diag::note_constexpr_overflow) in HandleOverflow()
2637 return Info.noteUndefinedBehavior(); in HandleOverflow()
2640 static bool HandleFloatToIntCast(EvalInfo &Info, const Expr *E, in HandleFloatToIntCast() argument
2643 unsigned DestWidth = Info.Ctx.getIntWidth(DestType); in HandleFloatToIntCast()
2651 return HandleOverflow(Info, E, Value, DestType); in HandleFloatToIntCast()
2660 static llvm::RoundingMode getActiveRoundingMode(EvalInfo &Info, const Expr *E) { in getActiveRoundingMode() argument
2662 E->getFPFeaturesInEffect(Info.Ctx.getLangOpts()).getRoundingMode(); in getActiveRoundingMode()
2669 static bool checkFloatingPointResult(EvalInfo &Info, const Expr *E, in checkFloatingPointResult() argument
2673 if (Info.InConstantContext) in checkFloatingPointResult()
2676 FPOptions FPO = E->getFPFeaturesInEffect(Info.Ctx.getLangOpts()); in checkFloatingPointResult()
2681 Info.FFDiag(E, diag::note_constexpr_dynamic_rounding); in checkFloatingPointResult()
2689 Info.FFDiag(E, diag::note_constexpr_float_arithmetic_strict); in checkFloatingPointResult()
2696 Info.FFDiag(E); in checkFloatingPointResult()
2709 static bool HandleFloatToFloatCast(EvalInfo &Info, const Expr *E, in HandleFloatToFloatCast() argument
2717 llvm::RoundingMode RM = getActiveRoundingMode(Info, E); in HandleFloatToFloatCast()
2721 St = Result.convert(Info.Ctx.getFloatTypeSemantics(DestType), RM, &ignored); in HandleFloatToFloatCast()
2722 return checkFloatingPointResult(Info, E, St); in HandleFloatToFloatCast()
2725 static APSInt HandleIntToIntCast(EvalInfo &Info, const Expr *E, in HandleIntToIntCast() argument
2728 unsigned DestWidth = Info.Ctx.getIntWidth(DestType); in HandleIntToIntCast()
2738 static bool HandleIntToFloatCast(EvalInfo &Info, const Expr *E, in HandleIntToFloatCast() argument
2742 Result = APFloat(Info.Ctx.getFloatTypeSemantics(DestType), 1); in HandleIntToFloatCast()
2743 llvm::RoundingMode RM = getActiveRoundingMode(Info, E); in HandleIntToFloatCast()
2745 return checkFloatingPointResult(Info, E, St); in HandleIntToFloatCast()
2748 static bool truncateBitfieldValue(EvalInfo &Info, const Expr *E, in truncateBitfieldValue() argument
2757 Info.FFDiag(E); in truncateBitfieldValue()
2763 unsigned NewBitWidth = FD->getBitWidthValue(Info.Ctx); in truncateBitfieldValue()
2773 static bool CheckedIntArithmetic(EvalInfo &Info, const Expr *E, in CheckedIntArithmetic() argument
2785 if (Info.checkingForUndefinedBehavior()) in CheckedIntArithmetic()
2786 Info.Ctx.getDiagnostics().Report(E->getExprLoc(), in CheckedIntArithmetic()
2791 return HandleOverflow(Info, E, Value, E->getType()); in CheckedIntArithmetic()
2797 static bool handleIntIntBinOp(EvalInfo &Info, const BinaryOperator *E, in handleIntIntBinOp() argument
2803 Info.FFDiag(E); in handleIntIntBinOp()
2806 return CheckedIntArithmetic(Info, E, LHS, RHS, LHS.getBitWidth() * 2, in handleIntIntBinOp()
2809 return CheckedIntArithmetic(Info, E, LHS, RHS, LHS.getBitWidth() + 1, in handleIntIntBinOp()
2812 return CheckedIntArithmetic(Info, E, LHS, RHS, LHS.getBitWidth() + 1, in handleIntIntBinOp()
2820 Info.FFDiag(E, diag::note_expr_divide_by_zero) in handleIntIntBinOp()
2829 Info, E, -LHS.extend(LHS.getBitWidth() + 1), E->getType()); in handleIntIntBinOp()
2833 if (Info.getLangOpts().OpenCL) in handleIntIntBinOp()
2841 Info.CCEDiag(E, diag::note_constexpr_negative_shift) << RHS; in handleIntIntBinOp()
2842 if (!Info.noteUndefinedBehavior()) in handleIntIntBinOp()
2852 Info.CCEDiag(E, diag::note_constexpr_large_shift) in handleIntIntBinOp()
2854 if (!Info.noteUndefinedBehavior()) in handleIntIntBinOp()
2856 } else if (LHS.isSigned() && !Info.getLangOpts().CPlusPlus20) { in handleIntIntBinOp()
2862 Info.CCEDiag(E, diag::note_constexpr_lshift_of_negative) << LHS; in handleIntIntBinOp()
2863 if (!Info.noteUndefinedBehavior()) in handleIntIntBinOp()
2866 Info.CCEDiag(E, diag::note_constexpr_lshift_discards); in handleIntIntBinOp()
2867 if (!Info.noteUndefinedBehavior()) in handleIntIntBinOp()
2875 if (Info.getLangOpts().OpenCL) in handleIntIntBinOp()
2883 Info.CCEDiag(E, diag::note_constexpr_negative_shift) << RHS; in handleIntIntBinOp()
2884 if (!Info.noteUndefinedBehavior()) in handleIntIntBinOp()
2894 Info.CCEDiag(E, diag::note_constexpr_large_shift) in handleIntIntBinOp()
2896 if (!Info.noteUndefinedBehavior()) in handleIntIntBinOp()
2916 static bool handleFloatFloatBinOp(EvalInfo &Info, const BinaryOperator *E, in handleFloatFloatBinOp() argument
2919 llvm::RoundingMode RM = getActiveRoundingMode(Info, E); in handleFloatFloatBinOp()
2923 Info.FFDiag(E); in handleFloatFloatBinOp()
2938 Info.CCEDiag(E, diag::note_expr_divide_by_zero); in handleFloatFloatBinOp()
2948 Info.CCEDiag(E, diag::note_constexpr_float_arithmetic) << LHS.isNaN(); in handleFloatFloatBinOp()
2949 return Info.noteUndefinedBehavior(); in handleFloatFloatBinOp()
2952 return checkFloatingPointResult(Info, E, St); in handleFloatFloatBinOp()
3040 static bool handleVectorVectorBinOp(EvalInfo &Info, const BinaryOperator *E, in handleVectorVectorBinOp() argument
3057 Info.FFDiag(E); in handleVectorVectorBinOp()
3071 APSInt EltResult{Info.Ctx.getIntWidth(EltTy), in handleVectorVectorBinOp()
3080 Success = handleIntIntBinOp(Info, E, LHSElt.getInt(), Opcode, in handleVectorVectorBinOp()
3084 Info.FFDiag(E); in handleVectorVectorBinOp()
3095 if (!handleFloatFloatBinOp(Info, E, LHSFloat, Opcode, in handleVectorVectorBinOp()
3097 Info.FFDiag(E); in handleVectorVectorBinOp()
3111 static bool CastToDerivedClass(EvalInfo &Info, const Expr *E, LValue &Result, in CastToDerivedClass() argument
3121 if (!Result.checkSubobject(Info, E, CSK_Derived)) in CastToDerivedClass()
3128 const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); in CastToDerivedClass()
3140 static bool HandleLValueDirectBase(EvalInfo &Info, const Expr *E, LValue &Obj, in HandleLValueDirectBase() argument
3146 RL = &Info.Ctx.getASTRecordLayout(Derived); in HandleLValueDirectBase()
3150 Obj.addDecl(Info, E, Base, /*Virtual*/ false); in HandleLValueDirectBase()
3154 static bool HandleLValueBase(EvalInfo &Info, const Expr *E, LValue &Obj, in HandleLValueBase() argument
3160 return HandleLValueDirectBase(Info, E, Obj, DerivedDecl, BaseDecl); in HandleLValueBase()
3168 if (!CastToDerivedClass(Info, E, Obj, DerivedDecl, D.MostDerivedPathLength)) in HandleLValueBase()
3173 const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(DerivedDecl); in HandleLValueBase()
3175 Obj.addDecl(Info, E, BaseDecl, /*Virtual*/ true); in HandleLValueBase()
3179 static bool HandleLValueBasePath(EvalInfo &Info, const CastExpr *E, in HandleLValueBasePath() argument
3184 if (!HandleLValueBase(Info, E, Result, Type->getAsCXXRecordDecl(), in HandleLValueBasePath()
3193 static bool CastToBaseClass(EvalInfo &Info, const Expr *E, LValue &Result, in CastToBaseClass() argument
3202 if (!HandleLValueBase(Info, E, Result, Elem.Class, Elem.Base)) in CastToBaseClass()
3209 static bool HandleLValueMember(EvalInfo &Info, const Expr *E, LValue &LVal, in HandleLValueMember() argument
3214 RL = &Info.Ctx.getASTRecordLayout(FD->getParent()); in HandleLValueMember()
3218 LVal.adjustOffset(Info.Ctx.toCharUnitsFromBits(RL->getFieldOffset(I))); in HandleLValueMember()
3219 LVal.addDecl(Info, E, FD); in HandleLValueMember()
3224 static bool HandleLValueIndirectMember(EvalInfo &Info, const Expr *E, in HandleLValueIndirectMember() argument
3228 if (!HandleLValueMember(Info, E, LVal, cast<FieldDecl>(C))) in HandleLValueIndirectMember()
3239 static bool HandleSizeof(EvalInfo &Info, SourceLocation Loc, QualType Type, in HandleSizeof() argument
3249 Info.FFDiag(Loc); in HandleSizeof()
3256 Info.FFDiag(Loc); in HandleSizeof()
3261 Size = Info.Ctx.getTypeSizeInChars(Type); in HandleSizeof()
3263 Size = Info.Ctx.getTypeInfoDataSizeInChars(Type).Width; in HandleSizeof()
3273 static bool HandleLValueArrayAdjustment(EvalInfo &Info, const Expr *E, in HandleLValueArrayAdjustment() argument
3277 if (!HandleSizeof(Info, E->getExprLoc(), EltTy, SizeOfPointee)) in HandleLValueArrayAdjustment()
3280 LVal.adjustOffsetAndIndex(Info, E, Adjustment, SizeOfPointee); in HandleLValueArrayAdjustment()
3284 static bool HandleLValueArrayAdjustment(EvalInfo &Info, const Expr *E, in HandleLValueArrayAdjustment() argument
3287 return HandleLValueArrayAdjustment(Info, E, LVal, EltTy, in HandleLValueArrayAdjustment()
3296 static bool HandleLValueComplexElement(EvalInfo &Info, const Expr *E, in HandleLValueComplexElement() argument
3301 if (!HandleSizeof(Info, E->getExprLoc(), EltTy, SizeOfComponent)) in HandleLValueComplexElement()
3305 LVal.addComplex(Info, E, EltTy, Imag); in HandleLValueComplexElement()
3318 static bool evaluateVarDeclInit(EvalInfo &Info, const Expr *E, in evaluateVarDeclInit() argument
3337 if (Info.checkingPotentialConstantExpression()) in evaluateVarDeclInit()
3341 Info.FFDiag(E->getBeginLoc(), in evaluateVarDeclInit()
3350 if (Info.EvaluatingDecl == Base) { in evaluateVarDeclInit()
3351 Result = Info.EvaluatingDeclValue; in evaluateVarDeclInit()
3358 if (!Info.checkingPotentialConstantExpression() || in evaluateVarDeclInit()
3359 !Info.CurrentCall->Callee || in evaluateVarDeclInit()
3360 !Info.CurrentCall->Callee->Equals(VD->getDeclContext())) { in evaluateVarDeclInit()
3361 if (Info.getLangOpts().CPlusPlus11) { in evaluateVarDeclInit()
3362 Info.FFDiag(E, diag::note_constexpr_function_param_value_unknown) in evaluateVarDeclInit()
3364 NoteLValueLocation(Info, Base); in evaluateVarDeclInit()
3366 Info.FFDiag(E); in evaluateVarDeclInit()
3382 if (!Info.checkingPotentialConstantExpression()) { in evaluateVarDeclInit()
3383 Info.FFDiag(E, diag::note_constexpr_var_init_unknown, 1) in evaluateVarDeclInit()
3385 NoteLValueLocation(Info, Base); in evaluateVarDeclInit()
3396 assert(!VD->mightBeUsableInConstantExpressions(Info.Ctx)); in evaluateVarDeclInit()
3397 if (!Info.checkingPotentialConstantExpression()) { in evaluateVarDeclInit()
3398 Info.FFDiag(E, Info.getLangOpts().CPlusPlus11 in evaluateVarDeclInit()
3402 NoteLValueLocation(Info, Base); in evaluateVarDeclInit()
3410 Info.FFDiag(E, diag::note_constexpr_var_init_non_constant, 1) << VD; in evaluateVarDeclInit()
3411 NoteLValueLocation(Info, Base); in evaluateVarDeclInit()
3424 if ((Info.getLangOpts().CPlusPlus && !VD->hasConstantInitialization() && in evaluateVarDeclInit()
3425 VD->mightBeUsableInConstantExpressions(Info.Ctx)) || in evaluateVarDeclInit()
3426 ((Info.getLangOpts().CPlusPlus || Info.getLangOpts().OpenCL) && in evaluateVarDeclInit()
3427 !Info.getLangOpts().CPlusPlus11 && !VD->hasICEInitializer(Info.Ctx))) { in evaluateVarDeclInit()
3428 Info.CCEDiag(E, diag::note_constexpr_var_init_non_constant, 1) << VD; in evaluateVarDeclInit()
3429 NoteLValueLocation(Info, Base); in evaluateVarDeclInit()
3435 Info.FFDiag(E, diag::note_constexpr_var_init_weak) << VD; in evaluateVarDeclInit()
3436 NoteLValueLocation(Info, Base); in evaluateVarDeclInit()
3460 static APSInt extractStringLiteralCharacter(EvalInfo &Info, const Expr *Lit, in extractStringLiteralCharacter() argument
3468 Info.Ctx.getObjCEncodingForType(ObjCEnc->getEncodedType(), Str); in extractStringLiteralCharacter()
3477 Info.Ctx.getAsConstantArrayType(S->getType()); in extractStringLiteralCharacter()
3481 APSInt Value(Info.Ctx.getTypeSize(CharType), in extractStringLiteralCharacter()
3492 static void expandStringLiteral(EvalInfo &Info, const StringLiteral *S, in expandStringLiteral() argument
3495 const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType( in expandStringLiteral()
3504 APSInt Value(Info.Ctx.getTypeSize(CharType), in expandStringLiteral()
3567 static bool diagnoseMutableFields(EvalInfo &Info, const Expr *E, AccessKinds AK, in diagnoseMutableFields() argument
3583 Info.FFDiag(E, diag::note_constexpr_access_mutable, 1) << AK << Field; in diagnoseMutableFields()
3584 Info.Note(Field->getLocation(), diag::note_declared_at); in diagnoseMutableFields()
3588 if (diagnoseMutableFields(Info, E, AK, Field->getType())) in diagnoseMutableFields()
3593 if (diagnoseMutableFields(Info, E, AK, BaseSpec.getType())) in diagnoseMutableFields()
3600 static bool lifetimeStartedInEvaluation(EvalInfo &Info, in lifetimeStartedInEvaluation() argument
3607 switch (Info.IsEvaluatingDecl) { in lifetimeStartedInEvaluation()
3613 if (Info.EvaluatingDecl == Base) in lifetimeStartedInEvaluation()
3620 return Info.EvaluatingDecl == BaseMTE->getExtendingDecl(); in lifetimeStartedInEvaluation()
3628 if (MutableSubobject || Base != Info.EvaluatingDecl) in lifetimeStartedInEvaluation()
3640 static bool CheckArraySize(EvalInfo &Info, const ConstantArrayType *CAT, in CheckArraySize() argument
3642 return Info.CheckArraySize(
3644 CAT->getNumAddressingBits(Info.Ctx), CAT->getZExtSize(),
3663 bool mayAccessMutableMembers(EvalInfo &Info, AccessKinds AK) const { in mayAccessMutableMembers()
3674 if (!Info.getLangOpts().CPlusPlus14) in mayAccessMutableMembers()
3676 return lifetimeStartedInEvaluation(Info, Base, /*MutableSubobject*/true); in mayAccessMutableMembers()
3700 findSubobject(EvalInfo &Info, const Expr *E, const CompleteObject &Obj, in findSubobject() argument
3706 if (Info.getLangOpts().CPlusPlus11) in findSubobject()
3707 Info.FFDiag(E, Sub.isOnePastTheEnd() in findSubobject()
3712 Info.FFDiag(E); in findSubobject()
3727 if (!Info.checkingPotentialConstantExpression()) in findSubobject()
3728 Info.FFDiag(E, diag::note_constexpr_access_uninit) in findSubobject()
3739 Info.isEvaluatingCtorDtor( in findSubobject()
3743 ObjType = Info.Ctx.getCanonicalType(ObjType); in findSubobject()
3752 if (Info.getLangOpts().CPlusPlus) { in findSubobject()
3769 Info.FFDiag(E, diag::note_constexpr_access_volatile_obj, 1) in findSubobject()
3771 Info.Note(Loc, diag::note_constexpr_volatile_here) << DiagKind; in findSubobject()
3773 Info.FFDiag(E, diag::note_invalid_subexpr_in_const_expr); in findSubobject()
3783 !Obj.mayAccessMutableMembers(Info, handler.AccessKind) && in findSubobject()
3784 diagnoseMutableFields(Info, E, handler.AccessKind, ObjType)) in findSubobject()
3795 !truncateBitfieldValue(Info, E, *O, LastField)) in findSubobject()
3804 const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType(ObjType); in findSubobject()
3810 if (Info.getLangOpts().CPlusPlus11) in findSubobject()
3811 Info.FFDiag(E, diag::note_constexpr_access_past_end) in findSubobject()
3814 Info.FFDiag(E); in findSubobject()
3823 if (!CheckArraySize(Info, CAT, E->getExprLoc())) in findSubobject()
3834 if (Info.getLangOpts().CPlusPlus11) in findSubobject()
3835 Info.FFDiag(E, diag::note_constexpr_access_past_end) in findSubobject()
3838 Info.FFDiag(E); in findSubobject()
3856 !Obj.mayAccessMutableMembers(Info, handler.AccessKind)) { in findSubobject()
3857 Info.FFDiag(E, diag::note_constexpr_access_mutable, 1) in findSubobject()
3859 Info.Note(Field->getLocation(), diag::note_declared_at); in findSubobject()
3877 Info.FFDiag(E, diag::note_constexpr_access_inactive_union_member) in findSubobject()
3896 ObjType = getSubobjectType(ObjType, Info.Ctx.getRecordType(Base)); in findSubobject()
3903 EvalInfo &Info; member
3914 return CheckFullyInitialized(Info, E->getExprLoc(), SubobjType, Result); in found()
3928 static bool extractSubobject(EvalInfo &Info, const Expr *E, in extractSubobject() argument
3933 ExtractSubobjectHandler Handler = {Info, E, Result, AK}; in extractSubobject()
3934 return findSubobject(Info, E, Obj, Sub, Handler); in extractSubobject()
3939 EvalInfo &Info; member
3949 Info.FFDiag(E, diag::note_constexpr_modify_const_type) << QT; in checkConst()
3968 Info.FFDiag(E); in found()
3986 static bool modifySubobject(EvalInfo &Info, const Expr *E, in modifySubobject() argument
3990 ModifySubobjectHandler Handler = { Info, NewVal, E }; in modifySubobject()
3991 return findSubobject(Info, E, Obj, Sub, Handler); in modifySubobject()
4053 static CompleteObject findCompleteObject(EvalInfo &Info, const Expr *E, in findCompleteObject() argument
4057 Info.FFDiag(E); in findCompleteObject()
4062 Info.FFDiag(E, diag::note_constexpr_access_null) << AK; in findCompleteObject()
4070 Info.getCallFrameAndDepth(LVal.getLValueCallIndex()); in findCompleteObject()
4072 Info.FFDiag(E, diag::note_constexpr_lifetime_ended, 1) in findCompleteObject()
4074 NoteLValueLocation(Info, LVal.Base); in findCompleteObject()
4086 if (Info.getLangOpts().CPlusPlus) in findCompleteObject()
4087 Info.FFDiag(E, diag::note_constexpr_access_volatile_type) in findCompleteObject()
4090 Info.FFDiag(E); in findCompleteObject()
4098 if (Info.getLangOpts().CPlusPlus14 && LVal.Base == Info.EvaluatingDecl && in findCompleteObject()
4099 lifetimeStartedInEvaluation(Info, LVal.Base)) { in findCompleteObject()
4102 BaseVal = Info.EvaluatingDeclValue; in findCompleteObject()
4108 Info.FFDiag(E, diag::note_constexpr_modify_global); in findCompleteObject()
4113 Info.FFDiag(E, diag::note_constexpr_unsupported_layout) in findCompleteObject()
4123 Info.FFDiag(E, diag::note_constexpr_modify_global); in findCompleteObject()
4133 Info.FFDiag(E, diag::note_constexpr_modify_global); in findCompleteObject()
4149 if (const VarDecl *VDef = VD->getDefinition(Info.Ctx)) in findCompleteObject()
4153 Info.FFDiag(E); in findCompleteObject()
4157 bool IsConstant = BaseType.isConstant(Info.Ctx); in findCompleteObject()
4160 Info.EvaluatingDecl.dyn_cast<const ValueDecl *>())) in findCompleteObject()
4170 } else if (Info.getLangOpts().CPlusPlus14 && in findCompleteObject()
4171 lifetimeStartedInEvaluation(Info, LVal.Base)) { in findCompleteObject()
4177 Info.FFDiag(E, diag::note_constexpr_modify_global); in findCompleteObject()
4181 } else if (Info.getLangOpts().C23 && ConstexprVar) { in findCompleteObject()
4182 Info.FFDiag(E); in findCompleteObject()
4188 if (Info.getLangOpts().CPlusPlus) { in findCompleteObject()
4189 Info.FFDiag(E, diag::note_constexpr_ltor_non_const_int, 1) << VD; in findCompleteObject()
4190 Info.Note(VD->getLocation(), diag::note_declared_at); in findCompleteObject()
4192 Info.FFDiag(E); in findCompleteObject()
4198 } else if (IsConstant && Info.checkingPotentialConstantExpression() && in findCompleteObject()
4199 BaseType->isLiteralType(Info.Ctx) && !VD->hasDefinition()) { in findCompleteObject()
4205 if (Info.getLangOpts().CPlusPlus) { in findCompleteObject()
4206 Info.CCEDiag(E, Info.getLangOpts().CPlusPlus11 in findCompleteObject()
4210 Info.Note(VD->getLocation(), diag::note_declared_at); in findCompleteObject()
4212 Info.CCEDiag(E); in findCompleteObject()
4216 if (Info.getLangOpts().CPlusPlus) { in findCompleteObject()
4217 Info.FFDiag(E, Info.getLangOpts().CPlusPlus11 in findCompleteObject()
4221 Info.Note(VD->getLocation(), diag::note_declared_at); in findCompleteObject()
4223 Info.FFDiag(E); in findCompleteObject()
4229 if (!evaluateVarDeclInit(Info, E, VD, Frame, LVal.getLValueVersion(), BaseVal)) in findCompleteObject()
4232 std::optional<DynAlloc *> Alloc = Info.lookupDynamicAlloc(DA); in findCompleteObject()
4234 Info.FFDiag(E, diag::note_constexpr_access_deleted_object) << AK; in findCompleteObject()
4273 if (!MTE->isUsableInConstantExpressions(Info.Ctx) && in findCompleteObject()
4274 !lifetimeStartedInEvaluation(Info, LVal.Base)) { in findCompleteObject()
4277 Info.FFDiag(E, diag::note_constexpr_access_static_temporary, 1) << AK; in findCompleteObject()
4278 Info.Note(MTE->getExprLoc(), diag::note_constexpr_temporary_here); in findCompleteObject()
4289 Info.FFDiag(E, diag::note_constexpr_access_unreadable_object) in findCompleteObject()
4291 << Val.getAsString(Info.Ctx, in findCompleteObject()
4292 Info.Ctx.getLValueReferenceType(LValType)); in findCompleteObject()
4293 NoteLValueLocation(Info, LVal.Base); in findCompleteObject()
4313 if ((Frame && Info.getLangOpts().CPlusPlus14 && in findCompleteObject()
4314 Info.EvalStatus.HasSideEffects) || in findCompleteObject()
4315 (isModification(AK) && VisibleDepth < Info.SpeculativeEvaluationDepth)) in findCompleteObject()
4336 handleLValueToRValueConversion(EvalInfo &Info, const Expr *Conv, QualType Type, in handleLValueToRValueConversion() argument
4354 Info.FFDiag(Conv); in handleLValueToRValueConversion()
4359 if (!Evaluate(Lit, Info, CLE->getInitializer())) in handleLValueToRValueConversion()
4377 if (!CLETy.isConstant(Info.Ctx)) { in handleLValueToRValueConversion()
4378 Info.FFDiag(Conv); in handleLValueToRValueConversion()
4379 Info.Note(CLE->getExprLoc(), diag::note_declared_at); in handleLValueToRValueConversion()
4385 return extractSubobject(Info, Conv, LitObj, LVal.Designator, RVal, AK); in handleLValueToRValueConversion()
4395 Info.FFDiag(Conv); in handleLValueToRValueConversion()
4399 if (Info.getLangOpts().CPlusPlus11) in handleLValueToRValueConversion()
4400 Info.FFDiag(Conv, diag::note_constexpr_access_past_end) << AK; in handleLValueToRValueConversion()
4402 Info.FFDiag(Conv); in handleLValueToRValueConversion()
4406 RVal = APValue(extractStringLiteralCharacter(Info, Base, CharIndex)); in handleLValueToRValueConversion()
4411 CompleteObject Obj = findCompleteObject(Info, Conv, AK, LVal, Type); in handleLValueToRValueConversion()
4412 return Obj && extractSubobject(Info, Conv, Obj, LVal.Designator, RVal, AK); in handleLValueToRValueConversion()
4416 static bool handleAssignment(EvalInfo &Info, const Expr *E, const LValue &LVal, in handleAssignment() argument
4421 if (!Info.getLangOpts().CPlusPlus14) { in handleAssignment()
4422 Info.FFDiag(E); in handleAssignment()
4426 CompleteObject Obj = findCompleteObject(Info, E, AK_Assign, LVal, LValType); in handleAssignment()
4427 return Obj && modifySubobject(Info, E, Obj, LVal.Designator, Val); in handleAssignment()
4432 EvalInfo &Info; member
4445 Info.FFDiag(E, diag::note_constexpr_modify_const_type) << QT; in checkConst()
4461 Info.FFDiag(E); in found()
4468 Info.FFDiag(E, diag::note_constexpr_access_uninit) in found()
4474 Info.FFDiag(E); in found()
4484 Info.FFDiag(E); in foundVector()
4487 return handleVectorVectorBinOp(Info, E, Opcode, Value, RHS); in foundVector()
4497 Info.FFDiag(E); in found()
4503 HandleIntToIntCast(Info, E, PromotedLHSType, SubobjType, Value); in found()
4504 if (!handleIntIntBinOp(Info, E, LHS, Opcode, RHS.getInt(), LHS)) in found()
4506 Value = HandleIntToIntCast(Info, E, SubobjType, PromotedLHSType, LHS); in found()
4510 Info.Ctx.getLangOpts()); in found()
4512 return HandleIntToFloatCast(Info, E, FPO, SubobjType, Value, in found()
4514 handleFloatFloatBinOp(Info, E, FValue, Opcode, RHS.getFloat()) && in found()
4515 HandleFloatToIntCast(Info, E, PromotedLHSType, FValue, SubobjType, in found()
4519 Info.FFDiag(E); in found()
4524 HandleFloatToFloatCast(Info, E, SubobjType, PromotedLHSType, in found()
4526 handleFloatFloatBinOp(Info, E, Value, Opcode, RHS.getFloat()) && in found()
4527 HandleFloatToFloatCast(Info, E, PromotedLHSType, SubobjType, Value); in found()
4539 Info.FFDiag(E); in foundPointer()
4548 LVal.setFrom(Info.Ctx, Subobj); in foundPointer()
4549 if (!HandleLValueArrayAdjustment(Info, E, LVal, PointeeType, Offset)) in foundPointer()
4560 static bool handleCompoundAssignment(EvalInfo &Info, in handleCompoundAssignment() argument
4569 if (!Info.getLangOpts().CPlusPlus14) { in handleCompoundAssignment()
4570 Info.FFDiag(E); in handleCompoundAssignment()
4574 CompleteObject Obj = findCompleteObject(Info, E, AK_Assign, LVal, LValType); in handleCompoundAssignment()
4575 CompoundAssignSubobjectHandler Handler = { Info, E, PromotedLValType, Opcode, in handleCompoundAssignment()
4577 return Obj && findSubobject(Info, E, Obj, LVal.Designator, Handler); in handleCompoundAssignment()
4582 EvalInfo &Info; member
4592 Info.FFDiag(E, diag::note_constexpr_modify_const_type) << QT; in checkConst()
4624 Info.FFDiag(E); in found()
4635 Info.FFDiag(E); in found()
4657 return HandleOverflow(Info, E, ActualValue, SubobjType); in found()
4666 return HandleOverflow(Info, E, ActualValue, SubobjType); in found()
4678 llvm::RoundingMode RM = getActiveRoundingMode(Info, E); in found()
4684 return checkFloatingPointResult(Info, E, St); in found()
4694 Info.FFDiag(E); in foundPointer()
4699 LVal.setFrom(Info.Ctx, Subobj); in foundPointer()
4700 if (!HandleLValueArrayAdjustment(Info, E, LVal, PointeeType, in foundPointer()
4710 static bool handleIncDec(EvalInfo &Info, const Expr *E, const LValue &LVal, in handleIncDec() argument
4715 if (!Info.getLangOpts().CPlusPlus14) { in handleIncDec()
4716 Info.FFDiag(E); in handleIncDec()
4721 CompleteObject Obj = findCompleteObject(Info, E, AK, LVal, LValType); in handleIncDec()
4722 IncDecSubobjectHandler Handler = {Info, cast<UnaryOperator>(E), AK, Old}; in handleIncDec()
4723 return Obj && findSubobject(Info, E, Obj, LVal.Designator, Handler); in handleIncDec()
4727 static bool EvaluateObjectArgument(EvalInfo &Info, const Expr *Object, in EvaluateObjectArgument() argument
4730 return EvaluatePointer(Object, This, Info); in EvaluateObjectArgument()
4733 return EvaluateLValue(Object, This, Info); in EvaluateObjectArgument()
4735 if (Object->getType()->isLiteralType(Info.Ctx)) in EvaluateObjectArgument()
4736 return EvaluateTemporary(Object, This, Info); in EvaluateObjectArgument()
4739 return EvaluateTemporary(Object, This, Info); in EvaluateObjectArgument()
4741 Info.FFDiag(Object, diag::note_constexpr_nonliteral) << Object->getType(); in EvaluateObjectArgument()
4756 static const ValueDecl *HandleMemberPointerAccess(EvalInfo &Info, in HandleMemberPointerAccess() argument
4762 if (!EvaluateMemberPointer(RHS, MemPtr, Info)) in HandleMemberPointerAccess()
4769 Info.FFDiag(RHS); in HandleMemberPointerAccess()
4779 Info.FFDiag(RHS); in HandleMemberPointerAccess()
4789 Info.FFDiag(RHS); in HandleMemberPointerAccess()
4795 if (!CastToDerivedClass(Info, RHS, LV, MemPtr.getContainingRecord(), in HandleMemberPointerAccess()
4811 if (!HandleLValueDirectBase(Info, RHS, LV, RD, Base)) in HandleMemberPointerAccess()
4816 if (!HandleLValueDirectBase(Info, RHS, LV, RD, in HandleMemberPointerAccess()
4824 if (!HandleLValueMember(Info, RHS, LV, FD)) in HandleMemberPointerAccess()
4828 if (!HandleLValueIndirectMember(Info, RHS, LV, IFD)) in HandleMemberPointerAccess()
4838 static const ValueDecl *HandleMemberPointerAccess(EvalInfo &Info, in HandleMemberPointerAccess() argument
4844 if (!EvaluateObjectArgument(Info, BO->getLHS(), LV)) { in HandleMemberPointerAccess()
4845 if (Info.noteFailure()) { in HandleMemberPointerAccess()
4847 EvaluateMemberPointer(BO->getRHS(), MemPtr, Info); in HandleMemberPointerAccess()
4852 return HandleMemberPointerAccess(Info, BO->getLHS()->getType(), LV, in HandleMemberPointerAccess()
4858 static bool HandleBaseToDerivedCast(EvalInfo &Info, const CastExpr *E, in HandleBaseToDerivedCast() argument
4861 if (D.Invalid || !Result.checkNullPointer(Info, E, CSK_Derived)) in HandleBaseToDerivedCast()
4870 Info.CCEDiag(E, diag::note_constexpr_invalid_downcast) in HandleBaseToDerivedCast()
4885 Info.CCEDiag(E, diag::note_constexpr_invalid_downcast) in HandleBaseToDerivedCast()
4891 return CastToDerivedClass(Info, E, Result, TargetType, NewEntriesSize); in HandleBaseToDerivedCast()
4962 static bool EvaluateVarDecl(EvalInfo &Info, const VarDecl *VD) { in EvaluateVarDecl() argument
4970 APValue &Val = Info.CurrentCall->createTemporary(VD, VD->getType(), in EvaluateVarDecl()
4976 return Info.noteSideEffect(); in EvaluateVarDecl()
4982 if (!EvaluateInPlace(Val, Info, Result, InitE)) { in EvaluateVarDecl()
4992 static bool EvaluateDecl(EvalInfo &Info, const Decl *D) { in EvaluateDecl() argument
4996 OK &= EvaluateVarDecl(Info, VD); in EvaluateDecl()
5001 OK &= EvaluateDecl(Info, VD); in EvaluateDecl()
5006 static bool EvaluateDependentExpr(const Expr *E, EvalInfo &Info) { in EvaluateDependentExpr() argument
5008 if (Info.noteSideEffect()) in EvaluateDependentExpr()
5016 static bool EvaluateCond(EvalInfo &Info, const VarDecl *CondDecl, in EvaluateCond() argument
5020 FullExpressionRAII Scope(Info); in EvaluateCond()
5021 if (CondDecl && !EvaluateDecl(Info, CondDecl)) in EvaluateCond()
5023 if (!EvaluateAsBooleanCondition(Cond, Result, Info)) in EvaluateCond()
5052 static EvalStmtResult EvaluateStmt(StmtResult &Result, EvalInfo &Info,
5057 static EvalStmtResult EvaluateLoopBody(StmtResult &Result, EvalInfo &Info, in EvaluateLoopBody() argument
5060 BlockScopeRAII Scope(Info); in EvaluateLoopBody()
5062 EvalStmtResult ESR = EvaluateStmt(Result, Info, Body, Case); in EvaluateLoopBody()
5081 static EvalStmtResult EvaluateSwitch(StmtResult &Result, EvalInfo &Info, in EvaluateSwitch() argument
5083 BlockScopeRAII Scope(Info); in EvaluateSwitch()
5089 EvalStmtResult ESR = EvaluateStmt(Result, Info, Init); in EvaluateSwitch()
5097 FullExpressionRAII CondScope(Info); in EvaluateSwitch()
5099 !EvaluateDecl(Info, SS->getConditionVariable())) in EvaluateSwitch()
5103 EvaluateDependentExpr(SS->getCond(), Info); in EvaluateSwitch()
5106 if (!EvaluateInteger(SS->getCond(), Value, Info)) in EvaluateSwitch()
5124 APSInt LHS = CS->getLHS()->EvaluateKnownConstInt(Info.Ctx); in EvaluateSwitch()
5125 APSInt RHS = CS->getRHS() ? CS->getRHS()->EvaluateKnownConstInt(Info.Ctx) in EvaluateSwitch()
5137 EvalStmtResult ESR = EvaluateStmt(Result, Info, SS->getBody(), Found); in EvaluateSwitch()
5152 Info.FFDiag(Found->getBeginLoc(), in EvaluateSwitch()
5159 static bool CheckLocalVariableDeclaration(EvalInfo &Info, const VarDecl *VD) { in CheckLocalVariableDeclaration() argument
5165 !VD->isUsableInConstantExpressions(Info.Ctx)) { in CheckLocalVariableDeclaration()
5166 Info.CCEDiag(VD->getLocation(), diag::note_constexpr_static_local) in CheckLocalVariableDeclaration()
5174 static EvalStmtResult EvaluateStmt(StmtResult &Result, EvalInfo &Info, in EvaluateStmt() argument
5176 if (!Info.nextStep(S)) in EvaluateStmt()
5205 BlockScopeRAII Scope(Info); in EvaluateStmt()
5210 EvalStmtResult ESR = EvaluateStmt(Result, Info, Init, Case); in EvaluateStmt()
5222 EvalStmtResult ESR = EvaluateStmt(Result, Info, IS->getThen(), Case); in EvaluateStmt()
5230 ESR = EvaluateStmt(Result, Info, IS->getElse(), Case); in EvaluateStmt()
5240 EvaluateLoopBody(Result, Info, cast<WhileStmt>(S)->getBody(), Case); in EvaluateStmt()
5248 BlockScopeRAII Scope(Info); in EvaluateStmt()
5253 EvalStmtResult ESR = EvaluateStmt(Result, Info, Init, Case); in EvaluateStmt()
5261 EvaluateLoopBody(Result, Info, FS->getBody(), Case); in EvaluateStmt()
5266 if (!EvaluateDependentExpr(Inc, Info)) in EvaluateStmt()
5269 FullExpressionRAII IncScope(Info); in EvaluateStmt()
5270 if (!EvaluateIgnoredValue(Info, Inc) || !IncScope.destroy()) in EvaluateStmt()
5283 if (!CheckLocalVariableDeclaration(Info, VD)) in EvaluateStmt()
5286 if (!EvaluateVarDecl(Info, VD)) in EvaluateStmt()
5305 if (!EvaluateDependentExpr(E, Info)) in EvaluateStmt()
5312 FullExpressionRAII Scope(Info); in EvaluateStmt()
5313 if (!EvaluateIgnoredValue(Info, E) || !Scope.destroy()) in EvaluateStmt()
5319 Info.FFDiag(S->getBeginLoc()) << S->getSourceRange(); in EvaluateStmt()
5329 if (VD && !CheckLocalVariableDeclaration(Info, VD)) in EvaluateStmt()
5332 FullExpressionRAII Scope(Info); in EvaluateStmt()
5333 if (!EvaluateDecl(Info, D) && !Info.noteFailure()) in EvaluateStmt()
5343 FullExpressionRAII Scope(Info); in EvaluateStmt()
5345 EvaluateDependentExpr(RetExpr, Info); in EvaluateStmt()
5351 ? EvaluateInPlace(Result.Value, Info, *Result.Slot, RetExpr) in EvaluateStmt()
5352 : Evaluate(Result.Value, Info, RetExpr))) in EvaluateStmt()
5358 BlockScopeRAII Scope(Info); in EvaluateStmt()
5362 EvalStmtResult ESR = EvaluateStmt(Result, Info, BI, Case); in EvaluateStmt()
5380 BlockScopeRAII Scope(Info); in EvaluateStmt()
5382 EvalStmtResult ESR = EvaluateStmt(Result, Info, Init); in EvaluateStmt()
5394 if (!Info.InConstantContext) in EvaluateStmt()
5396 } else if (!EvaluateCond(Info, IS->getConditionVariable(), IS->getCond(), in EvaluateStmt()
5401 EvalStmtResult ESR = EvaluateStmt(Result, Info, SubStmt); in EvaluateStmt()
5414 BlockScopeRAII Scope(Info); in EvaluateStmt()
5416 if (!EvaluateCond(Info, WS->getConditionVariable(), WS->getCond(), in EvaluateStmt()
5422 EvalStmtResult ESR = EvaluateLoopBody(Result, Info, WS->getBody()); in EvaluateStmt()
5438 EvalStmtResult ESR = EvaluateLoopBody(Result, Info, DS->getBody(), Case); in EvaluateStmt()
5444 EvaluateDependentExpr(DS->getCond(), Info); in EvaluateStmt()
5448 FullExpressionRAII CondScope(Info); in EvaluateStmt()
5449 if (!EvaluateAsBooleanCondition(DS->getCond(), Continue, Info) || in EvaluateStmt()
5458 BlockScopeRAII ForScope(Info); in EvaluateStmt()
5460 EvalStmtResult ESR = EvaluateStmt(Result, Info, FS->getInit()); in EvaluateStmt()
5468 BlockScopeRAII IterScope(Info); in EvaluateStmt()
5470 if (FS->getCond() && !EvaluateCond(Info, FS->getConditionVariable(), in EvaluateStmt()
5476 EvalStmtResult ESR = EvaluateLoopBody(Result, Info, FS->getBody()); in EvaluateStmt()
5485 if (!EvaluateDependentExpr(Inc, Info)) in EvaluateStmt()
5488 FullExpressionRAII IncScope(Info); in EvaluateStmt()
5489 if (!EvaluateIgnoredValue(Info, Inc) || !IncScope.destroy()) in EvaluateStmt()
5502 BlockScopeRAII Scope(Info); in EvaluateStmt()
5506 EvalStmtResult ESR = EvaluateStmt(Result, Info, FS->getInit()); in EvaluateStmt()
5515 EvalStmtResult ESR = EvaluateStmt(Result, Info, FS->getRangeStmt()); in EvaluateStmt()
5528 ESR = EvaluateStmt(Result, Info, FS->getBeginStmt()); in EvaluateStmt()
5534 ESR = EvaluateStmt(Result, Info, FS->getEndStmt()); in EvaluateStmt()
5545 EvaluateDependentExpr(FS->getCond(), Info); in EvaluateStmt()
5550 FullExpressionRAII CondExpr(Info); in EvaluateStmt()
5551 if (!EvaluateAsBooleanCondition(FS->getCond(), Continue, Info)) in EvaluateStmt()
5558 BlockScopeRAII InnerScope(Info); in EvaluateStmt()
5559 ESR = EvaluateStmt(Result, Info, FS->getLoopVarStmt()); in EvaluateStmt()
5567 ESR = EvaluateLoopBody(Result, Info, FS->getBody()); in EvaluateStmt()
5574 if (!EvaluateDependentExpr(FS->getInc(), Info)) in EvaluateStmt()
5578 if (!EvaluateIgnoredValue(Info, FS->getInc())) in EvaluateStmt()
5590 return EvaluateSwitch(Result, Info, cast<SwitchStmt>(S)); in EvaluateStmt()
5599 return EvaluateStmt(Result, Info, cast<LabelStmt>(S)->getSubStmt(), Case); in EvaluateStmt()
5605 *Info.CurrentCall, hasSpecificAttr<MSConstexprAttr>(AS->getAttrs()) && in EvaluateStmt()
5608 auto LO = Info.getCtx().getLangOpts(); in EvaluateStmt()
5619 if (Assumption->HasSideEffects(Info.getCtx())) in EvaluateStmt()
5623 if (!EvaluateAsBooleanCondition(Assumption, Value, Info)) in EvaluateStmt()
5626 Info.CCEDiag(Assumption->getExprLoc(), in EvaluateStmt()
5633 return EvaluateStmt(Result, Info, SS, Case); in EvaluateStmt()
5638 return EvaluateStmt(Result, Info, cast<SwitchCase>(S)->getSubStmt(), Case); in EvaluateStmt()
5641 return EvaluateStmt(Result, Info, cast<CXXTryStmt>(S)->getTryBlock(), Case); in EvaluateStmt()
5649 static bool CheckTrivialDefaultConstructor(EvalInfo &Info, SourceLocation Loc, in CheckTrivialDefaultConstructor() argument
5659 if (Info.getLangOpts().CPlusPlus11) { in CheckTrivialDefaultConstructor()
5662 Info.CCEDiag(Loc, diag::note_constexpr_invalid_function, 1) in CheckTrivialDefaultConstructor()
5664 Info.Note(CD->getLocation(), diag::note_declared_at); in CheckTrivialDefaultConstructor()
5666 Info.CCEDiag(Loc, diag::note_invalid_subexpr_in_const_expr); in CheckTrivialDefaultConstructor()
5674 static bool CheckConstexprFunction(EvalInfo &Info, SourceLocation CallLoc, in CheckConstexprFunction() argument
5680 if (Info.checkingPotentialConstantExpression() && !Definition && in CheckConstexprFunction()
5688 Info.FFDiag(CallLoc, diag::note_invalid_subexpr_in_const_expr); in CheckConstexprFunction()
5695 if (!Info.Ctx.getLangOpts().CPlusPlus20 && isa<CXXMethodDecl>(Declaration) && in CheckConstexprFunction()
5697 Info.CCEDiag(CallLoc, diag::note_constexpr_virtual_call); in CheckConstexprFunction()
5700 Info.FFDiag(CallLoc, diag::note_invalid_subexpr_in_const_expr); in CheckConstexprFunction()
5706 (Definition->isConstexpr() || (Info.CurrentCall->CanEvalMSConstexpr && in CheckConstexprFunction()
5710 if (Info.getLangOpts().CPlusPlus11) { in CheckConstexprFunction()
5726 Info.FFDiag(CallLoc, diag::note_constexpr_invalid_inhctor, 1) in CheckConstexprFunction()
5729 Info.FFDiag(CallLoc, diag::note_constexpr_invalid_function, 1) in CheckConstexprFunction()
5731 Info.Note(DiagDecl->getLocation(), diag::note_declared_at); in CheckConstexprFunction()
5733 Info.FFDiag(CallLoc, diag::note_invalid_subexpr_in_const_expr); in CheckConstexprFunction()
5751 static bool checkDynamicType(EvalInfo &Info, const Expr *E, const LValue &This, in checkDynamicType() argument
5756 CompleteObject Obj = findCompleteObject(Info, E, AK, This, QualType()); in checkDynamicType()
5767 Info.FFDiag(E, This.Designator.isOnePastTheEnd() in checkDynamicType()
5778 Info.Ctx.getLValueReferenceType(This.Designator.getType(Info.Ctx)); in checkDynamicType()
5779 Info.FFDiag(E, diag::note_constexpr_polymorphic_unknown_dynamic_type) in checkDynamicType()
5780 << AK << Val.getAsString(Info.Ctx, StarThisType); in checkDynamicType()
5787 return Obj && findSubobject(Info, E, Obj, This.Designator, Handler); in checkDynamicType()
5793 checkNonVirtualMemberCallThisPointer(EvalInfo &Info, const Expr *E, in checkNonVirtualMemberCallThisPointer() argument
5797 Info, E, This, in checkNonVirtualMemberCallThisPointer()
5818 static std::optional<DynamicType> ComputeDynamicType(EvalInfo &Info, in ComputeDynamicType() argument
5825 if (!checkDynamicType(Info, E, This, AK, true)) in ComputeDynamicType()
5837 Info.FFDiag(E); in ComputeDynamicType()
5848 switch (Info.isEvaluatingCtorDtor(This.getLValueBase(), in ComputeDynamicType()
5870 Info.FFDiag(E); in ComputeDynamicType()
5876 EvalInfo &Info, const Expr *E, LValue &This, const CXXMethodDecl *Found, in HandleVirtualDispatch() argument
5879 Info, E, This, in HandleVirtualDispatch()
5904 Info.FFDiag(E, diag::note_constexpr_pure_virtual_call, 1) << Callee; in HandleVirtualDispatch()
5905 Info.Note(Callee->getLocation(), diag::note_declared_at); in HandleVirtualDispatch()
5911 if (!Info.Ctx.hasSameUnqualifiedType(Callee->getReturnType(), in HandleVirtualDispatch()
5921 if (Next && !Info.Ctx.hasSameUnqualifiedType( in HandleVirtualDispatch()
5925 if (!Info.Ctx.hasSameUnqualifiedType(Found->getReturnType(), in HandleVirtualDispatch()
5931 if (!CastToDerivedClass(Info, E, This, Callee->getParent(), PathLength)) in HandleVirtualDispatch()
5940 static bool HandleCovariantReturnAdjustment(EvalInfo &Info, const Expr *E, in HandleCovariantReturnAdjustment() argument
5949 LVal.setFrom(Info.Ctx, Result); in HandleCovariantReturnAdjustment()
5956 !CastToBaseClass(Info, E, LVal, OldClass, NewClass)) in HandleCovariantReturnAdjustment()
5981 static bool HandleDynamicCast(EvalInfo &Info, const ExplicitCastExpr *E, in HandleDynamicCast() argument
5997 ComputeDynamicType(Info, E, Ptr, AK_DynamicCast); in HandleDynamicCast()
6005 return CastToDerivedClass(Info, E, Ptr, DynType->Type, DynType->PathLength); in HandleDynamicCast()
6009 CanQualType CQT = Info.Ctx.getCanonicalType(Info.Ctx.getRecordType(C)); in HandleDynamicCast()
6016 Ptr.setNull(Info.Ctx, E->getType()); in HandleDynamicCast()
6033 Info.FFDiag(E, diag::note_constexpr_dynamic_cast_to_reference_failed) in HandleDynamicCast()
6034 << DiagKind << Ptr.Designator.getType(Info.Ctx) in HandleDynamicCast()
6035 << Info.Ctx.getRecordType(DynType->Type) in HandleDynamicCast()
6047 return CastToDerivedClass(Info, E, Ptr, Class, PathLength); in HandleDynamicCast()
6062 if (!CastToDerivedClass(Info, E, Ptr, DynType->Type, DynType->PathLength)) in HandleDynamicCast()
6066 if (!HandleLValueBase(Info, E, Ptr, Elem.Class, Elem.Base)) in HandleDynamicCast()
6077 EvalInfo &Info; member
6105 Info.FFDiag(LHSExpr, in found()
6129 static bool MaybeHandleUnionActiveMemberChange(EvalInfo &Info, in MaybeHandleUnionActiveMemberChange() argument
6212 findCompleteObject(Info, LHSExpr, AK_Assign, LHS, LHSExpr->getType()); in MaybeHandleUnionActiveMemberChange()
6219 D.truncate(Info.Ctx, LHS.Base, LengthAndField.first); in MaybeHandleUnionActiveMemberChange()
6221 bool DuringInit = Info.isEvaluatingCtorDtor(LHS.Base, D.Entries) == in MaybeHandleUnionActiveMemberChange()
6224 Info, LHSExpr, LengthAndField.second, DuringInit}; in MaybeHandleUnionActiveMemberChange()
6225 if (!findSubobject(Info, LHSExpr, Obj, D, StartLifetime)) in MaybeHandleUnionActiveMemberChange()
6233 CallRef Call, EvalInfo &Info, in EvaluateCallArg() argument
6241 APValue &V = PVD ? Info.CurrentCall->createParam(Call, PVD, LV) in EvaluateCallArg()
6242 : Info.CurrentCall->createTemporary(Arg, Arg->getType(), in EvaluateCallArg()
6244 if (!EvaluateInPlace(V, Info, LV, Arg)) in EvaluateCallArg()
6250 Info.CCEDiag(Arg, diag::note_non_null_attribute_failed); in EvaluateCallArg()
6259 EvalInfo &Info, const FunctionDecl *Callee, in EvaluateArgs() argument
6283 if (!EvaluateCallArg(PVD, Args[Idx], Call, Info, NonNull)) { in EvaluateArgs()
6286 if (!Info.noteFailure()) in EvaluateArgs()
6296 static bool handleTrivialCopy(EvalInfo &Info, const ParmVarDecl *Param, in handleTrivialCopy() argument
6300 CallStackFrame *Frame = Info.CurrentCall; in handleTrivialCopy()
6301 APValue *RefValue = Info.getParamSlot(Frame->Arguments, Param); in handleTrivialCopy()
6303 Info.FFDiag(E); in handleTrivialCopy()
6309 RefLValue.setFrom(Info.Ctx, *RefValue); in handleTrivialCopy()
6311 Info, E, Param->getType().getNonReferenceType(), RefLValue, Result, in handleTrivialCopy()
6319 CallRef Call, const Stmt *Body, EvalInfo &Info, in HandleFunctionCall() argument
6321 if (!Info.CheckCallLimit(CallLoc)) in HandleFunctionCall()
6324 CallStackFrame Frame(Info, E->getSourceRange(), Callee, This, E, Call); in HandleFunctionCall()
6340 if (!handleTrivialCopy(Info, MD->getParamDecl(0), Args[0], RHSValue, in HandleFunctionCall()
6343 if (!handleAssignment(Info, Args[0], *This, MD->getThisType(), in HandleFunctionCall()
6355 if (!Info.checkingPotentialConstantExpression()) in HandleFunctionCall()
6361 EvalStmtResult ESR = EvaluateStmt(Ret, Info, Body); in HandleFunctionCall()
6365 Info.FFDiag(Callee->getEndLoc(), diag::note_constexpr_no_return); in HandleFunctionCall()
6374 EvalInfo &Info, APValue &Result) { in HandleConstructorCall() argument
6376 if (!Info.CheckCallLimit(CallLoc)) in HandleConstructorCall()
6381 Info.FFDiag(CallLoc, diag::note_constexpr_virtual_base) << RD; in HandleConstructorCall()
6386 Info, in HandleConstructorCall()
6389 CallStackFrame Frame(Info, E->getSourceRange(), Definition, &This, E, Call); in HandleConstructorCall()
6400 if (!EvaluateDependentExpr((*I)->getInit(), Info)) in HandleConstructorCall()
6403 FullExpressionRAII InitScope(Info); in HandleConstructorCall()
6404 if (!EvaluateInPlace(Result, Info, This, (*I)->getInit()) || in HandleConstructorCall()
6408 return EvaluateStmt(Ret, Info, Definition->getBody()) != ESR_Failed; in HandleConstructorCall()
6423 return handleTrivialCopy(Info, Definition->getParamDecl(0), E, Result, in HandleConstructorCall()
6438 const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); in HandleConstructorCall()
6441 BlockScopeRAII LifetimeExtendedScope(Info); in HandleConstructorCall()
6481 assert(Info.Ctx.hasSameUnqualifiedType(BaseIt->getType(), BaseType) && in HandleConstructorCall()
6485 if (!HandleLValueDirectBase(Info, I->getInit(), Subobject, RD, in HandleConstructorCall()
6490 if (!HandleLValueMember(Info, I->getInit(), Subobject, FD, &Layout)) in HandleConstructorCall()
6520 handleDefaultInitValue(Info.Ctx.getRecordType(CD), *Value); in HandleConstructorCall()
6526 if (!HandleLValueMember(Info, I->getInit(), Subobject, FD)) in HandleConstructorCall()
6545 if (!EvaluateDependentExpr(Init, Info)) in HandleConstructorCall()
6548 ThisOverrideRAII ThisOverride(*Info.CurrentCall, &SubobjectParent, in HandleConstructorCall()
6550 FullExpressionRAII InitScope(Info); in HandleConstructorCall()
6551 if (!EvaluateInPlace(*Value, Info, Subobject, Init) || in HandleConstructorCall()
6553 !truncateBitfieldValue(Info, Init, *Value, FD))) { in HandleConstructorCall()
6556 if (!Info.noteFailure()) in HandleConstructorCall()
6581 EvaluateStmt(Ret, Info, Definition->getBody()) != ESR_Failed && in HandleConstructorCall()
6588 EvalInfo &Info, APValue &Result) { in HandleConstructorCall() argument
6589 CallScopeRAII CallScope(Info); in HandleConstructorCall()
6590 CallRef Call = Info.CurrentCall->createCall(Definition); in HandleConstructorCall()
6591 if (!EvaluateArgs(Args, Call, Info, Definition)) in HandleConstructorCall()
6594 return HandleConstructorCall(E, This, Call, Definition, Info, Result) && in HandleConstructorCall()
6598 static bool HandleDestructionImpl(EvalInfo &Info, SourceRange CallRange, in HandleDestructionImpl() argument
6608 Info.FFDiag(CallRange.getBegin(), in HandleDestructionImpl()
6610 << Printable.getAsString(Info.Ctx, Info.Ctx.getLValueReferenceType(T)); in HandleDestructionImpl()
6616 OpaqueValueExpr LocE(CallRange.getBegin(), Info.Ctx.IntTy, VK_PRValue); in HandleDestructionImpl()
6619 if (const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType(T)) { in HandleDestructionImpl()
6623 if (!CheckArraySize(Info, CAT, CallRange.getBegin())) in HandleDestructionImpl()
6627 ElemLV.addArray(Info, &LocE, CAT); in HandleDestructionImpl()
6628 if (!HandleLValueArrayAdjustment(Info, &LocE, ElemLV, ElemT, Size)) in HandleDestructionImpl()
6639 if (!HandleLValueArrayAdjustment(Info, &LocE, ElemLV, ElemT, -1) || in HandleDestructionImpl()
6640 !HandleDestructionImpl(Info, CallRange, ElemLV, Elem, ElemT)) in HandleDestructionImpl()
6652 Info.FFDiag(CallRange.getBegin(), in HandleDestructionImpl()
6663 Info.FFDiag(CallRange.getBegin(), diag::note_constexpr_virtual_base) << RD; in HandleDestructionImpl()
6669 Info.FFDiag(CallRange.getBegin()); in HandleDestructionImpl()
6688 if (!Info.CheckCallLimit(CallRange.getBegin())) in HandleDestructionImpl()
6694 if (!CheckConstexprFunction(Info, CallRange.getBegin(), DD, Definition, Body)) in HandleDestructionImpl()
6697 CallStackFrame Frame(Info, CallRange, Definition, &This, /*CallExpr=*/nullptr, in HandleDestructionImpl()
6703 Info, in HandleDestructionImpl()
6712 Info.FFDiag(CallRange.getBegin(), diag::note_constexpr_double_destroy); in HandleDestructionImpl()
6720 if (EvaluateStmt(Ret, Info, Definition->getBody()) == ESR_Failed) in HandleDestructionImpl()
6727 const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); in HandleDestructionImpl()
6737 if (!HandleLValueMember(Info, &LocE, Subobject, FD, &Layout)) in HandleDestructionImpl()
6741 if (!HandleDestructionImpl(Info, CallRange, Subobject, *SubobjectValue, in HandleDestructionImpl()
6755 if (!HandleLValueDirectBase(Info, &LocE, Subobject, RD, in HandleDestructionImpl()
6760 if (!HandleDestructionImpl(Info, CallRange, Subobject, *SubobjectValue, in HandleDestructionImpl()
6773 EvalInfo &Info; member
6781 return HandleDestructionImpl(Info, E->getSourceRange(), This, Subobj, in found()
6785 Info.FFDiag(E, diag::note_constexpr_destroy_complex_elem); in found()
6789 Info.FFDiag(E, diag::note_constexpr_destroy_complex_elem); in found()
6797 static bool HandleDestruction(EvalInfo &Info, const Expr *E, in HandleDestruction() argument
6799 CompleteObject Obj = findCompleteObject(Info, E, AK_Destroy, This, ThisType); in HandleDestruction()
6800 DestroyObjectHandler Handler = {Info, E, This, AK_Destroy}; in HandleDestruction()
6801 return Obj && findSubobject(Info, E, Obj, This.Designator, Handler); in HandleDestruction()
6805 static bool HandleDestruction(EvalInfo &Info, SourceLocation Loc, in HandleDestruction() argument
6810 if (Info.EvalStatus.HasSideEffects) in HandleDestruction()
6815 return HandleDestructionImpl(Info, Loc, LV, Value, T); in HandleDestruction()
6819 static bool HandleOperatorNewCall(EvalInfo &Info, const CallExpr *E, in HandleOperatorNewCall() argument
6821 if (Info.checkingPotentialConstantExpression() || in HandleOperatorNewCall()
6822 Info.SpeculativeEvaluationDepth) in HandleOperatorNewCall()
6826 auto Caller = Info.getStdAllocatorCaller("allocate"); in HandleOperatorNewCall()
6828 Info.FFDiag(E->getExprLoc(), Info.getLangOpts().CPlusPlus20 in HandleOperatorNewCall()
6836 Info.FFDiag(E->getExprLoc(), in HandleOperatorNewCall()
6843 if (!EvaluateInteger(E->getArg(0), ByteSize, Info)) in HandleOperatorNewCall()
6847 EvaluateIgnoredValue(Info, E->getArg(I)); in HandleOperatorNewCall()
6852 if (!HandleSizeof(Info, E->getExprLoc(), ElemType, ElemSize)) in HandleOperatorNewCall()
6859 Info.FFDiag(E->getExprLoc(), diag::note_constexpr_operator_new_bad_size) in HandleOperatorNewCall()
6864 if (!Info.CheckArraySize(E->getBeginLoc(), ByteSize.getActiveBits(), in HandleOperatorNewCall()
6867 Result.setNull(Info.Ctx, E->getType()); in HandleOperatorNewCall()
6873 QualType AllocType = Info.Ctx.getConstantArrayType( in HandleOperatorNewCall()
6875 APValue *Val = Info.createHeapAlloc(E, AllocType, Result); in HandleOperatorNewCall()
6877 Result.addArray(Info, E, cast<ConstantArrayType>(AllocType)); in HandleOperatorNewCall()
6900 static std::optional<DynAlloc *> CheckDeleteKind(EvalInfo &Info, const Expr *E, in CheckDeleteKind() argument
6904 return Pointer.toString(Info.Ctx, Info.Ctx.VoidPtrTy); in CheckDeleteKind()
6909 Info.FFDiag(E, diag::note_constexpr_delete_not_heap_alloc) in CheckDeleteKind()
6912 NoteLValueLocation(Info, Pointer.Base); in CheckDeleteKind()
6916 std::optional<DynAlloc *> Alloc = Info.lookupDynamicAlloc(DA); in CheckDeleteKind()
6918 Info.FFDiag(E, diag::note_constexpr_double_delete); in CheckDeleteKind()
6924 Info.FFDiag(E, diag::note_constexpr_new_delete_mismatch) in CheckDeleteKind()
6926 NoteLValueLocation(Info, Pointer.Base); in CheckDeleteKind()
6939 Info.FFDiag(E, diag::note_constexpr_delete_subobject) in CheckDeleteKind()
6948 bool HandleOperatorDeleteCall(EvalInfo &Info, const CallExpr *E) { in HandleOperatorDeleteCall() argument
6949 if (Info.checkingPotentialConstantExpression() || in HandleOperatorDeleteCall()
6950 Info.SpeculativeEvaluationDepth) in HandleOperatorDeleteCall()
6954 if (!Info.getStdAllocatorCaller("deallocate")) { in HandleOperatorDeleteCall()
6955 Info.FFDiag(E->getExprLoc()); in HandleOperatorDeleteCall()
6960 if (!EvaluatePointer(E->getArg(0), Pointer, Info)) in HandleOperatorDeleteCall()
6963 EvaluateIgnoredValue(Info, E->getArg(I)); in HandleOperatorDeleteCall()
6971 Info.CCEDiag(E->getExprLoc(), diag::note_constexpr_deallocate_null); in HandleOperatorDeleteCall()
6975 if (!CheckDeleteKind(Info, E, Pointer, DynAlloc::StdAllocator)) in HandleOperatorDeleteCall()
6978 Info.HeapAllocs.erase(Pointer.Base.get<DynamicAllocLValue>()); in HandleOperatorDeleteCall()
7037 EvalInfo &Info; member in __anonfb577fba1711::APValueToBufferConverter
7041 APValueToBufferConverter(EvalInfo &Info, CharUnits ObjectWidth, in APValueToBufferConverter() argument
7043 : Info(Info), in APValueToBufferConverter()
7044 Buffer(ObjectWidth, Info.Ctx.getTargetInfo().isLittleEndian()), in APValueToBufferConverter()
7084 Info.FFDiag(BCE->getBeginLoc(), in visit()
7098 const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); in visitRecord()
7116 Info.FFDiag(BCE->getBeginLoc(), in visitRecord()
7123 assert(FieldOffsetBits % Info.Ctx.getCharWidth() == 0 && in visitRecord()
7126 Info.Ctx.toCharUnitsFromBits(FieldOffsetBits) + Offset; in visitRecord()
7142 CharUnits ElemWidth = Info.Ctx.getTypeSizeInChars(CAT->getElementType()); in visitArray()
7169 VTy->isExtVectorBoolType() ? 1 : Info.Ctx.getTypeSize(EltTy); in visitVector()
7171 if ((NElts * EltSize) % Info.Ctx.getCharWidth() != 0) { in visitVector()
7176 Info.FFDiag(BCE->getBeginLoc(), in visitVector()
7179 << Info.Ctx.getCharWidth(); in visitVector()
7183 if (EltTy->isRealFloatingType() && &Info.Ctx.getFloatTypeSemantics(EltTy) == in visitVector()
7188 Info.FFDiag(BCE->getBeginLoc(), in visitVector()
7203 bool BigEndian = Info.Ctx.getTargetInfo().isBigEndian(); in visitVector()
7220 CharUnits EltSizeChars = Info.Ctx.getTypeSizeInChars(EltTy); in visitVector()
7234 Width = Info.Ctx.getTypeSize(Ty); in visitInt()
7251 convert(EvalInfo &Info, const APValue &Src, const CastExpr *BCE) { in convert() argument
7252 CharUnits DstSize = Info.Ctx.getTypeSizeInChars(BCE->getType()); in convert()
7253 APValueToBufferConverter Converter(Info, DstSize, BCE); in convert()
7262 EvalInfo &Info; member in __anonfb577fba1711::BufferToAPValueConverter
7266 BufferToAPValueConverter(EvalInfo &Info, const BitCastBuffer &Buffer, in BufferToAPValueConverter() argument
7268 : Info(Info), Buffer(Buffer), BCE(BCE) {} in BufferToAPValueConverter()
7274 Info.FFDiag(BCE->getBeginLoc(), in unsupportedType()
7281 Info.FFDiag(BCE->getBeginLoc(), in unrepresentableValue()
7290 uint64_t NullValue = Info.Ctx.getTargetNullPointerValue(QualType(T, 0)); in visit()
7296 CharUnits SizeOf = Info.Ctx.getTypeSizeInChars(T); in visit()
7303 Info.Ctx.getFloatTypeSemantics(QualType(T, 0)); in visit()
7321 Info.FFDiag(BCE->getExprLoc(), in visit()
7323 << DisplayType << Info.Ctx.getLangOpts().CharIsSigned; in visit()
7330 APSInt Val(SizeOf.getQuantity() * Info.Ctx.getCharWidth(), true); in visit()
7336 unsigned IntWidth = Info.Ctx.getIntWidth(QualType(T, 0)); in visit()
7349 Info.Ctx.getFloatTypeSemantics(QualType(T, 0)); in visit()
7358 const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); in visit()
7387 Info.FFDiag(BCE->getBeginLoc(), in visit()
7393 assert(FieldOffsetBits % Info.Ctx.getCharWidth() == 0); in visit()
7396 CharUnits::fromQuantity(FieldOffsetBits / Info.Ctx.getCharWidth()) + in visit()
7422 CharUnits ElementWidth = Info.Ctx.getTypeSizeInChars(Ty->getElementType()); in visit()
7440 VTy->isExtVectorBoolType() ? 1 : Info.Ctx.getTypeSize(EltTy); in visit()
7442 if ((NElts * EltSize) % Info.Ctx.getCharWidth() != 0) { in visit()
7447 Info.FFDiag(BCE->getBeginLoc(), in visit()
7449 << QualType(VTy, 0) << EltSize << NElts << Info.Ctx.getCharWidth(); in visit()
7453 if (EltTy->isRealFloatingType() && &Info.Ctx.getFloatTypeSemantics(EltTy) == in visit()
7458 Info.FFDiag(BCE->getBeginLoc(), in visit()
7475 bool BigEndian = Info.Ctx.getTargetInfo().isBigEndian(); in visit()
7494 CharUnits EltSizeChars = Info.Ctx.getTypeSizeInChars(EltTy); in visit()
7536 static std::optional<APValue> convert(EvalInfo &Info, BitCastBuffer &Buffer, in convert() argument
7538 BufferToAPValueConverter Converter(Info, Buffer, BCE); in convert()
7544 QualType Ty, EvalInfo *Info, in checkBitCastConstexprEligibilityType() argument
7550 if (Info) in checkBitCastConstexprEligibilityType()
7551 Info->FFDiag(Loc, diag::note_constexpr_bit_cast_invalid_type) in checkBitCastConstexprEligibilityType()
7556 if (Info) in checkBitCastConstexprEligibilityType()
7557 Info->Note(NoteLoc, diag::note_constexpr_bit_cast_invalid_subtype) in checkBitCastConstexprEligibilityType()
7574 if (!checkBitCastConstexprEligibilityType(Loc, BS.getType(), Info, Ctx, in checkBitCastConstexprEligibilityType()
7581 if (!checkBitCastConstexprEligibilityType(Loc, FD->getType(), Info, Ctx, in checkBitCastConstexprEligibilityType()
7589 Info, Ctx, CheckingDest)) in checkBitCastConstexprEligibilityType()
7595 static bool checkBitCastConstexprEligibility(EvalInfo *Info, in checkBitCastConstexprEligibility() argument
7599 BCE->getBeginLoc(), BCE->getType(), Info, Ctx, true); in checkBitCastConstexprEligibility()
7602 BCE->getSubExpr()->getType(), Info, Ctx, false); in checkBitCastConstexprEligibility()
7606 static bool handleRValueToRValueBitCast(EvalInfo &Info, APValue &DestValue, in handleRValueToRValueBitCast() argument
7609 assert(CHAR_BIT == 8 && Info.Ctx.getTargetInfo().getCharWidth() == 8 && in handleRValueToRValueBitCast()
7612 if (!checkBitCastConstexprEligibility(&Info, Info.Ctx, BCE)) in handleRValueToRValueBitCast()
7617 APValueToBufferConverter::convert(Info, SourceRValue, BCE); in handleRValueToRValueBitCast()
7623 BufferToAPValueConverter::convert(Info, *Buffer, BCE); in handleRValueToRValueBitCast()
7631 static bool handleLValueToRValueBitCast(EvalInfo &Info, APValue &DestValue, in handleLValueToRValueBitCast() argument
7634 assert(CHAR_BIT == 8 && Info.Ctx.getTargetInfo().getCharWidth() == 8 && in handleLValueToRValueBitCast()
7641 SourceLValue.setFrom(Info.Ctx, SourceValue); in handleLValueToRValueBitCast()
7643 Info, BCE, BCE->getSubExpr()->getType().withConst(), SourceLValue, in handleLValueToRValueBitCast()
7647 return handleRValueToRValueBitCast(Info, DestValue, SourceRValue, BCE); in handleLValueToRValueBitCast()
7667 assert(Info.checkingPotentialConstantExpression()); in CheckPotentialConstantConditional()
7672 SpeculativeEvaluationRAII Speculate(Info, &Diag); in CheckPotentialConstantConditional()
7679 SpeculativeEvaluationRAII Speculate(Info, &Diag); in CheckPotentialConstantConditional()
7693 if (!EvaluateAsBooleanCondition(E->getCond(), BoolResult, Info)) { in HandleConditionalOperator()
7694 if (Info.checkingPotentialConstantExpression() && Info.noteFailure()) { in HandleConditionalOperator()
7698 if (Info.noteFailure()) { in HandleConditionalOperator()
7710 EvalInfo &Info; member in __anonfb577fba1711::ExprEvaluatorBase
7715 return Info.CCEDiag(E, D); in CCEDiag()
7723 Info.Ctx.BuiltinInfo.isConstantEvaluated(BuiltinOp); in IsConstantEvaluatedBuiltinCall()
7727 ExprEvaluatorBase(EvalInfo &Info) : Info(Info) {} in ExprEvaluatorBase() argument
7729 EvalInfo &getEvalInfo() { return Info; } in getEvalInfo()
7734 Info.FFDiag(E, D) << E->getSourceRange(); in Error()
7776 TempVersionRAII RAII(*Info.CurrentCall); in VisitCXXDefaultArgExpr()
7777 SourceLocExprScopeGuard Guard(E, Info.CurrentCall->CurSourceLocExprScope); in VisitCXXDefaultArgExpr()
7781 TempVersionRAII RAII(*Info.CurrentCall); in VisitCXXDefaultInitExpr()
7785 SourceLocExprScopeGuard Guard(E, Info.CurrentCall->CurSourceLocExprScope); in VisitCXXDefaultInitExpr()
7790 FullExpressionRAII Scope(Info); in VisitExprWithCleanups()
7805 if (!Info.Ctx.getLangOpts().CPlusPlus20) in VisitCXXDynamicCastExpr()
7825 if (!HandleMemberPointerAccess(Info, E, Obj)) in VisitBinaryOperator()
7828 if (!handleLValueToRValueConversion(Info, E, E->getType(), Obj, Result)) in VisitBinaryOperator()
7843 if (!Evaluate(Info.CurrentCall->createTemporary( in VisitBinaryConditionalOperator()
7845 getStorageType(Info.Ctx, E->getOpaqueValue()), in VisitBinaryConditionalOperator()
7847 Info, E->getCommon())) in VisitBinaryConditionalOperator()
7868 if (Info.checkingPotentialConstantExpression() && IsBcpCall) in VisitConditionalOperator()
7871 FoldConstant Fold(Info, IsBcpCall); in VisitConditionalOperator()
7881 if (APValue *Value = Info.CurrentCall->getCurrentTemporary(E); in VisitOpaqueValueExpr()
7910 if (!Evaluate(Info.CurrentCall->createTemporary( in VisitPseudoObjectExpr()
7911 OVE, getStorageType(Info.Ctx, OVE), in VisitPseudoObjectExpr()
7913 Info, OVE->getSourceExpr())) in VisitPseudoObjectExpr()
7919 if (!EvaluateIgnoredValue(Info, SemE)) in VisitPseudoObjectExpr()
7935 CallScopeRAII CallScope(Info); in handleCallExpr()
7952 if (!EvaluateObjectArgument(Info, ME->getBase(), ThisVal)) in handleCallExpr()
7962 HandleMemberPointerAccess(Info, BE, ThisVal, false); in handleCallExpr()
7970 if (!Info.getLangOpts().CPlusPlus20) in handleCallExpr()
7971 Info.CCEDiag(PDE, diag::note_constexpr_pseudo_destructor); in handleCallExpr()
7972 return EvaluateObjectArgument(Info, PDE->getBase(), ThisVal) && in handleCallExpr()
7973 HandleDestruction(Info, PDE, ThisVal, PDE->getDestroyedType()); in handleCallExpr()
7979 if (!EvaluatePointer(Callee, CalleeLV, Info)) in handleCallExpr()
7985 Info.FFDiag(Callee, diag::note_constexpr_null_callee) in handleCallExpr()
7995 if (!Info.Ctx.hasSameFunctionTypeIgnoringExceptionSpec( in handleCallExpr()
8005 Call = Info.CurrentCall->createCall(FD); in handleCallExpr()
8009 if (!EvaluateArgs(HasThis ? Args.slice(1) : Args, Call, Info, FD, in handleCallExpr()
8025 if (!EvaluateObjectArgument(Info, Args[0], ThisVal)) in handleCallExpr()
8036 if (Info.getLangOpts().CPlusPlus20 && OCE && in handleCallExpr()
8038 !MaybeHandleUnionActiveMemberChange(Info, Args[0], ThisVal)) in handleCallExpr()
8080 if (!HandleOperatorNewCall(Info, E, Ptr)) in handleCallExpr()
8085 return HandleOperatorDeleteCall(Info, E) && CallScope.destroy(); in handleCallExpr()
8093 Call = Info.CurrentCall->createCall(FD); in handleCallExpr()
8094 if (!EvaluateArgs(Args, Call, Info, FD)) in handleCallExpr()
8103 FD = HandleVirtualDispatch(Info, E, *This, NamedMember, in handleCallExpr()
8111 if (!checkNonVirtualMemberCallThisPointer(Info, E, *This, NamedMember)) in handleCallExpr()
8119 return HandleDestruction(Info, E, *This, in handleCallExpr()
8120 Info.Ctx.getRecordType(DD->getParent())) && in handleCallExpr()
8127 if (!CheckConstexprFunction(Info, E->getExprLoc(), FD, Definition, Body) || in handleCallExpr()
8129 Body, Info, Result, ResultSlot)) in handleCallExpr()
8133 !HandleCovariantReturnAdjustment(Info, E, Result, in handleCallExpr()
8162 assert(!Info.Ctx.getLangOpts().CPlusPlus11 && in VisitMemberExpr()
8167 if (!Evaluate(Val, Info, E->getBase())) in VisitMemberExpr()
8186 return extractSubobject(Info, E, Obj, Designator, Result) && in VisitMemberExpr()
8192 if (!Evaluate(Val, Info, E->getBase())) in VisitExtVectorElementExpr()
8225 if (!Evaluate(AtomicVal, Info, E->getSubExpr())) in VisitCastExpr()
8236 if (!EvaluateLValue(E->getSubExpr(), LVal, Info)) in VisitCastExpr()
8240 if (!handleLValueToRValueConversion(Info, E, E->getSubExpr()->getType(), in VisitCastExpr()
8247 if (!Evaluate(SourceValue, Info, E->getSubExpr())) in VisitCastExpr()
8249 if (!handleLValueToRValueBitCast(Info, DestValue, SourceValue, E)) in VisitCastExpr()
8256 if (!Evaluate(Value, Info, E->getSubExpr())) in VisitCastExpr()
8272 if (!Info.getLangOpts().CPlusPlus14 && !Info.keepEvaluatingAfterFailure()) in VisitUnaryPostIncDec()
8276 if (!EvaluateLValue(UO->getSubExpr(), LVal, Info)) in VisitUnaryPostIncDec()
8279 if (!handleIncDec(this->Info, UO, LVal, UO->getSubExpr()->getType(), in VisitUnaryPostIncDec()
8288 llvm::SaveAndRestore NotCheckingForUB(Info.CheckingForUndefinedBehavior, in VisitStmtExpr()
8295 BlockScopeRAII Scope(Info); in VisitStmtExpr()
8302 Info.FFDiag((*BI)->getBeginLoc(), in VisitStmtExpr()
8311 EvalStmtResult ESR = EvaluateStmt(Result, Info, *BI); in VisitStmtExpr()
8317 Info.FFDiag((*BI)->getBeginLoc(), in VisitStmtExpr()
8332 EvaluateIgnoredValue(Info, E); in VisitIgnoredValue()
8339 if (Info.getLangOpts().MSVCCompat && !E->HasSideEffects(Info.Ctx)) in VisitIgnoredBaseExpression()
8366 return EvaluatePointer(E, Result, this->Info, InvalidBaseOK); in evaluatePointer()
8370 LValueExprEvaluatorBase(EvalInfo &Info, LValue &Result, bool InvalidBaseOK) in LValueExprEvaluatorBase() argument
8371 : ExprEvaluatorBaseTy(Info), Result(Result), in LValueExprEvaluatorBase()
8375 Result.setFrom(this->Info.Ctx, V); in Success()
8388 EvalOK = EvaluateTemporary(E->getBase(), Result, this->Info); in VisitMemberExpr()
8406 if (!HandleLValueMember(this->Info, E, Result, FD)) in VisitMemberExpr()
8409 if (!HandleLValueIndirectMember(this->Info, E, Result, IFD)) in VisitMemberExpr()
8416 if (!handleLValueToRValueConversion(this->Info, E, MD->getType(), Result, in VisitMemberExpr()
8431 return HandleMemberPointerAccess(this->Info, E, Result); in VisitBinaryOperator()
8447 return HandleLValueBasePath(this->Info, E, E->getSubExpr()->getType(), in VisitCastExpr()
8491 LValueExprEvaluator(EvalInfo &Info, LValue &Result, bool InvalidBaseOK) : in LValueExprEvaluator() argument
8492 LValueExprEvaluatorBaseTy(Info, Result, InvalidBaseOK) {} in LValueExprEvaluator()
8527 << 2 << Info.Ctx.getLangOpts().CPlusPlus; in VisitCastExpr()
8536 return HandleBaseToDerivedCast(Info, E, Result); in VisitCastExpr()
8541 return HandleDynamicCast(Info, cast<ExplicitCastExpr>(E), Result); in VisitCastExpr()
8548 static bool HandleLambdaCapture(EvalInfo &Info, const Expr *E, LValue &Result, in HandleLambdaCapture() argument
8554 assert(Info.CurrentCall->This == nullptr && in HandleLambdaCapture()
8564 APValue *RefValue = Info.getParamSlot(Info.CurrentCall->Arguments, Self); in HandleLambdaCapture()
8565 Result.setFrom(Info.Ctx, *RefValue); in HandleLambdaCapture()
8567 const ParmVarDecl *VD = Info.CurrentCall->Arguments.getOrigParam(Self); in HandleLambdaCapture()
8569 Info.getCallFrameAndDepth(Info.CurrentCall->Arguments.CallIndex) in HandleLambdaCapture()
8571 unsigned Version = Info.CurrentCall->Arguments.Version; in HandleLambdaCapture()
8575 Result = *Info.CurrentCall->This; in HandleLambdaCapture()
8579 if (!HandleLValueMember(Info, E, Result, FD)) in HandleLambdaCapture()
8587 if (!handleLValueToRValueConversion(Info, E, FD->getType(), Result, RVal)) in HandleLambdaCapture()
8589 Result.setFrom(Info.Ctx, RVal); in HandleLambdaCapture()
8599 static bool EvaluateLValue(const Expr *E, LValue &Result, EvalInfo &Info, in EvaluateLValue() argument
8604 return LValueExprEvaluator(Info, Result, InvalidBaseOK).Visit(E); in EvaluateLValue()
8626 if (Info.CurrentCall && isLambdaCallOperator(Info.CurrentCall->Callee) && in VisitVarDecl()
8633 if (Info.checkingPotentialConstantExpression()) in VisitVarDecl()
8636 if (auto *FD = Info.CurrentCall->LambdaCaptureFields.lookup(VD)) { in VisitVarDecl()
8637 const auto *MD = cast<CXXMethodDecl>(Info.CurrentCall->Callee); in VisitVarDecl()
8638 return HandleLambdaCapture(Info, E, Result, MD, FD, in VisitVarDecl()
8652 CallStackFrame *CurrFrame = Info.CurrentCall; in VisitVarDecl()
8661 Info.getCallFrameAndDepth(CurrFrame->Arguments.CallIndex).first; in VisitVarDecl()
8679 if (!Info.getLangOpts().CPlusPlus11) { in VisitVarDecl()
8680 Info.CCEDiag(E, diag::note_constexpr_ltor_non_integral, 1) in VisitVarDecl()
8682 Info.Note(VD->getLocation(), diag::note_declared_at); in VisitVarDecl()
8686 if (!evaluateVarDeclInit(Info, E, VD, Frame, Version, V)) in VisitVarDecl()
8691 if (!Info.checkingPotentialConstantExpression()) in VisitVarDecl()
8692 Info.FFDiag(E, diag::note_constexpr_use_uninit_reference); in VisitVarDecl()
8728 if (!EvaluateIgnoredValue(Info, E)) in VisitMaterializeTemporaryExpr()
8736 if (Info.EvalMode == EvalInfo::EM_ConstantFold) in VisitMaterializeTemporaryExpr()
8743 Value = &Info.CurrentCall->createTemporary( in VisitMaterializeTemporaryExpr()
8753 if (!EvaluateInPlace(*Value, Info, Result, Inner)) { in VisitMaterializeTemporaryExpr()
8763 if (!HandleLValueBasePath(Info, Adjustments[I].DerivedToBase.BasePath, in VisitMaterializeTemporaryExpr()
8770 if (!HandleLValueMember(Info, E, Result, Adjustments[I].Field)) in VisitMaterializeTemporaryExpr()
8776 if (!HandleMemberPointerAccess(this->Info, Type, Result, in VisitMaterializeTemporaryExpr()
8789 assert((!Info.getLangOpts().CPlusPlus || E->isFileScope()) && in VisitCompoundLiteralExpr()
8801 TypeInfo = TypeInfoLValue(E->getTypeOperand(Info.Ctx).getTypePtr()); in VisitCXXTypeidExpr()
8805 if (!Info.Ctx.getLangOpts().CPlusPlus20) { in VisitCXXTypeidExpr()
8806 Info.CCEDiag(E, diag::note_constexpr_typeid_polymorphic) in VisitCXXTypeidExpr()
8815 ComputeDynamicType(Info, E, Result, AK_TypeId); in VisitCXXTypeidExpr()
8820 TypeInfoLValue(Info.Ctx.getRecordType(DynType->Type).getTypePtr()); in VisitCXXTypeidExpr()
8862 : !EvaluateInteger(SubExpr, Index, Info)) { in VisitArraySubscriptExpr()
8863 if (!Info.noteFailure()) in VisitArraySubscriptExpr()
8870 HandleLValueArrayAdjustment(Info, E, Result, E->getType(), Index); in VisitArraySubscriptExpr()
8882 HandleLValueComplexElement(Info, E, Result, E->getType(), false); in VisitUnaryReal()
8891 HandleLValueComplexElement(Info, E, Result, E->getType(), true); in VisitUnaryImag()
8896 if (!Info.getLangOpts().CPlusPlus14 && !Info.keepEvaluatingAfterFailure()) in VisitUnaryPreIncDec()
8903 this->Info, UO, Result, UO->getSubExpr()->getType(), in VisitUnaryPreIncDec()
8909 if (!Info.getLangOpts().CPlusPlus14 && !Info.keepEvaluatingAfterFailure()) in VisitCompoundAssignOperator()
8916 if (!Evaluate(RHS, this->Info, CAO->getRHS())) { in VisitCompoundAssignOperator()
8917 if (!Info.noteFailure()) in VisitCompoundAssignOperator()
8927 this->Info, CAO, in VisitCompoundAssignOperator()
8933 if (!Info.getLangOpts().CPlusPlus14 && !Info.keepEvaluatingAfterFailure()) in VisitBinAssign()
8940 if (!Evaluate(NewVal, this->Info, E->getRHS())) { in VisitBinAssign()
8941 if (!Info.noteFailure()) in VisitBinAssign()
8949 if (Info.getLangOpts().CPlusPlus20 && in VisitBinAssign()
8950 !MaybeHandleUnionActiveMemberChange(Info, E->getLHS(), Result)) in VisitBinAssign()
8953 return handleAssignment(this->Info, E, Result, E->getLHS()->getType(), in VisitBinAssign()
9028 static bool evaluateLValueAsAllocSize(EvalInfo &Info, APValue::LValueBase Base, in evaluateLValueAsAllocSize() argument
9056 Result.addUnsizedArray(Info, E, Pointee); in evaluateLValueAsAllocSize()
9072 return EvaluateLValue(E, Result, Info, InvalidBaseOK); in evaluateLValue()
9076 return EvaluatePointer(E, Result, Info, InvalidBaseOK); in evaluatePointer()
9087 Result.setFrom(Info.Ctx, V); in Success()
9091 Result.setNull(Info.Ctx, E->getType()); in ZeroInitialization()
9103 if (Info.noteFailure()) in VisitObjCBoxedExpr()
9104 EvaluateIgnoredValue(Info, E->getSubExpr()); in VisitObjCBoxedExpr()
9118 if (Info.getLangOpts().CPlusPlus11) in VisitCXXThisExpr()
9119 Info.FFDiag(E, diag::note_constexpr_this) << E->isImplicit(); in VisitCXXThisExpr()
9121 Info.FFDiag(E); in VisitCXXThisExpr()
9125 if (Info.checkingPotentialConstantExpression()) in VisitCXXThisExpr()
9129 isLambdaCallWithExplicitObjectParameter(Info.CurrentCall->Callee); in VisitCXXThisExpr()
9131 if (!Info.CurrentCall->This) { in VisitCXXThisExpr()
9136 Result = *Info.CurrentCall->This; in VisitCXXThisExpr()
9139 if (isLambdaCallOperator(Info.CurrentCall->Callee)) { in VisitCXXThisExpr()
9144 if (!Info.CurrentCall->LambdaThisCaptureField) { in VisitCXXThisExpr()
9145 if (IsExplicitLambda && !Info.CurrentCall->This) { in VisitCXXThisExpr()
9153 const auto *MD = cast<CXXMethodDecl>(Info.CurrentCall->Callee); in VisitCXXThisExpr()
9155 Info, E, Result, MD, Info.CurrentCall->LambdaThisCaptureField, in VisitCXXThisExpr()
9156 Info.CurrentCall->LambdaThisCaptureField->getType()->isPointerType()); in VisitCXXThisExpr()
9166 Info.Ctx, Info.CurrentCall->CurSourceLocExprScope.getDefaultExpr()); in VisitSourceLocExpr()
9167 Result.setFrom(Info.Ctx, LValResult); in VisitSourceLocExpr()
9177 std::string ResultStr = E->ComputeName(Info.Ctx); in VisitSYCLUniqueStableNameExpr()
9179 QualType CharTy = Info.Ctx.CharTy.withConst(); in VisitSYCLUniqueStableNameExpr()
9180 APInt Size(Info.Ctx.getTypeSize(Info.Ctx.getSizeType()), in VisitSYCLUniqueStableNameExpr()
9182 QualType ArrayTy = Info.Ctx.getConstantArrayType( in VisitSYCLUniqueStableNameExpr()
9186 StringLiteral::Create(Info.Ctx, ResultStr, StringLiteralKind::Ordinary, in VisitSYCLUniqueStableNameExpr()
9190 Result.addArray(Info, E, cast<ConstantArrayType>(ArrayTy)); in VisitSYCLUniqueStableNameExpr()
9198 static bool EvaluatePointer(const Expr* E, LValue& Result, EvalInfo &Info, in EvaluatePointer() argument
9202 return PointerExprEvaluator(Info, Result, InvalidBaseOK).Visit(E); in EvaluatePointer()
9216 if (!EvalPtrOK && !Info.noteFailure()) in VisitBinaryOperator()
9220 if (!EvaluateInteger(IExp, Offset, Info) || !EvalPtrOK) in VisitBinaryOperator()
9227 return HandleLValueArrayAdjustment(Info, E, Result, Pointee, Offset); in VisitBinaryOperator()
9274 Info.Ctx.hasSimilarType(Result.Designator.getType(Info.Ctx), in VisitCastExpr()
9284 (Info.getStdAllocatorCaller("allocate") || in VisitCastExpr()
9285 IsDeclSourceLocationCurrent(Info.CurrentCall->Callee) || in VisitCastExpr()
9286 Info.getLangOpts().CPlusPlus26)) { in VisitCastExpr()
9290 Info.getLangOpts().CPlusPlus) { in VisitCastExpr()
9293 << SubExpr->getType() << Info.getLangOpts().CPlusPlus26 in VisitCastExpr()
9294 << Result.Designator.getType(Info.Ctx).getCanonicalType() in VisitCastExpr()
9301 << 2 << Info.Ctx.getLangOpts().CPlusPlus; in VisitCastExpr()
9318 return HandleLValueBasePath(Info, E, E->getSubExpr()->getType()-> in VisitCastExpr()
9327 return HandleBaseToDerivedCast(Info, E, Result); in VisitCastExpr()
9332 return HandleDynamicCast(Info, cast<ExplicitCastExpr>(E), Result); in VisitCastExpr()
9340 << 2 << Info.Ctx.getLangOpts().CPlusPlus; in VisitCastExpr()
9343 if (!EvaluateIntegerOrLValue(SubExpr, Value, Info)) in VisitCastExpr()
9347 unsigned Size = Info.Ctx.getTypeSize(E->getType()); in VisitCastExpr()
9364 Result.setFrom(Info.Ctx, Value); in VisitCastExpr()
9374 APValue &Value = Info.CurrentCall->createTemporary( in VisitCastExpr()
9376 if (!EvaluateInPlace(Value, Info, Result, SubExpr)) in VisitCastExpr()
9380 auto *AT = Info.Ctx.getAsArrayType(SubExpr->getType()); in VisitCastExpr()
9382 Result.addArray(Info, E, CAT); in VisitCastExpr()
9384 Result.addUnsizedArray(Info, E, AT->getElementType()); in VisitCastExpr()
9398 if (!handleLValueToRValueConversion(Info, E, E->getSubExpr()->getType(), in VisitCastExpr()
9401 evaluateLValueAsAllocSize(Info, LVal.Base, Result); in VisitCastExpr()
9409 static CharUnits GetAlignOfType(EvalInfo &Info, QualType T, in GetAlignOfType() argument
9420 Info.Ctx.getLangOpts().getClangABICompat() <= LangOptions::ClangABI::Ver7; in GetAlignOfType()
9426 return Info.Ctx.toCharUnitsFromBits( in GetAlignOfType()
9427 Info.Ctx.getPreferredTypeAlign(T.getTypePtr())); in GetAlignOfType()
9430 return Info.Ctx.getTypeAlignInChars(T.getTypePtr()); in GetAlignOfType()
9435 static CharUnits GetAlignOfExpr(EvalInfo &Info, const Expr *E, in GetAlignOfExpr() argument
9446 return Info.Ctx.getDeclAlign(DRE->getDecl(), in GetAlignOfExpr()
9450 return Info.Ctx.getDeclAlign(ME->getMemberDecl(), in GetAlignOfExpr()
9453 return GetAlignOfType(Info, E->getType(), ExprKind); in GetAlignOfExpr()
9456 static CharUnits getBaseAlignment(EvalInfo &Info, const LValue &Value) { in getBaseAlignment() argument
9458 return Info.Ctx.getDeclAlign(VD); in getBaseAlignment()
9460 return GetAlignOfExpr(Info, E, UETT_AlignOf); in getBaseAlignment()
9461 return GetAlignOfType(Info, Value.Base.getTypeInfoType(), UETT_AlignOf); in getBaseAlignment()
9467 EvalInfo &Info, APSInt &Alignment) { in getAlignmentArgument() argument
9468 if (!EvaluateInteger(E, Alignment, Info)) in getAlignmentArgument()
9471 Info.FFDiag(E, diag::note_constexpr_invalid_alignment) << Alignment; in getAlignmentArgument()
9474 unsigned SrcWidth = Info.Ctx.getIntWidth(ForType); in getAlignmentArgument()
9477 Info.FFDiag(E, diag::note_constexpr_alignment_too_big) in getAlignmentArgument()
9502 Result.addUnsizedArray(Info, E, PointeeTy); in visitNonBuiltinCallExpr()
9537 if (!getAlignmentArgument(E->getArg(1), E->getArg(0)->getType(), Info, in VisitBuiltinCallExpr()
9544 if (!EvaluateInteger(E->getArg(2), Offset, Info)) in VisitBuiltinCallExpr()
9553 CharUnits BaseAlignment = getBaseAlignment(Info, OffsetResult); in VisitBuiltinCallExpr()
9587 if (!getAlignmentArgument(E->getArg(1), E->getArg(0)->getType(), Info, in VisitBuiltinCallExpr()
9590 CharUnits BaseAlignment = getBaseAlignment(Info, Result); in VisitBuiltinCallExpr()
9615 Info.FFDiag(E->getArg(0), diag::note_constexpr_alignment_adjust) in VisitBuiltinCallExpr()
9620 return HandleOperatorNewCall(Info, E, Result); in VisitBuiltinCallExpr()
9627 if (Info.getLangOpts().CPlusPlus11) in VisitBuiltinCallExpr()
9628 Info.CCEDiag(E, diag::note_constexpr_invalid_function) in VisitBuiltinCallExpr()
9630 << ("'" + Info.Ctx.BuiltinInfo.getName(BuiltinOp) + "'").str(); in VisitBuiltinCallExpr()
9632 Info.CCEDiag(E, diag::note_invalid_subexpr_in_const_expr); in VisitBuiltinCallExpr()
9642 if (!EvaluateInteger(E->getArg(1), Desired, Info)) in VisitBuiltinCallExpr()
9650 if (!EvaluateInteger(E->getArg(2), N, Info)) in VisitBuiltinCallExpr()
9657 if (!Result.checkNullPointerForFoldAccess(Info, E, AK_Read) || in VisitBuiltinCallExpr()
9660 QualType CharTy = Result.Designator.getType(Info.Ctx); in VisitBuiltinCallExpr()
9664 Info.Ctx.hasSameUnqualifiedType( in VisitBuiltinCallExpr()
9668 Info.FFDiag(E, diag::note_constexpr_ltor_incomplete_type) << CharTy; in VisitBuiltinCallExpr()
9674 Info.FFDiag(E, diag::note_constexpr_memchr_unsupported) in VisitBuiltinCallExpr()
9675 << ("'" + Info.Ctx.BuiltinInfo.getName(BuiltinOp) + "'").str() in VisitBuiltinCallExpr()
9688 if (!APSInt::isSameValue(HandleIntToIntCast(Info, E, CharTy, in VisitBuiltinCallExpr()
9701 DesiredVal = Desired.trunc(Info.Ctx.getCharWidth()).getZExtValue(); in VisitBuiltinCallExpr()
9717 if (!handleLValueToRValueConversion(Info, E, CharTy, Result, Char) || in VisitBuiltinCallExpr()
9724 if (!HandleLValueArrayAdjustment(Info, E, Result, CharTy, 1)) in VisitBuiltinCallExpr()
9735 if (Info.getLangOpts().CPlusPlus11) in VisitBuiltinCallExpr()
9736 Info.CCEDiag(E, diag::note_constexpr_invalid_function) in VisitBuiltinCallExpr()
9738 << ("'" + Info.Ctx.BuiltinInfo.getName(BuiltinOp) + "'").str(); in VisitBuiltinCallExpr()
9740 Info.CCEDiag(E, diag::note_invalid_subexpr_in_const_expr); in VisitBuiltinCallExpr()
9761 if (!EvaluatePointer(E->getArg(1), Src, Info)) in VisitBuiltinCallExpr()
9765 if (!EvaluateInteger(E->getArg(2), N, Info)) in VisitBuiltinCallExpr()
9780 Info.FFDiag(E, diag::note_constexpr_memcpy_null) in VisitBuiltinCallExpr()
9782 << Val.getAsString(Info.Ctx, E->getArg(0)->getType()); in VisitBuiltinCallExpr()
9791 QualType T = Dest.Designator.getType(Info.Ctx); in VisitBuiltinCallExpr()
9792 QualType SrcT = Src.Designator.getType(Info.Ctx); in VisitBuiltinCallExpr()
9793 if (!Info.Ctx.hasSameUnqualifiedType(T, SrcT)) { in VisitBuiltinCallExpr()
9795 Info.FFDiag(E, diag::note_constexpr_memcpy_type_pun) << Move << SrcT << T; in VisitBuiltinCallExpr()
9799 Info.FFDiag(E, diag::note_constexpr_memcpy_incomplete_type) << Move << T; in VisitBuiltinCallExpr()
9802 if (!T.isTriviallyCopyableType(Info.Ctx)) { in VisitBuiltinCallExpr()
9803 Info.FFDiag(E, diag::note_constexpr_memcpy_nontrivial) << Move << T; in VisitBuiltinCallExpr()
9808 uint64_t TSize = Info.Ctx.getTypeSizeInChars(T).getQuantity(); in VisitBuiltinCallExpr()
9816 Info.FFDiag(E, diag::note_constexpr_memcpy_unsupported) in VisitBuiltinCallExpr()
9829 Info.FFDiag(E, diag::note_constexpr_memcpy_unsupported) in VisitBuiltinCallExpr()
9845 Info.FFDiag(E, diag::note_constexpr_memcpy_overlap) << WChar; in VisitBuiltinCallExpr()
9849 if (!HandleLValueArrayAdjustment(Info, E, Src, T, NElems - 1) || in VisitBuiltinCallExpr()
9850 !HandleLValueArrayAdjustment(Info, E, Dest, T, NElems - 1)) in VisitBuiltinCallExpr()
9856 Info.FFDiag(E, diag::note_constexpr_memcpy_overlap) << WChar; in VisitBuiltinCallExpr()
9865 if (!handleLValueToRValueConversion(Info, E, T, Src, Val) || in VisitBuiltinCallExpr()
9866 !handleAssignment(Info, E, Dest, T, Val)) in VisitBuiltinCallExpr()
9872 if (!HandleLValueArrayAdjustment(Info, E, Src, T, Direction) || in VisitBuiltinCallExpr()
9873 !HandleLValueArrayAdjustment(Info, E, Dest, T, Direction)) in VisitBuiltinCallExpr()
9883 static bool EvaluateArrayNewInitList(EvalInfo &Info, LValue &This,
9886 static bool EvaluateArrayNewConstructExpr(EvalInfo &Info, LValue &This,
9892 if (!Info.getLangOpts().CPlusPlus20) in VisitCXXNewExpr()
9893 Info.CCEDiag(E, diag::note_constexpr_new); in VisitCXXNewExpr()
9896 if (Info.SpeculativeEvaluationDepth) in VisitCXXNewExpr()
9904 Info.CurrentCall->isStdFunction() && !E->isArray()) { in VisitCXXNewExpr()
9907 if (!EvaluatePointer(E->getPlacementArg(0), Result, Info)) in VisitCXXNewExpr()
9913 Info.FFDiag(E, diag::note_constexpr_new_non_replaceable) in VisitCXXNewExpr()
9932 if (!EvaluateLValue(E->getPlacementArg(0), Nothrow, Info)) in VisitCXXNewExpr()
9952 if (!EvaluateInteger(Stripped, ArrayBound, Info)) in VisitCXXNewExpr()
9963 Info.FFDiag(*ArraySize, diag::note_constexpr_new_negative) in VisitCXXNewExpr()
9970 if (!Info.CheckArraySize(ArraySize.value()->getExprLoc(), in VisitCXXNewExpr()
9972 Info.Ctx, AllocType, ArrayBound), in VisitCXXNewExpr()
9990 auto *CAT = Info.Ctx.getAsConstantArrayType(Init->getType()); in VisitCXXNewExpr()
10001 Info.FFDiag(*ArraySize, diag::note_constexpr_new_too_small) in VisitCXXNewExpr()
10014 AllocType = Info.Ctx.getConstantArrayType(AllocType, ArrayBound, nullptr, in VisitCXXNewExpr()
10025 EvalInfo &Info; in VisitCXXNewExpr() member
10036 if (!Info.Ctx.hasSameUnqualifiedType(SubobjType, AllocType)) { in VisitCXXNewExpr()
10037 Info.FFDiag(E, diag::note_constexpr_placement_new_wrong_type) << in VisitCXXNewExpr()
10045 Info.FFDiag(E, diag::note_constexpr_construct_complex_elem); in VisitCXXNewExpr()
10049 Info.FFDiag(E, diag::note_constexpr_construct_complex_elem); in VisitCXXNewExpr()
10052 } Handler = {Info, E, AllocType, AK, nullptr}; in VisitCXXNewExpr()
10054 CompleteObject Obj = findCompleteObject(Info, E, AK, Result, AllocType); in VisitCXXNewExpr()
10055 if (!Obj || !findSubobject(Info, E, Obj, Result.Designator, Handler)) in VisitCXXNewExpr()
10067 Val = Info.createHeapAlloc(E, AllocType, Result); in VisitCXXNewExpr()
10074 if (!EvaluateInPlace(*Val, Info, Result, &VIE)) in VisitCXXNewExpr()
10077 if (!EvaluateArrayNewInitList(Info, Result, *Val, ResizedArrayILE, in VisitCXXNewExpr()
10081 if (!EvaluateArrayNewConstructExpr(Info, Result, *Val, ResizedArrayCCE, in VisitCXXNewExpr()
10085 if (!EvaluateInPlace(*Val, Info, Result, Init)) in VisitCXXNewExpr()
10094 Result.addArray(Info, E, cast<ConstantArrayType>(AT)); in VisitCXXNewExpr()
10113 MemberPointerExprEvaluator(EvalInfo &Info, MemberPtr &Result) in MemberPointerExprEvaluator() argument
10114 : ExprEvaluatorBaseTy(Info), Result(Result) {} in MemberPointerExprEvaluator()
10130 EvalInfo &Info) { in EvaluateMemberPointer() argument
10133 return MemberPointerExprEvaluator(Info, Result).Visit(E); in EvaluateMemberPointer()
10236 static bool HandleClassZeroInitialization(EvalInfo &Info, const Expr *E, in HandleClassZeroInitialization() argument
10245 const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); in HandleClassZeroInitialization()
10253 if (!HandleLValueDirectBase(Info, E, Subobject, CD, Base, &Layout)) in HandleClassZeroInitialization()
10255 if (!HandleClassZeroInitialization(Info, E, Base, Subobject, in HandleClassZeroInitialization()
10267 if (!HandleLValueMember(Info, E, Subobject, I, &Layout)) in HandleClassZeroInitialization()
10272 Result.getStructField(I->getFieldIndex()), Info, Subobject, &VIE)) in HandleClassZeroInitialization()
10294 if (!HandleLValueMember(Info, E, Subobject, *I)) in ZeroInitialization()
10298 return EvaluateInPlace(Result.getUnionValue(), Info, Subobject, &VIE); in ZeroInitialization()
10302 Info.FFDiag(E, diag::note_constexpr_virtual_base) << RD; in ZeroInitialization()
10306 return HandleClassZeroInitialization(Info, E, RD, This, Result); in ZeroInitialization()
10320 if (!Evaluate(DerivedObject, Info, E->getSubExpr())) in VisitCastExpr()
10352 const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); in VisitCXXParenListOrInitListExpr()
10356 Info, in VisitCXXParenListOrInitListExpr()
10384 if (!HandleLValueMember(Info, InitExpr, Subobject, Field, &Layout)) in VisitCXXParenListOrInitListExpr()
10388 ThisOverrideRAII ThisOverride(*Info.CurrentCall, &This, in VisitCXXParenListOrInitListExpr()
10391 if (EvaluateInPlace(Result.getUnionValue(), Info, Subobject, InitExpr)) { in VisitCXXParenListOrInitListExpr()
10393 return truncateBitfieldValue(Info, InitExpr, Result.getUnionValue(), in VisitCXXParenListOrInitListExpr()
10414 if (!HandleLValueBase(Info, Init, Subobject, CXXRD, &Base)) in VisitCXXParenListOrInitListExpr()
10418 if (!EvaluateInPlace(FieldVal, Info, Subobject, Init)) { in VisitCXXParenListOrInitListExpr()
10419 if (!Info.noteFailure()) in VisitCXXParenListOrInitListExpr()
10442 if (!HandleLValueMember(Info, HaveInit ? Args[ElementNo] : ExprToVisit, in VisitCXXParenListOrInitListExpr()
10448 ImplicitValueInitExpr VIE(HaveInit ? Info.Ctx.IntTy : Field->getType()); in VisitCXXParenListOrInitListExpr()
10452 if (auto *CAT = Info.Ctx.getAsConstantArrayType(Init->getType())) { in VisitCXXParenListOrInitListExpr()
10456 Info.FFDiag(Init, diag::note_constexpr_unsupported_flexible_array); in VisitCXXParenListOrInitListExpr()
10463 ThisOverrideRAII ThisOverride(*Info.CurrentCall, &This, in VisitCXXParenListOrInitListExpr()
10467 if (!EvaluateInPlace(FieldVal, Info, Subobject, Init) || in VisitCXXParenListOrInitListExpr()
10468 (Field->isBitField() && !truncateBitfieldValue(Info, Init, in VisitCXXParenListOrInitListExpr()
10470 if (!Info.noteFailure()) in VisitCXXParenListOrInitListExpr()
10489 if (CheckTrivialDefaultConstructor(Info, E->getExprLoc(), FD, ZeroInit)) { in VisitCXXConstructExpr()
10503 if (!CheckConstexprFunction(Info, E->getExprLoc(), FD, Definition, Body)) in VisitCXXConstructExpr()
10514 assert(SrcObj->isTemporaryObject(Info.Ctx, FD->getParent())); in VisitCXXConstructExpr()
10515 assert(Info.Ctx.hasSameUnqualifiedType(E->getType(), SrcObj->getType())); in VisitCXXConstructExpr()
10526 cast<CXXConstructorDecl>(Definition), Info, in VisitCXXConstructExpr()
10532 if (!Info.CurrentCall) { in VisitCXXInheritedCtorInitExpr()
10533 assert(Info.checkingPotentialConstantExpression()); in VisitCXXInheritedCtorInitExpr()
10544 if (!CheckConstexprFunction(Info, E->getExprLoc(), FD, Definition, Body)) in VisitCXXInheritedCtorInitExpr()
10547 return HandleConstructorCall(E, This, Info.CurrentCall->Arguments, in VisitCXXInheritedCtorInitExpr()
10548 cast<CXXConstructorDecl>(Definition), Info, in VisitCXXInheritedCtorInitExpr()
10555 Info.Ctx.getAsConstantArrayType(E->getSubExpr()->getType()); in VisitCXXStdInitializerListExpr()
10558 if (!EvaluateLValue(E->getSubExpr(), Array, Info)) in VisitCXXStdInitializerListExpr()
10564 Array.addArray(Info, E, ArrayType); in VisitCXXStdInitializerListExpr()
10573 Info.Ctx.hasSameType(Field->getType()->getPointeeType(), in VisitCXXStdInitializerListExpr()
10580 if (Info.Ctx.hasSameType(Field->getType(), Info.Ctx.getSizeType())) { in VisitCXXStdInitializerListExpr()
10585 assert(Info.Ctx.hasSameType(Field->getType()->getPointeeType(), in VisitCXXStdInitializerListExpr()
10588 if (!HandleLValueArrayAdjustment(Info, E, Array, in VisitCXXStdInitializerListExpr()
10619 const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(ClosureClass); in VisitLambdaExpr()
10632 if (!HandleLValueMember(Info, E, Subobject, Field, &Layout)) in VisitLambdaExpr()
10636 if (!EvaluateInPlace(FieldVal, Info, Subobject, CurFieldInit)) { in VisitLambdaExpr()
10637 if (!Info.keepEvaluatingAfterFailure()) in VisitLambdaExpr()
10646 APValue &Result, EvalInfo &Info) { in EvaluateRecord() argument
10650 return RecordExprEvaluator(Info, This, Result).Visit(E); in EvaluateRecord()
10664 TemporaryExprEvaluator(EvalInfo &Info, LValue &Result) : in TemporaryExprEvaluator() argument
10665 LValueExprEvaluatorBaseTy(Info, Result, false) {} in TemporaryExprEvaluator()
10669 APValue &Value = Info.CurrentCall->createTemporary( in VisitConstructExpr()
10671 return EvaluateInPlace(Value, Info, Result, E); in VisitConstructExpr()
10702 static bool EvaluateTemporary(const Expr *E, LValue &Result, EvalInfo &Info) { in EvaluateTemporary() argument
10705 return TemporaryExprEvaluator(Info, Result).Visit(E); in EvaluateTemporary()
10749 static bool EvaluateVector(const Expr* E, APValue& Result, EvalInfo &Info) { in EvaluateVector() argument
10752 return VectorExprEvaluator(Info, Result).Visit(E); in EvaluateVector()
10767 if (!EvaluateInteger(SE, IntResult, Info)) in VisitCastExpr()
10772 if (!EvaluateFloat(SE, FloatResult, Info)) in VisitCastExpr()
10785 if (!Evaluate(SVal, Info, SE)) in VisitCastExpr()
10791 Info.FFDiag(E, diag::note_constexpr_invalid_cast) in VisitCastExpr()
10792 << 2 << Info.Ctx.getLangOpts().CPlusPlus; in VisitCastExpr()
10796 if (!handleRValueToRValueBitCast(Info, Result, SVal, E)) in VisitCastExpr()
10825 if (!EvaluateVector(E->getInit(CountInits), v, Info)) in VisitInitListExpr()
10834 if (!EvaluateInteger(E->getInit(CountInits), sInt, Info)) in VisitInitListExpr()
10837 sInt = Info.Ctx.MakeIntValue(0, EltTy); in VisitInitListExpr()
10843 if (!EvaluateFloat(E->getInit(CountInits), f, Info)) in VisitInitListExpr()
10846 f = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy)); in VisitInitListExpr()
10861 ZeroElement = APValue(Info.Ctx.MakeIntValue(0, EltTy)); in ZeroInitialization()
10864 APValue(APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy))); in ZeroInitialization()
10898 bool LHSOK = Evaluate(LHSValue, Info, LHS); in VisitBinaryOperator()
10899 if (!LHSOK && !Info.noteFailure()) in VisitBinaryOperator()
10901 if (!Evaluate(RHSValue, Info, RHS) || !LHSOK) in VisitBinaryOperator()
10904 if (!handleVectorVectorBinOp(Info, E, Op, LHSValue, RHSValue)) in VisitBinaryOperator()
10970 if (!Evaluate(SubExprValue, Info, SubExpr)) in VisitUnaryOperator()
10988 Info.Ctx, ResultEltTy, Op, SubExprValue.getVectorElt(EltNum)); in VisitUnaryOperator()
10996 static bool handleVectorElementCast(EvalInfo &Info, const FPOptions FPO, in handleVectorElementCast() argument
11003 return HandleIntToFloatCast(Info, E, FPO, SourceTy, Original.getInt(), in handleVectorElementCast()
11008 HandleIntToIntCast(Info, E, DestTy, SourceTy, Original.getInt())); in handleVectorElementCast()
11014 return HandleFloatToFloatCast(Info, E, SourceTy, DestTy, in handleVectorElementCast()
11019 return HandleFloatToIntCast(Info, E, SourceTy, Original.getFloat(), in handleVectorElementCast()
11024 Info.FFDiag(E, diag::err_convertvector_constexpr_unsupported_vector_cast) in handleVectorElementCast()
11032 if (!EvaluateAsRValue(Info, E->getSrcExpr(), Source)) in VisitConvertVectorExpr()
11038 const FPOptions FPO = E->getFPFeaturesInEffect(Info.Ctx.getLangOpts()); in VisitConvertVectorExpr()
11045 if (!handleVectorElementCast(Info, FPO, E, SourceTy, DestTy, in VisitConvertVectorExpr()
11054 static bool handleVectorShuffle(EvalInfo &Info, const ShuffleVectorExpr *E, in handleVectorShuffle() argument
11061 APSInt IndexVal = E->getShuffleMaskIdx(Info.Ctx, EltNum); in handleVectorShuffle()
11068 Info.FFDiag( in handleVectorShuffle()
11088 if (!EvaluateAsRValue(Info, Vec1, VecVal1)) in VisitShuffleVectorExpr()
11092 if (!EvaluateAsRValue(Info, Vec2, VecVal2)) in VisitShuffleVectorExpr()
11104 if (!handleVectorShuffle(Info, E, DestElTy, VecVal1, VecVal2, EltNum, Elt)) in VisitShuffleVectorExpr()
11123 ArrayExprEvaluator(EvalInfo &Info, const LValue &This, APValue &Result) in ArrayExprEvaluator() argument
11124 : ExprEvaluatorBaseTy(Info), This(This), Result(Result) {} in ArrayExprEvaluator()
11134 Info.Ctx.getAsConstantArrayType(E->getType()); in ZeroInitialization()
11153 Subobject.addArray(Info, E, CAT); in ZeroInitialization()
11155 return EvaluateInPlace(Result.getArrayFiller(), Info, Subobject, &VIE); in ZeroInitialization()
11170 expandStringLiteral(Info, E, Result, AllocType); in VisitStringLiteral()
11182 APValue &Result, EvalInfo &Info) { in EvaluateArray() argument
11186 return ArrayExprEvaluator(Info, This, Result).Visit(E); in EvaluateArray()
11189 static bool EvaluateArrayNewInitList(EvalInfo &Info, LValue &This, in EvaluateArrayNewInitList() argument
11195 return ArrayExprEvaluator(Info, This, Result) in EvaluateArrayNewInitList()
11199 static bool EvaluateArrayNewConstructExpr(EvalInfo &Info, LValue &This, in EvaluateArrayNewConstructExpr() argument
11206 return ArrayExprEvaluator(Info, This, Result) in EvaluateArrayNewConstructExpr()
11233 const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType( in VisitInitListExpr()
11260 const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType( in VisitCXXParenListOrInitListExpr()
11303 Subobject.addArray(Info, ExprToVisit, CAT); in VisitCXXParenListOrInitListExpr()
11305 if (!EvaluateInPlace(Result.getArrayInitializedElt(ArrayIndex), Info, in VisitCXXParenListOrInitListExpr()
11307 !HandleLValueArrayAdjustment(Info, Init, Subobject, in VisitCXXParenListOrInitListExpr()
11309 if (!Info.noteFailure()) in VisitCXXParenListOrInitListExpr()
11317 APSInt Value(Info.Ctx.getTypeSize(DestTy), DestTy->isUnsignedIntegerType()); in VisitCXXParenListOrInitListExpr()
11333 Init->getFPFeaturesInEffect(Info.Ctx.getLangOpts()); in VisitCXXParenListOrInitListExpr()
11335 if (!HandleIntToFloatCast(Info, Init, FPO, EmbedS->getType(), Value, in VisitCXXParenListOrInitListExpr()
11355 return EvaluateInPlace(Result.getArrayFiller(), Info, Subobject, in VisitCXXParenListOrInitListExpr()
11363 !Evaluate(Info.CurrentCall->createTemporary( in VisitArrayInitLoopExpr()
11365 getStorageType(Info.Ctx, E->getCommonExpr()), in VisitArrayInitLoopExpr()
11367 Info, E->getCommonExpr()->getSourceExpr())) in VisitArrayInitLoopExpr()
11376 Subobject.addArray(Info, E, CAT); in VisitArrayInitLoopExpr()
11379 for (EvalInfo::ArrayInitLoopIndex Index(Info); Index != Elements; ++Index) { in VisitArrayInitLoopExpr()
11388 FullExpressionRAII Scope(Info); in VisitArrayInitLoopExpr()
11391 Info, Subobject, E->getSubExpr()) || in VisitArrayInitLoopExpr()
11392 !HandleLValueArrayAdjustment(Info, E, Subobject, in VisitArrayInitLoopExpr()
11394 if (!Info.noteFailure()) in VisitArrayInitLoopExpr()
11416 if (const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType(Type)) { in VisitCXXConstructExpr()
11429 Info, E->getExprLoc(), E->getConstructor(), in VisitCXXConstructExpr()
11432 ArrayElt.addArray(Info, E, CAT); in VisitCXXConstructExpr()
11465 !HandleLValueArrayAdjustment(Info, E, ArrayElt, in VisitCXXConstructExpr()
11470 if (Info.EvalStatus.Diag && !Info.EvalStatus.Diag->empty() && in VisitCXXConstructExpr()
11471 !Info.keepEvaluatingAfterFailure()) in VisitCXXConstructExpr()
11483 return RecordExprEvaluator(Info, Subobject, *Value) in VisitCXXConstructExpr()
11517 assert(SI.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) && in Success()
11529 assert(I.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) && in Success()
11543 Result = APValue(Info.Ctx.MakeIntValue(Value, E->getType())); in Success()
11609 if (Info.ArrayInitIndex == uint64_t(-1)) { in VisitArrayInitIndexExpr()
11612 Info.FFDiag(E); in VisitArrayInitIndexExpr()
11615 return Success(Info.ArrayInitIndex, E); in VisitArrayInitIndexExpr()
11656 APFixedPoint(I, Info.Ctx.getFixedPointSemantics(E->getType())), E); in Success()
11661 APFixedPoint(Value, Info.Ctx.getFixedPointSemantics(E->getType())), E); in Success()
11670 assert(V.getWidth() == Info.Ctx.getIntWidth(E->getType()) && in Success()
11703 EvalInfo &Info) { in EvaluateIntegerOrLValue() argument
11706 return IntExprEvaluator(Info, Result).Visit(E); in EvaluateIntegerOrLValue()
11709 static bool EvaluateInteger(const Expr *E, APSInt &Result, EvalInfo &Info) { in EvaluateInteger() argument
11712 if (!EvaluateIntegerOrLValue(E, Val, Info)) in EvaluateInteger()
11717 Info.FFDiag(E, diag::note_invalid_subexpr_in_const_expr); in EvaluateInteger()
11726 Info.Ctx, Info.CurrentCall->CurSourceLocExprScope.getDefaultExpr()); in VisitSourceLocExpr()
11731 EvalInfo &Info) { in EvaluateFixedPoint() argument
11735 if (!FixedPointExprEvaluator(Info, Val).Visit(E)) in EvaluateFixedPoint()
11747 EvalInfo &Info) { in EvaluateFixedPointOrInteger() argument
11750 auto FXSema = Info.Ctx.getFixedPointSemantics(E->getType()); in EvaluateFixedPointOrInteger()
11752 if (!EvaluateInteger(E, Val, Info)) in EvaluateFixedPointOrInteger()
11757 return EvaluateFixedPoint(E, Result, Info); in EvaluateFixedPointOrInteger()
11772 == Info.Ctx.getIntWidth(E->getType())); in CheckReferencedDecl()
11782 Val = Val.extOrTrunc(Info.Ctx.getIntWidth(E->getType())); in CheckReferencedDecl()
11980 static bool EvaluateBuiltinConstantP(EvalInfo &Info, const Expr *Arg) { in EvaluateBuiltinConstantP() argument
11983 SpeculativeEvaluationRAII SpeculativeEval(Info); in EvaluateBuiltinConstantP()
11988 FoldConstant Fold(Info, true); in EvaluateBuiltinConstantP()
12010 if (!::EvaluateAsRValue(Info, Arg, V) || Info.EvalStatus.HasSideEffects) { in EvaluateBuiltinConstantP()
12233 static void addFlexibleArrayMemberInitSize(EvalInfo &Info, const QualType &T, in addFlexibleArrayMemberInitSize() argument
12240 Size += VD->getFlexibleArrayInitChars(Info.Ctx); in addFlexibleArrayMemberInitSize()
12249 static bool determineEndOffset(EvalInfo &Info, SourceLocation ExprLoc, in determineEndOffset() argument
12257 return HandleSizeof(Info, ExprLoc, Ty, Result); in determineEndOffset()
12270 getBytesReturnedByAllocSizeCall(Info.Ctx, LVal, APEndOffset)) in determineEndOffset()
12278 addFlexibleArrayMemberInitSize(Info, BaseTy, LVal, EndOffset); in determineEndOffset()
12292 if (isUserWritingOffTheEnd(Info.Ctx, LVal)) { in determineEndOffset()
12297 getBytesReturnedByAllocSizeCall(Info.Ctx, LVal, APEndOffset)) in determineEndOffset()
12334 EvalInfo &Info, uint64_t &Size) { in tryEvaluateBuiltinObjectSize() argument
12341 SpeculativeEvaluationRAII SpeculativeEval(Info); in tryEvaluateBuiltinObjectSize()
12342 IgnoreSideEffectsRAII Fold(Info); in tryEvaluateBuiltinObjectSize()
12348 if (!EvaluateAsRValue(Info, E, RVal)) in tryEvaluateBuiltinObjectSize()
12350 LVal.setFrom(Info.Ctx, RVal); in tryEvaluateBuiltinObjectSize()
12351 } else if (!EvaluatePointer(ignorePointerCastsAndParens(E), LVal, Info, in tryEvaluateBuiltinObjectSize()
12364 if (!determineEndOffset(Info, E->getExprLoc(), Type, LVal, EndOffset)) in tryEvaluateBuiltinObjectSize()
12382 static bool getBuiltinAlignArguments(const CallExpr *E, EvalInfo &Info, in getBuiltinAlignArguments() argument
12385 if (!getAlignmentArgument(E->getArg(1), SrcTy, Info, Alignment)) in getBuiltinAlignArguments()
12391 if (!EvaluatePointer(E->getArg(0), Ptr, Info)) in getBuiltinAlignArguments()
12395 Info.FFDiag(E->getArg(0)); in getBuiltinAlignArguments()
12399 if (!EvaluateInteger(E->getArg(0), SrcInt, Info)) in getBuiltinAlignArguments()
12419 E->getArg(1)->EvaluateKnownConstInt(Info.Ctx).getZExtValue(); in VisitBuiltinCallExpr()
12423 if (tryEvaluateBuiltinObjectSize(E->getArg(0), Type, Info, Size)) in VisitBuiltinCallExpr()
12426 if (E->getArg(0)->HasSideEffects(Info.Ctx)) in VisitBuiltinCallExpr()
12431 switch (Info.EvalMode) { in VisitBuiltinCallExpr()
12447 analyze_os_log::computeOSLogBufferLayout(Info.Ctx, E, Layout); in VisitBuiltinCallExpr()
12454 if (!getBuiltinAlignArguments(E, Info, Src, Alignment)) in VisitBuiltinCallExpr()
12459 Ptr.setFrom(Info.Ctx, Src); in VisitBuiltinCallExpr()
12460 CharUnits BaseAlignment = getBaseAlignment(Info, Ptr); in VisitBuiltinCallExpr()
12478 Info.FFDiag(E->getArg(0), diag::note_constexpr_alignment_compute) in VisitBuiltinCallExpr()
12488 if (!getBuiltinAlignArguments(E, Info, Src, Alignment)) in VisitBuiltinCallExpr()
12501 if (!getBuiltinAlignArguments(E, Info, Src, Alignment)) in VisitBuiltinCallExpr()
12516 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitBuiltinCallExpr()
12526 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitBuiltinCallExpr()
12533 return Success((int)EvaluateBuiltinClassifyType(E, Info.getLangOpts()), E); in VisitBuiltinCallExpr()
12539 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitBuiltinCallExpr()
12554 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitBuiltinCallExpr()
12560 if (!EvaluateInteger(E->getArg(1), FallbackTemp, Info)) in VisitBuiltinCallExpr()
12585 if (EvaluateBuiltinConstantP(Info, Arg)) in VisitBuiltinCallExpr()
12587 if (Info.InConstantContext || Arg->HasSideEffects(Info.Ctx)) { in VisitBuiltinCallExpr()
12593 Info.FFDiag(E, diag::note_invalid_subexpr_in_const_expr); in VisitBuiltinCallExpr()
12598 const auto *Callee = Info.CurrentCall->getCallee(); in VisitBuiltinCallExpr()
12599 if (Info.InConstantContext && !Info.CheckingPotentialConstantExpression && in VisitBuiltinCallExpr()
12600 (Info.CallStackDepth == 1 || in VisitBuiltinCallExpr()
12601 (Info.CallStackDepth == 2 && Callee->isInStdNamespace() && in VisitBuiltinCallExpr()
12605 if (Info.EvalStatus.Diag) in VisitBuiltinCallExpr()
12606 Info.report((Info.CallStackDepth == 1) in VisitBuiltinCallExpr()
12608 : Info.CurrentCall->getCallRange().getBegin(), in VisitBuiltinCallExpr()
12610 << (Info.CallStackDepth == 1 ? "__builtin_is_constant_evaluated" in VisitBuiltinCallExpr()
12614 return Success(Info.InConstantContext, E); in VisitBuiltinCallExpr()
12623 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitBuiltinCallExpr()
12629 if (!EvaluateInteger(E->getArg(1), FallbackTemp, Info)) in VisitBuiltinCallExpr()
12645 int Operand = E->getArg(0)->EvaluateKnownConstInt(Info.Ctx).getZExtValue(); in VisitBuiltinCallExpr()
12646 Operand = Info.Ctx.getTargetInfo().getEHDataRegisterNumber(Operand); in VisitBuiltinCallExpr()
12665 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitBuiltinCallExpr()
12674 if (!EvaluateFloat(E->getArg(5), Val, Info)) in VisitBuiltinCallExpr()
12688 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitBuiltinCallExpr()
12694 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitBuiltinCallExpr()
12700 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitBuiltinCallExpr()
12706 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitBuiltinCallExpr()
12712 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitBuiltinCallExpr()
12718 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitBuiltinCallExpr()
12724 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitBuiltinCallExpr()
12730 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitBuiltinCallExpr()
12736 if (!EvaluateInteger(E->getArg(1), MaskVal, Info)) in VisitBuiltinCallExpr()
12740 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitBuiltinCallExpr()
12748 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitBuiltinCallExpr()
12762 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitBuiltinCallExpr()
12778 if (!EvaluateInteger(E->getArg(0), Val, Info) || in VisitBuiltinCallExpr()
12779 !EvaluateInteger(E->getArg(1), Amt, Info)) in VisitBuiltinCallExpr()
12795 if (!EvaluateInteger(E->getArg(0), Val, Info) || in VisitBuiltinCallExpr()
12796 !EvaluateInteger(E->getArg(1), Amt, Info)) in VisitBuiltinCallExpr()
12805 if (Info.getLangOpts().CPlusPlus11) in VisitBuiltinCallExpr()
12806 Info.CCEDiag(E, diag::note_constexpr_invalid_function) in VisitBuiltinCallExpr()
12808 << ("'" + Info.Ctx.BuiltinInfo.getName(BuiltinOp) + "'").str(); in VisitBuiltinCallExpr()
12810 Info.CCEDiag(E, diag::note_invalid_subexpr_in_const_expr); in VisitBuiltinCallExpr()
12817 if (EvaluateBuiltinStrLen(E->getArg(0), StrLen, Info)) in VisitBuiltinCallExpr()
12830 if (Info.getLangOpts().CPlusPlus11) in VisitBuiltinCallExpr()
12831 Info.CCEDiag(E, diag::note_constexpr_invalid_function) in VisitBuiltinCallExpr()
12833 << ("'" + Info.Ctx.BuiltinInfo.getName(BuiltinOp) + "'").str(); in VisitBuiltinCallExpr()
12835 Info.CCEDiag(E, diag::note_invalid_subexpr_in_const_expr); in VisitBuiltinCallExpr()
12845 if (!EvaluatePointer(E->getArg(0), String1, Info) || in VisitBuiltinCallExpr()
12846 !EvaluatePointer(E->getArg(1), String2, Info)) in VisitBuiltinCallExpr()
12855 if (!EvaluateInteger(E->getArg(2), N, Info)) in VisitBuiltinCallExpr()
12864 if (!String1.checkNullPointerForFoldAccess(Info, E, AK_Read) || in VisitBuiltinCallExpr()
12865 !String2.checkNullPointerForFoldAccess(Info, E, AK_Read) || in VisitBuiltinCallExpr()
12869 QualType CharTy1 = String1.Designator.getType(Info.Ctx); in VisitBuiltinCallExpr()
12870 QualType CharTy2 = String2.Designator.getType(Info.Ctx); in VisitBuiltinCallExpr()
12878 (Info.Ctx.hasSameUnqualifiedType( in VisitBuiltinCallExpr()
12880 Info.Ctx.hasSameUnqualifiedType(CharTy1, CharTy2))); in VisitBuiltinCallExpr()
12887 Info.FFDiag(E, diag::note_constexpr_memcmp_unsupported) in VisitBuiltinCallExpr()
12888 << ("'" + Info.Ctx.BuiltinInfo.getName(BuiltinOp) + "'").str() in VisitBuiltinCallExpr()
12894 return handleLValueToRValueConversion(Info, E, CharTy1, String1, Char1) && in VisitBuiltinCallExpr()
12895 handleLValueToRValueConversion(Info, E, CharTy2, String2, Char2) && in VisitBuiltinCallExpr()
12899 return HandleLValueArrayAdjustment(Info, E, String1, CharTy1, 1) && in VisitBuiltinCallExpr()
12900 HandleLValueArrayAdjustment(Info, E, String2, CharTy2, 1); in VisitBuiltinCallExpr()
12940 if (!EvaluateInteger(E->getArg(0), SizeVal, Info)) in VisitBuiltinCallExpr()
12957 Info.Ctx.getTargetInfo().getMaxAtomicInlineWidth(); in VisitBuiltinCallExpr()
12958 if (Size <= Info.Ctx.toCharUnitsFromBits(InlineWidthBits)) { in VisitBuiltinCallExpr()
12968 if (PtrArg->EvaluateAsRValue(ExprResult, Info.Ctx) && in VisitBuiltinCallExpr()
12970 Info.Ctx) && in VisitBuiltinCallExpr()
12985 Info.Ctx.getTypeAlignInChars(PointeeType) >= Size) { in VisitBuiltinCallExpr()
13009 if (!EvaluateInteger(E->getArg(0), LHS, Info) || in VisitBuiltinCallExpr()
13010 !EvaluateInteger(E->getArg(1), RHS, Info) || in VisitBuiltinCallExpr()
13011 !EvaluateInteger(E->getArg(2), CarryIn, Info) || in VisitBuiltinCallExpr()
13012 !EvaluatePointer(E->getArg(3), CarryOutLValue, Info)) in VisitBuiltinCallExpr()
13045 if (!handleAssignment(Info, E, CarryOutLValue, ResultType, APV)) in VisitBuiltinCallExpr()
13074 if (!EvaluateInteger(E->getArg(0), LHS, Info) || in VisitBuiltinCallExpr()
13075 !EvaluateInteger(E->getArg(1), RHS, Info) || in VisitBuiltinCallExpr()
13076 !EvaluatePointer(E->getArg(2), ResultLValue, Info)) in VisitBuiltinCallExpr()
13092 uint64_t ResultSize = Info.Ctx.getTypeSize(ResultType); in VisitBuiltinCallExpr()
13153 APSInt Temp = Result.extOrTrunc(Info.Ctx.getTypeSize(ResultType)); in VisitBuiltinCallExpr()
13162 if (!handleAssignment(Info, E, ResultLValue, ResultType, APV)) in VisitBuiltinCallExpr()
13229 void startSpeculativeEval(EvalInfo &Info) { in startSpeculativeEval()
13230 SpecEvalRAII = SpeculativeEvaluationRAII(Info); in startSpeculativeEval()
13240 EvalInfo &Info; member in __anonfb577fba2b11::DataRecursiveIntBinOpEvaluator
13245 : IntEval(IntEval), Info(IntEval.getEvalInfo()), FinalResult(Result) { } in DataRecursiveIntBinOpEvaluator()
13285 return Info.CCEDiag(E, D); in CCEDiag()
13296 Result.Failed = !Evaluate(Result.Val, Info, E); in EvaluateExpr()
13319 return Info.noteSideEffect(); in VisitBinOpLHSOnly()
13337 if (!Info.noteSideEffect()) in VisitBinOpLHSOnly()
13352 if (LHSResult.Failed && !Info.noteFailure()) in VisitBinOpLHSOnly()
13457 APSInt Value(Info.Ctx.getIntWidth(E->getType()), in VisitBinOp()
13459 if (!handleIntIntBinOp(Info, E, LHSVal.getInt(), E->getOpcode(), in VisitBinOp()
13491 job.startSpeculativeEval(Info); in process()
13523 EvaluateComparisonBinaryOperator(EvalInfo &Info, const BinaryOperator *E, in EvaluateComparisonBinaryOperator() argument
13531 Info.FFDiag(E, diag::note_invalid_subexpr_in_const_expr); in EvaluateComparisonBinaryOperator()
13544 bool LHSOK = EvaluateInteger(E->getLHS(), LHS, Info); in EvaluateComparisonBinaryOperator()
13545 if (!LHSOK && !Info.noteFailure()) in EvaluateComparisonBinaryOperator()
13547 if (!EvaluateInteger(E->getRHS(), RHS, Info) || !LHSOK) in EvaluateComparisonBinaryOperator()
13557 APFixedPoint LHSFX(Info.Ctx.getFixedPointSemantics(LHSTy)); in EvaluateComparisonBinaryOperator()
13558 APFixedPoint RHSFX(Info.Ctx.getFixedPointSemantics(RHSTy)); in EvaluateComparisonBinaryOperator()
13560 bool LHSOK = EvaluateFixedPointOrInteger(E->getLHS(), LHSFX, Info); in EvaluateComparisonBinaryOperator()
13561 if (!LHSOK && !Info.noteFailure()) in EvaluateComparisonBinaryOperator()
13563 if (!EvaluateFixedPointOrInteger(E->getRHS(), RHSFX, Info) || !LHSOK) in EvaluateComparisonBinaryOperator()
13577 EvaluateLValue(E->getLHS(), LV, Info); in EvaluateComparisonBinaryOperator()
13580 LHSOK = EvaluateFloat(E->getLHS(), LHS.FloatReal, Info); in EvaluateComparisonBinaryOperator()
13586 LHSOK = EvaluateComplex(E->getLHS(), LHS, Info); in EvaluateComparisonBinaryOperator()
13588 if (!LHSOK && !Info.noteFailure()) in EvaluateComparisonBinaryOperator()
13592 if (!EvaluateFloat(E->getRHS(), RHS.FloatReal, Info) || !LHSOK) in EvaluateComparisonBinaryOperator()
13596 } else if (!EvaluateComplex(E->getRHS(), RHS, Info) || !LHSOK) in EvaluateComparisonBinaryOperator()
13618 bool LHSOK = EvaluateFloat(E->getRHS(), RHS, Info); in EvaluateComparisonBinaryOperator()
13619 if (!LHSOK && !Info.noteFailure()) in EvaluateComparisonBinaryOperator()
13622 if (!EvaluateFloat(E->getLHS(), LHS, Info) || !LHSOK) in EvaluateComparisonBinaryOperator()
13627 if (!Info.InConstantContext && in EvaluateComparisonBinaryOperator()
13629 E->getFPFeaturesInEffect(Info.Ctx.getLangOpts()).isFPConstrained()) { in EvaluateComparisonBinaryOperator()
13631 Info.FFDiag(E, diag::note_constexpr_float_arithmetic_strict); in EvaluateComparisonBinaryOperator()
13653 bool LHSOK = EvaluatePointer(E->getLHS(), LHSValue, Info); in EvaluateComparisonBinaryOperator()
13654 if (!LHSOK && !Info.noteFailure()) in EvaluateComparisonBinaryOperator()
13657 if (!EvaluatePointer(E->getRHS(), RHSValue, Info) || !LHSOK) in EvaluateComparisonBinaryOperator()
13664 std::string LHS = LHSValue.toString(Info.Ctx, E->getLHS()->getType()); in EvaluateComparisonBinaryOperator()
13665 std::string RHS = RHSValue.toString(Info.Ctx, E->getRHS()->getType()); in EvaluateComparisonBinaryOperator()
13666 Info.FFDiag(E, DiagID) in EvaluateComparisonBinaryOperator()
13699 isOnePastTheEndOfCompleteObject(Info.Ctx, RHSValue)) in EvaluateComparisonBinaryOperator()
13703 isOnePastTheEndOfCompleteObject(Info.Ctx, LHSValue)) in EvaluateComparisonBinaryOperator()
13729 Info.CCEDiag(E, diag::note_constexpr_void_comparison); in EvaluateComparisonBinaryOperator()
13754 Info.CCEDiag(E, diag::note_constexpr_pointer_comparison_base_classes); in EvaluateComparisonBinaryOperator()
13756 Info.CCEDiag(E, diag::note_constexpr_pointer_comparison_base_field) in EvaluateComparisonBinaryOperator()
13760 Info.CCEDiag(E, diag::note_constexpr_pointer_comparison_base_field) in EvaluateComparisonBinaryOperator()
13765 Info.CCEDiag(E, in EvaluateComparisonBinaryOperator()
13774 unsigned PtrSize = Info.Ctx.getTypeSize(LHSTy); in EvaluateComparisonBinaryOperator()
13789 CharUnits Size = Info.Ctx.getTypeSizeInChars(BaseTy); in EvaluateComparisonBinaryOperator()
13808 bool LHSOK = EvaluateMemberPointer(E->getLHS(), LHSValue, Info); in EvaluateComparisonBinaryOperator()
13809 if (!LHSOK && !Info.noteFailure()) in EvaluateComparisonBinaryOperator()
13812 if (!EvaluateMemberPointer(E->getRHS(), RHSValue, Info) || !LHSOK) in EvaluateComparisonBinaryOperator()
13818 Info.FFDiag(E, diag::note_constexpr_mem_pointer_weak_comparison) in EvaluateComparisonBinaryOperator()
13823 Info.FFDiag(E, diag::note_constexpr_mem_pointer_weak_comparison) in EvaluateComparisonBinaryOperator()
13840 Info.CCEDiag(E, diag::note_constexpr_compare_virtual_mem_ptr) << MD; in EvaluateComparisonBinaryOperator()
13843 Info.CCEDiag(E, diag::note_constexpr_compare_virtual_mem_ptr) << MD; in EvaluateComparisonBinaryOperator()
13860 if (!EvaluatePointer(E->getLHS(), Res, Info) || in EvaluateComparisonBinaryOperator()
13861 !EvaluatePointer(E->getRHS(), Res, Info)) in EvaluateComparisonBinaryOperator()
13870 if (!CheckLiteralType(Info, E)) in VisitBinCmp()
13894 Info.Ctx.CompCategories.getInfoForType(E->getType()); in VisitBinCmp()
13899 if (!handleLValueToRValueConversion(Info, E, E->getType(), LV, Result)) in VisitBinCmp()
13901 return CheckConstantExpression(Info, E->getExprLoc(), E->getType(), Result, in VisitBinCmp()
13904 return EvaluateComparisonBinaryOperator(Info, E, OnSuccess, [&]() { in VisitBinCmp()
13919 if (!Info.noteFailure()) in VisitBinaryOperator()
13956 return EvaluateComparisonBinaryOperator(Info, E, OnSuccess, [&]() { in VisitBinaryOperator()
13968 bool LHSOK = EvaluatePointer(E->getLHS(), LHSValue, Info); in VisitBinaryOperator()
13969 if (!LHSOK && !Info.noteFailure()) in VisitBinaryOperator()
13972 if (!EvaluatePointer(E->getRHS(), RHSValue, Info) || !LHSOK) in VisitBinaryOperator()
14008 Info.CCEDiag(E, diag::note_constexpr_pointer_subtraction_not_same_array); in VisitBinaryOperator()
14014 if (!HandleSizeof(Info, E->getExprLoc(), ElementType, ElementSize)) in VisitBinaryOperator()
14021 Info.FFDiag(E, diag::note_constexpr_pointer_subtraction_zero_size) in VisitBinaryOperator()
14039 APSInt Result = TrueResult.trunc(Info.Ctx.getIntWidth(E->getType())); in VisitBinaryOperator()
14042 !HandleOverflow(Info, E, TrueResult, E->getType())) in VisitBinaryOperator()
14058 return Success(GetAlignOfType(Info, E->getArgumentType(), E->getKind()), in VisitUnaryExprOrTypeTraitExpr()
14061 return Success(GetAlignOfExpr(Info, E->getArgumentExpr(), E->getKind()), in VisitUnaryExprOrTypeTraitExpr()
14069 Info.Ctx.getPointerAuthTypeDiscriminator(E->getArgumentType()), E); in VisitUnaryExprOrTypeTraitExpr()
14096 if (!HandleSizeof(Info, E->getExprLoc(), SrcTy, Sizeof, in VisitUnaryExprOrTypeTraitExpr()
14106 Info.Ctx.toCharUnitsFromBits( in VisitUnaryExprOrTypeTraitExpr()
14107 Info.Ctx.getOpenMPDefaultSimdAlign(E->getArgumentType())) in VisitUnaryExprOrTypeTraitExpr()
14118 if (Info.InConstantContext) in VisitUnaryExprOrTypeTraitExpr()
14119 Info.CCEDiag(E, diag::note_constexpr_non_const_vectorelements) in VisitUnaryExprOrTypeTraitExpr()
14141 if (!EvaluateInteger(Idx, IdxResult, Info)) in VisitOffsetOfExpr()
14143 const ArrayType *AT = Info.Ctx.getAsArrayType(CurrentType); in VisitOffsetOfExpr()
14147 CharUnits ElementSize = Info.Ctx.getTypeSizeInChars(CurrentType); in VisitOffsetOfExpr()
14159 const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD); in VisitOffsetOfExpr()
14162 Result += Info.Ctx.toCharUnitsFromBits(RL.getFieldOffset(i)); in VisitOffsetOfExpr()
14181 const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD); in VisitOffsetOfExpr()
14217 if (Info.checkingForUndefinedBehavior()) in VisitUnaryOperator()
14218 Info.Ctx.getDiagnostics().Report(E->getExprLoc(), in VisitUnaryOperator()
14224 if (!HandleOverflow(Info, E, -Value.extend(Value.getBitWidth() + 1), in VisitUnaryOperator()
14238 if (!EvaluateAsBooleanCondition(E->getSubExpr(), bres, Info)) in VisitUnaryOperator()
14321 if (!EvaluateAsBooleanCondition(SubExpr, BoolResult, Info)) in VisitCastExpr()
14330 APFixedPoint Src(Info.Ctx.getFixedPointSemantics(SrcType)); in VisitCastExpr()
14331 if (!EvaluateFixedPoint(SubExpr, Src, Info)) in VisitCastExpr()
14335 Info.Ctx.getIntWidth(DestType), in VisitCastExpr()
14337 if (Overflowed && !HandleOverflow(Info, E, Result, DestType)) in VisitCastExpr()
14345 if (!Evaluate(Val, Info, SubExpr)) in VisitCastExpr()
14361 return Info.Ctx.getTypeSize(DestType) <= Info.Ctx.getTypeSize(SrcType); in VisitCastExpr()
14363 return Info.Ctx.getTypeSize(DestType) == Info.Ctx.getTypeSize(SrcType); in VisitCastExpr()
14366 if (Info.Ctx.getLangOpts().CPlusPlus && Info.InConstantContext && in VisitCastExpr()
14367 Info.EvalMode == EvalInfo::EM_ConstantExpression && in VisitCastExpr()
14378 Info.EvaluatingDecl.dyn_cast<const ValueDecl *>())) in VisitCastExpr()
14403 Info.Ctx.getDiagnostics().Report( in VisitCastExpr()
14409 Info.Ctx.getDiagnostics().Report( in VisitCastExpr()
14416 return Success(HandleIntToIntCast(Info, E, DestType, SrcType, in VisitCastExpr()
14422 << 2 << Info.Ctx.getLangOpts().CPlusPlus << E->getSourceRange(); in VisitCastExpr()
14425 if (!EvaluatePointer(SubExpr, LV, Info)) in VisitCastExpr()
14433 if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(SrcType)) in VisitCastExpr()
14444 if (!V.toIntegralConstant(AsInt, SrcType, Info.Ctx)) in VisitCastExpr()
14447 return Success(HandleIntToIntCast(Info, E, DestType, SrcType, AsInt), E); in VisitCastExpr()
14452 if (!EvaluateComplex(SubExpr, C, Info)) in VisitCastExpr()
14459 if (!EvaluateFloat(SubExpr, F, Info)) in VisitCastExpr()
14463 if (!HandleFloatToIntCast(Info, E, SrcType, F, DestType, Value)) in VisitCastExpr()
14475 if (!EvaluateComplex(E->getSubExpr(), LV, Info)) in VisitUnaryReal()
14488 if (!EvaluateComplex(E->getSubExpr(), LV, Info)) in VisitUnaryImag()
14530 if (Overflowed && !HandleOverflow(Info, E, Negated, E->getType())) in VisitUnaryOperator()
14536 if (!EvaluateAsBooleanCondition(E->getSubExpr(), bres, Info)) in VisitUnaryOperator()
14548 auto DestFXSema = Info.Ctx.getFixedPointSemantics(DestType); in VisitCastExpr()
14552 APFixedPoint Src(Info.Ctx.getFixedPointSemantics(SubExpr->getType())); in VisitCastExpr()
14553 if (!EvaluateFixedPoint(SubExpr, Src, Info)) in VisitCastExpr()
14558 if (Info.checkingForUndefinedBehavior()) in VisitCastExpr()
14559 Info.Ctx.getDiagnostics().Report(E->getExprLoc(), in VisitCastExpr()
14562 if (!HandleOverflow(Info, E, Result, E->getType())) in VisitCastExpr()
14569 if (!EvaluateInteger(SubExpr, Src, Info)) in VisitCastExpr()
14574 Src, Info.Ctx.getFixedPointSemantics(DestType), &Overflowed); in VisitCastExpr()
14577 if (Info.checkingForUndefinedBehavior()) in VisitCastExpr()
14578 Info.Ctx.getDiagnostics().Report(E->getExprLoc(), in VisitCastExpr()
14581 if (!HandleOverflow(Info, E, IntResult, E->getType())) in VisitCastExpr()
14589 if (!EvaluateFloat(SubExpr, Src, Info)) in VisitCastExpr()
14594 Src, Info.Ctx.getFixedPointSemantics(DestType), &Overflowed); in VisitCastExpr()
14597 if (Info.checkingForUndefinedBehavior()) in VisitCastExpr()
14598 Info.Ctx.getDiagnostics().Report(E->getExprLoc(), in VisitCastExpr()
14601 if (!HandleOverflow(Info, E, Result, E->getType())) in VisitCastExpr()
14622 Info.Ctx.getFixedPointSemantics(E->getType()); in VisitBinaryOperator()
14624 APFixedPoint LHSFX(Info.Ctx.getFixedPointSemantics(LHS->getType())); in VisitBinaryOperator()
14625 if (!EvaluateFixedPointOrInteger(LHS, LHSFX, Info)) in VisitBinaryOperator()
14627 APFixedPoint RHSFX(Info.Ctx.getFixedPointSemantics(RHS->getType())); in VisitBinaryOperator()
14628 if (!EvaluateFixedPointOrInteger(RHS, RHSFX, Info)) in VisitBinaryOperator()
14651 Info.FFDiag(E, diag::note_expr_divide_by_zero); in VisitBinaryOperator()
14670 Info.CCEDiag(E, diag::note_constexpr_negative_shift) << RHSVal; in VisitBinaryOperator()
14672 Info.CCEDiag(E, diag::note_constexpr_large_shift) in VisitBinaryOperator()
14685 if (Info.checkingForUndefinedBehavior()) in VisitBinaryOperator()
14686 Info.Ctx.getDiagnostics().Report(E->getExprLoc(), in VisitBinaryOperator()
14689 if (!HandleOverflow(Info, E, Result, E->getType())) in VisitBinaryOperator()
14713 Result = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(E->getType())); in ZeroInitialization()
14731 static bool EvaluateFloat(const Expr* E, APFloat& Result, EvalInfo &Info) { in EvaluateFloat() argument
14734 return FloatExprEvaluator(Info, Result).Visit(E); in EvaluateFloat()
14794 Info.Ctx.getFloatTypeSemantics(E->getType()); in VisitCallExpr()
14804 if (!TryEvaluateBuiltinNaN(Info.Ctx, E->getType(), E->getArg(0), in VisitCallExpr()
14816 if (!TryEvaluateBuiltinNaN(Info.Ctx, E->getType(), E->getArg(0), in VisitCallExpr()
14830 if (!EvaluateFloat(E->getArg(0), Result, Info)) in VisitCallExpr()
14838 return EvaluateFloat(E->getArg(0), Result, Info); in VisitCallExpr()
14849 if (!EvaluateFloat(E->getArg(0), Result, Info) || in VisitCallExpr()
14850 !EvaluateFloat(E->getArg(1), RHS, Info)) in VisitCallExpr()
14863 if (!EvaluateFloat(E->getArg(0), Result, Info) || in VisitCallExpr()
14864 !EvaluateFloat(E->getArg(1), RHS, Info)) in VisitCallExpr()
14881 if (!EvaluateFloat(E->getArg(0), Result, Info) || in VisitCallExpr()
14882 !EvaluateFloat(E->getArg(1), RHS, Info)) in VisitCallExpr()
14897 if (!EvaluateComplex(E->getSubExpr(), CV, Info)) in VisitUnaryReal()
14909 if (!EvaluateComplex(E->getSubExpr(), CV, Info)) in VisitUnaryImag()
14916 const llvm::fltSemantics &Sem = Info.Ctx.getFloatTypeSemantics(E->getType()); in VisitUnaryImag()
14925 return EvaluateFloat(E->getSubExpr(), Result, Info); in VisitUnaryOperator()
14930 if (!EvaluateFloat(E->getSubExpr(), Result, Info)) in VisitUnaryOperator()
14942 bool LHSOK = EvaluateFloat(E->getLHS(), Result, Info); in VisitBinaryOperator()
14943 if (!LHSOK && !Info.noteFailure()) in VisitBinaryOperator()
14945 return EvaluateFloat(E->getRHS(), RHS, Info) && LHSOK && in VisitBinaryOperator()
14946 handleFloatFloatBinOp(Info, E, Result, E->getOpcode(), RHS); in VisitBinaryOperator()
14964 Info.Ctx.getLangOpts()); in VisitCastExpr()
14965 return EvaluateInteger(SubExpr, IntResult, Info) && in VisitCastExpr()
14966 HandleIntToFloatCast(Info, E, FPO, SubExpr->getType(), in VisitCastExpr()
14971 APFixedPoint FixResult(Info.Ctx.getFixedPointSemantics(SubExpr->getType())); in VisitCastExpr()
14972 if (!EvaluateFixedPoint(SubExpr, FixResult, Info)) in VisitCastExpr()
14975 FixResult.convertToFloat(Info.Ctx.getFloatTypeSemantics(E->getType())); in VisitCastExpr()
14982 return HandleFloatToFloatCast(Info, E, SubExpr->getType(), E->getType(), in VisitCastExpr()
14988 if (!EvaluateComplex(SubExpr, V, Info)) in VisitCastExpr()
15030 EvalInfo &Info) { in EvaluateComplex() argument
15033 return ComplexExprEvaluator(Info, Result).Visit(E); in EvaluateComplex()
15040 APFloat Zero = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(ElemTy)); in ZeroInitialization()
15045 APSInt Zero = Info.Ctx.MakeIntValue(0, ElemTy); in ZeroInitialization()
15058 if (!EvaluateFloat(SubExpr, Imag, Info)) in VisitImaginaryLiteral()
15069 if (!EvaluateInteger(SubExpr, Imag, Info)) in VisitImaginaryLiteral()
15149 if (!EvaluateFloat(E->getSubExpr(), Real, Info)) in VisitCastExpr()
15165 return HandleFloatToFloatCast(Info, E, From, To, Result.FloatReal) && in VisitCastExpr()
15166 HandleFloatToFloatCast(Info, E, From, To, Result.FloatImag); in VisitCastExpr()
15177 return HandleFloatToIntCast(Info, E, From, Result.FloatReal, in VisitCastExpr()
15179 HandleFloatToIntCast(Info, E, From, Result.FloatImag, in VisitCastExpr()
15185 if (!EvaluateInteger(E->getSubExpr(), Real, Info)) in VisitCastExpr()
15201 Result.IntReal = HandleIntToIntCast(Info, E, To, From, Result.IntReal); in VisitCastExpr()
15202 Result.IntImag = HandleIntToIntCast(Info, E, To, From, Result.IntImag); in VisitCastExpr()
15211 Info.Ctx.getLangOpts()); in VisitCastExpr()
15216 return HandleIntToFloatCast(Info, E, FPO, From, Result.IntReal, in VisitCastExpr()
15218 HandleIntToFloatCast(Info, E, FPO, From, Result.IntImag, in VisitCastExpr()
15336 LHSOK = EvaluateFloat(E->getLHS(), Real, Info); in VisitBinaryOperator()
15344 if (!LHSOK && !Info.noteFailure()) in VisitBinaryOperator()
15351 if (!EvaluateFloat(E->getRHS(), Real, Info) || !LHSOK) in VisitBinaryOperator()
15355 } else if (!EvaluateComplex(E->getRHS(), RHS, Info) || !LHSOK) in VisitBinaryOperator()
15411 if (!handleFloatFloatBinOp(Info, E, ResR, BO_Mul, C) || in VisitBinaryOperator()
15412 !handleFloatFloatBinOp(Info, E, ResI, BO_Mul, D)) in VisitBinaryOperator()
15419 if (!handleFloatFloatBinOp(Info, E, ResR, BO_Mul, A) || in VisitBinaryOperator()
15420 !handleFloatFloatBinOp(Info, E, ResI, BO_Mul, B)) in VisitBinaryOperator()
15453 if (!handleFloatFloatBinOp(Info, E, ResR, BO_Div, C) || in VisitBinaryOperator()
15454 !handleFloatFloatBinOp(Info, E, ResI, BO_Div, C)) in VisitBinaryOperator()
15519 if (!EvaluateFloat(E->getInit(0), Result.FloatReal, Info)) in VisitInitListExpr()
15521 if (!EvaluateFloat(E->getInit(1), Result.FloatImag, Info)) in VisitInitListExpr()
15525 if (!EvaluateInteger(E->getInit(0), Result.IntReal, Info)) in VisitInitListExpr()
15527 if (!EvaluateInteger(E->getInit(1), Result.IntImag, Info)) in VisitInitListExpr()
15542 if (!EvaluateFloat(E->getArg(0), Result.FloatReal, Info)) in VisitCallExpr()
15544 if (!EvaluateFloat(E->getArg(1), Result.FloatImag, Info)) in VisitCallExpr()
15564 AtomicExprEvaluator(EvalInfo &Info, const LValue *This, APValue &Result) in AtomicExprEvaluator() argument
15565 : ExprEvaluatorBaseTy(Info), This(This), Result(Result) {} in AtomicExprEvaluator()
15577 return This ? EvaluateInPlace(Result, Info, *This, &VIE) in ZeroInitialization()
15578 : Evaluate(Result, Info, &VIE); in ZeroInitialization()
15589 return This ? EvaluateInPlace(Result, Info, *This, E->getSubExpr()) in VisitCastExpr()
15590 : Evaluate(Result, Info, E->getSubExpr()); in VisitCastExpr()
15597 EvalInfo &Info) { in EvaluateAtomic() argument
15600 return AtomicExprEvaluator(Info, This, Result).Visit(E); in EvaluateAtomic()
15612 VoidExprEvaluator(EvalInfo &Info) : ExprEvaluatorBaseTy(Info) {} in VoidExprEvaluator() argument
15639 return HandleOperatorDeleteCall(Info, E); in VisitCallExpr()
15652 if (Info.SpeculativeEvaluationDepth) in VisitCXXDeleteExpr()
15657 Info.FFDiag(E, diag::note_constexpr_new_non_replaceable) in VisitCXXDeleteExpr()
15665 if (!EvaluatePointer(Arg, Pointer, Info)) in VisitCXXDeleteExpr()
15675 if (!Info.getLangOpts().CPlusPlus20) in VisitCXXDeleteExpr()
15676 Info.CCEDiag(E, diag::note_constexpr_new); in VisitCXXDeleteExpr()
15681 Info, E, Pointer, E->isArrayForm() ? DynAlloc::ArrayNew : DynAlloc::New); in VisitCXXDeleteExpr()
15690 Info.FFDiag(E, diag::note_constexpr_delete_base_nonvirt_dtor) in VisitCXXDeleteExpr()
15701 Info.FFDiag(E, diag::note_constexpr_new_non_replaceable) in VisitCXXDeleteExpr()
15707 if (!HandleDestruction(Info, E->getExprLoc(), Pointer.getLValueBase(), in VisitCXXDeleteExpr()
15711 if (!Info.HeapAllocs.erase(Pointer.Base.dyn_cast<DynamicAllocLValue>())) { in VisitCXXDeleteExpr()
15716 Info.FFDiag(E, diag::note_constexpr_double_delete); in VisitCXXDeleteExpr()
15723 static bool EvaluateVoid(const Expr *E, EvalInfo &Info) { in EvaluateVoid() argument
15726 return VoidExprEvaluator(Info).Visit(E); in EvaluateVoid()
15733 static bool Evaluate(APValue &Result, EvalInfo &Info, const Expr *E) { in Evaluate() argument
15740 if (!EvaluateLValue(E, LV, Info)) in Evaluate()
15744 if (!EvaluateVector(E, Result, Info)) in Evaluate()
15747 if (!IntExprEvaluator(Info, Result).Visit(E)) in Evaluate()
15751 if (!EvaluatePointer(E, LV, Info)) in Evaluate()
15756 if (!EvaluateFloat(E, F, Info)) in Evaluate()
15761 if (!EvaluateComplex(E, C, Info)) in Evaluate()
15765 if (!FixedPointExprEvaluator(Info, Result).Visit(E)) return false; in Evaluate()
15768 if (!EvaluateMemberPointer(E, P, Info)) in Evaluate()
15775 Info.CurrentCall->createTemporary(E, T, ScopeKind::FullExpression, LV); in Evaluate()
15776 if (!EvaluateArray(E, LV, Value, Info)) in Evaluate()
15782 Info.CurrentCall->createTemporary(E, T, ScopeKind::FullExpression, LV); in Evaluate()
15783 if (!EvaluateRecord(E, LV, Value, Info)) in Evaluate()
15787 if (!Info.getLangOpts().CPlusPlus11) in Evaluate()
15788 Info.CCEDiag(E, diag::note_constexpr_nonliteral) in Evaluate()
15790 if (!EvaluateVoid(E, Info)) in Evaluate()
15796 APValue &Value = Info.CurrentCall->createTemporary( in Evaluate()
15798 if (!EvaluateAtomic(E, &LV, Value, Info)) in Evaluate()
15802 if (!EvaluateAtomic(E, nullptr, Result, Info)) in Evaluate()
15805 } else if (Info.getLangOpts().CPlusPlus11) { in Evaluate()
15806 Info.FFDiag(E, diag::note_constexpr_nonliteral) << E->getType(); in Evaluate()
15809 Info.FFDiag(E, diag::note_invalid_subexpr_in_const_expr); in Evaluate()
15819 static bool EvaluateInPlace(APValue &Result, EvalInfo &Info, const LValue &This, in EvaluateInPlace() argument
15823 if (!AllowNonLiteralTypes && !CheckLiteralType(Info, E, &This)) in EvaluateInPlace()
15831 return EvaluateArray(E, This, Result, Info); in EvaluateInPlace()
15833 return EvaluateRecord(E, This, Result, Info); in EvaluateInPlace()
15837 return EvaluateAtomic(E, &This, Result, Info); in EvaluateInPlace()
15842 return Evaluate(Result, Info, E); in EvaluateInPlace()
15847 static bool EvaluateAsRValue(EvalInfo &Info, const Expr *E, APValue &Result) { in EvaluateAsRValue() argument
15853 if (!CheckLiteralType(Info, E)) in EvaluateAsRValue()
15856 if (Info.EnableNewConstInterp) { in EvaluateAsRValue()
15857 if (!Info.Ctx.getInterpContext().evaluateAsRValue(Info, E, Result)) in EvaluateAsRValue()
15859 return CheckConstantExpression(Info, E->getExprLoc(), E->getType(), Result, in EvaluateAsRValue()
15863 if (!::Evaluate(Result, Info, E)) in EvaluateAsRValue()
15869 LV.setFrom(Info.Ctx, Result); in EvaluateAsRValue()
15870 if (!handleLValueToRValueConversion(Info, E, E->getType(), LV, Result)) in EvaluateAsRValue()
15875 return CheckConstantExpression(Info, E->getExprLoc(), E->getType(), Result, in EvaluateAsRValue()
15877 CheckMemoryLeaks(Info); in EvaluateAsRValue()
15928 const ASTContext &Ctx, EvalInfo &Info) { in EvaluateAsRValue() argument
15934 return EvaluateAsRValue(Info, E, Result.Val); in EvaluateAsRValue()
15940 EvalInfo &Info) { in EvaluateAsInt() argument
15945 if (!::EvaluateAsRValue(E, ExprResult, Ctx, Info) || in EvaluateAsInt()
15956 EvalInfo &Info) { in EvaluateAsFixedPoint() argument
15961 if (!::EvaluateAsRValue(E, ExprResult, Ctx, Info)) in EvaluateAsFixedPoint()
15981 EvalInfo Info(Ctx, Result, EvalInfo::EM_IgnoreSideEffects); in EvaluateAsRValue() local
15982 Info.InConstantContext = InConstantContext; in EvaluateAsRValue()
15983 return ::EvaluateAsRValue(this, Result, Ctx, Info); in EvaluateAsRValue()
16002 EvalInfo Info(Ctx, Result, EvalInfo::EM_IgnoreSideEffects); in EvaluateAsInt() local
16003 Info.InConstantContext = InConstantContext; in EvaluateAsInt()
16004 return ::EvaluateAsInt(this, Result, Ctx, AllowSideEffects, Info); in EvaluateAsInt()
16013 EvalInfo Info(Ctx, Result, EvalInfo::EM_IgnoreSideEffects); in EvaluateAsFixedPoint() local
16014 Info.InConstantContext = InConstantContext; in EvaluateAsFixedPoint()
16015 return ::EvaluateAsFixedPoint(this, Result, Ctx, AllowSideEffects, Info); in EvaluateAsFixedPoint()
16044 EvalInfo Info(Ctx, Result, EvalInfo::EM_ConstantFold); in EvaluateAsLValue() local
16045 Info.InConstantContext = InConstantContext; in EvaluateAsLValue()
16048 if (!EvaluateLValue(this, LV, Info) || !Info.discardCleanups() || in EvaluateAsLValue()
16050 !CheckLValueConstantExpression(Info, getExprLoc(), in EvaluateAsLValue()
16063 EvalInfo Info(Ctx, EStatus, in EvaluateDestruction() local
16066 Info.setEvaluatingDecl(Base, DestroyedValue, in EvaluateDestruction()
16068 Info.InConstantContext = IsConstantDestruction; in EvaluateDestruction()
16073 if (!HandleDestruction(Info, Loc, Base, DestroyedValue, Type) || in EvaluateDestruction()
16077 if (!Info.discardCleanups()) in EvaluateDestruction()
16093 EvalInfo Info(Ctx, Result, EM); in EvaluateAsConstantExpr() local
16094 Info.InConstantContext = true; in EvaluateAsConstantExpr()
16096 if (Info.EnableNewConstInterp) { in EvaluateAsConstantExpr()
16097 if (!Info.Ctx.getInterpContext().evaluate(Info, this, Result.Val)) in EvaluateAsConstantExpr()
16099 return CheckConstantExpression(Info, getExprLoc(), in EvaluateAsConstantExpr()
16113 Info.setEvaluatingDecl(Base, Result.Val); in EvaluateAsConstantExpr()
16115 if (Info.EnableNewConstInterp) { in EvaluateAsConstantExpr()
16116 if (!Info.Ctx.getInterpContext().evaluateAsRValue(Info, this, Result.Val)) in EvaluateAsConstantExpr()
16125 FullExpressionRAII Scope(Info); in EvaluateAsConstantExpr()
16126 if (!::EvaluateInPlace(Result.Val, Info, LVal, this) || in EvaluateAsConstantExpr()
16130 if (!Info.discardCleanups()) in EvaluateAsConstantExpr()
16134 if (!CheckConstantExpression(Info, getExprLoc(), getStorageType(Ctx, this), in EvaluateAsConstantExpr()
16137 if (!CheckMemoryLeaks(Info)) in EvaluateAsConstantExpr()
16171 EvalInfo Info(Ctx, EStatus, in EvaluateAsInitializer() local
16176 Info.setEvaluatingDecl(VD, Value); in EvaluateAsInitializer()
16177 Info.InConstantContext = IsConstantInitialization; in EvaluateAsInitializer()
16182 if (Info.EnableNewConstInterp) { in EvaluateAsInitializer()
16184 if (!InterpCtx.evaluateAsInitializer(Info, VD, Value)) in EvaluateAsInitializer()
16187 return CheckConstantExpression(Info, DeclLoc, DeclTy, Value, in EvaluateAsInitializer()
16203 FullExpressionRAII Scope(Info); in EvaluateAsInitializer()
16204 if (!EvaluateInPlace(Value, Info, LVal, this, in EvaluateAsInitializer()
16212 Info.performLifetimeExtension(); in EvaluateAsInitializer()
16214 if (!Info.discardCleanups()) in EvaluateAsInitializer()
16218 return CheckConstantExpression(Info, DeclLoc, DeclTy, Value, in EvaluateAsInitializer()
16220 CheckMemoryLeaks(Info); in EvaluateAsInitializer()
16270 EvalInfo Info(Ctx, EVResult, EvalInfo::EM_IgnoreSideEffects); in EvaluateKnownConstInt() local
16271 Info.InConstantContext = true; in EvaluateKnownConstInt()
16273 bool Result = ::EvaluateAsRValue(this, EVResult, Ctx, Info); in EvaluateKnownConstInt()
16289 EvalInfo Info(Ctx, EVResult, EvalInfo::EM_IgnoreSideEffects); in EvaluateKnownConstIntCheckOverflow() local
16290 Info.InConstantContext = true; in EvaluateKnownConstIntCheckOverflow()
16291 Info.CheckingForUndefinedBehavior = true; in EvaluateKnownConstIntCheckOverflow()
16293 bool Result = ::EvaluateAsRValue(Info, this, EVResult.Val); in EvaluateKnownConstIntCheckOverflow()
16309 EvalInfo Info(Ctx, EVResult, EvalInfo::EM_IgnoreSideEffects); in EvaluateForOverflow() local
16310 Info.CheckingForUndefinedBehavior = true; in EvaluateForOverflow()
16311 (void)::EvaluateAsRValue(Info, this, EVResult.Val); in EvaluateForOverflow()
16364 EvalInfo Info(Ctx, Status, EvalInfo::EM_ConstantExpression); in CheckEvalInICE() local
16366 Info.InConstantContext = true; in CheckEvalInICE()
16367 if (!::EvaluateAsRValue(E, EVResult, Ctx, Info) || EVResult.HasSideEffects || in CheckEvalInICE()
16839 EvalInfo Info(Ctx, Status, EvalInfo::EM_IgnoreSideEffects); in getIntegerConstantExpr() local
16840 Info.InConstantContext = true; in getIntegerConstantExpr()
16842 if (!::EvaluateAsInt(this, ExprResult, Ctx, SE_AllowSideEffects, Info)) in getIntegerConstantExpr()
16868 EvalInfo Info(Ctx, Status, EvalInfo::EM_ConstantExpression); in isCXX11ConstantExpr() local
16872 ::EvaluateAsRValue(Info, this, Result ? *Result : Scratch) && in isCXX11ConstantExpr()
16875 Info.discardCleanups() && !Status.HasSideEffects; in isCXX11ConstantExpr()
16904 EvalInfo Info(Ctx, Status, EvalInfo::EM_ConstantExpressionUnevaluated); in EvaluateWithSubstitution() local
16905 Info.InConstantContext = true; in EvaluateWithSubstitution()
16917 EvaluateObjectArgument(Info, This, ThisVal) && in EvaluateWithSubstitution()
16918 !Info.EvalStatus.HasSideEffects) in EvaluateWithSubstitution()
16923 Info.EvalStatus.HasSideEffects = false; in EvaluateWithSubstitution()
16926 CallRef Call = Info.CurrentCall->createCall(Callee); in EvaluateWithSubstitution()
16934 !EvaluateCallArg(PVD, *I, Call, Info) || in EvaluateWithSubstitution()
16935 Info.EvalStatus.HasSideEffects) { in EvaluateWithSubstitution()
16937 if (APValue *Slot = Info.getParamSlot(Call, PVD)) in EvaluateWithSubstitution()
16943 Info.EvalStatus.HasSideEffects = false; in EvaluateWithSubstitution()
16948 Info.discardCleanups(); in EvaluateWithSubstitution()
16949 Info.EvalStatus.HasSideEffects = false; in EvaluateWithSubstitution()
16952 CallStackFrame Frame(Info, Callee->getLocation(), Callee, ThisPtr, This, in EvaluateWithSubstitution()
16955 FullExpressionRAII Scope(Info); in EvaluateWithSubstitution()
16956 return Evaluate(Value, Info, this) && Scope.destroy() && in EvaluateWithSubstitution()
16957 !Info.EvalStatus.HasSideEffects; in EvaluateWithSubstitution()
16980 EvalInfo Info(FD->getASTContext(), Status, EvalInfo::EM_ConstantExpression); in isPotentialConstantExpr() local
16981 Info.InConstantContext = true; in isPotentialConstantExpr()
16982 Info.CheckingPotentialConstantExpression = true; in isPotentialConstantExpr()
16985 if (Info.EnableNewConstInterp) { in isPotentialConstantExpr()
16986 Info.Ctx.getInterpContext().isPotentialConstantExpr(Info, FD); in isPotentialConstantExpr()
16996 ImplicitValueInitExpr VIE(RD ? Info.Ctx.getRecordType(RD) : Info.Ctx.IntTy); in isPotentialConstantExpr()
16997 This.set({&VIE, Info.CurrentCall->Index}); in isPotentialConstantExpr()
17005 Info.setEvaluatingDecl(This.getLValueBase(), Scratch); in isPotentialConstantExpr()
17006 HandleConstructorCall(&VIE, This, Args, CD, Info, Scratch); in isPotentialConstantExpr()
17011 &VIE, Args, CallRef(), FD->getBody(), Info, Scratch, in isPotentialConstantExpr()
17028 EvalInfo Info(FD->getASTContext(), Status, in isPotentialConstantExprUnevaluated() local
17030 Info.InConstantContext = true; in isPotentialConstantExprUnevaluated()
17031 Info.CheckingPotentialConstantExpression = true; in isPotentialConstantExprUnevaluated()
17034 CallStackFrame Frame(Info, SourceLocation(), FD, /*This=*/nullptr, in isPotentialConstantExprUnevaluated()
17038 Evaluate(ResultScratch, Info, E); in isPotentialConstantExprUnevaluated()
17048 EvalInfo Info(Ctx, Status, EvalInfo::EM_ConstantFold); in tryEvaluateObjectSize() local
17049 return tryEvaluateBuiltinObjectSize(this, Type, Info, Result); in tryEvaluateObjectSize()
17053 EvalInfo &Info, std::string *StringResult) { in EvaluateBuiltinStrLen() argument
17059 if (!EvaluatePointer(E, String, Info)) in EvaluateBuiltinStrLen()
17072 Info.Ctx.hasSameUnqualifiedType(CharTy, Info.Ctx.CharTy)) { in EvaluateBuiltinStrLen()
17091 if (!handleLValueToRValueConversion(Info, E, CharTy, String, Char) || in EvaluateBuiltinStrLen()
17099 if (!HandleLValueArrayAdjustment(Info, E, String, CharTy, 1)) in EvaluateBuiltinStrLen()
17106 EvalInfo Info(Ctx, Status, EvalInfo::EM_ConstantFold); in tryEvaluateString() local
17110 if (EvaluateBuiltinStrLen(this, Result, Info, &StringResult)) in tryEvaluateString()
17120 EvalInfo Info(Ctx, Status, EvalInfo::EM_ConstantExpression); in EvaluateCharRangeAsString() local
17121 Info.InConstantContext = true; in EvaluateCharRangeAsString()
17123 FullExpressionRAII Scope(Info); in EvaluateCharRangeAsString()
17125 if (!::EvaluateInteger(SizeExpression, SizeValue, Info)) in EvaluateCharRangeAsString()
17130 if (!::EvaluatePointer(PtrExpression, String, Info)) in EvaluateCharRangeAsString()
17136 if (!handleLValueToRValueConversion(Info, PtrExpression, CharTy, String, in EvaluateCharRangeAsString()
17142 if (!HandleLValueArrayAdjustment(Info, PtrExpression, String, CharTy, 1)) in EvaluateCharRangeAsString()
17148 if (!CheckMemoryLeaks(Info)) in EvaluateCharRangeAsString()
17156 EvalInfo Info(Ctx, Status, EvalInfo::EM_ConstantFold); in tryEvaluateStrLen() local
17157 return EvaluateBuiltinStrLen(this, Result, Info); in tryEvaluateStrLen()