diff --git a/include/clang/Lex/LiteralSupport.h b/include/clang/Lex/LiteralSupport.h
index 834bb07..78f320f 100644
--- a/include/clang/Lex/LiteralSupport.h
+++ b/include/clang/Lex/LiteralSupport.h
@@ -84,9 +84,7 @@
                               bool* isExact = NULL);
 
 private:  
-  void Diag(SourceLocation Loc, unsigned DiagID, 
-            const std::string &M = std::string());
-  
+ 
   void ParseNumberStartingWithZero(SourceLocation TokLoc);
   
   /// SkipHexDigits - Read and skip over any hex digits, up to End.
diff --git a/lib/Lex/LiteralSupport.cpp b/lib/Lex/LiteralSupport.cpp
index 93e9524..6a1fad5 100644
--- a/lib/Lex/LiteralSupport.cpp
+++ b/lib/Lex/LiteralSupport.cpp
@@ -141,11 +141,10 @@
     }
     // FALL THROUGH.
   default:
-    if (isgraph(ThisTokBuf[0])) {
+    if (isgraph(ThisTokBuf[0]))
       PP.Diag(Loc, diag::ext_unknown_escape) << std::string()+(char)ResultChar;
-    } else {
+    else
       PP.Diag(Loc, diag::ext_unknown_escape) << "x"+llvm::utohexstr(ResultChar);
-    }
     break;
   }
   
@@ -225,8 +224,9 @@
     if (s == ThisTokEnd) {
       // Done.
     } else if (isxdigit(*s) && !(*s == 'e' || *s == 'E')) {
-      Diag(PP.AdvanceToTokenCharacter(TokLoc, s-begin),
-           diag::err_invalid_decimal_digit, std::string(s, s+1));
+      PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, s-begin),
+              diag::err_invalid_decimal_digit) << std::string(s, s+1);
+      hadError = true;
       return;
     } else if (*s == '.') {
       s++;
@@ -242,8 +242,9 @@
       if (first_non_digit != s) {
         s = first_non_digit;
       } else {
-        Diag(PP.AdvanceToTokenCharacter(TokLoc, Exponent-begin),
-             diag::err_exponent_has_no_digits);
+        PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, Exponent-begin),
+                diag::err_exponent_has_no_digits);
+        hadError = true;
         return;
       }
     }
@@ -330,10 +331,11 @@
   
   // Report an error if there are any.
   if (s != ThisTokEnd) {
-    Diag(PP.AdvanceToTokenCharacter(TokLoc, s-begin),
-         isFPConstant ? diag::err_invalid_suffix_float_constant :
-                        diag::err_invalid_suffix_integer_constant, 
-         std::string(SuffixBegin, ThisTokEnd));
+    PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, s-begin),
+            isFPConstant ? diag::err_invalid_suffix_float_constant :
+                           diag::err_invalid_suffix_integer_constant)
+      << std::string(SuffixBegin, ThisTokEnd);
+    hadError = true;
     return;
   }
 }
@@ -369,17 +371,21 @@
       if (*s == '+' || *s == '-')  s++; // sign
       const char *first_non_digit = SkipDigits(s);
       if (first_non_digit == s) {
-        Diag(PP.AdvanceToTokenCharacter(TokLoc, Exponent-ThisTokBegin),
-             diag::err_exponent_has_no_digits);
+        PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, Exponent-ThisTokBegin),
+                diag::err_exponent_has_no_digits);
+        hadError = true;
         return;
       }
       s = first_non_digit;
       
-      if (!PP.getLangOptions().HexFloats)
-        Diag(TokLoc, diag::ext_hexconstant_invalid);
+      if (!PP.getLangOptions().HexFloats) {
+        PP.Diag(TokLoc, diag::ext_hexconstant_invalid);
+        hadError = true;
+      }
     } else if (saw_period) {
-      Diag(PP.AdvanceToTokenCharacter(TokLoc, s-ThisTokBegin),
-           diag::err_hexconstant_requires_exponent);
+      PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, s-ThisTokBegin),
+              diag::err_hexconstant_requires_exponent);
+      hadError = true;
     }
     return;
   }
@@ -395,8 +401,9 @@
     if (s == ThisTokEnd) {
       // Done.
     } else if (isxdigit(*s)) {
-      Diag(PP.AdvanceToTokenCharacter(TokLoc, s-ThisTokBegin),
-           diag::err_invalid_binary_digit, std::string(s, s+1));
+      PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, s-ThisTokBegin),
+              diag::err_invalid_binary_digit) << std::string(s, s+1);
+      hadError = true;
     }
     // Other suffixes will be diagnosed by the caller.
     return;
@@ -424,8 +431,9 @@
   // If we have a hex digit other than 'e' (which denotes a FP exponent) then
   // the code is using an incorrect base.
   if (isxdigit(*s) && *s != 'e' && *s != 'E') {
-    Diag(PP.AdvanceToTokenCharacter(TokLoc, s-ThisTokBegin),
-         diag::err_invalid_octal_digit, std::string(s, s+1));
+    PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, s-ThisTokBegin),
+            diag::err_invalid_octal_digit) << std::string(s, s+1);
+    hadError = true;
     return;
   }
   
@@ -445,8 +453,9 @@
     if (first_non_digit != s) {
       s = first_non_digit;
     } else {
-      Diag(PP.AdvanceToTokenCharacter(TokLoc, Exponent-ThisTokBegin), 
-           diag::err_exponent_has_no_digits);
+      PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, Exponent-ThisTokBegin), 
+              diag::err_exponent_has_no_digits);
+      hadError = true;
       return;
     }
   }
@@ -530,12 +539,6 @@
   return V;
 }
 
-void NumericLiteralParser::Diag(SourceLocation Loc, unsigned DiagID, 
-                                const std::string &M) {
-  PP.Diag(Loc, DiagID) << M;
-  hadError = true;
-}
-
 
 CharLiteralParser::CharLiteralParser(const char *begin, const char *end,
                                      SourceLocation Loc, Preprocessor &PP) {
