================
@@ -17693,6 +17693,44 @@ void Sema::DiagnoseStaticAssertDetails(const Expr *E) {
}
}
+template <typename ResultType>
+static bool EvaluateAsNullTerminatedCharBuffer(
+ Sema &SemaRef, Expr *Message, ResultType &Result, ASTContext &Ctx,
+ Sema::StringEvaluationContext EvalContext, bool ErrorOnInvalidMessage) {
+ SourceLocation Loc = Message->getBeginLoc();
+ QualType SizeT = Ctx.getSizeType();
+ QualType ConstCharPtr = Ctx.getPointerType(Ctx.getConstType(Ctx.CharTy));
+ Expr::EvalResult Status;
+ SmallVector<PartialDiagnosticAt, 8> Notes;
+ Status.Diag = &Notes;
+
+ auto DiagnoseInvalidConstantString = [&]() {
+ SemaRef.Diag(Loc, diag::err_user_defined_msg_not_null_terminated_string)
+ << EvalContext;
+ for (const auto &Note : Notes)
+ SemaRef.Diag(Note.first, Note.second);
+ return !ErrorOnInvalidMessage;
+ };
+ ExprResult EvaluatedData = SemaRef.BuildConvertedConstantExpression(
+ Message, ConstCharPtr, CCEKind::StaticAssertNullTerminatedString);
+ if (EvaluatedData.isInvalid())
+ return DiagnoseInvalidConstantString();
+
+ uint64_t Length = 0;
+ if (!EvaluatedData.get()->tryEvaluateStrLen(Length, Ctx))
+ return DiagnoseInvalidConstantString();
+
+ llvm::APInt SizeVal(Ctx.getIntWidth(SizeT), Length);
+ Expr *SizeExpr = IntegerLiteral::Create(Ctx, SizeVal, SizeT, Loc);
+
+ bool EvalResult = Message->EvaluateCharRangeAsString(
+ Result, SizeExpr, EvaluatedData.get(), Ctx, Status);
+ if (!EvalResult || !Notes.empty())
+ return DiagnoseInvalidConstantString();
+ SemaRef.Diag(Loc, diag::ext_consteval_string_constants);
+ return true;
----------------
cor3ntin wrote:
Oh, you put that here! I would put it in the caller
https://github.com/llvm/llvm-project/pull/173140
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits