================ @@ -17928,43 +17928,70 @@ std::optional<std::string> Expr::tryEvaluateString(ASTContext &Ctx) const { return {}; } -bool Expr::EvaluateCharRangeAsString(std::string &Result, - const Expr *SizeExpression, - const Expr *PtrExpression, ASTContext &Ctx, - EvalResult &Status) const { - LValue String; - EvalInfo Info(Ctx, Status, EvalInfo::EM_ConstantExpression); - Info.InConstantContext = true; +template <typename T> +static bool EvaluateCharRangeAsStringImpl(const Expr*, T& Result, + const Expr *SizeExpression, + const Expr *PtrExpression, ASTContext &Ctx, + Expr::EvalResult &Status) { + LValue String; + EvalInfo Info(Ctx, Status, EvalInfo::EM_ConstantExpression); + Info.InConstantContext = true; - FullExpressionRAII Scope(Info); - APSInt SizeValue; - if (!::EvaluateInteger(SizeExpression, SizeValue, Info)) - return false; + FullExpressionRAII Scope(Info); + APSInt SizeValue; + if (!::EvaluateInteger(SizeExpression, SizeValue, Info)) + return false; - uint64_t Size = SizeValue.getZExtValue(); + uint64_t Size = SizeValue.getZExtValue(); - if (!::EvaluatePointer(PtrExpression, String, Info)) - return false; + if constexpr(std::is_same_v<APValue, T>) + Result = APValue(APValue::UninitArray{}, Size, Size); + //else + // Result.reserve(Size); - QualType CharTy = PtrExpression->getType()->getPointeeType(); - for (uint64_t I = 0; I < Size; ++I) { - APValue Char; - if (!handleLValueToRValueConversion(Info, PtrExpression, CharTy, String, - Char)) + if (!::EvaluatePointer(PtrExpression, String, Info)) + return false; + + QualType CharTy = PtrExpression->getType()->getPointeeType(); + for (uint64_t I = 0; I < Size; ++I) { + APValue Char; + if (!handleLValueToRValueConversion(Info, PtrExpression, CharTy, String, + Char)) + return false; + + if constexpr(std::is_same_v<APValue, T>) { + Result.getArrayInitializedElt(I) = std::move(Char); + } + else { + APSInt C = Char.getInt(); + Result.push_back(static_cast<char>(C.getExtValue())); + } + + if (!HandleLValueArrayAdjustment(Info, PtrExpression, String, CharTy, 1)) + return false; + } + if (!Scope.destroy()) return false; - APSInt C = Char.getInt(); - Result.push_back(static_cast<char>(C.getExtValue())); - if (!HandleLValueArrayAdjustment(Info, PtrExpression, String, CharTy, 1)) + if (!CheckMemoryLeaks(Info)) ---------------- erichkeane wrote:
This looks like a `if (!X) return false; return true;` here :) https://github.com/llvm/llvm-project/pull/131003 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits