diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp
index 09f6efb..bbc50d6 100644
--- a/lib/Sema/SemaChecking.cpp
+++ b/lib/Sema/SemaChecking.cpp
@@ -223,7 +223,7 @@
   if (!Res->isRealFloatingType())
     return Diag(OrigArg0->getLocStart(), 
                 diag::err_typecheck_call_invalid_ordered_compare)
-      << OrigArg0->getType().getAsString() << OrigArg1->getType().getAsString()
+      << OrigArg0->getType() << OrigArg1->getType()
       << SourceRange(OrigArg0->getLocStart(), OrigArg1->getLocEnd());
   
   return false;
@@ -574,10 +574,10 @@
       
       if (Str[StrIdx-1] == '.')
         Diag(Loc, diag::warn_printf_asterisk_precision_wrong_type)
-          << E->getType().getAsString() << E->getSourceRange();
+          << E->getType() << E->getSourceRange();
       else
         Diag(Loc, diag::warn_printf_asterisk_width_wrong_type)
-          << E->getType().getAsString() << E->getSourceRange();
+          << E->getType() << E->getSourceRange();
       
       break;
     }
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp
index 4f71f06..1fc2c99 100644
--- a/lib/Sema/SemaDecl.cpp
+++ b/lib/Sema/SemaDecl.cpp
@@ -336,8 +336,7 @@
       Context.getCanonicalType(Old->getUnderlyingType()) != 
       Context.getCanonicalType(New->getUnderlyingType())) {
     Diag(New->getLocation(), diag::err_redefinition_different_typedef)
-      << New->getUnderlyingType().getAsString()
-      << Old->getUnderlyingType().getAsString();
+      << New->getUnderlyingType() << Old->getUnderlyingType();
     Diag(Old->getLocation(), diag::note_previous_definition);
     return Old;
   }
@@ -757,7 +756,7 @@
       const CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(ClassRec->getDecl());
       if (!ClassDecl->isAggregate())
         return Diag(InitLoc, diag::err_init_non_aggr_init_list)
-           << DeclType.getAsString() << Init->getSourceRange();
+           << DeclType << Init->getSourceRange();
     }
   }
 
@@ -906,8 +905,7 @@
       case DeclSpec::SCS_auto:        
       case DeclSpec::SCS_register:
       case DeclSpec::SCS_mutable:
-        Diag(D.getIdentifierLoc(), diag::err_typecheck_sclass_func)
-          << R.getAsString();
+        Diag(D.getIdentifierLoc(), diag::err_typecheck_sclass_func);
         InvalidDecl = true;
         break;
       case DeclSpec::SCS_unspecified: SC = FunctionDecl::None; break;
@@ -1186,8 +1184,7 @@
         // C99 6.9p2: The storage-class specifiers auto and register shall not
         // appear in the declaration specifiers in an external declaration.
         if (SC == VarDecl::Auto || SC == VarDecl::Register) {
-          Diag(D.getIdentifierLoc(), diag::err_typecheck_sclass_fscope)
-            << R.getAsString();
+          Diag(D.getIdentifierLoc(), diag::err_typecheck_sclass_fscope);
           InvalidDecl = true;
         }
       }
diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp
index ce63d13..2e6108c 100644
--- a/lib/Sema/SemaDeclAttr.cpp
+++ b/lib/Sema/SemaDeclAttr.cpp
@@ -158,8 +158,7 @@
   // unlike gcc's vector_size attribute, we do not allow vectors to be defined
   // in conjunction with complex types (pointers, arrays, functions, etc.).
   if (!curType->isIntegerType() && !curType->isRealFloatingType()) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_invalid_vector_type)
-      << curType.getAsString();
+    S.Diag(Attr.getLoc(), diag::err_attribute_invalid_vector_type) << curType;
     return;
   }
   // unlike gcc's vector_size attribute, the size is specified as the 
@@ -229,8 +228,7 @@
   }
   // the base type must be integer or float.
   if (!CurType->isIntegerType() && !CurType->isRealFloatingType()) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_invalid_vector_type)
-      << CurType.getAsString();
+    S.Diag(Attr.getLoc(), diag::err_attribute_invalid_vector_type) << CurType;
     return;
   }
   unsigned typeSize = static_cast<unsigned>(S.Context.getTypeSize(CurType));
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp
index b99f2e0..ab8ae72 100644
--- a/lib/Sema/SemaDeclCXX.cpp
+++ b/lib/Sema/SemaDeclCXX.cpp
@@ -351,7 +351,7 @@
       //   derived class more than once.
       Diag(BaseSpecs[idx]->getSourceRange().getBegin(),
            diag::err_duplicate_base_class)
-        << KnownBaseTypes[NewBaseType]->getType().getAsString()
+        << KnownBaseTypes[NewBaseType]->getType()
         << BaseSpecs[idx]->getSourceRange();
 
       // Delete the duplicate base class specifier; we're going to
@@ -1212,13 +1212,13 @@
     ConvType = Context.getCanonicalType(ConvType).getUnqualifiedType();
     if (ConvType == ClassType)
       Diag(Conversion->getLocation(), diag::warn_conv_to_self_not_used)
-        << ClassType.getAsString();
+        << ClassType;
     else if (IsDerivedFrom(ClassType, ConvType))
       Diag(Conversion->getLocation(), diag::warn_conv_to_base_not_used)
-        <<  ClassType.getAsString() << ConvType.getAsString();
+        <<  ClassType << ConvType;
   } else if (ConvType->isVoidType()) {
     Diag(Conversion->getLocation(), diag::warn_conv_to_void_not_used)
-      << ClassType.getAsString() << ConvType.getAsString();
+      << ClassType << ConvType;
   }
 
   ClassDecl->addConversionFunction(Context, Conversion);
@@ -1691,9 +1691,8 @@
     if (!ICS)
       Diag(Init->getSourceRange().getBegin(),
            diag::err_not_reference_to_const_init)
-        <<  T1.getAsString()
-        << (InitLvalue != Expr::LV_Valid? "temporary" : "value")
-        <<  T2.getAsString() << Init->getSourceRange();
+        << T1 << (InitLvalue != Expr::LV_Valid? "temporary" : "value")
+        << T2 << Init->getSourceRange();
     return true;
   }
 
@@ -1755,9 +1754,8 @@
     if (!ICS)
       Diag(Init->getSourceRange().getBegin(),
            diag::err_reference_init_drops_quals)
