When destroying a translation unit, deallocate its owned declarations in reverse order, because there may be dependencies among the declarations.
llvm-svn: 58244
This commit is contained in:
parent
36d4ade4be
commit
89ebcb9d8d
|
@ -514,23 +514,10 @@ public:
|
|||
typedef ParmVarDecl * const *param_const_iterator;
|
||||
|
||||
param_iterator param_begin() { return ParamInfo; }
|
||||
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_iterator param_end() { return ParamInfo+param_size(); }
|
||||
|
||||
param_const_iterator param_begin() const { return ParamInfo; }
|
||||
|
||||
param_const_iterator param_end() const {
|
||||
return ParamInfo ? ParamInfo+param_size() : 0x0;
|
||||
}
|
||||
param_const_iterator param_end() const { return ParamInfo+param_size(); }
|
||||
|
||||
unsigned getNumParams() const;
|
||||
const ParmVarDecl *getParamDecl(unsigned i) const {
|
||||
|
|
|
@ -33,7 +33,9 @@ enum { BasicMetadataBlock = 1,
|
|||
TranslationUnit::~TranslationUnit() {
|
||||
if (OwnsDecls) {
|
||||
llvm::DenseSet<Decl*> Killed;
|
||||
for (iterator I=begin(), E=end(); I!=E; ++I) {
|
||||
for (std::vector<Decl*>::reverse_iterator I=TopLevelDecls.rbegin(),
|
||||
E=TopLevelDecls.rend();
|
||||
I!=E; ++I) {
|
||||
if (Killed.count(*I)) continue;
|
||||
|
||||
Killed.insert(*I);
|
||||
|
|
|
@ -3,3 +3,13 @@
|
|||
// PR2942
|
||||
typedef void fn(int);
|
||||
fn f;
|
||||
|
||||
int g(int x, int y);
|
||||
int g(int x, int y = 2);
|
||||
|
||||
typedef int g_type(int, int);
|
||||
g_type g;
|
||||
|
||||
int h(int x) {
|
||||
return g(x);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue