diff options
author | Tobias Burnus <burnus@net-b.de> | 2011-12-08 19:56:58 +0100 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2011-12-08 19:56:58 +0100 |
commit | 3787b8ffe0ccf1f5cc47c2065f535f8a944156ea (patch) | |
tree | ed6dc1b12ec1287f852f63b9512c2ca1df234c2e /gcc/fortran/symbol.c | |
parent | 14dcdf69d57b85cc5926162da7699f4846bb3faf (diff) | |
download | gcc-3787b8ffe0ccf1f5cc47c2065f535f8a944156ea.zip gcc-3787b8ffe0ccf1f5cc47c2065f535f8a944156ea.tar.gz gcc-3787b8ffe0ccf1f5cc47c2065f535f8a944156ea.tar.bz2 |
re PR fortran/51378 ([OOP] Structure constructor wrongly rejects parent components if only child has PRIVATE comps)
2011-12-08 Tobias Burnus <burnus@net-b.de>
PR fortran/51378
* symbol.c (gfc_find_component): Fix access check of parent
components.
2011-12-08 Tobias Burnus <burnus@net-b.de>
PR fortran/51378
* gfortran.dg/private_type_14.f90: New.
From-SVN: r182133
Diffstat (limited to 'gcc/fortran/symbol.c')
-rw-r--r-- | gcc/fortran/symbol.c | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c index de42297..fcc1ccf 100644 --- a/gcc/fortran/symbol.c +++ b/gcc/fortran/symbol.c @@ -2022,6 +2022,21 @@ gfc_find_component (gfc_symbol *sym, const char *name, if (strcmp (p->name, name) == 0) break; + if (p && sym->attr.use_assoc && !noaccess) + { + bool is_parent_comp = sym->attr.extension && (p == sym->components); + if (p->attr.access == ACCESS_PRIVATE || + (p->attr.access != ACCESS_PUBLIC + && sym->component_access == ACCESS_PRIVATE + && !is_parent_comp)) + { + if (!silent) + gfc_error ("Component '%s' at %C is a PRIVATE component of '%s'", + name, sym->name); + return NULL; + } + } + if (p == NULL && sym->attr.extension && sym->components->ts.type == BT_DERIVED) @@ -2037,21 +2052,6 @@ gfc_find_component (gfc_symbol *sym, const char *name, gfc_error ("'%s' at %C is not a member of the '%s' structure", name, sym->name); - else if (sym->attr.use_assoc && !noaccess) - { - bool is_parent_comp = sym->attr.extension && (p == sym->components); - if (p->attr.access == ACCESS_PRIVATE || - (p->attr.access != ACCESS_PUBLIC - && sym->component_access == ACCESS_PRIVATE - && !is_parent_comp)) - { - if (!silent) - gfc_error ("Component '%s' at %C is a PRIVATE component of '%s'", - name, sym->name); - return NULL; - } - } - return p; } |