diff options
author | Iain Buclaw <ibuclaw@gdcproject.org> | 2021-07-26 15:38:15 +0200 |
---|---|---|
committer | Iain Buclaw <ibuclaw@gdcproject.org> | 2021-07-30 12:51:35 +0200 |
commit | bafda275371c43a67a9f84813886b9aa6cf4cd98 (patch) | |
tree | 80a4f4748b26278a66e731cb98697f572fc558ef | |
parent | 55303957de85fd4d0d529e7eeb1b67e29e4f98c5 (diff) | |
download | gcc-bafda275371c43a67a9f84813886b9aa6cf4cd98.zip gcc-bafda275371c43a67a9f84813886b9aa6cf4cd98.tar.gz gcc-bafda275371c43a67a9f84813886b9aa6cf4cd98.tar.bz2 |
d: Drop any field or parameter types that got cached before conversion failed.
This ensures there are no dangling references to AST members that have
been freed, either explcitly or by the garbage collector.
gcc/d/ChangeLog:
* d-builtins.cc (build_frontend_type): Restore builtin_converted_decls
length on conversion failure.
-rw-r--r-- | gcc/d/d-builtins.cc | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/gcc/d/d-builtins.cc b/gcc/d/d-builtins.cc index ff2a577..9db46c0 100644 --- a/gcc/d/d-builtins.cc +++ b/gcc/d/d-builtins.cc @@ -80,7 +80,8 @@ build_frontend_type (tree type) mod |= MODshared; /* If we've seen the type before, re-use the converted decl. */ - for (size_t i = 0; i < builtin_converted_decls.length (); ++i) + unsigned saved_builtin_decls_length = builtin_converted_decls.length (); + for (size_t i = 0; i < saved_builtin_decls_length; ++i) { tree t = builtin_converted_decls[i].ctype; if (TYPE_MAIN_VARIANT (t) == TYPE_MAIN_VARIANT (type)) @@ -249,6 +250,9 @@ build_frontend_type (tree type) Type *ftype = build_frontend_type (TREE_TYPE (field)); if (!ftype) { + /* Drop any field types that got cached before the conversion + of this record type failed. */ + builtin_converted_decls.truncate (saved_builtin_decls_length); delete sdecl->members; return NULL; } @@ -307,6 +311,9 @@ build_frontend_type (tree type) Type *targ = build_frontend_type (argtype); if (!targ) { + /* Drop any parameter types that got cached before the + conversion of this function type failed. */ + builtin_converted_decls.truncate (saved_builtin_decls_length); delete args; return NULL; } |