diff --git a/clang/lib/Analysis/ScanfFormatString.cpp b/clang/lib/Analysis/ScanfFormatString.cpp
index 1bbd5f2..d091237 100644
--- a/clang/lib/Analysis/ScanfFormatString.cpp
+++ b/clang/lib/Analysis/ScanfFormatString.cpp
@@ -15,12 +15,12 @@
 #include "clang/Analysis/Analyses/FormatString.h"
 #include "FormatStringParsing.h"
 
-using clang::analyze_format_string::ArgTypeResult;
+using clang::analyze_format_string::ArgType;
 using clang::analyze_format_string::FormatStringHandler;
 using clang::analyze_format_string::LengthModifier;
 using clang::analyze_format_string::OptionalAmount;
 using clang::analyze_format_string::ConversionSpecifier;
-using clang::analyze_scanf::ScanfArgTypeResult;
+using clang::analyze_scanf::ScanfArgType;
 using clang::analyze_scanf::ScanfConversionSpecifier;
 using clang::analyze_scanf::ScanfSpecifier;
 using clang::UpdateOnReturn;
@@ -194,37 +194,37 @@
   return ScanfSpecifierResult(Start, FS);
 }
 
-ScanfArgTypeResult ScanfSpecifier::getArgType(ASTContext &Ctx) const {
+ScanfArgType ScanfSpecifier::getArgType(ASTContext &Ctx) const {
   const ScanfConversionSpecifier &CS = getConversionSpecifier();
 
   if (!CS.consumesDataArgument())
-    return ScanfArgTypeResult::Invalid();
+    return ScanfArgType::Invalid();
 
   switch(CS.getKind()) {
     // Signed int.
     case ConversionSpecifier::dArg:
     case ConversionSpecifier::iArg:
       switch (LM.getKind()) {
-        case LengthModifier::None: return ArgTypeResult(Ctx.IntTy);
+        case LengthModifier::None: return ArgType(Ctx.IntTy);
         case LengthModifier::AsChar:
-          return ArgTypeResult(ArgTypeResult::AnyCharTy);
-        case LengthModifier::AsShort: return ArgTypeResult(Ctx.ShortTy);
-        case LengthModifier::AsLong: return ArgTypeResult(Ctx.LongTy);
+          return ArgType(ArgType::AnyCharTy);
+        case LengthModifier::AsShort: return ArgType(Ctx.ShortTy);
+        case LengthModifier::AsLong: return ArgType(Ctx.LongTy);
         case LengthModifier::AsLongLong:
         case LengthModifier::AsQuad:
-          return ArgTypeResult(Ctx.LongLongTy);
+          return ArgType(Ctx.LongLongTy);
         case LengthModifier::AsIntMax:
-          return ScanfArgTypeResult(Ctx.getIntMaxType(), "intmax_t *");
+          return ScanfArgType(Ctx.getIntMaxType(), "intmax_t *");
         case LengthModifier::AsSizeT:
           // FIXME: ssize_t.
-          return ScanfArgTypeResult();
+          return ScanfArgType();
         case LengthModifier::AsPtrDiff:
-          return ScanfArgTypeResult(Ctx.getPointerDiffType(), "ptrdiff_t *");
+          return ScanfArgType(Ctx.getPointerDiffType(), "ptrdiff_t *");
         case LengthModifier::AsLongDouble:
           // GNU extension.
-          return ArgTypeResult(Ctx.LongLongTy);
-        case LengthModifier::AsAllocate: return ScanfArgTypeResult::Invalid();
-        case LengthModifier::AsMAllocate: return ScanfArgTypeResult::Invalid();
+          return ArgType(Ctx.LongLongTy);
+        case LengthModifier::AsAllocate: return ScanfArgType::Invalid();
+        case LengthModifier::AsMAllocate: return ScanfArgType::Invalid();
       }
 
     // Unsigned int.
@@ -233,25 +233,25 @@
     case ConversionSpecifier::xArg:
     case ConversionSpecifier::XArg:
       switch (LM.getKind()) {
-        case LengthModifier::None: return ArgTypeResult(Ctx.UnsignedIntTy);
-        case LengthModifier::AsChar: return ArgTypeResult(Ctx.UnsignedCharTy);
-        case LengthModifier::AsShort: return ArgTypeResult(Ctx.UnsignedShortTy);
-        case LengthModifier::AsLong: return ArgTypeResult(Ctx.UnsignedLongTy);
+        case LengthModifier::None: return ArgType(Ctx.UnsignedIntTy);
+        case LengthModifier::AsChar: return ArgType(Ctx.UnsignedCharTy);
+        case LengthModifier::AsShort: return ArgType(Ctx.UnsignedShortTy);
+        case LengthModifier::AsLong: return ArgType(Ctx.UnsignedLongTy);
         case LengthModifier::AsLongLong:
         case LengthModifier::AsQuad:
-          return ArgTypeResult(Ctx.UnsignedLongLongTy);
+          return ArgType(Ctx.UnsignedLongLongTy);
         case LengthModifier::AsIntMax:
-          return ScanfArgTypeResult(Ctx.getUIntMaxType(), "uintmax_t *");
+          return ScanfArgType(Ctx.getUIntMaxType(), "uintmax_t *");
         case LengthModifier::AsSizeT:
-          return ScanfArgTypeResult(Ctx.getSizeType(), "size_t *");
+          return ScanfArgType(Ctx.getSizeType(), "size_t *");
         case LengthModifier::AsPtrDiff:
           // FIXME: Unsigned version of ptrdiff_t?
-          return ScanfArgTypeResult();
+          return ScanfArgType();
         case LengthModifier::AsLongDouble:
           // GNU extension.
-          return ArgTypeResult(Ctx.UnsignedLongLongTy);
-        case LengthModifier::AsAllocate: return ScanfArgTypeResult::Invalid();
-        case LengthModifier::AsMAllocate: return ScanfArgTypeResult::Invalid();
+          return ArgType(Ctx.UnsignedLongLongTy);
+        case LengthModifier::AsAllocate: return ScanfArgType::Invalid();
+        case LengthModifier::AsMAllocate: return ScanfArgType::Invalid();
       }
 
     // Float.
@@ -264,12 +264,12 @@
     case ConversionSpecifier::gArg:
     case ConversionSpecifier::GArg:
       switch (LM.getKind()) {
-        case LengthModifier::None: return ArgTypeResult(Ctx.FloatTy);
-        case LengthModifier::AsLong: return ArgTypeResult(Ctx.DoubleTy);
+        case LengthModifier::None: return ArgType(Ctx.FloatTy);
+        case LengthModifier::AsLong: return ArgType(Ctx.DoubleTy);
         case LengthModifier::AsLongDouble:
-          return ArgTypeResult(Ctx.LongDoubleTy);
+          return ArgType(Ctx.LongDoubleTy);
         default:
-          return ScanfArgTypeResult::Invalid();
+          return ScanfArgType::Invalid();
       }
 
     // Char, string and scanlist.
@@ -277,40 +277,40 @@
     case ConversionSpecifier::sArg:
     case ConversionSpecifier::ScanListArg:
       switch (LM.getKind()) {
-        case LengthModifier::None: return ScanfArgTypeResult::CStrTy;
+        case LengthModifier::None: return ScanfArgType::CStrTy;
         case LengthModifier::AsLong:
-          return ScanfArgTypeResult(ScanfArgTypeResult::WCStrTy, "wchar_t *");
+          return ScanfArgType(ScanfArgType::WCStrTy, "wchar_t *");
         case LengthModifier::AsAllocate:
         case LengthModifier::AsMAllocate:
-          return ScanfArgTypeResult(ArgTypeResult::CStrTy);
+          return ScanfArgType(ArgType::CStrTy);
         default:
-          return ScanfArgTypeResult::Invalid();
+          return ScanfArgType::Invalid();
       }
     case ConversionSpecifier::CArg:
     case ConversionSpecifier::SArg:
       // FIXME: Mac OS X specific?
       switch (LM.getKind()) {
         case LengthModifier::None:
-          return ScanfArgTypeResult(ScanfArgTypeResult::WCStrTy, "wchar_t *");
+          return ScanfArgType(ScanfArgType::WCStrTy, "wchar_t *");
         case LengthModifier::AsAllocate:
         case LengthModifier::AsMAllocate:
-          return ScanfArgTypeResult(ArgTypeResult::WCStrTy, "wchar_t **");
+          return ScanfArgType(ArgType::WCStrTy, "wchar_t **");
         default:
-          return ScanfArgTypeResult::Invalid();
+          return ScanfArgType::Invalid();
       }
 
     // Pointer.
     case ConversionSpecifier::pArg:
-      return ScanfArgTypeResult(ArgTypeResult(ArgTypeResult::CPointerTy));
+      return ScanfArgType(ArgType(ArgType::CPointerTy));
 
     case ConversionSpecifier::nArg:
-      return ArgTypeResult(Ctx.IntTy);
+      return ArgType(Ctx.IntTy);
 
     default:
       break;
   }
 
-  return ScanfArgTypeResult();
+  return ScanfArgType();
 }
 
 bool ScanfSpecifier::fixType(QualType QT, const LangOptions &LangOpt,
@@ -393,7 +393,7 @@
     namedTypeToLengthModifier(PT, LM);
 
   // If fixing the length modifier was enough, we are done.
-  const analyze_scanf::ScanfArgTypeResult &ATR = getArgType(Ctx);
+  const analyze_scanf::ScanfArgType &ATR = getArgType(Ctx);
   if (hasValidLengthModifier() && ATR.isValid() && ATR.matchesType(Ctx, QT))
     return true;
 
@@ -452,7 +452,7 @@
   return false;
 }
 
-bool ScanfArgTypeResult::matchesType(ASTContext& C, QualType argTy) const {
+bool ScanfArgType::matchesType(ASTContext& C, QualType argTy) const {
   // It has to be a pointer type.
   const PointerType *PT = argTy->getAs<PointerType>();
   if (!PT)
@@ -464,39 +464,39 @@
 
   switch (K) {
     case InvalidTy:
-      llvm_unreachable("ArgTypeResult must be valid");
+      llvm_unreachable("ArgType must be valid");
     case UnknownTy:
       return true;
     case CStrTy:
-      return ArgTypeResult(ArgTypeResult::CStrTy).matchesType(C, argTy);
+      return ArgType(ArgType::CStrTy).matchesType(C, argTy);
     case WCStrTy:
-      return ArgTypeResult(ArgTypeResult::WCStrTy).matchesType(C, argTy);
-    case PtrToArgTypeResultTy: {
+      return ArgType(ArgType::WCStrTy).matchesType(C, argTy);
+    case PtrToArgTypeTy: {
       return A.matchesType(C, PT->getPointeeType());
     }
   }
 
-  llvm_unreachable("Invalid ScanfArgTypeResult Kind!");
+  llvm_unreachable("Invalid ScanfArgType Kind!");
 }
 
-QualType ScanfArgTypeResult::getRepresentativeType(ASTContext &C) const {
+QualType ScanfArgType::getRepresentativeType(ASTContext &C) const {
   switch (K) {
     case InvalidTy:
-      llvm_unreachable("No representative type for Invalid ArgTypeResult");
+      llvm_unreachable("No representative type for Invalid ArgType");
     case UnknownTy:
       return QualType();
     case CStrTy:
       return C.getPointerType(C.CharTy);
     case WCStrTy:
       return C.getPointerType(C.getWCharType());
-    case PtrToArgTypeResultTy:
+    case PtrToArgTypeTy:
       return C.getPointerType(A.getRepresentativeType(C));
   }
 
-  llvm_unreachable("Invalid ScanfArgTypeResult Kind!");
+  llvm_unreachable("Invalid ScanfArgType Kind!");
 }
 
-std::string ScanfArgTypeResult::getRepresentativeTypeName(ASTContext& C) const {
+std::string ScanfArgType::getRepresentativeTypeName(ASTContext& C) const {
   std::string S = getRepresentativeType(C).getAsString();
   if (!Name)
     return std::string("'") + S + "'";
