]> granicus.if.org Git - clang/commitdiff
Split the DiagnosticInfo class into two disjoint classes:
authorChris Lattner <sabre@nondot.org>
Sat, 22 Nov 2008 00:59:29 +0000 (00:59 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 22 Nov 2008 00:59:29 +0000 (00:59 +0000)
one for building up the diagnostic that is in flight (DiagnosticBuilder)
and one for pulling structured information out of the diagnostic when
formatting and presenting it.

There is no functionality change with this patch.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59849 91177308-0d34-0410-b5e6-96231b3b80d8

12 files changed:
include/clang/Analysis/PathSensitive/BugReporter.h
include/clang/Basic/Diagnostic.h
include/clang/Lex/Lexer.h
include/clang/Lex/Preprocessor.h
include/clang/Parse/Action.h
include/clang/Parse/Parser.h
lib/Basic/Diagnostic.cpp
lib/Lex/Lexer.cpp
lib/Lex/Preprocessor.cpp
lib/Parse/Parser.cpp
lib/Sema/Sema.cpp
lib/Sema/Sema.h

index d9969efb9cb36cce901eaa7dbed6398f5e9e47c5..ef8321f214239f5d8e508019bad2fb4fd03b3d0b 100644 (file)
@@ -318,19 +318,19 @@ public:
     
     for (unsigned i = 0, e = Info.getNumArgs(); i != e; ++i) {
       switch (Info.getArgKind(i)) {
-      case DiagnosticInfo::ak_std_string:   
+      case Diagnostic::ak_std_string:   
         R.addString(Info.getArgStdStr(i));
         break;
-      case DiagnosticInfo::ak_c_string:   
+      case Diagnostic::ak_c_string:   
         R.addString(Info.getArgCStr(i));
         break;
-      case DiagnosticInfo::ak_sint:
+      case Diagnostic::ak_sint:
         R.addString(llvm::itostr(Info.getArgSInt(i)));
         break;
-      case DiagnosticInfo::ak_uint:
+      case Diagnostic::ak_uint:
         R.addString(llvm::utostr_32(Info.getArgUInt(i)));
         break;
-      case DiagnosticInfo::ak_identifierinfo:
+      case Diagnostic::ak_identifierinfo:
         R.addString(Info.getArgIdentifier(i)->getName());
         break;
           
index 79d6c1b6fb94c0ea0bdcbd9efef609547814540a..ad1eb75004987114e57a52bb796824685dfffb0e 100644 (file)
@@ -26,7 +26,7 @@ namespace clang {
   class DiagnosticClient;
   class SourceRange;
   class SourceManager;
-  class DiagnosticInfo;
+  class DiagnosticBuilder;
   class IdentifierInfo;
   
   // Import the diagnostic enums themselves.
@@ -170,17 +170,18 @@ public:
   
   
   /// Report - Issue the message to the client.  DiagID is a member of the
-  /// diag::kind enum.  This actually returns a new instance of DiagnosticInfo
+  /// diag::kind enum.  This actually returns aninstance of DiagnosticBuilder
   /// which emits the diagnostics (through ProcessDiag) when it is destroyed.
-  inline DiagnosticInfo Report(FullSourceLoc Pos, unsigned DiagID);
+  inline DiagnosticBuilder Report(FullSourceLoc Pos, unsigned DiagID);
   
 private:
-  // This is private state used by DiagnosticInfo.  We put it here instead of
-  // in DiagnosticInfo in order to keep DiagnosticInfo a small light-weight
+  // This is private state used by DiagnosticBuilder.  We put it here instead of
+  // in DiagnosticBuilder in order to keep DiagnosticBuilder a small lightweight
   // object.  This implementation choice means that we can only have one
   // diagnostic "in flight" at a time, but this seems to be a reasonable
   // tradeoff to keep these objects small.  Assertions verify that only one
   // diagnostic is in flight at a time.
+  friend class DiagnosticBuilder;
   friend class DiagnosticInfo;
 
   /// CurDiagLoc - This is the location of the current diagnostic that is in
@@ -188,6 +189,7 @@ private:
   FullSourceLoc CurDiagLoc;
   
   /// CurDiagID - This is the ID of the current diagnostic that is in flight.
+  /// This is set to ~0U when there is no diagnostic in flight.
   unsigned CurDiagID;
 
   enum {
@@ -197,8 +199,7 @@ private:
     MaxArguments = 10
   };
   
-  /// NumDiagArgs - This is set to -1 when no diag is in flight.  Otherwise it
-  /// is the number of entries in Arguments.
+  /// NumDiagArgs - This contains the number of entries in Arguments.
   signed char NumDiagArgs;
   /// NumRanges - This is the number of ranges in the DiagRanges array.
   unsigned char NumDiagRanges;
@@ -225,22 +226,7 @@ private:
   
   /// ProcessDiag - This is the method used to report a diagnostic that is
   /// finally fully formed.
-  void ProcessDiag(const DiagnosticInfo &Info);
-};
-  
-/// DiagnosticInfo - This is a little helper class used to produce diagnostics.
-/// This is constructed with an ID and location, and then has some number of
-/// arguments (for %0 substitution) and SourceRanges added to it with the
-/// overloaded operator<<.  Once it is destroyed, it emits the diagnostic with
-/// the accumulated information.
-///
-/// Note that many of these will be created as temporary objects (many call
-/// sites), so we want them to be small to reduce stack space usage etc.  For
-/// this reason, we stick state in the Diagnostic class, see the comment there
-/// for more info.
-class DiagnosticInfo {
-  mutable Diagnostic *DiagObj;
-  void operator=(const DiagnosticInfo&); // DO NOT IMPLEMENT
+  void ProcessDiag();
 public:
   enum ArgumentKind {
     ak_std_string,     // std::string
@@ -249,85 +235,190 @@ public:
     ak_uint,           // unsigned
     ak_identifierinfo  // IdentifierInfo
   };
+};
+
+//===----------------------------------------------------------------------===//
+// DiagnosticBuilder
+//===----------------------------------------------------------------------===//
+
+/// DiagnosticBuilder - This is a little helper class used to produce
+/// diagnostics.  This is constructed by the Diagnostic::Report method, and
+/// allows insertion of extra information (arguments and source ranges) into the
+/// currently "in flight" diagnostic.  When the temporary for the builder is
+/// destroyed, the diagnostic is issued.
+///
+/// Note that many of these will be created as temporary objects (many call
+/// sites), so we want them to be small and we never want their address taken.
+/// This ensures that compilers with somewhat reasonable optimizers will promote
+/// the common fields to registers, eliminating increments of the NumArgs field,
+/// for example.
+class DiagnosticBuilder {
+  mutable Diagnostic *DiagObj;
+  mutable unsigned NumArgs, NumRanges;
   
-  
-  DiagnosticInfo(Diagnostic *diagObj, FullSourceLoc Loc, unsigned DiagID) :
-    DiagObj(diagObj) {
-    if (DiagObj == 0) return;
-    assert(DiagObj->NumDiagArgs == -1 &&
-           "Multiple diagnostics in flight at once!");
-    DiagObj->NumDiagArgs = DiagObj->NumDiagRanges = 0;
-    DiagObj->CurDiagLoc = Loc;
-    DiagObj->CurDiagID = DiagID;
-  }
+  void operator=(const DiagnosticBuilder&); // DO NOT IMPLEMENT
+  friend class Diagnostic;
+  explicit DiagnosticBuilder(Diagnostic *diagObj)
+    : DiagObj(diagObj), NumArgs(0), NumRanges(0) {}
+public:
+  DiagnosticBuilder() : DiagObj(0) {}
   
   /// Copy constructor.  When copied, this "takes" the diagnostic info from the
   /// input and neuters it.
-  DiagnosticInfo(const DiagnosticInfo &D) {
+  DiagnosticBuilder(const DiagnosticBuilder &D) {
     DiagObj = D.DiagObj;
     D.DiagObj = 0;
   }
   
   /// Destructor - The dtor emits the diagnostic.
-  ~DiagnosticInfo() {
+  ~DiagnosticBuilder() {
     // If DiagObj is null, then its soul was stolen by the copy ctor.
-    if (!DiagObj) return;
+    if (DiagObj == 0) return;
+    
     
-    DiagObj->ProcessDiag(*this);
+    DiagObj->NumDiagArgs = NumArgs;
+    DiagObj->NumDiagRanges = NumRanges;
+
+    DiagObj->ProcessDiag();
 
     // This diagnostic is no longer in flight.
-    DiagObj->NumDiagArgs = -1;
+    DiagObj->CurDiagID = ~0U;
+  }
+  
+  /// Operator bool: conversion of DiagnosticBuilder to bool always returns
+  /// true.  This allows is to be used in boolean error contexts like:
+  /// return Diag(...);
+  operator bool() const { return true; }
+
+  void AddString(const std::string &S) const {
+    assert(NumArgs < Diagnostic::MaxArguments &&
+           "Too many arguments to diagnostic!");
+    DiagObj->DiagArgumentsKind[NumArgs] = Diagnostic::ak_std_string;
+    DiagObj->DiagArgumentsStr[NumArgs++] = S;
+  }
+  
+  void AddTaggedVal(intptr_t V, Diagnostic::ArgumentKind Kind) const {
+    assert(NumArgs < Diagnostic::MaxArguments &&
+           "Too many arguments to diagnostic!");
+    DiagObj->DiagArgumentsKind[NumArgs] = Kind;
+    DiagObj->DiagArgumentsVal[NumArgs++] = V;
   }
   
+  void AddSourceRange(const SourceRange &R) const {
+    assert(NumRanges < 
+           sizeof(DiagObj->DiagRanges)/sizeof(DiagObj->DiagRanges[0]) &&
+           "Too many arguments to diagnostic!");
+    DiagObj->DiagRanges[NumRanges++] = &R;
+  }    
+};
+
+inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,
+                                           const std::string &S) {
+  DB.AddString(S);
+  return DB;
+}
+
+inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,
+                                           const char *Str) {
+  DB.AddTaggedVal(reinterpret_cast<intptr_t>(Str),
+                  Diagnostic::ak_c_string);
+  return DB;
+}
+
+inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, int I) {
+  DB.AddTaggedVal(I, Diagnostic::ak_sint);
+  return DB;
+}
+
+inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,
+                                           unsigned I) {
+  DB.AddTaggedVal(I, Diagnostic::ak_uint);
+  return DB;
+}
+
+inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,
+                                           const IdentifierInfo *II) {
+  DB.AddTaggedVal(reinterpret_cast<intptr_t>(II),
+                  Diagnostic::ak_identifierinfo);
+  return DB;
+}
+  
+inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,
+                                           const SourceRange &R) {
+  DB.AddSourceRange(R);
+  return DB;
+}
+  
+
+/// Report - Issue the message to the client.  DiagID is a member of the
+/// diag::kind enum.  This actually returns a new instance of DiagnosticBuilder
+/// which emits the diagnostics (through ProcessDiag) when it is destroyed.
+inline DiagnosticBuilder Diagnostic::Report(FullSourceLoc Loc, unsigned DiagID){
+  assert(CurDiagID == ~0U && "Multiple diagnostics in flight at once!");
+  CurDiagLoc = Loc;
+  CurDiagID = DiagID;
+  return DiagnosticBuilder(this);
+}
+
+//===----------------------------------------------------------------------===//
+// DiagnosticInfo
+//===----------------------------------------------------------------------===//
+  
+/// DiagnosticInfo - This is a little helper class (which is basically a smart
+/// pointer that forward info from Diagnostic) that allows clients ot enquire
+/// about the currently in-flight diagnostic.
+class DiagnosticInfo {
+  const Diagnostic *DiagObj;
+public:
+  explicit DiagnosticInfo(const Diagnostic *DO) : DiagObj(DO) {}
+  
   const Diagnostic *getDiags() const { return DiagObj; }
   unsigned getID() const { return DiagObj->CurDiagID; }
   const FullSourceLoc &getLocation() const { return DiagObj->CurDiagLoc; }
   
-  /// Operator bool: conversion of DiagnosticInfo to bool always returns true.
-  /// This allows is to be used in boolean error contexts like:
-  /// return Diag(...);
-  operator bool() const { return true; }
-
   unsigned getNumArgs() const { return DiagObj->NumDiagArgs; }
   
-  
   /// getArgKind - Return the kind of the specified index.  Based on the kind
   /// of argument, the accessors below can be used to get the value.
-  ArgumentKind getArgKind(unsigned Idx) const {
-    assert((signed char)Idx < DiagObj->NumDiagArgs &&
-           "Argument index out of range!");
-    return (ArgumentKind)DiagObj->DiagArgumentsKind[Idx];
+  Diagnostic::ArgumentKind getArgKind(unsigned Idx) const {
+    assert(Idx < getNumArgs() && "Argument index out of range!");
+    return (Diagnostic::ArgumentKind)DiagObj->DiagArgumentsKind[Idx];
   }
   
   /// getArgStdStr - Return the provided argument string specified by Idx.
   const std::string &getArgStdStr(unsigned Idx) const {
-    assert(getArgKind(Idx) == ak_std_string && "invalid argument accessor!");
+    assert(getArgKind(Idx) == Diagnostic::ak_std_string &&
+           "invalid argument accessor!");
     return DiagObj->DiagArgumentsStr[Idx];
   }
-
+  
   /// getArgCStr - Return the specified C string argument.
   const char *getArgCStr(unsigned Idx) const {
-    assert(getArgKind(Idx) == ak_c_string && "invalid argument accessor!");
+    assert(getArgKind(Idx) == Diagnostic::ak_c_string &&
+           "invalid argument accessor!");
     return reinterpret_cast<const char*>(DiagObj->DiagArgumentsVal[Idx]);
   }
   
   /// getArgSInt - Return the specified signed integer argument.
   int getArgSInt(unsigned Idx) const {
-    assert(getArgKind(Idx) == ak_sint && "invalid argument accessor!");
+    assert(getArgKind(Idx) == Diagnostic::ak_sint &&
+           "invalid argument accessor!");
     return (int)DiagObj->DiagArgumentsVal[Idx];
   }
-
+  
   /// getArgUInt - Return the specified unsigned integer argument.
   unsigned getArgUInt(unsigned Idx) const {
-    assert(getArgKind(Idx) == ak_uint && "invalid argument accessor!");
+    assert(getArgKind(Idx) == Diagnostic::ak_uint &&
+           "invalid argument accessor!");
     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!");
+    assert(getArgKind(Idx) == Diagnostic::ak_identifierinfo &&
+           "invalid argument accessor!");
     return reinterpret_cast<const IdentifierInfo*>(
-                                                DiagObj->DiagArgumentsVal[Idx]);
+                                                   DiagObj->DiagArgumentsVal[Idx]);
   }
   
   /// getNumRanges - Return the number of source ranges associated with this
@@ -341,75 +432,12 @@ public:
     return *DiagObj->DiagRanges[Idx];
   }
   
-  void AddString(const std::string &S) const {
-    assert((unsigned)DiagObj->NumDiagArgs < Diagnostic::MaxArguments &&
-           "Too many arguments to diagnostic!");
-    DiagObj->DiagArgumentsKind[DiagObj->NumDiagArgs] = ak_std_string;
-    DiagObj->DiagArgumentsStr[DiagObj->NumDiagArgs++] = S;
-  }
-  
-  void AddTaggedVal(intptr_t V, ArgumentKind Kind) const {
-    assert((unsigned)DiagObj->NumDiagArgs < Diagnostic::MaxArguments &&
-           "Too many arguments to diagnostic!");
-    DiagObj->DiagArgumentsKind[DiagObj->NumDiagArgs] = Kind;
-    DiagObj->DiagArgumentsVal[DiagObj->NumDiagArgs++] = V;
-  }
-  
-  void AddSourceRange(const SourceRange &R) const {
-    assert((unsigned)DiagObj->NumDiagArgs < 
-           sizeof(DiagObj->DiagRanges)/sizeof(DiagObj->DiagRanges[0]) &&
-           "Too many arguments to diagnostic!");
-    DiagObj->DiagRanges[DiagObj->NumDiagRanges++] = &R;
-  }    
   
   /// FormatDiagnostic - Format this diagnostic into a string, substituting the
   /// formal arguments into the %0 slots.  The result is appended onto the Str
   /// array.
   void FormatDiagnostic(llvm::SmallVectorImpl<char> &OutStr) const;
 };
