diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h
index 4fc06f8..7890070 100644
--- a/lib/Sema/Sema.h
+++ b/lib/Sema/Sema.h
@@ -88,6 +88,7 @@
   /// push - Push the current alignment onto the stack, optionally
   /// using the given \arg Name for the record, if non-zero,
   void push(IdentifierInfo *Name) {
+    // FIXME: Why does this push 'Name' as an std::string??
     Stack.push_back(std::make_pair(Alignment,
                                    std::string(Name ? Name->getName() : "")));
   }
diff --git a/lib/Sema/SemaCXXScopeSpec.cpp b/lib/Sema/SemaCXXScopeSpec.cpp
index f22ca0c..1f92b6f 100644
--- a/lib/Sema/SemaCXXScopeSpec.cpp
+++ b/lib/Sema/SemaCXXScopeSpec.cpp
@@ -98,9 +98,9 @@
     DiagID = diag::err_undeclared_var_use;
 
   if (DC)
-    Diag(IdLoc, DiagID, II.getName(), SS.getRange());
+    Diag(IdLoc, DiagID) << &II << SS.getRange();
   else
-    Diag(IdLoc, DiagID, II.getName());
+    Diag(IdLoc, DiagID) << &II;
 
   return 0;
 }
diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp
index df42897..7e6c636 100644
--- a/lib/Sema/SemaChecking.cpp
+++ b/lib/Sema/SemaChecking.cpp
@@ -716,9 +716,8 @@
   // Perform checking for returned stack addresses.
   if (lhsType->isPointerType() || lhsType->isBlockPointerType()) {
     if (DeclRefExpr *DR = EvalAddr(RetValExp))
-      Diag(DR->getLocStart(), diag::warn_ret_stack_addr,
-           DR->getDecl()->getIdentifier()->getName(),
-           RetValExp->getSourceRange());
+      Diag(DR->getLocStart(), diag::warn_ret_stack_addr)
+       << DR->getDecl()->getIdentifier() << RetValExp->getSourceRange();
     
     // Skip over implicit cast expressions when checking for block expressions.
     if (ImplicitCastExpr *IcExpr = 
@@ -734,7 +733,7 @@
     // Check for a reference to the stack
     if (DeclRefExpr *DR = EvalVal(RetValExp))
       Diag(DR->getLocStart(), diag::warn_ret_stack_ref)
-        << DR->getDecl()->getIdentifier()->getName()
+        << DR->getDecl()->getIdentifier()
         << RetValExp->getSourceRange();
   }
 }
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp
index 6e8fb6d..f9d946e 100644
--- a/lib/Sema/SemaDecl.cpp
+++ b/lib/Sema/SemaDecl.cpp
@@ -1127,8 +1127,8 @@
       CheckExtraCXXDefaultArguments(D);
 
     if (R.getTypePtr()->isObjCInterfaceType()) {
-      Diag(D.getIdentifierLoc(), diag::err_statically_allocated_object,
-           D.getIdentifier()->getName());
+      Diag(D.getIdentifierLoc(), diag::err_statically_allocated_object)
+        << D.getIdentifier();
       InvalidDecl = true;
     }
 
