From b2f81cf7f8445e0c65c0428f4fbb0442566916b8 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@83225 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/Stmt.h | 5 ++++- lib/Sema/SemaTemplate.cpp | 1 + test/SemaTemplate/explicit-instantiation.cpp | 4 ++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/include/clang/AST/Stmt.h b/include/clang/AST/Stmt.h index 125279c1ed..411f215e91 100644 --- a/include/clang/AST/Stmt.h +++ b/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/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp index c7ce032594..d12ec9318a 100644 --- a/lib/Sema/SemaTemplate.cpp +++ b/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/test/SemaTemplate/explicit-instantiation.cpp b/test/SemaTemplate/explicit-instantiation.cpp index 07994f97d3..b9a4ad282b 100644 --- a/test/SemaTemplate/explicit-instantiation.cpp +++ b/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]);