aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-11-19 07:32:16 +0000
committerChris Lattner <sabre@nondot.org>2008-11-19 07:32:16 +0000
commit43b628cd47ecdc3caf640d79b3ad7ecef0f2c285 (patch)
tree128efac4ac9d423f5ac93b7ffdbce909e60fb1d4
parent8365223e5498255a1285b6bb206f5894fe5b83c6 (diff)
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
-rw-r--r--include/clang/Analysis/PathSensitive/BugReporter.h6
-rw-r--r--include/clang/Basic/Diagnostic.h28
-rw-r--r--lib/Basic/Diagnostic.cpp6
-rw-r--r--lib/Sema/SemaDeclCXX.cpp2
4 files changed, 35 insertions, 7 deletions
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<const IdentifierInfo*>(
+ 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<intptr_t>(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<char> &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);