@@ -2032,8 +2032,8 @@
   if (!FTI.hasPrototype) {
     for (unsigned i = 0, e = FTI.NumArgs; i != e; ++i) {
       if (FTI.ArgInfo[i].Param == 0) {
-        Diag(FTI.ArgInfo[i].IdentLoc, diag::ext_param_not_declared,
-             FTI.ArgInfo[i].Ident->getName());
+        Diag(FTI.ArgInfo[i].IdentLoc, diag::ext_param_not_declared)
+          << FTI.ArgInfo[i].Ident;
         // Implicitly declare the argument as type 'int' for lack of a better
         // type.
         DeclSpec DS;
@@ -2129,9 +2129,9 @@
                                            IdentifierInfo &II, Scope *S) {
   // Extension in C99.  Legal in C90, but warn about it.
   if (getLangOptions().C99)
-    Diag(Loc, diag::ext_implicit_function_decl, II.getName());
+    Diag(Loc, diag::ext_implicit_function_decl) << &II;
   else
-    Diag(Loc, diag::warn_implicit_function_decl, II.getName());
+    Diag(Loc, diag::warn_implicit_function_decl) << &II;
   
   // FIXME: handle stuff like:
   // void foo() { extern float X(); }
@@ -2222,8 +2222,7 @@
 
     // A tag 'foo::bar' must already exist.
     if (PrevDecl == 0) {
-      Diag(NameLoc, diag::err_not_tag_in_scope, Name->getName(),
-           SS.getRange());
+      Diag(NameLoc, diag::err_not_tag_in_scope) << Name << SS.getRange();
       Name = 0;
       goto CreateNewDecl;
     }
@@ -2245,7 +2244,7 @@
         // Make sure that this wasn't declared as an enum and now used as a
         // struct or something similar.
         if (PrevTagDecl->getTagKind() != Kind) {
-          Diag(KWLoc, diag::err_use_with_wrong_tag, Name->getName());
+          Diag(KWLoc, diag::err_use_with_wrong_tag) << Name;
           Diag(PrevDecl->getLocation(), diag::err_previous_use);
           // Recover by making this an anonymous redefinition.
           Name = 0;
@@ -2257,7 +2256,7 @@
 
           // Diagnose attempts to redefine a tag.
           if (PrevTagDecl->isDefinition()) {
-            Diag(NameLoc, diag::err_redefinition, Name->getName());
+            Diag(NameLoc, diag::err_redefinition) << Name;
             Diag(PrevDecl->getLocation(), diag::err_previous_definition);
             // If this is a redefinition, recover by making this struct be
             // anonymous, which will make any later references get the previous
@@ -2279,7 +2278,7 @@
       if (isDeclInScope(PrevDecl, DC, S)) {
         // The tag name clashes with a namespace name, issue an error and
         // recover by making this tag be anonymous.
-        Diag(NameLoc, diag::err_redefinition_different_kind, Name->getName());
+        Diag(NameLoc, diag::err_redefinition_different_kind) << Name;
         Diag(PrevDecl->getLocation(), diag::err_previous_definition);
         Name = 0;
       }
@@ -2359,8 +2358,7 @@
 
     // A tag 'foo::bar' must already exist.
     if (PrevDecl == 0) {
-      Diag(NameLoc, diag::err_not_tag_in_scope, Name->getName(),
-           SS.getRange());
+      Diag(NameLoc, diag::err_not_tag_in_scope) << Name << SS.getRange();
       Name = 0;
       goto CreateNewDecl;
     }
@@ -2383,7 +2381,7 @@
         // Make sure that this wasn't declared as an enum and now used as a
         // struct or something similar.
         if (PrevTagDecl->getTagKind() != Kind) {
-          Diag(KWLoc, diag::err_use_with_wrong_tag, Name->getName());
+          Diag(KWLoc, diag::err_use_with_wrong_tag) << Name;
           Diag(PrevDecl->getLocation(), diag::err_previous_use);
           // Recover by making this an anonymous redefinition.
           Name = 0;
@@ -2403,7 +2401,7 @@
             // Diagnose attempts to redefine a tag.
             if (RecordDecl* DefRecord =
                 cast<RecordDecl>(PrevTagDecl)->getDefinition(Context)) {
-              Diag(NameLoc, diag::err_redefinition, Name->getName());
+              Diag(NameLoc, diag::err_redefinition) << Name;
               Diag(DefRecord->getLocation(), diag::err_previous_definition);
               // If this is a redefinition, recover by making this struct be
               // anonymous, which will make any later references get the previous
@@ -2430,7 +2428,7 @@
       if (isDeclInScope(PrevDecl, DC, S)) {
         // The tag name clashes with a namespace name, issue an error and
         // recover by making this tag be anonymous.
-        Diag(NameLoc, diag::err_redefinition_different_kind, Name->getName());
+        Diag(NameLoc, diag::err_redefinition_different_kind) << Name;
         Diag(PrevDecl->getLocation(), diag::err_previous_definition);
         Name = 0;
       }
@@ -2520,7 +2518,7 @@
   // Check that ClassName is a valid class
   ObjCInterfaceDecl *Class = getObjCInterfaceDecl(ClassName);
   if (!Class) {
-    Diag(DeclStart, diag::err_undef_interface, ClassName->getName());
+    Diag(DeclStart, diag::err_undef_interface) << ClassName;
     return;
   }
   // Collect the instance variables
@@ -2802,7 +2800,7 @@
     if (IdentifierInfo *II = FD->getIdentifier()) {
       // Detect duplicate member names.
       if (!FieldIDs.insert(II)) {
-        Diag(FD->getLocation(), diag::err_duplicate_member, II->getName());
+        Diag(FD->getLocation(), diag::err_duplicate_member) << II;
         // Find the previous decl.
         SourceLocation PrevLoc;
         for (unsigned i = 0; ; ++i) {
@@ -2867,9 +2865,9 @@
            "Received TagDecl when not in C++!");
     if (!isa<TagDecl>(PrevDecl) && isDeclInScope(PrevDecl, CurContext, S)) {
       if (isa<EnumConstantDecl>(PrevDecl))
-        Diag(IdLoc, diag::err_redefinition_of_enumerator, Id->getName());
+        Diag(IdLoc, diag::err_redefinition_of_enumerator) << Id;
       else
-        Diag(IdLoc, diag::err_redefinition, Id->getName());
+        Diag(IdLoc, diag::err_redefinition) << Id;
       Diag(PrevDecl->getLocation(), diag::err_previous_definition);
       delete Val;
       return 0;
@@ -2885,8 +2883,7 @@
     // C99 6.7.2.2p2: Make sure we have an integer constant expression.
     SourceLocation ExpLoc;
     if (!Val->isIntegerConstantExpr(EnumVal, Context, &ExpLoc)) {
-      Diag(ExpLoc, diag::err_enum_value_not_integer_constant_expr, 
-           Id->getName());
+      Diag(ExpLoc, diag::err_enum_value_not_integer_constant_expr) << Id;
       delete Val;
       Val = 0;  // Just forget about it.
     } else {
@@ -3200,7 +3197,7 @@
   // Otherwise, find the named record.
   for (unsigned i = Stack.size(); i != 0; ) {
     --i;
-    if (strcmp(Stack[i].second.c_str(), Name->getName()) == 0) {
+    if (Name->isName(Stack[i].second.c_str())) {
       // Found it, pop up to and including this record.
       Alignment = Stack[i].first;
       Stack.erase(Stack.begin() + i, Stack.end());
diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp
index d83ba85..4bf55dd 100644
--- a/lib/Sema/SemaDeclAttr.cpp
+++ b/lib/Sema/SemaDeclAttr.cpp
@@ -145,7 +145,7 @@
   QualType curType = tDecl->getUnderlyingType();
   // check the attribute arguments.
   if (Attr.getNumArgs() != 1) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << "1";
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
     return;
   }
   Expr *sizeExpr = static_cast<Expr *>(Attr.getArg(0));
@@ -200,7 +200,7 @@
     
   // Check the attribute arugments.
   if (Attr.getNumArgs() != 1) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << "1";
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
     return;
   }
   Expr *sizeExpr = static_cast<Expr *>(Attr.getArg(0));
@@ -262,7 +262,7 @@
 static void HandlePackedAttr(Decl *d, const AttributeList &Attr, Sema &S) {
   // check the attribute arguments.
   if (Attr.getNumArgs() > 0) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << "0";
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
     return;
   }
   
@@ -274,18 +274,17 @@
     if (!FD->getType()->isIncompleteType() &&
         S.Context.getTypeAlign(FD->getType()) <= 8)
       S.Diag(Attr.getLoc(), diag::warn_attribute_ignored_for_field_of_type)
-        << Attr.getName()->getName() << FD->getType().getAsString();
+        << Attr.getName() << FD->getType().getAsString();
     else
       FD->addAttr(new PackedAttr(1));
   } else
-    S.Diag(Attr.getLoc(), diag::warn_attribute_ignored)
-      << Attr.getName()->getName();
+    S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
 }
 
 static void HandleIBOutletAttr(Decl *d, const AttributeList &Attr, Sema &S) {
   // check the attribute arguments.
   if (Attr.getNumArgs() > 0) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << "0";
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
     return;
   }
   
@@ -370,7 +369,7 @@
 static void HandleAliasAttr(Decl *d, const AttributeList &Attr, Sema &S) {
   // check the attribute arguments.
   if (Attr.getNumArgs() != 1) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << "1";
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
     return;
   }
   
@@ -380,7 +379,7 @@
   
   if (Str == 0 || Str->isWide()) {
     S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string)
-      << "alias" << "1";
+      << "alias" << 1;
     return;
   }
   
@@ -396,7 +395,7 @@
                                    Sema &S) {
   // check the attribute arguments.
   if (Attr.getNumArgs() != 0) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << "0";
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
     return;
   }
   
@@ -406,7 +405,7 @@
 static void HandleNoReturnAttr(Decl *d, const AttributeList &Attr, Sema &S) {
   // check the attribute arguments.
   if (Attr.getNumArgs() != 0) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << "0";
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
     return;
   }
 
@@ -422,7 +421,7 @@
 static void HandleUnusedAttr(Decl *d, const AttributeList &Attr, Sema &S) {
   // check the attribute arguments.
   if (Attr.getNumArgs() != 0) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << "0";
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
     return;
   }
   
@@ -449,7 +448,7 @@
     llvm::APSInt Idx(32);
     if (!E->isIntegerConstantExpr(Idx, S.Context)) {
       S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_int)
-        << "constructor" << "1" << E->getSourceRange();
+        << "constructor" << 1 << E->getSourceRange();
       return;
     }
     priority = Idx.getZExtValue();
@@ -479,7 +478,7 @@
     llvm::APSInt Idx(32);
     if (!E->isIntegerConstantExpr(Idx, S.Context)) {
       S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_int)
-        << "destructor" << "1" << E->getSourceRange();
+        << "destructor" << 1 << E->getSourceRange();
       return;
     }
     priority = Idx.getZExtValue();
@@ -497,7 +496,7 @@
 static void HandleDeprecatedAttr(Decl *d, const AttributeList &Attr, Sema &S) {
   // check the attribute arguments.
   if (Attr.getNumArgs() != 0) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << "0";
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
     return;
   }
   
@@ -507,7 +506,7 @@
 static void HandleVisibilityAttr(Decl *d, const AttributeList &Attr, Sema &S) {
   // check the attribute arguments.
   if (Attr.getNumArgs() != 1) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << "1";
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
     return;
   }
   
@@ -517,7 +516,7 @@
   
   if (Str == 0 || Str->isWide()) {
     S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string)
-      << "visibility" << "1";
+      << "visibility" << 1;
     return;
   }
   
@@ -545,28 +544,24 @@
 static void HandleObjCGCAttr(Decl *d, const AttributeList &Attr, Sema &S) {
   if (!Attr.getParameterName()) {    
     S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string)
-      << "objc_gc" << "1";
+      << "objc_gc" << 1;
     return;
   }
   
   if (Attr.getNumArgs() != 0) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments)
-      << "1";
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
     return;
   }
   
-  const char *TypeStr = Attr.getParameterName()->getName();
-  unsigned TypeLen = Attr.getParameterName()->getLength();
   
   ObjCGCAttr::GCAttrTypes type;
-  
-  if (TypeLen == 4 && !memcmp(TypeStr, "weak", 4))
+  if (Attr.getParameterName()->isName("weak"))
     type = ObjCGCAttr::Weak;
-  else if (TypeLen == 6 && !memcmp(TypeStr, "strong", 6))
+  else if (Attr.getParameterName()->isName("strong"))
     type = ObjCGCAttr::Strong;
   else {
     S.Diag(Attr.getLoc(), diag::warn_attribute_type_not_supported)
-      << "objc_gc" << TypeStr;
+      << "objc_gc" << Attr.getParameterName();
     return;
   }
   
@@ -576,25 +571,21 @@
 static void HandleBlocksAttr(Decl *d, const AttributeList &Attr, Sema &S) {
   if (!Attr.getParameterName()) {    
     S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string)
-      << "blocks" << "1";
+      << "blocks" << 1;
     return;
   }
   
   if (Attr.getNumArgs() != 0) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments)
-      << "1";
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
     return;
   }
-  const char *TypeStr = Attr.getParameterName()->getName();
-  unsigned TypeLen = Attr.getParameterName()->getLength();
   
   BlocksAttr::BlocksAttrTypes type;
-  
-  if (TypeLen == 5 && !memcmp(TypeStr, "byref", 5))
+  if (Attr.getParameterName()->isName("byref"))
     type = BlocksAttr::ByRef;
   else {
     S.Diag(Attr.getLoc(), diag::warn_attribute_type_not_supported)
-      << "blocks" << TypeStr;
+      << "blocks" << Attr.getParameterName();
     return;
   }
   
@@ -615,7 +606,7 @@
     llvm::APSInt Idx(32);
     if (!E->isIntegerConstantExpr(Idx, S.Context)) {
       S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_int)
-       << "sentinel" << "1" << E->getSourceRange();
+       << "sentinel" << 1 << E->getSourceRange();
       return;
     }
     sentinel = Idx.getZExtValue();
