This is more useful for debug/test than getNullabilitySpelling:
- default form has uglifying underscores
- non-default form crashes on NullableResult
- both return unhelpfully verbose strings for Unspecified
- operator<< works with gtest, formatv, etc
Differential D149650
Give NullabilityKind a printing operator<< sammccall on May 2 2023, 7:22 AM. Authored by
Details This is more useful for debug/test than getNullabilitySpelling:
Diff Detail
Event Timeline
Comment Actions I guess I'm not seeing much motivation for this change. We already have clang::getNullabilitySpelling() and const StreamingDiagnostic &clang::operator<<(const StreamingDiagnostic &DB, DiagNullabilityKind nullability) and now we're adding a third way to get this information. If this is just for debug/testing purposes, can we use existing debug formatters to convert the enumeration value into the enumerator name instead? Comment Actions We're using NullabilityKind in our dataflow-based null-safety clang-tidy check that we hope to upstream when it works. It would be convenient if e.g. EXPECT_THAT(someVectorOfNK, ElementsAre(Nullable, Unspecified)) printed something useful when it fails, if we could write OS << NK and get Unspecified rather than OS << getSpelling(NK) and get _Unspecified_Nullability, etc.
This actually wants the user-visible spelling, so I think it can just use getSpelling... if I make that change we're back to just two implementations :-) Comment Actions Make diagnostic-printing use the (other) existing function, come out neutral! (This adds quotes to some diagnostic, but their omission seems to be an error) Comment Actions Ah, good to know! I think it would be reasonable to add this functionality once there's some agreement on adding the clang-tidy check.
Hmmm, but does this need to be added to Specifiers.h instead of being kept packaged up with clang-tidy? For things like AST matchers, we usually ask that the matcher remain local to the clang-tidy check unless the same matcher is needed in multiple checks. This feels somewhat similar, despite it not being related to AST matching -- if the only need for this functionality exists out of the clang tree, can we keep it out of the clang tree until we find more needs?
Oh, I really like those changes! Feel free to land that as an NFC change if you'd like (the addition of quotes is a bug fix, but not really a functional change). Comment Actions This can't be added downstream, the type needs to provide these. There's never going to be a hard need for this - having an ergonomic way to print things that composes with the rest of our infra is useful but it's always possible to live without it. [1] (or llvm, or ::, or ::testing - these all have the same issues).
Thanks - will do! Comment Actions Oh shoot, you're right. I hadn't thought about the fact that this is an ADL extension point specifically.
I think you've convinced me this is reasonable to keep upstream despite not really being used in tree (yet). If it turns out that the clang-tidy check doesn't get upstreamed, we can remove this easily enough in the future if needed. I don't think we want to expose this sort of thing as a matter of course, but when the alternatives are significantly more dangerous, it is reasonable. If we find we're adding more clang-as a-library features upstream like this, we might want to revisit whether there's a better design approach for these needs. LG! Comment Actions Thanks Aaron! The check is not going to be ready for upstreaming really soon - plenty of thorny issues to work out first, and checking in a half-working version would do more harm than good. Comment Actions This is breaking some of our tests. I will give the author a reproducible test case. I am going to revert this while waiting for a fix. |
IdentifierTable.cpp is a weird place to implement this function (I put it next to getNullabilitySpelling).
Happy to move to a different file, or add a new file, if you think either is significantly better.
Similarly, happy to add a test for this if it's worth having a unittest with only this (obviously nothing else in Specifiers is tested)