/* Deal with interfaces.
- Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001, 2002, 2004 Free Software Foundation, Inc.
Contributed by Andy Vaught
-This file is part of GNU G95.
+This file is part of GCC.
-GNU G95 is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2, or (at your option) any later
+version.
-GNU G95 is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
You should have received a copy of the GNU General Public License
-along with GNU G95; see the file COPYING. If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+along with GCC; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA. */
/* Deal with interfaces. An explicit interface is represented as a
return compare_interfaces (formal, actual->symtree->n.sym, 0);
}
- if (!gfc_compare_types (&formal->ts, &actual->ts))
+ if (actual->expr_type != EXPR_NULL
+ && !gfc_compare_types (&formal->ts, &actual->ts))
return 0;
if (symbol_rank (formal) == actual->rank)
return 0;
}
- if (compare_pointer (f->sym, a->expr) == 0)
+ if (a->expr->expr_type != EXPR_NULL
+ && compare_pointer (f->sym, a->expr) == 0)
{
if (where)
gfc_error ("Actual argument for '%s' must be a pointer at %L",
if (*ap == NULL && n > 0)
*ap = new[0];
+ /* Note the types of omitted optional arguments. */
+ for (a = actual, f = formal; a; a = a->next, f = f->next)
+ if (a->expr == NULL && a->label == NULL)
+ a->missing_arg_type = f->sym->ts.type;
+
return 1;
}
intr = gfc_get_interface ();
intr->sym = new;
- intr->where = *gfc_current_locus ();
+ intr->where = gfc_current_locus;
intr->next = *head;
*head = intr;