From ea20e8be960c53892f3fda4248b77616e7cf1444 Mon Sep 17 00:00:00 2001 From: Janus Weil Date: Sun, 10 Jun 2018 10:20:50 +0200 Subject: [PATCH] re PR fortran/85088 (improve diagnostic for bad INTENT declaration ('Invalid character in name at')) 2018-06-10 Janus Weil PR fortran/85088 * decl.c (match_attr_spec): Synchronize the DECL_* enum values with the INTENT_* values from the enum 'sym_intent'. Call 'match_intent_spec' and remove a TODO note. * gfortran.h: Add a comment to sym_intent. 2018-06-10 Janus Weil PR fortran/85088 * gfortran.dg/intent_decl_1.f90: New test case. From-SVN: r261386 --- gcc/fortran/ChangeLog | 8 +++++++ gcc/fortran/decl.c | 23 ++++++++++++--------- gcc/fortran/gfortran.h | 3 ++- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gfortran.dg/intent_decl_1.f90 | 11 ++++++++++ 5 files changed, 40 insertions(+), 11 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/intent_decl_1.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 7bfeac1c8aa..3b22db13b14 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2018-06-10 Janus Weil + + PR fortran/85088 + * decl.c (match_attr_spec): Synchronize the DECL_* enum values with the + INTENT_* values from the enum 'sym_intent'. Call 'match_intent_spec' + and remove a TODO note. + * gfortran.h: Add a comment to sym_intent. + 2018-06-09 Steven G. Kargl PR fortran/38351 diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index c36a16ba5ac..707c2a74bbb 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -4726,9 +4726,10 @@ match_attr_spec (void) { /* Modifiers that can exist in a type statement. */ enum - { GFC_DECL_BEGIN = 0, - DECL_ALLOCATABLE = GFC_DECL_BEGIN, DECL_DIMENSION, DECL_EXTERNAL, - DECL_IN, DECL_OUT, DECL_INOUT, DECL_INTRINSIC, DECL_OPTIONAL, + { GFC_DECL_BEGIN = 0, DECL_ALLOCATABLE = GFC_DECL_BEGIN, + DECL_IN = INTENT_IN, DECL_OUT = INTENT_OUT, DECL_INOUT = INTENT_INOUT, + DECL_DIMENSION, DECL_EXTERNAL, + DECL_INTRINSIC, DECL_OPTIONAL, DECL_PARAMETER, DECL_POINTER, DECL_PROTECTED, DECL_PRIVATE, DECL_STATIC, DECL_AUTOMATIC, DECL_PUBLIC, DECL_SAVE, DECL_TARGET, DECL_VALUE, DECL_VOLATILE, @@ -4739,6 +4740,9 @@ match_attr_spec (void) /* GFC_DECL_END is the sentinel, index starts at 0. */ #define NUM_DECL GFC_DECL_END + /* Make sure that values from sym_intent are safe to be used here. */ + gcc_assert (INTENT_IN > 0); + locus start, seen_at[NUM_DECL]; int seen[NUM_DECL]; unsigned int d; @@ -4856,13 +4860,12 @@ match_attr_spec (void) if (match_string_p ("nt")) { /* Matched "intent". */ - /* TODO: Call match_intent_spec from here. */ - if (gfc_match (" ( in out )") == MATCH_YES) - d = DECL_INOUT; - else if (gfc_match (" ( in )") == MATCH_YES) - d = DECL_IN; - else if (gfc_match (" ( out )") == MATCH_YES) - d = DECL_OUT; + d = match_intent_spec (); + if (d == INTENT_UNKNOWN) + { + m = MATCH_ERROR; + goto cleanup; + } } } else if (ch == 'r') diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index b7eaa0e35ab..113ed3c1e63 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -291,7 +291,8 @@ enum procedure_type PROC_INTRINSIC, PROC_ST_FUNCTION, PROC_EXTERNAL }; -/* Intent types. */ +/* Intent types. Note that these values are also used in another enum in + decl.c (match_attr_spec). */ enum sym_intent { INTENT_UNKNOWN = 0, INTENT_IN, INTENT_OUT, INTENT_INOUT }; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 05780742b56..8693372a3cf 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ + +2018-06-10 Janus Weil + + PR fortran/85088 + * gfortran.dg/intent_decl_1.f90: New test case. + 2018-06-09 Steven G. Kargl * gfortran.dg/ieee/ieee_4.f90: xfail on i?86-*-freebsd* diff --git a/gcc/testsuite/gfortran.dg/intent_decl_1.f90 b/gcc/testsuite/gfortran.dg/intent_decl_1.f90 new file mode 100644 index 00000000000..af848b8f755 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/intent_decl_1.f90 @@ -0,0 +1,11 @@ +! { dg-do compile } +! +! PR 85088: improve diagnostic for bad INTENT declaration +! +! Contributed by Janus Weil + +subroutine s(x, y, z) + integer, intent(int) :: x ! { dg-error "Bad INTENT specification" } + integer, intent :: y ! { dg-error "Bad INTENT specification" } + integer, inten :: z ! { dg-error "Invalid character" } +end -- 2.30.2