OSDN Git Service

2012-07-19 Tobias Burnus <burnus@net-b.de>
authorburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 19 Jul 2012 17:39:49 +0000 (17:39 +0000)
committerburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 19 Jul 2012 17:39:49 +0000 (17:39 +0000)
        * interface.c (compare_parameter, compare_actual_formal): Fix
        handling of polymorphic arguments.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@189669 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/interface.c

index 0f5e403..3d6bf6d 100644 (file)
@@ -1,3 +1,8 @@
+2012-07-19  Tobias Burnus  <burnus@net-b.de>
+
+       * interface.c (compare_parameter, compare_actual_formal): Fix
+       handling of polymorphic arguments.
+
 2012-07-17  Janus Weil  <janus@gcc.gnu.org>
 
        PR fortran/51081
index 922de03..2e181c9 100644 (file)
@@ -1743,7 +1743,7 @@ compare_parameter (gfc_symbol *formal, gfc_expr *actual,
     }
 
   /* F2008, 12.5.2.5; IR F08/0073.  */
-  if (formal->ts.type == BT_CLASS
+  if (formal->ts.type == BT_CLASS && actual->expr_type != EXPR_NULL
       && ((CLASS_DATA (formal)->attr.class_pointer
           && !formal->attr.intent == INTENT_IN)
           || CLASS_DATA (formal)->attr.allocatable))
@@ -2289,11 +2289,21 @@ compare_actual_formal (gfc_actual_arglist **ap, gfc_formal_arglist *formal,
          return 0;
        }
 
-      if (a->expr->expr_type == EXPR_NULL && !f->sym->attr.pointer
-         && (f->sym->attr.allocatable || !f->sym->attr.optional
-             || (gfc_option.allow_std & GFC_STD_F2008) == 0))
-       {
-         if (where && (f->sym->attr.allocatable || !f->sym->attr.optional))
+      if (a->expr->expr_type == EXPR_NULL
+         && ((f->sym->ts.type != BT_CLASS && !f->sym->attr.pointer
+              && (f->sym->attr.allocatable || !f->sym->attr.optional
+                  || (gfc_option.allow_std & GFC_STD_F2008) == 0))
+             || (f->sym->ts.type == BT_CLASS
+                 && !CLASS_DATA (f->sym)->attr.class_pointer
+                 && (CLASS_DATA (f->sym)->attr.allocatable
+                     || !f->sym->attr.optional
+                     || (gfc_option.allow_std & GFC_STD_F2008) == 0))))
+       {
+         if (where
+             && (!f->sym->attr.optional
+                 || (f->sym->ts.type != BT_CLASS && f->sym->attr.allocatable)
+                 || (f->sym->ts.type == BT_CLASS
+                        && CLASS_DATA (f->sym)->attr.allocatable)))
            gfc_error ("Unexpected NULL() intrinsic at %L to dummy '%s'",
                       where, f->sym->name);
          else if (where)