-
-inline const DiagnosticInfo &operator<<(const DiagnosticInfo &DI,
-                                        const std::string &S) {
-  DI.AddString(S);
-  return DI;
-}
-
-inline const DiagnosticInfo &operator<<(const DiagnosticInfo &DI,
-                                        const char *Str) {
-  DI.AddTaggedVal(reinterpret_cast<intptr_t>(Str), DiagnosticInfo::ak_c_string);
-  return DI;
-}
-
-inline const DiagnosticInfo &operator<<(const DiagnosticInfo &DI, int I) {
-  DI.AddTaggedVal(I, DiagnosticInfo::ak_sint);
-  return DI;
-}
-
-inline const DiagnosticInfo &operator<<(const DiagnosticInfo &DI, unsigned I) {
-  DI.AddTaggedVal(I, DiagnosticInfo::ak_uint);
-  return DI;
-}
-
-inline const DiagnosticInfo &operator<<(const DiagnosticInfo &DI,
-                                        const IdentifierInfo *II){
-  DI.AddTaggedVal(reinterpret_cast<intptr_t>(II),
-                  DiagnosticInfo::ak_identifierinfo);
-  return DI;
-}
-  
-inline const DiagnosticInfo &operator<<(const DiagnosticInfo &DI,
-                                        const SourceRange &R) {
-  DI.AddSourceRange(R);
-  return DI;
-}
-  
-
-/// Report - Issue the message to the client.  DiagID is a member of the
-/// diag::kind enum.  This actually returns a new instance of DiagnosticInfo
-/// which emits the diagnostics (through ProcessDiag) when it is destroyed.
-inline DiagnosticInfo Diagnostic::Report(FullSourceLoc Pos, unsigned DiagID) {
-  return DiagnosticInfo(this, Pos, DiagID);
-}
   
 
 /// DiagnosticClient - This is an abstract interface implemented by clients of
