2004-07-28 Eric Christopher <echristo@redhat.com>
[official-gcc.git] / gcc / fortran / decl.c
blob3a78efc65609cbcac7a80f5e914b9ee30d5f09dd
1 /* Declaration statement matcher
2 Copyright (C) 2002, 2004 Free Software Foundation, Inc.
3 Contributed by Andy Vaught
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
23 #include "config.h"
24 #include "gfortran.h"
25 #include "match.h"
26 #include "parse.h"
27 #include <string.h>
30 /* This flag is set if a an old-style length selector is matched
31 during a type-declaration statement. */
33 static int old_char_selector;
35 /* When variables aquire types and attributes from a declaration
36 statement, they get them from the following static variables. The
37 first part of a declaration sets these variables and the second
38 part copies these into symbol structures. */
40 static gfc_typespec current_ts;
42 static symbol_attribute current_attr;
43 static gfc_array_spec *current_as;
44 static int colon_seen;
46 /* gfc_new_block points to the symbol of a newly matched block. */
48 gfc_symbol *gfc_new_block;
51 /* Match an intent specification. Since this can only happen after an
52 INTENT word, a legal intent-spec must follow. */
54 static sym_intent
55 match_intent_spec (void)
58 if (gfc_match (" ( in out )") == MATCH_YES)
59 return INTENT_INOUT;
60 if (gfc_match (" ( in )") == MATCH_YES)
61 return INTENT_IN;
62 if (gfc_match (" ( out )") == MATCH_YES)
63 return INTENT_OUT;
65 gfc_error ("Bad INTENT specification at %C");
66 return INTENT_UNKNOWN;
70 /* Matches a character length specification, which is either a
71 specification expression or a '*'. */
73 static match
74 char_len_param_value (gfc_expr ** expr)
77 if (gfc_match_char ('*') == MATCH_YES)
79 *expr = NULL;
80 return MATCH_YES;
83 return gfc_match_expr (expr);
87 /* A character length is a '*' followed by a literal integer or a
88 char_len_param_value in parenthesis. */
90 static match
91 match_char_length (gfc_expr ** expr)
93 int length;
94 match m;
96 m = gfc_match_char ('*');
97 if (m != MATCH_YES)
98 return m;
100 m = gfc_match_small_literal_int (&length);
101 if (m == MATCH_ERROR)
102 return m;
104 if (m == MATCH_YES)
106 *expr = gfc_int_expr (length);
107 return m;
110 if (gfc_match_char ('(') == MATCH_NO)
111 goto syntax;
113 m = char_len_param_value (expr);
114 if (m == MATCH_ERROR)
115 return m;
116 if (m == MATCH_NO)
117 goto syntax;
119 if (gfc_match_char (')') == MATCH_NO)
121 gfc_free_expr (*expr);
122 *expr = NULL;
123 goto syntax;
126 return MATCH_YES;
128 syntax:
129 gfc_error ("Syntax error in character length specification at %C");
130 return MATCH_ERROR;
134 /* Special subroutine for finding a symbol. If we're compiling a
135 function or subroutine and the parent compilation unit is an
136 interface, then check to see if the name we've been given is the
137 name of the interface (located in another namespace). If so,
138 return that symbol. If not, use gfc_get_symbol(). */
140 static int
141 find_special (const char *name, gfc_symbol ** result)
143 gfc_state_data *s;
145 if (gfc_current_state () != COMP_SUBROUTINE
146 && gfc_current_state () != COMP_FUNCTION)
147 goto normal;
149 s = gfc_state_stack->previous;
150 if (s == NULL)
151 goto normal;
153 if (s->state != COMP_INTERFACE)
154 goto normal;
155 if (s->sym == NULL)
156 goto normal; /* Nameless interface */
158 if (strcmp (name, s->sym->name) == 0)
160 *result = s->sym;
161 return 0;
164 normal:
165 return gfc_get_symbol (name, NULL, result);
169 /* Special subroutine for getting a symbol node associated with a
170 procedure name, used in SUBROUTINE and FUNCTION statements. The
171 symbol is created in the parent using with symtree node in the
172 child unit pointing to the symbol. If the current namespace has no
173 parent, then the symbol is just created in the current unit. */
175 static int
176 get_proc_name (const char *name, gfc_symbol ** result)
178 gfc_symtree *st;
179 gfc_symbol *sym;
180 int rc;
182 if (gfc_current_ns->parent == NULL)
183 return gfc_get_symbol (name, NULL, result);
185 rc = gfc_get_symbol (name, gfc_current_ns->parent, result);
186 if (*result == NULL)
187 return rc;
189 /* Deal with ENTRY problem */
191 st = gfc_new_symtree (&gfc_current_ns->sym_root, name);
193 sym = *result;
194 st->n.sym = sym;
195 sym->refs++;
197 /* See if the procedure should be a module procedure */
199 if (sym->ns->proc_name != NULL
200 && sym->ns->proc_name->attr.flavor == FL_MODULE
201 && sym->attr.proc != PROC_MODULE
202 && gfc_add_procedure (&sym->attr, PROC_MODULE, NULL) == FAILURE)
203 rc = 2;
205 return rc;
209 /* Function called by variable_decl() that adds a name to the symbol
210 table. */
212 static try
213 build_sym (const char *name, gfc_charlen * cl,
214 gfc_array_spec ** as, locus * var_locus)
216 symbol_attribute attr;
217 gfc_symbol *sym;
219 if (find_special (name, &sym))
220 return FAILURE;
222 /* Start updating the symbol table. Add basic type attribute
223 if present. */
224 if (current_ts.type != BT_UNKNOWN
225 &&(sym->attr.implicit_type == 0
226 || !gfc_compare_types (&sym->ts, &current_ts))
227 && gfc_add_type (sym, &current_ts, var_locus) == FAILURE)
228 return FAILURE;
230 if (sym->ts.type == BT_CHARACTER)
231 sym->ts.cl = cl;
233 /* Add dimension attribute if present. */
234 if (gfc_set_array_spec (sym, *as, var_locus) == FAILURE)
235 return FAILURE;
236 *as = NULL;
238 /* Add attribute to symbol. The copy is so that we can reset the
239 dimension attribute. */
240 attr = current_attr;
241 attr.dimension = 0;
243 if (gfc_copy_attr (&sym->attr, &attr, var_locus) == FAILURE)
244 return FAILURE;
246 return SUCCESS;
250 /* Function called by variable_decl() that adds an initialization
251 expression to a symbol. */
253 static try
254 add_init_expr_to_sym (const char *name, gfc_expr ** initp,
255 locus * var_locus)
257 symbol_attribute attr;
258 gfc_symbol *sym;
259 gfc_expr *init;
261 init = *initp;
262 if (find_special (name, &sym))
263 return FAILURE;
265 attr = sym->attr;
267 /* If this symbol is confirming an implicit parameter type,
268 then an initialization expression is not allowed. */
269 if (attr.flavor == FL_PARAMETER
270 && sym->value != NULL
271 && *initp != NULL)
273 gfc_error ("Initializer not allowed for PARAMETER '%s' at %C",
274 sym->name);
275 return FAILURE;
278 if (attr.in_common
279 && !attr.data
280 && *initp != NULL)
282 gfc_error ("Initializer not allowed for COMMON variable '%s' at %C",
283 sym->name);
284 return FAILURE;
287 if (init == NULL)
289 /* An initializer is required for PARAMETER declarations. */
290 if (attr.flavor == FL_PARAMETER)
292 gfc_error ("PARAMETER at %L is missing an initializer", var_locus);
293 return FAILURE;
296 else
298 /* If a variable appears in a DATA block, it cannot have an
299 initializer. */
300 if (sym->attr.data)
302 gfc_error
303 ("Variable '%s' at %C with an initializer already appears "
304 "in a DATA statement", sym->name);
305 return FAILURE;
308 /* Checking a derived type parameter has to be put off until later. */
309 if (sym->ts.type != BT_DERIVED && init->ts.type != BT_DERIVED
310 && gfc_check_assign_symbol (sym, init) == FAILURE)
311 return FAILURE;
313 /* Add initializer. Make sure we keep the ranks sane. */
314 if (sym->attr.dimension && init->rank == 0)
315 init->rank = sym->as->rank;
317 sym->value = init;
318 *initp = NULL;
321 return SUCCESS;
325 /* Function called by variable_decl() that adds a name to a structure
326 being built. */
328 static try
329 build_struct (const char *name, gfc_charlen * cl, gfc_expr ** init,
330 gfc_array_spec ** as)
332 gfc_component *c;
334 /* If the current symbol is of the same derived type that we're
335 constructing, it must have the pointer attribute. */
336 if (current_ts.type == BT_DERIVED
337 && current_ts.derived == gfc_current_block ()
338 && current_attr.pointer == 0)
340 gfc_error ("Component at %C must have the POINTER attribute");
341 return FAILURE;
344 if (gfc_current_block ()->attr.pointer
345 && (*as)->rank != 0)
347 if ((*as)->type != AS_DEFERRED && (*as)->type != AS_EXPLICIT)
349 gfc_error ("Array component of structure at %C must have explicit "
350 "or deferred shape");
351 return FAILURE;
355 if (gfc_add_component (gfc_current_block (), name, &c) == FAILURE)
356 return FAILURE;
358 c->ts = current_ts;
359 c->ts.cl = cl;
360 gfc_set_component_attr (c, &current_attr);
362 c->initializer = *init;
363 *init = NULL;
365 c->as = *as;
366 if (c->as != NULL)
367 c->dimension = 1;
368 *as = NULL;
370 /* Check array components. */
371 if (!c->dimension)
372 return SUCCESS;
374 if (c->pointer)
376 if (c->as->type != AS_DEFERRED)
378 gfc_error ("Pointer array component of structure at %C "
379 "must have a deferred shape");
380 return FAILURE;
383 else
385 if (c->as->type != AS_EXPLICIT)
387 gfc_error
388 ("Array component of structure at %C must have an explicit "
389 "shape");
390 return FAILURE;
394 return SUCCESS;
398 /* Match a 'NULL()', and possibly take care of some side effects. */
400 match
401 gfc_match_null (gfc_expr ** result)
403 gfc_symbol *sym;
404 gfc_expr *e;
405 match m;
407 m = gfc_match (" null ( )");
408 if (m != MATCH_YES)
409 return m;
411 /* The NULL symbol now has to be/become an intrinsic function. */
412 if (gfc_get_symbol ("null", NULL, &sym))
414 gfc_error ("NULL() initialization at %C is ambiguous");
415 return MATCH_ERROR;
418 gfc_intrinsic_symbol (sym);
420 if (sym->attr.proc != PROC_INTRINSIC
421 && (gfc_add_procedure (&sym->attr, PROC_INTRINSIC, NULL) == FAILURE
422 || gfc_add_function (&sym->attr, NULL) == FAILURE))
423 return MATCH_ERROR;
425 e = gfc_get_expr ();
426 e->where = gfc_current_locus;
427 e->expr_type = EXPR_NULL;
428 e->ts.type = BT_UNKNOWN;
430 *result = e;
432 return MATCH_YES;
436 /* Match a variable name with an optional initializer. When this
437 subroutine is called, a variable is expected to be parsed next.
438 Depending on what is happening at the moment, updates either the
439 symbol table or the current interface. */
441 static match
442 variable_decl (void)
444 char name[GFC_MAX_SYMBOL_LEN + 1];
445 gfc_expr *initializer, *char_len;
446 gfc_array_spec *as;
447 gfc_charlen *cl;
448 locus var_locus;
449 match m;
450 try t;
452 initializer = NULL;
453 as = NULL;
455 /* When we get here, we've just matched a list of attributes and
456 maybe a type and a double colon. The next thing we expect to see
457 is the name of the symbol. */
458 m = gfc_match_name (name);
459 if (m != MATCH_YES)
460 goto cleanup;
462 var_locus = gfc_current_locus;
464 /* Now we could see the optional array spec. or character length. */
465 m = gfc_match_array_spec (&as);
466 if (m == MATCH_ERROR)
467 goto cleanup;
468 if (m == MATCH_NO)
469 as = gfc_copy_array_spec (current_as);
471 char_len = NULL;
472 cl = NULL;
474 if (current_ts.type == BT_CHARACTER)
476 switch (match_char_length (&char_len))
478 case MATCH_YES:
479 cl = gfc_get_charlen ();
480 cl->next = gfc_current_ns->cl_list;
481 gfc_current_ns->cl_list = cl;
483 cl->length = char_len;
484 break;
486 case MATCH_NO:
487 cl = current_ts.cl;
488 break;
490 case MATCH_ERROR:
491 goto cleanup;
495 /* OK, we've successfully matched the declaration. Now put the
496 symbol in the current namespace, because it might be used in the
497 optional intialization expression for this symbol, e.g. this is
498 perfectly legal:
500 integer, parameter :: i = huge(i)
502 This is only true for parameters or variables of a basic type.
503 For components of derived types, it is not true, so we don't
504 create a symbol for those yet. If we fail to create the symbol,
505 bail out. */
506 if (gfc_current_state () != COMP_DERIVED
507 && build_sym (name, cl, &as, &var_locus) == FAILURE)
509 m = MATCH_ERROR;
510 goto cleanup;
513 /* In functions that have a RESULT variable defined, the function
514 name always refers to function calls. Therefore, the name is
515 not allowed to appear in specification statements. */
516 if (gfc_current_state () == COMP_FUNCTION
517 && gfc_current_block () != NULL
518 && gfc_current_block ()->result != NULL
519 && gfc_current_block ()->result != gfc_current_block ()
520 && strcmp (gfc_current_block ()->name, name) == 0)
522 gfc_error ("Function name '%s' not allowed at %C", name);
523 m = MATCH_ERROR;
524 goto cleanup;
527 /* The double colon must be present in order to have initializers.
528 Otherwise the statement is ambiguous with an assignment statement. */
529 if (colon_seen)
531 if (gfc_match (" =>") == MATCH_YES)
534 if (!current_attr.pointer)
536 gfc_error ("Initialization at %C isn't for a pointer variable");
537 m = MATCH_ERROR;
538 goto cleanup;
541 m = gfc_match_null (&initializer);
542 if (m == MATCH_NO)
544 gfc_error ("Pointer initialization requires a NULL at %C");
545 m = MATCH_ERROR;
548 if (gfc_pure (NULL))
550 gfc_error
551 ("Initialization of pointer at %C is not allowed in a "
552 "PURE procedure");
553 m = MATCH_ERROR;
556 if (m != MATCH_YES)
557 goto cleanup;
559 initializer->ts = current_ts;
562 else if (gfc_match_char ('=') == MATCH_YES)
564 if (current_attr.pointer)
566 gfc_error
567 ("Pointer initialization at %C requires '=>', not '='");
568 m = MATCH_ERROR;
569 goto cleanup;
572 m = gfc_match_init_expr (&initializer);
573 if (m == MATCH_NO)
575 gfc_error ("Expected an initialization expression at %C");
576 m = MATCH_ERROR;
579 if (current_attr.flavor != FL_PARAMETER && gfc_pure (NULL))
581 gfc_error
582 ("Initialization of variable at %C is not allowed in a "
583 "PURE procedure");
584 m = MATCH_ERROR;
587 if (m != MATCH_YES)
588 goto cleanup;
592 /* Add the initializer. Note that it is fine if initializer is
593 NULL here, because we sometimes also need to check if a
594 declaration *must* have an initialization expression. */
595 if (gfc_current_state () != COMP_DERIVED)
596 t = add_init_expr_to_sym (name, &initializer, &var_locus);
597 else
599 if (current_ts.type == BT_DERIVED && !initializer)
600 initializer = gfc_default_initializer (&current_ts);
601 t = build_struct (name, cl, &initializer, &as);
604 m = (t == SUCCESS) ? MATCH_YES : MATCH_ERROR;
606 cleanup:
607 /* Free stuff up and return. */
608 gfc_free_expr (initializer);
609 gfc_free_array_spec (as);
611 return m;
615 /* Match an extended-f77 kind specification. */
617 match
618 gfc_match_old_kind_spec (gfc_typespec * ts)
620 match m;
622 if (gfc_match_char ('*') != MATCH_YES)
623 return MATCH_NO;
625 m = gfc_match_small_literal_int (&ts->kind);
626 if (m != MATCH_YES)
627 return MATCH_ERROR;
629 /* Massage the kind numbers for complex types. */
630 if (ts->type == BT_COMPLEX && ts->kind == 8)
631 ts->kind = 4;
632 if (ts->type == BT_COMPLEX && ts->kind == 16)
633 ts->kind = 8;
635 if (gfc_validate_kind (ts->type, ts->kind) == -1)
637 gfc_error ("Old-style kind %d not supported for type %s at %C",
638 ts->kind, gfc_basic_typename (ts->type));
640 return MATCH_ERROR;
643 return MATCH_YES;
647 /* Match a kind specification. Since kinds are generally optional, we
648 usually return MATCH_NO if something goes wrong. If a "kind="
649 string is found, then we know we have an error. */
651 match
652 gfc_match_kind_spec (gfc_typespec * ts)
654 locus where;
655 gfc_expr *e;
656 match m, n;
657 const char *msg;
659 m = MATCH_NO;
660 e = NULL;
662 where = gfc_current_locus;
664 if (gfc_match_char ('(') == MATCH_NO)
665 return MATCH_NO;
667 /* Also gobbles optional text. */
668 if (gfc_match (" kind = ") == MATCH_YES)
669 m = MATCH_ERROR;
671 n = gfc_match_init_expr (&e);
672 if (n == MATCH_NO)
673 gfc_error ("Expected initialization expression at %C");
674 if (n != MATCH_YES)
675 return MATCH_ERROR;
677 if (e->rank != 0)
679 gfc_error ("Expected scalar initialization expression at %C");
680 m = MATCH_ERROR;
681 goto no_match;
684 msg = gfc_extract_int (e, &ts->kind);
685 if (msg != NULL)
687 gfc_error (msg);
688 m = MATCH_ERROR;
689 goto no_match;
692 gfc_free_expr (e);
693 e = NULL;
695 if (gfc_validate_kind (ts->type, ts->kind) == -1)
697 gfc_error ("Kind %d not supported for type %s at %C", ts->kind,
698 gfc_basic_typename (ts->type));
700 m = MATCH_ERROR;
701 goto no_match;
704 if (gfc_match_char (')') != MATCH_YES)
706 gfc_error ("Missing right paren at %C");
707 goto no_match;
710 return MATCH_YES;
712 no_match:
713 gfc_free_expr (e);
714 gfc_current_locus = where;
715 return m;
719 /* Match the various kind/length specifications in a CHARACTER
720 declaration. We don't return MATCH_NO. */
722 static match
723 match_char_spec (gfc_typespec * ts)
725 int i, kind, seen_length;
726 gfc_charlen *cl;
727 gfc_expr *len;
728 match m;
730 kind = gfc_default_character_kind ();
731 len = NULL;
732 seen_length = 0;
734 /* Try the old-style specification first. */
735 old_char_selector = 0;
737 m = match_char_length (&len);
738 if (m != MATCH_NO)
740 if (m == MATCH_YES)
741 old_char_selector = 1;
742 seen_length = 1;
743 goto done;
746 m = gfc_match_char ('(');
747 if (m != MATCH_YES)
749 m = MATCH_YES; /* character without length is a single char */
750 goto done;
753 /* Try the weird case: ( KIND = <int> [ , LEN = <len-param> ] ) */
754 if (gfc_match (" kind =") == MATCH_YES)
756 m = gfc_match_small_int (&kind);
757 if (m == MATCH_ERROR)
758 goto done;
759 if (m == MATCH_NO)
760 goto syntax;
762 if (gfc_match (" , len =") == MATCH_NO)
763 goto rparen;
765 m = char_len_param_value (&len);
766 if (m == MATCH_NO)
767 goto syntax;
768 if (m == MATCH_ERROR)
769 goto done;
770 seen_length = 1;
772 goto rparen;
775 /* Try to match ( LEN = <len-param> ) or ( LEN = <len-param>, KIND = <int> ) */
776 if (gfc_match (" len =") == MATCH_YES)
778 m = char_len_param_value (&len);
779 if (m == MATCH_NO)
780 goto syntax;
781 if (m == MATCH_ERROR)
782 goto done;
783 seen_length = 1;
785 if (gfc_match_char (')') == MATCH_YES)
786 goto done;
788 if (gfc_match (" , kind =") != MATCH_YES)
789 goto syntax;
791 gfc_match_small_int (&kind);
793 if (gfc_validate_kind (BT_CHARACTER, kind) == -1)
795 gfc_error ("Kind %d is not a CHARACTER kind at %C", kind);
796 return MATCH_YES;
799 goto rparen;
802 /* Try to match ( <len-param> ) or ( <len-param> , [ KIND = ] <int> ) */
803 m = char_len_param_value (&len);
804 if (m == MATCH_NO)
805 goto syntax;
806 if (m == MATCH_ERROR)
807 goto done;
808 seen_length = 1;
810 m = gfc_match_char (')');
811 if (m == MATCH_YES)
812 goto done;
814 if (gfc_match_char (',') != MATCH_YES)
815 goto syntax;
817 gfc_match (" kind ="); /* Gobble optional text */
819 m = gfc_match_small_int (&kind);
820 if (m == MATCH_ERROR)
821 goto done;
822 if (m == MATCH_NO)
823 goto syntax;
825 rparen:
826 /* Require a right-paren at this point. */
827 m = gfc_match_char (')');
828 if (m == MATCH_YES)
829 goto done;
831 syntax:
832 gfc_error ("Syntax error in CHARACTER declaration at %C");
833 m = MATCH_ERROR;
835 done:
836 if (m == MATCH_YES && gfc_validate_kind (BT_CHARACTER, kind) == -1)
838 gfc_error ("Kind %d is not a CHARACTER kind at %C", kind);
839 m = MATCH_ERROR;
842 if (m != MATCH_YES)
844 gfc_free_expr (len);
845 return m;
848 /* Do some final massaging of the length values. */
849 cl = gfc_get_charlen ();
850 cl->next = gfc_current_ns->cl_list;
851 gfc_current_ns->cl_list = cl;
853 if (seen_length == 0)
854 cl->length = gfc_int_expr (1);
855 else
857 if (len == NULL || gfc_extract_int (len, &i) != NULL || i >= 0)
858 cl->length = len;
859 else
861 gfc_free_expr (len);
862 cl->length = gfc_int_expr (0);
866 ts->cl = cl;
867 ts->kind = kind;
869 return MATCH_YES;
873 /* Matches a type specification. If successful, sets the ts structure
874 to the matched specification. This is necessary for FUNCTION and
875 IMPLICIT statements.
877 If implicit_flag is nonzero, then we don't check for the optional
878 kind specification. Not doing so is needed for matching an IMPLICIT
879 statement correctly. */
881 static match
882 match_type_spec (gfc_typespec * ts, int implicit_flag)
884 char name[GFC_MAX_SYMBOL_LEN + 1];
885 gfc_symbol *sym;
886 match m;
887 int c;
889 gfc_clear_ts (ts);
891 if (gfc_match (" integer") == MATCH_YES)
893 ts->type = BT_INTEGER;
894 ts->kind = gfc_default_integer_kind ();
895 goto get_kind;
898 if (gfc_match (" character") == MATCH_YES)
900 ts->type = BT_CHARACTER;
901 if (implicit_flag == 0)
902 return match_char_spec (ts);
903 else
904 return MATCH_YES;
907 if (gfc_match (" real") == MATCH_YES)
909 ts->type = BT_REAL;
910 ts->kind = gfc_default_real_kind ();
911 goto get_kind;
914 if (gfc_match (" double precision") == MATCH_YES)
916 ts->type = BT_REAL;
917 ts->kind = gfc_default_double_kind ();
918 return MATCH_YES;
921 if (gfc_match (" complex") == MATCH_YES)
923 ts->type = BT_COMPLEX;
924 ts->kind = gfc_default_complex_kind ();
925 goto get_kind;
928 if (gfc_match (" double complex") == MATCH_YES)
930 ts->type = BT_COMPLEX;
931 ts->kind = gfc_default_double_kind ();
932 return MATCH_YES;
935 if (gfc_match (" logical") == MATCH_YES)
937 ts->type = BT_LOGICAL;
938 ts->kind = gfc_default_logical_kind ();
939 goto get_kind;
942 m = gfc_match (" type ( %n )", name);
943 if (m != MATCH_YES)
944 return m;
946 /* Search for the name but allow the components to be defined later. */
947 if (gfc_get_ha_symbol (name, &sym))
949 gfc_error ("Type name '%s' at %C is ambiguous", name);
950 return MATCH_ERROR;
953 if (sym->attr.flavor != FL_DERIVED
954 && gfc_add_flavor (&sym->attr, FL_DERIVED, NULL) == FAILURE)
955 return MATCH_ERROR;
957 ts->type = BT_DERIVED;
958 ts->kind = 0;
959 ts->derived = sym;
961 return MATCH_YES;
963 get_kind:
964 /* For all types except double, derived and character, look for an
965 optional kind specifier. MATCH_NO is actually OK at this point. */
966 if (implicit_flag == 1)
967 return MATCH_YES;
969 if (gfc_current_form == FORM_FREE)
971 c = gfc_peek_char();
972 if (!gfc_is_whitespace(c) && c != '*' && c != '('
973 && c != ':' && c != ',')
974 return MATCH_NO;
977 m = gfc_match_kind_spec (ts);
978 if (m == MATCH_NO && ts->type != BT_CHARACTER)
979 m = gfc_match_old_kind_spec (ts);
981 if (m == MATCH_NO)
982 m = MATCH_YES; /* No kind specifier found. */
984 return m;
988 /* Match an IMPLICIT NONE statement. Actually, this statement is
989 already matched in parse.c, or we would not end up here in the
990 first place. So the only thing we need to check, is if there is
991 trailing garbage. If not, the match is successful. */
993 match
994 gfc_match_implicit_none (void)
997 return (gfc_match_eos () == MATCH_YES) ? MATCH_YES : MATCH_NO;
1001 /* Match the letter range(s) of an IMPLICIT statement. */
1003 static match
1004 match_implicit_range (void)
1006 int c, c1, c2, inner;
1007 locus cur_loc;
1009 cur_loc = gfc_current_locus;
1011 gfc_gobble_whitespace ();
1012 c = gfc_next_char ();
1013 if (c != '(')
1015 gfc_error ("Missing character range in IMPLICIT at %C");
1016 goto bad;
1019 inner = 1;
1020 while (inner)
1022 gfc_gobble_whitespace ();
1023 c1 = gfc_next_char ();
1024 if (!ISALPHA (c1))
1025 goto bad;
1027 gfc_gobble_whitespace ();
1028 c = gfc_next_char ();
1030 switch (c)
1032 case ')':
1033 inner = 0; /* Fall through */
1035 case ',':
1036 c2 = c1;
1037 break;
1039 case '-':
1040 gfc_gobble_whitespace ();
1041 c2 = gfc_next_char ();
1042 if (!ISALPHA (c2))
1043 goto bad;
1045 gfc_gobble_whitespace ();
1046 c = gfc_next_char ();
1048 if ((c != ',') && (c != ')'))
1049 goto bad;
1050 if (c == ')')
1051 inner = 0;
1053 break;
1055 default:
1056 goto bad;
1059 if (c1 > c2)
1061 gfc_error ("Letters must be in alphabetic order in "
1062 "IMPLICIT statement at %C");
1063 goto bad;
1066 /* See if we can add the newly matched range to the pending
1067 implicits from this IMPLICIT statement. We do not check for
1068 conflicts with whatever earlier IMPLICIT statements may have
1069 set. This is done when we've successfully finished matching
1070 the current one. */
1071 if (gfc_add_new_implicit_range (c1, c2) != SUCCESS)
1072 goto bad;
1075 return MATCH_YES;
1077 bad:
1078 gfc_syntax_error (ST_IMPLICIT);
1080 gfc_current_locus = cur_loc;
1081 return MATCH_ERROR;
1085 /* Match an IMPLICIT statement, storing the types for
1086 gfc_set_implicit() if the statement is accepted by the parser.
1087 There is a strange looking, but legal syntactic construction
1088 possible. It looks like:
1090 IMPLICIT INTEGER (a-b) (c-d)
1092 This is legal if "a-b" is a constant expression that happens to
1093 equal one of the legal kinds for integers. The real problem
1094 happens with an implicit specification that looks like:
1096 IMPLICIT INTEGER (a-b)
1098 In this case, a typespec matcher that is "greedy" (as most of the
1099 matchers are) gobbles the character range as a kindspec, leaving
1100 nothing left. We therefore have to go a bit more slowly in the
1101 matching process by inhibiting the kindspec checking during
1102 typespec matching and checking for a kind later. */
1104 match
1105 gfc_match_implicit (void)
1107 gfc_typespec ts;
1108 locus cur_loc;
1109 int c;
1110 match m;
1112 /* We don't allow empty implicit statements. */
1113 if (gfc_match_eos () == MATCH_YES)
1115 gfc_error ("Empty IMPLICIT statement at %C");
1116 return MATCH_ERROR;
1121 /* First cleanup. */
1122 gfc_clear_new_implicit ();
1124 /* A basic type is mandatory here. */
1125 m = match_type_spec (&ts, 1);
1126 if (m == MATCH_ERROR)
1127 goto error;
1128 if (m == MATCH_NO)
1129 goto syntax;
1131 cur_loc = gfc_current_locus;
1132 m = match_implicit_range ();
1134 if (m == MATCH_YES)
1136 /* We may have <TYPE> (<RANGE>). */
1137 gfc_gobble_whitespace ();
1138 c = gfc_next_char ();
1139 if ((c == '\n') || (c == ','))
1141 /* Check for CHARACTER with no length parameter. */
1142 if (ts.type == BT_CHARACTER && !ts.cl)
1144 ts.kind = gfc_default_character_kind ();
1145 ts.cl = gfc_get_charlen ();
1146 ts.cl->next = gfc_current_ns->cl_list;
1147 gfc_current_ns->cl_list = ts.cl;
1148 ts.cl->length = gfc_int_expr (1);
1151 /* Record the Successful match. */
1152 if (gfc_merge_new_implicit (&ts) != SUCCESS)
1153 return MATCH_ERROR;
1154 continue;
1157 gfc_current_locus = cur_loc;
1160 /* Discard the (incorrectly) matched range. */
1161 gfc_clear_new_implicit ();
1163 /* Last chance -- check <TYPE> <SELECTOR> (<RANGE>). */
1164 if (ts.type == BT_CHARACTER)
1165 m = match_char_spec (&ts);
1166 else
1168 m = gfc_match_kind_spec (&ts);
1169 if (m == MATCH_NO)
1171 m = gfc_match_old_kind_spec (&ts);
1172 if (m == MATCH_ERROR)
1173 goto error;
1174 if (m == MATCH_NO)
1175 goto syntax;
1178 if (m == MATCH_ERROR)
1179 goto error;
1181 m = match_implicit_range ();
1182 if (m == MATCH_ERROR)
1183 goto error;
1184 if (m == MATCH_NO)
1185 goto syntax;
1187 gfc_gobble_whitespace ();
1188 c = gfc_next_char ();
1189 if ((c != '\n') && (c != ','))
1190 goto syntax;
1192 if (gfc_merge_new_implicit (&ts) != SUCCESS)
1193 return MATCH_ERROR;
1195 while (c == ',');
1197 return MATCH_YES;
1199 syntax:
1200 gfc_syntax_error (ST_IMPLICIT);
1202 error:
1203 return MATCH_ERROR;
1207 /* Matches an attribute specification including array specs. If
1208 successful, leaves the variables current_attr and current_as
1209 holding the specification. Also sets the colon_seen variable for
1210 later use by matchers associated with initializations.
1212 This subroutine is a little tricky in the sense that we don't know
1213 if we really have an attr-spec until we hit the double colon.
1214 Until that time, we can only return MATCH_NO. This forces us to
1215 check for duplicate specification at this level. */
1217 static match
1218 match_attr_spec (void)
1221 /* Modifiers that can exist in a type statement. */
1222 typedef enum
1223 { GFC_DECL_BEGIN = 0,
1224 DECL_ALLOCATABLE = GFC_DECL_BEGIN, DECL_DIMENSION, DECL_EXTERNAL,
1225 DECL_IN, DECL_OUT, DECL_INOUT, DECL_INTRINSIC, DECL_OPTIONAL,
1226 DECL_PARAMETER, DECL_POINTER, DECL_PRIVATE, DECL_PUBLIC, DECL_SAVE,
1227 DECL_TARGET, DECL_COLON, DECL_NONE,
1228 GFC_DECL_END /* Sentinel */
1230 decl_types;
1232 /* GFC_DECL_END is the sentinel, index starts at 0. */
1233 #define NUM_DECL GFC_DECL_END
1235 static mstring decls[] = {
1236 minit (", allocatable", DECL_ALLOCATABLE),
1237 minit (", dimension", DECL_DIMENSION),
1238 minit (", external", DECL_EXTERNAL),
1239 minit (", intent ( in )", DECL_IN),
1240 minit (", intent ( out )", DECL_OUT),
1241 minit (", intent ( in out )", DECL_INOUT),
1242 minit (", intrinsic", DECL_INTRINSIC),
1243 minit (", optional", DECL_OPTIONAL),
1244 minit (", parameter", DECL_PARAMETER),
1245 minit (", pointer", DECL_POINTER),
1246 minit (", private", DECL_PRIVATE),
1247 minit (", public", DECL_PUBLIC),
1248 minit (", save", DECL_SAVE),
1249 minit (", target", DECL_TARGET),
1250 minit ("::", DECL_COLON),
1251 minit (NULL, DECL_NONE)
1254 locus start, seen_at[NUM_DECL];
1255 int seen[NUM_DECL];
1256 decl_types d;
1257 const char *attr;
1258 match m;
1259 try t;
1261 gfc_clear_attr (&current_attr);
1262 start = gfc_current_locus;
1264 current_as = NULL;
1265 colon_seen = 0;
1267 /* See if we get all of the keywords up to the final double colon. */
1268 for (d = GFC_DECL_BEGIN; d != GFC_DECL_END; d++)
1269 seen[d] = 0;
1271 for (;;)
1273 d = (decl_types) gfc_match_strings (decls);
1274 if (d == DECL_NONE || d == DECL_COLON)
1275 break;
1277 seen[d]++;
1278 seen_at[d] = gfc_current_locus;
1280 if (d == DECL_DIMENSION)
1282 m = gfc_match_array_spec (&current_as);
1284 if (m == MATCH_NO)
1286 gfc_error ("Missing dimension specification at %C");
1287 m = MATCH_ERROR;
1290 if (m == MATCH_ERROR)
1291 goto cleanup;
1295 /* No double colon, so assume that we've been looking at something
1296 else the whole time. */
1297 if (d == DECL_NONE)
1299 m = MATCH_NO;
1300 goto cleanup;
1303 /* Since we've seen a double colon, we have to be looking at an
1304 attr-spec. This means that we can now issue errors. */
1305 for (d = GFC_DECL_BEGIN; d != GFC_DECL_END; d++)
1306 if (seen[d] > 1)
1308 switch (d)
1310 case DECL_ALLOCATABLE:
1311 attr = "ALLOCATABLE";
1312 break;
1313 case DECL_DIMENSION:
1314 attr = "DIMENSION";
1315 break;
1316 case DECL_EXTERNAL:
1317 attr = "EXTERNAL";
1318 break;
1319 case DECL_IN:
1320 attr = "INTENT (IN)";
1321 break;
1322 case DECL_OUT:
1323 attr = "INTENT (OUT)";
1324 break;
1325 case DECL_INOUT:
1326 attr = "INTENT (IN OUT)";
1327 break;
1328 case DECL_INTRINSIC:
1329 attr = "INTRINSIC";
1330 break;
1331 case DECL_OPTIONAL:
1332 attr = "OPTIONAL";
1333 break;
1334 case DECL_PARAMETER:
1335 attr = "PARAMETER";
1336 break;
1337 case DECL_POINTER:
1338 attr = "POINTER";
1339 break;
1340 case DECL_PRIVATE:
1341 attr = "PRIVATE";
1342 break;
1343 case DECL_PUBLIC:
1344 attr = "PUBLIC";
1345 break;
1346 case DECL_SAVE:
1347 attr = "SAVE";
1348 break;
1349 case DECL_TARGET:
1350 attr = "TARGET";
1351 break;
1352 default:
1353 attr = NULL; /* This shouldn't happen */
1356 gfc_error ("Duplicate %s attribute at %L", attr, &seen_at[d]);
1357 m = MATCH_ERROR;
1358 goto cleanup;
1361 /* Now that we've dealt with duplicate attributes, add the attributes
1362 to the current attribute. */
1363 for (d = GFC_DECL_BEGIN; d != GFC_DECL_END; d++)
1365 if (seen[d] == 0)
1366 continue;
1368 if (gfc_current_state () == COMP_DERIVED
1369 && d != DECL_DIMENSION && d != DECL_POINTER
1370 && d != DECL_COLON && d != DECL_NONE)
1373 gfc_error ("Attribute at %L is not allowed in a TYPE definition",
1374 &seen_at[d]);
1375 m = MATCH_ERROR;
1376 goto cleanup;
1379 switch (d)
1381 case DECL_ALLOCATABLE:
1382 t = gfc_add_allocatable (&current_attr, &seen_at[d]);
1383 break;
1385 case DECL_DIMENSION:
1386 t = gfc_add_dimension (&current_attr, &seen_at[d]);
1387 break;
1389 case DECL_EXTERNAL:
1390 t = gfc_add_external (&current_attr, &seen_at[d]);
1391 break;
1393 case DECL_IN:
1394 t = gfc_add_intent (&current_attr, INTENT_IN, &seen_at[d]);
1395 break;
1397 case DECL_OUT:
1398 t = gfc_add_intent (&current_attr, INTENT_OUT, &seen_at[d]);
1399 break;
1401 case DECL_INOUT:
1402 t = gfc_add_intent (&current_attr, INTENT_INOUT, &seen_at[d]);
1403 break;
1405 case DECL_INTRINSIC:
1406 t = gfc_add_intrinsic (&current_attr, &seen_at[d]);
1407 break;
1409 case DECL_OPTIONAL:
1410 t = gfc_add_optional (&current_attr, &seen_at[d]);
1411 break;
1413 case DECL_PARAMETER:
1414 t = gfc_add_flavor (&current_attr, FL_PARAMETER, &seen_at[d]);
1415 break;
1417 case DECL_POINTER:
1418 t = gfc_add_pointer (&current_attr, &seen_at[d]);
1419 break;
1421 case DECL_PRIVATE:
1422 t = gfc_add_access (&current_attr, ACCESS_PRIVATE, &seen_at[d]);
1423 break;
1425 case DECL_PUBLIC:
1426 t = gfc_add_access (&current_attr, ACCESS_PUBLIC, &seen_at[d]);
1427 break;
1429 case DECL_SAVE:
1430 t = gfc_add_save (&current_attr, &seen_at[d]);
1431 break;
1433 case DECL_TARGET:
1434 t = gfc_add_target (&current_attr, &seen_at[d]);
1435 break;
1437 default:
1438 gfc_internal_error ("match_attr_spec(): Bad attribute");
1441 if (t == FAILURE)
1443 m = MATCH_ERROR;
1444 goto cleanup;
1448 colon_seen = 1;
1449 return MATCH_YES;
1451 cleanup:
1452 gfc_current_locus = start;
1453 gfc_free_array_spec (current_as);
1454 current_as = NULL;
1455 return m;
1459 /* Match a data declaration statement. */
1461 match
1462 gfc_match_data_decl (void)
1464 gfc_symbol *sym;
1465 match m;
1467 m = match_type_spec (&current_ts, 0);
1468 if (m != MATCH_YES)
1469 return m;
1471 if (current_ts.type == BT_DERIVED && gfc_current_state () != COMP_DERIVED)
1473 sym = gfc_use_derived (current_ts.derived);
1475 if (sym == NULL)
1477 m = MATCH_ERROR;
1478 goto cleanup;
1481 current_ts.derived = sym;
1484 m = match_attr_spec ();
1485 if (m == MATCH_ERROR)
1487 m = MATCH_NO;
1488 goto cleanup;
1491 if (current_ts.type == BT_DERIVED && current_ts.derived->components == NULL)
1494 if (current_attr.pointer && gfc_current_state () == COMP_DERIVED)
1495 goto ok;
1497 if (gfc_find_symbol (current_ts.derived->name,
1498 current_ts.derived->ns->parent, 1, &sym) == 0)
1499 goto ok;
1501 /* Hope that an ambiguous symbol is itself masked by a type definition. */
1502 if (sym != NULL && sym->attr.flavor == FL_DERIVED)
1503 goto ok;
1505 gfc_error ("Derived type at %C has not been previously defined");
1506 m = MATCH_ERROR;
1507 goto cleanup;
1511 /* If we have an old-style character declaration, and no new-style
1512 attribute specifications, then there a comma is optional between
1513 the type specification and the variable list. */
1514 if (m == MATCH_NO && current_ts.type == BT_CHARACTER && old_char_selector)
1515 gfc_match_char (',');
1517 /* Give the types/attributes to symbols that follow. */
1518 for (;;)
1520 m = variable_decl ();
1521 if (m == MATCH_ERROR)
1522 goto cleanup;
1523 if (m == MATCH_NO)
1524 break;
1526 if (gfc_match_eos () == MATCH_YES)
1527 goto cleanup;
1528 if (gfc_match_char (',') != MATCH_YES)
1529 break;
1532 gfc_error ("Syntax error in data declaration at %C");
1533 m = MATCH_ERROR;
1535 cleanup:
1536 gfc_free_array_spec (current_as);
1537 current_as = NULL;
1538 return m;
1542 /* Match a prefix associated with a function or subroutine
1543 declaration. If the typespec pointer is nonnull, then a typespec
1544 can be matched. Note that if nothing matches, MATCH_YES is
1545 returned (the null string was matched). */
1547 static match
1548 match_prefix (gfc_typespec * ts)
1550 int seen_type;
1552 gfc_clear_attr (&current_attr);
1553 seen_type = 0;
1555 loop:
1556 if (!seen_type && ts != NULL
1557 && match_type_spec (ts, 0) == MATCH_YES
1558 && gfc_match_space () == MATCH_YES)
1561 seen_type = 1;
1562 goto loop;
1565 if (gfc_match ("elemental% ") == MATCH_YES)
1567 if (gfc_add_elemental (&current_attr, NULL) == FAILURE)
1568 return MATCH_ERROR;
1570 goto loop;
1573 if (gfc_match ("pure% ") == MATCH_YES)
1575 if (gfc_add_pure (&current_attr, NULL) == FAILURE)
1576 return MATCH_ERROR;
1578 goto loop;
1581 if (gfc_match ("recursive% ") == MATCH_YES)
1583 if (gfc_add_recursive (&current_attr, NULL) == FAILURE)
1584 return MATCH_ERROR;
1586 goto loop;
1589 /* At this point, the next item is not a prefix. */
1590 return MATCH_YES;
1594 /* Copy attributes matched by match_prefix() to attributes on a symbol. */
1596 static try
1597 copy_prefix (symbol_attribute * dest, locus * where)
1600 if (current_attr.pure && gfc_add_pure (dest, where) == FAILURE)
1601 return FAILURE;
1603 if (current_attr.elemental && gfc_add_elemental (dest, where) == FAILURE)
1604 return FAILURE;
1606 if (current_attr.recursive && gfc_add_recursive (dest, where) == FAILURE)
1607 return FAILURE;
1609 return SUCCESS;
1613 /* Match a formal argument list. */
1615 match
1616 gfc_match_formal_arglist (gfc_symbol * progname, int st_flag, int null_flag)
1618 gfc_formal_arglist *head, *tail, *p, *q;
1619 char name[GFC_MAX_SYMBOL_LEN + 1];
1620 gfc_symbol *sym;
1621 match m;
1623 head = tail = NULL;
1625 if (gfc_match_char ('(') != MATCH_YES)
1627 if (null_flag)
1628 goto ok;
1629 return MATCH_NO;
1632 if (gfc_match_char (')') == MATCH_YES)
1633 goto ok;
1635 for (;;)
1637 if (gfc_match_char ('*') == MATCH_YES)
1638 sym = NULL;
1639 else
1641 m = gfc_match_name (name);
1642 if (m != MATCH_YES)
1643 goto cleanup;
1645 if (gfc_get_symbol (name, NULL, &sym))
1646 goto cleanup;
1649 p = gfc_get_formal_arglist ();
1651 if (head == NULL)
1652 head = tail = p;
1653 else
1655 tail->next = p;
1656 tail = p;
1659 tail->sym = sym;
1661 /* We don't add the VARIABLE flavor because the name could be a
1662 dummy procedure. We don't apply these attributes to formal
1663 arguments of statement functions. */
1664 if (sym != NULL && !st_flag
1665 && (gfc_add_dummy (&sym->attr, NULL) == FAILURE
1666 || gfc_missing_attr (&sym->attr, NULL) == FAILURE))
1668 m = MATCH_ERROR;
1669 goto cleanup;
1672 /* The name of a program unit can be in a different namespace,
1673 so check for it explicitly. After the statement is accepted,
1674 the name is checked for especially in gfc_get_symbol(). */
1675 if (gfc_new_block != NULL && sym != NULL
1676 && strcmp (sym->name, gfc_new_block->name) == 0)
1678 gfc_error ("Name '%s' at %C is the name of the procedure",
1679 sym->name);
1680 m = MATCH_ERROR;
1681 goto cleanup;
1684 if (gfc_match_char (')') == MATCH_YES)
1685 goto ok;
1687 m = gfc_match_char (',');
1688 if (m != MATCH_YES)
1690 gfc_error ("Unexpected junk in formal argument list at %C");
1691 goto cleanup;
1696 /* Check for duplicate symbols in the formal argument list. */
1697 if (head != NULL)
1699 for (p = head; p->next; p = p->next)
1701 if (p->sym == NULL)
1702 continue;
1704 for (q = p->next; q; q = q->next)
1705 if (p->sym == q->sym)
1707 gfc_error
1708 ("Duplicate symbol '%s' in formal argument list at %C",
1709 p->sym->name);
1711 m = MATCH_ERROR;
1712 goto cleanup;
1717 if (gfc_add_explicit_interface (progname, IFSRC_DECL, head, NULL) ==
1718 FAILURE)
1720 m = MATCH_ERROR;
1721 goto cleanup;
1724 return MATCH_YES;
1726 cleanup:
1727 gfc_free_formal_arglist (head);
1728 return m;
1732 /* Match a RESULT specification following a function declaration or
1733 ENTRY statement. Also matches the end-of-statement. */
1735 static match
1736 match_result (gfc_symbol * function, gfc_symbol ** result)
1738 char name[GFC_MAX_SYMBOL_LEN + 1];
1739 gfc_symbol *r;
1740 match m;
1742 if (gfc_match (" result (") != MATCH_YES)
1743 return MATCH_NO;
1745 m = gfc_match_name (name);
1746 if (m != MATCH_YES)
1747 return m;
1749 if (gfc_match (" )%t") != MATCH_YES)
1751 gfc_error ("Unexpected junk following RESULT variable at %C");
1752 return MATCH_ERROR;
1755 if (strcmp (function->name, name) == 0)
1757 gfc_error
1758 ("RESULT variable at %C must be different than function name");
1759 return MATCH_ERROR;
1762 if (gfc_get_symbol (name, NULL, &r))
1763 return MATCH_ERROR;
1765 if (gfc_add_flavor (&r->attr, FL_VARIABLE, NULL) == FAILURE
1766 || gfc_add_result (&r->attr, NULL) == FAILURE)
1767 return MATCH_ERROR;
1769 *result = r;
1771 return MATCH_YES;
1775 /* Match a function declaration. */
1777 match
1778 gfc_match_function_decl (void)
1780 char name[GFC_MAX_SYMBOL_LEN + 1];
1781 gfc_symbol *sym, *result;
1782 locus old_loc;
1783 match m;
1785 if (gfc_current_state () != COMP_NONE
1786 && gfc_current_state () != COMP_INTERFACE
1787 && gfc_current_state () != COMP_CONTAINS)
1788 return MATCH_NO;
1790 gfc_clear_ts (&current_ts);
1792 old_loc = gfc_current_locus;
1794 m = match_prefix (&current_ts);
1795 if (m != MATCH_YES)
1797 gfc_current_locus = old_loc;
1798 return m;
1801 if (gfc_match ("function% %n", name) != MATCH_YES)
1803 gfc_current_locus = old_loc;
1804 return MATCH_NO;
1807 if (get_proc_name (name, &sym))
1808 return MATCH_ERROR;
1809 gfc_new_block = sym;
1811 m = gfc_match_formal_arglist (sym, 0, 0);
1812 if (m == MATCH_NO)
1813 gfc_error ("Expected formal argument list in function definition at %C");
1814 else if (m == MATCH_ERROR)
1815 goto cleanup;
1817 result = NULL;
1819 if (gfc_match_eos () != MATCH_YES)
1821 /* See if a result variable is present. */
1822 m = match_result (sym, &result);
1823 if (m == MATCH_NO)
1824 gfc_error ("Unexpected junk after function declaration at %C");
1826 if (m != MATCH_YES)
1828 m = MATCH_ERROR;
1829 goto cleanup;
1833 /* Make changes to the symbol. */
1834 m = MATCH_ERROR;
1836 if (gfc_add_function (&sym->attr, NULL) == FAILURE)
1837 goto cleanup;
1839 if (gfc_missing_attr (&sym->attr, NULL) == FAILURE
1840 || copy_prefix (&sym->attr, &sym->declared_at) == FAILURE)
1841 goto cleanup;
1843 if (current_ts.type != BT_UNKNOWN && sym->ts.type != BT_UNKNOWN)
1845 gfc_error ("Function '%s' at %C already has a type of %s", name,
1846 gfc_basic_typename (sym->ts.type));
1847 goto cleanup;
1850 if (result == NULL)
1852 sym->ts = current_ts;
1853 sym->result = sym;
1855 else
1857 result->ts = current_ts;
1858 sym->result = result;
1861 return MATCH_YES;
1863 cleanup:
1864 gfc_current_locus = old_loc;
1865 return m;
1869 /* Match an ENTRY statement. */
1871 match
1872 gfc_match_entry (void)
1874 gfc_symbol *function, *result, *entry;
1875 char name[GFC_MAX_SYMBOL_LEN + 1];
1876 gfc_compile_state state;
1877 match m;
1879 m = gfc_match_name (name);
1880 if (m != MATCH_YES)
1881 return m;
1883 if (get_proc_name (name, &entry))
1884 return MATCH_ERROR;
1886 gfc_enclosing_unit (&state);
1887 switch (state)
1889 case COMP_SUBROUTINE:
1890 m = gfc_match_formal_arglist (entry, 0, 1);
1891 if (m != MATCH_YES)
1892 return MATCH_ERROR;
1894 if (gfc_current_state () != COMP_SUBROUTINE)
1895 goto exec_construct;
1897 if (gfc_add_entry (&entry->attr, NULL) == FAILURE
1898 || gfc_add_subroutine (&entry->attr, NULL) == FAILURE)
1899 return MATCH_ERROR;
1901 break;
1903 case COMP_FUNCTION:
1904 m = gfc_match_formal_arglist (entry, 0, 0);
1905 if (m != MATCH_YES)
1906 return MATCH_ERROR;
1908 if (gfc_current_state () != COMP_FUNCTION)
1909 goto exec_construct;
1910 function = gfc_state_stack->sym;
1912 result = NULL;
1914 if (gfc_match_eos () == MATCH_YES)
1916 if (gfc_add_entry (&entry->attr, NULL) == FAILURE
1917 || gfc_add_function (&entry->attr, NULL) == FAILURE)
1918 return MATCH_ERROR;
1920 entry->result = function->result;
1923 else
1925 m = match_result (function, &result);
1926 if (m == MATCH_NO)
1927 gfc_syntax_error (ST_ENTRY);
1928 if (m != MATCH_YES)
1929 return MATCH_ERROR;
1931 if (gfc_add_result (&result->attr, NULL) == FAILURE
1932 || gfc_add_entry (&entry->attr, NULL) == FAILURE
1933 || gfc_add_function (&entry->attr, NULL) == FAILURE)
1934 return MATCH_ERROR;
1937 if (function->attr.recursive && result == NULL)
1939 gfc_error ("RESULT attribute required in ENTRY statement at %C");
1940 return MATCH_ERROR;
1943 break;
1945 default:
1946 goto exec_construct;
1949 if (gfc_match_eos () != MATCH_YES)
1951 gfc_syntax_error (ST_ENTRY);
1952 return MATCH_ERROR;
1955 return MATCH_YES;
1957 exec_construct:
1958 gfc_error ("ENTRY statement at %C cannot appear within %s",
1959 gfc_state_name (gfc_current_state ()));
1961 return MATCH_ERROR;
1965 /* Match a subroutine statement, including optional prefixes. */
1967 match
1968 gfc_match_subroutine (void)
1970 char name[GFC_MAX_SYMBOL_LEN + 1];
1971 gfc_symbol *sym;
1972 match m;
1974 if (gfc_current_state () != COMP_NONE
1975 && gfc_current_state () != COMP_INTERFACE
1976 && gfc_current_state () != COMP_CONTAINS)
1977 return MATCH_NO;
1979 m = match_prefix (NULL);
1980 if (m != MATCH_YES)
1981 return m;
1983 m = gfc_match ("subroutine% %n", name);
1984 if (m != MATCH_YES)
1985 return m;
1987 if (get_proc_name (name, &sym))
1988 return MATCH_ERROR;
1989 gfc_new_block = sym;
1991 if (gfc_add_subroutine (&sym->attr, NULL) == FAILURE)
1992 return MATCH_ERROR;
1994 if (gfc_match_formal_arglist (sym, 0, 1) != MATCH_YES)
1995 return MATCH_ERROR;
1997 if (gfc_match_eos () != MATCH_YES)
1999 gfc_syntax_error (ST_SUBROUTINE);
2000 return MATCH_ERROR;
2003 if (copy_prefix (&sym->attr, &sym->declared_at) == FAILURE)
2004 return MATCH_ERROR;
2006 return MATCH_YES;
2010 /* Return nonzero if we're currenly compiling a contained procedure. */
2012 static int
2013 contained_procedure (void)
2015 gfc_state_data *s;
2017 for (s=gfc_state_stack; s; s=s->previous)
2018 if ((s->state == COMP_SUBROUTINE || s->state == COMP_FUNCTION)
2019 && s->previous != NULL
2020 && s->previous->state == COMP_CONTAINS)
2021 return 1;
2023 return 0;
2026 /* Match any of the various end-block statements. Returns the type of
2027 END to the caller. The END INTERFACE, END IF, END DO and END
2028 SELECT statements cannot be replaced by a single END statement. */
2030 match
2031 gfc_match_end (gfc_statement * st)
2033 char name[GFC_MAX_SYMBOL_LEN + 1];
2034 gfc_compile_state state;
2035 locus old_loc;
2036 const char *block_name;
2037 const char *target;
2038 int eos_ok;
2039 match m;
2041 old_loc = gfc_current_locus;
2042 if (gfc_match ("end") != MATCH_YES)
2043 return MATCH_NO;
2045 state = gfc_current_state ();
2046 block_name =
2047 gfc_current_block () == NULL ? NULL : gfc_current_block ()->name;
2049 if (state == COMP_CONTAINS)
2051 state = gfc_state_stack->previous->state;
2052 block_name = gfc_state_stack->previous->sym == NULL ? NULL
2053 : gfc_state_stack->previous->sym->name;
2056 switch (state)
2058 case COMP_NONE:
2059 case COMP_PROGRAM:
2060 *st = ST_END_PROGRAM;
2061 target = " program";
2062 eos_ok = 1;
2063 break;
2065 case COMP_SUBROUTINE:
2066 *st = ST_END_SUBROUTINE;
2067 target = " subroutine";
2068 eos_ok = !contained_procedure ();
2069 break;
2071 case COMP_FUNCTION:
2072 *st = ST_END_FUNCTION;
2073 target = " function";
2074 eos_ok = !contained_procedure ();
2075 break;
2077 case COMP_BLOCK_DATA:
2078 *st = ST_END_BLOCK_DATA;
2079 target = " block data";
2080 eos_ok = 1;
2081 break;
2083 case COMP_MODULE:
2084 *st = ST_END_MODULE;
2085 target = " module";
2086 eos_ok = 1;
2087 break;
2089 case COMP_INTERFACE:
2090 *st = ST_END_INTERFACE;
2091 target = " interface";
2092 eos_ok = 0;
2093 break;
2095 case COMP_DERIVED:
2096 *st = ST_END_TYPE;
2097 target = " type";
2098 eos_ok = 0;
2099 break;
2101 case COMP_IF:
2102 *st = ST_ENDIF;
2103 target = " if";
2104 eos_ok = 0;
2105 break;
2107 case COMP_DO:
2108 *st = ST_ENDDO;
2109 target = " do";
2110 eos_ok = 0;
2111 break;
2113 case COMP_SELECT:
2114 *st = ST_END_SELECT;
2115 target = " select";
2116 eos_ok = 0;
2117 break;
2119 case COMP_FORALL:
2120 *st = ST_END_FORALL;
2121 target = " forall";
2122 eos_ok = 0;
2123 break;
2125 case COMP_WHERE:
2126 *st = ST_END_WHERE;
2127 target = " where";
2128 eos_ok = 0;
2129 break;
2131 default:
2132 gfc_error ("Unexpected END statement at %C");
2133 goto cleanup;
2136 if (gfc_match_eos () == MATCH_YES)
2138 if (!eos_ok)
2140 /* We would have required END [something] */
2141 gfc_error ("%s statement expected at %C",
2142 gfc_ascii_statement (*st));
2143 goto cleanup;
2146 return MATCH_YES;
2149 /* Verify that we've got the sort of end-block that we're expecting. */
2150 if (gfc_match (target) != MATCH_YES)
2152 gfc_error ("Expecting %s statement at %C", gfc_ascii_statement (*st));
2153 goto cleanup;
2156 /* If we're at the end, make sure a block name wasn't required. */
2157 if (gfc_match_eos () == MATCH_YES)
2160 if (*st != ST_ENDDO && *st != ST_ENDIF && *st != ST_END_SELECT)
2161 return MATCH_YES;
2163 if (gfc_current_block () == NULL)
2164 return MATCH_YES;
2166 gfc_error ("Expected block name of '%s' in %s statement at %C",
2167 block_name, gfc_ascii_statement (*st));
2169 return MATCH_ERROR;
2172 /* END INTERFACE has a special handler for its several possible endings. */
2173 if (*st == ST_END_INTERFACE)
2174 return gfc_match_end_interface ();
2176 /* We haven't hit the end of statement, so what is left must be an end-name. */
2177 m = gfc_match_space ();
2178 if (m == MATCH_YES)
2179 m = gfc_match_name (name);
2181 if (m == MATCH_NO)
2182 gfc_error ("Expected terminating name at %C");
2183 if (m != MATCH_YES)
2184 goto cleanup;
2186 if (block_name == NULL)
2187 goto syntax;
2189 if (strcmp (name, block_name) != 0)
2191 gfc_error ("Expected label '%s' for %s statement at %C", block_name,
2192 gfc_ascii_statement (*st));
2193 goto cleanup;
2196 if (gfc_match_eos () == MATCH_YES)
2197 return MATCH_YES;
2199 syntax:
2200 gfc_syntax_error (*st);
2202 cleanup:
2203 gfc_current_locus = old_loc;
2204 return MATCH_ERROR;
2209 /***************** Attribute declaration statements ****************/
2211 /* Set the attribute of a single variable. */
2213 static match
2214 attr_decl1 (void)
2216 char name[GFC_MAX_SYMBOL_LEN + 1];
2217 gfc_array_spec *as;
2218 gfc_symbol *sym;
2219 locus var_locus;
2220 match m;
2222 as = NULL;
2224 m = gfc_match_name (name);
2225 if (m != MATCH_YES)
2226 goto cleanup;
2228 if (find_special (name, &sym))
2229 return MATCH_ERROR;
2231 var_locus = gfc_current_locus;
2233 /* Deal with possible array specification for certain attributes. */
2234 if (current_attr.dimension
2235 || current_attr.allocatable
2236 || current_attr.pointer
2237 || current_attr.target)
2239 m = gfc_match_array_spec (&as);
2240 if (m == MATCH_ERROR)
2241 goto cleanup;
2243 if (current_attr.dimension && m == MATCH_NO)
2245 gfc_error
2246 ("Missing array specification at %L in DIMENSION statement",
2247 &var_locus);
2248 m = MATCH_ERROR;
2249 goto cleanup;
2252 if ((current_attr.allocatable || current_attr.pointer)
2253 && (m == MATCH_YES) && (as->type != AS_DEFERRED))
2255 gfc_error ("Array specification must be deferred at %L",
2256 &var_locus);
2257 m = MATCH_ERROR;
2258 goto cleanup;
2262 /* Update symbol table. DIMENSION attribute is set in gfc_set_array_spec(). */
2263 if (current_attr.dimension == 0
2264 && gfc_copy_attr (&sym->attr, &current_attr, NULL) == FAILURE)
2266 m = MATCH_ERROR;
2267 goto cleanup;
2270 if (gfc_set_array_spec (sym, as, &var_locus) == FAILURE)
2272 m = MATCH_ERROR;
2273 goto cleanup;
2276 if ((current_attr.external || current_attr.intrinsic)
2277 && sym->attr.flavor != FL_PROCEDURE
2278 && gfc_add_flavor (&sym->attr, FL_PROCEDURE, NULL) == FAILURE)
2280 m = MATCH_ERROR;
2281 goto cleanup;
2284 return MATCH_YES;
2286 cleanup:
2287 gfc_free_array_spec (as);
2288 return m;
2292 /* Generic attribute declaration subroutine. Used for attributes that
2293 just have a list of names. */
2295 static match
2296 attr_decl (void)
2298 match m;
2300 /* Gobble the optional double colon, by simply ignoring the result
2301 of gfc_match(). */
2302 gfc_match (" ::");
2304 for (;;)
2306 m = attr_decl1 ();
2307 if (m != MATCH_YES)
2308 break;
2310 if (gfc_match_eos () == MATCH_YES)
2312 m = MATCH_YES;
2313 break;
2316 if (gfc_match_char (',') != MATCH_YES)
2318 gfc_error ("Unexpected character in variable list at %C");
2319 m = MATCH_ERROR;
2320 break;
2324 return m;
2328 match
2329 gfc_match_external (void)
2332 gfc_clear_attr (&current_attr);
2333 gfc_add_external (&current_attr, NULL);
2335 return attr_decl ();
2340 match
2341 gfc_match_intent (void)
2343 sym_intent intent;
2345 intent = match_intent_spec ();
2346 if (intent == INTENT_UNKNOWN)
2347 return MATCH_ERROR;
2349 gfc_clear_attr (&current_attr);
2350 gfc_add_intent (&current_attr, intent, NULL); /* Can't fail */
2352 return attr_decl ();
2356 match
2357 gfc_match_intrinsic (void)
2360 gfc_clear_attr (&current_attr);
2361 gfc_add_intrinsic (&current_attr, NULL);
2363 return attr_decl ();
2367 match
2368 gfc_match_optional (void)
2371 gfc_clear_attr (&current_attr);
2372 gfc_add_optional (&current_attr, NULL);
2374 return attr_decl ();
2378 match
2379 gfc_match_pointer (void)
2382 gfc_clear_attr (&current_attr);
2383 gfc_add_pointer (&current_attr, NULL);
2385 return attr_decl ();
2389 match
2390 gfc_match_allocatable (void)
2393 gfc_clear_attr (&current_attr);
2394 gfc_add_allocatable (&current_attr, NULL);
2396 return attr_decl ();
2400 match
2401 gfc_match_dimension (void)
2404 gfc_clear_attr (&current_attr);
2405 gfc_add_dimension (&current_attr, NULL);
2407 return attr_decl ();
2411 match
2412 gfc_match_target (void)
2415 gfc_clear_attr (&current_attr);
2416 gfc_add_target (&current_attr, NULL);
2418 return attr_decl ();
2422 /* Match the list of entities being specified in a PUBLIC or PRIVATE
2423 statement. */
2425 static match
2426 access_attr_decl (gfc_statement st)
2428 char name[GFC_MAX_SYMBOL_LEN + 1];
2429 interface_type type;
2430 gfc_user_op *uop;
2431 gfc_symbol *sym;
2432 gfc_intrinsic_op operator;
2433 match m;
2435 if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
2436 goto done;
2438 for (;;)
2440 m = gfc_match_generic_spec (&type, name, &operator);
2441 if (m == MATCH_NO)
2442 goto syntax;
2443 if (m == MATCH_ERROR)
2444 return MATCH_ERROR;
2446 switch (type)
2448 case INTERFACE_NAMELESS:
2449 goto syntax;
2451 case INTERFACE_GENERIC:
2452 if (gfc_get_symbol (name, NULL, &sym))
2453 goto done;
2455 if (gfc_add_access (&sym->attr,
2456 (st ==
2457 ST_PUBLIC) ? ACCESS_PUBLIC : ACCESS_PRIVATE,
2458 NULL) == FAILURE)
2459 return MATCH_ERROR;
2461 break;
2463 case INTERFACE_INTRINSIC_OP:
2464 if (gfc_current_ns->operator_access[operator] == ACCESS_UNKNOWN)
2466 gfc_current_ns->operator_access[operator] =
2467 (st == ST_PUBLIC) ? ACCESS_PUBLIC : ACCESS_PRIVATE;
2469 else
2471 gfc_error ("Access specification of the %s operator at %C has "
2472 "already been specified", gfc_op2string (operator));
2473 goto done;
2476 break;
2478 case INTERFACE_USER_OP:
2479 uop = gfc_get_uop (name);
2481 if (uop->access == ACCESS_UNKNOWN)
2483 uop->access =
2484 (st == ST_PUBLIC) ? ACCESS_PUBLIC : ACCESS_PRIVATE;
2486 else
2488 gfc_error
2489 ("Access specification of the .%s. operator at %C has "
2490 "already been specified", sym->name);
2491 goto done;
2494 break;
2497 if (gfc_match_char (',') == MATCH_NO)
2498 break;
2501 if (gfc_match_eos () != MATCH_YES)
2502 goto syntax;
2503 return MATCH_YES;
2505 syntax:
2506 gfc_syntax_error (st);
2508 done:
2509 return MATCH_ERROR;
2513 /* The PRIVATE statement is a bit weird in that it can be a attribute
2514 declaration, but also works as a standlone statement inside of a
2515 type declaration or a module. */
2517 match
2518 gfc_match_private (gfc_statement * st)
2521 if (gfc_match ("private") != MATCH_YES)
2522 return MATCH_NO;
2524 if (gfc_current_state () == COMP_DERIVED)
2526 if (gfc_match_eos () == MATCH_YES)
2528 *st = ST_PRIVATE;
2529 return MATCH_YES;
2532 gfc_syntax_error (ST_PRIVATE);
2533 return MATCH_ERROR;
2536 if (gfc_match_eos () == MATCH_YES)
2538 *st = ST_PRIVATE;
2539 return MATCH_YES;
2542 *st = ST_ATTR_DECL;
2543 return access_attr_decl (ST_PRIVATE);
2547 match
2548 gfc_match_public (gfc_statement * st)
2551 if (gfc_match ("public") != MATCH_YES)
2552 return MATCH_NO;
2554 if (gfc_match_eos () == MATCH_YES)
2556 *st = ST_PUBLIC;
2557 return MATCH_YES;
2560 *st = ST_ATTR_DECL;
2561 return access_attr_decl (ST_PUBLIC);
2565 /* Workhorse for gfc_match_parameter. */
2567 static match
2568 do_parm (void)
2570 gfc_symbol *sym;
2571 gfc_expr *init;
2572 match m;
2574 m = gfc_match_symbol (&sym, 0);
2575 if (m == MATCH_NO)
2576 gfc_error ("Expected variable name at %C in PARAMETER statement");
2578 if (m != MATCH_YES)
2579 return m;
2581 if (gfc_match_char ('=') == MATCH_NO)
2583 gfc_error ("Expected = sign in PARAMETER statement at %C");
2584 return MATCH_ERROR;
2587 m = gfc_match_init_expr (&init);
2588 if (m == MATCH_NO)
2589 gfc_error ("Expected expression at %C in PARAMETER statement");
2590 if (m != MATCH_YES)
2591 return m;
2593 if (sym->ts.type == BT_UNKNOWN
2594 && gfc_set_default_type (sym, 1, NULL) == FAILURE)
2596 m = MATCH_ERROR;
2597 goto cleanup;
2600 if (gfc_check_assign_symbol (sym, init) == FAILURE
2601 || gfc_add_flavor (&sym->attr, FL_PARAMETER, NULL) == FAILURE)
2603 m = MATCH_ERROR;
2604 goto cleanup;
2607 sym->value = init;
2608 return MATCH_YES;
2610 cleanup:
2611 gfc_free_expr (init);
2612 return m;
2616 /* Match a parameter statement, with the weird syntax that these have. */
2618 match
2619 gfc_match_parameter (void)
2621 match m;
2623 if (gfc_match_char ('(') == MATCH_NO)
2624 return MATCH_NO;
2626 for (;;)
2628 m = do_parm ();
2629 if (m != MATCH_YES)
2630 break;
2632 if (gfc_match (" )%t") == MATCH_YES)
2633 break;
2635 if (gfc_match_char (',') != MATCH_YES)
2637 gfc_error ("Unexpected characters in PARAMETER statement at %C");
2638 m = MATCH_ERROR;
2639 break;
2643 return m;
2647 /* Save statements have a special syntax. */
2649 match
2650 gfc_match_save (void)
2652 char n[GFC_MAX_SYMBOL_LEN+1];
2653 gfc_common_head *c;
2654 gfc_symbol *sym;
2655 match m;
2657 if (gfc_match_eos () == MATCH_YES)
2659 if (gfc_current_ns->seen_save)
2661 gfc_error ("Blanket SAVE statement at %C follows previous "
2662 "SAVE statement");
2664 return MATCH_ERROR;
2667 gfc_current_ns->save_all = gfc_current_ns->seen_save = 1;
2668 return MATCH_YES;
2671 if (gfc_current_ns->save_all)
2673 gfc_error ("SAVE statement at %C follows blanket SAVE statement");
2674 return MATCH_ERROR;
2677 gfc_match (" ::");
2679 for (;;)
2681 m = gfc_match_symbol (&sym, 0);
2682 switch (m)
2684 case MATCH_YES:
2685 if (gfc_add_save (&sym->attr, &gfc_current_locus) == FAILURE)
2686 return MATCH_ERROR;
2687 goto next_item;
2689 case MATCH_NO:
2690 break;
2692 case MATCH_ERROR:
2693 return MATCH_ERROR;
2696 m = gfc_match (" / %n /", &n);
2697 if (m == MATCH_ERROR)
2698 return MATCH_ERROR;
2699 if (m == MATCH_NO)
2700 goto syntax;
2702 c = gfc_get_common (n, 0);
2703 c->saved = 1;
2705 gfc_current_ns->seen_save = 1;
2707 next_item:
2708 if (gfc_match_eos () == MATCH_YES)
2709 break;
2710 if (gfc_match_char (',') != MATCH_YES)
2711 goto syntax;
2714 return MATCH_YES;
2716 syntax:
2717 gfc_error ("Syntax error in SAVE statement at %C");
2718 return MATCH_ERROR;
2722 /* Match a module procedure statement. Note that we have to modify
2723 symbols in the parent's namespace because the current one was there
2724 to receive symbols that are in a interface's formal argument list. */
2726 match
2727 gfc_match_modproc (void)
2729 char name[GFC_MAX_SYMBOL_LEN + 1];
2730 gfc_symbol *sym;
2731 match m;
2733 if (gfc_state_stack->state != COMP_INTERFACE
2734 || gfc_state_stack->previous == NULL
2735 || current_interface.type == INTERFACE_NAMELESS)
2737 gfc_error
2738 ("MODULE PROCEDURE at %C must be in a generic module interface");
2739 return MATCH_ERROR;
2742 for (;;)
2744 m = gfc_match_name (name);
2745 if (m == MATCH_NO)
2746 goto syntax;
2747 if (m != MATCH_YES)
2748 return MATCH_ERROR;
2750 if (gfc_get_symbol (name, gfc_current_ns->parent, &sym))
2751 return MATCH_ERROR;
2753 if (sym->attr.proc != PROC_MODULE
2754 && gfc_add_procedure (&sym->attr, PROC_MODULE, NULL) == FAILURE)
2755 return MATCH_ERROR;
2757 if (gfc_add_interface (sym) == FAILURE)
2758 return MATCH_ERROR;
2760 if (gfc_match_eos () == MATCH_YES)
2761 break;
2762 if (gfc_match_char (',') != MATCH_YES)
2763 goto syntax;
2766 return MATCH_YES;
2768 syntax:
2769 gfc_syntax_error (ST_MODULE_PROC);
2770 return MATCH_ERROR;
2774 /* Match the beginning of a derived type declaration. If a type name
2775 was the result of a function, then it is possible to have a symbol
2776 already to be known as a derived type yet have no components. */
2778 match
2779 gfc_match_derived_decl (void)
2781 char name[GFC_MAX_SYMBOL_LEN + 1];
2782 symbol_attribute attr;
2783 gfc_symbol *sym;
2784 match m;
2786 if (gfc_current_state () == COMP_DERIVED)
2787 return MATCH_NO;
2789 gfc_clear_attr (&attr);
2791 loop:
2792 if (gfc_match (" , private") == MATCH_YES)
2794 if (gfc_find_state (COMP_MODULE) == FAILURE)
2796 gfc_error
2797 ("Derived type at %C can only be PRIVATE within a MODULE");
2798 return MATCH_ERROR;
2801 if (gfc_add_access (&attr, ACCESS_PRIVATE, NULL) == FAILURE)
2802 return MATCH_ERROR;
2803 goto loop;
2806 if (gfc_match (" , public") == MATCH_YES)
2808 if (gfc_find_state (COMP_MODULE) == FAILURE)
2810 gfc_error ("Derived type at %C can only be PUBLIC within a MODULE");
2811 return MATCH_ERROR;
2814 if (gfc_add_access (&attr, ACCESS_PUBLIC, NULL) == FAILURE)
2815 return MATCH_ERROR;
2816 goto loop;
2819 if (gfc_match (" ::") != MATCH_YES && attr.access != ACCESS_UNKNOWN)
2821 gfc_error ("Expected :: in TYPE definition at %C");
2822 return MATCH_ERROR;
2825 m = gfc_match (" %n%t", name);
2826 if (m != MATCH_YES)
2827 return m;
2829 /* Make sure the name isn't the name of an intrinsic type. The
2830 'double precision' type doesn't get past the name matcher. */
2831 if (strcmp (name, "integer") == 0
2832 || strcmp (name, "real") == 0
2833 || strcmp (name, "character") == 0
2834 || strcmp (name, "logical") == 0
2835 || strcmp (name, "complex") == 0)
2837 gfc_error
2838 ("Type name '%s' at %C cannot be the same as an intrinsic type",
2839 name);
2840 return MATCH_ERROR;
2843 if (gfc_get_symbol (name, NULL, &sym))
2844 return MATCH_ERROR;
2846 if (sym->ts.type != BT_UNKNOWN)
2848 gfc_error ("Derived type name '%s' at %C already has a basic type "
2849 "of %s", sym->name, gfc_typename (&sym->ts));
2850 return MATCH_ERROR;
2853 /* The symbol may already have the derived attribute without the
2854 components. The ways this can happen is via a function
2855 definition, an INTRINSIC statement or a subtype in another
2856 derived type that is a pointer. The first part of the AND clause
2857 is true if a the symbol is not the return value of a function. */
2858 if (sym->attr.flavor != FL_DERIVED
2859 && gfc_add_flavor (&sym->attr, FL_DERIVED, NULL) == FAILURE)
2860 return MATCH_ERROR;
2862 if (sym->components != NULL)
2864 gfc_error
2865 ("Derived type definition of '%s' at %C has already been defined",
2866 sym->name);
2867 return MATCH_ERROR;
2870 if (attr.access != ACCESS_UNKNOWN
2871 && gfc_add_access (&sym->attr, attr.access, NULL) == FAILURE)
2872 return MATCH_ERROR;
2874 gfc_new_block = sym;
2876 return MATCH_YES;