-        << T1.getAsString()
-        << (InitLvalue != Expr::LV_Valid? "temporary" : "value")
-        << T2.getAsString() << Init->getSourceRange();
+        << T1 << (InitLvalue != Expr::LV_Valid? "temporary" : "value")
+        << T2 << Init->getSourceRange();
     return true;
   }
 
@@ -1915,7 +1913,7 @@
     if (!ParamIsInt)
       return Diag(LastParam->getLocation(),
                   diag::err_operator_overload_post_incdec_must_be_int) 
-        << LastParam->getType().getAsString() << (Op == OO_MinusMinus);
+        << LastParam->getType() << (Op == OO_MinusMinus);
   }
 
   return false;
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index f81c2b8..fdd5732 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -700,7 +700,7 @@
   else if (exprType->isIncompleteType())
     return Diag(OpLoc, isSizeof ? diag::err_sizeof_incomplete_type : 
                                   diag::err_alignof_incomplete_type)
-      << exprType.getAsString() << ExprRange;
+      << exprType << ExprRange;
 
   return false;
 }
@@ -747,7 +747,7 @@
     return V->getType();
   
   // Reject anything else.
-  Diag(Loc, diag::err_realimag_invalid_type) << V->getType().getAsString();
+  Diag(Loc, diag::err_realimag_invalid_type) << V->getType();
   return QualType();
 }
 
@@ -999,7 +999,7 @@
   if (!ResultType->isObjectType())
     return Diag(BaseExpr->getLocStart(), 
                 diag::err_typecheck_subscript_not_object)
-      << BaseExpr->getType().getAsString() << BaseExpr->getSourceRange();
+      << BaseExpr->getType() << BaseExpr->getSourceRange();
 
   return new ArraySubscriptExpr(LHSExp, RHSExp, ResultType, RLoc);
 }
@@ -1017,7 +1017,7 @@
   const char *compStr = CompName.getName();
   if (strlen(compStr) > vecType->getNumElements()) {
     Diag(OpLoc, diag::err_ext_vector_component_exceeds_length)
-      << baseType.getAsString() << SourceRange(CompLoc);
+      << baseType << SourceRange(CompLoc);
     return QualType();
   }
 
@@ -1059,7 +1059,7 @@
     // We didn't get to the end of the string. This means a component accessor
     // exceeds the number of elements in the vector.
     Diag(OpLoc, diag::err_ext_vector_component_exceeds_length)
-      << baseType.getAsString() << SourceRange(CompLoc);
+      << baseType << SourceRange(CompLoc);
     return QualType();
   }
 
@@ -1068,7 +1068,7 @@
   // the elements.
   if (SpecialComponent && (vecType->getNumElements() & 1U)) {
     Diag(OpLoc, diag::err_ext_vector_component_requires_even)
-      << baseType.getAsString() << SourceRange(CompLoc);
+      << baseType << SourceRange(CompLoc);
     return QualType();
   }
   
@@ -1127,7 +1127,7 @@
       return BuildOverloadedArrowExpr(BaseExpr, OpLoc, MemberLoc, Member);
     else
       return Diag(MemberLoc, diag::err_typecheck_member_reference_arrow)
-        << BaseType.getAsString() << BaseExpr->getSourceRange();
+        << BaseType << BaseExpr->getSourceRange();
   }
   
   // Handle field access to simple records.  This also handles access to fields
@@ -1263,7 +1263,7 @@
   }
   
   return Diag(MemberLoc, diag::err_typecheck_member_reference_struct_union)
-          << BaseType.getAsString() << BaseExpr->getSourceRange();
+          << BaseType << BaseExpr->getSourceRange();
 }
 
 /// ActOnCallExpr - Handle a call to Fn with the specified array of arguments.
@@ -1347,7 +1347,7 @@
     const PointerType *PT = Fn->getType()->getAsPointerType();
     if (PT == 0)
       return Diag(LParenLoc, diag::err_typecheck_call_not_function)
-        << Fn->getType().getAsString() << Fn->getSourceRange();
+        << Fn->getType() << Fn->getSourceRange();
     FuncT = PT->getPointeeType()->getAsFunctionType();
   } else { // This is a block call.
     FuncT = Fn->getType()->getAsBlockPointerType()->getPointeeType()->
@@ -1355,7 +1355,7 @@
   }
   if (FuncT == 0)
     return Diag(LParenLoc, diag::err_typecheck_call_not_function)
-      << Fn->getType().getAsString() << Fn->getSourceRange();
+      << Fn->getType() << Fn->getSourceRange();
   
   // We know the result type of the call, set it.
   TheCall->setType(FuncT->getResultType().getNonReferenceType());
@@ -1499,17 +1499,17 @@
         (!castType->isStructureType() && !castType->isUnionType())) {
       // Reject any other conversions to non-scalar types.
       return Diag(TyR.getBegin(), diag::err_typecheck_cond_expect_scalar)
-        << castType.getAsString() << castExpr->getSourceRange();
+        << castType << castExpr->getSourceRange();
     }
       
     // accept this, but emit an ext-warn.
     Diag(TyR.getBegin(), diag::ext_typecheck_cast_nonscalar)
-      << castType.getAsString() << castExpr->getSourceRange();
+      << castType << castExpr->getSourceRange();
   } else if (!castExpr->getType()->isScalarType() && 
              !castExpr->getType()->isVectorType()) {
     return Diag(castExpr->getLocStart(),
                 diag::err_typecheck_expect_scalar_operand)
-      << castExpr->getType().getAsString() << castExpr->getSourceRange();
+      << castExpr->getType() << castExpr->getSourceRange();
   } else if (castExpr->getType()->isVectorType()) {
     if (CheckVectorCast(TyR, castExpr->getType(), castType))
       return true;
@@ -1529,11 +1529,11 @@
                   Ty->isVectorType() ? 
                   diag::err_invalid_conversion_between_vectors :
                   diag::err_invalid_conversion_between_vector_and_integer)
-        << VectorTy.getAsString() << Ty.getAsString() << R;
+        << VectorTy << Ty << R;
   } else
     return Diag(R.getBegin(),
                 diag::err_invalid_conversion_between_vector_and_scalar)
-      << VectorTy.getAsString() << Ty.getAsString() << R;
+      << VectorTy << Ty << R;
   
   return false;
 }