@@ -633,7 +624,7 @@
     llvm::APSInt Idx(32);
     if (!E->isIntegerConstantExpr(Idx, S.Context)) {
       S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_int)
-        << "sentinel" << "2" << E->getSourceRange();
+        << "sentinel" << 2 << E->getSourceRange();
       return;
     }
     nullPos = Idx.getZExtValue();
@@ -670,7 +661,7 @@
 static void HandleWeakAttr(Decl *d, const AttributeList &Attr, Sema &S) {
   // check the attribute arguments.
   if (Attr.getNumArgs() != 0) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << "0";
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
     return;
   }
   
@@ -680,7 +671,7 @@
 static void HandleDLLImportAttr(Decl *d, const AttributeList &Attr, Sema &S) {
   // check the attribute arguments.
   if (Attr.getNumArgs() != 0) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << "0";
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
     return;
   }
   
@@ -690,7 +681,7 @@
 static void HandleDLLExportAttr(Decl *d, const AttributeList &Attr, Sema &S) {
   // check the attribute arguments.
   if (Attr.getNumArgs() != 0) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << "0";
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
     return;
   }
   
@@ -700,7 +691,7 @@
 static void HandleStdCallAttr(Decl *d, const AttributeList &Attr, Sema &S) {
   // check the attribute arguments.
   if (Attr.getNumArgs() != 0) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << "0";
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
     return;
   }
   
