================
@@ -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

Reply via email to