index 019153695a0432376e30ccdadc4f8b76bbf33fc9..77399e6d56abeed392f29510db726755d46a6692 100644 (file)
@@ -25,7 +25,7 @@ namespace clang {
 class Diagnostic;
 class SourceManager;
 class Preprocessor;
-class DiagnosticInfo;
+class DiagnosticBuilder;
 
 /// Lexer - This provides a simple interface that turns a text buffer into a
 /// stream of tokens.  This provides no support for file reading or buffering,
@@ -172,7 +172,7 @@ public:
  
   /// Diag - Forwarding function for diagnostics.  This translate a source
   /// position in the current buffer into a SourceLocation object for rendering.
-  DiagnosticInfo Diag(const char *Loc, unsigned DiagID) const;
+  DiagnosticBuilder Diag(const char *Loc, unsigned DiagID) const;
 
   /// getSourceLocation - Return a source location identifier for the specified
   /// offset in the current file.
index fb2cb1d33b246322dbe263f2d8b4df23ceb94130..829a7ada8117470b937d278b4f8ed6aeac628037 100644 (file)
@@ -408,8 +408,8 @@ public:
   /// Diag - Forwarding function for diagnostics.  This emits a diagnostic at
   /// the specified Token's location, translating the token's start
   /// position in the current buffer into a SourcePosition object for rendering.
-  DiagnosticInfo Diag(SourceLocation Loc, unsigned DiagID);  
-  DiagnosticInfo Diag(const Token &Tok, unsigned DiagID);
+  DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID);  
+  DiagnosticBuilder Diag(const Token &Tok, unsigned DiagID);
   
   /// getSpelling() - Return the 'spelling' of the Tok token.  The spelling of a
   /// token is the characters used to represent the token in the source file