@@ -710,7 +701,7 @@
 static void HandleFastCallAttr(Decl *d, const AttributeList &Attr, Sema &S) {
   // check the attribute arguments.
   if (Attr.getNumArgs() != 0) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << "0";
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
     return;
   }
   
@@ -720,7 +711,7 @@
 static void HandleNothrowAttr(Decl *d, const AttributeList &Attr, Sema &S) {
   // check the attribute arguments.
   if (Attr.getNumArgs() != 0) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << "0";
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
     return;
   }
   
@@ -730,7 +721,7 @@
 static void HandleConstAttr(Decl *d, const AttributeList &Attr, Sema &S) {
   // check the attribute arguments.
   if (Attr.getNumArgs() != 0) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << "0";
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
     return;
   }
   
@@ -740,7 +731,7 @@
 static void HandlePureAttr(Decl *d, const AttributeList &Attr, Sema &S) {
   // check the attribute arguments.
   if (Attr.getNumArgs() != 0) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << "0";
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
     return;
   }
   
@@ -753,12 +744,12 @@
 
   if (!Attr.getParameterName()) {
     S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string)
-      << "format" << "1";
+      << "format" << 1;
     return;
   }
 
   if (Attr.getNumArgs() != 2) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << "3";
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 3;
     return;
   }
 
@@ -812,13 +803,13 @@
   llvm::APSInt Idx(32);
   if (!IdxExpr->isIntegerConstantExpr(Idx, S.Context)) {
     S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_int)
-      << "format" << "2" << IdxExpr->getSourceRange();
+      << "format" << 2 << IdxExpr->getSourceRange();
     return;
   }
 
   if (Idx.getZExtValue() < FirstIdx || Idx.getZExtValue() > NumArgs) {
     S.Diag(Attr.getLoc(), diag::err_attribute_argument_out_of_bounds)
-      << "format" << "2" << IdxExpr->getSourceRange();
+      << "format" << 2 << IdxExpr->getSourceRange();
     return;
   }
 
@@ -858,7 +849,7 @@
   llvm::APSInt FirstArg(32);
   if (!FirstArgExpr->isIntegerConstantExpr(FirstArg, S.Context)) {
     S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_int)
-      << "format" << "3" << FirstArgExpr->getSourceRange();
+      << "format" << 3 << FirstArgExpr->getSourceRange();
     return;
   }
 
