summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-01-06 00:33:28 +0000
committerDouglas Gregor <dgregor@apple.com>2011-01-06 00:33:28 +0000
commitdf50b8448cb21798d72c73f1500a24acf35bb38f (patch)
tree1eb3e94df771ae108ef52214c8d958eca2e28e91
parent849398910f221e732abc034d37aa243bc1920778 (diff)
downloadbcm5719-llvm-df50b8448cb21798d72c73f1500a24acf35bb38f.tar.gz
bcm5719-llvm-df50b8448cb21798d72c73f1500a24acf35bb38f.zip
When default-initializing a TemplateArgumentLocInfo, make sure that we
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. llvm-svn: 122931
-rw-r--r--clang/include/clang/AST/TemplateBase.h2
-rw-r--r--clang/include/clang/AST/TypeLoc.h5
-rw-r--r--clang/lib/AST/TemplateBase.cpp10
3 files changed, 14 insertions, 3 deletions
diff --git a/clang/include/clang/AST/TemplateBase.h b/clang/include/clang/AST/TemplateBase.h
index 7f3e591a965..22ca164d384 100644
--- a/clang/include/clang/AST/TemplateBase.h
+++ b/clang/include/clang/AST/TemplateBase.h
@@ -330,7 +330,7 @@ private:
};
public:
- TemplateArgumentLocInfo() : Expression(0) {}
+ TemplateArgumentLocInfo();
TemplateArgumentLocInfo(TypeSourceInfo *TInfo) : Declarator(TInfo) {}
diff --git a/clang/include/clang/AST/TypeLoc.h b/clang/include/clang/AST/TypeLoc.h
index 81ece1799b9..3480681fe16 100644
--- a/clang/include/clang/AST/TypeLoc.h
+++ b/clang/include/clang/AST/TypeLoc.h
@@ -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 {
diff --git a/clang/lib/AST/TemplateBase.cpp b/clang/lib/AST/TemplateBase.cpp
index de5531f0f71..68e23323cef 100644
--- a/clang/lib/AST/TemplateBase.cpp
+++ b/clang/lib/AST/TemplateBase.cpp
@@ -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());
OpenPOWER on IntegriCloud