@@ -1564,8 +1564,7 @@
 
   // first, check the condition.
   if (!condT->isScalarType()) { // C99 6.5.15p2
-    Diag(cond->getLocStart(), diag::err_typecheck_cond_expect_scalar)
-      << condT.getAsString();
+    Diag(cond->getLocStart(), diag::err_typecheck_cond_expect_scalar) << condT;
     return QualType();
   }
   
@@ -1684,8 +1683,7 @@
       } else if (!Context.typesAreCompatible(lhptee.getUnqualifiedType(), 
                                              rhptee.getUnqualifiedType())) {
         Diag(questionLoc, diag::warn_typecheck_cond_incompatible_pointers)
-          << lexT.getAsString() << rexT.getAsString()
-          << lex->getSourceRange() << rex->getSourceRange();
+          << lexT << rexT << lex->getSourceRange() << rex->getSourceRange();
         // In this situation, we assume void* type. No especially good
         // reason, but this is what gcc does, and we do have to pick
         // to get a consistent AST.
@@ -1738,8 +1736,7 @@
 
   // Otherwise, the operands are not compatible.
   Diag(questionLoc, diag::err_typecheck_cond_incompatible_operands)
-    << lexT.getAsString() << rexT.getAsString()
-    << lex->getSourceRange() << rex->getSourceRange();
+    << lexT << rexT << lex->getSourceRange() << rex->getSourceRange();
   return QualType();
 }
 
@@ -2110,7 +2107,7 @@
 
   // You cannot convert between vector values of different size.
   Diag(Loc, diag::err_typecheck_vector_not_convertable)
-    << lex->getType().getAsString() << rex->getType().getAsString()
+    << lex->getType() << rex->getType()
     << lex->getSourceRange() << rex->getSourceRange();
   return QualType();
 }    
@@ -2168,7 +2165,7 @@
             << lex->getSourceRange() << rex->getSourceRange();
         } else {
           Diag(Loc, diag::err_typecheck_arithmetic_incomplete_type)
-            << lex->getType().getAsString() << lex->getSourceRange();
+            << lex->getType() << lex->getSourceRange();
           return QualType();
         }
       }
@@ -2205,7 +2202,7 @@
           << lex->getSourceRange() << rex->getSourceRange();
       } else {
         Diag(Loc, diag::err_typecheck_sub_ptr_object)
-          << lex->getType().getAsString() << lex->getSourceRange();
+          << lex->getType() << lex->getSourceRange();
         return QualType();
       }
     }
@@ -2227,7 +2224,7 @@
               << lex->getSourceRange() << rex->getSourceRange();
         } else {
           Diag(Loc, diag::err_typecheck_sub_ptr_object)
-            << rex->getType().getAsString() << rex->getSourceRange();
+            << rex->getType() << rex->getSourceRange();
           return QualType();
         }
       }
@@ -2237,7 +2234,7 @@
               Context.getCanonicalType(lpointee).getUnqualifiedType(), 
               Context.getCanonicalType(rpointee).getUnqualifiedType())) {
         Diag(Loc, diag::err_typecheck_sub_ptr_compatible)
-          << lex->getType().getAsString() << rex->getType().getAsString()
+          << lex->getType() << rex->getType()
           << lex->getSourceRange() << rex->getSourceRange();
         return QualType();
       }
@@ -2342,8 +2339,7 @@
                                     RCanPointeeTy.getUnqualifiedType()) &&
         !areComparableObjCInterfaces(LCanPointeeTy, RCanPointeeTy, Context)) {
       Diag(Loc, diag::ext_typecheck_comparison_of_distinct_pointers)
-        << lType.getAsString() << rType.getAsString()
-        << lex->getSourceRange() << rex->getSourceRange();
+        << lType << rType << lex->getSourceRange() << rex->getSourceRange();
     }
     ImpCastExprToType(rex, lType); // promote the pointer to pointer
     return ResultTy;
@@ -2356,8 +2352,7 @@
     if (!LHSIsNull && !RHSIsNull &&
         !Context.typesAreBlockCompatible(lpointee, rpointee)) {
       Diag(Loc, diag::err_typecheck_comparison_of_distinct_blocks)
-        << lType.getAsString() << rType.getAsString()
-        << lex->getSourceRange() << rex->getSourceRange();
+        << lType << rType << lex->getSourceRange() << rex->getSourceRange();
     }
     ImpCastExprToType(rex, lType); // promote the pointer to pointer
     return ResultTy;
@@ -2367,8 +2362,7 @@
       (lType->isPointerType() && rType->isBlockPointerType())) {
     if (!LHSIsNull && !RHSIsNull) {
       Diag(Loc, diag::err_typecheck_comparison_of_distinct_blocks)
-        << lType.getAsString() << rType.getAsString()
-        << lex->getSourceRange() << rex->getSourceRange();
+        << lType << rType << lex->getSourceRange() << rex->getSourceRange();
     }
     ImpCastExprToType(rex, lType); // promote the pointer to pointer
     return ResultTy;
@@ -2386,8 +2380,7 @@
       if (!LPtrToVoid && !RPtrToVoid &&
           !Context.typesAreCompatible(lType, rType)) {
         Diag(Loc, diag::ext_typecheck_comparison_of_distinct_pointers)
-          << lType.getAsString() << rType.getAsString()
-          << lex->getSourceRange() << rex->getSourceRange();
+          << lType << rType << lex->getSourceRange() << rex->getSourceRange();
         ImpCastExprToType(rex, lType);
         return ResultTy;
       }
@@ -2410,8 +2403,7 @@
        rType->isIntegerType()) {
     if (!RHSIsNull)
       Diag(Loc, diag::ext_typecheck_comparison_of_pointer_integer)
-        << lType.getAsString() << rType.getAsString()
-        << lex->getSourceRange() << rex->getSourceRange();
+        << lType << rType << lex->getSourceRange() << rex->getSourceRange();
     ImpCastExprToType(rex, lType); // promote the integer to pointer
     return ResultTy;
   }
@@ -2419,8 +2411,7 @@
       (rType->isPointerType() || rType->isObjCQualifiedIdType())) {
     if (!LHSIsNull)
       Diag(Loc, diag::ext_typecheck_comparison_of_pointer_integer)
-        << lType.getAsString() << rType.getAsString()
-        << lex->getSourceRange() << rex->getSourceRange();
+        << lType << rType << lex->getSourceRange() << rex->getSourceRange();
     ImpCastExprToType(lex, rType); // promote the integer to pointer
     return ResultTy;
   }
@@ -2428,16 +2419,14 @@
   if (lType->isBlockPointerType() && rType->isIntegerType()) {
     if (!RHSIsNull)
       Diag(Loc, diag::ext_typecheck_comparison_of_pointer_integer)
-        << lType.getAsString() << rType.getAsString()
-        << lex->getSourceRange() << rex->getSourceRange();
+        << lType << rType << lex->getSourceRange() << rex->getSourceRange();
     ImpCastExprToType(rex, lType); // promote the integer to pointer
     return ResultTy;
   }
   if (lType->isIntegerType() && rType->isBlockPointerType()) {
     if (!LHSIsNull)
       Diag(Loc, diag::ext_typecheck_comparison_of_pointer_integer)
-        << lType.getAsString() << rType.getAsString()
-        << lex->getSourceRange() << rex->getSourceRange();
+        << lType << rType << lex->getSourceRange() << rex->getSourceRange();
     ImpCastExprToType(lex, rType); // promote the integer to pointer
     return ResultTy;
   }
@@ -2563,7 +2552,7 @@
   }
 
   if (NeedType)
-    S.Diag(Loc, Diag) << E->getType().getAsString() << E->getSourceRange();
+    S.Diag(Loc, Diag) << E->getType() << E->getSourceRange();
   else
     S.Diag(Loc, Diag) << E->getSourceRange();
   return true;
@@ -2649,16 +2638,16 @@
       Diag(OpLoc, diag::ext_gnu_void_ptr) << Op->getSourceRange();
     } else {
       Diag(OpLoc, diag::err_typecheck_arithmetic_incomplete_type)
-        << ResType.getAsString() << Op->getSourceRange();
+        << ResType << Op->getSourceRange();
       return QualType();
     }
   } else if (ResType->isComplexType()) {
     // C99 does not support ++/-- on complex types, we allow as an extension.
     Diag(OpLoc, diag::ext_integer_increment_complex)
-      << ResType.getAsString() << Op->getSourceRange();
+      << ResType << Op->getSourceRange();
   } else {
     Diag(OpLoc, diag::err_typecheck_illegal_increment_decrement)
-      << ResType.getAsString() << Op->getSourceRange();
+      << ResType << Op->getSourceRange();
     return QualType();
   }
   // At this point, we know we have a real, complex or pointer type. 
@@ -3196,7 +3185,6 @@
     // build a built-in operation.    
   }
 
-
   QualType resultType;
   switch (Opc) {
   default:
@@ -3227,7 +3215,7 @@
       break;
 
     return Diag(OpLoc, diag::err_typecheck_unary_expr)
-          << resultType.getAsString();
+      << resultType << Input->getSourceRange();
   case UnaryOperator::Not: // bitwise complement
     UsualUnaryConversions(Input);
     resultType = Input->getType();
@@ -3235,10 +3223,10 @@
     if (resultType->isComplexType() || resultType->isComplexIntegerType())
       // C99 does not support '~' for complex conjugation.
       Diag(OpLoc, diag::ext_integer_complement_complex)
-        << resultType.getAsString() << Input->getSourceRange();
+        << resultType << Input->getSourceRange();
     else if (!resultType->isIntegerType())
       return Diag(OpLoc, diag::err_typecheck_unary_expr)
-        << resultType.getAsString() << Input->getSourceRange();
+        << resultType << Input->getSourceRange();
     break;
   case UnaryOperator::LNot: // logical negation
     // Unlike +/-/~, integer promotions aren't done here (C99 6.5.3.3p5).
@@ -3246,7 +3234,7 @@
     resultType = Input->getType();
     if (!resultType->isScalarType()) // C99 6.5.3.3p1
       return Diag(OpLoc, diag::err_typecheck_unary_expr)
-        << resultType.getAsString();
+        << resultType << Input->getSourceRange();
     // LNot always has type int. C99 6.5.3.3p5.
     resultType = Context.IntTy;
     break;
@@ -3323,7 +3311,7 @@
   // one is known to be a field designator.  Verify that the ArgTy represents
   // a struct/union/class.
   if (!ArgTy->isRecordType())
-    return Diag(TypeLoc, diag::err_offsetof_record_type) << ArgTy.getAsString();
+    return Diag(TypeLoc, diag::err_offsetof_record_type) << ArgTy;
   
   // Otherwise, create a compound literal expression as the base, and
   // iteratively process the offsetof designators.
@@ -3342,8 +3330,7 @@
       const ArrayType *AT = Context.getAsArrayType(Res->getType());
       if (!AT) {
         delete Res;
-        return Diag(OC.LocEnd, diag::err_offsetof_array_type)
-          << Res->getType().getAsString();
+        return Diag(OC.LocEnd, diag::err_offsetof_array_type) << Res->getType();
       }
       
       // FIXME: C++: Verify that operator[] isn't overloaded.
@@ -3361,8 +3348,7 @@
     const RecordType *RC = Res->getType()->getAsRecordType();
     if (!RC) {
       delete Res;
-      return Diag(OC.LocEnd, diag::err_offsetof_record_type)
-        << Res->getType().getAsString();
+      return Diag(OC.LocEnd, diag::err_offsetof_record_type) << Res->getType();
     }
       
     // Get the decl corresponding to this.
@@ -3632,7 +3618,7 @@
   if (CheckAssignmentConstraints(VaListType, E->getType()) != Compatible)
     return Diag(E->getLocStart(),
                 diag::err_first_argument_to_va_arg_not_of_type_va_list)
-      << E->getType().getAsString() << E->getSourceRange();
+      << E->getType() << E->getSourceRange();
   
   // FIXME: Warn if a non-POD type is passed in.
   
diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp
index f5f05f2..3633da8 100644
--- a/lib/Sema/SemaExprCXX.cpp
+++ b/lib/Sema/SemaExprCXX.cpp
@@ -126,7 +126,7 @@
     //
     if (!RT->getDecl()->isDefinition())
       return Diag(TyBeginLoc, diag::err_invalid_incomplete_type_use)
-        << Ty.getAsString() << FullRange;
+        << Ty << FullRange;
 
     unsigned DiagID = PP.getDiagnostics().getCustomDiagID(Diagnostic::Error,
                                     "class constructors are not supported yet");
@@ -164,7 +164,7 @@
     return Diag(TyBeginLoc, diag::err_value_init_for_array_type) << FullRange;
   if (Ty->isIncompleteType() && !Ty->isVoidType())
     return Diag(TyBeginLoc, diag::err_invalid_incomplete_type_use) 
-      << Ty.getAsString() << FullRange;
+      << Ty << FullRange;
 
   return new CXXZeroInitValueExpr(Ty, TyBeginLoc, RParenLoc);
 }