@@ -872,8 +863,8 @@
     }
   }
 
-  // strftime requires FirstArg to be 0 because it doesn't read from any variable
-  // the input is just the current time + the format string
+  // strftime requires FirstArg to be 0 because it doesn't read from any
+  // variable the input is just the current time + the format string.
   if (is_strftime) {
     if (FirstArg != 0) {
       S.Diag(Attr.getLoc(), diag::err_format_strftime_third_parameter)
@@ -883,7 +874,7 @@
   // if 0 it disables parameter checking (to use with e.g. va_list)
   } else if (FirstArg != 0 && FirstArg != NumArgs) {
     S.Diag(Attr.getLoc(), diag::err_attribute_argument_out_of_bounds)
-      << "format" << "3" << FirstArgExpr->getSourceRange();
+      << "format" << 3 << FirstArgExpr->getSourceRange();
     return;
   }
 
@@ -895,7 +886,7 @@
                                        Sema &S) {
   // check the attribute arguments.
   if (Attr.getNumArgs() != 0) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << "0";
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
     return;
   }
 
@@ -932,7 +923,7 @@
 static void HandleAnnotateAttr(Decl *d, const AttributeList &Attr, Sema &S) {
   // check the attribute arguments.
   if (Attr.getNumArgs() != 1) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << "1";
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
     return;
   }
   Expr *argExpr = static_cast<Expr *>(Attr.getArg(0));
@@ -951,7 +942,7 @@
 static void HandleAlignedAttr(Decl *d, const AttributeList &Attr, Sema &S) {
   // check the attribute arguments.
   if (Attr.getNumArgs() > 1) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << "1";
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
     return;
   }
 
@@ -986,7 +977,7 @@
 
   // Check that there aren't any arguments
   if (Attr.getNumArgs() != 0) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << "0";
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
     return;
   }
 
@@ -1048,10 +1039,10 @@
   QualType NewTy;
   switch (DestWidth) {
   case 0:
-    S.Diag(Attr.getLoc(), diag::err_unknown_machine_mode) << Name->getName();
+    S.Diag(Attr.getLoc(), diag::err_unknown_machine_mode) << Name;
     return;
   default:
-    S.Diag(Attr.getLoc(), diag::err_unsupported_machine_mode) <<Name->getName();
+    S.Diag(Attr.getLoc(), diag::err_unsupported_machine_mode) << Name;
     return;
   case 8:
     assert(IntegerMode);
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp
index b62aa9a..bf160ac 100644
--- a/lib/Sema/SemaDeclCXX.cpp
+++ b/lib/Sema/SemaDeclCXX.cpp
@@ -644,13 +644,13 @@
   // It didn't name a member, so see if it names a class.
   TypeTy *BaseTy = isTypeName(*MemberOrBase, S, 0/*SS*/);
   if (!BaseTy)
-    return Diag(IdLoc, diag::err_mem_init_not_member_or_class,
-                MemberOrBase->getName(), SourceRange(IdLoc, RParenLoc));
+    return Diag(IdLoc, diag::err_mem_init_not_member_or_class)
+      << MemberOrBase << SourceRange(IdLoc, RParenLoc);
   
   QualType BaseType = Context.getTypeDeclType((TypeDecl *)BaseTy);
   if (!BaseType->isRecordType())
-    return Diag(IdLoc, diag::err_base_init_does_not_name_class,
-                BaseType.getAsString(), SourceRange(IdLoc, RParenLoc));
+    return Diag(IdLoc, diag::err_base_init_does_not_name_class)
+      << BaseType.getAsString() << SourceRange(IdLoc, RParenLoc);
 
   // C++ [class.base.init]p2:
   //   [...] Unless the mem-initializer-id names a nonstatic data
@@ -697,8 +697,8 @@
   //   a direct non-virtual base class and an inherited virtual base
   //   class, the mem-initializer is ill-formed.
   if (DirectBaseSpec && VirtualBaseSpec)
-    return Diag(IdLoc, diag::err_base_init_direct_and_virtual,
-                MemberOrBase->getName(), SourceRange(IdLoc, RParenLoc));
+    return Diag(IdLoc, diag::err_base_init_direct_and_virtual)
+      << MemberOrBase << SourceRange(IdLoc, RParenLoc);
 
   return new CXXBaseOrMemberInitializer(BaseType, (Expr **)Args, NumArgs);
 }
diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp
index 07d25f0..6e90e84 100644
--- a/lib/Sema/SemaDeclObjC.cpp
+++ b/lib/Sema/SemaDeclObjC.cpp
@@ -67,8 +67,7 @@
   // Check for another declaration kind with the same name.
   Decl *PrevDecl = LookupDecl(ClassName, Decl::IDNS_Ordinary, TUScope);
   if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {
-    Diag(ClassLoc, diag::err_redefinition_different_kind)
-      << ClassName->getName();
+    Diag(ClassLoc, diag::err_redefinition_different_kind) << ClassName;
     Diag(PrevDecl->getLocation(), diag::err_previous_definition);
   }
   
