From: Chris Lattner Date: Wed, 19 Nov 2008 07:32:16 +0000 (+0000) Subject: Allow sending IdentifierInfo*'s into Diagnostics without turning them into strings X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=43b628cd47ecdc3caf640d79b3ad7ecef0f2c285;p=clang Allow sending IdentifierInfo*'s into Diagnostics without turning them into strings first. This should allow removal of a bunch of II->getName() calls. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59601 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Analysis/PathSensitive/BugReporter.h b/include/clang/Analysis/PathSensitive/BugReporter.h index 870e9d39f0..d9969efb9c 100644 --- a/include/clang/Analysis/PathSensitive/BugReporter.h +++ b/include/clang/Analysis/PathSensitive/BugReporter.h @@ -325,13 +325,15 @@ public: R.addString(Info.getArgCStr(i)); break; case DiagnosticInfo::ak_sint: - // FIXME: Optimize R.addString(llvm::itostr(Info.getArgSInt(i))); break; case DiagnosticInfo::ak_uint: - // FIXME: Optimize R.addString(llvm::utostr_32(Info.getArgUInt(i))); break; + case DiagnosticInfo::ak_identifierinfo: + R.addString(Info.getArgIdentifier(i)->getName()); + break; + } } } diff --git a/include/clang/Basic/Diagnostic.h b/include/clang/Basic/Diagnostic.h index fe3cfeeb31..0b68a2e363 100644 --- a/include/clang/Basic/Diagnostic.h +++ b/include/clang/Basic/Diagnostic.h @@ -27,6 +27,7 @@ namespace clang { class SourceRange; class SourceManager; class DiagnosticInfo; + class IdentifierInfo; // Import the diagnostic enums themselves. namespace diag { @@ -237,10 +238,11 @@ class DiagnosticInfo { void operator=(const DiagnosticInfo&); // DO NOT IMPLEMENT public: enum ArgumentKind { - ak_std_string, // std::string - ak_c_string, // const char * - ak_sint, // int - ak_uint // unsigned + ak_std_string, // std::string + ak_c_string, // const char * + ak_sint, // int + ak_uint, // unsigned + ak_identifierinfo // IdentifierInfo }; @@ -316,6 +318,13 @@ public: return (unsigned)DiagObj->DiagArgumentsVal[Idx]; } + /// getArgIdentifier - Return the specified IdentifierInfo argument. + const IdentifierInfo *getArgIdentifier(unsigned Idx) const { + assert(getArgKind(Idx) == ak_identifierinfo &&"invalid argument accessor!"); + return reinterpret_cast( + DiagObj->DiagArgumentsVal[Idx]); + } + /// getNumRanges - Return the number of source ranges associated with this /// diagnostic. unsigned getNumRanges() const { @@ -360,6 +369,17 @@ public: return *this; } + DiagnosticInfo &operator<<(const IdentifierInfo *II) { + assert((unsigned)DiagObj->NumDiagArgs < Diagnostic::MaxArguments && + "Too many arguments to diagnostic!"); + DiagObj->DiagArgumentsKind[DiagObj->NumDiagArgs] = ak_identifierinfo; + DiagObj->DiagArgumentsVal[DiagObj->NumDiagArgs++] = + reinterpret_cast(II); + return *this; + } + + + DiagnosticInfo &operator<<(const SourceRange &R) { assert((unsigned)DiagObj->NumDiagArgs < diff --git a/lib/Basic/Diagnostic.cpp b/lib/Basic/Diagnostic.cpp index 9428b218e5..a25a790352 100644 --- a/lib/Basic/Diagnostic.cpp +++ b/lib/Basic/Diagnostic.cpp @@ -12,6 +12,7 @@ //===----------------------------------------------------------------------===// #include "clang/Basic/Diagnostic.h" +#include "clang/Basic/IdentifierTable.h" #include "clang/Basic/SourceLocation.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringExtras.h" @@ -292,6 +293,11 @@ FormatDiagnostic(llvm::SmallVectorImpl &OutStr) const { OutStr.append(S.begin(), S.end()); break; } + case DiagnosticInfo::ak_identifierinfo: { + const IdentifierInfo *II = getArgIdentifier(StrNo); + OutStr.append(II->getName(), II->getName() + II->getLength()); + break; + } } DiagStr += 2; } diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 90d3730f1e..b62aa9a9d7 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -234,7 +234,7 @@ void Sema::CheckCXXDefaultArguments(FunctionDecl *FD) { if (Param->getIdentifier()) Diag(Param->getLocation(), diag::err_param_default_argument_missing_name) - << Param->getIdentifier()->getName(); + << Param->getIdentifier(); else Diag(Param->getLocation(), diag::err_param_default_argument_missing);