@@ -302,7 +302,7 @@
       assert(false && "Unexpected type class");
       return true;
     }
-    Diag(StartLoc, msg) << AllocType.getAsString() << TyR;
+    Diag(StartLoc, msg) << AllocType << TyR;
     return true;
   }
 
@@ -340,18 +340,17 @@
   }
 
   if (!Type->isPointerType()) {
-    Diag(StartLoc, diag::err_delete_operand)
-      << Type.getAsString() << Ex->getSourceRange();
+    Diag(StartLoc, diag::err_delete_operand) << Type << Ex->getSourceRange();
     return true;
   }
 
   QualType Pointee = Type->getAsPointerType()->getPointeeType();
   if (Pointee->isIncompleteType() && !Pointee->isVoidType())
     Diag(StartLoc, diag::warn_delete_incomplete)
-      << Pointee.getAsString() << Ex->getSourceRange();
+      << Pointee << Ex->getSourceRange();
   else if (!Pointee->isObjectType()) {
     Diag(StartLoc, diag::err_delete_operand)
-      << Type.getAsString() << Ex->getSourceRange();
+      << Type << Ex->getSourceRange();
     return true;
   }
 
@@ -428,7 +427,7 @@
     ConvTy = CheckSingleAssignmentConstraints(Context.BoolTy, CondExpr);
   if (ConvTy == Incompatible)
     return Diag(CondExpr->getLocStart(), diag::err_typecheck_bool_condition)
-      << Ty.getAsString() << CondExpr->getSourceRange();
+      << Ty << CondExpr->getSourceRange();
   return false;
 }
 
diff --git a/lib/Sema/SemaExprObjC.cpp b/lib/Sema/SemaExprObjC.cpp
index 094f3ec..4dadb65 100644
--- a/lib/Sema/SemaExprObjC.cpp
+++ b/lib/Sema/SemaExprObjC.cpp
@@ -388,7 +388,7 @@
         << Sel << SourceRange(lbrac, rbrac);
   } else {
     Diag(lbrac, diag::error_bad_receiver_type)
-      << RExpr->getType().getAsString() << RExpr->getSourceRange();
+      << RExpr->getType() << RExpr->getSourceRange();
     return true;
   }
   
diff --git a/lib/Sema/SemaInherit.cpp b/lib/Sema/SemaInherit.cpp
index 398f388..a02dd1e 100644
--- a/lib/Sema/SemaInherit.cpp
+++ b/lib/Sema/SemaInherit.cpp
@@ -205,7 +205,7 @@
   }
   
   Diag(Loc, diag::err_ambiguous_derived_to_base_conv)
-    << Derived.getAsString() << Base.getAsString() << PathDisplayStr << Range;
+    << Derived << Base << PathDisplayStr << Range;
   return true;
 }
 
diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp
index 1e26c84..42f9b14 100644
--- a/lib/Sema/SemaInit.cpp
+++ b/lib/Sema/SemaInit.cpp
@@ -144,7 +144,7 @@
     // This type is invalid, issue a diagnostic.
     Index++;
     SemaRef->Diag(IList->getLocStart(), diag::err_illegal_initializer_type)
-      << DeclType.getAsString();
+      << DeclType;
     hadError = true;
   } else {
     // In C, all types are either scalars or aggregates, but
diff --git a/lib/Sema/SemaNamedCast.cpp b/lib/Sema/SemaNamedCast.cpp
index c243fac..af1e2e0 100644
--- a/lib/Sema/SemaNamedCast.cpp
+++ b/lib/Sema/SemaNamedCast.cpp
@@ -109,8 +109,7 @@
     if (SrcExpr->isLvalue(Self.Context) != Expr::LV_Valid) {
       // Cannot cast non-lvalue to reference type.
       Self.Diag(OpRange.getBegin(), diag::err_bad_cxx_cast_rvalue)
-        << "const_cast" << OrigDestType.getAsString()
-        << SrcExpr->getSourceRange();
+        << "const_cast" << OrigDestType << SrcExpr->getSourceRange();
       return;
     }
 
@@ -131,7 +130,7 @@
     // was a reference type, we converted it to a pointer above.
     // C++ 5.2.11p3: For two pointer types [...]
     Self.Diag(OpRange.getBegin(), diag::err_bad_const_cast_dest)
-      << OrigDestType.getAsString() << DestRange;
+      << OrigDestType << DestRange;
     return;
   }
   if (DestType->isFunctionPointerType()) {
@@ -139,7 +138,7 @@
     // C++ 5.2.11p2: [...] where T is any object type or the void type [...]
     // T is the ultimate pointee of source and target type.
     Self.Diag(OpRange.getBegin(), diag::err_bad_const_cast_dest)
-      << OrigDestType.getAsString() << DestRange;
+      << OrigDestType << DestRange;
     return;
   }
   SrcType = Self.Context.getCanonicalType(SrcType);
@@ -171,8 +170,7 @@
     if (SrcTypeArr->getSize() != DestTypeArr->getSize()) {
       // Different array sizes.
       Self.Diag(OpRange.getBegin(), diag::err_bad_cxx_cast_generic)
-        << "const_cast" << OrigDestType.getAsString()
-        << OrigSrcType.getAsString() << OpRange;
+        << "const_cast" << OrigDestType << OrigSrcType << OpRange;
       return;
     }
     SrcType = SrcTypeArr->getElementType().getUnqualifiedType();
@@ -184,8 +182,7 @@
   if (SrcType != DestType) {
     // Cast between unrelated types.
     Self.Diag(OpRange.getBegin(), diag::err_bad_cxx_cast_generic)
-      << "const_cast" << OrigDestType.getAsString()
-      << OrigSrcType.getAsString() << OpRange;
+      << "const_cast" << OrigDestType << OrigSrcType << OpRange;
     return;
   }
 }