@@ -100,20 +99,20 @@
     // Check if a different kind of symbol declared in this scope.
     PrevDecl = LookupDecl(SuperName, Decl::IDNS_Ordinary, TUScope);
     if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {
-      Diag(SuperLoc, diag::err_redefinition_different_kind)
-        << SuperName->getName();
+      Diag(SuperLoc, diag::err_redefinition_different_kind) << SuperName;
       Diag(PrevDecl->getLocation(), diag::err_previous_definition);
     }
     else {
       // Check that super class is previously defined
       SuperClassEntry = dyn_cast_or_null<ObjCInterfaceDecl>(PrevDecl); 
-                              
-      if (!SuperClassEntry || SuperClassEntry->isForwardDecl()) {
+
+      if (!SuperClassEntry)
         Diag(SuperLoc, diag::err_undef_superclass)
-          << (SuperClassEntry ? SuperClassEntry->getName() 
-                              : SuperName->getName())
-          << ClassName->getName() << SourceRange(AtInterfaceLoc, ClassLoc);
-      }
+          << SuperName << ClassName << SourceRange(AtInterfaceLoc, ClassLoc);
+      else if (SuperClassEntry->isForwardDecl())
+        Diag(SuperLoc, diag::err_undef_superclass)
+          << SuperClassEntry->getName() << ClassName
+          << SourceRange(AtInterfaceLoc, ClassLoc);
     }
     IDecl->setSuperClass(SuperClassEntry);
     IDecl->setSuperClassLoc(SuperLoc);
@@ -147,8 +146,7 @@
       Diag(ADecl->getLocation(), diag::warn_previous_declaration);
     }
     else {
-      Diag(AliasLocation, diag::err_conflicting_aliasing_type)
-        << AliasName->getName();
+      Diag(AliasLocation, diag::err_conflicting_aliasing_type) << AliasName;
       Diag(ADecl->getLocation(), diag::err_previous_declaration);
     }
     return 0;
