diff options
author | Ted Kremenek <kremenek@apple.com> | 2007-11-16 19:00:35 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2007-11-16 19:00:35 +0000 |
commit | c37bdf08a1fb5cd2807a1a730b809f3bebc85627 (patch) | |
tree | b3b8e930c787ca296a4563bc8d59b885f11eb3c4 | |
parent | da256858f09a17e8a7e04abc88cda7653a62938c (diff) |
Added assertion in serialization of DeclRefExprs. DeclRefExprs can only
own the decl they reference if it is a FunctionDecl. Note that his
ownership property is still considered a hack, and should be fixed.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44192 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | AST/StmtSerialization.cpp | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/AST/StmtSerialization.cpp b/AST/StmtSerialization.cpp index 63861d2a21..24733eb7ac 100644 --- a/AST/StmtSerialization.cpp +++ b/AST/StmtSerialization.cpp @@ -376,7 +376,7 @@ void DeclRefExpr::EmitImpl(Serializer& S) const { S.Emit(Loc); S.Emit(getType()); - // Some DeclRefExprs can actually hold the owning reference to a decl. + // Some DeclRefExprs can actually hold the owning reference to a FunctionDecl. // This occurs when an implicitly defined function is called, and // the decl does not appear in the source file. We thus check if the // decl pointer has been registered, and if not, emit an owned pointer. @@ -387,14 +387,19 @@ void DeclRefExpr::EmitImpl(Serializer& S) const { // needs an explicit bit indicating that it owns the the object, // or we need a different ownership model. - if (S.isRegistered(getDecl())) { - S.EmitBool(false); - S.EmitPtr(getDecl()); + const Decl* d = getDecl(); + + if (!S.isRegistered(d)) { + assert (isa<FunctionDecl>(d) + && "DeclRefExpr can only own FunctionDecls for implicitly def. funcs."); + + S.EmitBool(true); + S.EmitOwnedPtr(d); } else { - S.EmitBool(true); - S.EmitOwnedPtr(cast<Decl>(getDecl())); - } + S.EmitBool(false); + S.EmitPtr(d); + } } DeclRefExpr* DeclRefExpr::CreateImpl(Deserializer& D) { |