summaryrefslogtreecommitdiff
path: root/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0198-2011-04-29-Tobias-Burnus-burnus-net-b.de.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0198-2011-04-29-Tobias-Burnus-burnus-net-b.de.patch')
-rw-r--r--meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0198-2011-04-29-Tobias-Burnus-burnus-net-b.de.patch162
1 files changed, 162 insertions, 0 deletions
diff --git a/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0198-2011-04-29-Tobias-Burnus-burnus-net-b.de.patch b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0198-2011-04-29-Tobias-Burnus-burnus-net-b.de.patch
new file mode 100644
index 000000000..96b886a98
--- /dev/null
+++ b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0198-2011-04-29-Tobias-Burnus-burnus-net-b.de.patch
@@ -0,0 +1,162 @@
+From 1c9148fe797f564821355a8976802689519324dd Mon Sep 17 00:00:00 2001
+From: burnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
+Date: Fri, 29 Apr 2011 21:26:07 +0000
+Subject: [PATCH 198/200] 2011-04-29 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/48810
+ * resolve.c (resolve_typebound_generic_call): Don't check access
+ flags of the specific function.
+
+ PR fortran/48800
+ * resolve.c (resolve_formal_arglist): Don't change AS_DEFERRED
+ to AS_ASSUMED_SHAPE for function results.
+ (resolve_fl_var_and_proc): Print also for function results with
+ AS_DEFERRED an error, if they are not a pointer or allocatable.
+ (resolve_types): Make sure arguments of procedures in interface
+ blocks are resolved.
+
+2011-04-29 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/48810
+ * gfortran.dg/typebound_proc_22.f90: New.
+
+ PR fortran/48800
+ * gfortran.dg/interface_36.f90: New.
+
+
+
+git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@173191 138bc75d-0d04-0410-961f-82ee72b054a4
+
+index f661140..7618db9 100644
+--- a/gcc/fortran/resolve.c
++++ b/gcc/fortran/resolve.c
+@@ -315,7 +315,8 @@ resolve_formal_arglist (gfc_symbol *proc)
+ shape until we know if it has the pointer or allocatable attributes.
+ */
+ if (sym->as && sym->as->rank > 0 && sym->as->type == AS_DEFERRED
+- && !(sym->attr.pointer || sym->attr.allocatable))
++ && !(sym->attr.pointer || sym->attr.allocatable)
++ && sym->attr.flavor != FL_PROCEDURE)
+ {
+ sym->as->type = AS_ASSUMED_SHAPE;
+ for (i = 0; i < sym->as->rank; i++)
+@@ -5674,7 +5675,7 @@ success:
+ /* Make sure that we have the right specific instance for the name. */
+ derived = get_declared_from_expr (NULL, NULL, e);
+
+- st = gfc_find_typebound_proc (derived, NULL, genname, false, &e->where);
++ st = gfc_find_typebound_proc (derived, NULL, genname, true, &e->where);
+ if (st)
+ e->value.compcall.tbp = st->n.tb;
+
+@@ -9890,7 +9891,7 @@ resolve_fl_var_and_proc (gfc_symbol *sym, int mp_flag)
+ else
+ {
+ if (!mp_flag && !sym->attr.allocatable && !sym->attr.pointer
+- && !sym->attr.dummy && sym->ts.type != BT_CLASS && !sym->assoc)
++ && sym->ts.type != BT_CLASS && !sym->assoc)
+ {
+ gfc_error ("Array '%s' at %L cannot have a deferred shape",
+ sym->name, &sym->declared_at);
+@@ -13505,6 +13506,10 @@ resolve_types (gfc_namespace *ns)
+
+ resolve_contained_functions (ns);
+
++ if (ns->proc_name && ns->proc_name->attr.flavor == FL_PROCEDURE
++ && ns->proc_name->attr.if_source == IFSRC_IFBODY)
++ resolve_formal_arglist (ns->proc_name);
++
+ gfc_traverse_ns (ns, resolve_bind_c_derived_types);
+
+ for (cl = ns->cl_list; cl; cl = cl->next)
+new file mode 100644
+index 0000000..5032291
+--- /dev/null
++++ b/gcc/testsuite/gfortran.dg/interface_36.f90
+@@ -0,0 +1,28 @@
++! { dg-do compile }
++!
++! PR fortran/48800
++!
++! Contributed by Daniel Carrera
++!
++ pure function runge_kutta_step(t, r_, dr, h) result(res)
++ real, intent(in) :: t, r_(:), h
++ real, dimension(:), allocatable :: k1, k2, k3, k4, res
++ integer :: N
++
++ interface
++ pure function dr(t, r_) ! { dg-error "cannot have a deferred shape" }
++ real, intent(in) :: t, r_(:)
++ real :: dr(:)
++ end function
++ end interface
++
++ N = size(r_)
++ allocate(k1(N),k2(N),k3(N),k4(N),res(N))
++
++ k1 = dr(t, r_)
++ k2 = dr(t + h/2, r_ + k1*h/2)
++ k3 = dr(t + h/2, r_ + k2*h/2)
++ k4 = dr(t + h , r_ + k3*h)
++
++ res = r_ + (k1 + 2*k2 + 2*k3 + k4) * h/6
++ end function
+diff --git a/gcc/testsuite/gfortran.dg/typebound_proc_22.f90 b/gcc/testsuite/gfortran.dg/typebound_proc_22.f90
+new file mode 100644
+index 0000000..f7691c5
+--- /dev/null
++++ b/gcc/testsuite/gfortran.dg/typebound_proc_22.f90
+@@ -0,0 +1,49 @@
++! { dg-do compile }
++!
++! PR fortran/48810
++!
++! Contributed by Andrew Baldwin
++!
++ module qtest
++ type foobar
++ integer :: x
++ contains
++ private
++ procedure :: gimmex
++ generic, public :: getx => gimmex
++ end type foobar
++ contains
++ function gimmex(foo)
++ class (foobar) :: foo
++ integer :: gimmex
++ gimmex = foo%x
++ end function gimmex
++ end module qtest
++
++ module qtestPriv
++ type foobarPriv
++ integer :: x
++ contains
++ private
++ procedure :: gimmexPriv
++ generic, private :: getxPriv => gimmexPriv
++ end type foobarPriv
++ contains
++ function gimmexPriv(foo)
++ class (foobarPriv) :: foo
++ integer :: gimmex
++ gimmex = foo%x
++ end function gimmexPriv
++ end module qtestPriv
++
++ program quicktest
++ use qtest
++ use qtestPriv
++ type (foobar) :: foo
++ type (foobarPriv) :: fooPriv
++ integer :: bar
++ bar = foo%getx() ! OK
++ bar = fooPriv%getxPriv() ! { dg-error " is PRIVATE " }
++ end program quicktest
++
++! { dg-final { cleanup-modules "qtest qtestpriv" } }
+--
+1.7.0.4
+