@@ -157,7 +155,7 @@
   Decl *CDeclU = LookupDecl(ClassName, Decl::IDNS_Ordinary, TUScope);
   ObjCInterfaceDecl *CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(CDeclU);
   if (CDecl == 0) {
-    Diag(ClassLocation, diag::warn_undef_interface) << ClassName->getName();
+    Diag(ClassLocation, diag::warn_undef_interface) << ClassName;
     if (CDeclU)
       Diag(CDeclU->getLocation(), diag::warn_previous_declaration);
     return 0;
@@ -189,8 +187,7 @@
   if (PDecl) {
     // Protocol already seen. Better be a forward protocol declaration
     if (!PDecl->isForwardDecl()) {
-      Diag(ProtocolLoc, diag::err_duplicate_protocol_def)
-        << ProtocolName->getName();
+      Diag(ProtocolLoc, diag::err_duplicate_protocol_def) << ProtocolName;
       // Just return the protocol we already had.
       // FIXME: don't leak the objects passed in!
       return PDecl;
@@ -226,7 +223,7 @@
     ObjCProtocolDecl *PDecl = ObjCProtocols[ProtocolId[i].first];
     if (!PDecl) {
       Diag(ProtocolId[i].second, diag::err_undeclared_protocol)
-        << ProtocolId[i].first->getName();
+        << ProtocolId[i].first;
       continue;
     }
 
@@ -234,7 +231,7 @@
     // case, do it.
     if (WarnOnDeclarations && PDecl->isForwardDecl())
       Diag(ProtocolId[i].second, diag::warn_undef_protocolref)
-        << ProtocolId[i].first->getName();
+        << ProtocolId[i].first;
     Protocols.push_back(PDecl); 
   }
 }
@@ -400,7 +397,7 @@
   
   /// Check that class of this category is already completely declared.
   if (!IDecl || IDecl->isForwardDecl())
-    Diag(ClassLoc, diag::err_undef_interface) << ClassName->getName();
+    Diag(ClassLoc, diag::err_undef_interface) << ClassName;
   else {
     /// Check for duplicate interface declaration for this category
     ObjCCategoryDecl *CDeclChain;
@@ -408,7 +405,7 @@
          CDeclChain = CDeclChain->getNextClassCategory()) {
       if (CategoryName && CDeclChain->getIdentifier() == CategoryName) {
         Diag(CategoryLoc, diag::warn_dup_category_def)
-          << ClassName->getName() << CategoryName->getName();
+          << ClassName << CategoryName;
         break;
       }
     }
@@ -437,7 +434,7 @@
     ObjCCategoryImplDecl::Create(Context, AtCatImplLoc, CatName, IDecl);
   /// Check that class of this category is already completely declared.
   if (!IDecl || IDecl->isForwardDecl())
-    Diag(ClassLoc, diag::err_undef_interface) << ClassName->getName();
+    Diag(ClassLoc, diag::err_undef_interface) << ClassName;
 
   /// TODO: Check that CatName, category name, is not used in another
   // implementation.
@@ -456,15 +453,14 @@
   // Check for another declaration kind with the same name.
   Decl *PrevDecl = LookupDecl(ClassName, Decl::IDNS_Ordinary, TUScope);
   if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {
-    Diag(ClassLoc, diag::err_redefinition_different_kind,
-         ClassName->getName());
+    Diag(ClassLoc, diag::err_redefinition_different_kind) << ClassName;
     Diag(PrevDecl->getLocation(), diag::err_previous_definition);
   }
   else {
     // Is there an interface declaration of this class; if not, warn!
     IDecl = dyn_cast_or_null<ObjCInterfaceDecl>(PrevDecl); 
     if (!IDecl)
-      Diag(ClassLoc, diag::warn_undef_interface) << ClassName->getName();
+      Diag(ClassLoc, diag::warn_undef_interface) << ClassName;
   }
   
   // Check that super class name is valid class name
@@ -473,20 +469,19 @@
     // Check if a different kind of symbol declared in this scope.
     PrevDecl = LookupDecl(SuperClassname, Decl::IDNS_Ordinary, TUScope);
     if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {
-      Diag(SuperClassLoc, diag::err_redefinition_different_kind,
-           SuperClassname->getName());
+      Diag(SuperClassLoc, diag::err_redefinition_different_kind)
+        << SuperClassname;
       Diag(PrevDecl->getLocation(), diag::err_previous_definition);
-    }
-    else {
+    } else {
       SDecl = dyn_cast_or_null<ObjCInterfaceDecl>(PrevDecl); 
       if (!SDecl)
-        Diag(SuperClassLoc, diag::err_undef_superclass, 
-             SuperClassname->getName(), ClassName->getName());
+        Diag(SuperClassLoc, diag::err_undef_superclass)
+          << SuperClassname << ClassName;
       else if (IDecl && IDecl->getSuperClass() != SDecl) {
         // This implementation and its interface do not have the same
         // super class.
-        Diag(SuperClassLoc, diag::err_conflicting_super_class, 
-             SDecl->getName());
+        Diag(SuperClassLoc, diag::err_conflicting_super_class)
+          << SDecl->getName();
         Diag(SDecl->getLocation(), diag::err_previous_definition);
       }
     }
@@ -518,7 +513,7 @@
   // Check that there is no duplicate implementation of this class.
   if (ObjCImplementations[ClassName])
     // FIXME: Don't leak everything!
-    Diag(ClassLoc, diag::err_dup_implementation_class, ClassName->getName());
+    Diag(ClassLoc, diag::err_dup_implementation_class) << ClassName;
   else // add it to the list.
     ObjCImplementations[ClassName] = IMPDecl;
   return IMPDecl;
@@ -558,17 +553,17 @@
     if (Context.getCanonicalType(ImplIvar->getType()) !=
         Context.getCanonicalType(ClsIvar->getType())) {
       Diag(ImplIvar->getLocation(), diag::err_conflicting_ivar_type)
-        << ImplIvar->getIdentifier()->getName();
+        << ImplIvar->getIdentifier();
       Diag(ClsIvar->getLocation(), diag::err_previous_definition)
-        << ClsIvar->getIdentifier()->getName();
+        << ClsIvar->getIdentifier();
     }
     // TODO: Two mismatched (unequal width) Ivar bitfields should be diagnosed 
     // as error.
     else if (ImplIvar->getIdentifier() != ClsIvar->getIdentifier()) {
       Diag(ImplIvar->getLocation(), diag::err_conflicting_ivar_name)
-        << ImplIvar->getIdentifier()->getName();
+        << ImplIvar->getIdentifier();
       Diag(ClsIvar->getLocation(), diag::err_previous_definition)
-        << ClsIvar->getIdentifier()->getName();
+        << ClsIvar->getIdentifier();
       return;
     }
     --numIvars;
@@ -729,8 +724,7 @@
       // FIXME: Make an extension? 
       TypedefDecl *TDD = dyn_cast<TypedefDecl>(PrevDecl);
       if (!TDD || !isa<ObjCInterfaceType>(TDD->getUnderlyingType())) {
-        Diag(AtClassLoc, diag::err_redefinition_different_kind,
-             IdentList[i]->getName());
+        Diag(AtClassLoc, diag::err_redefinition_different_kind) << IdentList[i];
         Diag(PrevDecl->getLocation(), diag::err_previous_definition);
       }
     }
@@ -1314,8 +1308,7 @@
     // Check that this is a previously declared 'ivar' in 'IDecl' interface
     Ivar = IDecl->FindIvarDeclaration(PropertyIvar);
     if (!Ivar) {
-      Diag(PropertyLoc, diag::error_missing_property_ivar_decl, 
-           PropertyId->getName());
+      Diag(PropertyLoc, diag::error_missing_property_ivar_decl) << PropertyId;
       return 0;
     }
     QualType PropType = Context.getCanonicalType(property->getType());
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 853ecaf..9a77e4f 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -900,7 +900,7 @@
   // vec4.b is a float, vec4.xy is a vec2, vec4.rgb is a vec3, etc.
   // vec4.hi, vec4.lo, vec4.e, and vec4.o all return vec2.
   unsigned CompSize = SpecialComponent ? vecType->getNumElements() / 2
-                                       : strlen(CompName.getName());
+                                       : CompName.getLength();
   if (CompSize == 1)
     return vecType->getElementType();
     
@@ -921,16 +921,11 @@
 // live?
 static IdentifierInfo *constructSetterName(IdentifierTable &Idents,
                                            const IdentifierInfo *Name) {
-  unsigned N = Name->getLength();
-  char *SelectorName = new char[3 + N];
-  memcpy(SelectorName, "set", 3);
-  memcpy(&SelectorName[3], Name->getName(), N);
+  llvm::SmallString<100> SelectorName;
+  SelectorName += "set";
+  SelectorName.append(Name->getName(), Name->getName()+Name->getLength());
   SelectorName[3] = toupper(SelectorName[3]);
-
-  IdentifierInfo *Setter = 
-    &Idents.get(SelectorName, &SelectorName[3 + N]);
-  delete[] SelectorName;
-  return Setter;
+  return &Idents.get(&SelectorName[0], &SelectorName[SelectorName.size()]);
 }
 
 Action::ExprResult Sema::
