diff options
author | Sam McCall <sam.mccall@gmail.com> | 2023-05-02 16:22:40 +0200 |
---|---|---|
committer | Sam McCall <sam.mccall@gmail.com> | 2023-05-04 23:24:51 +0200 |
commit | 0a532207b8696d81e46017f444bd2257347f129b (patch) | |
tree | 3270ae52950c68c2ce55266f3170de31a3aa01df | |
parent | f031fc35716cd48c7b1eb32604dbba45d99c5fef (diff) | |
download | llvm-0a532207b8696d81e46017f444bd2257347f129b.zip llvm-0a532207b8696d81e46017f444bd2257347f129b.tar.gz llvm-0a532207b8696d81e46017f444bd2257347f129b.tar.bz2 |
Give NullabilityKind a printing operator<<
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 Revision: https://reviews.llvm.org/D149650
-rw-r--r-- | clang/include/clang/Basic/Specifiers.h | 5 | ||||
-rw-r--r-- | clang/lib/Basic/Diagnostic.cpp | 28 | ||||
-rw-r--r-- | clang/lib/Basic/IdentifierTable.cpp | 14 | ||||
-rw-r--r-- | clang/test/SemaObjC/nullable-result.m | 6 |
4 files changed, 28 insertions, 25 deletions
diff --git a/clang/include/clang/Basic/Specifiers.h b/clang/include/clang/Basic/Specifiers.h index a8c35fe..06279a0 100644 --- a/clang/include/clang/Basic/Specifiers.h +++ b/clang/include/clang/Basic/Specifiers.h @@ -19,6 +19,9 @@ #include "llvm/Support/DataTypes.h" #include "llvm/Support/ErrorHandling.h" +namespace llvm { +class raw_ostream; +} // namespace llvm namespace clang { /// Define the meaning of possible values of the kind in ExplicitSpecifier. @@ -333,6 +336,8 @@ namespace clang { // parameters are assumed to only get null on error. NullableResult, }; + /// Prints human-readable debug representation. + llvm::raw_ostream &operator<<(llvm::raw_ostream&, NullabilityKind); /// Return true if \p L has a weaker nullability annotation than \p R. The /// ordering is: Unspecified < Nullable < NonNull. diff --git a/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp index 3474acbc..b2106b0 100644 --- a/clang/lib/Basic/Diagnostic.cpp +++ b/clang/lib/Basic/Diagnostic.cpp @@ -43,28 +43,12 @@ using namespace clang; const StreamingDiagnostic &clang::operator<<(const StreamingDiagnostic &DB, DiagNullabilityKind nullability) { - StringRef string; - switch (nullability.first) { - case NullabilityKind::NonNull: - string = nullability.second ? "'nonnull'" : "'_Nonnull'"; - break; - - case NullabilityKind::Nullable: - string = nullability.second ? "'nullable'" : "'_Nullable'"; - break; - - case NullabilityKind::Unspecified: - string = nullability.second ? "'null_unspecified'" : "'_Null_unspecified'"; - break; - - case NullabilityKind::NullableResult: - assert(!nullability.second && - "_Nullable_result isn't supported as context-sensitive keyword"); - string = "_Nullable_result"; - break; - } - - DB.AddString(string); + DB.AddString( + ("'" + + getNullabilitySpelling(nullability.first, + /*isContextSensitive=*/nullability.second) + + "'") + .str()); return DB; } diff --git a/clang/lib/Basic/IdentifierTable.cpp b/clang/lib/Basic/IdentifierTable.cpp index 97dc5cd..9be42c0 100644 --- a/clang/lib/Basic/IdentifierTable.cpp +++ b/clang/lib/Basic/IdentifierTable.cpp @@ -849,6 +849,20 @@ StringRef clang::getNullabilitySpelling(NullabilityKind kind, llvm_unreachable("Unknown nullability kind."); } +llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, NullabilityKind NK) { + switch (NK) { + case NullabilityKind::NonNull: + return OS << "NonNull"; + case NullabilityKind::Nullable: + return OS << "Nullable"; + case NullabilityKind::NullableResult: + return OS << "NullableResult"; + case NullabilityKind::Unspecified: + return OS << "Unspecified"; + } + llvm_unreachable("Unknown nullability kind."); +} + diag::kind IdentifierTable::getFutureCompatDiagKind(const IdentifierInfo &II, const LangOptions &LangOpts) { diff --git a/clang/test/SemaObjC/nullable-result.m b/clang/test/SemaObjC/nullable-result.m index 6125141..17cc1dd 100644 --- a/clang/test/SemaObjC/nullable-result.m +++ b/clang/test/SemaObjC/nullable-result.m @@ -25,9 +25,9 @@ void test_conversion(void) { } void test_dup(void) { - id _Nullable_result _Nullable_result a; // expected-warning {{duplicate nullability specifier _Nullable_result}} - id _Nullable _Nullable_result b; // expected-error{{nullability specifier _Nullable_result conflicts with existing specifier '_Nullable'}} - id _Nullable_result _Nonnull c; // expected-error{{nullability specifier '_Nonnull' conflicts with existing specifier _Nullable_result}} + id _Nullable_result _Nullable_result a; // expected-warning {{duplicate nullability specifier '_Nullable_result'}} + id _Nullable _Nullable_result b; // expected-error{{nullability specifier '_Nullable_result' conflicts with existing specifier '_Nullable'}} + id _Nullable_result _Nonnull c; // expected-error{{nullability specifier '_Nonnull' conflicts with existing specifier '_Nullable_result'}} } @interface NoContextSensitive |