+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
{
/* 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,
/* 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;
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')
--- /dev/null
+! { 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