]> granicus.if.org Git - clang/commitdiff
When default-initializing a TemplateArgumentLocInfo, make sure that we
authorDouglas Gregor <dgregor@apple.com>
Thu, 6 Jan 2011 00:33:28 +0000 (00:33 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 6 Jan 2011 00:33:28 +0000 (00:33 +0000)
initialize *all* of the bits to zero. Also, when the pattern of a
template argument pack expansion, make sure to set the ellipsis
location along all paths.

This should clear up the valgrind failure that popped up in Clang.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122931 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/TemplateBase.h
include/clang/AST/TypeLoc.h
lib/AST/TemplateBase.cpp

index 7f3e591a96535c352fbb78e01cad7ca424d6b02f..22ca164d384abea54e858e1376e773f48b7afcfc 100644 (file)
@@ -330,7 +330,7 @@ private:
   };
 
 public:
-  TemplateArgumentLocInfo() : Expression(0) {}
+  TemplateArgumentLocInfo();
   
   TemplateArgumentLocInfo(TypeSourceInfo *TInfo) : Declarator(TInfo) {}
   
index 81ece1799b9de5c7e77c673619dab69818eb4648..3480681fe161f233c8319b34cfd91b2566a73f01 100644 (file)
@@ -1115,8 +1115,11 @@ public:
                                 const TemplateArgument *Args,
                                 TemplateArgumentLocInfo *ArgInfos,
                                 SourceLocation Loc) {
-    for (unsigned i = 0, e = NumArgs; i != e; ++i)
+    for (unsigned i = 0, e = NumArgs; i != e; ++i) {
+      // FIXME: We can generate better location info here for type arguments,
+      // template template arguments, and template template pack expansions (?).
       ArgInfos[i] = TemplateArgumentLocInfo();
+    }
   }
 
   unsigned getExtraLocalDataSize() const {
index de5531f0f715af369c487fd259192dc502949850..68e23323cef984f0b0d5b6cc8d3d606731f4663d 100644 (file)
@@ -292,6 +292,10 @@ void TemplateArgument::print(const PrintingPolicy &Policy,
 // TemplateArgumentLoc Implementation
 //===----------------------------------------------------------------------===//
 
+TemplateArgumentLocInfo::TemplateArgumentLocInfo() {
+  memset(this, 0, sizeof(TemplateArgumentLocInfo));
+}
+
 SourceRange TemplateArgumentLoc::getSourceRange() const {
   switch (Argument.getKind()) {
   case TemplateArgument::Expression:
@@ -362,11 +366,15 @@ TemplateArgumentLoc::getPackExpansionPattern(SourceLocation &Ellipsis,
   }
       
   case TemplateArgument::Expression: {
-    Expr *Pattern = cast<PackExpansionExpr>(Argument.getAsExpr())->getPattern();
+    PackExpansionExpr *Expansion
+      = cast<PackExpansionExpr>(Argument.getAsExpr());
+    Expr *Pattern = Expansion->getPattern();
+    Ellipsis = Expansion->getEllipsisLoc();
     return TemplateArgumentLoc(Pattern, Pattern);
   }
 
   case TemplateArgument::TemplateExpansion:
+    Ellipsis = getTemplateEllipsisLoc();
     return TemplateArgumentLoc(Argument.getPackExpansionPattern(),
                                getTemplateQualifierRange(),
                                getTemplateNameLoc());