diff options
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/fortran/expr.c | 3 | ||||
-rw-r--r-- | gcc/fortran/interface.c | 11 |
3 files changed, 17 insertions, 5 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index c1f959305c6..8f7822f6c4d 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,5 +1,13 @@ 2012-03-02 Tobias Burnus <burnus@net-b.de> + PR fortran/52270 + * expr.c (gfc_check_vardef_context): Fix check for + intent-in polymorphic pointer . + * interface.c (compare_parameter): Allow passing TYPE to + intent-in polymorphic pointer. + +2012-03-02 Tobias Burnus <burnus@net-b.de> + PR fortran/52452 * resolve.c (resolve_intrinsic): Don't search for a function if we know that it is a subroutine. diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index 129ece35507..d136140876d 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -4648,7 +4648,8 @@ gfc_check_vardef_context (gfc_expr* e, bool pointer, bool alloc_obj, the component of sub-component of a pointer. Obviously, procedure pointers are of no interest here. */ check_intentin = true; - ptr_component = sym->attr.pointer; + ptr_component = (sym->ts.type == BT_CLASS && CLASS_DATA (sym)) + ? CLASS_DATA (sym)->attr.class_pointer : sym->attr.pointer; for (ref = e->ref; ref && check_intentin; ref = ref->next) { if (ptr_component && ref->type == REF_COMPONENT) diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c index e1f0cb6b2f8..e9df662a29a 100644 --- a/gcc/fortran/interface.c +++ b/gcc/fortran/interface.c @@ -1579,7 +1579,9 @@ compare_pointer (gfc_symbol *formal, gfc_expr *actual) { symbol_attribute attr; - if (formal->attr.pointer) + if (formal->attr.pointer + || (formal->ts.type == BT_CLASS && CLASS_DATA (formal) + && CLASS_DATA (formal)->attr.class_pointer)) { attr = gfc_expr_attr (actual); @@ -1706,10 +1708,11 @@ compare_parameter (gfc_symbol *formal, gfc_expr *actual, gfc_typename (&formal->ts)); return 0; } - - /* F2008, 12.5.2.5. */ + + /* F2008, 12.5.2.5; IR F08/0073. */ if (formal->ts.type == BT_CLASS - && (CLASS_DATA (formal)->attr.class_pointer + && ((CLASS_DATA (formal)->attr.class_pointer + && !formal->attr.intent == INTENT_IN) || CLASS_DATA (formal)->attr.allocatable)) { if (actual->ts.type != BT_CLASS) |