@@ -207,8 +204,7 @@
     if (SrcExpr->isLvalue(Self.Context) != Expr::LV_Valid) {
       // Cannot cast non-lvalue to reference type.
       Self.Diag(OpRange.getBegin(), diag::err_bad_cxx_cast_rvalue)
-        << "reinterpret_cast" << OrigDestType.getAsString()
-        << SrcExpr->getSourceRange();
+        << "reinterpret_cast" << OrigDestType << SrcExpr->getSourceRange();
       return;
     }
 
@@ -236,8 +232,7 @@
     // lvalue->reference, which is handled above, at least one of the two
     // arguments must be a pointer.
     Self.Diag(OpRange.getBegin(), diag::err_bad_cxx_cast_generic)
-      << "reinterpret_cast" << OrigDestType.getAsString()
-      << OrigSrcType.getAsString() << OpRange;
+      << "reinterpret_cast" << OrigDestType << OrigSrcType << OpRange;
     return;
   }
 
@@ -260,7 +255,7 @@
     if (Self.Context.getTypeSize(SrcType) >
         Self.Context.getTypeSize(DestType)) {
       Self.Diag(OpRange.getBegin(), diag::err_bad_reinterpret_cast_small_int)
-        << OrigDestType.getAsString() << DestRange;
+        << OrigDestType << DestRange;
     }
     return;
   }
@@ -276,16 +271,14 @@
     // With the valid non-pointer conversions out of the way, we can be even
     // more stringent.
     Self.Diag(OpRange.getBegin(), diag::err_bad_cxx_cast_generic)
-      << "reinterpret_cast" << OrigDestType.getAsString()
-      << OrigSrcType.getAsString() << OpRange;
+      << "reinterpret_cast" << OrigDestType << OrigSrcType << OpRange;
     return;
   }
 
   // C++ 5.2.10p2: The reinterpret_cast operator shall not cast away constness.
   if (CastsAwayConstness(Self, SrcType, DestType)) {
     Self.Diag(OpRange.getBegin(), diag::err_bad_cxx_cast_const_away)
-      << "reinterpret_cast" << OrigDestType.getAsString()
-      << OrigSrcType.getAsString() << OpRange;
+      << "reinterpret_cast" << OrigDestType << OrigSrcType << OpRange;
     return;
   }
 
@@ -467,8 +460,7 @@
           // to a const violation.
           if (!DestPointee.isAtLeastAsQualifiedAs(SrcPointee)) {
             Self.Diag(OpRange.getBegin(), diag::err_bad_cxx_cast_const_away)
-              << "static_cast" << DestType.getAsString()
-              << OrigSrcType.getAsString() << OpRange;
+              << "static_cast" << DestType << OrigSrcType << OpRange;
           }
           return;
         }
@@ -481,7 +473,7 @@
   // why every substep failed and, at the end, select the most specific and
   // report that.
   Self.Diag(OpRange.getBegin(), diag::err_bad_cxx_cast_generic)
-    << "static_cast" << DestType.getAsString() << OrigSrcType.getAsString()
+    << "static_cast" << DestType << OrigSrcType
     << OpRange;
 }
 
@@ -581,8 +573,7 @@
   // Must preserve cv, as always.
   if (!DestType.isAtLeastAsQualifiedAs(SrcType)) {
     Self.Diag(OpRange.getBegin(), diag::err_bad_cxx_cast_const_away)
-      << "static_cast" << OrigDestType.getAsString()
-      << OrigSrcType.getAsString() << OpRange;
+      << "static_cast" << OrigDestType << OrigSrcType << OpRange;
     return TSC_Failed;
   }
 
@@ -610,8 +601,7 @@
     }
 
     Self.Diag(OpRange.getBegin(), diag::err_ambiguous_base_to_derived_cast)
-      << SrcType.getUnqualifiedType().getAsString()
-      << DestType.getUnqualifiedType().getAsString()
+      << SrcType.getUnqualifiedType() << DestType.getUnqualifiedType()
       << PathDisplayStr << OpRange;
     return TSC_Failed;
   }
@@ -619,8 +609,7 @@
   if (Paths.getDetectedVirtual() != 0) {
     QualType VirtualBase(Paths.getDetectedVirtual(), 0);
     Self.Diag(OpRange.getBegin(), diag::err_static_downcast_via_virtual)
-      << OrigSrcType.getAsString() << OrigDestType.getAsString()
-      << VirtualBase.getAsString() << OpRange;
+      << OrigSrcType << OrigDestType << VirtualBase << OpRange;
     return TSC_Failed;
   }
 
@@ -680,7 +669,7 @@
     DestPointee = DestReference->getPointeeType();
   } else {
     Self.Diag(OpRange.getBegin(), diag::err_bad_dynamic_cast_not_ref_or_ptr)
-      << OrigDestType.getAsString() << DestRange;
+      << OrigDestType << DestRange;
     return;
   }
 
@@ -690,12 +679,12 @@
   } else if (DestRecord) {
     if (!DestRecord->getDecl()->isDefinition()) {
       Self.Diag(OpRange.getBegin(), diag::err_bad_dynamic_cast_incomplete)
-        << DestPointee.getUnqualifiedType().getAsString() << DestRange;
+        << DestPointee.getUnqualifiedType() << DestRange;
       return;
     }
   } else {
     Self.Diag(OpRange.getBegin(), diag::err_bad_dynamic_cast_not_class)
-      << DestPointee.getUnqualifiedType().getAsString() << DestRange;
+      << DestPointee.getUnqualifiedType() << DestRange;
     return;
   }
 
@@ -710,13 +699,13 @@
       SrcPointee = SrcPointer->getPointeeType();
     } else {
       Self.Diag(OpRange.getBegin(), diag::err_bad_dynamic_cast_not_ptr)
-        << OrigSrcType.getAsString() << SrcExpr->getSourceRange();
+        << OrigSrcType << SrcExpr->getSourceRange();
       return;
     }
   } else {
     if (SrcExpr->isLvalue(Self.Context) != Expr::LV_Valid) {
       Self.Diag(OpRange.getBegin(), diag::err_bad_cxx_cast_rvalue)
-        << "dynamic_cast" << OrigDestType.getAsString() << OpRange;
+        << "dynamic_cast" << OrigDestType << OpRange;
     }
     SrcPointee = SrcType;
   }
