]> granicus.if.org Git - clang/commitdiff
Allow sending IdentifierInfo*'s into Diagnostics without turning them into strings
authorChris Lattner <sabre@nondot.org>
Wed, 19 Nov 2008 07:32:16 +0000 (07:32 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 19 Nov 2008 07:32:16 +0000 (07:32 +0000)
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

include/clang/Analysis/PathSensitive/BugReporter.h
include/clang/Basic/Diagnostic.h
lib/Basic/Diagnostic.cpp
lib/Sema/SemaDeclCXX.cpp

index 870e9d39f02a6b11d3c6dedb2f4380b1d89ae527..d9969efb9cb36cce901eaa7dbed6398f5e9e47c5 100644 (file)
@@ -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;
+          
       }
     }
   }
index fe3cfeeb31c08f5685dae7449a065c8efc25a38f..0b68a2e363a450493e1eb2d3ec1b117b592cffa4 100644 (file)
@@ -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 < 
index 9428b218e54301cfdba15fe638d1681cd8f942a2..a25a790352e8e82ae4a33764d03635ea391be8ca 100644 (file)
@@ -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;
     }
index 90d3730f1e932fbed4d0e0408b3f0d51549da1a9..b62aa9a9d7fdc0f24fb54d3bb26e48de79ced76f 100644 (file)
@@ -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);