diff options
author | Janus Weil <janus@gcc.gnu.org> | 2010-12-31 11:08:17 +0100 |
---|---|---|
committer | Janus Weil <janus@gcc.gnu.org> | 2010-12-31 11:08:17 +0100 |
commit | 4fa0269222763d9fa5a478a90e690b90eafff14d (patch) | |
tree | 54d9b78aff752dd100d6afe96eece73b56bad324 /gcc/fortran/decl.c | |
parent | 6c2154a91776cec9f01875d4f583bd7d8cd087a1 (diff) | |
download | gcc-4fa0269222763d9fa5a478a90e690b90eafff14d.zip gcc-4fa0269222763d9fa5a478a90e690b90eafff14d.tar.gz gcc-4fa0269222763d9fa5a478a90e690b90eafff14d.tar.bz2 |
re PR fortran/46971 ([OOP] ICE on long class names)
2010-12-31 Janus Weil <janus@gcc.gnu.org>
PR fortran/46971
* gfortran.h (gfc_hash_value): Add prototype.
* class.c (get_unique_type_string): Check if proc_name is present and
make sure string contains an underscore.
(get_unique_hashed_string): New function which creates a hashed string
if the given unique string is too long.
(gfc_hash_value): Moved here from decl.c, renamed and simplified.
(gfc_build_class_symbol, gfc_find_derived_vtab): Use hashed strings.
* decl.c (hash_value): Moved to class.c.
(gfc_match_derived_decl): Renamed 'hash_value'.
2010-12-31 Janus Weil <janus@gcc.gnu.org>
PR fortran/46971
* gfortran.dg/class_33.f90: New.
From-SVN: r168363
Diffstat (limited to 'gcc/fortran/decl.c')
-rw-r--r-- | gcc/fortran/decl.c | 42 |
1 files changed, 1 insertions, 41 deletions
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index eb2d36e..0dbda0b 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -7183,46 +7183,6 @@ gfc_get_type_attr_spec (symbol_attribute *attr, char *name) } -/* Assign a hash value for a derived type. The algorithm is that of - SDBM. The hashed string is '[module_name #] derived_name'. */ -static unsigned int -hash_value (gfc_symbol *sym) -{ - unsigned int hash = 0; - const char *c; - int i, len; - - /* Hash of the module or procedure name. */ - if (sym->module != NULL) - c = sym->module; - else if (sym->ns && sym->ns->proc_name - && sym->ns->proc_name->attr.flavor == FL_MODULE) - c = sym->ns->proc_name->name; - else - c = NULL; - - if (c) - { - len = strlen (c); - for (i = 0; i < len; i++, c++) - hash = (hash << 6) + (hash << 16) - hash + (*c); - - /* Disambiguate between 'a' in 'aa' and 'aa' in 'a'. */ - hash = (hash << 6) + (hash << 16) - hash + '#'; - } - - /* Hash of the derived type name. */ - len = strlen (sym->name); - c = sym->name; - for (i = 0; i < len; i++, c++) - hash = (hash << 6) + (hash << 16) - hash + (*c); - - /* Return the hash but take the modulus for the sake of module read, - even though this slightly increases the chance of collision. */ - return (hash % 100000000); -} - - /* Match the beginning of a derived type declaration. If a type name was the result of a function, then it is possible to have a symbol already to be known as a derived type yet have no components. */ @@ -7355,7 +7315,7 @@ gfc_match_derived_decl (void) if (!sym->hash_value) /* Set the hash for the compound name for this type. */ - sym->hash_value = hash_value (sym); + sym->hash_value = gfc_hash_value (sym); /* Take over the ABSTRACT attribute. */ sym->attr.abstract = attr.abstract; |