[PATCH] D115031: [AST] Print NTTP args as string-literals when possible

Richard Smith - zygoloid via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Dec 3 14:23:01 PST 2021


rsmith added inline comments.


================
Comment at: clang/lib/AST/APValue.cpp:628-629
 
+static bool TryPrintAsStringLiteral(raw_ostream &Out, const ArrayType *ATy,
+                                    const APValue *Data, size_t Size) {
+  if (Size == 0)
----------------
Is there anything you can factor out of `StringLiteral::outputString` and reuse here? At least the single-character printing code seems like something we should try to not overly duplicate.


================
Comment at: clang/lib/AST/APValue.cpp:637-639
+  // Nothing we can do about a sequence that is not null-terminated
+  if (!Data[--Size].getInt().isZero())
+    return false;
----------------
We should drop all trailing zeroes here, because array initialization from a string literal will reconstruct them.


================
Comment at: clang/lib/AST/APValue.cpp:641-643
+  constexpr size_t MaxN = 36;
+  char Buf[MaxN * 2 + 3] = {'"'}; // "At most 36 escaped chars" + \0
+  auto *pBuf = Buf + 1;
----------------
Prefer `llvm::SmallString<N>` and `push_back`.


================
Comment at: clang/lib/AST/APValue.cpp:645
+
+  // Better than printing a two-digit sequence of 10 integers.
+  StringRef Ellipsis;
----------------
...except that some callers want output that uniquely identifies the template argument, and moreover some callers want output that is valid C++ code that produces the same template-id.

It'd be better to do this behind a `PrintingPolicy` flag that the diagnostics engine sets. But we'd want to turn that flag off during template type diffing.


================
Comment at: clang/lib/AST/APValue.cpp:902
         if (I == 10) {
           // Avoid printing out the entire contents of large arrays.
+          Out << "...}";
----------------
(The existing code is also doing elision here that will be inappropriate for some callers. If you add a `PrintingPolicy` to unambiguously print template arguments, it should disable this check too.)


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D115031/new/

https://reviews.llvm.org/D115031



More information about the cfe-commits mailing list