@@ -725,14 +714,12 @@
   if (SrcRecord) {
     if (!SrcRecord->getDecl()->isDefinition()) {
       Self.Diag(OpRange.getBegin(), diag::err_bad_dynamic_cast_incomplete)
-        << SrcPointee.getUnqualifiedType().getAsString()
-        << SrcExpr->getSourceRange();
+        << SrcPointee.getUnqualifiedType() << SrcExpr->getSourceRange();
       return;
     }
   } else {
     Self.Diag(OpRange.getBegin(), diag::err_bad_dynamic_cast_not_class)
-      << SrcPointee.getUnqualifiedType().getAsString()
-      << SrcExpr->getSourceRange();
+      << SrcPointee.getUnqualifiedType() << SrcExpr->getSourceRange();
     return;
   }
 
@@ -745,8 +732,7 @@
   // C++ 5.2.7p1: The dynamic_cast operator shall not cast away constness.
   if (!DestPointee.isAtLeastAsQualifiedAs(SrcPointee)) {
     Self.Diag(OpRange.getBegin(), diag::err_bad_cxx_cast_const_away)
-      << "dynamic_cast" << OrigDestType.getAsString()
-      << OrigSrcType.getAsString() << OpRange;
+      << "dynamic_cast" << OrigDestType << OrigSrcType << OpRange;
     return;
   }
 
@@ -760,7 +746,7 @@
   // Upcasts are resolved statically.
   if (DestRecord && Self.IsDerivedFrom(SrcPointee, DestPointee)) {
     Self.CheckDerivedToBaseConversion(SrcPointee, DestPointee,
-      OpRange.getBegin(), OpRange);
+                                      OpRange.getBegin(), OpRange);
     // Diagnostic already emitted on error.
     return;
   }
@@ -770,8 +756,7 @@
   assert(SrcDecl && "Definition missing");
   if (!cast<CXXRecordDecl>(SrcDecl)->isPolymorphic()) {
     Self.Diag(OpRange.getBegin(), diag::err_bad_dynamic_cast_not_polymorphic)
-      << SrcPointee.getUnqualifiedType().getAsString()
-      << SrcExpr->getSourceRange();
+      << SrcPointee.getUnqualifiedType() << SrcExpr->getSourceRange();
   }
 
   // Done. Everything else is run-time checks.
diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp
index 976b4f7..3321ef1 100644
--- a/lib/Sema/SemaOverload.cpp
+++ b/lib/Sema/SemaOverload.cpp
@@ -1481,8 +1481,7 @@
   if (ICS.ConversionKind == ImplicitConversionSequence::BadConversion)
     return Diag(From->getSourceRange().getBegin(),
                 diag::err_implicit_object_parameter_init)
-       << ImplicitParamType.getAsString() << From->getType().getAsString()
-       << From->getSourceRange();
+       << ImplicitParamType << From->getType() << From->getSourceRange();
 
   if (ICS.Standard.Second == ICK_Derived_To_Base &&
       CheckDerivedToBaseConversion(From->getType(), ImplicitParamType,
@@ -2874,7 +2873,7 @@
         if (isReference) FnType = Context.getReferenceType(FnType);
 
         Diag(Cand->Surrogate->getLocation(), diag::err_ovl_surrogate_cand)
-          << FnType.getAsString();
+          << FnType;
       } else {
         // FIXME: We need to get the identifier in here
         // FIXME: Do we want the error message to point at the 
@@ -2885,8 +2884,7 @@
                                     Cand->Conversions.size(),
                                     false, 0);
 
-        Diag(SourceLocation(), diag::err_ovl_builtin_candidate)
-          << FnType.getAsString();
+        Diag(SourceLocation(), diag::err_ovl_builtin_candidate) << FnType;
       }
     }
   }
@@ -3052,7 +3050,7 @@
   case OR_No_Viable_Function:
     Diag(Object->getSourceRange().getBegin(), 
          diag::err_ovl_no_viable_object_call)
-      << Object->getType().getAsString() << (unsigned)CandidateSet.size()
+      << Object->getType() << (unsigned)CandidateSet.size()
       << Object->getSourceRange();
     PrintOverloadCandidates(CandidateSet, /*OnlyViable=*/false);
     break;
@@ -3060,7 +3058,7 @@
   case OR_Ambiguous:
     Diag(Object->getSourceRange().getBegin(),
          diag::err_ovl_ambiguous_object_call)
-      << Object->getType().getAsString() << Object->getSourceRange();
+      << Object->getType() << Object->getSourceRange();
     PrintOverloadCandidates(CandidateSet, /*OnlyViable=*/true);
     break;
   }    
@@ -3212,7 +3210,7 @@
   case OR_No_Viable_Function:
     if (CandidateSet.empty())
       Diag(OpLoc, diag::err_typecheck_member_reference_arrow)
-        << BasePtr->getType().getAsString() << BasePtr->getSourceRange();
+        << BasePtr->getType() << BasePtr->getSourceRange();
     else
       Diag(OpLoc, diag::err_ovl_no_viable_oper)
         << "operator->" << (unsigned)CandidateSet.size()
@@ -3222,8 +3220,7 @@
 
   case OR_Ambiguous:
     Diag(OpLoc,  diag::err_ovl_ambiguous_oper)
-      << "operator->"
-      << BasePtr->getSourceRange();
+      << "operator->" << BasePtr->getSourceRange();
     PrintOverloadCandidates(CandidateSet, /*OnlyViable=*/true);
     return true;
   }
diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp
index 8cd223f..99fdbdb 100644
--- a/lib/Sema/SemaStmt.cpp
+++ b/lib/Sema/SemaStmt.cpp
@@ -223,7 +223,7 @@
       return true;
   } else if (!condType->isScalarType()) // C99 6.8.4.1p1
     return Diag(IfLoc, diag::err_typecheck_statement_requires_scalar)
-      << condType.getAsString() << condExpr->getSourceRange();
+      << condType << condExpr->getSourceRange();
 
   // Warn if the if block has a null body without an else value.
   // this helps prevent bugs due to typos, such as
@@ -362,7 +362,7 @@
   
   if (!CondType->isIntegerType()) { // C99 6.8.4.2p1
     Diag(SwitchLoc, diag::err_typecheck_statement_requires_integer)
-      << CondType.getAsString() << CondExpr->getSourceRange();
+      << CondType << CondExpr->getSourceRange();
     return true;
   }
   
