From f343fd8929ca94eb36b0765f33b1cda60e717b5b Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Thu, 1 Oct 2009 23:51:25 +0000 Subject: [PATCH] Make sure to free the explicit template arguments provided for an explicit instantiation. Also, tighten up reference-count checking to help catch these issues earlier. Fixes PR5069. llvm-svn: 83225 --- clang/include/clang/AST/Stmt.h | 5 ++++- clang/lib/Sema/SemaTemplate.cpp | 1 + clang/test/SemaTemplate/explicit-instantiation.cpp | 4 ++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/AST/Stmt.h b/clang/include/clang/AST/Stmt.h index 125279c1eda1..411f215e912e 100644 --- a/clang/include/clang/AST/Stmt.h +++ b/clang/include/clang/AST/Stmt.h @@ -188,7 +188,10 @@ public: return this; } - StmtClass getStmtClass() const { return (StmtClass)sClass; } + StmtClass getStmtClass() const { + assert(RefCount >= 1 && "Referencing already-destroyed statement!"); + return (StmtClass)sClass; + } const char *getStmtClassName() const; /// SourceLocation tokens are not useful in isolation - they are low level diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index c7ce03259408..d12ec9318af9 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -3414,6 +3414,7 @@ Sema::DeclResult Sema::ActOnExplicitInstantiation(Scope *S, TemplateId->getTemplateArgLocations(), TemplateArgs); HasExplicitTemplateArgs = true; + TemplateArgsPtr.release(); } // C++ [temp.explicit]p1: diff --git a/clang/test/SemaTemplate/explicit-instantiation.cpp b/clang/test/SemaTemplate/explicit-instantiation.cpp index 07994f97d3f6..b9a4ad282b9f 100644 --- a/clang/test/SemaTemplate/explicit-instantiation.cpp +++ b/clang/test/SemaTemplate/explicit-instantiation.cpp @@ -69,3 +69,7 @@ template void print_type(float*); // expected-error{{does not refer}} void print_type(double*); template void print_type(double*); + +// PR5069 +template void foo0 (int (&)[I + 1]) { } +template void foo0<2> (int (&)[3]);