From: Steven G. Kargl Date: Thu, 29 Sep 2016 19:34:59 +0000 (+0000) Subject: backport: re PR fortran/71067 (ICE on data initialization with insufficient value) X-Git-Tag: releases/gcc-5.5.0~810 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f3a3d5db5a1c6060a7b636653a0bda2489b89ca4;p=thirdparty%2Fgcc.git backport: re PR fortran/71067 (ICE on data initialization with insufficient value) 2016-09-29 Steven G. Kargl Backport from trunk PR fortran/71067 * decl.c (match_data_constant): On error, set 'result' to NULL. PR fortran/77260 * gcc/fortran/trans-decl.c (generate_local_decl): Suppress warning for unused variable if symbol is entry point. 2016-09-29 Steven G. Kargl Backport from trunk PR fortran/71067 * gfortran.dg/pr71067_1.f90: New test. * gfortran.dg/pr71067_2.f90: Ditto. PR fortran/77260 * gfortran.dg/pr77260_1.f90: New test. * gfortran.dg/pr77260_2.f90: Ditto. From-SVN: r240635 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 5789f7758ac9..29be78c3eb2e 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,13 @@ +2016-09-29 Steven G. Kargl + + Backport from trunk + PR fortran/71067 + * decl.c (match_data_constant): On error, set 'result' to NULL. + + PR fortran/77260 + * gcc/fortran/trans-decl.c (generate_local_decl): Suppress warning + for unused variable if symbol is entry point. + 2016-09-29 Steven G. Kargl Backport from trunk diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index d6327189f10c..5c593a94aa2d 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -404,6 +404,7 @@ match_data_constant (gfc_expr **result) { gfc_error ("Symbol %qs must be a PARAMETER in DATA statement at %C", name); + *result = NULL; return MATCH_ERROR; } else if (dt_sym && dt_sym->attr.flavor == FL_DERIVED) diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index ce077a3f55ce..d9bb0bc5e84d 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -5191,9 +5191,19 @@ generate_local_decl (gfc_symbol * sym) } else if (!sym->attr.use_assoc) { - gfc_warning (OPT_Wunused_variable, - "Unused variable %qs declared at %L", - sym->name, &sym->declared_at); + /* Corner case: the symbol may be an entry point. At this point, + it may appear to be an unused variable. Suppress warning. */ + bool enter = false; + gfc_entry_list *el; + + for (el = sym->ns->entries; el; el=el->next) + if (strcmp(sym->name, el->sym->name) == 0) + enter = true; + + if (!enter) + gfc_warning (OPT_Wunused_variable, + "Unused variable %qs declared at %L", + sym->name, &sym->declared_at); if (sym->backend_decl != NULL_TREE) TREE_NO_WARNING(sym->backend_decl) = 1; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 38bc25a47b13..f16c2ca4d0cc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2016-09-29 Steven G. Kargl + + Backport from trunk + PR fortran/71067 + * gfortran.dg/pr71067_1.f90: New test. + * gfortran.dg/pr71067_2.f90: Ditto. + + PR fortran/77260 + * gfortran.dg/pr77260_1.f90: New test. + * gfortran.dg/pr77260_2.f90: Ditto. + 2016-09-29 Steven G. Kargl Louis Krupp diff --git a/gcc/testsuite/gfortran.dg/pr71067_1.f90 b/gcc/testsuite/gfortran.dg/pr71067_1.f90 new file mode 100644 index 000000000000..76fbcfb470b6 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr71067_1.f90 @@ -0,0 +1,5 @@ +program p + integer :: i = 0 + integer :: z(2) + data z /2*i/ ! { dg-error "must be a PARAMETER in DATA" } +end diff --git a/gcc/testsuite/gfortran.dg/pr71067_2.f90 b/gcc/testsuite/gfortran.dg/pr71067_2.f90 new file mode 100644 index 000000000000..6fac4c524cc7 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr71067_2.f90 @@ -0,0 +1,7 @@ +! { dg-do compile } +program p + integer :: a(2), b(2), c(2) + data a /2*b1'/ ! { dg-error "must be a PARAMETER in DATA" } + data b /2*o1' ! { dg-error "must be a PARAMETER in DATA" } + data c /2*z1 ! { dg-error "must be a PARAMETER in DATA" } +end diff --git a/gcc/testsuite/gfortran.dg/pr77260_1.f90 b/gcc/testsuite/gfortran.dg/pr77260_1.f90 new file mode 100644 index 000000000000..0d2ead61ce72 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr77260_1.f90 @@ -0,0 +1,25 @@ +! { dg-do compile } +! { dg-options "-Wall" } +module foo + + implicit none + + private + public f1,f2 + + contains + + integer function f1() + integer f2 + f1=5 + entry f2 + f2=8 + end function +end module + +program test + use foo + implicit none + print *,f2() +end program +! { dg-final { cleanup-modules "foo" } } diff --git a/gcc/testsuite/gfortran.dg/pr77260_2.f90 b/gcc/testsuite/gfortran.dg/pr77260_2.f90 new file mode 100644 index 000000000000..ea8da4f271c2 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr77260_2.f90 @@ -0,0 +1,26 @@ +! { dg-do compile } +! { dg-options "-Wall" } +module foo + + implicit none + + private + public f1,f2 + + contains + + integer function f1() + integer f2 + integer f3 ! { dg-warning "Unused variable" } + f1=5 + entry f2 + f2=8 + end function +end module + +program test + use foo + implicit none + print *,f2() +end program +! { dg-final { cleanup-modules "foo" } }