Lines Matching refs:Info

383     bool checkSubobject(EvalInfo &Info, const Expr *E, CheckSubobjectKind CSK);
440 void diagnoseUnsizedArrayPointerArithmetic(EvalInfo &Info, const Expr *E);
441 void diagnosePointerArithmetic(EvalInfo &Info, const Expr *E,
444 void adjustIndex(EvalInfo &Info, const Expr *E, APSInt N) { in adjustIndex()
448 diagnoseUnsizedArrayPointerArithmetic(Info, E); in adjustIndex()
473 diagnosePointerArithmetic(Info, E, N); in adjustIndex()
525 EvalInfo &Info; member in __anon7ee061300111::CallStackFrame
590 CallStackFrame(EvalInfo &Info, SourceRange CallRange,
696 static bool HandleDestruction(EvalInfo &Info, const Expr *E,
698 static bool HandleDestruction(EvalInfo &Info, SourceLocation Loc,
719 bool endLifetime(EvalInfo &Info, bool RunDestructors) { in endLifetime() argument
726 return HandleDestruction(Info, Loc, Base, *Value.getPointer(), T); in endLifetime()
1292 EvalInfo &Info; member in __anon7ee061300411::EvalInfo::ArrayInitLoopIndex
1296 ArrayInitLoopIndex(EvalInfo &Info) in ArrayInitLoopIndex() argument
1297 : Info(Info), OuterIndex(Info.ArrayInitIndex) { in ArrayInitLoopIndex()
1298 Info.ArrayInitIndex = 0; in ArrayInitLoopIndex()
1300 ~ArrayInitLoopIndex() { Info.ArrayInitIndex = OuterIndex; } in ~ArrayInitLoopIndex()
1302 operator uint64_t&() { return Info.ArrayInitIndex; } in operator uint64_t&()
1308 EvalInfo &Info; member
1313 explicit FoldConstant(EvalInfo &Info, bool Enabled) in FoldConstant()
1314 : Info(Info), in FoldConstant()
1316 HadNoPriorDiags(Info.EvalStatus.Diag && in FoldConstant()
1317 Info.EvalStatus.Diag->empty() && in FoldConstant()
1318 !Info.EvalStatus.HasSideEffects), in FoldConstant()
1319 OldMode(Info.EvalMode) { in FoldConstant()
1321 Info.EvalMode = EvalInfo::EM_ConstantFold; in FoldConstant()
1325 if (Enabled && HadNoPriorDiags && !Info.EvalStatus.Diag->empty() && in ~FoldConstant()
1326 !Info.EvalStatus.HasSideEffects) in ~FoldConstant()
1327 Info.EvalStatus.Diag->clear(); in ~FoldConstant()
1328 Info.EvalMode = OldMode; in ~FoldConstant()
1335 EvalInfo &Info; member
1337 explicit IgnoreSideEffectsRAII(EvalInfo &Info) in IgnoreSideEffectsRAII()
1338 : Info(Info), OldMode(Info.EvalMode) { in IgnoreSideEffectsRAII()
1339 Info.EvalMode = EvalInfo::EM_IgnoreSideEffects; in IgnoreSideEffectsRAII()
1342 ~IgnoreSideEffectsRAII() { Info.EvalMode = OldMode; } in ~IgnoreSideEffectsRAII()
1348 EvalInfo *Info = nullptr; member in __anon7ee061300411::SpeculativeEvaluationRAII
1353 Info = Other.Info; in moveFromAndCancel()
1356 Other.Info = nullptr; in moveFromAndCancel()
1360 if (!Info) in maybeRestoreState()
1363 Info->EvalStatus = OldStatus; in maybeRestoreState()
1364 Info->SpeculativeEvaluationDepth = OldSpeculativeEvaluationDepth; in maybeRestoreState()
1371 EvalInfo &Info, SmallVectorImpl<PartialDiagnosticAt> *NewDiag = nullptr) in SpeculativeEvaluationRAII() argument
1372 : Info(&Info), OldStatus(Info.EvalStatus), in SpeculativeEvaluationRAII()
1373 OldSpeculativeEvaluationDepth(Info.SpeculativeEvaluationDepth) { in SpeculativeEvaluationRAII()
1374 Info.EvalStatus.Diag = NewDiag; in SpeculativeEvaluationRAII()
1375 Info.SpeculativeEvaluationDepth = Info.CallStackDepth + 1; in SpeculativeEvaluationRAII()
1396 EvalInfo &Info; member in __anon7ee061300411::ScopeRAII
1399 ScopeRAII(EvalInfo &Info) in ScopeRAII() argument
1400 : Info(Info), OldStackSize(Info.CleanupStack.size()) { in ScopeRAII()
1403 Info.CurrentCall->pushTempVersion(); in ScopeRAII()
1406 bool OK = cleanup(Info, RunDestructors, OldStackSize); in destroy()
1415 Info.CurrentCall->popTempVersion(); in ~ScopeRAII()
1418 static bool cleanup(EvalInfo &Info, bool RunDestructors, in cleanup() argument
1420 assert(OldStackSize <= Info.CleanupStack.size() && in cleanup()
1426 for (unsigned I = Info.CleanupStack.size(); I > OldStackSize; --I) { in cleanup()
1427 if (Info.CleanupStack[I - 1].isDestroyedAtEndOf(Kind)) { in cleanup()
1428 if (!Info.CleanupStack[I - 1].endLifetime(Info, RunDestructors)) { in cleanup()
1436 auto NewEnd = Info.CleanupStack.begin() + OldStackSize; in cleanup()
1439 std::remove_if(NewEnd, Info.CleanupStack.end(), [](Cleanup &C) { in cleanup()
1442 Info.CleanupStack.erase(NewEnd, Info.CleanupStack.end()); in cleanup()
1451 bool SubobjectDesignator::checkSubobject(EvalInfo &Info, const Expr *E, in checkSubobject() argument
1456 Info.CCEDiag(E, diag::note_constexpr_past_end_subobject) in checkSubobject()
1467 void SubobjectDesignator::diagnoseUnsizedArrayPointerArithmetic(EvalInfo &Info, in diagnoseUnsizedArrayPointerArithmetic() argument
1469 Info.CCEDiag(E, diag::note_constexpr_unsized_array_indexed); in diagnoseUnsizedArrayPointerArithmetic()
1474 void SubobjectDesignator::diagnosePointerArithmetic(EvalInfo &Info, in diagnosePointerArithmetic() argument
1480 Info.CCEDiag(E, diag::note_constexpr_array_index) in diagnosePointerArithmetic()
1484 Info.CCEDiag(E, diag::note_constexpr_array_index) in diagnosePointerArithmetic()
1489 CallStackFrame::CallStackFrame(EvalInfo &Info, SourceRange CallRange, in CallStackFrame() argument
1492 : Info(Info), Caller(Info.CurrentCall), Callee(Callee), This(This), in CallStackFrame()
1494 Index(Info.NextCallIndex++) { in CallStackFrame()
1495 Info.CurrentCall = this; in CallStackFrame()
1496 ++Info.CallStackDepth; in CallStackFrame()
1500 assert(Info.CurrentCall == this && "calls retired out of order"); in ~CallStackFrame()
1501 --Info.CallStackDepth; in ~CallStackFrame()
1502 Info.CurrentCall = Caller; in ~CallStackFrame()
1689 bool checkNullPointer(EvalInfo &Info, const Expr *E, in checkNullPointer()
1691 return checkNullPointerDiagnosingWith([&Info, E, CSK] { in checkNullPointer()
1692 Info.CCEDiag(E, diag::note_constexpr_null_subobject) << CSK; in checkNullPointer()
1696 bool checkNullPointerForFoldAccess(EvalInfo &Info, const Expr *E, in checkNullPointerForFoldAccess()
1698 return checkNullPointerDiagnosingWith([&Info, E, AK] { in checkNullPointerForFoldAccess()
1699 Info.FFDiag(E, diag::note_constexpr_access_null) << AK; in checkNullPointerForFoldAccess()
1705 bool checkSubobject(EvalInfo &Info, const Expr *E, CheckSubobjectKind CSK) { in checkSubobject()
1706 return (CSK == CSK_ArrayToPointer || checkNullPointer(Info, E, CSK)) && in checkSubobject()
1707 Designator.checkSubobject(Info, E, CSK); in checkSubobject()
1710 void addDecl(EvalInfo &Info, const Expr *E, in addDecl()
1712 if (checkSubobject(Info, E, isa<FieldDecl>(D) ? CSK_Field : CSK_Base)) in addDecl()
1715 void addUnsizedArray(EvalInfo &Info, const Expr *E, QualType ElemTy) { in addUnsizedArray()
1717 Info.CCEDiag(E, diag::note_constexpr_unsupported_unsized_array); in addUnsizedArray()
1721 if (checkSubobject(Info, E, CSK_ArrayToPointer)) { in addUnsizedArray()
1727 void addArray(EvalInfo &Info, const Expr *E, const ConstantArrayType *CAT) { in addArray()
1728 if (checkSubobject(Info, E, CSK_ArrayToPointer)) in addArray()
1731 void addComplex(EvalInfo &Info, const Expr *E, QualType EltTy, bool Imag) { in addComplex()
1732 if (checkSubobject(Info, E, Imag ? CSK_Imag : CSK_Real)) in addComplex()
1738 void adjustOffsetAndIndex(EvalInfo &Info, const Expr *E, in adjustOffsetAndIndex()
1753 if (checkNullPointer(Info, E, CSK_ArrayIndex)) in adjustOffsetAndIndex()
1754 Designator.adjustIndex(Info, E, Index); in adjustOffsetAndIndex()
1863 static bool Evaluate(APValue &Result, EvalInfo &Info, const Expr *E);
1864 static bool EvaluateInPlace(APValue &Result, EvalInfo &Info,
1867 static bool EvaluateLValue(const Expr *E, LValue &Result, EvalInfo &Info,
1869 static bool EvaluatePointer(const Expr *E, LValue &Result, EvalInfo &Info,
1872 EvalInfo &Info);
1873 static bool EvaluateTemporary(const Expr *E, LValue &Result, EvalInfo &Info);
1874 static bool EvaluateInteger(const Expr *E, APSInt &Result, EvalInfo &Info);
1876 EvalInfo &Info);
1877 static bool EvaluateFloat(const Expr *E, APFloat &Result, EvalInfo &Info);
1878 static bool EvaluateComplex(const Expr *E, ComplexValue &Res, EvalInfo &Info);
1880 EvalInfo &Info);
1881 static bool EvaluateAsRValue(EvalInfo &Info, const Expr *E, APValue &Result);
1883 EvalInfo &Info);
1887 EvalInfo &Info);
1891 EvalInfo &Info);
1939 if (Index <= Info.SpeculativeEvaluationDepth) { in createLocal()
1941 Info.noteSideEffect(); in createLocal()
1943 Info.CleanupStack.push_back(Cleanup(&Result, Base, T, Scope)); in createLocal()
1971 Callee->getNameForDiagnostic(Out, Info.Ctx.getPrintingPolicy(), in describe()
1977 Object->printPretty(Out, /*Helper=*/nullptr, Info.Ctx.getPrintingPolicy(), in describe()
1986 Info.Ctx.getPrintingPolicy(), in describe()
1993 Out, Info.Ctx, in describe()
1994 Info.Ctx.getLValueReferenceType(This->Designator.MostDerivedType)); in describe()
1997 Callee->getNameForDiagnostic(Out, Info.Ctx.getPrintingPolicy(), in describe()
2010 APValue *V = Info.getParamSlot(Arguments, Param); in describe()
2012 V->printPretty(Out, Info.Ctx, Param->getType()); in describe()
2026 static bool EvaluateIgnoredValue(EvalInfo &Info, const Expr *E) { in EvaluateIgnoredValue() argument
2029 if (!Evaluate(Scratch, Info, E)) in EvaluateIgnoredValue()
2031 return Info.noteSideEffect(); in EvaluateIgnoredValue()
2152 static void NoteLValueLocation(EvalInfo &Info, APValue::LValueBase Base) { in NoteLValueLocation() argument
2161 for (CallStackFrame *F = Info.CurrentCall; F; F = F->Caller) { in NoteLValueLocation()
2172 Info.Note(VD->getLocation(), diag::note_declared_at); in NoteLValueLocation()
2174 Info.Note(E->getExprLoc(), diag::note_constexpr_temporary_here); in NoteLValueLocation()
2177 if (std::optional<DynAlloc *> Alloc = Info.lookupDynamicAlloc(DA)) in NoteLValueLocation()
2178 Info.Note((*Alloc)->AllocExpr->getExprLoc(), in NoteLValueLocation()
2196 EvalInfo &Info, SourceLocation DiagLoc,
2205 static bool CheckLValueConstantExpression(EvalInfo &Info, SourceLocation Loc, in CheckLValueConstantExpression() argument
2236 Info.FFDiag(Loc, diag::note_constexpr_invalid_template_arg) in CheckLValueConstantExpression()
2245 Info.FFDiag(Loc, diag::note_consteval_address_accessible) in CheckLValueConstantExpression()
2247 Info.Note(FD->getLocation(), diag::note_declared_at); in CheckLValueConstantExpression()
2255 if (Info.getLangOpts().CPlusPlus11) { in CheckLValueConstantExpression()
2256 Info.FFDiag(Loc, diag::note_constexpr_non_global, 1) in CheckLValueConstantExpression()
2266 Info.Note(VarD->getLocation(), diag::note_constexpr_not_static) in CheckLValueConstantExpression()
2270 NoteLValueLocation(Info, Base); in CheckLValueConstantExpression()
2273 Info.FFDiag(Loc); in CheckLValueConstantExpression()
2278 assert((Info.checkingPotentialConstantExpression() || in CheckLValueConstantExpression()
2283 Info.FFDiag(Loc, diag::note_constexpr_dynamic_alloc) in CheckLValueConstantExpression()
2285 NoteLValueLocation(Info, Base); in CheckLValueConstantExpression()
2304 if (Info.getCtx().getLangOpts().CUDA && in CheckLValueConstantExpression()
2305 Info.getCtx().getLangOpts().CUDAIsDevice && in CheckLValueConstantExpression()
2306 Info.getCtx().CUDAConstantEvalCtx.NoWrongSidedVars) { in CheckLValueConstantExpression()
2326 if (Info.getLangOpts().CPlusPlus && !isForManglingOnly(Kind) && in CheckLValueConstantExpression()
2336 Info.FFDiag(MTE->getExprLoc(), in CheckLValueConstantExpression()
2345 Info, MTE->getExprLoc(), TempType, *V, Kind, in CheckLValueConstantExpression()
2359 Info.CCEDiag(Loc); in CheckLValueConstantExpression()
2365 Info.FFDiag(Loc, diag::note_constexpr_past_end, 1) in CheckLValueConstantExpression()
2367 NoteLValueLocation(Info, Base); in CheckLValueConstantExpression()
2375 static bool CheckMemberPointerConstantExpression(EvalInfo &Info, in CheckMemberPointerConstantExpression() argument
2385 Info.FFDiag(Loc, diag::note_consteval_address_accessible) << /*pointer*/ 0; in CheckMemberPointerConstantExpression()
2386 Info.Note(FD->getLocation(), diag::note_declared_at); in CheckMemberPointerConstantExpression()
2395 static bool CheckLiteralType(EvalInfo &Info, const Expr *E, in CheckLiteralType() argument
2397 if (!E->isPRValue() || E->getType()->isLiteralType(Info.Ctx)) in CheckLiteralType()
2413 if (This && Info.EvaluatingDecl == This->getLValueBase()) in CheckLiteralType()
2417 if (Info.getLangOpts().CPlusPlus11) in CheckLiteralType()
2418 Info.FFDiag(E, diag::note_constexpr_nonliteral) in CheckLiteralType()
2421 Info.FFDiag(E, diag::note_invalid_subexpr_in_const_expr); in CheckLiteralType()
2426 EvalInfo &Info, SourceLocation DiagLoc, in CheckEvaluationResult() argument
2433 Info.FFDiag(DiagLoc, diag::note_constexpr_uninitialized) in CheckEvaluationResult()
2435 Info.Note(SubobjectDecl->getLocation(), in CheckEvaluationResult()
2438 Info.FFDiag(DiagLoc, diag::note_constexpr_uninitialized) in CheckEvaluationResult()
2455 if (!CheckEvaluationResult(CERK, Info, DiagLoc, EltTy, in CheckEvaluationResult()
2462 return CheckEvaluationResult(CERK, Info, DiagLoc, EltTy, in CheckEvaluationResult()
2468 CERK, Info, DiagLoc, Value.getUnionField()->getType(), in CheckEvaluationResult()
2479 Info.FFDiag(TypeBeginLoc, diag::note_constexpr_uninitialized_base) in CheckEvaluationResult()
2483 if (!CheckEvaluationResult(CERK, Info, DiagLoc, BS.getType(), BaseValue, in CheckEvaluationResult()
2494 if (!CheckEvaluationResult(CERK, Info, DiagLoc, I->getType(), in CheckEvaluationResult()
2504 LVal.setFrom(Info.Ctx, Value); in CheckEvaluationResult()
2505 return CheckLValueConstantExpression(Info, DiagLoc, Type, LVal, Kind, in CheckEvaluationResult()
2511 return CheckMemberPointerConstantExpression(Info, DiagLoc, Type, Value, Kind); in CheckEvaluationResult()
2520 static bool CheckConstantExpression(EvalInfo &Info, SourceLocation DiagLoc, in CheckConstantExpression() argument
2529 Info, DiagLoc, Type, Value, Kind, in CheckConstantExpression()
2535 static bool CheckFullyInitialized(EvalInfo &Info, SourceLocation DiagLoc, in CheckFullyInitialized() argument
2539 CheckEvaluationResultKind::FullyInitialized, Info, DiagLoc, Type, Value, in CheckFullyInitialized()
2545 static bool CheckMemoryLeaks(EvalInfo &Info) { in CheckMemoryLeaks() argument
2546 if (!Info.HeapAllocs.empty()) { in CheckMemoryLeaks()
2550 Info.CCEDiag(Info.HeapAllocs.begin()->second.AllocExpr, in CheckMemoryLeaks()
2552 << unsigned(Info.HeapAllocs.size() - 1); in CheckMemoryLeaks()
2616 EvalInfo &Info) { in EvaluateAsBooleanCondition() argument
2620 if (!Evaluate(Val, Info, E)) in EvaluateAsBooleanCondition()
2626 static bool HandleOverflow(EvalInfo &Info, const Expr *E, in HandleOverflow() argument
2628 Info.CCEDiag(E, diag::note_constexpr_overflow) in HandleOverflow()
2630 return Info.noteUndefinedBehavior(); in HandleOverflow()
2633 static bool HandleFloatToIntCast(EvalInfo &Info, const Expr *E, in HandleFloatToIntCast() argument
2636 unsigned DestWidth = Info.Ctx.getIntWidth(DestType); in HandleFloatToIntCast()
2644 return HandleOverflow(Info, E, Value, DestType); in HandleFloatToIntCast()
2653 static llvm::RoundingMode getActiveRoundingMode(EvalInfo &Info, const Expr *E) { in getActiveRoundingMode() argument
2655 E->getFPFeaturesInEffect(Info.Ctx.getLangOpts()).getRoundingMode(); in getActiveRoundingMode()
2662 static bool checkFloatingPointResult(EvalInfo &Info, const Expr *E, in checkFloatingPointResult() argument
2666 if (Info.InConstantContext) in checkFloatingPointResult()
2669 FPOptions FPO = E->getFPFeaturesInEffect(Info.Ctx.getLangOpts()); in checkFloatingPointResult()
2674 Info.FFDiag(E, diag::note_constexpr_dynamic_rounding); in checkFloatingPointResult()
2682 Info.FFDiag(E, diag::note_constexpr_float_arithmetic_strict); in checkFloatingPointResult()
2689 Info.FFDiag(E); in checkFloatingPointResult()
2702 static bool HandleFloatToFloatCast(EvalInfo &Info, const Expr *E, in HandleFloatToFloatCast() argument
2706 llvm::RoundingMode RM = getActiveRoundingMode(Info, E); in HandleFloatToFloatCast()
2710 St = Result.convert(Info.Ctx.getFloatTypeSemantics(DestType), RM, &ignored); in HandleFloatToFloatCast()
2711 return checkFloatingPointResult(Info, E, St); in HandleFloatToFloatCast()
2714 static APSInt HandleIntToIntCast(EvalInfo &Info, const Expr *E, in HandleIntToIntCast() argument
2717 unsigned DestWidth = Info.Ctx.getIntWidth(DestType); in HandleIntToIntCast()
2727 static bool HandleIntToFloatCast(EvalInfo &Info, const Expr *E, in HandleIntToFloatCast() argument
2731 Result = APFloat(Info.Ctx.getFloatTypeSemantics(DestType), 1); in HandleIntToFloatCast()
2732 llvm::RoundingMode RM = getActiveRoundingMode(Info, E); in HandleIntToFloatCast()
2734 return checkFloatingPointResult(Info, E, St); in HandleIntToFloatCast()
2737 static bool truncateBitfieldValue(EvalInfo &Info, const Expr *E, in truncateBitfieldValue() argument
2746 Info.FFDiag(E); in truncateBitfieldValue()
2752 unsigned NewBitWidth = FD->getBitWidthValue(Info.Ctx); in truncateBitfieldValue()
2762 static bool CheckedIntArithmetic(EvalInfo &Info, const Expr *E, in CheckedIntArithmetic() argument
2774 if (Info.checkingForUndefinedBehavior()) in CheckedIntArithmetic()
2775 Info.Ctx.getDiagnostics().Report(E->getExprLoc(), in CheckedIntArithmetic()
2778 return HandleOverflow(Info, E, Value, E->getType()); in CheckedIntArithmetic()
2784 static bool handleIntIntBinOp(EvalInfo &Info, const BinaryOperator *E, in handleIntIntBinOp() argument
2790 Info.FFDiag(E); in handleIntIntBinOp()
2793 return CheckedIntArithmetic(Info, E, LHS, RHS, LHS.getBitWidth() * 2, in handleIntIntBinOp()
2796 return CheckedIntArithmetic(Info, E, LHS, RHS, LHS.getBitWidth() + 1, in handleIntIntBinOp()
2799 return CheckedIntArithmetic(Info, E, LHS, RHS, LHS.getBitWidth() + 1, in handleIntIntBinOp()
2807 Info.FFDiag(E, diag::note_expr_divide_by_zero) in handleIntIntBinOp()
2816 Info, E, -LHS.extend(LHS.getBitWidth() + 1), E->getType()); in handleIntIntBinOp()
2820 if (Info.getLangOpts().OpenCL) in handleIntIntBinOp()
2828 Info.CCEDiag(E, diag::note_constexpr_negative_shift) << RHS; in handleIntIntBinOp()
2837 Info.CCEDiag(E, diag::note_constexpr_large_shift) in handleIntIntBinOp()
2839 } else if (LHS.isSigned() && !Info.getLangOpts().CPlusPlus20) { in handleIntIntBinOp()
2845 Info.CCEDiag(E, diag::note_constexpr_lshift_of_negative) << LHS; in handleIntIntBinOp()
2847 Info.CCEDiag(E, diag::note_constexpr_lshift_discards); in handleIntIntBinOp()
2853 if (Info.getLangOpts().OpenCL) in handleIntIntBinOp()
2861 Info.CCEDiag(E, diag::note_constexpr_negative_shift) << RHS; in handleIntIntBinOp()
2870 Info.CCEDiag(E, diag::note_constexpr_large_shift) in handleIntIntBinOp()
2888 static bool handleFloatFloatBinOp(EvalInfo &Info, const BinaryOperator *E, in handleFloatFloatBinOp() argument
2891 llvm::RoundingMode RM = getActiveRoundingMode(Info, E); in handleFloatFloatBinOp()
2895 Info.FFDiag(E); in handleFloatFloatBinOp()
2910 Info.CCEDiag(E, diag::note_expr_divide_by_zero); in handleFloatFloatBinOp()
2920 Info.CCEDiag(E, diag::note_constexpr_float_arithmetic) << LHS.isNaN(); in handleFloatFloatBinOp()
2921 return Info.noteUndefinedBehavior(); in handleFloatFloatBinOp()
2924 return checkFloatingPointResult(Info, E, St); in handleFloatFloatBinOp()
3012 static bool handleVectorVectorBinOp(EvalInfo &Info, const BinaryOperator *E, in handleVectorVectorBinOp() argument
3029 Info.FFDiag(E); in handleVectorVectorBinOp()
3043 APSInt EltResult{Info.Ctx.getIntWidth(EltTy), in handleVectorVectorBinOp()
3052 Success = handleIntIntBinOp(Info, E, LHSElt.getInt(), Opcode, in handleVectorVectorBinOp()
3056 Info.FFDiag(E); in handleVectorVectorBinOp()
3067 if (!handleFloatFloatBinOp(Info, E, LHSFloat, Opcode, in handleVectorVectorBinOp()
3069 Info.FFDiag(E); in handleVectorVectorBinOp()
3083 static bool CastToDerivedClass(EvalInfo &Info, const Expr *E, LValue &Result, in CastToDerivedClass() argument
3093 if (!Result.checkSubobject(Info, E, CSK_Derived)) in CastToDerivedClass()
3100 const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); in CastToDerivedClass()
3112 static bool HandleLValueDirectBase(EvalInfo &Info, const Expr *E, LValue &Obj, in HandleLValueDirectBase() argument
3118 RL = &Info.Ctx.getASTRecordLayout(Derived); in HandleLValueDirectBase()
3122 Obj.addDecl(Info, E, Base, /*Virtual*/ false); in HandleLValueDirectBase()
3126 static bool HandleLValueBase(EvalInfo &Info, const Expr *E, LValue &Obj, in HandleLValueBase() argument
3132 return HandleLValueDirectBase(Info, E, Obj, DerivedDecl, BaseDecl); in HandleLValueBase()
3140 if (!CastToDerivedClass(Info, E, Obj, DerivedDecl, D.MostDerivedPathLength)) in HandleLValueBase()
3145 const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(DerivedDecl); in HandleLValueBase()
3147 Obj.addDecl(Info, E, BaseDecl, /*Virtual*/ true); in HandleLValueBase()
3151 static bool HandleLValueBasePath(EvalInfo &Info, const CastExpr *E, in HandleLValueBasePath() argument
3156 if (!HandleLValueBase(Info, E, Result, Type->getAsCXXRecordDecl(), in HandleLValueBasePath()
3165 static bool CastToBaseClass(EvalInfo &Info, const Expr *E, LValue &Result, in CastToBaseClass() argument
3174 if (!HandleLValueBase(Info, E, Result, Elem.Class, Elem.Base)) in CastToBaseClass()
3181 static bool HandleLValueMember(EvalInfo &Info, const Expr *E, LValue &LVal, in HandleLValueMember() argument
3186 RL = &Info.Ctx.getASTRecordLayout(FD->getParent()); in HandleLValueMember()
3190 LVal.adjustOffset(Info.Ctx.toCharUnitsFromBits(RL->getFieldOffset(I))); in HandleLValueMember()
3191 LVal.addDecl(Info, E, FD); in HandleLValueMember()
3196 static bool HandleLValueIndirectMember(EvalInfo &Info, const Expr *E, in HandleLValueIndirectMember() argument
3200 if (!HandleLValueMember(Info, E, LVal, cast<FieldDecl>(C))) in HandleLValueIndirectMember()
3211 static bool HandleSizeof(EvalInfo &Info, SourceLocation Loc, QualType Type, in HandleSizeof() argument
3221 Info.FFDiag(Loc); in HandleSizeof()
3228 Info.FFDiag(Loc); in HandleSizeof()
3233 Size = Info.Ctx.getTypeSizeInChars(Type); in HandleSizeof()
3235 Size = Info.Ctx.getTypeInfoDataSizeInChars(Type).Width; in HandleSizeof()
3245 static bool HandleLValueArrayAdjustment(EvalInfo &Info, const Expr *E, in HandleLValueArrayAdjustment() argument
3249 if (!HandleSizeof(Info, E->getExprLoc(), EltTy, SizeOfPointee)) in HandleLValueArrayAdjustment()
3252 LVal.adjustOffsetAndIndex(Info, E, Adjustment, SizeOfPointee); in HandleLValueArrayAdjustment()
3256 static bool HandleLValueArrayAdjustment(EvalInfo &Info, const Expr *E, in HandleLValueArrayAdjustment() argument
3259 return HandleLValueArrayAdjustment(Info, E, LVal, EltTy, in HandleLValueArrayAdjustment()
3268 static bool HandleLValueComplexElement(EvalInfo &Info, const Expr *E, in HandleLValueComplexElement() argument
3273 if (!HandleSizeof(Info, E->getExprLoc(), EltTy, SizeOfComponent)) in HandleLValueComplexElement()
3277 LVal.addComplex(Info, E, EltTy, Imag); in HandleLValueComplexElement()
3290 static bool evaluateVarDeclInit(EvalInfo &Info, const Expr *E, in evaluateVarDeclInit() argument
3309 if (Info.checkingPotentialConstantExpression()) in evaluateVarDeclInit()
3313 Info.FFDiag(E->getBeginLoc(), in evaluateVarDeclInit()
3322 if (Info.EvaluatingDecl == Base) { in evaluateVarDeclInit()
3323 Result = Info.EvaluatingDeclValue; in evaluateVarDeclInit()
3330 if (!Info.checkingPotentialConstantExpression() || in evaluateVarDeclInit()
3331 !Info.CurrentCall->Callee || in evaluateVarDeclInit()
3332 !Info.CurrentCall->Callee->Equals(VD->getDeclContext())) { in evaluateVarDeclInit()
3333 if (Info.getLangOpts().CPlusPlus11) { in evaluateVarDeclInit()
3334 Info.FFDiag(E, diag::note_constexpr_function_param_value_unknown) in evaluateVarDeclInit()
3336 NoteLValueLocation(Info, Base); in evaluateVarDeclInit()
3338 Info.FFDiag(E); in evaluateVarDeclInit()
3354 if (!Info.checkingPotentialConstantExpression()) { in evaluateVarDeclInit()
3355 Info.FFDiag(E, diag::note_constexpr_var_init_unknown, 1) in evaluateVarDeclInit()
3357 NoteLValueLocation(Info, Base); in evaluateVarDeclInit()
3368 assert(!VD->mightBeUsableInConstantExpressions(Info.Ctx)); in evaluateVarDeclInit()
3369 if (!Info.checkingPotentialConstantExpression()) { in evaluateVarDeclInit()
3370 Info.FFDiag(E, Info.getLangOpts().CPlusPlus11 in evaluateVarDeclInit()
3374 NoteLValueLocation(Info, Base); in evaluateVarDeclInit()
3382 Info.FFDiag(E, diag::note_constexpr_var_init_non_constant, 1) << VD; in evaluateVarDeclInit()
3383 NoteLValueLocation(Info, Base); in evaluateVarDeclInit()
3396 if ((Info.getLangOpts().CPlusPlus && !VD->hasConstantInitialization() && in evaluateVarDeclInit()
3397 VD->mightBeUsableInConstantExpressions(Info.Ctx)) || in evaluateVarDeclInit()
3398 ((Info.getLangOpts().CPlusPlus || Info.getLangOpts().OpenCL) && in evaluateVarDeclInit()
3399 !Info.getLangOpts().CPlusPlus11 && !VD->hasICEInitializer(Info.Ctx))) { in evaluateVarDeclInit()
3400 Info.CCEDiag(E, diag::note_constexpr_var_init_non_constant, 1) << VD; in evaluateVarDeclInit()
3401 NoteLValueLocation(Info, Base); in evaluateVarDeclInit()
3407 Info.FFDiag(E, diag::note_constexpr_var_init_weak) << VD; in evaluateVarDeclInit()
3408 NoteLValueLocation(Info, Base); in evaluateVarDeclInit()
3432 static APSInt extractStringLiteralCharacter(EvalInfo &Info, const Expr *Lit, in extractStringLiteralCharacter() argument
3440 Info.Ctx.getObjCEncodingForType(ObjCEnc->getEncodedType(), Str); in extractStringLiteralCharacter()
3449 Info.Ctx.getAsConstantArrayType(S->getType()); in extractStringLiteralCharacter()
3453 APSInt Value(Info.Ctx.getTypeSize(CharType), in extractStringLiteralCharacter()
3464 static void expandStringLiteral(EvalInfo &Info, const StringLiteral *S, in expandStringLiteral() argument
3467 const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType( in expandStringLiteral()
3476 APSInt Value(Info.Ctx.getTypeSize(CharType), in expandStringLiteral()
3539 static bool diagnoseMutableFields(EvalInfo &Info, const Expr *E, AccessKinds AK, in diagnoseMutableFields() argument
3555 Info.FFDiag(E, diag::note_constexpr_access_mutable, 1) << AK << Field; in diagnoseMutableFields()
3556 Info.Note(Field->getLocation(), diag::note_declared_at); in diagnoseMutableFields()
3560 if (diagnoseMutableFields(Info, E, AK, Field->getType())) in diagnoseMutableFields()
3565 if (diagnoseMutableFields(Info, E, AK, BaseSpec.getType())) in diagnoseMutableFields()
3572 static bool lifetimeStartedInEvaluation(EvalInfo &Info, in lifetimeStartedInEvaluation() argument
3579 switch (Info.IsEvaluatingDecl) { in lifetimeStartedInEvaluation()
3585 if (Info.EvaluatingDecl == Base) in lifetimeStartedInEvaluation()
3592 return Info.EvaluatingDecl == BaseMTE->getExtendingDecl(); in lifetimeStartedInEvaluation()
3600 if (MutableSubobject || Base != Info.EvaluatingDecl) in lifetimeStartedInEvaluation()
3612 static bool CheckArraySize(EvalInfo &Info, const ConstantArrayType *CAT, in CheckArraySize() argument
3614 return Info.CheckArraySize(
3616 CAT->getNumAddressingBits(Info.Ctx), CAT->getSize().getZExtValue(),
3635 bool mayAccessMutableMembers(EvalInfo &Info, AccessKinds AK) const { in mayAccessMutableMembers()
3646 if (!Info.getLangOpts().CPlusPlus14) in mayAccessMutableMembers()
3648 return lifetimeStartedInEvaluation(Info, Base, /*MutableSubobject*/true); in mayAccessMutableMembers()
3672 findSubobject(EvalInfo &Info, const Expr *E, const CompleteObject &Obj, in findSubobject() argument
3678 if (Info.getLangOpts().CPlusPlus11) in findSubobject()
3679 Info.FFDiag(E, Sub.isOnePastTheEnd() in findSubobject()
3684 Info.FFDiag(E); in findSubobject()
3699 if (!Info.checkingPotentialConstantExpression()) in findSubobject()
3700 Info.FFDiag(E, diag::note_constexpr_access_uninit) in findSubobject()
3711 Info.isEvaluatingCtorDtor( in findSubobject()
3715 ObjType = Info.Ctx.getCanonicalType(ObjType); in findSubobject()
3724 if (Info.getLangOpts().CPlusPlus) { in findSubobject()
3741 Info.FFDiag(E, diag::note_constexpr_access_volatile_obj, 1) in findSubobject()
3743 Info.Note(Loc, diag::note_constexpr_volatile_here) << DiagKind; in findSubobject()
3745 Info.FFDiag(E, diag::note_invalid_subexpr_in_const_expr); in findSubobject()
3755 !Obj.mayAccessMutableMembers(Info, handler.AccessKind) && in findSubobject()
3756 diagnoseMutableFields(Info, E, handler.AccessKind, ObjType)) in findSubobject()
3767 !truncateBitfieldValue(Info, E, *O, LastField)) in findSubobject()
3776 const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType(ObjType); in findSubobject()
3782 if (Info.getLangOpts().CPlusPlus11) in findSubobject()
3783 Info.FFDiag(E, diag::note_constexpr_access_past_end) in findSubobject()
3786 Info.FFDiag(E); in findSubobject()
3795 if (!CheckArraySize(Info, CAT, E->getExprLoc())) in findSubobject()
3806 if (Info.getLangOpts().CPlusPlus11) in findSubobject()
3807 Info.FFDiag(E, diag::note_constexpr_access_past_end) in findSubobject()
3810 Info.FFDiag(E); in findSubobject()
3828 !Obj.mayAccessMutableMembers(Info, handler.AccessKind)) { in findSubobject()
3829 Info.FFDiag(E, diag::note_constexpr_access_mutable, 1) in findSubobject()
3831 Info.Note(Field->getLocation(), diag::note_declared_at); in findSubobject()
3849 Info.FFDiag(E, diag::note_constexpr_access_inactive_union_member) in findSubobject()
3868 ObjType = getSubobjectType(ObjType, Info.Ctx.getRecordType(Base)); in findSubobject()
3875 EvalInfo &Info; member
3886 return CheckFullyInitialized(Info, E->getExprLoc(), SubobjType, Result); in found()
3900 static bool extractSubobject(EvalInfo &Info, const Expr *E, in extractSubobject() argument
3905 ExtractSubobjectHandler Handler = {Info, E, Result, AK}; in extractSubobject()
3906 return findSubobject(Info, E, Obj, Sub, Handler); in extractSubobject()
3911 EvalInfo &Info; member
3921 Info.FFDiag(E, diag::note_constexpr_modify_const_type) << QT; in checkConst()
3940 Info.FFDiag(E); in found()
3958 static bool modifySubobject(EvalInfo &Info, const Expr *E, in modifySubobject() argument
3962 ModifySubobjectHandler Handler = { Info, NewVal, E }; in modifySubobject()
3963 return findSubobject(Info, E, Obj, Sub, Handler); in modifySubobject()
4025 static CompleteObject findCompleteObject(EvalInfo &Info, const Expr *E, in findCompleteObject() argument
4029 Info.FFDiag(E); in findCompleteObject()
4034 Info.FFDiag(E, diag::note_constexpr_access_null) << AK; in findCompleteObject()
4042 Info.getCallFrameAndDepth(LVal.getLValueCallIndex()); in findCompleteObject()
4044 Info.FFDiag(E, diag::note_constexpr_lifetime_ended, 1) in findCompleteObject()
4046 NoteLValueLocation(Info, LVal.Base); in findCompleteObject()
4058 if (Info.getLangOpts().CPlusPlus) in findCompleteObject()
4059 Info.FFDiag(E, diag::note_constexpr_access_volatile_type) in findCompleteObject()
4062 Info.FFDiag(E); in findCompleteObject()
4070 if (Info.getLangOpts().CPlusPlus14 && LVal.Base == Info.EvaluatingDecl && in findCompleteObject()
4071 lifetimeStartedInEvaluation(Info, LVal.Base)) { in findCompleteObject()
4074 BaseVal = Info.EvaluatingDeclValue; in findCompleteObject()
4080 Info.FFDiag(E, diag::note_constexpr_modify_global); in findCompleteObject()
4085 Info.FFDiag(E, diag::note_constexpr_unsupported_layout) in findCompleteObject()
4095 Info.FFDiag(E, diag::note_constexpr_modify_global); in findCompleteObject()
4105 Info.FFDiag(E, diag::note_constexpr_modify_global); in findCompleteObject()
4121 if (const VarDecl *VDef = VD->getDefinition(Info.Ctx)) in findCompleteObject()
4125 Info.FFDiag(E); in findCompleteObject()
4129 bool IsConstant = BaseType.isConstant(Info.Ctx); in findCompleteObject()
4138 } else if (Info.getLangOpts().CPlusPlus14 && in findCompleteObject()
4139 lifetimeStartedInEvaluation(Info, LVal.Base)) { in findCompleteObject()
4145 Info.FFDiag(E, diag::note_constexpr_modify_global); in findCompleteObject()
4153 if (Info.getLangOpts().CPlusPlus) { in findCompleteObject()
4154 Info.FFDiag(E, diag::note_constexpr_ltor_non_const_int, 1) << VD; in findCompleteObject()
4155 Info.Note(VD->getLocation(), diag::note_declared_at); in findCompleteObject()
4157 Info.FFDiag(E); in findCompleteObject()
4163 } else if (IsConstant && Info.checkingPotentialConstantExpression() && in findCompleteObject()
4164 BaseType->isLiteralType(Info.Ctx) && !VD->hasDefinition()) { in findCompleteObject()
4170 if (Info.getLangOpts().CPlusPlus) { in findCompleteObject()
4171 Info.CCEDiag(E, Info.getLangOpts().CPlusPlus11 in findCompleteObject()
4175 Info.Note(VD->getLocation(), diag::note_declared_at); in findCompleteObject()
4177 Info.CCEDiag(E); in findCompleteObject()
4181 if (Info.getLangOpts().CPlusPlus) { in findCompleteObject()
4182 Info.FFDiag(E, Info.getLangOpts().CPlusPlus11 in findCompleteObject()
4186 Info.Note(VD->getLocation(), diag::note_declared_at); in findCompleteObject()
4188 Info.FFDiag(E); in findCompleteObject()
4194 if (!evaluateVarDeclInit(Info, E, VD, Frame, LVal.getLValueVersion(), BaseVal)) in findCompleteObject()
4197 std::optional<DynAlloc *> Alloc = Info.lookupDynamicAlloc(DA); in findCompleteObject()
4199 Info.FFDiag(E, diag::note_constexpr_access_deleted_object) << AK; in findCompleteObject()
4238 if (!MTE->isUsableInConstantExpressions(Info.Ctx) && in findCompleteObject()
4239 !lifetimeStartedInEvaluation(Info, LVal.Base)) { in findCompleteObject()
4242 Info.FFDiag(E, diag::note_constexpr_access_static_temporary, 1) << AK; in findCompleteObject()
4243 Info.Note(MTE->getExprLoc(), diag::note_constexpr_temporary_here); in findCompleteObject()
4254 Info.FFDiag(E, diag::note_constexpr_access_unreadable_object) in findCompleteObject()
4256 << Val.getAsString(Info.Ctx, in findCompleteObject()
4257 Info.Ctx.getLValueReferenceType(LValType)); in findCompleteObject()
4258 NoteLValueLocation(Info, LVal.Base); in findCompleteObject()
4278 if ((Frame && Info.getLangOpts().CPlusPlus14 && in findCompleteObject()
4279 Info.EvalStatus.HasSideEffects) || in findCompleteObject()
4280 (isModification(AK) && VisibleDepth < Info.SpeculativeEvaluationDepth)) in findCompleteObject()
4301 handleLValueToRValueConversion(EvalInfo &Info, const Expr *Conv, QualType Type, in handleLValueToRValueConversion() argument
4319 Info.FFDiag(Conv); in handleLValueToRValueConversion()
4324 if (!Evaluate(Lit, Info, CLE->getInitializer())) in handleLValueToRValueConversion()
4342 if (!CLETy.isConstant(Info.Ctx)) { in handleLValueToRValueConversion()
4343 Info.FFDiag(Conv); in handleLValueToRValueConversion()
4344 Info.Note(CLE->getExprLoc(), diag::note_declared_at); in handleLValueToRValueConversion()
4350 return extractSubobject(Info, Conv, LitObj, LVal.Designator, RVal, AK); in handleLValueToRValueConversion()
4360 Info.FFDiag(Conv); in handleLValueToRValueConversion()
4364 if (Info.getLangOpts().CPlusPlus11) in handleLValueToRValueConversion()
4365 Info.FFDiag(Conv, diag::note_constexpr_access_past_end) << AK; in handleLValueToRValueConversion()
4367 Info.FFDiag(Conv); in handleLValueToRValueConversion()
4371 RVal = APValue(extractStringLiteralCharacter(Info, Base, CharIndex)); in handleLValueToRValueConversion()
4376 CompleteObject Obj = findCompleteObject(Info, Conv, AK, LVal, Type); in handleLValueToRValueConversion()
4377 return Obj && extractSubobject(Info, Conv, Obj, LVal.Designator, RVal, AK); in handleLValueToRValueConversion()
4381 static bool handleAssignment(EvalInfo &Info, const Expr *E, const LValue &LVal, in handleAssignment() argument
4386 if (!Info.getLangOpts().CPlusPlus14) { in handleAssignment()
4387 Info.FFDiag(E); in handleAssignment()
4391 CompleteObject Obj = findCompleteObject(Info, E, AK_Assign, LVal, LValType); in handleAssignment()
4392 return Obj && modifySubobject(Info, E, Obj, LVal.Designator, Val); in handleAssignment()
4397 EvalInfo &Info; member
4410 Info.FFDiag(E, diag::note_constexpr_modify_const_type) << QT; in checkConst()
4426 Info.FFDiag(E); in found()
4433 Info.FFDiag(E, diag::note_constexpr_access_uninit) in found()
4439 Info.FFDiag(E); in found()
4449 Info.FFDiag(E); in foundVector()
4452 return handleVectorVectorBinOp(Info, E, Opcode, Value, RHS); in foundVector()
4462 Info.FFDiag(E); in found()
4468 HandleIntToIntCast(Info, E, PromotedLHSType, SubobjType, Value); in found()
4469 if (!handleIntIntBinOp(Info, E, LHS, Opcode, RHS.getInt(), LHS)) in found()
4471 Value = HandleIntToIntCast(Info, E, SubobjType, PromotedLHSType, LHS); in found()
4475 Info.Ctx.getLangOpts()); in found()
4477 return HandleIntToFloatCast(Info, E, FPO, SubobjType, Value, in found()
4479 handleFloatFloatBinOp(Info, E, FValue, Opcode, RHS.getFloat()) && in found()
4480 HandleFloatToIntCast(Info, E, PromotedLHSType, FValue, SubobjType, in found()
4484 Info.FFDiag(E); in found()
4489 HandleFloatToFloatCast(Info, E, SubobjType, PromotedLHSType, in found()
4491 handleFloatFloatBinOp(Info, E, Value, Opcode, RHS.getFloat()) && in found()
4492 HandleFloatToFloatCast(Info, E, PromotedLHSType, SubobjType, Value); in found()
4504 Info.FFDiag(E); in foundPointer()
4513 LVal.setFrom(Info.Ctx, Subobj); in foundPointer()
4514 if (!HandleLValueArrayAdjustment(Info, E, LVal, PointeeType, Offset)) in foundPointer()
4525 static bool handleCompoundAssignment(EvalInfo &Info, in handleCompoundAssignment() argument
4534 if (!Info.getLangOpts().CPlusPlus14) { in handleCompoundAssignment()
4535 Info.FFDiag(E); in handleCompoundAssignment()
4539 CompleteObject Obj = findCompleteObject(Info, E, AK_Assign, LVal, LValType); in handleCompoundAssignment()
4540 CompoundAssignSubobjectHandler Handler = { Info, E, PromotedLValType, Opcode, in handleCompoundAssignment()
4542 return Obj && findSubobject(Info, E, Obj, LVal.Designator, Handler); in handleCompoundAssignment()
4547 EvalInfo &Info; member
4557 Info.FFDiag(E, diag::note_constexpr_modify_const_type) << QT; in checkConst()
4589 Info.FFDiag(E); in found()
4600 Info.FFDiag(E); in found()
4622 return HandleOverflow(Info, E, ActualValue, SubobjType); in found()
4631 return HandleOverflow(Info, E, ActualValue, SubobjType); in found()
4643 llvm::RoundingMode RM = getActiveRoundingMode(Info, E); in found()
4649 return checkFloatingPointResult(Info, E, St); in found()
4659 Info.FFDiag(E); in foundPointer()
4664 LVal.setFrom(Info.Ctx, Subobj); in foundPointer()
4665 if (!HandleLValueArrayAdjustment(Info, E, LVal, PointeeType, in foundPointer()
4675 static bool handleIncDec(EvalInfo &Info, const Expr *E, const LValue &LVal, in handleIncDec() argument
4680 if (!Info.getLangOpts().CPlusPlus14) { in handleIncDec()
4681 Info.FFDiag(E); in handleIncDec()
4686 CompleteObject Obj = findCompleteObject(Info, E, AK, LVal, LValType); in handleIncDec()
4687 IncDecSubobjectHandler Handler = {Info, cast<UnaryOperator>(E), AK, Old}; in handleIncDec()
4688 return Obj && findSubobject(Info, E, Obj, LVal.Designator, Handler); in handleIncDec()
4692 static bool EvaluateObjectArgument(EvalInfo &Info, const Expr *Object, in EvaluateObjectArgument() argument
4695 return EvaluatePointer(Object, This, Info); in EvaluateObjectArgument()
4698 return EvaluateLValue(Object, This, Info); in EvaluateObjectArgument()
4700 if (Object->getType()->isLiteralType(Info.Ctx)) in EvaluateObjectArgument()
4701 return EvaluateTemporary(Object, This, Info); in EvaluateObjectArgument()
4704 return EvaluateTemporary(Object, This, Info); in EvaluateObjectArgument()
4706 Info.FFDiag(Object, diag::note_constexpr_nonliteral) << Object->getType(); in EvaluateObjectArgument()
4721 static const ValueDecl *HandleMemberPointerAccess(EvalInfo &Info, in HandleMemberPointerAccess() argument
4727 if (!EvaluateMemberPointer(RHS, MemPtr, Info)) in HandleMemberPointerAccess()
4734 Info.FFDiag(RHS); in HandleMemberPointerAccess()
4744 Info.FFDiag(RHS); in HandleMemberPointerAccess()
4754 Info.FFDiag(RHS); in HandleMemberPointerAccess()
4760 if (!CastToDerivedClass(Info, RHS, LV, MemPtr.getContainingRecord(), in HandleMemberPointerAccess()
4776 if (!HandleLValueDirectBase(Info, RHS, LV, RD, Base)) in HandleMemberPointerAccess()
4781 if (!HandleLValueDirectBase(Info, RHS, LV, RD, in HandleMemberPointerAccess()
4789 if (!HandleLValueMember(Info, RHS, LV, FD)) in HandleMemberPointerAccess()
4793 if (!HandleLValueIndirectMember(Info, RHS, LV, IFD)) in HandleMemberPointerAccess()
4803 static const ValueDecl *HandleMemberPointerAccess(EvalInfo &Info, in HandleMemberPointerAccess() argument
4809 if (!EvaluateObjectArgument(Info, BO->getLHS(), LV)) { in HandleMemberPointerAccess()
4810 if (Info.noteFailure()) { in HandleMemberPointerAccess()
4812 EvaluateMemberPointer(BO->getRHS(), MemPtr, Info); in HandleMemberPointerAccess()
4817 return HandleMemberPointerAccess(Info, BO->getLHS()->getType(), LV, in HandleMemberPointerAccess()
4823 static bool HandleBaseToDerivedCast(EvalInfo &Info, const CastExpr *E, in HandleBaseToDerivedCast() argument
4826 if (D.Invalid || !Result.checkNullPointer(Info, E, CSK_Derived)) in HandleBaseToDerivedCast()
4835 Info.CCEDiag(E, diag::note_constexpr_invalid_downcast) in HandleBaseToDerivedCast()
4850 Info.CCEDiag(E, diag::note_constexpr_invalid_downcast) in HandleBaseToDerivedCast()
4856 return CastToDerivedClass(Info, E, Result, TargetType, NewEntriesSize); in HandleBaseToDerivedCast()
4927 static bool EvaluateVarDecl(EvalInfo &Info, const VarDecl *VD) { in EvaluateVarDecl() argument
4935 APValue &Val = Info.CurrentCall->createTemporary(VD, VD->getType(), in EvaluateVarDecl()
4941 return Info.noteSideEffect(); in EvaluateVarDecl()
4947 if (!EvaluateInPlace(Val, Info, Result, InitE)) { in EvaluateVarDecl()
4957 static bool EvaluateDecl(EvalInfo &Info, const Decl *D) { in EvaluateDecl() argument
4961 OK &= EvaluateVarDecl(Info, VD); in EvaluateDecl()
4966 OK &= EvaluateDecl(Info, VD); in EvaluateDecl()
4971 static bool EvaluateDependentExpr(const Expr *E, EvalInfo &Info) { in EvaluateDependentExpr() argument
4973 if (Info.noteSideEffect()) in EvaluateDependentExpr()
4981 static bool EvaluateCond(EvalInfo &Info, const VarDecl *CondDecl, in EvaluateCond() argument
4985 FullExpressionRAII Scope(Info); in EvaluateCond()
4986 if (CondDecl && !EvaluateDecl(Info, CondDecl)) in EvaluateCond()
4988 if (!EvaluateAsBooleanCondition(Cond, Result, Info)) in EvaluateCond()
5017 static EvalStmtResult EvaluateStmt(StmtResult &Result, EvalInfo &Info,
5022 static EvalStmtResult EvaluateLoopBody(StmtResult &Result, EvalInfo &Info, in EvaluateLoopBody() argument
5025 BlockScopeRAII Scope(Info); in EvaluateLoopBody()
5027 EvalStmtResult ESR = EvaluateStmt(Result, Info, Body, Case); in EvaluateLoopBody()
5046 static EvalStmtResult EvaluateSwitch(StmtResult &Result, EvalInfo &Info, in EvaluateSwitch() argument
5048 BlockScopeRAII Scope(Info); in EvaluateSwitch()
5054 EvalStmtResult ESR = EvaluateStmt(Result, Info, Init); in EvaluateSwitch()
5062 FullExpressionRAII CondScope(Info); in EvaluateSwitch()
5064 !EvaluateDecl(Info, SS->getConditionVariable())) in EvaluateSwitch()
5068 EvaluateDependentExpr(SS->getCond(), Info); in EvaluateSwitch()
5071 if (!EvaluateInteger(SS->getCond(), Value, Info)) in EvaluateSwitch()
5089 APSInt LHS = CS->getLHS()->EvaluateKnownConstInt(Info.Ctx); in EvaluateSwitch()
5090 APSInt RHS = CS->getRHS() ? CS->getRHS()->EvaluateKnownConstInt(Info.Ctx) in EvaluateSwitch()
5102 EvalStmtResult ESR = EvaluateStmt(Result, Info, SS->getBody(), Found); in EvaluateSwitch()
5117 Info.FFDiag(Found->getBeginLoc(), in EvaluateSwitch()
5124 static bool CheckLocalVariableDeclaration(EvalInfo &Info, const VarDecl *VD) { in CheckLocalVariableDeclaration() argument
5130 !VD->isUsableInConstantExpressions(Info.Ctx)) { in CheckLocalVariableDeclaration()
5131 Info.CCEDiag(VD->getLocation(), diag::note_constexpr_static_local) in CheckLocalVariableDeclaration()
5139 static EvalStmtResult EvaluateStmt(StmtResult &Result, EvalInfo &Info, in EvaluateStmt() argument
5141 if (!Info.nextStep(S)) in EvaluateStmt()
5170 BlockScopeRAII Scope(Info); in EvaluateStmt()
5175 EvalStmtResult ESR = EvaluateStmt(Result, Info, Init, Case); in EvaluateStmt()
5187 EvalStmtResult ESR = EvaluateStmt(Result, Info, IS->getThen(), Case); in EvaluateStmt()
5195 ESR = EvaluateStmt(Result, Info, IS->getElse(), Case); in EvaluateStmt()
5205 EvaluateLoopBody(Result, Info, cast<WhileStmt>(S)->getBody(), Case); in EvaluateStmt()
5213 BlockScopeRAII Scope(Info); in EvaluateStmt()
5218 EvalStmtResult ESR = EvaluateStmt(Result, Info, Init, Case); in EvaluateStmt()
5226 EvaluateLoopBody(Result, Info, FS->getBody(), Case); in EvaluateStmt()
5231 if (!EvaluateDependentExpr(Inc, Info)) in EvaluateStmt()
5234 FullExpressionRAII IncScope(Info); in EvaluateStmt()
5235 if (!EvaluateIgnoredValue(Info, Inc) || !IncScope.destroy()) in EvaluateStmt()
5248 if (!CheckLocalVariableDeclaration(Info, VD)) in EvaluateStmt()
5251 if (!EvaluateVarDecl(Info, VD)) in EvaluateStmt()
5270 if (!EvaluateDependentExpr(E, Info)) in EvaluateStmt()
5277 FullExpressionRAII Scope(Info); in EvaluateStmt()
5278 if (!EvaluateIgnoredValue(Info, E) || !Scope.destroy()) in EvaluateStmt()
5284 Info.FFDiag(S->getBeginLoc()) << S->getSourceRange(); in EvaluateStmt()
5294 if (VD && !CheckLocalVariableDeclaration(Info, VD)) in EvaluateStmt()
5297 FullExpressionRAII Scope(Info); in EvaluateStmt()
5298 if (!EvaluateDecl(Info, D) && !Info.noteFailure()) in EvaluateStmt()
5308 FullExpressionRAII Scope(Info); in EvaluateStmt()
5310 EvaluateDependentExpr(RetExpr, Info); in EvaluateStmt()
5316 ? EvaluateInPlace(Result.Value, Info, *Result.Slot, RetExpr) in EvaluateStmt()
5317 : Evaluate(Result.Value, Info, RetExpr))) in EvaluateStmt()
5323 BlockScopeRAII Scope(Info); in EvaluateStmt()
5327 EvalStmtResult ESR = EvaluateStmt(Result, Info, BI, Case); in EvaluateStmt()
5345 BlockScopeRAII Scope(Info); in EvaluateStmt()
5347 EvalStmtResult ESR = EvaluateStmt(Result, Info, Init); in EvaluateStmt()
5359 if (!Info.InConstantContext) in EvaluateStmt()
5361 } else if (!EvaluateCond(Info, IS->getConditionVariable(), IS->getCond(), in EvaluateStmt()
5366 EvalStmtResult ESR = EvaluateStmt(Result, Info, SubStmt); in EvaluateStmt()
5379 BlockScopeRAII Scope(Info); in EvaluateStmt()
5381 if (!EvaluateCond(Info, WS->getConditionVariable(), WS->getCond(), in EvaluateStmt()
5387 EvalStmtResult ESR = EvaluateLoopBody(Result, Info, WS->getBody()); in EvaluateStmt()
5403 EvalStmtResult ESR = EvaluateLoopBody(Result, Info, DS->getBody(), Case); in EvaluateStmt()
5409 EvaluateDependentExpr(DS->getCond(), Info); in EvaluateStmt()
5413 FullExpressionRAII CondScope(Info); in EvaluateStmt()
5414 if (!EvaluateAsBooleanCondition(DS->getCond(), Continue, Info) || in EvaluateStmt()
5423 BlockScopeRAII ForScope(Info); in EvaluateStmt()
5425 EvalStmtResult ESR = EvaluateStmt(Result, Info, FS->getInit()); in EvaluateStmt()
5433 BlockScopeRAII IterScope(Info); in EvaluateStmt()
5435 if (FS->getCond() && !EvaluateCond(Info, FS->getConditionVariable(), in EvaluateStmt()
5441 EvalStmtResult ESR = EvaluateLoopBody(Result, Info, FS->getBody()); in EvaluateStmt()
5450 if (!EvaluateDependentExpr(Inc, Info)) in EvaluateStmt()
5453 FullExpressionRAII IncScope(Info); in EvaluateStmt()
5454 if (!EvaluateIgnoredValue(Info, Inc) || !IncScope.destroy()) in EvaluateStmt()
5467 BlockScopeRAII Scope(Info); in EvaluateStmt()
5471 EvalStmtResult ESR = EvaluateStmt(Result, Info, FS->getInit()); in EvaluateStmt()
5480 EvalStmtResult ESR = EvaluateStmt(Result, Info, FS->getRangeStmt()); in EvaluateStmt()
5493 ESR = EvaluateStmt(Result, Info, FS->getBeginStmt()); in EvaluateStmt()
5499 ESR = EvaluateStmt(Result, Info, FS->getEndStmt()); in EvaluateStmt()
5510 EvaluateDependentExpr(FS->getCond(), Info); in EvaluateStmt()
5515 FullExpressionRAII CondExpr(Info); in EvaluateStmt()
5516 if (!EvaluateAsBooleanCondition(FS->getCond(), Continue, Info)) in EvaluateStmt()
5523 BlockScopeRAII InnerScope(Info); in EvaluateStmt()
5524 ESR = EvaluateStmt(Result, Info, FS->getLoopVarStmt()); in EvaluateStmt()
5532 ESR = EvaluateLoopBody(Result, Info, FS->getBody()); in EvaluateStmt()
5539 if (!EvaluateDependentExpr(FS->getInc(), Info)) in EvaluateStmt()
5543 if (!EvaluateIgnoredValue(Info, FS->getInc())) in EvaluateStmt()
5555 return EvaluateSwitch(Result, Info, cast<SwitchStmt>(S)); in EvaluateStmt()
5564 return EvaluateStmt(Result, Info, cast<LabelStmt>(S)->getSubStmt(), Case); in EvaluateStmt()
5570 *Info.CurrentCall, hasSpecificAttr<MSConstexprAttr>(AS->getAttrs()) && in EvaluateStmt()
5572 return EvaluateStmt(Result, Info, SS, Case); in EvaluateStmt()
5577 return EvaluateStmt(Result, Info, cast<SwitchCase>(S)->getSubStmt(), Case); in EvaluateStmt()
5580 return EvaluateStmt(Result, Info, cast<CXXTryStmt>(S)->getTryBlock(), Case); in EvaluateStmt()
5588 static bool CheckTrivialDefaultConstructor(EvalInfo &Info, SourceLocation Loc, in CheckTrivialDefaultConstructor() argument
5598 if (Info.getLangOpts().CPlusPlus11) { in CheckTrivialDefaultConstructor()
5601 Info.CCEDiag(Loc, diag::note_constexpr_invalid_function, 1) in CheckTrivialDefaultConstructor()
5603 Info.Note(CD->getLocation(), diag::note_declared_at); in CheckTrivialDefaultConstructor()
5605 Info.CCEDiag(Loc, diag::note_invalid_subexpr_in_const_expr); in CheckTrivialDefaultConstructor()
5613 static bool CheckConstexprFunction(EvalInfo &Info, SourceLocation CallLoc, in CheckConstexprFunction() argument
5619 if (Info.checkingPotentialConstantExpression() && !Definition && in CheckConstexprFunction()
5627 Info.FFDiag(CallLoc, diag::note_invalid_subexpr_in_const_expr); in CheckConstexprFunction()
5634 if (!Info.Ctx.getLangOpts().CPlusPlus20 && isa<CXXMethodDecl>(Declaration) && in CheckConstexprFunction()
5636 Info.CCEDiag(CallLoc, diag::note_constexpr_virtual_call); in CheckConstexprFunction()
5639 Info.FFDiag(CallLoc, diag::note_invalid_subexpr_in_const_expr); in CheckConstexprFunction()
5645 (Definition->isConstexpr() || (Info.CurrentCall->CanEvalMSConstexpr && in CheckConstexprFunction()
5649 if (Info.getLangOpts().CPlusPlus11) { in CheckConstexprFunction()
5665 Info.FFDiag(CallLoc, diag::note_constexpr_invalid_inhctor, 1) in CheckConstexprFunction()
5668 Info.FFDiag(CallLoc, diag::note_constexpr_invalid_function, 1) in CheckConstexprFunction()
5670 Info.Note(DiagDecl->getLocation(), diag::note_declared_at); in CheckConstexprFunction()
5672 Info.FFDiag(CallLoc, diag::note_invalid_subexpr_in_const_expr); in CheckConstexprFunction()
5690 static bool checkDynamicType(EvalInfo &Info, const Expr *E, const LValue &This, in checkDynamicType() argument
5695 CompleteObject Obj = findCompleteObject(Info, E, AK, This, QualType()); in checkDynamicType()
5706 Info.FFDiag(E, This.Designator.isOnePastTheEnd() in checkDynamicType()
5717 Info.Ctx.getLValueReferenceType(This.Designator.getType(Info.Ctx)); in checkDynamicType()
5718 Info.FFDiag(E, diag::note_constexpr_polymorphic_unknown_dynamic_type) in checkDynamicType()
5719 << AK << Val.getAsString(Info.Ctx, StarThisType); in checkDynamicType()
5726 return Obj && findSubobject(Info, E, Obj, This.Designator, Handler); in checkDynamicType()
5732 checkNonVirtualMemberCallThisPointer(EvalInfo &Info, const Expr *E, in checkNonVirtualMemberCallThisPointer() argument
5736 Info, E, This, in checkNonVirtualMemberCallThisPointer()
5757 static std::optional<DynamicType> ComputeDynamicType(EvalInfo &Info, in ComputeDynamicType() argument
5764 if (!checkDynamicType(Info, E, This, AK, true)) in ComputeDynamicType()
5776 Info.FFDiag(E); in ComputeDynamicType()
5787 switch (Info.isEvaluatingCtorDtor(This.getLValueBase(), in ComputeDynamicType()
5809 Info.FFDiag(E); in ComputeDynamicType()
5815 EvalInfo &Info, const Expr *E, LValue &This, const CXXMethodDecl *Found, in HandleVirtualDispatch() argument
5818 Info, E, This, in HandleVirtualDispatch()
5843 Info.FFDiag(E, diag::note_constexpr_pure_virtual_call, 1) << Callee; in HandleVirtualDispatch()
5844 Info.Note(Callee->getLocation(), diag::note_declared_at); in HandleVirtualDispatch()
5850 if (!Info.Ctx.hasSameUnqualifiedType(Callee->getReturnType(), in HandleVirtualDispatch()
5860 if (Next && !Info.Ctx.hasSameUnqualifiedType( in HandleVirtualDispatch()
5864 if (!Info.Ctx.hasSameUnqualifiedType(Found->getReturnType(), in HandleVirtualDispatch()
5870 if (!CastToDerivedClass(Info, E, This, Callee->getParent(), PathLength)) in HandleVirtualDispatch()
5879 static bool HandleCovariantReturnAdjustment(EvalInfo &Info, const Expr *E, in HandleCovariantReturnAdjustment() argument
5888 LVal.setFrom(Info.Ctx, Result); in HandleCovariantReturnAdjustment()
5895 !CastToBaseClass(Info, E, LVal, OldClass, NewClass)) in HandleCovariantReturnAdjustment()
5920 static bool HandleDynamicCast(EvalInfo &Info, const ExplicitCastExpr *E, in HandleDynamicCast() argument
5936 ComputeDynamicType(Info, E, Ptr, AK_DynamicCast); in HandleDynamicCast()
5944 return CastToDerivedClass(Info, E, Ptr, DynType->Type, DynType->PathLength); in HandleDynamicCast()
5948 CanQualType CQT = Info.Ctx.getCanonicalType(Info.Ctx.getRecordType(C)); in HandleDynamicCast()
5955 Ptr.setNull(Info.Ctx, E->getType()); in HandleDynamicCast()
5972 Info.FFDiag(E, diag::note_constexpr_dynamic_cast_to_reference_failed) in HandleDynamicCast()
5973 << DiagKind << Ptr.Designator.getType(Info.Ctx) in HandleDynamicCast()
5974 << Info.Ctx.getRecordType(DynType->Type) in HandleDynamicCast()
5986 return CastToDerivedClass(Info, E, Ptr, Class, PathLength); in HandleDynamicCast()
6001 if (!CastToDerivedClass(Info, E, Ptr, DynType->Type, DynType->PathLength)) in HandleDynamicCast()
6005 if (!HandleLValueBase(Info, E, Ptr, Elem.Class, Elem.Base)) in HandleDynamicCast()
6016 EvalInfo &Info; member
6044 Info.FFDiag(LHSExpr, in found()
6068 static bool MaybeHandleUnionActiveMemberChange(EvalInfo &Info, in MaybeHandleUnionActiveMemberChange() argument
6151 findCompleteObject(Info, LHSExpr, AK_Assign, LHS, LHSExpr->getType()); in MaybeHandleUnionActiveMemberChange()
6158 D.truncate(Info.Ctx, LHS.Base, LengthAndField.first); in MaybeHandleUnionActiveMemberChange()
6160 bool DuringInit = Info.isEvaluatingCtorDtor(LHS.Base, D.Entries) == in MaybeHandleUnionActiveMemberChange()
6163 Info, LHSExpr, LengthAndField.second, DuringInit}; in MaybeHandleUnionActiveMemberChange()
6164 if (!findSubobject(Info, LHSExpr, Obj, D, StartLifetime)) in MaybeHandleUnionActiveMemberChange()
6172 CallRef Call, EvalInfo &Info, in EvaluateCallArg() argument
6180 APValue &V = PVD ? Info.CurrentCall->createParam(Call, PVD, LV) in EvaluateCallArg()
6181 : Info.CurrentCall->createTemporary(Arg, Arg->getType(), in EvaluateCallArg()
6183 if (!EvaluateInPlace(V, Info, LV, Arg)) in EvaluateCallArg()
6189 Info.CCEDiag(Arg, diag::note_non_null_attribute_failed); in EvaluateCallArg()
6198 EvalInfo &Info, const FunctionDecl *Callee, in EvaluateArgs() argument
6222 if (!EvaluateCallArg(PVD, Args[Idx], Call, Info, NonNull)) { in EvaluateArgs()
6225 if (!Info.noteFailure()) in EvaluateArgs()
6235 static bool handleTrivialCopy(EvalInfo &Info, const ParmVarDecl *Param, in handleTrivialCopy() argument
6239 CallStackFrame *Frame = Info.CurrentCall; in handleTrivialCopy()
6240 APValue *RefValue = Info.getParamSlot(Frame->Arguments, Param); in handleTrivialCopy()
6242 Info.FFDiag(E); in handleTrivialCopy()
6248 RefLValue.setFrom(Info.Ctx, *RefValue); in handleTrivialCopy()
6250 Info, E, Param->getType().getNonReferenceType(), RefLValue, Result, in handleTrivialCopy()
6258 CallRef Call, const Stmt *Body, EvalInfo &Info, in HandleFunctionCall() argument
6260 if (!Info.CheckCallLimit(CallLoc)) in HandleFunctionCall()
6263 CallStackFrame Frame(Info, E->getSourceRange(), Callee, This, E, Call); in HandleFunctionCall()
6279 if (!handleTrivialCopy(Info, MD->getParamDecl(0), Args[0], RHSValue, in HandleFunctionCall()
6282 if (!handleAssignment(Info, Args[0], *This, MD->getThisType(), in HandleFunctionCall()
6294 if (!Info.checkingPotentialConstantExpression()) in HandleFunctionCall()
6300 EvalStmtResult ESR = EvaluateStmt(Ret, Info, Body); in HandleFunctionCall()
6304 Info.FFDiag(Callee->getEndLoc(), diag::note_constexpr_no_return); in HandleFunctionCall()
6313 EvalInfo &Info, APValue &Result) { in HandleConstructorCall() argument
6315 if (!Info.CheckCallLimit(CallLoc)) in HandleConstructorCall()
6320 Info.FFDiag(CallLoc, diag::note_constexpr_virtual_base) << RD; in HandleConstructorCall()
6325 Info, in HandleConstructorCall()
6328 CallStackFrame Frame(Info, E->getSourceRange(), Definition, &This, E, Call); in HandleConstructorCall()
6339 if (!EvaluateDependentExpr((*I)->getInit(), Info)) in HandleConstructorCall()
6342 FullExpressionRAII InitScope(Info); in HandleConstructorCall()
6343 if (!EvaluateInPlace(Result, Info, This, (*I)->getInit()) || in HandleConstructorCall()
6347 return EvaluateStmt(Ret, Info, Definition->getBody()) != ESR_Failed; in HandleConstructorCall()
6362 return handleTrivialCopy(Info, Definition->getParamDecl(0), E, Result, in HandleConstructorCall()
6377 const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); in HandleConstructorCall()
6380 BlockScopeRAII LifetimeExtendedScope(Info); in HandleConstructorCall()
6420 assert(Info.Ctx.hasSameType(BaseIt->getType(), BaseType) && in HandleConstructorCall()
6424 if (!HandleLValueDirectBase(Info, I->getInit(), Subobject, RD, in HandleConstructorCall()
6429 if (!HandleLValueMember(Info, I->getInit(), Subobject, FD, &Layout)) in HandleConstructorCall()
6459 handleDefaultInitValue(Info.Ctx.getRecordType(CD), *Value); in HandleConstructorCall()
6465 if (!HandleLValueMember(Info, I->getInit(), Subobject, FD)) in HandleConstructorCall()
6484 if (!EvaluateDependentExpr(Init, Info)) in HandleConstructorCall()
6487 ThisOverrideRAII ThisOverride(*Info.CurrentCall, &SubobjectParent, in HandleConstructorCall()
6489 FullExpressionRAII InitScope(Info); in HandleConstructorCall()
6490 if (!EvaluateInPlace(*Value, Info, Subobject, Init) || in HandleConstructorCall()
6492 !truncateBitfieldValue(Info, Init, *Value, FD))) { in HandleConstructorCall()
6495 if (!Info.noteFailure()) in HandleConstructorCall()
6520 EvaluateStmt(Ret, Info, Definition->getBody()) != ESR_Failed && in HandleConstructorCall()
6527 EvalInfo &Info, APValue &Result) { in HandleConstructorCall() argument
6528 CallScopeRAII CallScope(Info); in HandleConstructorCall()
6529 CallRef Call = Info.CurrentCall->createCall(Definition); in HandleConstructorCall()
6530 if (!EvaluateArgs(Args, Call, Info, Definition)) in HandleConstructorCall()
6533 return HandleConstructorCall(E, This, Call, Definition, Info, Result) && in HandleConstructorCall()
6537 static bool HandleDestructionImpl(EvalInfo &Info, SourceRange CallRange, in HandleDestructionImpl() argument
6547 Info.FFDiag(CallRange.getBegin(), in HandleDestructionImpl()
6549 << Printable.getAsString(Info.Ctx, Info.Ctx.getLValueReferenceType(T)); in HandleDestructionImpl()
6555 OpaqueValueExpr LocE(CallRange.getBegin(), Info.Ctx.IntTy, VK_PRValue); in HandleDestructionImpl()
6558 if (const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType(T)) { in HandleDestructionImpl()
6562 if (!CheckArraySize(Info, CAT, CallRange.getBegin())) in HandleDestructionImpl()
6566 ElemLV.addArray(Info, &LocE, CAT); in HandleDestructionImpl()
6567 if (!HandleLValueArrayAdjustment(Info, &LocE, ElemLV, ElemT, Size)) in HandleDestructionImpl()
6578 if (!HandleLValueArrayAdjustment(Info, &LocE, ElemLV, ElemT, -1) || in HandleDestructionImpl()
6579 !HandleDestructionImpl(Info, CallRange, ElemLV, Elem, ElemT)) in HandleDestructionImpl()
6591 Info.FFDiag(CallRange.getBegin(), in HandleDestructionImpl()
6602 Info.FFDiag(CallRange.getBegin(), diag::note_constexpr_virtual_base) << RD; in HandleDestructionImpl()
6608 Info.FFDiag(CallRange.getBegin()); in HandleDestructionImpl()
6627 if (!Info.CheckCallLimit(CallRange.getBegin())) in HandleDestructionImpl()
6633 if (!CheckConstexprFunction(Info, CallRange.getBegin(), DD, Definition, Body)) in HandleDestructionImpl()
6636 CallStackFrame Frame(Info, CallRange, Definition, &This, /*CallExpr=*/nullptr, in HandleDestructionImpl()
6642 Info, in HandleDestructionImpl()
6651 Info.FFDiag(CallRange.getBegin(), diag::note_constexpr_double_destroy); in HandleDestructionImpl()
6659 if (EvaluateStmt(Ret, Info, Definition->getBody()) == ESR_Failed) in HandleDestructionImpl()
6666 const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); in HandleDestructionImpl()
6676 if (!HandleLValueMember(Info, &LocE, Subobject, FD, &Layout)) in HandleDestructionImpl()
6680 if (!HandleDestructionImpl(Info, CallRange, Subobject, *SubobjectValue, in HandleDestructionImpl()
6694 if (!HandleLValueDirectBase(Info, &LocE, Subobject, RD, in HandleDestructionImpl()
6699 if (!HandleDestructionImpl(Info, CallRange, Subobject, *SubobjectValue, in HandleDestructionImpl()
6712 EvalInfo &Info; member
6720 return HandleDestructionImpl(Info, E->getSourceRange(), This, Subobj, in found()
6724 Info.FFDiag(E, diag::note_constexpr_destroy_complex_elem); in found()
6728 Info.FFDiag(E, diag::note_constexpr_destroy_complex_elem); in found()
6736 static bool HandleDestruction(EvalInfo &Info, const Expr *E, in HandleDestruction() argument
6738 CompleteObject Obj = findCompleteObject(Info, E, AK_Destroy, This, ThisType); in HandleDestruction()
6739 DestroyObjectHandler Handler = {Info, E, This, AK_Destroy}; in HandleDestruction()
6740 return Obj && findSubobject(Info, E, Obj, This.Designator, Handler); in HandleDestruction()
6744 static bool HandleDestruction(EvalInfo &Info, SourceLocation Loc, in HandleDestruction() argument
6749 if (Info.EvalStatus.HasSideEffects) in HandleDestruction()
6754 return HandleDestructionImpl(Info, Loc, LV, Value, T); in HandleDestruction()
6758 static bool HandleOperatorNewCall(EvalInfo &Info, const CallExpr *E, in HandleOperatorNewCall() argument
6760 if (Info.checkingPotentialConstantExpression() || in HandleOperatorNewCall()
6761 Info.SpeculativeEvaluationDepth) in HandleOperatorNewCall()
6765 auto Caller = Info.getStdAllocatorCaller("allocate"); in HandleOperatorNewCall()
6767 Info.FFDiag(E->getExprLoc(), Info.getLangOpts().CPlusPlus20 in HandleOperatorNewCall()
6775 Info.FFDiag(E->getExprLoc(), in HandleOperatorNewCall()
6782 if (!EvaluateInteger(E->getArg(0), ByteSize, Info)) in HandleOperatorNewCall()
6786 EvaluateIgnoredValue(Info, E->getArg(I)); in HandleOperatorNewCall()
6791 if (!HandleSizeof(Info, E->getExprLoc(), ElemType, ElemSize)) in HandleOperatorNewCall()
6798 Info.FFDiag(E->getExprLoc(), diag::note_constexpr_operator_new_bad_size) in HandleOperatorNewCall()
6803 if (!Info.CheckArraySize(E->getBeginLoc(), ByteSize.getActiveBits(), in HandleOperatorNewCall()
6806 Result.setNull(Info.Ctx, E->getType()); in HandleOperatorNewCall()
6812 QualType AllocType = Info.Ctx.getConstantArrayType( in HandleOperatorNewCall()
6814 APValue *Val = Info.createHeapAlloc(E, AllocType, Result); in HandleOperatorNewCall()
6816 Result.addArray(Info, E, cast<ConstantArrayType>(AllocType)); in HandleOperatorNewCall()
6839 static std::optional<DynAlloc *> CheckDeleteKind(EvalInfo &Info, const Expr *E, in CheckDeleteKind() argument
6843 return Pointer.toString(Info.Ctx, Info.Ctx.VoidPtrTy); in CheckDeleteKind()
6848 Info.FFDiag(E, diag::note_constexpr_delete_not_heap_alloc) in CheckDeleteKind()
6851 NoteLValueLocation(Info, Pointer.Base); in CheckDeleteKind()
6855 std::optional<DynAlloc *> Alloc = Info.lookupDynamicAlloc(DA); in CheckDeleteKind()
6857 Info.FFDiag(E, diag::note_constexpr_double_delete); in CheckDeleteKind()
6863 Info.FFDiag(E, diag::note_constexpr_new_delete_mismatch) in CheckDeleteKind()
6865 NoteLValueLocation(Info, Pointer.Base); in CheckDeleteKind()
6878 Info.FFDiag(E, diag::note_constexpr_delete_subobject) in CheckDeleteKind()
6887 bool HandleOperatorDeleteCall(EvalInfo &Info, const CallExpr *E) { in HandleOperatorDeleteCall() argument
6888 if (Info.checkingPotentialConstantExpression() || in HandleOperatorDeleteCall()
6889 Info.SpeculativeEvaluationDepth) in HandleOperatorDeleteCall()
6893 if (!Info.getStdAllocatorCaller("deallocate")) { in HandleOperatorDeleteCall()
6894 Info.FFDiag(E->getExprLoc()); in HandleOperatorDeleteCall()
6899 if (!EvaluatePointer(E->getArg(0), Pointer, Info)) in HandleOperatorDeleteCall()
6902 EvaluateIgnoredValue(Info, E->getArg(I)); in HandleOperatorDeleteCall()
6910 Info.CCEDiag(E->getExprLoc(), diag::note_constexpr_deallocate_null); in HandleOperatorDeleteCall()
6914 if (!CheckDeleteKind(Info, E, Pointer, DynAlloc::StdAllocator)) in HandleOperatorDeleteCall()
6917 Info.HeapAllocs.erase(Pointer.Base.get<DynamicAllocLValue>()); in HandleOperatorDeleteCall()
6976 EvalInfo &Info; member in __anon7ee061301711::APValueToBufferConverter
6980 APValueToBufferConverter(EvalInfo &Info, CharUnits ObjectWidth, in APValueToBufferConverter() argument
6982 : Info(Info), in APValueToBufferConverter()
6983 Buffer(ObjectWidth, Info.Ctx.getTargetInfo().isLittleEndian()), in APValueToBufferConverter()
7023 Info.FFDiag(BCE->getBeginLoc(), in visit()
7037 const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); in visitRecord()
7055 Info.FFDiag(BCE->getBeginLoc(), in visitRecord()
7062 assert(FieldOffsetBits % Info.Ctx.getCharWidth() == 0 && in visitRecord()
7065 Info.Ctx.toCharUnitsFromBits(FieldOffsetBits) + Offset; in visitRecord()
7081 CharUnits ElemWidth = Info.Ctx.getTypeSizeInChars(CAT->getElementType()); in visitArray()
7108 VTy->isExtVectorBoolType() ? 1 : Info.Ctx.getTypeSize(EltTy); in visitVector()
7110 if ((NElts * EltSize) % Info.Ctx.getCharWidth() != 0) { in visitVector()
7115 Info.FFDiag(BCE->getBeginLoc(), in visitVector()
7118 << Info.Ctx.getCharWidth(); in visitVector()
7122 if (EltTy->isRealFloatingType() && &Info.Ctx.getFloatTypeSemantics(EltTy) == in visitVector()
7127 Info.FFDiag(BCE->getBeginLoc(), in visitVector()
7142 bool BigEndian = Info.Ctx.getTargetInfo().isBigEndian(); in visitVector()
7159 CharUnits EltSizeChars = Info.Ctx.getTypeSizeInChars(EltTy); in visitVector()
7173 Width = Info.Ctx.getTypeSize(Ty); in visitInt()
7190 convert(EvalInfo &Info, const APValue &Src, const CastExpr *BCE) { in convert() argument
7191 CharUnits DstSize = Info.Ctx.getTypeSizeInChars(BCE->getType()); in convert()
7192 APValueToBufferConverter Converter(Info, DstSize, BCE); in convert()
7201 EvalInfo &Info; member in __anon7ee061301711::BufferToAPValueConverter
7205 BufferToAPValueConverter(EvalInfo &Info, const BitCastBuffer &Buffer, in BufferToAPValueConverter() argument
7207 : Info(Info), Buffer(Buffer), BCE(BCE) {} in BufferToAPValueConverter()
7213 Info.FFDiag(BCE->getBeginLoc(), in unsupportedType()
7220 Info.FFDiag(BCE->getBeginLoc(), in unrepresentableValue()
7229 uint64_t NullValue = Info.Ctx.getTargetNullPointerValue(QualType(T, 0)); in visit()
7235 CharUnits SizeOf = Info.Ctx.getTypeSizeInChars(T); in visit()
7242 Info.Ctx.getFloatTypeSemantics(QualType(T, 0)); in visit()
7260 Info.FFDiag(BCE->getExprLoc(), in visit()
7262 << DisplayType << Info.Ctx.getLangOpts().CharIsSigned; in visit()
7269 APSInt Val(SizeOf.getQuantity() * Info.Ctx.getCharWidth(), true); in visit()
7275 unsigned IntWidth = Info.Ctx.getIntWidth(QualType(T, 0)); in visit()
7288 Info.Ctx.getFloatTypeSemantics(QualType(T, 0)); in visit()
7297 const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); in visit()
7312 Info.Ctx.getASTRecordLayout(BaseDecl).getNonVirtualSize().isZero()) in visit()
7329 Info.FFDiag(BCE->getBeginLoc(), in visit()
7335 assert(FieldOffsetBits % Info.Ctx.getCharWidth() == 0); in visit()
7338 CharUnits::fromQuantity(FieldOffsetBits / Info.Ctx.getCharWidth()) + in visit()
7364 CharUnits ElementWidth = Info.Ctx.getTypeSizeInChars(Ty->getElementType()); in visit()
7382 VTy->isExtVectorBoolType() ? 1 : Info.Ctx.getTypeSize(EltTy); in visit()
7384 if ((NElts * EltSize) % Info.Ctx.getCharWidth() != 0) { in visit()
7389 Info.FFDiag(BCE->getBeginLoc(), in visit()
7391 << QualType(VTy, 0) << EltSize << NElts << Info.Ctx.getCharWidth(); in visit()
7395 if (EltTy->isRealFloatingType() && &Info.Ctx.getFloatTypeSemantics(EltTy) == in visit()
7400 Info.FFDiag(BCE->getBeginLoc(), in visit()
7417 bool BigEndian = Info.Ctx.getTargetInfo().isBigEndian(); in visit()
7436 CharUnits EltSizeChars = Info.Ctx.getTypeSizeInChars(EltTy); in visit()
7478 static std::optional<APValue> convert(EvalInfo &Info, BitCastBuffer &Buffer, in convert() argument
7480 BufferToAPValueConverter Converter(Info, Buffer, BCE); in convert()
7486 QualType Ty, EvalInfo *Info, in checkBitCastConstexprEligibilityType() argument
7492 if (Info) in checkBitCastConstexprEligibilityType()
7493 Info->FFDiag(Loc, diag::note_constexpr_bit_cast_invalid_type) in checkBitCastConstexprEligibilityType()
7498 if (Info) in checkBitCastConstexprEligibilityType()
7499 Info->Note(NoteLoc, diag::note_constexpr_bit_cast_invalid_subtype) in checkBitCastConstexprEligibilityType()
7516 if (!checkBitCastConstexprEligibilityType(Loc, BS.getType(), Info, Ctx, in checkBitCastConstexprEligibilityType()
7523 if (!checkBitCastConstexprEligibilityType(Loc, FD->getType(), Info, Ctx, in checkBitCastConstexprEligibilityType()
7531 Info, Ctx, CheckingDest)) in checkBitCastConstexprEligibilityType()
7537 static bool checkBitCastConstexprEligibility(EvalInfo *Info, in checkBitCastConstexprEligibility() argument
7541 BCE->getBeginLoc(), BCE->getType(), Info, Ctx, true); in checkBitCastConstexprEligibility()
7544 BCE->getSubExpr()->getType(), Info, Ctx, false); in checkBitCastConstexprEligibility()
7548 static bool handleRValueToRValueBitCast(EvalInfo &Info, APValue &DestValue, in handleRValueToRValueBitCast() argument
7551 assert(CHAR_BIT == 8 && Info.Ctx.getTargetInfo().getCharWidth() == 8 && in handleRValueToRValueBitCast()
7554 if (!checkBitCastConstexprEligibility(&Info, Info.Ctx, BCE)) in handleRValueToRValueBitCast()
7559 APValueToBufferConverter::convert(Info, SourceRValue, BCE); in handleRValueToRValueBitCast()
7565 BufferToAPValueConverter::convert(Info, *Buffer, BCE); in handleRValueToRValueBitCast()
7573 static bool handleLValueToRValueBitCast(EvalInfo &Info, APValue &DestValue, in handleLValueToRValueBitCast() argument
7576 assert(CHAR_BIT == 8 && Info.Ctx.getTargetInfo().getCharWidth() == 8 && in handleLValueToRValueBitCast()
7583 SourceLValue.setFrom(Info.Ctx, SourceValue); in handleLValueToRValueBitCast()
7585 Info, BCE, BCE->getSubExpr()->getType().withConst(), SourceLValue, in handleLValueToRValueBitCast()
7589 return handleRValueToRValueBitCast(Info, DestValue, SourceRValue, BCE); in handleLValueToRValueBitCast()
7609 assert(Info.checkingPotentialConstantExpression()); in CheckPotentialConstantConditional()
7614 SpeculativeEvaluationRAII Speculate(Info, &Diag); in CheckPotentialConstantConditional()
7621 SpeculativeEvaluationRAII Speculate(Info, &Diag); in CheckPotentialConstantConditional()
7635 if (!EvaluateAsBooleanCondition(E->getCond(), BoolResult, Info)) { in HandleConditionalOperator()
7636 if (Info.checkingPotentialConstantExpression() && Info.noteFailure()) { in HandleConditionalOperator()
7640 if (Info.noteFailure()) { in HandleConditionalOperator()
7652 EvalInfo &Info; member in __anon7ee061301711::ExprEvaluatorBase
7657 return Info.CCEDiag(E, D); in CCEDiag()
7665 Info.Ctx.BuiltinInfo.isConstantEvaluated(BuiltinOp); in IsConstantEvaluatedBuiltinCall()
7669 ExprEvaluatorBase(EvalInfo &Info) : Info(Info) {} in ExprEvaluatorBase() argument
7671 EvalInfo &getEvalInfo() { return Info; } in getEvalInfo()
7676 Info.FFDiag(E, D) << E->getSourceRange(); in Error()
7713 TempVersionRAII RAII(*Info.CurrentCall); in VisitCXXDefaultArgExpr()
7714 SourceLocExprScopeGuard Guard(E, Info.CurrentCall->CurSourceLocExprScope); in VisitCXXDefaultArgExpr()
7718 TempVersionRAII RAII(*Info.CurrentCall); in VisitCXXDefaultInitExpr()
7722 SourceLocExprScopeGuard Guard(E, Info.CurrentCall->CurSourceLocExprScope); in VisitCXXDefaultInitExpr()
7727 FullExpressionRAII Scope(Info); in VisitExprWithCleanups()
7742 if (!Info.Ctx.getLangOpts().CPlusPlus20) in VisitCXXDynamicCastExpr()
7762 if (!HandleMemberPointerAccess(Info, E, Obj)) in VisitBinaryOperator()
7765 if (!handleLValueToRValueConversion(Info, E, E->getType(), Obj, Result)) in VisitBinaryOperator()
7780 if (!Evaluate(Info.CurrentCall->createTemporary( in VisitBinaryConditionalOperator()
7782 getStorageType(Info.Ctx, E->getOpaqueValue()), in VisitBinaryConditionalOperator()
7784 Info, E->getCommon())) in VisitBinaryConditionalOperator()
7805 if (Info.checkingPotentialConstantExpression() && IsBcpCall) in VisitConditionalOperator()
7808 FoldConstant Fold(Info, IsBcpCall); in VisitConditionalOperator()
7818 if (APValue *Value = Info.CurrentCall->getCurrentTemporary(E); in VisitOpaqueValueExpr()
7847 if (!Evaluate(Info.CurrentCall->createTemporary( in VisitPseudoObjectExpr()
7848 OVE, getStorageType(Info.Ctx, OVE), in VisitPseudoObjectExpr()
7850 Info, OVE->getSourceExpr())) in VisitPseudoObjectExpr()
7856 if (!EvaluateIgnoredValue(Info, SemE)) in VisitPseudoObjectExpr()
7872 CallScopeRAII CallScope(Info); in handleCallExpr()
7889 if (!EvaluateObjectArgument(Info, ME->getBase(), ThisVal)) in handleCallExpr()
7899 HandleMemberPointerAccess(Info, BE, ThisVal, false); in handleCallExpr()
7907 if (!Info.getLangOpts().CPlusPlus20) in handleCallExpr()
7908 Info.CCEDiag(PDE, diag::note_constexpr_pseudo_destructor); in handleCallExpr()
7909 return EvaluateObjectArgument(Info, PDE->getBase(), ThisVal) && in handleCallExpr()
7910 HandleDestruction(Info, PDE, ThisVal, PDE->getDestroyedType()); in handleCallExpr()
7916 if (!EvaluatePointer(Callee, CalleeLV, Info)) in handleCallExpr()
7922 Info.FFDiag(Callee, diag::note_constexpr_null_callee) in handleCallExpr()
7932 if (!Info.Ctx.hasSameFunctionTypeIgnoringExceptionSpec( in handleCallExpr()
7942 Call = Info.CurrentCall->createCall(FD); in handleCallExpr()
7946 if (!EvaluateArgs(HasThis ? Args.slice(1) : Args, Call, Info, FD, in handleCallExpr()
7962 if (!EvaluateObjectArgument(Info, Args[0], ThisVal)) in handleCallExpr()
7973 if (Info.getLangOpts().CPlusPlus20 && OCE && in handleCallExpr()
7975 !MaybeHandleUnionActiveMemberChange(Info, Args[0], ThisVal)) in handleCallExpr()
8016 if (!HandleOperatorNewCall(Info, E, Ptr)) in handleCallExpr()
8021 return HandleOperatorDeleteCall(Info, E) && CallScope.destroy(); in handleCallExpr()
8029 Call = Info.CurrentCall->createCall(FD); in handleCallExpr()
8030 if (!EvaluateArgs(Args, Call, Info, FD)) in handleCallExpr()
8039 FD = HandleVirtualDispatch(Info, E, *This, NamedMember, in handleCallExpr()
8047 if (!checkNonVirtualMemberCallThisPointer(Info, E, *This, NamedMember)) in handleCallExpr()
8055 return HandleDestruction(Info, E, *This, in handleCallExpr()
8056 Info.Ctx.getRecordType(DD->getParent())) && in handleCallExpr()
8063 if (!CheckConstexprFunction(Info, E->getExprLoc(), FD, Definition, Body) || in handleCallExpr()
8065 Body, Info, Result, ResultSlot)) in handleCallExpr()
8069 !HandleCovariantReturnAdjustment(Info, E, Result, in handleCallExpr()
8098 assert(!Info.Ctx.getLangOpts().CPlusPlus11 && in VisitMemberExpr()
8103 if (!Evaluate(Val, Info, E->getBase())) in VisitMemberExpr()
8122 return extractSubobject(Info, E, Obj, Designator, Result) && in VisitMemberExpr()
8128 if (!Evaluate(Val, Info, E->getBase())) in VisitExtVectorElementExpr()
8161 if (!Evaluate(AtomicVal, Info, E->getSubExpr())) in VisitCastExpr()
8172 if (!EvaluateLValue(E->getSubExpr(), LVal, Info)) in VisitCastExpr()
8176 if (!handleLValueToRValueConversion(Info, E, E->getSubExpr()->getType(), in VisitCastExpr()
8183 if (!Evaluate(SourceValue, Info, E->getSubExpr())) in VisitCastExpr()
8185 if (!handleLValueToRValueBitCast(Info, DestValue, SourceValue, E)) in VisitCastExpr()
8192 if (!Evaluate(Value, Info, E->getSubExpr())) in VisitCastExpr()
8208 if (!Info.getLangOpts().CPlusPlus14 && !Info.keepEvaluatingAfterFailure()) in VisitUnaryPostIncDec()
8212 if (!EvaluateLValue(UO->getSubExpr(), LVal, Info)) in VisitUnaryPostIncDec()
8215 if (!handleIncDec(this->Info, UO, LVal, UO->getSubExpr()->getType(), in VisitUnaryPostIncDec()
8224 llvm::SaveAndRestore NotCheckingForUB(Info.CheckingForUndefinedBehavior, in VisitStmtExpr()
8231 BlockScopeRAII Scope(Info); in VisitStmtExpr()
8238 Info.FFDiag((*BI)->getBeginLoc(), in VisitStmtExpr()
8247 EvalStmtResult ESR = EvaluateStmt(Result, Info, *BI); in VisitStmtExpr()
8253 Info.FFDiag((*BI)->getBeginLoc(), in VisitStmtExpr()
8264 EvaluateIgnoredValue(Info, E); in VisitIgnoredValue()
8271 if (Info.getLangOpts().MSVCCompat && !E->HasSideEffects(Info.Ctx)) in VisitIgnoredBaseExpression()
8298 return EvaluatePointer(E, Result, this->Info, InvalidBaseOK); in evaluatePointer()
8302 LValueExprEvaluatorBase(EvalInfo &Info, LValue &Result, bool InvalidBaseOK) in LValueExprEvaluatorBase() argument
8303 : ExprEvaluatorBaseTy(Info), Result(Result), in LValueExprEvaluatorBase()
8307 Result.setFrom(this->Info.Ctx, V); in Success()
8320 EvalOK = EvaluateTemporary(E->getBase(), Result, this->Info); in VisitMemberExpr()
8338 if (!HandleLValueMember(this->Info, E, Result, FD)) in VisitMemberExpr()
8341 if (!HandleLValueIndirectMember(this->Info, E, Result, IFD)) in VisitMemberExpr()
8348 if (!handleLValueToRValueConversion(this->Info, E, MD->getType(), Result, in VisitMemberExpr()
8363 return HandleMemberPointerAccess(this->Info, E, Result); in VisitBinaryOperator()
8379 return HandleLValueBasePath(this->Info, E, E->getSubExpr()->getType(), in VisitCastExpr()
8423 LValueExprEvaluator(EvalInfo &Info, LValue &Result, bool InvalidBaseOK) : in LValueExprEvaluator() argument
8424 LValueExprEvaluatorBaseTy(Info, Result, InvalidBaseOK) {} in LValueExprEvaluator()
8459 << 2 << Info.Ctx.getLangOpts().CPlusPlus; in VisitCastExpr()
8468 return HandleBaseToDerivedCast(Info, E, Result); in VisitCastExpr()
8473 return HandleDynamicCast(Info, cast<ExplicitCastExpr>(E), Result); in VisitCastExpr()
8484 static bool EvaluateLValue(const Expr *E, LValue &Result, EvalInfo &Info, in EvaluateLValue() argument
8489 return LValueExprEvaluator(Info, Result, InvalidBaseOK).Visit(E); in EvaluateLValue()
8511 if (Info.CurrentCall && isLambdaCallOperator(Info.CurrentCall->Callee) && in VisitVarDecl()
8518 if (Info.checkingPotentialConstantExpression()) in VisitVarDecl()
8521 if (auto *FD = Info.CurrentCall->LambdaCaptureFields.lookup(VD)) { in VisitVarDecl()
8522 const auto *MD = cast<CXXMethodDecl>(Info.CurrentCall->Callee); in VisitVarDecl()
8527 assert(Info.CurrentCall->This == nullptr && in VisitVarDecl()
8535 Info.getParamSlot(Info.CurrentCall->Arguments, MD->getParamDecl(0)); in VisitVarDecl()
8536 Result.setFrom(Info.Ctx, *RefValue); in VisitVarDecl()
8538 Result = *Info.CurrentCall->This; in VisitVarDecl()
8542 if (!HandleLValueMember(Info, E, Result, FD)) in VisitVarDecl()
8548 if (!handleLValueToRValueConversion(Info, E, FD->getType(), Result, in VisitVarDecl()
8551 Result.setFrom(Info.Ctx, RVal); in VisitVarDecl()
8566 CallStackFrame *CurrFrame = Info.CurrentCall; in VisitVarDecl()
8575 Info.getCallFrameAndDepth(CurrFrame->Arguments.CallIndex).first; in VisitVarDecl()
8593 if (!Info.getLangOpts().CPlusPlus11) { in VisitVarDecl()
8594 Info.CCEDiag(E, diag::note_constexpr_ltor_non_integral, 1) in VisitVarDecl()
8596 Info.Note(VD->getLocation(), diag::note_declared_at); in VisitVarDecl()
8600 if (!evaluateVarDeclInit(Info, E, VD, Frame, Version, V)) in VisitVarDecl()
8605 if (!Info.checkingPotentialConstantExpression()) in VisitVarDecl()
8606 Info.FFDiag(E, diag::note_constexpr_use_uninit_reference); in VisitVarDecl()
8642 if (!EvaluateIgnoredValue(Info, E)) in VisitMaterializeTemporaryExpr()
8650 if (Info.EvalMode == EvalInfo::EM_ConstantFold) in VisitMaterializeTemporaryExpr()
8657 Value = &Info.CurrentCall->createTemporary( in VisitMaterializeTemporaryExpr()
8667 if (!EvaluateInPlace(*Value, Info, Result, Inner)) { in VisitMaterializeTemporaryExpr()
8677 if (!HandleLValueBasePath(Info, Adjustments[I].DerivedToBase.BasePath, in VisitMaterializeTemporaryExpr()
8684 if (!HandleLValueMember(Info, E, Result, Adjustments[I].Field)) in VisitMaterializeTemporaryExpr()
8690 if (!HandleMemberPointerAccess(this->Info, Type, Result, in VisitMaterializeTemporaryExpr()
8703 assert((!Info.getLangOpts().CPlusPlus || E->isFileScope()) && in VisitCompoundLiteralExpr()
8715 TypeInfo = TypeInfoLValue(E->getTypeOperand(Info.Ctx).getTypePtr()); in VisitCXXTypeidExpr()
8719 if (!Info.Ctx.getLangOpts().CPlusPlus20) { in VisitCXXTypeidExpr()
8720 Info.CCEDiag(E, diag::note_constexpr_typeid_polymorphic) in VisitCXXTypeidExpr()
8729 ComputeDynamicType(Info, E, Result, AK_TypeId); in VisitCXXTypeidExpr()
8734 TypeInfoLValue(Info.Ctx.getRecordType(DynType->Type).getTypePtr()); in VisitCXXTypeidExpr()
8776 : !EvaluateInteger(SubExpr, Index, Info)) { in VisitArraySubscriptExpr()
8777 if (!Info.noteFailure()) in VisitArraySubscriptExpr()
8784 HandleLValueArrayAdjustment(Info, E, Result, E->getType(), Index); in VisitArraySubscriptExpr()
8796 HandleLValueComplexElement(Info, E, Result, E->getType(), false); in VisitUnaryReal()
8805 HandleLValueComplexElement(Info, E, Result, E->getType(), true); in VisitUnaryImag()
8810 if (!Info.getLangOpts().CPlusPlus14 && !Info.keepEvaluatingAfterFailure()) in VisitUnaryPreIncDec()
8817 this->Info, UO, Result, UO->getSubExpr()->getType(), in VisitUnaryPreIncDec()
8823 if (!Info.getLangOpts().CPlusPlus14 && !Info.keepEvaluatingAfterFailure()) in VisitCompoundAssignOperator()
8830 if (!Evaluate(RHS, this->Info, CAO->getRHS())) { in VisitCompoundAssignOperator()
8831 if (!Info.noteFailure()) in VisitCompoundAssignOperator()
8841 this->Info, CAO, in VisitCompoundAssignOperator()
8847 if (!Info.getLangOpts().CPlusPlus14 && !Info.keepEvaluatingAfterFailure()) in VisitBinAssign()
8854 if (!Evaluate(NewVal, this->Info, E->getRHS())) { in VisitBinAssign()
8855 if (!Info.noteFailure()) in VisitBinAssign()
8863 if (Info.getLangOpts().CPlusPlus20 && in VisitBinAssign()
8864 !MaybeHandleUnionActiveMemberChange(Info, E->getLHS(), Result)) in VisitBinAssign()
8867 return handleAssignment(this->Info, E, Result, E->getLHS()->getType(), in VisitBinAssign()
8942 static bool evaluateLValueAsAllocSize(EvalInfo &Info, APValue::LValueBase Base, in evaluateLValueAsAllocSize() argument
8970 Result.addUnsizedArray(Info, E, Pointee); in evaluateLValueAsAllocSize()
8986 return EvaluateLValue(E, Result, Info, InvalidBaseOK); in evaluateLValue()
8990 return EvaluatePointer(E, Result, Info, InvalidBaseOK); in evaluatePointer()
9001 Result.setFrom(Info.Ctx, V); in Success()
9005 Result.setNull(Info.Ctx, E->getType()); in ZeroInitialization()
9017 if (Info.noteFailure()) in VisitObjCBoxedExpr()
9018 EvaluateIgnoredValue(Info, E->getSubExpr()); in VisitObjCBoxedExpr()
9032 if (Info.checkingPotentialConstantExpression()) in VisitCXXThisExpr()
9034 if (!Info.CurrentCall->This) { in VisitCXXThisExpr()
9035 if (Info.getLangOpts().CPlusPlus11) in VisitCXXThisExpr()
9036 Info.FFDiag(E, diag::note_constexpr_this) << E->isImplicit(); in VisitCXXThisExpr()
9038 Info.FFDiag(E); in VisitCXXThisExpr()
9041 Result = *Info.CurrentCall->This; in VisitCXXThisExpr()
9043 if (isLambdaCallOperator(Info.CurrentCall->Callee)) { in VisitCXXThisExpr()
9048 if (!Info.CurrentCall->LambdaThisCaptureField) in VisitCXXThisExpr()
9057 if (!HandleLValueMember(Info, E, Result, in VisitCXXThisExpr()
9058 Info.CurrentCall->LambdaThisCaptureField)) in VisitCXXThisExpr()
9061 if (Info.CurrentCall->LambdaThisCaptureField->getType() in VisitCXXThisExpr()
9064 if (!handleLValueToRValueConversion(Info, E, E->getType(), Result, in VisitCXXThisExpr()
9068 Result.setFrom(Info.Ctx, RVal); in VisitCXXThisExpr()
9079 Info.Ctx, Info.CurrentCall->CurSourceLocExprScope.getDefaultExpr()); in VisitSourceLocExpr()
9080 Result.setFrom(Info.Ctx, LValResult); in VisitSourceLocExpr()
9085 std::string ResultStr = E->ComputeName(Info.Ctx); in VisitSYCLUniqueStableNameExpr()
9087 QualType CharTy = Info.Ctx.CharTy.withConst(); in VisitSYCLUniqueStableNameExpr()
9088 APInt Size(Info.Ctx.getTypeSize(Info.Ctx.getSizeType()), in VisitSYCLUniqueStableNameExpr()
9090 QualType ArrayTy = Info.Ctx.getConstantArrayType( in VisitSYCLUniqueStableNameExpr()
9094 StringLiteral::Create(Info.Ctx, ResultStr, StringLiteralKind::Ordinary, in VisitSYCLUniqueStableNameExpr()
9098 Result.addArray(Info, E, cast<ConstantArrayType>(ArrayTy)); in VisitSYCLUniqueStableNameExpr()
9106 static bool EvaluatePointer(const Expr* E, LValue& Result, EvalInfo &Info, in EvaluatePointer() argument
9110 return PointerExprEvaluator(Info, Result, InvalidBaseOK).Visit(E); in EvaluatePointer()
9124 if (!EvalPtrOK && !Info.noteFailure()) in VisitBinaryOperator()
9128 if (!EvaluateInteger(IExp, Offset, Info) || !EvalPtrOK) in VisitBinaryOperator()
9135 return HandleLValueArrayAdjustment(Info, E, Result, Pointee, Offset); in VisitBinaryOperator()
9181 Info.Ctx.hasSameUnqualifiedType(Result.Designator.getType(Info.Ctx), in VisitCastExpr()
9191 (Info.getStdAllocatorCaller("allocate") || in VisitCastExpr()
9192 IsDeclSourceLocationCurrent(Info.CurrentCall->Callee) || in VisitCastExpr()
9193 Info.getLangOpts().CPlusPlus26)) { in VisitCastExpr()
9199 << SubExpr->getType() << Info.getLangOpts().CPlusPlus26 in VisitCastExpr()
9200 << Result.Designator.getType(Info.Ctx).getCanonicalType() in VisitCastExpr()
9207 << 2 << Info.Ctx.getLangOpts().CPlusPlus; in VisitCastExpr()
9224 return HandleLValueBasePath(Info, E, E->getSubExpr()->getType()-> in VisitCastExpr()
9233 return HandleBaseToDerivedCast(Info, E, Result); in VisitCastExpr()
9238 return HandleDynamicCast(Info, cast<ExplicitCastExpr>(E), Result); in VisitCastExpr()
9246 << 2 << Info.Ctx.getLangOpts().CPlusPlus; in VisitCastExpr()
9249 if (!EvaluateIntegerOrLValue(SubExpr, Value, Info)) in VisitCastExpr()
9253 unsigned Size = Info.Ctx.getTypeSize(E->getType()); in VisitCastExpr()
9263 Result.setFrom(Info.Ctx, Value); in VisitCastExpr()
9273 APValue &Value = Info.CurrentCall->createTemporary( in VisitCastExpr()
9275 if (!EvaluateInPlace(Value, Info, Result, SubExpr)) in VisitCastExpr()
9279 auto *AT = Info.Ctx.getAsArrayType(SubExpr->getType()); in VisitCastExpr()
9281 Result.addArray(Info, E, CAT); in VisitCastExpr()
9283 Result.addUnsizedArray(Info, E, AT->getElementType()); in VisitCastExpr()
9297 if (!handleLValueToRValueConversion(Info, E, E->getSubExpr()->getType(), in VisitCastExpr()
9300 evaluateLValueAsAllocSize(Info, LVal.Base, Result); in VisitCastExpr()
9308 static CharUnits GetAlignOfType(EvalInfo &Info, QualType T, in GetAlignOfType() argument
9319 Info.Ctx.getLangOpts().getClangABICompat() <= LangOptions::ClangABI::Ver7; in GetAlignOfType()
9325 return Info.Ctx.toCharUnitsFromBits( in GetAlignOfType()
9326 Info.Ctx.getPreferredTypeAlign(T.getTypePtr())); in GetAlignOfType()
9329 return Info.Ctx.getTypeAlignInChars(T.getTypePtr()); in GetAlignOfType()
9334 static CharUnits GetAlignOfExpr(EvalInfo &Info, const Expr *E, in GetAlignOfExpr() argument
9345 return Info.Ctx.getDeclAlign(DRE->getDecl(), in GetAlignOfExpr()
9349 return Info.Ctx.getDeclAlign(ME->getMemberDecl(), in GetAlignOfExpr()
9352 return GetAlignOfType(Info, E->getType(), ExprKind); in GetAlignOfExpr()
9355 static CharUnits getBaseAlignment(EvalInfo &Info, const LValue &Value) { in getBaseAlignment() argument
9357 return Info.Ctx.getDeclAlign(VD); in getBaseAlignment()
9359 return GetAlignOfExpr(Info, E, UETT_AlignOf); in getBaseAlignment()
9360 return GetAlignOfType(Info, Value.Base.getTypeInfoType(), UETT_AlignOf); in getBaseAlignment()
9366 EvalInfo &Info, APSInt &Alignment) { in getAlignmentArgument() argument
9367 if (!EvaluateInteger(E, Alignment, Info)) in getAlignmentArgument()
9370 Info.FFDiag(E, diag::note_constexpr_invalid_alignment) << Alignment; in getAlignmentArgument()
9373 unsigned SrcWidth = Info.Ctx.getIntWidth(ForType); in getAlignmentArgument()
9376 Info.FFDiag(E, diag::note_constexpr_alignment_too_big) in getAlignmentArgument()
9401 Result.addUnsizedArray(Info, E, PointeeTy); in visitNonBuiltinCallExpr()
9436 if (!getAlignmentArgument(E->getArg(1), E->getArg(0)->getType(), Info, in VisitBuiltinCallExpr()
9443 if (!EvaluateInteger(E->getArg(2), Offset, Info)) in VisitBuiltinCallExpr()
9452 CharUnits BaseAlignment = getBaseAlignment(Info, OffsetResult); in VisitBuiltinCallExpr()
9486 if (!getAlignmentArgument(E->getArg(1), E->getArg(0)->getType(), Info, in VisitBuiltinCallExpr()
9489 CharUnits BaseAlignment = getBaseAlignment(Info, Result); in VisitBuiltinCallExpr()
9514 Info.FFDiag(E->getArg(0), diag::note_constexpr_alignment_adjust) in VisitBuiltinCallExpr()
9519 return HandleOperatorNewCall(Info, E, Result); in VisitBuiltinCallExpr()
9526 if (Info.getLangOpts().CPlusPlus11) in VisitBuiltinCallExpr()
9527 Info.CCEDiag(E, diag::note_constexpr_invalid_function) in VisitBuiltinCallExpr()
9529 << ("'" + Info.Ctx.BuiltinInfo.getName(BuiltinOp) + "'").str(); in VisitBuiltinCallExpr()
9531 Info.CCEDiag(E, diag::note_invalid_subexpr_in_const_expr); in VisitBuiltinCallExpr()
9541 if (!EvaluateInteger(E->getArg(1), Desired, Info)) in VisitBuiltinCallExpr()
9549 if (!EvaluateInteger(E->getArg(2), N, Info)) in VisitBuiltinCallExpr()
9556 if (!Result.checkNullPointerForFoldAccess(Info, E, AK_Read) || in VisitBuiltinCallExpr()
9559 QualType CharTy = Result.Designator.getType(Info.Ctx); in VisitBuiltinCallExpr()
9563 Info.Ctx.hasSameUnqualifiedType( in VisitBuiltinCallExpr()
9567 Info.FFDiag(E, diag::note_constexpr_ltor_incomplete_type) << CharTy; in VisitBuiltinCallExpr()
9573 Info.FFDiag(E, diag::note_constexpr_memchr_unsupported) in VisitBuiltinCallExpr()
9574 << ("'" + Info.Ctx.BuiltinInfo.getName(BuiltinOp) + "'").str() in VisitBuiltinCallExpr()
9587 if (!APSInt::isSameValue(HandleIntToIntCast(Info, E, CharTy, in VisitBuiltinCallExpr()
9600 DesiredVal = Desired.trunc(Info.Ctx.getCharWidth()).getZExtValue(); in VisitBuiltinCallExpr()
9616 if (!handleLValueToRValueConversion(Info, E, CharTy, Result, Char) || in VisitBuiltinCallExpr()
9623 if (!HandleLValueArrayAdjustment(Info, E, Result, CharTy, 1)) in VisitBuiltinCallExpr()
9634 if (Info.getLangOpts().CPlusPlus11) in VisitBuiltinCallExpr()
9635 Info.CCEDiag(E, diag::note_constexpr_invalid_function) in VisitBuiltinCallExpr()
9637 << ("'" + Info.Ctx.BuiltinInfo.getName(BuiltinOp) + "'").str(); in VisitBuiltinCallExpr()
9639 Info.CCEDiag(E, diag::note_invalid_subexpr_in_const_expr); in VisitBuiltinCallExpr()
9660 if (!EvaluatePointer(E->getArg(1), Src, Info)) in VisitBuiltinCallExpr()
9664 if (!EvaluateInteger(E->getArg(2), N, Info)) in VisitBuiltinCallExpr()
9679 Info.FFDiag(E, diag::note_constexpr_memcpy_null) in VisitBuiltinCallExpr()
9681 << Val.getAsString(Info.Ctx, E->getArg(0)->getType()); in VisitBuiltinCallExpr()
9690 QualType T = Dest.Designator.getType(Info.Ctx); in VisitBuiltinCallExpr()
9691 QualType SrcT = Src.Designator.getType(Info.Ctx); in VisitBuiltinCallExpr()
9692 if (!Info.Ctx.hasSameUnqualifiedType(T, SrcT)) { in VisitBuiltinCallExpr()
9694 Info.FFDiag(E, diag::note_constexpr_memcpy_type_pun) << Move << SrcT << T; in VisitBuiltinCallExpr()
9698 Info.FFDiag(E, diag::note_constexpr_memcpy_incomplete_type) << Move << T; in VisitBuiltinCallExpr()
9701 if (!T.isTriviallyCopyableType(Info.Ctx)) { in VisitBuiltinCallExpr()
9702 Info.FFDiag(E, diag::note_constexpr_memcpy_nontrivial) << Move << T; in VisitBuiltinCallExpr()
9707 uint64_t TSize = Info.Ctx.getTypeSizeInChars(T).getQuantity(); in VisitBuiltinCallExpr()
9715 Info.FFDiag(E, diag::note_constexpr_memcpy_unsupported) in VisitBuiltinCallExpr()
9728 Info.FFDiag(E, diag::note_constexpr_memcpy_unsupported) in VisitBuiltinCallExpr()
9744 Info.FFDiag(E, diag::note_constexpr_memcpy_overlap) << WChar; in VisitBuiltinCallExpr()
9748 if (!HandleLValueArrayAdjustment(Info, E, Src, T, NElems - 1) || in VisitBuiltinCallExpr()
9749 !HandleLValueArrayAdjustment(Info, E, Dest, T, NElems - 1)) in VisitBuiltinCallExpr()
9755 Info.FFDiag(E, diag::note_constexpr_memcpy_overlap) << WChar; in VisitBuiltinCallExpr()
9764 if (!handleLValueToRValueConversion(Info, E, T, Src, Val) || in VisitBuiltinCallExpr()
9765 !handleAssignment(Info, E, Dest, T, Val)) in VisitBuiltinCallExpr()
9771 if (!HandleLValueArrayAdjustment(Info, E, Src, T, Direction) || in VisitBuiltinCallExpr()
9772 !HandleLValueArrayAdjustment(Info, E, Dest, T, Direction)) in VisitBuiltinCallExpr()
9782 static bool EvaluateArrayNewInitList(EvalInfo &Info, LValue &This,
9785 static bool EvaluateArrayNewConstructExpr(EvalInfo &Info, LValue &This,
9791 if (!Info.getLangOpts().CPlusPlus20) in VisitCXXNewExpr()
9792 Info.CCEDiag(E, diag::note_constexpr_new); in VisitCXXNewExpr()
9795 if (Info.SpeculativeEvaluationDepth) in VisitCXXNewExpr()
9803 Info.CurrentCall->isStdFunction() && !E->isArray()) { in VisitCXXNewExpr()
9806 if (!EvaluatePointer(E->getPlacementArg(0), Result, Info)) in VisitCXXNewExpr()
9812 Info.FFDiag(E, diag::note_constexpr_new_non_replaceable) in VisitCXXNewExpr()
9831 if (!EvaluateLValue(E->getPlacementArg(0), Nothrow, Info)) in VisitCXXNewExpr()
9851 if (!EvaluateInteger(Stripped, ArrayBound, Info)) in VisitCXXNewExpr()
9862 Info.FFDiag(*ArraySize, diag::note_constexpr_new_negative) in VisitCXXNewExpr()
9869 if (!Info.CheckArraySize(ArraySize.value()->getExprLoc(), in VisitCXXNewExpr()
9871 Info.Ctx, AllocType, ArrayBound), in VisitCXXNewExpr()
9889 auto *CAT = Info.Ctx.getAsConstantArrayType(Init->getType()); in VisitCXXNewExpr()
9900 Info.FFDiag(*ArraySize, diag::note_constexpr_new_too_small) in VisitCXXNewExpr()
9913 AllocType = Info.Ctx.getConstantArrayType(AllocType, ArrayBound, nullptr, in VisitCXXNewExpr()
9924 EvalInfo &Info; in VisitCXXNewExpr() member
9935 if (!Info.Ctx.hasSameUnqualifiedType(SubobjType, AllocType)) { in VisitCXXNewExpr()
9936 Info.FFDiag(E, diag::note_constexpr_placement_new_wrong_type) << in VisitCXXNewExpr()
9944 Info.FFDiag(E, diag::note_constexpr_construct_complex_elem); in VisitCXXNewExpr()
9948 Info.FFDiag(E, diag::note_constexpr_construct_complex_elem); in VisitCXXNewExpr()
9951 } Handler = {Info, E, AllocType, AK, nullptr}; in VisitCXXNewExpr()
9953 CompleteObject Obj = findCompleteObject(Info, E, AK, Result, AllocType); in VisitCXXNewExpr()
9954 if (!Obj || !findSubobject(Info, E, Obj, Result.Designator, Handler)) in VisitCXXNewExpr()
9966 Val = Info.createHeapAlloc(E, AllocType, Result); in VisitCXXNewExpr()
9973 if (!EvaluateInPlace(*Val, Info, Result, &VIE)) in VisitCXXNewExpr()
9976 if (!EvaluateArrayNewInitList(Info, Result, *Val, ResizedArrayILE, in VisitCXXNewExpr()
9980 if (!EvaluateArrayNewConstructExpr(Info, Result, *Val, ResizedArrayCCE, in VisitCXXNewExpr()
9984 if (!EvaluateInPlace(*Val, Info, Result, Init)) in VisitCXXNewExpr()
9993 Result.addArray(Info, E, cast<ConstantArrayType>(AT)); in VisitCXXNewExpr()
10012 MemberPointerExprEvaluator(EvalInfo &Info, MemberPtr &Result) in MemberPointerExprEvaluator() argument
10013 : ExprEvaluatorBaseTy(Info), Result(Result) {} in MemberPointerExprEvaluator()
10029 EvalInfo &Info) { in EvaluateMemberPointer() argument
10032 return MemberPointerExprEvaluator(Info, Result).Visit(E); in EvaluateMemberPointer()
10135 static bool HandleClassZeroInitialization(EvalInfo &Info, const Expr *E, in HandleClassZeroInitialization() argument
10144 const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); in HandleClassZeroInitialization()
10152 if (!HandleLValueDirectBase(Info, E, Subobject, CD, Base, &Layout)) in HandleClassZeroInitialization()
10154 if (!HandleClassZeroInitialization(Info, E, Base, Subobject, in HandleClassZeroInitialization()
10166 if (!HandleLValueMember(Info, E, Subobject, I, &Layout)) in HandleClassZeroInitialization()
10171 Result.getStructField(I->getFieldIndex()), Info, Subobject, &VIE)) in HandleClassZeroInitialization()
10193 if (!HandleLValueMember(Info, E, Subobject, *I)) in ZeroInitialization()
10197 return EvaluateInPlace(Result.getUnionValue(), Info, Subobject, &VIE); in ZeroInitialization()
10201 Info.FFDiag(E, diag::note_constexpr_virtual_base) << RD; in ZeroInitialization()
10205 return HandleClassZeroInitialization(Info, E, RD, This, Result); in ZeroInitialization()
10219 if (!Evaluate(DerivedObject, Info, E->getSubExpr())) in VisitCastExpr()
10251 const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(RD); in VisitCXXParenListOrInitListExpr()
10255 Info, in VisitCXXParenListOrInitListExpr()
10283 if (!HandleLValueMember(Info, InitExpr, Subobject, Field, &Layout)) in VisitCXXParenListOrInitListExpr()
10287 ThisOverrideRAII ThisOverride(*Info.CurrentCall, &This, in VisitCXXParenListOrInitListExpr()
10290 if (EvaluateInPlace(Result.getUnionValue(), Info, Subobject, InitExpr)) { in VisitCXXParenListOrInitListExpr()
10292 return truncateBitfieldValue(Info, InitExpr, Result.getUnionValue(), in VisitCXXParenListOrInitListExpr()
10313 if (!HandleLValueBase(Info, Init, Subobject, CXXRD, &Base)) in VisitCXXParenListOrInitListExpr()
10317 if (!EvaluateInPlace(FieldVal, Info, Subobject, Init)) { in VisitCXXParenListOrInitListExpr()
10318 if (!Info.noteFailure()) in VisitCXXParenListOrInitListExpr()
10341 if (!HandleLValueMember(Info, HaveInit ? Args[ElementNo] : ExprToVisit, in VisitCXXParenListOrInitListExpr()
10347 ImplicitValueInitExpr VIE(HaveInit ? Info.Ctx.IntTy : Field->getType()); in VisitCXXParenListOrInitListExpr()
10351 if (auto *CAT = Info.Ctx.getAsConstantArrayType(Init->getType())) { in VisitCXXParenListOrInitListExpr()
10355 Info.FFDiag(Init, diag::note_constexpr_unsupported_flexible_array); in VisitCXXParenListOrInitListExpr()
10362 ThisOverrideRAII ThisOverride(*Info.CurrentCall, &This, in VisitCXXParenListOrInitListExpr()
10366 if (!EvaluateInPlace(FieldVal, Info, Subobject, Init) || in VisitCXXParenListOrInitListExpr()
10367 (Field->isBitField() && !truncateBitfieldValue(Info, Init, in VisitCXXParenListOrInitListExpr()
10369 if (!Info.noteFailure()) in VisitCXXParenListOrInitListExpr()
10388 if (CheckTrivialDefaultConstructor(Info, E->getExprLoc(), FD, ZeroInit)) { in VisitCXXConstructExpr()
10402 if (!CheckConstexprFunction(Info, E->getExprLoc(), FD, Definition, Body)) in VisitCXXConstructExpr()
10413 assert(SrcObj->isTemporaryObject(Info.Ctx, FD->getParent())); in VisitCXXConstructExpr()
10414 assert(Info.Ctx.hasSameUnqualifiedType(E->getType(), SrcObj->getType())); in VisitCXXConstructExpr()
10425 cast<CXXConstructorDecl>(Definition), Info, in VisitCXXConstructExpr()
10431 if (!Info.CurrentCall) { in VisitCXXInheritedCtorInitExpr()
10432 assert(Info.checkingPotentialConstantExpression()); in VisitCXXInheritedCtorInitExpr()
10443 if (!CheckConstexprFunction(Info, E->getExprLoc(), FD, Definition, Body)) in VisitCXXInheritedCtorInitExpr()
10446 return HandleConstructorCall(E, This, Info.CurrentCall->Arguments, in VisitCXXInheritedCtorInitExpr()
10447 cast<CXXConstructorDecl>(Definition), Info, in VisitCXXInheritedCtorInitExpr()
10454 Info.Ctx.getAsConstantArrayType(E->getSubExpr()->getType()); in VisitCXXStdInitializerListExpr()
10457 if (!EvaluateLValue(E->getSubExpr(), Array, Info)) in VisitCXXStdInitializerListExpr()
10463 Array.addArray(Info, E, ArrayType); in VisitCXXStdInitializerListExpr()
10466 Info.FFDiag(E, diag::note_constexpr_unsupported_layout) in VisitCXXStdInitializerListExpr()
10479 !Info.Ctx.hasSameType(Field->getType()->getPointeeType(), in VisitCXXStdInitializerListExpr()
10491 Info.Ctx.hasSameType(Field->getType()->getPointeeType(), in VisitCXXStdInitializerListExpr()
10494 if (!HandleLValueArrayAdjustment(Info, E, Array, in VisitCXXStdInitializerListExpr()
10499 } else if (Info.Ctx.hasSameType(Field->getType(), Info.Ctx.getSizeType())) in VisitCXXStdInitializerListExpr()
10529 const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(ClosureClass); in VisitLambdaExpr()
10542 if (!HandleLValueMember(Info, E, Subobject, Field, &Layout)) in VisitLambdaExpr()
10546 if (!EvaluateInPlace(FieldVal, Info, Subobject, CurFieldInit)) { in VisitLambdaExpr()
10547 if (!Info.keepEvaluatingAfterFailure()) in VisitLambdaExpr()
10556 APValue &Result, EvalInfo &Info) { in EvaluateRecord() argument
10560 return RecordExprEvaluator(Info, This, Result).Visit(E); in EvaluateRecord()
10574 TemporaryExprEvaluator(EvalInfo &Info, LValue &Result) : in TemporaryExprEvaluator() argument
10575 LValueExprEvaluatorBaseTy(Info, Result, false) {} in TemporaryExprEvaluator()
10579 APValue &Value = Info.CurrentCall->createTemporary( in VisitConstructExpr()
10581 return EvaluateInPlace(Value, Info, Result, E); in VisitConstructExpr()
10612 static bool EvaluateTemporary(const Expr *E, LValue &Result, EvalInfo &Info) { in EvaluateTemporary() argument
10615 return TemporaryExprEvaluator(Info, Result).Visit(E); in EvaluateTemporary()
10656 static bool EvaluateVector(const Expr* E, APValue& Result, EvalInfo &Info) { in EvaluateVector() argument
10659 return VectorExprEvaluator(Info, Result).Visit(E); in EvaluateVector()
10674 if (!EvaluateInteger(SE, IntResult, Info)) in VisitCastExpr()
10679 if (!EvaluateFloat(SE, FloatResult, Info)) in VisitCastExpr()
10692 if (!Evaluate(SVal, Info, SE)) in VisitCastExpr()
10698 Info.FFDiag(E, diag::note_constexpr_invalid_cast) in VisitCastExpr()
10699 << 2 << Info.Ctx.getLangOpts().CPlusPlus; in VisitCastExpr()
10703 if (!handleRValueToRValueBitCast(Info, Result, SVal, E)) in VisitCastExpr()
10732 if (!EvaluateVector(E->getInit(CountInits), v, Info)) in VisitInitListExpr()
10741 if (!EvaluateInteger(E->getInit(CountInits), sInt, Info)) in VisitInitListExpr()
10744 sInt = Info.Ctx.MakeIntValue(0, EltTy); in VisitInitListExpr()
10750 if (!EvaluateFloat(E->getInit(CountInits), f, Info)) in VisitInitListExpr()
10753 f = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy)); in VisitInitListExpr()
10768 ZeroElement = APValue(Info.Ctx.MakeIntValue(0, EltTy)); in ZeroInitialization()
10771 APValue(APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy))); in ZeroInitialization()
10805 bool LHSOK = Evaluate(LHSValue, Info, LHS); in VisitBinaryOperator()
10806 if (!LHSOK && !Info.noteFailure()) in VisitBinaryOperator()
10808 if (!Evaluate(RHSValue, Info, RHS) || !LHSOK) in VisitBinaryOperator()
10811 if (!handleVectorVectorBinOp(Info, E, Op, LHSValue, RHSValue)) in VisitBinaryOperator()
10877 if (!Evaluate(SubExprValue, Info, SubExpr)) in VisitUnaryOperator()
10895 Info.Ctx, ResultEltTy, Op, SubExprValue.getVectorElt(EltNum)); in VisitUnaryOperator()
10914 ArrayExprEvaluator(EvalInfo &Info, const LValue &This, APValue &Result) in ArrayExprEvaluator() argument
10915 : ExprEvaluatorBaseTy(Info), This(This), Result(Result) {} in ArrayExprEvaluator()
10925 Info.Ctx.getAsConstantArrayType(E->getType()); in ZeroInitialization()
10945 Subobject.addArray(Info, E, CAT); in ZeroInitialization()
10947 return EvaluateInPlace(Result.getArrayFiller(), Info, Subobject, &VIE); in ZeroInitialization()
10962 expandStringLiteral(Info, E, Result, AllocType); in VisitStringLiteral()
10974 APValue &Result, EvalInfo &Info) { in EvaluateArray() argument
10978 return ArrayExprEvaluator(Info, This, Result).Visit(E); in EvaluateArray()
10981 static bool EvaluateArrayNewInitList(EvalInfo &Info, LValue &This, in EvaluateArrayNewInitList() argument
10987 return ArrayExprEvaluator(Info, This, Result) in EvaluateArrayNewInitList()
10991 static bool EvaluateArrayNewConstructExpr(EvalInfo &Info, LValue &This, in EvaluateArrayNewConstructExpr() argument
10998 return ArrayExprEvaluator(Info, This, Result) in EvaluateArrayNewConstructExpr()
11025 const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType( in VisitInitListExpr()
11052 const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType( in VisitCXXParenListOrInitListExpr()
11086 Subobject.addArray(Info, ExprToVisit, CAT); in VisitCXXParenListOrInitListExpr()
11090 Info, Subobject, Init) || in VisitCXXParenListOrInitListExpr()
11091 !HandleLValueArrayAdjustment(Info, Init, Subobject, in VisitCXXParenListOrInitListExpr()
11093 if (!Info.noteFailure()) in VisitCXXParenListOrInitListExpr()
11105 return EvaluateInPlace(Result.getArrayFiller(), Info, Subobject, in VisitCXXParenListOrInitListExpr()
11113 !Evaluate(Info.CurrentCall->createTemporary( in VisitArrayInitLoopExpr()
11115 getStorageType(Info.Ctx, E->getCommonExpr()), in VisitArrayInitLoopExpr()
11117 Info, E->getCommonExpr()->getSourceExpr())) in VisitArrayInitLoopExpr()
11126 Subobject.addArray(Info, E, CAT); in VisitArrayInitLoopExpr()
11129 for (EvalInfo::ArrayInitLoopIndex Index(Info); Index != Elements; ++Index) { in VisitArrayInitLoopExpr()
11138 FullExpressionRAII Scope(Info); in VisitArrayInitLoopExpr()
11141 Info, Subobject, E->getSubExpr()) || in VisitArrayInitLoopExpr()
11142 !HandleLValueArrayAdjustment(Info, E, Subobject, in VisitArrayInitLoopExpr()
11144 if (!Info.noteFailure()) in VisitArrayInitLoopExpr()
11166 if (const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType(Type)) { in VisitCXXConstructExpr()
11179 Info, E->getExprLoc(), E->getConstructor(), in VisitCXXConstructExpr()
11182 ArrayElt.addArray(Info, E, CAT); in VisitCXXConstructExpr()
11215 !HandleLValueArrayAdjustment(Info, E, ArrayElt, in VisitCXXConstructExpr()
11220 if (Info.EvalStatus.Diag && !Info.EvalStatus.Diag->empty() && in VisitCXXConstructExpr()
11221 !Info.keepEvaluatingAfterFailure()) in VisitCXXConstructExpr()
11233 return RecordExprEvaluator(Info, Subobject, *Value) in VisitCXXConstructExpr()
11267 assert(SI.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) && in Success()
11279 assert(I.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) && in Success()
11293 Result = APValue(Info.Ctx.MakeIntValue(Value, E->getType())); in Success()
11359 if (Info.ArrayInitIndex == uint64_t(-1)) { in VisitArrayInitIndexExpr()
11362 Info.FFDiag(E); in VisitArrayInitIndexExpr()
11365 return Success(Info.ArrayInitIndex, E); in VisitArrayInitIndexExpr()
11406 APFixedPoint(I, Info.Ctx.getFixedPointSemantics(E->getType())), E); in Success()
11411 APFixedPoint(Value, Info.Ctx.getFixedPointSemantics(E->getType())), E); in Success()
11420 assert(V.getWidth() == Info.Ctx.getIntWidth(E->getType()) && in Success()
11449 EvalInfo &Info) { in EvaluateIntegerOrLValue() argument
11452 return IntExprEvaluator(Info, Result).Visit(E); in EvaluateIntegerOrLValue()
11455 static bool EvaluateInteger(const Expr *E, APSInt &Result, EvalInfo &Info) { in EvaluateInteger() argument
11458 if (!EvaluateIntegerOrLValue(E, Val, Info)) in EvaluateInteger()
11463 Info.FFDiag(E, diag::note_invalid_subexpr_in_const_expr); in EvaluateInteger()
11472 Info.Ctx, Info.CurrentCall->CurSourceLocExprScope.getDefaultExpr()); in VisitSourceLocExpr()
11477 EvalInfo &Info) { in EvaluateFixedPoint() argument
11481 if (!FixedPointExprEvaluator(Info, Val).Visit(E)) in EvaluateFixedPoint()
11493 EvalInfo &Info) { in EvaluateFixedPointOrInteger() argument
11496 auto FXSema = Info.Ctx.getFixedPointSemantics(E->getType()); in EvaluateFixedPointOrInteger()
11498 if (!EvaluateInteger(E, Val, Info)) in EvaluateFixedPointOrInteger()
11503 return EvaluateFixedPoint(E, Result, Info); in EvaluateFixedPointOrInteger()
11518 == Info.Ctx.getIntWidth(E->getType())); in CheckReferencedDecl()
11528 Val = Val.extOrTrunc(Info.Ctx.getIntWidth(E->getType())); in CheckReferencedDecl()
11723 static bool EvaluateBuiltinConstantP(EvalInfo &Info, const Expr *Arg) { in EvaluateBuiltinConstantP() argument
11726 SpeculativeEvaluationRAII SpeculativeEval(Info); in EvaluateBuiltinConstantP()
11731 FoldConstant Fold(Info, true); in EvaluateBuiltinConstantP()
11753 if (!::EvaluateAsRValue(Info, Arg, V) || Info.EvalStatus.HasSideEffects) { in EvaluateBuiltinConstantP()
11976 static void addFlexibleArrayMemberInitSize(EvalInfo &Info, const QualType &T, in addFlexibleArrayMemberInitSize() argument
11983 Size += VD->getFlexibleArrayInitChars(Info.Ctx); in addFlexibleArrayMemberInitSize()
11992 static bool determineEndOffset(EvalInfo &Info, SourceLocation ExprLoc, in determineEndOffset() argument
12000 return HandleSizeof(Info, ExprLoc, Ty, Result); in determineEndOffset()
12013 getBytesReturnedByAllocSizeCall(Info.Ctx, LVal, APEndOffset)) in determineEndOffset()
12021 addFlexibleArrayMemberInitSize(Info, BaseTy, LVal, EndOffset); in determineEndOffset()
12035 if (isUserWritingOffTheEnd(Info.Ctx, LVal)) { in determineEndOffset()
12040 getBytesReturnedByAllocSizeCall(Info.Ctx, LVal, APEndOffset)) in determineEndOffset()
12077 EvalInfo &Info, uint64_t &Size) { in tryEvaluateBuiltinObjectSize() argument
12084 SpeculativeEvaluationRAII SpeculativeEval(Info); in tryEvaluateBuiltinObjectSize()
12085 IgnoreSideEffectsRAII Fold(Info); in tryEvaluateBuiltinObjectSize()
12091 if (!EvaluateAsRValue(Info, E, RVal)) in tryEvaluateBuiltinObjectSize()
12093 LVal.setFrom(Info.Ctx, RVal); in tryEvaluateBuiltinObjectSize()
12094 } else if (!EvaluatePointer(ignorePointerCastsAndParens(E), LVal, Info, in tryEvaluateBuiltinObjectSize()
12107 if (!determineEndOffset(Info, E->getExprLoc(), Type, LVal, EndOffset)) in tryEvaluateBuiltinObjectSize()
12125 static bool getBuiltinAlignArguments(const CallExpr *E, EvalInfo &Info, in getBuiltinAlignArguments() argument
12128 if (!getAlignmentArgument(E->getArg(1), SrcTy, Info, Alignment)) in getBuiltinAlignArguments()
12134 if (!EvaluatePointer(E->getArg(0), Ptr, Info)) in getBuiltinAlignArguments()
12138 Info.FFDiag(E->getArg(0)); in getBuiltinAlignArguments()
12142 if (!EvaluateInteger(E->getArg(0), SrcInt, Info)) in getBuiltinAlignArguments()
12162 E->getArg(1)->EvaluateKnownConstInt(Info.Ctx).getZExtValue(); in VisitBuiltinCallExpr()
12166 if (tryEvaluateBuiltinObjectSize(E->getArg(0), Type, Info, Size)) in VisitBuiltinCallExpr()
12169 if (E->getArg(0)->HasSideEffects(Info.Ctx)) in VisitBuiltinCallExpr()
12174 switch (Info.EvalMode) { in VisitBuiltinCallExpr()
12190 analyze_os_log::computeOSLogBufferLayout(Info.Ctx, E, Layout); in VisitBuiltinCallExpr()
12197 if (!getBuiltinAlignArguments(E, Info, Src, Alignment)) in VisitBuiltinCallExpr()
12202 Ptr.setFrom(Info.Ctx, Src); in VisitBuiltinCallExpr()
12203 CharUnits BaseAlignment = getBaseAlignment(Info, Ptr); in VisitBuiltinCallExpr()
12221 Info.FFDiag(E->getArg(0), diag::note_constexpr_alignment_compute) in VisitBuiltinCallExpr()
12231 if (!getBuiltinAlignArguments(E, Info, Src, Alignment)) in VisitBuiltinCallExpr()
12244 if (!getBuiltinAlignArguments(E, Info, Src, Alignment)) in VisitBuiltinCallExpr()
12259 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitBuiltinCallExpr()
12269 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitBuiltinCallExpr()
12276 return Success((int)EvaluateBuiltinClassifyType(E, Info.getLangOpts()), E); in VisitBuiltinCallExpr()
12282 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitBuiltinCallExpr()
12296 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitBuiltinCallExpr()
12313 if (EvaluateBuiltinConstantP(Info, Arg)) in VisitBuiltinCallExpr()
12315 if (Info.InConstantContext || Arg->HasSideEffects(Info.Ctx)) { in VisitBuiltinCallExpr()
12321 Info.FFDiag(E, diag::note_invalid_subexpr_in_const_expr); in VisitBuiltinCallExpr()
12326 const auto *Callee = Info.CurrentCall->getCallee(); in VisitBuiltinCallExpr()
12327 if (Info.InConstantContext && !Info.CheckingPotentialConstantExpression && in VisitBuiltinCallExpr()
12328 (Info.CallStackDepth == 1 || in VisitBuiltinCallExpr()
12329 (Info.CallStackDepth == 2 && Callee->isInStdNamespace() && in VisitBuiltinCallExpr()
12333 if (Info.EvalStatus.Diag) in VisitBuiltinCallExpr()
12334 Info.report((Info.CallStackDepth == 1) in VisitBuiltinCallExpr()
12336 : Info.CurrentCall->getCallRange().getBegin(), in VisitBuiltinCallExpr()
12338 << (Info.CallStackDepth == 1 ? "__builtin_is_constant_evaluated" in VisitBuiltinCallExpr()
12342 return Success(Info.InConstantContext, E); in VisitBuiltinCallExpr()
12350 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitBuiltinCallExpr()
12359 int Operand = E->getArg(0)->EvaluateKnownConstInt(Info.Ctx).getZExtValue(); in VisitBuiltinCallExpr()
12360 Operand = Info.Ctx.getTargetInfo().getEHDataRegisterNumber(Operand); in VisitBuiltinCallExpr()
12372 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitBuiltinCallExpr()
12381 if (!EvaluateFloat(E->getArg(5), Val, Info)) in VisitBuiltinCallExpr()
12395 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitBuiltinCallExpr()
12401 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitBuiltinCallExpr()
12407 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitBuiltinCallExpr()
12413 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitBuiltinCallExpr()
12419 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitBuiltinCallExpr()
12425 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitBuiltinCallExpr()
12431 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitBuiltinCallExpr()
12437 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitBuiltinCallExpr()
12443 if (!EvaluateInteger(E->getArg(1), MaskVal, Info)) in VisitBuiltinCallExpr()
12447 return EvaluateFloat(E->getArg(0), Val, Info) && in VisitBuiltinCallExpr()
12455 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitBuiltinCallExpr()
12468 if (!EvaluateInteger(E->getArg(0), Val, Info)) in VisitBuiltinCallExpr()
12484 if (!EvaluateInteger(E->getArg(0), Val, Info) || in VisitBuiltinCallExpr()
12485 !EvaluateInteger(E->getArg(1), Amt, Info)) in VisitBuiltinCallExpr()
12501 if (!EvaluateInteger(E->getArg(0), Val, Info) || in VisitBuiltinCallExpr()
12502 !EvaluateInteger(E->getArg(1), Amt, Info)) in VisitBuiltinCallExpr()
12511 if (Info.getLangOpts().CPlusPlus11) in VisitBuiltinCallExpr()
12512 Info.CCEDiag(E, diag::note_constexpr_invalid_function) in VisitBuiltinCallExpr()
12514 << ("'" + Info.Ctx.BuiltinInfo.getName(BuiltinOp) + "'").str(); in VisitBuiltinCallExpr()
12516 Info.CCEDiag(E, diag::note_invalid_subexpr_in_const_expr); in VisitBuiltinCallExpr()
12523 if (EvaluateBuiltinStrLen(E->getArg(0), StrLen, Info)) in VisitBuiltinCallExpr()
12536 if (Info.getLangOpts().CPlusPlus11) in VisitBuiltinCallExpr()
12537 Info.CCEDiag(E, diag::note_constexpr_invalid_function) in VisitBuiltinCallExpr()
12539 << ("'" + Info.Ctx.BuiltinInfo.getName(BuiltinOp) + "'").str(); in VisitBuiltinCallExpr()
12541 Info.CCEDiag(E, diag::note_invalid_subexpr_in_const_expr); in VisitBuiltinCallExpr()
12551 if (!EvaluatePointer(E->getArg(0), String1, Info) || in VisitBuiltinCallExpr()
12552 !EvaluatePointer(E->getArg(1), String2, Info)) in VisitBuiltinCallExpr()
12561 if (!EvaluateInteger(E->getArg(2), N, Info)) in VisitBuiltinCallExpr()
12570 if (!String1.checkNullPointerForFoldAccess(Info, E, AK_Read) || in VisitBuiltinCallExpr()
12571 !String2.checkNullPointerForFoldAccess(Info, E, AK_Read) || in VisitBuiltinCallExpr()
12575 QualType CharTy1 = String1.Designator.getType(Info.Ctx); in VisitBuiltinCallExpr()
12576 QualType CharTy2 = String2.Designator.getType(Info.Ctx); in VisitBuiltinCallExpr()
12584 (Info.Ctx.hasSameUnqualifiedType( in VisitBuiltinCallExpr()
12586 Info.Ctx.hasSameUnqualifiedType(CharTy1, CharTy2))); in VisitBuiltinCallExpr()
12593 Info.FFDiag(E, diag::note_constexpr_memcmp_unsupported) in VisitBuiltinCallExpr()
12594 << ("'" + Info.Ctx.BuiltinInfo.getName(BuiltinOp) + "'").str() in VisitBuiltinCallExpr()
12600 return handleLValueToRValueConversion(Info, E, CharTy1, String1, Char1) && in VisitBuiltinCallExpr()
12601 handleLValueToRValueConversion(Info, E, CharTy2, String2, Char2) && in VisitBuiltinCallExpr()
12605 return HandleLValueArrayAdjustment(Info, E, String1, CharTy1, 1) && in VisitBuiltinCallExpr()
12606 HandleLValueArrayAdjustment(Info, E, String2, CharTy2, 1); in VisitBuiltinCallExpr()
12646 if (!EvaluateInteger(E->getArg(0), SizeVal, Info)) in VisitBuiltinCallExpr()
12663 Info.Ctx.getTargetInfo().getMaxAtomicInlineWidth(); in VisitBuiltinCallExpr()
12664 if (Size <= Info.Ctx.toCharUnitsFromBits(InlineWidthBits)) { in VisitBuiltinCallExpr()
12667 E->getArg(1)->isNullPointerConstant(Info.Ctx, in VisitBuiltinCallExpr()
12676 Info.Ctx.getTypeAlignInChars(PointeeType) >= Size) { in VisitBuiltinCallExpr()
12711 if (!EvaluateInteger(E->getArg(0), LHS, Info) || in VisitBuiltinCallExpr()
12712 !EvaluateInteger(E->getArg(1), RHS, Info) || in VisitBuiltinCallExpr()
12713 !EvaluatePointer(E->getArg(2), ResultLValue, Info)) in VisitBuiltinCallExpr()
12729 uint64_t ResultSize = Info.Ctx.getTypeSize(ResultType); in VisitBuiltinCallExpr()
12790 APSInt Temp = Result.extOrTrunc(Info.Ctx.getTypeSize(ResultType)); in VisitBuiltinCallExpr()
12799 if (!handleAssignment(Info, E, ResultLValue, ResultType, APV)) in VisitBuiltinCallExpr()
12862 void startSpeculativeEval(EvalInfo &Info) { in startSpeculativeEval()
12863 SpecEvalRAII = SpeculativeEvaluationRAII(Info); in startSpeculativeEval()
12873 EvalInfo &Info; member in __anon7ee061302a11::DataRecursiveIntBinOpEvaluator
12878 : IntEval(IntEval), Info(IntEval.getEvalInfo()), FinalResult(Result) { } in DataRecursiveIntBinOpEvaluator()
12918 return Info.CCEDiag(E, D); in CCEDiag()
12929 Result.Failed = !Evaluate(Result.Val, Info, E); in EvaluateExpr()
12952 return Info.noteSideEffect(); in VisitBinOpLHSOnly()
12970 if (!Info.noteSideEffect()) in VisitBinOpLHSOnly()
12985 if (LHSResult.Failed && !Info.noteFailure()) in VisitBinOpLHSOnly()
13090 APSInt Value(Info.Ctx.getIntWidth(E->getType()), in VisitBinOp()
13092 if (!handleIntIntBinOp(Info, E, LHSVal.getInt(), E->getOpcode(), in VisitBinOp()
13124 job.startSpeculativeEval(Info); in process()
13156 EvaluateComparisonBinaryOperator(EvalInfo &Info, const BinaryOperator *E, in EvaluateComparisonBinaryOperator() argument
13164 Info.FFDiag(E, diag::note_invalid_subexpr_in_const_expr); in EvaluateComparisonBinaryOperator()
13177 bool LHSOK = EvaluateInteger(E->getLHS(), LHS, Info); in EvaluateComparisonBinaryOperator()
13178 if (!LHSOK && !Info.noteFailure()) in EvaluateComparisonBinaryOperator()
13180 if (!EvaluateInteger(E->getRHS(), RHS, Info) || !LHSOK) in EvaluateComparisonBinaryOperator()
13190 APFixedPoint LHSFX(Info.Ctx.getFixedPointSemantics(LHSTy)); in EvaluateComparisonBinaryOperator()
13191 APFixedPoint RHSFX(Info.Ctx.getFixedPointSemantics(RHSTy)); in EvaluateComparisonBinaryOperator()
13193 bool LHSOK = EvaluateFixedPointOrInteger(E->getLHS(), LHSFX, Info); in EvaluateComparisonBinaryOperator()
13194 if (!LHSOK && !Info.noteFailure()) in EvaluateComparisonBinaryOperator()
13196 if (!EvaluateFixedPointOrInteger(E->getRHS(), RHSFX, Info) || !LHSOK) in EvaluateComparisonBinaryOperator()
13210 EvaluateLValue(E->getLHS(), LV, Info); in EvaluateComparisonBinaryOperator()
13213 LHSOK = EvaluateFloat(E->getLHS(), LHS.FloatReal, Info); in EvaluateComparisonBinaryOperator()
13219 LHSOK = EvaluateComplex(E->getLHS(), LHS, Info); in EvaluateComparisonBinaryOperator()
13221 if (!LHSOK && !Info.noteFailure()) in EvaluateComparisonBinaryOperator()
13225 if (!EvaluateFloat(E->getRHS(), RHS.FloatReal, Info) || !LHSOK) in EvaluateComparisonBinaryOperator()
13229 } else if (!EvaluateComplex(E->getRHS(), RHS, Info) || !LHSOK) in EvaluateComparisonBinaryOperator()
13251 bool LHSOK = EvaluateFloat(E->getRHS(), RHS, Info); in EvaluateComparisonBinaryOperator()
13252 if (!LHSOK && !Info.noteFailure()) in EvaluateComparisonBinaryOperator()
13255 if (!EvaluateFloat(E->getLHS(), LHS, Info) || !LHSOK) in EvaluateComparisonBinaryOperator()
13260 if (!Info.InConstantContext && in EvaluateComparisonBinaryOperator()
13262 E->getFPFeaturesInEffect(Info.Ctx.getLangOpts()).isFPConstrained()) { in EvaluateComparisonBinaryOperator()
13264 Info.FFDiag(E, diag::note_constexpr_float_arithmetic_strict); in EvaluateComparisonBinaryOperator()
13286 bool LHSOK = EvaluatePointer(E->getLHS(), LHSValue, Info); in EvaluateComparisonBinaryOperator()
13287 if (!LHSOK && !Info.noteFailure()) in EvaluateComparisonBinaryOperator()
13290 if (!EvaluatePointer(E->getRHS(), RHSValue, Info) || !LHSOK) in EvaluateComparisonBinaryOperator()
13297 std::string LHS = LHSValue.toString(Info.Ctx, E->getLHS()->getType()); in EvaluateComparisonBinaryOperator()
13298 std::string RHS = RHSValue.toString(Info.Ctx, E->getRHS()->getType()); in EvaluateComparisonBinaryOperator()
13299 Info.FFDiag(E, DiagID) in EvaluateComparisonBinaryOperator()
13332 isOnePastTheEndOfCompleteObject(Info.Ctx, RHSValue)) in EvaluateComparisonBinaryOperator()
13336 isOnePastTheEndOfCompleteObject(Info.Ctx, LHSValue)) in EvaluateComparisonBinaryOperator()
13362 Info.CCEDiag(E, diag::note_constexpr_void_comparison); in EvaluateComparisonBinaryOperator()
13387 Info.CCEDiag(E, diag::note_constexpr_pointer_comparison_base_classes); in EvaluateComparisonBinaryOperator()
13389 Info.CCEDiag(E, diag::note_constexpr_pointer_comparison_base_field) in EvaluateComparisonBinaryOperator()
13393 Info.CCEDiag(E, diag::note_constexpr_pointer_comparison_base_field) in EvaluateComparisonBinaryOperator()
13398 Info.CCEDiag(E, in EvaluateComparisonBinaryOperator()
13407 unsigned PtrSize = Info.Ctx.getTypeSize(LHSTy); in EvaluateComparisonBinaryOperator()
13422 CharUnits Size = Info.Ctx.getTypeSizeInChars(BaseTy); in EvaluateComparisonBinaryOperator()
13441 bool LHSOK = EvaluateMemberPointer(E->getLHS(), LHSValue, Info); in EvaluateComparisonBinaryOperator()
13442 if (!LHSOK && !Info.noteFailure()) in EvaluateComparisonBinaryOperator()
13445 if (!EvaluateMemberPointer(E->getRHS(), RHSValue, Info) || !LHSOK) in EvaluateComparisonBinaryOperator()
13451 Info.FFDiag(E, diag::note_constexpr_mem_pointer_weak_comparison) in EvaluateComparisonBinaryOperator()
13456 Info.FFDiag(E, diag::note_constexpr_mem_pointer_weak_comparison) in EvaluateComparisonBinaryOperator()
13473 Info.CCEDiag(E, diag::note_constexpr_compare_virtual_mem_ptr) << MD; in EvaluateComparisonBinaryOperator()
13476 Info.CCEDiag(E, diag::note_constexpr_compare_virtual_mem_ptr) << MD; in EvaluateComparisonBinaryOperator()
13493 if (!EvaluatePointer(E->getLHS(), Res, Info) || in EvaluateComparisonBinaryOperator()
13494 !EvaluatePointer(E->getRHS(), Res, Info)) in EvaluateComparisonBinaryOperator()
13503 if (!CheckLiteralType(Info, E)) in VisitBinCmp()
13527 Info.Ctx.CompCategories.getInfoForType(E->getType()); in VisitBinCmp()
13532 if (!handleLValueToRValueConversion(Info, E, E->getType(), LV, Result)) in VisitBinCmp()
13534 return CheckConstantExpression(Info, E->getExprLoc(), E->getType(), Result, in VisitBinCmp()
13537 return EvaluateComparisonBinaryOperator(Info, E, OnSuccess, [&]() { in VisitBinCmp()
13552 if (!Info.noteFailure()) in VisitBinaryOperator()
13589 return EvaluateComparisonBinaryOperator(Info, E, OnSuccess, [&]() { in VisitBinaryOperator()
13601 bool LHSOK = EvaluatePointer(E->getLHS(), LHSValue, Info); in VisitBinaryOperator()
13602 if (!LHSOK && !Info.noteFailure()) in VisitBinaryOperator()
13605 if (!EvaluatePointer(E->getRHS(), RHSValue, Info) || !LHSOK) in VisitBinaryOperator()
13641 Info.CCEDiag(E, diag::note_constexpr_pointer_subtraction_not_same_array); in VisitBinaryOperator()
13647 if (!HandleSizeof(Info, E->getExprLoc(), ElementType, ElementSize)) in VisitBinaryOperator()
13654 Info.FFDiag(E, diag::note_constexpr_pointer_subtraction_zero_size) in VisitBinaryOperator()
13672 APSInt Result = TrueResult.trunc(Info.Ctx.getIntWidth(E->getType())); in VisitBinaryOperator()
13675 !HandleOverflow(Info, E, TrueResult, E->getType())) in VisitBinaryOperator()
13691 return Success(GetAlignOfType(Info, E->getArgumentType(), E->getKind()), in VisitUnaryExprOrTypeTraitExpr()
13694 return Success(GetAlignOfExpr(Info, E->getArgumentExpr(), E->getKind()), in VisitUnaryExprOrTypeTraitExpr()
13723 if (!HandleSizeof(Info, E->getExprLoc(), SrcTy, Sizeof, in VisitUnaryExprOrTypeTraitExpr()
13733 Info.Ctx.toCharUnitsFromBits( in VisitUnaryExprOrTypeTraitExpr()
13734 Info.Ctx.getOpenMPDefaultSimdAlign(E->getArgumentType())) in VisitUnaryExprOrTypeTraitExpr()
13745 if (Info.InConstantContext) in VisitUnaryExprOrTypeTraitExpr()
13746 Info.CCEDiag(E, diag::note_constexpr_non_const_vectorelements) in VisitUnaryExprOrTypeTraitExpr()
13768 if (!EvaluateInteger(Idx, IdxResult, Info)) in VisitOffsetOfExpr()
13770 const ArrayType *AT = Info.Ctx.getAsArrayType(CurrentType); in VisitOffsetOfExpr()
13774 CharUnits ElementSize = Info.Ctx.getTypeSizeInChars(CurrentType); in VisitOffsetOfExpr()
13786 const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD); in VisitOffsetOfExpr()
13789 Result += Info.Ctx.toCharUnitsFromBits(RL.getFieldOffset(i)); in VisitOffsetOfExpr()
13808 const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD); in VisitOffsetOfExpr()
13844 if (Info.checkingForUndefinedBehavior()) in VisitUnaryOperator()
13845 Info.Ctx.getDiagnostics().Report(E->getExprLoc(), in VisitUnaryOperator()
13849 if (!HandleOverflow(Info, E, -Value.extend(Value.getBitWidth() + 1), in VisitUnaryOperator()
13863 if (!EvaluateAsBooleanCondition(E->getSubExpr(), bres, Info)) in VisitUnaryOperator()
13944 if (!EvaluateAsBooleanCondition(SubExpr, BoolResult, Info)) in VisitCastExpr()
13953 APFixedPoint Src(Info.Ctx.getFixedPointSemantics(SrcType)); in VisitCastExpr()
13954 if (!EvaluateFixedPoint(SubExpr, Src, Info)) in VisitCastExpr()
13958 Info.Ctx.getIntWidth(DestType), in VisitCastExpr()
13960 if (Overflowed && !HandleOverflow(Info, E, Result, DestType)) in VisitCastExpr()
13968 if (!Evaluate(Val, Info, SubExpr)) in VisitCastExpr()
13984 return Info.Ctx.getTypeSize(DestType) <= Info.Ctx.getTypeSize(SrcType); in VisitCastExpr()
13986 return Info.Ctx.getTypeSize(DestType) == Info.Ctx.getTypeSize(SrcType); in VisitCastExpr()
13989 if (Info.Ctx.getLangOpts().CPlusPlus && Info.InConstantContext && in VisitCastExpr()
13990 Info.EvalMode == EvalInfo::EM_ConstantExpression && in VisitCastExpr()
14001 Info.EvaluatingDecl.dyn_cast<const ValueDecl *>())) in VisitCastExpr()
14026 Info.Ctx.getDiagnostics().Report( in VisitCastExpr()
14032 Info.Ctx.getDiagnostics().Report( in VisitCastExpr()
14039 return Success(HandleIntToIntCast(Info, E, DestType, SrcType, in VisitCastExpr()
14045 << 2 << Info.Ctx.getLangOpts().CPlusPlus << E->getSourceRange(); in VisitCastExpr()
14048 if (!EvaluatePointer(SubExpr, LV, Info)) in VisitCastExpr()
14056 if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(SrcType)) in VisitCastExpr()
14067 if (!V.toIntegralConstant(AsInt, SrcType, Info.Ctx)) in VisitCastExpr()
14070 return Success(HandleIntToIntCast(Info, E, DestType, SrcType, AsInt), E); in VisitCastExpr()
14075 if (!EvaluateComplex(SubExpr, C, Info)) in VisitCastExpr()
14082 if (!EvaluateFloat(SubExpr, F, Info)) in VisitCastExpr()
14086 if (!HandleFloatToIntCast(Info, E, SrcType, F, DestType, Value)) in VisitCastExpr()
14098 if (!EvaluateComplex(E->getSubExpr(), LV, Info)) in VisitUnaryReal()
14111 if (!EvaluateComplex(E->getSubExpr(), LV, Info)) in VisitUnaryImag()
14153 if (Overflowed && !HandleOverflow(Info, E, Negated, E->getType())) in VisitUnaryOperator()
14159 if (!EvaluateAsBooleanCondition(E->getSubExpr(), bres, Info)) in VisitUnaryOperator()
14171 auto DestFXSema = Info.Ctx.getFixedPointSemantics(DestType); in VisitCastExpr()
14175 APFixedPoint Src(Info.Ctx.getFixedPointSemantics(SubExpr->getType())); in VisitCastExpr()
14176 if (!EvaluateFixedPoint(SubExpr, Src, Info)) in VisitCastExpr()
14181 if (Info.checkingForUndefinedBehavior()) in VisitCastExpr()
14182 Info.Ctx.getDiagnostics().Report(E->getExprLoc(), in VisitCastExpr()
14185 if (!HandleOverflow(Info, E, Result, E->getType())) in VisitCastExpr()
14192 if (!EvaluateInteger(SubExpr, Src, Info)) in VisitCastExpr()
14197 Src, Info.Ctx.getFixedPointSemantics(DestType), &Overflowed); in VisitCastExpr()
14200 if (Info.checkingForUndefinedBehavior()) in VisitCastExpr()
14201 Info.Ctx.getDiagnostics().Report(E->getExprLoc(), in VisitCastExpr()
14204 if (!HandleOverflow(Info, E, IntResult, E->getType())) in VisitCastExpr()
14212 if (!EvaluateFloat(SubExpr, Src, Info)) in VisitCastExpr()
14217 Src, Info.Ctx.getFixedPointSemantics(DestType), &Overflowed); in VisitCastExpr()
14220 if (Info.checkingForUndefinedBehavior()) in VisitCastExpr()
14221 Info.Ctx.getDiagnostics().Report(E->getExprLoc(), in VisitCastExpr()
14224 if (!HandleOverflow(Info, E, Result, E->getType())) in VisitCastExpr()
14245 Info.Ctx.getFixedPointSemantics(E->getType()); in VisitBinaryOperator()
14247 APFixedPoint LHSFX(Info.Ctx.getFixedPointSemantics(LHS->getType())); in VisitBinaryOperator()
14248 if (!EvaluateFixedPointOrInteger(LHS, LHSFX, Info)) in VisitBinaryOperator()
14250 APFixedPoint RHSFX(Info.Ctx.getFixedPointSemantics(RHS->getType())); in VisitBinaryOperator()
14251 if (!EvaluateFixedPointOrInteger(RHS, RHSFX, Info)) in VisitBinaryOperator()
14274 Info.FFDiag(E, diag::note_expr_divide_by_zero); in VisitBinaryOperator()
14293 Info.CCEDiag(E, diag::note_constexpr_negative_shift) << RHSVal; in VisitBinaryOperator()
14295 Info.CCEDiag(E, diag::note_constexpr_large_shift) in VisitBinaryOperator()
14308 if (Info.checkingForUndefinedBehavior()) in VisitBinaryOperator()
14309 Info.Ctx.getDiagnostics().Report(E->getExprLoc(), in VisitBinaryOperator()
14312 if (!HandleOverflow(Info, E, Result, E->getType())) in VisitBinaryOperator()
14336 Result = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(E->getType())); in ZeroInitialization()
14354 static bool EvaluateFloat(const Expr* E, APFloat& Result, EvalInfo &Info) { in EvaluateFloat() argument
14357 return FloatExprEvaluator(Info, Result).Visit(E); in EvaluateFloat()
14417 Info.Ctx.getFloatTypeSemantics(E->getType()); in VisitCallExpr()
14427 if (!TryEvaluateBuiltinNaN(Info.Ctx, E->getType(), E->getArg(0), in VisitCallExpr()
14439 if (!TryEvaluateBuiltinNaN(Info.Ctx, E->getType(), E->getArg(0), in VisitCallExpr()
14453 if (!EvaluateFloat(E->getArg(0), Result, Info)) in VisitCallExpr()
14461 return EvaluateFloat(E->getArg(0), Result, Info); in VisitCallExpr()
14472 if (!EvaluateFloat(E->getArg(0), Result, Info) || in VisitCallExpr()
14473 !EvaluateFloat(E->getArg(1), RHS, Info)) in VisitCallExpr()
14486 if (!EvaluateFloat(E->getArg(0), Result, Info) || in VisitCallExpr()
14487 !EvaluateFloat(E->getArg(1), RHS, Info)) in VisitCallExpr()
14504 if (!EvaluateFloat(E->getArg(0), Result, Info) || in VisitCallExpr()
14505 !EvaluateFloat(E->getArg(1), RHS, Info)) in VisitCallExpr()
14520 if (!EvaluateComplex(E->getSubExpr(), CV, Info)) in VisitUnaryReal()
14532 if (!EvaluateComplex(E->getSubExpr(), CV, Info)) in VisitUnaryImag()
14539 const llvm::fltSemantics &Sem = Info.Ctx.getFloatTypeSemantics(E->getType()); in VisitUnaryImag()
14548 return EvaluateFloat(E->getSubExpr(), Result, Info); in VisitUnaryOperator()
14553 if (!EvaluateFloat(E->getSubExpr(), Result, Info)) in VisitUnaryOperator()
14565 bool LHSOK = EvaluateFloat(E->getLHS(), Result, Info); in VisitBinaryOperator()
14566 if (!LHSOK && !Info.noteFailure()) in VisitBinaryOperator()
14568 return EvaluateFloat(E->getRHS(), RHS, Info) && LHSOK && in VisitBinaryOperator()
14569 handleFloatFloatBinOp(Info, E, Result, E->getOpcode(), RHS); in VisitBinaryOperator()
14587 Info.Ctx.getLangOpts()); in VisitCastExpr()
14588 return EvaluateInteger(SubExpr, IntResult, Info) && in VisitCastExpr()
14589 HandleIntToFloatCast(Info, E, FPO, SubExpr->getType(), in VisitCastExpr()
14594 APFixedPoint FixResult(Info.Ctx.getFixedPointSemantics(SubExpr->getType())); in VisitCastExpr()
14595 if (!EvaluateFixedPoint(SubExpr, FixResult, Info)) in VisitCastExpr()
14598 FixResult.convertToFloat(Info.Ctx.getFloatTypeSemantics(E->getType())); in VisitCastExpr()
14605 return HandleFloatToFloatCast(Info, E, SubExpr->getType(), E->getType(), in VisitCastExpr()
14611 if (!EvaluateComplex(SubExpr, V, Info)) in VisitCastExpr()
14653 EvalInfo &Info) { in EvaluateComplex() argument
14656 return ComplexExprEvaluator(Info, Result).Visit(E); in EvaluateComplex()
14663 APFloat Zero = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(ElemTy)); in ZeroInitialization()
14668 APSInt Zero = Info.Ctx.MakeIntValue(0, ElemTy); in ZeroInitialization()
14681 if (!EvaluateFloat(SubExpr, Imag, Info)) in VisitImaginaryLiteral()
14692 if (!EvaluateInteger(SubExpr, Imag, Info)) in VisitImaginaryLiteral()
14770 if (!EvaluateFloat(E->getSubExpr(), Real, Info)) in VisitCastExpr()
14786 return HandleFloatToFloatCast(Info, E, From, To, Result.FloatReal) && in VisitCastExpr()
14787 HandleFloatToFloatCast(Info, E, From, To, Result.FloatImag); in VisitCastExpr()
14798 return HandleFloatToIntCast(Info, E, From, Result.FloatReal, in VisitCastExpr()
14800 HandleFloatToIntCast(Info, E, From, Result.FloatImag, in VisitCastExpr()
14806 if (!EvaluateInteger(E->getSubExpr(), Real, Info)) in VisitCastExpr()
14822 Result.IntReal = HandleIntToIntCast(Info, E, To, From, Result.IntReal); in VisitCastExpr()
14823 Result.IntImag = HandleIntToIntCast(Info, E, To, From, Result.IntImag); in VisitCastExpr()
14832 Info.Ctx.getLangOpts()); in VisitCastExpr()
14837 return HandleIntToFloatCast(Info, E, FPO, From, Result.IntReal, in VisitCastExpr()
14839 HandleIntToFloatCast(Info, E, FPO, From, Result.IntImag, in VisitCastExpr()
14859 LHSOK = EvaluateFloat(E->getLHS(), Real, Info); in VisitBinaryOperator()
14867 if (!LHSOK && !Info.noteFailure()) in VisitBinaryOperator()
14874 if (!EvaluateFloat(E->getRHS(), Real, Info) || !LHSOK) in VisitBinaryOperator()
14878 } else if (!EvaluateComplex(E->getRHS(), RHS, Info) || !LHSOK) in VisitBinaryOperator()
15107 if (!EvaluateFloat(E->getInit(0), Result.FloatReal, Info)) in VisitInitListExpr()
15109 if (!EvaluateFloat(E->getInit(1), Result.FloatImag, Info)) in VisitInitListExpr()
15113 if (!EvaluateInteger(E->getInit(0), Result.IntReal, Info)) in VisitInitListExpr()
15115 if (!EvaluateInteger(E->getInit(1), Result.IntImag, Info)) in VisitInitListExpr()
15130 if (!EvaluateFloat(E->getArg(0), Result.FloatReal, Info)) in VisitCallExpr()
15132 if (!EvaluateFloat(E->getArg(1), Result.FloatImag, Info)) in VisitCallExpr()
15152 AtomicExprEvaluator(EvalInfo &Info, const LValue *This, APValue &Result) in AtomicExprEvaluator() argument
15153 : ExprEvaluatorBaseTy(Info), This(This), Result(Result) {} in AtomicExprEvaluator()
15165 return This ? EvaluateInPlace(Result, Info, *This, &VIE) in ZeroInitialization()
15166 : Evaluate(Result, Info, &VIE); in ZeroInitialization()
15177 return This ? EvaluateInPlace(Result, Info, *This, E->getSubExpr()) in VisitCastExpr()
15178 : Evaluate(Result, Info, E->getSubExpr()); in VisitCastExpr()
15185 EvalInfo &Info) { in EvaluateAtomic() argument
15188 return AtomicExprEvaluator(Info, This, Result).Visit(E); in EvaluateAtomic()
15200 VoidExprEvaluator(EvalInfo &Info) : ExprEvaluatorBaseTy(Info) {} in VoidExprEvaluator() argument
15227 return HandleOperatorDeleteCall(Info, E); in VisitCallExpr()
15240 if (Info.SpeculativeEvaluationDepth) in VisitCXXDeleteExpr()
15245 Info.FFDiag(E, diag::note_constexpr_new_non_replaceable) in VisitCXXDeleteExpr()
15253 if (!EvaluatePointer(Arg, Pointer, Info)) in VisitCXXDeleteExpr()
15263 if (!Info.getLangOpts().CPlusPlus20) in VisitCXXDeleteExpr()
15264 Info.CCEDiag(E, diag::note_constexpr_new); in VisitCXXDeleteExpr()
15269 Info, E, Pointer, E->isArrayForm() ? DynAlloc::ArrayNew : DynAlloc::New); in VisitCXXDeleteExpr()
15278 Info.FFDiag(E, diag::note_constexpr_delete_base_nonvirt_dtor) in VisitCXXDeleteExpr()
15289 Info.FFDiag(E, diag::note_constexpr_new_non_replaceable) in VisitCXXDeleteExpr()
15295 if (!HandleDestruction(Info, E->getExprLoc(), Pointer.getLValueBase(), in VisitCXXDeleteExpr()
15299 if (!Info.HeapAllocs.erase(Pointer.Base.dyn_cast<DynamicAllocLValue>())) { in VisitCXXDeleteExpr()
15304 Info.FFDiag(E, diag::note_constexpr_double_delete); in VisitCXXDeleteExpr()
15311 static bool EvaluateVoid(const Expr *E, EvalInfo &Info) { in EvaluateVoid() argument
15314 return VoidExprEvaluator(Info).Visit(E); in EvaluateVoid()
15321 static bool Evaluate(APValue &Result, EvalInfo &Info, const Expr *E) { in Evaluate() argument
15328 if (!EvaluateLValue(E, LV, Info)) in Evaluate()
15332 if (!EvaluateVector(E, Result, Info)) in Evaluate()
15335 if (!IntExprEvaluator(Info, Result).Visit(E)) in Evaluate()
15339 if (!EvaluatePointer(E, LV, Info)) in Evaluate()
15344 if (!EvaluateFloat(E, F, Info)) in Evaluate()
15349 if (!EvaluateComplex(E, C, Info)) in Evaluate()
15353 if (!FixedPointExprEvaluator(Info, Result).Visit(E)) return false; in Evaluate()
15356 if (!EvaluateMemberPointer(E, P, Info)) in Evaluate()
15363 Info.CurrentCall->createTemporary(E, T, ScopeKind::FullExpression, LV); in Evaluate()
15364 if (!EvaluateArray(E, LV, Value, Info)) in Evaluate()
15370 Info.CurrentCall->createTemporary(E, T, ScopeKind::FullExpression, LV); in Evaluate()
15371 if (!EvaluateRecord(E, LV, Value, Info)) in Evaluate()
15375 if (!Info.getLangOpts().CPlusPlus11) in Evaluate()
15376 Info.CCEDiag(E, diag::note_constexpr_nonliteral) in Evaluate()
15378 if (!EvaluateVoid(E, Info)) in Evaluate()
15384 APValue &Value = Info.CurrentCall->createTemporary( in Evaluate()
15386 if (!EvaluateAtomic(E, &LV, Value, Info)) in Evaluate()
15390 if (!EvaluateAtomic(E, nullptr, Result, Info)) in Evaluate()
15393 } else if (Info.getLangOpts().CPlusPlus11) { in Evaluate()
15394 Info.FFDiag(E, diag::note_constexpr_nonliteral) << E->getType(); in Evaluate()
15397 Info.FFDiag(E, diag::note_invalid_subexpr_in_const_expr); in Evaluate()
15407 static bool EvaluateInPlace(APValue &Result, EvalInfo &Info, const LValue &This, in EvaluateInPlace() argument
15411 if (!AllowNonLiteralTypes && !CheckLiteralType(Info, E, &This)) in EvaluateInPlace()
15419 return EvaluateArray(E, This, Result, Info); in EvaluateInPlace()
15421 return EvaluateRecord(E, This, Result, Info); in EvaluateInPlace()
15425 return EvaluateAtomic(E, &This, Result, Info); in EvaluateInPlace()
15430 return Evaluate(Result, Info, E); in EvaluateInPlace()
15435 static bool EvaluateAsRValue(EvalInfo &Info, const Expr *E, APValue &Result) { in EvaluateAsRValue() argument
15441 if (!CheckLiteralType(Info, E)) in EvaluateAsRValue()
15444 if (Info.EnableNewConstInterp) { in EvaluateAsRValue()
15445 if (!Info.Ctx.getInterpContext().evaluateAsRValue(Info, E, Result)) in EvaluateAsRValue()
15447 return CheckConstantExpression(Info, E->getExprLoc(), E->getType(), Result, in EvaluateAsRValue()
15451 if (!::Evaluate(Result, Info, E)) in EvaluateAsRValue()
15457 LV.setFrom(Info.Ctx, Result); in EvaluateAsRValue()
15458 if (!handleLValueToRValueConversion(Info, E, E->getType(), LV, Result)) in EvaluateAsRValue()
15463 return CheckConstantExpression(Info, E->getExprLoc(), E->getType(), Result, in EvaluateAsRValue()
15465 CheckMemoryLeaks(Info); in EvaluateAsRValue()
15513 const ASTContext &Ctx, EvalInfo &Info) { in EvaluateAsRValue() argument
15519 return EvaluateAsRValue(Info, E, Result.Val); in EvaluateAsRValue()
15525 EvalInfo &Info) { in EvaluateAsInt() argument
15530 if (!::EvaluateAsRValue(E, ExprResult, Ctx, Info) || in EvaluateAsInt()
15541 EvalInfo &Info) { in EvaluateAsFixedPoint() argument
15546 if (!::EvaluateAsRValue(E, ExprResult, Ctx, Info)) in EvaluateAsFixedPoint()
15566 EvalInfo Info(Ctx, Result, EvalInfo::EM_IgnoreSideEffects); in EvaluateAsRValue() local
15567 Info.InConstantContext = InConstantContext; in EvaluateAsRValue()
15568 return ::EvaluateAsRValue(this, Result, Ctx, Info); in EvaluateAsRValue()
15587 EvalInfo Info(Ctx, Result, EvalInfo::EM_IgnoreSideEffects); in EvaluateAsInt() local
15588 Info.InConstantContext = InConstantContext; in EvaluateAsInt()
15589 return ::EvaluateAsInt(this, Result, Ctx, AllowSideEffects, Info); in EvaluateAsInt()
15598 EvalInfo Info(Ctx, Result, EvalInfo::EM_IgnoreSideEffects); in EvaluateAsFixedPoint() local
15599 Info.InConstantContext = InConstantContext; in EvaluateAsFixedPoint()
15600 return ::EvaluateAsFixedPoint(this, Result, Ctx, AllowSideEffects, Info); in EvaluateAsFixedPoint()
15629 EvalInfo Info(Ctx, Result, EvalInfo::EM_ConstantFold); in EvaluateAsLValue() local
15630 Info.InConstantContext = InConstantContext; in EvaluateAsLValue()
15633 if (!EvaluateLValue(this, LV, Info) || !Info.discardCleanups() || in EvaluateAsLValue()
15635 !CheckLValueConstantExpression(Info, getExprLoc(), in EvaluateAsLValue()
15648 EvalInfo Info(Ctx, EStatus, in EvaluateDestruction() local
15651 Info.setEvaluatingDecl(Base, DestroyedValue, in EvaluateDestruction()
15653 Info.InConstantContext = IsConstantDestruction; in EvaluateDestruction()
15658 if (!HandleDestruction(Info, Loc, Base, DestroyedValue, Type) || in EvaluateDestruction()
15662 if (!Info.discardCleanups()) in EvaluateDestruction()
15678 EvalInfo Info(Ctx, Result, EM); in EvaluateAsConstantExpr() local
15679 Info.InConstantContext = true; in EvaluateAsConstantExpr()
15681 if (Info.EnableNewConstInterp) { in EvaluateAsConstantExpr()
15682 if (!Info.Ctx.getInterpContext().evaluate(Info, this, Result.Val)) in EvaluateAsConstantExpr()
15684 return CheckConstantExpression(Info, getExprLoc(), in EvaluateAsConstantExpr()
15698 Info.setEvaluatingDecl(Base, Result.Val); in EvaluateAsConstantExpr()
15700 if (Info.EnableNewConstInterp) { in EvaluateAsConstantExpr()
15701 if (!Info.Ctx.getInterpContext().evaluateAsRValue(Info, this, Result.Val)) in EvaluateAsConstantExpr()
15710 FullExpressionRAII Scope(Info); in EvaluateAsConstantExpr()
15711 if (!::EvaluateInPlace(Result.Val, Info, LVal, this) || in EvaluateAsConstantExpr()
15715 if (!Info.discardCleanups()) in EvaluateAsConstantExpr()
15719 if (!CheckConstantExpression(Info, getExprLoc(), getStorageType(Ctx, this), in EvaluateAsConstantExpr()
15722 if (!CheckMemoryLeaks(Info)) in EvaluateAsConstantExpr()
15756 EvalInfo Info(Ctx, EStatus, in EvaluateAsInitializer() local
15760 Info.setEvaluatingDecl(VD, Value); in EvaluateAsInitializer()
15761 Info.InConstantContext = IsConstantInitialization; in EvaluateAsInitializer()
15766 if (Info.EnableNewConstInterp) { in EvaluateAsInitializer()
15768 if (!InterpCtx.evaluateAsInitializer(Info, VD, Value)) in EvaluateAsInitializer()
15771 return CheckConstantExpression(Info, DeclLoc, DeclTy, Value, in EvaluateAsInitializer()
15787 FullExpressionRAII Scope(Info); in EvaluateAsInitializer()
15788 if (!EvaluateInPlace(Value, Info, LVal, this, in EvaluateAsInitializer()
15796 Info.performLifetimeExtension(); in EvaluateAsInitializer()
15798 if (!Info.discardCleanups()) in EvaluateAsInitializer()
15802 return CheckConstantExpression(Info, DeclLoc, DeclTy, Value, in EvaluateAsInitializer()
15804 CheckMemoryLeaks(Info); in EvaluateAsInitializer()
15854 EvalInfo Info(Ctx, EVResult, EvalInfo::EM_IgnoreSideEffects); in EvaluateKnownConstInt() local
15855 Info.InConstantContext = true; in EvaluateKnownConstInt()
15857 bool Result = ::EvaluateAsRValue(this, EVResult, Ctx, Info); in EvaluateKnownConstInt()
15873 EvalInfo Info(Ctx, EVResult, EvalInfo::EM_IgnoreSideEffects); in EvaluateKnownConstIntCheckOverflow() local
15874 Info.InConstantContext = true; in EvaluateKnownConstIntCheckOverflow()
15875 Info.CheckingForUndefinedBehavior = true; in EvaluateKnownConstIntCheckOverflow()
15877 bool Result = ::EvaluateAsRValue(Info, this, EVResult.Val); in EvaluateKnownConstIntCheckOverflow()
15893 EvalInfo Info(Ctx, EVResult, EvalInfo::EM_IgnoreSideEffects); in EvaluateForOverflow() local
15894 Info.CheckingForUndefinedBehavior = true; in EvaluateForOverflow()
15895 (void)::EvaluateAsRValue(Info, this, EVResult.Val); in EvaluateForOverflow()
15948 EvalInfo Info(Ctx, Status, EvalInfo::EM_ConstantExpression); in CheckEvalInICE() local
15950 Info.InConstantContext = true; in CheckEvalInICE()
15951 if (!::EvaluateAsRValue(E, EVResult, Ctx, Info) || EVResult.HasSideEffects || in CheckEvalInICE()
16419 EvalInfo Info(Ctx, Status, EvalInfo::EM_IgnoreSideEffects); in getIntegerConstantExpr() local
16420 Info.InConstantContext = true; in getIntegerConstantExpr()
16422 if (!::EvaluateAsInt(this, ExprResult, Ctx, SE_AllowSideEffects, Info)) in getIntegerConstantExpr()
16448 EvalInfo Info(Ctx, Status, EvalInfo::EM_ConstantExpression); in isCXX11ConstantExpr() local
16452 ::EvaluateAsRValue(Info, this, Result ? *Result : Scratch) && in isCXX11ConstantExpr()
16455 Info.discardCleanups() && !Status.HasSideEffects; in isCXX11ConstantExpr()
16484 EvalInfo Info(Ctx, Status, EvalInfo::EM_ConstantExpressionUnevaluated); in EvaluateWithSubstitution() local
16485 Info.InConstantContext = true; in EvaluateWithSubstitution()
16497 EvaluateObjectArgument(Info, This, ThisVal) && in EvaluateWithSubstitution()
16498 !Info.EvalStatus.HasSideEffects) in EvaluateWithSubstitution()
16503 Info.EvalStatus.HasSideEffects = false; in EvaluateWithSubstitution()
16506 CallRef Call = Info.CurrentCall->createCall(Callee); in EvaluateWithSubstitution()
16514 !EvaluateCallArg(PVD, *I, Call, Info) || in EvaluateWithSubstitution()
16515 Info.EvalStatus.HasSideEffects) { in EvaluateWithSubstitution()
16517 if (APValue *Slot = Info.getParamSlot(Call, PVD)) in EvaluateWithSubstitution()
16523 Info.EvalStatus.HasSideEffects = false; in EvaluateWithSubstitution()
16528 Info.discardCleanups(); in EvaluateWithSubstitution()
16529 Info.EvalStatus.HasSideEffects = false; in EvaluateWithSubstitution()
16532 CallStackFrame Frame(Info, Callee->getLocation(), Callee, ThisPtr, This, in EvaluateWithSubstitution()
16535 FullExpressionRAII Scope(Info); in EvaluateWithSubstitution()
16536 return Evaluate(Value, Info, this) && Scope.destroy() && in EvaluateWithSubstitution()
16537 !Info.EvalStatus.HasSideEffects; in EvaluateWithSubstitution()
16560 EvalInfo Info(FD->getASTContext(), Status, EvalInfo::EM_ConstantExpression); in isPotentialConstantExpr() local
16561 Info.InConstantContext = true; in isPotentialConstantExpr()
16562 Info.CheckingPotentialConstantExpression = true; in isPotentialConstantExpr()
16565 if (Info.EnableNewConstInterp) { in isPotentialConstantExpr()
16566 Info.Ctx.getInterpContext().isPotentialConstantExpr(Info, FD); in isPotentialConstantExpr()
16576 ImplicitValueInitExpr VIE(RD ? Info.Ctx.getRecordType(RD) : Info.Ctx.IntTy); in isPotentialConstantExpr()
16577 This.set({&VIE, Info.CurrentCall->Index}); in isPotentialConstantExpr()
16585 Info.setEvaluatingDecl(This.getLValueBase(), Scratch); in isPotentialConstantExpr()
16586 HandleConstructorCall(&VIE, This, Args, CD, Info, Scratch); in isPotentialConstantExpr()
16591 &VIE, Args, CallRef(), FD->getBody(), Info, Scratch, in isPotentialConstantExpr()
16608 EvalInfo Info(FD->getASTContext(), Status, in isPotentialConstantExprUnevaluated() local
16610 Info.InConstantContext = true; in isPotentialConstantExprUnevaluated()
16611 Info.CheckingPotentialConstantExpression = true; in isPotentialConstantExprUnevaluated()
16614 CallStackFrame Frame(Info, SourceLocation(), FD, /*This=*/nullptr, in isPotentialConstantExprUnevaluated()
16618 Evaluate(ResultScratch, Info, E); in isPotentialConstantExprUnevaluated()
16628 EvalInfo Info(Ctx, Status, EvalInfo::EM_ConstantFold); in tryEvaluateObjectSize() local
16629 return tryEvaluateBuiltinObjectSize(this, Type, Info, Result); in tryEvaluateObjectSize()
16633 EvalInfo &Info) { in EvaluateBuiltinStrLen() argument
16639 if (!EvaluatePointer(E, String, Info)) in EvaluateBuiltinStrLen()
16652 Info.Ctx.hasSameUnqualifiedType(CharTy, Info.Ctx.CharTy)) { in EvaluateBuiltinStrLen()
16669 if (!handleLValueToRValueConversion(Info, E, CharTy, String, Char) || in EvaluateBuiltinStrLen()
16676 if (!HandleLValueArrayAdjustment(Info, E, String, CharTy, 1)) in EvaluateBuiltinStrLen()
16686 EvalInfo Info(Ctx, Status, EvalInfo::EM_ConstantExpression); in EvaluateCharRangeAsString() local
16687 Info.InConstantContext = true; in EvaluateCharRangeAsString()
16689 FullExpressionRAII Scope(Info); in EvaluateCharRangeAsString()
16691 if (!::EvaluateInteger(SizeExpression, SizeValue, Info)) in EvaluateCharRangeAsString()
16696 if (!::EvaluatePointer(PtrExpression, String, Info)) in EvaluateCharRangeAsString()
16702 if (!handleLValueToRValueConversion(Info, PtrExpression, CharTy, String, in EvaluateCharRangeAsString()
16708 if (!HandleLValueArrayAdjustment(Info, PtrExpression, String, CharTy, 1)) in EvaluateCharRangeAsString()
16714 if (!CheckMemoryLeaks(Info)) in EvaluateCharRangeAsString()
16722 EvalInfo Info(Ctx, Status, EvalInfo::EM_ConstantFold); in tryEvaluateStrLen() local
16723 return EvaluateBuiltinStrLen(this, Result, Info); in tryEvaluateStrLen()