@@ -549,7 +549,7 @@
       return true;
   } else if (!condType->isScalarType()) // C99 6.8.5p2
     return Diag(WhileLoc, diag::err_typecheck_statement_requires_scalar)
-      << condType.getAsString() << condExpr->getSourceRange();
+      << condType << condExpr->getSourceRange();
 
   return new WhileStmt(condExpr, (Stmt*)Body, WhileLoc);
 }
@@ -568,7 +568,7 @@
       return true;
   } else if (!condType->isScalarType()) // C99 6.8.5p2
     return Diag(DoLoc, diag::err_typecheck_statement_requires_scalar)
-      << condType.getAsString() << condExpr->getSourceRange();
+      << condType << condExpr->getSourceRange();
 
   return new DoStmt((Stmt*)Body, condExpr, DoLoc);
 }
@@ -607,7 +607,7 @@
         return true;
     } else if (!SecondType->isScalarType()) // C99 6.8.5p2
       return Diag(ForLoc, diag::err_typecheck_statement_requires_scalar)
-        << SecondType.getAsString() << Second->getSourceRange();
+        << SecondType << Second->getSourceRange();
   }
   return new ForStmt(First, Second, Third, Body, ForLoc);
 }
@@ -646,14 +646,14 @@
     }
     if (!Context.isObjCObjectPointerType(FirstType))
         Diag(ForLoc, diag::err_selector_element_type)
-          << FirstType.getAsString() << First->getSourceRange();
+          << FirstType << First->getSourceRange();
   }
   if (Second) {
     DefaultFunctionArrayConversion(Second);
     QualType SecondType = Second->getType();
     if (!Context.isObjCObjectPointerType(SecondType))
       Diag(ForLoc, diag::err_collection_expr_type)
-        << SecondType.getAsString() << Second->getSourceRange();
+        << SecondType << Second->getSourceRange();
   }
   return new ObjCForCollectionStmt(First, Second, Body, ForLoc, RParenLoc);
 }
@@ -888,7 +888,7 @@
       // FIXME: We currently leak memory here.
       return Diag(InputExpr->getSubExpr()->getLocStart(),
                   diag::err_asm_invalid_type_in_input)
-        << InputExpr->getType().getAsString() << InputConstraint
+        << InputExpr->getType() << InputConstraint
         << InputExpr->getSubExpr()->getSourceRange();
     }
   }
diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp
index 7000c3f..d878e46 100644
--- a/lib/Sema/SemaType.cpp
+++ b/lib/Sema/SemaType.cpp
@@ -204,13 +204,13 @@
         if (!EltTy->isIncompleteOrObjectType()) {
           Diag(DS.getRestrictSpecLoc(),
                diag::err_typecheck_invalid_restrict_invalid_pointee)
-            << EltTy.getAsString() << DS.getSourceRange();
+            << EltTy << DS.getSourceRange();
           TypeQuals &= ~QualType::Restrict; // Remove the restrict qualifier.
         }
       } else {
         Diag(DS.getRestrictSpecLoc(),
              diag::err_typecheck_invalid_restrict_not_pointer)
-          << Result.getAsString() << DS.getSourceRange();
+          << Result << DS.getSourceRange();
         TypeQuals &= ~QualType::Restrict; // Remove the restrict qualifier.
       }
     }
@@ -229,7 +229,7 @@
         Loc = DS.getVolatileSpecLoc();
       }
       Diag(Loc, diag::warn_typecheck_function_qualifiers)
-        << Result.getAsString() << DS.getSourceRange();
+        << Result << DS.getSourceRange();
     }
     
     // C++ [dcl.ref]p1:
@@ -286,7 +286,7 @@
       if ((DeclType.Ptr.TypeQuals & QualType::Restrict) &&
           !T->isIncompleteOrObjectType()) {
         Diag(DeclType.Loc, diag::err_typecheck_invalid_restrict_invalid_pointee)
-          << T.getAsString();
+          << T;
         DeclType.Ptr.TypeQuals &= QualType::Restrict;
       }        
         
@@ -327,7 +327,7 @@
       if (DeclType.Ref.HasRestrict &&
           !T->isIncompleteOrObjectType()) {
         Diag(DeclType.Loc, diag::err_typecheck_invalid_restrict_invalid_pointee)
-          << T.getAsString();
+          << T;
         DeclType.Ref.HasRestrict = false;
       }        
 
@@ -356,7 +356,7 @@
       // reject it (e.g. void ary[7], struct foo ary[7], void ary[7]())
       if (T->isIncompleteType()) { 
         Diag(D.getIdentifierLoc(), diag::err_illegal_decl_array_incomplete_type)
-          << T.getAsString();
+          << T;
         T = Context.IntTy;
         D.setInvalidType(true);
       } else if (T->isFunctionType()) {
@@ -374,20 +374,18 @@
         // If the element type is a struct or union that contains a variadic
         // array, reject it: C99 6.7.2.1p2.
         if (EltTy->getDecl()->hasFlexibleArrayMember()) {
-          Diag(DeclType.Loc, diag::err_flexible_array_in_array)
-            << T.getAsString();
+          Diag(DeclType.Loc, diag::err_flexible_array_in_array) << T;
           T = Context.IntTy;
           D.setInvalidType(true);
         }
       } else if (T->isObjCInterfaceType()) {
-        Diag(DeclType.Loc, diag::warn_objc_array_of_interfaces)
-        << T.getAsString();
+        Diag(DeclType.Loc, diag::warn_objc_array_of_interfaces) << T;
       }
       
       // C99 6.7.5.2p1: The size expression shall have integer type.
       if (ArraySize && !ArraySize->getType()->isIntegerType()) {
         Diag(ArraySize->getLocStart(), diag::err_array_size_non_int)
-          << ArraySize->getType().getAsString() << ArraySize->getSourceRange();
+          << ArraySize->getType() << ArraySize->getSourceRange();
         D.setInvalidType(true);
         delete ArraySize;
         ATI.NumElts = ArraySize = 0;
@@ -436,8 +434,7 @@
       
       // C99 6.7.5.3p1: The return type may not be a function or array type.
       if (T->isArrayType() || T->isFunctionType()) {
-        Diag(DeclType.Loc, diag::err_func_returning_array_function)
-          << T.getAsString();
+        Diag(DeclType.Loc, diag::err_func_returning_array_function) << T;
         T = Context.IntTy;
         D.setInvalidType(true);
       }
