X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=blobdiff_plain;f=gcc%2Ffortran%2Fgfortran.h;h=54310dfbea15461800fee8cb686f92ccd121ded9;hp=c42be85783a896269cb10335e7ccf791568e75f9;hb=c5ad4f2870c02eda34cb6b351e74304c1039f39e;hpb=e3d1ab2bdf7b9008475deb5432108db2f0c672be diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index c42be85783a..54310dfbea1 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -1,6 +1,6 @@ /* gfortran header file Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, - 2009, 2010 + 2009, 2010, 2011, 2012 Free Software Foundation, Inc. Contributed by Andy Vaught @@ -38,42 +38,18 @@ along with GCC; see the file COPYING3. If not see #include "coretypes.h" #include "input.h" #include "splay-tree.h" -/* The following ifdefs are recommended by the autoconf documentation - for any code using alloca. */ - -/* AIX requires this to be the first thing in the file. */ -#ifdef __GNUC__ -#else /* not __GNUC__ */ -#ifdef HAVE_ALLOCA_H -#include -#else /* do not HAVE_ALLOCA_H */ -#ifdef _AIX -#pragma alloca -#else -#ifndef alloca /* predefined by HP cc +Olibcalls */ -char *alloca (); -#endif /* not predefined */ -#endif /* not _AIX */ -#endif /* do not HAVE_ALLOCA_H */ -#endif /* not __GNUC__ */ /* Major control parameters. */ #define GFC_MAX_SYMBOL_LEN 63 /* Must be at least 63 for F2003. */ -#define GFC_MAX_BINDING_LABEL_LEN 126 /* (2 * GFC_MAX_SYMBOL_LEN) */ #define GFC_MAX_LINE 132 /* Characters beyond this are not seen. */ #define GFC_LETTERS 26 /* Number of letters in the alphabet. */ #define MAX_SUBRECORD_LENGTH 2147483639 /* 2**31-9 */ -#define free(x) Use_gfc_free_instead_of_free() #define gfc_is_whitespace(c) ((c==' ') || (c=='\t')) -#ifndef NULL -#define NULL ((void *) 0) -#endif - /* Stringization. */ #define stringize(x) expand_macro(x) #define expand_macro(x) # x @@ -85,6 +61,15 @@ char *alloca (); #define PREFIX(x) "_gfortran_" x #define PREFIX_LEN 10 +/* A prefix for internal variables, which are not user-visible. */ +#if !defined (NO_DOT_IN_LABEL) +# define GFC_PREFIX(x) "_F." x +#elif !defined (NO_DOLLAR_IN_LABEL) +# define GFC_PREFIX(x) "_F$" x +#else +# define GFC_PREFIX(x) "_F_" x +#endif + #define BLANK_COMMON_NAME "__BLNK__" /* Macro to initialize an mstring structure. */ @@ -118,6 +103,13 @@ typedef enum { SUCCESS = 1, FAILURE } gfc_try; +/* These are flags for identifying whether we are reading a character literal + between quotes or normal source code. */ + +typedef enum +{ NONSTRING = 0, INSTRING_WARN, INSTRING_NOWARN } +gfc_instring; + /* This is returned by gfc_notification_std to know if, given the flags that were given (-std=, -pedantic) we should issue an error, a warning or nothing. */ @@ -135,18 +127,11 @@ typedef enum { MATCH_NO = 1, MATCH_YES, MATCH_ERROR } match; +/* Used for different Fortran source forms in places like scanner.c. */ typedef enum { FORM_FREE, FORM_FIXED, FORM_UNKNOWN } gfc_source_form; -/* Basic types. BT_VOID is used by ISO C Binding so funcs like c_f_pointer - can take any arg with the pointer attribute as a param. */ -typedef enum -{ BT_UNKNOWN = 1, BT_INTEGER, BT_REAL, BT_COMPLEX, BT_LOGICAL, BT_CHARACTER, - BT_DERIVED, BT_CLASS, BT_PROCEDURE, BT_HOLLERITH, BT_VOID -} -bt; - /* Expression node types. */ typedef enum { EXPR_OP = 1, EXPR_FUNCTION, EXPR_CONSTANT, EXPR_VARIABLE, @@ -190,7 +175,6 @@ typedef enum } gfc_intrinsic_op; - /* This macro is the number of intrinsic operators that exist. Assumptions are made about the numbering of the interface_op enums. */ #define GFC_INTRINSIC_OPS GFC_INTRINSIC_END @@ -223,20 +207,19 @@ typedef enum ST_WRITE, ST_ASSIGNMENT, ST_POINTER_ASSIGNMENT, ST_SELECT_CASE, ST_SEQUENCE, ST_SIMPLE_IF, ST_STATEMENT_FUNCTION, ST_DERIVED_DECL, ST_LABEL_ASSIGNMENT, ST_ENUM, ST_ENUMERATOR, ST_END_ENUM, ST_SELECT_TYPE, ST_TYPE_IS, ST_CLASS_IS, - ST_OMP_ATOMIC, ST_OMP_BARRIER, ST_OMP_CRITICAL, ST_OMP_END_CRITICAL, - ST_OMP_END_DO, ST_OMP_END_MASTER, ST_OMP_END_ORDERED, ST_OMP_END_PARALLEL, - ST_OMP_END_PARALLEL_DO, ST_OMP_END_PARALLEL_SECTIONS, + ST_OMP_ATOMIC, ST_OMP_BARRIER, ST_OMP_CRITICAL, ST_OMP_END_ATOMIC, + ST_OMP_END_CRITICAL, ST_OMP_END_DO, ST_OMP_END_MASTER, ST_OMP_END_ORDERED, + ST_OMP_END_PARALLEL, ST_OMP_END_PARALLEL_DO, ST_OMP_END_PARALLEL_SECTIONS, ST_OMP_END_PARALLEL_WORKSHARE, ST_OMP_END_SECTIONS, ST_OMP_END_SINGLE, ST_OMP_END_WORKSHARE, ST_OMP_DO, ST_OMP_FLUSH, ST_OMP_MASTER, ST_OMP_ORDERED, ST_OMP_PARALLEL, ST_OMP_PARALLEL_DO, ST_OMP_PARALLEL_SECTIONS, ST_OMP_PARALLEL_WORKSHARE, ST_OMP_SECTIONS, ST_OMP_SECTION, ST_OMP_SINGLE, ST_OMP_THREADPRIVATE, ST_OMP_WORKSHARE, ST_OMP_TASK, ST_OMP_END_TASK, - ST_OMP_TASKWAIT, ST_PROCEDURE, ST_GENERIC, ST_CRITICAL, ST_END_CRITICAL, - ST_GET_FCN_CHARACTERISTICS, ST_NONE + ST_OMP_TASKWAIT, ST_OMP_TASKYIELD, ST_PROCEDURE, ST_GENERIC, ST_CRITICAL, + ST_END_CRITICAL, ST_GET_FCN_CHARACTERISTICS, ST_LOCK, ST_UNLOCK, ST_NONE } gfc_statement; - /* Types of interfaces that we can have. Assignment interfaces are considered to be intrinsic operators. */ typedef enum @@ -331,6 +314,8 @@ enum gfc_isym_id GFC_ISYM_ATAN, GFC_ISYM_ATAN2, GFC_ISYM_ATANH, + GFC_ISYM_ATOMIC_DEF, + GFC_ISYM_ATOMIC_REF, GFC_ISYM_BGE, GFC_ISYM_BGT, GFC_ISYM_BIT_SIZE, @@ -482,7 +467,7 @@ enum gfc_isym_id GFC_ISYM_NORM2, GFC_ISYM_NOT, GFC_ISYM_NULL, - GFC_ISYM_NUMIMAGES, + GFC_ISYM_NUM_IMAGES, GFC_ISYM_OR, GFC_ISYM_PACK, GFC_ISYM_PARITY, @@ -497,6 +482,7 @@ enum gfc_isym_id GFC_ISYM_RANDOM_NUMBER, GFC_ISYM_RANDOM_SEED, GFC_ISYM_RANGE, + GFC_ISYM_RANK, GFC_ISYM_REAL, GFC_ISYM_RENAME, GFC_ISYM_REPEAT, @@ -596,16 +582,17 @@ init_local_integer; typedef enum { GFC_FCOARRAY_NONE = 0, - GFC_FCOARRAY_SINGLE + GFC_FCOARRAY_SINGLE, + GFC_FCOARRAY_LIB } gfc_fcoarray; typedef enum { - GFC_REVERSE_NOT_SET, + GFC_ENABLE_REVERSE, + GFC_FORWARD_SET, GFC_REVERSE_SET, - GFC_CAN_REVERSE, - GFC_CANNOT_REVERSE + GFC_INHIBIT_REVERSE } gfc_reverse; @@ -617,6 +604,7 @@ gfc_reverse; #define NAMED_INTCST(a,b,c,d) a, #define NAMED_KINDARRAY(a,b,c,d) a, #define NAMED_FUNCTION(a,b,c,d) a, +#define NAMED_DERIVED_TYPE(a,b,c,d) a, typedef enum { ISOFORTRANENV_INVALID = -1, @@ -627,10 +615,11 @@ iso_fortran_env_symbol; #undef NAMED_INTCST #undef NAMED_KINDARRAY #undef NAMED_FUNCTION +#undef NAMED_DERIVED_TYPE #define NAMED_INTCST(a,b,c,d) a, -#define NAMED_REALCST(a,b,c) a, -#define NAMED_CMPXCST(a,b,c) a, +#define NAMED_REALCST(a,b,c,d) a, +#define NAMED_CMPXCST(a,b,c,d) a, #define NAMED_LOGCST(a,b,c) a, #define NAMED_CHARKNDCST(a,b,c) a, #define NAMED_CHARCST(a,b,c) a, @@ -747,6 +736,11 @@ typedef struct unsigned sequence:1, elemental:1, pure:1, recursive:1; unsigned unmaskable:1, masked:1, contained:1, mod_proc:1, abstract:1; + /* This is set if a contained procedure could be declared pure. This is + used for certain optimizations that require the result or arguments + cannot alias. Note that this is zero for PURE procedures. */ + unsigned implicit_pure:1; + /* This is set if the subroutine doesn't return. Currently, this is only possible for intrinsic subroutines. */ unsigned noreturn:1; @@ -790,7 +784,7 @@ typedef struct possibly nested. zero_comp is true if the derived type has no component at all. */ unsigned alloc_comp:1, pointer_comp:1, proc_pointer_comp:1, - private_comp:1, zero_comp:1, coarray_comp:1; + private_comp:1, zero_comp:1, coarray_comp:1, lock_comp:1; /* This is a temporary selector for SELECT TYPE. */ unsigned select_type_temporary:1; @@ -893,7 +887,7 @@ typedef struct gfc_charlen struct gfc_charlen *next; bool length_from_typespec; /* Length from explicit array ctor typespec? */ tree backend_decl; - tree passed_length; /* Length argument explicitelly passed. */ + tree passed_length; /* Length argument explicitly passed. */ int resolved; } @@ -918,7 +912,8 @@ typedef struct struct gfc_symbol *interface; /* For PROCEDURE declarations. */ int is_c_interop; int is_iso_c; - bt f90_type; + bt f90_type; + bool deferred; } gfc_typespec; @@ -952,6 +947,10 @@ typedef struct gfc_component gfc_array_spec *as; tree backend_decl; + /* Used to cache a FIELD_DECL matching this same component + but applied to a different backend containing type that was + generated by gfc_nonrestricted_type. */ + tree norestrict_decl; locus loc; struct gfc_expr *initializer; struct gfc_component *next; @@ -1059,13 +1058,14 @@ enum gfc_omp_default_sharing typedef struct gfc_omp_clauses { struct gfc_expr *if_expr; + struct gfc_expr *final_expr; struct gfc_expr *num_threads; gfc_namelist *lists[OMP_LIST_NUM]; enum gfc_omp_sched_kind sched_kind; struct gfc_expr *chunk_size; enum gfc_omp_default_sharing default_sharing; int collapse; - bool nowait, ordered, untied; + bool nowait, ordered, untied, mergeable; } gfc_omp_clauses; @@ -1124,6 +1124,7 @@ typedef struct gfc_tbp_generic struct gfc_typebound_proc* specific; struct gfc_tbp_generic* next; + bool is_operator; } gfc_tbp_generic; @@ -1246,7 +1247,7 @@ typedef struct gfc_symbol /* This may be repetitive, since the typespec now has a binding label field. */ - char binding_label[GFC_MAX_BINDING_LABEL_LEN + 1]; + const char* binding_label; /* Store a reference to the common_block, if this symbol is in one. */ struct gfc_common_head *common_block; @@ -1263,7 +1264,7 @@ typedef struct gfc_common_head char use_assoc, saved, threadprivate; char name[GFC_MAX_SYMBOL_LEN + 1]; struct gfc_symbol *head; - char binding_label[GFC_MAX_BINDING_LABEL_LEN + 1]; + const char* binding_label; int is_bind_c; } gfc_common_head; @@ -1286,8 +1287,7 @@ typedef struct gfc_entry_list } gfc_entry_list; -#define gfc_get_entry_list() \ - (gfc_entry_list *) gfc_getmem(sizeof(gfc_entry_list)) +#define gfc_get_entry_list() XCNEW (gfc_entry_list) /* Lists of rename info for the USE statement. */ @@ -1308,7 +1308,9 @@ gfc_use_rename; typedef struct gfc_use_list { const char *module_name; - int only_flag; + bool intrinsic; + bool non_intrinsic; + bool only_flag; struct gfc_use_rename *rename; locus where; /* Next USE statement. */ @@ -1316,8 +1318,7 @@ typedef struct gfc_use_list } gfc_use_list; -#define gfc_get_use_list() \ - (gfc_use_list *) gfc_getmem(sizeof(gfc_use_list)) +#define gfc_get_use_list() XCNEW (gfc_use_list) /* Within a namespace, symbols are pointed to by symtree nodes that are linked together in a balanced binary tree. There can be @@ -1499,7 +1500,7 @@ extern gfc_interface_info current_interface; enum gfc_array_ref_dimen_type { - DIMEN_ELEMENT = 1, DIMEN_RANGE, DIMEN_VECTOR, DIMEN_STAR, DIMEN_UNKNOWN + DIMEN_ELEMENT = 1, DIMEN_RANGE, DIMEN_VECTOR, DIMEN_STAR, DIMEN_THIS_IMAGE, DIMEN_UNKNOWN }; typedef struct gfc_array_ref @@ -1707,6 +1708,10 @@ typedef struct gfc_expr locus where; + /* Used to store the base expression in component calls, when the expression + is not a variable. */ + struct gfc_expr *base_expr; + /* is_boz is true if the integer is regarded as BOZ bitpatten and is_snan denotes a signalling not-a-number. */ unsigned int is_boz : 1, is_snan : 1; @@ -1797,7 +1802,7 @@ typedef struct gfc_expr gfc_expr; -#define gfc_get_shape(rank) ((mpz_t *) gfc_getmem((rank)*sizeof(mpz_t))) +#define gfc_get_shape(rank) (XCNEWVEC (mpz_t, (rank))) /* Structures for information associated with different kinds of numbers. The first set of integer parameters define all there is @@ -2058,26 +2063,37 @@ gfc_association_list; /* Executable statements that fill gfc_code structures. */ typedef enum { - EXEC_NOP = 1, EXEC_END_BLOCK, EXEC_ASSIGN, EXEC_LABEL_ASSIGN, - EXEC_POINTER_ASSIGN, EXEC_CRITICAL, EXEC_ERROR_STOP, + EXEC_NOP = 1, EXEC_END_NESTED_BLOCK, EXEC_END_BLOCK, EXEC_ASSIGN, + EXEC_LABEL_ASSIGN, EXEC_POINTER_ASSIGN, EXEC_CRITICAL, EXEC_ERROR_STOP, EXEC_GOTO, EXEC_CALL, EXEC_COMPCALL, EXEC_ASSIGN_CALL, EXEC_RETURN, EXEC_ENTRY, EXEC_PAUSE, EXEC_STOP, EXEC_CONTINUE, EXEC_INIT_ASSIGN, - EXEC_IF, EXEC_ARITHMETIC_IF, EXEC_DO, EXEC_DO_WHILE, EXEC_SELECT, EXEC_BLOCK, - EXEC_FORALL, EXEC_WHERE, EXEC_CYCLE, EXEC_EXIT, EXEC_CALL_PPC, - EXEC_ALLOCATE, EXEC_DEALLOCATE, EXEC_END_PROCEDURE, EXEC_SELECT_TYPE, - EXEC_SYNC_ALL, EXEC_SYNC_MEMORY, EXEC_SYNC_IMAGES, + EXEC_IF, EXEC_ARITHMETIC_IF, EXEC_DO, EXEC_DO_CONCURRENT, EXEC_DO_WHILE, + EXEC_SELECT, EXEC_BLOCK, EXEC_FORALL, EXEC_WHERE, EXEC_CYCLE, EXEC_EXIT, + EXEC_CALL_PPC, EXEC_ALLOCATE, EXEC_DEALLOCATE, EXEC_END_PROCEDURE, + EXEC_SELECT_TYPE, EXEC_SYNC_ALL, EXEC_SYNC_MEMORY, EXEC_SYNC_IMAGES, EXEC_OPEN, EXEC_CLOSE, EXEC_WAIT, EXEC_READ, EXEC_WRITE, EXEC_IOLENGTH, EXEC_TRANSFER, EXEC_DT_END, EXEC_BACKSPACE, EXEC_ENDFILE, EXEC_INQUIRE, EXEC_REWIND, EXEC_FLUSH, + EXEC_LOCK, EXEC_UNLOCK, EXEC_OMP_CRITICAL, EXEC_OMP_DO, EXEC_OMP_FLUSH, EXEC_OMP_MASTER, EXEC_OMP_ORDERED, EXEC_OMP_PARALLEL, EXEC_OMP_PARALLEL_DO, EXEC_OMP_PARALLEL_SECTIONS, EXEC_OMP_PARALLEL_WORKSHARE, EXEC_OMP_SECTIONS, EXEC_OMP_SINGLE, EXEC_OMP_WORKSHARE, EXEC_OMP_ATOMIC, EXEC_OMP_BARRIER, EXEC_OMP_END_NOWAIT, - EXEC_OMP_END_SINGLE, EXEC_OMP_TASK, EXEC_OMP_TASKWAIT + EXEC_OMP_END_SINGLE, EXEC_OMP_TASK, EXEC_OMP_TASKWAIT, + EXEC_OMP_TASKYIELD } gfc_exec_op; +typedef enum +{ + GFC_OMP_ATOMIC_UPDATE, + GFC_OMP_ATOMIC_READ, + GFC_OMP_ATOMIC_WRITE, + GFC_OMP_ATOMIC_CAPTURE +} +gfc_omp_atomic_op; + typedef struct gfc_code { gfc_exec_op op; @@ -2087,7 +2103,7 @@ typedef struct gfc_code gfc_st_label *here, *label1, *label2, *label3; gfc_symtree *symtree; - gfc_expr *expr1, *expr2, *expr3; + gfc_expr *expr1, *expr2, *expr3, *expr4; /* A name isn't sufficient to identify a subroutine, we need the actual symbol for the interface definition. const char *sub_name; */ @@ -2097,7 +2113,6 @@ typedef struct gfc_code union { gfc_actual_arglist *actual; - gfc_case *case_list; gfc_iterator *iterator; struct @@ -2111,6 +2126,7 @@ typedef struct gfc_code { gfc_namespace *ns; gfc_association_list *assoc; + gfc_case *case_list; } block; @@ -2128,6 +2144,7 @@ typedef struct gfc_code const char *omp_name; gfc_namelist *omp_namelist; bool omp_bool; + gfc_omp_atomic_op omp_atomic; } ext; /* Points to additional structures required by statement */ @@ -2186,12 +2203,14 @@ typedef struct int max_continue_fixed; int max_continue_free; int max_identifier_length; - int dump_parse_tree; + int dump_fortran_original; + int dump_fortran_optimized; int warn_aliasing; int warn_ampersand; - int warn_conversion; + int gfc_warn_conversion; int warn_conversion_extra; + int warn_function_elimination; int warn_implicit_interface; int warn_implicit_procedure; int warn_line_truncation; @@ -2203,6 +2222,7 @@ typedef struct int warn_character_truncation; int warn_array_temp; int warn_align_commons; + int warn_real_q_constant; int warn_unused_dummy_argument; int max_errors; @@ -2210,6 +2230,9 @@ typedef struct int flag_default_double; int flag_default_integer; int flag_default_real; + int flag_integer4_kind; + int flag_real4_kind; + int flag_real8_kind; int flag_dollar_ok; int flag_underscoring; int flag_second_underscore; @@ -2225,13 +2248,13 @@ typedef struct int flag_backslash; int flag_backtrace; int flag_allow_leading_underscore; - int flag_dump_core; int flag_external_blas; int blas_matmul_limit; int flag_cray_pointer; int flag_d_lines; - int flag_openmp; + int gfc_flag_openmp; int flag_sign_zero; + int flag_stack_arrays; int flag_module_private; int flag_recursive; int flag_init_local_zero; @@ -2244,6 +2267,9 @@ typedef struct int flag_align_commons; int flag_whole_file; int flag_protect_parens; + int flag_realloc_lhs; + int flag_aggressive_function_elimination; + int flag_frontend_optimize; int fpe; int rtcheck; @@ -2275,6 +2301,8 @@ typedef struct gfc_constructor gfc_component *component; /* Record the component being initialized. */ } n; + mpz_t repeat; /* Record the repeat number of initial values in data + statement like "data a/5*10/". */ } gfc_constructor; @@ -2359,7 +2387,7 @@ gfc_char_t *gfc_char_to_widechar (const char *); #define gfc_get_wide_string(n) XCNEWVEC (gfc_char_t, n) void gfc_skip_comments (void); -gfc_char_t gfc_next_char_literal (int); +gfc_char_t gfc_next_char_literal (gfc_instring); gfc_char_t gfc_next_char (void); char gfc_next_ascii_char (void); gfc_char_t gfc_peek_char (void); @@ -2377,8 +2405,6 @@ void gfc_start_source_files (void); void gfc_end_source_files (void); /* misc.c */ -void *gfc_getmem (size_t) ATTRIBUTE_MALLOC; -void gfc_free (void *); int gfc_terminal_width (void); void gfc_clear_ts (gfc_typespec *); FILE *gfc_open_file (const char *); @@ -2398,9 +2424,10 @@ int get_c_kind (const char *, CInteropKind_t *); /* options.c */ unsigned int gfc_option_lang_mask (void); +void gfc_init_options_struct (struct gcc_options *); void gfc_init_options (unsigned int, struct cl_decoded_option *); -bool gfc_handle_option (size_t, const char *, int, int, +bool gfc_handle_option (size_t, const char *, int, int, location_t, const struct cl_option_handlers *); bool gfc_post_options (const char **); char *gfc_get_option_string (void); @@ -2474,6 +2501,8 @@ extern int gfc_default_character_kind; extern int gfc_default_logical_kind; extern int gfc_default_complex_kind; extern int gfc_c_int_kind; +extern int gfc_atomic_int_kind; +extern int gfc_atomic_logical_kind; extern int gfc_intio_kind; extern int gfc_charlen_int_kind; extern int gfc_numeric_storage_size; @@ -2556,8 +2585,6 @@ void gfc_free_st_label (gfc_st_label *); void gfc_define_st_label (gfc_st_label *, gfc_sl_type, locus *); gfc_try gfc_reference_st_label (gfc_st_label *, gfc_sl_type); -gfc_expr * gfc_lval_expr_from_sym (gfc_symbol *); - gfc_namespace *gfc_get_namespace (gfc_namespace *, int); gfc_symtree *gfc_new_symtree (gfc_symtree **, const char *); gfc_symtree *gfc_find_symtree (gfc_symtree *, const char *); @@ -2572,19 +2599,17 @@ gfc_symtree* gfc_find_symtree_in_proc (const char *, gfc_namespace *); int gfc_find_symbol (const char *, gfc_namespace *, int, gfc_symbol **); int gfc_find_sym_tree (const char *, gfc_namespace *, int, gfc_symtree **); int gfc_get_symbol (const char *, gfc_namespace *, gfc_symbol **); -gfc_try verify_c_interop (gfc_typespec *); -gfc_try verify_c_interop_param (gfc_symbol *); +gfc_try gfc_verify_c_interop (gfc_typespec *); +gfc_try gfc_verify_c_interop_param (gfc_symbol *); gfc_try verify_bind_c_sym (gfc_symbol *, gfc_typespec *, int, gfc_common_head *); gfc_try verify_bind_c_derived_type (gfc_symbol *); gfc_try verify_com_block_vars_c_interop (gfc_common_head *); void generate_isocbinding_symbol (const char *, iso_c_binding_symbol, const char *); -gfc_symbol *get_iso_c_sym (gfc_symbol *, char *, char *, int); +gfc_symbol *get_iso_c_sym (gfc_symbol *, char *, const char *, int); int gfc_get_sym_tree (const char *, gfc_namespace *, gfc_symtree **, bool); int gfc_get_ha_symbol (const char *, gfc_symbol **); int gfc_get_ha_sym_tree (const char *, gfc_symtree **); -int gfc_symbols_could_alias (gfc_symbol *, gfc_symbol *); - void gfc_undo_symbols (void); void gfc_commit_symbols (void); void gfc_commit_symbol (gfc_symbol *); @@ -2623,6 +2648,7 @@ gfc_try gfc_check_symbol_typed (gfc_symbol*, gfc_namespace*, bool, locus); gfc_namespace* gfc_find_proc_namespace (gfc_namespace*); bool gfc_is_associate_pointer (gfc_symbol*); +gfc_symbol * gfc_find_dt_in_generic (gfc_symbol *); /* intrinsic.c -- true if working in an init-expr, false otherwise. */ extern bool gfc_init_expr_flag; @@ -2670,11 +2696,14 @@ void gfc_free_case_list (gfc_case *); gfc_expr *gfc_get_parentheses (gfc_expr *); /* openmp.c */ +struct gfc_omp_saved_state { void *ptrs[2]; int ints[1]; }; void gfc_free_omp_clauses (gfc_omp_clauses *); void gfc_resolve_omp_directive (gfc_code *, gfc_namespace *); void gfc_resolve_do_iterator (gfc_code *, gfc_symbol *); void gfc_resolve_omp_parallel_blocks (gfc_code *, gfc_namespace *); void gfc_resolve_omp_do_blocks (gfc_code *, gfc_namespace *); +void gfc_omp_save_and_clear_state (struct gfc_omp_saved_state *); +void gfc_omp_restore_state (struct gfc_omp_saved_state *); /* expr.c */ void gfc_free_actual_arglist (gfc_actual_arglist *); @@ -2701,6 +2730,8 @@ gfc_expr *gfc_get_int_expr (int, locus *, int); gfc_expr *gfc_get_logical_expr (int, locus *, bool); gfc_expr *gfc_get_iokind_expr (locus *, io_kind); +void gfc_clear_shape (mpz_t *shape, int rank); +void gfc_free_shape (mpz_t **shape, int rank); void gfc_free_expr (gfc_expr *); void gfc_replace_expr (gfc_expr *, gfc_expr *); mpz_t *gfc_copy_shape (mpz_t *, int); @@ -2721,6 +2752,7 @@ gfc_try gfc_check_assign_symbol (gfc_symbol *, gfc_expr *); bool gfc_has_default_initializer (gfc_symbol *); gfc_expr *gfc_default_initializer (gfc_typespec *); gfc_expr *gfc_get_variable_expr (gfc_symtree *); +gfc_expr * gfc_lval_expr_from_sym (gfc_symbol *); gfc_array_spec *gfc_get_full_arrayspec_from_expr (gfc_expr *expr); @@ -2734,13 +2766,16 @@ void gfc_expr_replace_comp (gfc_expr *, gfc_component *); bool gfc_is_proc_ptr_comp (gfc_expr *, gfc_component **); +bool gfc_ref_this_image (gfc_ref *ref); bool gfc_is_coindexed (gfc_expr *); -bool gfc_get_corank (gfc_expr *); +bool gfc_is_coarray (gfc_expr *); +int gfc_get_corank (gfc_expr *); bool gfc_has_ultimate_allocatable (gfc_expr *); bool gfc_has_ultimate_pointer (gfc_expr *); -gfc_expr* gfc_build_intrinsic_call (const char*, locus, unsigned, ...); -gfc_try gfc_check_vardef_context (gfc_expr*, bool, const char*); +gfc_expr* gfc_build_intrinsic_call (gfc_namespace *, gfc_isym_id, const char*, + locus, unsigned, ...); +gfc_try gfc_check_vardef_context (gfc_expr*, bool, bool, const char*); /* st.c */ @@ -2759,6 +2794,8 @@ void gfc_resolve (gfc_namespace *); void gfc_resolve_blocks (gfc_code *, gfc_namespace *); int gfc_impure_variable (gfc_symbol *); int gfc_pure (gfc_symbol *); +int gfc_implicit_pure (gfc_symbol *); +void gfc_unset_implicit_pure (gfc_symbol *); int gfc_elemental (gfc_symbol *); gfc_try gfc_resolve_iterator (gfc_iterator *, bool); gfc_try find_forall_index (gfc_expr *, gfc_symbol *, int); @@ -2815,7 +2852,7 @@ void gfc_procedure_use (gfc_symbol *, gfc_actual_arglist **, locus *); void gfc_ppc_use (gfc_component *, gfc_actual_arglist **, locus *); gfc_symbol *gfc_search_interface (gfc_interface *, int, gfc_actual_arglist **); -gfc_try gfc_extend_expr (gfc_expr *, bool *); +match gfc_extend_expr (gfc_expr *); void gfc_free_formal_arglist (gfc_formal_arglist *); gfc_try gfc_extend_assign (gfc_code *, gfc_namespace *); gfc_try gfc_add_interface (gfc_symbol *); @@ -2825,6 +2862,8 @@ gfc_symtree* gfc_find_sym_in_symtree (gfc_symbol*); bool gfc_arglist_matches_symbol (gfc_actual_arglist**, gfc_symbol*); bool gfc_check_operator_interface (gfc_symbol*, gfc_intrinsic_op, locus); int gfc_has_vector_subscript (gfc_expr*); +gfc_intrinsic_op gfc_equivalent_op (gfc_intrinsic_op); +gfc_try gfc_check_typebound_override (gfc_symtree*, gfc_symtree*); /* io.c */ extern gfc_st_label format_asterisk; @@ -2846,7 +2885,7 @@ gfc_try gfc_resolve_wait (gfc_wait *); void gfc_module_init_2 (void); void gfc_module_done_2 (void); void gfc_dump_module (const char *, int); -bool gfc_check_access (gfc_access, gfc_access); +bool gfc_check_symbol_access (gfc_symbol *); void gfc_free_use_stmts (gfc_use_list *); /* primary.c */ @@ -2856,10 +2895,17 @@ match gfc_match_rvalue (gfc_expr **); match gfc_match_varspec (gfc_expr*, int, bool, bool); int gfc_check_digit (char, int); bool gfc_is_function_return_value (gfc_symbol *, gfc_namespace *); +gfc_try gfc_convert_to_structure_constructor (gfc_expr *, gfc_symbol *, + gfc_expr **, + gfc_actual_arglist **, bool); /* trans.c */ void gfc_generate_code (gfc_namespace *); void gfc_generate_module_code (gfc_namespace *); +void gfc_init_coarray_decl (bool); + +/* trans-intrinsic.c */ +bool gfc_inline_intrinsic_function_p (gfc_expr *); /* bbt.c */ typedef int (*compare_fn) (void *, void *); @@ -2875,14 +2921,27 @@ void gfc_global_used (gfc_gsymbol *, locus *); gfc_namespace* gfc_build_block_ns (gfc_namespace *); /* dependency.c */ +int gfc_dep_compare_functions (gfc_expr *, gfc_expr *, bool); int gfc_dep_compare_expr (gfc_expr *, gfc_expr *); /* check.c */ gfc_try gfc_check_same_strlen (const gfc_expr*, const gfc_expr*, const char*); +gfc_try gfc_calculate_transfer_sizes (gfc_expr*, gfc_expr*, gfc_expr*, + size_t*, size_t*, size_t*); /* class.c */ +void gfc_fix_class_refs (gfc_expr *e); void gfc_add_component_ref (gfc_expr *, const char *); +void gfc_add_class_array_ref (gfc_expr *); +#define gfc_add_data_component(e) gfc_add_component_ref(e,"_data") +#define gfc_add_vptr_component(e) gfc_add_component_ref(e,"_vptr") +#define gfc_add_hash_component(e) gfc_add_component_ref(e,"_hash") +#define gfc_add_size_component(e) gfc_add_component_ref(e,"_size") +#define gfc_add_def_init_component(e) gfc_add_component_ref(e,"_def_init") +bool gfc_is_class_array_ref (gfc_expr *, bool *); +bool gfc_is_class_scalar_expr (gfc_expr *); gfc_expr *gfc_class_null_initializer (gfc_typespec *); +unsigned int gfc_hash_value (gfc_symbol *); gfc_try gfc_build_class_symbol (gfc_typespec *, symbol_attribute *, gfc_array_spec **, bool); gfc_symbol *gfc_find_derived_vtab (gfc_symbol *);