]> granicus.if.org Git - clang/commitdiff
Reclaim memory allocated for ParmVarDecl's in FunctionDecl::Destroy.
authorTed Kremenek <kremenek@apple.com>
Tue, 20 May 2008 03:56:00 +0000 (03:56 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 20 May 2008 03:56:00 +0000 (03:56 +0000)
Fixed a bug in ParmVarDecl::param_end(): Handle the case where there are no
ParmVarDecls for a FunctionDecl, but its function prototype has formal arguments
(can happen with typedefs).

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

include/clang/AST/Decl.h
lib/AST/Decl.cpp

index af981d9a67dbd468a335e18511d5ceaab71aa629..0714b120ad744c90bdd587f87238bb5463bee5d2 100644 (file)
@@ -446,10 +446,25 @@ public:
   unsigned param_size() const { return getNumParams(); }
   typedef ParmVarDecl **param_iterator;
   typedef ParmVarDecl * const *param_const_iterator;
+  
   param_iterator param_begin() { return ParamInfo; }
-  param_iterator param_end() { return ParamInfo+param_size(); }
+  param_iterator param_end() {
+
+    // Special-case for handling typedefs:
+    //
+    //  typedef void func_t(int x);
+    //  func_t a;
+    //
+    // In the case of the FunctionDecl for "a", there are no ParmVarDecls.
+
+    return ParamInfo ? ParamInfo+param_size() : 0x0;
+  }
+  
   param_const_iterator param_begin() const { return ParamInfo; }
-  param_const_iterator param_end() const { return ParamInfo+param_size(); }
+  
+  param_const_iterator param_end() const {
+    return ParamInfo ? ParamInfo+param_size() : 0x0;
+  }
   
   unsigned getNumParams() const;
   const ParmVarDecl *getParamDecl(unsigned i) const {
index 51040d362047b8c6a293845c633a7093e751eb46..c75fb8b674dc1aa944113454559e3cd9ab79083b 100644 (file)
@@ -412,7 +412,12 @@ FunctionDecl::~FunctionDecl() {
 }
 
 void FunctionDecl::Destroy(ASTContext& C) {
-  if (Body) Body->Destroy(C);
+  if (Body)
+    Body->Destroy(C);
+
+  for (param_iterator I=param_begin(), E=param_end(); I!=E; ++I)
+    (*I)->Destroy(C);
+    
   Decl::Destroy(C);
 }