diff options
author | Janus Weil <janus@gcc.gnu.org> | 2018-06-10 10:20:50 +0200 |
---|---|---|
committer | Janus Weil <janus@gcc.gnu.org> | 2018-06-10 10:20:50 +0200 |
commit | ea20e8be960c53892f3fda4248b77616e7cf1444 (patch) | |
tree | 1070506fea961cca0fcb3dff25e39985cc681c96 /gcc | |
parent | 3a579cbe0781a62146c4ddf430ae0e40c3f75f0f (diff) | |
download | gcc-ea20e8be960c53892f3fda4248b77616e7cf1444.zip gcc-ea20e8be960c53892f3fda4248b77616e7cf1444.tar.gz gcc-ea20e8be960c53892f3fda4248b77616e7cf1444.tar.bz2 |
re PR fortran/85088 (improve diagnostic for bad INTENT declaration ('Invalid character in name at'))
2018-06-10 Janus Weil <janus@gcc.gnu.org>
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 <janus@gcc.gnu.org>
PR fortran/85088
* gfortran.dg/intent_decl_1.f90: New test case.
From-SVN: r261386
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/fortran/decl.c | 23 | ||||
-rw-r--r-- | gcc/fortran/gfortran.h | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/intent_decl_1.f90 | 11 |
5 files changed, 40 insertions, 11 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 7bfeac1..3b22db1 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2018-06-10 Janus Weil <janus@gcc.gnu.org> + + 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 <kargl@gcc.gnu.org> PR fortran/38351 diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index c36a16b..707c2a7 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 b7eaa0e..113ed3c 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 0578074..8693372 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ + +2018-06-10 Janus Weil <janus@gcc.gnu.org> + + PR fortran/85088 + * gfortran.dg/intent_decl_1.f90: New test case. + 2018-06-09 Steven G. Kargl <kargl@gcc.gnu.org> * 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 0000000..af848b8 --- /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 <janus@gcc.gnu.org> + +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 |