diff options
-rw-r--r-- | include/clang/Basic/Diagnostic.h | 18 | ||||
-rw-r--r-- | include/clang/Basic/IdentifierTable.h | 2 | ||||
-rw-r--r-- | lib/Basic/Diagnostic.cpp | 8 | ||||
-rw-r--r-- | lib/Sema/SemaDeclObjC.cpp | 4 |
4 files changed, 28 insertions, 4 deletions
diff --git a/include/clang/Basic/Diagnostic.h b/include/clang/Basic/Diagnostic.h index 1bb294e7a4..9dfcf3fe75 100644 --- a/include/clang/Basic/Diagnostic.h +++ b/include/clang/Basic/Diagnostic.h @@ -15,6 +15,7 @@ #define LLVM_CLANG_DIAGNOSTIC_H #include "clang/Basic/SourceLocation.h" +#include "clang/Basic/IdentifierTable.h" #include <string> #include <cassert> @@ -26,7 +27,6 @@ namespace clang { class DiagnosticClient; class SourceRange; class DiagnosticBuilder; - class IdentifierInfo; // Import the diagnostic enums themselves. namespace diag { @@ -142,7 +142,8 @@ public: ak_identifierinfo, // IdentifierInfo ak_qualtype, // QualType ak_declarationname, // DeclarationName - ak_nameddecl // NamedDecl * + ak_nameddecl, // NamedDecl * + ak_selector // Selector }; private: @@ -484,6 +485,13 @@ inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, } inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, + Selector S) { + DB.AddTaggedVal(reinterpret_cast<intptr_t>(S.getAsOpaquePtr()), + Diagnostic::ak_selector); + return DB; +} + +inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, const SourceRange &R) { DB.AddSourceRange(R); return DB; @@ -566,6 +574,12 @@ public: return reinterpret_cast<IdentifierInfo*>(DiagObj->DiagArgumentsVal[Idx]); } + /// getArgSelector - Return the specified Selector argument. + Selector getArgSelector(unsigned Idx) const { + assert(getArgKind(Idx) == Diagnostic::ak_selector && + "invalid argument accessor!"); + return Selector(DiagObj->DiagArgumentsVal[Idx]); + } /// getRawArg - Return the specified non-string argument in an opaque form. intptr_t getRawArg(unsigned Idx) const { assert(getArgKind(Idx) != Diagnostic::ak_std_string && diff --git a/include/clang/Basic/IdentifierTable.h b/include/clang/Basic/IdentifierTable.h index 2584136ec4..b6cee028f4 100644 --- a/include/clang/Basic/IdentifierTable.h +++ b/include/clang/Basic/IdentifierTable.h @@ -334,6 +334,8 @@ private: /// selectors that take no arguments and selectors that take 1 argument, which /// accounts for 78% of all selectors in Cocoa.h. class Selector { + friend class DiagnosticInfo; + enum IdentifierInfoFlag { // MultiKeywordSelector = 0. ZeroArg = 0x1, diff --git a/lib/Basic/Diagnostic.cpp b/lib/Basic/Diagnostic.cpp index 893eae5d1a..84d4055b78 100644 --- a/lib/Basic/Diagnostic.cpp +++ b/lib/Basic/Diagnostic.cpp @@ -657,6 +657,14 @@ FormatDiagnostic(llvm::SmallVectorImpl<char> &OutStr) const { OutStr.push_back('\''); break; } + case Diagnostic::ak_selector: { + Selector S = getArgSelector(ArgNo); + OutStr.push_back('\''); + const std::string &s = S.getAsString(); + OutStr.append(&s[0], &s[0]+s.length()); + OutStr.push_back('\''); + break; + } case Diagnostic::ak_qualtype: case Diagnostic::ak_declarationname: case Diagnostic::ak_nameddecl: diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index f91feb423f..a26581824f 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -1139,7 +1139,7 @@ void Sema::ProcessPropertyDecl(ObjCPropertyDecl *property, Diag(property->getLocation(), diag::err_accessor_property_type_mismatch) << property->getDeclName() - << GetterMethod->getSelector().getAsString(); + << GetterMethod->getSelector(); Diag(GetterMethod->getLocation(), diag::note_declared_at); } @@ -1152,7 +1152,7 @@ void Sema::ProcessPropertyDecl(ObjCPropertyDecl *property, Diag(property->getLocation(), diag::err_accessor_property_type_mismatch) << property->getDeclName() - << SetterMethod->getSelector().getAsString(); + << SetterMethod->getSelector(); Diag(SetterMethod->getLocation(), diag::note_declared_at); } } |