aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorChao-ying Fu <fu@mips.com>2007-06-25 21:47:38 +0000
committerChao-ying Fu <fu@mips.com>2007-06-25 21:47:38 +0000
commite3ecfd1c143b8397dedd5e8f3acc4e78773ed15a (patch)
treed90c2c73607e0fbccb4e4e75fd41dd56013bc25c /gcc
parent9fe33fbe801b30baadf51a372c37907cbdedd762 (diff)
Merged revisions 125936-126003 via svnmerge from fixed-point
svn+ssh://chaoyingfu@sources.redhat.com/svn/gcc/trunk ........ r125936 | gccadmin | 2007-06-21 17:16:59 -0700 (Thu, 21 Jun 2007) | 1 line Daily bump. ........ r125938 | jvdelisle | 2007-06-21 18:50:09 -0700 (Thu, 21 Jun 2007) | 9 lines 2007-06-21 Jerry DeLisle <jvdelisle@gcc.gnu.org> * resolve.c (gfc_resolve_iterator_expr): Add check for REAL using gfc_notify_standard. (gfc_resolve_iterator): Remove check. (resolve_branch): Change "Obsolete" to "Deleted feature". * io.c (resolve_tag): Ditto. * match.c (gfc_match_pause, gfc_match_assign, gfc_match_goto): Ditto. ........ r125939 | jvdelisle | 2007-06-21 18:54:27 -0700 (Thu, 21 Jun 2007) | 11 lines 2007-06-21 Jerry DeLisle <jvdelisle@gcc.gnu.org> * gfortran.dg/assign.f90: Update test. * gfortran.dg/real_do_1.f90: Update test. * gfortran.dg/gomp/omp_do1.f90: Update test. * gfortran.dg/warnings_are_errors_1.f: Update test. * gfortran.dg/g77/20010519-1.f: Update test. * gfortran.dg/g77/pr9258.f: Update test. * gfortran.dg/g77/960317-1.f: Update test. ........ r125940 | zippel | 2007-06-21 19:55:07 -0700 (Thu, 21 Jun 2007) | 4 lines * df-scan.c (df_read_modify_subreg_p): Use REGMODE_NATURAL_SIZE. (df_def_record_1): Set (DF_REF_READ_WRITE | DF_REF_PARTIAL) for partial register accesses. ........ r125941 | daney | 2007-06-21 21:46:08 -0700 (Thu, 21 Jun 2007) | 6 lines * config/mips/mips.md (define_constants): Rename UNSPEC_EH_RECEIVER to UNSPEC_NONLOCAL_GOTO_RECEIVER globally. (exception_receiver): Renamed to ... (nonlocal_goto_receiver): ... this. ........ r125942 | daney | 2007-06-21 21:50:50 -0700 (Thu, 21 Jun 2007) | 2 lines Fix PR number from last commit 32046->32406. ........ r125948 | uros | 2007-06-22 05:56:37 -0700 (Fri, 22 Jun 2007) | 4 lines * config/i386/i386.c (override_options): Correct x86_sahf setting condition. ........ r125949 | jvdelisle | 2007-06-22 09:21:23 -0700 (Fri, 22 Jun 2007) | 6 lines 2007-06-22 Jerry DeLisle <jvdelisle@gcc.gnu.org> * expr.c (gfc_check_assign): If the rvalue expression type is NULL_EXPR, check to see if the lvalue has attribute pointer and data. ........ r125950 | jvdelisle | 2007-06-22 09:23:55 -0700 (Fri, 22 Jun 2007) | 5 lines 2007-06-22 Jerry DeLisle <jvdelisle@gcc.gnu.org> * gfortran.dg/pointer_assign_3.f90: New test. ........ r125951 | uros | 2007-06-22 10:51:06 -0700 (Fri, 22 Jun 2007) | 6 lines * config/i386/i386.c (ix86_register_move_cost): Rise the cost of moves between MMX/SSE registers to at least 8 units to prevent ICE caused by non-tieable SI/HI/QImodes in SSE registers. ........ r125954 | dfranke | 2007-06-22 11:33:35 -0700 (Fri, 22 Jun 2007) | 7 lines 2007-06-22 Daniel Franke <franke.daniel@gmail.com> * symbol.c (gfc_copy_attr): Emit errors for duplicate EXTERNAL/INTRINSIC statements. ........ r125955 | uros | 2007-06-22 11:51:28 -0700 (Fri, 22 Jun 2007) | 9 lines * expr.c (store_constructor): Do not clobber non-zeroed memory. testsuite/ChangeLog: * gcc.dg/pr32374.c: New test. ........ r125956 | uros | 2007-06-22 12:39:02 -0700 (Fri, 22 Jun 2007) | 4 lines * gcc.target/i386/large-size-array-3.c: Fix dg-do compile directive. Remove -m64 from dg-options. ........ r125957 | jakub | 2007-06-22 13:06:35 -0700 (Fri, 22 Jun 2007) | 3 lines * pthread_support.c (GC_get_thread_stack_base): Handle pthread_getattr_np failures. ........ r125962 | gccadmin | 2007-06-22 17:16:59 -0700 (Fri, 22 Jun 2007) | 1 line Daily bump. ........ r125971 | hubicka | 2007-06-23 04:58:18 -0700 (Sat, 23 Jun 2007) | 7 lines * gimplify.c (mark_addressable): New function. (gimplify_modify_expr_rhs, gimplify_addr_expr, gimplify_expr): Use it. * gcc.c-torture/compile/pr31541.c: New. ........ r125972 | zadeck | 2007-06-23 09:21:43 -0700 (Sat, 23 Jun 2007) | 8 lines 2007-06-23 Kenneth Zadeck <zadeck@naturalbridge.com> *dce.c (deletable_insn_p): Add extra parameter and recurse if insn is a PARALLEL. (prescan_insns_for_dce): Add extra parameter. ........ r125973 | rearnsha | 2007-06-23 11:07:04 -0700 (Sat, 23 Jun 2007) | 4 lines * arm.md (negscc): Match the correct operand for optimized LT0 test. Remove optimization for GT. *gcc.c-torture/execute/20070623-1.c: New. ........ r125974 | rguenth | 2007-06-23 11:17:57 -0700 (Sat, 23 Jun 2007) | 35 lines 2007-06-23 Richard Guenther <rguenther@suse.de> * tree.h (CALL_CANNOT_INLINE_P): New macro to access static_flag for CALL_EXPRs. * tree-inline.c (initialize_inlined_parameters): Do not call lang_hooks.tree_inlining.convert_parm_for_inlining. * cgraphbuild.c (initialize_inline_failed): Set inline failed reason for mismatched types. * gimplify.c (gimplify_call_expr): Verify the call expression arguments match the called function type signature. Otherwise mark the call expression to be not considered for inlining using CALL_CANNOT_INLINE_P flag. * ipa-inline.c (cgraph_mark_inline): Honor CALL_CANNOT_INLINE_P on the edges call expression. (cgraph_decide_inlining_of_small_function): Likewise. (cgraph_decide_inlining): Likewise. * c-objc-common.h (LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING): Remove define. * c-tree.h (c_convert_parm_for_inlining): Remove declaration. * c-typeck.c (c_convert_parm_for_inlining): Remove. * langhooks-def.h (lhd_tree_inlining_convert_parm_for_inlining): Remove declaration. (LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING): Remove define. * langhooks.c (lhd_tree_inlining_convert_parm_for_inlining): Remove. * langhooks.h (struct lang_hooks_for_tree_inlining): Remove convert_parm_for_inlining member. * gcc.dg/pr29254.c: The warning is bogus. * gcc.dg/warn-1.c: Likewise. * gcc.dg/assign-warn-3.c: Likewise. * gcc.dg/noncompile/pr16876.c: The testcase is bogus, remove. ........ r125975 | mmitchel | 2007-06-23 12:17:04 -0700 (Sat, 23 Jun 2007) | 23 lines 2007-06-23 Mark Mitchell <mark@codesourcery.com> * doc/extend.texi: Document that dllimport and dllexport imply default visibility. * tree.c (handle_dll_attribute): Set DECL_VISIBILITY on the imported or exported declaration, including type declarations. * c-common.c (handle_visibility_attribute): Check for conflicts with dllimport/dllexport. (c_determine_visibility): Handle dllimport/dllexport as an explicit visibility atttribute. 2007-06-23 Mark Mitchell <mark@codesourcery.com> * decl2.c (determine_visibility): Don't look for dllexport here. (determine_visibility_from_class): Tidy. 2007-06-23 Mark Mitchell <mark@codesourcery.com> * gcc.dg/visibility-12.c: New test. * gcc.dg/visibility-13.c: Likewise. * g++.dg/ext/visibility-9.C: Likewise. * g++.dg/ext/visibility-10.C: Likewise. ........ r125980 | gccadmin | 2007-06-23 17:16:55 -0700 (Sat, 23 Jun 2007) | 1 line Daily bump. ........ r125983 | pault | 2007-06-24 04:04:02 -0700 (Sun, 24 Jun 2007) | 19 lines 2007-06-24 Paul Thomas <pault@gcc.gnu.org> * trans-intrinsic.c (gfc_conv_intrinsic_minmaxloc): Calculate the offset between the loop counter and the position as defined. Add the offset within the loop so that the mask acts correctly. Do not advance the location on the basis that it is zero. 2007-06-24 Paul Thomas <pault@gcc.gnu.org> * gfortran.dg/minmaxloc_1.f90: New test. * gfortran.dg/minmaxloc_2.f90: New test. ........ r125984 | burnus | 2007-06-24 09:19:11 -0700 (Sun, 24 Jun 2007) | 17 lines 2007-06-24 Tobias Burnus <burnus@net-de> * interface.c (gfc_compare_derived_types): Add access check. * symbol.c (gfc_find_component): Ditto. (gfc_set_component_attr,gfc_get_component_attr) Copy access state. * dump-parse-tree.c (gfc_show_components): Dump access state. * gfortran.h (struct gfc_component): Add gfc_access. * module.c (mio_component): Add access state. * (gfc_match_structure_constructor): Check for private access state. 2007-06-24 Tobias Burnus <burnus@net-de> * gfortran.dg/private_type_6.f90: New. ........ r125985 | jvdelisle | 2007-06-24 11:54:50 -0700 (Sun, 24 Jun 2007) | 6 lines 2007-06-24 Jerry DeLisle <jvdelisle@gcc.gnu.org> * io/write.c (output_float): Calculate ndigits correctly for large numbered formats that must pad zeros before the decimal point. ........ r125986 | jvdelisle | 2007-06-24 11:58:36 -0700 (Sun, 24 Jun 2007) | 5 lines 2007-06-24 Jerry DeLisle <jvdelisle@gcc.gnu.org> * gfortran.dg/fmt_huge.f90: New test. ........ r125987 | pault | 2007-06-24 12:24:02 -0700 (Sun, 24 Jun 2007) | 5 lines 2007-06-24 Paul Thomas <pault@gcc.gnu.org> * gfortran.dg/pr32136.f90: New test. ........ r125988 | spop | 2007-06-24 13:59:02 -0700 (Sun, 24 Jun 2007) | 7 lines * fold-const.c (fold_binary): Strip nops of operand 0 of BIT_NOT_EXPR before calling operand_equal_p. * testsuite/gcc.dg/tree-ssa/pr32461-1.c: New. * testsuite/gcc.dg/tree-ssa/pr32461-2.c: New. ........ r125989 | jvdelisle | 2007-06-24 15:56:21 -0700 (Sun, 24 Jun 2007) | 11 lines 2007-06-24 Jerry DeLisle <jvdelisle@gcc.gnu.org> * runtime/error.c (show_locus): Update to emit the unit number and file name involved with the error. Use new function filename_from_unit. * libgfortran.h (filename_from_unit): Declare new function. * io/unit.c (init_units): Set the unit file name for stdin, stdout, and stderr for use later in error reporting. (filename_from_unit): Add this new function. ........ r125990 | jvdelisle | 2007-06-24 16:03:29 -0700 (Sun, 24 Jun 2007) | 5 lines 2007-06-24 Jerry DeLisle <jvdelisle@gcc.gnu.org> * gfortran.dg/error_format.f90: New test. ........ r125991 | hubicka | 2007-06-24 16:24:10 -0700 (Sun, 24 Jun 2007) | 3 lines * cgraphunit.c (cgraph_analyze_function): Fix ordering problem. ........ r125994 | gccadmin | 2007-06-24 17:16:54 -0700 (Sun, 24 Jun 2007) | 1 line Daily bump. ........ r125996 | jvdelisle | 2007-06-24 19:48:14 -0700 (Sun, 24 Jun 2007) | 5 lines 2007-06-24 Jerry DeLisle <jvdelisle@gcc.gnu.org> * gfortran.dg/secnds-1.f: Revise test to reduce random errors. ........ r125997 | jvdelisle | 2007-06-24 19:53:48 -0700 (Sun, 24 Jun 2007) | 2 lines Fix change log, removing erroneous PR number ........ r125998 | nemet | 2007-06-25 10:21:46 -0700 (Mon, 25 Jun 2007) | 4 lines * runtime/backtrace.c (local_strcasestr): Rename from strcasestr. (show_backtrace): Rename strcasestr to local_strcasestr. ........ r126000 | pault | 2007-06-25 11:27:59 -0700 (Mon, 25 Jun 2007) | 21 lines 2007-06-25 Paul Thomas <pault@gcc.gnu.org> * resolve.c (check_host_association): Return if the old symbol is use associated. Introduce retval to reduce the number of evaluations of the first-order return value. * match.c (gfc_match_call): If a host associated symbol is not a subroutine, build a new symtree/symbol in the current name space. 2007-06-25 Paul Thomas <pault@gcc.gnu.org> * gfortran.dg/host_assoc_function_2.f90: New test. * gfortran.dg/host_assoc_call_1.f90: New test. ........ r126001 | zippel | 2007-06-25 11:43:50 -0700 (Mon, 25 Jun 2007) | 10 lines * config/m68k/m68k.h (DATA_REGNO_P, ADDRESS_REGNO_P, INT_REGNO_P, FP_REGNO_P): Use IN_RANGE. (REGNO_OK_FOR_DATA_P, REGNO_OK_FOR_FP_P): Remove. (REGNO_OK_FOR_INDEX_NONSTRICT_P, REGNO_OK_FOR_BASE_NONSTRICT_P): New. (DATA_REG_P): Use DATA_REGNO_P. (FP_REG_P): Use FP_REGNO_P. (ADDRESS_REG_P): Use ADDRESS_REGNO_P. * config/m68k/m68k.c (m68k_legitimate_base_reg_p): Use REGNO_OK_FOR_INDEX_NONSTRICT_P, REGNO_OK_FOR_BASE_NONSTRICT_P. ........ r126002 | froydnj | 2007-06-25 12:15:08 -0700 (Mon, 25 Jun 2007) | 3 lines * config/rs6000/spe.md (*frob_ti_tf_2): Specify an input_operand as the source of the set. ........ r126003 | tbm | 2007-06-25 14:15:48 -0700 (Mon, 25 Jun 2007) | 2 lines add myself to MAINTAINERS under Write After Approval. ........ git-svn-id: https://gcc.gnu.org/svn/gcc/branches/fixed-point@126005 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog121
-rw-r--r--gcc/DATESTAMP2
-rw-r--r--gcc/c-common.c35
-rw-r--r--gcc/c-objc-common.h3
-rw-r--r--gcc/c-tree.h1
-rw-r--r--gcc/c-typeck.c31
-rw-r--r--gcc/cgraphbuild.c2
-rw-r--r--gcc/cgraphunit.c2
-rw-r--r--gcc/config/arm/arm.md5
-rw-r--r--gcc/config/i386/i386.c12
-rw-r--r--gcc/config/m68k/m68k.c4
-rw-r--r--gcc/config/m68k/m68k.h28
-rw-r--r--gcc/config/mips/mips.md6
-rw-r--r--gcc/config/rs6000/spe.md2
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/decl2.c18
-rw-r--r--gcc/dce.c26
-rw-r--r--gcc/df-scan.c31
-rw-r--r--gcc/doc/extend.texi16
-rw-r--r--gcc/expr.c2
-rw-r--r--gcc/fold-const.c30
-rw-r--r--gcc/fortran/ChangeLog54
-rw-r--r--gcc/fortran/dump-parse-tree.c2
-rw-r--r--gcc/fortran/expr.c18
-rw-r--r--gcc/fortran/gfortran.h1
-rw-r--r--gcc/fortran/interface.c3
-rw-r--r--gcc/fortran/io.c2
-rw-r--r--gcc/fortran/match.c22
-rw-r--r--gcc/fortran/module.c1
-rw-r--r--gcc/fortran/primary.c14
-rw-r--r--gcc/fortran/resolve.c45
-rw-r--r--gcc/fortran/symbol.c18
-rw-r--r--gcc/fortran/trans-intrinsic.c32
-rw-r--r--gcc/gimplify.c72
-rw-r--r--gcc/ipa-inline.c11
-rw-r--r--gcc/langhooks-def.h4
-rw-r--r--gcc/langhooks.c12
-rw-r--r--gcc/langhooks.h1
-rw-r--r--gcc/testsuite/ChangeLog80
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr31541.c9
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20070623-1.c41
-rw-r--r--gcc/testsuite/gcc.dg/assign-warn-3.c4
-rw-r--r--gcc/testsuite/gcc.dg/noncompile/pr16876.c15
-rw-r--r--gcc/testsuite/gcc.dg/pr29254.c3
-rw-r--r--gcc/testsuite/gcc.dg/pr32374.c20
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr32461-1.c24
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr32461-2.c26
-rw-r--r--gcc/testsuite/gcc.dg/warn-1.c2
-rw-r--r--gcc/testsuite/gcc.target/i386/large-size-array-3.c4
-rw-r--r--gcc/testsuite/gfortran.dg/assign.f902
-rw-r--r--gcc/testsuite/gfortran.dg/error_format.f9011
-rw-r--r--gcc/testsuite/gfortran.dg/fmt_huge.f906
-rw-r--r--gcc/testsuite/gfortran.dg/g77/20010519-1.f50
-rw-r--r--gcc/testsuite/gfortran.dg/g77/960317-1.f2
-rw-r--r--gcc/testsuite/gfortran.dg/g77/pr9258.f8
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/omp_do1.f904
-rw-r--r--gcc/testsuite/gfortran.dg/host_assoc_call_1.f9017
-rw-r--r--gcc/testsuite/gfortran.dg/host_assoc_function_2.f9048
-rw-r--r--gcc/testsuite/gfortran.dg/minmaxloc_1.f90118
-rw-r--r--gcc/testsuite/gfortran.dg/minmaxloc_2.f9029
-rw-r--r--gcc/testsuite/gfortran.dg/pointer_assign_3.f906
-rw-r--r--gcc/testsuite/gfortran.dg/pr32136.f9011
-rw-r--r--gcc/testsuite/gfortran.dg/private_type_6.f9025
-rw-r--r--gcc/testsuite/gfortran.dg/real_do_1.f906
-rw-r--r--gcc/testsuite/gfortran.dg/secnds-1.f23
-rw-r--r--gcc/testsuite/gfortran.dg/warnings_are_errors_1.f2
-rw-r--r--gcc/tree-inline.c13
-rw-r--r--gcc/tree.c31
-rw-r--r--gcc/tree.h8
69 files changed, 1035 insertions, 307 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 67247fe9efb..81df5d7d0c2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,124 @@
+2007-06-25 Nathan Froyd <froydnj@codesourcery.com>
+
+ * config/rs6000/spe.md (*frob_ti_tf_2): Specify an input_operand
+ as the source of the set.
+
+2007-06-25 Roman Zippel <zippel@linux-m68k.org>
+
+ * config/m68k/m68k.h (DATA_REGNO_P, ADDRESS_REGNO_P, INT_REGNO_P,
+ FP_REGNO_P): Use IN_RANGE.
+ (REGNO_OK_FOR_DATA_P, REGNO_OK_FOR_FP_P): Remove.
+ (REGNO_OK_FOR_INDEX_NONSTRICT_P, REGNO_OK_FOR_BASE_NONSTRICT_P): New.
+ (DATA_REG_P): Use DATA_REGNO_P.
+ (FP_REG_P): Use FP_REGNO_P.
+ (ADDRESS_REG_P): Use ADDRESS_REGNO_P.
+ * config/m68k/m68k.c (m68k_legitimate_base_reg_p): Use
+ REGNO_OK_FOR_INDEX_NONSTRICT_P, REGNO_OK_FOR_BASE_NONSTRICT_P.
+
+2007-06-24 Jan Hubicka <jh@suse.cz>
+
+ PR middle-end/30563
+ * cgraphunit.c (cgraph_analyze_function): Fix ordering problem.
+
+2007-06-24 Sebastian Pop <sebpop@gmail.com>
+
+ PR middle-end/32461
+ * fold-const.c (fold_binary): Strip nops of operand 0
+ of BIT_NOT_EXPR before calling operand_equal_p.
+ * testsuite/gcc.dg/tree-ssa/pr32461-1.c: New.
+ * testsuite/gcc.dg/tree-ssa/pr32461-2.c: New.
+
+2007-06-23 Mark Mitchell <mark@codesourcery.com>
+
+ * doc/extend.texi: Document that dllimport and dllexport imply
+ default visibility.
+ * tree.c (handle_dll_attribute): Set DECL_VISIBILITY on the
+ imported or exported declaration, including type declarations.
+ * c-common.c (handle_visibility_attribute): Check for conflicts
+ with dllimport/dllexport.
+ (c_determine_visibility): Handle dllimport/dllexport as an
+ explicit visibility atttribute.
+
+2007-06-23 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/16876
+ PR middle-end/29478
+ * tree.h (CALL_CANNOT_INLINE_P): New macro to access static_flag
+ for CALL_EXPRs.
+ * tree-inline.c (initialize_inlined_parameters): Do not call
+ lang_hooks.tree_inlining.convert_parm_for_inlining.
+ * cgraphbuild.c (initialize_inline_failed): Set inline failed
+ reason for mismatched types.
+ * gimplify.c (gimplify_call_expr): Verify the call expression
+ arguments match the called function type signature. Otherwise
+ mark the call expression to be not considered for inlining
+ using CALL_CANNOT_INLINE_P flag.
+ * ipa-inline.c (cgraph_mark_inline): Honor CALL_CANNOT_INLINE_P on the
+ edges call expression.
+ (cgraph_decide_inlining_of_small_function): Likewise.
+ (cgraph_decide_inlining): Likewise.
+ * c-objc-common.h (LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING):
+ Remove define.
+ * c-tree.h (c_convert_parm_for_inlining): Remove declaration.
+ * c-typeck.c (c_convert_parm_for_inlining): Remove.
+ * langhooks-def.h (lhd_tree_inlining_convert_parm_for_inlining):
+ Remove declaration.
+ (LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING): Remove define.
+ * langhooks.c (lhd_tree_inlining_convert_parm_for_inlining):
+ Remove.
+ * langhooks.h (struct lang_hooks_for_tree_inlining): Remove
+ convert_parm_for_inlining member.
+
+2007-06-23 Richard Earnshaw <rearnsha@arm.com>
+
+ PR target/31152
+ * arm.md (negscc): Match the correct operand for optimized LT0 test.
+ Remove optimization for GT.
+
+2007-06-23 Kenneth Zadeck <zadeck@naturalbridge.com>
+
+ PR middle-end/32437
+ *dce.c (deletable_insn_p): Add extra parameter and recurse if insn
+ is a PARALLEL.
+ (prescan_insns_for_dce): Add extra parameter.
+
+2007-06-23 Jan Hubicka <jh@suse.cz>
+
+ PR middle-end/31541
+ * gimplify.c (mark_addressable): New function.
+ (gimplify_modify_expr_rhs, gimplify_addr_expr, gimplify_expr): Use it.
+
+2007-06-19 Uros Bizjak <ubizjak@gmail.com>
+
+ PR middle-end/32374
+ * expr.c (store_constructor): Do not clobber non-zeroed memory.
+
+2007-06-22 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/32413
+ * config/i386/i386.c (ix86_register_move_cost): Rise the cost of
+ moves between MMX/SSE registers to at least 8 units to prevent
+ ICE caused by non-tieable SI/HI/QImodes in SSE registers.
+
+2007-06-22 Uros Bizjak <ubizjak@gmail.com>
+
+ * config/i386/i386.c (override_options): Correct x86_sahf
+ setting condition.
+
+2007-06-21 David Daney <ddaney@avtrex.com>
+
+ PR target/32406
+ * config/mips/mips.md (define_constants): Rename UNSPEC_EH_RECEIVER
+ to UNSPEC_NONLOCAL_GOTO_RECEIVER globally.
+ (exception_receiver): Renamed to ...
+ (nonlocal_goto_receiver): ... this.
+
+2007-06-22 Roman Zippel <zippel@linux-m68k.org>
+
+ * df-scan.c (df_read_modify_subreg_p): Use REGMODE_NATURAL_SIZE.
+ (df_def_record_1): Set (DF_REF_READ_WRITE | DF_REF_PARTIAL) for
+ partial register accesses.
+
2007-06-22 Chao-ying Fu <fu@mips.com>
* doc/c-tree.texi (FIXED_CST): Remove spaces.
diff --git a/gcc/DATESTAMP b/gcc/DATESTAMP
index b07d4f6f7c7..2e298d9d5f2 100644
--- a/gcc/DATESTAMP
+++ b/gcc/DATESTAMP
@@ -1 +1 @@
-20070621
+20070625
diff --git a/gcc/c-common.c b/gcc/c-common.c
index be7891022f9..f4368458120 100644
--- a/gcc/c-common.c
+++ b/gcc/c-common.c
@@ -5640,11 +5640,22 @@ handle_visibility_attribute (tree *node, tree name, tree args,
}
if (DECL_VISIBILITY_SPECIFIED (decl)
- && vis != DECL_VISIBILITY (decl)
- && lookup_attribute ("visibility", (TYPE_P (*node)
- ? TYPE_ATTRIBUTES (*node)
- : DECL_ATTRIBUTES (decl))))
- error ("%qD redeclared with different visibility", decl);
+ && vis != DECL_VISIBILITY (decl))
+ {
+ tree attributes = (TYPE_P (*node)
+ ? TYPE_ATTRIBUTES (*node)
+ : DECL_ATTRIBUTES (decl));
+ if (lookup_attribute ("visibility", attributes))
+ error ("%qD redeclared with different visibility", decl);
+ else if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
+ && lookup_attribute ("dllimport", attributes))
+ error ("%qD was declared %qs which implies default visibility",
+ decl, "dllimport");
+ else if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
+ && lookup_attribute ("dllexport", attributes))
+ error ("%qD was declared %qs which implies default visibility",
+ decl, "dllexport");
+ }
DECL_VISIBILITY (decl) = vis;
DECL_VISIBILITY_SPECIFIED (decl) = 1;
@@ -5677,18 +5688,12 @@ c_determine_visibility (tree decl)
to distinguish the use of an attribute from the use of a "#pragma
GCC visibility push(...)"; in the latter case we still want other
considerations to be able to overrule the #pragma. */
- if (lookup_attribute ("visibility", DECL_ATTRIBUTES (decl)))
+ if (lookup_attribute ("visibility", DECL_ATTRIBUTES (decl))
+ || (TARGET_DLLIMPORT_DECL_ATTRIBUTES
+ && (lookup_attribute ("dllimport", DECL_ATTRIBUTES (decl))
+ || lookup_attribute ("dllexport", DECL_ATTRIBUTES (decl)))))
return true;
- /* Anything that is exported must have default visibility. */
- if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
- && lookup_attribute ("dllexport", DECL_ATTRIBUTES (decl)))
- {
- DECL_VISIBILITY (decl) = VISIBILITY_DEFAULT;
- DECL_VISIBILITY_SPECIFIED (decl) = 1;
- return true;
- }
-
/* Set default visibility to whatever the user supplied with
visibility_specified depending on #pragma GCC visibility. */
if (!DECL_VISIBILITY_SPECIFIED (decl))
diff --git a/gcc/c-objc-common.h b/gcc/c-objc-common.h
index e6a82efd4ae..171e702e59d 100644
--- a/gcc/c-objc-common.h
+++ b/gcc/c-objc-common.h
@@ -89,9 +89,6 @@ extern void c_initialize_diagnostics (diagnostic_context *);
#undef LANG_HOOKS_TREE_INLINING_DISREGARD_INLINE_LIMITS
#define LANG_HOOKS_TREE_INLINING_DISREGARD_INLINE_LIMITS \
c_disregard_inline_limits
-#undef LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING
-#define LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING \
- c_convert_parm_for_inlining
#undef LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN
#define LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN c_dump_tree
diff --git a/gcc/c-tree.h b/gcc/c-tree.h
index dd0702d9e9d..48e798fb158 100644
--- a/gcc/c-tree.h
+++ b/gcc/c-tree.h
@@ -581,7 +581,6 @@ extern tree c_start_case (tree);
extern void c_finish_case (tree);
extern tree build_asm_expr (tree, tree, tree, tree, bool);
extern tree build_asm_stmt (tree, tree);
-extern tree c_convert_parm_for_inlining (tree, tree, tree, int);
extern int c_types_compatible_p (tree, tree);
extern tree c_begin_compound_stmt (bool);
extern tree c_end_compound_stmt (tree, bool);
diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c
index 774050c9c3c..67a4f3ebf67 100644
--- a/gcc/c-typeck.c
+++ b/gcc/c-typeck.c
@@ -4355,37 +4355,6 @@ convert_for_assignment (tree type, tree rhs, enum impl_conv errtype,
return error_mark_node;
}
-
-/* Convert VALUE for assignment into inlined parameter PARM. ARGNUM
- is used for error and warning reporting and indicates which argument
- is being processed. */
-
-tree
-c_convert_parm_for_inlining (tree parm, tree value, tree fn, int argnum)
-{
- tree ret, type;
-
- /* If FN was prototyped at the call site, the value has been converted
- already in convert_arguments.
- However, we might see a prototype now that was not in place when
- the function call was seen, so check that the VALUE actually matches
- PARM before taking an early exit. */
- if (!value
- || (TYPE_ARG_TYPES (TREE_TYPE (fn))
- && (TYPE_MAIN_VARIANT (TREE_TYPE (parm))
- == TYPE_MAIN_VARIANT (TREE_TYPE (value)))))
- return value;
-
- type = TREE_TYPE (parm);
- ret = convert_for_assignment (type, value,
- ic_argpass_nonproto, fn,
- fn, argnum);
- if (targetm.calls.promote_prototypes (TREE_TYPE (fn))
- && INTEGRAL_TYPE_P (type)
- && (TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)))
- ret = default_conversion (ret);
- return ret;
-}
/* If VALUE is a compound expr all of whose expressions are constant, then
return its value. Otherwise, return error_mark_node.
diff --git a/gcc/cgraphbuild.c b/gcc/cgraphbuild.c
index ec4e356c8c2..dbd8b48978b 100644
--- a/gcc/cgraphbuild.c
+++ b/gcc/cgraphbuild.c
@@ -99,6 +99,8 @@ initialize_inline_failed (struct cgraph_node *node)
"considered for inlining");
else if (!node->local.inlinable)
e->inline_failed = N_("function not inlinable");
+ else if (CALL_CANNOT_INLINE_P (e->call_stmt))
+ e->inline_failed = N_("mismatched arguments");
else
e->inline_failed = N_("function not considered for inlining");
}
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index 1dba95bb06a..ac8472f23a4 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -760,6 +760,7 @@ cgraph_analyze_function (struct cgraph_node *node)
current_function_decl = decl;
push_cfun (DECL_STRUCT_FUNCTION (decl));
cgraph_lower_function (node);
+ node->analyzed = true;
if (!flag_unit_at_a_time)
{
@@ -771,7 +772,6 @@ cgraph_analyze_function (struct cgraph_node *node)
bitmap_obstack_release (NULL);
}
- node->analyzed = true;
pop_cfun ();
current_function_decl = NULL;
}
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index 664f23d8fe8..5a8774e79ad 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -9423,15 +9423,12 @@
(clobber (reg:CC CC_REGNUM))]
"TARGET_ARM"
"*
- if (GET_CODE (operands[3]) == LT && operands[3] == const0_rtx)
+ if (GET_CODE (operands[3]) == LT && operands[2] == const0_rtx)
return \"mov\\t%0, %1, asr #31\";
if (GET_CODE (operands[3]) == NE)
return \"subs\\t%0, %1, %2\;mvnne\\t%0, #0\";
- if (GET_CODE (operands[3]) == GT)
- return \"subs\\t%0, %1, %2\;mvnne\\t%0, %0, asr #31\";
-
output_asm_insn (\"cmp\\t%1, %2\", operands);
output_asm_insn (\"mov%D3\\t%0, #0\", operands);
return \"mvn%d3\\t%0, #0\";
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index ad51cb616fe..5c5cb528858 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -2059,7 +2059,7 @@ override_options (void)
x86_popcnt = true;
if (processor_alias_table[i].flags & (PTA_PREFETCH_SSE | PTA_SSE))
x86_prefetch_sse = true;
- if ((processor_alias_table[i].flags & PTA_NO_SAHF) && !TARGET_64BIT)
+ if (!(TARGET_64BIT && (processor_alias_table[i].flags & PTA_NO_SAHF)))
x86_sahf = true;
break;
@@ -20279,7 +20279,15 @@ ix86_register_move_cost (enum machine_mode mode, enum reg_class class1,
/* Moves between SSE/MMX and integer unit are expensive. */
if (MMX_CLASS_P (class1) != MMX_CLASS_P (class2)
|| SSE_CLASS_P (class1) != SSE_CLASS_P (class2))
- return ix86_cost->mmxsse_to_integer;
+
+ /* ??? By keeping returned value relatively high, we limit the number
+ of moves between integer and MMX/SSE registers for all targets.
+ Additionally, high value prevents problem with x86_modes_tieable_p(),
+ where integer modes in MMX/SSE registers are not tieable
+ because of missing QImode and HImode moves to, from or between
+ MMX/SSE registers. */
+ return MAX (ix86_cost->mmxsse_to_integer, 8);
+
if (MAYBE_FLOAT_CLASS_P (class1))
return ix86_cost->fp_move;
if (MAYBE_SSE_CLASS_P (class1))
diff --git a/gcc/config/m68k/m68k.c b/gcc/config/m68k/m68k.c
index 039649c2e48..ec65a889233 100644
--- a/gcc/config/m68k/m68k.c
+++ b/gcc/config/m68k/m68k.c
@@ -1609,7 +1609,7 @@ m68k_legitimate_base_reg_p (rtx x, bool strict_p)
return (REG_P (x)
&& (strict_p
? REGNO_OK_FOR_BASE_P (REGNO (x))
- : !DATA_REGNO_P (REGNO (x)) && !FP_REGNO_P (REGNO (x))));
+ : REGNO_OK_FOR_BASE_NONSTRICT_P (REGNO (x))));
}
/* Return true if X is a legitimate index register. STRICT_P says
@@ -1624,7 +1624,7 @@ m68k_legitimate_index_reg_p (rtx x, bool strict_p)
return (REG_P (x)
&& (strict_p
? REGNO_OK_FOR_INDEX_P (REGNO (x))
- : !FP_REGNO_P (REGNO (x))));
+ : REGNO_OK_FOR_INDEX_NONSTRICT_P (REGNO (x))));
}
/* Return true if X is a legitimate index expression for a (d8,An,Xn) or
diff --git a/gcc/config/m68k/m68k.h b/gcc/config/m68k/m68k.h
index e84994b7f10..3ff24842343 100644
--- a/gcc/config/m68k/m68k.h
+++ b/gcc/config/m68k/m68k.h
@@ -662,16 +662,16 @@ __transfer_from_trampoline () \
/* Macros to check register numbers against specific register classes. */
/* True for data registers, D0 through D7. */
-#define DATA_REGNO_P(REGNO) ((unsigned int) (REGNO) < 8)
+#define DATA_REGNO_P(REGNO) IN_RANGE (REGNO, 0, 7)
/* True for address registers, A0 through A7. */
-#define ADDRESS_REGNO_P(REGNO) (((unsigned int) (REGNO) - 8) < 8)
+#define ADDRESS_REGNO_P(REGNO) IN_RANGE (REGNO, 8, 15)
/* True for integer registers, D0 through D7 and A0 through A7. */
-#define INT_REGNO_P(REGNO) ((unsigned int) (REGNO) < 16)
+#define INT_REGNO_P(REGNO) IN_RANGE (REGNO, 0, 15)
/* True for floating point registers, FP0 through FP7. */
-#define FP_REGNO_P(REGNO) (((unsigned int) (REGNO) - 16) < 8)
+#define FP_REGNO_P(REGNO) IN_RANGE (REGNO, 16, 23)
#define REGNO_OK_FOR_INDEX_P(REGNO) \
(INT_REGNO_P (REGNO) \
@@ -681,13 +681,15 @@ __transfer_from_trampoline () \
(ADDRESS_REGNO_P (REGNO) \
|| ADDRESS_REGNO_P (reg_renumber[REGNO]))
-#define REGNO_OK_FOR_DATA_P(REGNO) \
- (DATA_REGNO_P (REGNO) \
- || DATA_REGNO_P (reg_renumber[REGNO]))
+#define REGNO_OK_FOR_INDEX_NONSTRICT_P(REGNO) \
+ (INT_REGNO_P (REGNO) \
+ || REGNO == ARG_POINTER_REGNUM \
+ || REGNO >= FIRST_PSEUDO_REGISTER)
-#define REGNO_OK_FOR_FP_P(REGNO) \
- (FP_REGNO_P (REGNO) \
- || FP_REGNO_P (reg_renumber[REGNO]))
+#define REGNO_OK_FOR_BASE_NONSTRICT_P(REGNO) \
+ (ADDRESS_REGNO_P (REGNO) \
+ || REGNO == ARG_POINTER_REGNUM \
+ || REGNO >= FIRST_PSEUDO_REGISTER)
/* Now macros that check whether X is a register and also,
strictly, whether it is in a specified class.
@@ -697,13 +699,13 @@ __transfer_from_trampoline () \
define_optimization. */
/* 1 if X is a data register. */
-#define DATA_REG_P(X) (REG_P (X) && REGNO_OK_FOR_DATA_P (REGNO (X)))
+#define DATA_REG_P(X) (REG_P (X) && DATA_REGNO_P (REGNO (X)))
/* 1 if X is an fp register. */
-#define FP_REG_P(X) (REG_P (X) && REGNO_OK_FOR_FP_P (REGNO (X)))
+#define FP_REG_P(X) (REG_P (X) && FP_REGNO_P (REGNO (X)))
/* 1 if X is an address register */
-#define ADDRESS_REG_P(X) (REG_P (X) && REGNO_OK_FOR_BASE_P (REGNO (X)))
+#define ADDRESS_REG_P(X) (REG_P (X) && ADDRESS_REGNO_P (REGNO (X)))
/* True if SYMBOL + OFFSET constants must refer to something within
SYMBOL's section. */
diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md
index 3dc3c00bc10..8eb5576e059 100644
--- a/gcc/config/mips/mips.md
+++ b/gcc/config/mips/mips.md
@@ -31,7 +31,7 @@
(UNSPEC_GET_FNADDR 3)
(UNSPEC_BLOCKAGE 4)
(UNSPEC_CPRESTORE 5)
- (UNSPEC_EH_RECEIVER 6)
+ (UNSPEC_NONLOCAL_GOTO_RECEIVER 6)
(UNSPEC_EH_RETURN 7)
(UNSPEC_CONSTTABLE_INT 8)
(UNSPEC_CONSTTABLE_FLOAT 9)
@@ -5143,9 +5143,9 @@
DONE;
})
-(define_insn_and_split "exception_receiver"
+(define_insn_and_split "nonlocal_goto_receiver"
[(set (reg:SI 28)
- (unspec_volatile:SI [(const_int 0)] UNSPEC_EH_RECEIVER))]
+ (unspec_volatile:SI [(const_int 0)] UNSPEC_NONLOCAL_GOTO_RECEIVER))]
"TARGET_CALL_CLOBBERED_GP"
"#"
"&& reload_completed"
diff --git a/gcc/config/rs6000/spe.md b/gcc/config/rs6000/spe.md
index 94e8528ab08..58d401fb3c1 100644
--- a/gcc/config/rs6000/spe.md
+++ b/gcc/config/rs6000/spe.md
@@ -2319,7 +2319,7 @@
(define_insn "*frob_ti_tf_2"
[(set (subreg:TF (match_operand:TI 0 "gpc_reg_operand" "=&r") 0)
- (match_operand:TF 1 "gpc_reg_operand" "r"))]
+ (match_operand:TF 1 "input_operand" "r"))]
"TARGET_E500_DOUBLE"
"evmergehi %0,%1,%1\;mr %L0,%1\;evmergehi %Y0,%L1,%L1\;mr %Z0,%L1"
[(set_attr "length" "16")])
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 609b80cb31d..951faf4af49 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2007-06-23 Mark Mitchell <mark@codesourcery.com>
+
+ * decl2.c (determine_visibility): Don't look for dllexport here.
+ (determine_visibility_from_class): Tidy.
+
2007-06-18 Simon Baldwin <simonb@google.com>
PR c++/31923
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 52953b2fa0c..b745183f1af 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -1684,17 +1684,6 @@ determine_visibility (tree decl)
else
use_template = 0;
- /* Anything that is exported must have default visibility. */
- if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
- && lookup_attribute ("dllexport",
- TREE_CODE (decl) == TYPE_DECL
- ? TYPE_ATTRIBUTES (TREE_TYPE (decl))
- : DECL_ATTRIBUTES (decl)))
- {
- DECL_VISIBILITY (decl) = VISIBILITY_DEFAULT;
- DECL_VISIBILITY_SPECIFIED (decl) = 1;
- }
-
/* If DECL is a member of a class, visibility specifiers on the
class can influence the visibility of the DECL. */
if (DECL_CLASS_SCOPE_P (decl))
@@ -1796,18 +1785,20 @@ determine_visibility (tree decl)
static void
determine_visibility_from_class (tree decl, tree class_type)
{
+ if (DECL_VISIBILITY_SPECIFIED (decl))
+ return;
+
if (visibility_options.inlines_hidden
/* Don't do this for inline templates; specializations might not be
inline, and we don't want them to inherit the hidden
visibility. We'll set it here for all inline instantiations. */
&& !processing_template_decl
- && ! DECL_VISIBILITY_SPECIFIED (decl)
&& TREE_CODE (decl) == FUNCTION_DECL
&& DECL_DECLARED_INLINE_P (decl)
&& (! DECL_LANG_SPECIFIC (decl)
|| ! DECL_EXPLICIT_INSTANTIATION (decl)))
DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
- else if (!DECL_VISIBILITY_SPECIFIED (decl))
+ else
{
/* Default to the class visibility. */
DECL_VISIBILITY (decl) = CLASSTYPE_VISIBILITY (class_type);
@@ -1826,7 +1817,6 @@ determine_visibility_from_class (tree decl, tree class_type)
&& !DECL_CONSTRUCTION_VTABLE_P (decl)))
&& TREE_PUBLIC (decl)
&& !DECL_REALLY_EXTERN (decl)
- && !DECL_VISIBILITY_SPECIFIED (decl)
&& !CLASSTYPE_VISIBILITY_SPECIFIED (class_type))
targetm.cxx.determine_class_data_visibility (decl);
}
diff --git a/gcc/dce.c b/gcc/dce.c
index 902dbd923a8..0252d4d5b24 100644
--- a/gcc/dce.c
+++ b/gcc/dce.c
@@ -58,15 +58,14 @@ static bitmap_obstack dce_tmp_bitmap_obstack;
static sbitmap marked = NULL;
-/* Return true if INSN a normal instruction that can be deleted by the
- DCE pass. */
+/* Return true if INSN with BODY is a normal instruction that can be
+ deleted by the DCE pass. */
static bool
-deletable_insn_p (rtx insn, bool fast)
+deletable_insn_p (rtx insn, rtx body, bool fast)
{
rtx x;
-
- switch (GET_CODE (PATTERN (insn)))
+ switch (GET_CODE (body))
{
case USE:
case PREFETCH:
@@ -86,7 +85,7 @@ deletable_insn_p (rtx insn, bool fast)
/* A CLOBBER of a dead pseudo register serves no purpose.
That is not necessarily true for hard registers until
after reload. */
- x = XEXP (PATTERN (insn), 0);
+ x = XEXP (body, 0);
return REG_P (x) && (!HARD_REGISTER_P (x) || reload_completed);
}
else
@@ -95,14 +94,23 @@ deletable_insn_p (rtx insn, bool fast)
never be the target of a use-def chain. */
return false;
+ case PARALLEL:
+ {
+ int i;
+ for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
+ if (!deletable_insn_p (insn, XVECEXP (body, 0, i), fast))
+ return false;
+ return true;
+ }
+
default:
if (!NONJUMP_INSN_P (insn))
return false;
- if (volatile_insn_p (PATTERN (insn)))
+ if (volatile_insn_p (body))
return false;
- if (flag_non_call_exceptions && may_trap_p (PATTERN (insn)))
+ if (flag_non_call_exceptions && may_trap_p (body))
return false;
return true;
@@ -361,7 +369,7 @@ prescan_insns_for_dce (bool fast)
rtx note = find_reg_note (insn, REG_LIBCALL_ID, NULL_RTX);
if (note)
mark_libcall (insn, fast);
- else if (deletable_insn_p (insn, fast))
+ else if (deletable_insn_p (insn, PATTERN (insn), fast))
mark_nonreg_stores (PATTERN (insn), insn, fast);
else
mark_insn (insn, fast);
diff --git a/gcc/df-scan.c b/gcc/df-scan.c
index 17c22721ead..fdad6a931b6 100644
--- a/gcc/df-scan.c
+++ b/gcc/df-scan.c
@@ -2703,7 +2703,8 @@ df_read_modify_subreg_p (rtx x)
return false;
isize = GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)));
osize = GET_MODE_SIZE (GET_MODE (x));
- return (isize > osize && isize > UNITS_PER_WORD);
+ return isize > osize
+ && isize > REGMODE_NATURAL_SIZE (GET_MODE (SUBREG_REG (x)));
}
@@ -2718,7 +2719,6 @@ df_def_record_1 (struct df_collection_rec *collection_rec,
{
rtx *loc;
rtx dst;
- bool dst_in_strict_lowpart = false;
/* We may recursively call ourselves on EXPR_LIST when dealing with PARALLEL
construct. */
@@ -2749,33 +2749,16 @@ df_def_record_1 (struct df_collection_rec *collection_rec,
/* Maybe, we should flag the use of STRICT_LOW_PART somehow. It might
be handy for the reg allocator. */
while (GET_CODE (dst) == STRICT_LOW_PART
- || GET_CODE (dst) == ZERO_EXTRACT
- || df_read_modify_subreg_p (dst))
+ || GET_CODE (dst) == ZERO_EXTRACT)
{
-#if 0
- /* Strict low part always contains SUBREG, but we do not want to make
- it appear outside, as whole register is always considered. */
- if (GET_CODE (dst) == STRICT_LOW_PART)
- {
- loc = &XEXP (dst, 0);
- dst = *loc;
- }
-#endif
+ flags |= DF_REF_READ_WRITE | DF_REF_PARTIAL;
loc = &XEXP (dst, 0);
- if (GET_CODE (dst) == STRICT_LOW_PART)
- dst_in_strict_lowpart = true;
dst = *loc;
- flags |= DF_REF_READ_WRITE;
-
}
- /* Sets to a subreg of a single word register are partial sets if
- they are wrapped in a strict lowpart, and not partial otherwise.
- */
- if (GET_CODE (dst) == SUBREG && REG_P (SUBREG_REG (dst))
- && dst_in_strict_lowpart)
- flags |= DF_REF_PARTIAL;
-
+ if (df_read_modify_subreg_p (dst))
+ flags |= DF_REF_READ_WRITE | DF_REF_PARTIAL;
+
if (REG_P (dst)
|| (GET_CODE (dst) == SUBREG && REG_P (SUBREG_REG (dst))))
df_ref_record (collection_rec,
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index 8a6ea17b990..9f5a373604c 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -1911,10 +1911,8 @@ You can use @code{__declspec(dllexport)} as a synonym for
compilers.
On systems that support the @code{visibility} attribute, this
-attribute also implies ``default'' visibility, unless a
-@code{visibility} attribute is explicitly specified. You should avoid
-the use of @code{dllexport} with ``hidden'' or ``internal''
-visibility; in the future GCC may issue an error for those cases.
+attribute also implies ``default'' visibility. It is an error to
+explicitly specify any other visibility.
Currently, the @code{dllexport} attribute is ignored for inlined
functions, unless the @option{-fkeep-inline-functions} flag has been
@@ -1935,14 +1933,18 @@ the @option{--export-all} linker flag.
On Microsoft Windows and Symbian OS targets, the @code{dllimport}
attribute causes the compiler to reference a function or variable via
a global pointer to a pointer that is set up by the DLL exporting the
-symbol. The attribute implies @code{extern} storage. On Microsoft
-Windows targets, the pointer name is formed by combining @code{_imp__}
-and the function or variable name.
+symbol. The attribute implies @code{extern}. On Microsoft Windows
+targets, the pointer name is formed by combining @code{_imp__} and the
+function or variable name.
You can use @code{__declspec(dllimport)} as a synonym for
@code{__attribute__ ((dllimport))} for compatibility with other
compilers.
+On systems that support the @code{visibility} attribute, this
+attribute also implies ``default'' visibility. It is an error to
+explicitly specify any other visibility.
+
Currently, the attribute is ignored for inlined functions. If the
attribute is applied to a symbol @emph{definition}, an error is reported.
If a symbol previously declared @code{dllimport} is later defined, the
diff --git a/gcc/expr.c b/gcc/expr.c
index d3d746bd189..26701d0f99a 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -5082,7 +5082,7 @@ store_constructor (tree exp, rtx target, int cleared, HOST_WIDE_INT size)
cleared = 1;
}
- if (! cleared)
+ if (REG_P (target) && !cleared)
emit_insn (gen_rtx_CLOBBER (VOIDmode, target));
/* Store each element of the constructor into the
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index d22e9c447b3..e23b4e3f711 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -9550,21 +9550,31 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
/* ~X + X is -1. */
if (TREE_CODE (arg0) == BIT_NOT_EXPR
- && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
&& !TYPE_OVERFLOW_TRAPS (type))
{
- t1 = build_int_cst_type (type, -1);
- return omit_one_operand (type, t1, arg1);
+ tree tem = TREE_OPERAND (arg0, 0);
+
+ STRIP_NOPS (tem);
+ if (operand_equal_p (tem, arg1, 0))
+ {
+ t1 = build_int_cst_type (type, -1);
+ return omit_one_operand (type, t1, arg1);
+ }
}
/* X + ~X is -1. */
if (TREE_CODE (arg1) == BIT_NOT_EXPR
- && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
&& !TYPE_OVERFLOW_TRAPS (type))
{
- t1 = build_int_cst_type (type, -1);
- return omit_one_operand (type, t1, arg0);
- }
+ tree tem = TREE_OPERAND (arg1, 0);
+
+ STRIP_NOPS (tem);
+ if (operand_equal_p (arg0, tem, 0))
+ {
+ t1 = build_int_cst_type (type, -1);
+ return omit_one_operand (type, t1, arg0);
+ }
+ }
/* If we are adding two BIT_AND_EXPR's, both of which are and'ing
with a constant, and the two constants have no bits in common,
@@ -14558,9 +14568,9 @@ fold_relational_const (enum tree_code code, tree type, tree op0, tree op1)
return constant_boolean_node (result, type);
}
-/* Build an expression for the a clean point containing EXPR with type TYPE.
- Don't build a cleanup point expression for EXPR which don't have side
- effects. */
+/* If necessary, return a CLEANUP_POINT_EXPR for EXPR with the
+ indicated TYPE. If no CLEANUP_POINT_EXPR is necessary, return EXPR
+ itself. */
tree
fold_build_cleanup_point_expr (tree type, tree expr)
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index a3f52ef1b57..5b697d14c0c 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,57 @@
+2007-06-25 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/32464
+ * resolve.c (check_host_association): Return if the old symbol
+ is use associated. Introduce retval to reduce the number of
+ evaluations of the first-order return value.
+
+ PR fortran/31494
+ * match.c (gfc_match_call): If a host associated symbol is not
+ a subroutine, build a new symtree/symbol in the current name
+ space.
+
+2007-06-24 Tobias Burnus <burnus@net-de>
+
+ PR fortran/32460
+ * interface.c (gfc_compare_derived_types): Add access check.
+ * symbol.c (gfc_find_component): Ditto.
+ (gfc_set_component_attr,gfc_get_component_attr) Copy access state.
+ * dump-parse-tree.c (gfc_show_components): Dump access state.
+ * gfortran.h (struct gfc_component): Add gfc_access.
+ * module.c (mio_component): Add access state.
+ * (gfc_match_structure_constructor): Check for private access state.
+
+2007-06-24 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/32298
+ PR fortran/31726
+ * trans-intrinsic.c (gfc_conv_intrinsic_minmaxloc): Calculate
+ the offset between the loop counter and the position as
+ defined. Add the offset within the loop so that the mask acts
+ correctly. Do not advance the location on the basis that it
+ is zero.
+
+2007-06-22 Daniel Franke <franke.daniel@gmail.com>
+
+ PR fortran/31473
+ * symbol.c (gfc_copy_attr): Emit errors for duplicate
+ EXTERNAL/INTRINSIC statements.
+
+2007-06-22 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+ PR fortran/32360
+ * expr.c (gfc_check_assign): If the rvalue expression type is NULL_EXPR,
+ check to see if the lvalue has attribute pointer and data.
+
+2007-06-21 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+ PR fortran/31162
+ * resolve.c (gfc_resolve_iterator_expr): Add check for REAL using
+ gfc_notify_standard. (gfc_resolve_iterator): Remove check.
+ (resolve_branch): Change "Obsolete" to "Deleted feature".
+ * io.c (resolve_tag): Ditto.
+ * match.c (gfc_match_pause, gfc_match_assign, gfc_match_goto): Ditto.
+
2007-06-20 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/32361
diff --git a/gcc/fortran/dump-parse-tree.c b/gcc/fortran/dump-parse-tree.c
index 51af1c401f2..5d26a78af1b 100644
--- a/gcc/fortran/dump-parse-tree.c
+++ b/gcc/fortran/dump-parse-tree.c
@@ -624,6 +624,8 @@ gfc_show_components (gfc_symbol *sym)
gfc_status (" DIMENSION");
gfc_status_char (' ');
gfc_show_array_spec (c->as);
+ if (c->access)
+ gfc_status (" %s", gfc_code2string (access_types, c->access));
gfc_status (")");
if (c->next != NULL)
gfc_status_char (' ');
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c
index 00ed9a04d77..d3f0ddf5cce 100644
--- a/gcc/fortran/expr.c
+++ b/gcc/fortran/expr.c
@@ -2407,12 +2407,18 @@ gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform)
return FAILURE;
}
- if (rvalue->expr_type == EXPR_NULL)
- {
- gfc_error ("NULL appears on right-hand side in assignment at %L",
- &rvalue->where);
- return FAILURE;
- }
+ if (rvalue->expr_type == EXPR_NULL)
+ {
+ if (lvalue->symtree->n.sym->attr.pointer
+ && lvalue->symtree->n.sym->attr.data)
+ return SUCCESS;
+ else
+ {
+ gfc_error ("NULL appears on right-hand side in assignment at %L",
+ &rvalue->where);
+ return FAILURE;
+ }
+ }
if (sym->attr.cray_pointee
&& lvalue->ref != NULL
diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index aa4c03508d4..9a653ce29ac 100644
--- a/gcc/fortran/gfortran.h
+++ b/gcc/fortran/gfortran.h
@@ -743,6 +743,7 @@ typedef struct gfc_component
gfc_typespec ts;
int pointer, allocatable, dimension;
+ gfc_access access;
gfc_array_spec *as;
tree backend_decl;
diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c
index 591e46e0af2..da8696b81da 100644
--- a/gcc/fortran/interface.c
+++ b/gcc/fortran/interface.c
@@ -364,6 +364,9 @@ gfc_compare_derived_types (gfc_symbol *derived1, gfc_symbol *derived2)
if (strcmp (dt1->name, dt2->name) != 0)
return 0;
+ if (dt1->access != dt2->access)
+ return 0;
+
if (dt1->pointer != dt2->pointer)
return 0;
diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c
index 4d12b2416fb..aa299a3885a 100644
--- a/gcc/fortran/io.c
+++ b/gcc/fortran/io.c
@@ -1072,7 +1072,7 @@ resolve_tag (const io_tag *tag, gfc_expr *e)
}
else if (e->ts.type == BT_INTEGER && e->expr_type == EXPR_VARIABLE)
{
- if (gfc_notify_std (GFC_STD_F95_DEL, "Obsolete: ASSIGNED "
+ if (gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: ASSIGNED "
"variable in FORMAT tag at %L", &e->where)
== FAILURE)
return FAILURE;
diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c
index d1f5f41636b..ee376f5640e 100644
--- a/gcc/fortran/match.c
+++ b/gcc/fortran/match.c
@@ -1578,7 +1578,8 @@ gfc_match_pause (void)
m = gfc_match_stopcode (ST_PAUSE);
if (m == MATCH_YES)
{
- if (gfc_notify_std (GFC_STD_F95_DEL, "Obsolete: PAUSE statement at %C")
+ if (gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: PAUSE statement"
+ " at %C")
== FAILURE)
m = MATCH_ERROR;
}
@@ -1625,7 +1626,7 @@ gfc_match_assign (void)
return MATCH_ERROR;
if (gfc_match (" to %v%t", &expr) == MATCH_YES)
{
- if (gfc_notify_std (GFC_STD_F95_DEL, "Obsolete: ASSIGN "
+ if (gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: ASSIGN "
"statement at %C")
== FAILURE)
return MATCH_ERROR;
@@ -1671,7 +1672,7 @@ gfc_match_goto (void)
if (gfc_match_variable (&expr, 0) == MATCH_YES)
{
- if (gfc_notify_std (GFC_STD_F95_DEL, "Obsolete: Assigned GOTO "
+ if (gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: Assigned GOTO "
"statement at %C")
== FAILURE)
return MATCH_ERROR;
@@ -2169,13 +2170,20 @@ gfc_match_call (void)
return MATCH_ERROR;
sym = st->n.sym;
- gfc_set_sym_referenced (sym);
- if (!sym->attr.generic
- && !sym->attr.subroutine
- && gfc_add_subroutine (&sym->attr, sym->name, NULL) == FAILURE)
+ if (sym->ns != gfc_current_ns
+ && !sym->attr.generic
+ && !sym->attr.subroutine
+ && gfc_get_sym_tree (name, NULL, &st) == 1)
return MATCH_ERROR;
+ sym = st->n.sym;
+
+ if (gfc_add_subroutine (&sym->attr, sym->name, NULL) == FAILURE)
+ return MATCH_ERROR;
+
+ gfc_set_sym_referenced (sym);
+
if (gfc_match_eos () != MATCH_YES)
{
m = gfc_match_actual_arglist (1, &arglist);
diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c
index 876255f5849..14d26d9e432 100644
--- a/gcc/fortran/module.c
+++ b/gcc/fortran/module.c
@@ -2065,6 +2065,7 @@ mio_component (gfc_component *c)
mio_integer (&c->dimension);
mio_integer (&c->pointer);
mio_integer (&c->allocatable);
+ c->access = MIO_NAME (gfc_access) (c->access, access_types);
mio_expr (&c->initializer);
mio_rparen ();
diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c
index 90b1d6840e4..14253f6f1bd 100644
--- a/gcc/fortran/primary.c
+++ b/gcc/fortran/primary.c
@@ -1888,6 +1888,7 @@ gfc_match_structure_constructor (gfc_symbol *sym, gfc_expr **result)
gfc_expr *e;
locus where;
match m;
+ bool private_comp = false;
head = tail = NULL;
@@ -1900,6 +1901,11 @@ gfc_match_structure_constructor (gfc_symbol *sym, gfc_expr **result)
for (comp = sym->components; comp; comp = comp->next)
{
+ if (comp->access == ACCESS_PRIVATE)
+ {
+ private_comp = true;
+ break;
+ }
if (head == NULL)
tail = head = gfc_get_constructor ();
else
@@ -1928,6 +1934,14 @@ gfc_match_structure_constructor (gfc_symbol *sym, gfc_expr **result)
break;
}
+ if (sym->attr.use_assoc
+ && (sym->component_access == ACCESS_PRIVATE || private_comp))
+ {
+ gfc_error ("Structure constructor for '%s' at %C has PRIVATE "
+ "components", sym->name);
+ goto cleanup;
+ }
+
if (gfc_match_char (')') != MATCH_YES)
goto syntax;
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index cbf4f7cea29..bc6ba02d44a 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -3224,11 +3224,16 @@ check_host_association (gfc_expr *e)
locus temp_locus;
gfc_expr *expr;
int n;
+ bool retval = e->expr_type == EXPR_FUNCTION;
if (e->symtree == NULL || e->symtree->n.sym == NULL)
- return e->expr_type == EXPR_FUNCTION;
+ return retval;
old_sym = e->symtree->n.sym;
+
+ if (old_sym->attr.use_assoc)
+ return retval;
+
if (gfc_current_ns->parent
&& gfc_current_ns->parent->parent
&& old_sym->ns != gfc_current_ns)
@@ -3244,7 +3249,7 @@ check_host_association (gfc_expr *e)
gfc_free_ref_list (e->ref);
e->ref = NULL;
- if (e->expr_type == EXPR_FUNCTION)
+ if (retval)
{
gfc_free_actual_arglist (e->value.function.actual);
e->value.function.actual = NULL;
@@ -3271,7 +3276,7 @@ check_host_association (gfc_expr *e)
gfc_current_locus = temp_locus;
}
}
-
+ /* This might have changed! */
return e->expr_type == EXPR_FUNCTION;
}
@@ -3373,15 +3378,26 @@ gfc_resolve_iterator_expr (gfc_expr *expr, bool real_ok,
return FAILURE;
}
- if (!(expr->ts.type == BT_INTEGER
- || (expr->ts.type == BT_REAL && real_ok)))
+ if (expr->ts.type != BT_INTEGER)
{
- if (real_ok)
- gfc_error ("%s at %L must be INTEGER or REAL", _(name_msgid),
- &expr->where);
+ if (expr->ts.type == BT_REAL)
+ {
+ if (real_ok)
+ return gfc_notify_std (GFC_STD_F95_DEL,
+ "Deleted feature: %s at %L must be integer",
+ _(name_msgid), &expr->where);
+ else
+ {
+ gfc_error ("%s at %L must be INTEGER", _(name_msgid),
+ &expr->where);
+ return FAILURE;
+ }
+ }
else
- gfc_error ("%s at %L must be INTEGER", _(name_msgid), &expr->where);
- return FAILURE;
+ {
+ gfc_error ("%s at %L must be INTEGER", _(name_msgid), &expr->where);
+ return FAILURE;
+ }
}
return SUCCESS;
}
@@ -3393,11 +3409,6 @@ gfc_resolve_iterator_expr (gfc_expr *expr, bool real_ok,
try
gfc_resolve_iterator (gfc_iterator *iter, bool real_ok)
{
-
- if (iter->var->ts.type == BT_REAL)
- gfc_notify_std (GFC_STD_F95_DEL, "Obsolete: REAL DO loop iterator at %L",
- &iter->var->where);
-
if (gfc_resolve_iterator_expr (iter->var, real_ok, "Loop variable")
== FAILURE)
return FAILURE;
@@ -4572,7 +4583,7 @@ resolve_branch (gfc_st_label *label, gfc_code *code)
if (stack && stack->current->next->op == EXEC_NOP)
{
- gfc_notify_std (GFC_STD_F95_DEL, "Obsolete: GOTO at %L jumps to "
+ gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: GOTO at %L jumps to "
"END of construct at %L", &code->loc,
&stack->current->next->loc);
return; /* We know this is not an END DO. */
@@ -4586,7 +4597,7 @@ resolve_branch (gfc_st_label *label, gfc_code *code)
|| stack->current->op == EXEC_DO_WHILE)
&& stack->tail->here == label && stack->tail->op == EXEC_NOP)
{
- gfc_notify_std (GFC_STD_F95_DEL, "Obsolete: GOTO at %L jumps "
+ gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: GOTO at %L jumps "
"to END of construct at %L", &code->loc,
&stack->tail->loc);
return;
diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c
index 5215c3ec2a7..e1b27dc0fb7 100644
--- a/gcc/fortran/symbol.c
+++ b/gcc/fortran/symbol.c
@@ -1436,14 +1436,11 @@ gfc_copy_attr (symbol_attribute * dest, symbol_attribute * src, locus * where)
goto fail;
if (src->cray_pointee && gfc_add_cray_pointee (dest, where) == FAILURE)
goto fail;
-
- /* The subroutines that set these bits also cause flavors to be set,
- and that has already happened in the original, so don't let it
- happen again. */
- if (src->external)
- dest->external = 1;
- if (src->intrinsic)
- dest->intrinsic = 1;
+
+ if (src->external && gfc_add_external (dest, where) == FAILURE)
+ goto fail;
+ if (src->intrinsic && gfc_add_intrinsic (dest, where) == FAILURE)
+ goto fail;
return SUCCESS;
@@ -1618,7 +1615,8 @@ gfc_find_component (gfc_symbol *sym, const char *name)
name, sym->name);
else
{
- if (sym->attr.use_assoc && sym->component_access == ACCESS_PRIVATE)
+ if (sym->attr.use_assoc && (sym->component_access == ACCESS_PRIVATE
+ || p->access == ACCESS_PRIVATE))
{
gfc_error ("Component '%s' at %C is a PRIVATE component of '%s'",
name, sym->name);
@@ -1659,6 +1657,7 @@ gfc_set_component_attr (gfc_component *c, symbol_attribute *attr)
c->dimension = attr->dimension;
c->pointer = attr->pointer;
c->allocatable = attr->allocatable;
+ c->access = attr->access;
}
@@ -1673,6 +1672,7 @@ gfc_get_component_attr (symbol_attribute *attr, gfc_component *c)
attr->dimension = c->dimension;
attr->pointer = c->pointer;
attr->allocatable = c->allocatable;
+ attr->access = c->access;
}
diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c
index d1c371092fb..874b1081de6 100644
--- a/gcc/fortran/trans-intrinsic.c
+++ b/gcc/fortran/trans-intrinsic.c
@@ -1928,6 +1928,7 @@ gfc_conv_intrinsic_minmaxloc (gfc_se * se, gfc_expr * expr, int op)
tree tmp;
tree elsetmp;
tree ifbody;
+ tree offset;
gfc_loopinfo loop;
gfc_actual_arglist *actual;
gfc_ss *arrayss;
@@ -1947,6 +1948,7 @@ gfc_conv_intrinsic_minmaxloc (gfc_se * se, gfc_expr * expr, int op)
/* Initialize the result. */
pos = gfc_create_var (gfc_array_index_type, "pos");
+ offset = gfc_create_var (gfc_array_index_type, "offset");
type = gfc_typenode_for_spec (&expr->ts);
/* Walk the arguments. */
@@ -2045,15 +2047,28 @@ gfc_conv_intrinsic_minmaxloc (gfc_se * se, gfc_expr * expr, int op)
/* Assign the value to the limit... */
gfc_add_modify_expr (&ifblock, limit, arrayse.expr);
- /* Remember where we are. */
- gfc_add_modify_expr (&ifblock, pos, loop.loopvar[0]);
+ /* Remember where we are. An offset must be added to the loop
+ counter to obtain the required position. */
+ if (loop.temp_dim)
+ tmp = build_int_cst (gfc_array_index_type, 1);
+ else
+ tmp =fold_build2 (MINUS_EXPR, gfc_array_index_type,
+ gfc_index_one_node, loop.from[0]);
+ gfc_add_modify_expr (&block, offset, tmp);
+
+ tmp = build2 (PLUS_EXPR, TREE_TYPE (pos),
+ loop.loopvar[0], offset);
+ gfc_add_modify_expr (&ifblock, pos, tmp);
ifbody = gfc_finish_block (&ifblock);
- /* If it is a more extreme value or pos is still zero. */
+ /* If it is a more extreme value or pos is still zero and the value
+ equal to the limit. */
+ tmp = build2 (TRUTH_AND_EXPR, boolean_type_node,
+ build2 (EQ_EXPR, boolean_type_node, pos, gfc_index_zero_node),
+ build2 (EQ_EXPR, boolean_type_node, arrayse.expr, limit));
tmp = build2 (TRUTH_OR_EXPR, boolean_type_node,
- build2 (op, boolean_type_node, arrayse.expr, limit),
- build2 (EQ_EXPR, boolean_type_node, pos, gfc_index_zero_node));
+ build2 (op, boolean_type_node, arrayse.expr, limit), tmp);
tmp = build3_v (COND_EXPR, tmp, ifbody, build_empty_stmt ());
gfc_add_expr_to_block (&block, tmp);
@@ -2098,12 +2113,7 @@ gfc_conv_intrinsic_minmaxloc (gfc_se * se, gfc_expr * expr, int op)
}
gfc_cleanup_loop (&loop);
- /* Return a value in the range 1..SIZE(array). */
- tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type, loop.from[0],
- gfc_index_one_node);
- tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type, pos, tmp);
- /* And convert to the required type. */
- se->expr = convert (type, tmp);
+ se->expr = convert (type, pos);
}
static void
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 9e259613e81..ac94ba52608 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -117,6 +117,17 @@ static enum gimplify_status gimplify_compound_expr (tree *, tree *, bool);
static bool cpt_same_type (tree a, tree b);
#endif
+/* Mark X addressable. Unlike the langhook we expect X to be in gimple
+ form and we don't do any syntax checking. */
+static void
+mark_addressable (tree x)
+{
+ while (handled_component_p (x))
+ x = TREE_OPERAND (x, 0);
+ if (TREE_CODE (x) != VAR_DECL && TREE_CODE (x) != PARM_DECL)
+ return ;
+ TREE_ADDRESSABLE (x) = 1;
+}
/* Return a hash value for a formal temporary table entry. */
@@ -2047,7 +2058,7 @@ gimplify_arg (tree *expr_p, tree *pre_p)
static enum gimplify_status
gimplify_call_expr (tree *expr_p, tree *pre_p, bool want_value)
{
- tree decl;
+ tree decl, parms, p;
enum gimplify_status ret;
int i, nargs;
@@ -2113,6 +2124,48 @@ gimplify_call_expr (tree *expr_p, tree *pre_p, bool want_value)
nargs = call_expr_nargs (*expr_p);
+ /* Get argument types for verification. */
+ decl = get_callee_fndecl (*expr_p);
+ parms = NULL_TREE;
+ if (decl)
+ parms = TYPE_ARG_TYPES (TREE_TYPE (decl));
+ else if (POINTER_TYPE_P (TREE_TYPE (CALL_EXPR_FN (*expr_p))))
+ parms = TYPE_ARG_TYPES (TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (*expr_p))));
+
+ /* Verify if the type of the argument matches that of the function
+ declaration. If we cannot verify this or there is a mismatch,
+ mark the call expression so it doesn't get inlined later. */
+ if (parms)
+ {
+ for (i = 0, p = parms; i < nargs; i++, p = TREE_CHAIN (p))
+ if (!p
+ || TREE_VALUE (p) == error_mark_node
+ || CALL_EXPR_ARG (*expr_p, i) == error_mark_node
+ || !lang_hooks.types_compatible_p
+ (TREE_TYPE (CALL_EXPR_ARG (*expr_p, i)), TREE_VALUE (p)))
+ {
+ CALL_CANNOT_INLINE_P (*expr_p) = 1;
+ break;
+ }
+ }
+ else if (decl && DECL_ARGUMENTS (decl))
+ {
+ for (i = 0, p = DECL_ARGUMENTS (decl); i < nargs;
+ i++, p = TREE_CHAIN (p))
+ if (!p
+ || p == error_mark_node
+ || CALL_EXPR_ARG (*expr_p, i) == error_mark_node
+ || !lang_hooks.types_compatible_p
+ (TREE_TYPE (CALL_EXPR_ARG (*expr_p, i)), TREE_TYPE (p)))
+ {
+ CALL_CANNOT_INLINE_P (*expr_p) = 1;
+ break;
+ }
+ }
+ else if (nargs != 0)
+ CALL_CANNOT_INLINE_P (*expr_p) = 1;
+
+ /* Finally, gimplify the function arguments. */
for (i = (PUSH_ARGS_REVERSED ? nargs - 1 : 0);
PUSH_ARGS_REVERSED ? i >= 0 : i < nargs;
PUSH_ARGS_REVERSED ? i-- : i++)
@@ -3434,7 +3487,7 @@ gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p, tree *pre_p,
if (use_target)
{
CALL_EXPR_RETURN_SLOT_OPT (*from_p) = 1;
- lang_hooks.mark_addressable (*to_p);
+ mark_addressable (*to_p);
}
}
@@ -3957,6 +4010,8 @@ gimplify_addr_expr (tree *expr_p, tree *pre_p, tree *post_p)
the address of a call that returns a struct; see
gcc.dg/c99-array-lval-1.c. The gimplifier will correctly make
the implied temporary explicit. */
+
+ /* Mark the RHS addressable. */
ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, post_p,
is_gimple_addressable, fb_either);
if (ret != GS_ERROR)
@@ -3972,8 +4027,7 @@ gimplify_addr_expr (tree *expr_p, tree *pre_p, tree *post_p)
is set properly. */
recompute_tree_invariant_for_addr_expr (expr);
- /* Mark the RHS addressable. */
- lang_hooks.mark_addressable (TREE_OPERAND (expr, 0));
+ mark_addressable (TREE_OPERAND (expr, 0));
}
break;
}
@@ -4011,7 +4065,7 @@ gimplify_asm_expr (tree *expr_p, tree *pre_p, tree *post_p)
&allows_mem, &allows_reg, &is_inout);
if (!allows_reg && allows_mem)
- lang_hooks.mark_addressable (TREE_VALUE (link));
+ mark_addressable (TREE_VALUE (link));
tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
is_inout ? is_gimple_min_lval : is_gimple_lvalue,
@@ -4140,7 +4194,7 @@ gimplify_asm_expr (tree *expr_p, tree *pre_p, tree *post_p)
{
tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
is_gimple_lvalue, fb_lvalue | fb_mayfail);
- lang_hooks.mark_addressable (TREE_VALUE (link));
+ mark_addressable (TREE_VALUE (link));
if (tret == GS_ERROR)
{
error ("memory input %d is not directly addressable", i);
@@ -5563,7 +5617,7 @@ gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p,
if (fallback == fb_lvalue)
{
*expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
- lang_hooks.mark_addressable (*expr_p);
+ mark_addressable (*expr_p);
}
break;
@@ -5576,7 +5630,7 @@ gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p,
if (fallback == fb_lvalue)
{
*expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
- lang_hooks.mark_addressable (*expr_p);
+ mark_addressable (*expr_p);
}
break;
@@ -5765,7 +5819,7 @@ gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p,
else if (fallback == fb_lvalue)
{
*expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
- lang_hooks.mark_addressable (*expr_p);
+ mark_addressable (*expr_p);
}
else
ret = GS_ALL_DONE;
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c
index ee9d7e6ca00..c682f86866f 100644
--- a/gcc/ipa-inline.c
+++ b/gcc/ipa-inline.c
@@ -288,22 +288,21 @@ cgraph_mark_inline (struct cgraph_edge *edge)
struct cgraph_node *to = edge->caller;
struct cgraph_node *what = edge->callee;
struct cgraph_edge *e, *next;
- int times = 0;
/* Look for all calls, mark them inline and clone recursively
all inlined functions. */
for (e = what->callers; e; e = next)
{
next = e->next_caller;
- if (e->caller == to && e->inline_failed)
+ if (e->caller == to && e->inline_failed
+ && !CALL_CANNOT_INLINE_P (e->call_stmt))
{
cgraph_mark_inline_edge (e, true);
if (e == edge)
edge = next;
- times++;
}
}
- gcc_assert (times);
+
return edge;
}
@@ -885,7 +884,7 @@ cgraph_decide_inlining_of_small_functions (void)
}
gcc_assert (edge->aux);
edge->aux = NULL;
- if (!edge->inline_failed)
+ if (!edge->inline_failed || CALL_CANNOT_INLINE_P (edge->call_stmt))
continue;
/* When not having profile info ready we don't weight by any way the
@@ -1076,7 +1075,7 @@ cgraph_decide_inlining (void)
for (e = node->callers; e; e = next)
{
next = e->next_caller;
- if (!e->inline_failed)
+ if (!e->inline_failed || CALL_CANNOT_INLINE_P (e->call_stmt))
continue;
if (cgraph_recursive_inlining_p (e->caller, e->callee,
&e->inline_failed))
diff --git a/gcc/langhooks-def.h b/gcc/langhooks-def.h
index 28b35bb89b1..6ca6e2f40de 100644
--- a/gcc/langhooks-def.h
+++ b/gcc/langhooks-def.h
@@ -73,7 +73,6 @@ extern tree lhd_tree_inlining_walk_subtrees (tree *, int *, walk_tree_fn,
extern int lhd_tree_inlining_cannot_inline_tree_fn (tree *);
extern int lhd_tree_inlining_disregard_inline_limits (tree);
extern int lhd_tree_inlining_auto_var_in_fn_p (tree, tree);
-extern tree lhd_tree_inlining_convert_parm_for_inlining (tree, tree, tree, int);
extern void lhd_initialize_diagnostics (struct diagnostic_context *);
extern tree lhd_callgraph_analyze_expr (tree *, int *, tree);
@@ -145,8 +144,6 @@ extern void lhd_omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *,
lhd_tree_inlining_auto_var_in_fn_p
#define LANG_HOOKS_TREE_INLINING_VAR_MOD_TYPE_P \
hook_bool_tree_tree_false
-#define LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING \
- lhd_tree_inlining_convert_parm_for_inlining
#define LANG_HOOKS_TREE_INLINING_INITIALIZER { \
LANG_HOOKS_TREE_INLINING_WALK_SUBTREES, \
@@ -154,7 +151,6 @@ extern void lhd_omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *,
LANG_HOOKS_TREE_INLINING_DISREGARD_INLINE_LIMITS, \
LANG_HOOKS_TREE_INLINING_AUTO_VAR_IN_FN_P, \
LANG_HOOKS_TREE_INLINING_VAR_MOD_TYPE_P, \
- LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING \
}
#define LANG_HOOKS_CALLGRAPH_ANALYZE_EXPR lhd_callgraph_analyze_expr
diff --git a/gcc/langhooks.c b/gcc/langhooks.c
index 5d4d63c7066..85ce93524bf 100644
--- a/gcc/langhooks.c
+++ b/gcc/langhooks.c
@@ -330,18 +330,6 @@ lhd_tree_inlining_auto_var_in_fn_p (tree var, tree fn)
|| TREE_CODE (var) == RESULT_DECL));
}
-/* lang_hooks.tree_inlining.convert_parm_for_inlining performs any
- language-specific conversion before assigning VALUE to PARM. */
-
-tree
-lhd_tree_inlining_convert_parm_for_inlining (tree parm ATTRIBUTE_UNUSED,
- tree value,
- tree fndecl ATTRIBUTE_UNUSED,
- int argnum ATTRIBUTE_UNUSED)
-{
- return value;
-}
-
/* lang_hooks.tree_dump.dump_tree: Dump language-specific parts of tree
nodes. Returns nonzero if it does not want the usual dumping of the
second argument. */
diff --git a/gcc/langhooks.h b/gcc/langhooks.h
index e48c0bca81c..1af85b348ea 100644
--- a/gcc/langhooks.h
+++ b/gcc/langhooks.h
@@ -42,7 +42,6 @@ struct lang_hooks_for_tree_inlining
int (*disregard_inline_limits) (tree);
int (*auto_var_in_fn_p) (tree, tree);
bool (*var_mod_type_p) (tree, tree);
- tree (*convert_parm_for_inlining) (tree, tree, tree, int);
};
struct lang_hooks_for_callgraph
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 298ce3fa77f..c5c45270eb1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,83 @@
+2007-06-25 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/32464
+ * gfortran.dg/host_assoc_function_2.f90: New test.
+
+ PR fortran/31494
+ * gfortran.dg/host_assoc_call_1.f90: New test.
+
+2007-06-24 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+ * gfortran.dg/secnds-1.f: Revise test to reduce random errors.
+
+2007-06-24 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+ PR fortran/32456
+ * gfortran.dg/error_format.f90: New test.
+
+2007-06-24 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/32136
+ * gfortran.dg/pr32136.f90: New test.
+
+2007-06-24 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/31726
+ * gfortran.dg/minmaxloc_1.f90: New test.
+
+ PR fortran/32298
+ * gfortran.dg/minmaxloc_2.f90: New test.
+
+2007-06-23 Mark Mitchell <mark@codesourcery.com>
+
+ * gcc.dg/visibility-12.c: New test.
+ * gcc.dg/visibility-13.c: Likewise.
+ * g++.dg/ext/visibility-9.C: Likewise.
+ * g++.dg/ext/visibility-10.C: Likewise.
+
+2007-06-23 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/16876
+ PR middle-end/29478
+ * gcc.dg/pr29254.c: The warning is bogus.
+ * gcc.dg/warn-1.c: Likewise.
+ * gcc.dg/assign-warn-3.c: Likewise.
+ * gcc.dg/noncompile/pr16876.c: The testcase is bogus, remove.
+
+2007-06-23 Richard Earnshaw <rearnsha@arm.com>
+
+ * gcc.c-torture/execute/20070623-1.c: New.
+
+2007-06-22 Jan Hubicka <jh@suse.cz>
+
+ * gcc.c-torture/compile/pr31541.c: New.
+
+2007-06-22 Uros Bizjak <ubizjak@gmail.com>
+
+ * gcc.target/i386/large-size-array-3.c: Fix dg-do compile directive.
+ Remove -m64 from dg-options.
+
+2007-06-22 Uros Bizjak <ubizjak@gmail.com>
+
+ PR middle-end/32374
+ * gcc.dg/pr32374.c: New test.
+
+2007-06-22 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+ PR fortran/32360
+ * gfortran.dg/pointer_assign_3.f90: New test.
+
+2007-06-21 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+ PR fortran/31162
+ * gfortran.dg/assign.f90: Update test.
+ * gfortran.dg/real_do_1.f90: Update test.
+ * gfortran.dg/gomp/omp_do1.f90: Update test.
+ * gfortran.dg/warnings_are_errors_1.f: Update test.
+ * gfortran.dg/g77/20010519-1.f: Update test.
+ * gfortran.dg/g77/pr9258.f: Update test.
+ * gfortran.dg/g77/960317-1.f: Update test.
+
2007-06-22 Chao-ying Fu <fu@mips.com>
* gcc.dg/fixed-point/struct-union.c: Remove spaces.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr31541.c b/gcc/testsuite/gcc.c-torture/compile/pr31541.c
new file mode 100644
index 00000000000..0cac26ed092
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr31541.c
@@ -0,0 +1,9 @@
+typedef unsigned char Uchar;
+struct scsi_mode_header {
+ unsigned char sense_data_len : 8;
+};
+int f(void)
+{
+ struct scsi_mode_header md;
+return *(Uchar*)&md;
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/20070623-1.c b/gcc/testsuite/gcc.c-torture/execute/20070623-1.c
new file mode 100644
index 00000000000..e9c7d2a952d
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/20070623-1.c
@@ -0,0 +1,41 @@
+#include <limits.h>
+
+int __attribute__((noinline)) nge(int a, int b) {return -(a >= b);}
+int __attribute__((noinline)) ngt(int a, int b) {return -(a > b);}
+int __attribute__((noinline)) nle(int a, int b) {return -(a <= b);}
+int __attribute__((noinline)) nlt(int a, int b) {return -(a < b);}
+int __attribute__((noinline)) neq(int a, int b) {return -(a == b);}
+int __attribute__((noinline)) nne(int a, int b) {return -(a != b);}
+int __attribute__((noinline)) ngeu(unsigned a, unsigned b) {return -(a >= b);}
+int __attribute__((noinline)) ngtu(unsigned a, unsigned b) {return -(a > b);}
+int __attribute__((noinline)) nleu(unsigned a, unsigned b) {return -(a <= b);}
+int __attribute__((noinline)) nltu(unsigned a, unsigned b) {return -(a < b);}
+
+
+int main()
+{
+ if (nge(INT_MIN, INT_MAX) != 0) abort();
+ if (nge(INT_MAX, INT_MIN) != -1) abort();
+ if (ngt(INT_MIN, INT_MAX) != 0) abort();
+ if (ngt(INT_MAX, INT_MIN) != -1) abort();
+ if (nle(INT_MIN, INT_MAX) != -1) abort();
+ if (nle(INT_MAX, INT_MIN) != 0) abort();
+ if (nlt(INT_MIN, INT_MAX) != -1) abort();
+ if (nlt(INT_MAX, INT_MIN) != 0) abort();
+
+ if (neq(INT_MIN, INT_MAX) != 0) abort();
+ if (neq(INT_MAX, INT_MIN) != 0) abort();
+ if (nne(INT_MIN, INT_MAX) != -1) abort();
+ if (nne(INT_MAX, INT_MIN) != -1) abort();
+
+ if (ngeu(0, ~0U) != 0) abort();
+ if (ngeu(~0U, 0) != -1) abort();
+ if (ngtu(0, ~0U) != 0) abort();
+ if (ngtu(~0U, 0) != -1) abort();
+ if (nleu(0, ~0U) != -1) abort();
+ if (nleu(~0U, 0) != 0) abort();
+ if (nltu(0, ~0U) != -1) abort();
+ if (nltu(~0U, 0) != 0) abort();
+
+ exit(0);
+}
diff --git a/gcc/testsuite/gcc.dg/assign-warn-3.c b/gcc/testsuite/gcc.dg/assign-warn-3.c
index 1463fce0f68..86d1b3028f2 100644
--- a/gcc/testsuite/gcc.dg/assign-warn-3.c
+++ b/gcc/testsuite/gcc.dg/assign-warn-3.c
@@ -6,8 +6,8 @@
/* This is valid to execute, so maybe shouldn't warn at all. */
void f0(x) signed char *x; { }
-void g0(unsigned char *x) { f0(x); } /* { dg-warning "warning: pointer targets in passing argument 1 of 'f0' differ in signedness" } */
+void g0(unsigned char *x) { f0(x); } /* { dg-bogus "warning: pointer targets in passing argument 1 of 'f0' differ in signedness" } */
/* This is undefined on execution but still must compile. */
void f1(x) int *x; { }
-void g1(unsigned int *x) { f1(x); } /* { dg-warning "warning: pointer targets in passing argument 1 of 'f1' differ in signedness" } */
+void g1(unsigned int *x) { f1(x); } /* { dg-bogus "warning: pointer targets in passing argument 1 of 'f1' differ in signedness" } */
diff --git a/gcc/testsuite/gcc.dg/noncompile/pr16876.c b/gcc/testsuite/gcc.dg/noncompile/pr16876.c
deleted file mode 100644
index 9587849b2fc..00000000000
--- a/gcc/testsuite/gcc.dg/noncompile/pr16876.c
+++ /dev/null
@@ -1,15 +0,0 @@
-/* { dg-options "-O -finline-functions" } */
-
-static void g();
-struct bigstack {
- char space[4096];
-};
-
-
-void f() {
- g(0); /* { dg-error "incompatible type for argument 1 of 'g'" } */
-}
-
-static void g(struct bigstack bstack) {
- g(bstack);
-}
diff --git a/gcc/testsuite/gcc.dg/pr29254.c b/gcc/testsuite/gcc.dg/pr29254.c
index 98846a92090..598b6bf7b11 100644
--- a/gcc/testsuite/gcc.dg/pr29254.c
+++ b/gcc/testsuite/gcc.dg/pr29254.c
@@ -1,6 +1,5 @@
/* { dg-do compile } */
/* { dg-options "-O3 -Werror" } */
-/* { dg-message "warnings being treated as errors" "" {target "*-*-*"} 0 } */
list_compare (int * list1)
{
@@ -18,5 +17,5 @@ value_compare (int * a)
func2 (const int * fb)
{
- func1 ((int *) fb); /* { dg-error "discards qualifiers" } */
+ func1 ((int *) fb); /* { dg-bogus "discards qualifiers" } */
}
diff --git a/gcc/testsuite/gcc.dg/pr32374.c b/gcc/testsuite/gcc.dg/pr32374.c
new file mode 100644
index 00000000000..de15d559f5b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr32374.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+extern int *stderr;
+
+void f (int *, const char *, ...);
+
+void g (const char *conf_name)
+{
+ typedef struct
+ {
+ const char *label;
+ const int value;
+ } Section;
+
+ const Section sections[2] = { {"", 0}, {"", 1} };
+
+ f (stderr, "", "", conf_name, 0, sections[0]);
+ f (stderr, "", "", conf_name, 0, sections[0]);
+}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr32461-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr32461-1.c
new file mode 100644
index 00000000000..6e069886d1a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr32461-1.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+typedef struct
+{
+ unsigned exp[256];
+}
+expbap_t;
+
+void
+a52_bit_allocate (expbap_t * expbap)
+{
+ int i;
+ unsigned *exp = expbap->exp;
+ char *bap;
+
+ while (i < 3 || exp[i] > exp[i - 1]);
+
+ do {
+ if (exp[i + 1] == exp[i])
+ bap[i] = 0;
+ i++;
+ } while (i < 20);
+}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr32461-2.c b/gcc/testsuite/gcc.dg/tree-ssa/pr32461-2.c
new file mode 100644
index 00000000000..81ee6ae953e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr32461-2.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+typedef struct
+{
+ unsigned char exp[256];
+}
+expbap_t;
+
+void
+a52_bit_allocate (expbap_t * expbap)
+{
+ int i;
+ unsigned char *exp = expbap->exp;
+ int lowcomp;
+
+ do
+ {
+ if (exp[i + 1] == exp[i] - 2)
+ lowcomp = 384;
+ else if (lowcomp && (exp[i + 1] > exp[i]))
+ lowcomp -= 64;
+ i++;
+ }
+ while ((i < 3) || ((i < 7) && (exp[i] > exp[i - 1])));
+}
diff --git a/gcc/testsuite/gcc.dg/warn-1.c b/gcc/testsuite/gcc.dg/warn-1.c
index dc2cd0e7c71..6db4ae5cd6c 100644
--- a/gcc/testsuite/gcc.dg/warn-1.c
+++ b/gcc/testsuite/gcc.dg/warn-1.c
@@ -12,5 +12,5 @@ void bar (void)
{
void *vp;
- foo (vp); /* { dg-warning "passing argument 1 of" } */
+ foo (vp); /* { dg-bogus "passing argument 1 of" } */
}
diff --git a/gcc/testsuite/gcc.target/i386/large-size-array-3.c b/gcc/testsuite/gcc.target/i386/large-size-array-3.c
index 2eac19cf1a7..3d321afa2c7 100644
--- a/gcc/testsuite/gcc.target/i386/large-size-array-3.c
+++ b/gcc/testsuite/gcc.target/i386/large-size-array-3.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target { { i?86-*-linux* x86_64-*-linux* } || { i?86-*-* x86_64-*-darwin* } } } } */
-/* { dg-options "-m64 -mcmodel=medium" } */
+/* { dg-do compile { target { { i?86-*-* x86_64-*-* } && lp64 } } } */
+/* { dg-options "-mcmodel=medium" } */
/* { dg-final { scan-assembler "8589934592|8589934588" } } */
int bigarray[2147483647];
diff --git a/gcc/testsuite/gfortran.dg/assign.f90 b/gcc/testsuite/gfortran.dg/assign.f90
index 516a3d7632a..2d9e497fbe9 100644
--- a/gcc/testsuite/gfortran.dg/assign.f90
+++ b/gcc/testsuite/gfortran.dg/assign.f90
@@ -3,6 +3,6 @@
program test
integer i
common i
- assign 2000 to i ! { dg-warning "Obsolete: ASSIGN statement" }
+ assign 2000 to i ! { dg-warning "Deleted feature: ASSIGN statement" }
2000 continue
end
diff --git a/gcc/testsuite/gfortran.dg/error_format.f90 b/gcc/testsuite/gfortran.dg/error_format.f90
new file mode 100644
index 00000000000..227a3e0c8fa
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/error_format.f90
@@ -0,0 +1,11 @@
+! { dg-do run }
+! { dg-shouldfail "Runtime error format check" }
+! PR32456 IO error message should show Unit/Filename
+program test
+ implicit none
+ integer :: i
+ open(99, status="scratch")
+ read(99,*) i
+end program
+! { dg-output ".*(unit = 99, file = .*)" }
+! { dg-output "Fortran runtime error: End of file" }
diff --git a/gcc/testsuite/gfortran.dg/fmt_huge.f90 b/gcc/testsuite/gfortran.dg/fmt_huge.f90
new file mode 100644
index 00000000000..43c4e2ac273
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/fmt_huge.f90
@@ -0,0 +1,6 @@
+! { dg-do run }
+! PR32446 printing big numbers in F0.1 format.
+! This segfaulted before the patch.
+ open (10, status="scratch")
+ write (10,'(F0.1)') huge(1.0)
+ END
diff --git a/gcc/testsuite/gfortran.dg/g77/20010519-1.f b/gcc/testsuite/gfortran.dg/g77/20010519-1.f
index e9336f1b6ab..beead98c7b9 100644
--- a/gcc/testsuite/gfortran.dg/g77/20010519-1.f
+++ b/gcc/testsuite/gfortran.dg/g77/20010519-1.f
@@ -711,19 +711,19 @@ C Begin
1 'NFREG IS LARGER THAN PARDIM*3')
C
C ALLOCATE-SPACE-FOR-TRANSROT-VECTORS
- ASSIGN 801 TO I800 ! { dg-warning "Obsolete: ASSIGN" "Obsolete: ASSIGN" }
+ ASSIGN 801 TO I800 ! { dg-warning "Deleted feature: ASSIGN" "Deleted feature: ASSIGN" }
GOTO 800
801 CONTINUE
C ALLOCATE-SPACE-FOR-DIAGONALIZATION
- ASSIGN 721 TO I720 ! { dg-warning "Obsolete: ASSIGN" "Obsolete: ASSIGN" }
+ ASSIGN 721 TO I720 ! { dg-warning "Deleted feature: ASSIGN" "Deleted feature: ASSIGN" }
GOTO 720
721 CONTINUE
C ALLOCATE-SPACE-FOR-REDUCED-BASIS
- ASSIGN 761 TO I760 ! { dg-warning "Obsolete: ASSIGN" "Obsolete: ASSIGN" }
+ ASSIGN 761 TO I760 ! { dg-warning "Deleted feature: ASSIGN" "Deleted feature: ASSIGN" }
GOTO 760
761 CONTINUE
C ALLOCATE-SPACE-FOR-OTHER-ARRAYS
- ASSIGN 921 TO I920 ! { dg-warning "Obsolete: ASSIGN" "Obsolete: ASSIGN" }
+ ASSIGN 921 TO I920 ! { dg-warning "Deleted feature: ASSIGN" "Deleted feature: ASSIGN" }
GOTO 920
921 CONTINUE
C
@@ -731,12 +731,12 @@ C Space allocation for working arrays of EISPACK
C diagonalization subroutines
IF(LSCI) THEN
C ALLOCATE-SPACE-FOR-LSCI
- ASSIGN 841 TO I840 ! { dg-warning "Obsolete: ASSIGN" "Obsolete: ASSIGN" }
+ ASSIGN 841 TO I840 ! { dg-warning "Deleted feature: ASSIGN" "Deleted feature: ASSIGN" }
GOTO 840
841 CONTINUE
ELSE
C ALLOCATE-DUMMY-SPACE-FOR-LSCI
- ASSIGN 881 TO I880 ! { dg-warning "Obsolete: ASSIGN" "Obsolete: ASSIGN" }
+ ASSIGN 881 TO I880 ! { dg-warning "Deleted feature: ASSIGN" "Deleted feature: ASSIGN" }
GOTO 880
881 CONTINUE
ENDIF
@@ -878,11 +878,11 @@ C
C
C DO-THE-DIAGONALISATIONS-WITH-RESIDUALS
C
- ASSIGN 621 TO I620 ! { dg-warning "Obsolete: ASSIGN" "Obsolete: ASSIGN" }
+ ASSIGN 621 TO I620 ! { dg-warning "Deleted feature: ASSIGN" "Deleted feature: ASSIGN" }
GOTO 620
621 CONTINUE
C SAVE-MODES
- ASSIGN 701 TO I700 ! { dg-warning "Obsolete: ASSIGN" "Obsolete: ASSIGN" }
+ ASSIGN 701 TO I700 ! { dg-warning "Deleted feature: ASSIGN" "Deleted feature: ASSIGN" }
GOTO 700
701 CONTINUE
IF(ITER.EQ.ITMX) THEN
@@ -1025,17 +1025,17 @@ C
CALL PARTDS(NAT3,NPARC,ATMPAR,NPARS,ATMPAS,INIDS,NPARMX,
1 DDF,NFREG,CUTF1,PARDIM,NFCUT1)
C DO-THE-DIAGONALISATIONS
- ASSIGN 641 to I640 ! { dg-warning "Obsolete: ASSIGN" "Obsolete: ASSIGN" }
+ ASSIGN 641 to I640 ! { dg-warning "Deleted feature: ASSIGN" "Deleted feature: ASSIGN" }
GOTO 640
641 CONTINUE
QDIAG=.FALSE.
C DO-THE-DIAGONALISATIONS-WITH-RESIDUALS
- ASSIGN 622 TO I620 ! { dg-warning "Obsolete: ASSIGN" "Obsolete: ASSIGN" }
+ ASSIGN 622 TO I620 ! { dg-warning "Deleted feature: ASSIGN" "Deleted feature: ASSIGN" }
GOTO 620
622 CONTINUE
QDIAG=.TRUE.
C SAVE-MODES
- ASSIGN 702 TO I700 ! { dg-warning "Obsolete: ASSIGN" "Obsolete: ASSIGN" }
+ ASSIGN 702 TO I700 ! { dg-warning "Deleted feature: ASSIGN" "Deleted feature: ASSIGN" }
GOTO 700
702 CONTINUE
C
@@ -1048,7 +1048,7 @@ C
ITER=ITER+1
IF(PRNLEV.GE.2) WRITE(OUTU,553) ITER
C DO-THE-DWIN-DIAGONALISATIONS
- ASSIGN 661 TO I660 ! { dg-warning "Obsolete: ASSIGN" "Obsolete: ASSIGN" }
+ ASSIGN 661 TO I660 ! { dg-warning "Deleted feature: ASSIGN" "Deleted feature: ASSIGN" }
GOTO 660
661 CONTINUE
ENDIF
@@ -1056,13 +1056,13 @@ C DO-THE-DWIN-DIAGONALISATIONS
IRESF=0
QDIAG=.FALSE.
C DO-THE-DIAGONALISATIONS-WITH-RESIDUALS
- ASSIGN 623 TO I620 ! { dg-warning "Obsolete: ASSIGN" "Obsolete: ASSIGN" }
+ ASSIGN 623 TO I620 ! { dg-warning "Deleted feature: ASSIGN" "Deleted feature: ASSIGN" }
GOTO 620
623 CONTINUE
QDIAG=.TRUE.
IF((CVGMX.LE.TOLDIM).OR.(ITER.EQ.ITMX)) GOTO 600
C SAVE-MODES
- ASSIGN 703 TO I700 ! { dg-warning "Obsolete: ASSIGN" "Obsolete: ASSIGN" }
+ ASSIGN 703 TO I700 ! { dg-warning "Deleted feature: ASSIGN" "Deleted feature: ASSIGN" }
GOTO 700
703 CONTINUE
ENDIF
@@ -1072,7 +1072,7 @@ C SAVE-MODES
600 CONTINUE
C
C SAVE-MODES
- ASSIGN 704 TO I700 ! { dg-warning "Obsolete: ASSIGN" "Obsolete: ASSIGN" }
+ ASSIGN 704 TO I700 ! { dg-warning "Deleted feature: ASSIGN" "Deleted feature: ASSIGN" }
GOTO 700
704 CONTINUE
CALL CLEANHP(NAT3,NFREG,NPARD,NSUBP,PARDIM,DDV2,DDSS,DDVBAS,
@@ -1150,7 +1150,7 @@ C
6 HEAP(BDRATQ),HEAP(INRATQ),LSCI,LBIG,IUNMOD)
CALL SELNMD(DDF,NFRET,CUTF1,NFCUT1)
ENDIF
- GOTO I620 ! { dg-warning "Obsolete: Assigned" "Assigned GO TO" }
+ GOTO I620 ! { dg-warning "Deleted feature: Assigned" "Assigned GO TO" }
C
C-----------------------------------------------------------------------
C TO DO-THE-DIAGONALISATIONS
@@ -1190,7 +1190,7 @@ C TO DO-THE-DIAGONALISATIONS
NFCUT1=NFCUT
NFRET=NFCUT
ENDDO
- GOTO I640 ! { dg-warning "Obsolete: Assigned" "Assigned GO TO" }
+ GOTO I640 ! { dg-warning "Deleted feature: Assigned" "Assigned GO TO" }
C
C-----------------------------------------------------------------------
C TO DO-THE-DWIN-DIAGONALISATIONS
@@ -1241,7 +1241,7 @@ C
IF(NFCUT.GT.NFRRES) NFCUT=NFRRES
NFCUT1=NFCUT
NFRET=NFCUT
- GOTO I660 ! { dg-warning "Obsolete: Assigned" "Assigned GO TO" }
+ GOTO I660 ! { dg-warning "Deleted feature: Assigned" "Assigned GO TO" }
C
C-----------------------------------------------------------------------
C TO SAVE-MODES
@@ -1258,7 +1258,7 @@ C TO SAVE-MODES
CALL WRTNMD(LCARD,ISTRT,ISTOP,NAT3,DDV,DDSCR,DDEV,IUNMOD,
1 AMASS)
CALL SAVEIT(IUNMOD)
- GOTO I700 ! { dg-warning "Obsolete: Assigned" "Assigned GO TO" }
+ GOTO I700 ! { dg-warning "Deleted feature: Assigned" "Assigned GO TO" }
C
C-----------------------------------------------------------------------
C TO ALLOCATE-SPACE-FOR-DIAGONALIZATION
@@ -1269,7 +1269,7 @@ C TO ALLOCATE-SPACE-FOR-DIAGONALIZATION
JSPACE=JSPACE+JSP
DDSS=ALLHP(JSPACE)
DD5=DDSS+JSPACE-JSP
- GOTO I720 ! { dg-warning "Obsolete: Assigned" "Assigned GO TO" }
+ GOTO I720 ! { dg-warning "Deleted feature: Assigned" "Assigned GO TO" }
C
C-----------------------------------------------------------------------
C TO ALLOCATE-SPACE-FOR-REDUCED-BASIS
@@ -1279,13 +1279,13 @@ C TO ALLOCATE-SPACE-FOR-REDUCED-BASIS
ELSE
DDVBAS=ALLHP(IREAL8(NFREG*NAT3))
ENDIF
- GOTO I760 ! { dg-warning "Obsolete: Assigned" "Assigned GO TO" }
+ GOTO I760 ! { dg-warning "Deleted feature: Assigned" "Assigned GO TO" }
C
C-----------------------------------------------------------------------
C TO ALLOCATE-SPACE-FOR-TRANSROT-VECTORS
800 CONTINUE
TRAROT=ALLHP(IREAL8(6*NAT3))
- GOTO I800 ! { dg-warning "Obsolete: Assigned" "Assigned GO TO" }
+ GOTO I800 ! { dg-warning "Deleted feature: Assigned" "Assigned GO TO" }
C
C-----------------------------------------------------------------------
C TO ALLOCATE-SPACE-FOR-LSCI
@@ -1300,7 +1300,7 @@ C TO ALLOCATE-SPACE-FOR-LSCI
E2RATQ=ALLHP(IREAL8(PARDIM+3))
BDRATQ=ALLHP(IREAL8(PARDIM+3))
INRATQ=ALLHP(INTEG4(PARDIM+3))
- GOTO I840 ! { dg-warning "Obsolete: Assigned" "Assigned GO TO" }
+ GOTO I840 ! { dg-warning "Deleted feature: Assigned" "Assigned GO TO" }
C
C-----------------------------------------------------------------------
C TO ALLOCATE-DUMMY-SPACE-FOR-LSCI
@@ -1315,13 +1315,13 @@ C TO ALLOCATE-DUMMY-SPACE-FOR-LSCI
E2RATQ=ALLHP(IREAL8(2))
BDRATQ=ALLHP(IREAL8(2))
INRATQ=ALLHP(INTEG4(2))
- GOTO I880 ! { dg-warning "Obsolete: Assigned" "Assigned GO TO" }
+ GOTO I880 ! { dg-warning "Deleted feature: Assigned" "Assigned GO TO" }
C
C-----------------------------------------------------------------------
C TO ALLOCATE-SPACE-FOR-OTHER-ARRAYS
920 CONTINUE
IUPD=ALLHP(INTEG4(PARDIM+3))
- GOTO I920 ! { dg-warning "Obsolete: Assigned" "Assigned GO TO" }
+ GOTO I920 ! { dg-warning "Deleted feature: Assigned" "Assigned GO TO" }
C.##ELSE
C.##ENDIF
END
diff --git a/gcc/testsuite/gfortran.dg/g77/960317-1.f b/gcc/testsuite/gfortran.dg/g77/960317-1.f
index f9a3ef2ce7a..c8b3b69baeb 100644
--- a/gcc/testsuite/gfortran.dg/g77/960317-1.f
+++ b/gcc/testsuite/gfortran.dg/g77/960317-1.f
@@ -14,7 +14,7 @@ C
SUBROUTINE QUICK
SAVE
C
- ASSIGN 101 TO JUMP ! { dg-warning "Obsolete: ASSIGN" "" }
+ ASSIGN 101 TO JUMP ! { dg-warning "Deleted feature: ASSIGN" "" }
101 Continue
C
RETURN
diff --git a/gcc/testsuite/gfortran.dg/g77/pr9258.f b/gcc/testsuite/gfortran.dg/g77/pr9258.f
index 6de78454ede..6213245566b 100644
--- a/gcc/testsuite/gfortran.dg/g77/pr9258.f
+++ b/gcc/testsuite/gfortran.dg/g77/pr9258.f
@@ -5,14 +5,14 @@ C { dg-do compile }
SUBROUTINE FOO (B)
10 CALL BAR (A)
- ASSIGN 20 TO M !{ dg-warning "Obsolete: ASSIGN" "" }
+ ASSIGN 20 TO M !{ dg-warning "Deleted feature: ASSIGN" "" }
IF (100.LT.A) GOTO 10
GOTO 40
C
20 IF (B.LT.ABS(A)) GOTO 10
- ASSIGN 30 TO M !{ dg-warning "Obsolete: ASSIGN" "" }
+ ASSIGN 30 TO M !{ dg-warning "Deleted feature: ASSIGN" "" }
GOTO 40
C
- 30 ASSIGN 10 TO M !{ dg-warning "Obsolete: ASSIGN" "" }
- 40 GOTO M,(10,20,30) !{ dg-warning "Obsolete: Assigned GOTO" "" }
+ 30 ASSIGN 10 TO M !{ dg-warning "Deleted feature: ASSIGN" "" }
+ 40 GOTO M,(10,20,30) !{ dg-warning "Deleted feature: Assigned GOTO" "" }
END
diff --git a/gcc/testsuite/gfortran.dg/gomp/omp_do1.f90 b/gcc/testsuite/gfortran.dg/gomp/omp_do1.f90
index 3dfd43d43e3..c97af1ddb8a 100644
--- a/gcc/testsuite/gfortran.dg/gomp/omp_do1.f90
+++ b/gcc/testsuite/gfortran.dg/gomp/omp_do1.f90
@@ -24,11 +24,11 @@ subroutine foo
i = i + 1
end do
!$omp do
- do 300 d = 1, 30, 6 ! { dg-warning "Obsolete: REAL DO loop iterator" }
+ do 300 d = 1, 30, 6 ! { dg-warning "Deleted feature: Loop variable" }
i = d
300 a(i) = 1
!$omp do
- do d = 1, 30, 5 ! { dg-warning "Obsolete: REAL DO loop iterator" }
+ do d = 1, 30, 5 ! { dg-warning "Deleted feature: Loop variable" }
i = d
a(i) = 2
end do
diff --git a/gcc/testsuite/gfortran.dg/host_assoc_call_1.f90 b/gcc/testsuite/gfortran.dg/host_assoc_call_1.f90
new file mode 100644
index 00000000000..804929080a1
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/host_assoc_call_1.f90
@@ -0,0 +1,17 @@
+! { dg-do compile }
+! Tests the fix for PR31494, where the call of sub2 would reference
+! the variable, rather than the contained subroutine.
+!
+! Contributed by Michael Richmond <michael.a.richmond@nasa.gov>
+!
+MODULE ksbin2_aux_mod
+REAL, DIMENSION(1) :: sub2
+CONTAINS
+ SUBROUTINE sub1
+ CALL sub2
+ CONTAINS
+ SUBROUTINE sub2
+ END SUBROUTINE sub2
+ END SUBROUTINE sub1
+END MODULE ksbin2_aux_mod
+! { dg-final { cleanup-modules "ksbin2_aux_mod" } }
diff --git a/gcc/testsuite/gfortran.dg/host_assoc_function_2.f90 b/gcc/testsuite/gfortran.dg/host_assoc_function_2.f90
new file mode 100644
index 00000000000..5d63d7aa378
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/host_assoc_function_2.f90
@@ -0,0 +1,48 @@
+! { dg-do compile }
+! Tests the fix for PR32464, where the use associated procedure would
+! mess up the check for "grandparent" host association.
+!
+! Contributed by Harald Anlauf <anlauf@gmx.de>
+!
+
+module gfcbug64_mod1
+ implicit none
+
+ public :: inverse
+
+ interface inverse
+ module procedure copy
+ end interface
+
+contains
+
+ function copy (d) result (y)
+ real, intent(in) :: d(:)
+ real :: y(size (d)) ! <- this version kills gfortran
+! real, intent(in) :: d
+! real :: y
+ y = d
+ end function copy
+
+end module gfcbug64_mod1
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+module gfcbug64_mod2
+ implicit none
+contains
+
+ subroutine foo (x_o)
+ real, intent(in) :: x_o(:)
+
+ integer :: s(size (x_o)) ! <- this line kills gfortran
+
+ contains
+
+ subroutine bar ()
+ use gfcbug64_mod1, only: inverse ! <- this line kills gfortran
+ end subroutine bar
+
+ end subroutine foo
+end module gfcbug64_mod2
+! { dg-final { cleanup-modules "gfcbug64_mod1 gfcbug64_mod2" } }
diff --git a/gcc/testsuite/gfortran.dg/minmaxloc_1.f90 b/gcc/testsuite/gfortran.dg/minmaxloc_1.f90
new file mode 100644
index 00000000000..fcdf7952e66
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/minmaxloc_1.f90
@@ -0,0 +1,118 @@
+! { dg-do run }
+! Check max/minloc.
+! PR fortran/31726
+!
+program test
+ implicit none
+ integer :: i(1), j(-1:1), res(1)
+ logical, volatile :: m(3), m2(3)
+ m = (/ .false., .false., .false. /)
+ m2 = (/ .false., .true., .false. /)
+ call check(1, 0, MAXLOC((/ 42, 23, 11 /), DIM=1, MASK=.FALSE.))
+ call check(2, 0, MAXLOC((/ 42, 23, 11 /), DIM=1, MASK=m))
+ call check(3, 2, MAXLOC((/ 42, 23, 11 /), DIM=1, MASK=m2))
+ call check(4, 0, MAXLOC(i(1:0), DIM=1, MASK=.TRUE.))
+ call check(5, 0, MAXLOC(i(1:0), DIM=1, MASK=.FALSE.))
+ call check(6, 0, MAXLOC(i(1:0), DIM=1, MASK=m(1:0)))
+ call check(7, 0, MAXLOC(i(1:0), DIM=1))
+ call check(8, 0, MINLOC((/ 42, 23, 11 /), DIM=1, MASK=.FALSE.))
+ call check(9, 0, MINLOC((/ 42, 23, 11 /), DIM=1, MASK=m))
+ call check(10, 0, MINLOC(i(1:0), DIM=1, MASK=.FALSE.))
+ call check(11,0, MINLOC(i(1:0), DIM=1, MASK=m(1:0)))
+ call check(12,0, MINLOC(i(1:0), DIM=1, MASK=.TRUE.))
+ call check(13,0, MINLOC(i(1:0), DIM=1))
+
+ j = (/ 1, 2, 1 /); call check(14, 2, MAXLOC(j, DIM=1))
+ j = (/ 1, 2, 3 /); call check(15, 3, MAXLOC(j, DIM=1))
+ j = (/ 3, 2, 1 /); call check(16, 1, MAXLOC(j, DIM=1))
+ j = (/ 1, 2, 1 /); call check(17, 1, MINLOC(j, DIM=1))
+ j = (/ 1, 2, 3 /); call check(18, 1, MINLOC(j, DIM=1))
+ j = (/ 3, 2, 1 /); call check(19, 3, MINLOC(j, DIM=1))
+
+ j = (/ 1, 2, 1 /); call check(20, 2, MAXLOC(j, DIM=1,mask=.true.))
+ j = (/ 1, 2, 3 /); call check(21, 3, MAXLOC(j, DIM=1,mask=.true.))
+ j = (/ 3, 2, 1 /); call check(22, 1, MAXLOC(j, DIM=1,mask=.true.))
+ j = (/ 1, 2, 1 /); call check(23, 1, MINLOC(j, DIM=1,mask=.true.))
+ j = (/ 1, 2, 3 /); call check(24, 1, MINLOC(j, DIM=1,mask=.true.))
+ j = (/ 3, 2, 1 /); call check(25, 3, MINLOC(j, DIM=1,mask=.true.))
+
+ j = (/ 1, 2, 1 /); call check(26, 0, MAXLOC(j, DIM=1,mask=.false.))
+ j = (/ 1, 2, 3 /); call check(27, 0, MAXLOC(j, DIM=1,mask=.false.))
+ j = (/ 3, 2, 1 /); call check(28, 0, MAXLOC(j, DIM=1,mask=.false.))
+ j = (/ 1, 2, 1 /); call check(29, 0, MINLOC(j, DIM=1,mask=.false.))
+ j = (/ 1, 2, 3 /); call check(30, 0, MINLOC(j, DIM=1,mask=.false.))
+ j = (/ 3, 2, 1 /); call check(31, 0, MINLOC(j, DIM=1,mask=.false.))
+
+ j = (/ 1, 2, 1 /); call check(32, 0, MAXLOC(j, DIM=1,mask=m))
+ j = (/ 1, 2, 3 /); call check(33, 0, MAXLOC(j, DIM=1,mask=m))
+ j = (/ 3, 2, 1 /); call check(34, 0, MAXLOC(j, DIM=1,mask=m))
+ j = (/ 1, 2, 1 /); call check(35, 0, MINLOC(j, DIM=1,mask=m))
+ j = (/ 1, 2, 3 /); call check(36, 0, MINLOC(j, DIM=1,mask=m))
+ j = (/ 3, 2, 1 /); call check(37, 0, MINLOC(j, DIM=1,mask=m))
+
+ j = (/ 1, 2, 1 /); call check(38, 2, MAXLOC(j, DIM=1,mask=m2))
+ j = (/ 1, 2, 3 /); call check(39, 2, MAXLOC(j, DIM=1,mask=m2))
+ j = (/ 3, 2, 1 /); call check(40, 2, MAXLOC(j, DIM=1,mask=m2))
+ j = (/ 1, 2, 1 /); call check(41, 2, MINLOC(j, DIM=1,mask=m2))
+ j = (/ 1, 2, 3 /); call check(42, 2, MINLOC(j, DIM=1,mask=m2))
+ j = (/ 3, 2, 1 /); call check(43, 2, MINLOC(j, DIM=1,mask=m2))
+
+! Check the library minloc and maxloc
+ res = MAXLOC((/ 42, 23, 11 /), MASK=.FALSE.); call check(44, 0, res(1))
+ res = MAXLOC((/ 42, 23, 11 /), MASK=m); call check(45, 0, res(1))
+ res = MAXLOC((/ 42, 23, 11 /), MASK=m2); call check(46, 2, res(1))
+ res = MAXLOC(i(1:0), MASK=.TRUE.); call check(47, 0, res(1))
+ res = MAXLOC(i(1:0), MASK=.FALSE.); call check(48, 0, res(1))
+ res = MAXLOC(i(1:0), MASK=m(1:0)); call check(49, 0, res(1))
+ res = MAXLOC(i(1:0)); call check(50, 0, res(1))
+ res = MINLOC((/ 42, 23, 11 /), MASK=.FALSE.); call check(51, 0, res(1))
+ res = MINLOC((/ 42, 23, 11 /), MASK=m); call check(52, 0, res(1))
+ res = MINLOC(i(1:0), MASK=.FALSE.); call check(53, 0, res(1))
+ res = MINLOC(i(1:0), MASK=m(1:0)); call check(54,0, res(1))
+ res = MINLOC(i(1:0), MASK=.TRUE.); call check(55,0, res(1))
+ res = MINLOC(i(1:0)); call check(56,0, res(1))
+
+ j = (/ 1, 2, 1 /); res = MAXLOC(j); call check(57, 2, res(1))
+ j = (/ 1, 2, 3 /); res = MAXLOC(j); call check(58, 3, res(1))
+ j = (/ 3, 2, 1 /); res = MAXLOC(j); call check(59, 1, res(1))
+ j = (/ 1, 2, 1 /); res = MINLOC(j); call check(60, 1, res(1))
+ j = (/ 1, 2, 3 /); res = MINLOC(j); call check(61, 1, res(1))
+ j = (/ 3, 2, 1 /); res = MINLOC(j); call check(62, 3, res(1))
+
+ j = (/ 1, 2, 1 /); res = MAXLOC(j,mask=.true.); call check(63, 2, res(1))
+ j = (/ 1, 2, 3 /); res = MAXLOC(j,mask=.true.); call check(65, 3, res(1))
+ j = (/ 3, 2, 1 /); res = MAXLOC(j,mask=.true.); call check(66, 1, res(1))
+ j = (/ 1, 2, 1 /); res = MINLOC(j,mask=.true.); call check(67, 1, res(1))
+ j = (/ 1, 2, 3 /); res = MINLOC(j,mask=.true.); call check(68, 1, res(1))
+ j = (/ 3, 2, 1 /); res = MINLOC(j,mask=.true.); call check(69, 3, res(1))
+
+ j = (/ 1, 2, 1 /); res = MAXLOC(j,mask=.false.); call check(70, 0, res(1))
+ j = (/ 1, 2, 3 /); res = MAXLOC(j,mask=.false.); call check(71, 0, res(1))
+ j = (/ 3, 2, 1 /); res = MAXLOC(j,mask=.false.); call check(72, 0, res(1))
+ j = (/ 1, 2, 1 /); res = MINLOC(j,mask=.false.); call check(73, 0, res(1))
+ j = (/ 1, 2, 3 /); res = MINLOC(j,mask=.false.); call check(74, 0, res(1))
+ j = (/ 3, 2, 1 /); res = MINLOC(j,mask=.false.); call check(75, 0, res(1))
+
+ j = (/ 1, 2, 1 /); res = MAXLOC(j,mask=m); call check(76, 0, res(1))
+ j = (/ 1, 2, 3 /); res = MAXLOC(j,mask=m); call check(77, 0, res(1))
+ j = (/ 3, 2, 1 /); res = MAXLOC(j,mask=m); call check(78, 0, res(1))
+ j = (/ 1, 2, 1 /); res = MINLOC(j,mask=m); call check(79, 0, res(1))
+ j = (/ 1, 2, 3 /); res = MINLOC(j,mask=m); call check(80, 0, res(1))
+ j = (/ 3, 2, 1 /); res = MINLOC(j,mask=m);call check(81, 0, res(1))
+
+ j = (/ 1, 2, 1 /); res = MAXLOC(j,mask=m2); call check(82, 2, res(1))
+ j = (/ 1, 2, 3 /); res = MAXLOC(j,mask=m2); call check(83, 2, res(1))
+ j = (/ 3, 2, 1 /); res = MAXLOC(j,mask=m2); call check(84, 2, res(1))
+ j = (/ 1, 2, 1 /); res = MINLOC(j,mask=m2); call check(85, 2, res(1))
+ j = (/ 1, 2, 3 /); res = MINLOC(j,mask=m2); call check(86, 2, res(1))
+ j = (/ 3, 2, 1 /); res = MINLOC(j,mask=m2); call check(87, 2, res(1))
+
+contains
+subroutine check(n, i,j)
+ integer, value, intent(in) :: i,j,n
+ if(i /= j) then
+ call abort()
+! print *, 'ERROR: Test',n,' expected ',i,' received ', j
+ end if
+end subroutine check
+end program
diff --git a/gcc/testsuite/gfortran.dg/minmaxloc_2.f90 b/gcc/testsuite/gfortran.dg/minmaxloc_2.f90
new file mode 100644
index 00000000000..a4fd7ae5e77
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/minmaxloc_2.f90
@@ -0,0 +1,29 @@
+! { dg-do run }
+! Tests the fix for PR32298, in which the scalarizer would generate
+! a temporary in the course of evaluating MINLOC or MAXLOC, thereby
+! setting the start of the scalarizer loop to zero.
+!
+! Contributed by Jens Bischoff <jens.bischoff@freenet.de>
+!
+PROGRAM ERR_MINLOC
+
+ INTEGER, PARAMETER :: N = 7
+
+ DOUBLE PRECISION, DIMENSION (N), PARAMETER :: A &
+ = (/ 0.3D0, 0.455D0, 0.6D0, 0.7D0, 0.72D0, 0.76D0, 0.79D0 /)
+
+ DOUBLE PRECISION :: B
+ INTEGER :: I, J(N), K(N)
+
+ DO I = 1, N
+ B = A(I)
+ J(I) = MINLOC (ABS (A - B), 1)
+ K(I) = MAXLOC (ABS (A - B), 1)
+ END DO
+
+ if (any (J .NE. (/1,2,3,4,5,6,7/))) call abort ()
+ if (any (K .NE. (/7,7,1,1,1,1,1/))) call abort ()
+
+ STOP
+
+END PROGRAM ERR_MINLOC
diff --git a/gcc/testsuite/gfortran.dg/pointer_assign_3.f90 b/gcc/testsuite/gfortran.dg/pointer_assign_3.f90
new file mode 100644
index 00000000000..432d59fffe9
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pointer_assign_3.f90
@@ -0,0 +1,6 @@
+! { dg-do compile }
+! PR32360 Won't compile 'data ptr1 /null ()/' when ptr1 has pointer attribute.
+ integer, pointer :: ptr1
+ data ptr1 /NULL()/
+ end
+
diff --git a/gcc/testsuite/gfortran.dg/pr32136.f90 b/gcc/testsuite/gfortran.dg/pr32136.f90
new file mode 100644
index 00000000000..304b7b4a212
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr32136.f90
@@ -0,0 +1,11 @@
+! { dg-do run }
+! { dg-options "-std=gnu" }
+! Tests PR32136, which went away!
+!
+! Contributed by Tobias Burnus <burnus@gcc.gnu.org>
+!
+real(kind(0d0)), parameter :: r(1) = &
+ transfer(transfer(sqrt(2d0), (/ .true. /) ), (/ 0d0 /), 1)
+ if (r(1) .ne. sqrt(2d0)) call abort ()
+end
+
diff --git a/gcc/testsuite/gfortran.dg/private_type_6.f90 b/gcc/testsuite/gfortran.dg/private_type_6.f90
new file mode 100644
index 00000000000..0d7ec534be0
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/private_type_6.f90
@@ -0,0 +1,25 @@
+! { dg-do compile }
+! PR fortran/32460
+!
+module foomod
+ implicit none
+ type :: footype
+ private
+ integer :: dummy
+ end type footype
+ TYPE :: bartype
+ integer :: dummy
+ integer, private :: dummy2
+ end type bartype
+end module foomod
+
+program foo_test
+ USE foomod
+ implicit none
+ TYPE(footype) :: foo
+ TYPE(bartype) :: foo2
+ foo = footype(1) ! { dg-error "has PRIVATE components" }
+ foo2 = bartype(1,2) ! { dg-error "has PRIVATE components" }
+ foo2%dummy2 = 5 ! { dg-error "is a PRIVATE component" }
+end program foo_test
+! { dg-final { cleanup-tree-dump "foomod" } }
diff --git a/gcc/testsuite/gfortran.dg/real_do_1.f90 b/gcc/testsuite/gfortran.dg/real_do_1.f90
index 89a9d1b9b59..95fb47378a5 100644
--- a/gcc/testsuite/gfortran.dg/real_do_1.f90
+++ b/gcc/testsuite/gfortran.dg/real_do_1.f90
@@ -1,4 +1,8 @@
! { dg-do run }
+! { dg-warning "Loop variable" "Loop" { target *-*-* } 13 }
+! { dg-warning "Start expression" "Start" { target *-*-* } 13 }
+! { dg-warning "End expression" "End" { target *-*-* } 13 }
+! { dg-warning "Step expression" "Step" { target *-*-* } 13 }
! Test REAL type iterators in DO loops
program real_do_1
real x, y
@@ -6,7 +10,7 @@ program real_do_1
n = 0
y = 1.0
- do x = 1.0, 2.05, 0.1 ! { dg-warning "REAL DO loop" "" }
+ do x = 1.0, 2.05, 0.1
call check (x, y)
y = y + 0.1
n = n + 1
diff --git a/gcc/testsuite/gfortran.dg/secnds-1.f b/gcc/testsuite/gfortran.dg/secnds-1.f
index 5ac2bce154f..c5f528357ad 100644
--- a/gcc/testsuite/gfortran.dg/secnds-1.f
+++ b/gcc/testsuite/gfortran.dg/secnds-1.f
@@ -6,18 +6,25 @@ C Contributed by Paul Thomas <pault@gcc.gnu.org>
C
character*20 dum1, dum2, dum3
real t1, t1a, t2, t2a
- real*8 dat1, dat2
- integer i, j, values(8)
+ real*4 dat1, dat2
+ integer i, j, values(8), k
t1 = secnds (0.0)
call date_and_time (dum1, dum2, dum3, values)
t1a = secnds (0.0)
- dat1 = 0.001*real (values(8)) + real (values(7)) +
- & 60.0*real (values(6)) + 3600.0* real (values(5))
- if (((dat1 - t1) < 0.) .or. ((dat1 - t1) > (t1a - t1))) call abort ()
+ dat1 = 0.001 * real(values(8)) + real(values(7)) +
+ & 60.0 * real(values(6)) + 3600.0 * real(values(5))
+ ! handle midnight shift
+ if ((t1a - t1) < -12.0*3600.0 ) t1 = t1 - 24.0*3600.0
+ if ((t1a - dat1) < -12.0*3600.0 ) dat1 = dat1 - 24.0*3600.0
+ if ((dat1 < nearest(t1, -1.)) .or. (dat1 > nearest(t1a, 1.)))
+ & call abort ()
t2a = secnds (t1a)
call date_and_time (dum1, dum2, dum3, values)
t2 = secnds (t1)
- dat2 = 0.001*real (values(8)) + real (values(7)) +
- & 60.0*real (values(6)) + 3600.0* real (values(5))
- if (((dat2 - dat1) < t2a) .or. ((dat2 - dat1) > t2)) call abort ()
+ dat2 = 0.001 * real(values(8)) + real(values(7)) +
+ & 60.0 * real(values(6)) + 3600.0 * real(values(5))
+ ! handle midnight shift
+ if ((dat2 - dat1) < -12.0*3600.0 ) dat1 = dat1 - 24.0*3600.0
+ if (((dat2 - dat1) < t2a - 0.008) .or.
+ & ((dat2 - dat1) > t2 + 0.008)) call abort ()
end
diff --git a/gcc/testsuite/gfortran.dg/warnings_are_errors_1.f b/gcc/testsuite/gfortran.dg/warnings_are_errors_1.f
index 26c4e26b4db..2452b497151 100644
--- a/gcc/testsuite/gfortran.dg/warnings_are_errors_1.f
+++ b/gcc/testsuite/gfortran.dg/warnings_are_errors_1.f
@@ -12,7 +12,7 @@
!
34 5 i=0
! gfc_notify_std(GFC_STD_F95_DEL):
- do r1 = 1.0, 2 ! { dg-warning "Obsolete: REAL DO loop iterator" }
+ do r1 = 1, 2 ! { dg-error "Deleted feature: Loop variable" }
i = i+1
end do
call foo j bar
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index a0c514a0f5c..3f4093b6063 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -1452,7 +1452,6 @@ initialize_inlined_parameters (copy_body_data *id, tree exp,
tree a;
tree p;
tree vars = NULL_TREE;
- int argnum = 0;
call_expr_arg_iterator iter;
tree static_chain = CALL_EXPR_STATIC_CHAIN (exp);
@@ -1463,17 +1462,7 @@ initialize_inlined_parameters (copy_body_data *id, tree exp,
equivalent VAR_DECL, appropriately initialized. */
for (p = parms, a = first_call_expr_arg (exp, &iter); p;
a = next_call_expr_arg (&iter), p = TREE_CHAIN (p))
- {
- tree value;
-
- ++argnum;
-
- /* Find the initializer. */
- value = lang_hooks.tree_inlining.convert_parm_for_inlining
- (p, a, fn, argnum);
-
- setup_one_parameter (id, p, value, fn, bb, &vars);
- }
+ setup_one_parameter (id, p, a, fn, bb, &vars);
/* Initialize the static chain. */
p = DECL_STRUCT_FUNCTION (fn)->static_chain_decl;
diff --git a/gcc/tree.c b/gcc/tree.c
index 41cc07accf9..60ee18faa63 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -4035,18 +4035,25 @@ handle_dll_attribute (tree * pnode, tree name, tree args, int flags,
*no_add_attrs = true;
return tree_cons (name, args, NULL_TREE);
}
- if (TREE_CODE (node) != RECORD_TYPE && TREE_CODE (node) != UNION_TYPE)
+ if (TREE_CODE (node) == RECORD_TYPE
+ || TREE_CODE (node) == UNION_TYPE)
+ {
+ node = TYPE_NAME (node);
+ if (!node)
+ return NULL_TREE;
+ }
+ else
{
warning (OPT_Wattributes, "%qs attribute ignored",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
+ return NULL_TREE;
}
-
- return NULL_TREE;
}
if (TREE_CODE (node) != FUNCTION_DECL
- && TREE_CODE (node) != VAR_DECL)
+ && TREE_CODE (node) != VAR_DECL
+ && TREE_CODE (node) != TYPE_DECL)
{
*no_add_attrs = true;
warning (OPT_Wattributes, "%qs attribute ignored",
@@ -4109,6 +4116,22 @@ handle_dll_attribute (tree * pnode, tree name, tree args, int flags,
*no_add_attrs = true;
}
+ /* A dllexport'd entity must have default visibility so that other
+ program units (shared libraries or the main executable) can see
+ it. A dllimport'd entity must have default visibility so that
+ the linker knows that undefined references within this program
+ unit can be resolved by the dynamic linker. */
+ if (!*no_add_attrs)
+ {
+ if (DECL_VISIBILITY_SPECIFIED (node)
+ && DECL_VISIBILITY (node) != VISIBILITY_DEFAULT)
+ error ("%qs implies default visibility, but %qD has already "
+ "been declared with a different visibility",
+ IDENTIFIER_POINTER (name), node);
+ DECL_VISIBILITY (node) = VISIBILITY_DEFAULT;
+ DECL_VISIBILITY_SPECIFIED (node) = 1;
+ }
+
return NULL_TREE;
}
diff --git a/gcc/tree.h b/gcc/tree.h
index ebd6fda4f86..c700cdae116 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -450,7 +450,10 @@ struct gimple_stmt GTY(())
POINTER_TYPE, REFERENCE_TYPE
MOVE_NONTEMPORAL in
GIMPLE_MODIFY_STMT
- CASE_HIGH_SEEN in CASE_LABEL_EXPR
+ CASE_HIGH_SEEN in
+ CASE_LABEL_EXPR
+ CALL_CANNOT_INLINE_P in
+ CALL_EXPR
public_flag:
@@ -1165,6 +1168,9 @@ extern void omp_clause_range_check_failed (const tree, const char *, int,
#define CASE_HIGH_SEEN(NODE) \
(CASE_LABEL_EXPR_CHECK (NODE)->base.static_flag)
+/* Used to mark a CALL_EXPR as not suitable for inlining. */
+#define CALL_CANNOT_INLINE_P(NODE) ((NODE)->base.static_flag)
+
/* In an expr node (usually a conversion) this means the node was made
implicitly and should not lead to any sort of warning. In a decl node,
warnings concerning the decl should be suppressed. This is used at