aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJanus Weil <janus@gcc.gnu.org>2018-06-10 10:20:50 +0200
committerJanus Weil <janus@gcc.gnu.org>2018-06-10 10:20:50 +0200
commitea20e8be960c53892f3fda4248b77616e7cf1444 (patch)
tree1070506fea961cca0fcb3dff25e39985cc681c96 /gcc
parent3a579cbe0781a62146c4ddf430ae0e40c3f75f0f (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/fortran/decl.c23
-rw-r--r--gcc/fortran/gfortran.h3
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gfortran.dg/intent_decl_1.f9011
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