@@ -967,7 +962,7 @@
     FieldDecl *MemberDecl = RDecl->getMember(&Member);
     if (!MemberDecl)
       return Diag(MemberLoc, diag::err_typecheck_no_member)
-               << Member.getName() << BaseExpr->getSourceRange();
+               << &Member << BaseExpr->getSourceRange();
 
     // Figure out the type of the member; see C99 6.5.2.3p3
     // FIXME: Handle address space modifiers
@@ -991,7 +986,7 @@
       return new ObjCIvarRefExpr(IV, IV->getType(), MemberLoc, BaseExpr, 
                                  OpKind == tok::arrow);
     return Diag(MemberLoc, diag::err_typecheck_member_reference_ivar)
-             << IFTy->getDecl()->getName() << Member.getName()
+             << IFTy->getDecl()->getName() << &Member
              << BaseExpr->getSourceRange();
   }
   
@@ -3106,9 +3101,8 @@
     RecordDecl *RD = RC->getDecl();
     FieldDecl *MemberDecl = RD->getMember(OC.U.IdentInfo);
     if (!MemberDecl)
-      return Diag(BuiltinLoc, diag::err_typecheck_no_member,
-                  OC.U.IdentInfo->getName(),
-                  SourceRange(OC.LocStart, OC.LocEnd));
+      return Diag(BuiltinLoc, diag::err_typecheck_no_member)
+       << OC.U.IdentInfo << SourceRange(OC.LocStart, OC.LocEnd);
     
     // FIXME: C++: Verify that MemberDecl isn't a static field.
     // FIXME: Verify that MemberDecl isn't a bitfield.
diff --git a/lib/Sema/SemaExprObjC.cpp b/lib/Sema/SemaExprObjC.cpp
index fff5ae4..8bacea1 100644
--- a/lib/Sema/SemaExprObjC.cpp
+++ b/lib/Sema/SemaExprObjC.cpp
@@ -96,7 +96,7 @@
                                                    SourceLocation RParenLoc) {
   ObjCProtocolDecl* PDecl = ObjCProtocols[ProtocolId];
   if (!PDecl) {
-    Diag(ProtoLoc, diag::err_undeclared_protocol) << ProtocolId->getName();
+    Diag(ProtoLoc, diag::err_undeclared_protocol) << ProtocolId;
     return true;
   }
   
diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp
index 4b239be..72901f1 100644
--- a/lib/Sema/SemaStmt.cpp
+++ b/lib/Sema/SemaStmt.cpp
@@ -756,26 +756,30 @@
                                getCurMethodDecl()->getResultType();
 
   if (FnRetType->isVoidType()) {
-    if (RetValExp) // C99 6.8.6.4p1 (ext_ since GCC warns)
-      Diag(ReturnLoc, diag::ext_return_has_expr,
-           ( getCurFunctionDecl() ?
-                getCurFunctionDecl()->getIdentifier()->getName() :
-                getCurMethodDecl()->getSelector().getName()       ),
-           RetValExp->getSourceRange());
-    return new ReturnStmt(ReturnLoc, RetValExp);
-  } else {
-    if (!RetValExp) {
-      const char *funcName =
-                getCurFunctionDecl() ? 
-                   getCurFunctionDecl()->getIdentifier()->getName() :
-                   getCurMethodDecl()->getSelector().getName().c_str();
-      if (getLangOptions().C99)  // C99 6.8.6.4p1 (ext_ since GCC warns)
-        Diag(ReturnLoc, diag::ext_return_missing_expr, funcName);
-      else  // C90 6.6.6.4p4
-        Diag(ReturnLoc, diag::warn_return_missing_expr, funcName);
-      return new ReturnStmt(ReturnLoc, (Expr*)0);
+    if (RetValExp) {// C99 6.8.6.4p1 (ext_ since GCC warns)
+      if (FunctionDecl *FD = getCurFunctionDecl())
+        Diag(ReturnLoc, diag::ext_return_has_expr)
+          << FD->getIdentifier() << RetValExp->getSourceRange();
+      else 
+        Diag(ReturnLoc, diag::ext_return_has_expr)
+          << getCurMethodDecl()->getSelector().getName()
+          << RetValExp->getSourceRange();
     }
+    return new ReturnStmt(ReturnLoc, RetValExp);
   }
+  
+  if (!RetValExp) {
+    unsigned DiagID = diag::warn_return_missing_expr;  // C90 6.6.6.4p4
+    // C99 6.8.6.4p1 (ext_ since GCC warns)
+    if (getLangOptions().C99) DiagID = diag::ext_return_missing_expr;
+
+    if (FunctionDecl *FD = getCurFunctionDecl())
+      Diag(ReturnLoc, DiagID) << FD->getIdentifier();
+    else
+      Diag(ReturnLoc, DiagID) << getCurMethodDecl()->getSelector().getName();
+    return new ReturnStmt(ReturnLoc, (Expr*)0);
+  }
+  
   // we have a non-void function with an expression, continue checking
   QualType RetValType = RetValExp->getType();
 
