1 From a588d1bdc7fb4aa8e1214b6a57d581ddcfa86159 Mon Sep 17 00:00:00 2001
2 From: burnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
3 Date: Thu, 28 Apr 2011 18:47:28 +0000
4 Subject: [PATCH 194/200] 2011-04-28 Tobias Burnus <burnus@net-b.de>
7 * resolve.c (resolve_fl_var_and_proc): Print diagnostic of
8 function results only once.
9 (resolve_symbol): Always resolve function results.
12 * expr.c (gfc_check_vardef_context): Fix handling of generic
14 * interface.c (check_interface0): Reject internal functions
15 in generic interfaces, unless -std=gnu.
17 2011-04-28 Tobias Burnus <burnus@net-b.de>
23 git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@173127 138bc75d-0d04-0410-961f-82ee72b054a4
25 index 58b6036..cfa1d57 100644
26 --- a/gcc/fortran/expr.c
27 +++ b/gcc/fortran/expr.c
28 @@ -4367,15 +4367,26 @@ gfc_build_intrinsic_call (const char* name, locus where, unsigned numarg, ...)
30 gfc_check_vardef_context (gfc_expr* e, bool pointer, const char* context)
33 + gfc_symbol* sym = NULL;
37 symbol_attribute attr;
40 + if (e->expr_type == EXPR_VARIABLE)
42 + gcc_assert (e->symtree);
43 + sym = e->symtree->n.sym;
45 + else if (e->expr_type == EXPR_FUNCTION)
47 + gcc_assert (e->symtree);
48 + sym = e->value.function.esym ? e->value.function.esym : e->symtree->n.sym;
51 if (!pointer && e->expr_type == EXPR_FUNCTION
52 - && e->symtree->n.sym->result->attr.pointer)
53 + && sym->result->attr.pointer)
55 if (!(gfc_option.allow_std & GFC_STD_F2008))
57 @@ -4393,9 +4404,6 @@ gfc_check_vardef_context (gfc_expr* e, bool pointer, const char* context)
61 - gcc_assert (e->symtree);
62 - sym = e->symtree->n.sym;
64 if (!pointer && sym->attr.flavor == FL_PARAMETER)
67 diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c
68 index b0b74c1..b5f77c3 100644
69 --- a/gcc/fortran/interface.c
70 +++ b/gcc/fortran/interface.c
71 @@ -1128,6 +1128,12 @@ check_interface0 (gfc_interface *p, const char *interface_name)
72 " or all FUNCTIONs", interface_name, &p->sym->declared_at);
76 + if (p->sym->attr.proc == PROC_INTERNAL
77 + && gfc_notify_std (GFC_STD_GNU, "Extension: Internal procedure '%s' "
78 + "in %s at %L", p->sym->name, interface_name,
79 + &p->sym->declared_at) == FAILURE)
84 diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
85 index 75e4697..f661140 100644
86 --- a/gcc/fortran/resolve.c
87 +++ b/gcc/fortran/resolve.c
88 @@ -9858,6 +9858,11 @@ apply_default_init_local (gfc_symbol *sym)
90 resolve_fl_var_and_proc (gfc_symbol *sym, int mp_flag)
92 + /* Avoid double diagnostics for function result symbols. */
93 + if ((sym->result || sym->attr.result) && !sym->attr.dummy
94 + && (sym->ns != gfc_current_ns))
97 /* Constraints on deferred shape variable. */
98 if (sym->as == NULL || sym->as->type != AS_DEFERRED)
100 @@ -11946,11 +11951,6 @@ resolve_symbol (gfc_symbol *sym)
104 - /* Avoid double resolution of function result symbols. */
105 - if ((sym->result || sym->attr.result) && !sym->attr.dummy
106 - && (sym->ns != gfc_current_ns))
109 if (sym->attr.flavor == FL_UNKNOWN)
112 index 728c5ce..fb1e19b 100644
113 --- a/gcc/testsuite/gfortran.dg/bessel_1.f90
114 +++ b/gcc/testsuite/gfortran.dg/bessel_1.f90
115 @@ -26,11 +26,11 @@ program test
116 call check(bessel_yn (3,x4), bessel_yn (3,1.9_4))
119 - subroutine check_r4 (a, b)
120 + subroutine check_r4 (a, b) ! { dg-warning "Extension: Internal procedure" }
121 real(kind=4), intent(in) :: a, b
122 if (abs(a - b) > 1.e-5 * abs(b)) call abort
124 - subroutine check_r8 (a, b)
125 + subroutine check_r8 (a, b) ! { dg-warning "Extension: Internal procedure" }
126 real(kind=8), intent(in) :: a, b
127 if (abs(a - b) > 1.e-7 * abs(b)) call abort
129 diff --git a/gcc/testsuite/gfortran.dg/erfc_scaled_1.f90 b/gcc/testsuite/gfortran.dg/erfc_scaled_1.f90
130 index 8a114e6..eeb54c8 100644
131 --- a/gcc/testsuite/gfortran.dg/erfc_scaled_1.f90
132 +++ b/gcc/testsuite/gfortran.dg/erfc_scaled_1.f90
137 +! Do not run with -pedantic checks enabled as "check"
138 +! contains internal procedures which is a vendor extension
142 diff --git a/gcc/testsuite/gfortran.dg/func_result_6.f90 b/gcc/testsuite/gfortran.dg/func_result_6.f90
143 index e64a2ef..e8347be 100644
144 --- a/gcc/testsuite/gfortran.dg/func_result_6.f90
145 +++ b/gcc/testsuite/gfortran.dg/func_result_6.f90
146 @@ -63,7 +63,7 @@ if (ptr /= 2) call abort()
148 if (ptr /= 77) call abort()
151 + function foo() ! { dg-warning "Extension: Internal procedure .foo. in generic interface" }
152 integer, allocatable :: foo(:)
155 diff --git a/gcc/testsuite/gfortran.dg/hypot_1.f90 b/gcc/testsuite/gfortran.dg/hypot_1.f90
156 index 59022fa..0c1c6e2 100644
157 --- a/gcc/testsuite/gfortran.dg/hypot_1.f90
158 +++ b/gcc/testsuite/gfortran.dg/hypot_1.f90
159 @@ -18,11 +18,11 @@ program test
160 call check(hypot(x4,y4), hypot(1.9_4,-2.1_4))
163 - subroutine check_r4 (a, b)
164 + subroutine check_r4 (a, b) ! { dg-warning "Extension: Internal procedure" }
165 real(kind=4), intent(in) :: a, b
166 if (abs(a - b) > 1.e-5 * abs(b)) call abort
168 - subroutine check_r8 (a, b)
169 + subroutine check_r8 (a, b) ! { dg-warning "Extension: Internal procedure" }
170 real(kind=8), intent(in) :: a, b
171 if (abs(a - b) > 1.e-7 * abs(b)) call abort
173 diff --git a/gcc/testsuite/gfortran.dg/interface_35.f90 b/gcc/testsuite/gfortran.dg/interface_35.f90
175 index 0000000..20aa4af
177 +++ b/gcc/testsuite/gfortran.dg/interface_35.f90
180 +! { dg-options "-std=f2008" }
182 +! PR fortran/48112 (module_m)
183 +! PR fortran/48279 (sidl_string_array, s_Hard)
185 +! Contributed by mhp77@gmx.at (module_m)
186 +! and Adrian Prantl (sidl_string_array, s_Hard)
191 + function test1( ) result( test )
199 +module sidl_string_array
200 + type sidl_string_1d
201 + end type sidl_string_1d
207 + subroutine setg1_p(array, index, val)
208 + type(sidl_string_1d), intent(inout) :: array
209 + end subroutine setg1_p
210 +end module sidl_string_array
213 + use sidl_string_array
215 + integer(8) :: dummy
217 + interface set_d_interface
219 + interface get_d_string
220 + module procedure get_d_string_p
222 + contains ! Derived type member access functions
223 + type(sidl_string_1d) function get_d_string_p(s)
224 + type(s_Hard_t), intent(in) :: s
225 + end function get_d_string_p
226 + subroutine set_d_objectArray_p(s, d_objectArray)
227 + end subroutine set_d_objectArray_p
230 +subroutine initHard(h, ex)
232 + type(s_Hard_t), intent(inout) :: h
233 + call set(get_d_string(h), 0, 'Three') ! { dg-error "There is no specific subroutine for the generic" }
234 +end subroutine initHard
243 + call set1 (get (h))
247 + subroutine set1 (a)
248 + integer, intent(in) :: a
251 + integer function get1 (s) ! { dg-error "Extension: Internal procedure .get1. in generic interface .get." }
257 +! { dg-final { cleanup-modules "module_m module_m2 s_hard sidl_string_array" } }
258 diff --git a/gcc/testsuite/gfortran.dg/interface_assignment_4.f90 b/gcc/testsuite/gfortran.dg/interface_assignment_4.f90
259 index 535e884..d55af29 100644
260 --- a/gcc/testsuite/gfortran.dg/interface_assignment_4.f90
261 +++ b/gcc/testsuite/gfortran.dg/interface_assignment_4.f90
266 - subroutine op_assign_VS_CH (var, exp)
267 + subroutine op_assign_VS_CH (var, exp) ! { dg-warning "Extension: Internal procedure" }
268 type(varying_string), intent(out) :: var
269 character(LEN=*), intent(in) :: exp
271 diff --git a/gcc/testsuite/gfortran.dg/proc_ptr_comp_20.f90 b/gcc/testsuite/gfortran.dg/proc_ptr_comp_20.f90
272 index d477368..57660c7 100644
273 --- a/gcc/testsuite/gfortran.dg/proc_ptr_comp_20.f90
274 +++ b/gcc/testsuite/gfortran.dg/proc_ptr_comp_20.f90
275 @@ -35,12 +35,12 @@ o1%ppc => o2%ppc ! { dg-error "Type/kind mismatch" }
279 - real function f1(a,b)
280 + real function f1(a,b) ! { dg-warning "Extension: Internal procedure" }
281 real,intent(in) :: a,b
285 - integer function f2(a,b)
286 + integer function f2(a,b) ! { dg-warning "Extension: Internal procedure" }
287 real,intent(in) :: a,b
290 diff --git a/gcc/testsuite/gfortran.dg/proc_ptr_comp_21.f90 b/gcc/testsuite/gfortran.dg/proc_ptr_comp_21.f90
291 index c000896..a21916b 100644
292 --- a/gcc/testsuite/gfortran.dg/proc_ptr_comp_21.f90
293 +++ b/gcc/testsuite/gfortran.dg/proc_ptr_comp_21.f90
298 - elemental subroutine op_assign (str, ch)
299 + elemental subroutine op_assign (str, ch) ! { dg-warning "Extension: Internal procedure" }
300 type(nf_t), intent(out) :: str
301 character(len=*), intent(in) :: ch