A few TemplateArgumentLoc clean-ups.  Try to remember the Expr for a declaration.
Provide an API for getting the SourceRange of a TAL and use it judiciously.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@85520 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/TemplateBase.cpp b/lib/AST/TemplateBase.cpp
index b136fe0..94e1ca1 100644
--- a/lib/AST/TemplateBase.cpp
+++ b/lib/AST/TemplateBase.cpp
@@ -78,20 +78,20 @@
 // TemplateArgumentLoc Implementation
 //===----------------------------------------------------------------------===//
 
-SourceLocation TemplateArgumentLoc::getLocation() const {
+SourceRange TemplateArgumentLoc::getSourceRange() const {
   switch (Argument.getKind()) {
   case TemplateArgument::Expression:
-    return getSourceExpression()->getExprLoc();
-  case TemplateArgument::Type:
-    return getSourceDeclaratorInfo()->
-      getTypeLoc().getFullSourceRange().getBegin();
+    return getSourceExpression()->getSourceRange();
   case TemplateArgument::Declaration:
+    return getSourceDeclExpression()->getSourceRange();
+  case TemplateArgument::Type:
+    return getSourceDeclaratorInfo()->getTypeLoc().getFullSourceRange();
   case TemplateArgument::Integral:
   case TemplateArgument::Pack:
   case TemplateArgument::Null:
-    return SourceLocation();
+    return SourceRange();
   }
 
   // Silence bonus gcc warning.
-  return SourceLocation();
+  return SourceRange();
 }
diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp
index a2883fa..fb5eef2 100644
--- a/lib/Sema/SemaTemplate.cpp
+++ b/lib/Sema/SemaTemplate.cpp
@@ -1425,7 +1425,8 @@
 
     // We have a template type parameter but the template argument
     // is not a type.
-    Diag(AL.getLocation(), diag::err_template_arg_must_be_type);
+    SourceRange SR = AL.getSourceRange();
+    Diag(SR.getBegin(), diag::err_template_arg_must_be_type) << SR;
     Diag(Param->getLocation(), diag::note_template_param_here);
 
     return true;
@@ -1558,8 +1559,8 @@
           break;
 
         // FIXME: Subst default argument
-        // FIXME: preserve source information
-        Arg = TemplateArgumentLoc(TemplateArgument(TempParm->getDefaultArgument()));
+        Arg = TemplateArgumentLoc(TemplateArgument(TempParm->getDefaultArgument()),
+                                  TempParm->getDefaultArgument());
       }
     } else {
       // Retrieve the template argument produced by the user.
@@ -1646,11 +1647,12 @@
         // We warn specifically about this case, since it can be rather
         // confusing for users.
         QualType T = Arg.getArgument().getAsType();
+        SourceRange SR = Arg.getSourceRange();
         if (T->isFunctionType())
-          Diag(Arg.getLocation(), diag::err_template_arg_nontype_ambig)
-            << T;
+          Diag(SR.getBegin(), diag::err_template_arg_nontype_ambig)
+            << SR << T;
         else
-          Diag(Arg.getLocation(), diag::err_template_arg_must_be_expr);
+          Diag(SR.getBegin(), diag::err_template_arg_must_be_expr) << SR;
         Diag((*Param)->getLocation(), diag::note_template_param_here);
         Invalid = true;
         break;
diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h
index cb7b69f..04bec72 100644
--- a/lib/Sema/TreeTransform.h
+++ b/lib/Sema/TreeTransform.h
@@ -1919,7 +1919,7 @@
   case TemplateArgument::Declaration:
   case TemplateArgument::Integral:
   case TemplateArgument::Pack:
-    Output = TemplateArgumentLoc(Arg);
+    Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
     break;
   }
 }
@@ -1956,7 +1956,20 @@
     Decl *D = getDerived().TransformDecl(Arg.getAsDecl());
     if (!D) return true;
 
-    Output = TemplateArgumentLoc(TemplateArgument(D));
+    Expr *SourceExpr = Input.getSourceDeclExpression();
+    if (SourceExpr) {
+      EnterExpressionEvaluationContext Unevaluated(getSema(),
+                                                   Action::Unevaluated);
+      Sema::OwningExprResult E = getDerived().TransformExpr(SourceExpr);
+      if (E.isInvalid())
+        SourceExpr = NULL;
+      else {
+        SourceExpr = E.takeAs<Expr>();
+        SourceExpr->Retain();
+      }
+    }
+
+    Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr);
     return false;
   }
 
@@ -1973,6 +1986,7 @@
     if (E.isInvalid()) return true;
 
     Expr *ETaken = E.takeAs<Expr>();
+    ETaken->Retain();
     Output = TemplateArgumentLoc(TemplateArgument(ETaken), ETaken);
     return false;
   }
@@ -1987,18 +2001,18 @@
       // FIXME: preserve source information here when we start
       // caring about parameter packs.
 
-      TemplateArgumentLoc Input;
-      TemplateArgumentLoc Output;
-      getDerived().InventTemplateArgumentLoc(*A, Input);
-      if (getDerived().TransformTemplateArgument(Input, Output))
+      TemplateArgumentLoc InputArg;
+      TemplateArgumentLoc OutputArg;
+      getDerived().InventTemplateArgumentLoc(*A, InputArg);
+      if (getDerived().TransformTemplateArgument(InputArg, OutputArg))
         return true;
 
-      TransformedArgs.push_back(Output.getArgument());
+      TransformedArgs.push_back(OutputArg.getArgument());
     }
     TemplateArgument Result;
     Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(),
                            true);
-    Output = TemplateArgumentLoc(Result);
+    Output = TemplateArgumentLoc(Result, Input.getLocInfo());
     return false;
   }
   }
@@ -2764,9 +2778,11 @@
   TemplateSpecializationTypeLoc TL
     = TLB.push<TemplateSpecializationTypeLoc>(QualType(TST, 0));
 
-  TL.setTemplateNameLoc(getDerived().getBaseLocation());
-  TL.setLAngleLoc(SourceLocation());
-  TL.setRAngleLoc(SourceLocation());
+  SourceLocation BaseLoc = getDerived().getBaseLocation();
+
+  TL.setTemplateNameLoc(BaseLoc);
+  TL.setLAngleLoc(BaseLoc);
+  TL.setRAngleLoc(BaseLoc);
   for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
     const TemplateArgument &TA = TST->getArg(i);
     TemplateArgumentLoc TAL;