[PATCH] D155610: [Clang][ExprConstant] Print integer instead of character on static assertion failure
Takuya Shimizu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Aug 2 06:08:39 PDT 2023
hazohelet added a comment.
In D155610#4550346 <https://reviews.llvm.org/D155610#4550346>, @cor3ntin wrote:
> I've been thinking about it and I think I have a cleaner design for the printing of characters:
>
> We need a `CharToString(unsigned, Qualtype) -> SmallString` method that takes a value and the type.
> for `char` and `char8_t` we can just return the value.
> For `wchar_t`, `char32_t` and `char16_t`, we can use something like `ConvertCodePointToUTF8` to convert to UTF-8. If that fails we can escape with `\x`
> If we pass the result of that to the diagnostic engine, escaping of non printing character would happen automatically.
>
> That way we have a nice separation between converting an APValue to string and printing it, which should avoid code duplication quite a bit, and generally make the design nicer.
> Then maybe we need to consider whether we want to modify `CharacterLiteral::print` to be aligned with all of that. I don;t know if that's used, for example, for mangling.
>
> Given there are a bunch of different issues here, i would not mind separate PRs - having the numerical value showed in paren seems valuable on its own.
Thanks for the suggestion. Printing of multibyte character is a bit out of the scope of the original goal of this patch, but I'll give it a try.
================
Comment at: clang/lib/Basic/Diagnostic.cpp:838-858
+ if (UseUCN)
+ OutStream << "\\u"
+ << llvm::format_hex_no_prefix(CodepointValue, /*Width=*/4,
+ /*Upper=*/false);
+ else
+ OutStream << "<U+"
+ << llvm::format_hex_no_prefix(CodepointValue, /*Width=*/4,
----------------
cor3ntin wrote:
> hazohelet wrote:
> > cor3ntin wrote:
> > > The use UCN addition is probably not justified. we should consistent in how we print the value of non-printable code points.
> > My motivation here is to print a valid character literal. I think it justifies this change somewhat. I'd like to see what others think about this.
> Why? there is no expectation that diagnostics messages reproduce C++. Consistency between string literals and characters literals is a lot more important
The diagnostic meesage here looks like `expression evaluates to 'VALUE1 == VALUE2'`
I tend to expect that `VALUE1 == VALUE2` is a syntactically valid expression because of the syntactical element `==`. But if others do not feel the same way, I am okay with something like `'<U+0001>' == '<U+0002>'`
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D155610/new/
https://reviews.llvm.org/D155610
More information about the cfe-commits
mailing list