index 9a7b41b9e5cd0cc8c930d0f2198c5ddbae35016f..3058ce3aba4750e4c82ad5f4dd913538fda81a11 100644 (file)
@@ -35,7 +35,7 @@ namespace clang {
   class Preprocessor;
   class Token;
   // Basic.
-  class DiagnosticInfo;
+  class DiagnosticBuilder;
 
 /// Action - As the parser reads the input file and recognizes the productions
 /// of the grammar, it invokes methods on this class to turn the parsed input
@@ -76,7 +76,7 @@ public:
     ActionResult(bool Invalid = false) : Val(0), isInvalid(Invalid) {}
     template<typename ActualExprTy>
     ActionResult(ActualExprTy *val) : Val(val), isInvalid(false) {}
-    ActionResult(const DiagnosticInfo &) : Val(0), isInvalid(true) {}
+    ActionResult(const DiagnosticBuilder &) : Val(0), isInvalid(true) {}
     
     const ActionResult &operator=(void *RHS) {
       Val = RHS;
index 76edfc14146ed6e49699a85ec02268e26c4b06fd..e505e4d9cafb42d2a462f165dd3af7542701a216 100644 (file)
@@ -27,7 +27,7 @@ namespace clang {
   class ObjCDeclSpec;
   class PragmaHandler;
   class Scope;
-  class DiagnosticInfo;
+  class DiagnosticBuilder;
 
 /// Parser - This implements a parser for the C family of languages.  After
 /// parsing units of the grammar, productions are invoked to handle whatever has
@@ -313,8 +313,8 @@ private:
   //===--------------------------------------------------------------------===//
   // Diagnostic Emission and Error recovery.
     
-  DiagnosticInfo Diag(SourceLocation Loc, unsigned DiagID);
-  DiagnosticInfo Diag(const Token &Tok, unsigned DiagID);
+  DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID);
+  DiagnosticBuilder Diag(const Token &Tok, unsigned DiagID);
   
   /// SkipUntil - Read tokens until we get to the specified token, then consume
   /// it (unless DontConsume is true).  Because we cannot guarantee that the
index e83d4f374151894bc279ba7676b70326f5eded4f..164ac1b6364341edd45a20a37c58623f66b63173 100644 (file)
@@ -129,7 +129,7 @@ Diagnostic::Diagnostic(DiagnosticClient *client) : Client(client) {
   NumDiagnostics = 0;
   NumErrors = 0;
   CustomDiagInfo = 0;
-  NumDiagArgs = -1;
+  CurDiagID = ~0U;
 }
 
 Diagnostic::~Diagnostic() {
@@ -215,7 +215,9 @@ Diagnostic::Level Diagnostic::getDiagnosticLevel(unsigned DiagID) const {
 
 /// ProcessDiag - This is the method used to report a diagnostic that is
 /// finally fully formed.
-void Diagnostic::ProcessDiag(const DiagnosticInfo &Info) {
+void Diagnostic::ProcessDiag() {
+  DiagnosticInfo Info(this);
+  
   // Figure out the diagnostic level of this message.
   Diagnostic::Level DiagLevel = getDiagnosticLevel(Info.getID());
   
@@ -347,25 +349,25 @@ FormatDiagnostic(llvm::SmallVectorImpl<char> &OutStr) const {
     unsigned StrNo = *DiagStr++ - '0';
 
     switch (getArgKind(StrNo)) {
-    case DiagnosticInfo::ak_std_string: {
+    case Diagnostic::ak_std_string: {
       const std::string &S = getArgStdStr(StrNo);
       assert(ModifierLen == 0 && "No modifiers for strings yet");
       OutStr.append(S.begin(), S.end());
       break;
     }
-    case DiagnosticInfo::ak_c_string: {
+    case Diagnostic::ak_c_string: {
       const char *S = getArgCStr(StrNo);
       assert(ModifierLen == 0 && "No modifiers for strings yet");
       OutStr.append(S, S + strlen(S));
       break;
     }
-    case DiagnosticInfo::ak_identifierinfo: {
+    case Diagnostic::ak_identifierinfo: {
       const IdentifierInfo *II = getArgIdentifier(StrNo);
       assert(ModifierLen == 0 && "No modifiers for strings yet");
       OutStr.append(II->getName(), II->getName() + II->getLength());
       break;
     }
-    case DiagnosticInfo::ak_sint: {
+    case Diagnostic::ak_sint: {
       int Val = getArgSInt(StrNo);
       
       if (ModifierIs(Modifier, ModifierLen, "select")) {
@@ -380,7 +382,7 @@ FormatDiagnostic(llvm::SmallVectorImpl<char> &OutStr) const {
       }
       break;
     }
-    case DiagnosticInfo::ak_uint: {
+    case Diagnostic::ak_uint: {
       unsigned Val = getArgUInt(StrNo);
       
       if (ModifierIs(Modifier, ModifierLen, "select")) {
index eebdd1e2eb3cec2ee05c2430d4891e040873a2e3..4c25287b07c2b03c3a66fc2702295fb9d876859c 100644 (file)
@@ -309,9 +309,9 @@ SourceLocation Lexer::getSourceLocation(const char *Loc) const {
 
 /// Diag - Forwarding function for diagnostics.  This translate a source
 /// position in the current buffer into a SourceLocation object for rendering.
-DiagnosticInfo Lexer::Diag(const char *Loc, unsigned DiagID) const {
+DiagnosticBuilder Lexer::Diag(const char *Loc, unsigned DiagID) const {
   if (LexingRawMode && Diagnostic::isBuiltinNoteWarningOrExtension(DiagID))
-    return DiagnosticInfo(0, FullSourceLoc(), 0);
+    return DiagnosticBuilder();
   return PP->Diag(getSourceLocation(Loc), DiagID);
 }
 
index 3d0b4d0da589e90d49b4952a2391dc8f0dd0a87e..5f8f3517feff4e4c70284f34c442a13cce2e3633 100644 (file)
@@ -117,11 +117,11 @@ Preprocessor::~Preprocessor() {
 /// Diag - Forwarding function for diagnostics.  This emits a diagnostic at
 /// the specified Token's location, translating the token's start
 /// position in the current buffer into a SourcePosition object for rendering.
-DiagnosticInfo Preprocessor::Diag(SourceLocation Loc, unsigned DiagID) {
+DiagnosticBuilder Preprocessor::Diag(SourceLocation Loc, unsigned DiagID) {
   return Diags.Report(getFullLoc(Loc), DiagID);
 }
 
-DiagnosticInfo Preprocessor::Diag(const Token &Tok, unsigned DiagID) {
+DiagnosticBuilder Preprocessor::Diag(const Token &Tok, unsigned DiagID) {
   return Diags.Report(getFullLoc(Tok.getLocation()), DiagID);
 }
 
index 86c29760d478ca93ef12ce9b231c37c9bdbab3fc..ae75266e041186ca7282a4affa2dd2bb3bb3aa31 100644 (file)
@@ -41,11 +41,11 @@ Parser::Parser(Preprocessor &pp, Action &actions)
 Action::~Action() {}
 
 
-DiagnosticInfo Parser::Diag(SourceLocation Loc, unsigned DiagID) {
+DiagnosticBuilder Parser::Diag(SourceLocation Loc, unsigned DiagID) {
   return Diags.Report(FullSourceLoc(Loc,PP.getSourceManager()), DiagID);
 }
 
-DiagnosticInfo Parser::Diag(const Token &Tok, unsigned DiagID) {
+DiagnosticBuilder Parser::Diag(const Token &Tok, unsigned DiagID) {
   return Diag(Tok.getLocation(), DiagID);
 }
 
index 44e589179e4f359378ad4940782537d35fe58a06..7c498440c6e50a67e76633c16fb38de265f37357 100644 (file)
@@ -157,7 +157,7 @@ void Sema::ActOnEndOfTranslationUnit() {
 // Helper functions.
 //===----------------------------------------------------------------------===//
 
-DiagnosticInfo Sema::Diag(SourceLocation Loc, unsigned DiagID) {
+DiagnosticBuilder Sema::Diag(SourceLocation Loc, unsigned DiagID) {
   return PP.getDiagnostics().Report(FullSourceLoc(Loc, PP.getSourceManager()),
                                     DiagID);
 }
index d569994d1670c0b2a8d0b72becd713d50163eac0..6d9e582066693d446cba77cd6b9f4ed22cb76005 100644 (file)
@@ -226,7 +226,7 @@ public:
   const LangOptions &getLangOptions() const;
   
   /// The primitive diagnostic helpers.
-  DiagnosticInfo Diag(SourceLocation Loc, unsigned DiagID);
+  DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID);
 
   virtual void DeleteExpr(ExprTy *E);
   virtual void DeleteStmt(StmtTy *S);