diff options
author | doko <doko@6ca36cf4-e1d1-0310-8c6f-e303bb2178ca> | 2014-07-16 15:18:20 +0000 |
---|---|---|
committer | doko <doko@6ca36cf4-e1d1-0310-8c6f-e303bb2178ca> | 2014-07-16 15:18:20 +0000 |
commit | e09b1cd47d2b0c2e09588d8d203747241869cf54 (patch) | |
tree | fcc0c36fd434d1341366344f1583ceb4e8a2aea0 /debian | |
parent | 292b278a007cfc07728b98ec0933008d4ab87ac4 (diff) | |
download | gcc-49-e09b1cd47d2b0c2e09588d8d203747241869cf54.tar.gz |
* GCC 4.9.1 release.
* Update GDC form the 4.9 branch (20140712).
git-svn-id: svn://svn.debian.org/svn/gcccvs/branches/sid/gcc-4.9@7507 6ca36cf4-e1d1-0310-8c6f-e303bb2178ca
Diffstat (limited to 'debian')
-rw-r--r-- | debian/changelog | 7 | ||||
-rw-r--r-- | debian/patches/gcc-base-version.diff | 4 | ||||
-rw-r--r-- | debian/patches/gdc-4.9.diff | 56 | ||||
-rw-r--r-- | debian/patches/gdc-frontend-posix.diff | 4 | ||||
-rw-r--r-- | debian/patches/svn-doc-updates.diff | 45 | ||||
-rw-r--r-- | debian/patches/svn-updates.diff | 59500 | ||||
-rw-r--r-- | debian/rules.d/binary-cxx.mk | 3 | ||||
-rw-r--r-- | debian/rules.patch | 2 |
8 files changed, 70 insertions, 59551 deletions
diff --git a/debian/changelog b/debian/changelog index 9b480aa..9ba6ad1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +gcc-4.9 (4.9.1-1) unstable; urgency=medium + + * GCC 4.9.1 release. + * Update GDC form the 4.9 branch (20140712). + + -- Matthias Klose <doko@debian.org> Wed, 16 Jul 2014 17:15:14 +0200 + gcc-4.9 (4.9.0-11) unstable; urgency=medium * GCC 4.9.1 release candidate 1. diff --git a/debian/patches/gcc-base-version.diff b/debian/patches/gcc-base-version.diff index 3ee47a2..f680b83 100644 --- a/debian/patches/gcc-base-version.diff +++ b/debian/patches/gcc-base-version.diff @@ -5,14 +5,14 @@ Index: b/src/gcc/BASE-VER --- a/src/gcc/BASE-VER +++ b/src/gcc/BASE-VER @@ -1 +1 @@ --4.9.0 +-4.9.1 +4.9 Index: b/src/gcc/FULL-VER =================================================================== --- /dev/null +++ b/src/gcc/FULL-VER @@ -0,0 +1 @@ -+4.9.0 ++4.9.1 Index: b/src/gcc/Makefile.in =================================================================== --- a/src/gcc/Makefile.in diff --git a/debian/patches/gdc-4.9.diff b/debian/patches/gdc-4.9.diff index d571f98..dad1c02 100644 --- a/debian/patches/gdc-4.9.diff +++ b/debian/patches/gdc-4.9.diff @@ -5,7 +5,7 @@ Index: b/src/gcc/config/rs6000/rs6000.c =================================================================== --- a/src/gcc/config/rs6000/rs6000.c +++ b/src/gcc/config/rs6000/rs6000.c -@@ -24899,7 +24899,8 @@ rs6000_output_function_epilogue (FILE *f +@@ -24935,7 +24935,8 @@ rs6000_output_function_epilogue (FILE *f either, so for now use 0. */ if (! strcmp (language_string, "GNU C") || ! strcmp (language_string, "GNU GIMPLE") @@ -19,7 +19,23 @@ Index: b/src/gcc/dwarf2out.c =================================================================== --- a/src/gcc/dwarf2out.c +++ b/src/gcc/dwarf2out.c -@@ -19295,6 +19295,8 @@ gen_compile_unit_die (const char *filena +@@ -4616,6 +4616,15 @@ is_ada (void) + return lang == DW_LANG_Ada95 || lang == DW_LANG_Ada83; + } + ++/* Return TRUE if the language is D. */ ++static inline bool ++is_dlang (void) ++{ ++ unsigned int lang = get_AT_unsigned (comp_unit_die (), DW_AT_language); ++ ++ return lang == DW_LANG_D; ++} ++ + /* Remove the specified attribute if present. */ + + static void +@@ -19295,6 +19304,8 @@ gen_compile_unit_die (const char *filena language = DW_LANG_C89; if (strcmp (language_string, "GNU C++") == 0) language = DW_LANG_C_plus_plus; @@ -28,6 +44,42 @@ Index: b/src/gcc/dwarf2out.c else if (strcmp (language_string, "GNU F77") == 0) language = DW_LANG_Fortran77; else if (strcmp (language_string, "GNU Pascal") == 0) +@@ -20236,7 +20247,7 @@ declare_in_namespace (tree thing, dw_die + + if (ns_context != context_die) + { +- if (is_fortran ()) ++ if (is_fortran () || is_dlang ()) + return ns_context; + if (DECL_P (thing)) + gen_decl_die (thing, NULL, ns_context); +@@ -20259,7 +20270,7 @@ gen_namespace_die (tree decl, dw_die_ref + { + /* Output a real namespace or module. */ + context_die = setup_namespace_context (decl, comp_unit_die ()); +- namespace_die = new_die (is_fortran () ++ namespace_die = new_die (is_fortran () || is_dlang () + ? DW_TAG_module : DW_TAG_namespace, + context_die, decl); + /* For Fortran modules defined in different CU don't add src coords. */ +@@ -20316,7 +20327,7 @@ gen_decl_die (tree decl, tree origin, dw + break; + + case CONST_DECL: +- if (!is_fortran () && !is_ada ()) ++ if (!is_fortran () && !is_ada () && !is_dlang ()) + { + /* The individual enumerators of an enum type get output when we output + the Dwarf representation of the relevant enum type itself. */ +@@ -20786,7 +20797,7 @@ dwarf2out_decl (tree decl) + case CONST_DECL: + if (debug_info_level <= DINFO_LEVEL_TERSE) + return; +- if (!is_fortran () && !is_ada ()) ++ if (!is_fortran () && !is_ada () && !is_dlang ()) + return; + if (TREE_STATIC (decl) && decl_function_context (decl)) + context_die = lookup_decl_die (DECL_CONTEXT (decl)); Index: b/src/gcc/gcc.c =================================================================== --- a/src/gcc/gcc.c diff --git a/debian/patches/gdc-frontend-posix.diff b/debian/patches/gdc-frontend-posix.diff index 71cfe16..3c70021 100644 --- a/debian/patches/gdc-frontend-posix.diff +++ b/debian/patches/gdc-frontend-posix.diff @@ -1,12 +1,14 @@ # DP: Fix build of the D frontend on the Hurd and KFreeBSD. +Index: b/src/gcc/d/dfrontend/object.h +=================================================================== --- a/src/gcc/d/dfrontend/object.h +++ b/src/gcc/d/dfrontend/object.h @@ -10,7 +10,7 @@ #ifndef OBJECT_H #define OBJECT_H --#define POSIX (linux || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun) +-#define POSIX (__linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun) +#define POSIX (__linux__ || __GLIBC__ || __gnu_hurd__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun) #if __DMC__ diff --git a/debian/patches/svn-doc-updates.diff b/debian/patches/svn-doc-updates.diff index 001be64..03ba44a 100644 --- a/debian/patches/svn-doc-updates.diff +++ b/debian/patches/svn-doc-updates.diff @@ -1,49 +1,6 @@ # DP: updates from the 4.9 branch upto 20140423 (documentation). -svn diff svn://gcc.gnu.org/svn/gcc/tags/gcc_4_9_0_release svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch \ +svn diff svn://gcc.gnu.org/svn/gcc/tags/gcc_4_9_1_release svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch \ | sed -r 's,^--- (\S+)\t(\S+)(.*)$,--- a/src/\1\t\2,;s,^\+\+\+ (\S+)\t(\S+)(.*)$,+++ b/src/\1\t\2,' \ | awk '/^Index:.*\.texi/ {skip=0; print; next} /^Index:/ {skip=1; next} skip==0' -Index: gcc/doc/invoke.texi -=================================================================== ---- a/src/gcc/doc/invoke.texi (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/doc/invoke.texi (.../branches/gcc-4_9-branch) -@@ -825,7 +825,8 @@ - @gccoptlist{-meb -mel -mno-crt0} - - @emph{MSP430 Options} --@gccoptlist{-msim -masm-hex -mmcu= -mcpu= -mlarge -msmall -mrelax} -+@gccoptlist{-msim -masm-hex -mmcu= -mcpu= -mlarge -msmall -mrelax @gol -+-mhwmult=} - - @emph{NDS32 Options} - @gccoptlist{-mbig-endian -mlittle-endian @gol -@@ -18214,6 +18215,28 @@ - linker to perform certain optimizations that cannot be done until - the final link. - -+@item mhwmult= -+@opindex mhwmult= -+Describes the type of hardware multiply supported by the target. -+Accepted values are @code{none} for no hardware multiply, @code{16bit} -+for the original 16-bit-only multiply supported by early MCUs. -+@code{32bit} for the 16/32-bit multiply supported by later MCUs and -+@code{f5series} for the 16/32-bit multiply supported by F5-series MCUs. -+A value of @code{auto} can also be given. This tells GCC to deduce -+the hardware multiply support based upon the MCU name provided by the -+@option{-mmcu} option. If no @option{-mmcu} option is specified then -+@code{32bit} hardware multiply support is assumed. @code{auto} is the -+default setting. -+ -+Hardware multiplies are normally performed by calling a library -+routine. This saves space in the generated code. When compiling at -+@code{-O3} or higher however the hardware multiplier is invoked -+inline. This makes for bigger, but faster code. -+ -+The hardware multiply routines disable interrupts whilst running and -+restore the previous interrupt state when they finish. This makes -+them safe to use inside interrupt handlers as well as in normal code. -+ - @end table - - @node NDS32 Options diff --git a/debian/patches/svn-updates.diff b/debian/patches/svn-updates.diff index a658f5b..c95af02 100644 --- a/debian/patches/svn-updates.diff +++ b/debian/patches/svn-updates.diff @@ -8,59505 +8,7 @@ Sat Jul 12 11:02:22 UTC 2014 (revision 212479) EOF } -LANG=C svn diff svn://gcc.gnu.org/svn/gcc/tags/gcc_4_9_0_release svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch \ +LANG=C svn diff svn://gcc.gnu.org/svn/gcc/tags/gcc_4_9_1_release svn://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch \ | sed -r 's,^--- (\S+)\t(\S+)(.*)$,--- a/src/\1\t\2,;s,^\+\+\+ (\S+)\t(\S+)(.*)$,+++ b/src/\1\t\2,' \ | awk '/^Index:.*\.(class|texi)/ {skip=1; next} /^Index:/ { skip=0 } skip==0' -Index: libitm/clearcap.map -=================================================================== ---- a/src/libitm/clearcap.map (.../tags/gcc_4_9_0_release) -+++ b/src/libitm/clearcap.map (.../branches/gcc-4_9-branch) -@@ -1,14 +0,0 @@ --# Clear hardware capabilities emitted by Sun as: calls to the x86_avx.c --# functions are only emitted with -mavx. --# --# The v1 mapfile syntax has no support for clearing specific capabilities, --# so clear everything. --# --hwcap_1 = V0x0 OVERRIDE; --# --# If we can assume mapfile v2 syntax, we can specificially clear AVX. --# --#$mapfile_version 2 --#CAPABILITY { --# HW -= AVX; --#}; -Index: libitm/configure -=================================================================== ---- a/src/libitm/configure (.../tags/gcc_4_9_0_release) -+++ b/src/libitm/configure (.../branches/gcc-4_9-branch) -@@ -16739,10 +16739,10 @@ - - - ac_save_LDFLAGS="$LDFLAGS" -- LDFLAGS="$LFLAGS -Wl,-M,$srcdir/clearcap.map" -+ LDFLAGS="$LFLAGS -mclear-hwcap" - -- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld that supports -Wl,-M,mapfile" >&5 --$as_echo_n "checking for ld that supports -Wl,-M,mapfile... " >&6; } -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -mclear-hwcap" >&5 -+$as_echo_n "checking for -mclear-hwcap... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext - /* end confdefs.h. */ - -@@ -16762,7 +16762,7 @@ - rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test "$ac_hwcap_ldflags" = "yes"; then -- HWCAP_LDFLAGS="-Wl,-M,$srcdir/clearcap.map $HWCAP_LDFLAGS" -+ HWCAP_LDFLAGS="-mclear-hwcap $HWCAP_LDFLAGS" - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_hwcap_ldflags" >&5 - $as_echo "$ac_hwcap_ldflags" >&6; } -Index: libitm/ChangeLog -=================================================================== ---- a/src/libitm/ChangeLog (.../tags/gcc_4_9_0_release) -+++ b/src/libitm/ChangeLog (.../branches/gcc-4_9-branch) -@@ -1,3 +1,10 @@ -+2014-05-28 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> -+ -+ * acinclude.m4 (LIBITM_CHECK_LINKER_HWCAP): Check for -+ -mclear-hwcap instead. -+ * configure: Regenerate. -+ * clearcap.map: Remove. -+ - 2014-04-22 Release Manager - - * GCC 4.9.0 released. -Index: libitm/acinclude.m4 -=================================================================== ---- a/src/libitm/acinclude.m4 (.../tags/gcc_4_9_0_release) -+++ b/src/libitm/acinclude.m4 (.../branches/gcc-4_9-branch) -@@ -301,10 +301,10 @@ - - dnl - dnl Check if the linker used supports linker maps to clear hardware --dnl capabilities. This is only supported by Sun ld at the moment. -+dnl capabilities. This is only supported on Solaris at the moment. - dnl - dnl Defines: --dnl HWCAP_LDFLAGS='-Wl,-M,clearcap.map' if possible -+dnl HWCAP_LDFLAGS=-mclear-hwcap if possible - dnl LD (as a side effect of testing) - dnl - AC_DEFUN([LIBITM_CHECK_LINKER_HWCAP], [ -@@ -312,12 +312,12 @@ - AC_REQUIRE([AC_PROG_LD]) - - ac_save_LDFLAGS="$LDFLAGS" -- LDFLAGS="$LFLAGS -Wl,-M,$srcdir/clearcap.map" -+ LDFLAGS="$LFLAGS -mclear-hwcap" - -- AC_MSG_CHECKING([for ld that supports -Wl,-M,mapfile]) -+ AC_MSG_CHECKING([for -mclear-hwcap]) - AC_TRY_LINK([], [return 0;], [ac_hwcap_ldflags=yes],[ac_hwcap_ldflags=no]) - if test "$ac_hwcap_ldflags" = "yes"; then -- HWCAP_LDFLAGS="-Wl,-M,$srcdir/clearcap.map $HWCAP_LDFLAGS" -+ HWCAP_LDFLAGS="-mclear-hwcap $HWCAP_LDFLAGS" - fi - AC_MSG_RESULT($ac_hwcap_ldflags) - -Index: libgomp/omp_lib.f90.in -=================================================================== ---- a/src/libgomp/omp_lib.f90.in (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/omp_lib.f90.in (.../branches/gcc-4_9-branch) -@@ -42,7 +42,7 @@ - module omp_lib - use omp_lib_kinds - implicit none -- integer, parameter :: openmp_version = 201107 -+ integer, parameter :: openmp_version = 201307 - - interface - subroutine omp_init_lock (svar) -Index: libgomp/ChangeLog -=================================================================== ---- a/src/libgomp/ChangeLog (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/ChangeLog (.../branches/gcc-4_9-branch) -@@ -1,3 +1,153 @@ -+2014-06-30 Jakub Jelinek <jakub@redhat.com> -+ -+ Backported from mainline -+ 2014-06-25 Jakub Jelinek <jakub@redhat.com> -+ -+ * testsuite/libgomp.fortran/simd5.f90: New test. -+ * testsuite/libgomp.fortran/simd6.f90: New test. -+ * testsuite/libgomp.fortran/simd7.f90: New test. -+ -+ 2014-06-24 Jakub Jelinek <jakub@redhat.com> -+ -+ * testsuite/libgomp.fortran/aligned1.f03: New test. -+ * testsuite/libgomp.fortran/nestedfn5.f90: New test. -+ * testsuite/libgomp.fortran/target7.f90: Surround loop spawning -+ tasks with !$omp parallel !$omp single. -+ * testsuite/libgomp.fortran/target8.f90: New test. -+ * testsuite/libgomp.fortran/udr4.f90 (foo UDR, bar UDR): Adjust -+ not to use trim in the combiner, instead call elemental function. -+ (fn): New elemental function. -+ * testsuite/libgomp.fortran/udr6.f90 (do_add, dp_add, dp_init): -+ Make elemental. -+ * testsuite/libgomp.fortran/udr7.f90 (omp_priv, omp_orig, omp_out, -+ omp_in): Likewise. -+ * testsuite/libgomp.fortran/udr12.f90: New test. -+ * testsuite/libgomp.fortran/udr13.f90: New test. -+ * testsuite/libgomp.fortran/udr14.f90: New test. -+ * testsuite/libgomp.fortran/udr15.f90: New test. -+ -+ 2014-06-18 Jakub Jelinek <jakub@redhat.com> -+ -+ * omp_lib.f90.in (openmp_version): Set to 201307. -+ * omp_lib.h.in (openmp_version): Likewise. -+ * testsuite/libgomp.c/target-8.c: New test. -+ * testsuite/libgomp.fortran/declare-simd-1.f90: Add notinbranch -+ and inbranch clauses. -+ * testsuite/libgomp.fortran/depend-3.f90: New test. -+ * testsuite/libgomp.fortran/openmp_version-1.f: Adjust for new -+ openmp_version. -+ * testsuite/libgomp.fortran/openmp_version-2.f90: Likewise. -+ * testsuite/libgomp.fortran/target1.f90: New test. -+ * testsuite/libgomp.fortran/target2.f90: New test. -+ * testsuite/libgomp.fortran/target3.f90: New test. -+ * testsuite/libgomp.fortran/target4.f90: New test. -+ * testsuite/libgomp.fortran/target5.f90: New test. -+ * testsuite/libgomp.fortran/target6.f90: New test. -+ * testsuite/libgomp.fortran/target7.f90: New test. -+ -+ 2014-06-10 Jakub Jelinek <jakub@redhat.com> -+ -+ PR fortran/60928 -+ * testsuite/libgomp.fortran/allocatable9.f90: New test. -+ * testsuite/libgomp.fortran/allocatable10.f90: New test. -+ * testsuite/libgomp.fortran/allocatable11.f90: New test. -+ * testsuite/libgomp.fortran/allocatable12.f90: New test. -+ * testsuite/libgomp.fortran/alloc-comp-1.f90: New test. -+ * testsuite/libgomp.fortran/alloc-comp-2.f90: New test. -+ * testsuite/libgomp.fortran/alloc-comp-3.f90: New test. -+ * testsuite/libgomp.fortran/associate1.f90: New test. -+ * testsuite/libgomp.fortran/associate2.f90: New test. -+ * testsuite/libgomp.fortran/procptr1.f90: New test. -+ -+ 2014-06-06 Jakub Jelinek <jakub@redhat.com> -+ -+ * testsuite/libgomp.fortran/simd1.f90: New test. -+ * testsuite/libgomp.fortran/udr1.f90: New test. -+ * testsuite/libgomp.fortran/udr2.f90: New test. -+ * testsuite/libgomp.fortran/udr3.f90: New test. -+ * testsuite/libgomp.fortran/udr4.f90: New test. -+ * testsuite/libgomp.fortran/udr5.f90: New test. -+ * testsuite/libgomp.fortran/udr6.f90: New test. -+ * testsuite/libgomp.fortran/udr7.f90: New test. -+ * testsuite/libgomp.fortran/udr8.f90: New test. -+ * testsuite/libgomp.fortran/udr9.f90: New test. -+ * testsuite/libgomp.fortran/udr10.f90: New test. -+ * testsuite/libgomp.fortran/udr11.f90: New test. -+ -+ 2014-05-27 Uros Bizjak <ubizjak@gmail.com> -+ -+ * testsuite/libgomp.fortran/declare-simd-1.f90: Require -+ vect_simd_clones effective target. -+ * testsuite/libgomp.fortran/declare-simd-2.f90: Ditto. -+ -+ 2014-05-11 Jakub Jelinek <jakub@redhat.com> -+ -+ * testsuite/libgomp.fortran/cancel-do-1.f90: New test. -+ * testsuite/libgomp.fortran/cancel-do-2.f90: New test. -+ * testsuite/libgomp.fortran/cancel-parallel-1.f90: New test. -+ * testsuite/libgomp.fortran/cancel-parallel-3.f90: New test. -+ * testsuite/libgomp.fortran/cancel-sections-1.f90: New test. -+ * testsuite/libgomp.fortran/cancel-taskgroup-2.f90: New test. -+ * testsuite/libgomp.fortran/declare-simd-1.f90: New test. -+ * testsuite/libgomp.fortran/declare-simd-2.f90: New test. -+ * testsuite/libgomp.fortran/declare-simd-3.f90: New test. -+ * testsuite/libgomp.fortran/depend-1.f90: New test. -+ * testsuite/libgomp.fortran/depend-2.f90: New test. -+ * testsuite/libgomp.fortran/omp_atomic5.f90: New test. -+ * testsuite/libgomp.fortran/simd1.f90: New test. -+ * testsuite/libgomp.fortran/simd2.f90: New test. -+ * testsuite/libgomp.fortran/simd3.f90: New test. -+ * testsuite/libgomp.fortran/simd4.f90: New test. -+ * testsuite/libgomp.fortran/taskgroup1.f90: New test. -+ -+2014-06-24 Jakub Jelinek <jakub@redhat.com> -+ -+ * testsuite/libgomp.c/for-2.c: Define SC to static for -+ #pragma omp for simd testing. -+ * testsuite/libgomp.c/for-2.h (SC): Define if not defined. -+ (N(f5), N(f6), N(f7), N(f8), N(f10), N(f12), N(f14)): Use -+ SC macro. -+ * testsuite/libgomp.c/simd-14.c: New test. -+ * testsuite/libgomp.c/simd-15.c: New test. -+ * testsuite/libgomp.c/simd-16.c: New test. -+ * testsuite/libgomp.c/simd-17.c: New test. -+ * testsuite/libgomp.c++/for-10.C: Define SC to static for -+ #pragma omp for simd testing. -+ * testsuite/libgomp.c++/simd10.C: New test. -+ * testsuite/libgomp.c++/simd11.C: New test. -+ * testsuite/libgomp.c++/simd12.C: New test. -+ * testsuite/libgomp.c++/simd13.C: New test. -+ -+2014-05-21 Jakub Jelinek <jakub@redhat.com> -+ -+ PR middle-end/61252 -+ * testsuite/libgomp.c++/simd-9.C: New test. -+ -+2014-05-18 Uros Bizjak <ubizjak@gmail.com> -+ -+ * libgomp.texi (Runitme Library Routines): Remove multiple @menu. -+ (Environment Variables) Move OMP_PROC_BIND and OMP_STACKSIZE node -+ texts according to their @menu entry positions. -+ -+2014-05-02 Jakub Jelinek <jakub@redhat.com> -+ -+ * testsuite/libgomp.c/simd-10.c: New test. -+ * testsuite/libgomp.c/simd-11.c: New test. -+ * testsuite/libgomp.c/simd-12.c: New test. -+ * testsuite/libgomp.c/simd-13.c: New test. -+ -+2014-04-24 Jakub Jelinek <jakub@redhat.com> -+ -+ * testsuite/libgomp.c++/atomic-14.C: Allow seq_cst and -+ atomic type clauses in any order and optional comma in between. -+ * testsuite/libgomp.c++/atomic-15.C: Likewise. -+ * testsuite/libgomp.c/atomic-17.c: Likewise. -+ -+ * testsuite/libgomp.c/simd-7.c: New test. -+ * testsuite/libgomp.c/simd-8.c: New test. -+ * testsuite/libgomp.c/simd-9.c: New test. -+ * testsuite/libgomp.c/loop-16.c: New test. -+ - 2014-04-22 Release Manager - - * GCC 4.9.0 released. -Index: libgomp/testsuite/libgomp.c++/simd10.C -=================================================================== ---- a/src/libgomp/testsuite/libgomp.c++/simd10.C (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.c++/simd10.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,6 @@ -+// { dg-do run } -+// { dg-options "-O2" } -+// { dg-additional-options "-msse2" { target sse2_runtime } } -+// { dg-additional-options "-mavx" { target avx_runtime } } -+ -+#include "../libgomp.c/simd-14.c" -Index: libgomp/testsuite/libgomp.c++/atomic-15.C -=================================================================== ---- a/src/libgomp/testsuite/libgomp.c++/atomic-15.C (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.c++/atomic-15.C (.../branches/gcc-4_9-branch) -@@ -14,13 +14,13 @@ - v = x; - if (v != 3) - abort (); -- #pragma omp atomic update seq_cst -+ #pragma omp atomic seq_cst update - x = 3 * 2 * 1 + x; -- #pragma omp atomic read seq_cst -+ #pragma omp atomic read, seq_cst - v = x; - if (v != 9) - abort (); -- #pragma omp atomic capture seq_cst -+ #pragma omp atomic seq_cst, capture - v = x = x | 16; - if (v != 25) - abort (); -@@ -28,15 +28,15 @@ - v = x = x + 14 * 2 / 4; - if (v != 32) - abort (); -- #pragma omp atomic capture seq_cst -+ #pragma omp atomic seq_cst capture - v = x = 5 | x; - if (v != 37) - abort (); -- #pragma omp atomic capture seq_cst -+ #pragma omp atomic capture, seq_cst - v = x = 40 + 12 - 2 - 7 - x; - if (v != 6) - abort (); -- #pragma omp atomic read seq_cst -+ #pragma omp atomic seq_cst read - v = x; - if (v != 6) - abort (); -@@ -44,7 +44,7 @@ - { v = x; x = 3 + x; } - if (v != 6) - abort (); -- #pragma omp atomic capture seq_cst -+ #pragma omp atomic seq_cst capture - { v = x; x = -1 * -1 * -1 * -1 - x; } - if (v != 9) - abort (); -@@ -52,11 +52,11 @@ - v = x; - if (v != -8) - abort (); -- #pragma omp atomic capture seq_cst -+ #pragma omp atomic capture, seq_cst - { x = 2 * 2 - x; v = x; } - if (v != 12) - abort (); -- #pragma omp atomic capture seq_cst -+ #pragma omp atomic seq_cst capture - { x = 7 & x; v = x; } - if (v != 4) - abort (); -@@ -64,7 +64,7 @@ - { v = x; x = 6; } - if (v != 4) - abort (); -- #pragma omp atomic read seq_cst -+ #pragma omp atomic read, seq_cst - v = x; - if (v != 6) - abort (); -@@ -72,11 +72,11 @@ - { v = x; x = 7 * 8 + 23; } - if (v != 6) - abort (); -- #pragma omp atomic read seq_cst -+ #pragma omp atomic seq_cst, read - v = x; - if (v != 79) - abort (); -- #pragma omp atomic capture seq_cst -+ #pragma omp atomic capture , seq_cst - { v = x; x = 23 + 6 * 4; } - if (v != 79) - abort (); -@@ -84,7 +84,7 @@ - v = x; - if (v != 47) - abort (); -- #pragma omp atomic capture seq_cst -+ #pragma omp atomic seq_cst capture - { v = x; x = l ? 17 : 12; } - if (v != 47) - abort (); -Index: libgomp/testsuite/libgomp.c++/simd11.C -=================================================================== ---- a/src/libgomp/testsuite/libgomp.c++/simd11.C (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.c++/simd11.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,6 @@ -+// { dg-do run } -+// { dg-options "-O2" } -+// { dg-additional-options "-msse2" { target sse2_runtime } } -+// { dg-additional-options "-mavx" { target avx_runtime } } -+ -+#include "../libgomp.c/simd-15.c" -Index: libgomp/testsuite/libgomp.c++/simd12.C -=================================================================== ---- a/src/libgomp/testsuite/libgomp.c++/simd12.C (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.c++/simd12.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,6 @@ -+// { dg-do run } -+// { dg-options "-O2" } -+// { dg-additional-options "-msse2" { target sse2_runtime } } -+// { dg-additional-options "-mavx" { target avx_runtime } } -+ -+#include "../libgomp.c/simd-16.c" -Index: libgomp/testsuite/libgomp.c++/for-10.C -=================================================================== ---- a/src/libgomp/testsuite/libgomp.c++/for-10.C (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.c++/for-10.C (.../branches/gcc-4_9-branch) -@@ -19,11 +19,14 @@ - #undef F - #undef G - -+#undef SC -+#define SC static - #define F for simd - #define G f_simd - #include "../libgomp.c/for-1.h" - #undef F - #undef G -+#undef SC - - int - main () -Index: libgomp/testsuite/libgomp.c++/atomic-14.C -=================================================================== ---- a/src/libgomp/testsuite/libgomp.c++/atomic-14.C (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.c++/atomic-14.C (.../branches/gcc-4_9-branch) -@@ -13,13 +13,13 @@ - v = x; - if (v != 3) - abort (); -- #pragma omp atomic update seq_cst -+ #pragma omp atomic seq_cst update - x = 3 * 2 * 1 + x; -- #pragma omp atomic read seq_cst -+ #pragma omp atomic read, seq_cst - v = x; - if (v != 9) - abort (); -- #pragma omp atomic capture seq_cst -+ #pragma omp atomic seq_cst, capture - v = x = x | 16; - if (v != 25) - abort (); -@@ -27,15 +27,15 @@ - v = x = x + 14 * 2 / 4; - if (v != 32) - abort (); -- #pragma omp atomic capture seq_cst -+ #pragma omp atomic seq_cst capture - v = x = 5 | x; - if (v != 37) - abort (); -- #pragma omp atomic capture seq_cst -+ #pragma omp atomic capture, seq_cst - v = x = 40 + 12 - 2 - 7 - x; - if (v != 6) - abort (); -- #pragma omp atomic read seq_cst -+ #pragma omp atomic seq_cst read - v = x; - if (v != 6) - abort (); -@@ -43,7 +43,7 @@ - { v = x; x = 3 + x; } - if (v != 6) - abort (); -- #pragma omp atomic capture seq_cst -+ #pragma omp atomic seq_cst capture - { v = x; x = -1 * -1 * -1 * -1 - x; } - if (v != 9) - abort (); -@@ -51,11 +51,11 @@ - v = x; - if (v != -8) - abort (); -- #pragma omp atomic capture seq_cst -+ #pragma omp atomic capture, seq_cst - { x = 2 * 2 - x; v = x; } - if (v != 12) - abort (); -- #pragma omp atomic capture seq_cst -+ #pragma omp atomic seq_cst capture - { x = 7 & x; v = x; } - if (v != 4) - abort (); -@@ -63,7 +63,7 @@ - { v = x; x = 6; } - if (v != 4) - abort (); -- #pragma omp atomic read seq_cst -+ #pragma omp atomic read, seq_cst - v = x; - if (v != 6) - abort (); -@@ -71,11 +71,11 @@ - { v = x; x = 7 * 8 + 23; } - if (v != 6) - abort (); -- #pragma omp atomic read seq_cst -+ #pragma omp atomic seq_cst, read - v = x; - if (v != 79) - abort (); -- #pragma omp atomic capture seq_cst -+ #pragma omp atomic capture , seq_cst - { v = x; x = 23 + 6 * 4; } - if (v != 79) - abort (); -@@ -83,7 +83,7 @@ - v = x; - if (v != 47) - abort (); -- #pragma omp atomic capture seq_cst -+ #pragma omp atomic seq_cst capture - { v = x; x = l ? 17 : 12; } - if (v != 47) - abort (); -Index: libgomp/testsuite/libgomp.c++/simd13.C -=================================================================== ---- a/src/libgomp/testsuite/libgomp.c++/simd13.C (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.c++/simd13.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,6 @@ -+// { dg-do run } -+// { dg-options "-O2" } -+// { dg-additional-options "-msse2" { target sse2_runtime } } -+// { dg-additional-options "-mavx" { target avx_runtime } } -+ -+#include "../libgomp.c/simd-17.c" -Index: libgomp/testsuite/libgomp.c++/simd-9.C -=================================================================== ---- a/src/libgomp/testsuite/libgomp.c++/simd-9.C (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.c++/simd-9.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,52 @@ -+// { dg-do run } -+// { dg-options "-O2" } -+// { dg-additional-options "-msse2" { target sse2_runtime } } -+// { dg-additional-options "-mavx" { target avx_runtime } } -+ -+extern "C" void abort (); -+int a[1024] __attribute__((aligned (32))) = { 1 }; -+#pragma omp declare reduction (foo:int:omp_out += omp_in) \ -+ initializer (omp_priv = 0) -+ -+__attribute__((noinline, noclone)) void -+foo (int &u, int &v) -+{ -+ int i; -+ #pragma omp simd aligned(a : 32) reduction(foo:u) reduction(+:v) -+ for (i = 0; i < 1024; i++) -+ { -+ int x = a[i]; -+ u += x; -+ v += x; -+ } -+} -+ -+__attribute__((noinline, noclone)) void -+bar (int &u, int &v) -+{ -+ int i; -+ #pragma omp simd aligned(a : 32) reduction(foo:u) reduction(+:v) \ -+ safelen(1) -+ for (i = 0; i < 1024; i++) -+ { -+ int x = a[i]; -+ u += x; -+ v += x; -+ } -+} -+ -+int -+main () -+{ -+ int i; -+ for (i = 0; i < 1024; i++) -+ a[i] = (i & 31) + (i / 128); -+ int u = 0, v = 0; -+ foo (u, v); -+ if (u != 19456 || v != 19456) -+ abort (); -+ u = 0; v = 0; -+ bar (u, v); -+ if (u != 19456 || v != 19456) -+ abort (); -+} -Index: libgomp/testsuite/libgomp.fortran/udr8.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/udr8.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/udr8.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,46 @@ -+! { dg-do run } -+ -+module udr8m1 -+ integer, parameter :: a = 6 -+ integer :: b -+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) -+!$omp declare reduction (.add. : integer : & -+!$omp & omp_out = omp_out .add. iand (omp_in, -4)) & -+!$omp & initializer (omp_priv = 3) -+ interface operator (.add.) -+ module procedure f1 -+ end interface -+contains -+ integer function f1 (x, y) -+ integer, intent (in) :: x, y -+ f1 = x + y -+ end function f1 -+end module udr8m1 -+module udr8m2 -+ use udr8m1 -+ type dt -+ integer :: x -+ end type -+!$omp declare reduction (+ : dt : omp_out = omp_out + omp_in) & -+!$omp & initializer (omp_priv = dt (0)) -+ interface operator (+) -+ module procedure f2 -+ end interface -+contains -+ type(dt) function f2 (x, y) -+ type(dt), intent (in) :: x, y -+ f2%x = x%x + y%x -+ end function f2 -+end module udr8m2 -+ use udr8m2 -+ integer :: i, j -+ type(dt) :: d -+ j = 3 -+ d%x = 0 -+!$omp parallel do reduction (.add.: j) reduction (+ : d) -+ do i = 1, 100 -+ j = j.add.iand (i, -4) -+ d = d + dt(i) -+ end do -+ if (d%x /= 5050 .or. j /= 4903) call abort -+end -Index: libgomp/testsuite/libgomp.fortran/taskgroup1.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/taskgroup1.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/taskgroup1.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,80 @@ -+ integer :: v(16), i -+ do i = 1, 16 -+ v(i) = i -+ end do -+ -+ !$omp parallel num_threads (4) -+ !$omp single -+ !$omp taskgroup -+ do i = 1, 16, 2 -+ !$omp task -+ !$omp task -+ v(i) = v(i) + 1 -+ !$omp end task -+ !$omp task -+ v(i + 1) = v(i + 1) + 1 -+ !$omp end task -+ !$omp end task -+ end do -+ !$omp end taskgroup -+ do i = 1, 16 -+ if (v(i).ne.(i + 1)) call abort -+ end do -+ !$omp taskgroup -+ do i = 1, 16, 2 -+ !$omp task -+ !$omp task -+ v(i) = v(i) + 1 -+ !$omp endtask -+ !$omp task -+ v(i + 1) = v(i + 1) + 1 -+ !$omp endtask -+ !$omp taskwait -+ !$omp endtask -+ end do -+ !$omp endtaskgroup -+ do i = 1, 16 -+ if (v(i).ne.(i + 2)) call abort -+ end do -+ !$omp taskgroup -+ do i = 1, 16, 2 -+ !$omp task -+ !$omp task -+ v(i) = v(i) + 1 -+ !$omp end task -+ v(i + 1) = v(i + 1) + 1 -+ !$omp end task -+ end do -+ !$omp taskwait -+ do i = 1, 16, 2 -+ !$omp task -+ v(i + 1) = v(i + 1) + 1 -+ !$omp end task -+ end do -+ !$omp end taskgroup -+ do i = 1, 16, 2 -+ if (v(i).ne.(i + 3)) call abort -+ if (v(i + 1).ne.(i + 5)) call abort -+ end do -+ !$omp taskgroup -+ do i = 1, 16, 2 -+ !$omp taskgroup -+ !$omp task -+ v(i) = v(i) + 1 -+ !$omp end task -+ !$omp task -+ v(i + 1) = v(i + 1) + 1 -+ !$omp end task -+ !$omp end taskgroup -+ if (v(i).ne.(i + 4).or.v(i + 1).ne.(i + 6)) call abort -+ !$omp task -+ v(i) = v(i) + 1 -+ !$omp end task -+ end do -+ !$omp end taskgroup -+ do i = 1, 16 -+ if (v(i).ne.(i + 5)) call abort -+ end do -+ !$omp end single -+ !$omp end parallel -+end -Index: libgomp/testsuite/libgomp.fortran/target2.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/target2.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/target2.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,96 @@ -+! { dg-do run } -+! { dg-options "-fopenmp -ffree-line-length-160" } -+ -+module target2 -+contains -+ subroutine foo (a, b, c, d, e, f, g, n, q) -+ integer :: n, q -+ integer :: a, b(3:n), c(5:), d(2:*), e(:,:) -+ integer, pointer :: f, g(:) -+ integer :: h, i(3:n) -+ integer, pointer :: j, k(:) -+ logical :: r -+ allocate (j, k(4:n)) -+ h = 14 -+ i = 15 -+ j = 16 -+ k = 17 -+ !$omp target map (to: a, b, c, d(2:n+1), e, f, g, h, i, j, k, n) map (from: r) -+ r = a /= 7 -+ r = r .or. (any (b /= 8)) .or. (lbound (b, 1) /= 3) .or. (ubound (b, 1) /= n) -+ r = r .or. (any (c /= 9)) .or. (lbound (c, 1) /= 5) .or. (ubound (c, 1) /= n + 4) -+ r = r .or. (any (d(2:n+1) /= 10)) .or. (lbound (d, 1) /= 2) -+ r = r .or. (any (e /= 11)) .or. (lbound (e, 1) /= 1) .or. (ubound (e, 1) /= 2) -+ r = r .or. (lbound (e, 2) /= 1) .or. (ubound (e, 2) /= 2) -+ r = r .or. (f /= 12) -+ r = r .or. (any (g /= 13)) .or. (lbound (g, 1) /= 3) .or. (ubound (g, 1) /= n) -+ r = r .or. (h /= 14) -+ r = r .or. (any (i /= 15)) .or. (lbound (i, 1) /= 3) .or. (ubound (i, 1) /= n) -+ r = r .or. (j /= 16) -+ r = r .or. (any (k /= 17)) .or. (lbound (k, 1) /= 4) .or. (ubound (k, 1) /= n) -+ !$omp end target -+ if (r) call abort -+ !$omp target map (to: b(3:n), c(5:n+4), d(2:n+1), e(1:,:2), g(3:n), i(3:n), k(4:n), n) map (from: r) -+ r = (any (b /= 8)) .or. (lbound (b, 1) /= 3) .or. (ubound (b, 1) /= n) -+ r = r .or. (any (c /= 9)) .or. (lbound (c, 1) /= 5) .or. (ubound (c, 1) /= n + 4) -+ r = r .or. (any (d(2:n+1) /= 10)) .or. (lbound (d, 1) /= 2) -+ r = r .or. (any (e /= 11)) .or. (lbound (e, 1) /= 1) .or. (ubound (e, 1) /= 2) -+ r = r .or. (lbound (e, 2) /= 1) .or. (ubound (e, 2) /= 2) -+ r = r .or. (any (g /= 13)) .or. (lbound (g, 1) /= 3) .or. (ubound (g, 1) /= n) -+ r = r .or. (any (i /= 15)) .or. (lbound (i, 1) /= 3) .or. (ubound (i, 1) /= n) -+ r = r .or. (any (k /= 17)) .or. (lbound (k, 1) /= 4) .or. (ubound (k, 1) /= n) -+ !$omp end target -+ if (r) call abort -+ !$omp target map (to: b(5:n-2), c(7:n), d(4:n-2), e(1:,2:), g(5:n-3), i(6:n-4), k(5:n-5), n) map (from: r) -+ r = (any (b(5:n-2) /= 8)) .or. (lbound (b, 1) /= 3) .or. (ubound (b, 1) /= n) -+ r = r .or. (any (c(7:n) /= 9)) .or. (lbound (c, 1) /= 5) .or. (ubound (c, 1) /= n + 4) -+ r = r .or. (any (d(4:n-2) /= 10)) .or. (lbound (d, 1) /= 2) -+ r = r .or. (any (e(1:,2:) /= 11)) .or. (lbound (e, 1) /= 1) .or. (ubound (e, 1) /= 2) -+ r = r .or. (lbound (e, 2) /= 1) .or. (ubound (e, 2) /= 2) -+ r = r .or. (any (g(5:n-3) /= 13)) .or. (lbound (g, 1) /= 3) .or. (ubound (g, 1) /= n) -+ r = r .or. (any (i(6:n-4) /= 15)) .or. (lbound (i, 1) /= 3) .or. (ubound (i, 1) /= n) -+ r = r .or. (any (k(5:n-5) /= 17)) .or. (lbound (k, 1) /= 4) .or. (ubound (k, 1) /= n) -+ !$omp end target -+ !$omp target map (to: b(q+5:n-2+q), c(q+7:q+n), d(q+4:q+n-2), e(1:q+2,2:q+2), g(5+q:n-3+q), & -+ !$omp & i(6+q:n-4+q), k(5+q:n-5+q), n) map (from: r) -+ r = (any (b(5:n-2) /= 8)) .or. (lbound (b, 1) /= 3) .or. (ubound (b, 1) /= n) -+ r = r .or. (any (c(7:n) /= 9)) .or. (lbound (c, 1) /= 5) .or. (ubound (c, 1) /= n + 4) -+ r = r .or. (any (d(4:n-2) /= 10)) .or. (lbound (d, 1) /= 2) -+ r = r .or. (any (e(1:,2:) /= 11)) .or. (lbound (e, 1) /= 1) .or. (ubound (e, 1) /= 2) -+ r = r .or. (lbound (e, 2) /= 1) .or. (ubound (e, 2) /= 2) -+ r = r .or. (any (g(5:n-3) /= 13)) .or. (lbound (g, 1) /= 3) .or. (ubound (g, 1) /= n) -+ r = r .or. (any (i(6:n-4) /= 15)) .or. (lbound (i, 1) /= 3) .or. (ubound (i, 1) /= n) -+ r = r .or. (any (k(5:n-5) /= 17)) .or. (lbound (k, 1) /= 4) .or. (ubound (k, 1) /= n) -+ !$omp end target -+ if (r) call abort -+ !$omp target map (to: d(2:n+1), n) -+ r = a /= 7 -+ r = r .or. (any (b /= 8)) .or. (lbound (b, 1) /= 3) .or. (ubound (b, 1) /= n) -+ r = r .or. (any (c /= 9)) .or. (lbound (c, 1) /= 5) .or. (ubound (c, 1) /= n + 4) -+ r = r .or. (any (d(2:n+1) /= 10)) .or. (lbound (d, 1) /= 2) -+ r = r .or. (any (e /= 11)) .or. (lbound (e, 1) /= 1) .or. (ubound (e, 1) /= 2) -+ r = r .or. (lbound (e, 2) /= 1) .or. (ubound (e, 2) /= 2) -+ r = r .or. (f /= 12) -+ r = r .or. (any (g /= 13)) .or. (lbound (g, 1) /= 3) .or. (ubound (g, 1) /= n) -+ r = r .or. (h /= 14) -+ r = r .or. (any (i /= 15)) .or. (lbound (i, 1) /= 3) .or. (ubound (i, 1) /= n) -+ r = r .or. (j /= 16) -+ r = r .or. (any (k /= 17)) .or. (lbound (k, 1) /= 4) .or. (ubound (k, 1) /= n) -+ !$omp end target -+ if (r) call abort -+ end subroutine foo -+end module target2 -+ use target2, only : foo -+ integer, parameter :: n = 15, q = 0 -+ integer :: a, b(2:n-1), c(n), d(n), e(3:4, 3:4) -+ integer, pointer :: f, g(:) -+ allocate (f, g(3:n)) -+ a = 7 -+ b = 8 -+ c = 9 -+ d = 10 -+ e = 11 -+ f = 12 -+ g = 13 -+ call foo (a, b, c, d, e, f, g, n, q) -+end -Index: libgomp/testsuite/libgomp.fortran/target4.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/target4.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/target4.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,48 @@ -+! { dg-do run } -+ -+module target4 -+contains -+ subroutine foo (a,m,n) -+ integer :: m,n,i,j -+ double precision :: a(m, n), t -+ !$omp target data map(a) map(to: m, n) -+ do i=1,n -+ t = 0.0d0 -+ !$omp target -+ !$omp parallel do reduction(+:t) -+ do j=1,m -+ t = t + a(j,i) * a(j,i) -+ end do -+ !$omp end target -+ t = 2.0d0 * t -+ !$omp target -+ !$omp parallel do -+ do j=1,m -+ a(j,i) = a(j,i) * t -+ end do -+ !$omp end target -+ end do -+ !$omp end target data -+ end subroutine foo -+end module target4 -+ use target4, only : foo -+ integer :: i, j -+ double precision :: a(8, 9), res(8, 9) -+ do i = 1, 8 -+ do j = 1, 9 -+ a(i, j) = i + j -+ end do -+ end do -+ call foo (a, 8, 9) -+ res = reshape ((/ 1136.0d0, 1704.0d0, 2272.0d0, 2840.0d0, 3408.0d0, 3976.0d0, & -+& 4544.0d0, 5112.0d0, 2280.0d0, 3040.0d0, 3800.0d0, 4560.0d0, 5320.0d0, 6080.0d0, & -+& 6840.0d0, 7600.0d0, 3936.0d0, 4920.0d0, 5904.0d0, 6888.0d0, 7872.0d0, 8856.0d0, & -+& 9840.0d0, 10824.0d0, 6200.0d0, 7440.0d0, 8680.0d0, 9920.0d0, 11160.0d0, 12400.0d0, & -+& 13640.0d0, 14880.0d0, 9168.0d0, 10696.0d0, 12224.0d0, 13752.0d0, 15280.0d0, 16808.0d0, & -+& 18336.0d0, 19864.0d0, 12936.0d0, 14784.0d0, 16632.0d0, 18480.0d0, 20328.0d0, 22176.0d0, & -+& 24024.0d0, 25872.0d0, 17600.0d0, 19800.0d0, 22000.0d0, 24200.0d0, 26400.0d0, 28600.0d0, & -+& 30800.0d0, 33000.0d0, 23256.0d0, 25840.0d0, 28424.0d0, 31008.0d0, 33592.0d0, 36176.0d0, & -+& 38760.0d0, 41344.0d0, 30000.0d0, 33000.0d0, 36000.0d0, 39000.0d0, 42000.0d0, 45000.0d0, & -+& 48000.0d0, 51000.0d0 /), (/ 8, 9 /)) -+ if (any (a /= res)) call abort -+end -Index: libgomp/testsuite/libgomp.fortran/target6.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/target6.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/target6.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,50 @@ -+! { dg-do run } -+ -+module target6 -+contains -+ subroutine foo (p, v, w, n) -+ double precision, pointer :: p(:), v(:), w(:) -+ double precision :: q(n) -+ integer :: i, n -+ !$omp target data if (n > 256) map (to: v(1:n), w(:n)) map (from: p(1:n), q) -+ !$omp target if (n > 256) -+ !$omp parallel do simd -+ do i = 1, n -+ p(i) = v(i) * w(i) -+ q(i) = p(i) -+ end do -+ !$omp end target -+ !$omp target update if (n > 256) from (p) -+ do i = 1, n -+ if (p(i) /= i * iand (i, 63)) call abort -+ v(i) = v(i) + 1 -+ end do -+ !$omp target update if (n > 256) to (v(1:n)) -+ !$omp target if (n > 256) -+ !$omp parallel do simd -+ do i = 1, n -+ p(i) = v(i) * w(i) -+ end do -+ !$omp end target -+ !$omp end target data -+ do i = 1, n -+ if (q(i) /= (v(i) - 1) * w(i)) call abort -+ if (p(i) /= q(i) + w(i)) call abort -+ end do -+ end subroutine -+end module target6 -+ use target6, only : foo -+ integer :: n, i -+ double precision, pointer :: p(:), v(:), w(:) -+ n = 10000 -+ allocate (p(n), v(n), w(n)) -+ do i = 1, n -+ v(i) = i -+ w(i) = iand (i, 63) -+ end do -+ call foo (p, v, w, n) -+ do i = 1, n -+ if (p(i) /= (i + 1) * iand (i, 63)) call abort -+ end do -+ deallocate (p, v, w) -+end -Index: libgomp/testsuite/libgomp.fortran/cancel-parallel-1.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/cancel-parallel-1.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/cancel-parallel-1.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,10 @@ -+! { dg-do run } -+! { dg-set-target-env-var OMP_CANCELLATION "true" } -+ -+ use omp_lib -+ -+ !$omp parallel num_threads(32) -+ !$omp cancel parallel -+ if (omp_get_cancellation ()) call abort -+ !$omp end parallel -+end -Index: libgomp/testsuite/libgomp.fortran/target8.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/target8.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/target8.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,33 @@ -+! { dg-do run } -+ -+ integer, parameter :: n = 1000 -+ integer, parameter :: c = 100 -+ integer :: i, j -+ real :: a(n) -+ do i = 1, n -+ a(i) = i -+ end do -+ !$omp parallel -+ !$omp single -+ do i = 1, n, c -+ !$omp task shared(a) -+ !$omp target map(a(i:i+c-1)) -+ !$omp parallel do -+ do j = i, i + c - 1 -+ a(j) = foo (a(j)) -+ end do -+ !$omp end target -+ !$omp end task -+ end do -+ !$omp end single -+ !$omp end parallel -+ do i = 1, n -+ if (a(i) /= i + 1) call abort -+ end do -+contains -+ real function foo (x) -+ !$omp declare target -+ real, intent(in) :: x -+ foo = x + 1 -+ end function foo -+end -Index: libgomp/testsuite/libgomp.fortran/cancel-parallel-3.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/cancel-parallel-3.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/cancel-parallel-3.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,38 @@ -+! { dg-do run } -+! { dg-options "-fno-inline -fno-ipa-sra -fno-ipa-cp -fno-ipa-cp-clone" } -+! { dg-set-target-env-var OMP_CANCELLATION "true" } -+ -+ use omp_lib -+ integer :: x, i, j -+ common /x/ x -+ -+ call omp_set_dynamic (.false.) -+ call omp_set_schedule (omp_sched_static, 1) -+ !$omp parallel num_threads(16) private (i, j) -+ call do_some_work -+ !$omp barrier -+ if (omp_get_thread_num ().eq.1) then -+ call sleep (2) -+ !$omp cancellation point parallel -+ end if -+ do j = 3, 16 -+ !$omp do schedule(runtime) -+ do i = 0, j - 1 -+ call do_some_work -+ end do -+ !$omp enddo nowait -+ end do -+ if (omp_get_thread_num ().eq.0) then -+ call sleep (1) -+ !$omp cancel parallel -+ end if -+ !$omp end parallel -+contains -+ subroutine do_some_work -+ integer :: x -+ common /x/ x -+ !$omp atomic -+ x = x + 1 -+ !$omp end atomic -+ endsubroutine do_some_work -+end -Index: libgomp/testsuite/libgomp.fortran/declare-simd-1.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/declare-simd-1.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/declare-simd-1.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,95 @@ -+! { dg-do run { target vect_simd_clones } } -+! { dg-options "-fno-inline" } -+! { dg-additional-options "-msse2" { target sse2_runtime } } -+! { dg-additional-options "-mavx" { target avx_runtime } } -+ -+module declare_simd_1_mod -+ contains -+ real function foo (a, b, c) -+ !$omp declare simd (foo) simdlen (4) uniform (a) linear (b : 5) & -+ !$omp & notinbranch -+ double precision, value :: a -+ real, value :: c -+ !$omp declare simd (foo) -+ integer, value :: b -+ foo = a + b * c -+ end function foo -+end module declare_simd_1_mod -+ use declare_simd_1_mod -+ interface -+ function bar (a, b, c) -+ !$omp declare simd (bar) -+ integer, value :: b -+ real, value :: c -+ real :: bar -+ !$omp declare simd (bar) simdlen (4) linear (b : 2) -+ !$omp declare simd (bar) simdlen (16) inbranch -+ double precision, value :: a -+ end function bar -+ end interface -+ integer :: i -+ double precision :: a(128) -+ real :: b(128), d(128) -+ data d /171., 414., 745., 1164., 1671., 2266., 2949., 3720., 4579., & -+ & 5526., 6561., 7684., 8895., 10194., 11581., 13056., 14619., & -+ & 16270., 18009., 19836., 21751., 23754., 25845., 28024., & -+ & 30291., 32646., 35089., 37620., 40239., 42946., 45741., & -+ & 48624., 51595., 54654., 57801., 61036., 64359., 67770., & -+ & 71269., 74856., 78531., 82294., 86145., 90084., 94111., & -+ & 98226., 102429., 106720., 111099., 115566., 120121., 124764., & -+ & 129495., 134314., 139221., 144216., 149299., 154470., 159729., & -+ & 165076., 170511., 176034., 181645., 187344., 193131., 199006., & -+ & 204969., 211020., 217159., 223386., 229701., 236104., 242595., & -+ & 249174., 255841., 262596., 269439., 276370., 283389., 290496., & -+ & 297691., 304974., 312345., 319804., 327351., 334986., 342709., & -+ & 350520., 358419., 366406., 374481., 382644., 390895., 399234., & -+ & 407661., 416176., 424779., 433470., 442249., 451116., 460071., & -+ & 469114., 478245., 487464., 496771., 506166., 515649., 525220., & -+ & 534879., 544626., 554461., 564384., 574395., 584494., 594681., & -+ & 604956., 615319., 625770., 636309., 646936., 657651., 668454., & -+ & 679345., 690324., 701391., 712546., 723789., 735120./ -+ !$omp simd -+ do i = 1, 128 -+ a(i) = 7.0 * i + 16.0 -+ b(i) = 5.0 * i + 12.0 -+ end do -+ !$omp simd -+ do i = 1, 128 -+ b(i) = foo (a(i), 3, b(i)) -+ end do -+ !$omp simd -+ do i = 1, 128 -+ b(i) = bar (a(i), 2 * i, b(i)) -+ end do -+ if (any (b.ne.d)) call abort -+ !$omp simd -+ do i = 1, 128 -+ b(i) = i * 2.0 -+ end do -+ !$omp simd -+ do i = 1, 128 -+ b(i) = baz (7.0_8, 2, b(i)) -+ end do -+ do i = 1, 128 -+ if (b(i).ne.(7.0 + 4.0 * i)) call abort -+ end do -+contains -+ function baz (x, y, z) -+ !$omp declare simd (baz) simdlen (8) uniform (x, y) -+ !$omp declare simd (baz) -+ integer, value :: y -+ real, value :: z -+ real :: baz -+ double precision, value :: x -+ baz = x + y * z -+ end function baz -+end -+function bar (a, b, c) -+ integer, value :: b -+ real, value :: c -+ real :: bar -+ double precision, value :: a -+ !$omp declare simd (bar) -+ !$omp declare simd (bar) simdlen (4) linear (b : 2) -+ bar = a + b * c -+end function bar -Index: libgomp/testsuite/libgomp.fortran/openmp_version-1.f -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/openmp_version-1.f (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/openmp_version-1.f (.../branches/gcc-4_9-branch) -@@ -4,6 +4,6 @@ - implicit none - include "omp_lib.h" - -- if (openmp_version .ne. 201107) call abort; -+ if (openmp_version .ne. 201307) call abort; - - end program main -Index: libgomp/testsuite/libgomp.fortran/declare-simd-3.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/declare-simd-3.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/declare-simd-3.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,22 @@ -+! Don't compile this anywhere, it is just auxiliary -+! file compiled together with declare-simd-2.f90 -+! to verify inter-CU module handling of omp declare simd. -+! { dg-do compile { target { lp64 && { ! lp64 } } } } -+ -+subroutine bar -+ use declare_simd_2_mod -+ real :: b(128) -+ integer :: i -+ -+ !$omp simd -+ do i = 1, 128 -+ b(i) = i * 2.0 -+ end do -+ !$omp simd -+ do i = 1, 128 -+ b(i) = foo (7.0_8, 5 * i, b(i)) -+ end do -+ do i = 1, 128 -+ if (b(i).ne.(7.0 + 10.0 * i * i)) call abort -+ end do -+end subroutine bar -Index: libgomp/testsuite/libgomp.fortran/udr10.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/udr10.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/udr10.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,32 @@ -+! { dg-do run } -+ -+module udr10m -+ type dt -+ integer :: x = 0 -+ end type -+!$omp declare reduction(.add.:dt:omp_out=omp_out.add.omp_in) -+!$omp declare reduction(+:dt:omp_out=omp_out+omp_in) -+ interface operator(+) -+ module procedure addme -+ end interface -+ interface operator(.add.) -+ module procedure addme -+ end interface -+contains -+ type(dt) function addme (x, y) -+ type (dt), intent (in) :: x, y -+ addme%x = x%x + y%x -+ end function addme -+end module udr10m -+program udr10 -+ use udr10m, only : operator(.localadd.) => operator(.add.), & -+& operator(+), dl => dt -+ type(dl) :: j, k -+ integer :: i -+!$omp parallel do reduction(+:j) reduction(.localadd.:k) -+ do i = 1, 100 -+ j = j .localadd. dl(i) -+ k = k + dl(i * 2) -+ end do -+ if (j%x /= 5050 .or. k%x /= 10100) call abort -+end -Index: libgomp/testsuite/libgomp.fortran/associate2.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/associate2.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/associate2.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,46 @@ -+! { dg-do run } -+ -+program associate2 -+ type dl -+ integer :: i -+ end type -+ type dt -+ integer :: i -+ real :: a(3, 3) -+ type(dl) :: c(3, 3) -+ end type -+ integer :: v(4), i, j, k, l -+ type (dt) :: a(3, 3) -+ v = 15 -+ forall (k = 1:3, l = 1:3) a(k, l)%a(:,:) = 4.5 -+ a(2,1)%a(1,2) = 3.5 -+ i = 2 -+ j = 1 -+ associate(u => v, b => a(i, j)%a) -+!$omp parallel private(v, a) default(none) -+ v = -1 -+ forall (k = 1:3, l = 1:3) a(k, l)%a(:,:) = 2.5 -+ if (v(3) /= -1 .or. u(3) /= 15) call abort -+ if (a(2,1)%a(1,2) /= 2.5 .or. b(1,2) /= 3.5) call abort -+ associate(u => v, b => a(2, 1)%a) -+ if (u(3) /= -1 .or. b(1,2) /= 2.5) call abort -+ end associate -+ if (u(3) /= 15 .or. b(1,2) /= 3.5) call abort -+!$omp end parallel -+ end associate -+ forall (k = 1:3, l = 1:3) a(k, l)%c(:,:)%i = 7 -+ a(1,2)%c(2,1)%i = 9 -+ i = 1 -+ j = 2 -+ associate(d => a(i, j)%c(2,:)%i) -+!$omp parallel private(a) default(none) -+ forall (k = 1:3, l = 1:3) a(k, l)%c(:,:)%i = 15 -+ if (a(1,2)%c(2,1)%i /= 15 .or. d(1) /= 9) call abort -+ if (a(1,2)%c(2,2)%i /= 15 .or. d(2) /= 7) call abort -+ associate(d => a(2,1)%c(2,:)%i) -+ if (d(1) /= 15 .or. d(2) /= 15) call abort -+ end associate -+ if (d(1) /= 9 .or. d(2) /= 7) call abort -+!$omp end parallel -+ end associate -+end program -Index: libgomp/testsuite/libgomp.fortran/udr12.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/udr12.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/udr12.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,76 @@ -+! { dg-do run } -+ -+ interface -+ elemental subroutine sub1 (x, y) -+ integer, intent(in) :: y -+ integer, intent(out) :: x -+ end subroutine -+ elemental function fn2 (x) -+ integer, intent(in) :: x -+ integer :: fn2 -+ end function -+ end interface -+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) -+!$omp declare reduction (bar : integer : omp_out = fn1 (omp_out, omp_in)) & -+!$omp & initializer (sub1 (omp_priv, omp_orig)) -+!$omp declare reduction (baz : integer : sub2 (omp_out, omp_in)) & -+!$omp initializer (omp_priv = fn2 (omp_orig)) -+ interface -+ elemental function fn1 (x, y) -+ integer, intent(in) :: x, y -+ integer :: fn1 -+ end function -+ elemental subroutine sub2 (x, y) -+ integer, intent(in) :: y -+ integer, intent(inout) :: x -+ end subroutine -+ end interface -+ integer :: a(10), b, r -+ a(:) = 0 -+ b = 0 -+ r = 0 -+!$omp parallel reduction (foo : a, b) reduction (+: r) -+ a = a + 2 -+ b = b + 3 -+ r = r + 1 -+!$omp end parallel -+ if (any (a /= 2 * r) .or. b /= 3 * r) call abort -+ a(:) = 0 -+ b = 0 -+ r = 0 -+!$omp parallel reduction (bar : a, b) reduction (+: r) -+ a = a + 2 -+ b = b + 3 -+ r = r + 1 -+!$omp end parallel -+ if (any (a /= 4 * r) .or. b /= 6 * r) call abort -+ a(:) = 0 -+ b = 0 -+ r = 0 -+!$omp parallel reduction (baz : a, b) reduction (+: r) -+ a = a + 2 -+ b = b + 3 -+ r = r + 1 -+!$omp end parallel -+ if (any (a /= 2 * r) .or. b /= 3 * r) call abort -+end -+elemental function fn1 (x, y) -+ integer, intent(in) :: x, y -+ integer :: fn1 -+ fn1 = x + 2 * y -+end function -+elemental subroutine sub1 (x, y) -+ integer, intent(in) :: y -+ integer, intent(out) :: x -+ x = 0 -+end subroutine -+elemental function fn2 (x) -+ integer, intent(in) :: x -+ integer :: fn2 -+ fn2 = x -+end function -+elemental subroutine sub2 (x, y) -+ integer, intent(inout) :: x -+ integer, intent(in) :: y -+ x = x + y -+end subroutine -Index: libgomp/testsuite/libgomp.fortran/udr14.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/udr14.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/udr14.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,50 @@ -+! { dg-do run } -+ -+ type dt -+ integer :: g -+ integer, allocatable :: h(:) -+ end type -+!$omp declare reduction (baz : dt : bar (omp_out, omp_in)) & -+!$omp & initializer (foo (omp_priv, omp_orig)) -+ integer :: r -+ type (dt), allocatable :: a(:) -+ allocate (a(7:8)) -+ a(:)%g = 0 -+ a(7)%h = (/ 0, 0, 0 /) -+ r = 0 -+!$omp parallel reduction(+:r) reduction (baz:a) -+ if (.not.allocated (a)) call abort -+ if (lbound (a, 1) /= 7 .or. ubound (a, 1) /= 8) call abort -+ if (.not.allocated (a(7)%h)) call abort -+ if (allocated (a(8)%h)) call abort -+ if (lbound (a(7)%h, 1) /= 1 .or. ubound (a(7)%h, 1) /= 3) call abort -+ a(:)%g = a(:)%g + 2 -+ a(7)%h = a(7)%h + 3 -+ r = r + 1 -+!$omp end parallel -+ if (.not.allocated (a)) call abort -+ if (lbound (a, 1) /= 7 .or. ubound (a, 1) /= 8) call abort -+ if (.not.allocated (a(7)%h)) call abort -+ if (allocated (a(8)%h)) call abort -+ if (lbound (a(7)%h, 1) /= 1 .or. ubound (a(7)%h, 1) /= 3) call abort -+ if (any (a(:)%g /= 2 * r) .or. any (a(7)%h(:) /= 3 * r)) call abort -+contains -+ subroutine foo (x, y) -+ type (dt), allocatable :: x(:), y(:) -+ if (allocated (x) .neqv. allocated (y)) call abort -+ if (lbound (x, 1) /= lbound (y, 1)) call abort -+ if (ubound (x, 1) /= ubound (y, 1)) call abort -+ if (allocated (x(7)%h) .neqv. allocated (y(7)%h)) call abort -+ if (allocated (x(8)%h) .neqv. allocated (y(8)%h)) call abort -+ if (lbound (x(7)%h, 1) /= lbound (y(7)%h, 1)) call abort -+ if (ubound (x(7)%h, 1) /= ubound (y(7)%h, 1)) call abort -+ x(7)%g = 0 -+ x(7)%h = 0 -+ x(8)%g = 0 -+ end subroutine -+ subroutine bar (x, y) -+ type (dt), allocatable :: x(:), y(:) -+ x(:)%g = x(:)%g + y(:)%g -+ x(7)%h(:) = x(7)%h(:) + y(7)%h(:) -+ end subroutine -+end -Index: libgomp/testsuite/libgomp.fortran/procptr1.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/procptr1.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/procptr1.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,42 @@ -+! { dg-do run } -+ interface -+ integer function foo () -+ end function -+ integer function bar () -+ end function -+ integer function baz () -+ end function -+ end interface -+ procedure(foo), pointer :: ptr -+ integer :: i -+ ptr => foo -+!$omp parallel shared (ptr) -+ if (ptr () /= 1) call abort -+!$omp end parallel -+ ptr => bar -+!$omp parallel firstprivate (ptr) -+ if (ptr () /= 2) call abort -+!$omp end parallel -+!$omp parallel sections lastprivate (ptr) -+!$omp section -+ ptr => foo -+ if (ptr () /= 1) call abort -+!$omp section -+ ptr => bar -+ if (ptr () /= 2) call abort -+!$omp section -+ ptr => baz -+ if (ptr () /= 3) call abort -+!$omp end parallel sections -+ if (ptr () /= 3) call abort -+ if (.not.associated (ptr, baz)) call abort -+end -+integer function foo () -+ foo = 1 -+end function -+integer function bar () -+ bar = 2 -+end function -+integer function baz () -+ baz = 3 -+end function -Index: libgomp/testsuite/libgomp.fortran/aligned1.f03 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/aligned1.f03 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/aligned1.f03 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,133 @@ -+! { dg-do run } -+! { dg-options "-fopenmp -fcray-pointer" } -+ -+ use iso_c_binding, only : c_ptr, c_ptrdiff_t, c_loc -+ interface -+ subroutine foo (x, y, z, w) -+ use iso_c_binding, only : c_ptr -+ real, pointer :: x(:), y(:), w(:) -+ type(c_ptr) :: z -+ end subroutine -+ subroutine bar (x, y, z, w) -+ use iso_c_binding, only : c_ptr -+ real, pointer :: x(:), y(:), w(:) -+ type(c_ptr) :: z -+ end subroutine -+ subroutine baz (x, c) -+ real, pointer :: x(:) -+ real, allocatable :: c(:) -+ end subroutine -+ end interface -+ type dt -+ real, allocatable :: a(:) -+ end type -+ type (dt) :: b(64) -+ real, target :: a(4096+63) -+ real, pointer :: p(:), q(:), r(:), s(:) -+ real, allocatable :: c(:) -+ integer(c_ptrdiff_t) :: o -+ integer :: i -+ o = 64 - mod (loc (a), 64) -+ if (o == 64) o = 0 -+ o = o / sizeof(0.0) -+ p => a(o + 1:o + 1024) -+ q => a(o + 1025:o + 2048) -+ r => a(o + 2049:o + 3072) -+ s => a(o + 3073:o + 4096) -+ do i = 1, 1024 -+ p(i) = i -+ q(i) = i -+ r(i) = i -+ s(i) = i -+ end do -+ call foo (p, q, c_loc (r(1)), s) -+ do i = 1, 1024 -+ if (p(i) /= i * i + 3 * i + 2) call abort -+ p(i) = i -+ end do -+ call bar (p, q, c_loc (r(1)), s) -+ do i = 1, 1024 -+ if (p(i) /= i * i + 3 * i + 2) call abort -+ end do -+ ! Attempt to create 64-byte aligned allocatable -+ do i = 1, 64 -+ allocate (c(1023 + i)) -+ if (iand (loc (c(1)), 63) == 0) exit -+ deallocate (c) -+ allocate (b(i)%a(1023 + i)) -+ allocate (c(1023 + i)) -+ if (iand (loc (c(1)), 63) == 0) exit -+ deallocate (c) -+ end do -+ if (allocated (c)) then -+ do i = 1, 1024 -+ c(i) = 2 * i -+ end do -+ call baz (p, c) -+ do i = 1, 1024 -+ if (p(i) /= i * i + 5 * i + 2) call abort -+ end do -+ end if -+end -+subroutine foo (x, y, z, w) -+ use iso_c_binding, only : c_ptr, c_f_pointer -+ real, pointer :: x(:), y(:), w(:), p(:) -+ type(c_ptr) :: z -+ integer :: i -+ real :: pt(1024) -+ pointer (ip, pt) -+ ip = loc (w) -+!$omp simd aligned (x, y : 64) -+ do i = 1, 1024 -+ x(i) = x(i) * y(i) + 2.0 -+ end do -+!$omp simd aligned (x, z : 64) private (p) -+ do i = 1, 1024 -+ call c_f_pointer (z, p, shape=[1024]) -+ x(i) = x(i) + p(i) -+ end do -+!$omp simd aligned (x, ip : 64) -+ do i = 1, 1024 -+ x(i) = x(i) + 2 * pt(i) -+ end do -+!$omp end simd -+end subroutine -+subroutine bar (x, y, z, w) -+ use iso_c_binding, only : c_ptr, c_f_pointer -+ real, pointer :: x(:), y(:), w(:), a(:), b(:) -+ type(c_ptr) :: z, c -+ integer :: i -+ real :: pt(1024) -+ pointer (ip, pt) -+ ip = loc (w) -+ a => x -+ b => y -+ c = z -+!$omp simd aligned (a, b : 64) -+ do i = 1, 1024 -+ a(i) = a(i) * b(i) + 2.0 -+ end do -+!$omp simd aligned (a, c : 64) -+ do i = 1, 1024 -+ block -+ real, pointer :: p(:) -+ call c_f_pointer (c, p, shape=[1024]) -+ a(i) = a(i) + p(i) -+ end block -+ end do -+!$omp simd aligned (a, ip : 64) -+ do i = 1, 1024 -+ a(i) = a(i) + 2 * pt(i) -+ end do -+!$omp end simd -+end subroutine -+subroutine baz (x, c) -+ real, pointer :: x(:) -+ real, allocatable :: c(:) -+ integer :: i -+!$omp simd aligned (x, c : 64) -+ do i = 1, 1024 -+ x(i) = x(i) + c(i) -+ end do -+!$omp end simd -+end subroutine baz -Index: libgomp/testsuite/libgomp.fortran/cancel-do-2.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/cancel-do-2.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/cancel-do-2.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,90 @@ -+! { dg-do run } -+! { dg-options "-fno-inline -fno-ipa-sra -fno-ipa-cp -fno-ipa-cp-clone" } -+! { dg-set-target-env-var OMP_CANCELLATION "true" } -+ -+ use omp_lib -+ integer :: i -+ logical :: x(5) -+ -+ x(:) = .false. -+ x(1) = .true. -+ x(3) = .true. -+ if (omp_get_cancellation ()) call foo (x) -+contains -+ subroutine foo (x) -+ use omp_lib -+ logical :: x(5) -+ integer :: v, w, i -+ -+ v = 0 -+ w = 0 -+ !$omp parallel num_threads (32) shared (v, w) -+ !$omp do -+ do i = 0, 999 -+ !$omp cancel do if (x(1)) -+ call abort -+ end do -+ !$omp do -+ do i = 0, 999 -+ !$omp cancel do if (x(2)) -+ !$omp atomic -+ v = v + 1 -+ !$omp endatomic -+ enddo -+ !$omp do -+ do i = 0, 999 -+ !$omp cancel do if (x(3)) -+ !$omp atomic -+ w = w + 8 -+ !$omp end atomic -+ end do -+ !$omp do -+ do i = 0, 999 -+ !$omp cancel do if (x(4)) -+ !$omp atomic -+ v = v + 2 -+ !$omp end atomic -+ end do -+ !$omp end do -+ !$omp end parallel -+ if (v.ne.3000.or.w.ne.0) call abort -+ !$omp parallel num_threads (32) shared (v, w) -+ ! None of these cancel directives should actually cancel anything, -+ ! but the compiler shouldn't know that and thus should use cancellable -+ ! barriers at the end of all the workshares. -+ !$omp cancel parallel if (omp_get_thread_num ().eq.1.and.x(5)) -+ !$omp do -+ do i = 0, 999 -+ !$omp cancel do if (x(1)) -+ call abort -+ end do -+ !$omp cancel parallel if (omp_get_thread_num ().eq.2.and.x(5)) -+ !$omp do -+ do i = 0, 999 -+ !$omp cancel do if (x(2)) -+ !$omp atomic -+ v = v + 1 -+ !$omp endatomic -+ enddo -+ !$omp cancel parallel if (omp_get_thread_num ().eq.3.and.x(5)) -+ !$omp do -+ do i = 0, 999 -+ !$omp cancel do if (x(3)) -+ !$omp atomic -+ w = w + 8 -+ !$omp end atomic -+ end do -+ !$omp cancel parallel if (omp_get_thread_num ().eq.4.and.x(5)) -+ !$omp do -+ do i = 0, 999 -+ !$omp cancel do if (x(4)) -+ !$omp atomic -+ v = v + 2 -+ !$omp end atomic -+ end do -+ !$omp end do -+ !$omp cancel parallel if (omp_get_thread_num ().eq.5.and.x(5)) -+ !$omp end parallel -+ if (v.ne.6000.or.w.ne.0) call abort -+ end subroutine -+end -Index: libgomp/testsuite/libgomp.fortran/alloc-comp-2.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/alloc-comp-2.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/alloc-comp-2.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,367 @@ -+! { dg-do run } -+! Don't cycle by default through all options, just test -O0 and -O2, -+! as this is quite large test. -+! { dg-skip-if "" { ! run_expensive_tests } { "*" } { "-O0" "-O2" } } -+ -+module m -+ type dl -+ integer :: a, b -+ integer, allocatable :: c(:,:) -+ integer :: d, e -+ integer, allocatable :: f -+ end type -+ type dt -+ integer :: g -+ type (dl), allocatable :: h(:) -+ integer :: i -+ type (dl) :: j(2, 2) -+ type (dl), allocatable :: k -+ end type -+contains -+ subroutine ver_dl (obj, val, c, cl1, cu1, cl2, cu2, f) -+ type (dl), intent (in) :: obj -+ integer, intent (in) :: val, cl1, cu1, cl2, cu2 -+ logical, intent (in) :: c, f -+ if ((c .neqv. allocated (obj%c)) .or. (f .neqv. allocated (obj%f))) call abort -+ if (c) then -+ if (lbound (obj%c, 1) /= cl1 .or. ubound (obj%c, 1) /= cu1) call abort -+ if (lbound (obj%c, 2) /= cl2 .or. ubound (obj%c, 2) /= cu2) call abort -+ end if -+ if (val /= 0) then -+ if (obj%a /= val .or. obj%b /= val) call abort -+ if (obj%d /= val .or. obj%e /= val) call abort -+ if (c) then -+ if (any (obj%c /= val)) call abort -+ end if -+ if (f) then -+ if (obj%f /= val) call abort -+ end if -+ end if -+ end subroutine ver_dl -+ subroutine ver_dt (obj, val, h, hl, hu, k, c, cl1, cu1, cl2, cu2, f) -+ type (dt), intent (in) :: obj -+ integer, intent (in) :: val, hl, hu, cl1, cu1, cl2, cu2 -+ logical, intent (in) :: h, k, c, f -+ integer :: i, j -+ if ((h .neqv. allocated (obj%h)) .or. (k .neqv. allocated (obj%k))) call abort -+ if (h) then -+ if (lbound (obj%h, 1) /= hl .or. ubound (obj%h, 1) /= hu) call abort -+ do i = hl, hu -+ call ver_dl (obj%h(i), val, c, cl1, cu1, cl2, cu2, f) -+ end do -+ end if -+ do i = 1, 2 -+ do j = 1, 2 -+ call ver_dl (obj%j(i, j), val, c, cl1, cu1, cl2, cu2, f) -+ end do -+ end do -+ if (k) call ver_dl (obj%k, val, c, cl1, cu1, cl2, cu2, f) -+ if (val /= 0) then -+ if (obj%g /= val .or. obj%i /= val) call abort -+ end if -+ end subroutine ver_dt -+ subroutine alloc_dl (obj, val, c, cl1, cu1, cl2, cu2, f) -+ type (dl), intent (inout) :: obj -+ integer, intent (in) :: val, cl1, cu1, cl2, cu2 -+ logical, intent (in) :: c, f -+ if (val /= 0) then -+ obj%a = val -+ obj%b = val -+ obj%d = val -+ obj%e = val -+ end if -+ if (allocated (obj%c)) deallocate (obj%c) -+ if (c) then -+ allocate (obj%c(cl1:cu1, cl2:cu2)) -+ if (val /= 0) obj%c = val -+ end if -+ if (f) then -+ if (.not.allocated (obj%f)) allocate (obj%f) -+ if (val /= 0) obj%f = val -+ else -+ if (allocated (obj%f)) deallocate (obj%f) -+ end if -+ end subroutine alloc_dl -+ subroutine alloc_dt (obj, val, h, hl, hu, k, c, cl1, cu1, cl2, cu2, f) -+ type (dt), intent (inout) :: obj -+ integer, intent (in) :: val, hl, hu, cl1, cu1, cl2, cu2 -+ logical, intent (in) :: h, k, c, f -+ integer :: i, j -+ if (val /= 0) then -+ obj%g = val -+ obj%i = val -+ end if -+ if (allocated (obj%h)) deallocate (obj%h) -+ if (h) then -+ allocate (obj%h(hl:hu)) -+ do i = hl, hu -+ call alloc_dl (obj%h(i), val, c, cl1, cu1, cl2, cu2, f) -+ end do -+ end if -+ do i = 1, 2 -+ do j = 1, 2 -+ call alloc_dl (obj%j(i, j), val, c, cl1, cu1, cl2, cu2, f) -+ end do -+ end do -+ if (k) then -+ if (.not.allocated (obj%k)) allocate (obj%k) -+ call alloc_dl (obj%k, val, c, cl1, cu1, cl2, cu2, f) -+ else -+ if (allocated (obj%k)) deallocate (obj%k) -+ end if -+ end subroutine alloc_dt -+end module m -+ use m -+ type (dt), allocatable :: y -+ call foo (y) -+contains -+ subroutine foo (y) -+ use m -+ type (dt), allocatable :: x, y, z(:,:) -+ logical, parameter :: F = .false. -+ logical, parameter :: T = .true. -+ logical :: l -+!$omp parallel private (x, y, z) -+ if (allocated (x) .or. allocated (y) .or. allocated (z)) call abort -+!$omp end parallel -+!$omp parallel firstprivate (x, y, z) -+ if (allocated (x) .or. allocated (y) .or. allocated (z)) call abort -+!$omp end parallel -+ l = F -+!$omp parallel sections lastprivate (x, y, z) firstprivate (l) -+!$omp section -+ if (.not. l) then -+ if (allocated (x) .or. allocated (y) .or. allocated (z)) call abort -+ end if -+!$omp section -+ if (.not. l) then -+ if (allocated (x) .or. allocated (y) .or. allocated (z)) call abort -+ end if -+ allocate (x, y, z(-3:-3,2:3)) -+ call alloc_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call alloc_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call ver_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call alloc_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call alloc_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+!$omp section -+!$omp end parallel sections -+ if (.not.allocated (x) .or. .not.allocated (y)) call abort -+ if (.not.allocated (z)) call abort -+ if (lbound (z, 1) /= -3 .or. ubound (z, 1) /= -3) call abort -+ if (lbound (z, 2) /= 2 .or. ubound (z, 2) /= 3) call abort -+ call ver_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call alloc_dt (x, 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (x, 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (y, 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (y, 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+!$omp parallel private (x, y, z) -+ call ver_dt (x, 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (y, 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (y, 14, T, 3, 4, F, T, 1, 1, 2, 4, T) -+ call ver_dt (y, 14, T, 3, 4, F, T, 1, 1, 2, 4, T) -+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (z(-3,3), 14, T, 3, 4, F, T, 1, 1, 2, 4, T) -+ call ver_dt (z(-3,3), 14, T, 3, 4, F, T, 1, 1, 2, 4, T) -+!$omp end parallel -+ call ver_dt (x, 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (y, 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (y, 14, T, 3, 4, F, T, 1, 1, 2, 4, T) -+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (z(-3,3), 14, T, 3, 4, F, T, 1, 1, 2, 4, T) -+!$omp parallel private (x, y, z) -+ call ver_dt (x, 0, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (y, 0, T, 3, 4, F, T, 1, 1, 2, 4, T) -+ deallocate (x%h, x%k) -+ deallocate (y%h) -+ allocate (y%k) -+ call ver_dt (z(-3,2), 0, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (z(-3,3), 0, T, 3, 4, F, T, 1, 1, 2, 4, T) -+ deallocate (z(-3,2)%h, z(-3,2)%k) -+ deallocate (z(-3,3)%h) -+ allocate (z(-3,3)%k) -+!$omp end parallel -+ call alloc_dt (x, 5, T, 1, 2, F, T, 2, 3, -2, -2, F) -+ call alloc_dt (y, 15, F, 0, 0, T, T, 2, 2, 2, 2, T) -+ call alloc_dt (z(-3,2), 5, T, 1, 2, F, T, 2, 3, -2, -2, F) -+ call alloc_dt (z(-3,3), 15, F, 0, 0, T, T, 2, 2, 2, 2, T) -+!$omp parallel firstprivate (x, y, z) -+ call ver_dt (x, 5, T, 1, 2, F, T, 2, 3, -2, -2, F) -+ call alloc_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (y, 15, F, 0, 0, T, T, 2, 2, 2, 2, T) -+ call alloc_dt (y, 4, T, 3, 4, T, T, 1, 1, 2, 4, T) -+ call ver_dt (y, 4, T, 3, 4, T, T, 1, 1, 2, 4, T) -+ call ver_dt (z(-3,2), 5, T, 1, 2, F, T, 2, 3, -2, -2, F) -+ call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (z(-3,3), 15, F, 0, 0, T, T, 2, 2, 2, 2, T) -+ call alloc_dt (z(-3,3), 4, T, 3, 4, T, T, 1, 1, 2, 4, T) -+ call ver_dt (z(-3,3), 4, T, 3, 4, T, T, 1, 1, 2, 4, T) -+!$omp end parallel -+ call ver_dt (x, 5, T, 1, 2, F, T, 2, 3, -2, -2, F) -+ call alloc_dt (x, 4, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (y, 15, F, 0, 0, T, T, 2, 2, 2, 2, T) -+ call alloc_dt (y, 16, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (z(-3,2), 5, T, 1, 2, F, T, 2, 3, -2, -2, F) -+ call alloc_dt (z(-3,2), 4, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (z(-3,3), 15, F, 0, 0, T, T, 2, 2, 2, 2, T) -+ call alloc_dt (z(-3,3), 16, F, 0, 0, F, F, 0, 0, 0, 0, F) -+!$omp parallel firstprivate (x, y, z) -+ call ver_dt (x, 4, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (y, 16, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (y, 17, T, 1, 2, F, T, 2, 2, 3, 3, F) -+ call ver_dt (y, 17, T, 1, 2, F, T, 2, 2, 3, 3, F) -+ call ver_dt (z(-3,2), 4, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (z(-3,3), 16, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (z(-3,3), 17, T, 1, 2, F, T, 2, 2, 3, 3, F) -+ call ver_dt (z(-3,3), 17, T, 1, 2, F, T, 2, 2, 3, 3, F) -+!$omp end parallel -+ call ver_dt (x, 4, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (y, 16, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (y, 18, T, 0, 1, T, T, 0, 1, 0, 1, T) -+ call ver_dt (z(-3,2), 4, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (z(-3,3), 16, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (z(-3,3), 18, T, 0, 1, T, T, 0, 1, 0, 1, T) -+ l = F -+!$omp parallel sections lastprivate (x, y, z) firstprivate (l) -+!$omp section -+ if (l) then -+ call ver_dt (x, 9, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (y, 21, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ call ver_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ else -+ call ver_dt (x, 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (y, 0, T, 0, 1, T, T, 0, 1, 0, 1, T) -+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (z(-3,3), 0, T, 0, 1, T, T, 0, 1, 0, 1, T) -+ end if -+ l = T -+ call alloc_dt (x, 7, T, 1, 1, T, T, 1, 2, 3, 3, T) -+ call ver_dt (x, 7, T, 1, 1, T, T, 1, 2, 3, 3, T) -+ call alloc_dt (y, 20, T, 0, 0, F, T, 2, 2, 3, 4, F) -+ call ver_dt (y, 20, T, 0, 0, F, T, 2, 2, 3, 4, F) -+ call alloc_dt (z(-3,2), 7, T, 1, 1, T, T, 1, 2, 3, 3, T) -+ call ver_dt (z(-3,2), 7, T, 1, 1, T, T, 1, 2, 3, 3, T) -+ call alloc_dt (z(-3,3), 20, T, 0, 0, F, T, 2, 2, 3, 4, F) -+ call ver_dt (z(-3,3), 20, T, 0, 0, F, T, 2, 2, 3, 4, F) -+!$omp section -+ if (l) then -+ call ver_dt (x, 7, T, 1, 1, T, T, 1, 2, 3, 3, T) -+ call ver_dt (y, 20, T, 0, 0, F, T, 2, 2, 3, 4, F) -+ call ver_dt (z(-3,2), 7, T, 1, 1, T, T, 1, 2, 3, 3, T) -+ call ver_dt (z(-3,3), 20, T, 0, 0, F, T, 2, 2, 3, 4, F) -+ else -+ call ver_dt (x, 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (y, 0, T, 0, 1, T, T, 0, 1, 0, 1, T) -+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (z(-3,3), 0, T, 0, 1, T, T, 0, 1, 0, 1, T) -+ end if -+ l = T -+ call alloc_dt (x, 9, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (x, 9, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call alloc_dt (y, 21, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ call ver_dt (y, 21, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ call alloc_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call alloc_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ call ver_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T) -+!$omp section -+!$omp end parallel sections -+ call ver_dt (x, 9, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (y, 21, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ call ver_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T) -+!$omp parallel sections lastprivate (x, y, z) firstprivate (l) -+!$omp section -+ if (l) then -+ call ver_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ else -+ call ver_dt (x, 0, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (y, 0, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ call ver_dt (z(-3,2), 0, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (z(-3,3), 0, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ end if -+ l = T -+ call alloc_dt (x, 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call ver_dt (x, 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call alloc_dt (y, 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+ call ver_dt (y, 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+ call alloc_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call ver_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call alloc_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+ call ver_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+!$omp section -+ if (l) then -+ call ver_dt (x, 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call ver_dt (y, 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+ call ver_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call ver_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+ else -+ call ver_dt (x, 0, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (y, 0, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ call ver_dt (z(-3,2), 0, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (z(-3,3), 0, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ end if -+ l = T -+ call alloc_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call alloc_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call ver_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call alloc_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call alloc_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+!$omp section -+!$omp end parallel sections -+ call ver_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+!$omp parallel private (x, y, z) -+ call ver_dt (x, 0, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (y, 0, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call ver_dt (z(-3,2), 0, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (z(-3,3), 0, T, 0, 1, T, T, 2, 2, 2, 2, F) -+!$omp single -+ call alloc_dt (x, 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call alloc_dt (y, 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+ call alloc_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call alloc_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+!$omp end single copyprivate (x, y, z) -+ call ver_dt (x, 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call ver_dt (y, 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+ call ver_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call ver_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+!$omp end parallel -+ call ver_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ end subroutine foo -+end -Index: libgomp/testsuite/libgomp.fortran/depend-1.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/depend-1.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/depend-1.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,203 @@ -+! { dg-do run } -+ -+ call dep () -+ call dep2 () -+ call dep3 () -+ call firstpriv () -+ call antidep () -+ call antidep2 () -+ call antidep3 () -+ call outdep () -+ call concurrent () -+ call concurrent2 () -+ call concurrent3 () -+contains -+ subroutine dep -+ integer :: x -+ x = 1 -+ !$omp parallel -+ !$omp single -+ !$omp task shared (x) depend(out: x) -+ x = 2 -+ !$omp end task -+ !$omp task shared (x) depend(in: x) -+ if (x.ne.2) call abort -+ !$omp end task -+ !$omp end single -+ !$omp end parallel -+ end subroutine dep -+ -+ subroutine dep2 -+ integer :: x -+ !$omp parallel -+ !$omp single private (x) -+ x = 1 -+ !$omp task shared (x) depend(out: x) -+ x = 2 -+ !$omp end task -+ !$omp task shared (x) depend(in: x) -+ if (x.ne.2) call abort -+ !$omp end task -+ !$omp taskwait -+ !$omp end single -+ !$omp end parallel -+ end subroutine dep2 -+ -+ subroutine dep3 -+ integer :: x -+ !$omp parallel private (x) -+ x = 1 -+ !$omp single -+ !$omp task shared (x) depend(out: x) -+ x = 2 -+ !$omp endtask -+ !$omp task shared (x) depend(in: x) -+ if (x.ne.2) call abort -+ !$omp endtask -+ !$omp endsingle -+ !$omp endparallel -+ end subroutine dep3 -+ -+ subroutine firstpriv -+ integer :: x -+ !$omp parallel private (x) -+ !$omp single -+ x = 1 -+ !$omp task depend(out: x) -+ x = 2 -+ !$omp end task -+ !$omp task depend(in: x) -+ if (x.ne.1) call abort -+ !$omp end task -+ !$omp end single -+ !$omp end parallel -+ end subroutine firstpriv -+ -+ subroutine antidep -+ integer :: x -+ x = 1 -+ !$omp parallel -+ !$omp single -+ !$omp task shared(x) depend(in: x) -+ if (x.ne.1) call abort -+ !$omp end task -+ !$omp task shared(x) depend(out: x) -+ x = 2 -+ !$omp end task -+ !$omp end single -+ !$omp end parallel -+ end subroutine antidep -+ -+ subroutine antidep2 -+ integer :: x -+ !$omp parallel private (x) -+ !$omp single -+ x = 1 -+ !$omp taskgroup -+ !$omp task shared(x) depend(in: x) -+ if (x.ne.1) call abort -+ !$omp end task -+ !$omp task shared(x) depend(out: x) -+ x = 2 -+ !$omp end task -+ !$omp end taskgroup -+ !$omp end single -+ !$omp end parallel -+ end subroutine antidep2 -+ -+ subroutine antidep3 -+ integer :: x -+ !$omp parallel -+ x = 1 -+ !$omp single -+ !$omp task shared(x) depend(in: x) -+ if (x.ne.1) call abort -+ !$omp end task -+ !$omp task shared(x) depend(out: x) -+ x = 2 -+ !$omp end task -+ !$omp end single -+ !$omp end parallel -+ end subroutine antidep3 -+ -+ subroutine outdep -+ integer :: x -+ !$omp parallel private (x) -+ !$omp single -+ x = 0 -+ !$omp task shared(x) depend(out: x) -+ x = 1 -+ !$omp end task -+ !$omp task shared(x) depend(out: x) -+ x = 2 -+ !$omp end task -+ !$omp taskwait -+ if (x.ne.2) call abort -+ !$omp end single -+ !$omp end parallel -+ end subroutine outdep -+ -+ subroutine concurrent -+ integer :: x -+ x = 1 -+ !$omp parallel -+ !$omp single -+ !$omp task shared (x) depend(out: x) -+ x = 2 -+ !$omp end task -+ !$omp task shared (x) depend(in: x) -+ if (x.ne.2) call abort -+ !$omp end task -+ !$omp task shared (x) depend(in: x) -+ if (x.ne.2) call abort -+ !$omp end task -+ !$omp task shared (x) depend(in: x) -+ if (x.ne.2) call abort -+ !$omp end task -+ !$omp end single -+ !$omp end parallel -+ end subroutine concurrent -+ -+ subroutine concurrent2 -+ integer :: x -+ !$omp parallel private (x) -+ !$omp single -+ x = 1 -+ !$omp task shared (x) depend(out: x) -+ x = 2; -+ !$omp end task -+ !$omp task shared (x) depend(in: x) -+ if (x.ne.2) call abort -+ !$omp end task -+ !$omp task shared (x) depend(in: x) -+ if (x.ne.2) call abort -+ !$omp end task -+ !$omp task shared (x) depend(in: x) -+ if (x.ne.2) call abort -+ !$omp end task -+ !$omp taskwait -+ !$omp end single -+ !$omp end parallel -+ end subroutine concurrent2 -+ -+ subroutine concurrent3 -+ integer :: x -+ !$omp parallel private (x) -+ x = 1 -+ !$omp single -+ !$omp task shared (x) depend(out: x) -+ x = 2 -+ !$omp end task -+ !$omp task shared (x) depend(in: x) -+ if (x.ne.2) call abort -+ !$omp end task -+ !$omp task shared (x) depend(in: x) -+ if (x.ne.2) call abort -+ !$omp end task -+ !$omp task shared (x) depend(in: x) -+ if (x.ne.2) call abort -+ !$omp end task -+ !$omp end single -+ !$omp end parallel -+ end subroutine concurrent3 -+end -Index: libgomp/testsuite/libgomp.fortran/depend-3.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/depend-3.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/depend-3.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,42 @@ -+! { dg-do run } -+ -+ integer :: x(2, 3) -+ integer, allocatable :: z(:, :) -+ allocate (z(-2:3, 2:4)) -+ call foo (x, z) -+contains -+ subroutine foo (x, z) -+ integer :: x(:, :), y -+ integer, allocatable :: z(:, :) -+ y = 1 -+ !$omp parallel shared (x, y, z) -+ !$omp single -+ !$omp taskgroup -+ !$omp task depend(in: x) -+ if (y.ne.1) call abort -+ !$omp end task -+ !$omp task depend(out: x(1:2, 1:3)) -+ y = 2 -+ !$omp end task -+ !$omp end taskgroup -+ !$omp taskgroup -+ !$omp task depend(in: z) -+ if (y.ne.2) call abort -+ !$omp end task -+ !$omp task depend(out: z(-2:3, 2:4)) -+ y = 3 -+ !$omp end task -+ !$omp end taskgroup -+ !$omp taskgroup -+ !$omp task depend(in: x) -+ if (y.ne.3) call abort -+ !$omp end task -+ !$omp task depend(out: x(1:, 1:)) -+ y = 4 -+ !$omp end task -+ !$omp end taskgroup -+ !$omp end single -+ !$omp end parallel -+ if (y.ne.4) call abort -+ end subroutine -+end -Index: libgomp/testsuite/libgomp.fortran/simd1.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/simd1.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/simd1.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,35 @@ -+! { dg-do run } -+! { dg-additional-options "-msse2" { target sse2_runtime } } -+! { dg-additional-options "-mavx" { target avx_runtime } } -+ -+ type dt -+ integer :: x = 0 -+ end type -+ type (dt) :: t -+ integer :: i, j, k, l, r, s, a(30) -+ integer, target :: q(30) -+ integer, pointer :: p(:) -+ !$omp declare reduction (foo : integer : & -+ !$omp & omp_out = omp_out + omp_in) initializer (omp_priv = 0) -+ !$omp declare reduction (+ : dt : omp_out%x = omp_out%x & -+ !$omp & + omp_in%x) -+ a(:) = 1 -+ q(:) = 1 -+ p => q -+ r = 0 -+ j = 10 -+ k = 20 -+ s = 0 -+ !$omp simd safelen (8) reduction(+:r, t) linear(j, k : 2) & -+ !$omp& private (l) aligned(p : 4) reduction(foo:s) -+ do i = 1, 30 -+ l = j + k + a(i) + p(i) -+ r = r + l -+ j = j + 2 -+ k = k + 2 -+ s = s + l -+ t%x = t%x + l -+ end do -+ if (r.ne.2700.or.j.ne.70.or.k.ne.80.or.s.ne.2700) call abort -+ if (t%x.ne.2700) call abort -+end -Index: libgomp/testsuite/libgomp.fortran/simd3.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/simd3.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/simd3.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,109 @@ -+! { dg-do run } -+! { dg-additional-options "-msse2" { target sse2_runtime } } -+! { dg-additional-options "-mavx" { target avx_runtime } } -+ -+ integer :: a(1024), b(1024), k, m, i, s, t -+ k = 4 -+ m = 2 -+ t = 1 -+ do i = 1, 1024 -+ a(i) = i - 513 -+ b(i) = modulo (i - 52, 39) -+ if (i.lt.52.and.b(i).ne.0) b(i) = b(i) - 39 -+ end do -+ s = foo (b) -+ do i = 1, 1024 -+ if (a(i).ne.((i - 513) * b(i))) call abort -+ if (i.lt.52.and.modulo (i - 52, 39).ne.0) then -+ if (b(i).ne.(modulo (i - 52, 39) - 39)) call abort -+ else -+ if (b(i).ne.(modulo (i - 52, 39))) call abort -+ end if -+ a(i) = i - 513 -+ end do -+ if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) call abort -+ k = 4 -+ m = 2 -+ t = 1 -+ s = bar (b) -+ do i = 1, 1024 -+ if (a(i).ne.((i - 513) * b(i))) call abort -+ if (i.lt.52.and.modulo (i - 52, 39).ne.0) then -+ if (b(i).ne.(modulo (i - 52, 39) - 39)) call abort -+ else -+ if (b(i).ne.(modulo (i - 52, 39))) call abort -+ end if -+ a(i) = i - 513 -+ end do -+ if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) call abort -+ k = 4 -+ m = 2 -+ t = 1 -+ s = baz (b) -+ do i = 1, 1024 -+ if (a(i).ne.((i - 513) * b(i))) call abort -+ if (i.lt.52.and.modulo (i - 52, 39).ne.0) then -+ if (b(i).ne.(modulo (i - 52, 39) - 39)) call abort -+ else -+ if (b(i).ne.(modulo (i - 52, 39))) call abort -+ end if -+ end do -+ if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) call abort -+contains -+ function foo (p) -+ integer :: p(1024), u, v, i, s, foo -+ s = 0 -+ !$omp parallel -+ !$omp do simd linear(k : m + 1) reduction(+: s) lastprivate(u, v) & -+ !$omp & schedule (static, 32) -+ do i = 1, 1024 -+ a(i) = a(i) * p(i) -+ u = p(i) + k -+ k = k + m + 1 -+ v = p(i) + k -+ s = s + p(i) + k -+ end do -+ !$omp end do simd -+ !$omp end parallel -+ if (i.ne.1025) call abort -+ if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) call abort -+ foo = s -+ end function foo -+ function bar (p) -+ integer :: p(1024), u, v, i, s, bar -+ s = 0 -+ !$omp parallel -+ !$omp do simd linear(k : m + 1) reduction(+: s) lastprivate(u, v) & -+ !$omp & schedule (dynamic, 32) -+ do i = 1, 1024, t -+ a(i) = a(i) * p(i) -+ u = p(i) + k -+ k = k + m + 1 -+ v = p(i) + k -+ s = s + p(i) + k -+ end do -+ !$omp end do simd -+ !$omp endparallel -+ if (i.ne.1025) call abort -+ if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) call abort -+ bar = s -+ end function bar -+ function baz (p) -+ integer :: p(1024), u, v, i, s, baz -+ s = 0 -+ !$omp parallel -+ !$omp do simd linear(k : m + 1) reduction(+: s) lastprivate(u, v) & -+ !$omp & linear(i : t) schedule (static, 8) -+ do i = 1, 1024, t -+ a(i) = a(i) * p(i) -+ u = p(i) + k -+ k = k + m + 1 -+ v = p(i) + k -+ s = s + p(i) + k -+ end do -+ !$omp end parallel -+ if (i.ne.1025) call abort -+ if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) call abort -+ baz = s -+ end function baz -+end -Index: libgomp/testsuite/libgomp.fortran/simd5.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/simd5.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/simd5.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,124 @@ -+! { dg-do run } -+! { dg-additional-options "-msse2" { target sse2_runtime } } -+! { dg-additional-options "-mavx" { target avx_runtime } } -+ -+ integer :: i, j, b, c -+ c = 0 -+ i = 4 -+ j = 4 -+ b = 7 -+!$omp simd linear(b:2) reduction(+:c) -+ do i = 0, 63 -+ c = c + b - (7 + 2 * i) -+ b = b + 2 -+ end do -+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 64 * 2) call abort -+ i = 4 -+ j = 4 -+ b = 7 -+!$omp simd linear(b:3) reduction(+:c) -+ do i = 0, 63, 4 -+ c = c + b - (7 + i / 4 * 3) -+ b = b + 3 -+ end do -+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 16 * 3) call abort -+ i = 4 -+ j = 4 -+ b = 7 -+!$omp simd linear(i) linear(b:2) reduction(+:c) -+ do i = 0, 63 -+ c = c + b - (7 + 2 * i) -+ b = b + 2 -+ end do -+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 64 * 2) call abort -+ i = 4 -+ j = 4 -+ b = 7 -+!$omp simd linear(i:4) linear(b:3) reduction(+:c) -+ do i = 0, 63, 4 -+ c = c + b - (7 + i / 4 * 3) -+ b = b + 3 -+ end do -+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 16 * 3) call abort -+ i = 4 -+ j = 4 -+ b = 7 -+!$omp simd collapse(2) linear(b:2) reduction(+:c) -+ do i = 0, 7 -+ do j = 0, 7 -+ c = c + b - (7 + 2 * j + 2 * 8 * i) -+ b = b + 2 -+ end do -+ end do -+ if (c /= 0 .or. i /= 8 .or. j /= 8 .or. b /= 7 + 64 * 2) call abort -+ i = 4 -+ j = 4 -+ b = 7 -+!$omp simd collapse(2) linear(b:2) reduction(+:c) lastprivate (i, j) -+ do i = 0, 7 -+ do j = 0, 7 -+ c = c + b - (7 + 2 * j + 2 * 8 * i) -+ b = b + 2 -+ end do -+ end do -+ if (c /= 0 .or. i /= 8 .or. j /= 8 .or. b /= 7 + 64 * 2) call abort -+ i = 4 -+ j = 4 -+ b = 7 -+!$omp parallel do simd schedule (static, 4) linear(b:2) reduction(+:c) -+ do i = 0, 63 -+ c = c + b - (7 + 2 * i) -+ b = b + 2 -+ end do -+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 64 * 2) call abort -+ i = 4 -+ j = 4 -+ b = 7 -+!$omp parallel do simd schedule (static, 4) linear(b:3) reduction(+:c) -+ do i = 0, 63, 4 -+ c = c + b - (7 + i / 4 * 3) -+ b = b + 3 -+ end do -+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 16 * 3) call abort -+ i = 4 -+ j = 4 -+ b = 7 -+!$omp parallel do simd schedule (static, 4) linear(i) linear(b:2) reduction(+:c) -+ do i = 0, 63 -+ c = c + b - (7 + 2 * i) -+ b = b + 2 -+ end do -+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 64 * 2) call abort -+ i = 4 -+ j = 4 -+ b = 7 -+!$omp parallel do simd schedule (static, 4) linear(i:4) linear(b:3) reduction(+:c) -+ do i = 0, 63, 4 -+ c = c + b - (7 + i / 4 * 3) -+ b = b + 3 -+ end do -+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 16 * 3) call abort -+ i = 4 -+ j = 4 -+ b = 7 -+!$omp parallel do simd schedule (static, 4) collapse(2) linear(b:2) reduction(+:c) -+ do i = 0, 7 -+ do j = 0, 7 -+ c = c + b - (7 + 2 * j + 2 * 8 * i) -+ b = b + 2 -+ end do -+ end do -+ if (c /= 0 .or. i /= 8 .or. j /= 8 .or. b /= 7 + 64 * 2) call abort -+ i = 4 -+ j = 4 -+ b = 7 -+!$omp parallel do simd schedule (static, 4) collapse(2) linear(b:2) & -+!$omp & reduction(+:c) lastprivate (i, j) -+ do i = 0, 7 -+ do j = 0, 7 -+ c = c + b - (7 + 2 * j + 2 * 8 * i) -+ b = b + 2 -+ end do -+ end do -+ if (c /= 0 .or. i /= 8 .or. j /= 8 .or. b /= 7 + 64 * 2) call abort -+end -Index: libgomp/testsuite/libgomp.fortran/simd7.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/simd7.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/simd7.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,172 @@ -+! { dg-do run } -+! { dg-additional-options "-msse2" { target sse2_runtime } } -+! { dg-additional-options "-mavx" { target avx_runtime } } -+ -+subroutine foo (d, e, f, g, m, n) -+ integer :: i, j, b(2:9), c(3:n), d(:), e(2:n), f(2:,3:), n -+ integer, allocatable :: g(:), h(:), k, m -+ logical :: l -+ l = .false. -+ allocate (h(2:7)) -+ i = 4; j = 4; b = 7; c = 8; d = 9; e = 10; f = 11; g = 12; h = 13; k = 14; m = 15 -+!$omp simd linear(b)linear(c:2)linear(d:3)linear(e:4)linear(f:5)linear(g:6) & -+!$omp & linear(h:7)linear(k:8)linear(m:9) reduction(.or.:l) -+ do i = 0, 63 -+ l = l .or. .not.allocated (g) .or. .not.allocated (h) -+ l = l .or. .not.allocated (k) .or. .not.allocated (m) -+ l = l .or. any (b /= 7 + i) .or. any (c /= 8 + 2 * i) -+ l = l .or. any (d /= 9 + 3 * i) .or. any (e /= 10 + 4 * i) -+ l = l .or. any (f /= 11 + 5 * i) .or. any (g /= 12 + 6 * i) -+ l = l .or. any (h /= 13 + 7 * i) .or. (k /= 14 + 8 * i) -+ l = l .or. (m /= 15 + 9 * i) -+ l = l .or. (lbound (b, 1) /= 2) .or. (ubound (b, 1) /= 9) -+ l = l .or. (lbound (c, 1) /= 3) .or. (ubound (c, 1) /= n) -+ l = l .or. (lbound (d, 1) /= 1) .or. (ubound (d, 1) /= 17) -+ l = l .or. (lbound (e, 1) /= 2) .or. (ubound (e, 1) /= n) -+ l = l .or. (lbound (f, 1) /= 2) .or. (ubound (f, 1) /= 3) -+ l = l .or. (lbound (f, 2) /= 3) .or. (ubound (f, 2) /= 5) -+ l = l .or. (lbound (g, 1) /= 7) .or. (ubound (g, 1) /= 10) -+ l = l .or. (lbound (h, 1) /= 2) .or. (ubound (h, 1) /= 7) -+ b = b + 1; c = c + 2; d = d + 3; e = e + 4; f = f + 5; g = g + 6 -+ h = h + 7; k = k + 8; m = m + 9 -+ end do -+ if (l .or. i /= 64) call abort -+ if (any (b /= 7 + 64) .or. any (c /= 8 + 2 * 64)) call abort -+ if (any (d /= 9 + 3 * 64) .or. any (e /= 10 + 4 * 64)) call abort -+ if (any (f /= 11 + 5 * 64) .or. any (g /= 12 + 6 * 64)) call abort -+ if (any (h /= 13 + 7 * 64) .or. (k /= 14 + 8 * 64)) call abort -+ if (m /= 15 + 9 * 64) call abort -+ if ((lbound (b, 1) /= 2) .or. (ubound (b, 1) /= 9)) call abort -+ if ((lbound (c, 1) /= 3) .or. (ubound (c, 1) /= n)) call abort -+ if ((lbound (d, 1) /= 1) .or. (ubound (d, 1) /= 17)) call abort -+ if ((lbound (e, 1) /= 2) .or. (ubound (e, 1) /= n)) call abort -+ if ((lbound (f, 1) /= 2) .or. (ubound (f, 1) /= 3)) call abort -+ if ((lbound (f, 2) /= 3) .or. (ubound (f, 2) /= 5)) call abort -+ if ((lbound (g, 1) /= 7) .or. (ubound (g, 1) /= 10)) call abort -+ if ((lbound (h, 1) /= 2) .or. (ubound (h, 1) /= 7)) call abort -+ i = 4; j = 4; b = 7; c = 8; d = 9; e = 10; f = 11; g = 12; h = 13; k = 14; m = 15 -+!$omp simd linear(b)linear(c:2)linear(d:3)linear(e:4)linear(f:5)linear(g:6) & -+!$omp & linear(h:7)linear(k:8)linear(m:9) reduction(.or.:l) collapse(2) -+ do i = 0, 7 -+ do j = 0, 7 -+ l = l .or. .not.allocated (g) .or. .not.allocated (h) -+ l = l .or. .not.allocated (k) .or. .not.allocated (m) -+ l = l .or. any (b /= 7 + (8 * i + j)) .or. any (c /= 8 + 2 * (8 * i + j)) -+ l = l .or. any (d /= 9 + 3 * (8 * i + j)) .or. any (e /= 10 + 4 * (8 * i + j)) -+ l = l .or. any (f /= 11 + 5 * (8 * i + j)) .or. any (g /= 12 + 6 * (8 * i + j)) -+ l = l .or. any (h /= 13 + 7 * (8 * i + j)) .or. (k /= 14 + 8 * (8 * i + j)) -+ l = l .or. (m /= 15 + 9 * (8 * i + j)) -+ l = l .or. (lbound (b, 1) /= 2) .or. (ubound (b, 1) /= 9) -+ l = l .or. (lbound (c, 1) /= 3) .or. (ubound (c, 1) /= n) -+ l = l .or. (lbound (d, 1) /= 1) .or. (ubound (d, 1) /= 17) -+ l = l .or. (lbound (e, 1) /= 2) .or. (ubound (e, 1) /= n) -+ l = l .or. (lbound (f, 1) /= 2) .or. (ubound (f, 1) /= 3) -+ l = l .or. (lbound (f, 2) /= 3) .or. (ubound (f, 2) /= 5) -+ l = l .or. (lbound (g, 1) /= 7) .or. (ubound (g, 1) /= 10) -+ l = l .or. (lbound (h, 1) /= 2) .or. (ubound (h, 1) /= 7) -+ b = b + 1; c = c + 2; d = d + 3; e = e + 4; f = f + 5; g = g + 6 -+ h = h + 7; k = k + 8; m = m + 9 -+ end do -+ end do -+ if (l .or. i /= 8 .or. j /= 8) call abort -+ if (any (b /= 7 + 64) .or. any (c /= 8 + 2 * 64)) call abort -+ if (any (d /= 9 + 3 * 64) .or. any (e /= 10 + 4 * 64)) call abort -+ if (any (f /= 11 + 5 * 64) .or. any (g /= 12 + 6 * 64)) call abort -+ if (any (h /= 13 + 7 * 64) .or. (k /= 14 + 8 * 64)) call abort -+ if (m /= 15 + 9 * 64) call abort -+ if ((lbound (b, 1) /= 2) .or. (ubound (b, 1) /= 9)) call abort -+ if ((lbound (c, 1) /= 3) .or. (ubound (c, 1) /= n)) call abort -+ if ((lbound (d, 1) /= 1) .or. (ubound (d, 1) /= 17)) call abort -+ if ((lbound (e, 1) /= 2) .or. (ubound (e, 1) /= n)) call abort -+ if ((lbound (f, 1) /= 2) .or. (ubound (f, 1) /= 3)) call abort -+ if ((lbound (f, 2) /= 3) .or. (ubound (f, 2) /= 5)) call abort -+ if ((lbound (g, 1) /= 7) .or. (ubound (g, 1) /= 10)) call abort -+ if ((lbound (h, 1) /= 2) .or. (ubound (h, 1) /= 7)) call abort -+ i = 4; j = 4; b = 7; c = 8; d = 9; e = 10; f = 11; g = 12; h = 13; k = 14; m = 15 -+!$omp parallel do simd linear(b)linear(c:2)linear(d:3)linear(e:4)linear(f:5) & -+!$omp & linear(g:6)linear(h:7)linear(k:8)linear(m:9) reduction(.or.:l) -+ do i = 0, 63 -+ l = l .or. .not.allocated (g) .or. .not.allocated (h) -+ l = l .or. .not.allocated (k) .or. .not.allocated (m) -+ l = l .or. any (b /= 7 + i) .or. any (c /= 8 + 2 * i) -+ l = l .or. any (d /= 9 + 3 * i) .or. any (e /= 10 + 4 * i) -+ l = l .or. any (f /= 11 + 5 * i) .or. any (g /= 12 + 6 * i) -+ l = l .or. any (h /= 13 + 7 * i) .or. (k /= 14 + 8 * i) -+ l = l .or. (m /= 15 + 9 * i) -+ l = l .or. (lbound (b, 1) /= 2) .or. (ubound (b, 1) /= 9) -+ l = l .or. (lbound (c, 1) /= 3) .or. (ubound (c, 1) /= n) -+ l = l .or. (lbound (d, 1) /= 1) .or. (ubound (d, 1) /= 17) -+ l = l .or. (lbound (e, 1) /= 2) .or. (ubound (e, 1) /= n) -+ l = l .or. (lbound (f, 1) /= 2) .or. (ubound (f, 1) /= 3) -+ l = l .or. (lbound (f, 2) /= 3) .or. (ubound (f, 2) /= 5) -+ l = l .or. (lbound (g, 1) /= 7) .or. (ubound (g, 1) /= 10) -+ l = l .or. (lbound (h, 1) /= 2) .or. (ubound (h, 1) /= 7) -+ b = b + 1; c = c + 2; d = d + 3; e = e + 4; f = f + 5; g = g + 6 -+ h = h + 7; k = k + 8; m = m + 9 -+ end do -+ if (l .or. i /= 64) call abort -+ if (any (b /= 7 + 64) .or. any (c /= 8 + 2 * 64)) call abort -+ if (any (d /= 9 + 3 * 64) .or. any (e /= 10 + 4 * 64)) call abort -+ if (any (f /= 11 + 5 * 64) .or. any (g /= 12 + 6 * 64)) call abort -+ if (any (h /= 13 + 7 * 64) .or. (k /= 14 + 8 * 64)) call abort -+ if (m /= 15 + 9 * 64) call abort -+ if ((lbound (b, 1) /= 2) .or. (ubound (b, 1) /= 9)) call abort -+ if ((lbound (c, 1) /= 3) .or. (ubound (c, 1) /= n)) call abort -+ if ((lbound (d, 1) /= 1) .or. (ubound (d, 1) /= 17)) call abort -+ if ((lbound (e, 1) /= 2) .or. (ubound (e, 1) /= n)) call abort -+ if ((lbound (f, 1) /= 2) .or. (ubound (f, 1) /= 3)) call abort -+ if ((lbound (f, 2) /= 3) .or. (ubound (f, 2) /= 5)) call abort -+ if ((lbound (g, 1) /= 7) .or. (ubound (g, 1) /= 10)) call abort -+ if ((lbound (h, 1) /= 2) .or. (ubound (h, 1) /= 7)) call abort -+ i = 4; j = 4; b = 7; c = 8; d = 9; e = 10; f = 11; g = 12; h = 13; k = 14; m = 15 -+!$omp parallel do simd linear(b)linear(c:2)linear(d:3)linear(e:4)linear(f:5) & -+!$omp & linear(g:6)linear(h:7)linear(k:8)linear(m:9) reduction(.or.:l) collapse(2) -+ do i = 0, 7 -+ do j = 0, 7 -+ l = l .or. .not.allocated (g) .or. .not.allocated (h) -+ l = l .or. .not.allocated (k) .or. .not.allocated (m) -+ l = l .or. any (b /= 7 + (8 * i + j)) .or. any (c /= 8 + 2 * (8 * i + j)) -+ l = l .or. any (d /= 9 + 3 * (8 * i + j)) .or. any (e /= 10 + 4 * (8 * i + j)) -+ l = l .or. any (f /= 11 + 5 * (8 * i + j)) .or. any (g /= 12 + 6 * (8 * i + j)) -+ l = l .or. any (h /= 13 + 7 * (8 * i + j)) .or. (k /= 14 + 8 * (8 * i + j)) -+ l = l .or. (m /= 15 + 9 * (8 * i + j)) -+ l = l .or. (lbound (b, 1) /= 2) .or. (ubound (b, 1) /= 9) -+ l = l .or. (lbound (c, 1) /= 3) .or. (ubound (c, 1) /= n) -+ l = l .or. (lbound (d, 1) /= 1) .or. (ubound (d, 1) /= 17) -+ l = l .or. (lbound (e, 1) /= 2) .or. (ubound (e, 1) /= n) -+ l = l .or. (lbound (f, 1) /= 2) .or. (ubound (f, 1) /= 3) -+ l = l .or. (lbound (f, 2) /= 3) .or. (ubound (f, 2) /= 5) -+ l = l .or. (lbound (g, 1) /= 7) .or. (ubound (g, 1) /= 10) -+ l = l .or. (lbound (h, 1) /= 2) .or. (ubound (h, 1) /= 7) -+ b = b + 1; c = c + 2; d = d + 3; e = e + 4; f = f + 5; g = g + 6 -+ h = h + 7; k = k + 8; m = m + 9 -+ end do -+ end do -+ if (l .or. i /= 8 .or. j /= 8) call abort -+ if (any (b /= 7 + 64) .or. any (c /= 8 + 2 * 64)) call abort -+ if (any (d /= 9 + 3 * 64) .or. any (e /= 10 + 4 * 64)) call abort -+ if (any (f /= 11 + 5 * 64) .or. any (g /= 12 + 6 * 64)) call abort -+ if (any (h /= 13 + 7 * 64) .or. (k /= 14 + 8 * 64)) call abort -+ if (m /= 15 + 9 * 64) call abort -+ if ((lbound (b, 1) /= 2) .or. (ubound (b, 1) /= 9)) call abort -+ if ((lbound (c, 1) /= 3) .or. (ubound (c, 1) /= n)) call abort -+ if ((lbound (d, 1) /= 1) .or. (ubound (d, 1) /= 17)) call abort -+ if ((lbound (e, 1) /= 2) .or. (ubound (e, 1) /= n)) call abort -+ if ((lbound (f, 1) /= 2) .or. (ubound (f, 1) /= 3)) call abort -+ if ((lbound (f, 2) /= 3) .or. (ubound (f, 2) /= 5)) call abort -+ if ((lbound (g, 1) /= 7) .or. (ubound (g, 1) /= 10)) call abort -+ if ((lbound (h, 1) /= 2) .or. (ubound (h, 1) /= 7)) call abort -+end subroutine -+ -+ interface -+ subroutine foo (d, e, f, g, m, n) -+ integer :: d(:), e(2:n), f(2:,3:), n -+ integer, allocatable :: g(:), m -+ end subroutine -+ end interface -+ integer, parameter :: n = 8 -+ integer :: d(2:18), e(3:n+1), f(5:6,7:9) -+ integer, allocatable :: g(:), m -+ allocate (g(7:10)) -+ call foo (d, e, f, g, m, n) -+end -Index: libgomp/testsuite/libgomp.fortran/allocatable10.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/allocatable10.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/allocatable10.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,112 @@ -+! { dg-do run } -+ -+ integer, allocatable :: a, b(:), c(:,:) -+ integer :: i -+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) & -+!$omp & initializer (omp_priv = 0) -+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort -+ allocate (a, b(6:9), c(3, 8:9)) -+ a = 0 -+ b = 0 -+ c = 0 -+ if (.not.allocated (a)) call abort -+ if (.not.allocated (b) .or. size (b) /= 4) call abort -+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort -+ if (.not.allocated (c) .or. size (c) /= 6) call abort -+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort -+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort -+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort -+!$omp parallel do reduction (+:a, b, c) -+ do i = 1, 10 -+ if (.not.allocated (a)) call abort -+ if (.not.allocated (b) .or. size (b) /= 4) call abort -+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort -+ if (.not.allocated (c) .or. size (c) /= 6) call abort -+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort -+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort -+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort -+ a = a + i -+ b = b + 2 * i -+ c = c + 3 * i -+ end do -+ if (.not.allocated (a)) call abort -+ if (.not.allocated (b) .or. size (b) /= 4) call abort -+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort -+ if (.not.allocated (c) .or. size (c) /= 6) call abort -+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort -+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort -+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort -+ if (a /= 55 .or. any (b /= 110) .or. any (c /= 165)) call abort -+ a = 0 -+ b = 0 -+ c = 0 -+!$omp parallel do reduction (foo : a, b, c) -+ do i = 1, 10 -+ if (.not.allocated (a)) call abort -+ if (.not.allocated (b) .or. size (b) /= 4) call abort -+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort -+ if (.not.allocated (c) .or. size (c) /= 6) call abort -+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort -+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort -+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort -+ a = a + i -+ b = b + 2 * i -+ c = c + 3 * i -+ end do -+ if (.not.allocated (a)) call abort -+ if (.not.allocated (b) .or. size (b) /= 4) call abort -+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort -+ if (.not.allocated (c) .or. size (c) /= 6) call abort -+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort -+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort -+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort -+ if (a /= 55 .or. any (b /= 110) .or. any (c /= 165)) call abort -+ a = 0 -+ b = 0 -+ c = 0 -+!$omp simd reduction (+:a, b, c) -+ do i = 1, 10 -+ if (.not.allocated (a)) call abort -+ if (.not.allocated (b) .or. size (b) /= 4) call abort -+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort -+ if (.not.allocated (c) .or. size (c) /= 6) call abort -+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort -+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort -+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort -+ a = a + i -+ b = b + 2 * i -+ c = c + 3 * i -+ end do -+ if (.not.allocated (a)) call abort -+ if (.not.allocated (b) .or. size (b) /= 4) call abort -+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort -+ if (.not.allocated (c) .or. size (c) /= 6) call abort -+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort -+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort -+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort -+ if (a /= 55 .or. any (b /= 110) .or. any (c /= 165)) call abort -+ a = 0 -+ b = 0 -+ c = 0 -+!$omp simd reduction (foo : a, b, c) -+ do i = 1, 10 -+ if (.not.allocated (a)) call abort -+ if (.not.allocated (b) .or. size (b) /= 4) call abort -+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort -+ if (.not.allocated (c) .or. size (c) /= 6) call abort -+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort -+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort -+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort -+ a = a + i -+ b = b + 2 * i -+ c = c + 3 * i -+ end do -+ if (.not.allocated (a)) call abort -+ if (.not.allocated (b) .or. size (b) /= 4) call abort -+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort -+ if (.not.allocated (c) .or. size (c) /= 6) call abort -+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort -+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort -+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort -+ if (a /= 55 .or. any (b /= 110) .or. any (c /= 165)) call abort -+end -Index: libgomp/testsuite/libgomp.fortran/allocatable12.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/allocatable12.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/allocatable12.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,74 @@ -+! { dg-do run } -+ -+ integer, allocatable :: a, b(:), c(:,:) -+ logical :: l -+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort -+ -+!$omp parallel private (a, b, c, l) -+ l = .false. -+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort -+ -+!$omp single -+ allocate (a, b(6:9), c(3, 8:9)) -+ a = 4 -+ b = 5 -+ c = 6 -+!$omp end single copyprivate (a, b, c) -+ -+ if (.not.allocated (a)) call abort -+ if (.not.allocated (b) .or. size (b) /= 4) call abort -+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort -+ if (.not.allocated (c) .or. size (c) /= 6) call abort -+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort -+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort -+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort -+ if (a /= 4 .or. any (b /= 5) .or. any (c /= 6)) call abort -+ -+!$omp single -+ deallocate (a, b, c) -+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort -+ allocate (a, b(0:4), c(3, 2:7)) -+ a = 1 -+ b = 2 -+ c = 3 -+!$omp end single copyprivate (a, b, c) -+ -+ if (.not.allocated (a)) call abort -+ if (.not.allocated (b) .or. size (b) /= 5) call abort -+ if (lbound (b, 1) /= 0 .or. ubound (b, 1) /= 4) call abort -+ if (.not.allocated (c) .or. size (c) /= 18) call abort -+ if (size (c, 1) /= 3 .or. size (c, 2) /= 6) call abort -+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort -+ if (lbound (c, 2) /= 2 .or. ubound (c, 2) /= 7) call abort -+ if (a /= 1 .or. any (b /= 2) .or. any (c /= 3)) call abort -+ -+!$omp single -+ l = .true. -+ deallocate (a, b, c) -+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort -+ allocate (a, b(2:6), c(3:5, 3:8)) -+ a = 7 -+ b = 8 -+ c = 9 -+!$omp end single copyprivate (a, b, c) -+ -+ if (.not.allocated (a)) call abort -+ if (.not.allocated (b) .or. size (b) /= 5) call abort -+ if (l) then -+ if (lbound (b, 1) /= 2 .or. ubound (b, 1) /= 6) call abort -+ else -+ if (lbound (b, 1) /= 0 .or. ubound (b, 1) /= 4) call abort -+ end if -+ if (.not.allocated (c) .or. size (c) /= 18) call abort -+ if (size (c, 1) /= 3 .or. size (c, 2) /= 6) call abort -+ if (l) then -+ if (lbound (c, 1) /= 3 .or. ubound (c, 1) /= 5) call abort -+ if (lbound (c, 2) /= 3 .or. ubound (c, 2) /= 8) call abort -+ else -+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort -+ if (lbound (c, 2) /= 2 .or. ubound (c, 2) /= 7) call abort -+ end if -+ if (a /= 7 .or. any (b /= 8) .or. any (c /= 9)) call abort -+ -+!$omp end parallel -+end -Index: libgomp/testsuite/libgomp.fortran/udr1.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/udr1.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/udr1.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,51 @@ -+! { dg-do run } -+ -+module udr1 -+ type dt -+ integer :: x = 7 -+ integer :: y = 9 -+ end type -+end module udr1 -+ use udr1, only : dt -+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) -+ integer :: i, j -+!$omp declare reduction (bar : integer : & -+!$omp & omp_out = omp_out + iand (omp_in, -4)) initializer (omp_priv = 3) -+ type (dt) :: d -+!$omp declare reduction (+ : dt : omp_out%x = omp_out%x & -+!$omp & + iand (omp_in%x, -8)) -+!$omp declare reduction (foo : dt : omp_out%x = iand (omp_in%x, -8) & -+!$omp & + omp_out%x) initializer (omp_priv = dt (5, 21)) -+ interface operator (+) -+ function notdefined(x, y) -+ use udr1, only : dt -+ type(dt), intent (in) :: x, y -+ type(dt) :: notdefined -+ end function -+ end interface -+ j = 0 -+!$omp parallel do reduction (foo : j) -+ do i = 1, 100 -+ j = j + i -+ end do -+ if (j .ne. 5050) call abort -+ j = 3 -+!$omp parallel do reduction (bar : j) -+ do i = 1, 100 -+ j = j + 4 * i -+ end do -+ if (j .ne. (5050 * 4 + 3)) call abort -+!$omp parallel do reduction (+ : d) -+ do i = 1, 100 -+ if (d%y .ne. 9) call abort -+ d%x = d%x + 8 * i -+ end do -+ if (d%x .ne. (5050 * 8 + 7) .or. d%y .ne. 9) call abort -+ d = dt (5, 21) -+!$omp parallel do reduction (foo : d) -+ do i = 1, 100 -+ if (d%y .ne. 21) call abort -+ d%x = d%x + 8 * i -+ end do -+ if (d%x .ne. (5050 * 8 + 5) .or. d%y .ne. 21) call abort -+end -Index: libgomp/testsuite/libgomp.fortran/omp_atomic5.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/omp_atomic5.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/omp_atomic5.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,59 @@ -+! { dg-do run } -+ integer (kind = 4) :: a, a2 -+ integer (kind = 2) :: b, b2 -+ real :: c -+ double precision :: d, d2, c2 -+ integer, dimension (10) :: e -+ e(:) = 5 -+ e(7) = 9 -+!$omp atomic write seq_cst -+ a = 1 -+!$omp atomic seq_cst, write -+ b = 2 -+!$omp atomic write, seq_cst -+ c = 3 -+!$omp atomic seq_cst write -+ d = 4 -+!$omp atomic capture seq_cst -+ a2 = a -+ a = a + 4 -+!$omp end atomic -+!$omp atomic capture, seq_cst -+ b = b - 18 -+ b2 = b -+!$omp end atomic -+!$omp atomic seq_cst, capture -+ c2 = c -+ c = 2.0 * c -+!$omp end atomic -+!$omp atomic seq_cst capture -+ d = d / 2.0 -+ d2 = d -+!$omp end atomic -+ if (a2 .ne. 1 .or. b2 .ne. -16 .or. c2 .ne. 3 .or. d2 .ne. 2) call abort -+!$omp atomic read seq_cst -+ a2 = a -+!$omp atomic seq_cst, read -+ c2 = c -+ if (a2 .ne. 5 .or. b2 .ne. -16 .or. c2 .ne. 6 .or. d2 .ne. 2) call abort -+ a2 = 10 -+ if (a2 .ne. 10) call abort -+!$omp atomic capture -+ a2 = a -+ a = e(1) + e(6) + e(7) * 2 -+!$omp endatomic -+ if (a2 .ne. 5) call abort -+!$omp atomic read -+ a2 = a -+!$omp end atomic -+ if (a2 .ne. 28) call abort -+!$omp atomic capture seq_cst -+ b2 = b -+ b = e(1) + e(7) + e(5) * 2 -+!$omp end atomic -+ if (b2 .ne. -16) call abort -+!$omp atomic seq_cst, read -+ b2 = b -+!$omp end atomic -+ if (b2 .ne. 24) call abort -+end -Index: libgomp/testsuite/libgomp.fortran/udr3.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/udr3.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/udr3.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,38 @@ -+! { dg-do run } -+ -+!$omp declare reduction (foo : character(kind=1, len=*) & -+!$omp & : omp_out = trim(omp_out) // omp_in) initializer (omp_priv = '') -+!$omp declare reduction (bar : character(kind=1, len=:) & -+!$omp & : omp_out = trim(omp_in) // omp_out) initializer (omp_priv = '') -+!$omp declare reduction (baz : character(kind=1, len=1) & -+!$omp & : omp_out = char (ichar (omp_out) + ichar (omp_in) & -+!$omp & - ichar ('0'))) initializer (omp_priv = '0') -+!$omp declare reduction (baz : character(kind=1, len=2) & -+!$omp & : omp_out = char (ichar (omp_out(1:1)) + ichar (omp_in(1:1)) & -+!$omp & - ichar ('0')) // char (ichar (omp_out(2:2)) + & -+!$omp & ichar (omp_in(2:2)) - ichar ('0'))) initializer (omp_priv = '00') -+ character(kind=1, len=64) :: c, d -+ character(kind = 1, len=1) :: e -+ character(kind = 1, len=1+1) :: f -+ integer :: i -+ c = '' -+ d = '' -+ e = '0' -+ f = '00' -+!$omp parallel do reduction (foo : c) reduction (bar : d) & -+!$omp & reduction (baz : e, f) -+ do i = 1, 64 -+ c = trim(c) // char (ichar ('0') + i) -+ d = char (ichar ('0') + i) // d -+ e = char (ichar (e) + mod (i, 3)) -+ f = char (ichar (f(1:1)) + mod (i, 2)) & -+& // char (ichar (f(2:2)) + mod (i, 3)) -+ end do -+ do i = 1, 64 -+ if (index (c, char (ichar ('0') + i)) .eq. 0) call abort -+ if (index (d, char (ichar ('0') + i)) .eq. 0) call abort -+ end do -+ if (e.ne.char (ichar ('0') + 64)) call abort -+ if (f(1:1).ne.char (ichar ('0') + 32)) call abort -+ if (f(2:2).ne.char (ichar ('0') + 64)) call abort -+end -Index: libgomp/testsuite/libgomp.fortran/udr5.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/udr5.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/udr5.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,57 @@ -+! { dg-do run } -+ -+module m -+ interface operator(.add.) -+ module procedure do_add -+ end interface -+ type dt -+ real :: r = 0.0 -+ end type -+contains -+ function do_add(x, y) -+ type (dt), intent (in) :: x, y -+ type (dt) :: do_add -+ do_add%r = x%r + y%r -+ end function -+ subroutine dp_add(x, y) -+ double precision :: x, y -+ x = x + y -+ end subroutine -+ subroutine dp_init(x) -+ double precision :: x -+ x = 0.0 -+ end subroutine -+end module -+ -+program udr5 -+ use m, only : operator(.add.), dt, dp_add, dp_init -+ type(dt) :: xdt, one -+ real :: r -+ integer (kind = 4) :: i4 -+ integer (kind = 8) :: i8 -+ real (kind = 4) :: r4 -+ double precision :: dp -+!$omp declare reduction(.add.:dt:omp_out=omp_out.add.omp_in) -+!$omp declare reduction(foo:integer(4),integer(kind=8),real (kind = 4) & -+!$omp & :omp_out = omp_out + omp_in) initializer (omp_priv = 0) -+!$omp declare reduction(foo:double precision:dp_add (omp_out, omp_in)) & -+!$omp & initializer (dp_init (omp_priv)) -+ -+ one%r = 1.0 -+ r = 0.0 -+ i4 = 0 -+ i8 = 0 -+ r4 = 0.0 -+ call dp_init (dp) -+!$omp parallel reduction(.add.: xdt) reduction(+: r) & -+!$omp & reduction(foo: i4, i8, r4, dp) -+ xdt = xdt.add.one -+ r = r + 1.0 -+ i4 = i4 + 1 -+ i8 = i8 + 1 -+ r4 = r4 + 1.0 -+ call dp_add (dp, 1.0d0) -+!$omp end parallel -+ if (xdt%r .ne. r) call abort -+ if (i4.ne.r.or.i8.ne.r.or.r4.ne.r.or.dp.ne.r) call abort -+end program udr5 -Index: libgomp/testsuite/libgomp.fortran/udr7.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/udr7.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/udr7.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,46 @@ -+! { dg-do run } -+ -+program udr7 -+ implicit none -+ interface -+ elemental subroutine omp_priv (x, y, z) -+ real, intent (in) :: x -+ real, intent (inout) :: y -+ real, intent (in) :: z -+ end subroutine omp_priv -+ elemental real function omp_orig (x) -+ real, intent (in) :: x -+ end function omp_orig -+ end interface -+!$omp declare reduction (omp_priv : real : & -+!$omp & omp_priv (omp_orig (omp_in), omp_out, 1.0)) & -+!$omp & initializer (omp_out (omp_priv, omp_in (omp_orig))) -+ real :: x (2:4, 1:1, -2:0) -+ integer :: i -+ x = 0 -+!$omp parallel do reduction (omp_priv : x) -+ do i = 1, 64 -+ x = x + i -+ end do -+ if (any (x /= 2080.0)) call abort -+contains -+ elemental subroutine omp_out (x, y) -+ real, intent (out) :: x -+ real, intent (in) :: y -+ x = y - 4.0 -+ end subroutine omp_out -+ elemental real function omp_in (x) -+ real, intent (in) :: x -+ omp_in = x + 4.0 -+ end function omp_in -+end program udr7 -+elemental subroutine omp_priv (x, y, z) -+ real, intent (in) :: x -+ real, intent (inout) :: y -+ real, intent (in) :: z -+ y = y + (x - 4.0) + (z - 1.0) -+end subroutine omp_priv -+elemental real function omp_orig (x) -+ real, intent (in) :: x -+ omp_orig = x + 4.0 -+end function omp_orig -Index: libgomp/testsuite/libgomp.fortran/udr9.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/udr9.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/udr9.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,65 @@ -+! { dg-do run } -+ -+module udr9m1 -+ integer, parameter :: a = 6 -+ integer :: b -+!$omp declare reduction (foo : integer : combiner1 (omp_out, omp_in)) & -+!$omp & initializer (initializer1 (omp_priv, omp_orig)) -+!$omp declare reduction (.add. : integer : & -+!$omp & combiner1 (omp_out, omp_in)) & -+!$omp & initializer (initializer1 (omp_priv, omp_orig)) -+ interface operator (.add.) -+ module procedure f1 -+ end interface -+contains -+ integer function f1 (x, y) -+ integer, intent (in) :: x, y -+ f1 = x + y -+ end function f1 -+ elemental subroutine combiner1 (x, y) -+ integer, intent (inout) :: x -+ integer, intent (in) :: y -+ x = x + iand (y, -4) -+ end subroutine -+ subroutine initializer1 (x, y) -+ integer :: x, y -+ if (y .ne. 3) call abort -+ x = y -+ end subroutine -+end module udr9m1 -+module udr9m2 -+ use udr9m1 -+ type dt -+ integer :: x -+ end type -+!$omp declare reduction (+ : dt : combiner2 (omp_in, omp_out)) & -+!$omp & initializer (initializer2 (omp_priv)) -+ interface operator (+) -+ module procedure f2 -+ end interface -+contains -+ type(dt) function f2 (x, y) -+ type(dt), intent (in) :: x, y -+ f2%x = x%x + y%x -+ end function f2 -+ subroutine combiner2 (x, y) -+ type(dt) :: x, y -+ y = y + x -+ end subroutine combiner2 -+ subroutine initializer2 (x) -+ type(dt), intent(out) :: x -+ x%x = 0 -+ end subroutine initializer2 -+end module udr9m2 -+ use udr9m2 -+ integer :: i, j -+ type(dt) :: d -+ j = 3 -+ d%x = 0 -+!$omp parallel do reduction (.add.: j) reduction (+ : d) -+ do i = 1, 100 -+ j = j.add.iand (i, -4) -+ d = d + dt(i) -+ end do -+ if (d%x /= 5050 .or. j /= 4903) call abort -+end -Index: libgomp/testsuite/libgomp.fortran/target1.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/target1.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/target1.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,58 @@ -+! { dg-do run } -+ -+module target1 -+contains -+ subroutine foo (p, v, w, n) -+ double precision, pointer :: p(:), v(:), w(:) -+ double precision :: q(n) -+ integer :: i, n -+ !$omp target if (n > 256) map (to: v(1:n), w(:n)) map (from: p(1:n), q) -+ !$omp parallel do simd -+ do i = 1, n -+ p(i) = v(i) * w(i) -+ q(i) = p(i) -+ end do -+ !$omp end target -+ if (any (p /= q)) call abort -+ do i = 1, n -+ if (p(i) /= i * iand (i, 63)) call abort -+ end do -+ !$omp target data if (n > 256) map (to: v(1:n), w) map (from: p, q) -+ !$omp target if (n > 256) -+ do i = 1, n -+ p(i) = 1.0 -+ q(i) = 2.0 -+ end do -+ !$omp end target -+ !$omp target if (n > 256) -+ do i = 1, n -+ p(i) = p(i) + v(i) * w(i) -+ q(i) = q(i) + v(i) * w(i) -+ end do -+ !$omp end target -+ !$omp target if (n > 256) -+ !$omp teams distribute parallel do simd linear(i:1) -+ do i = 1, n -+ p(i) = p(i) + 2.0 -+ q(i) = q(i) + 3.0 -+ end do -+ !$omp end target -+ !$omp end target data -+ if (any (p + 2.0 /= q)) call abort -+ end subroutine -+end module target1 -+ use target1, only : foo -+ integer :: n, i -+ double precision, pointer :: p(:), v(:), w(:) -+ n = 10000 -+ allocate (p(n), v(n), w(n)) -+ do i = 1, n -+ v(i) = i -+ w(i) = iand (i, 63) -+ end do -+ call foo (p, v, w, n) -+ do i = 1, n -+ if (p(i) /= i * iand (i, 63) + 3) call abort -+ end do -+ deallocate (p, v, w) -+end -Index: libgomp/testsuite/libgomp.fortran/target3.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/target3.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/target3.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,29 @@ -+! { dg-do run } -+ -+module target3 -+contains -+ subroutine foo (f, g) -+ integer :: n -+ integer, pointer :: f, g(:) -+ integer, pointer :: j, k(:) -+ logical :: r -+ nullify (j) -+ k => null () -+ !$omp target map (tofrom: f, g, j, k) map (from: r) -+ r = associated (f) .or. associated (g) -+ r = r .or. associated (j) .or. associated (k) -+ !$omp end target -+ if (r) call abort -+ !$omp target -+ r = associated (f) .or. associated (g) -+ r = r .or. associated (j) .or. associated (k) -+ !$omp end target -+ if (r) call abort -+ end subroutine foo -+end module target3 -+ use target3, only : foo -+ integer, pointer :: f, g(:) -+ f => null () -+ nullify (g) -+ call foo (f, g) -+end -Index: libgomp/testsuite/libgomp.fortran/target5.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/target5.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/target5.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,21 @@ -+! { dg-do compile } -+! { dg-options "-fopenmp" } -+ -+ integer :: r -+ r = 0 -+ call foo (r) -+ if (r /= 11) call abort -+contains -+ subroutine foo (r) -+ integer :: i, r -+ !$omp parallel -+ !$omp single -+ !$omp target teams distribute parallel do reduction (+: r) -+ do i = 1, 10 -+ r = r + 1 -+ end do -+ r = r + 1 -+ !$omp end single -+ !$omp end parallel -+ end subroutine -+end -Index: libgomp/testsuite/libgomp.fortran/target7.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/target7.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/target7.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,38 @@ -+! { dg-do run } -+ -+ interface -+ real function foo (x) -+ !$omp declare target -+ real, intent(in) :: x -+ end function foo -+ end interface -+ integer, parameter :: n = 1000 -+ integer, parameter :: c = 100 -+ integer :: i, j -+ real :: a(n) -+ do i = 1, n -+ a(i) = i -+ end do -+ !$omp parallel -+ !$omp single -+ do i = 1, n, c -+ !$omp task shared(a) -+ !$omp target map(a(i:i+c-1)) -+ !$omp parallel do -+ do j = i, i + c - 1 -+ a(j) = foo (a(j)) -+ end do -+ !$omp end target -+ !$omp end task -+ end do -+ !$omp end single -+ !$omp end parallel -+ do i = 1, n -+ if (a(i) /= i + 1) call abort -+ end do -+end -+real function foo (x) -+ !$omp declare target -+ real, intent(in) :: x -+ foo = x + 1 -+end function foo -Index: libgomp/testsuite/libgomp.fortran/declare-simd-2.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/declare-simd-2.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/declare-simd-2.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,25 @@ -+! { dg-do run { target vect_simd_clones } } -+! { dg-options "-fno-inline" } -+! { dg-additional-sources declare-simd-3.f90 } -+! { dg-additional-options "-msse2" { target sse2_runtime } } -+! { dg-additional-options "-mavx" { target avx_runtime } } -+ -+module declare_simd_2_mod -+ contains -+ real function foo (a, b, c) -+ !$omp declare simd (foo) simdlen (4) uniform (a) linear (b : 5) -+ double precision, value :: a -+ real, value :: c -+ !$omp declare simd (foo) -+ integer, value :: b -+ foo = a + b * c -+ end function foo -+end module declare_simd_2_mod -+ -+ interface -+ subroutine bar () -+ end subroutine bar -+ end interface -+ -+ call bar () -+end -Index: libgomp/testsuite/libgomp.fortran/udr11.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/udr11.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/udr11.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,95 @@ -+! { dg-do run } -+ -+module udr11 -+ type dt -+ integer :: x = 0 -+ end type -+end module udr11 -+ use udr11, only : dt -+!$omp declare reduction(+:dt:omp_out%x=omp_out%x+omp_in%x) -+!$omp declare reduction(-:dt:omp_out%x=omp_out%x+omp_in%x) -+!$omp declare reduction(*:dt:omp_out%x=omp_out%x+omp_in%x) -+!$omp declare reduction(.and.:dt:omp_out%x=omp_out%x+omp_in%x) -+!$omp declare reduction(.or.:dt:omp_out%x=omp_out%x+3*omp_in%x) -+!$omp declare reduction(.eqv.:dt:omp_out%x=omp_out%x+omp_in%x) -+!$omp declare reduction(.neqv.:dt:omp_out%x=omp_out%x+omp_in%x) -+!$omp declare reduction(min:dt:omp_out%x=omp_out%x+omp_in%x) -+!$omp declare reduction(max:dt:omp_out%x=omp_out%x+omp_in%x) -+!$omp declare reduction(iand:dt:omp_out%x=omp_out%x+omp_in%x) -+!$omp declare reduction(ior:dt:omp_out%x=omp_out%x+omp_in%x) -+!$omp declare reduction(ieor:dt:omp_out%x=omp_out%x+omp_in%x) -+ interface operator(.and.) -+ function addme1 (x, y) -+ use udr11, only : dt -+ type (dt), intent (in) :: x, y -+ type(dt) :: addme1 -+ end function addme1 -+ end interface -+ interface operator(.or.) -+ function addme2 (x, y) -+ use udr11, only : dt -+ type (dt), intent (in) :: x, y -+ type(dt) :: addme2 -+ end function addme2 -+ end interface -+ interface operator(.eqv.) -+ function addme3 (x, y) -+ use udr11, only : dt -+ type (dt), intent (in) :: x, y -+ type(dt) :: addme3 -+ end function addme3 -+ end interface -+ interface operator(.neqv.) -+ function addme4 (x, y) -+ use udr11, only : dt -+ type (dt), intent (in) :: x, y -+ type(dt) :: addme4 -+ end function addme4 -+ end interface -+ interface operator(+) -+ function addme5 (x, y) -+ use udr11, only : dt -+ type (dt), intent (in) :: x, y -+ type(dt) :: addme5 -+ end function addme5 -+ end interface -+ interface operator(-) -+ function addme6 (x, y) -+ use udr11, only : dt -+ type (dt), intent (in) :: x, y -+ type(dt) :: addme6 -+ end function addme6 -+ end interface -+ interface operator(*) -+ function addme7 (x, y) -+ use udr11, only : dt -+ type (dt), intent (in) :: x, y -+ type(dt) :: addme7 -+ end function addme7 -+ end interface -+ type(dt) :: j, k, l, m, n, o, p, q, r, s, t, u -+ integer :: i -+!$omp parallel do reduction(.and.:j) reduction(.or.:k) & -+!$omp & reduction(.eqv.:l) reduction(.neqv.:m) & -+!$omp & reduction(min:n) reduction(max:o) & -+!$omp & reduction(iand:p) reduction(ior:q) reduction (ieor:r) & -+!$omp & reduction(+:s) reduction(-:t) reduction(*:u) -+ do i = 1, 100 -+ j%x = j%x + i -+ k%x = k%x + 2 * i -+ l%x = l%x + 3 * i -+ m%x = m%x + i -+ n%x = n%x + 2 * i -+ o%x = o%x + 3 * i -+ p%x = p%x + i -+ q%x = q%x + 2 * i -+ r%x = r%x + 3 * i -+ s%x = s%x + i -+ t%x = t%x + 2 * i -+ u%x = u%x + 3 * i -+ end do -+ if (j%x /= 5050 .or. k%x /= 30300 .or. l%x /= 15150) call abort -+ if (m%x /= 5050 .or. n%x /= 10100 .or. o%x /= 15150) call abort -+ if (p%x /= 5050 .or. q%x /= 10100 .or. r%x /= 15150) call abort -+ if (s%x /= 5050 .or. t%x /= 10100 .or. u%x /= 15150) call abort -+end -Index: libgomp/testsuite/libgomp.fortran/allocatable9.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/allocatable9.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/allocatable9.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,156 @@ -+! { dg-do run } -+ -+ integer, allocatable :: a, b(:), c(:,:) -+ logical :: l -+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort -+!$omp parallel private (a, b, c) -+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort -+ allocate (a, b(-7:-1), c(2:3, 3:5)) -+ if (.not.allocated (a)) call abort -+ if (.not.allocated (b) .or. size (b) /= 7) call abort -+ if (lbound (b, 1) /= -7 .or. ubound (b, 1) /= -1) call abort -+ if (.not.allocated (c) .or. size (c) /= 6) call abort -+ if (size (c, 1) /= 2 .or. size (c, 2) /= 3) call abort -+ if (lbound (c, 1) /= 2 .or. ubound (c, 1) /= 3) call abort -+ if (lbound (c, 2) /= 3 .or. ubound (c, 2) /= 5) call abort -+ a = 4 -+ b = 3 -+ c = 2 -+!$omp end parallel -+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort -+!$omp parallel firstprivate (a, b, c) -+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort -+ allocate (a, b(-7:-1), c(2:3, 3:5)) -+ if (.not.allocated (a)) call abort -+ if (.not.allocated (b) .or. size (b) /= 7) call abort -+ if (lbound (b, 1) /= -7 .or. ubound (b, 1) /= -1) call abort -+ if (.not.allocated (c) .or. size (c) /= 6) call abort -+ if (size (c, 1) /= 2 .or. size (c, 2) /= 3) call abort -+ if (lbound (c, 1) /= 2 .or. ubound (c, 1) /= 3) call abort -+ if (lbound (c, 2) /= 3 .or. ubound (c, 2) /= 5) call abort -+ a = 4 -+ b = 3 -+ c = 2 -+!$omp end parallel -+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort -+ allocate (a, b(6:9), c(3, 8:9)) -+ a = 2 -+ b = 4 -+ c = 5 -+ if (.not.allocated (a)) call abort -+ if (.not.allocated (b) .or. size (b) /= 4) call abort -+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort -+ if (.not.allocated (c) .or. size (c) /= 6) call abort -+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort -+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort -+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort -+!$omp parallel firstprivate (a, b, c) -+ if (.not.allocated (a)) call abort -+ if (.not.allocated (b) .or. size (b) /= 4) call abort -+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort -+ if (.not.allocated (c) .or. size (c) /= 6) call abort -+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort -+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort -+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort -+ if (a /= 2 .or. any (b .ne. 4) .or. any (c .ne. 5)) call abort -+ deallocate (a) -+ if (allocated (a)) call abort -+ allocate (a) -+ a = 8 -+ b = (/ 1, 2, 3 /) -+ c = reshape ((/ 1, 2, 3, 4, 5, 6, 7, 8 /), (/ 2, 4 /)) -+ if (.not.allocated (a)) call abort -+ if (.not.allocated (b) .or. size (b) /= 3) call abort -+ if (lbound (b, 1) /= 1 .or. ubound (b, 1) /= 3) call abort -+ if (.not.allocated (c) .or. size (c) /= 8) call abort -+ if (size (c, 1) /= 2 .or. size (c, 2) /= 4) call abort -+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 2) call abort -+ if (lbound (c, 2) /= 1 .or. ubound (c, 2) /= 4) call abort -+ if (a /= 8 .or. b(2) /= 2 .or. c(1, 2) /= 3) call abort -+!$omp end parallel -+ if (.not.allocated (a)) call abort -+ if (.not.allocated (b) .or. size (b) /= 4) call abort -+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort -+ if (.not.allocated (c) .or. size (c) /= 6) call abort -+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort -+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort -+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort -+ if (a /= 2 .or. any (b .ne. 4) .or. any (c .ne. 5)) call abort -+ l = .false. -+!$omp parallel sections lastprivate (a, b, c) firstprivate (l) -+!$omp section -+ if (.not.allocated (a)) call abort -+ if (l) then -+ if (.not.allocated (b) .or. size (b) /= 6) call abort -+ if (lbound (b, 1) /= 1 .or. ubound (b, 1) /= 6) call abort -+ if (.not.allocated (c) .or. size (c) /= 8) call abort -+ if (size (c, 1) /= 4 .or. size (c, 2) /= 2) call abort -+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 4) call abort -+ if (lbound (c, 2) /= 1 .or. ubound (c, 2) /= 2) call abort -+ if (a /= 12 .or. b(2) /= 8 .or. c(1, 2) /= 5) call abort -+ else -+ if (.not.allocated (b) .or. size (b) /= 4) call abort -+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort -+ if (.not.allocated (c) .or. size (c) /= 6) call abort -+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort -+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort -+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort -+ end if -+ l = .true. -+ deallocate (a) -+ if (allocated (a)) call abort -+ allocate (a) -+ a = 8 -+ b = (/ 1, 2, 3 /) -+ c = reshape ((/ 1, 2, 3, 4, 5, 6, 7, 8 /), (/ 2, 4 /)) -+ if (.not.allocated (a)) call abort -+ if (.not.allocated (b) .or. size (b) /= 3) call abort -+ if (lbound (b, 1) /= 1 .or. ubound (b, 1) /= 3) call abort -+ if (.not.allocated (c) .or. size (c) /= 8) call abort -+ if (size (c, 1) /= 2 .or. size (c, 2) /= 4) call abort -+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 2) call abort -+ if (lbound (c, 2) /= 1 .or. ubound (c, 2) /= 4) call abort -+ if (a /= 8 .or. b(2) /= 2 .or. c(1, 2) /= 3) call abort -+!$omp section -+ if (.not.allocated (a)) call abort -+ if (l) then -+ if (.not.allocated (b) .or. size (b) /= 3) call abort -+ if (lbound (b, 1) /= 1 .or. ubound (b, 1) /= 3) call abort -+ if (.not.allocated (c) .or. size (c) /= 8) call abort -+ if (size (c, 1) /= 2 .or. size (c, 2) /= 4) call abort -+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 2) call abort -+ if (lbound (c, 2) /= 1 .or. ubound (c, 2) /= 4) call abort -+ if (a /= 8 .or. b(2) /= 2 .or. c(1, 2) /= 3) call abort -+ else -+ if (.not.allocated (b) .or. size (b) /= 4) call abort -+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort -+ if (.not.allocated (c) .or. size (c) /= 6) call abort -+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort -+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort -+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort -+ end if -+ l = .true. -+ deallocate (a) -+ if (allocated (a)) call abort -+ allocate (a) -+ a = 12 -+ b = (/ 9, 8, 7, 6, 5, 4 /) -+ c = reshape ((/ 1, 2, 3, 4, 5, 6, 7, 8 /), (/ 4, 2 /)) -+ if (.not.allocated (a)) call abort -+ if (.not.allocated (b) .or. size (b) /= 6) call abort -+ if (lbound (b, 1) /= 1 .or. ubound (b, 1) /= 6) call abort -+ if (.not.allocated (c) .or. size (c) /= 8) call abort -+ if (size (c, 1) /= 4 .or. size (c, 2) /= 2) call abort -+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 4) call abort -+ if (lbound (c, 2) /= 1 .or. ubound (c, 2) /= 2) call abort -+ if (a /= 12 .or. b(2) /= 8 .or. c(1, 2) /= 5) call abort -+!$omp end parallel sections -+ if (.not.allocated (a)) call abort -+ if (.not.allocated (b) .or. size (b) /= 6) call abort -+ if (lbound (b, 1) /= 1 .or. ubound (b, 1) /= 6) call abort -+ if (.not.allocated (c) .or. size (c) /= 8) call abort -+ if (size (c, 1) /= 4 .or. size (c, 2) /= 2) call abort -+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 4) call abort -+ if (lbound (c, 2) /= 1 .or. ubound (c, 2) /= 2) call abort -+ if (a /= 12 .or. b(2) /= 8 .or. c(1, 2) /= 5) call abort -+end -Index: libgomp/testsuite/libgomp.fortran/associate1.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/associate1.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/associate1.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,23 @@ -+! { dg-do run } -+ -+program associate1 -+ integer :: v, i, j -+ real :: a(3, 3) -+ v = 15 -+ a = 4.5 -+ a(2,1) = 3.5 -+ i = 2 -+ j = 1 -+ associate(u => v, b => a(i, j)) -+!$omp parallel private(v, a) default(none) -+ v = -1 -+ a = 2.5 -+ if (v /= -1 .or. u /= 15) call abort -+ if (a(2,1) /= 2.5 .or. b /= 3.5) call abort -+ associate(u => v, b => a(2, 1)) -+ if (u /= -1 .or. b /= 2.5) call abort -+ end associate -+ if (u /= 15 .or. b /= 3.5) call abort -+!$omp end parallel -+ end associate -+end program -Index: libgomp/testsuite/libgomp.fortran/udr13.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/udr13.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/udr13.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,106 @@ -+! { dg-do run } -+ -+ interface -+ subroutine sub1 (x, y) -+ integer, intent(in) :: y(:) -+ integer, intent(out) :: x(:) -+ end subroutine -+ function fn2 (x, m1, m2, n1, n2) -+ integer, intent(in) :: x(:,:), m1, m2, n1, n2 -+ integer :: fn2(m1:m2,n1:n2) -+ end function -+ subroutine sub3 (x, y) -+ integer, allocatable, intent(in) :: y(:,:) -+ integer, allocatable, intent(inout) :: x(:,:) -+ end subroutine -+ end interface -+!$omp declare reduction (foo : integer : sub3 (omp_out, omp_in)) & -+!$omp initializer (omp_priv = fn3 (omp_orig)) -+!$omp declare reduction (bar : integer : omp_out = fn1 (omp_out, omp_in, & -+!$omp & lbound (omp_out, 1), ubound (omp_out, 1))) & -+!$omp & initializer (sub1 (omp_priv, omp_orig)) -+!$omp declare reduction (baz : integer : sub2 (omp_out, omp_in)) & -+!$omp initializer (omp_priv = fn2 (omp_orig, lbound (omp_priv, 1), & -+!$omp ubound (omp_priv, 1), lbound (omp_priv, 2), ubound (omp_priv, 2))) -+ interface -+ function fn1 (x, y, m1, m2) -+ integer, intent(in) :: x(:), y(:), m1, m2 -+ integer :: fn1(m1:m2) -+ end function -+ subroutine sub2 (x, y) -+ integer, intent(in) :: y(:,:) -+ integer, intent(inout) :: x(:,:) -+ end subroutine -+ function fn3 (x) -+ integer, allocatable, intent(in) :: x(:,:) -+ integer, allocatable :: fn3(:,:) -+ end function -+ end interface -+ integer :: a(10), b(3:5,7:9), r -+ integer, allocatable :: c(:,:) -+ a(:) = 0 -+ r = 0 -+!$omp parallel reduction (bar : a) reduction (+: r) -+ if (lbound (a, 1) /= 1 .or. ubound (a, 1) /= 10) call abort -+ a = a + 2 -+ r = r + 1 -+!$omp end parallel -+ if (any (a /= 4 * r) ) call abort -+ b(:,:) = 0 -+ allocate (c (4:6,8:10)) -+ c(:,:) = 0 -+ r = 0 -+!$omp parallel reduction (baz : b, c) reduction (+: r) -+ if (lbound (b, 1) /= 3 .or. ubound (b, 1) /= 5) call abort -+ if (lbound (b, 2) /= 7 .or. ubound (b, 2) /= 9) call abort -+ if (.not. allocated (c)) call abort -+ if (lbound (c, 1) /= 4 .or. ubound (c, 1) /= 6) call abort -+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 10) call abort -+ b = b + 3 -+ c = c + 4 -+ r = r + 1 -+!$omp end parallel -+ if (any (b /= 3 * r) .or. any (c /= 4 * r)) call abort -+ deallocate (c) -+ allocate (c (0:1,7:11)) -+ c(:,:) = 0 -+ r = 0 -+!$omp parallel reduction (foo : c) reduction (+: r) -+ if (.not. allocated (c)) call abort -+ if (lbound (c, 1) /= 0 .or. ubound (c, 1) /= 1) call abort -+ if (lbound (c, 2) /= 7 .or. ubound (c, 2) /= 11) call abort -+ c = c + 5 -+ r = r + 1 -+!$omp end parallel -+ if (any (c /= 10 * r)) call abort -+end -+function fn1 (x, y, m1, m2) -+ integer, intent(in) :: x(:), y(:), m1, m2 -+ integer :: fn1(m1:m2) -+ fn1 = x + 2 * y -+end function -+subroutine sub1 (x, y) -+ integer, intent(in) :: y(:) -+ integer, intent(out) :: x(:) -+ x = 0 -+end subroutine -+function fn2 (x, m1, m2, n1, n2) -+ integer, intent(in) :: x(:,:), m1, m2, n1, n2 -+ integer :: fn2(m1:m2,n1:n2) -+ fn2 = x -+end function -+subroutine sub2 (x, y) -+ integer, intent(inout) :: x(:,:) -+ integer, intent(in) :: y(:,:) -+ x = x + y -+end subroutine -+function fn3 (x) -+ integer, allocatable, intent(in) :: x(:,:) -+ integer, allocatable :: fn3(:,:) -+ fn3 = x -+end function -+subroutine sub3 (x, y) -+ integer, allocatable, intent(inout) :: x(:,:) -+ integer, allocatable, intent(in) :: y(:,:) -+ x = x + 2 * y -+end subroutine -Index: libgomp/testsuite/libgomp.fortran/udr15.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/udr15.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/udr15.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,64 @@ -+! { dg-do run } -+ -+module udr15m1 -+ integer, parameter :: a = 6 -+ integer :: b -+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) -+!$omp declare reduction (.add. : integer : & -+!$omp & omp_out = omp_out .add. f3 (omp_in, -4)) & -+!$omp & initializer (s1 (omp_priv, omp_orig)) -+ interface operator (.add.) -+ module procedure f1 -+ end interface -+contains -+ integer function f1 (x, y) -+ integer, intent (in) :: x, y -+ f1 = x + y -+ end function f1 -+ integer function f3 (x, y) -+ integer, intent (in) :: x, y -+ f3 = iand (x, y) -+ end function f3 -+ subroutine s1 (x, y) -+ integer, intent (in) :: y -+ integer, intent (out) :: x -+ x = 3 -+ end subroutine s1 -+end module udr15m1 -+module udr15m2 -+ use udr15m1, f4 => f1, f5 => f3, s2 => s1, operator (.addtwo.) => operator (.add.) -+ type dt -+ integer :: x -+ end type -+!$omp declare reduction (+ : dt : omp_out = f6 (omp_out + omp_in)) & -+!$omp & initializer (s3 (omp_priv)) -+ interface operator (+) -+ module procedure f2 -+ end interface -+contains -+ type(dt) function f2 (x, y) -+ type(dt), intent (in) :: x, y -+ f2%x = x%x + y%x -+ end function f2 -+ type(dt) function f6 (x) -+ type(dt), intent (in) :: x -+ f6%x = x%x -+ end function f6 -+ subroutine s3 (x) -+ type(dt), intent (out) :: x -+ x = dt(0) -+ end subroutine -+end module udr15m2 -+ use udr15m2, operator (.addthree.) => operator (.addtwo.), & -+ f7 => f4, f8 => f6, s4 => s3 -+ integer :: i, j -+ type(dt) :: d -+ j = 3 -+ d%x = 0 -+!$omp parallel do reduction (.addthree.: j) reduction (+ : d) -+ do i = 1, 100 -+ j = j.addthree.iand (i, -4) -+ d = d + dt(i) -+ end do -+ if (d%x /= 5050 .or. j /= 4903) call abort -+end -Index: libgomp/testsuite/libgomp.fortran/openmp_version-2.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/openmp_version-2.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/openmp_version-2.f90 (.../branches/gcc-4_9-branch) -@@ -4,6 +4,6 @@ - use omp_lib - implicit none - -- if (openmp_version .ne. 201107) call abort; -+ if (openmp_version .ne. 201307) call abort; - - end program main -Index: libgomp/testsuite/libgomp.fortran/cancel-do-1.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/cancel-do-1.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/cancel-do-1.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,14 @@ -+! { dg-do run } -+! { dg-set-target-env-var OMP_CANCELLATION "true" } -+ -+ use omp_lib -+ integer :: i -+ -+ !$omp parallel num_threads(32) -+ !$omp do -+ do i = 0, 999 -+ !$omp cancel do -+ if (omp_get_cancellation ()) call abort -+ enddo -+ !$omp endparallel -+end -Index: libgomp/testsuite/libgomp.fortran/alloc-comp-1.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/alloc-comp-1.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/alloc-comp-1.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,328 @@ -+! { dg-do run } -+! Don't cycle by default through all options, just test -O0 and -O2, -+! as this is quite large test. -+! { dg-skip-if "" { ! run_expensive_tests } { "*" } { "-O0" "-O2" } } -+ -+module m -+ type dl -+ integer :: a, b -+ integer, allocatable :: c(:,:) -+ integer :: d, e -+ integer, allocatable :: f -+ end type -+ type dt -+ integer :: g -+ type (dl), allocatable :: h(:) -+ integer :: i -+ type (dl) :: j(2, 2) -+ type (dl), allocatable :: k -+ end type -+contains -+ subroutine ver_dl (obj, val, c, cl1, cu1, cl2, cu2, f) -+ type (dl), intent (in) :: obj -+ integer, intent (in) :: val, cl1, cu1, cl2, cu2 -+ logical, intent (in) :: c, f -+ if ((c .neqv. allocated (obj%c)) .or. (f .neqv. allocated (obj%f))) call abort -+ if (c) then -+ if (lbound (obj%c, 1) /= cl1 .or. ubound (obj%c, 1) /= cu1) call abort -+ if (lbound (obj%c, 2) /= cl2 .or. ubound (obj%c, 2) /= cu2) call abort -+ end if -+ if (val /= 0) then -+ if (obj%a /= val .or. obj%b /= val) call abort -+ if (obj%d /= val .or. obj%e /= val) call abort -+ if (c) then -+ if (any (obj%c /= val)) call abort -+ end if -+ if (f) then -+ if (obj%f /= val) call abort -+ end if -+ end if -+ end subroutine ver_dl -+ subroutine ver_dt (obj, val, h, hl, hu, k, c, cl1, cu1, cl2, cu2, f) -+ type (dt), intent (in) :: obj -+ integer, intent (in) :: val, hl, hu, cl1, cu1, cl2, cu2 -+ logical, intent (in) :: h, k, c, f -+ integer :: i, j -+ if ((h .neqv. allocated (obj%h)) .or. (k .neqv. allocated (obj%k))) call abort -+ if (h) then -+ if (lbound (obj%h, 1) /= hl .or. ubound (obj%h, 1) /= hu) call abort -+ do i = hl, hu -+ call ver_dl (obj%h(i), val, c, cl1, cu1, cl2, cu2, f) -+ end do -+ end if -+ do i = 1, 2 -+ do j = 1, 2 -+ call ver_dl (obj%j(i, j), val, c, cl1, cu1, cl2, cu2, f) -+ end do -+ end do -+ if (k) call ver_dl (obj%k, val, c, cl1, cu1, cl2, cu2, f) -+ if (val /= 0) then -+ if (obj%g /= val .or. obj%i /= val) call abort -+ end if -+ end subroutine ver_dt -+ subroutine alloc_dl (obj, val, c, cl1, cu1, cl2, cu2, f) -+ type (dl), intent (inout) :: obj -+ integer, intent (in) :: val, cl1, cu1, cl2, cu2 -+ logical, intent (in) :: c, f -+ if (val /= 0) then -+ obj%a = val -+ obj%b = val -+ obj%d = val -+ obj%e = val -+ end if -+ if (allocated (obj%c)) deallocate (obj%c) -+ if (c) then -+ allocate (obj%c(cl1:cu1, cl2:cu2)) -+ if (val /= 0) obj%c = val -+ end if -+ if (f) then -+ if (.not.allocated (obj%f)) allocate (obj%f) -+ if (val /= 0) obj%f = val -+ else -+ if (allocated (obj%f)) deallocate (obj%f) -+ end if -+ end subroutine alloc_dl -+ subroutine alloc_dt (obj, val, h, hl, hu, k, c, cl1, cu1, cl2, cu2, f) -+ type (dt), intent (inout) :: obj -+ integer, intent (in) :: val, hl, hu, cl1, cu1, cl2, cu2 -+ logical, intent (in) :: h, k, c, f -+ integer :: i, j -+ if (val /= 0) then -+ obj%g = val -+ obj%i = val -+ end if -+ if (allocated (obj%h)) deallocate (obj%h) -+ if (h) then -+ allocate (obj%h(hl:hu)) -+ do i = hl, hu -+ call alloc_dl (obj%h(i), val, c, cl1, cu1, cl2, cu2, f) -+ end do -+ end if -+ do i = 1, 2 -+ do j = 1, 2 -+ call alloc_dl (obj%j(i, j), val, c, cl1, cu1, cl2, cu2, f) -+ end do -+ end do -+ if (k) then -+ if (.not.allocated (obj%k)) allocate (obj%k) -+ call alloc_dl (obj%k, val, c, cl1, cu1, cl2, cu2, f) -+ else -+ if (allocated (obj%k)) deallocate (obj%k) -+ end if -+ end subroutine alloc_dt -+end module m -+ use m -+ type (dt) :: y -+ call foo (y) -+contains -+ subroutine foo (y) -+ use m -+ type (dt) :: x, y, z(-3:-3,2:3) -+ logical, parameter :: F = .false. -+ logical, parameter :: T = .true. -+ logical :: l -+ call ver_dt (x, 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (y, 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+!$omp parallel private (x, y, z) -+ call ver_dt (x, 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (y, 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (y, 14, T, 3, 4, F, T, 1, 1, 2, 4, T) -+ call ver_dt (y, 14, T, 3, 4, F, T, 1, 1, 2, 4, T) -+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (z(-3,3), 14, T, 3, 4, F, T, 1, 1, 2, 4, T) -+ call ver_dt (z(-3,3), 14, T, 3, 4, F, T, 1, 1, 2, 4, T) -+!$omp end parallel -+ call ver_dt (x, 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (y, 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (y, 14, T, 3, 4, F, T, 1, 1, 2, 4, T) -+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (z(-3,3), 14, T, 3, 4, F, T, 1, 1, 2, 4, T) -+!$omp parallel private (x, y, z) -+ call ver_dt (x, 0, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (y, 0, T, 3, 4, F, T, 1, 1, 2, 4, T) -+ deallocate (x%h, x%k) -+ deallocate (y%h) -+ allocate (y%k) -+ call ver_dt (z(-3,2), 0, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (z(-3,3), 0, T, 3, 4, F, T, 1, 1, 2, 4, T) -+ deallocate (z(-3,2)%h, z(-3,2)%k) -+ deallocate (z(-3,3)%h) -+ allocate (z(-3,3)%k) -+!$omp end parallel -+ call alloc_dt (x, 5, T, 1, 2, F, T, 2, 3, -2, -2, F) -+ call alloc_dt (y, 15, F, 0, 0, T, T, 2, 2, 2, 2, T) -+ call alloc_dt (z(-3,2), 5, T, 1, 2, F, T, 2, 3, -2, -2, F) -+ call alloc_dt (z(-3,3), 15, F, 0, 0, T, T, 2, 2, 2, 2, T) -+!$omp parallel firstprivate (x, y, z) -+ call ver_dt (x, 5, T, 1, 2, F, T, 2, 3, -2, -2, F) -+ call alloc_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (y, 15, F, 0, 0, T, T, 2, 2, 2, 2, T) -+ call alloc_dt (y, 4, T, 3, 4, T, T, 1, 1, 2, 4, T) -+ call ver_dt (y, 4, T, 3, 4, T, T, 1, 1, 2, 4, T) -+ call ver_dt (z(-3,2), 5, T, 1, 2, F, T, 2, 3, -2, -2, F) -+ call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (z(-3,3), 15, F, 0, 0, T, T, 2, 2, 2, 2, T) -+ call alloc_dt (z(-3,3), 4, T, 3, 4, T, T, 1, 1, 2, 4, T) -+ call ver_dt (z(-3,3), 4, T, 3, 4, T, T, 1, 1, 2, 4, T) -+!$omp end parallel -+ call ver_dt (x, 5, T, 1, 2, F, T, 2, 3, -2, -2, F) -+ call alloc_dt (x, 4, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (y, 15, F, 0, 0, T, T, 2, 2, 2, 2, T) -+ call alloc_dt (y, 16, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (z(-3,2), 5, T, 1, 2, F, T, 2, 3, -2, -2, F) -+ call alloc_dt (z(-3,2), 4, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (z(-3,3), 15, F, 0, 0, T, T, 2, 2, 2, 2, T) -+ call alloc_dt (z(-3,3), 16, F, 0, 0, F, F, 0, 0, 0, 0, F) -+!$omp parallel firstprivate (x, y, z) -+ call ver_dt (x, 4, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (y, 16, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (y, 17, T, 1, 2, F, T, 2, 2, 3, 3, F) -+ call ver_dt (y, 17, T, 1, 2, F, T, 2, 2, 3, 3, F) -+ call ver_dt (z(-3,2), 4, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (z(-3,3), 16, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (z(-3,3), 17, T, 1, 2, F, T, 2, 2, 3, 3, F) -+ call ver_dt (z(-3,3), 17, T, 1, 2, F, T, 2, 2, 3, 3, F) -+!$omp end parallel -+ call ver_dt (x, 4, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (y, 16, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (y, 18, T, 0, 1, T, T, 0, 1, 0, 1, T) -+ call ver_dt (z(-3,2), 4, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (z(-3,3), 16, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (z(-3,3), 18, T, 0, 1, T, T, 0, 1, 0, 1, T) -+ l = F -+!$omp parallel sections lastprivate (x, y, z) firstprivate (l) -+!$omp section -+ if (l) then -+ call ver_dt (x, 9, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (y, 21, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ call ver_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ else -+ call ver_dt (x, 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (y, 0, T, 0, 1, T, T, 0, 1, 0, 1, T) -+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (z(-3,3), 0, T, 0, 1, T, T, 0, 1, 0, 1, T) -+ end if -+ l = T -+ call alloc_dt (x, 7, T, 1, 1, T, T, 1, 2, 3, 3, T) -+ call ver_dt (x, 7, T, 1, 1, T, T, 1, 2, 3, 3, T) -+ call alloc_dt (y, 20, T, 0, 0, F, T, 2, 2, 3, 4, F) -+ call ver_dt (y, 20, T, 0, 0, F, T, 2, 2, 3, 4, F) -+ call alloc_dt (z(-3,2), 7, T, 1, 1, T, T, 1, 2, 3, 3, T) -+ call ver_dt (z(-3,2), 7, T, 1, 1, T, T, 1, 2, 3, 3, T) -+ call alloc_dt (z(-3,3), 20, T, 0, 0, F, T, 2, 2, 3, 4, F) -+ call ver_dt (z(-3,3), 20, T, 0, 0, F, T, 2, 2, 3, 4, F) -+!$omp section -+ if (l) then -+ call ver_dt (x, 7, T, 1, 1, T, T, 1, 2, 3, 3, T) -+ call ver_dt (y, 20, T, 0, 0, F, T, 2, 2, 3, 4, F) -+ call ver_dt (z(-3,2), 7, T, 1, 1, T, T, 1, 2, 3, 3, T) -+ call ver_dt (z(-3,3), 20, T, 0, 0, F, T, 2, 2, 3, 4, F) -+ else -+ call ver_dt (x, 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (y, 0, T, 0, 1, T, T, 0, 1, 0, 1, T) -+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (z(-3,3), 0, T, 0, 1, T, T, 0, 1, 0, 1, T) -+ end if -+ l = T -+ call alloc_dt (x, 9, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (x, 9, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call alloc_dt (y, 21, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ call ver_dt (y, 21, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ call alloc_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call alloc_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ call ver_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T) -+!$omp section -+!$omp end parallel sections -+ call ver_dt (x, 9, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (y, 21, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ call ver_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T) -+!$omp parallel sections lastprivate (x, y, z) firstprivate (l) -+!$omp section -+ if (l) then -+ call ver_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ else -+ call ver_dt (x, 0, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (y, 0, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ call ver_dt (z(-3,2), 0, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (z(-3,3), 0, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ end if -+ l = T -+ call alloc_dt (x, 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call ver_dt (x, 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call alloc_dt (y, 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+ call ver_dt (y, 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+ call alloc_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call ver_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call alloc_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+ call ver_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+!$omp section -+ if (l) then -+ call ver_dt (x, 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call ver_dt (y, 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+ call ver_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call ver_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+ else -+ call ver_dt (x, 0, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (y, 0, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ call ver_dt (z(-3,2), 0, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (z(-3,3), 0, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ end if -+ l = T -+ call alloc_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call alloc_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call ver_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call alloc_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call alloc_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+!$omp section -+!$omp end parallel sections -+ call ver_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+!$omp parallel private (x, y, z) -+ call ver_dt (x, 0, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (y, 0, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call ver_dt (z(-3,2), 0, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (z(-3,3), 0, T, 0, 1, T, T, 2, 2, 2, 2, F) -+!$omp single -+ call alloc_dt (x, 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call alloc_dt (y, 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+ call alloc_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call alloc_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+!$omp end single copyprivate (x, y, z) -+ call ver_dt (x, 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call ver_dt (y, 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+ call ver_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call ver_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+!$omp end parallel -+ call ver_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ end subroutine foo -+end -Index: libgomp/testsuite/libgomp.fortran/alloc-comp-3.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/alloc-comp-3.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/alloc-comp-3.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,372 @@ -+! { dg-do run } -+! Don't cycle by default through all options, just test -O0 and -O2, -+! as this is quite large test. -+! { dg-skip-if "" { ! run_expensive_tests } { "*" } { "-O0" "-O2" } } -+ -+module m -+ type dl -+ integer :: a, b -+ integer, allocatable :: c(:,:) -+ integer :: d, e -+ integer, allocatable :: f -+ end type -+ type dt -+ integer :: g -+ type (dl), allocatable :: h(:) -+ integer :: i -+ type (dl) :: j(2, 2) -+ type (dl), allocatable :: k -+ end type -+contains -+ subroutine ver_dl (obj, val, c, cl1, cu1, cl2, cu2, f) -+ type (dl), intent (in) :: obj -+ integer, intent (in) :: val, cl1, cu1, cl2, cu2 -+ logical, intent (in) :: c, f -+ if ((c .neqv. allocated (obj%c)) .or. (f .neqv. allocated (obj%f))) call abort -+ if (c) then -+ if (lbound (obj%c, 1) /= cl1 .or. ubound (obj%c, 1) /= cu1) call abort -+ if (lbound (obj%c, 2) /= cl2 .or. ubound (obj%c, 2) /= cu2) call abort -+ end if -+ if (val /= 0) then -+ if (obj%a /= val .or. obj%b /= val) call abort -+ if (obj%d /= val .or. obj%e /= val) call abort -+ if (c) then -+ if (any (obj%c /= val)) call abort -+ end if -+ if (f) then -+ if (obj%f /= val) call abort -+ end if -+ end if -+ end subroutine ver_dl -+ subroutine ver_dt (obj, val, h, hl, hu, k, c, cl1, cu1, cl2, cu2, f) -+ type (dt), intent (in) :: obj -+ integer, intent (in) :: val, hl, hu, cl1, cu1, cl2, cu2 -+ logical, intent (in) :: h, k, c, f -+ integer :: i, j -+ if ((h .neqv. allocated (obj%h)) .or. (k .neqv. allocated (obj%k))) call abort -+ if (h) then -+ if (lbound (obj%h, 1) /= hl .or. ubound (obj%h, 1) /= hu) call abort -+ do i = hl, hu -+ call ver_dl (obj%h(i), val, c, cl1, cu1, cl2, cu2, f) -+ end do -+ end if -+ do i = 1, 2 -+ do j = 1, 2 -+ call ver_dl (obj%j(i, j), val, c, cl1, cu1, cl2, cu2, f) -+ end do -+ end do -+ if (k) call ver_dl (obj%k, val, c, cl1, cu1, cl2, cu2, f) -+ if (val /= 0) then -+ if (obj%g /= val .or. obj%i /= val) call abort -+ end if -+ end subroutine ver_dt -+ subroutine alloc_dl (obj, val, c, cl1, cu1, cl2, cu2, f) -+ type (dl), intent (inout) :: obj -+ integer, intent (in) :: val, cl1, cu1, cl2, cu2 -+ logical, intent (in) :: c, f -+ if (val /= 0) then -+ obj%a = val -+ obj%b = val -+ obj%d = val -+ obj%e = val -+ end if -+ if (allocated (obj%c)) deallocate (obj%c) -+ if (c) then -+ allocate (obj%c(cl1:cu1, cl2:cu2)) -+ if (val /= 0) obj%c = val -+ end if -+ if (f) then -+ if (.not.allocated (obj%f)) allocate (obj%f) -+ if (val /= 0) obj%f = val -+ else -+ if (allocated (obj%f)) deallocate (obj%f) -+ end if -+ end subroutine alloc_dl -+ subroutine alloc_dt (obj, val, h, hl, hu, k, c, cl1, cu1, cl2, cu2, f) -+ type (dt), intent (inout) :: obj -+ integer, intent (in) :: val, hl, hu, cl1, cu1, cl2, cu2 -+ logical, intent (in) :: h, k, c, f -+ integer :: i, j -+ if (val /= 0) then -+ obj%g = val -+ obj%i = val -+ end if -+ if (allocated (obj%h)) deallocate (obj%h) -+ if (h) then -+ allocate (obj%h(hl:hu)) -+ do i = hl, hu -+ call alloc_dl (obj%h(i), val, c, cl1, cu1, cl2, cu2, f) -+ end do -+ end if -+ do i = 1, 2 -+ do j = 1, 2 -+ call alloc_dl (obj%j(i, j), val, c, cl1, cu1, cl2, cu2, f) -+ end do -+ end do -+ if (k) then -+ if (.not.allocated (obj%k)) allocate (obj%k) -+ call alloc_dl (obj%k, val, c, cl1, cu1, cl2, cu2, f) -+ else -+ if (allocated (obj%k)) deallocate (obj%k) -+ end if -+ end subroutine alloc_dt -+end module m -+ use m -+ type (dt), allocatable :: z(:,:) -+ type (dt) :: y(2:3) -+ call foo (y, z, 4) -+contains -+ subroutine foo (y, z, n) -+ use m -+ integer :: n -+ type (dt) :: x(2:n), y(3:) -+ type (dt), allocatable :: z(:,:) -+ logical, parameter :: F = .false. -+ logical, parameter :: T = .true. -+ logical :: l -+ if (lbound (x, 1) /= 2 .or. ubound (x, 1) /= 4) call abort -+ if (lbound (y, 1) /= 3 .or. ubound (y, 1) /= 4) call abort -+ call ver_dt (x(2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (x(n), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (y(3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (y(4), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+!$omp parallel private (z) -+ if (allocated (z)) call abort -+!$omp end parallel -+!$omp parallel firstprivate (z) -+ if (allocated (z)) call abort -+!$omp end parallel -+ l = F -+!$omp parallel sections lastprivate (z) firstprivate (l) -+!$omp section -+ if (.not. l) then -+ if (allocated (z)) call abort -+ end if -+!$omp section -+ if (.not. l) then -+ if (allocated (z)) call abort -+ end if -+ allocate (z(-3:-3,2:3)) -+ call alloc_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call alloc_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+!$omp section -+!$omp end parallel sections -+ if (.not.allocated (z)) call abort -+ if (lbound (z, 1) /= -3 .or. ubound (z, 1) /= -3) call abort -+ if (lbound (z, 2) /= 2 .or. ubound (z, 2) /= 3) call abort -+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call ver_dt (x(n - 1), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (y(4), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+!$omp parallel private (x, y, z) -+ call ver_dt (x(n - 1), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (x(n - 1), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (x(n - 1), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (y(4), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (y(4), 14, T, 3, 4, F, T, 1, 1, 2, 4, T) -+ call ver_dt (y(4), 14, T, 3, 4, F, T, 1, 1, 2, 4, T) -+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (z(-3,3), 14, T, 3, 4, F, T, 1, 1, 2, 4, T) -+ call ver_dt (z(-3,3), 14, T, 3, 4, F, T, 1, 1, 2, 4, T) -+!$omp end parallel -+ call ver_dt (x(n - 1), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (x(n - 1), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (y(4), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (y(4), 14, T, 3, 4, F, T, 1, 1, 2, 4, T) -+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (z(-3,3), 14, T, 3, 4, F, T, 1, 1, 2, 4, T) -+!$omp parallel private (x, y, z) -+ call ver_dt (x(n - 1), 0, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (y(4), 0, T, 3, 4, F, T, 1, 1, 2, 4, T) -+ deallocate (x(n - 1)%h, x(n - 1)%k) -+ deallocate (y(4)%h) -+ allocate (y(4)%k) -+ call ver_dt (z(-3,2), 0, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (z(-3,3), 0, T, 3, 4, F, T, 1, 1, 2, 4, T) -+ deallocate (z(-3,2)%h, z(-3,2)%k) -+ deallocate (z(-3,3)%h) -+ allocate (z(-3,3)%k) -+!$omp end parallel -+ call alloc_dt (x(n - 1), 5, T, 1, 2, F, T, 2, 3, -2, -2, F) -+ call alloc_dt (y(4), 15, F, 0, 0, T, T, 2, 2, 2, 2, T) -+ call alloc_dt (z(-3,2), 5, T, 1, 2, F, T, 2, 3, -2, -2, F) -+ call alloc_dt (z(-3,3), 15, F, 0, 0, T, T, 2, 2, 2, 2, T) -+!$omp parallel firstprivate (x, y, z) -+ if (lbound (x, 1) /= 2 .or. ubound (x, 1) /= 4) call abort -+ if (lbound (y, 1) /= 3 .or. ubound (y, 1) /= 4) call abort -+ call ver_dt (x(n - 1), 5, T, 1, 2, F, T, 2, 3, -2, -2, F) -+ call alloc_dt (x(n - 1), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (x(n - 1), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (y(4), 15, F, 0, 0, T, T, 2, 2, 2, 2, T) -+ call alloc_dt (y(4), 4, T, 3, 4, T, T, 1, 1, 2, 4, T) -+ call ver_dt (y(4), 4, T, 3, 4, T, T, 1, 1, 2, 4, T) -+ call ver_dt (z(-3,2), 5, T, 1, 2, F, T, 2, 3, -2, -2, F) -+ call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (z(-3,3), 15, F, 0, 0, T, T, 2, 2, 2, 2, T) -+ call alloc_dt (z(-3,3), 4, T, 3, 4, T, T, 1, 1, 2, 4, T) -+ call ver_dt (z(-3,3), 4, T, 3, 4, T, T, 1, 1, 2, 4, T) -+!$omp end parallel -+ call ver_dt (x(n - 1), 5, T, 1, 2, F, T, 2, 3, -2, -2, F) -+ call alloc_dt (x(n - 1), 4, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (y(4), 15, F, 0, 0, T, T, 2, 2, 2, 2, T) -+ call alloc_dt (y(4), 16, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (z(-3,2), 5, T, 1, 2, F, T, 2, 3, -2, -2, F) -+ call alloc_dt (z(-3,2), 4, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (z(-3,3), 15, F, 0, 0, T, T, 2, 2, 2, 2, T) -+ call alloc_dt (z(-3,3), 16, F, 0, 0, F, F, 0, 0, 0, 0, F) -+!$omp parallel firstprivate (x, y, z) -+ call ver_dt (x(n - 1), 4, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (x(n - 1), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (x(n - 1), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (y(4), 16, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (y(4), 17, T, 1, 2, F, T, 2, 2, 3, 3, F) -+ call ver_dt (y(4), 17, T, 1, 2, F, T, 2, 2, 3, 3, F) -+ call ver_dt (z(-3,2), 4, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T) -+ call ver_dt (z(-3,3), 16, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (z(-3,3), 17, T, 1, 2, F, T, 2, 2, 3, 3, F) -+ call ver_dt (z(-3,3), 17, T, 1, 2, F, T, 2, 2, 3, 3, F) -+!$omp end parallel -+ call ver_dt (x(n - 1), 4, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (y(4), 16, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (y(4), 18, T, 0, 1, T, T, 0, 1, 0, 1, T) -+ call ver_dt (z(-3,2), 4, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (z(-3,3), 16, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call alloc_dt (z(-3,3), 18, T, 0, 1, T, T, 0, 1, 0, 1, T) -+ l = F -+!$omp parallel sections lastprivate (x, y, z) firstprivate (l) -+!$omp section -+ if (l) then -+ call ver_dt (x(n - 1), 9, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (y(4), 21, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ call ver_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ else -+ call ver_dt (x(n - 1), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (y(4), 0, T, 0, 1, T, T, 0, 1, 0, 1, T) -+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (z(-3,3), 0, T, 0, 1, T, T, 0, 1, 0, 1, T) -+ end if -+ l = T -+ call alloc_dt (x(n - 1), 7, T, 1, 1, T, T, 1, 2, 3, 3, T) -+ call ver_dt (x(n - 1), 7, T, 1, 1, T, T, 1, 2, 3, 3, T) -+ call alloc_dt (y(4), 20, T, 0, 0, F, T, 2, 2, 3, 4, F) -+ call ver_dt (y(4), 20, T, 0, 0, F, T, 2, 2, 3, 4, F) -+ call alloc_dt (z(-3,2), 7, T, 1, 1, T, T, 1, 2, 3, 3, T) -+ call ver_dt (z(-3,2), 7, T, 1, 1, T, T, 1, 2, 3, 3, T) -+ call alloc_dt (z(-3,3), 20, T, 0, 0, F, T, 2, 2, 3, 4, F) -+ call ver_dt (z(-3,3), 20, T, 0, 0, F, T, 2, 2, 3, 4, F) -+!$omp section -+ if (l) then -+ call ver_dt (x(n - 1), 7, T, 1, 1, T, T, 1, 2, 3, 3, T) -+ call ver_dt (y(4), 20, T, 0, 0, F, T, 2, 2, 3, 4, F) -+ call ver_dt (z(-3,2), 7, T, 1, 1, T, T, 1, 2, 3, 3, T) -+ call ver_dt (z(-3,3), 20, T, 0, 0, F, T, 2, 2, 3, 4, F) -+ else -+ call ver_dt (x(n - 1), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (y(4), 0, T, 0, 1, T, T, 0, 1, 0, 1, T) -+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (z(-3,3), 0, T, 0, 1, T, T, 0, 1, 0, 1, T) -+ end if -+ l = T -+ call alloc_dt (x(n - 1), 9, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (x(n - 1), 9, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call alloc_dt (y(4), 21, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ call ver_dt (y(4), 21, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ call alloc_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call alloc_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ call ver_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T) -+!$omp section -+!$omp end parallel sections -+ call ver_dt (x(n - 1), 9, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (y(4), 21, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ call ver_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T) -+!$omp parallel sections lastprivate (x, y, z) firstprivate (l) -+!$omp section -+ if (l) then -+ call ver_dt (x(n - 1), 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (y(4), 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ else -+ call ver_dt (x(n - 1), 0, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (y(4), 0, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ call ver_dt (z(-3,2), 0, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (z(-3,3), 0, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ end if -+ l = T -+ call alloc_dt (x(n - 1), 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call ver_dt (x(n - 1), 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call alloc_dt (y(4), 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+ call ver_dt (y(4), 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+ call alloc_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call ver_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call alloc_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+ call ver_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+!$omp section -+ if (l) then -+ call ver_dt (x(n - 1), 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call ver_dt (y(4), 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+ call ver_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call ver_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+ else -+ call ver_dt (x(n - 1), 0, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (y(4), 0, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ call ver_dt (z(-3,2), 0, T, 1, 1, F, F, 0, 0, 0, 0, T) -+ call ver_dt (z(-3,3), 0, F, 0, 0, T, T, 1, 2, 3, 4, T) -+ end if -+ l = T -+ call alloc_dt (x(n - 1), 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (x(n - 1), 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call alloc_dt (y(4), 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call ver_dt (y(4), 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call alloc_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call alloc_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+!$omp section -+!$omp end parallel sections -+ call ver_dt (x(n - 1), 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (y(4), 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+!$omp parallel private (x, y, z) -+ call ver_dt (x(n - 1), 0, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (y(4), 0, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call ver_dt (z(-3,2), 0, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (z(-3,3), 0, T, 0, 1, T, T, 2, 2, 2, 2, F) -+!$omp single -+ call alloc_dt (x(n - 1), 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call alloc_dt (y(4), 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+ call alloc_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call alloc_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+!$omp end single copyprivate (x, y, z) -+ call ver_dt (x(n - 1), 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call ver_dt (y(4), 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+ call ver_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F) -+ call ver_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T) -+!$omp end parallel -+ call ver_dt (x(n - 1), 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (y(4), 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T) -+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F) -+ call ver_dt (x(2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (x(n), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ call ver_dt (y(3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F) -+ end subroutine foo -+end -Index: libgomp/testsuite/libgomp.fortran/nestedfn5.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/nestedfn5.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/nestedfn5.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,96 @@ -+! { dg-do run } -+ -+ interface -+ subroutine bar (q) -+ integer :: q(19:) -+ end subroutine -+ end interface -+ integer :: q(7:15) -+ q(:) = 5 -+ call bar (q) -+end -+subroutine bar (q) -+ use iso_c_binding, only: c_ptr, c_loc, c_int -+ integer :: a, b, c, d(2:3,4:5), q(19:), h, k, m, n, o, p -+ integer(c_int), target :: e(64) -+ type (c_ptr) :: f, g(64) -+ logical :: l -+ a = 1 -+ b = 2 -+ c = 3 -+ d = 4 -+ l = .false. -+ f = c_loc (e) -+ call foo -+contains -+ subroutine foo -+ use iso_c_binding, only: c_sizeof -+!$omp simd linear(a:2) linear(b:1) -+ do a = 1, 20, 2 -+ b = b + 1 -+ end do -+!$omp end simd -+ if (a /= 21 .or. b /= 12) call abort -+!$omp simd aligned(f : c_sizeof (e(1))) -+ do b = 1, 64 -+ g(b) = f -+ end do -+!$omp end simd -+!$omp parallel -+!$omp single -+!$omp taskgroup -+!$omp task depend(out : a, d(2:2,4:5)) -+ a = a + 1 -+ d(2:2,4:5) = d(2:2,4:5) + 1 -+!$omp end task -+!$omp task depend(in : a, d(2:2,4:5)) -+ if (a /= 22) call abort -+ if (any (d(2:2,4:5) /= 5)) call abort -+!$omp end task -+!$omp end taskgroup -+!$omp end single -+!$omp end parallel -+ b = 10 -+!$omp target data map (tofrom: a, d(2:3,4:4), q) map (from: l) -+!$omp target map (tofrom: b, d(2:3,4:4)) -+ l = .false. -+ if (a /= 22 .or. any (q /= 5)) l = .true. -+ if (lbound (q, 1) /= 19 .or. ubound (q, 1) /= 27) l = .true. -+ if (d(2,4) /= 5 .or. d(3,4) /= 4) l = .true. -+ l = l .or. (b /= 10) -+ a = 6 -+ b = 11 -+ q = 8 -+ d(2:3,4:4) = 9 -+!$omp end target -+!$omp target update from (a, q, d(2:3,4:4), l) -+ if (a /= 6 .or. l .or. b /= 11 .or. any (q /= 8)) call abort -+ if (any (d(2:3,4:4) /= 9) .or. d(2,5) /= 5 .or. d(3,5) /= 4) call abort -+ a = 12 -+ b = 13 -+ q = 14 -+ d = 15 -+!$omp target update to (a, q, d(2:3,4:4)) -+!$omp target map (tofrom: b, d(2:3,4:4)) -+ if (a /= 12 .or. b /= 13 .or. any (q /= 14)) l = .true. -+ l = l .or. any (d(2:3,4:4) /= 15) -+!$omp end target -+ a = 0 -+ b = 1 -+ c = 100 -+ h = 8 -+ m = 0 -+ n = 64 -+ o = 16 -+ if (l) call abort -+!$omp target teams distribute parallel do simd if (.not.l) device(a) & -+!$omp & num_teams(b) dist_schedule(static, c) num_threads (h) & -+!$omp & reduction (+: m) safelen (n) schedule(static, o) -+ do p = 1, 64 -+ m = m + 1 -+ end do -+!$omp end target teams distribute parallel do simd -+ if (m /= 64) call abort -+!$omp end target data -+ end subroutine foo -+end subroutine bar -Index: libgomp/testsuite/libgomp.fortran/depend-2.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/depend-2.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/depend-2.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,34 @@ -+! { dg-do run } -+ -+ integer :: x(3:6, 7:12), y -+ y = 1 -+ !$omp parallel shared (x, y) -+ !$omp single -+ !$omp taskgroup -+ !$omp task depend(in: x(:, :)) -+ if (y.ne.1) call abort -+ !$omp end task -+ !$omp task depend(out: x(:, :)) -+ y = 2 -+ !$omp end task -+ !$omp end taskgroup -+ !$omp taskgroup -+ !$omp task depend(in: x(4, 7)) -+ if (y.ne.2) call abort -+ !$omp end task -+ !$omp task depend(out: x(4:4, 7:7)) -+ y = 3 -+ !$omp end task -+ !$omp end taskgroup -+ !$omp taskgroup -+ !$omp task depend(in: x(4:, 8:)) -+ if (y.ne.3) call abort -+ !$omp end task -+ !$omp task depend(out: x(4:6, 8:12)) -+ y = 4 -+ !$omp end task -+ !$omp end taskgroup -+ !$omp end single -+ !$omp end parallel -+ if (y.ne.4) call abort -+end -Index: libgomp/testsuite/libgomp.fortran/cancel-taskgroup-2.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/cancel-taskgroup-2.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/cancel-taskgroup-2.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,28 @@ -+! { dg-do run } -+! { dg-set-target-env-var OMP_CANCELLATION "true" } -+ -+ use omp_lib -+ integer :: i -+ -+ !$omp parallel -+ !$omp taskgroup -+ !$omp task -+ !$omp cancel taskgroup -+ call abort -+ !$omp endtask -+ !$omp endtaskgroup -+ !$omp endparallel -+ !$omp parallel private (i) -+ !$omp barrier -+ !$omp single -+ !$omp taskgroup -+ do i = 0, 49 -+ !$omp task -+ !$omp cancellation point taskgroup -+ !$omp cancel taskgroup if (i.gt.5) -+ !$omp end task -+ end do -+ !$omp end taskgroup -+ !$omp endsingle -+ !$omp end parallel -+end -Index: libgomp/testsuite/libgomp.fortran/simd2.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/simd2.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/simd2.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,101 @@ -+! { dg-do run } -+! { dg-additional-options "-msse2" { target sse2_runtime } } -+! { dg-additional-options "-mavx" { target avx_runtime } } -+ -+ integer :: a(1024), b(1024), k, m, i, s, t -+ k = 4 -+ m = 2 -+ t = 1 -+ do i = 1, 1024 -+ a(i) = i - 513 -+ b(i) = modulo (i - 52, 39) -+ if (i.lt.52.and.b(i).ne.0) b(i) = b(i) - 39 -+ end do -+ s = foo (b) -+ do i = 1, 1024 -+ if (a(i).ne.((i - 513) * b(i))) call abort -+ if (i.lt.52.and.modulo (i - 52, 39).ne.0) then -+ if (b(i).ne.(modulo (i - 52, 39) - 39)) call abort -+ else -+ if (b(i).ne.(modulo (i - 52, 39))) call abort -+ end if -+ a(i) = i - 513 -+ end do -+ if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) call abort -+ k = 4 -+ m = 2 -+ t = 1 -+ s = bar (b) -+ do i = 1, 1024 -+ if (a(i).ne.((i - 513) * b(i))) call abort -+ if (i.lt.52.and.modulo (i - 52, 39).ne.0) then -+ if (b(i).ne.(modulo (i - 52, 39) - 39)) call abort -+ else -+ if (b(i).ne.(modulo (i - 52, 39))) call abort -+ end if -+ a(i) = i - 513 -+ end do -+ if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) call abort -+ k = 4 -+ m = 2 -+ t = 1 -+ s = baz (b) -+ do i = 1, 1024 -+ if (a(i).ne.((i - 513) * b(i))) call abort -+ if (i.lt.52.and.modulo (i - 52, 39).ne.0) then -+ if (b(i).ne.(modulo (i - 52, 39) - 39)) call abort -+ else -+ if (b(i).ne.(modulo (i - 52, 39))) call abort -+ end if -+ end do -+ if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) call abort -+contains -+ function foo (p) -+ integer :: p(1024), u, v, i, s, foo -+ s = 0 -+ !$omp simd linear(k : m + 1) reduction(+: s) lastprivate(u, v) -+ do i = 1, 1024 -+ a(i) = a(i) * p(i) -+ u = p(i) + k -+ k = k + m + 1 -+ v = p(i) + k -+ s = s + p(i) + k -+ end do -+ !$omp end simd -+ if (i.ne.1025) call abort -+ if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) call abort -+ foo = s -+ end function foo -+ function bar (p) -+ integer :: p(1024), u, v, i, s, bar -+ s = 0 -+ !$omp simd linear(k : m + 1) reduction(+: s) lastprivate(u, v) -+ do i = 1, 1024, t -+ a(i) = a(i) * p(i) -+ u = p(i) + k -+ k = k + m + 1 -+ v = p(i) + k -+ s = s + p(i) + k -+ end do -+ !$omp end simd -+ if (i.ne.1025) call abort -+ if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) call abort -+ bar = s -+ end function bar -+ function baz (p) -+ integer :: p(1024), u, v, i, s, baz -+ s = 0 -+ !$omp simd linear(k : m + 1) reduction(+: s) lastprivate(u, v) & -+ !$omp & linear(i : t) -+ do i = 1, 1024, t -+ a(i) = a(i) * p(i) -+ u = p(i) + k -+ k = k + m + 1 -+ v = p(i) + k -+ s = s + p(i) + k -+ end do -+ if (i.ne.1025) call abort -+ if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) call abort -+ baz = s -+ end function baz -+end -Index: libgomp/testsuite/libgomp.fortran/simd4.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/simd4.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/simd4.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,103 @@ -+! { dg-do run } -+! { dg-additional-options "-msse2" { target sse2_runtime } } -+! { dg-additional-options "-mavx" { target avx_runtime } } -+ -+ integer :: a(1024), b(1024), k, m, i, s, t -+ k = 4 -+ m = 2 -+ t = 1 -+ do i = 1, 1024 -+ a(i) = i - 513 -+ b(i) = modulo (i - 52, 39) -+ if (i.lt.52.and.b(i).ne.0) b(i) = b(i) - 39 -+ end do -+ s = foo (b) -+ do i = 1, 1024 -+ if (a(i).ne.((i - 513) * b(i))) call abort -+ if (i.lt.52.and.modulo (i - 52, 39).ne.0) then -+ if (b(i).ne.(modulo (i - 52, 39) - 39)) call abort -+ else -+ if (b(i).ne.(modulo (i - 52, 39))) call abort -+ end if -+ a(i) = i - 513 -+ end do -+ if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) call abort -+ k = 4 -+ m = 2 -+ t = 1 -+ s = bar (b) -+ do i = 1, 1024 -+ if (a(i).ne.((i - 513) * b(i))) call abort -+ if (i.lt.52.and.modulo (i - 52, 39).ne.0) then -+ if (b(i).ne.(modulo (i - 52, 39) - 39)) call abort -+ else -+ if (b(i).ne.(modulo (i - 52, 39))) call abort -+ end if -+ a(i) = i - 513 -+ end do -+ if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) call abort -+ k = 4 -+ m = 2 -+ t = 1 -+ s = baz (b) -+ do i = 1, 1024 -+ if (a(i).ne.((i - 513) * b(i))) call abort -+ if (i.lt.52.and.modulo (i - 52, 39).ne.0) then -+ if (b(i).ne.(modulo (i - 52, 39) - 39)) call abort -+ else -+ if (b(i).ne.(modulo (i - 52, 39))) call abort -+ end if -+ end do -+ if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) call abort -+contains -+ function foo (p) -+ integer :: p(1024), u, v, i, s, foo -+ s = 0 -+ !$omp parallel do simd linear(k : m + 1) reduction(+: s) & -+ !$omp & lastprivate(u, v) schedule (static, 32) -+ do i = 1, 1024 -+ a(i) = a(i) * p(i) -+ u = p(i) + k -+ k = k + m + 1 -+ v = p(i) + k -+ s = s + p(i) + k -+ end do -+ !$omp end parallel do simd -+ if (i.ne.1025) call abort -+ if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) call abort -+ foo = s -+ end function foo -+ function bar (p) -+ integer :: p(1024), u, v, i, s, bar -+ s = 0 -+ !$omp parallel do simd linear(k : m + 1) reduction(+: s) & -+ !$omp & lastprivate(u, v) schedule (dynamic, 32) -+ do i = 1, 1024, t -+ a(i) = a(i) * p(i) -+ u = p(i) + k -+ k = k + m + 1 -+ v = p(i) + k -+ s = s + p(i) + k -+ end do -+ !$omp endparalleldosimd -+ if (i.ne.1025) call abort -+ if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) call abort -+ bar = s -+ end function bar -+ function baz (p) -+ integer :: p(1024), u, v, i, s, baz -+ s = 0 -+ !$omp parallel do simd linear(k : m + 1) reduction(+: s) & -+ !$omp & lastprivate(u, v) linear(i : t) schedule (static, 8) -+ do i = 1, 1024, t -+ a(i) = a(i) * p(i) -+ u = p(i) + k -+ k = k + m + 1 -+ v = p(i) + k -+ s = s + p(i) + k -+ end do -+ if (i.ne.1025) call abort -+ if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) call abort -+ baz = s -+ end function baz -+end -Index: libgomp/testsuite/libgomp.fortran/simd6.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/simd6.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/simd6.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,135 @@ -+! { dg-do run } -+! { dg-additional-options "-msse2" { target sse2_runtime } } -+! { dg-additional-options "-mavx" { target avx_runtime } } -+ -+ interface -+ subroutine foo (b, i, j, x) -+ integer, intent (inout) :: b -+ integer, intent (in) :: i, j, x -+ end subroutine -+ end interface -+ integer :: i, j, b, c -+ c = 0 -+ i = 4 -+ j = 4 -+ b = 7 -+!$omp simd linear(b:2) reduction(+:c) -+ do i = 0, 63 -+ c = c + b - (7 + 2 * i) -+ call foo (b, i, j, 2) -+ end do -+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 64 * 2) call abort -+ i = 4 -+ j = 4 -+ b = 7 -+!$omp simd linear(b:3) reduction(+:c) -+ do i = 0, 63, 4 -+ c = c + b - (7 + i / 4 * 3) -+ call foo (b, i, j, 3) -+ end do -+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 16 * 3) call abort -+ i = 4 -+ j = 4 -+ b = 7 -+!$omp simd linear(i) linear(b:2) reduction(+:c) -+ do i = 0, 63 -+ c = c + b - (7 + 2 * i) -+ call foo (b, i, j, 2) -+ end do -+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 64 * 2) call abort -+ i = 4 -+ j = 4 -+ b = 7 -+!$omp simd linear(i:4) linear(b:3) reduction(+:c) -+ do i = 0, 63, 4 -+ c = c + b - (7 + i / 4 * 3) -+ call foo (b, i, j, 3) -+ end do -+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 16 * 3) call abort -+ i = 4 -+ j = 4 -+ b = 7 -+!$omp simd collapse(2) linear(b:2) reduction(+:c) -+ do i = 0, 7 -+ do j = 0, 7 -+ c = c + b - (7 + 2 * j + 2 * 8 * i) -+ call foo (b, i, j, 2) -+ end do -+ end do -+ if (c /= 0 .or. i /= 8 .or. j /= 8 .or. b /= 7 + 64 * 2) call abort -+ i = 4 -+ j = 4 -+ b = 7 -+!$omp simd collapse(2) linear(b:2) reduction(+:c) lastprivate (i, j) -+ do i = 0, 7 -+ do j = 0, 7 -+ c = c + b - (7 + 2 * j + 2 * 8 * i) -+ call foo (b, i, j, 2) -+ end do -+ end do -+ if (c /= 0 .or. i /= 8 .or. j /= 8 .or. b /= 7 + 64 * 2) call abort -+ i = 4 -+ j = 4 -+ b = 7 -+!$omp parallel do simd schedule (static, 4) linear(b:2) reduction(+:c) -+ do i = 0, 63 -+ c = c + b - (7 + 2 * i) -+ call foo (b, i, j, 2) -+ end do -+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 64 * 2) call abort -+ i = 4 -+ j = 4 -+ b = 7 -+!$omp parallel do simd schedule (static, 4) linear(b:3) reduction(+:c) -+ do i = 0, 63, 4 -+ c = c + b - (7 + i / 4 * 3) -+ call foo (b, i, j, 3) -+ end do -+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 16 * 3) call abort -+ i = 4 -+ j = 4 -+ b = 7 -+!$omp parallel do simd schedule (static, 4) linear(i) linear(b:2) reduction(+:c) -+ do i = 0, 63 -+ c = c + b - (7 + 2 * i) -+ call foo (b, i, j, 2) -+ end do -+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 64 * 2) call abort -+ i = 4 -+ j = 4 -+ b = 7 -+!$omp parallel do simd schedule (static, 4) linear(i:4) linear(b:3) reduction(+:c) -+ do i = 0, 63, 4 -+ c = c + b - (7 + i / 4 * 3) -+ call foo (b, i, j, 3) -+ end do -+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 16 * 3) call abort -+ i = 4 -+ j = 4 -+ b = 7 -+!$omp parallel do simd schedule (static, 4) collapse(2) linear(b:2) reduction(+:c) -+ do i = 0, 7 -+ do j = 0, 7 -+ c = c + b - (7 + 2 * j + 2 * 8 * i) -+ call foo (b, i, j, 2) -+ end do -+ end do -+ if (c /= 0 .or. i /= 8 .or. j /= 8 .or. b /= 7 + 64 * 2) call abort -+ i = 4 -+ j = 4 -+ b = 7 -+!$omp parallel do simd schedule (static, 4) collapse(2) linear(b:2) & -+!$omp & reduction(+:c) lastprivate (i, j) -+ do i = 0, 7 -+ do j = 0, 7 -+ c = c + b - (7 + 2 * j + 2 * 8 * i) -+ call foo (b, i, j, 2) -+ end do -+ end do -+ if (c /= 0 .or. i /= 8 .or. j /= 8 .or. b /= 7 + 64 * 2) call abort -+end -+subroutine foo (b, i, j, x) -+ integer, intent (inout) :: b -+ integer, intent (in) :: i, j, x -+ b = b + (i - i) + (j - j) + x -+end subroutine -Index: libgomp/testsuite/libgomp.fortran/allocatable11.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/allocatable11.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/allocatable11.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,72 @@ -+! { dg-do run } -+! { dg-require-effective-target tls_runtime } -+ -+ use omp_lib -+ integer, allocatable, save :: a, b(:), c(:,:) -+ integer :: p -+!$omp threadprivate (a, b, c) -+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort -+ -+ call omp_set_dynamic (.false.) -+ call omp_set_num_threads (4) -+ -+!$omp parallel num_threads (4) -+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort -+!$omp end parallel -+ -+ allocate (a, b(6:9), c(3, 8:9)) -+ a = 4 -+ b = 5 -+ c = 6 -+ if (.not.allocated (a)) call abort -+ if (.not.allocated (b) .or. size (b) /= 4) call abort -+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort -+ if (.not.allocated (c) .or. size (c) /= 6) call abort -+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort -+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort -+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort -+ -+!$omp parallel num_threads (4) copyin (a, b, c) private (p) -+ p = omp_get_thread_num () -+ if (.not.allocated (a)) call abort -+ if (.not.allocated (b) .or. size (b) /= 4) call abort -+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort -+ if (.not.allocated (c) .or. size (c) /= 6) call abort -+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort -+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort -+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort -+ if (a /= 4 .or. any (b /= 5) .or. any (c /= 6)) call abort -+ deallocate (a, b, c) -+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort -+ allocate (a, b(p:9), c(3, p:7)) -+ a = p -+ b = p -+ c = p -+ if (.not.allocated (a)) call abort -+ if (.not.allocated (b) .or. size (b) /= (10 - p)) call abort -+ if (lbound (b, 1) /= p .or. ubound (b, 1) /= 9) call abort -+ if (.not.allocated (c) .or. size (c) /= (3 * (8 - p))) call abort -+ if (size (c, 1) /= 3 .or. size (c, 2) /= (8 - p)) call abort -+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort -+ if (lbound (c, 2) /= p .or. ubound (c, 2) /= 7) call abort -+ if (a /= p .or. any (b /= p) .or. any (c /= p)) call abort -+!$omp end parallel -+ -+!$omp parallel num_threads (4) copyin (a, b, c) -+ if (.not.allocated (a)) call abort -+ if (.not.allocated (b) .or. size (b) /= 10) call abort -+ if (lbound (b, 1) /= 0 .or. ubound (b, 1) /= 9) call abort -+ if (.not.allocated (c) .or. size (c) /= 24) call abort -+ if (size (c, 1) /= 3 .or. size (c, 2) /= 8) call abort -+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort -+ if (lbound (c, 2) /= 0 .or. ubound (c, 2) /= 7) call abort -+ if (a /= 0 .or. any (b /= 0) .or. any (c /= 0)) call abort -+!$omp end parallel -+ -+ deallocate (a, b, c) -+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort -+ -+!$omp parallel num_threads (4) copyin (a, b, c) -+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort -+!$omp end parallel -+end -Index: libgomp/testsuite/libgomp.fortran/cancel-sections-1.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/cancel-sections-1.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/cancel-sections-1.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,23 @@ -+! { dg-do run } -+! { dg-set-target-env-var OMP_CANCELLATION "true" } -+ -+ use omp_lib -+ -+ if (omp_get_cancellation ()) then -+ !$omp parallel num_threads(32) -+ !$omp sections -+ !$omp cancel sections -+ call abort -+ !$omp section -+ !$omp cancel sections -+ call abort -+ !$omp section -+ !$omp cancel sections -+ call abort -+ !$omp section -+ !$omp cancel sections -+ call abort -+ !$omp end sections -+ !$omp end parallel -+ end if -+end -Index: libgomp/testsuite/libgomp.fortran/udr2.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/udr2.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/udr2.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,51 @@ -+! { dg-do run } -+ -+module udr2 -+ type dt -+ integer :: x = 7 -+ integer :: y = 9 -+ end type -+end module udr2 -+ use udr2, only : dt -+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) -+ integer :: i, j(2:4,3:5) -+!$omp declare reduction (bar : integer : & -+!$omp & omp_out = omp_out + iand (omp_in, -4)) initializer (omp_priv = 3) -+ interface operator (+) -+ function notdefined(x, y) -+ use udr2, only : dt -+ type(dt), intent (in) :: x, y -+ type(dt) :: notdefined -+ end function -+ end interface -+ type (dt) :: d(2:4,3:5) -+!$omp declare reduction (+ : dt : omp_out%x = omp_out%x & -+!$omp & + iand (omp_in%x, -8)) -+!$omp declare reduction (foo : dt : omp_out%x = iand (omp_in%x, -8) & -+!$omp & + omp_out%x) initializer (omp_priv = dt (5, 21)) -+ j = 0 -+!$omp parallel do reduction (foo : j) -+ do i = 1, 100 -+ j = j + i -+ end do -+ if (any(j .ne. 5050)) call abort -+ j = 3 -+!$omp parallel do reduction (bar : j) -+ do i = 1, 100 -+ j = j + 4 * i -+ end do -+ if (any(j .ne. (5050 * 4 + 3))) call abort -+!$omp parallel do reduction (+ : d) -+ do i = 1, 100 -+ if (any(d%y .ne. 9)) call abort -+ d%x = d%x + 8 * i -+ end do -+ if (any(d%x .ne. (5050 * 8 + 7)) .or. any(d%y .ne. 9)) call abort -+ d = dt (5, 21) -+!$omp parallel do reduction (foo : d) -+ do i = 1, 100 -+ if (any(d%y .ne. 21)) call abort -+ d%x = d%x + 8 * i -+ end do -+ if (any(d%x .ne. (5050 * 8 + 5)) .or. any(d%y .ne. 21)) call abort -+end -Index: libgomp/testsuite/libgomp.fortran/udr4.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/udr4.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/udr4.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,50 @@ -+! { dg-do run } -+ -+!$omp declare reduction (foo : character(kind=1, len=*) & -+!$omp & : omp_out = fn (omp_out, omp_in)) initializer (omp_priv = '') -+!$omp declare reduction (bar : character(kind=1, len=:) & -+!$omp & : omp_out = fn (omp_in, omp_out)) initializer (omp_priv = '') -+!$omp declare reduction (baz : character(kind=1, len=1) & -+!$omp & : omp_out = char (ichar (omp_out) + ichar (omp_in) & -+!$omp & - ichar ('0'))) initializer (omp_priv = '0') -+!$omp declare reduction (baz : character(kind=1, len=2) & -+!$omp & : omp_out = char (ichar (omp_out(1:1)) + ichar (omp_in(1:1)) & -+!$omp & - ichar ('0')) // char (ichar (omp_out(2:2)) + & -+!$omp & ichar (omp_in(2:2)) - ichar ('0'))) initializer (omp_priv = '00') -+ interface -+ elemental function fn (x, y) -+ character (len=64), intent (in) :: x, y -+ character (len=64) :: fn -+ end function -+ end interface -+ character(kind=1, len=64) :: c(-3:-2,1:1,7:8), d(2:3,-7:-5) -+ character(kind = 1, len=1) :: e(2:4) -+ character(kind = 1, len=1+1) :: f(8:10,9:10) -+ integer :: i, j, k -+ c = '' -+ d = '' -+ e = '0' -+ f = '00' -+!$omp parallel do reduction (foo : c) reduction (bar : d) & -+!$omp & reduction (baz : e, f) private (j, k) -+ do i = 1, 64 -+ forall (j = -3:-2, k = 7:8) & -+ c(j,1,k) = trim(c(j,1,k)) // char (ichar ('0') + i) -+ d = char (ichar ('0') + i) // d -+ e = char (ichar (e) + mod (i, 3)) -+ f = char (ichar (f(:,:)(1:1)) + mod (i, 2)) & -+& // char (ichar (f(:,:)(2:2)) + mod (i, 3)) -+ end do -+ do i = 1, 64 -+ if (any (index (c, char (ichar ('0') + i)) .eq. 0)) call abort -+ if (any (index (d, char (ichar ('0') + i)) .eq. 0)) call abort -+ end do -+ if (any (e.ne.char (ichar ('0') + 64))) call abort -+ if (any (f(:,:)(1:1).ne.char (ichar ('0') + 32))) call abort -+ if (any (f(:,:)(2:2).ne.char (ichar ('0') + 64))) call abort -+end -+elemental function fn (x, y) -+ character (len=64), intent (in) :: x, y -+ character (len=64) :: fn -+ fn = trim(x) // y -+end function -Index: libgomp/testsuite/libgomp.fortran/udr6.f90 -=================================================================== ---- a/src/libgomp/testsuite/libgomp.fortran/udr6.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.fortran/udr6.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,69 @@ -+! { dg-do run } -+ -+module m -+ interface operator(.add.) -+ module procedure do_add -+ end interface -+ type dt -+ real :: r = 0.0 -+ end type -+contains -+ elemental function do_add(x, y) -+ type (dt), intent (in) :: x, y -+ type (dt) :: do_add -+ do_add%r = x%r + y%r -+ end function -+ elemental subroutine dp_add(x, y) -+ double precision, intent (inout) :: x -+ double precision, intent (in) :: y -+ x = x + y -+ end subroutine -+ elemental subroutine dp_init(x) -+ double precision, intent (out) :: x -+ x = 0.0 -+ end subroutine -+end module -+ -+program udr6 -+ use m, only : operator(.add.), dt, dp_add, dp_init -+ type(dt), allocatable :: xdt(:) -+ type(dt) :: one -+ real :: r -+ integer (kind = 4), allocatable, dimension(:) :: i4 -+ integer (kind = 8), allocatable, dimension(:,:) :: i8 -+ integer :: i -+ real (kind = 4), allocatable :: r4(:,:) -+ double precision, allocatable :: dp(:) -+!$omp declare reduction(.add.:dt:omp_out=omp_out.add.omp_in) -+!$omp declare reduction(foo:integer(4),integer(kind=8),real (kind = 4) & -+!$omp & :omp_out = omp_out + omp_in) initializer (omp_priv = 0) -+!$omp declare reduction(foo:double precision:dp_add (omp_out, omp_in)) & -+!$omp & initializer (dp_init (omp_priv)) -+ -+ one%r = 1.0 -+ allocate (xdt(4), i4 (3), i8(-5:-2,2:3), r4(2:5,1:1), dp(7)) -+ r = 0.0 -+ i4 = 0 -+ i8 = 0 -+ r4 = 0.0 -+ do i = 1, 7 -+ call dp_init (dp(i)) -+ end do -+!$omp parallel reduction(.add.: xdt) reduction(+: r) & -+!$omp & reduction(foo: i4, i8, r4, dp) private(i) -+ do i = 1, 4 -+ xdt(i) = xdt(i).add.one -+ end do -+ r = r + 1.0 -+ i4 = i4 + 1 -+ i8 = i8 + 1 -+ r4 = r4 + 1.0 -+ do i = 1, 7 -+ call dp_add (dp(i), 1.0d0) -+ end do -+!$omp end parallel -+ if (any (xdt%r .ne. r)) call abort -+ if (any (i4.ne.r).or.any(i8.ne.r)) call abort -+ if (any(r4.ne.r).or.any(dp.ne.r)) call abort -+ deallocate (xdt, i4, i8, r4, dp) -+end program udr6 -Index: libgomp/testsuite/libgomp.c/simd-9.c -=================================================================== ---- a/src/libgomp/testsuite/libgomp.c/simd-9.c (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.c/simd-9.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,70 @@ -+/* { dg-do run } */ -+/* { dg-options "-O2" } */ -+/* { dg-additional-options "-msse2" { target sse2_runtime } } */ -+/* { dg-additional-options "-mavx" { target avx_runtime } } */ -+ -+extern void abort (); -+int a[32][32] __attribute__((aligned (32))) = { { 1 } }; -+struct S { int s; }; -+#pragma omp declare reduction (+:struct S:omp_out.s += omp_in.s) -+#pragma omp declare reduction (foo:struct S:omp_out.s += omp_in.s) -+#pragma omp declare reduction (foo:int:omp_out += omp_in) -+ -+__attribute__((noinline, noclone)) int -+foo (void) -+{ -+ int i, j, u = 0; -+ struct S s, t; -+ s.s = 0; t.s = 0; -+ #pragma omp simd aligned(a : 32) lastprivate (i, j) reduction(+:s) reduction(foo:t, u) collapse(2) -+ for (i = 0; i < 32; i++) -+ for (j = 0; j < 32; j++) -+ { -+ int *q = &i; -+ int *r = &j; -+ int x = a[i][j]; -+ s.s += x; -+ t.s += x; -+ u += x; -+ } -+ if (t.s != s.s || u != s.s || i != 32 || j != 32) -+ abort (); -+ return s.s; -+} -+ -+__attribute__((noinline, noclone)) int -+bar (void) -+{ -+ int i, j, u = 0; -+ struct S s, t; -+ s.s = 0; t.s = 0; -+ #pragma omp simd aligned(a:32)reduction(+:s)reduction(foo:t,u)collapse(2) -+ for (i = 0; i < 32; i++) -+ for (j = 0; j < 32; j++) -+ { -+ int *q = &i; -+ int *r = &j; -+ int x = a[i][j]; -+ s.s += x; -+ t.s += x; -+ u += x; -+ } -+ if (t.s != s.s || u != s.s || i != 32 || j != 32) -+ abort (); -+ return s.s; -+} -+ -+int -+main () -+{ -+ int i, j; -+ for (i = 0; i < 32; i++) -+ for (j = 0; j < 32; j++) -+ a[i][j] = j + (i / 4); -+ int s = foo (); -+ if (s != 19456) -+ abort (); -+ if (bar () != 19456) -+ abort (); -+ return 0; -+} -Index: libgomp/testsuite/libgomp.c/simd-12.c -=================================================================== ---- a/src/libgomp/testsuite/libgomp.c/simd-12.c (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.c/simd-12.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,19 @@ -+/* { dg-do run } */ -+/* { dg-options "-O2" } */ -+/* { dg-additional-options "-msse2" { target sse2_runtime } } */ -+/* { dg-additional-options "-mavx" { target avx_runtime } } */ -+ -+int -+main () -+{ -+ int k = 0, i, s = 0; -+ #pragma omp parallel -+ #pragma omp for simd linear(k : 3) reduction(+: s) schedule (static, 16) -+ for (i = 0; i < 128; i++) -+ { -+ k = k + 3; -+ s = s + k; -+ } -+ if (s != 128 * 129 / 2 * 3) __builtin_abort (); -+ return 0; -+} -Index: libgomp/testsuite/libgomp.c/simd-16.c -=================================================================== ---- a/src/libgomp/testsuite/libgomp.c/simd-16.c (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.c/simd-16.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,67 @@ -+/* { dg-do run } */ -+/* { dg-options "-O2 -std=c99" } */ -+/* { dg-additional-options "-msse2" { target sse2_runtime } } */ -+/* { dg-additional-options "-mavx" { target avx_runtime } } */ -+ -+int -+main () -+{ -+ int b, c = 0; -+ b = 7; -+ #pragma omp simd linear(b:2) reduction(+:c) -+ for (int i = 0; i < 64; i++) -+ { -+ c = c + (b != 7 + 2 * i); -+ b = b + 2; -+ } -+ if (c || b != 7 + 64 * 2) -+ __builtin_abort (); -+ b = 7; -+ #pragma omp simd linear(b:3) reduction(+:c) -+ for (int i = 0; i < 64; i += 4) -+ { -+ c = c + (b != 7 + i / 4 * 3); -+ b = b + 3; -+ } -+ if (c || b != 7 + 16 * 3) -+ __builtin_abort (); -+ b = 7; -+ #pragma omp simd collapse (2) linear(b:2) reduction(+:c) -+ for (int i = 0; i < 8; i++) -+ for (int j = 0; j < 8; j++) -+ { -+ c = c + (b != 7 + 2 * j + 2 * 8 * i); -+ b = b + 2; -+ } -+ if (c || b != 7 + 64 * 2) -+ __builtin_abort (); -+ b = 7; -+ #pragma omp parallel for simd schedule (static, 4) linear(b:2) reduction(+:c) -+ for (int i = 0; i < 64; i++) -+ { -+ c = c + (b != 7 + 2 * i); -+ b = b + 2; -+ } -+ if (c || b != 7 + 64 * 2) -+ __builtin_abort (); -+ b = 7; -+ #pragma omp parallel for simd schedule (static, 4) linear(b:3) reduction(+:c) -+ for (int i = 0; i < 64; i += 4) -+ { -+ c = c + (b != 7 + i / 4 * 3); -+ b = b + 3; -+ } -+ if (c || b != 7 + 16 * 3) -+ __builtin_abort (); -+ b = 7; -+ #pragma omp parallel for simd collapse (2) schedule (static, 4) linear(b:2) reduction(+:c) -+ for (int i = 0; i < 8; i++) -+ for (int j = 0; j < 8; j++) -+ { -+ c = c + (b != 7 + 2 * j + 2 * 8 * i); -+ b = b + 2; -+ } -+ if (c || b != 7 + 64 * 2) -+ __builtin_abort (); -+ return 0; -+} -Index: libgomp/testsuite/libgomp.c/for-2.c -=================================================================== ---- a/src/libgomp/testsuite/libgomp.c/for-2.c (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.c/for-2.c (.../branches/gcc-4_9-branch) -@@ -21,11 +21,14 @@ - #undef F - #undef G - -+#undef SC -+#define SC static - #define F for simd - #define G f_simd - #include "for-1.h" - #undef F - #undef G -+#undef SC - - int - main () -Index: libgomp/testsuite/libgomp.c/for-2.h -=================================================================== ---- a/src/libgomp/testsuite/libgomp.c/for-2.h (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.c/for-2.h (.../branches/gcc-4_9-branch) -@@ -8,6 +8,9 @@ - for (;;); - } - #endif -+#ifndef SC -+#define SC -+#endif - - __attribute__((noinline, noclone)) void - N(f0) (void) -@@ -57,7 +60,7 @@ - N(f5) (int n11, int n12, int n21, int n22, int n31, int n32, - int s1, int s2, int s3) - { -- int v1, v2, v3; -+ SC int v1, v2, v3; - #pragma omp F S collapse(3) - for (v1 = n11; v1 < n12; v1 += s1) - for (v2 = n21; v2 < n22; v2 += s2) -@@ -69,8 +72,8 @@ - N(f6) (int n11, int n12, int n21, int n22, long long n31, long long n32, - int s1, int s2, long long int s3) - { -- int v1, v2; -- long long v3; -+ SC int v1, v2; -+ SC long long v3; - #pragma omp F S collapse(3) - for (v1 = n11; v1 > n12; v1 += s1) - for (v2 = n21; v2 > n22; v2 += s2) -@@ -81,8 +84,8 @@ - __attribute__((noinline, noclone)) void - N(f7) (void) - { -- unsigned int v1, v3; -- unsigned long long v2; -+ SC unsigned int v1, v3; -+ SC unsigned long long v2; - #pragma omp F S collapse(3) - for (v1 = 0; v1 < 20; v1 += 2) - for (v2 = __LONG_LONG_MAX__ + 16ULL; -@@ -94,7 +97,7 @@ - __attribute__((noinline, noclone)) void - N(f8) (void) - { -- long long v1, v2, v3; -+ SC long long v1, v2, v3; - #pragma omp F S collapse(3) - for (v1 = 0; v1 < 20; v1 += 2) - for (v2 = 30; v2 < 20; v2++) -@@ -118,7 +121,7 @@ - __attribute__((noinline, noclone)) void - N(f10) (void) - { -- int i; -+ SC int i; - #pragma omp F S collapse(3) - for (i = 0; i < 10; i++) - for (int j = 10; j < 8; j++) -@@ -146,7 +149,7 @@ - __attribute__((noinline, noclone)) void - N(f12) (int n) - { -- int i; -+ SC int i; - #pragma omp F S collapse(3) - for (i = 0; i < 10; i++) - for (int j = n; j < 8; j++) -@@ -170,7 +173,7 @@ - __attribute__((noinline, noclone)) void - N(f14) (void) - { -- float *i; -+ SC float *i; - #pragma omp F S collapse(3) - for (i = &b[0][0][0]; i < &b[0][0][10]; i++) - for (float *j = &b[0][15][0]; j > &b[0][0][0]; j -= 10) -Index: libgomp/testsuite/libgomp.c/simd-13.c -=================================================================== ---- a/src/libgomp/testsuite/libgomp.c/simd-13.c (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.c/simd-13.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,18 @@ -+/* { dg-do run } */ -+/* { dg-options "-O2" } */ -+/* { dg-additional-options "-msse2" { target sse2_runtime } } */ -+/* { dg-additional-options "-mavx" { target avx_runtime } } */ -+ -+int -+main () -+{ -+ int k = 0, i, s = 0; -+ #pragma omp parallel for simd linear(k : 3) reduction(+: s) schedule (static, 16) -+ for (i = 0; i < 128; i++) -+ { -+ k = k + 3; -+ s = s + k; -+ } -+ if (s != 128 * 129 / 2 * 3) __builtin_abort (); -+ return 0; -+} -Index: libgomp/testsuite/libgomp.c/simd-17.c -=================================================================== ---- a/src/libgomp/testsuite/libgomp.c/simd-17.c (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.c/simd-17.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,73 @@ -+/* { dg-do run } */ -+/* { dg-options "-O2 -std=c99" } */ -+/* { dg-additional-options "-msse2" { target sse2_runtime } } */ -+/* { dg-additional-options "-mavx" { target avx_runtime } } */ -+ -+static inline void -+foo (int *b, int *i, int *j, int x) -+{ -+ *b = *b + x + (*i - *i) + (*j - *j); -+} -+ -+int -+main () -+{ -+ int b, c = 0; -+ b = 7; -+ #pragma omp simd linear(b:2) reduction(+:c) -+ for (int i = 0; i < 64; i++) -+ { -+ c = c + (b != 7 + 2 * i); -+ foo (&b, &i, &i, 2); -+ } -+ if (c || b != 7 + 64 * 2) -+ __builtin_abort (); -+ b = 7; -+ #pragma omp simd linear(b:3) reduction(+:c) -+ for (int i = 0; i < 64; i += 4) -+ { -+ c = c + (b != 7 + i / 4 * 3); -+ foo (&b, &i, &i, 3); -+ } -+ if (c || b != 7 + 16 * 3) -+ __builtin_abort (); -+ b = 7; -+ #pragma omp simd collapse (2) linear(b:2) reduction(+:c) -+ for (int i = 0; i < 8; i++) -+ for (int j = 0; j < 8; j++) -+ { -+ c = c + (b != 7 + 2 * j + 2 * 8 * i); -+ foo (&b, &i, &j, 2); -+ } -+ if (c || b != 7 + 64 * 2) -+ __builtin_abort (); -+ b = 7; -+ #pragma omp parallel for simd schedule (static, 4) linear(b:2) reduction(+:c) -+ for (int i = 0; i < 64; i++) -+ { -+ c = c + (b != 7 + 2 * i); -+ foo (&b, &i, &i, 2); -+ } -+ if (c || b != 7 + 64 * 2) -+ __builtin_abort (); -+ b = 7; -+ #pragma omp parallel for simd schedule (static, 4) linear(b:3) reduction(+:c) -+ for (int i = 0; i < 64; i += 4) -+ { -+ c = c + (b != 7 + i / 4 * 3); -+ foo (&b, &i, &i, 3); -+ } -+ if (c || b != 7 + 16 * 3) -+ __builtin_abort (); -+ b = 7; -+ #pragma omp parallel for simd collapse (2) schedule (static, 4) linear(b:2) reduction(+:c) -+ for (int i = 0; i < 8; i++) -+ for (int j = 0; j < 8; j++) -+ { -+ c = c + (b != 7 + 2 * j + 2 * 8 * i); -+ foo (&b, &i, &j, 2); -+ } -+ if (c || b != 7 + 64 * 2) -+ __builtin_abort (); -+ return 0; -+} -Index: libgomp/testsuite/libgomp.c/loop-16.c -=================================================================== ---- a/src/libgomp/testsuite/libgomp.c/loop-16.c (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.c/loop-16.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,27 @@ -+/* { dg-do run } */ -+ -+extern void abort (void); -+ -+volatile int count; -+static int test (void) -+{ -+ return ++count > 0; -+} -+ -+int i; -+ -+int -+main () -+{ -+ #pragma omp for lastprivate (i) -+ for (i = 0; i < 10; ++i) -+ { -+ int *p = &i; -+ if (test ()) -+ continue; -+ abort (); -+ } -+ if (i != count) -+ abort (); -+ return 0; -+} -Index: libgomp/testsuite/libgomp.c/simd-7.c -=================================================================== ---- a/src/libgomp/testsuite/libgomp.c/simd-7.c (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.c/simd-7.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,96 @@ -+/* { dg-do run } */ -+/* { dg-options "-O2" } */ -+/* { dg-additional-options "-msse2" { target sse2_runtime } } */ -+/* { dg-additional-options "-mavx" { target avx_runtime } } */ -+ -+extern void abort (); -+int a[1024] __attribute__((aligned (32))) = { 1 }; -+int b[1024] __attribute__((aligned (32))) = { 1 }; -+int k, m; -+struct U { int u; }; -+struct V { int v; }; -+ -+__attribute__((noinline, noclone)) int -+foo (int *p) -+{ -+ int i, s = 0; -+ struct U u; -+ struct V v; -+ #pragma omp simd aligned(a, p : 32) linear(k: m + 1) \ -+ linear(i) reduction(+:s) lastprivate(u, v) -+ for (i = 0; i < 1024; i++) -+ { -+ int *q = &i; -+ a[i] *= p[i]; -+ u.u = p[i] + k; -+ k += m + 1; -+ v.v = p[i] + k; -+ s += p[i] + k; -+ } -+ if (u.u != 36 + 4 + 3 * 1023 || v.v != 36 + 4 + 3 * 1024 || i != 1024) -+ abort (); -+ return s; -+} -+ -+__attribute__((noinline, noclone)) int -+bar (int *p) -+{ -+ int i, s = 0; -+ struct U u; -+ struct V v; -+ #pragma omp simd aligned(a, p : 32) linear(k: m + 1) \ -+ reduction(+:s) lastprivate(u, v) -+ for (i = 0; i < 1024; i++) -+ { -+ int *q = &i; -+ a[i] *= p[i]; -+ u.u = p[i] + k; -+ k += m + 1; -+ v.v = p[i] + k; -+ s += p[i] + k; -+ } -+ if (u.u != 36 + 4 + 3 * 1023 || v.v != 36 + 4 + 3 * 1024 || i != 1024) -+ abort (); -+ return s; -+} -+ -+int -+main () -+{ -+#if __SIZEOF_INT__ >= 4 -+ int i; -+ k = 4; -+ m = 2; -+ for (i = 0; i < 1024; i++) -+ { -+ a[i] = i - 512; -+ b[i] = (i - 51) % 39; -+ } -+ int s = foo (b); -+ for (i = 0; i < 1024; i++) -+ { -+ if (b[i] != (i - 51) % 39 -+ || a[i] != (i - 512) * b[i]) -+ abort (); -+ } -+ if (k != 4 + 3 * 1024 || s != 1596127) -+ abort (); -+ k = 4; -+ m = 2; -+ for (i = 0; i < 1024; i++) -+ { -+ a[i] = i - 512; -+ b[i] = (i - 51) % 39; -+ } -+ s = bar (b); -+ for (i = 0; i < 1024; i++) -+ { -+ if (b[i] != (i - 51) % 39 -+ || a[i] != (i - 512) * b[i]) -+ abort (); -+ } -+ if (k != 4 + 3 * 1024 || s != 1596127) -+ abort (); -+#endif -+ return 0; -+} -Index: libgomp/testsuite/libgomp.c/simd-10.c -=================================================================== ---- a/src/libgomp/testsuite/libgomp.c/simd-10.c (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.c/simd-10.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,26 @@ -+/* { dg-do run } */ -+/* { dg-options "-O2" } */ -+/* { dg-additional-options "-msse2" { target sse2_runtime } } */ -+/* { dg-additional-options "-mavx" { target avx_runtime } } */ -+ -+int s = 0, i, u; -+ -+void -+foo () -+{ -+ #pragma omp for simd schedule(static, 32) reduction(+:s) lastprivate(u) -+ for (i = 0; i < 128; i++) -+ { -+ s++; -+ u = i; -+ } -+ if (i != 128 || s != 128 || u != 127) -+ __builtin_abort (); -+} -+ -+int -+main () -+{ -+ foo (); -+ return 0; -+} -Index: libgomp/testsuite/libgomp.c/simd-14.c -=================================================================== ---- a/src/libgomp/testsuite/libgomp.c/simd-14.c (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.c/simd-14.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,123 @@ -+/* { dg-do run } */ -+/* { dg-options "-O2" } */ -+/* { dg-additional-options "-msse2" { target sse2_runtime } } */ -+/* { dg-additional-options "-mavx" { target avx_runtime } } */ -+ -+int -+main () -+{ -+ int i, j, b, c = 0; -+ i = 4; j = 4; b = 7; -+ #pragma omp simd linear(b:2) reduction(+:c) -+ for (i = 0; i < 64; i++) -+ { -+ c = c + (b != 7 + 2 * i); -+ b = b + 2; -+ } -+ if (c || i != 64 || b != 7 + 64 * 2) -+ __builtin_abort (); -+ i = 4; j = 4; b = 7; -+ #pragma omp simd linear(b:3) reduction(+:c) -+ for (i = 0; i < 64; i += 4) -+ { -+ c = c + (b != 7 + i / 4 * 3); -+ b = b + 3; -+ } -+ if (c || i != 64 || b != 7 + 16 * 3) -+ __builtin_abort (); -+ i = 4; j = 4; b = 7; -+ #pragma omp simd linear(i) linear(b:2) reduction(+:c) -+ for (i = 0; i < 64; i++) -+ { -+ c = c + (b != 7 + 2 * i); -+ b = b + 2; -+ } -+ if (c || i != 64 || b != 7 + 64 * 2) -+ __builtin_abort (); -+ i = 4; j = 4; b = 7; -+ #pragma omp simd linear(i:4) linear(b:3) reduction(+:c) -+ for (i = 0; i < 64; i += 4) -+ { -+ c = c + (b != 7 + i / 4 * 3); -+ b = b + 3; -+ } -+ if (c || i != 64 || b != 7 + 16 * 3) -+ __builtin_abort (); -+ i = 4; j = 4; b = 7; -+ #pragma omp simd collapse (2) linear(b:2) reduction(+:c) -+ for (i = 0; i < 8; i++) -+ for (j = 0; j < 8; j++) -+ { -+ c = c + (b != 7 + 2 * j + 2 * 8 * i); -+ b = b + 2; -+ } -+ if (c || i != 8 || j != 8 || b != 7 + 64 * 2) -+ __builtin_abort (); -+ i = 4; j = 4; b = 7; -+ #pragma omp simd collapse (2) lastprivate (i, j) linear(b:2) reduction(+:c) -+ for (i = 0; i < 8; i++) -+ for (j = 0; j < 8; j++) -+ { -+ c = c + (b != 7 + 2 * j + 2 * 8 * i); -+ b = b + 2; -+ } -+ if (c || i != 8 || j != 8 || b != 7 + 64 * 2) -+ __builtin_abort (); -+ i = 4; j = 4; b = 7; -+ #pragma omp parallel for simd schedule (static, 4) linear(b:2) reduction(+:c) -+ for (i = 0; i < 64; i++) -+ { -+ c = c + (b != 7 + 2 * i); -+ b = b + 2; -+ } -+ if (c || i != 64 || b != 7 + 64 * 2) -+ __builtin_abort (); -+ i = 4; j = 4; b = 7; -+ #pragma omp parallel for simd schedule (static, 4) linear(b:3) reduction(+:c) -+ for (i = 0; i < 64; i += 4) -+ { -+ c = c + (b != 7 + i / 4 * 3); -+ b = b + 3; -+ } -+ if (c || i != 64 || b != 7 + 16 * 3) -+ __builtin_abort (); -+ i = 4; j = 4; b = 7; -+ #pragma omp parallel for simd schedule (static, 4) linear(i) linear(b:2) reduction(+:c) -+ for (i = 0; i < 64; i++) -+ { -+ c = c + (b != 7 + 2 * i); -+ b = b + 2; -+ } -+ if (c || i != 64 || b != 7 + 64 * 2) -+ __builtin_abort (); -+ i = 4; j = 4; b = 7; -+ #pragma omp parallel for simd schedule (static, 4) linear(i:4) linear(b:3) reduction(+:c) -+ for (i = 0; i < 64; i += 4) -+ { -+ c = c + (b != 7 + i / 4 * 3); -+ b = b + 3; -+ } -+ if (c || i != 64 || b != 7 + 16 * 3) -+ __builtin_abort (); -+ i = 4; j = 4; b = 7; -+ #pragma omp parallel for simd lastprivate (i, j) collapse (2) schedule (static, 4) linear(b:2) reduction(+:c) -+ for (i = 0; i < 8; i++) -+ for (j = 0; j < 8; j++) -+ { -+ c = c + (b != 7 + 2 * j + 2 * 8 * i); -+ b = b + 2; -+ } -+ if (c || i != 8 || j != 8 || b != 7 + 64 * 2) -+ __builtin_abort (); -+ i = 4; j = 4; b = 7; -+ #pragma omp parallel for simd collapse (2) schedule (static, 4) linear(b:2) reduction(+:c) -+ for (i = 0; i < 8; i++) -+ for (j = 0; j < 8; j++) -+ { -+ c = c + (b != 7 + 2 * j + 2 * 8 * i); -+ b = b + 2; -+ } -+ if (c || i != 8 || j != 8 || b != 7 + 64 * 2) -+ __builtin_abort (); -+ return 0; -+} -Index: libgomp/testsuite/libgomp.c/target-8.c -=================================================================== ---- a/src/libgomp/testsuite/libgomp.c/target-8.c (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.c/target-8.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,26 @@ -+/* { dg-do run } */ -+/* { dg-options "-fopenmp" } */ -+ -+void -+foo (int *p) -+{ -+ int i; -+ #pragma omp parallel -+ #pragma omp single -+ #pragma omp target teams distribute parallel for map(p[0:24]) -+ for (i = 0; i < 24; i++) -+ p[i] = p[i] + 1; -+} -+ -+int -+main () -+{ -+ int p[24], i; -+ for (i = 0; i < 24; i++) -+ p[i] = i; -+ foo (p); -+ for (i = 0; i < 24; i++) -+ if (p[i] != i + 1) -+ __builtin_abort (); -+ return 0; -+} -Index: libgomp/testsuite/libgomp.c/atomic-17.c -=================================================================== ---- a/src/libgomp/testsuite/libgomp.c/atomic-17.c (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.c/atomic-17.c (.../branches/gcc-4_9-branch) -@@ -13,13 +13,13 @@ - v = x; - if (v != 3) - abort (); -- #pragma omp atomic update seq_cst -+ #pragma omp atomic seq_cst update - x = 3 * 2 * 1 + x; -- #pragma omp atomic read seq_cst -+ #pragma omp atomic read, seq_cst - v = x; - if (v != 9) - abort (); -- #pragma omp atomic capture seq_cst -+ #pragma omp atomic seq_cst, capture - v = x = x | 16; - if (v != 25) - abort (); -@@ -27,15 +27,15 @@ - v = x = x + 14 * 2 / 4; - if (v != 32) - abort (); -- #pragma omp atomic capture seq_cst -+ #pragma omp atomic seq_cst capture - v = x = 5 | x; - if (v != 37) - abort (); -- #pragma omp atomic capture seq_cst -+ #pragma omp atomic capture, seq_cst - v = x = 40 + 12 - 2 - 7 - x; - if (v != 6) - abort (); -- #pragma omp atomic read seq_cst -+ #pragma omp atomic seq_cst read - v = x; - if (v != 6) - abort (); -@@ -43,7 +43,7 @@ - { v = x; x = 3 + x; } - if (v != 6) - abort (); -- #pragma omp atomic capture seq_cst -+ #pragma omp atomic seq_cst capture - { v = x; x = -1 * -1 * -1 * -1 - x; } - if (v != 9) - abort (); -@@ -51,11 +51,11 @@ - v = x; - if (v != -8) - abort (); -- #pragma omp atomic capture seq_cst -+ #pragma omp atomic capture, seq_cst - { x = 2 * 2 - x; v = x; } - if (v != 12) - abort (); -- #pragma omp atomic capture seq_cst -+ #pragma omp atomic seq_cst capture - { x = 7 & x; v = x; } - if (v != 4) - abort (); -@@ -63,7 +63,7 @@ - { v = x; x = 6; } - if (v != 4) - abort (); -- #pragma omp atomic read seq_cst -+ #pragma omp atomic read, seq_cst - v = x; - if (v != 6) - abort (); -@@ -71,11 +71,11 @@ - { v = x; x = 7 * 8 + 23; } - if (v != 6) - abort (); -- #pragma omp atomic read seq_cst -+ #pragma omp atomic seq_cst, read - v = x; - if (v != 79) - abort (); -- #pragma omp atomic capture seq_cst -+ #pragma omp atomic capture , seq_cst - { v = x; x = 23 + 6 * 4; } - if (v != 79) - abort (); -@@ -83,7 +83,7 @@ - v = x; - if (v != 47) - abort (); -- #pragma omp atomic capture seq_cst -+ #pragma omp atomic seq_cst capture - { v = x; x = l ? 17 : 12; } - if (v != 47) - abort (); -Index: libgomp/testsuite/libgomp.c/simd-8.c -=================================================================== ---- a/src/libgomp/testsuite/libgomp.c/simd-8.c (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.c/simd-8.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,44 @@ -+/* { dg-do run } */ -+/* { dg-options "-O2" } */ -+/* { dg-additional-options "-msse2" { target sse2_runtime } } */ -+/* { dg-additional-options "-mavx" { target avx_runtime } } */ -+ -+extern void abort (); -+int a[32][32] __attribute__((aligned (32))) = { { 1 } }; -+struct S { int s; }; -+#pragma omp declare reduction (+:struct S:omp_out.s += omp_in.s) -+#pragma omp declare reduction (foo:struct S:omp_out.s += omp_in.s) -+#pragma omp declare reduction (foo:int:omp_out += omp_in) -+ -+__attribute__((noinline, noclone)) int -+foo (void) -+{ -+ int i, j, u = 0; -+ struct S s, t; -+ s.s = 0; t.s = 0; -+ #pragma omp simd aligned(a : 32) reduction(+:s) reduction(foo:t, u) collapse(2) -+ for (i = 0; i < 32; i++) -+ for (j = 0; j < 32; j++) -+ { -+ int x = a[i][j]; -+ s.s += x; -+ t.s += x; -+ u += x; -+ } -+ if (t.s != s.s || u != s.s) -+ abort (); -+ return s.s; -+} -+ -+int -+main () -+{ -+ int i, j; -+ for (i = 0; i < 32; i++) -+ for (j = 0; j < 32; j++) -+ a[i][j] = j + (i / 4); -+ int s = foo (); -+ if (s != 19456) -+ abort (); -+ return 0; -+} -Index: libgomp/testsuite/libgomp.c/simd-11.c -=================================================================== ---- a/src/libgomp/testsuite/libgomp.c/simd-11.c (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.c/simd-11.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,27 @@ -+/* { dg-do run } */ -+/* { dg-options "-O2" } */ -+/* { dg-additional-options "-msse2" { target sse2_runtime } } */ -+/* { dg-additional-options "-mavx" { target avx_runtime } } */ -+ -+int s = 0, i, j, u; -+ -+void -+foo () -+{ -+ #pragma omp for simd schedule(static, 32) reduction(+:s) lastprivate(u) collapse(2) -+ for (i = 0; i < 16; i++) -+ for (j = 0; j < 16; j++) -+ { -+ s++; -+ u = i + j; -+ } -+ if (i != 16 || j != 16 || s != 256 || u != 30) -+ __builtin_abort (); -+} -+ -+int -+main () -+{ -+ foo (); -+ return 0; -+} -Index: libgomp/testsuite/libgomp.c/simd-15.c -=================================================================== ---- a/src/libgomp/testsuite/libgomp.c/simd-15.c (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/testsuite/libgomp.c/simd-15.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,129 @@ -+/* { dg-do run } */ -+/* { dg-options "-O2" } */ -+/* { dg-additional-options "-msse2" { target sse2_runtime } } */ -+/* { dg-additional-options "-mavx" { target avx_runtime } } */ -+ -+static inline void -+foo (int *b, int *i, int *j, int x) -+{ -+ *b = *b + x + (*i - *i) + (*j - *j); -+} -+ -+int -+main () -+{ -+ int i, j, b, c = 0; -+ i = 4; j = 4; b = 7; -+ #pragma omp simd linear(b:2) reduction(+:c) -+ for (i = 0; i < 64; i++) -+ { -+ c = c + (b != 7 + 2 * i); -+ foo (&b, &i, &j, 2); -+ } -+ if (c || i != 64 || b != 7 + 64 * 2) -+ __builtin_abort (); -+ i = 4; j = 4; b = 7; -+ #pragma omp simd linear(b:3) reduction(+:c) -+ for (i = 0; i < 64; i += 4) -+ { -+ c = c + (b != 7 + i / 4 * 3); -+ foo (&b, &i, &j, 3); -+ } -+ if (c || i != 64 || b != 7 + 16 * 3) -+ __builtin_abort (); -+ i = 4; j = 4; b = 7; -+ #pragma omp simd linear(i) linear(b:2) reduction(+:c) -+ for (i = 0; i < 64; i++) -+ { -+ c = c + (b != 7 + 2 * i); -+ foo (&b, &i, &j, 2); -+ } -+ if (c || i != 64 || b != 7 + 64 * 2) -+ __builtin_abort (); -+ i = 4; j = 4; b = 7; -+ #pragma omp simd linear(i:4) linear(b:3) reduction(+:c) -+ for (i = 0; i < 64; i += 4) -+ { -+ c = c + (b != 7 + i / 4 * 3); -+ foo (&b, &i, &j, 3); -+ } -+ if (c || i != 64 || b != 7 + 16 * 3) -+ __builtin_abort (); -+ i = 4; j = 4; b = 7; -+ #pragma omp simd collapse (2) linear(b:2) reduction(+:c) -+ for (i = 0; i < 8; i++) -+ for (j = 0; j < 8; j++) -+ { -+ c = c + (b != 7 + 2 * j + 2 * 8 * i); -+ foo (&b, &i, &j, 2); -+ } -+ if (c || i != 8 || j != 8 || b != 7 + 64 * 2) -+ __builtin_abort (); -+ i = 4; j = 4; b = 7; -+ #pragma omp simd collapse (2) lastprivate (i, j) linear(b:2) reduction(+:c) -+ for (i = 0; i < 8; i++) -+ for (j = 0; j < 8; j++) -+ { -+ c = c + (b != 7 + 2 * j + 2 * 8 * i); -+ foo (&b, &i, &j, 2); -+ } -+ if (c || i != 8 || j != 8 || b != 7 + 64 * 2) -+ __builtin_abort (); -+ i = 4; j = 4; b = 7; -+ #pragma omp parallel for simd schedule (static, 4) linear(b:2) reduction(+:c) -+ for (i = 0; i < 64; i++) -+ { -+ c = c + (b != 7 + 2 * i); -+ foo (&b, &i, &j, 2); -+ } -+ if (c || i != 64 || b != 7 + 64 * 2) -+ __builtin_abort (); -+ i = 4; j = 4; b = 7; -+ #pragma omp parallel for simd schedule (static, 4) linear(b:3) reduction(+:c) -+ for (i = 0; i < 64; i += 4) -+ { -+ c = c + (b != 7 + i / 4 * 3); -+ foo (&b, &i, &j, 3); -+ } -+ if (c || i != 64 || b != 7 + 16 * 3) -+ __builtin_abort (); -+ i = 4; j = 4; b = 7; -+ #pragma omp parallel for simd schedule (static, 4) linear(i) linear(b:2) reduction(+:c) -+ for (i = 0; i < 64; i++) -+ { -+ c = c + (b != 7 + 2 * i); -+ foo (&b, &i, &j, 2); -+ } -+ if (c || i != 64 || b != 7 + 64 * 2) -+ __builtin_abort (); -+ i = 4; j = 4; b = 7; -+ #pragma omp parallel for simd schedule (static, 4) linear(i:4) linear(b:3) reduction(+:c) -+ for (i = 0; i < 64; i += 4) -+ { -+ c = c + (b != 7 + i / 4 * 3); -+ foo (&b, &i, &j, 3); -+ } -+ if (c || i != 64 || b != 7 + 16 * 3) -+ __builtin_abort (); -+ i = 4; j = 4; b = 7; -+ #pragma omp parallel for simd lastprivate (i, j) collapse (2) schedule (static, 4) linear(b:2) reduction(+:c) -+ for (i = 0; i < 8; i++) -+ for (j = 0; j < 8; j++) -+ { -+ c = c + (b != 7 + 2 * j + 2 * 8 * i); -+ foo (&b, &i, &j, 2); -+ } -+ if (c || i != 8 || j != 8 || b != 7 + 64 * 2) -+ __builtin_abort (); -+ i = 4; j = 4; b = 7; -+ #pragma omp parallel for simd collapse (2) schedule (static, 4) linear(b:2) reduction(+:c) -+ for (i = 0; i < 8; i++) -+ for (j = 0; j < 8; j++) -+ { -+ c = c + (b != 7 + 2 * j + 2 * 8 * i); -+ foo (&b, &i, &j, 2); -+ } -+ if (c || i != 8 || j != 8 || b != 7 + 64 * 2) -+ __builtin_abort (); -+ return 0; -+} -Index: libgomp/omp_lib.h.in -=================================================================== ---- a/src/libgomp/omp_lib.h.in (.../tags/gcc_4_9_0_release) -+++ b/src/libgomp/omp_lib.h.in (.../branches/gcc-4_9-branch) -@@ -45,7 +45,7 @@ - parameter (omp_proc_bind_master = 2) - parameter (omp_proc_bind_close = 3) - parameter (omp_proc_bind_spread = 4) -- parameter (openmp_version = 201107) -+ parameter (openmp_version = 201307) - - external omp_init_lock, omp_init_nest_lock - external omp_destroy_lock, omp_destroy_nest_lock -Index: libstdc++-v3/python/libstdcxx/v6/printers.py -=================================================================== ---- a/src/libstdc++-v3/python/libstdcxx/v6/printers.py (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/python/libstdcxx/v6/printers.py (.../branches/gcc-4_9-branch) -@@ -375,6 +375,22 @@ - self.node = node - return result - -+def get_value_from_Rb_tree_node(node): -+ """Returns the value held in an _Rb_tree_node<_Val>""" -+ try: -+ member = node.type.fields()[1].name -+ if member == '_M_value_field': -+ # C++03 implementation, node contains the value as a member -+ return node['_M_value_field'] -+ elif member == '_M_storage': -+ # C++11 implementation, node stores value in __aligned_buffer -+ p = node['_M_storage']['_M_storage'].address -+ p = p.cast(node.type.template_argument(0).pointer()) -+ return p.dereference() -+ except: -+ pass -+ raise ValueError, "Unsupported implementation for %s" % str(node.type) -+ - # This is a pretty printer for std::_Rb_tree_iterator (which is - # std::map::iterator), and has nothing to do with the RbtreeIterator - # class above. -@@ -387,7 +403,8 @@ - def to_string (self): - typename = str(self.val.type.strip_typedefs()) + '::_Link_type' - nodetype = gdb.lookup_type(typename).strip_typedefs() -- return self.val.cast(nodetype).dereference()['_M_value_field'] -+ node = self.val.cast(nodetype).dereference() -+ return get_value_from_Rb_tree_node(node) - - class StdDebugIteratorPrinter: - "Print a debug enabled version of an iterator" -@@ -417,7 +434,8 @@ - def next(self): - if self.count % 2 == 0: - n = self.rbiter.next() -- n = n.cast(self.type).dereference()['_M_value_field'] -+ n = n.cast(self.type).dereference() -+ n = get_value_from_Rb_tree_node(n) - self.pair = n - item = n['first'] - else: -@@ -458,7 +476,8 @@ - - def next(self): - item = self.rbiter.next() -- item = item.cast(self.type).dereference()['_M_value_field'] -+ item = item.cast(self.type).dereference() -+ item = get_value_from_Rb_tree_node(item) - # FIXME: this is weird ... what to do? - # Maybe a 'set' display hint? - result = ('[%d]' % self.count, item) -Index: libstdc++-v3/scripts/run_doxygen -=================================================================== ---- a/src/libstdc++-v3/scripts/run_doxygen (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/scripts/run_doxygen (.../branches/gcc-4_9-branch) -@@ -193,8 +193,15 @@ - if $do_latex; then - cd ${outdir}/${mode} - -- # Also drop in the header file and style sheet -- doxygen -w latex header.tex doxygen.sty -+ # Grrr, Doxygen 1.8.x changed the -w latex options. -+ need_footer=`doxygen -h | sed -n -e '/-w latex/s=.*footer.*=true=p'` -+ -+ # Also drop in the header file (maybe footer file) and style sheet -+ if $need_footer; then -+ doxygen -w latex header.tex footer.tex doxygen.sty -+ else -+ doxygen -w latex header.tex doxygen.sty -+ fi - - echo :: - echo :: LaTeX pages begin with -Index: libstdc++-v3/src/c++98/ios_init.cc -=================================================================== ---- a/src/libstdc++-v3/src/c++98/ios_init.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/src/c++98/ios_init.cc (.../branches/gcc-4_9-branch) -@@ -37,7 +37,7 @@ - { - using namespace __gnu_cxx; - -- // Extern declarations for global objects in src/globals.cc. -+ // Extern declarations for global objects in src/c++98/globals.cc. - extern stdio_sync_filebuf<char> buf_cout_sync; - extern stdio_sync_filebuf<char> buf_cin_sync; - extern stdio_sync_filebuf<char> buf_cerr_sync; -Index: libstdc++-v3/doc/xml/faq.xml -=================================================================== ---- a/src/libstdc++-v3/doc/xml/faq.xml (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/doc/xml/faq.xml (.../branches/gcc-4_9-branch) -@@ -241,7 +241,7 @@ - </question> - <answer xml:id="a-license.what_restrictions"> - <para> -- None. We encourage such programs to be released as open source, -+ None. We encourage such programs to be released as free software, - but we won't punish you or sue you if you choose otherwise. - </para> - </answer> -Index: libstdc++-v3/doc/html/faq.html -=================================================================== ---- a/src/libstdc++-v3/doc/html/faq.html (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/doc/html/faq.html (.../branches/gcc-4_9-branch) -@@ -223,7 +223,7 @@ - </p></td></tr><tr class="question"><td align="left" valign="top"><a id="faq.license.what_restrictions"></a><a id="q-license.what_restrictions"></a><p><strong>2.4.</strong></p></td><td align="left" valign="top"><p> - I see. So, what restrictions are there on programs that use the library? - </p></td></tr><tr class="answer"><td align="left" valign="top"><a id="a-license.what_restrictions"></a></td><td align="left" valign="top"><p> -- None. We encourage such programs to be released as open source, -+ None. We encourage such programs to be released as free software, - but we won't punish you or sue you if you choose otherwise. - </p></td></tr><tr class="toc"><td align="left" valign="top" colspan="2"><dl><dt>3.1. <a href="faq.html#faq.how_to_install">How do I install libstdc++? - </a></dt><dt>3.2. <a href="faq.html#faq.how_to_get_sources">How does one get current libstdc++ sources? -Index: libstdc++-v3/include/debug/vector -=================================================================== ---- a/src/libstdc++-v3/include/debug/vector (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/include/debug/vector (.../branches/gcc-4_9-branch) -@@ -602,7 +602,7 @@ - } - else - #if __cplusplus >= 201103L -- return iterator(__first.base()._M_const_cast(), this); -+ return begin() + (__first.base() - cbegin().base()); - #else - return __first; - #endif -Index: libstdc++-v3/include/std/iostream -=================================================================== ---- a/src/libstdc++-v3/include/std/iostream (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/include/std/iostream (.../branches/gcc-4_9-branch) -@@ -48,13 +48,13 @@ - * - * The <iostream> header declares the eight <em>standard stream - * objects</em>. For other declarations, see -- * http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt11ch24.html -+ * http://gcc.gnu.org/onlinedocs/libstdc++/manual/io.html - * and the @link iosfwd I/O forward declarations @endlink - * - * They are required by default to cooperate with the global C - * library's @c FILE streams, and to be available during program -- * startup and termination. For more information, see the HOWTO -- * linked to above. -+ * startup and termination. For more information, see the section of the -+ * manual linked to above. - */ - //@{ - extern istream cin; /// Linked to standard input -Index: libstdc++-v3/include/std/tuple -=================================================================== ---- a/src/libstdc++-v3/include/std/tuple (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/include/std/tuple (.../branches/gcc-4_9-branch) -@@ -710,27 +710,28 @@ - add_cv<typename tuple_element<__i, _Tp>::type>::type type; - }; - -+#if __cplusplus > 201103L -+ template<std::size_t __i, typename _Tp> -+ using tuple_element_t = typename tuple_element<__i, _Tp>::type; -+#endif -+ - /// Finds the size of a given tuple type. - template<typename _Tp> - struct tuple_size; - -+ // _GLIBCXX_RESOLVE_LIB_DEFECTS -+ // 2313. tuple_size should always derive from integral_constant<size_t, N> - template<typename _Tp> - struct tuple_size<const _Tp> -- : public integral_constant< -- typename remove_cv<decltype(tuple_size<_Tp>::value)>::type, -- tuple_size<_Tp>::value> { }; -+ : public integral_constant<size_t, tuple_size<_Tp>::value> { }; - - template<typename _Tp> - struct tuple_size<volatile _Tp> -- : public integral_constant< -- typename remove_cv<decltype(tuple_size<_Tp>::value)>::type, -- tuple_size<_Tp>::value> { }; -+ : public integral_constant<size_t, tuple_size<_Tp>::value> { }; - - template<typename _Tp> - struct tuple_size<const volatile _Tp> -- : public integral_constant< -- typename remove_cv<decltype(tuple_size<_Tp>::value)>::type, -- tuple_size<_Tp>::value> { }; -+ : public integral_constant<size_t, tuple_size<_Tp>::value> { }; - - /// class tuple_size - template<typename... _Elements> -@@ -747,23 +748,23 @@ - __get_helper(const _Tuple_impl<__i, _Head, _Tail...>& __t) noexcept - { return _Tuple_impl<__i, _Head, _Tail...>::_M_head(__t); } - -- // Return a reference (const reference, rvalue reference) to the ith element -- // of a tuple. Any const or non-const ref elements are returned with their -- // original type. -+ /// Return a reference to the ith element of a tuple. - template<std::size_t __i, typename... _Elements> - constexpr typename __add_ref< - typename tuple_element<__i, tuple<_Elements...>>::type - >::type - get(tuple<_Elements...>& __t) noexcept -- { return __get_helper<__i>(__t); } -+ { return std::__get_helper<__i>(__t); } - -+ /// Return a const reference to the ith element of a const tuple. - template<std::size_t __i, typename... _Elements> - constexpr typename __add_c_ref< - typename tuple_element<__i, tuple<_Elements...>>::type - >::type - get(const tuple<_Elements...>& __t) noexcept -- { return __get_helper<__i>(__t); } -+ { return std::__get_helper<__i>(__t); } - -+ /// Return an rvalue reference to the ith element of a tuple rvalue. - template<std::size_t __i, typename... _Elements> - constexpr typename __add_r_ref< - typename tuple_element<__i, tuple<_Elements...>>::type -@@ -783,22 +784,26 @@ - __get_helper2(const _Tuple_impl<__i, _Head, _Tail...>& __t) noexcept - { return _Tuple_impl<__i, _Head, _Tail...>::_M_head(__t); } - -+ /// Return a reference to the unique element of type _Tp of a tuple. - template <typename _Tp, typename... _Types> - constexpr _Tp& - get(tuple<_Types...>& __t) noexcept -- { return __get_helper2<_Tp>(__t); } -+ { return std::__get_helper2<_Tp>(__t); } - -+ /// Return a reference to the unique element of type _Tp of a tuple rvalue. - template <typename _Tp, typename... _Types> - constexpr _Tp&& - get(tuple<_Types...>&& __t) noexcept -- { return std::move(__get_helper2<_Tp>(__t)); } -+ { return std::forward<_Tp&&>(std::__get_helper2<_Tp>(__t)); } - -+ /// Return a const reference to the unique element of type _Tp of a tuple. - template <typename _Tp, typename... _Types> - constexpr const _Tp& - get(const tuple<_Types...>& __t) noexcept -- { return __get_helper2<_Tp>(__t); } -+ { return std::__get_helper2<_Tp>(__t); } - #endif - -+ - // This class helps construct the various comparison operations on tuples - template<std::size_t __check_equal_size, std::size_t __i, std::size_t __j, - typename _Tp, typename _Up> -Index: libstdc++-v3/include/std/iomanip -=================================================================== ---- a/src/libstdc++-v3/include/std/iomanip (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/include/std/iomanip (.../branches/gcc-4_9-branch) -@@ -41,7 +41,10 @@ - - #if __cplusplus >= 201103L - #include <locale> -+#if __cplusplus > 201103L -+#include <sstream> // used in quoted. - #endif -+#endif - - namespace std _GLIBCXX_VISIBILITY(default) - { -@@ -342,7 +345,6 @@ - - /** - * @brief Struct for delimited strings. -- * The left and right delimiters can be different. - */ - template<typename _String, typename _CharT> - struct _Quoted_string -@@ -364,8 +366,10 @@ - }; - - /** -- * @brief Inserter for delimited strings. -- * The left and right delimiters can be different. -+ * @brief Inserter for quoted strings. -+ * -+ * _GLIBCXX_RESOLVE_LIB_DEFECTS -+ * DR 2344 quoted()'s interaction with padding is unclear - */ - template<typename _CharT, typename _Traits> - auto& -@@ -372,21 +376,24 @@ - operator<<(std::basic_ostream<_CharT, _Traits>& __os, - const _Quoted_string<const _CharT*, _CharT>& __str) - { -- __os << __str._M_delim; -+ std::basic_ostringstream<_CharT, _Traits> __ostr; -+ __ostr << __str._M_delim; - for (const _CharT* __c = __str._M_string; *__c; ++__c) - { - if (*__c == __str._M_delim || *__c == __str._M_escape) -- __os << __str._M_escape; -- __os << *__c; -+ __ostr << __str._M_escape; -+ __ostr << *__c; - } -- __os << __str._M_delim; -+ __ostr << __str._M_delim; - -- return __os; -+ return __os << __ostr.str(); - } - - /** -- * @brief Inserter for delimited strings. -- * The left and right delimiters can be different. -+ * @brief Inserter for quoted strings. -+ * -+ * _GLIBCXX_RESOLVE_LIB_DEFECTS -+ * DR 2344 quoted()'s interaction with padding is unclear - */ - template<typename _CharT, typename _Traits, typename _String> - auto& -@@ -393,16 +400,17 @@ - operator<<(std::basic_ostream<_CharT, _Traits>& __os, - const _Quoted_string<_String, _CharT>& __str) - { -- __os << __str._M_delim; -+ std::basic_ostringstream<_CharT, _Traits> __ostr; -+ __ostr << __str._M_delim; - for (auto& __c : __str._M_string) - { - if (__c == __str._M_delim || __c == __str._M_escape) -- __os << __str._M_escape; -- __os << __c; -+ __ostr << __str._M_escape; -+ __ostr << __c; - } -- __os << __str._M_delim; -+ __ostr << __str._M_delim; - -- return __os; -+ return __os << __ostr.str(); - } - - /** -Index: libstdc++-v3/include/std/type_traits -=================================================================== ---- a/src/libstdc++-v3/include/std/type_traits (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/include/std/type_traits (.../branches/gcc-4_9-branch) -@@ -37,6 +37,18 @@ - - #include <bits/c++config.h> - -+#ifdef _GLIBCXX_USE_C99_STDINT_TR1 -+# if defined (__UINT_LEAST16_TYPE__) && defined(__UINT_LEAST32_TYPE__) -+namespace std -+{ -+ typedef __UINT_LEAST16_TYPE__ uint_least16_t; -+ typedef __UINT_LEAST32_TYPE__ uint_least32_t; -+} -+# else -+# include <cstdint> -+# endif -+#endif -+ - namespace std _GLIBCXX_VISIBILITY(default) - { - _GLIBCXX_BEGIN_NAMESPACE_VERSION -@@ -1583,6 +1595,12 @@ - struct __make_unsigned<long long> - { typedef unsigned long long __type; }; - -+#if defined(_GLIBCXX_USE_WCHAR_T) && !defined(__WCHAR_UNSIGNED__) -+ template<> -+ struct __make_unsigned<wchar_t> : __make_unsigned<__WCHAR_TYPE__> -+ { }; -+#endif -+ - #if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_INT128) - template<> - struct __make_unsigned<__int128> -@@ -1665,6 +1683,21 @@ - struct __make_signed<unsigned long long> - { typedef signed long long __type; }; - -+#if defined(_GLIBCXX_USE_WCHAR_T) && defined(__WCHAR_UNSIGNED__) -+ template<> -+ struct __make_signed<wchar_t> : __make_signed<__WCHAR_TYPE__> -+ { }; -+#endif -+ -+#ifdef _GLIBCXX_USE_C99_STDINT_TR1 -+ template<> -+ struct __make_signed<char16_t> : __make_signed<uint_least16_t> -+ { }; -+ template<> -+ struct __make_signed<char32_t> : __make_signed<uint_least32_t> -+ { }; -+#endif -+ - #if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_INT128) - template<> - struct __make_signed<unsigned __int128> -Index: libstdc++-v3/include/std/future -=================================================================== ---- a/src/libstdc++-v3/include/std/future (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/include/std/future (.../branches/gcc-4_9-branch) -@@ -365,12 +365,14 @@ - void - _M_set_result(function<_Ptr_type()> __res, bool __ignore_failure = false) - { -- bool __set = __ignore_failure; -+ bool __set = false; - // all calls to this function are serialized, - // side-effects of invoking __res only happen once - call_once(_M_once, &_State_baseV2::_M_do_set, this, ref(__res), - ref(__set)); -- if (!__set) -+ if (__set) -+ _M_cond.notify_all(); -+ else if (!__ignore_failure) - __throw_future_error(int(future_errc::promise_already_satisfied)); - } - -@@ -485,7 +487,6 @@ - lock_guard<mutex> __lock(_M_mutex); - _M_result.swap(__res); - } -- _M_cond.notify_all(); - __set = true; - } - -@@ -495,6 +496,7 @@ - virtual void _M_complete_async() { } - - // Return true if state contains a deferred function. -+ // Caller must own _M_mutex. - virtual bool _M_has_deferred() const { return false; } - }; - -@@ -1007,22 +1009,25 @@ - void - set_value(const _Res& __r) - { -+ auto __future = _M_future; - auto __setter = _State::__setter(this, __r); -- _M_future->_M_set_result(std::move(__setter)); -+ __future->_M_set_result(std::move(__setter)); - } - - void - set_value(_Res&& __r) - { -+ auto __future = _M_future; - auto __setter = _State::__setter(this, std::move(__r)); -- _M_future->_M_set_result(std::move(__setter)); -+ __future->_M_set_result(std::move(__setter)); - } - - void - set_exception(exception_ptr __p) - { -+ auto __future = _M_future; - auto __setter = _State::__setter(__p, this); -- _M_future->_M_set_result(std::move(__setter)); -+ __future->_M_set_result(std::move(__setter)); - } - }; - -@@ -1105,15 +1110,17 @@ - void - set_value(_Res& __r) - { -+ auto __future = _M_future; - auto __setter = _State::__setter(this, __r); -- _M_future->_M_set_result(std::move(__setter)); -+ __future->_M_set_result(std::move(__setter)); - } - - void - set_exception(exception_ptr __p) - { -+ auto __future = _M_future; - auto __setter = _State::__setter(__p, this); -- _M_future->_M_set_result(std::move(__setter)); -+ __future->_M_set_result(std::move(__setter)); - } - }; - -@@ -1190,8 +1197,9 @@ - void - set_exception(exception_ptr __p) - { -+ auto __future = _M_future; - auto __setter = _State::__setter(__p, this); -- _M_future->_M_set_result(std::move(__setter)); -+ __future->_M_set_result(std::move(__setter)); - } - }; - -@@ -1217,8 +1225,9 @@ - inline void - promise<void>::set_value() - { -+ auto __future = _M_future; - auto __setter = _State::__setter(this); -- _M_future->_M_set_result(std::move(__setter)); -+ __future->_M_set_result(std::move(__setter)); - } - - -Index: libstdc++-v3/include/std/functional -=================================================================== ---- a/src/libstdc++-v3/include/std/functional (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/include/std/functional (.../branches/gcc-4_9-branch) -@@ -2149,8 +2149,15 @@ - using _Invoke = decltype(__callable_functor(std::declval<_Functor&>()) - (std::declval<_ArgTypes>()...) ); - -+ // Used so the return type convertibility checks aren't done when -+ // performing overload resolution for copy construction/assignment. -+ template<typename _Tp> -+ using _NotSelf = __not_<is_same<_Tp, function>>; -+ - template<typename _Functor> -- using _Callable = __check_func_return_type<_Invoke<_Functor>, _Res>; -+ using _Callable -+ = __and_<_NotSelf<_Functor>, -+ __check_func_return_type<_Invoke<_Functor>, _Res>>; - - template<typename _Cond, typename _Tp> - using _Requires = typename enable_if<_Cond::value, _Tp>::type; -@@ -2291,7 +2298,7 @@ - * reference_wrapper<F>, this function will not throw. - */ - template<typename _Functor> -- _Requires<_Callable<_Functor>, function&> -+ _Requires<_Callable<typename decay<_Functor>::type>, function&> - operator=(_Functor&& __f) - { - function(std::forward<_Functor>(__f)).swap(*this); -Index: libstdc++-v3/include/experimental/optional -=================================================================== ---- a/src/libstdc++-v3/include/experimental/optional (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/include/experimental/optional (.../branches/gcc-4_9-branch) -@@ -736,12 +736,12 @@ - template<typename _Tp> - constexpr bool - operator!=(const optional<_Tp>& __lhs, _Tp const& __rhs) -- { return !__lhs || *__lhs != __rhs; } -+ { return !__lhs || !(*__lhs == __rhs); } - - template<typename _Tp> - constexpr bool - operator!=(const _Tp& __lhs, const optional<_Tp>& __rhs) -- { return !__rhs || __lhs != *__rhs; } -+ { return !__rhs || !(__lhs == *__rhs); } - - template<typename _Tp> - constexpr bool -Index: libstdc++-v3/include/bits/hashtable.h -=================================================================== ---- a/src/libstdc++-v3/include/bits/hashtable.h (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/include/bits/hashtable.h (.../branches/gcc-4_9-branch) -@@ -316,14 +316,49 @@ - size_type _M_element_count; - _RehashPolicy _M_rehash_policy; - -+ // A single bucket used when only need for 1 bucket. Especially -+ // interesting in move semantic to leave hashtable with only 1 buckets -+ // which is not allocated so that we can have those operations noexcept -+ // qualified. -+ // Note that we can't leave hashtable with 0 bucket without adding -+ // numerous checks in the code to avoid 0 modulus. -+ __bucket_type _M_single_bucket; -+ -+ bool -+ _M_uses_single_bucket(__bucket_type* __bkts) const -+ { return __builtin_expect(_M_buckets == &_M_single_bucket, false); } -+ -+ bool -+ _M_uses_single_bucket() const -+ { return _M_uses_single_bucket(_M_buckets); } -+ - __hashtable_alloc& - _M_base_alloc() { return *this; } - -- using __hashtable_alloc::_M_deallocate_buckets; -+ __bucket_type* -+ _M_allocate_buckets(size_type __n) -+ { -+ if (__builtin_expect(__n == 1, false)) -+ { -+ _M_single_bucket = nullptr; -+ return &_M_single_bucket; -+ } - -+ return __hashtable_alloc::_M_allocate_buckets(__n); -+ } -+ - void -+ _M_deallocate_buckets(__bucket_type* __bkts, size_type __n) -+ { -+ if (_M_uses_single_bucket(__bkts)) -+ return; -+ -+ __hashtable_alloc::_M_deallocate_buckets(__bkts, __n); -+ } -+ -+ void - _M_deallocate_buckets() -- { this->_M_deallocate_buckets(_M_buckets, _M_bucket_count); } -+ { _M_deallocate_buckets(_M_buckets, _M_bucket_count); } - - // Gets bucket begin, deals with the fact that non-empty buckets contain - // their before begin node. -@@ -703,11 +738,7 @@ - - size_type - erase(const key_type& __k) -- { -- if (__builtin_expect(_M_bucket_count == 0, false)) -- return 0; -- return _M_erase(__unique_keys(), __k); -- } -+ { return _M_erase(__unique_keys(), __k); } - - iterator - erase(const_iterator, const_iterator); -@@ -768,7 +799,7 @@ - _M_rehash_policy() - { - _M_bucket_count = _M_rehash_policy._M_next_bkt(__bucket_hint); -- _M_buckets = this->_M_allocate_buckets(_M_bucket_count); -+ _M_buckets = _M_allocate_buckets(_M_bucket_count); - } - - template<typename _Key, typename _Value, -@@ -796,7 +827,7 @@ - std::max(_M_rehash_policy._M_bkt_for_elements(__nb_elems), - __bucket_hint)); - -- _M_buckets = this->_M_allocate_buckets(_M_bucket_count); -+ _M_buckets = _M_allocate_buckets(_M_bucket_count); - __try - { - for (; __f != __l; ++__f) -@@ -833,9 +864,9 @@ - { - // Replacement allocator cannot free existing storage. - this->_M_deallocate_nodes(_M_begin()); -- if (__builtin_expect(_M_bucket_count != 0, true)) -- _M_deallocate_buckets(); -- _M_reset(); -+ _M_before_begin._M_nxt = nullptr; -+ _M_deallocate_buckets(); -+ _M_buckets = nullptr; - std::__alloc_on_copy(__this_alloc, __that_alloc); - __hashtable_base::operator=(__ht); - _M_bucket_count = __ht._M_bucket_count; -@@ -867,7 +898,7 @@ - if (_M_bucket_count != __ht._M_bucket_count) - { - __former_buckets = _M_buckets; -- _M_buckets = this->_M_allocate_buckets(__ht._M_bucket_count); -+ _M_buckets = _M_allocate_buckets(__ht._M_bucket_count); - _M_bucket_count = __ht._M_bucket_count; - } - else -@@ -885,8 +916,7 @@ - [&__roan](const __node_type* __n) - { return __roan(__n->_M_v()); }); - if (__former_buckets) -- this->_M_deallocate_buckets(__former_buckets, -- __former_bucket_count); -+ _M_deallocate_buckets(__former_buckets, __former_bucket_count); - } - __catch(...) - { -@@ -917,7 +947,7 @@ - { - __bucket_type* __buckets = nullptr; - if (!_M_buckets) -- _M_buckets = __buckets = this->_M_allocate_buckets(_M_bucket_count); -+ _M_buckets = __buckets = _M_allocate_buckets(_M_bucket_count); - - __try - { -@@ -964,8 +994,9 @@ - _M_reset() noexcept - { - _M_rehash_policy._M_reset(); -- _M_bucket_count = 0; -- _M_buckets = nullptr; -+ _M_bucket_count = 1; -+ _M_single_bucket = nullptr; -+ _M_buckets = &_M_single_bucket; - _M_before_begin._M_nxt = nullptr; - _M_element_count = 0; - } -@@ -980,12 +1011,16 @@ - _M_move_assign(_Hashtable&& __ht, std::true_type) - { - this->_M_deallocate_nodes(_M_begin()); -- if (__builtin_expect(_M_bucket_count != 0, true)) -- _M_deallocate_buckets(); -- -+ _M_deallocate_buckets(); - __hashtable_base::operator=(std::move(__ht)); - _M_rehash_policy = __ht._M_rehash_policy; -- _M_buckets = __ht._M_buckets; -+ if (!__ht._M_uses_single_bucket()) -+ _M_buckets = __ht._M_buckets; -+ else -+ { -+ _M_buckets = &_M_single_bucket; -+ _M_single_bucket = __ht._M_single_bucket; -+ } - _M_bucket_count = __ht._M_bucket_count; - _M_before_begin._M_nxt = __ht._M_before_begin._M_nxt; - _M_element_count = __ht._M_element_count; -@@ -1019,7 +1054,7 @@ - if (_M_bucket_count != __ht._M_bucket_count) - { - __former_buckets = _M_buckets; -- _M_buckets = this->_M_allocate_buckets(__ht._M_bucket_count); -+ _M_buckets = _M_allocate_buckets(__ht._M_bucket_count); - _M_bucket_count = __ht._M_bucket_count; - } - else -@@ -1093,10 +1128,18 @@ - _M_element_count(__ht._M_element_count), - _M_rehash_policy(__ht._M_rehash_policy) - { -+ // Update, if necessary, buckets if __ht is using its single bucket. -+ if (__ht._M_uses_single_bucket()) -+ { -+ _M_buckets = &_M_single_bucket; -+ _M_single_bucket = __ht._M_single_bucket; -+ } -+ - // Update, if necessary, bucket pointing to before begin that hasn't - // moved. - if (_M_begin()) - _M_buckets[_M_bucket_index(_M_begin())] = &_M_before_begin; -+ - __ht._M_reset(); - } - -@@ -1139,7 +1182,14 @@ - { - if (__ht._M_node_allocator() == this->_M_node_allocator()) - { -- _M_buckets = __ht._M_buckets; -+ if (__ht._M_uses_single_bucket()) -+ { -+ _M_buckets = &_M_single_bucket; -+ _M_single_bucket = __ht._M_single_bucket; -+ } -+ else -+ _M_buckets = __ht._M_buckets; -+ - _M_before_begin._M_nxt = __ht._M_before_begin._M_nxt; - // Update, if necessary, bucket pointing to before begin that hasn't - // moved. -@@ -1189,15 +1239,34 @@ - - std::__alloc_on_swap(this->_M_node_allocator(), __x._M_node_allocator()); - std::swap(_M_rehash_policy, __x._M_rehash_policy); -- std::swap(_M_buckets, __x._M_buckets); -+ -+ // Deal properly with potentially moved instances. -+ if (this->_M_uses_single_bucket()) -+ { -+ if (!__x._M_uses_single_bucket()) -+ { -+ _M_buckets = __x._M_buckets; -+ __x._M_buckets = &__x._M_single_bucket; -+ } -+ } -+ else if (__x._M_uses_single_bucket()) -+ { -+ __x._M_buckets = _M_buckets; -+ _M_buckets = &_M_single_bucket; -+ } -+ else -+ std::swap(_M_buckets, __x._M_buckets); -+ - std::swap(_M_bucket_count, __x._M_bucket_count); - std::swap(_M_before_begin._M_nxt, __x._M_before_begin._M_nxt); - std::swap(_M_element_count, __x._M_element_count); -+ std::swap(_M_single_bucket, __x._M_single_bucket); - - // Fix buckets containing the _M_before_begin pointers that can't be - // swapped. - if (_M_begin()) - _M_buckets[_M_bucket_index(_M_begin())] = &_M_before_begin; -+ - if (__x._M_begin()) - __x._M_buckets[__x._M_bucket_index(__x._M_begin())] - = &__x._M_before_begin; -@@ -1230,9 +1299,6 @@ - _H1, _H2, _Hash, _RehashPolicy, _Traits>:: - find(const key_type& __k) - { -- if (__builtin_expect(_M_bucket_count == 0, false)) -- return end(); -- - __hash_code __code = this->_M_hash_code(__k); - std::size_t __n = _M_bucket_index(__k, __code); - __node_type* __p = _M_find_node(__n, __k, __code); -@@ -1250,9 +1316,6 @@ - _H1, _H2, _Hash, _RehashPolicy, _Traits>:: - find(const key_type& __k) const - { -- if (__builtin_expect(_M_bucket_count == 0, false)) -- return end(); -- - __hash_code __code = this->_M_hash_code(__k); - std::size_t __n = _M_bucket_index(__k, __code); - __node_type* __p = _M_find_node(__n, __k, __code); -@@ -1270,9 +1333,6 @@ - _H1, _H2, _Hash, _RehashPolicy, _Traits>:: - count(const key_type& __k) const - { -- if (__builtin_expect(_M_bucket_count == 0, false)) -- return 0; -- - __hash_code __code = this->_M_hash_code(__k); - std::size_t __n = _M_bucket_index(__k, __code); - __node_type* __p = _M_bucket_begin(__n); -@@ -1287,7 +1347,7 @@ - else if (__result) - // All equivalent values are next to each other, if we - // found a non-equivalent value after an equivalent one it -- // means that we won't find any more equivalent values. -+ // means that we won't find any new equivalent value. - break; - if (!__p->_M_nxt || _M_bucket_index(__p->_M_next()) != __n) - break; -@@ -1311,9 +1371,6 @@ - _H1, _H2, _Hash, _RehashPolicy, _Traits>:: - equal_range(const key_type& __k) - { -- if (__builtin_expect(_M_bucket_count == 0, false)) -- return std::make_pair(end(), end()); -- - __hash_code __code = this->_M_hash_code(__k); - std::size_t __n = _M_bucket_index(__k, __code); - __node_type* __p = _M_find_node(__n, __k, __code); -@@ -1347,9 +1404,6 @@ - _H1, _H2, _Hash, _RehashPolicy, _Traits>:: - equal_range(const key_type& __k) const - { -- if (__builtin_expect(_M_bucket_count == 0, false)) -- return std::make_pair(end(), end()); -- - __hash_code __code = this->_M_hash_code(__k); - std::size_t __n = _M_bucket_index(__k, __code); - __node_type* __p = _M_find_node(__n, __k, __code); -@@ -1944,7 +1998,7 @@ - _H1, _H2, _Hash, _RehashPolicy, _Traits>:: - _M_rehash_aux(size_type __n, std::true_type) - { -- __bucket_type* __new_buckets = this->_M_allocate_buckets(__n); -+ __bucket_type* __new_buckets = _M_allocate_buckets(__n); - __node_type* __p = _M_begin(); - _M_before_begin._M_nxt = nullptr; - std::size_t __bbegin_bkt = 0; -@@ -1969,8 +2023,7 @@ - __p = __next; - } - -- if (__builtin_expect(_M_bucket_count != 0, true)) -- _M_deallocate_buckets(); -+ _M_deallocate_buckets(); - _M_bucket_count = __n; - _M_buckets = __new_buckets; - } -@@ -1986,7 +2039,7 @@ - _H1, _H2, _Hash, _RehashPolicy, _Traits>:: - _M_rehash_aux(size_type __n, std::false_type) - { -- __bucket_type* __new_buckets = this->_M_allocate_buckets(__n); -+ __bucket_type* __new_buckets = _M_allocate_buckets(__n); - - __node_type* __p = _M_begin(); - _M_before_begin._M_nxt = nullptr; -@@ -2060,8 +2113,7 @@ - __new_buckets[__next_bkt] = __prev_p; - } - -- if (__builtin_expect(_M_bucket_count != 0, true)) -- _M_deallocate_buckets(); -+ _M_deallocate_buckets(); - _M_bucket_count = __n; - _M_buckets = __new_buckets; - } -Index: libstdc++-v3/include/bits/regex_compiler.h -=================================================================== ---- a/src/libstdc++-v3/include/bits/regex_compiler.h (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/include/bits/regex_compiler.h (.../branches/gcc-4_9-branch) -@@ -369,8 +369,9 @@ - #endif - } - -+ // __neg should be true for \D, \S and \W only. - void -- _M_add_character_class(const _StringT& __s) -+ _M_add_character_class(const _StringT& __s, bool __neg) - { - auto __mask = _M_traits.lookup_classname(__s.data(), - __s.data() + __s.size(), -@@ -377,7 +378,10 @@ - __icase); - if (__mask == 0) - __throw_regex_error(regex_constants::error_ctype); -- _M_class_set |= __mask; -+ if (!__neg) -+ _M_class_set |= __mask; -+ else -+ _M_neg_class_set.push_back(__mask); - #ifdef _GLIBCXX_DEBUG - _M_is_ready = false; - #endif -@@ -387,7 +391,7 @@ - _M_make_range(_CharT __l, _CharT __r) - { - _M_range_set.push_back(make_pair(_M_translator._M_transform(__l), -- _M_translator._M_transform(__r))); -+ _M_translator._M_transform(__r))); - #ifdef _GLIBCXX_DEBUG - _M_is_ready = false; - #endif -@@ -435,6 +439,7 @@ - std::vector<_CharT> _M_char_set; - std::vector<_StringT> _M_equiv_set; - std::vector<pair<_StrTransT, _StrTransT>> _M_range_set; -+ std::vector<_CharClassT> _M_neg_class_set; - _CharClassT _M_class_set; - _TransT _M_translator; - const _TraitsT& _M_traits; -Index: libstdc++-v3/include/bits/regex_automaton.tcc -=================================================================== ---- a/src/libstdc++-v3/include/bits/regex_automaton.tcc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/include/bits/regex_automaton.tcc (.../branches/gcc-4_9-branch) -@@ -35,7 +35,7 @@ - _GLIBCXX_BEGIN_NAMESPACE_VERSION - - #ifdef _GLIBCXX_DEBUG -- std::ostream& -+ inline std::ostream& - _State_base::_M_print(std::ostream& ostr) const - { - switch (_M_opcode) -@@ -66,7 +66,7 @@ - } - - // Prints graphviz dot commands for state. -- std::ostream& -+ inline std::ostream& - _State_base::_M_dot(std::ostream& __ostr, _StateIdT __id) const - { - switch (_M_opcode) -@@ -197,20 +197,18 @@ - // _M_insert_state() never return -1 - auto __id = _M_nfa._M_insert_state(__dup); - __m[__u] = __id; -+ if (__dup._M_opcode == _S_opcode_alternative -+ || __dup._M_opcode == _S_opcode_subexpr_lookahead) -+ if (__dup._M_alt != _S_invalid_state_id && __m[__dup._M_alt] == -1) -+ __stack.push(__dup._M_alt); - if (__u == _M_end) - continue; - if (__dup._M_next != _S_invalid_state_id && __m[__dup._M_next] == -1) - __stack.push(__dup._M_next); -- if (__dup._M_opcode == _S_opcode_alternative -- || __dup._M_opcode == _S_opcode_subexpr_lookahead) -- if (__dup._M_alt != _S_invalid_state_id && __m[__dup._M_alt] == -1) -- __stack.push(__dup._M_alt); - } -- long __size = static_cast<long>(__m.size()); -- for (long __k = 0; __k < __size; __k++) -+ for (auto __v : __m) - { -- long __v; -- if ((__v = __m[__k]) == -1) -+ if (__v == -1) - continue; - auto& __ref = _M_nfa[__v]; - if (__ref._M_next != _S_invalid_state_id) -Index: libstdc++-v3/include/bits/stl_vector.h -=================================================================== ---- a/src/libstdc++-v3/include/bits/stl_vector.h (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/include/bits/stl_vector.h (.../branches/gcc-4_9-branch) -@@ -1051,7 +1051,7 @@ - insert(const_iterator __position, size_type __n, const value_type& __x) - { - difference_type __offset = __position - cbegin(); -- _M_fill_insert(__position._M_const_cast(), __n, __x); -+ _M_fill_insert(begin() + __offset, __n, __x); - return begin() + __offset; - } - #else -@@ -1096,7 +1096,7 @@ - _InputIterator __last) - { - difference_type __offset = __position - cbegin(); -- _M_insert_dispatch(__position._M_const_cast(), -+ _M_insert_dispatch(begin() + __offset, - __first, __last, __false_type()); - return begin() + __offset; - } -@@ -1144,10 +1144,11 @@ - iterator - #if __cplusplus >= 201103L - erase(const_iterator __position) -+ { return _M_erase(begin() + (__position - cbegin())); } - #else - erase(iterator __position) -+ { return _M_erase(__position); } - #endif -- { return _M_erase(__position._M_const_cast()); } - - /** - * @brief Remove a range of elements. -@@ -1170,10 +1171,15 @@ - iterator - #if __cplusplus >= 201103L - erase(const_iterator __first, const_iterator __last) -+ { -+ const auto __beg = begin(); -+ const auto __cbeg = cbegin(); -+ return _M_erase(__beg + (__first - __cbeg), __beg + (__last - __cbeg)); -+ } - #else - erase(iterator __first, iterator __last) -+ { return _M_erase(__first, __last); } - #endif -- { return _M_erase(__first._M_const_cast(), __last._M_const_cast()); } - - /** - * @brief Swaps data with another %vector. -Index: libstdc++-v3/include/bits/regex_executor.tcc -=================================================================== ---- a/src/libstdc++-v3/include/bits/regex_executor.tcc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/include/bits/regex_executor.tcc (.../branches/gcc-4_9-branch) -@@ -120,10 +120,10 @@ - if (_M_match_queue->empty()) - break; - _M_visited->assign(_M_visited->size(), false); -- auto _M_old_queue = std::move(*_M_match_queue); -- for (auto __task : _M_old_queue) -+ auto __old_queue = std::move(*_M_match_queue); -+ for (auto& __task : __old_queue) - { -- _M_cur_results = __task.second; -+ _M_cur_results = std::move(__task.second); - _M_dfs<__match_mode>(__task.first); - } - if (!__match_mode) -Index: libstdc++-v3/include/bits/stl_iterator.h -=================================================================== ---- a/src/libstdc++-v3/include/bits/stl_iterator.h (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/include/bits/stl_iterator.h (.../branches/gcc-4_9-branch) -@@ -736,21 +736,6 @@ - _Container>::__type>& __i) _GLIBCXX_NOEXCEPT - : _M_current(__i.base()) { } - --#if __cplusplus >= 201103L -- __normal_iterator<typename _Container::pointer, _Container> -- _M_const_cast() const noexcept -- { -- using _PTraits = std::pointer_traits<typename _Container::pointer>; -- return __normal_iterator<typename _Container::pointer, _Container> -- (_PTraits::pointer_to(const_cast<typename _PTraits::element_type&> -- (*_M_current))); -- } --#else -- __normal_iterator -- _M_const_cast() const -- { return *this; } --#endif -- - // Forward iterator requirements - reference - operator*() const _GLIBCXX_NOEXCEPT -Index: libstdc++-v3/include/bits/vector.tcc -=================================================================== ---- a/src/libstdc++-v3/include/bits/vector.tcc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/include/bits/vector.tcc (.../branches/gcc-4_9-branch) -@@ -121,14 +121,17 @@ - else - { - #if __cplusplus >= 201103L -+ const auto __pos = begin() + (__position - cbegin()); - if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage) - { - _Tp __x_copy = __x; -- _M_insert_aux(__position._M_const_cast(), std::move(__x_copy)); -+ _M_insert_aux(__pos, std::move(__x_copy)); - } - else -+ _M_insert_aux(__pos, __x); -+#else -+ _M_insert_aux(__position, __x); - #endif -- _M_insert_aux(__position._M_const_cast(), __x); - } - return iterator(this->_M_impl._M_start + __n); - } -@@ -307,7 +310,7 @@ - ++this->_M_impl._M_finish; - } - else -- _M_insert_aux(__position._M_const_cast(), -+ _M_insert_aux(begin() + (__position - cbegin()), - std::forward<_Args>(__args)...); - return iterator(this->_M_impl._M_start + __n); - } -Index: libstdc++-v3/include/bits/shared_ptr_base.h -=================================================================== ---- a/src/libstdc++-v3/include/bits/shared_ptr_base.h (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/include/bits/shared_ptr_base.h (.../branches/gcc-4_9-branch) -@@ -871,7 +871,7 @@ - : _M_ptr(__p), _M_refcount(__p) - { - __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>) -- static_assert( !is_void<_Tp>::value, "incomplete type" ); -+ static_assert( !is_void<_Tp1>::value, "incomplete type" ); - static_assert( sizeof(_Tp1) > 0, "incomplete type" ); - __enable_shared_from_this_helper(_M_refcount, __p, __p); - } -Index: libstdc++-v3/include/bits/stl_tree.h -=================================================================== ---- a/src/libstdc++-v3/include/bits/stl_tree.h (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/include/bits/stl_tree.h (.../branches/gcc-4_9-branch) -@@ -526,11 +526,11 @@ - - _Link_type - _M_end() _GLIBCXX_NOEXCEPT -- { return static_cast<_Link_type>(&this->_M_impl._M_header); } -+ { return reinterpret_cast<_Link_type>(&this->_M_impl._M_header); } - - _Const_Link_type - _M_end() const _GLIBCXX_NOEXCEPT -- { return static_cast<_Const_Link_type>(&this->_M_impl._M_header); } -+ { return reinterpret_cast<_Const_Link_type>(&this->_M_impl._M_header); } - - static const_reference - _S_value(_Const_Link_type __x) -@@ -1073,6 +1073,7 @@ - _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: - _M_move_assign(_Rb_tree& __x) - { -+ _M_impl._M_key_compare = __x._M_impl._M_key_compare; - if (_Alloc_traits::_S_propagate_on_move_assign() - || _Alloc_traits::_S_always_equal() - || _M_get_Node_allocator() == __x._M_get_Node_allocator()) -Index: libstdc++-v3/include/bits/regex_compiler.tcc -=================================================================== ---- a/src/libstdc++-v3/include/bits/regex_compiler.tcc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/include/bits/regex_compiler.tcc (.../branches/gcc-4_9-branch) -@@ -397,7 +397,7 @@ - _GLIBCXX_DEBUG_ASSERT(_M_value.size() == 1); - _BracketMatcher<_TraitsT, __icase, __collate> __matcher - (_M_ctype.is(_CtypeT::upper, _M_value[0]), _M_traits); -- __matcher._M_add_character_class(_M_value); -+ __matcher._M_add_character_class(_M_value, false); - __matcher._M_ready(); - _M_stack.push(_StateSeqT(_M_nfa, - _M_nfa._M_insert_matcher(std::move(__matcher)))); -@@ -428,7 +428,7 @@ - else if (_M_match_token(_ScannerT::_S_token_equiv_class_name)) - __matcher._M_add_equivalence_class(_M_value); - else if (_M_match_token(_ScannerT::_S_token_char_class_name)) -- __matcher._M_add_character_class(_M_value); -+ __matcher._M_add_character_class(_M_value, false); - else if (_M_try_char()) // [a - { - auto __ch = _M_value[0]; -@@ -451,6 +451,10 @@ - } - __matcher._M_add_char(__ch); - } -+ else if (_M_match_token(_ScannerT::_S_token_quoted_class)) -+ __matcher._M_add_character_class(_M_value, -+ _M_ctype.is(_CtypeT::upper, -+ _M_value[0])); - else - __throw_regex_error(regex_constants::error_brack); - } -@@ -527,6 +531,15 @@ - _M_traits.transform_primary(&__ch, &__ch+1)) - != _M_equiv_set.end()) - __ret = true; -+ else -+ { -+ for (auto& __it : _M_neg_class_set) -+ if (!_M_traits.isctype(__ch, __it)) -+ { -+ __ret = true; -+ break; -+ } -+ } - } - if (_M_is_non_matching) - return !__ret; -Index: libstdc++-v3/include/tr2/bool_set -=================================================================== ---- a/src/libstdc++-v3/include/tr2/bool_set (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/include/tr2/bool_set (.../branches/gcc-4_9-branch) -@@ -44,7 +44,7 @@ - * bool_set - * - * See N2136, Bool_set: multi-valued logic -- * by Hervé Brönnimann, Guillaume Melquiond, Sylvain Pion. -+ * by Hervé Brönnimann, Guillaume Melquiond, Sylvain Pion. - * - * The implicit conversion to bool is slippery! I may use the new - * explicit conversion. This has been specialized in the language -Index: libstdc++-v3/ChangeLog -=================================================================== ---- a/src/libstdc++-v3/ChangeLog (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/ChangeLog (.../branches/gcc-4_9-branch) -@@ -1,3 +1,197 @@ -+2014-06-23 Jonathan Wakely <jwakely@redhat.com> -+ -+ PR libstdc++/61532 -+ * testsuite/20_util/make_signed/requirements/typedefs-1.cc: Do not -+ apply the signed specifier to wchar_t. -+ * testsuite/20_util/make_signed/requirements/typedefs-2.cc: Likewise. -+ * testsuite/20_util/make_unsigned/requirements/typedefs-1.cc: Do not -+ apply the unsigned specifier to wchar_t. -+ * testsuite/20_util/make_unsigned/requirements/typedefs-2.cc: -+ Likewise. -+ -+2014-06-13 Jonathan Wakely <jwakely@redhat.com> -+ -+ Backport from mainline -+ PR libstdc++/60326 -+ * include/std/type_traits (__make_unsigned, __make_signed): Define -+ specializations for wchar_t, char16_t and char32_t. -+ * testsuite/20_util/make_signed/requirements/typedefs-4.cc: New. -+ * testsuite/20_util/make_unsigned/requirements/typedefs-1.cc: Correct -+ test for make_unsigned<volatile wchar_t>. -+ * testsuite/20_util/make_unsigned/requirements/typedefs-2.cc: -+ Likewise. -+ * testsuite/20_util/declval/requirements/1_neg.cc: Adjust dg-error -+ line number. -+ * testsuite/20_util/make_signed/requirements/typedefs_neg.cc: -+ Likewise. -+ * testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc: -+ Likewise. -+ -+ Backport from mainline -+ PR libstdc++/61269 -+ * include/std/type_traits: Move include outside namespace std. -+ * testsuite/20_util/declval/requirements/1_neg.cc: Adjust dg-error. -+ * testsuite/20_util/make_signed/requirements/typedefs_neg.cc: Likewise. -+ * testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc: -+ Likewise. -+ -+ * include/std/tuple (tuple_size<cv _Tp>): Implement LWG 2313. -+ (get<_Tp>(tuple<_Types...>&&)): Use forward instead of move. -+ * testsuite/20_util/tuple/element_access/get_by_type.cc: Test rvalues. -+ -+2014-06-07 Ed Smith-Rowland <3dw4rd@verizon.net> -+ -+ Backport from mainline -+ DR 2344 - std::quoted doesn't respect padding -+ * include/std/iomanip: Allow for padding in quoted inserters. -+ * testsuite/27_io/manipulators/standard/char/dr2344.cc: New. -+ * testsuite/27_io/manipulators/standard/wchar_t/dr2344.cc: New. -+ -+2014-06-03 Jonathan Wakely <jwakely@redhat.com> -+ -+ * include/bits/regex_executor.tcc (_Executor<>::_M_main): Move instead -+ of copying. -+ -+2014-06-03 Jonathan Wakely <jwakely@redhat.com> -+ -+ Backport from mainline -+ 2014-04-15 Jonathan Wakely <jwakely@redhat.com> -+ -+ PR libstdc++/60734 -+ * include/bits/stl_tree.h (_Rb_tree::_M_end): Fix invalid cast. -+ -+ Backport from mainline -+ 2014-04-24 Tim Shen <timshen91@gmail.com> -+ -+ * include/bits/regex_automaton.tcc (_StateSeq<>::_M_clone()): -+ Do _M_alt before _M_next. -+ * testsuite/28_regex/basic_regex/multiple_quantifiers.cc: Add testcases. -+ -+ Backport from mainline -+ 2014-05-20 Tim Shen <timshen91@gmail.com> -+ -+ PR libstdc++/61227 -+ * include/bits/regex_compiler.h -+ (_BracketMatcher<>::_M_add_character_class): Add negative character -+ class support. -+ * include/bits/regex_compiler.tcc (_BracketMatcher<>::_M_apply): -+ Likewise. -+ * testsuite/28_regex/algorithms/regex_match/ecma/char/quoted_char.cc: -+ Add more testcases. -+ -+2014-05-29 Jonathan Wakely <jwakely@redhat.com> -+ -+ * include/tr2/bool_set: Use UTF-8 for accented characters. -+ * scripts/run_doxygen: Handle Doxygen 1.8.x change. -+ -+2014-05-27 Jonathan Wakely <jwakely@redhat.com> -+ -+ PR libstdc++/61329 -+ * include/bits/regex_automaton.tcc (_State_base::_M_print): Add -+ inline specifier. -+ (_State_base::_M_dot): Likewise. -+ -+2014-05-23 François Dumont <fdumont@gcc.gnu.org> -+ -+ PR libstdc++/61143 -+ * include/bits/hashtable.h: Fix move semantic to leave hashtable in a -+ usable state. -+ * testsuite/23_containers/unordered_set/61143.cc: New. -+ * testsuite/23_containers/unordered_set/modifiers/swap.cc: New. -+ -+2014-05-17 Jonathan Wakely <jwakely@redhat.com> -+ -+ PR libstdc++/60966 -+ * include/std/future (__future_base::_State_baseV2::_M_set_result): -+ Signal condition variable after call_once returns. -+ (__future_base::_State_baseV2::_M_do_set): Do not signal here. -+ (promise::set_value, promise::set_exception): Increment the reference -+ count on the shared state until the function returns. -+ * testsuite/30_threads/promise/60966.cc: New. -+ -+2014-05-08 Joshua Gay <jgay@gnu.org> -+ -+ PR libstdc++/61117 -+ * doc/xml/faq.xml (faq.license.what_restrictions): Replace "open -+ source" with "free software". -+ * doc/html/faq.html: Likewise. -+ -+2014-05-08 Jonathan Wakely <jwakely@redhat.com> -+ -+ * include/std/iostream: Fix URL in comment. -+ * src/c++98/ios_init.cc: Fix path in comment. -+ -+2014-05-07 Jonathan Wakely <jwakely@redhat.com> -+ -+ PR libstdc++/61023 -+ * include/bits/stl_tree.h (_Rb_tree::_M_move_assign): Copy the -+ comparison function. -+ * testsuite/23_containers/set/cons/61023.cc: New. -+ -+ PR libstdc++/61086 -+ * include/bits/stl_iterator.h (__normal_iterator::_M_const_cast): -+ Remove. -+ * include/bits/stl_vector.h (vector::insert, vector::erase): Use -+ arithmetic to obtain a mutable iterator from const_iterator. -+ * include/bits/vector.tcc (vector::insert): Likewise. -+ * include/debug/vector (vector::erase): Likewise. -+ * testsuite/23_containers/vector/requirements/dr438/assign_neg.cc: -+ Adjust dg-error line number. -+ * testsuite/23_containers/vector/requirements/dr438/ -+ constructor_1_neg.cc: Likewise. -+ * testsuite/23_containers/vector/requirements/dr438/ -+ constructor_2_neg.cc: Likewise. -+ * testsuite/23_containers/vector/requirements/dr438/insert_neg.cc: -+ Likewise. -+ -+2014-05-06 Jonathan Wakely <jwakely@redhat.com> -+ -+ Backport from mainline -+ 2014-04-15 Jonathan Wakely <jwakely@redhat.com> -+ -+ PR libstdc++/60594 -+ * include/std/functional (function::_Callable): Exclude own type -+ from the callable checks. -+ * testsuite/20_util/function/60594.cc: New. -+ -+2014-05-02 Jonathan Wakely <jwakely@redhat.com> -+ -+ PR libstdc++/59476 -+ * python/libstdcxx/v6/printers.py (get_value_from_Rb_tree_node): New -+ function to handle both C++03 and C++11 _Rb_tree_node implementations. -+ (StdRbtreeIteratorPrinter, StdMapPrinter, StdSetPrinter): Use it. -+ * testsuite/libstdc++-prettyprinters/simple.cc: Update comment to -+ refer to... -+ * testsuite/libstdc++-prettyprinters/simple11.cc: New. -+ -+ PR libstdc++/61036 -+ * include/bits/shared_ptr_base.h (__shared_ptr::__shared_ptr(_Tp1*)): -+ Check the correct type in the static assertion. -+ * testsuite/20_util/shared_ptr/cons/61036.cc: New. -+ -+2014-04-27 Lars Gullik Bjønnes <larsbj@gullik.org> -+ -+ PR libstdc++/60710 -+ * include/experimental/optional (operator!=): Implement in terms of -+ operator==. -+ * testsuite/experimental/optional/relops/1.cc: Remove operator!=. -+ * testsuite/experimental/optional/relops/2.cc: Likewise. -+ * testsuite/experimental/optional/relops/3.cc: Likewise. -+ * testsuite/experimental/optional/relops/4.cc: Likewise. -+ * testsuite/experimental/optional/relops/5.cc: Likewise. -+ * testsuite/experimental/optional/relops/6.cc: Likewise. -+ -+2014-04-27 Jonathan Wakely <jwakely@redhat.com> -+ -+ PR libstdc++/60497 -+ * include/std/tuple (get): Qualify calls to prevent ADL. -+ * testsuite/20_util/tuple/60497.cc: New. -+ -+ * include/std/tuple (tuple_element_t): Define. -+ * testsuite/20_util/tuple/tuple_element.cc: Change to compile-only -+ test. -+ * testsuite/20_util/tuple/tuple_element_t.cc: New. -+ - 2014-04-22 Release Manager - - * GCC 4.9.0 released. -Index: libstdc++-v3/testsuite/27_io/manipulators/standard/wchar_t/dr2344.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/27_io/manipulators/standard/wchar_t/dr2344.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/27_io/manipulators/standard/wchar_t/dr2344.cc (.../branches/gcc-4_9-branch) -@@ -0,0 +1,50 @@ -+// { dg-do run } -+// { dg-options "-std=gnu++14" } -+ -+// Copyright (C) 2014 Free Software Foundation, Inc. -+// -+// This file is part of the GNU ISO C++ Library. This library is free -+// software; you can redistribute it and/or modify it under the -+// terms of the GNU General Public License as published by the -+// Free Software Foundation; either version 3, or (at your option) -+// any later version. -+ -+// This library is distributed in the hope that it will be useful, -+// but WITHOUT ANY WARRANTY; without even the implied warranty of -+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+// GNU General Public License for more details. -+ -+// You should have received a copy of the GNU General Public License along -+// with this library; see the file COPYING3. If not see -+// <http://www.gnu.org/licenses/>. -+ -+// 27.7.6 - Quoted manipulators [quoted.manip] -+ -+#include <sstream> -+#include <iomanip> -+#include <testsuite_hooks.h> -+ -+void -+test01() -+{ -+ bool test [[gnu::unused]] = true; -+ -+ std::wostringstream ssx; -+ ssx << L"[" << std::left << std::setfill(L'x') << std::setw(20) << LR"("AB \"CD\" EF")" << L"]"; -+ VERIFY( ssx.str() == LR"(["AB \"CD\" EF"xxxxxx])" ); -+ -+ std::wostringstream ssy; -+ ssy << L"[" << std::left << std::setfill(L'y') << std::setw(20) << std::quoted(LR"(GH "IJ" KL)") << L"]"; -+ VERIFY( ssy.str() == LR"(["GH \"IJ\" KL"yyyyyy])" ); -+ -+ std::wostringstream ssz; -+ ssz << L"[" << std::right << std::setfill(L'z') << std::setw(20) << std::quoted(LR"(PQ "RS" TU)") << L"]"; -+ VERIFY( ssz.str() == LR"([zzzzzz"PQ \"RS\" TU"])" ); -+} -+ -+int -+main() -+{ -+ test01(); -+ return 0; -+} -Index: libstdc++-v3/testsuite/27_io/manipulators/standard/char/dr2344.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/27_io/manipulators/standard/char/dr2344.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/27_io/manipulators/standard/char/dr2344.cc (.../branches/gcc-4_9-branch) -@@ -0,0 +1,50 @@ -+// { dg-do run } -+// { dg-options "-std=gnu++14" } -+ -+// Copyright (C) 2014 Free Software Foundation, Inc. -+// -+// This file is part of the GNU ISO C++ Library. This library is free -+// software; you can redistribute it and/or modify it under the -+// terms of the GNU General Public License as published by the -+// Free Software Foundation; either version 3, or (at your option) -+// any later version. -+ -+// This library is distributed in the hope that it will be useful, -+// but WITHOUT ANY WARRANTY; without even the implied warranty of -+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+// GNU General Public License for more details. -+ -+// You should have received a copy of the GNU General Public License along -+// with this library; see the file COPYING3. If not see -+// <http://www.gnu.org/licenses/>. -+ -+// 27.7.6 - Quoted manipulators [quoted.manip] -+ -+#include <sstream> -+#include <iomanip> -+#include <testsuite_hooks.h> -+ -+void -+test01() -+{ -+ bool test [[gnu::unused]] = true; -+ -+ std::ostringstream ssx; -+ ssx << "[" << std::left << std::setfill('x') << std::setw(20) << R"("AB \"CD\" EF")" << "]"; -+ VERIFY( ssx.str() == R"(["AB \"CD\" EF"xxxxxx])" ); -+ -+ std::ostringstream ssy; -+ ssy << "[" << std::left << std::setfill('y') << std::setw(20) << std::quoted(R"(GH "IJ" KL)") << "]"; -+ VERIFY( ssy.str() == R"(["GH \"IJ\" KL"yyyyyy])" ); -+ -+ std::ostringstream ssz; -+ ssz << "[" << std::right << std::setfill('z') << std::setw(20) << std::quoted(R"(PQ "RS" TU)") << "]"; -+ VERIFY( ssz.str() == R"([zzzzzz"PQ \"RS\" TU"])" ); -+} -+ -+int -+main() -+{ -+ test01(); -+ return 0; -+} -Index: libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/quoted_char.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/quoted_char.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/quoted_char.cc (.../branches/gcc-4_9-branch) -@@ -44,6 +44,16 @@ - VERIFY(regex_match_debug("_az", regex("\\w*"))); - VERIFY(regex_match_debug("!@#$%", regex("\\W*"))); - VERIFY(!regex_match_debug("_01234", regex("\\W*"))); -+ -+ VERIFY(regex_match_debug("01", regex("[\\d]*"))); -+ VERIFY(regex_match_debug("asdfjkl", regex("[\\D]*"))); -+ VERIFY(!regex_match_debug("asdfjkl0", regex("[\\D]*"))); -+ VERIFY(regex_match_debug("\r\t\v\f ", regex("[\\s]*"))); -+ VERIFY(regex_match_debug("asdfjkl", regex("[\\S]*"))); -+ VERIFY(!regex_match_debug("asdfjkl\r", regex("[\\S]*"))); -+ VERIFY(regex_match_debug("_az", regex("[\\w]*"))); -+ VERIFY(regex_match_debug("!@#$%", regex("[\\W]*"))); -+ VERIFY(!regex_match_debug("_01234", regex("[\\W]*"))); - } - - int -Index: libstdc++-v3/testsuite/28_regex/basic_regex/multiple_quantifiers.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/28_regex/basic_regex/multiple_quantifiers.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/28_regex/basic_regex/multiple_quantifiers.cc (.../branches/gcc-4_9-branch) -@@ -21,7 +21,10 @@ - // Tests multiple consecutive quantifiers - - #include <regex> -+#include <testsuite_hooks.h> -+#include <testsuite_regex.h> - -+using namespace __gnu_test; - using namespace std; - - int -@@ -29,5 +32,6 @@ - { - regex re1("a++"); - regex re2("(a+)+"); -+ VERIFY(regex_match_debug("aa", regex("(a)*{3}"))); - return 0; - } -Index: libstdc++-v3/testsuite/libstdc++-prettyprinters/simple11.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/libstdc++-prettyprinters/simple11.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/libstdc++-prettyprinters/simple11.cc (.../branches/gcc-4_9-branch) -@@ -0,0 +1,92 @@ -+// If you modify this, please update simple.cc and debug.cc as well. -+ -+// { dg-do run } -+// { dg-options "-g -O0 -std=gnu++11" } -+ -+// Copyright (C) 2011-2014 Free Software Foundation, Inc. -+// -+// This file is part of the GNU ISO C++ Library. This library is free -+// software; you can redistribute it and/or modify it under the -+// terms of the GNU General Public License as published by the -+// Free Software Foundation; either version 3, or (at your option) -+// any later version. -+ -+// This library is distributed in the hope that it will be useful, -+// but WITHOUT ANY WARRANTY; without even the implied warranty of -+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+// GNU General Public License for more details. -+ -+// You should have received a copy of the GNU General Public License along -+// with this library; see the file COPYING3. If not see -+// <http://www.gnu.org/licenses/>. -+ -+#include <string> -+#include <deque> -+#include <bitset> -+#include <iostream> -+#include <list> -+#include <map> -+#include <set> -+#include <ext/slist> -+ -+int -+main() -+{ -+ std::string tem; -+ std::string str = "zardoz"; -+// { dg-final { note-test str "\"zardoz\"" } } -+ -+ std::bitset<10> bs; -+ bs[0] = 1; -+ bs[5] = 1; -+ bs[7] = 1; -+// { dg-final { note-test bs {std::bitset = {[0] = 1, [5] = 1, [7] = 1}} } } -+ -+ std::deque<std::string> deq; -+ deq.push_back("one"); -+ deq.push_back("two"); -+// { dg-final { note-test deq {std::deque with 2 elements = {"one", "two"}} } } -+ -+ std::deque<std::string>::iterator deqiter = deq.begin(); -+// { dg-final { note-test deqiter {"one"} } } -+ -+ std::list<std::string> lst; -+ lst.push_back("one"); -+ lst.push_back("two"); -+// { dg-final { note-test lst {std::list = {[0] = "one", [1] = "two"}} } } -+ -+ std::list<std::string>::iterator lstiter = lst.begin(); -+ tem = *lstiter; -+// { dg-final { note-test lstiter {"one"}} } -+ -+ std::list<std::string>::const_iterator lstciter = lst.begin(); -+ tem = *lstciter; -+// { dg-final { note-test lstciter {"one"}} } -+ -+ std::map<std::string, int> mp; -+ mp["zardoz"] = 23; -+// { dg-final { note-test mp {std::map with 1 elements = {["zardoz"] = 23}} } } -+ -+ std::map<std::string, int>::iterator mpiter = mp.begin(); -+// { dg-final { note-test mpiter {{first = "zardoz", second = 23}} } } -+ -+ std::set<std::string> sp; -+ sp.insert("clownfish"); -+ sp.insert("barrel"); -+// { dg-final { note-test sp {std::set with 2 elements = {[0] = "barrel", [1] = "clownfish"}} } } -+ -+ std::set<std::string>::const_iterator spciter = sp.begin(); -+// { dg-final { note-test spciter {"barrel"} } } -+ -+ __gnu_cxx::slist<int> sll; -+ sll.push_front(23); -+ sll.push_front(47); -+// { dg-final { note-test sll {__gnu_cxx::slist = {[0] = 47, [1] = 23}} } } -+ -+ __gnu_cxx::slist<int>::iterator slliter = sll.begin(); -+// { dg-final { note-test slliter {47} } } -+ -+ return 0; // Mark SPOT -+} -+ -+// { dg-final { gdb-test SPOT } } -Index: libstdc++-v3/testsuite/libstdc++-prettyprinters/simple.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/libstdc++-prettyprinters/simple.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/libstdc++-prettyprinters/simple.cc (.../branches/gcc-4_9-branch) -@@ -1,4 +1,4 @@ --// If you modify this, please update debug.cc as well. -+// If you modify this, please update simple11.cc and debug.cc as well. - - // { dg-do run } - // { dg-options "-g -O0" } -Index: libstdc++-v3/testsuite/30_threads/promise/60966.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/30_threads/promise/60966.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/30_threads/promise/60966.cc (.../branches/gcc-4_9-branch) -@@ -0,0 +1,67 @@ -+// { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-gnu* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } } -+// { dg-options " -std=gnu++11 -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-gnu* powerpc-ibm-aix* } } -+// { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } } -+// { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-darwin* } } -+// { dg-require-cstdint "" } -+// { dg-require-gthreads "" } -+// { dg-require-atomic-builtins "" } -+ -+// Copyright (C) 2014 Free Software Foundation, Inc. -+// -+// This file is part of the GNU ISO C++ Library. This library is free -+// software; you can redistribute it and/or modify it under the -+// terms of the GNU General Public License as published by the -+// Free Software Foundation; either version 3, or (at your option) -+// any later version. -+ -+// This library is distributed in the hope that it will be useful, -+// but WITHOUT ANY WARRANTY; without even the implied warranty of -+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+// GNU General Public License for more details. -+ -+// You should have received a copy of the GNU General Public License along -+// with this library; see the file COPYING3. If not see -+// <http://www.gnu.org/licenses/>. -+ -+// libstdc++/60966 -+// This test hangs if std::promise::~promise() destroys the -+// shared state before std::promise::set_value() finishes using it. -+ -+#include <future> -+#include <thread> -+#include <vector> -+ -+const int THREADS = 10; -+ -+void run_task(std::promise<void>* pr) -+{ -+ std::this_thread::sleep_for(std::chrono::milliseconds(100)); -+ pr->set_value(); -+} -+ -+int main() -+{ -+ std::vector<std::promise<void>*> tasks(THREADS); -+ std::vector<std::thread> threads(THREADS); -+ std::vector<std::future<void>> futures(THREADS); -+ -+ for (int i = 0; i < THREADS; ++i) -+ { -+ std::promise<void>* task = new std::promise<void>; -+ tasks[i] = task; -+ futures[i] = task->get_future(); -+ threads[i] = std::thread(run_task, task); -+ } -+ -+ for (int i = 0; i < THREADS; ++i) -+ { -+ // the temporary future releases the state as soon as wait() returns -+ std::future<void>(std::move(futures[i])).wait(); -+ // state is ready, should now be safe to delete promise, so it -+ // releases the shared state too -+ delete tasks[i]; -+ } -+ -+ for (auto& t : threads) -+ t.join(); -+} -Index: libstdc++-v3/testsuite/experimental/optional/relops/1.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/experimental/optional/relops/1.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/experimental/optional/relops/1.cc (.../branches/gcc-4_9-branch) -@@ -37,10 +37,6 @@ - { return std::tie(lhs.i, lhs.s) == std::tie(rhs.i, rhs.s); } - - bool -- operator!=(value_type const& lhs, value_type const& rhs) -- { return !(lhs == rhs); } -- -- bool - operator<(value_type const& lhs, value_type const& rhs) - { return std::tie(lhs.i, lhs.s) < std::tie(rhs.i, rhs.s); } - -Index: libstdc++-v3/testsuite/experimental/optional/relops/2.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/experimental/optional/relops/2.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/experimental/optional/relops/2.cc (.../branches/gcc-4_9-branch) -@@ -37,10 +37,6 @@ - { return std::tie(lhs.i, lhs.s) == std::tie(rhs.i, rhs.s); } - - bool -- operator!=(value_type const& lhs, value_type const& rhs) -- { return !(lhs == rhs); } -- -- bool - operator<(value_type const& lhs, value_type const& rhs) - { return std::tie(lhs.i, lhs.s) < std::tie(rhs.i, rhs.s); } - -Index: libstdc++-v3/testsuite/experimental/optional/relops/3.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/experimental/optional/relops/3.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/experimental/optional/relops/3.cc (.../branches/gcc-4_9-branch) -@@ -37,10 +37,6 @@ - { return std::tie(lhs.i, lhs.s) == std::tie(rhs.i, rhs.s); } - - bool -- operator!=(value_type const& lhs, value_type const& rhs) -- { return !(lhs == rhs); } -- -- bool - operator<(value_type const& lhs, value_type const& rhs) - { return std::tie(lhs.i, lhs.s) < std::tie(rhs.i, rhs.s); } - -Index: libstdc++-v3/testsuite/experimental/optional/relops/4.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/experimental/optional/relops/4.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/experimental/optional/relops/4.cc (.../branches/gcc-4_9-branch) -@@ -37,10 +37,6 @@ - { return std::tie(lhs.i, lhs.s) == std::tie(rhs.i, rhs.s); } - - bool -- operator!=(value_type const& lhs, value_type const& rhs) -- { return !(lhs == rhs); } -- -- bool - operator<(value_type const& lhs, value_type const& rhs) - { return std::tie(lhs.i, lhs.s) < std::tie(rhs.i, rhs.s); } - -Index: libstdc++-v3/testsuite/experimental/optional/relops/5.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/experimental/optional/relops/5.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/experimental/optional/relops/5.cc (.../branches/gcc-4_9-branch) -@@ -37,10 +37,6 @@ - { return std::tie(lhs.i, lhs.s) == std::tie(rhs.i, rhs.s); } - - bool -- operator!=(value_type const& lhs, value_type const& rhs) -- { return !(lhs == rhs); } -- -- bool - operator<(value_type const& lhs, value_type const& rhs) - { return std::tie(lhs.i, lhs.s) < std::tie(rhs.i, rhs.s); } - -Index: libstdc++-v3/testsuite/experimental/optional/relops/6.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/experimental/optional/relops/6.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/experimental/optional/relops/6.cc (.../branches/gcc-4_9-branch) -@@ -37,10 +37,6 @@ - { return std::tie(lhs.i, lhs.s) == std::tie(rhs.i, rhs.s); } - - bool -- operator!=(value_type const& lhs, value_type const& rhs) -- { return !(lhs == rhs); } -- -- bool - operator<(value_type const& lhs, value_type const& rhs) - { return std::tie(lhs.i, lhs.s) < std::tie(rhs.i, rhs.s); } - -Index: libstdc++-v3/testsuite/23_containers/set/cons/61023.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/23_containers/set/cons/61023.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/23_containers/set/cons/61023.cc (.../branches/gcc-4_9-branch) -@@ -0,0 +1,56 @@ -+// { dg-options "-std=gnu++11" } -+ -+// Copyright (C) 2014 Free Software Foundation, Inc. -+// -+// This file is part of the GNU ISO C++ Library. This library is free -+// software; you can redistribute it and/or modify it under the -+// terms of the GNU General Public License as published by the -+// Free Software Foundation; either version 3, or (at your option) -+// any later version. -+ -+// This library is distributed in the hope that it will be useful, -+// but WITHOUT ANY WARRANTY; without even the implied warranty of -+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+// GNU General Public License for more details. -+ -+// You should have received a copy of the GNU General Public License along -+// with this library; see the file COPYING3. If not see -+// <http://www.gnu.org/licenses/>. -+ -+#include <set> -+#include <stdexcept> -+ -+struct Comparator -+{ -+ Comparator() : valid(false) { } -+ explicit Comparator(bool) : valid(true) { } -+ -+ bool operator()(int i, int j) const -+ { -+ if (!valid) -+ throw std::logic_error("Comparator is invalid"); -+ return i < j; -+ } -+ -+private: -+ bool valid; -+}; -+ -+int main() -+{ -+ using test_type = std::set<int, Comparator>; -+ -+ Comparator cmp{true}; -+ -+ test_type good{cmp}; -+ -+ test_type s1; -+ s1 = good; // copy-assign -+ s1.insert(1); -+ s1.insert(2); -+ -+ test_type s2; -+ s2 = std::move(good); // move-assign -+ s2.insert(1); -+ s2.insert(2); -+} -Index: libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc (.../branches/gcc-4_9-branch) -@@ -18,7 +18,7 @@ - // <http://www.gnu.org/licenses/>. - - // { dg-do compile } --// { dg-error "no matching" "" { target *-*-* } 1320 } -+// { dg-error "no matching" "" { target *-*-* } 1326 } - - #include <vector> - -Index: libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc (.../branches/gcc-4_9-branch) -@@ -18,7 +18,7 @@ - // <http://www.gnu.org/licenses/>. - - // { dg-do compile } --// { dg-error "no matching" "" { target *-*-* } 1361 } -+// { dg-error "no matching" "" { target *-*-* } 1367 } - - #include <vector> - -Index: libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc (.../branches/gcc-4_9-branch) -@@ -18,7 +18,7 @@ - // <http://www.gnu.org/licenses/>. - - // { dg-do compile } --// { dg-error "no matching" "" { target *-*-* } 1246 } -+// { dg-error "no matching" "" { target *-*-* } 1252 } - - #include <vector> - -Index: libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc (.../branches/gcc-4_9-branch) -@@ -18,7 +18,7 @@ - // <http://www.gnu.org/licenses/>. - - // { dg-do compile } --// { dg-error "no matching" "" { target *-*-* } 1246 } -+// { dg-error "no matching" "" { target *-*-* } 1252 } - - #include <vector> - #include <utility> -Index: libstdc++-v3/testsuite/23_containers/unordered_set/modifiers/swap.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/23_containers/unordered_set/modifiers/swap.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/23_containers/unordered_set/modifiers/swap.cc (.../branches/gcc-4_9-branch) -@@ -0,0 +1,65 @@ -+// Copyright (C) 2014 Free Software Foundation, Inc. -+// -+// This file is part of the GNU ISO C++ Library. This library is free -+// software; you can redistribute it and/or modify it under the -+// terms of the GNU General Public License as published by the -+// Free Software Foundation; either version 3, or (at your option) -+// any later version. -+ -+// This library is distributed in the hope that it will be useful, -+// but WITHOUT ANY WARRANTY; without even the implied warranty of -+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+// GNU General Public License for more details. -+ -+// You should have received a copy of the GNU General Public License along -+// with this library; see the file COPYING3. If not see -+// <http://www.gnu.org/licenses/>. -+ -+// { dg-options "-std=gnu++11" } -+ -+#include <unordered_set> -+#include <testsuite_hooks.h> -+ -+void test01() -+{ -+ bool test __attribute__((unused)) = true; -+ std::unordered_set<int> us1 { 0, 1 }; -+ { -+ std::unordered_set<int> us2(std::move(us1)); -+ -+ us1.swap(us2); -+ -+ VERIFY( us1.find(0) != us1.end() ); -+ -+ us1.insert(2); -+ -+ VERIFY( us1.size() == 3 ); -+ -+ us2.swap(us1); -+ -+ VERIFY( us2.size() == 3 ); -+ VERIFY( us2.find(2) != us2.end() ); -+ -+ us1 = { 3, 4, 5 }; -+ -+ VERIFY( us1.size() == 3 ); -+ VERIFY( us1.bucket_count() >= 3 ); -+ -+ std::unordered_set<int> us3(std::move(us1)); -+ us3 = std::move(us2); -+ -+ us1.swap(us2); -+ -+ VERIFY( us1.empty() ); -+ VERIFY( us2.empty() ); -+ } -+ -+ us1 = { 0, 1 }; -+ VERIFY( us1.size() == 2 ); -+} -+ -+int main() -+{ -+ test01(); -+ return 0; -+} -Index: libstdc++-v3/testsuite/23_containers/unordered_set/61143.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/23_containers/unordered_set/61143.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/23_containers/unordered_set/61143.cc (.../branches/gcc-4_9-branch) -@@ -0,0 +1,38 @@ -+// { dg-options "-std=gnu++11" } -+ -+// Copyright (C) 2014 Free Software Foundation, Inc. -+// -+// This file is part of the GNU ISO C++ Library. This library is free -+// software; you can redistribute it and/or modify it under the -+// terms of the GNU General Public License as published by the -+// Free Software Foundation; either version 3, or (at your option) -+// any later version. -+ -+// This library is distributed in the hope that it will be useful, -+// but WITHOUT ANY WARRANTY; without even the implied warranty of -+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+// GNU General Public License for more details. -+ -+// You should have received a copy of the GNU General Public License along -+// with this library; see the file COPYING3. If not see -+// <http://www.gnu.org/licenses/>. -+ -+// libstdc++/61143 -+ -+#include <unordered_set> -+ -+void test01() -+{ -+ std::unordered_set<int> us1, us2; -+ us1.insert(1); -+ -+ us2 = std::move(us1); -+ -+ us1.insert(1); -+} -+ -+int main() -+{ -+ test01(); -+ return 0; -+} -Index: libstdc++-v3/testsuite/20_util/tuple/tuple_element.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/20_util/tuple/tuple_element.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/20_util/tuple/tuple_element.cc (.../branches/gcc-4_9-branch) -@@ -1,4 +1,5 @@ --// { dg-options "-std=gnu++0x" } -+// { dg-options "-std=gnu++11" } -+// { dg-do compile } - - // Copyright (C) 2007-2014 Free Software Foundation, Inc. - // -Index: libstdc++-v3/testsuite/20_util/tuple/tuple_element_t.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/20_util/tuple/tuple_element_t.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/20_util/tuple/tuple_element_t.cc (.../branches/gcc-4_9-branch) -@@ -0,0 +1,36 @@ -+// { dg-options "-std=gnu++14" } -+// { dg-do compile } -+ -+// Copyright (C) 2014 Free Software Foundation, Inc. -+// -+// This file is part of the GNU ISO C++ Library. This library is free -+// software; you can redistribute it and/or modify it under the -+// terms of the GNU General Public License as published by the -+// Free Software Foundation; either version 3, or (at your option) -+// any later version. -+ -+// This library is distributed in the hope that it will be useful, -+// but WITHOUT ANY WARRANTY; without even the implied warranty of -+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+// GNU General Public License for more details. -+ -+// You should have received a copy of the GNU General Public License along -+// with this library; see the file COPYING3. If not see -+// <http://www.gnu.org/licenses/>. -+ -+#include <tuple> -+ -+using namespace std; -+ -+struct foo -+{ }; -+ -+int -+main() -+{ -+ // As foo isn't constructible from anything else, this -+ // lets us check if the alias is returning foo when it should -+ foo q1; -+ tuple_element_t<0,tuple<foo,void,int> > q2(q1); -+ tuple_element_t<2,tuple<void,int,foo> > q3(q1); -+} -Index: libstdc++-v3/testsuite/20_util/tuple/element_access/get_by_type.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/20_util/tuple/element_access/get_by_type.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/20_util/tuple/element_access/get_by_type.cc (.../branches/gcc-4_9-branch) -@@ -41,4 +41,8 @@ - get<1>(b)=5; - VERIFY(get<int>(b)==1 && get<int&>(b)==5 && get<const int&>(b)==2); - VERIFY(j==5); -+ // test rvalue overload: -+ VERIFY(get<int>(std::move(b))==1); -+ VERIFY(get<int&>(std::move(b))==5); -+ VERIFY(get<const int&>(std::move(b))==2); - } -Index: libstdc++-v3/testsuite/20_util/tuple/60497.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/20_util/tuple/60497.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/20_util/tuple/60497.cc (.../branches/gcc-4_9-branch) -@@ -0,0 +1,37 @@ -+// { dg-options "-std=gnu++14" } -+// { dg-do compile } -+ -+// Copyright (C) 2014 Free Software Foundation, Inc. -+// -+// This file is part of the GNU ISO C++ Library. This library is free -+// software; you can redistribute it and/or modify it under the -+// terms of the GNU General Public License as published by the -+// Free Software Foundation; either version 3, or (at your option) -+// any later version. -+ -+// This library is distributed in the hope that it will be useful, -+// but WITHOUT ANY WARRANTY; without even the implied warranty of -+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+// GNU General Public License for more details. -+ -+// You should have received a copy of the GNU General Public License along -+// with this library; see the file COPYING3. If not see -+// <http://www.gnu.org/licenses/>. -+ -+// libstdc++/60497 -+ -+#include <tuple> -+ -+struct A; -+template<typename T> struct B { T t; }; -+ -+using element_type = B<A>*; -+using tuple_type = std::tuple<element_type>; -+ -+tuple_type t; -+const tuple_type ct; -+ -+auto a = std::get<0>(t); -+auto b = std::get<0>(ct); -+auto c = std::get<element_type>(t); -+auto d = std::get<element_type>(ct); -Index: libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc (.../branches/gcc-4_9-branch) -@@ -48,5 +48,5 @@ - // { dg-error "required from here" "" { target *-*-* } 40 } - // { dg-error "required from here" "" { target *-*-* } 42 } - --// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1714 } --// { dg-error "declaration of" "" { target *-*-* } 1678 } -+// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1747 } -+// { dg-error "declaration of" "" { target *-*-* } 1711 } -Index: libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs-1.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs-1.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs-1.cc (.../branches/gcc-4_9-branch) -@@ -29,6 +29,7 @@ - using std::make_signed; - using std::is_same; - using std::is_signed; -+ using std::is_volatile; - - // Positive tests. - typedef make_signed<const int>::type test2_type; -@@ -53,7 +54,9 @@ - - #ifdef _GLIBCXX_USE_WCHAR_T - typedef make_signed<volatile wchar_t>::type test23_type; -- static_assert( is_same<test23_type, volatile signed wchar_t>::value, -+ static_assert( is_signed<test23_type>::value -+ && is_volatile<test23_type>::value -+ && sizeof(test23_type) == sizeof(volatile wchar_t), - "make_signed<volatile wchar_t>" ); - #endif - -Index: libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs-2.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs-2.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs-2.cc (.../branches/gcc-4_9-branch) -@@ -30,6 +30,8 @@ - { - using std::make_signed; - using std::is_same; -+ using std::is_signed; -+ using std::is_volatile; - - // Positive tests. - typedef make_signed<const int>::type test2_type; -@@ -50,7 +52,9 @@ - - #ifdef _GLIBCXX_USE_WCHAR_T - typedef make_signed<volatile wchar_t>::type test23_type; -- static_assert(is_same<test23_type, volatile signed wchar_t>::value, ""); -+ static_assert(is_signed<test23_type>::value -+ && is_volatile<test23_type>::value -+ && sizeof(test23_type) == sizeof(volatile wchar_t), ""); - #endif - - typedef make_signed<test_enum>::type test24_type; -Index: libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs-4.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs-4.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs-4.cc (.../branches/gcc-4_9-branch) -@@ -0,0 +1,33 @@ -+// { dg-options "-std=gnu++11" } -+// { dg-do compile } -+// { dg-require-cstdint "" } -+ -+// Copyright (C) 2014 Free Software Foundation, Inc. -+// -+// This file is part of the GNU ISO C++ Library. This library is free -+// software; you can redistribute it and/or modify it under the -+// terms of the GNU General Public License as published by the -+// Free Software Foundation; either version 3, or (at your option) -+// any later version. -+// -+// This library is distributed in the hope that it will be useful, -+// but WITHOUT ANY WARRANTY; without even the implied warranty of -+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+// GNU General Public License for more details. -+// -+// You should have received a copy of the GNU General Public License along -+// with this library; see the file COPYING3. If not see -+// <http://www.gnu.org/licenses/>. -+ -+#include <type_traits> -+ -+// libstdc++/60326 -+ -+using namespace std; -+#ifdef _GLIBCXX_USE_WCHAR_T -+using wchar_signed = make_signed<wchar_t>::type; -+using wchar_unsigned = make_unsigned<wchar_t>::type; -+static_assert( !is_same<wchar_signed, wchar_unsigned>::value, "wchar_t" ); -+#endif -+static_assert( is_signed<make_signed<char16_t>::type>::value, "char16_t"); -+static_assert( is_signed<make_signed<char32_t>::type>::value, "char32_t"); -Index: libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc (.../branches/gcc-4_9-branch) -@@ -48,5 +48,5 @@ - // { dg-error "required from here" "" { target *-*-* } 40 } - // { dg-error "required from here" "" { target *-*-* } 42 } - --// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1632 } --// { dg-error "declaration of" "" { target *-*-* } 1596 } -+// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1650 } -+// { dg-error "declaration of" "" { target *-*-* } 1614 } -Index: libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs-1.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs-1.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs-1.cc (.../branches/gcc-4_9-branch) -@@ -29,6 +29,7 @@ - using std::make_unsigned; - using std::is_same; - using std::is_unsigned; -+ using std::is_volatile; - - // Positive tests. - typedef make_unsigned<const unsigned int>::type test2_type; -@@ -49,7 +50,9 @@ - - #ifdef _GLIBCXX_USE_WCHAR_T - typedef make_unsigned<volatile wchar_t>::type test23_type; -- static_assert(is_same<test23_type, volatile wchar_t>::value, ""); -+ static_assert(is_unsigned<test23_type>::value -+ && is_volatile<test23_type>::value -+ && sizeof(test23_type) == sizeof(volatile wchar_t), ""); - #endif - - // Chapter 48, chapter 20. Smallest rank such that new unsigned type -Index: libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs-2.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs-2.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs-2.cc (.../branches/gcc-4_9-branch) -@@ -30,6 +30,8 @@ - { - using std::make_unsigned; - using std::is_same; -+ using std::is_unsigned; -+ using std::is_volatile; - - // Positive tests. - typedef make_unsigned<const unsigned int>::type test2_type; -@@ -50,7 +52,9 @@ - - #ifdef _GLIBCXX_USE_WCHAR_T - typedef make_unsigned<volatile wchar_t>::type test23_type; -- static_assert(is_same<test23_type, volatile wchar_t>::value, ""); -+ static_assert(is_unsigned<test23_type>::value -+ && is_volatile<test23_type>::value -+ && sizeof(test23_type) == sizeof(volatile wchar_t), ""); - #endif - - typedef make_unsigned<test_enum>::type test24_type; -Index: libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc (.../branches/gcc-4_9-branch) -@@ -19,7 +19,7 @@ - // with this library; see the file COPYING3. If not see - // <http://www.gnu.org/licenses/>. - --// { dg-error "static assertion failed" "" { target *-*-* } 2003 } -+// { dg-error "static assertion failed" "" { target *-*-* } 2036 } - - #include <utility> - -Index: libstdc++-v3/testsuite/20_util/shared_ptr/cons/61036.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/20_util/shared_ptr/cons/61036.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/20_util/shared_ptr/cons/61036.cc (.../branches/gcc-4_9-branch) -@@ -0,0 +1,28 @@ -+// { dg-options "-std=gnu++11" } -+// { dg-do compile } -+ -+// Copyright (C) 2014 Free Software Foundation, Inc. -+// -+// This file is part of the GNU ISO C++ Library. This library is free -+// software; you can redistribute it and/or modify it under the -+// terms of the GNU General Public License as published by the -+// Free Software Foundation; either version 3, or (at your option) -+// any later version. -+ -+// This library is distributed in the hope that it will be useful, -+// but WITHOUT ANY WARRANTY; without even the implied warranty of -+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+// GNU General Public License for more details. -+ -+// You should have received a copy of the GNU General Public License along -+// with this library; see the file COPYING3. If not see -+// <http://www.gnu.org/licenses/>. -+ -+// 20.8.2.2 Template class shared_ptr [util.smartptr.shared] -+ -+#include <memory> -+ -+void test01() -+{ -+ std::shared_ptr<void> p(new int); -+} -Index: libstdc++-v3/testsuite/20_util/function/60594.cc -=================================================================== ---- a/src/libstdc++-v3/testsuite/20_util/function/60594.cc (.../tags/gcc_4_9_0_release) -+++ b/src/libstdc++-v3/testsuite/20_util/function/60594.cc (.../branches/gcc-4_9-branch) -@@ -0,0 +1,36 @@ -+// { dg-options "-std=gnu++11" } -+// { dg-do compile } -+ -+// Copyright (C) 2011-2014 Free Software Foundation, Inc. -+// -+// This file is part of the GNU ISO C++ Library. This library is free -+// software; you can redistribute it and/or modify it under the -+// terms of the GNU General Public License as published by the -+// Free Software Foundation; either version 3, or (at your option) -+// any later version. -+// -+// This library is distributed in the hope that it will be useful, -+// but WITHOUT ANY WARRANTY; without even the implied warranty of -+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+// GNU General Public License for more details. -+// -+// You should have received a copy of the GNU General Public License along -+// with this library; see the file COPYING3. If not see -+// <http://www.gnu.org/licenses/>. -+ -+// libstdc++/60594 -+ -+#include <functional> -+#include <type_traits> -+struct bar; -+using F = std::function<bar()>; -+// check for copy constructible and assignable while 'bar' is incomplete -+constexpr int c = std::is_copy_constructible<F>::value; -+constexpr int a = std::is_copy_assignable<F>::value; -+struct bar { }; -+bar func(); -+void test() -+{ -+ F g{ &func }; -+ g = func; -+} -Index: lto-plugin/configure -=================================================================== ---- a/src/lto-plugin/configure (.../tags/gcc_4_9_0_release) -+++ b/src/lto-plugin/configure (.../branches/gcc-4_9-branch) -@@ -4087,9 +4087,33 @@ - done - CFLAGS="$save_CFLAGS" - -+ -+# Check whether -static-libgcc is supported. -+saved_LDFLAGS="$LDFLAGS" -+LDFLAGS="$LDFLAGS -static-libgcc" -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -static-libgcc" >&5 -+$as_echo_n "checking for -static-libgcc... " >&6; } -+cat confdefs.h - <<_ACEOF >conftest.$ac_ext -+/* end confdefs.h. */ -+ -+ int main() {} -+_ACEOF -+if ac_fn_c_try_link "$LINENO"; then : -+ have_static_libgcc=yes -+else -+ have_static_libgcc=no -+fi -+rm -f core conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext -+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_static_libgcc" >&5 -+$as_echo "$have_static_libgcc" >&6; }; -+LDFLAGS="$saved_LDFLAGS" - # Need -Wc to get it through libtool. --if test "x$GCC" = xyes; then ac_lto_plugin_ldflags="-Wc,-static-libgcc"; fi -+if test "x$have_static_libgcc" = xyes; then -+ ac_lto_plugin_ldflags="-Wc,-static-libgcc" -+fi - -+ - case `pwd` in - *\ * | *\ *) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 -@@ -10562,7 +10586,7 @@ - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF --#line 10565 "configure" -+#line 10589 "configure" - #include "confdefs.h" - - #if HAVE_DLFCN_H -@@ -10668,7 +10692,7 @@ - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF --#line 10671 "configure" -+#line 10695 "configure" - #include "confdefs.h" - - #if HAVE_DLFCN_H -Index: lto-plugin/configure.ac -=================================================================== ---- a/src/lto-plugin/configure.ac (.../tags/gcc_4_9_0_release) -+++ b/src/lto-plugin/configure.ac (.../branches/gcc-4_9-branch) -@@ -7,9 +7,21 @@ - AC_PROG_CC - AC_SYS_LARGEFILE - ACX_PROG_CC_WARNING_OPTS([-Wall], [ac_lto_plugin_warn_cflags]) -+ -+# Check whether -static-libgcc is supported. -+saved_LDFLAGS="$LDFLAGS" -+LDFLAGS="$LDFLAGS -static-libgcc" -+AC_MSG_CHECKING([for -static-libgcc]) -+AC_LINK_IFELSE([ -+ int main() {}], [have_static_libgcc=yes], [have_static_libgcc=no]) -+AC_MSG_RESULT($have_static_libgcc); -+LDFLAGS="$saved_LDFLAGS" - # Need -Wc to get it through libtool. --if test "x$GCC" = xyes; then ac_lto_plugin_ldflags="-Wc,-static-libgcc"; fi -+if test "x$have_static_libgcc" = xyes; then -+ ac_lto_plugin_ldflags="-Wc,-static-libgcc" -+fi - AC_SUBST(ac_lto_plugin_ldflags) -+ - AM_PROG_LIBTOOL - ACX_LT_HOST_FLAGS - AC_SUBST(target_noncanonical) -Index: lto-plugin/ChangeLog -=================================================================== ---- a/src/lto-plugin/ChangeLog (.../tags/gcc_4_9_0_release) -+++ b/src/lto-plugin/ChangeLog (.../branches/gcc-4_9-branch) -@@ -1,3 +1,9 @@ -+2014-05-15 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> -+ -+ PR lto/60981 -+ * configure.ac: Check for -static-libgcc. -+ * configure: Regenerate. -+ - 2014-04-22 Release Manager - - * GCC 4.9.0 released. -Index: contrib/ChangeLog -=================================================================== ---- a/src/contrib/ChangeLog (.../tags/gcc_4_9_0_release) -+++ b/src/contrib/ChangeLog (.../branches/gcc-4_9-branch) -@@ -1,3 +1,7 @@ -+2014-06-29 Richard Biener <rguenther@suse.de> -+ -+ * gennews: Use gcc-3.0/index.html. -+ - 2014-04-22 Release Manager - - * GCC 4.9.0 released. -Index: contrib/gennews -=================================================================== ---- a/src/contrib/gennews (.../tags/gcc_4_9_0_release) -+++ b/src/contrib/gennews (.../branches/gcc-4_9-branch) -@@ -37,7 +37,7 @@ - gcc-3.3/index.html gcc-3.3/changes.html - gcc-3.2/index.html gcc-3.2/changes.html - gcc-3.1/index.html gcc-3.1/changes.html -- gcc-3.0/gcc-3.0.html gcc-3.0/features.html gcc-3.0/caveats.html -+ gcc-3.0/index.html gcc-3.0/features.html gcc-3.0/caveats.html - gcc-2.95/index.html gcc-2.95/features.html gcc-2.95/caveats.html - egcs-1.1/index.html egcs-1.1/features.html egcs-1.1/caveats.html - egcs-1.0/index.html egcs-1.0/features.html egcs-1.0/caveats.html" -Index: libbacktrace/ChangeLog -=================================================================== ---- a/src/libbacktrace/ChangeLog (.../tags/gcc_4_9_0_release) -+++ b/src/libbacktrace/ChangeLog (.../branches/gcc-4_9-branch) -@@ -1,3 +1,12 @@ -+2014-05-08 Ian Lance Taylor <iant@google.com> -+ -+ Backport from mainline: -+ * mmap.c (backtrace_free): If freeing a large aligned block of -+ memory, call munmap rather than holding onto it. -+ (backtrace_vector_grow): When growing a vector, double the number -+ of pages requested. When releasing the old version of a grown -+ vector, pass the correct size to backtrace_free. -+ - 2014-04-22 Release Manager - - * GCC 4.9.0 released. -Index: libbacktrace/mmap.c -=================================================================== ---- a/src/libbacktrace/mmap.c (.../tags/gcc_4_9_0_release) -+++ b/src/libbacktrace/mmap.c (.../branches/gcc-4_9-branch) -@@ -164,6 +164,26 @@ - { - int locked; - -+ /* If we are freeing a large aligned block, just release it back to -+ the system. This case arises when growing a vector for a large -+ binary with lots of debug info. Calling munmap here may cause us -+ to call mmap again if there is also a large shared library; we -+ just live with that. */ -+ if (size >= 16 * 4096) -+ { -+ size_t pagesize; -+ -+ pagesize = getpagesize (); -+ if (((uintptr_t) addr & (pagesize - 1)) == 0 -+ && (size & (pagesize - 1)) == 0) -+ { -+ /* If munmap fails for some reason, just add the block to -+ the freelist. */ -+ if (munmap (addr, size) == 0) -+ return; -+ } -+ } -+ - /* If we can acquire the lock, add the new space to the free list. - If we can't acquire the lock, just leak the memory. - __sync_lock_test_and_set returns the old state of the lock, so we -@@ -209,7 +229,10 @@ - alc = pagesize; - } - else -- alc = (alc + pagesize - 1) & ~ (pagesize - 1); -+ { -+ alc *= 2; -+ alc = (alc + pagesize - 1) & ~ (pagesize - 1); -+ } - base = backtrace_alloc (state, alc, error_callback, data); - if (base == NULL) - return NULL; -@@ -216,7 +239,8 @@ - if (vec->base != NULL) - { - memcpy (base, vec->base, vec->size); -- backtrace_free (state, vec->base, vec->alc, error_callback, data); -+ backtrace_free (state, vec->base, vec->size + vec->alc, -+ error_callback, data); - } - vec->base = base; - vec->alc = alc - vec->size; -Index: libjava/classpath -=================================================================== ---- a/src/libjava/classpath (.../tags/gcc_4_9_0_release) -+++ b/src/libjava/classpath (.../branches/gcc-4_9-branch) - -Property changes on: libjava/classpath -___________________________________________________________________ -Modified: svn:mergeinfo - Merged /trunk/libjava/classpath:r210668,211733 -Index: libgcc/ChangeLog -=================================================================== ---- a/src/libgcc/ChangeLog (.../tags/gcc_4_9_0_release) -+++ b/src/libgcc/ChangeLog (.../branches/gcc-4_9-branch) -@@ -1,3 +1,40 @@ -+2014-05-27 Georg-Johann Lay <avr@gjlay.de> -+ -+ Backport from 2014-05-27 mainline r210322. -+ -+ PR libgcc/61152 -+ * config/arm/bpabi-lib.h (License): Add GCC Runtime Library Exception. -+ -+2014-05-22 Nick Clifton <nickc@redhat.com> -+ -+ * config/msp430/t-msp430 (HOST_LIBGCC2_CFLAGS): Add -+ -mhwmult=none. -+ -+2014-05-21 Maciej W. Rozycki <macro@codesourcery.com> -+ -+ Backport from mainline -+ 2014-05-21 Maciej W. Rozycki <macro@codesourcery.com> -+ -+ PR libgcc/60166 -+ * config/arm/sfp-machine.h (_FP_NANFRAC_H, _FP_NANFRAC_S) -+ (_FP_NANFRAC_D, _FP_NANSIGN_Q): Set the quiet bit. -+ -+2014-05-15 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> -+ -+ Backport from mainline -+ 2014-05-08 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> -+ -+ PR libgcc/61097 -+ * config/t-slibgcc-sld: Only build and install libgcc-unwind.map -+ if --enable-shared. -+ -+2014-04-30 Bernd Edlinger <bernd.edlinger@hotmail.de> -+ -+ Work around for current cygwin32 build problems. -+ * config/i386/cygming-crtbegin.c (__register_frame_info, -+ __deregister_frame_info, _Jv_RegisterClasses): Compile weak default -+ functions only for 64-bit systems. -+ - 2014-04-22 Release Manager - - * GCC 4.9.0 released. -Index: libgcc/config/t-slibgcc-sld -=================================================================== ---- a/src/libgcc/config/t-slibgcc-sld (.../tags/gcc_4_9_0_release) -+++ b/src/libgcc/config/t-slibgcc-sld (.../branches/gcc-4_9-branch) -@@ -4,6 +4,8 @@ - SHLIB_LDFLAGS = -Wl,-h,$(SHLIB_SONAME) -Wl,-z,text -Wl,-z,defs \ - -Wl,-M,$(SHLIB_MAP) - -+ifeq ($(enable_shared),yes) -+ - # Linker mapfile to enforce direct binding to libgcc_s unwinder - # (PR target/59788). - libgcc-unwind.map: libgcc-std.ver -@@ -26,3 +28,5 @@ - $(INSTALL_DATA) $< $(DESTDIR)$(slibdir) - - install: install-libgcc-unwind-map -+ -+endif -Index: libgcc/config/i386/cygming-crtbegin.c -=================================================================== ---- a/src/libgcc/config/i386/cygming-crtbegin.c (.../tags/gcc_4_9_0_release) -+++ b/src/libgcc/config/i386/cygming-crtbegin.c (.../branches/gcc-4_9-branch) -@@ -54,6 +54,11 @@ - TARGET_ATTRIBUTE_WEAK; - extern void *__deregister_frame_info (__attribute__((unused)) const void *) - TARGET_ATTRIBUTE_WEAK; -+ -+/* Work around for current cygwin32 build problems (Bug gas/16858). -+ Compile weak default functions only for 64-bit systems, -+ when absolutely necessary. */ -+#ifdef __x86_64__ - TARGET_ATTRIBUTE_WEAK void - __register_frame_info (__attribute__((unused)) const void *p, - __attribute__((unused)) struct object *o) -@@ -65,6 +70,7 @@ - { - return (void*) 0; - } -+#endif - #endif /* DWARF2_UNWIND_INFO */ - - #if TARGET_USE_JCR_SECTION -@@ -71,10 +77,12 @@ - extern void _Jv_RegisterClasses (__attribute__((unused)) const void *) - TARGET_ATTRIBUTE_WEAK; - -+#ifdef __x86_64__ - TARGET_ATTRIBUTE_WEAK void - _Jv_RegisterClasses (__attribute__((unused)) const void *p) - { - } -+#endif - #endif /* TARGET_USE_JCR_SECTION */ - - #if defined(HAVE_LD_RO_RW_SECTION_MIXING) -Index: libgcc/config/arm/sfp-machine.h -=================================================================== ---- a/src/libgcc/config/arm/sfp-machine.h (.../tags/gcc_4_9_0_release) -+++ b/src/libgcc/config/arm/sfp-machine.h (.../branches/gcc-4_9-branch) -@@ -21,10 +21,10 @@ - - /* According to RTABI, QNAN is only with the most significant bit of the - significand set, and all other significand bits zero. */ --#define _FP_NANFRAC_H 0 --#define _FP_NANFRAC_S 0 --#define _FP_NANFRAC_D 0, 0 --#define _FP_NANFRAC_Q 0, 0, 0, 0 -+#define _FP_NANFRAC_H _FP_QNANBIT_H -+#define _FP_NANFRAC_S _FP_QNANBIT_S -+#define _FP_NANFRAC_D _FP_QNANBIT_D, 0 -+#define _FP_NANFRAC_Q _FP_QNANBIT_Q, 0, 0, 0 - #define _FP_NANSIGN_H 0 - #define _FP_NANSIGN_S 0 - #define _FP_NANSIGN_D 0 -Index: libgcc/config/arm/bpabi-lib.h -=================================================================== ---- a/src/libgcc/config/arm/bpabi-lib.h (.../tags/gcc_4_9_0_release) -+++ b/src/libgcc/config/arm/bpabi-lib.h (.../branches/gcc-4_9-branch) -@@ -14,6 +14,10 @@ - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - -+ Under Section 7 of GPL version 3, you are granted additional -+ permissions described in the GCC Runtime Library Exception, version -+ 3.1, as published by the Free Software Foundation. -+ - You should have received a copy of the GNU General Public License and - a copy of the GCC Runtime Library Exception along with this program; - see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -Index: libgcc/config/msp430/t-msp430 -=================================================================== ---- a/src/libgcc/config/msp430/t-msp430 (.../tags/gcc_4_9_0_release) -+++ b/src/libgcc/config/msp430/t-msp430 (.../branches/gcc-4_9-branch) -@@ -42,7 +42,7 @@ - $(srcdir)/config/msp430/floathisf.c \ - $(srcdir)/config/msp430/cmpd.c - --HOST_LIBGCC2_CFLAGS += -Os -ffunction-sections -fdata-sections -+HOST_LIBGCC2_CFLAGS += -Os -ffunction-sections -fdata-sections -mhwmult=none - - # Local Variables: - # mode: Makefile -Index: gcc/tree-vrp.c -=================================================================== ---- a/src/gcc/tree-vrp.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/tree-vrp.c (.../branches/gcc-4_9-branch) -@@ -3616,15 +3616,18 @@ - /* If arg is non-zero, then ffs or popcount - are non-zero. */ - if (((vr0->type == VR_RANGE -- && integer_nonzerop (vr0->min)) -+ && range_includes_zero_p (vr0->min, vr0->max) == 0) - || (vr0->type == VR_ANTI_RANGE -- && integer_zerop (vr0->min))) -- && !is_overflow_infinity (vr0->min)) -+ && range_includes_zero_p (vr0->min, vr0->max) == 1)) -+ && !is_overflow_infinity (vr0->min) -+ && !is_overflow_infinity (vr0->max)) - mini = 1; - /* If some high bits are known to be zero, - we can decrease the maximum. */ - if (vr0->type == VR_RANGE - && TREE_CODE (vr0->max) == INTEGER_CST -+ && !operand_less_p (vr0->min, -+ build_zero_cst (TREE_TYPE (vr0->min))) - && !is_overflow_infinity (vr0->max)) - maxi = tree_floor_log2 (vr0->max) + 1; - } -@@ -6661,8 +6664,9 @@ - } - else - { -+ if (!is_gimple_debug (gsi_stmt (si))) -+ is_unreachable = 0; - gsi_next (&si); -- is_unreachable = 0; - } - } - } -Index: gcc/tree-ssa-loop-im.c -=================================================================== ---- a/src/gcc/tree-ssa-loop-im.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/tree-ssa-loop-im.c (.../branches/gcc-4_9-branch) -@@ -1544,15 +1544,6 @@ - struct loop *loop, *outer; - unsigned i, n; - --#if 0 -- /* Initialize bb_loop_postorder with a mapping from loop->num to -- its postorder index. */ -- i = 0; -- bb_loop_postorder = XNEWVEC (unsigned, number_of_loops (cfun)); -- FOR_EACH_LOOP (loop, LI_FROM_INNERMOST) -- bb_loop_postorder[loop->num] = i++; --#endif -- - /* Collect all basic-blocks in loops and sort them after their - loops postorder. */ - i = 0; -@@ -1807,6 +1798,7 @@ - gimple_stmt_iterator gsi; - gimple stmt; - struct prev_flag_edges *prev_edges = (struct prev_flag_edges *) ex->aux; -+ bool irr = ex->flags & EDGE_IRREDUCIBLE_LOOP; - - /* ?? Insert store after previous store if applicable. See note - below. */ -@@ -1821,8 +1813,9 @@ - old_dest = ex->dest; - new_bb = split_edge (ex); - then_bb = create_empty_bb (new_bb); -- if (current_loops && new_bb->loop_father) -- add_bb_to_loop (then_bb, new_bb->loop_father); -+ if (irr) -+ then_bb->flags = BB_IRREDUCIBLE_LOOP; -+ add_bb_to_loop (then_bb, new_bb->loop_father); - - gsi = gsi_start_bb (new_bb); - stmt = gimple_build_cond (NE_EXPR, flag, boolean_false_node, -@@ -1834,9 +1827,12 @@ - stmt = gimple_build_assign (unshare_expr (mem), tmp_var); - gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); - -- make_edge (new_bb, then_bb, EDGE_TRUE_VALUE); -- make_edge (new_bb, old_dest, EDGE_FALSE_VALUE); -- then_old_edge = make_edge (then_bb, old_dest, EDGE_FALLTHRU); -+ make_edge (new_bb, then_bb, -+ EDGE_TRUE_VALUE | (irr ? EDGE_IRREDUCIBLE_LOOP : 0)); -+ make_edge (new_bb, old_dest, -+ EDGE_FALSE_VALUE | (irr ? EDGE_IRREDUCIBLE_LOOP : 0)); -+ then_old_edge = make_edge (then_bb, old_dest, -+ EDGE_FALLTHRU | (irr ? EDGE_IRREDUCIBLE_LOOP : 0)); - - set_immediate_dominator (CDI_DOMINATORS, then_bb, new_bb); - -Index: gcc/tree-ssa-tail-merge.c -=================================================================== ---- a/src/gcc/tree-ssa-tail-merge.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/tree-ssa-tail-merge.c (.../branches/gcc-4_9-branch) -@@ -481,7 +481,11 @@ - hashval = iterative_hash_hashval_t - ((hashval_t) gimple_call_internal_fn (stmt), hashval); - else -- hashval = iterative_hash_expr (gimple_call_fn (stmt), hashval); -+ { -+ hashval = iterative_hash_expr (gimple_call_fn (stmt), hashval); -+ if (gimple_call_chain (stmt)) -+ hashval = iterative_hash_expr (gimple_call_chain (stmt), hashval); -+ } - for (i = 0; i < gimple_call_num_args (stmt); i++) - { - arg = gimple_call_arg (stmt, i); -@@ -1121,18 +1125,23 @@ - switch (gimple_code (s1)) - { - case GIMPLE_CALL: -- if (gimple_call_num_args (s1) != gimple_call_num_args (s2)) -- return false; - if (!gimple_call_same_target_p (s1, s2)) - return false; - -+ t1 = gimple_call_chain (s1); -+ t2 = gimple_call_chain (s2); -+ if (!gimple_operand_equal_value_p (t1, t2)) -+ return false; -+ -+ if (gimple_call_num_args (s1) != gimple_call_num_args (s2)) -+ return false; -+ - for (i = 0; i < gimple_call_num_args (s1); ++i) - { - t1 = gimple_call_arg (s1, i); - t2 = gimple_call_arg (s2, i); -- if (gimple_operand_equal_value_p (t1, t2)) -- continue; -- return false; -+ if (!gimple_operand_equal_value_p (t1, t2)) -+ return false; - } - - lhs1 = gimple_get_lhs (s1); -Index: gcc/tree-pretty-print.c -=================================================================== ---- a/src/gcc/tree-pretty-print.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/tree-pretty-print.c (.../branches/gcc-4_9-branch) -@@ -499,6 +499,7 @@ - pp_string (buffer, "alloc"); - break; - case OMP_CLAUSE_MAP_TO: -+ case OMP_CLAUSE_MAP_TO_PSET: - pp_string (buffer, "to"); - break; - case OMP_CLAUSE_MAP_FROM: -@@ -519,6 +520,9 @@ - if (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_MAP - && OMP_CLAUSE_MAP_KIND (clause) == OMP_CLAUSE_MAP_POINTER) - pp_string (buffer, " [pointer assign, bias: "); -+ else if (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_MAP -+ && OMP_CLAUSE_MAP_KIND (clause) == OMP_CLAUSE_MAP_TO_PSET) -+ pp_string (buffer, " [pointer set, len: "); - else - pp_string (buffer, " [len: "); - dump_generic_node (buffer, OMP_CLAUSE_SIZE (clause), -Index: gcc/c-family/c-opts.c -=================================================================== ---- a/src/gcc/c-family/c-opts.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/c-family/c-opts.c (.../branches/gcc-4_9-branch) -@@ -851,6 +851,12 @@ - if (flag_objc_exceptions && !flag_objc_sjlj_exceptions) - flag_exceptions = 1; - -+ /* If -ffreestanding, -fno-hosted or -fno-builtin then disable -+ pattern recognition. */ -+ if (!global_options_set.x_flag_tree_loop_distribute_patterns -+ && flag_no_builtin) -+ flag_tree_loop_distribute_patterns = 0; -+ - /* -Woverlength-strings is off by default, but is enabled by -Wpedantic. - It is never enabled in C++, as the minimum limit is not normative - in that standard. */ -Index: gcc/c-family/ChangeLog -=================================================================== ---- a/src/gcc/c-family/ChangeLog (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/c-family/ChangeLog (.../branches/gcc-4_9-branch) -@@ -1,3 +1,45 @@ -+2014-06-30 Jakub Jelinek <jakub@redhat.com> -+ -+ Backported from mainline -+ 2014-06-10 Jakub Jelinek <jakub@redhat.com> -+ -+ PR fortran/60928 -+ * c-pragma.c (omp_pragmas_simd): Move PRAGMA_OMP_TASK... -+ (omp_pragmas): ... back here. -+ -+2014-06-12 Jakub Jelinek <jakub@redhat.com> -+ -+ PR middle-end/61486 -+ * c-omp.c (c_omp_split_clauses): Don't crash on firstprivate in -+ #pragma omp target teams or -+ #pragma omp {,target }teams distribute simd. -+ -+2014-06-04 Marek Polacek <polacek@redhat.com> -+ -+ Backport from mainline -+ 2014-05-08 Marek Polacek <polacek@redhat.com> -+ -+ PR c/61053 -+ * c-common.c (min_align_of_type): New function factored out from... -+ (c_sizeof_or_alignof_type): ...here. -+ * c-common.h (min_align_of_type): Declare. -+ -+2014-05-06 Richard Biener <rguenther@suse.de> -+ -+ * c-opts.c (c_common_post_options): For -freestanding, -+ -fno-hosted and -fno-builtin disable pattern recognition -+ if not enabled explicitely. -+ -+2014-04-22 Richard Biener <rguenther@suse.de> -+ -+ Backport from mainline -+ 2014-04-14 Richard Biener <rguenther@suse.de> -+ Marc Glisse <marc.glisse@inria.fr> -+ -+ PR c/60819 -+ * c-common.c (convert_vector_to_pointer_for_subscript): Properly -+ apply may-alias the scalar pointer type when applicable. -+ - 2014-04-22 Release Manager - - * GCC 4.9.0 released. -Index: gcc/c-family/c-common.c -=================================================================== ---- a/src/gcc/c-family/c-common.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/c-family/c-common.c (.../branches/gcc-4_9-branch) -@@ -4927,6 +4927,26 @@ - return -1; - } - -+/* Return the least alignment required for type TYPE. */ -+ -+unsigned int -+min_align_of_type (tree type) -+{ -+ unsigned int align = TYPE_ALIGN (type); -+ align = MIN (align, BIGGEST_ALIGNMENT); -+#ifdef BIGGEST_FIELD_ALIGNMENT -+ align = MIN (align, BIGGEST_FIELD_ALIGNMENT); -+#endif -+ unsigned int field_align = align; -+#ifdef ADJUST_FIELD_ALIGN -+ tree field = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL_TREE, -+ type); -+ field_align = ADJUST_FIELD_ALIGN (field, field_align); -+#endif -+ align = MIN (align, field_align); -+ return align / BITS_PER_UNIT; -+} -+ - /* Compute the value of 'sizeof (TYPE)' or '__alignof__ (TYPE)', where - the IS_SIZEOF parameter indicates which operator is being applied. - The COMPLAIN flag controls whether we should diagnose possibly -@@ -5005,21 +5025,7 @@ - size_int (TYPE_PRECISION (char_type_node) - / BITS_PER_UNIT)); - else if (min_alignof) -- { -- unsigned int align = TYPE_ALIGN (type); -- align = MIN (align, BIGGEST_ALIGNMENT); --#ifdef BIGGEST_FIELD_ALIGNMENT -- align = MIN (align, BIGGEST_FIELD_ALIGNMENT); --#endif -- unsigned int field_align = align; --#ifdef ADJUST_FIELD_ALIGN -- tree field = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL_TREE, -- type); -- field_align = ADJUST_FIELD_ALIGN (field, field_align); --#endif -- align = MIN (align, field_align); -- value = size_int (align / BITS_PER_UNIT); -- } -+ value = size_int (min_align_of_type (type)); - else - value = size_int (TYPE_ALIGN_UNIT (type)); - } -@@ -11770,8 +11776,21 @@ - - c_common_mark_addressable_vec (*vecp); - type = build_qualified_type (TREE_TYPE (type), TYPE_QUALS (type)); -- type = build_pointer_type (type); - type1 = build_pointer_type (TREE_TYPE (*vecp)); -+ bool ref_all = TYPE_REF_CAN_ALIAS_ALL (type1); -+ if (!ref_all -+ && !DECL_P (*vecp)) -+ { -+ /* If the original vector isn't declared may_alias and it -+ isn't a bare vector look if the subscripting would -+ alias the vector we subscript, and if not, force ref-all. */ -+ alias_set_type vecset = get_alias_set (*vecp); -+ alias_set_type sset = get_alias_set (type); -+ if (!alias_sets_must_conflict_p (sset, vecset) -+ && !alias_set_subset_of (sset, vecset)) -+ ref_all = true; -+ } -+ type = build_pointer_type_for_mode (type, ptr_mode, ref_all); - *vecp = build1 (ADDR_EXPR, type1, *vecp); - *vecp = convert (type, *vecp); - } -Index: gcc/c-family/c-omp.c -=================================================================== ---- a/src/gcc/c-family/c-omp.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/c-family/c-omp.c (.../branches/gcc-4_9-branch) -@@ -789,8 +789,13 @@ - else if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NUM_TEAMS)) - != 0) - { -- /* This must be #pragma omp {,target }teams distribute. */ -- gcc_assert (code == OMP_DISTRIBUTE); -+ /* This must be one of -+ #pragma omp {,target }teams distribute -+ #pragma omp target teams -+ #pragma omp {,target }teams distribute simd. */ -+ gcc_assert (code == OMP_DISTRIBUTE -+ || code == OMP_TEAMS -+ || code == OMP_SIMD); - s = C_OMP_CLAUSE_SPLIT_TEAMS; - } - else if ((mask & (OMP_CLAUSE_MASK_1 -Index: gcc/c-family/c-common.h -=================================================================== ---- a/src/gcc/c-family/c-common.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/c-family/c-common.h (.../branches/gcc-4_9-branch) -@@ -758,6 +758,7 @@ - extern tree c_save_expr (tree); - extern tree c_common_truthvalue_conversion (location_t, tree); - extern void c_apply_type_quals_to_decl (int, tree); -+extern unsigned int min_align_of_type (tree); - extern tree c_sizeof_or_alignof_type (location_t, tree, bool, bool, int); - extern tree c_alignof_expr (location_t, tree); - /* Print an error message for invalid operands to arith operation CODE. -Index: gcc/c-family/c-pragma.c -=================================================================== ---- a/src/gcc/c-family/c-pragma.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/c-family/c-pragma.c (.../branches/gcc-4_9-branch) -@@ -1188,6 +1188,7 @@ - { "section", PRAGMA_OMP_SECTION }, - { "sections", PRAGMA_OMP_SECTIONS }, - { "single", PRAGMA_OMP_SINGLE }, -+ { "task", PRAGMA_OMP_TASK }, - { "taskgroup", PRAGMA_OMP_TASKGROUP }, - { "taskwait", PRAGMA_OMP_TASKWAIT }, - { "taskyield", PRAGMA_OMP_TASKYIELD }, -@@ -1200,7 +1201,6 @@ - { "parallel", PRAGMA_OMP_PARALLEL }, - { "simd", PRAGMA_OMP_SIMD }, - { "target", PRAGMA_OMP_TARGET }, -- { "task", PRAGMA_OMP_TASK }, - { "teams", PRAGMA_OMP_TEAMS }, - }; - -Index: gcc/c/ChangeLog -=================================================================== ---- a/src/gcc/c/ChangeLog (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/c/ChangeLog (.../branches/gcc-4_9-branch) -@@ -1,3 +1,66 @@ -+2014-06-30 Jakub Jelinek <jakub@redhat.com> -+ -+ Backported from mainline -+ 2014-06-25 Jakub Jelinek <jakub@redhat.com> -+ -+ * c-typeck.c (c_finish_omp_clauses): Make sure -+ OMP_CLAUSE_LINEAR_STEP has correct type. -+ -+2014-06-30 Sebastian Huber <sebastian.huber@embedded-brains.de> -+ -+ * c-parser.c (c_parser_declaration_or_fndef): Discard all type -+ qualifiers in __auto_type for atomic types. -+ (c_parser_typeof_specifier): Discard all type qualifiers in -+ __typeof__ for atomic types. -+ -+2014-06-30 Igor Zamyatin <igor.zamyatin@intel.com> -+ -+ PR middle-end/57541 -+ * c-array-notation.c (fix_builtin_array_notation_fn): -+ Check for 0 arguments in builtin call. Check that bultin argument is -+ correct. -+ * c-parser.c (c_parser_array_notation): Check for incorrect initial -+ index. -+ -+2014-06-24 Jakub Jelinek <jakub@redhat.com> -+ -+ * c-parser.c (c_parser_omp_for_loop): For -+ #pragma omp parallel for simd move lastprivate clause from parallel -+ to for rather than simd. -+ -+2014-06-04 Igor Zamyatin <igor.zamyatin@intel.com> -+ -+ PR c/58942 -+ * c-array-notation.c (fix_builtin_array_notation_fn): Handle the case -+ with a pointer. -+ -+2014-06-04 Marek Polacek <polacek@redhat.com> -+ -+ Backport from mainline -+ 2014-05-08 Marek Polacek <polacek@redhat.com> -+ -+ PR c/61053 -+ * c-decl.c (grokdeclarator): Use min_align_of_type instead of -+ TYPE_ALIGN_UNIT. -+ -+2014-05-26 Igor Zamyatin <igor.zamyatin@intel.com> -+ -+ PR c/61191 -+ * c-array-notation.c (fix_builtin_array_notation_fn): Check invalid -+ function parameters. -+ -+2014-04-24 Jakub Jelinek <jakub@redhat.com> -+ -+ * c-parser.c (c_parser_omp_atomic): Allow seq_cst before -+ atomic-clause, allow comma in between atomic-clause and -+ seq_cst. -+ -+2014-04-22 Jakub Jelinek <jakub@redhat.com> -+ -+ PR c/59073 -+ * c-parser.c (c_parser_omp_parallel): If c_parser_omp_for -+ fails, don't set OM_PARALLEL_COMBINED and return NULL. -+ - 2014-04-22 Release Manager - - * GCC 4.9.0 released. -Index: gcc/c/c-parser.c -=================================================================== ---- a/src/gcc/c/c-parser.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/c/c-parser.c (.../branches/gcc-4_9-branch) -@@ -1707,14 +1707,10 @@ - " initializer"); - init = convert_lvalue_to_rvalue (init_loc, init, true, true); - tree init_type = TREE_TYPE (init.value); -- /* As with typeof, remove _Atomic and const -- qualifiers from atomic types. */ -+ /* As with typeof, remove all qualifiers from atomic types. */ - if (init_type != error_mark_node && TYPE_ATOMIC (init_type)) - init_type -- = c_build_qualified_type (init_type, -- (TYPE_QUALS (init_type) -- & ~(TYPE_QUAL_ATOMIC -- | TYPE_QUAL_CONST))); -+ = c_build_qualified_type (init_type, TYPE_UNQUALIFIED); - bool vm_type = variably_modified_type_p (init_type, - NULL_TREE); - if (vm_type) -@@ -3011,16 +3007,11 @@ - if (was_vm) - ret.expr = c_fully_fold (expr.value, false, &ret.expr_const_operands); - pop_maybe_used (was_vm); -- /* For use in macros such as those in <stdatomic.h>, remove -- _Atomic and const qualifiers from atomic types. (Possibly -- all qualifiers should be removed; const can be an issue for -- more macros using typeof than just the <stdatomic.h> -- ones.) */ -+ /* For use in macros such as those in <stdatomic.h>, remove all -+ qualifiers from atomic types. (const can be an issue for more macros -+ using typeof than just the <stdatomic.h> ones.) */ - if (ret.spec != error_mark_node && TYPE_ATOMIC (ret.spec)) -- ret.spec = c_build_qualified_type (ret.spec, -- (TYPE_QUALS (ret.spec) -- & ~(TYPE_QUAL_ATOMIC -- | TYPE_QUAL_CONST))); -+ ret.spec = c_build_qualified_type (ret.spec, TYPE_UNQUALIFIED); - } - c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); - return ret; -@@ -11198,6 +11189,18 @@ - if (c_parser_next_token_is (parser, CPP_NAME)) - { - const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); -+ if (!strcmp (p, "seq_cst")) -+ { -+ seq_cst = true; -+ c_parser_consume_token (parser); -+ if (c_parser_next_token_is (parser, CPP_COMMA) -+ && c_parser_peek_2nd_token (parser)->type == CPP_NAME) -+ c_parser_consume_token (parser); -+ } -+ } -+ if (c_parser_next_token_is (parser, CPP_NAME)) -+ { -+ const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); - - if (!strcmp (p, "read")) - code = OMP_ATOMIC_READ; -@@ -11212,13 +11215,21 @@ - if (p) - c_parser_consume_token (parser); - } -- if (c_parser_next_token_is (parser, CPP_NAME)) -+ if (!seq_cst) - { -- const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); -- if (!strcmp (p, "seq_cst")) -+ if (c_parser_next_token_is (parser, CPP_COMMA) -+ && c_parser_peek_2nd_token (parser)->type == CPP_NAME) -+ c_parser_consume_token (parser); -+ -+ if (c_parser_next_token_is (parser, CPP_NAME)) - { -- seq_cst = true; -- c_parser_consume_token (parser); -+ const char *p -+ = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); -+ if (!strcmp (p, "seq_cst")) -+ { -+ seq_cst = true; -+ c_parser_consume_token (parser); -+ } - } - } - c_parser_skip_to_pragma_eol (parser); -@@ -11861,8 +11872,17 @@ - tree l = build_omp_clause (OMP_CLAUSE_LOCATION (*c), - OMP_CLAUSE_LASTPRIVATE); - OMP_CLAUSE_DECL (l) = OMP_CLAUSE_DECL (*c); -- OMP_CLAUSE_CHAIN (l) = clauses; -- clauses = l; -+ if (code == OMP_SIMD) -+ { -+ OMP_CLAUSE_CHAIN (l) -+ = cclauses[C_OMP_CLAUSE_SPLIT_FOR]; -+ cclauses[C_OMP_CLAUSE_SPLIT_FOR] = l; -+ } -+ else -+ { -+ OMP_CLAUSE_CHAIN (l) = clauses; -+ clauses = l; -+ } - OMP_CLAUSE_SET_CODE (*c, OMP_CLAUSE_SHARED); - } - } -@@ -12208,10 +12228,12 @@ - if (!flag_openmp) /* flag_openmp_simd */ - return c_parser_omp_for (loc, parser, p_name, mask, cclauses); - block = c_begin_omp_parallel (); -- c_parser_omp_for (loc, parser, p_name, mask, cclauses); -+ tree ret = c_parser_omp_for (loc, parser, p_name, mask, cclauses); - stmt - = c_finish_omp_parallel (loc, cclauses[C_OMP_CLAUSE_SPLIT_PARALLEL], - block); -+ if (ret == NULL_TREE) -+ return ret; - OMP_PARALLEL_COMBINED (stmt) = 1; - return stmt; - } -@@ -14042,7 +14064,7 @@ - tree value_tree = NULL_TREE, type = NULL_TREE, array_type = NULL_TREE; - tree array_type_domain = NULL_TREE; - -- if (array_value == error_mark_node) -+ if (array_value == error_mark_node || initial_index == error_mark_node) - { - /* No need to continue. If either of these 2 were true, then an error - must be emitted already. Thus, no need to emit them twice. */ -Index: gcc/c/c-typeck.c -=================================================================== ---- a/src/gcc/c/c-typeck.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/c/c-typeck.c (.../branches/gcc-4_9-branch) -@@ -11925,6 +11925,9 @@ - s = size_one_node; - OMP_CLAUSE_LINEAR_STEP (c) = s; - } -+ else -+ OMP_CLAUSE_LINEAR_STEP (c) -+ = fold_convert (TREE_TYPE (t), OMP_CLAUSE_LINEAR_STEP (c)); - goto check_dup_generic; - - check_dup_generic: -Index: gcc/c/c-array-notation.c -=================================================================== ---- a/src/gcc/c/c-array-notation.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/c/c-array-notation.c (.../branches/gcc-4_9-branch) -@@ -214,6 +214,13 @@ - if (an_type == BUILT_IN_NONE) - return NULL_TREE; - -+ /* Builtin call should contain at least one argument. */ -+ if (call_expr_nargs (an_builtin_fn) == 0) -+ { -+ error_at (EXPR_LOCATION (an_builtin_fn), "Invalid builtin arguments"); -+ return error_mark_node; -+ } -+ - if (an_type == BUILT_IN_CILKPLUS_SEC_REDUCE - || an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_MUTATING) - { -@@ -229,6 +236,8 @@ - /* Fully fold any EXCESSIVE_PRECISION EXPR that can occur in the function - parameter. */ - func_parm = c_fully_fold (func_parm, false, NULL); -+ if (func_parm == error_mark_node) -+ return error_mark_node; - - location = EXPR_LOCATION (an_builtin_fn); - -@@ -236,7 +245,10 @@ - return error_mark_node; - - if (rank == 0) -- return an_builtin_fn; -+ { -+ error_at (location, "Invalid builtin arguments"); -+ return error_mark_node; -+ } - else if (rank > 1 - && (an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_MAX_IND - || an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_MIN_IND)) -@@ -308,7 +320,9 @@ - || an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_MIN_IND) - array_ind_value = build_decl (location, VAR_DECL, NULL_TREE, - TREE_TYPE (func_parm)); -- array_op0 = (*array_operand)[0]; -+ array_op0 = (*array_operand)[0]; -+ if (TREE_CODE (array_op0) == INDIRECT_REF) -+ array_op0 = TREE_OPERAND (array_op0, 0); - switch (an_type) - { - case BUILT_IN_CILKPLUS_SEC_REDUCE_ADD: -Index: gcc/c/c-decl.c -=================================================================== ---- a/src/gcc/c/c-decl.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/c/c-decl.c (.../branches/gcc-4_9-branch) -@@ -5911,7 +5911,7 @@ - else if (declspecs->align_log != -1) - { - alignas_align = 1U << declspecs->align_log; -- if (alignas_align < TYPE_ALIGN_UNIT (type)) -+ if (alignas_align < min_align_of_type (type)) - { - if (name) - error_at (loc, "%<_Alignas%> specifiers cannot reduce " -Index: gcc/cgraph.c -=================================================================== ---- a/src/gcc/cgraph.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/cgraph.c (.../branches/gcc-4_9-branch) -@@ -2566,11 +2566,16 @@ - skipped_thunk = true; - } - -- if (skipped_thunk -- && (!node2->clone_of -- || !node2->clone.args_to_skip -- || !bitmap_bit_p (node2->clone.args_to_skip, 0))) -- return false; -+ if (skipped_thunk) -+ { -+ if (!node2->clone.args_to_skip -+ || !bitmap_bit_p (node2->clone.args_to_skip, 0)) -+ return false; -+ if (node2->former_clone_of == node->decl) -+ return true; -+ else if (!node2->clone_of) -+ return false; -+ } - - while (node != node2 && node2) - node2 = node2->clone_of; -Index: gcc/cgraph.h -=================================================================== ---- a/src/gcc/cgraph.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/cgraph.h (.../branches/gcc-4_9-branch) -@@ -723,6 +723,7 @@ - /* In symtab.c */ - void symtab_register_node (symtab_node *); - void symtab_unregister_node (symtab_node *); -+void symtab_remove_from_same_comdat_group (symtab_node *); - void symtab_remove_node (symtab_node *); - symtab_node *symtab_get_node (const_tree); - symtab_node *symtab_node_for_asm (const_tree asmname); -Index: gcc/DATESTAMP -=================================================================== ---- a/src/gcc/DATESTAMP (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/DATESTAMP (.../branches/gcc-4_9-branch) -@@ -1 +1 @@ --20140422 -+20140712 -Index: gcc/tree-tailcall.c -=================================================================== ---- a/src/gcc/tree-tailcall.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/tree-tailcall.c (.../branches/gcc-4_9-branch) -@@ -285,10 +285,20 @@ - { - /* Reject a tailcall if the type conversion might need - additional code. */ -- if (gimple_assign_cast_p (stmt) -- && TYPE_MODE (TREE_TYPE (dest)) != TYPE_MODE (TREE_TYPE (src_var))) -- return false; -+ if (gimple_assign_cast_p (stmt)) -+ { -+ if (TYPE_MODE (TREE_TYPE (dest)) != TYPE_MODE (TREE_TYPE (src_var))) -+ return false; - -+ /* Even if the type modes are the same, if the precision of the -+ type is smaller than mode's precision, -+ reduce_to_bit_field_precision would generate additional code. */ -+ if (INTEGRAL_TYPE_P (TREE_TYPE (dest)) -+ && (GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (dest))) -+ > TYPE_PRECISION (TREE_TYPE (dest)))) -+ return false; -+ } -+ - if (src_var != *ass_var) - return false; - -Index: gcc/tree.c -=================================================================== ---- a/src/gcc/tree.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/tree.c (.../branches/gcc-4_9-branch) -@@ -252,7 +252,7 @@ - 4, /* OMP_CLAUSE_REDUCTION */ - 1, /* OMP_CLAUSE_COPYIN */ - 1, /* OMP_CLAUSE_COPYPRIVATE */ -- 2, /* OMP_CLAUSE_LINEAR */ -+ 3, /* OMP_CLAUSE_LINEAR */ - 2, /* OMP_CLAUSE_ALIGNED */ - 1, /* OMP_CLAUSE_DEPEND */ - 1, /* OMP_CLAUSE_UNIFORM */ -@@ -11079,8 +11079,13 @@ - WALK_SUBTREE_TAIL (OMP_CLAUSE_CHAIN (*tp)); - } - -+ case OMP_CLAUSE_LINEAR: -+ WALK_SUBTREE (OMP_CLAUSE_DECL (*tp)); -+ WALK_SUBTREE (OMP_CLAUSE_LINEAR_STEP (*tp)); -+ WALK_SUBTREE (OMP_CLAUSE_LINEAR_STMT (*tp)); -+ WALK_SUBTREE_TAIL (OMP_CLAUSE_CHAIN (*tp)); -+ - case OMP_CLAUSE_ALIGNED: -- case OMP_CLAUSE_LINEAR: - case OMP_CLAUSE_FROM: - case OMP_CLAUSE_TO: - case OMP_CLAUSE_MAP: -Index: gcc/tree.h -=================================================================== ---- a/src/gcc/tree.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/tree.h (.../branches/gcc-4_9-branch) -@@ -1327,9 +1327,20 @@ - #define OMP_CLAUSE_LINEAR_VARIABLE_STRIDE(NODE) \ - TREE_PROTECTED (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_LINEAR)) - -+/* True if a LINEAR clause is for an array or allocatable variable that -+ needs special handling by the frontend. */ -+#define OMP_CLAUSE_LINEAR_ARRAY(NODE) \ -+ (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_LINEAR)->base.deprecated_flag) -+ - #define OMP_CLAUSE_LINEAR_STEP(NODE) \ - OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_LINEAR), 1) - -+#define OMP_CLAUSE_LINEAR_STMT(NODE) \ -+ OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_LINEAR), 2) -+ -+#define OMP_CLAUSE_LINEAR_GIMPLE_SEQ(NODE) \ -+ (OMP_CLAUSE_CHECK (NODE))->omp_clause.gimple_reduction_init -+ - #define OMP_CLAUSE_ALIGNED_ALIGNMENT(NODE) \ - OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_ALIGNED), 1) - -Index: gcc/ipa-cp.c -=================================================================== ---- a/src/gcc/ipa-cp.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/ipa-cp.c (.../branches/gcc-4_9-branch) -@@ -433,6 +433,8 @@ - else if (!opt_for_fn (node->decl, optimize) - || !opt_for_fn (node->decl, flag_ipa_cp)) - reason = "non-optimized function"; -+ else if (node->tm_clone) -+ reason = "transactional memory clone"; - else if (lookup_attribute ("omp declare simd", DECL_ATTRIBUTES (node->decl))) - { - /* Ideally we should clone the SIMD clones themselves and create -@@ -1587,15 +1589,7 @@ - && DECL_FUNCTION_CODE (target) == BUILT_IN_UNREACHABLE) - || !possible_polymorphic_call_target_p - (ie, cgraph_get_node (target))) -- { -- if (dump_file) -- fprintf (dump_file, -- "Type inconsident devirtualization: %s/%i->%s\n", -- ie->caller->name (), ie->caller->order, -- IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (target))); -- target = builtin_decl_implicit (BUILT_IN_UNREACHABLE); -- cgraph_get_create_node (target); -- } -+ target = ipa_impossible_devirt_target (ie, target); - return target; - } - } -@@ -1629,7 +1623,7 @@ - if (targets.length () == 1) - target = targets[0]->decl; - else -- target = builtin_decl_implicit (BUILT_IN_UNREACHABLE); -+ target = ipa_impossible_devirt_target (ie, NULL_TREE); - } - else - { -@@ -1643,15 +1637,7 @@ - - if (target && !possible_polymorphic_call_target_p (ie, - cgraph_get_node (target))) -- { -- if (dump_file) -- fprintf (dump_file, -- "Type inconsident devirtualization: %s/%i->%s\n", -- ie->caller->name (), ie->caller->order, -- IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (target))); -- target = builtin_decl_implicit (BUILT_IN_UNREACHABLE); -- cgraph_get_create_node (target); -- } -+ target = ipa_impossible_devirt_target (ie, target); - - return target; - } -@@ -2482,7 +2468,8 @@ - struct ipcp_value_source *src) - { - struct ipa_node_params *caller_info = IPA_NODE_REF (cs->caller); -- struct ipa_node_params *dst_info = IPA_NODE_REF (cs->callee); -+ cgraph_node *real_dest = cgraph_function_node (cs->callee); -+ struct ipa_node_params *dst_info = IPA_NODE_REF (real_dest); - - if ((dst_info->ipcp_orig_node && !dst_info->is_all_contexts_clone) - || caller_info->node_dead) -Index: gcc/configure -=================================================================== ---- a/src/gcc/configure (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/configure (.../branches/gcc-4_9-branch) -@@ -24497,7 +24497,7 @@ - .align 4 - smac %g2, %g3, %g1 - umac %g2, %g3, %g1 -- cas [%g2], %g3, %g1' > conftest.s -+ casa [%g2] 0xb, %g3, %g1' > conftest.s - if { ac_try='$gcc_cv_as $gcc_cv_as_flags -Aleon -o conftest.o conftest.s >&5' - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 - (eval $ac_try) 2>&5 -@@ -27056,6 +27056,34 @@ - - fi - -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking linker mapfile support for clearing hardware capabilities" >&5 -+$as_echo_n "checking linker mapfile support for clearing hardware capabilities... " >&6; } -+saved_LDFLAGS="$LDFLAGS" -+for clearcap_map in sol2-clearcapv2.map sol2-clearcap.map; do -+ LDFLAGS="$saved_LDFLAGS -Wl,-M,${srcdir}/config/$clearcap_map" -+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -+/* end confdefs.h. */ -+int main(void) {return 0;} -+_ACEOF -+if ac_fn_c_try_link "$LINENO"; then : -+ gcc_cv_ld_clearcap=yes; break -+else -+ gcc_cv_ld_clearcap=no -+fi -+rm -f core conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext -+done -+LDFLAGS="$saved_LDFLAGS" -+if test "x$gcc_cv_ld_clearcap" = xyes; then -+ -+$as_echo "#define HAVE_LD_CLEARCAP 1" >>confdefs.h -+ -+ ac_config_links="$ac_config_links clearcap.map:${srcdir}/config/$clearcap_map" -+ -+fi -+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_ld_clearcap" >&5 -+$as_echo "$gcc_cv_ld_clearcap" >&6; } -+ - case "$target:$tm_file" in - powerpc64-*-freebsd* | powerpc64*-*-linux* | powerpc*-*-linux*rs6000/biarch64.h*) - case "$target" in -@@ -28585,6 +28613,7 @@ - # Files that config.status was made for. - config_files="$ac_config_files" - config_headers="$ac_config_headers" -+config_links="$ac_config_links" - config_commands="$ac_config_commands" - - _ACEOF -@@ -28614,6 +28643,9 @@ - Configuration headers: - $config_headers - -+Configuration links: -+$config_links -+ - Configuration commands: - $config_commands - -@@ -28749,6 +28781,7 @@ - "as") CONFIG_FILES="$CONFIG_FILES as:exec-tool.in" ;; - "collect-ld") CONFIG_FILES="$CONFIG_FILES collect-ld:exec-tool.in" ;; - "nm") CONFIG_FILES="$CONFIG_FILES nm:exec-tool.in" ;; -+ "clearcap.map") CONFIG_LINKS="$CONFIG_LINKS clearcap.map:${srcdir}/config/$clearcap_map" ;; - "$all_outputs") CONFIG_FILES="$CONFIG_FILES $all_outputs" ;; - "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;; - -@@ -28764,6 +28797,7 @@ - if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers -+ test "${CONFIG_LINKS+set}" = set || CONFIG_LINKS=$config_links - test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands - fi - -@@ -29085,7 +29119,7 @@ - fi # test -n "$CONFIG_HEADERS" - - --eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" -+eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :L $CONFIG_LINKS :C $CONFIG_COMMANDS" - shift - for ac_tag - do -@@ -29321,7 +29355,38 @@ - || as_fn_error "could not create -" "$LINENO" 5 - fi - ;; -+ :L) -+ # -+ # CONFIG_LINK -+ # - -+ if test "$ac_source" = "$ac_file" && test "$srcdir" = '.'; then -+ : -+ else -+ # Prefer the file from the source tree if names are identical. -+ if test "$ac_source" = "$ac_file" || test ! -r "$ac_source"; then -+ ac_source=$srcdir/$ac_source -+ fi -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: linking $ac_source to $ac_file" >&5 -+$as_echo "$as_me: linking $ac_source to $ac_file" >&6;} -+ -+ if test ! -r "$ac_source"; then -+ as_fn_error "$ac_source: file not found" "$LINENO" 5 -+ fi -+ rm -f "$ac_file" -+ -+ # Try a relative symlink, then a hard link, then a copy. -+ case $srcdir in -+ [\\/$]* | ?:[\\/]* ) ac_rel_source=$ac_source ;; -+ *) ac_rel_source=$ac_top_build_prefix$ac_source ;; -+ esac -+ ln -s "$ac_rel_source" "$ac_file" 2>/dev/null || -+ ln "$ac_source" "$ac_file" 2>/dev/null || -+ cp -p "$ac_source" "$ac_file" || -+ as_fn_error "cannot link or copy $ac_source to $ac_file" "$LINENO" 5 -+ fi -+ ;; - :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 - $as_echo "$as_me: executing $ac_file commands" >&6;} - ;; -Index: gcc/lra-eliminations.c -=================================================================== ---- a/src/gcc/lra-eliminations.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/lra-eliminations.c (.../branches/gcc-4_9-branch) -@@ -565,6 +565,16 @@ - alter_subreg (&x, false); - return x; - } -+ else if (! subst_p) -+ { -+ /* LRA can transform subregs itself. So don't call -+ simplify_gen_subreg until LRA transformations are -+ finished. Function simplify_gen_subreg can do -+ non-trivial transformations (like truncation) which -+ might make LRA work to fail. */ -+ SUBREG_REG (x) = new_rtx; -+ return x; -+ } - else - return simplify_gen_subreg (GET_MODE (x), new_rtx, - GET_MODE (new_rtx), SUBREG_BYTE (x)); -Index: gcc/fold-const.c -=================================================================== ---- a/src/gcc/fold-const.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fold-const.c (.../branches/gcc-4_9-branch) -@@ -484,8 +484,6 @@ - - case TRUNC_DIV_EXPR: - case ROUND_DIV_EXPR: -- case FLOOR_DIV_EXPR: -- case CEIL_DIV_EXPR: - case EXACT_DIV_EXPR: - /* In general we can't negate A / B, because if A is INT_MIN and - B is 1, we may turn this into INT_MIN / -1 which is undefined -@@ -682,8 +680,6 @@ - - case TRUNC_DIV_EXPR: - case ROUND_DIV_EXPR: -- case FLOOR_DIV_EXPR: -- case CEIL_DIV_EXPR: - case EXACT_DIV_EXPR: - /* In general we can't negate A / B, because if A is INT_MIN and - B is 1, we may turn this into INT_MIN / -1 which is undefined -@@ -9312,7 +9308,7 @@ - /* Transform comparisons of the form X +- C1 CMP Y +- C2 to - X CMP Y +- C2 +- C1 for signed X, Y. This is valid if - the resulting offset is smaller in absolute value than the -- original one. */ -+ original one and has the same sign. */ - if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0)) - && (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR) - && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST -@@ -9331,19 +9327,20 @@ - "a comparison"); - - /* Put the constant on the side where it doesn't overflow and is -- of lower absolute value than before. */ -+ of lower absolute value and of same sign than before. */ - cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1) - ? MINUS_EXPR : PLUS_EXPR, - const2, const1); - if (!TREE_OVERFLOW (cst) -- && tree_int_cst_compare (const2, cst) == tree_int_cst_sgn (const2)) -+ && tree_int_cst_compare (const2, cst) == tree_int_cst_sgn (const2) -+ && tree_int_cst_sgn (cst) == tree_int_cst_sgn (const2)) - { - fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON); - return fold_build2_loc (loc, code, type, -- variable1, -- fold_build2_loc (loc, -- TREE_CODE (arg1), TREE_TYPE (arg1), -- variable2, cst)); -+ variable1, -+ fold_build2_loc (loc, TREE_CODE (arg1), -+ TREE_TYPE (arg1), -+ variable2, cst)); - } - - cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1) -@@ -9350,13 +9347,15 @@ - ? MINUS_EXPR : PLUS_EXPR, - const1, const2); - if (!TREE_OVERFLOW (cst) -- && tree_int_cst_compare (const1, cst) == tree_int_cst_sgn (const1)) -+ && tree_int_cst_compare (const1, cst) == tree_int_cst_sgn (const1) -+ && tree_int_cst_sgn (cst) == tree_int_cst_sgn (const1)) - { - fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON); - return fold_build2_loc (loc, code, type, -- fold_build2_loc (loc, TREE_CODE (arg0), TREE_TYPE (arg0), -- variable1, cst), -- variable2); -+ fold_build2_loc (loc, TREE_CODE (arg0), -+ TREE_TYPE (arg0), -+ variable1, cst), -+ variable2); - } - } - -@@ -11430,7 +11429,6 @@ - { - double_int c1, c2, c3, msk; - int width = TYPE_PRECISION (type), w; -- bool try_simplify = true; - - c1 = tree_to_double_int (TREE_OPERAND (arg0, 1)); - c2 = tree_to_double_int (arg1); -@@ -11467,20 +11465,7 @@ - } - } - -- /* If X is a tree of the form (Y * K1) & K2, this might conflict -- with that optimization from the BIT_AND_EXPR optimizations. -- This could end up in an infinite recursion. */ -- if (TREE_CODE (TREE_OPERAND (arg0, 0)) == MULT_EXPR -- && TREE_CODE (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1)) -- == INTEGER_CST) -- { -- tree t = TREE_OPERAND (TREE_OPERAND (arg0, 0), 1); -- double_int masked = mask_with_tz (type, c3, tree_to_double_int (t)); -- -- try_simplify = (masked != c1); -- } -- -- if (try_simplify && c3 != c1) -+ if (c3 != c1) - return fold_build2_loc (loc, BIT_IOR_EXPR, type, - fold_build2_loc (loc, BIT_AND_EXPR, type, - TREE_OPERAND (arg0, 0), -@@ -11870,16 +11855,25 @@ - && TREE_CODE (arg0) == MULT_EXPR - && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST) - { -+ double_int darg1 = tree_to_double_int (arg1); - double_int masked -- = mask_with_tz (type, tree_to_double_int (arg1), -+ = mask_with_tz (type, darg1, - tree_to_double_int (TREE_OPERAND (arg0, 1))); - - if (masked.is_zero ()) - return omit_two_operands_loc (loc, type, build_zero_cst (type), - arg0, arg1); -- else if (masked != tree_to_double_int (arg1)) -- return fold_build2_loc (loc, code, type, op0, -- double_int_to_tree (type, masked)); -+ else if (masked != darg1) -+ { -+ /* Avoid the transform if arg1 is a mask of some -+ mode which allows further optimizations. */ -+ int pop = darg1.popcount (); -+ if (!(pop >= BITS_PER_UNIT -+ && exact_log2 (pop) != -1 -+ && double_int::mask (pop) == darg1)) -+ return fold_build2_loc (loc, code, type, op0, -+ double_int_to_tree (type, masked)); -+ } - } - - /* For constants M and N, if M == (1LL << cst) - 1 && (N & M) == M, -@@ -12092,11 +12086,17 @@ - /* See if we can shorten the right shift. */ - if (shiftc < prec) - shift_type = inner_type; -+ /* Otherwise X >> C1 is all zeros, so we'll optimize -+ it into (X, 0) later on by making sure zerobits -+ is all ones. */ - } - } - zerobits = ~(unsigned HOST_WIDE_INT) 0; -- zerobits >>= HOST_BITS_PER_WIDE_INT - shiftc; -- zerobits <<= prec - shiftc; -+ if (shiftc < prec) -+ { -+ zerobits >>= HOST_BITS_PER_WIDE_INT - shiftc; -+ zerobits <<= prec - shiftc; -+ } - /* For arithmetic shift if sign bit could be set, zerobits - can contain actually sign bits, so no transformation is - possible, unless MASK masks them all away. In that -@@ -12114,7 +12114,7 @@ - /* ((X << 16) & 0xff00) is (X, 0). */ - if ((mask & zerobits) == mask) - return omit_one_operand_loc (loc, type, -- build_int_cst (type, 0), arg0); -+ build_int_cst (type, 0), arg0); - - newmask = mask | zerobits; - if (newmask != mask && (newmask & (newmask + 1)) == 0) -Index: gcc/omp-low.c -=================================================================== ---- a/src/gcc/omp-low.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/omp-low.c (.../branches/gcc-4_9-branch) -@@ -1509,11 +1509,19 @@ - break; - - case OMP_CLAUSE_SHARED: -+ decl = OMP_CLAUSE_DECL (c); - /* Ignore shared directives in teams construct. */ - if (gimple_code (ctx->stmt) == GIMPLE_OMP_TEAMS) -- break; -+ { -+ /* Global variables don't need to be copied, -+ the receiver side will use them directly. */ -+ tree odecl = maybe_lookup_decl_in_outer_ctx (decl, ctx); -+ if (is_global_var (odecl)) -+ break; -+ insert_decl_map (&ctx->cb, decl, odecl); -+ break; -+ } - gcc_assert (is_taskreg_ctx (ctx)); -- decl = OMP_CLAUSE_DECL (c); - gcc_assert (!COMPLETE_TYPE_P (TREE_TYPE (decl)) - || !is_variable_sized (decl)); - /* Global variables don't need to be copied, -@@ -1670,6 +1678,11 @@ - } - else - { -+ if (ctx->outer) -+ { -+ scan_omp_op (&OMP_CLAUSE_DECL (c), ctx->outer); -+ decl = OMP_CLAUSE_DECL (c); -+ } - gcc_assert (!splay_tree_lookup (ctx->field_map, - (splay_tree_key) decl)); - tree field -@@ -1730,6 +1743,9 @@ - if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION - && OMP_CLAUSE_REDUCTION_PLACEHOLDER (c)) - scan_array_reductions = true; -+ else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR -+ && OMP_CLAUSE_LINEAR_GIMPLE_SEQ (c)) -+ scan_array_reductions = true; - break; - - case OMP_CLAUSE_SHARED: -@@ -1816,6 +1832,9 @@ - else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE - && OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c)) - scan_omp (&OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c), ctx); -+ else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR -+ && OMP_CLAUSE_LINEAR_GIMPLE_SEQ (c)) -+ scan_omp (&OMP_CLAUSE_LINEAR_GIMPLE_SEQ (c), ctx); - } - - /* Create a new name for omp child function. Returns an identifier. */ -@@ -1997,6 +2016,7 @@ - tree temp = create_tmp_var (type, NULL); - tree c = build_omp_clause (UNKNOWN_LOCATION, - OMP_CLAUSE__LOOPTEMP_); -+ insert_decl_map (&outer_ctx->cb, temp, temp); - OMP_CLAUSE_DECL (c) = temp; - OMP_CLAUSE_CHAIN (c) = gimple_omp_parallel_clauses (stmt); - gimple_omp_parallel_set_clauses (stmt, c); -@@ -2494,6 +2514,23 @@ - return false; - } - break; -+ case GIMPLE_OMP_TARGET: -+ for (; ctx != NULL; ctx = ctx->outer) -+ if (gimple_code (ctx->stmt) == GIMPLE_OMP_TARGET -+ && gimple_omp_target_kind (ctx->stmt) == GF_OMP_TARGET_KIND_REGION) -+ { -+ const char *name; -+ switch (gimple_omp_target_kind (stmt)) -+ { -+ case GF_OMP_TARGET_KIND_REGION: name = "target"; break; -+ case GF_OMP_TARGET_KIND_DATA: name = "target data"; break; -+ case GF_OMP_TARGET_KIND_UPDATE: name = "target update"; break; -+ default: gcc_unreachable (); -+ } -+ warning_at (gimple_location (stmt), 0, -+ "%s construct inside of target region", name); -+ } -+ break; - default: - break; - } -@@ -2961,8 +2998,10 @@ - { - tree c = find_omp_clause (gimple_omp_for_clauses (ctx->stmt), - OMP_CLAUSE_SAFELEN); -- if (c -- && compare_tree_int (OMP_CLAUSE_SAFELEN_EXPR (c), max_vf) == -1) -+ if (c && TREE_CODE (OMP_CLAUSE_SAFELEN_EXPR (c)) != INTEGER_CST) -+ max_vf = 1; -+ else if (c && compare_tree_int (OMP_CLAUSE_SAFELEN_EXPR (c), -+ max_vf) == -1) - max_vf = tree_to_shwi (OMP_CLAUSE_SAFELEN_EXPR (c)); - } - if (max_vf > 1) -@@ -2994,6 +3033,27 @@ - return true; - } - -+/* Helper function of lower_rec_input_clauses. For a reference -+ in simd reduction, add an underlying variable it will reference. */ -+ -+static void -+handle_simd_reference (location_t loc, tree new_vard, gimple_seq *ilist) -+{ -+ tree z = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (new_vard))); -+ if (TREE_CONSTANT (z)) -+ { -+ const char *name = NULL; -+ if (DECL_NAME (new_vard)) -+ name = IDENTIFIER_POINTER (DECL_NAME (new_vard)); -+ -+ z = create_tmp_var_raw (TREE_TYPE (TREE_TYPE (new_vard)), name); -+ gimple_add_tmp_var (z); -+ TREE_ADDRESSABLE (z) = 1; -+ z = build_fold_addr_expr_loc (loc, z); -+ gimplify_assign (new_vard, z, ilist); -+ } -+} -+ - /* Generate code to implement the input clauses, FIRSTPRIVATE and COPYIN, - from the receiver (aka child) side and initializers for REFERENCE_TYPE - private variables. Initialization statements go in ILIST, while calls -@@ -3025,11 +3085,14 @@ - for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c)) - switch (OMP_CLAUSE_CODE (c)) - { -+ case OMP_CLAUSE_LINEAR: -+ if (OMP_CLAUSE_LINEAR_ARRAY (c)) -+ max_vf = 1; -+ /* FALLTHRU */ - case OMP_CLAUSE_REDUCTION: - case OMP_CLAUSE_PRIVATE: - case OMP_CLAUSE_FIRSTPRIVATE: - case OMP_CLAUSE_LASTPRIVATE: -- case OMP_CLAUSE_LINEAR: - if (is_variable_sized (OMP_CLAUSE_DECL (c))) - max_vf = 1; - break; -@@ -3085,6 +3148,13 @@ - if (pass != 0) - continue; - } -+ /* Even without corresponding firstprivate, if -+ decl is Fortran allocatable, it needs outer var -+ reference. */ -+ else if (pass == 0 -+ && lang_hooks.decls.omp_private_outer_ref -+ (OMP_CLAUSE_DECL (c))) -+ lastprivate_firstprivate = true; - break; - case OMP_CLAUSE_ALIGNED: - if (pass == 0) -@@ -3185,13 +3255,11 @@ - } - else if (TREE_CONSTANT (x)) - { -- /* For reduction with placeholder in SIMD loop, -- defer adding the initialization of the reference, -- because if we decide to use SIMD array for it, -- the initilization could cause expansion ICE. */ -- if (c_kind == OMP_CLAUSE_REDUCTION -- && OMP_CLAUSE_REDUCTION_PLACEHOLDER (c) -- && is_simd) -+ /* For reduction in SIMD loop, defer adding the -+ initialization of the reference, because if we decide -+ to use SIMD array for it, the initilization could cause -+ expansion ICE. */ -+ if (c_kind == OMP_CLAUSE_REDUCTION && is_simd) - x = NULL_TREE; - else - { -@@ -3350,34 +3418,37 @@ - if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR - && gimple_omp_for_combined_into_p (ctx->stmt)) - { -- tree stept = POINTER_TYPE_P (TREE_TYPE (x)) -- ? sizetype : TREE_TYPE (x); -- tree t = fold_convert (stept, -- OMP_CLAUSE_LINEAR_STEP (c)); -- tree c = find_omp_clause (clauses, -- OMP_CLAUSE__LOOPTEMP_); -- gcc_assert (c); -- tree l = OMP_CLAUSE_DECL (c); -- if (fd->collapse == 1) -+ tree t = OMP_CLAUSE_LINEAR_STEP (c); -+ tree stept = TREE_TYPE (t); -+ tree ct = find_omp_clause (clauses, -+ OMP_CLAUSE__LOOPTEMP_); -+ gcc_assert (ct); -+ tree l = OMP_CLAUSE_DECL (ct); -+ tree n1 = fd->loop.n1; -+ tree step = fd->loop.step; -+ tree itype = TREE_TYPE (l); -+ if (POINTER_TYPE_P (itype)) -+ itype = signed_type_for (itype); -+ l = fold_build2 (MINUS_EXPR, itype, l, n1); -+ if (TYPE_UNSIGNED (itype) -+ && fd->loop.cond_code == GT_EXPR) -+ l = fold_build2 (TRUNC_DIV_EXPR, itype, -+ fold_build1 (NEGATE_EXPR, itype, l), -+ fold_build1 (NEGATE_EXPR, -+ itype, step)); -+ else -+ l = fold_build2 (TRUNC_DIV_EXPR, itype, l, step); -+ t = fold_build2 (MULT_EXPR, stept, -+ fold_convert (stept, l), t); -+ -+ if (OMP_CLAUSE_LINEAR_ARRAY (c)) - { -- tree n1 = fd->loop.n1; -- tree step = fd->loop.step; -- tree itype = TREE_TYPE (l); -- if (POINTER_TYPE_P (itype)) -- itype = signed_type_for (itype); -- l = fold_build2 (MINUS_EXPR, itype, l, n1); -- if (TYPE_UNSIGNED (itype) -- && fd->loop.cond_code == GT_EXPR) -- l = fold_build2 (TRUNC_DIV_EXPR, itype, -- fold_build1 (NEGATE_EXPR, -- itype, l), -- fold_build1 (NEGATE_EXPR, -- itype, step)); -- else -- l = fold_build2 (TRUNC_DIV_EXPR, itype, l, step); -+ x = lang_hooks.decls.omp_clause_linear_ctor -+ (c, new_var, x, t); -+ gimplify_and_add (x, ilist); -+ goto do_dtor; - } -- t = fold_build2 (MULT_EXPR, stept, -- fold_convert (stept, l), t); -+ - if (POINTER_TYPE_P (TREE_TYPE (x))) - x = fold_build2 (POINTER_PLUS_EXPR, - TREE_TYPE (x), x, t); -@@ -3401,10 +3472,7 @@ - = gimple_build_assign (unshare_expr (lvar), iv); - gsi_insert_before_without_update (&gsi, g, - GSI_SAME_STMT); -- tree stept = POINTER_TYPE_P (TREE_TYPE (x)) -- ? sizetype : TREE_TYPE (x); -- tree t = fold_convert (stept, -- OMP_CLAUSE_LINEAR_STEP (c)); -+ tree t = OMP_CLAUSE_LINEAR_STEP (c); - enum tree_code code = PLUS_EXPR; - if (POINTER_TYPE_P (TREE_TYPE (new_var))) - code = POINTER_PLUS_EXPR; -@@ -3520,25 +3588,10 @@ - But if they aren't used, we need to emit the deferred - initialization now. */ - else if (is_reference (var) && is_simd) -- { -- tree z -- = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (new_vard))); -- if (TREE_CONSTANT (z)) -- { -- const char *name = NULL; -- if (DECL_NAME (var)) -- name = IDENTIFIER_POINTER (DECL_NAME (new_vard)); -- -- z = create_tmp_var_raw -- (TREE_TYPE (TREE_TYPE (new_vard)), name); -- gimple_add_tmp_var (z); -- TREE_ADDRESSABLE (z) = 1; -- z = build_fold_addr_expr_loc (clause_loc, z); -- gimplify_assign (new_vard, z, ilist); -- } -- } -+ handle_simd_reference (clause_loc, new_vard, ilist); - x = lang_hooks.decls.omp_clause_default_ctor -- (c, new_var, unshare_expr (x)); -+ (c, unshare_expr (new_var), -+ build_outer_var_ref (var, ctx)); - if (x) - gimplify_and_add (x, ilist); - if (OMP_CLAUSE_REDUCTION_GIMPLE_INIT (c)) -@@ -3569,6 +3622,13 @@ - if (code == MINUS_EXPR) - code = PLUS_EXPR; - -+ tree new_vard = new_var; -+ if (is_simd && is_reference (var)) -+ { -+ gcc_assert (TREE_CODE (new_var) == MEM_REF); -+ new_vard = TREE_OPERAND (new_var, 0); -+ gcc_assert (DECL_P (new_vard)); -+ } - if (is_simd - && lower_rec_simd_input_clauses (new_var, ctx, max_vf, - idx, lane, ivar, lvar)) -@@ -3580,9 +3640,18 @@ - x = build2 (code, TREE_TYPE (ref), ref, ivar); - ref = build_outer_var_ref (var, ctx); - gimplify_assign (ref, x, &llist[1]); -+ -+ if (new_vard != new_var) -+ { -+ SET_DECL_VALUE_EXPR (new_vard, -+ build_fold_addr_expr (lvar)); -+ DECL_HAS_VALUE_EXPR_P (new_vard) = 1; -+ } - } - else - { -+ if (is_reference (var) && is_simd) -+ handle_simd_reference (clause_loc, new_vard, ilist); - gimplify_assign (new_var, x, ilist); - if (is_simd) - { -@@ -3683,8 +3752,9 @@ - tree c = find_omp_clause (gimple_omp_for_clauses (ctx->stmt), - OMP_CLAUSE_SAFELEN); - if (c == NULL_TREE -- || compare_tree_int (OMP_CLAUSE_SAFELEN_EXPR (c), -- max_vf) == 1) -+ || (TREE_CODE (OMP_CLAUSE_SAFELEN_EXPR (c)) == INTEGER_CST -+ && compare_tree_int (OMP_CLAUSE_SAFELEN_EXPR (c), -+ max_vf) == 1)) - { - c = build_omp_clause (UNKNOWN_LOCATION, OMP_CLAUSE_SAFELEN); - OMP_CLAUSE_SAFELEN_EXPR (c) = build_int_cst (integer_type_node, -@@ -3803,6 +3873,14 @@ - OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c)); - OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c) = NULL; - } -+ else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR -+ && OMP_CLAUSE_LINEAR_GIMPLE_SEQ (c)) -+ { -+ lower_omp (&OMP_CLAUSE_LINEAR_GIMPLE_SEQ (c), ctx); -+ gimple_seq_add_seq (stmt_list, -+ OMP_CLAUSE_LINEAR_GIMPLE_SEQ (c)); -+ OMP_CLAUSE_LINEAR_GIMPLE_SEQ (c) = NULL; -+ } - - x = build_outer_var_ref (var, ctx); - if (is_reference (var)) -@@ -5570,6 +5648,12 @@ - { - stmt = gimple_build_assign (endvar, iend); - gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); -+ if (useless_type_conversion_p (TREE_TYPE (fd->loop.v), TREE_TYPE (iend))) -+ stmt = gimple_build_assign (fd->loop.v, iend); -+ else -+ stmt = gimple_build_assign_with_ops (NOP_EXPR, fd->loop.v, iend, -+ NULL_TREE); -+ gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); - } - if (fd->collapse > 1) - expand_omp_for_init_vars (fd, &gsi, counts, inner_stmt, startvar); -@@ -5986,6 +6070,12 @@ - { - stmt = gimple_build_assign (endvar, e); - gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); -+ if (useless_type_conversion_p (TREE_TYPE (fd->loop.v), TREE_TYPE (e))) -+ stmt = gimple_build_assign (fd->loop.v, e); -+ else -+ stmt = gimple_build_assign_with_ops (NOP_EXPR, fd->loop.v, e, -+ NULL_TREE); -+ gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); - } - if (fd->collapse > 1) - expand_omp_for_init_vars (fd, &gsi, counts, inner_stmt, startvar); -@@ -6371,6 +6461,12 @@ - { - stmt = gimple_build_assign (endvar, e); - gsi_insert_after (&si, stmt, GSI_CONTINUE_LINKING); -+ if (useless_type_conversion_p (TREE_TYPE (fd->loop.v), TREE_TYPE (e))) -+ stmt = gimple_build_assign (fd->loop.v, e); -+ else -+ stmt = gimple_build_assign_with_ops (NOP_EXPR, fd->loop.v, e, -+ NULL_TREE); -+ gsi_insert_after (&si, stmt, GSI_CONTINUE_LINKING); - } - if (fd->collapse > 1) - expand_omp_for_init_vars (fd, &si, counts, inner_stmt, startvar); -@@ -6822,8 +6918,10 @@ - else - { - safelen = OMP_CLAUSE_SAFELEN_EXPR (safelen); -- if (!tree_fits_uhwi_p (safelen) -- || tree_to_uhwi (safelen) > INT_MAX) -+ if (TREE_CODE (safelen) != INTEGER_CST) -+ loop->safelen = 0; -+ else if (!tree_fits_uhwi_p (safelen) -+ || tree_to_uhwi (safelen) > INT_MAX) - loop->safelen = INT_MAX; - else - loop->safelen = tree_to_uhwi (safelen); -@@ -8389,10 +8487,14 @@ - && gimple_code (ctx->outer->stmt) == GIMPLE_OMP_PARALLEL - && ctx->outer->cancellable) - { -- tree lhs = create_tmp_var (boolean_type_node, NULL); -+ tree fndecl = builtin_decl_explicit (BUILT_IN_GOMP_CANCEL); -+ tree c_bool_type = TREE_TYPE (TREE_TYPE (fndecl)); -+ tree lhs = create_tmp_var (c_bool_type, NULL); - gimple_omp_return_set_lhs (omp_return, lhs); - tree fallthru_label = create_artificial_label (UNKNOWN_LOCATION); -- gimple g = gimple_build_cond (NE_EXPR, lhs, boolean_false_node, -+ gimple g = gimple_build_cond (NE_EXPR, lhs, -+ fold_convert (c_bool_type, -+ boolean_false_node), - ctx->outer->cancel_label, fallthru_label); - gimple_seq_add_stmt (body, g); - gimple_seq_add_stmt (body, gimple_build_label (fallthru_label)); -@@ -8989,7 +9091,10 @@ - OMP_CLAUSE__LOOPTEMP_); - } - else -- temp = create_tmp_var (type, NULL); -+ { -+ temp = create_tmp_var (type, NULL); -+ insert_decl_map (&ctx->outer->cb, temp, temp); -+ } - *pc = build_omp_clause (UNKNOWN_LOCATION, OMP_CLAUSE__LOOPTEMP_); - OMP_CLAUSE_DECL (*pc) = temp; - pc = &OMP_CLAUSE_CHAIN (*pc); -@@ -10098,8 +10203,6 @@ - } - break; - } -- tree lhs; -- lhs = create_tmp_var (boolean_type_node, NULL); - if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_GOMP_BARRIER) - { - fndecl = builtin_decl_explicit (BUILT_IN_GOMP_BARRIER_CANCEL); -@@ -10106,6 +10209,8 @@ - gimple_call_set_fndecl (stmt, fndecl); - gimple_call_set_fntype (stmt, TREE_TYPE (fndecl)); - } -+ tree lhs; -+ lhs = create_tmp_var (TREE_TYPE (TREE_TYPE (fndecl)), NULL); - gimple_call_set_lhs (stmt, lhs); - tree fallthru_label; - fallthru_label = create_artificial_label (UNKNOWN_LOCATION); -@@ -10112,7 +10217,9 @@ - gimple g; - g = gimple_build_label (fallthru_label); - gsi_insert_after (gsi_p, g, GSI_SAME_STMT); -- g = gimple_build_cond (NE_EXPR, lhs, boolean_false_node, -+ g = gimple_build_cond (NE_EXPR, lhs, -+ fold_convert (TREE_TYPE (lhs), -+ boolean_false_node), - cctx->cancel_label, fallthru_label); - gsi_insert_after (gsi_p, g, GSI_SAME_STMT); - break; -@@ -11291,45 +11398,53 @@ - ipa_simd_modify_stmt_ops (tree *tp, int *walk_subtrees, void *data) - { - struct walk_stmt_info *wi = (struct walk_stmt_info *) data; -- if (!SSA_VAR_P (*tp)) -+ struct modify_stmt_info *info = (struct modify_stmt_info *) wi->info; -+ tree *orig_tp = tp; -+ if (TREE_CODE (*tp) == ADDR_EXPR) -+ tp = &TREE_OPERAND (*tp, 0); -+ struct ipa_parm_adjustment *cand = NULL; -+ if (TREE_CODE (*tp) == PARM_DECL) -+ cand = ipa_get_adjustment_candidate (&tp, NULL, info->adjustments, true); -+ else - { -- /* Make sure we treat subtrees as a RHS. This makes sure that -- when examining the `*foo' in *foo=x, the `foo' get treated as -- a use properly. */ -- wi->is_lhs = false; -- wi->val_only = true; - if (TYPE_P (*tp)) - *walk_subtrees = 0; -- return NULL_TREE; - } -- struct modify_stmt_info *info = (struct modify_stmt_info *) wi->info; -- struct ipa_parm_adjustment *cand -- = ipa_get_adjustment_candidate (&tp, NULL, info->adjustments, true); -- if (!cand) -- return NULL_TREE; - -- tree t = *tp; -- tree repl = make_ssa_name (TREE_TYPE (t), NULL); -- -- gimple stmt; -- gimple_stmt_iterator gsi = gsi_for_stmt (info->stmt); -- if (wi->is_lhs) -+ tree repl = NULL_TREE; -+ if (cand) -+ repl = unshare_expr (cand->new_decl); -+ else - { -- stmt = gimple_build_assign (unshare_expr (cand->new_decl), repl); -- gsi_insert_after (&gsi, stmt, GSI_SAME_STMT); -- SSA_NAME_DEF_STMT (repl) = info->stmt; -+ if (tp != orig_tp) -+ { -+ *walk_subtrees = 0; -+ bool modified = info->modified; -+ info->modified = false; -+ walk_tree (tp, ipa_simd_modify_stmt_ops, wi, wi->pset); -+ if (!info->modified) -+ { -+ info->modified = modified; -+ return NULL_TREE; -+ } -+ info->modified = modified; -+ repl = *tp; -+ } -+ else -+ return NULL_TREE; - } -- else -+ -+ if (tp != orig_tp) - { -- /* You'd think we could skip the extra SSA variable when -- wi->val_only=true, but we may have `*var' which will get -- replaced into `*var_array[iter]' and will likely be something -- not gimple. */ -- stmt = gimple_build_assign (repl, unshare_expr (cand->new_decl)); -+ repl = build_fold_addr_expr (repl); -+ gimple stmt -+ = gimple_build_assign (make_ssa_name (TREE_TYPE (repl), NULL), repl); -+ repl = gimple_assign_lhs (stmt); -+ gimple_stmt_iterator gsi = gsi_for_stmt (info->stmt); - gsi_insert_before (&gsi, stmt, GSI_SAME_STMT); -+ *orig_tp = repl; - } -- -- if (!useless_type_conversion_p (TREE_TYPE (*tp), TREE_TYPE (repl))) -+ else if (!useless_type_conversion_p (TREE_TYPE (*tp), TREE_TYPE (repl))) - { - tree vce = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (*tp), repl); - *tp = vce; -@@ -11338,8 +11453,6 @@ - *tp = repl; - - info->modified = true; -- wi->is_lhs = false; -- wi->val_only = true; - return NULL_TREE; - } - -@@ -11358,7 +11471,7 @@ - tree retval_array, tree iter) - { - basic_block bb; -- unsigned int i, j; -+ unsigned int i, j, l; - - /* Re-use the adjustments array, but this time use it to replace - every function argument use to an offset into the corresponding -@@ -11381,6 +11494,46 @@ - j += node->simdclone->simdlen / TYPE_VECTOR_SUBPARTS (vectype) - 1; - } - -+ l = adjustments.length (); -+ for (i = 1; i < num_ssa_names; i++) -+ { -+ tree name = ssa_name (i); -+ if (name -+ && SSA_NAME_VAR (name) -+ && TREE_CODE (SSA_NAME_VAR (name)) == PARM_DECL) -+ { -+ for (j = 0; j < l; j++) -+ if (SSA_NAME_VAR (name) == adjustments[j].base -+ && adjustments[j].new_decl) -+ { -+ tree base_var; -+ if (adjustments[j].new_ssa_base == NULL_TREE) -+ { -+ base_var -+ = copy_var_decl (adjustments[j].base, -+ DECL_NAME (adjustments[j].base), -+ TREE_TYPE (adjustments[j].base)); -+ adjustments[j].new_ssa_base = base_var; -+ } -+ else -+ base_var = adjustments[j].new_ssa_base; -+ if (SSA_NAME_IS_DEFAULT_DEF (name)) -+ { -+ bb = single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun)); -+ gimple_stmt_iterator gsi = gsi_after_labels (bb); -+ tree new_decl = unshare_expr (adjustments[j].new_decl); -+ set_ssa_default_def (cfun, adjustments[j].base, NULL_TREE); -+ SET_SSA_NAME_VAR_OR_IDENTIFIER (name, base_var); -+ SSA_NAME_IS_DEFAULT_DEF (name) = 0; -+ gimple stmt = gimple_build_assign (name, new_decl); -+ gsi_insert_before (&gsi, stmt, GSI_SAME_STMT); -+ } -+ else -+ SET_SSA_NAME_VAR_OR_IDENTIFIER (name, base_var); -+ } -+ } -+ } -+ - struct modify_stmt_info info; - info.adjustments = adjustments; - -Index: gcc/ipa-inline-transform.c -=================================================================== ---- a/src/gcc/ipa-inline-transform.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/ipa-inline-transform.c (.../branches/gcc-4_9-branch) -@@ -214,6 +214,7 @@ - it is NULL. If UPDATE_OVERALL_SUMMARY is false, do not bother to recompute overall - size of caller after inlining. Caller is required to eventually do it via - inline_update_overall_summary. -+ If callee_removed is non-NULL, set it to true if we removed callee node. - - Return true iff any new callgraph edges were discovered as a - result of inlining. */ -@@ -221,7 +222,8 @@ - bool - inline_call (struct cgraph_edge *e, bool update_original, - vec<cgraph_edge_p> *new_edges, -- int *overall_size, bool update_overall_summary) -+ int *overall_size, bool update_overall_summary, -+ bool *callee_removed) - { - int old_size = 0, new_size = 0; - struct cgraph_node *to = NULL; -@@ -260,6 +262,8 @@ - { - next_alias = cgraph_alias_target (alias); - cgraph_remove_node (alias); -+ if (callee_removed) -+ *callee_removed = true; - alias = next_alias; - } - else -Index: gcc/tree-ssa-sccvn.c -=================================================================== ---- a/src/gcc/tree-ssa-sccvn.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/tree-ssa-sccvn.c (.../branches/gcc-4_9-branch) -@@ -3074,33 +3074,12 @@ - /* If all value numbered to the same value, the phi node has that - value. */ - if (allsame) -- { -- if (is_gimple_min_invariant (sameval)) -- { -- VN_INFO (PHI_RESULT (phi))->has_constants = true; -- VN_INFO (PHI_RESULT (phi))->expr = sameval; -- } -- else -- { -- VN_INFO (PHI_RESULT (phi))->has_constants = false; -- VN_INFO (PHI_RESULT (phi))->expr = sameval; -- } -+ return set_ssa_val_to (PHI_RESULT (phi), sameval); - -- if (TREE_CODE (sameval) == SSA_NAME) -- return visit_copy (PHI_RESULT (phi), sameval); -- -- return set_ssa_val_to (PHI_RESULT (phi), sameval); -- } -- - /* Otherwise, see if it is equivalent to a phi node in this block. */ - result = vn_phi_lookup (phi); - if (result) -- { -- if (TREE_CODE (result) == SSA_NAME) -- changed = visit_copy (PHI_RESULT (phi), result); -- else -- changed = set_ssa_val_to (PHI_RESULT (phi), result); -- } -+ changed = set_ssa_val_to (PHI_RESULT (phi), result); - else - { - vn_phi_insert (phi, PHI_RESULT (phi)); -@@ -3214,24 +3193,18 @@ - catch those with constants. The goal here is to simultaneously - combine constants between expressions, but avoid infinite - expansion of expressions during simplification. */ -- if (TREE_CODE (op0) == SSA_NAME) -- { -- if (VN_INFO (op0)->has_constants -+ op0 = vn_valueize (op0); -+ if (TREE_CODE (op0) == SSA_NAME -+ && (VN_INFO (op0)->has_constants - || TREE_CODE_CLASS (code) == tcc_comparison -- || code == COMPLEX_EXPR) -- op0 = valueize_expr (vn_get_expr_for (op0)); -- else -- op0 = vn_valueize (op0); -- } -+ || code == COMPLEX_EXPR)) -+ op0 = valueize_expr (vn_get_expr_for (op0)); - -- if (TREE_CODE (op1) == SSA_NAME) -- { -- if (VN_INFO (op1)->has_constants -- || code == COMPLEX_EXPR) -- op1 = valueize_expr (vn_get_expr_for (op1)); -- else -- op1 = vn_valueize (op1); -- } -+ op1 = vn_valueize (op1); -+ if (TREE_CODE (op1) == SSA_NAME -+ && (VN_INFO (op1)->has_constants -+ || code == COMPLEX_EXPR)) -+ op1 = valueize_expr (vn_get_expr_for (op1)); - - /* Pointer plus constant can be represented as invariant address. - Do so to allow further propatation, see also tree forwprop. */ -@@ -3289,24 +3262,28 @@ - return NULL_TREE; - - orig_op0 = op0; -- if (VN_INFO (op0)->has_constants) -- op0 = valueize_expr (vn_get_expr_for (op0)); -- else if (CONVERT_EXPR_CODE_P (code) -- || code == REALPART_EXPR -- || code == IMAGPART_EXPR -- || code == VIEW_CONVERT_EXPR -- || code == BIT_FIELD_REF) -+ op0 = vn_valueize (op0); -+ if (TREE_CODE (op0) == SSA_NAME) - { -- /* We want to do tree-combining on conversion-like expressions. -- Make sure we feed only SSA_NAMEs or constants to fold though. */ -- tree tem = valueize_expr (vn_get_expr_for (op0)); -- if (UNARY_CLASS_P (tem) -- || BINARY_CLASS_P (tem) -- || TREE_CODE (tem) == VIEW_CONVERT_EXPR -- || TREE_CODE (tem) == SSA_NAME -- || TREE_CODE (tem) == CONSTRUCTOR -- || is_gimple_min_invariant (tem)) -- op0 = tem; -+ if (VN_INFO (op0)->has_constants) -+ op0 = valueize_expr (vn_get_expr_for (op0)); -+ else if (CONVERT_EXPR_CODE_P (code) -+ || code == REALPART_EXPR -+ || code == IMAGPART_EXPR -+ || code == VIEW_CONVERT_EXPR -+ || code == BIT_FIELD_REF) -+ { -+ /* We want to do tree-combining on conversion-like expressions. -+ Make sure we feed only SSA_NAMEs or constants to fold though. */ -+ tree tem = valueize_expr (vn_get_expr_for (op0)); -+ if (UNARY_CLASS_P (tem) -+ || BINARY_CLASS_P (tem) -+ || TREE_CODE (tem) == VIEW_CONVERT_EXPR -+ || TREE_CODE (tem) == SSA_NAME -+ || TREE_CODE (tem) == CONSTRUCTOR -+ || is_gimple_min_invariant (tem)) -+ op0 = tem; -+ } - } - - /* Avoid folding if nothing changed, but remember the expression. */ -Index: gcc/cgraphunit.c -=================================================================== ---- a/src/gcc/cgraphunit.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/cgraphunit.c (.../branches/gcc-4_9-branch) -@@ -1680,6 +1680,7 @@ - #ifdef ENABLE_CHECKING - verify_flow_info (); - #endif -+ free_dominance_info (CDI_DOMINATORS); - - /* Since we want to emit the thunk, we explicitly mark its name as - referenced. */ -Index: gcc/ChangeLog -=================================================================== ---- a/src/gcc/ChangeLog (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/ChangeLog (.../branches/gcc-4_9-branch) -@@ -1,3 +1,1643 @@ -+2014-07-10 Cary Coutant <ccoutant@google.com> -+ -+ Backport from trunk at r212211. -+ -+ * dwarf2out.c (remove_addr_table_entry): Remove unnecessary hash table -+ lookup. -+ (resolve_addr_in_expr): When replacing the rtx in a location list -+ entry, get a new address table entry. -+ (dwarf2out_finish): Call index_location_lists even if there are no -+ addr_index_table entries yet. -+ -+2014-07-10 Tom G. Christensen <tgc@jupiterrise.com> -+ -+ * doc/install.texi: Remove links to defunct package providers for -+ Solaris. -+ -+2014-07-10 Eric Botcazou <ebotcazou@adacore.com> -+ -+ PR middle-end/53590 -+ * function.c (allocate_struct_function): Revert r188667 change. -+ -+ * gimple-low.c (lower_builtin_setjmp): Use properly-typed constant. -+ -+2014-07-09 Alan Lawrence <alan.lawrence@arm.com> -+ -+ Backport r211369 from trunk. -+ 2014-06-09 Alan Lawrence <alan.lawrence@arm.com> -+ -+ PR target/61062 -+ * config/arm/arm_neon.h (vtrn_s8, vtrn_s16, vtrn_u8, vtrn_u16, vtrn_p8, -+ vtrn_p16, vtrn_s32, vtrn_f32, vtrn_u32, vtrnq_s8, vtrnq_s16, vtrnq_s32, -+ vtrnq_f32, vtrnq_u8, vtrnq_u16, vtrnq_u32, vtrnq_p8, vtrnq_p16, vzip_s8, -+ vzip_s16, vzip_u8, vzip_u16, vzip_p8, vzip_p16, vzip_s32, vzip_f32, -+ vzip_u32, vzipq_s8, vzipq_s16, vzipq_s32, vzipq_f32, vzipq_u8, -+ vzipq_u16, vzipq_u32, vzipq_p8, vzipq_p16, vuzp_s8, vuzp_s16, vuzp_s32, -+ vuzp_f32, vuzp_u8, vuzp_u16, vuzp_u32, vuzp_p8, vuzp_p16, vuzpq_s8, -+ vuzpq_s16, vuzpq_s32, vuzpq_f32, vuzpq_u8, vuzpq_u16, vuzpq_u32, -+ vuzpq_p8, vuzpq_p16): Correct mask for bigendian. -+ -+ -+2014-07-09 Alan Lawrence <alan.lawrence@arm.com> -+ -+ Backport r210219 from trunk. -+ 2014-05-08 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com> -+ -+ * config/arm/arm_neon.h: Update comment. -+ * config/arm/neon-docgen.ml: Delete. -+ * config/arm/neon-gen.ml: Delete. -+ * doc/arm-neon-intrinsics.texi: Update comment. -+ -+2014-07-09 Zhenqiang Chen <zhenqiang.chen@linaro.org> -+ -+ Backport r211775 from trunk. -+ 2014-06-18 Terry Guo <terry.guo@arm.com> -+ -+ PR target/61544 -+ * config/arm/arm.c (thumb1_reorg): Move to next basic block if we -+ reach the head. -+ -+2014-07-08 Jakub Jelinek <jakub@redhat.com> -+ -+ PR rtl-optimization/61673 -+ * combine.c (simplify_comparison): Test just mode's sign bit -+ in tmode rather than the sign bit and any bits above it. -+ -+2014-07-08 James Greenhalgh <james.greenhalgh@arm.com> -+ -+ Backport r212298 from trunk. -+ 2014-07-04 James Greenhalgh <james.greenhalgh@arm.com> -+ -+ * config/aarch64/aarch64-simd.md (move_lo_quad_internal_<mode>): New. -+ (move_lo_quad_internal_be_<mode>): Likewise. -+ (move_lo_quad_<mode>): Convert to define_expand. -+ (aarch64_simd_move_hi_quad_<mode>): Gate on BYTES_BIG_ENDIAN. -+ (aarch64_simd_move_hi_quad_be_<mode>): New. -+ (move_hi_quad_<mode>): Use appropriate insn for BYTES_BIG_ENDIAN. -+ (aarch64_combinez<mode>): Gate on BYTES_BIG_ENDIAN. -+ (aarch64_combinez_be<mode>): New. -+ (aarch64_combine<mode>): Convert to define_expand. -+ (aarch64_combine_internal<mode>): New. -+ (aarch64_simd_combine<mode>): Remove bogus RTL description. -+ -+2014-07-08 Richard Biener <rguenther@suse.de> -+ -+ PR tree-optimization/61680 -+ * tree-vect-data-refs.c (vect_analyze_data_ref_dependence): -+ Handle properly all read-write dependences with group accesses. -+ -+ PR tree-optimization/61681 -+ * tree-ssa-structalias.c (find_what_var_points_to): Expand -+ NONLOCAL inside ESCAPED. -+ -+2014-07-08 Alan Lawrence <alan.lawrence@arm.com> -+ -+ Backport r211502 from mainline. -+ 2014-06-10 Alan Lawrence <alan.lawrence@arm.com> -+ -+ PR target/59843 -+ * config/aarch64/aarch64-modes.def: Add V1DFmode. -+ * config/aarch64/aarch64.c (aarch64_vector_mode_supported_p): -+ Support V1DFmode. -+ -+2014-07-08 Jakub Jelinek <jakub@redhat.com> -+ -+ PR tree-optimization/61725 -+ * tree-vrp.c (extract_range_basic): Don't assume vr0 is unsigned -+ range, use range_includes_zerop_p instead of integer_zerop on -+ vr0->min, only use log2 of max if min is not negative. -+ -+2014-07-06 Gerald Pfeifer <gerald@pfeifer.com> -+ -+ * doc/install.texi (Specific, aarch64*-*-*): Fix markup. Reword a bit. -+ -+2014-07-04 Jakub Jelinek <jakub@redhat.com> -+ -+ PR middle-end/61654 -+ * cgraphunit.c (expand_thunk): Call free_dominance_info. -+ -+ PR tree-optimization/61684 -+ * tree-ssa-ifcombine.c (recognize_single_bit_test): Make sure -+ rhs1 of conversion is a SSA_NAME before using SSA_NAME_DEF_STMT on it. -+ -+2014-06-30 Jakub Jelinek <jakub@redhat.com> -+ -+ Backported from mainline -+ 2014-06-27 Jakub Jelinek <jakub@redhat.com> -+ -+ PR tree-optimization/57233 -+ PR tree-optimization/61299 -+ * tree-vect-generic.c (get_compute_type, count_type_subparts): New -+ functions. -+ (expand_vector_operations_1): Use them. If {L,R}ROTATE_EXPR -+ would be lowered to scalar shifts, check if corresponding -+ shifts and vector BIT_IOR_EXPR are supported and don't lower -+ or lower just to narrower vector type in that case. -+ * expmed.c (expand_shift_1): Fix up handling of vector -+ shifts and rotates. -+ -+ 2014-06-25 Jakub Jelinek <jakub@redhat.com> -+ -+ * langhooks-def.h (LANG_HOOKS_OMP_CLAUSE_LINEAR_CTOR): Define. -+ (LANG_HOOKS_DECLS): Add it. -+ * gimplify.c (gimplify_omp_for): Make sure OMP_CLAUSE_LINEAR_STEP -+ has correct type. -+ * tree.h (OMP_CLAUSE_LINEAR_ARRAY): Define. -+ * langhooks.h (struct lang_hooks_for_decls): Add -+ omp_clause_linear_ctor hook. -+ * omp-low.c (lower_rec_input_clauses): Set max_vf even if -+ OMP_CLAUSE_LINEAR_ARRAY is set. Don't fold_convert -+ OMP_CLAUSE_LINEAR_STEP. For OMP_CLAUSE_LINEAR_ARRAY in -+ combined simd loop use omp_clause_linear_ctor hook. -+ -+ 2014-06-24 Jakub Jelinek <jakub@redhat.com> -+ -+ * gimplify.c (gimplify_scan_omp_clauses) <case OMP_CLAUSE_MAP, -+ OMP_CLAUSE_TO, OMP_CLAUSE_FROM): Make sure OMP_CLAUSE_SIZE is -+ non-NULL. -+ <case OMP_CLAUSE_ALIGNED>: Gimplify OMP_CLAUSE_ALIGNED_ALIGNMENT. -+ (gimplify_adjust_omp_clauses_1): Make sure OMP_CLAUSE_SIZE is -+ non-NULL. -+ (gimplify_adjust_omp_clauses): Likewise. -+ * omp-low.c (lower_rec_simd_input_clauses, -+ lower_rec_input_clauses, expand_omp_simd): Handle non-constant -+ safelen the same as safelen(1). -+ * tree-nested.c (convert_nonlocal_omp_clauses, -+ convert_local_omp_clauses): Handle OMP_CLAUSE_ALIGNED. For -+ OMP_CLAUSE_{MAP,TO,FROM} if not decl use walk_tree. -+ (convert_nonlocal_reference_stmt, convert_local_reference_stmt): -+ Fixup handling of GIMPLE_OMP_TARGET. -+ (convert_tramp_reference_stmt, convert_gimple_call): Handle -+ GIMPLE_OMP_TARGET. -+ -+ 2014-06-18 Jakub Jelinek <jakub@redhat.com> -+ -+ * gimplify.c (omp_notice_variable): If n is non-NULL -+ and no flags change in ORT_TARGET region, don't jump to -+ do_outer. -+ (struct gimplify_adjust_omp_clauses_data): New type. -+ (gimplify_adjust_omp_clauses_1): Adjust for data being -+ a struct gimplify_adjust_omp_clauses_data pointer instead -+ of tree *. Pass pre_p as a new argument to -+ lang_hooks.decls.omp_finish_clause hook. -+ (gimplify_adjust_omp_clauses): Add pre_p argument, adjust -+ splay_tree_foreach to pass both list_p and pre_p. -+ (gimplify_omp_parallel, gimplify_omp_task, gimplify_omp_for, -+ gimplify_omp_workshare, gimplify_omp_target_update): Adjust -+ gimplify_adjust_omp_clauses callers. -+ * langhooks.c (lhd_omp_finish_clause): New function. -+ * langhooks-def.h (lhd_omp_finish_clause): New prototype. -+ (LANG_HOOKS_OMP_FINISH_CLAUSE): Define to lhd_omp_finish_clause. -+ * langhooks.h (struct lang_hooks_for_decls): Add a new -+ gimple_seq * argument to omp_finish_clause hook. -+ * omp-low.c (scan_sharing_clauses): Call scan_omp_op on -+ non-DECL_P OMP_CLAUSE_DECL if ctx->outer. -+ (scan_omp_parallel, lower_omp_for): When adding -+ _LOOPTEMP_ clause var, add it to outer ctx's decl_map -+ as identity. -+ * tree-core.h (OMP_CLAUSE_MAP_TO_PSET): New map kind. -+ * tree-nested.c (convert_nonlocal_omp_clauses, -+ convert_local_omp_clauses): Handle various OpenMP 4.0 clauses. -+ * tree-pretty-print.c (dump_omp_clause): Handle -+ OMP_CLAUSE_MAP_TO_PSET. -+ -+ 2014-06-10 Jakub Jelinek <jakub@redhat.com> -+ -+ PR fortran/60928 -+ * omp-low.c (lower_rec_input_clauses) <case OMP_CLAUSE_LASTPRIVATE>: -+ Set lastprivate_firstprivate even if omp_private_outer_ref -+ langhook returns true. -+ <case OMP_CLAUSE_REDUCTION>: When calling omp_clause_default_ctor -+ langhook, call unshare_expr on new_var and call -+ build_outer_var_ref to get the last argument. -+ -+ 2014-05-11 Jakub Jelinek <jakub@redhat.com> -+ -+ * tree.h (OMP_CLAUSE_LINEAR_STMT): Define. -+ * tree.c (omp_clause_num_ops): Increase OMP_CLAUSE_LINEAR -+ number of operands to 3. -+ (walk_tree_1): Walk all operands of OMP_CLAUSE_LINEAR. -+ * tree-nested.c (convert_nonlocal_omp_clauses, -+ convert_local_omp_clauses): Handle OMP_CLAUSE_DEPEND. -+ * gimplify.c (gimplify_scan_omp_clauses): Handle -+ OMP_CLAUSE_LINEAR_STMT. -+ * omp-low.c (lower_rec_input_clauses): Fix typo. -+ (maybe_add_implicit_barrier_cancel, lower_omp_1): Add -+ cast between Fortran boolean_type_node and C _Bool if -+ needed. -+ -+2014-06-30 Jason Merrill <jason@redhat.com> -+ -+ PR c++/51253 -+ PR c++/61382 -+ * gimplify.c (gimplify_arg): Non-static. -+ * gimplify.h: Declare it. -+ -+2014-06-30 Marcus Shawcroft <marcus.shawcroft@arm.com> -+ -+ Backport from Mainline -+ 2014-06-30 Marcus Shawcroft <marcus.shawcroft@arm.com> -+ -+ PR target/61633 -+ * config/aarch64/aarch64.md (*aarch64_ashr_sisd_or_int_<mode>3): -+ Add alternative; make early clobber. Adjust both split patterns -+ to use operand 0 as the working register. -+ -+2014-06-30 Kyrylo Tkachov <kyrylo.tkachov@arm.com> -+ -+ * config/aarch64/iterators.md (VCOND): Handle SI and HI modes. -+ Update comments. -+ (VCONQ): Make comment more helpful. -+ (VCON): Delete. -+ * config/aarch64/aarch64-simd.md -+ (aarch64_sqdmulh_lane<mode>): -+ Use VCOND for operands 2. Update lane checking and flipping logic. -+ (aarch64_sqrdmulh_lane<mode>): Likewise. -+ (aarch64_sq<r>dmulh_lane<mode>_internal): Likewise. -+ (aarch64_sqdmull2<mode>): Remove VCON, use VQ_HSI mode iterator. -+ (aarch64_sqdml<SBINQOPS:as>l_lane<mode>_internal, VD_HSI): Change mode -+ attribute of operand 3 to VCOND. -+ (aarch64_sqdml<SBINQOPS:as>l_lane<mode>_internal, SD_HSI): Likewise. -+ (aarch64_sqdml<SBINQOPS:as>l2_lane<mode>_internal): Likewise. -+ (aarch64_sqdmull_lane<mode>_internal, VD_HSI): Likewise. -+ (aarch64_sqdmull_lane<mode>_internal, SD_HSI): Likewise. -+ (aarch64_sqdmull2_lane<mode>_internal): Likewise. -+ (aarch64_sqdml<SBINQOPS:as>l_laneq<mode>_internal, VD_HSI: New -+ define_insn. -+ (aarch64_sqdml<SBINQOPS:as>l_laneq<mode>_internal, SD_HSI): Likewise. -+ (aarch64_sqdml<SBINQOPS:as>l2_laneq<mode>_internal): Likewise. -+ (aarch64_sqdmull_laneq<mode>_internal, VD_HSI): Likewise. -+ (aarch64_sqdmull_laneq<mode>_internal, SD_HSI): Likewise. -+ (aarch64_sqdmull2_laneq<mode>_internal): Likewise. -+ (aarch64_sqdmlal_lane<mode>): Change mode attribute of penultimate -+ operand to VCOND. Update lane flipping and bounds checking logic. -+ (aarch64_sqdmlal2_lane<mode>): Likewise. -+ (aarch64_sqdmlsl_lane<mode>): Likewise. -+ (aarch64_sqdmull_lane<mode>): Likewise. -+ (aarch64_sqdmull2_lane<mode>): Likewise. -+ (aarch64_sqdmlal_laneq<mode>): -+ Replace VCON usage with VCONQ. -+ Emit aarch64_sqdmlal_laneq<mode>_internal insn. -+ (aarch64_sqdmlal2_laneq<mode>): Emit -+ aarch64_sqdmlal2_laneq<mode>_internal insn. -+ Replace VCON with VCONQ. -+ (aarch64_sqdmlsl2_lane<mode>): Replace VCON with VCONQ. -+ (aarch64_sqdmlsl2_laneq<mode>): Likewise. -+ (aarch64_sqdmull_laneq<mode>): Emit -+ aarch64_sqdmull_laneq<mode>_internal insn. -+ Replace VCON with VCONQ. -+ (aarch64_sqdmull2_laneq<mode>): Emit -+ aarch64_sqdmull2_laneq<mode>_internal insn. -+ (aarch64_sqdmlsl_laneq<mode>): Replace VCON usage with VCONQ. -+ * config/aarch64/arm_neon.h (vqdmlal_high_lane_s16): Change type -+ of 3rd argument to int16x4_t. -+ (vqdmlalh_lane_s16): Likewise. -+ (vqdmlslh_lane_s16): Likewise. -+ (vqdmull_high_lane_s16): Likewise. -+ (vqdmullh_lane_s16): Change type of 2nd argument to int16x4_t. -+ (vqdmlal_lane_s16): Don't create temporary int16x8_t value. -+ (vqdmlsl_lane_s16): Likewise. -+ (vqdmull_lane_s16): Don't create temporary int16x8_t value. -+ (vqdmlal_high_lane_s32): Change type 3rd argument to int32x2_t. -+ (vqdmlals_lane_s32): Likewise. -+ (vqdmlsls_lane_s32): Likewise. -+ (vqdmull_high_lane_s32): Change type 2nd argument to int32x2_t. -+ (vqdmulls_lane_s32): Likewise. -+ (vqdmlal_lane_s32): Don't create temporary int32x4_t value. -+ (vqdmlsl_lane_s32): Likewise. -+ (vqdmull_lane_s32): Don't create temporary int32x4_t value. -+ (vqdmulhh_lane_s16): Change type of second argument to int16x4_t. -+ (vqrdmulhh_lane_s16): Likewise. -+ (vqdmlsl_high_lane_s16): Likewise. -+ (vqdmulhs_lane_s32): Change type of second argument to int32x2_t. -+ (vqdmlsl_high_lane_s32): Likewise. -+ (vqrdmulhs_lane_s32): Likewise. -+ -+2014-06-30 Thomas Preud'homme <thomas.preudhomme@arm.com> -+ -+ Backport from Mainline -+ 2014-06-20 Jakub Jelinek <jakub@redhat.com> -+ 2014-06-11 Thomas Preud'homme <thomas.preudhomme@arm.com> -+ -+ PR tree-optimization/61306 -+ * tree-ssa-math-opts.c (struct symbolic_number): Store type of -+ expression instead of its size. -+ (do_shift_rotate): Adapt to change in struct symbolic_number. Return -+ false to prevent optimization when the result is unpredictable due to -+ arithmetic right shift of signed type with highest byte is set. -+ (verify_symbolic_number_p): Adapt to change in struct symbolic_number. -+ (find_bswap_1): Likewise. Return NULL to prevent optimization when the -+ result is unpredictable due to sign extension. -+ (find_bswap): Adapt to change in struct symbolic_number. -+ -+2014-06-27 Martin Jambor <mjambor@suse.cz> -+ -+ PR ipa/61160 -+ * cgraphclones.c (duplicate_thunk_for_node): Removed parameter -+ args_to_skip, use those from node instead. Copy args_to_skip and -+ combined_args_to_skip from node to the new thunk. -+ (redirect_edge_duplicating_thunks): Removed parameter args_to_skip. -+ (cgraph_create_virtual_clone): Moved computation of -+ combined_args_to_skip... -+ (cgraph_clone_node): ...here, simplify it to bitmap_ior.. -+ -+2014-06-27 Uros Bizjak <ubizjak@gmail.com> -+ -+ Backport from mainline -+ 2014-06-26 Uros Bizjak <ubizjak@gmail.com> -+ -+ PR target/61586 -+ * config/alpha/alpha.c (alpha_handle_trap_shadows): Handle BARRIER RTX. -+ -+2014-06-26 Bill Schmidt <wschmidt@linux.vnet.ibm.com> -+ -+ PR target/61542 -+ * config/rs6000/vsx.md (vsx_extract_v4sf): Fix bug with element -+ extraction other than index 3. -+ -+2014-06-26 Marc Glisse <marc.glisse@inria.fr> -+ -+ PR target/61503 -+ * config/i386/i386.md (x86_64_shrd, x86_shrd, -+ ix86_rotr<dwi>3_doubleword): Replace ashiftrt with lshiftrt. -+ -+2014-06-26 Martin Jambor <mjambor@suse.cz> -+ -+ Backport from mainline -+ * ipa-prop.c (ipa_impossible_devirt_target): No longer static, -+ renamed to ipa_impossible_devirt_target. Fix typo. -+ * ipa-prop.h (ipa_impossible_devirt_target): Declare. -+ * ipa-cp.c (ipa_get_indirect_edge_target_1): Use -+ ipa_impossible_devirt_target. -+ -+2014-06-24 Jakub Jelinek <jakub@redhat.com> -+ -+ PR target/61570 -+ * config/i386/driver-i386.c (host_detect_local_cpu): For unknown -+ model family 6 CPU with has_longmode never use a CPU without -+ 64-bit support. -+ -+ * gimplify.c (gimplify_omp_for): For #pragma omp for simd iterator -+ not mentioned in clauses use private clause if the iterator is -+ declared in #pragma omp for simd, and when adding lastprivate -+ instead, add it to the outer #pragma omp for too. Diagnose -+ if the variable is private in outer context. For simd collapse > 1 -+ loops, replace all iterators with temporaries. -+ * omp-low.c (lower_rec_input_clauses): Handle LINEAR clause the -+ same even in collapse > 1 loops. -+ -+2014-06-23 Alan Modra <amodra@gmail.com> -+ -+ PR bootstrap/61583 -+ * tree-vrp.c (remove_range_assertions): Do not set is_unreachable -+ to zero on debug statements. -+ -+2014-06-10 Kyrylo Tkachov <kyrylo.tkachov@arm.com> -+ -+ * config/aarch64/aarch64-simd.md (aarch64_sqdmulh_lane<mode>): -+ New expander. -+ (aarch64_sqrdmulh_lane<mode>): Likewise. -+ (aarch64_sq<r>dmulh_lane<mode>): Rename to... -+ (aarch64_sq<r>dmulh_lane<mode>_interna): ...this. -+ (aarch64_sqdmulh_laneq<mode>): New expander. -+ (aarch64_sqrdmulh_laneq<mode>): Likewise. -+ (aarch64_sq<r>dmulh_laneq<mode>): Rename to... -+ (aarch64_sq<r>dmulh_laneq<mode>_internal): ...this. -+ (aarch64_sqdmulh_lane<mode>): New expander. -+ (aarch64_sqrdmulh_lane<mode>): Likewise. -+ (aarch64_sq<r>dmulh_lane<mode>): Rename to... -+ (aarch64_sq<r>dmulh_lane<mode>_internal): ...this. -+ (aarch64_sqdmlal_lane<mode>): Add lane flip for big-endian. -+ (aarch64_sqdmlal_laneq<mode>): Likewise. -+ (aarch64_sqdmlsl_lane<mode>): Likewise. -+ (aarch64_sqdmlsl_laneq<mode>): Likewise. -+ (aarch64_sqdmlal2_lane<mode>): Likewise. -+ (aarch64_sqdmlal2_laneq<mode>): Likewise. -+ (aarch64_sqdmlsl2_lane<mode>): Likewise. -+ (aarch64_sqdmlsl2_laneq<mode>): Likewise. -+ (aarch64_sqdmull_lane<mode>): Likewise. -+ (aarch64_sqdmull_laneq<mode>): Likewise. -+ (aarch64_sqdmull2_lane<mode>): Likewise. -+ (aarch64_sqdmull2_laneq<mode>): Likewise. -+ -+2014-06-20 Martin Jambor <mjambor@suse.cz> -+ -+ PR ipa/61540 -+ * ipa-prop.c (impossible_devirt_target): New function. -+ (try_make_edge_direct_virtual_call): Use it, also instead of -+ asserting. -+ -+2014-06-20 Martin Jambor <mjambor@suse.cz> -+ -+ PR ipa/61211 -+ * cgraph.c (clone_of_p): Allow skipped_branch to deal with -+ expanded clones. -+ -+2014-06-20 Chung-Lin Tang <cltang@codesourcery.com> -+ -+ Backport from mainline -+ -+ 2014-06-20 Julian Brown <julian@codesourcery.com> -+ Chung-Lin Tang <cltang@codesourcery.com> -+ -+ * config/arm/arm.c (arm_output_mi_thunk): Fix offset for -+ TARGET_THUMB1_ONLY. Add comments. -+ -+2014-06-18 Uros Bizjak <ubizjak@gmail.com> -+ -+ Backport from mainline -+ 2014-06-16 Uros Bizjak <ubizjak@gmail.com> -+ -+ * config/i386/i386.c (decide_alg): Correctly handle -+ maximum size of stringop algorithm. -+ -+2014-06-18 Richard Henderson <rth@redhat.com> -+ -+ PR target/61545 -+ * config/aarch64/aarch64.md (tlsdesc_small): Clobber CC_REGNUM. -+ -+2014-06-17 Yufeng Zhang <yufeng.zhang@arm.com> -+ -+ PR target/61483 -+ * config/aarch64/aarch64.c (aarch64_layout_arg): Add new local -+ variable 'size'; calculate 'size' right in the front; use -+ 'size' to compute 'nregs' (when 'allocate_ncrn != 0') and -+ pcum->aapcs_stack_words. -+ -+2014-06-17 Nick Clifton <nickc@redhat.com> -+ -+ * config/msp430/msp430.md (mulhisi3): Add a NOP after the DINT. -+ (umulhi3, mulsidi3, umulsidi3): Likewise. -+ -+2014-06-17 Uros Bizjak <ubizjak@gmail.com> -+ -+ Backport from mainline -+ 2014-06-06 Uros Bizjak <ubizjak@gmail.com> -+ -+ PR target/61423 -+ * config/i386/i386.md (*floatunssi<mode>2_i387_with_xmm): New -+ define_insn_and_split pattern, merged from *floatunssi<mode>2_1 -+ and corresponding splitters. Zero extend general register -+ or memory input operand to XMM temporary. Enable for -+ TARGET_SSE2 and TARGET_INTER_UNIT_MOVES_TO_VEC only. -+ (floatunssi<mode>2): Update expander predicate. -+ -+2014-06-16 Vladimir Makarov <vmakarov@redhat.com> -+ -+ PR rtl-optimization/61325 -+ * lra-constraints.c (valid_address_p): Add forward declaration. -+ (simplify_operand_subreg): Check address validity before and after -+ alter_reg of memory subreg. -+ -+2014-06-18 Jakub Jelinek <jakub@redhat.com> -+ -+ PR plugins/45078 -+ * config.gcc (arm*-*-linux-*): Include vxworks-dummy.h in tm_file. -+ -+2014-06-13 Peter Bergner <bergner@vnet.ibm.com> -+ -+ Backport from mainline -+ -+ 2014-06-13 Peter Bergner <bergner@vnet.ibm.com> -+ PR target/61415 -+ * config/rs6000/rs6000-builtin.def (BU_MISC_1): Delete. -+ (BU_MISC_2): Rename to ... -+ (BU_LDBL128_2): ... this. -+ * config/rs6000/rs6000.h (RS6000_BTM_LDBL128): New define. -+ (RS6000_BTM_COMMON): Add RS6000_BTM_LDBL128. -+ * config/rs6000/rs6000.c (rs6000_builtin_mask_calculate): Handle -+ RS6000_BTM_LDBL128. -+ (rs6000_invalid_builtin): Add long double 128-bit builtin support. -+ (rs6000_builtin_mask_names): Add RS6000_BTM_LDBL128. -+ * config/rs6000/rs6000.md (unpacktf_0): Remove define)expand. -+ (unpacktf_1): Likewise. -+ * doc/extend.texi (__builtin_longdouble_dw0): Remove documentation. -+ (__builtin_longdouble_dw1): Likewise. -+ * doc/sourcebuild.texi (longdouble128): Document. -+ -+2014-06-13 Jeff Law <law@redhat.com> -+ -+ Backports from mainline: -+ 2014-06-13 Jeff Law <law@redhat.com> -+ -+ PR rtl-optimization/61094 -+ PR rtl-optimization/61446 -+ * ree.c (combine_reaching_defs): Get the mode for the copy from -+ the extension insn rather than the defining insn. -+ -+ 2014-06-02 Jeff Law <law@redhat.com> -+ -+ PR rtl-optimization/61094 -+ * ree.c (combine_reaching_defs): Do not reextend an insn if it -+ was marked as do_no_reextend. If a copy is needed to eliminate -+ an extension, then mark it as do_not_reextend. -+ -+2014-06-13 Martin Jambor <mjambor@suse.cz> -+ -+ PR ipa/61186 -+ * ipa-devirt.c (possible_polymorphic_call_targets): Store NULL to -+ cache_token if returning early. -+ -+2014-06-12 Jakub Jelinek <jakub@redhat.com> -+ -+ PR middle-end/61486 -+ * gimplify.c (struct gimplify_omp_ctx): Add distribute field. -+ (gimplify_adjust_omp_clauses): Don't or in GOVD_LASTPRIVATE -+ if outer combined construct is distribute. -+ (gimplify_omp_for): For OMP_DISTRIBUTE set -+ gimplify_omp_ctxp->distribute. -+ * omp-low.c (scan_sharing_clauses) <case OMP_CLAUSE_SHARED>: For -+ GIMPLE_OMP_TEAMS, if decl isn't global in outer context, record -+ mapping into decl map. -+ -+2014-06-12 Jeff Law <law@redhat.com> -+ -+ Backports from mainline: -+ -+ 2014-06-12 Jeff Law <law@redhat.com> -+ -+ PR tree-optimization/61009 -+ * tree-ssa-threadedge.c (thread_through_normal_block): Correct return -+ value when we stop processing a block due to problematic PHIs. -+ -+ 2014-06-05 Jeff Law <law@redhat.com> -+ -+ PR tree-optimization/61289 -+ * tree-ssa-threadedge.c (invalidate_equivalences): Remove SRC_MAP and -+ DST_MAP parameters. Invalidate by walking all the SSA_NAME_VALUES -+ looking for those which match LHS. All callers changed. -+ (record_temporary_equivalences_from_phis): Remove SRC_MAP and DST_MAP -+ parameters and code which manipulated them. All callers changed. -+ (record_temporary_equivalences_from_stmts_at_dest): Remove SRC_MAP -+ and DST_MAP parameters. Simplify invalidation code by just calling -+ invalidate_equivalences. All callers changed. -+ (thread_across_edge): Simplify now that we don't need to maintain -+ the map of equivalences to invalidate. -+ -+2014-06-12 Eric Botcazou <ebotcazou@adacore.com> -+ -+ * tree-core.h (DECL_NONALIASED): Use proper spelling in comment. -+ -+2014-06-12 Georg-Johann Lay <avr@gjlay.de> -+ -+ Backport from 2014-05-14 trunk r210418 -+ * config/avr/avr.h (REG_CLASS_CONTENTS): Use unsigned suffix for -+ shifted values to avoid build warning. -+ -+2014-06-12 Georg-Johann Lay <avr@gjlay.de> -+ -+ Backport from 2014-05-09 trunk r210272 -+ -+ * config/avr/avr-fixed.md (round<mode>3): Use -1U instead of -1 in -+ unsigned int initializers for regno_in, regno_out. -+ -+ Backport from 2014-06-12 trunk r211491 -+ -+ PR target/61443 -+ * config/avr/avr.md (push<mode>1): Avoid (subreg(mem)) when -+ loading from address spaces. -+ -+2014-06-12 Alan Modra <amodra@gmail.com> -+ -+ PR target/61300 -+ * doc/tm.texi.in (INCOMING_REG_PARM_STACK_SPACE): Document. -+ * doc/tm.texi: Regenerate. -+ * function.c (INCOMING_REG_PARM_STACK_SPACE): Provide default. -+ Use throughout in place of REG_PARM_STACK_SPACE. -+ * config/rs6000/rs6000.c (rs6000_reg_parm_stack_space): Add -+ "incoming" param. Pass to rs6000_function_parms_need_stack. -+ (rs6000_function_parms_need_stack): Add "incoming" param, ignore -+ prototype_p when incoming. Use function decl when incoming -+ to handle K&R style functions. -+ * config/rs6000/rs6000.h (REG_PARM_STACK_SPACE): Adjust. -+ (INCOMING_REG_PARM_STACK_SPACE): Define. -+ -+2014-06-11 Richard Biener <rguenther@suse.de> -+ -+ PR tree-optimization/61452 -+ * tree-ssa-sccvn.c (visit_phi): Remove pointless setting of -+ expr and has_constants in case we found a leader. -+ (simplify_binary_expression): Always valueize operands first. -+ (simplify_unary_expression): Likewise. -+ -+2014-06-11 Richard Biener <rguenther@suse.de> -+ -+ PR middle-end/61456 -+ * tree-ssa-alias.c (nonoverlapping_component_refs_of_decl_p): -+ Do not use the main variant for the type comparison. -+ -+2014-06-10 Kyrylo Tkachov <kyrylo.tkachov@arm.com> -+ -+ * doc/arm-acle-intrinsics.texi: Specify when CRC32 intrinsics are -+ available. -+ Simplify description of __crc32d and __crc32cd intrinsics. -+ * doc/extend.texi (ARM ACLE Intrinsics): Remove comment about CRC32 -+ availability. -+ -+2014-06-07 Eric Botcazou <ebotcazou@adacore.com> -+ -+ * tree-ssa-tail-merge.c (same_succ_hash): Hash the static chain of a -+ call statement, if any. -+ (gimple_equal_p) <GIMPLE_CALL>: Compare the static chain of the call -+ statements, if any. Tidy up. -+ -+2014-06-06 Michael Meissner <meissner@linux.vnet.ibm.com> -+ -+ Back port from trunk -+ 2014-06-06 Michael Meissner <meissner@linux.vnet.ibm.com> -+ -+ PR target/61431 -+ * config/rs6000/vsx.md (VSX_LE): Split VSX_D into 2 separate -+ iterators, VSX_D that handles 64-bit types, and VSX_LE that -+ handles swapping the two 64-bit double words on little endian -+ systems. Include V1TImode and optionally TImode in VSX_LE so that -+ these types are properly swapped. Change all of the insns and -+ splits that do the 64-bit swaps to use VSX_LE. -+ (vsx_le_perm_load_<mode>): Likewise. -+ (vsx_le_perm_store_<mode>): Likewise. -+ (splitters for little endian memory operations): Likewise. -+ (vsx_xxpermdi2_le_<mode>): Likewise. -+ (vsx_lxvd2x2_le_<mode>): Likewise. -+ (vsx_stxvd2x2_le_<mode>): Likewise. -+ -+2014-06-06 Vladimir Makarov <vmakarov@redhat.com> -+ -+ PR rtl-optimization/61325 -+ * lra-constraints.c (process_address_1): Check scale equal to one -+ to prevent transformation: base + scale * index => base + new_reg. -+ -+2014-06-05 Martin Jambor <mjambor@suse.cz> -+ -+ PR ipa/61393 -+ * ipa-cp.c (determine_versionability): Pretend that tm_clones are -+ not versionable. -+ -+2014-06-04 Richard Biener <rguenther@suse.de> -+ -+ PR tree-optimization/61383 -+ * tree-ssa-ifcombine.c (bb_no_side_effects_p): Make sure -+ stmts can't trap. -+ -+2014-06-02 Jason Merrill <jason@redhat.com> -+ -+ PR c++/61020 -+ * varpool.c (ctor_for_folding): Handle uninitialized vtables. -+ -+2014-06-03 Martin Jambor <mjambor@suse.cz> -+ -+ PR ipa/61160 -+ * ipa-cp.c (cgraph_edge_brings_value_p): Handle edges leading to -+ thunks. -+ -+2014-06-03 Andrey Belevantsev <abel@ispras.ru> -+ -+ Backport from mainline -+ 2014-05-14 Andrey Belevantsev <abel@ispras.ru> -+ -+ PR rtl-optimization/60866 -+ * sel-sched-ir (sel_init_new_insn): New parameter old_seqno. -+ Default it to -1. Pass it down to init_simplejump_data. -+ (init_simplejump_data): New parameter old_seqno. Pass it down -+ to get_seqno_for_a_jump. -+ (get_seqno_for_a_jump): New parameter old_seqno. Use it for -+ initializing new jump seqno as a last resort. Add comment. -+ (sel_redirect_edge_and_branch): Save old seqno of the conditional -+ jump and pass it down to sel_init_new_insn. -+ (sel_redirect_edge_and_branch_force): Likewise. -+ -+2014-06-03 Andrey Belevantsev <abel@ispras.ru> -+ -+ Backport from mainline -+ 2014-05-14 Andrey Belevantsev <abel@ispras.ru> -+ -+ PR rtl-optimization/60901 -+ * config/i386/i386.c (ix86_dependencies_evaluation_hook): Check that -+ bb predecessor belongs to the same scheduling region. Adjust comment. -+ -+2014-06-03 Uros Bizjak <ubizjak@gmail.com> -+ -+ Backport from mainline -+ 2014-06-02 Uros Bizjak <ubizjak@gmail.com> -+ -+ PR target/61239 -+ * config/i386/i386.c (ix86_expand_vec_perm) [case V32QImode]: Use -+ GEN_INT (-128) instead of GEN_INT (128) to set MSB of QImode constant. -+ -+2014-05-29 Vladimir Makarov <vmakarov@redhat.com> -+ -+ PR rtl-optimization/61325 -+ * lra-constraints.c (process_address): Rename to -+ process_address_1. -+ (process_address): New function. -+ -+2014-05-29 Uros Bizjak <ubizjak@gmail.com> -+ -+ Backport from mainline -+ 2014-05-26 Uros Bizjak <ubizjak@gmail.com> -+ -+ PR target/61271 -+ * config/i386/i386.c (ix86_rtx_costs) -+ <case CONST_INT, case CONST, case LABEL_REF, case SYMBOL_REF>: -+ Fix condition. -+ -+2014-05-28 Eric Botcazou <ebotcazou@adacore.com> -+ -+ Backport from mainline -+ 2014-05-27 Eric Botcazou <ebotcazou@adacore.com> -+ -+ * double-int.c (div_and_round_double) <ROUND_DIV_EXPR>: Use the proper -+ predicate to detect a negative quotient. -+ -+2014-05-28 Richard Biener <rguenther@suse.de> -+ -+ Backport from mainline -+ 2014-05-28 Richard Biener <rguenther@suse.de> -+ -+ PR middle-end/61045 -+ * fold-const.c (fold_comparison): When folding -+ X +- C1 CMP Y +- C2 to X CMP Y +- C2 +- C1 also ensure -+ the sign of the remaining constant operand stays the same. -+ -+ 2014-05-05 Richard Biener <rguenther@suse.de> -+ -+ PR middle-end/61010 -+ * fold-const.c (fold_binary_loc): Consistently avoid -+ canonicalizing X & CST away from a CST that is the mask -+ of a mode. -+ -+ 2014-04-28 Richard Biener <rguenther@suse.de> -+ -+ PR tree-optimization/60979 -+ * graphite-scop-detection.c (scopdet_basic_block_info): Reject -+ SCOPs that end in a block with a successor with abnormal -+ predecessors. -+ -+2014-05-28 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> -+ -+ * configure.ac ($gcc_cv_ld_clearcap): New test. -+ * configure: Regenerate. -+ * config.in: Regenerate. -+ * config/sol2.opt (mclear-hwcap): New option. -+ * config/sol2.h (LINK_CLEARCAP_SPEC): Define. -+ * config/sol2-clearcap.map: Moved here from -+ testsuite/gcc.target/i386/clearcap.map. -+ * config/sol2-clearcapv2.map: Move here from -+ gcc.target/i386/clearcapv2.map. -+ * config/t-sol2 (install): Depend on install-clearcap-map. -+ (install-clearcap-map): New target. -+ * doc/invoke.texi (Option Summary, Solaris 2 Options): Document -+ -mclear-hwcap. -+ -+2014-05-28 Georg-Johann Lay <avr@gjlay.de> -+ -+ PR libgcc/61152 -+ * config/dbx.h (License): Add Runtime Library Exception. -+ * config/newlib-stdint.h (License): Same. -+ * config/rtems.h (License): Same -+ * config/initfini-array.h (License): Same -+ * config/v850/v850.h (License): Same. -+ * config/v850/v850-opts.h (License): Same -+ * config/v850/rtems.h (License): Same. -+ -+2014-05-28 Georg-Johann Lay <avr@gjlay.de> -+ -+ PR target/61044 -+ * doc/extend.texi (Local Labels): Note that label differences are -+ not supported for AVR. -+ -+2014-05-27 Georg-Johann Lay <avr@gjlay.de> -+ -+ Backport from 2014-05-12 mainline r210322. -+ Backport from 2014-05-27 mainline r210959, r210969. -+ -+ PR libgcc/61152 -+ * config/arm/arm.h (License): Add GCC Runtime Library Exception. -+ * config/arm/arm-cores.def (License): Same. -+ * config/arm/arm-opts.h (License): Same. -+ * config/arm/aout.h (License): Same. -+ * config/arm/bpabi.h (License): Same. -+ * config/arm/elf.h (License): Same. -+ * config/arm/linux-elf.h (License): Same. -+ * config/arm/linux-gas.h (License): Same. -+ * config/arm/netbsd-elf.h (License): Same. -+ * config/arm/uclinux-eabi.h (License): Same. -+ * config/arm/uclinux-elf.h (License): Same. -+ * config/arm/vxworks.h (License): Same. -+ -+2014-05-26 Michael Tautschnig <mt@debian.org> -+ -+ PR target/61249 -+ * doc/extend.texi (X86 Built-in Functions): Fix parameter lists of -+ __builtin_ia32_vfrczs[sd] and __builtin_ia32_mpsadbw256. -+ -+2014-05-22 Vladimir Makarov <vmakarov@redhat.com> -+ -+ PR rtl-optimization/61215 -+ * lra-elelimination.c (lra_eliminate_regs_1): Don't use -+ simplify_gen_subreg until final substitution. -+ -+2014-05-23 Alan Modra <amodra@gmail.com> -+ -+ PR target/61231 -+ * config/rs6000/rs6000.c (mem_operand_gpr): Handle SImode. -+ * config/rs6000/rs6000.md (extendsidi2_lfiwax, extendsidi2_nocell): -+ Use "Y" constraint rather than "m". -+ -+2014-05-22 Vladimir Makarov <vmakarov@redhat.com> -+ -+ PR rtl-optimization/60969 -+ * ira-costs.c (record_reg_classes): Process NO_REGS for matching -+ constraints. Set up mem cost for NO_REGS case. -+ -+2014-05-22 Peter Bergner <bergner@vnet.ibm.com> -+ -+ * config/rs6000/htm.md (ttest): Use correct shift value to get CR0. -+ -+2014-05-22 Richard Earnshaw <rearnsha@arm.com> -+ -+ PR target/61208 -+ * arm.md (arm_cmpdi_unsigned): Fix length calculation for Thumb2. -+ -+2014-05-22 Nick Clifton <nickc@redhat.com> -+ -+ * config/msp430/msp430.h (ASM_SPEC): Add spaces after inserted options. -+ -+2014-05-22 Jakub Jelinek <jakub@redhat.com> -+ -+ * tree-streamer-in.c (unpack_ts_real_cst_value_fields): Make sure -+ all padding bits in REAL_VALUE_TYPE are cleared. -+ -+2014-05-21 Guozhi Wei <carrot@google.com> -+ -+ PR target/61202 -+ * config/aarch64/arm_neon.h (vqdmulh_n_s16): Change the last operand's -+ constraint. -+ (vqdmulhq_n_s16): Likewise. -+ -+2014-05-21 Martin Jambor <mjambor@suse.cz> -+ -+ * doc/invoke.texi (Optimize Options): Document parameters -+ ipa-cp-eval-threshold, ipa-max-agg-items, ipa-cp-loop-hint-bonus and -+ ipa-cp-array-index-hint-bonus. -+ -+2014-05-21 Jakub Jelinek <jakub@redhat.com> -+ -+ PR middle-end/61252 -+ * omp-low.c (handle_simd_reference): New function. -+ (lower_rec_input_clauses): Use it. Defer adding reference -+ initialization even for reduction without placeholder if in simd, -+ handle it properly later on. -+ -+2014-05-20 Jan Hubicka <hubicka@ucw.cz> -+ -+ PR bootstrap/60984 -+ * ipa-inline-transform.c (inline_call): Use add CALLEE_REMOVED -+ parameter. -+ * ipa-inline.c (inline_to_all_callers): If callee was removed; return. -+ (ipa_inline): Loop inline_to_all_callers until no more aliases -+ are removed. -+ -+2014-05-20 Jan Hubicka <hubicka@ucw.cz> -+ -+ PR lto/60820 -+ * varpool.c (varpool_remove_node): Do not alter decls when streaming. -+ -+2014-05-20 DJ Delorie <dj@redhat.com> -+ -+ * config/msp430/msp430.md (split): Don't allow subregs when -+ splitting SImode adds. -+ (andneghi): Fix subtraction logic. -+ * config/msp430/predicates.md (msp430_nonsubreg_or_imm_operand): New. -+ -+2014-05-20 Nick Clifton <nickc@redhat.com> -+ -+ * config/msp430/msp430.c (TARGET_GIMPLIFY_VA_ARG_EXPR): Define. -+ (msp430_gimplify_va_arg_expr): New function. -+ (msp430_print_operand): Handle (CONST (ZERO_EXTRACT)). -+ -+ * config/msp430/msp430.md (zero_extendpsisi2): Use + constraint on -+ operand 0 in order to prevent confusion about the number of -+ registers involved. -+ -+2014-05-20 Kyrylo Tkachov <kyrylo.tkachov@arm.com> -+ -+ * config/arm/arm.md (arith_shiftsi): Do not predicate for -+ arm_restrict_it. -+ -+2014-05-19 Richard Earnshaw <rearnsha@arm.com> -+ -+ * arm.c (thumb1_reorg): When scanning backwards skip anything -+ that's not a proper insn. -+ -+2014-05-17 Jan Hubicka <hubicka@ucw.cz> -+ -+ * ipa.c (symtab_remove_unreachable_nodes): Remove -+ symbol from comdat group if its body was eliminated. -+ (comdat_can_be_unshared_p_1): Static symbols can always be privatized. -+ * symtab.c (symtab_remove_from_same_comdat_group): Break out from ... -+ (symtab_unregister_node): ... this one. -+ (verify_symtab_base): More strict checking of comdats. -+ * cgraph.h (symtab_remove_from_same_comdat_group): Declare. -+ -+2014-05-17 Jan Hubicka <hubicka@ucw.cz> -+ -+ * opts.c (common_handle_option): Disable -fipa-reference coorectly -+ with -fuse-profile. -+ -+2014-05-17 Jan Hubicka <hubicka@ucw.cz> -+ -+ PR ipa/60854 -+ * ipa.c (symtab_remove_unreachable_nodes): Mark targets of -+ external aliases alive, too. -+ -+2014-05-17 Uros Bizjak <ubizjak@gmail.com> -+ -+ * doc/invoke.texi (free): Mention Alpha. Also enabled at -Os. -+ -+2014-05-17 Uros Bizjak <ubizjak@gmail.com> -+ -+ Backport from mainline -+ 2014-04-25 H.J. Lu <hongjiu.lu@intel.com> -+ -+ PR target/60969 -+ * config/i386/i386.md (*movsf_internal): Set MODE to SI for -+ alternative 12. -+ -+2014-05-16 Vladimir Makarov <vmakarov@redhat.com> -+ -+ PR rtl-optimization/60969 -+ * ira-costs.c (record_reg_classes): Allow only memory for pseudo. -+ Calculate costs for this case. -+ -+2014-05-15 Peter Bergner <bergner@vnet.ibm.com> -+ -+ PR target/61193 -+ * config/rs6000/htmxlintrin.h (_HTM_TBEGIN_STARTED): New define. -+ (__TM_simple_begin): Use it. -+ (__TM_begin): Likewise. -+ -+2014-05-15 Martin Jambor <mjambor@suse.cz> -+ -+ PR ipa/61085 -+ * ipa-prop.c (update_indirect_edges_after_inlining): Check -+ type_preserved flag when the indirect edge is polymorphic. -+ -+2014-05-15 Martin Jambor <mjambor@suse.cz> -+ -+ PR ipa/60897 -+ * ipa-prop.c (ipa_modify_formal_parameters): Reset DECL_LANG_SPECIFIC. -+ -+2014-05-15 Jakub Jelinek <jakub@redhat.com> -+ -+ PR tree-optimization/61158 -+ * fold-const.c (fold_binary_loc): If X is zero-extended and -+ shiftc >= prec, make sure zerobits is all ones instead of -+ invoking undefined behavior. -+ -+2014-05-14 Cary Coutant <ccoutant@google.com> -+ -+ PR debug/61013 -+ * opts.c (common_handle_option): Don't special-case "-g". -+ (set_debug_level): Default to at least level 2 with "-g". -+ -+2014-05-14 Eric Botcazou <ebotcazou@adacore.com> -+ -+ * config/sparc/sparc-protos.h (sparc_absnegfloat_split_legitimate): -+ Delete. -+ * config/sparc/sparc.c (sparc_absnegfloat_split_legitimate): Likewise. -+ * config/sparc/sparc.md (fptype_ut699): New attribute. -+ (in_branch_delay): Return false if -mfix-ut699 is specified and -+ fptype_ut699 is set to single. -+ (truncdfsf2): Add fptype_ut699 attribute. -+ (fix_truncdfsi2): Likewise. -+ (floatsisf2): Change fptype attribute. -+ (fix_truncsfsi2): Likewise. -+ (negtf2_notv9): Delete. -+ (negtf2_v9): Likewise. -+ (negtf2_hq): New instruction. -+ (negtf2): New instruction and splitter. -+ (negdf2_notv9): Rewrite. -+ (abstf2_notv9): Delete. -+ (abstf2_hq_v9): Likewise. -+ (abstf2_v9): Likewise. -+ (abstf2_hq): New instruction. -+ (abstf2): New instruction and splitter. -+ (absdf2_notv9): Rewrite. -+ -+2014-05-14 Matthias Klose <doko@ubuntu.com> -+ -+ Revert: -+ 2014-05-08 Manuel López-Ibáñez <manu@gcc.gnu.org> -+ Matthias Klose <doko@ubuntu.com> -+ -+ PR driver/61106 -+ * optc-gen.awk: Fix option handling for -Wunused-parameter. -+ -+2014-05-13 Peter Bergner <bergner@vnet.ibm.com> -+ -+ * doc/sourcebuild.texi: (dfp_hw): Document. -+ (p8vector_hw): Likewise. -+ (powerpc_eabi_ok): Likewise. -+ (powerpc_elfv2): Likewise. -+ (powerpc_htm_ok): Likewise. -+ (ppc_recip_hw): Likewise. -+ (vsx_hw): Likewise. -+ -+2014-05-13 Jeff Law <law@redhat.com> -+ -+ Backports fromm mainline: -+ -+ 2014-05-08 Jeff Law <law@redhat.com> -+ -+ PR tree-optimization/61009 -+ * tree-ssa-threadedge.c (thread_through_normal_block): Return a -+ tri-state rather than a boolean. When a block is too big to -+ thread through, inform caller via negative return value. -+ (thread_across_edge): If a block was too big for normal threading, -+ then it's too big for a joiner too, so remove temporary equivalences -+ and return immediately. -+ -+ 2014-04-28 Jeff Law <law@redhat.com> -+ -+ PR tree-optimization/60902 -+ * tree-ssa-threadedge.c -+ (record_temporary_equivalences_from_stmts_at_dest): Only iterate -+ over real defs when invalidating outputs from statements that do not -+ produce useful outputs for threading. -+ -+ 2014-04-23 Jeff Law <law@redhat.com> -+ -+ PR tree-optimization/60902 -+ * tree-ssa-threadedge.c -+ (record_temporary_equivalences_from_stmts_at_dest): Make sure to -+ invalidate outputs from statements that do not produce useful -+ outputs for threading. -+ -+2014-05-13 Richard Biener <rguenther@suse.de> -+ -+ PR ipa/60973 -+ * tree-inline.c (remap_gimple_stmt): Clear tail call flag, -+ it needs revisiting whether the call still may be tail-called. -+ -+2014-05-13 Jakub Jelinek <jakub@redhat.com> -+ -+ PR target/61060 -+ * config/i386/i386.c (ix86_expand_set_or_movmem): If count_exp -+ is const0_rtx, return immediately. Don't test count == 0 when -+ it is always true. -+ -+2014-05-12 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com> -+ -+ Backport from mainline -+ 2014-05-12 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com> -+ -+ PR target/60991 -+ * config/avr/avr.c (avr_out_store_psi): Use correct constant -+ to restore Y. -+ -+2014-05-09 Uros Bizjak <ubizjak@gmail.com> -+ -+ Backport from mainline -+ 2014-05-08 Uros Bizjak <ubizjak@gmail.com> -+ -+ PR target/61092 -+ * config/alpha/alpha.c: Include gimple-iterator.h. -+ (alpha_gimple_fold_builtin): New function. Move -+ ALPHA_BUILTIN_UMULH folding from ... -+ (alpha_fold_builtin): ... here. -+ (TARGET_GIMPLE_FOLD_BUILTIN): New define. -+ -+2014-05-09 Pitchumani Sivanupandi <Pitchumani.S@atmel.com> -+ -+ Backport from 2014-04-16 trunk r209446 -+ 2014-04-16 Pitchumani Sivanupandi <Pitchumani.S@atmel.com> -+ -+ * config/avr/avr-mcus.def: Correct typo for atxmega256a3bu macro. -+ -+2014-05-09 Georg-Johann Lay <avr@gjlay.de> -+ -+ Backport from 2014-05-09 trunk r210267 -+ -+ PR target/61055 -+ * config/avr/avr.md (cc): Add new attribute set_vzn. -+ (addqi3, addqq3, adduqq3, subqi3, subqq3, subuqq3, negqi2) [cc]: -+ Set cc insn attribute to set_vzn instead of set_zn for alternatives -+ with INC, DEC or NEG. -+ * config/avr/avr.c (avr_notice_update_cc): Handle SET_VZN. -+ (avr_out_plus_1): ADIW sets cc0 to CC_SET_CZN. -+ INC, DEC and ADD+ADC set cc0 to CC_CLOBBER. -+ -+2014-05-08 Manuel López-Ibáñez <manu@gcc.gnu.org> -+ Matthias Klose <doko@ubuntu.com> -+ -+ PR driver/61106 -+ * optc-gen.awk: Fix option handling for -Wunused-parameter. -+ -+2014-05-08 Uros Bizjak <ubizjak@gmail.com> -+ -+ PR target/59952 -+ * config/i386/i386.c (PTA_HASWELL): Remove PTA_RTM. -+ -+2014-05-05 Marek Polacek <polacek@redhat.com> -+ -+ Back port from mainline -+ 2014-05-05 Marek Polacek <polacek@redhat.com> -+ -+ PR driver/61065 -+ * opts.c (common_handle_option): Call error_at instead of warning_at. -+ -+2014-05-04 Jan Hubicka <hubicka@ucw.cz> -+ -+ PR ipa/60965 -+ * ipa-devirt.c (get_class_context): Allow POD to change to non-POD. -+ -+2014-05-04 Peter Bergner <bergner@vnet.ibm.com> -+ -+ * config/rs6000/rs6000.h (RS6000_BTM_HARD_FLOAT): New define. -+ (RS6000_BTM_COMMON): Add RS6000_BTM_HARD_FLOAT. -+ (TARGET_EXTRA_BUILTINS): Add TARGET_HARD_FLOAT. -+ * config/rs6000/rs6000-builtin.def (BU_MISC_1): -+ Use RS6000_BTM_HARD_FLOAT. -+ (BU_MISC_2): Likewise. -+ * config/rs6000/rs6000.c (rs6000_builtin_mask_calculate): Handle -+ RS6000_BTM_HARD_FLOAT. -+ (rs6000_option_override_internal): Enforce -mhard-float if -mhard-dfp -+ is explicitly used. -+ (rs6000_invalid_builtin): Add hard floating builtin support. -+ (rs6000_expand_builtin): Relax the gcc_assert to allow the new -+ hard float builtins. -+ (rs6000_builtin_mask_names): Add RS6000_BTM_HARD_FLOAT. -+ -+2014-05-03 Joey Ye <joey.ye@arm.com> -+ -+ Backport from mainline r209463 -+ 2014-04-17 Joey Ye <joey.ye@arm.com> -+ -+ * opts.c (OPT_fif_conversion, OPT_fif_conversion2): Disable for Og. -+ -+2014-05-03 Oleg Endo <olegendo@gcc.gnu.org> -+ -+ Back port from mainline -+ PR target/61026 -+ * config/sh/sh.c: Include stdlib headers before everything else. -+ -+2014-05-02 Bill Schmidt <wschmidt@linux.vnet.ibm.com> -+ -+ PR tree-optimization/60930 -+ * gimple-ssa-strength-reduction.c (create_mul_imm_cand): Reject -+ creating a multiply candidate by folding two constant -+ multiplicands when the result overflows. -+ -+2014-05-02 Jakub Jelinek <jakub@redhat.com> -+ -+ * gimplify.c (gimplify_adjust_omp_clauses_1): Handle -+ GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE. -+ (gimplify_adjust_omp_clauses): Simd region is never -+ directly nested in combined parallel. Instead, for linear -+ with copyin/copyout, if in combined for simd loop, make decl -+ firstprivate/lastprivate on OMP_FOR. -+ * omp-low.c (expand_omp_for_generic, expand_omp_for_static_nochunk, -+ expand_omp_for_static_chunk): When setting endvar, also set -+ fd->loop.v to the same value. -+ -+2014-05-02 Kyrylo Tkachov <kyrylo.tkachov@arm.com> -+ -+ Back port from mainline -+ 2014-04-24 Kyrylo Tkachov <kyrylo.tkachov@arm.com> -+ -+ * config/aarch64/aarch64.h (TARGET_CPU_CPP_BUILTINS): Check -+ TARGET_SIMD rather than TARGET_GENERAL_REGS_ONLY. -+ (TARGET_SIMD): Take AARCH64_ISA_SIMD into account. -+ (TARGET_FLOAT): Take AARCH64_ISA_FP into account. -+ (TARGET_CRYPTO): Take TARGET_SIMD into account. -+ -+2014-04-30 Michael Meissner <meissner@linux.vnet.ibm.com> -+ -+ Back port from mainline -+ 2014-04-24 Michael Meissner <meissner@linux.vnet.ibm.com> -+ -+ * doc/extend.texi (PowerPC Built-in Functions): Document new -+ powerpc extended divide, bcd, pack/unpack 128-bit, builtin -+ functions. -+ (PowerPC AltiVec/VSX Built-in Functions): Likewise. -+ -+ * config/rs6000/predicates.md (const_0_to_3_operand): New -+ predicate to match 0..3 integer constants. -+ -+ * config/rs6000/rs6000-builtin.def (BU_DFP_MISC_1): Add new macros -+ to support adding miscellaneous builtin functions. -+ (BU_DFP_MISC_2): Likewise. -+ (BU_P7_MISC_1): Likewise. -+ (BU_P7_MISC_2): Likewise. -+ (BU_P8V_MISC_3): Likewise. -+ (BU_MISC_1): Likewise. -+ (BU_MISC_2): Likewise. -+ (DIVWE): Add extended divide builtin functions. -+ (DIVWEO): Likewise. -+ (DIVWEU): Likewise. -+ (DIVWEUO): Likewise. -+ (DIVDE): Likewise. -+ (DIVDEO): Likewise. -+ (DIVDEU): Likewise. -+ (DIVDEUO): Likewise. -+ (DXEX): Add decimal floating-point builtin functions. -+ (DXEXQ): Likewise. -+ (DDEDPD): Likewise. -+ (DDEDPDQ): Likewise. -+ (DENBCD): Likewise. -+ (DENBCDQ): Likewise. -+ (DIEX): Likewise. -+ (DIEXQ): Likewise. -+ (DSCLI): Likewise. -+ (DSCLIQ): Likewise. -+ (DSCRI): Likewise. -+ (DSCRIQ): Likewise. -+ (CDTBCD): Add new BCD builtin functions. -+ (CBCDTD): Likewise. -+ (ADDG6S): Likewise. -+ (BCDADD): Likewise. -+ (BCDADD_LT): Likewise. -+ (BCDADD_EQ): Likewise. -+ (BCDADD_GT): Likewise. -+ (BCDADD_OV): Likewise. -+ (BCDSUB): Likewise. -+ (BCDSUB_LT): Likewise. -+ (BCDSUB_EQ): Likewise. -+ (BCDSUB_GT): Likewise. -+ (BCDSUB_OV): Likewise. -+ (PACK_TD): Add new pack/unpack 128-bit type builtin functions. -+ (UNPACK_TD): Likewise. -+ (PACK_TF): Likewise. -+ (UNPACK_TF): Likewise. -+ (UNPACK_TF_0): Likewise. -+ (UNPACK_TF_1): Likewise. -+ (PACK_V1TI): Likewise. -+ (UNPACK_V1TI): Likewise. -+ -+ * config/rs6000/rs6000.c (rs6000_builtin_mask_calculate): Add -+ support for decimal floating point builtin functions. -+ (rs6000_expand_ternop_builtin): Add checks for the new builtin -+ functions that take constant arguments. -+ (rs6000_invalid_builtin): Add decimal floating point builtin -+ support. -+ (rs6000_init_builtins): Setup long double, _Decimal64, and -+ _Decimal128 types for new builtin functions. -+ (builtin_function_type): Set the unsigned flags appropriately for -+ the new builtin functions. -+ (rs6000_opt_masks): Add support for decimal floating point builtin -+ functions. -+ -+ * config/rs6000/rs6000.h (RS6000_BTM_DFP): Add support for decimal -+ floating point builtin functions. -+ (RS6000_BTM_COMMON): Likewise. -+ (RS6000_BTI_long_double): Likewise. -+ (RS6000_BTI_dfloat64): Likewise. -+ (RS6000_BTI_dfloat128): Likewise. -+ (long_double_type_internal_node): Likewise. -+ (dfloat64_type_internal_node): Likewise. -+ (dfloat128_type_internal_node): Likewise. -+ -+ * config/rs6000/altivec.h (UNSPEC_BCDADD): Add support for ISA -+ 2.07 bcd arithmetic instructions. -+ (UNSPEC_BCDSUB): Likewise. -+ (UNSPEC_BCD_OVERFLOW): Likewise. -+ (UNSPEC_BCD_ADD_SUB): Likewise. -+ (bcd_add_sub): Likewise. -+ (BCD_TEST): Likewise. -+ (bcd<bcd_add_sub>): Likewise. -+ (bcd<bcd_add_sub>_test): Likewise. -+ (bcd<bcd_add_sub>_test2): Likewise. -+ (bcd<bcd_add_sub>_<code>): Likewise. -+ (peephole2 for combined bcd ops): Likewise. -+ -+ * config/rs6000/dfp.md (UNSPEC_DDEDPD): Add support for new -+ decimal floating point builtin functions. -+ (UNSPEC_DENBCD): Likewise. -+ (UNSPEC_DXEX): Likewise. -+ (UNSPEC_DIEX): Likewise. -+ (UNSPEC_DSCLI): Likewise. -+ (UNSPEC_DSCRI): Likewise. -+ (D64_D128): Likewise. -+ (dfp_suffix): Likewise. -+ (dfp_ddedpd_<mode>): Likewise. -+ (dfp_denbcd_<mode>): Likewise. -+ (dfp_dxex_<mode>): Likewise. -+ (dfp_diex_<mode>): Likewise. -+ (dfp_dscli_<mode>): Likewise. -+ (dfp_dscri_<mode>): Likewise. -+ -+ * config/rs6000/rs6000.md (UNSPEC_ADDG6S): Add support for new BCD -+ builtin functions. -+ (UNSPEC_CDTBCD): Likewise. -+ (UNSPEC_CBCDTD): Likewise. -+ (UNSPEC_DIVE): Add support for new extended divide builtin -+ functions. -+ (UNSPEC_DIVEO): Likewise. -+ (UNSPEC_DIVEU): Likewise. -+ (UNSPEC_DIVEUO): Likewise. -+ (UNSPEC_UNPACK_128BIT): Add support for new builtin functions to -+ pack/unpack 128-bit types. -+ (UNSPEC_PACK_128BIT): Likewise. -+ (idiv_ldiv): New mode attribute to set the 32/64-bit divide type. -+ (udiv<mode>3): Use idiv_ldiv mode attribute. -+ (div<mode>3): Likewise. -+ (addg6s): Add new BCD builtin functions. -+ (cdtbcd): Likewise. -+ (cbcdtd): Likewise. -+ (UNSPEC_DIV_EXTEND): Add support for new extended divide -+ instructions. -+ (div_extend): Likewise. -+ (div<div_extend>_<mode>"): Likewise. -+ (FP128_64): Add support for new builtin functions to pack/unpack -+ 128-bit types. -+ (unpack<mode>): Likewise. -+ (unpacktf_0): Likewise. -+ (unpacktf_1): Likewise. -+ (unpack<mode>_dm): Likewise. -+ (unpack<mode>_nodm): Likewise. -+ (pack<mode>): Likewise. -+ (unpackv1ti): Likewise. -+ (packv1ti): Likewise. -+ -+2014-04-29 Pat Haugen <pthaugen@us.ibm.com> -+ -+ Backport from mainline -+ 2014-04-17 Pat Haugen <pthaugen@us.ibm.com> -+ -+ * config/rs6000/rs6000.md (addti3, subti3): New. -+ -+2014-04-29 Jakub Jelinek <jakub@redhat.com> -+ -+ PR tree-optimization/60971 -+ * tree-tailcall.c (process_assignment): Reject conversions which -+ reduce precision. -+ -+2014-04-29 Nick Clifton <nickc@redhat.com> -+ -+ * config/msp430/msp430.md (umulsidi): Fix typo. -+ (mulhisi3): Enable even inside interrupt handlers. -+ * config/msp430/msp430.c (msp430_print_operand): %O: Allow for the -+ bigger return address pushed in large mode. -+ -+2014-04-28 Pat Haugen <pthaugen@us.ibm.com> -+ -+ * config/rs6000/sync.md (AINT mode_iterator): Move definition. -+ (loadsync_<mode>): Change mode. -+ (load_quadpti, store_quadpti): New. -+ (atomic_load<mode>, atomic_store<mode>): Add support for TI mode. -+ * config/rs6000/rs6000.md (unspec enum): Add UNSPEC_LSQ. -+ -+2014-04-28 Eric Botcazou <ebotcazou@adacore.com> -+ -+ * configure.ac: Tweak GAS check for LEON instructions on SPARC. -+ * configure: Regenerate. -+ * config/sparc/sparc.opt (muser-mode): New option. -+ * config/sparc/sync.md (atomic_compare_and_swap<mode>_1): Do not enable -+ for LEON3. -+ (atomic_compare_and_swap_leon3_1): New instruction for LEON3. -+ * doc/invoke.texi (SPARC options): Document -muser-mode. -+ -+2014-04-26 Markus Trippelsdorf <markus@trippelsdorf.de> -+ -+ * doc/install.texi (Building with profile feedback): Remove -+ outdated sentence. -+ -+2014-04-26 Tom de Vries <tom@codesourcery.com> -+ -+ * config/i386/i386.md (define_expand "ldexpxf3"): Fix out-of-bounds -+ array accesses. -+ -+2014-04-25 Jakub Jelinek <jakub@redhat.com> -+ -+ PR tree-optimization/60960 -+ * tree-vect-generic.c (expand_vector_operation): Only call -+ expand_vector_divmod if type's mode satisfies VECTOR_MODE_P. -+ -+2014-04-25 Eric Botcazou <ebotcazou@adacore.com> -+ -+ PR target/60941 -+ * config/sparc/sparc.md (ashlsi3_extend): Delete. -+ -+2014-04-25 Richard Biener <rguenther@suse.de> -+ -+ PR ipa/60912 -+ * tree-ssa-structalias.c (ipa_pta_execute): Compute direct -+ call stmt use/clobber sets during stmt walk instead of -+ walking the possibly incomplete set of caller edges. -+ -+2014-04-25 Richard Biener <rguenther@suse.de> -+ -+ PR ipa/60911 -+ * passes.c (apply_ipa_transforms): Inline into only caller ... -+ (execute_one_pass): ... here. Properly bring in function -+ bodies for nodes we want to apply IPA transforms to. -+ -+2014-04-24 Jakub Jelinek <jakub@redhat.com> -+ -+ * tree.h (OMP_CLAUSE_LINEAR_GIMPLE_SEQ): Define. -+ * gimplify.c (omp_is_private): Change last argument's type to int. -+ Only diagnose lastprivate if the simd argument is 1, only diagnose -+ linear if the simd argument is 2. -+ (gimplify_omp_for): Adjust omp_is_private callers. When adding -+ lastprivate or private, add the clause to OMP_FOR_CLAUSES. Pass -+ GOVD_EXPLICIT to omp_add_variable. For simd with collapse == 1 -+ create OMP_CLAUSE_LINEAR rather than OMP_CLAUSE_PRIVATE for var. -+ If var != decl and decl is in OMP_CLAUSE_LINEAR, gimplify decl -+ increment to OMP_CLAUSE_LINEAR_GIMPLE_SEQ. -+ * omp-low.c (scan_sharing_clauses, lower_lastprivate_clauses): Handle -+ OMP_CLAUSE_LINEAR_GIMPLE_SEQ. -+ * tree-nested.c (convert_nonlocal_omp_clauses, -+ convert_local_omp_clauses): Handle OMP_CLAUSE_LINEAR. -+ -+2014-04-23 Uros Bizjak <ubizjak@gmail.com> -+ -+ Backport from mainline -+ 2014-04-21 Uros Bizjak <ubizjak@gmail.com> -+ -+ PR target/60909 -+ * config/i386/i386.c (ix86_expand_builtin) -+ <case IX86_BUILTIN_RDRAND{16,32,64}_STEP>: Use temporary -+ register for target RTX. -+ <case IX86_BUILTIN_RDSEED{16,32,64}_STEP>: Ditto. -+ -+2014-04-23 Richard Biener <rguenther@suse.de> -+ -+ PR tree-optimization/60903 -+ * tree-ssa-loop-im.c (analyze_memory_references): Remove -+ commented code block. -+ (execute_sm_if_changed): Properly apply IRREDUCIBLE_LOOP -+ loop flags to newly created BBs and edges. -+ -+2014-04-23 Nick Clifton <nickc@redhat.com> -+ -+ * config/msp430/msp430.c (msp430_handle_option): Move function -+ to msp430-common.c -+ (msp430_option_override): Simplify mcu and mcpu option handling. -+ (msp430_is_f5_mcu): Rename to msp430_use_f5_series_hwmult. Add -+ support for -mhwmult command line option. -+ (has_32bit_hwmult): Rename to use_32bit_hwmult. Add support for -+ -mhwmult command line option. -+ (msp430_hwmult_enabled): Delete. -+ (msp43o_output_labelref): Add support for -mhwmult command line -+ option. -+ * config/msp430/msp430.md (mulhisi3, umulhisi3, mulsidi3) -+ (umulsidi3): Likewise. -+ * config/msp430/msp430.opt (mmcu): Add Report attribute. -+ (mcpu, mlarge, msmall): Likewise. -+ (mhwmult): New option. -+ * config/msp430/msp430-protos.h (msp430_hwmult_enabled): Remove -+ prototype. -+ (msp430_is_f5_mcu): Remove prototype. -+ (msp430_use_f5_series_hwmult): Add prototype. -+ * config/msp430/msp430-opts.h: New file. -+ * common/config/msp430: New directory. -+ * common/config/msp430/msp430-common.c: New file. -+ * config.gcc (msp430): Remove target_has_targetm_common. -+ * doc/invoke.texi: Document -mhwmult command line option. -+ -+2014-04-23 Nick Clifton <nickc@redhat.com> -+ -+ * config/i386/cygwin.h (ENDFILE_SPEC): Include -+ default-manifest.o if it can be found in the search path. -+ * config/i386/mingw32.h (ENDFILE_SPEC): Likewise. -+ -+2014-04-23 Richard Biener <rguenther@suse.de> -+ -+ Backport from mainline -+ 2014-04-14 Richard Biener <rguenther@suse.de> -+ -+ PR lto/60720 -+ * lto-streamer-out.c (wrap_refs): New function. -+ (lto_output): Wrap symbol references in global initializes in -+ type-preserving MEM_REFs. -+ -+2014-04-23 Richard Biener <rguenther@suse.de> -+ -+ PR middle-end/60895 -+ * tree-inline.c (declare_return_variable): Use mark_addressable. -+ -+2014-04-23 Richard Biener <rguenther@suse.de> -+ -+ PR middle-end/60891 -+ * loop-init.c (loop_optimizer_init): Make sure to apply -+ LOOPS_MAY_HAVE_MULTIPLE_LATCHES before fixing up loops. -+ -+2014-04-22 Michael Meissner <meissner@linux.vnet.ibm.com> -+ -+ Backport from mainline -+ 2014-04-21 Michael Meissner <meissner@linux.vnet.ibm.com> -+ -+ PR target/60735 -+ * config/rs6000/rs6000.md (mov<mode>_softfloat32, FMOVE64 case): -+ If mode is DDmode and TARGET_E500_DOUBLE allow move. -+ -+ * config/rs6000/rs6000.c (rs6000_debug_reg_global): Print some -+ more debug information for E500 if -mdebug=reg. -+ -+2014-04-22 H.J. Lu <hongjiu.lu@intel.com> -+ -+ Backport from mainline -+ 2014-04-22 H.J. Lu <hongjiu.lu@intel.com> -+ -+ PR target/60868 -+ * config/i386/i386.c (ix86_expand_set_or_movmem): Call counter_mode -+ on count_exp to get mode. -+ -+2014-04-22 Bill Schmidt <wschmidt@linux.vnet.ibm.com> -+ -+ * config/rs6000/vsx.md (vsx_xxmrghw_<mode>): Adjust for -+ little-endian. -+ (vsx_xxmrglw_<mode>): Likewise. -+ -+2014-04-22 Richard Biener <rguenther@suse.de> -+ -+ Backport from mainline -+ 2014-04-14 Richard Biener <rguenther@suse.de> -+ -+ PR middle-end/55022 -+ * fold-const.c (negate_expr_p): Don't negate directional rounding -+ division. -+ (fold_negate_expr): Likewise. -+ -+2014-04-22 Richard Biener <rguenther@suse.de> -+ -+ Backport from mainline -+ 2014-04-17 Richard Biener <rguenther@suse.de> -+ -+ PR middle-end/60849 -+ * tree-ssa-propagate.c (valid_gimple_rhs_p): Only allow effective -+ boolean results for comparisons. -+ -+2014-04-22 Richard Biener <rguenther@suse.de> -+ -+ Backport from mainline -+ 2014-04-17 Richard Biener <rguenther@suse.de> -+ -+ PR tree-optimization/60841 -+ * tree-vect-data-refs.c (vect_analyze_data_refs): Count stmts. -+ * tree-vect-loop.c (vect_analyze_loop_2): Pass down number -+ of stmts to SLP build. -+ * tree-vect-slp.c (vect_slp_analyze_bb_1): Likewise. -+ (vect_analyze_slp): Likewise. -+ (vect_analyze_slp_instance): Likewise. -+ (vect_build_slp_tree): Limit overall SLP tree growth. -+ * tree-vectorizer.h (vect_analyze_data_refs, -+ vect_analyze_slp): Adjust prototypes. -+ -+2014-04-22 Richard Biener <rguenther@suse.de> -+ -+ Backport from mainline -+ 2014-04-17 Richard Biener <rguenther@suse.de> -+ -+ PR tree-optimization/60836 -+ * tree-vect-loop.c (vect_create_epilog_for_reduction): Force -+ initial PHI args to be gimple values. -+ -+2014-04-22 Richard Biener <rguenther@suse.de> -+ -+ Backport from mainline -+ 2014-04-14 Richard Biener <rguenther@suse.de> -+ -+ PR tree-optimization/59817 -+ PR tree-optimization/60453 -+ * graphite-scop-detection.c (graphite_can_represent_scev): Complete -+ recursion to catch all CHRECs in the scalar evolution and restrict -+ the predicate for the remains appropriately. -+ -+2014-04-22 Jakub Jelinek <jakub@redhat.com> -+ -+ PR tree-optimization/60823 -+ * omp-low.c (ipa_simd_modify_function_body): Go through -+ all SSA_NAMEs and for those refering to vector arguments -+ which are going to be replaced adjust SSA_NAME_VAR and, -+ if it is a default definition, change it into a non-default -+ definition assigned at the beginning of function from new_decl. -+ (ipa_simd_modify_stmt_ops): Rewritten. -+ * tree-dfa.c (set_ssa_default_def): When removing default def, -+ check for NULL loc instead of NULL *loc. -+ -+2014-04-22 Lin Zuojian <manjian2006@gmail.com> -+ -+ PR middle-end/60281 -+ * asan.c (asan_emit_stack_protection): Force the base to align to -+ appropriate bits if STRICT_ALIGNMENT. Set shadow_mem align to -+ appropriate bits if STRICT_ALIGNMENT. -+ * cfgexpand.c (expand_stack_vars): Set base_align appropriately -+ when asan is on. -+ (expand_used_vars): Leave a space in the stack frame for alignment -+ if STRICT_ALIGNMENT. -+ -+2014-04-22 Jakub Jelinek <jakub@redhat.com> -+ -+ Backported from mainline -+ 2014-04-16 Jakub Jelinek <jakub@redhat.com> -+ -+ PR tree-optimization/60844 -+ * tree-ssa-reassoc.c (reassoc_remove_stmt): New function. -+ (propagate_op_to_single_use, remove_visited_stmt_chain, -+ linearize_expr, repropagate_negates, reassociate_bb): Use it -+ instead of gsi_remove. -+ - 2014-04-22 Release Manager - - * GCC 4.9.0 released. -@@ -59,8 +1704,7 @@ - 2014-04-11 Tobias Burnus <burnus@net-b.de> - - PR other/59055 -- * doc/bugreport.texi (Bugs): Remove nodes pointing to the -- nirvana. -+ * doc/bugreport.texi (Bugs): Remove nodes pointing to the nirvana. - * doc/gcc.texi (Service): Update description in the @menu - * doc/invoke.texi (Option Summary): Remove misplaced and - duplicated @menu. -@@ -86,15 +1730,14 @@ - 2014-04-11 Jakub Jelinek <jakub@redhat.com> - - PR rtl-optimization/60663 -- * cse.c (cse_insn): Set src_volatile on ASM_OPERANDS in -- PARALLEL. -+ * cse.c (cse_insn): Set src_volatile on ASM_OPERANDS in PARALLEL. - - 2014-04-10 Jan Hubicka <hubicka@ucw.cz> - Jakub Jelinek <jakub@redhat.com> - - PR lto/60567 -- * ipa.c (function_and_variable_visibility): Copy forced_by_abi flag from -- decl_node to node. -+ * ipa.c (function_and_variable_visibility): Copy forced_by_abi -+ flag from decl_node to node. - - 2014-04-10 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com> - -@@ -212,9 +1855,10 @@ - - 2014-04-05 Pitchumani Sivanupandi <Pitchumani.S@atmel.com> - -- * config/avr/avr-arch.h (avr_mcu_t): Add dev_attribute field to have device -- specific ISA/ feature information. Remove short_sp and errata_skip ds. -- Add avr_device_specific_features enum to have device specific info. -+ * config/avr/avr-arch.h (avr_mcu_t): Add dev_attribute field to have -+ device specific ISA/ feature information. Remove short_sp and -+ errata_skip ds. Add avr_device_specific_features enum to have device -+ specific info. - * config/avr/avr-c.c (avr_cpu_cpp_builtins): use dev_attribute to check - errata_skip. Add __AVR_ISA_RMW__ builtin macro if RMW ISA available. - * config/avr/avr-devices.c (avr_mcu_types): Update AVR_MCU macro for -@@ -282,21 +1926,21 @@ - 2014-04-04 Martin Jambor <mjambor@suse.cz> - - PR ipa/60640 -- * cgraph.h (cgraph_clone_node): New parameter added to declaration. -- Adjust all callers. -+ * cgraph.h (cgraph_clone_node): New parameter added to declaration. -+ Adjust all callers. - * cgraph.c (clone_of_p): Also return true if thunks match. - (verify_edge_corresponds_to_fndecl): Removed extraneous call to - cgraph_function_or_thunk_node and an obsolete comment. -- * cgraphclones.c (build_function_type_skip_args): Moved upwards in the -- file. -- (build_function_decl_skip_args): Likewise. -+ * cgraphclones.c (build_function_type_skip_args): Moved upwards in the -+ file. -+ (build_function_decl_skip_args): Likewise. - (set_new_clone_decl_and_node_flags): New function. -- (duplicate_thunk_for_node): Likewise. -- (redirect_edge_duplicating_thunks): Likewise. -- (cgraph_clone_node): New parameter args_to_skip, pass it to -- redirect_edge_duplicating_thunks which is called instead of -- cgraph_redirect_edge_callee. -- (cgraph_create_virtual_clone): Pass args_to_skip to cgraph_clone_node, -+ (duplicate_thunk_for_node): Likewise. -+ (redirect_edge_duplicating_thunks): Likewise. -+ (cgraph_clone_node): New parameter args_to_skip, pass it to -+ redirect_edge_duplicating_thunks which is called instead of -+ cgraph_redirect_edge_callee. -+ (cgraph_create_virtual_clone): Pass args_to_skip to cgraph_clone_node, - moved setting of a lot of flags to set_new_clone_decl_and_node_flags. - - 2014-04-04 Jeff Law <law@redhat.com> -@@ -334,8 +1978,8 @@ - - PR tree-optimization/60505 - * tree-vectorizer.h (struct _stmt_vec_info): Add th field as the -- threshold of number of iterations below which no vectorization will be -- done. -+ threshold of number of iterations below which no vectorization -+ will be done. - * tree-vect-loop.c (new_loop_vec_info): - Initialize LOOP_VINFO_COST_MODEL_THRESHOLD. - * tree-vect-loop.c (vect_analyze_loop_operations): -@@ -347,8 +1991,7 @@ - - 2014-04-03 Richard Biener <rguenther@suse.de> - -- * tree-streamer.h (struct streamer_tree_cache_d): Add next_idx -- member. -+ * tree-streamer.h (struct streamer_tree_cache_d): Add next_idx member. - (streamer_tree_cache_create): Adjust. - * tree-streamer.c (streamer_tree_cache_add_to_node_array): Adjust - to allow optional nodes array. -@@ -359,8 +2002,7 @@ - * lto-streamer-out.c (create_output_block): Avoid maintaining - the node array in the writer cache. - (DFS_write_tree): Remove assertion. -- (produce_asm_for_decls): Free the out decl state hash table -- early. -+ (produce_asm_for_decls): Free the out decl state hash table early. - * lto-streamer-in.c (lto_data_in_create): Adjust for - streamer_tree_cache_create prototype change. - -@@ -381,24 +2023,6 @@ - (Weffc++): Remove Scott's numbering, merge lists and reference - Wnon-virtual-dtor. - -- c-family/ -- -- cp/ -- * class.c (accessible_nvdtor_p): New. -- (check_bases): Don't check base destructor here ... -- (check_bases_and_members): ... check them here. Trigger on -- Wnon-virtual-dtor flag. -- (finish_struct_1): Use accessible_nvdtor_p. -- -- testsuite/ -- * g++.dg/warn/Wnvdtor.C: Add non-polymorphic case. -- * g++.dg/warn/Wnvdtor-2.C: New. -- * g++.dg/warn/Wnvdtor-3.C: New. -- * g++.dg/warn/Wnvdtor-4.C: New. -- * g++.dg/warn/Weff1.C: Delete. -- * g++.old-deja/g++.benjamin/15309-1.C: Delete. -- * g++.old-deja/g++.benjamin/15309-2.C: Delete. -- - 2014-04-03 Nick Clifton <nickc@redhat.com> - - * config/rl78/rl78-expand.md (movqi): Handle (SUBREG (SYMBOL_REF)) -@@ -414,8 +2038,8 @@ - 2014-04-02 Jan Hubicka <hubicka@ucw.cz> - - PR ipa/60659 -- * ipa-devirt.c (get_polymorphic_call_info): Do not ICE on type inconsistent -- code and instead mark the context inconsistent. -+ * ipa-devirt.c (get_polymorphic_call_info): Do not ICE on type -+ inconsistent code and instead mark the context inconsistent. - (possible_polymorphic_call_targets): For inconsistent contexts - return empty complete list. - -@@ -519,8 +2143,7 @@ - - 2014-04-01 Richard Biener <rguenther@suse.de> - -- * gimple.h (struct gimple_statement_base): Align subcode to -- 16 bits. -+ * gimple.h (struct gimple_statement_base): Align subcode to 16 bits. - - 2014-04-01 Sebastian Huber <sebastian.huber@embedded-brains.de> - -@@ -1031,10 +2654,10 @@ - - PR tree-optimization/60577 - * tree-core.h (struct tree_base): Document nothrow_flag use -- in VAR_DECL_NONALIASED. -- * tree.h (VAR_DECL_NONALIASED): New. -+ in DECL_NONALIASED. -+ * tree.h (DECL_NONALIASED): New. - (may_be_aliased): Adjust. -- * coverage.c (build_var): Set VAR_DECL_NONALIASED. -+ * coverage.c (build_var): Set DECL_NONALIASED. - - 2014-03-20 Eric Botcazou <ebotcazou@adacore.com> - -Index: gcc/testsuite/gcc.target/powerpc/dfp-builtin-1.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/powerpc/dfp-builtin-1.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/powerpc/dfp-builtin-1.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,88 @@ -+/* { dg-do compile { target { powerpc*-*-linux* } } } */ -+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */ -+/* { dg-skip-if "" { powerpc*-*-*spe* } { "*" } { "" } } */ -+/* { dg-require-effective-target powerpc_vsx_ok } */ -+/* { dg-options "-mcpu=power7 -O2" } */ -+/* { dg-final { scan-assembler-times "ddedpd " 4 } } */ -+/* { dg-final { scan-assembler-times "denbcd " 2 } } */ -+/* { dg-final { scan-assembler-times "dxex " 1 } } */ -+/* { dg-final { scan-assembler-times "diex " 1 } } */ -+/* { dg-final { scan-assembler-times "dscli " 2 } } */ -+/* { dg-final { scan-assembler-times "dscri " 2 } } */ -+/* { dg-final { scan-assembler-not "bl __builtin" } } */ -+/* { dg-final { scan-assembler-not "dctqpq" } } */ -+/* { dg-final { scan-assembler-not "drdpq" } } */ -+/* { dg-final { scan-assembler-not "stfd" } } */ -+/* { dg-final { scan-assembler-not "lfd" } } */ -+ -+_Decimal64 -+do_dedpd_0 (_Decimal64 a) -+{ -+ return __builtin_ddedpd (0, a); -+} -+ -+_Decimal64 -+do_dedpd_1 (_Decimal64 a) -+{ -+ return __builtin_ddedpd (1, a); -+} -+ -+_Decimal64 -+do_dedpd_2 (_Decimal64 a) -+{ -+ return __builtin_ddedpd (2, a); -+} -+ -+_Decimal64 -+do_dedpd_3 (_Decimal64 a) -+{ -+ return __builtin_ddedpd (3, a); -+} -+ -+_Decimal64 -+do_enbcd_0 (_Decimal64 a) -+{ -+ return __builtin_denbcd (0, a); -+} -+ -+_Decimal64 -+do_enbcd_1 (_Decimal64 a) -+{ -+ return __builtin_denbcd (1, a); -+} -+ -+_Decimal64 -+do_xex (_Decimal64 a) -+{ -+ return __builtin_dxex (a); -+} -+ -+_Decimal64 -+do_iex (_Decimal64 a, _Decimal64 b) -+{ -+ return __builtin_diex (a, b); -+} -+ -+_Decimal64 -+do_scli_1 (_Decimal64 a) -+{ -+ return __builtin_dscli (a, 1); -+} -+ -+_Decimal64 -+do_scli_10 (_Decimal64 a) -+{ -+ return __builtin_dscli (a, 10); -+} -+ -+_Decimal64 -+do_scri_1 (_Decimal64 a) -+{ -+ return __builtin_dscri (a, 1); -+} -+ -+_Decimal64 -+do_scri_10 (_Decimal64 a) -+{ -+ return __builtin_dscri (a, 10); -+} -Index: gcc/testsuite/gcc.target/powerpc/dfp-builtin-2.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/powerpc/dfp-builtin-2.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/powerpc/dfp-builtin-2.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,88 @@ -+/* { dg-do compile { target { powerpc*-*-linux* } } } */ -+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */ -+/* { dg-skip-if "" { powerpc*-*-*spe* } { "*" } { "" } } */ -+/* { dg-require-effective-target powerpc_vsx_ok } */ -+/* { dg-options "-mcpu=power7 -O2" } */ -+/* { dg-final { scan-assembler-times "ddedpdq " 4 } } */ -+/* { dg-final { scan-assembler-times "denbcdq " 2 } } */ -+/* { dg-final { scan-assembler-times "dxexq " 1 } } */ -+/* { dg-final { scan-assembler-times "diexq " 1 } } */ -+/* { dg-final { scan-assembler-times "dscliq " 2 } } */ -+/* { dg-final { scan-assembler-times "dscriq " 2 } } */ -+/* { dg-final { scan-assembler-not "bl __builtin" } } */ -+/* { dg-final { scan-assembler-not "dctqpq" } } */ -+/* { dg-final { scan-assembler-not "drdpq" } } */ -+/* { dg-final { scan-assembler-not "stfd" } } */ -+/* { dg-final { scan-assembler-not "lfd" } } */ -+ -+_Decimal128 -+do_dedpdq_0 (_Decimal128 a) -+{ -+ return __builtin_ddedpdq (0, a); -+} -+ -+_Decimal128 -+do_dedpdq_1 (_Decimal128 a) -+{ -+ return __builtin_ddedpdq (1, a); -+} -+ -+_Decimal128 -+do_dedpdq_2 (_Decimal128 a) -+{ -+ return __builtin_ddedpdq (2, a); -+} -+ -+_Decimal128 -+do_dedpdq_3 (_Decimal128 a) -+{ -+ return __builtin_ddedpdq (3, a); -+} -+ -+_Decimal128 -+do_enbcdq_0 (_Decimal128 a) -+{ -+ return __builtin_denbcdq (0, a); -+} -+ -+_Decimal128 -+do_enbcdq_1 (_Decimal128 a) -+{ -+ return __builtin_denbcdq (1, a); -+} -+ -+_Decimal128 -+do_xexq (_Decimal128 a) -+{ -+ return __builtin_dxexq (a); -+} -+ -+_Decimal128 -+do_iexq (_Decimal128 a, _Decimal128 b) -+{ -+ return __builtin_diexq (a, b); -+} -+ -+_Decimal128 -+do_scliq_1 (_Decimal128 a) -+{ -+ return __builtin_dscliq (a, 1); -+} -+ -+_Decimal128 -+do_scliq_10 (_Decimal128 a) -+{ -+ return __builtin_dscliq (a, 10); -+} -+ -+_Decimal128 -+do_scriq_1 (_Decimal128 a) -+{ -+ return __builtin_dscriq (a, 1); -+} -+ -+_Decimal128 -+do_scriq_10 (_Decimal128 a) -+{ -+ return __builtin_dscriq (a, 10); -+} -Index: gcc/testsuite/gcc.target/powerpc/bcd-1.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/powerpc/bcd-1.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/powerpc/bcd-1.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,27 @@ -+/* { dg-do compile { target { powerpc*-*-linux* } } } */ -+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */ -+/* { dg-skip-if "" { powerpc*-*-*spe* } { "*" } { "" } } */ -+/* { dg-require-effective-target powerpc_vsx_ok } */ -+/* { dg-options "-mcpu=power7 -O2" } */ -+/* { dg-final { scan-assembler-times "cdtbcd " 1 } } */ -+/* { dg-final { scan-assembler-times "cbcdtd " 1 } } */ -+/* { dg-final { scan-assembler-times "addg6s " 1 } } */ -+/* { dg-final { scan-assembler-not "bl __builtin" } } */ -+ -+unsigned int -+to_bcd (unsigned int a) -+{ -+ return __builtin_cdtbcd (a); -+} -+ -+unsigned int -+from_bcd (unsigned int a) -+{ -+ return __builtin_cbcdtd (a); -+} -+ -+unsigned int -+bcd_arith (unsigned int a, unsigned int b) -+{ -+ return __builtin_addg6s (a, b); -+} -Index: gcc/testsuite/gcc.target/powerpc/pr60735.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/powerpc/pr60735.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/powerpc/pr60735.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,11 @@ -+/* { dg-do compile } */ -+/* { dg-options "-mcpu=8548 -mspe -mabi=spe -O2" } */ -+/* { dg-skip-if "not an SPE target" { ! powerpc_spe_nocache } { "*" } { "" } } */ -+ -+/* In PR60735, the type _Decimal64 generated an insn not found message. */ -+ -+void -+pr60735 (_Decimal64 *p, _Decimal64 *q) -+{ -+ *p = *q; -+} -Index: gcc/testsuite/gcc.target/powerpc/extend-divide-1.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/powerpc/extend-divide-1.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/powerpc/extend-divide-1.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,34 @@ -+/* { dg-do compile { target { powerpc*-*-linux* } } } */ -+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */ -+/* { dg-skip-if "" { powerpc*-*-*spe* } { "*" } { "" } } */ -+/* { dg-require-effective-target powerpc_vsx_ok } */ -+/* { dg-options "-mcpu=power7 -O2" } */ -+/* { dg-final { scan-assembler-times "divwe " 1 } } */ -+/* { dg-final { scan-assembler-times "divweo " 1 } } */ -+/* { dg-final { scan-assembler-times "divweu " 1 } } */ -+/* { dg-final { scan-assembler-times "divweuo " 1 } } */ -+/* { dg-final { scan-assembler-not "bl __builtin" } } */ -+ -+int -+div_we (int a, int b) -+{ -+ return __builtin_divwe (a, b); -+} -+ -+int -+div_weo (int a, int b) -+{ -+ return __builtin_divweo (a, b); -+} -+ -+unsigned int -+div_weu (unsigned int a, unsigned int b) -+{ -+ return __builtin_divweu (a, b); -+} -+ -+unsigned int -+div_weuo (unsigned int a, unsigned int b) -+{ -+ return __builtin_divweuo (a, b); -+} -Index: gcc/testsuite/gcc.target/powerpc/bcd-2.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/powerpc/bcd-2.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/powerpc/bcd-2.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,44 @@ -+/* { dg-do compile { target { powerpc*-*-linux* && lp64 } } } */ -+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */ -+/* { dg-skip-if "" { powerpc*-*-*spe* } { "*" } { "" } } */ -+/* { dg-require-effective-target powerpc_p8vector_ok } */ -+/* { dg-options "-mcpu=power8 -O2" } */ -+/* { dg-final { scan-assembler-times "bcdadd\[.\] " 2 } } */ -+/* { dg-final { scan-assembler-times "bcdsub\[.\] " 2 } } */ -+/* { dg-final { scan-assembler-not "bl __builtin" } } */ -+/* { dg-final { scan-assembler-not "mtvsr" } } */ -+/* { dg-final { scan-assembler-not "mfvsr" } } */ -+/* { dg-final { scan-assembler-not "lvx" } } */ -+/* { dg-final { scan-assembler-not "lxvw4x" } } */ -+/* { dg-final { scan-assembler-not "lxvd2x" } } */ -+/* { dg-final { scan-assembler-not "stvx" } } */ -+/* { dg-final { scan-assembler-not "stxvw4x" } } */ -+/* { dg-final { scan-assembler-not "stxvd2x" } } */ -+ -+typedef __int128_t __attribute__((__vector_size__(16))) vector_128_t; -+typedef __int128_t scalar_128_t; -+typedef unsigned long long scalar_64_t; -+ -+vector_128_t -+do_add_0 (vector_128_t a, vector_128_t b) -+{ -+ return __builtin_bcdadd (a, b, 0); -+} -+ -+vector_128_t -+do_add_1 (vector_128_t a, vector_128_t b) -+{ -+ return __builtin_bcdadd (a, b, 1); -+} -+ -+vector_128_t -+do_sub_0 (vector_128_t a, vector_128_t b) -+{ -+ return __builtin_bcdsub (a, b, 0); -+} -+ -+vector_128_t -+do_sub_1 (vector_128_t a, vector_128_t b) -+{ -+ return __builtin_bcdsub (a, b, 1); -+} -Index: gcc/testsuite/gcc.target/powerpc/extend-divide-2.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/powerpc/extend-divide-2.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/powerpc/extend-divide-2.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,34 @@ -+/* { dg-do compile { target { powerpc*-*-linux* && lp64 } } } */ -+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */ -+/* { dg-skip-if "" { powerpc*-*-*spe* } { "*" } { "" } } */ -+/* { dg-require-effective-target powerpc_vsx_ok } */ -+/* { dg-options "-mcpu=power7 -O2" } */ -+/* { dg-final { scan-assembler-times "divde " 1 } } */ -+/* { dg-final { scan-assembler-times "divdeo " 1 } } */ -+/* { dg-final { scan-assembler-times "divdeu " 1 } } */ -+/* { dg-final { scan-assembler-times "divdeuo " 1 } } */ -+/* { dg-final { scan-assembler-not "bl __builtin" } } */ -+ -+long -+div_de (long a, long b) -+{ -+ return __builtin_divde (a, b); -+} -+ -+long -+div_deo (long a, long b) -+{ -+ return __builtin_divdeo (a, b); -+} -+ -+unsigned long -+div_deu (unsigned long a, unsigned long b) -+{ -+ return __builtin_divdeu (a, b); -+} -+ -+unsigned long -+div_deuo (unsigned long a, unsigned long b) -+{ -+ return __builtin_divdeuo (a, b); -+} -Index: gcc/testsuite/gcc.target/powerpc/pack01.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/powerpc/pack01.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/powerpc/pack01.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,91 @@ -+/* { dg-do run { target { powerpc*-*-linux* && lp64 } } } */ -+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */ -+/* { dg-skip-if "" { powerpc*-*-*spe* } { "*" } { "" } } */ -+/* { dg-require-effective-target p8vector_hw } */ -+/* { dg-options "-mcpu=power8 -O2" } */ -+ -+#include <stddef.h> -+#include <stdlib.h> -+#include <altivec.h> -+ -+#ifdef DEBUG -+#include <stdio.h> -+#endif -+ -+typedef __int128_t __attribute__((__vector_size__(16))) vector_128_t; -+typedef __int128_t scalar_128_t; -+typedef unsigned long long scalar_64_t; -+ -+volatile scalar_64_t one = 1; -+volatile scalar_64_t two = 2; -+ -+int -+main (void) -+{ -+ scalar_128_t a = (((scalar_128_t)one) << 64) | ((scalar_128_t)two); -+ vector_128_t v1 = (vector_128_t) { a }; -+ vector_128_t v2 = __builtin_pack_vector_int128 (one, two); -+ scalar_64_t x0 = __builtin_unpack_vector_int128 (v1, 0); -+ scalar_64_t x1 = __builtin_unpack_vector_int128 (v1, 1); -+ vector_128_t v3 = __builtin_pack_vector_int128 (x0, x1); -+ -+ size_t i; -+ union { -+ scalar_128_t i128; -+ vector_128_t v128; -+ scalar_64_t u64; -+ unsigned char uc[sizeof (scalar_128_t)]; -+ char c[sizeof (scalar_128_t)]; -+ } u, u2; -+ -+#ifdef DEBUG -+ { -+ printf ("a = 0x"); -+ u.i128 = a; -+ for (i = 0; i < sizeof (scalar_128_t); i++) -+ printf ("%.2x", u.uc[i]); -+ -+ printf ("\nv1 = 0x"); -+ u.v128 = v1; -+ for (i = 0; i < sizeof (scalar_128_t); i++) -+ printf ("%.2x", u.uc[i]); -+ -+ printf ("\nv2 = 0x"); -+ u.v128 = v2; -+ for (i = 0; i < sizeof (scalar_128_t); i++) -+ printf ("%.2x", u.uc[i]); -+ -+ printf ("\nv3 = 0x"); -+ u.v128 = v3; -+ for (i = 0; i < sizeof (scalar_128_t); i++) -+ printf ("%.2x", u.uc[i]); -+ -+ printf ("\nx0 = 0x"); -+ u.u64 = x0; -+ for (i = 0; i < sizeof (scalar_64_t); i++) -+ printf ("%.2x", u.uc[i]); -+ -+ printf ("\nx1 = 0x"); -+ u.u64 = x1; -+ for (i = 0; i < sizeof (scalar_64_t); i++) -+ printf ("%.2x", u.uc[i]); -+ -+ printf ("\n"); -+ } -+#endif -+ -+ u2.i128 = a; -+ u.v128 = v1; -+ if (memcmp (u.c, u2.c, sizeof (scalar_128_t)) != 0) -+ abort (); -+ -+ u.v128 = v2; -+ if (memcmp (u.c, u2.c, sizeof (scalar_128_t)) != 0) -+ abort (); -+ -+ u.v128 = v3; -+ if (memcmp (u.c, u2.c, sizeof (scalar_128_t)) != 0) -+ abort (); -+ -+ return 0; -+} -Index: gcc/testsuite/gcc.target/powerpc/bcd-3.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/powerpc/bcd-3.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/powerpc/bcd-3.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,103 @@ -+/* { dg-do compile { target { powerpc*-*-linux* && lp64 } } } */ -+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */ -+/* { dg-skip-if "" { powerpc*-*-*spe* } { "*" } { "" } } */ -+/* { dg-require-effective-target powerpc_p8vector_ok } */ -+/* { dg-options "-mcpu=power8 -O2" } */ -+/* { dg-final { scan-assembler-times "bcdadd\[.\] " 4 } } */ -+/* { dg-final { scan-assembler-times "bcdsub\[.\] " 4 } } */ -+/* { dg-final { scan-assembler-not "bl __builtin" } } */ -+/* { dg-final { scan-assembler-not "mtvsr" } } */ -+/* { dg-final { scan-assembler-not "mfvsr" } } */ -+/* { dg-final { scan-assembler-not "lvx" } } */ -+/* { dg-final { scan-assembler-not "lxvw4x" } } */ -+/* { dg-final { scan-assembler-not "lxvd2x" } } */ -+/* { dg-final { scan-assembler-not "stvx" } } */ -+/* { dg-final { scan-assembler-not "stxvw4x" } } */ -+/* { dg-final { scan-assembler-not "stxvd2x" } } */ -+ -+typedef __int128_t __attribute__((__vector_size__(16))) vector_128_t; -+typedef __int128_t scalar_128_t; -+typedef unsigned long long scalar_64_t; -+ -+/* Test whether the peephole works to allow folding a bcdadd, with a -+ bcdadd_<test> into a single instruction. */ -+ -+vector_128_t -+do_add_lt (vector_128_t a, vector_128_t b, int *p) -+{ -+ vector_128_t ret = __builtin_bcdadd (a, b, 0); -+ if (__builtin_bcdadd_lt (a, b, 0)) -+ *p = 1; -+ -+ return ret; -+} -+ -+vector_128_t -+do_add_eq (vector_128_t a, vector_128_t b, int *p) -+{ -+ vector_128_t ret = __builtin_bcdadd (a, b, 0); -+ if (__builtin_bcdadd_eq (a, b, 0)) -+ *p = 1; -+ -+ return ret; -+} -+ -+vector_128_t -+do_add_gt (vector_128_t a, vector_128_t b, int *p) -+{ -+ vector_128_t ret = __builtin_bcdadd (a, b, 0); -+ if (__builtin_bcdadd_gt (a, b, 0)) -+ *p = 1; -+ -+ return ret; -+} -+ -+vector_128_t -+do_add_ov (vector_128_t a, vector_128_t b, int *p) -+{ -+ vector_128_t ret = __builtin_bcdadd (a, b, 0); -+ if (__builtin_bcdadd_ov (a, b, 0)) -+ *p = 1; -+ -+ return ret; -+} -+ -+vector_128_t -+do_sub_lt (vector_128_t a, vector_128_t b, int *p) -+{ -+ vector_128_t ret = __builtin_bcdsub (a, b, 0); -+ if (__builtin_bcdsub_lt (a, b, 0)) -+ *p = 1; -+ -+ return ret; -+} -+ -+vector_128_t -+do_sub_eq (vector_128_t a, vector_128_t b, int *p) -+{ -+ vector_128_t ret = __builtin_bcdsub (a, b, 0); -+ if (__builtin_bcdsub_eq (a, b, 0)) -+ *p = 1; -+ -+ return ret; -+} -+ -+vector_128_t -+do_sub_gt (vector_128_t a, vector_128_t b, int *p) -+{ -+ vector_128_t ret = __builtin_bcdsub (a, b, 0); -+ if (__builtin_bcdsub_gt (a, b, 0)) -+ *p = 1; -+ -+ return ret; -+} -+ -+vector_128_t -+do_sub_ov (vector_128_t a, vector_128_t b, int *p) -+{ -+ vector_128_t ret = __builtin_bcdsub (a, b, 0); -+ if (__builtin_bcdsub_ov (a, b, 0)) -+ *p = 1; -+ -+ return ret; -+} -Index: gcc/testsuite/gcc.target/powerpc/tfmode_off.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/powerpc/tfmode_off.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/powerpc/tfmode_off.c (.../branches/gcc-4_9-branch) -@@ -1,6 +1,7 @@ - /* { dg-do assemble } */ - /* { dg-skip-if "" { powerpc-ibm-aix* } { "*" } { "" } } */ - /* { dg-skip-if "no TFmode" { powerpc-*-eabi* } { "*" } { "" } } */ -+/* { dg-require-effective-target longdouble128 } */ - /* { dg-options "-O2 -fno-align-functions -mtraceback=no -save-temps" } */ - - typedef float TFmode __attribute__ ((mode (TF))); -Index: gcc/testsuite/gcc.target/powerpc/pack02.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/powerpc/pack02.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/powerpc/pack02.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,96 @@ -+/* { dg-do run { target { powerpc*-*-linux* } } } */ -+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */ -+/* { dg-skip-if "" { powerpc*-*-*spe* } { "*" } { "" } } */ -+/* { dg-require-effective-target powerpc_fprs } */ -+/* { dg-require-effective-target longdouble128 } */ -+/* { dg-options "-O2 -mhard-float" } */ -+ -+#include <stddef.h> -+#include <stdlib.h> -+#include <math.h> -+ -+#ifdef DEBUG -+#include <stdio.h> -+#endif -+ -+int -+main (void) -+{ -+ double high = pow (2.0, 60); -+ double low = 2.0; -+ long double a = ((long double)high) + ((long double)low); -+ double x0 = __builtin_unpack_longdouble (a, 0); -+ double x1 = __builtin_unpack_longdouble (a, 1); -+ long double b = __builtin_pack_longdouble (x0, x1); -+ -+#ifdef DEBUG -+ { -+ size_t i; -+ union { -+ long double ld; -+ double d; -+ unsigned char uc[sizeof (long double)]; -+ char c[sizeof (long double)]; -+ } u; -+ -+ printf ("a = 0x"); -+ u.ld = a; -+ for (i = 0; i < sizeof (long double); i++) -+ printf ("%.2x", u.uc[i]); -+ -+ printf (", %Lg\n", a); -+ -+ printf ("b = 0x"); -+ u.ld = b; -+ for (i = 0; i < sizeof (long double); i++) -+ printf ("%.2x", u.uc[i]); -+ -+ printf (", %Lg\n", b); -+ -+ printf ("hi = 0x"); -+ u.d = high; -+ for (i = 0; i < sizeof (double); i++) -+ printf ("%.2x", u.uc[i]); -+ -+ printf (",%*s %g\n", (int)(2 * (sizeof (long double) - sizeof (double))), "", high); -+ -+ printf ("lo = 0x"); -+ u.d = low; -+ for (i = 0; i < sizeof (double); i++) -+ printf ("%.2x", u.uc[i]); -+ -+ printf (",%*s %g\n", (int)(2 * (sizeof (long double) - sizeof (double))), "", low); -+ -+ printf ("x0 = 0x"); -+ u.d = x0; -+ for (i = 0; i < sizeof (double); i++) -+ printf ("%.2x", u.uc[i]); -+ -+ printf (",%*s %g\n", (int)(2 * (sizeof (long double) - sizeof (double))), "", x0); -+ -+ printf ("x1 = 0x"); -+ u.d = x1; -+ for (i = 0; i < sizeof (double); i++) -+ printf ("%.2x", u.uc[i]); -+ -+ printf (",%*s %g\n", (int)(2 * (sizeof (long double) - sizeof (double))), "", x1); -+ } -+#endif -+ -+ if (high != x0) -+ abort (); -+ -+ if (low != x1) -+ abort (); -+ -+ if (a != b) -+ abort (); -+ -+ if (x0 != high) -+ abort (); -+ -+ if (x1 != low) -+ abort (); -+ -+ return 0; -+} -Index: gcc/testsuite/gcc.target/powerpc/htm-ttest.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/powerpc/htm-ttest.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/powerpc/htm-ttest.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,14 @@ -+/* { dg-do compile { target { powerpc*-*-* } } } */ -+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */ -+/* { dg-require-effective-target powerpc_htm_ok } */ -+/* { dg-options "-O2 -mhtm" } */ -+ -+/* { dg-final { scan-assembler "rlwinm r?\[0-9\]+,r?\[0-9\]+,3,30,31" { target { ilp32 } } } } */ -+/* { dg-final { scan-assembler "rldicl r?\[0-9\]+,r?\[0-9\]+,35,62" { target { lp64 } } } } */ -+ -+#include <htmintrin.h> -+long -+ttest (void) -+{ -+ return _HTM_STATE(__builtin_ttest()); -+} -Index: gcc/testsuite/gcc.target/powerpc/pack03.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/powerpc/pack03.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/powerpc/pack03.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,88 @@ -+/* { dg-do run { target { powerpc*-*-linux* } } } */ -+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */ -+/* { dg-skip-if "" { powerpc*-*-*spe* } { "*" } { "" } } */ -+/* { dg-require-effective-target dfp_hw } */ -+/* { dg-options "-O2 -mhard-dfp" } */ -+ -+#include <stddef.h> -+#include <stdlib.h> -+#include <math.h> -+ -+#ifdef DEBUG -+#include <stdio.h> -+#endif -+ -+int -+main (void) -+{ -+ _Decimal128 one = (_Decimal128)1.0; -+ _Decimal128 two = (_Decimal128)2.0; -+ _Decimal128 ten = (_Decimal128)10.0; -+ _Decimal128 a = one; -+ _Decimal128 b; -+ _Decimal128 c; -+ unsigned long long x0; -+ unsigned long long x1; -+ size_t i; -+ -+ for (i = 0; i < 25; i++) -+ a *= ten; -+ -+ a += two; -+ -+ x0 = __builtin_unpack_dec128 (a, 0); -+ x1 = __builtin_unpack_dec128 (a, 1); -+ b = __builtin_pack_dec128 (x0, x1); -+ c = __builtin_dscliq (one, 25) + two; -+ -+#ifdef DEBUG -+ { -+ union { -+ _Decimal128 d; -+ unsigned long long ull; -+ unsigned char uc[sizeof (_Decimal128)]; -+ } u; -+ -+ printf ("a = 0x"); -+ u.d = a; -+ for (i = 0; i < sizeof (_Decimal128); i++) -+ printf ("%.2x", u.uc[i]); -+ -+ printf (", %Lg\n", (long double)a); -+ -+ printf ("b = 0x"); -+ u.d = b; -+ for (i = 0; i < sizeof (_Decimal128); i++) -+ printf ("%.2x", u.uc[i]); -+ -+ printf (", %Lg\n", (long double)b); -+ -+ printf ("c = 0x"); -+ u.d = c; -+ for (i = 0; i < sizeof (_Decimal128); i++) -+ printf ("%.2x", u.uc[i]); -+ -+ printf (", %Lg\n", (long double)c); -+ -+ printf ("x0 = 0x"); -+ u.ull = x0; -+ for (i = 0; i < sizeof (unsigned long long); i++) -+ printf ("%.2x", u.uc[i]); -+ -+ printf ("\nx1 = 0x"); -+ u.ull = x1; -+ for (i = 0; i < sizeof (unsigned long long); i++) -+ printf ("%.2x", u.uc[i]); -+ -+ printf ("\n"); -+ } -+#endif -+ -+ if (a != b) -+ abort (); -+ -+ if (a != c) -+ abort (); -+ -+ return 0; -+} -Index: gcc/testsuite/gcc.target/powerpc/ti_math1.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/powerpc/ti_math1.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/powerpc/ti_math1.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,20 @@ -+/* { dg-do compile { target { powerpc*-*-* && lp64 } } } */ -+/* { dg-options "-O2" } */ -+/* { dg-final { scan-assembler-times "addc" 1 } } */ -+/* { dg-final { scan-assembler-times "adde" 1 } } */ -+/* { dg-final { scan-assembler-times "subfc" 1 } } */ -+/* { dg-final { scan-assembler-times "subfe" 1 } } */ -+/* { dg-final { scan-assembler-not "subf " } } */ -+ -+__int128 -+add_128 (__int128 *ptr, __int128 val) -+{ -+ return (*ptr + val); -+} -+ -+__int128 -+sub_128 (__int128 *ptr, __int128 val) -+{ -+ return (*ptr - val); -+} -+ -Index: gcc/testsuite/gcc.target/powerpc/ti_math2.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/powerpc/ti_math2.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/powerpc/ti_math2.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,73 @@ -+/* { dg-do run { target { powerpc*-*-* && lp64 } } } */ -+/* { dg-options "-O2 -fno-inline" } */ -+ -+union U { -+ __int128 i128; -+ struct { -+ long l1; -+ long l2; -+ } s; -+}; -+ -+union U u1,u2; -+ -+__int128 -+create_128 (long most_sig, long least_sig) -+{ -+ union U u; -+ -+#if __LITTLE_ENDIAN__ -+ u.s.l1 = least_sig; -+ u.s.l2 = most_sig; -+#else -+ u.s.l1 = most_sig; -+ u.s.l2 = least_sig; -+#endif -+ return u.i128; -+} -+ -+long most_sig (union U * u) -+{ -+#if __LITTLE_ENDIAN__ -+ return (*u).s.l2; -+#else -+ return (*u).s.l1; -+#endif -+} -+ -+long least_sig (union U * u) -+{ -+#if __LITTLE_ENDIAN__ -+ return (*u).s.l1; -+#else -+ return (*u).s.l2; -+#endif -+} -+ -+__int128 -+add_128 (__int128 *ptr, __int128 val) -+{ -+ return (*ptr + val); -+} -+ -+__int128 -+sub_128 (__int128 *ptr, __int128 val) -+{ -+ return (*ptr - val); -+} -+ -+int -+main (void) -+{ -+ /* Do a simple add/sub to make sure carry is happening between the dwords -+ and that dwords are in correct endian order. */ -+ u1.i128 = create_128 (1, -1); -+ u2.i128 = add_128 (&u1.i128, 1); -+ if ((most_sig (&u2) != 2) || (least_sig (&u2) != 0)) -+ __builtin_abort (); -+ u2.i128 = sub_128 (&u2.i128, 1); -+ if ((most_sig (&u2) != 1) || (least_sig (&u2) != -1)) -+ __builtin_abort (); -+ return 0; -+} -+ -Index: gcc/testsuite/gcc.target/arm/pr48252.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/arm/pr48252.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/arm/pr48252.c (.../branches/gcc-4_9-branch) -@@ -15,7 +15,6 @@ - uint8x8x2_t vd1, vd2; - union {uint8x8_t v; uint8_t buf[8];} d1, d2, d3, d4; - int i; -- uint8_t odd, even; - - vd1 = vzip_u8(v1, vdup_n_u8(0)); - vd2 = vzip_u8(v2, vdup_n_u8(0)); -@@ -25,17 +24,9 @@ - vst1_u8(d3.buf, vd2.val[0]); - vst1_u8(d4.buf, vd2.val[1]); - --#ifdef __ARMEL__ -- odd = 1; -- even = 0; --#else -- odd = 0; -- even = 1; --#endif -- - for (i = 0; i < 8; i++) -- if ((i % 2 == even && d4.buf[i] != 2) -- || (i % 2 == odd && d4.buf[i] != 0)) -+ if ((i % 2 == 0 && d4.buf[i] != 2) -+ || (i % 2 == 1 && d4.buf[i] != 0)) - abort (); - - return 0; -Index: gcc/testsuite/gcc.target/alpha/pr61586.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/alpha/pr61586.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/alpha/pr61586.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,10 @@ -+/* { dg-do compile } */ -+/* { dg-options "-O2 -mieee" } */ -+ -+void foo (int *dimensions, double **params, int hh) -+{ -+ if (params[hh]) -+ ; -+ else if (dimensions[hh] > 0) -+ params[hh][0] = 1.0f; -+} -Index: gcc/testsuite/gcc.target/aarch64/vqdmlsl_lane_s16.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmlsl_lane_s16.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmlsl_lane_s16.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmlsl_lane_s16 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int32x4_t -+t_vqdmlsl_lane_s16 (int32x4_t a, int16x4_t b, int16x4_t c) -+{ -+ return vqdmlsl_lane_s16 (a, b, c, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmlsl\[ \t\]+\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.4\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vector_intrinsics.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vector_intrinsics.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vector_intrinsics.c (.../branches/gcc-4_9-branch) -@@ -1,7 +1,7 @@ - /* { dg-do compile } */ - /* { dg-options "-O2" } */ - --#include "../../../config/aarch64/arm_neon.h" -+#include "arm_neon.h" - - - /* { dg-final { scan-assembler-times "\\tfmax\\tv\[0-9\]+\.2s, v\[0-9\].2s, v\[0-9\].2s" 1 } } */ -@@ -305,7 +305,7 @@ - /* { dg-final { scan-assembler-times "\\tsqdmlal2\\tv\[0-9\]+\.4s, v\[0-9\]+\.8h, v\[0-9\]+\.h" 3 } } */ - - int32x4_t --test_vqdmlal_high_lane_s16 (int32x4_t a, int16x8_t b, int16x8_t c) -+test_vqdmlal_high_lane_s16 (int32x4_t a, int16x8_t b, int16x4_t c) - { - return vqdmlal_high_lane_s16 (a, b, c, 3); - } -@@ -361,7 +361,7 @@ - /* { dg-final { scan-assembler-times "\\tsqdmlal2\\tv\[0-9\]+\.2d, v\[0-9\]+\.4s, v\[0-9\]+\.s" 3 } } */ - - int64x2_t --test_vqdmlal_high_lane_s32 (int64x2_t __a, int32x4_t __b, int32x4_t __c) -+test_vqdmlal_high_lane_s32 (int64x2_t __a, int32x4_t __b, int32x2_t __c) - { - return vqdmlal_high_lane_s32 (__a, __b, __c, 1); - } -@@ -417,7 +417,7 @@ - /* { dg-final { scan-assembler-times "\\tsqdmlsl2\\tv\[0-9\]+\.4s, v\[0-9\]+\.8h, v\[0-9\]+\.h" 3 } } */ - - int32x4_t --test_vqdmlsl_high_lane_s16 (int32x4_t a, int16x8_t b, int16x8_t c) -+test_vqdmlsl_high_lane_s16 (int32x4_t a, int16x8_t b, int16x4_t c) - { - return vqdmlsl_high_lane_s16 (a, b, c, 3); - } -@@ -473,7 +473,7 @@ - /* { dg-final { scan-assembler-times "\\tsqdmlsl2\\tv\[0-9\]+\.2d, v\[0-9\]+\.4s, v\[0-9\]+\.s" 3 } } */ - - int64x2_t --test_vqdmlsl_high_lane_s32 (int64x2_t __a, int32x4_t __b, int32x4_t __c) -+test_vqdmlsl_high_lane_s32 (int64x2_t __a, int32x4_t __b, int32x2_t __c) - { - return vqdmlsl_high_lane_s32 (__a, __b, __c, 1); - } -@@ -529,7 +529,7 @@ - /* { dg-final { scan-assembler-times "\\tsqdmull2\\tv\[0-9\]+\.4s, v\[0-9\]+\.8h, v\[0-9\]+\.h" 3 } } */ - - int32x4_t --test_vqdmull_high_lane_s16 (int16x8_t a, int16x8_t b) -+test_vqdmull_high_lane_s16 (int16x8_t a, int16x4_t b) - { - return vqdmull_high_lane_s16 (a, b, 3); - } -@@ -585,7 +585,7 @@ - /* { dg-final { scan-assembler-times "\\tsqdmull2\\tv\[0-9\]+\.2d, v\[0-9\]+\.4s, v\[0-9\]+\.s" 3 } } */ - - int64x2_t --test_vqdmull_high_lane_s32 (int32x4_t __a, int32x4_t __b) -+test_vqdmull_high_lane_s32 (int32x4_t __a, int32x2_t __b) - { - return vqdmull_high_lane_s32 (__a, __b, 1); - } -Index: gcc/testsuite/gcc.target/aarch64/vqdmlal_laneq_s16.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmlal_laneq_s16.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmlal_laneq_s16.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmlal_laneq_s16 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int32x4_t -+t_vqdmlal_laneq_s16 (int32x4_t a, int16x4_t b, int16x8_t c) -+{ -+ return vqdmlal_laneq_s16 (a, b, c, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmlal\[ \t\]+\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.4\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmlsl_high_lane_s16.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmlsl_high_lane_s16.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmlsl_high_lane_s16.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmlsl_high_lane_s16 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int32x4_t -+t_vqdmlsl_high_lane_s16 (int32x4_t a, int16x8_t b, int16x4_t c) -+{ -+ return vqdmlsl_high_lane_s16 (a, b, c, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmlsl2\[ \t\]+\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.8\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmull_lane_s16.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmull_lane_s16.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmull_lane_s16.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmull_lane_s16 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int32x4_t -+t_vqdmull_lane_s16 (int16x4_t a, int16x4_t b) -+{ -+ return vqdmull_lane_s16 (a, b, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmull\[ \t\]+\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.4\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmulhh_lane_s16.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmulhh_lane_s16.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmulhh_lane_s16.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,36 @@ -+/* Test the vqdmulhh_lane_s16 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do run } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+#include <stdio.h> -+ -+extern void abort (void); -+ -+int -+main (void) -+{ -+ int16_t arg1; -+ int16x4_t arg2; -+ int16_t result; -+ int16_t actual; -+ int16_t expected; -+ -+ arg1 = -32768; -+ arg2 = vcreate_s16 (0x0000ffff2489e398ULL); -+ actual = vqdmulhh_lane_s16 (arg1, arg2, 2); -+ expected = 1; -+ -+ if (expected != actual) -+ { -+ fprintf (stderr, "Expected: %xd, got %xd\n", expected, actual); -+ abort (); -+ } -+ -+ return 0; -+} -+ -+ -+/* { dg-final { scan-assembler-times "sqdmulh\[ \t\]+\[hH\]\[0-9\]+, ?\[hH\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[hH\]\\\[2\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmullh_lane_s16.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmullh_lane_s16.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmullh_lane_s16.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmullh_lane_s16 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int32x1_t -+t_vqdmullh_lane_s16 (int16x1_t a, int16x4_t b) -+{ -+ return vqdmullh_lane_s16 (a, b, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmull\[ \t\]+\[sS\]\[0-9\]+, ?\[hH\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-14.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-14.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-14.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,35 @@ -+/* Test AAPCS64 layout and __builtin_va_start. -+ -+ Pass named HFA/HVA argument on stack. */ -+ -+/* { dg-do run { target aarch64*-*-* } } */ -+ -+#ifndef IN_FRAMEWORK -+#define AAPCS64_TEST_STDARG -+#define TESTFILE "va_arg-14.c" -+#include "type-def.h" -+ -+struct hfa_fx2_t hfa_fx2 = {1.2f, 2.2f}; -+struct hfa_fx3_t hfa_fx3 = {3.2f, 4.2f, 5.2f}; -+vf4_t float32x4 = {6.2f, 7.2f, 8.2f, 9.2f}; -+vf4_t float32x4_2 = {10.2f, 11.2f, 12.2f, 13.2f}; -+ -+#include "abitest.h" -+#else -+ ARG (float, 1.0f, S0, 0) -+ ARG (float, 2.0f, S1, 1) -+ ARG (float, 3.0f, S2, 2) -+ ARG (float, 4.0f, S3, 3) -+ ARG (float, 5.0f, S4, 4) -+ ARG (float, 6.0f, S5, 5) -+ ARG (float, 7.0f, S6, 6) -+ ARG (struct hfa_fx3_t, hfa_fx3, STACK, 7) -+ /* Previous argument size has been rounded up to the nearest multiple of -+ 8 bytes. */ -+ ARG (struct hfa_fx2_t, hfa_fx2, STACK + 16, 8) -+ /* NSAA is rounded up to the nearest natural alignment of float32x4. */ -+ ARG (vf4_t, float32x4, STACK + 32, 9) -+ ARG (vf4_t, float32x4_2, STACK + 48, LAST_NAMED_ARG_ID) -+ DOTS -+ LAST_ANON (double, 123456789.987, STACK + 64, 11) -+#endif -Index: gcc/testsuite/gcc.target/aarch64/aapcs64/type-def.h -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/aapcs64/type-def.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/aapcs64/type-def.h (.../branches/gcc-4_9-branch) -@@ -34,6 +34,13 @@ - float b; - }; - -+struct hfa_fx3_t -+{ -+ float a; -+ float b; -+ float c; -+}; -+ - struct hfa_dx2_t - { - double a; -Index: gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-13.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-13.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-13.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,59 @@ -+/* Test AAPCS64 layout and __builtin_va_start. -+ -+ Pass named HFA/HVA argument on stack. */ -+ -+/* { dg-do run { target aarch64*-*-* } } */ -+ -+#ifndef IN_FRAMEWORK -+#define AAPCS64_TEST_STDARG -+#define TESTFILE "va_arg-13.c" -+ -+struct float_float_t -+{ -+ float a; -+ float b; -+} float_float; -+ -+union float_int_t -+{ -+ float b8; -+ int b5; -+} float_int; -+ -+#define HAS_DATA_INIT_FUNC -+void -+init_data () -+{ -+ float_float.a = 1.2f; -+ float_float.b = 2.2f; -+ -+ float_int.b8 = 4983.80f; -+} -+ -+#include "abitest.h" -+#else -+ ARG (float, 1.0f, S0, 0) -+ ARG (float, 2.0f, S1, 1) -+ ARG (float, 3.0f, S2, 2) -+ ARG (float, 4.0f, S3, 3) -+ ARG (float, 5.0f, S4, 4) -+ ARG (float, 6.0f, S5, 5) -+ ARG (float, 7.0f, S6, 6) -+ ARG (struct float_float_t, float_float, STACK, 7) -+ ARG (int, 9, W0, 8) -+ ARG (int, 10, W1, 9) -+ ARG (int, 11, W2, 10) -+ ARG (int, 12, W3, 11) -+ ARG (int, 13, W4, 12) -+ ARG (int, 14, W5, 13) -+ ARG (int, 15, W6, LAST_NAMED_ARG_ID) -+ DOTS -+ /* Note on the reason of using 'X7' instead of 'W7' here: -+ Using 'X7' makes sure the test works in the big-endian mode. -+ According to PCS rules B.4 and C.10, the size of float_int is rounded -+ to 8 bytes and prepared in the register X7 as if loaded via LDR from -+ the memory, with the content of the other 4 bytes unspecified. The -+ test framework will only compare the 4 relavent bytes. */ -+ ANON (union float_int_t, float_int, X7, 15) -+ LAST_ANON (long long, 12683143434LL, STACK + 8, 16) -+#endif -Index: gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-15.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-15.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-15.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,39 @@ -+/* Test AAPCS64 layout and __builtin_va_start. -+ -+ Pass named __128int argument on stack. */ -+ -+/* { dg-do run { target aarch64*-*-* } } */ -+ -+#ifndef IN_FRAMEWORK -+#define AAPCS64_TEST_STDARG -+#define TESTFILE "va_arg-15.c" -+#include "type-def.h" -+ -+union int128_t qword; -+ -+#define HAS_DATA_INIT_FUNC -+void -+init_data () -+{ -+ /* Init signed quad-word integer. */ -+ qword.l64 = 0xfdb9753102468aceLL; -+ qword.h64 = 0xeca8642013579bdfLL; -+} -+ -+#include "abitest.h" -+#else -+ ARG (int, 1, W0, 0) -+ ARG (int, 2, W1, 1) -+ ARG (int, 3, W2, 2) -+ ARG (int, 4, W3, 3) -+ ARG (int, 5, W4, 4) -+ ARG (int, 6, W5, 5) -+ ARG (int, 7, W6, 6) -+ ARG (__int128, qword.i, STACK, LAST_NAMED_ARG_ID) -+ DOTS -+#ifndef __AAPCS64_BIG_ENDIAN__ -+ LAST_ANON (int, 8, STACK + 16, 8) -+#else -+ LAST_ANON (int, 8, STACK + 20, 8) -+#endif -+#endif -Index: gcc/testsuite/gcc.target/aarch64/vqdmlalh_lane_s16.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmlalh_lane_s16.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmlalh_lane_s16.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmlalh_lane_s16 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int32x1_t -+t_vqdmlalh_lane_s16 (int32x1_t a, int16x1_t b, int16x4_t c) -+{ -+ return vqdmlalh_lane_s16 (a, b, c, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmlal\[ \t\]+\[sS\]\[0-9\]+, ?\[hH\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/pr61325.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/pr61325.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/pr61325.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,19 @@ -+/* { dg-do compile } */ -+/* { dg-options "-O2" } */ -+typedef unsigned int wchar_t; -+typedef long unsigned int size_t; -+ -+size_t -+wcstombs(char *s , const wchar_t *pwcs , size_t n) -+{ -+ int count = 0; -+ -+ if (n != 0) { -+ do { -+ if ((*s++ = (char) *pwcs++) == 0) -+ break; -+ count++; -+ } while (--n != 0); -+ } -+ return count; -+} -Index: gcc/testsuite/gcc.target/aarch64/vqdmlal_high_laneq_s32.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmlal_high_laneq_s32.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmlal_high_laneq_s32.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmlal_high_laneq_s32 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int64x2_t -+t_vqdmlal_high_laneq_s32 (int64x2_t a, int32x4_t b, int32x4_t c) -+{ -+ return vqdmlal_high_laneq_s32 (a, b, c, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmlal2\[ \t\]+\[vV\]\[0-9\]+\.2\[dD\], ?\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqrdmulhs_lane_s32.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqrdmulhs_lane_s32.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqrdmulhs_lane_s32.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,35 @@ -+/* Test the vqrdmulhs_lane_s32 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do run } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+#include <stdio.h> -+ -+extern void abort (void); -+ -+int -+main (void) -+{ -+ int32_t arg1; -+ int32x2_t arg2; -+ int32_t result; -+ int32_t actual; -+ int32_t expected; -+ -+ arg1 = -2099281921; -+ arg2 = vcreate_s32 (0x000080007fff0000ULL); -+ actual = vqrdmulhs_lane_s32 (arg1, arg2, 1); -+ expected = -32033; -+ -+ if (expected != actual) -+ { -+ fprintf (stderr, "Expected: %xd, got %xd\n", expected, actual); -+ abort (); -+ } -+ -+ return 0; -+} -+ -+/* { dg-final { scan-assembler-times "sqrdmulh\[ \t\]+\[sS\]\[0-9\]+, ?\[sS\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[sS\]\\\[1\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmlal_lane_s32.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmlal_lane_s32.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmlal_lane_s32.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmlal_lane_s32 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int64x2_t -+t_vqdmlal_lane_s32 (int64x2_t a, int32x2_t b, int32x2_t c) -+{ -+ return vqdmlal_lane_s32 (a, b, c, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmlal\[ \t\]+\[vV\]\[0-9\]+\.2\[dD\], ?\[vV\]\[0-9\]+\.2\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmlsls_lane_s32.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmlsls_lane_s32.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmlsls_lane_s32.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmlsls_lane_s32 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int64x1_t -+t_vqdmlsls_lane_s32 (int64x1_t a, int32x1_t b, int32x2_t c) -+{ -+ return vqdmlsls_lane_s32 (a, b, c, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmlsl\[ \t\]+\[dD\]\[0-9\]+, ?\[sS\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmull_high_laneq_s32.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmull_high_laneq_s32.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmull_high_laneq_s32.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmull_high_laneq_s32 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int64x2_t -+t_vqdmull_high_laneq_s32 (int32x4_t a, int32x4_t b) -+{ -+ return vqdmull_high_laneq_s32 (a, b, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmull2\[ \t\]+\[vV\]\[0-9\]+\.2\[dD\], ?\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmlal_high_laneq_s16.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmlal_high_laneq_s16.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmlal_high_laneq_s16.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmlal_high_laneq_s16 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int32x4_t -+t_vqdmlal_high_laneq_s16 (int32x4_t a, int16x8_t b, int16x8_t c) -+{ -+ return vqdmlal_high_laneq_s16 (a, b, c, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmlal2\[ \t\]+\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.8\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmlal_lane_s16.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmlal_lane_s16.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmlal_lane_s16.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmlal_lane_s16 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int32x4_t -+t_vqdmlal_lane_s16 (int32x4_t a, int16x4_t b, int16x4_t c) -+{ -+ return vqdmlal_lane_s16 (a, b, c, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmlal\[ \t\]+\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.4\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmulhs_lane_s32.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmulhs_lane_s32.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmulhs_lane_s32.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,34 @@ -+/* Test the vqdmulhs_lane_s32 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do run } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+#include <stdio.h> -+ -+extern void abort (void); -+ -+int -+main (void) -+{ -+ int32_t arg1; -+ int32x2_t arg2; -+ int32_t result; -+ int32_t actual; -+ int32_t expected; -+ -+ arg1 = 57336; -+ arg2 = vcreate_s32 (0x55897fff7fff0000ULL); -+ actual = vqdmulhs_lane_s32 (arg1, arg2, 0); -+ expected = 57334; -+ -+ if (expected != actual) -+ { -+ fprintf (stderr, "Expected: %xd, got %xd\n", expected, actual); -+ abort (); -+ } -+ -+ return 0; -+} -+/* { dg-final { scan-assembler-times "sqdmulh\[ \t\]+\[sS\]\[0-9\]+, ?\[sS\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmull_high_laneq_s16.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmull_high_laneq_s16.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmull_high_laneq_s16.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmull_high_laneq_s16 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int32x4_t -+t_vqdmull_high_laneq_s16 (int16x8_t a, int16x8_t b) -+{ -+ return vqdmull_high_laneq_s16 (a, b, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmull2\[ \t\]+\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.8\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmulls_lane_s32.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmulls_lane_s32.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmulls_lane_s32.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmulls_lane_s32 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int64x1_t -+t_vqdmulls_lane_s32 (int32x1_t a, int32x2_t b) -+{ -+ return vqdmulls_lane_s32 (a, b, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmull\[ \t\]+\[dD\]\[0-9\]+, ?\[sS\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqrdmulh_laneq_s32.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqrdmulh_laneq_s32.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqrdmulh_laneq_s32.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqrdmulh_laneq_s32 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int32x2_t -+t_vqrdmulh_laneq_s32 (int32x2_t a, int32x4_t b) -+{ -+ return vqrdmulh_laneq_s32 (a, b, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqrdmulh\[ \t\]+\[vV\]\[0-9\]+\.2\[sS\], ?\[vV\]\[0-9\]+\.2\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmlsl_high_laneq_s32.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmlsl_high_laneq_s32.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmlsl_high_laneq_s32.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmlsl_high_laneq_s32 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int64x2_t -+t_vqdmlsl_high_laneq_s32 (int64x2_t a, int32x4_t b, int32x4_t c) -+{ -+ return vqdmlsl_high_laneq_s32 (a, b, c, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmlsl2\[ \t\]+\[vV\]\[0-9\]+\.2\[dD\], ?\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmlsl_laneq_s32.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmlsl_laneq_s32.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmlsl_laneq_s32.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmlsl_laneq_s32 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int64x2_t -+t_vqdmlsl_lane_s32 (int64x2_t a, int32x2_t b, int32x4_t c) -+{ -+ return vqdmlsl_laneq_s32 (a, b, c, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmlsl\[ \t\]+\[vV\]\[0-9\]+\.2\[dD\], ?\[vV\]\[0-9\]+\.2\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmull_high_lane_s32.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmull_high_lane_s32.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmull_high_lane_s32.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmull_high_lane_s32 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int64x2_t -+t_vqdmull_high_lane_s32 (int32x4_t a, int32x2_t b) -+{ -+ return vqdmull_high_lane_s32 (a, b, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmull2\[ \t\]+\[vV\]\[0-9\]+\.2\[dD\], ?\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmlals_lane_s32.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmlals_lane_s32.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmlals_lane_s32.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmlals_lane_s32 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int64x1_t -+t_vqdmlals_lane_s32 (int64x1_t a, int32x1_t b, int32x2_t c) -+{ -+ return vqdmlals_lane_s32 (a, b, c, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmlal\[ \t\]+\[dD\]\[0-9\]+, ?\[sS\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqrdmulh_laneq_s16.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqrdmulh_laneq_s16.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqrdmulh_laneq_s16.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqrdmulh_laneq_s16 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int16x4_t -+t_vqrdmulh_laneq_s16 (int16x4_t a, int16x8_t b) -+{ -+ return vqrdmulh_laneq_s16 (a, b, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqrdmulh\[ \t\]+\[vV\]\[0-9\]+\.4\[hH\], ?\[vV\]\[0-9\]+\.4\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmlsl_high_laneq_s16.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmlsl_high_laneq_s16.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmlsl_high_laneq_s16.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmlsl_high_laneq_s16 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int32x4_t -+t_vqdmlsl_high_laneq_s16 (int32x4_t a, int16x8_t b, int16x8_t c) -+{ -+ return vqdmlsl_high_laneq_s16 (a, b, c, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmlsl2\[ \t\]+\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.8\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqrdmulhq_laneq_s32.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqrdmulhq_laneq_s32.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqrdmulhq_laneq_s32.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqrdmulhq_laneq_s32 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int32x4_t -+t_vqrdmulhq_laneq_s32 (int32x4_t a, int32x4_t b) -+{ -+ return vqrdmulhq_laneq_s32 (a, b, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqrdmulh\[ \t\]+\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/scalar_intrinsics.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/scalar_intrinsics.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/scalar_intrinsics.c (.../branches/gcc-4_9-branch) -@@ -387,7 +387,7 @@ - /* { dg-final { scan-assembler-times "\\tsqdmlal\\ts\[0-9\]+, h\[0-9\]+, v" 1 } } */ - - int32x1_t --test_vqdmlalh_lane_s16 (int32x1_t a, int16x1_t b, int16x8_t c) -+test_vqdmlalh_lane_s16 (int32x1_t a, int16x1_t b, int16x4_t c) - { - return vqdmlalh_lane_s16 (a, b, c, 3); - } -@@ -403,7 +403,7 @@ - /* { dg-final { scan-assembler-times "\\tsqdmlal\\td\[0-9\]+, s\[0-9\]+, v" 1 } } */ - - int64x1_t --test_vqdmlals_lane_s32 (int64x1_t a, int32x1_t b, int32x4_t c) -+test_vqdmlals_lane_s32 (int64x1_t a, int32x1_t b, int32x2_t c) - { - return vqdmlals_lane_s32 (a, b, c, 1); - } -@@ -419,7 +419,7 @@ - /* { dg-final { scan-assembler-times "\\tsqdmlsl\\ts\[0-9\]+, h\[0-9\]+, v" 1 } } */ - - int32x1_t --test_vqdmlslh_lane_s16 (int32x1_t a, int16x1_t b, int16x8_t c) -+test_vqdmlslh_lane_s16 (int32x1_t a, int16x1_t b, int16x4_t c) - { - return vqdmlslh_lane_s16 (a, b, c, 3); - } -@@ -435,7 +435,7 @@ - /* { dg-final { scan-assembler-times "\\tsqdmlsl\\td\[0-9\]+, s\[0-9\]+, v" 1 } } */ - - int64x1_t --test_vqdmlsls_lane_s32 (int64x1_t a, int32x1_t b, int32x4_t c) -+test_vqdmlsls_lane_s32 (int64x1_t a, int32x1_t b, int32x2_t c) - { - return vqdmlsls_lane_s32 (a, b, c, 1); - } -@@ -451,7 +451,7 @@ - /* { dg-final { scan-assembler-times "\\tsqdmulh\\th\[0-9\]+, h\[0-9\]+, v" 1 } } */ - - int16x1_t --test_vqdmulhh_lane_s16 (int16x1_t a, int16x8_t b) -+test_vqdmulhh_lane_s16 (int16x1_t a, int16x4_t b) - { - return vqdmulhh_lane_s16 (a, b, 3); - } -@@ -467,9 +467,9 @@ - /* { dg-final { scan-assembler-times "\\tsqdmulh\\ts\[0-9\]+, s\[0-9\]+, v" 1 } } */ - - int32x1_t --test_vqdmulhs_lane_s32 (int32x1_t a, int32x4_t b) -+test_vqdmulhs_lane_s32 (int32x1_t a, int32x2_t b) - { -- return vqdmulhs_lane_s32 (a, b, 3); -+ return vqdmulhs_lane_s32 (a, b, 1); - } - - /* { dg-final { scan-assembler-times "\\tsqdmull\\ts\[0-9\]+, h\[0-9\]+, h\[0-9\]+" 1 } } */ -@@ -483,7 +483,7 @@ - /* { dg-final { scan-assembler-times "\\tsqdmull\\ts\[0-9\]+, h\[0-9\]+, v" 1 } } */ - - int32x1_t --test_vqdmullh_lane_s16 (int16x1_t a, int16x8_t b) -+test_vqdmullh_lane_s16 (int16x1_t a, int16x4_t b) - { - return vqdmullh_lane_s16 (a, b, 3); - } -@@ -499,7 +499,7 @@ - /* { dg-final { scan-assembler-times "\\tsqdmull\\td\[0-9\]+, s\[0-9\]+, v" 1 } } */ - - int64x1_t --test_vqdmulls_lane_s32 (int32x1_t a, int32x4_t b) -+test_vqdmulls_lane_s32 (int32x1_t a, int32x2_t b) - { - return vqdmulls_lane_s32 (a, b, 1); - } -@@ -515,9 +515,9 @@ - /* { dg-final { scan-assembler-times "\\tsqrdmulh\\th\[0-9\]+, h\[0-9\]+, v" 1 } } */ - - int16x1_t --test_vqrdmulhh_lane_s16 (int16x1_t a, int16x8_t b) -+test_vqrdmulhh_lane_s16 (int16x1_t a, int16x4_t b) - { -- return vqrdmulhh_lane_s16 (a, b, 6); -+ return vqrdmulhh_lane_s16 (a, b, 3); - } - - /* { dg-final { scan-assembler-times "\\tsqrdmulh\\ts\[0-9\]+, s\[0-9\]+, s\[0-9\]+" 1 } } */ -@@ -531,9 +531,9 @@ - /* { dg-final { scan-assembler-times "\\tsqrdmulh\\ts\[0-9\]+, s\[0-9\]+, v" 1 } } */ - - int32x1_t --test_vqrdmulhs_lane_s32 (int32x1_t a, int32x4_t b) -+test_vqrdmulhs_lane_s32 (int32x1_t a, int32x2_t b) - { -- return vqrdmulhs_lane_s32 (a, b, 2); -+ return vqrdmulhs_lane_s32 (a, b, 1); - } - - /* { dg-final { scan-assembler-times "\\tsuqadd\\tb\[0-9\]+" 1 } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmull_high_lane_s16.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmull_high_lane_s16.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmull_high_lane_s16.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmull_high_lane_s16 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int32x4_t -+t_vqdmull_high_lane_s16 (int16x8_t a, int16x4_t b) -+{ -+ return vqdmull_high_lane_s16 (a, b, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmull2\[ \t\]+\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.8\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmlal_high_lane_s32.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmlal_high_lane_s32.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmlal_high_lane_s32.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmlal_high_lane_s32 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int64x2_t -+t_vqdmlal_high_lane_s32 (int64x2_t a, int32x4_t b, int32x2_t c) -+{ -+ return vqdmlal_high_lane_s32 (a, b, c, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmlal2\[ \t\]+\[vV\]\[0-9\]+\.2\[dD\], ?\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmulh_laneq_s32.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmulh_laneq_s32.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmulh_laneq_s32.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmulh_laneq_s32 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int32x2_t -+t_vqdmulh_laneq_s32 (int32x2_t a, int32x4_t b) -+{ -+ return vqdmulh_laneq_s32 (a, b, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmulh\[ \t\]+\[vV\]\[0-9\]+\.2\[sS\], ?\[vV\]\[0-9\]+\.2\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmull_laneq_s32.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmull_laneq_s32.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmull_laneq_s32.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmull_laneq_s32 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int64x2_t -+t_vqdmull_laneq_s32 (int32x2_t a, int32x4_t b) -+{ -+ return vqdmull_laneq_s32 (a, b, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmull\[ \t\]+\[vV\]\[0-9\]+\.2\[dD\], ?\[vV\]\[0-9\]+\.2\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmulhq_laneq_s32.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmulhq_laneq_s32.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmulhq_laneq_s32.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmulhq_laneq_s32 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int32x4_t -+t_vqdmulhq_laneq_s32 (int32x4_t a, int32x4_t b) -+{ -+ return vqdmulhq_laneq_s32 (a, b, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmulh\[ \t\]+\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqrdmulhq_laneq_s16.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqrdmulhq_laneq_s16.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqrdmulhq_laneq_s16.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqrdmulhq_laneq_s16 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int16x8_t -+t_vqrdmulhq_laneq_s16 (int16x8_t a, int16x8_t b) -+{ -+ return vqrdmulhq_laneq_s16 (a, b, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqrdmulh\[ \t\]+\[vV\]\[0-9\]+\.8\[hH\], ?\[vV\]\[0-9\]+\.8\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqrdmulhh_lane_s16.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqrdmulhh_lane_s16.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqrdmulhh_lane_s16.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,35 @@ -+/* Test the vqrdmulhh_lane_s16 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do run } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+#include <stdio.h> -+ -+extern void abort (void); -+ -+int -+main (void) -+{ -+ int16_t arg1; -+ int16x4_t arg2; -+ int16_t result; -+ int16_t actual; -+ int16_t expected; -+ -+ arg1 = -32768; -+ arg2 = vcreate_s16 (0xd78e000005d78000ULL); -+ actual = vqrdmulhh_lane_s16 (arg1, arg2, 3); -+ expected = 10354; -+ -+ if (expected != actual) -+ { -+ fprintf (stderr, "Expected: %xd, got %xd\n", expected, actual); -+ abort (); -+ } -+ -+ return 0; -+} -+ -+/* { dg-final { scan-assembler-times "sqrdmulh\[ \t\]+\[hH\]\[0-9\]+, ?\[hH\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[hH\]\\\[3\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmlsl_lane_s32.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmlsl_lane_s32.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmlsl_lane_s32.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmlsl_lane_s32 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int64x2_t -+t_vqdmlsl_lane_s32 (int64x2_t a, int32x2_t b, int32x2_t c) -+{ -+ return vqdmlsl_lane_s32 (a, b, c, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmlsl\[ \t\]+\[vV\]\[0-9\]+\.2\[dD\], ?\[vV\]\[0-9\]+\.2\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmlslh_lane_s16.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmlslh_lane_s16.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmlslh_lane_s16.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmlslh_lane_s16 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int32x1_t -+t_vqdmlslh_lane_s16 (int32x1_t a, int16x1_t b, int16x4_t c) -+{ -+ return vqdmlslh_lane_s16 (a, b, c, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmlsl\[ \t\]+\[sS\]\[0-9\]+, ?\[hH\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmlal_high_lane_s16.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmlal_high_lane_s16.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmlal_high_lane_s16.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmlal_high_lane_s16 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int32x4_t -+t_vqdmlal_high_lane_s16 (int32x4_t a, int16x8_t b, int16x4_t c) -+{ -+ return vqdmlal_high_lane_s16 (a, b, c, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmlal2\[ \t\]+\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.8\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmulh_laneq_s16.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmulh_laneq_s16.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmulh_laneq_s16.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmulh_laneq_s16 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int16x4_t -+t_vqdmulh_laneq_s16 (int16x4_t a, int16x8_t b) -+{ -+ return vqdmulh_laneq_s16 (a, b, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmulh\[ \t\]+\[vV\]\[0-9\]+\.4\[hH\], ?\[vV\]\[0-9\]+\.4\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmull_laneq_s16.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmull_laneq_s16.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmull_laneq_s16.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmull_laneq_s16 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int32x4_t -+t_vqdmull_laneq_s16 (int16x4_t a, int16x8_t b) -+{ -+ return vqdmull_laneq_s16 (a, b, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmull\[ \t\]+\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.4\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmlal_laneq_s32.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmlal_laneq_s32.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmlal_laneq_s32.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmlal_laneq_s32 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int64x2_t -+t_vqdmlal_laneq_s32 (int64x2_t a, int32x2_t b, int32x4_t c) -+{ -+ return vqdmlal_laneq_s32 (a, b, c, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmlal\[ \t\]+\[vV\]\[0-9\]+\.2\[dD\], ?\[vV\]\[0-9\]+\.2\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmlsl_high_lane_s32.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmlsl_high_lane_s32.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmlsl_high_lane_s32.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmlsl_high_lane_s32 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int64x2_t -+t_vqdmlsl_high_lane_s32 (int64x2_t a, int32x4_t b, int32x2_t c) -+{ -+ return vqdmlsl_high_lane_s32 (a, b, c, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmlsl2\[ \t\]+\[vV\]\[0-9\]+\.2\[dD\], ?\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmulhq_laneq_s16.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmulhq_laneq_s16.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmulhq_laneq_s16.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmulhq_laneq_s16 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int16x8_t -+t_vqdmulhq_laneq_s16 (int16x8_t a, int16x8_t b) -+{ -+ return vqdmulhq_laneq_s16 (a, b, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmulh\[ \t\]+\[vV\]\[0-9\]+\.8\[hH\], ?\[vV\]\[0-9\]+\.8\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/aarch64/vqdmull_lane_s32.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/aarch64/vqdmull_lane_s32.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/aarch64/vqdmull_lane_s32.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* Test the vqdmull_lane_s32 AArch64 SIMD intrinsic. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-save-temps -O3 -fno-inline" } */ -+ -+#include "arm_neon.h" -+ -+int64x2_t -+t_vqdmull_lane_s32 (int32x2_t a, int32x2_t b) -+{ -+ return vqdmull_lane_s32 (a, b, 0); -+} -+ -+/* { dg-final { scan-assembler-times "sqdmull\[ \t\]+\[vV\]\[0-9\]+\.2\[dD\], ?\[vV\]\[0-9\]+\.2\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */ -+/* { dg-final { cleanup-saved-temps } } */ -Index: gcc/testsuite/gcc.target/avr/torture/pr61443.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/avr/torture/pr61443.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/avr/torture/pr61443.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,134 @@ -+/* { dg-do run } */ -+/* { dg-options "-std=gnu99" } */ -+ -+#include <stdlib.h> -+#include <stdarg.h> -+ -+#define NC __attribute__((noinline,noclone)) -+ -+void NC vfun (char n, ...) -+{ -+ va_list ap; -+ -+ va_start (ap, n); -+ -+ switch (n) -+ { -+ default: -+ abort(); -+ case 1: -+ if (11 != va_arg (ap, int)) -+ abort(); -+ break; -+ case 2: -+ if (2222 != va_arg (ap, int)) -+ abort(); -+ break; -+ case 3: -+ if (333333 != va_arg (ap, __int24)) -+ abort(); -+ break; -+ case 4: -+ if (44444444 != va_arg (ap, long)) -+ abort(); -+ break; -+ case 8: -+ if (8888888888888888 != va_arg (ap, long long)) -+ abort(); -+ break; -+ } -+ -+ va_end (ap); -+} -+ -+ -+void NC boo_qi (const __flash char *p) -+{ -+ vfun (1, *p); -+} -+ -+void NC boox_qi (const __memx char *p) -+{ -+ vfun (1, *p); -+} -+ -+void NC boo_hi (const __flash int *p) -+{ -+ vfun (2, *p); -+} -+ -+void NC boox_hi (const __memx int *p) -+{ -+ vfun (2, *p); -+} -+ -+void NC boo_psi (const __flash __int24 *p) -+{ -+ vfun (3, *p); -+} -+ -+void NC boox_psi (const __memx __int24 *p) -+{ -+ vfun (3, *p); -+} -+ -+void NC boo_si (const __flash long *p) -+{ -+ vfun (4, *p); -+} -+ -+void NC boox_si (const __memx long *p) -+{ -+ vfun (4, *p); -+} -+ -+void NC boo_di (const __flash long long *p) -+{ -+ vfun (8, *p); -+} -+ -+void NC boox_di (const __memx long long *p) -+{ -+ vfun (8, *p); -+} -+ -+const __flash char f_qi = 11; -+const __flash int f_hi = 2222; -+const __flash __int24 f_psi = 333333; -+const __flash long f_si = 44444444; -+const __flash long long f_di = 8888888888888888; -+ -+const __memx char x_qi = 11; -+const __memx int x_hi = 2222; -+const __memx __int24 x_psi = 333333; -+const __memx long x_si = 44444444; -+const __memx long long x_di = 8888888888888888; -+ -+char r_qi = 11; -+int r_hi = 2222; -+__int24 r_psi = 333333; -+long r_si = 44444444; -+long long r_di = 8888888888888888; -+ -+int main (void) -+{ -+ boo_qi (&f_qi); -+ boo_hi (&f_hi); -+ boo_psi (&f_psi); -+ boo_si (&f_si); -+ boo_di (&f_di); -+ -+ boox_qi (&x_qi); -+ boox_hi (&x_hi); -+ boox_psi (&x_psi); -+ boox_si (&x_si); -+ boox_di (&x_di); -+ -+ boox_qi (&r_qi); -+ boox_hi (&r_hi); -+ boox_psi (&r_psi); -+ boox_si (&r_si); -+ boox_di (&r_di); -+ -+ exit (0); -+} -Index: gcc/testsuite/gcc.target/avr/torture/pr61055.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/avr/torture/pr61055.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/avr/torture/pr61055.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,88 @@ -+/* { dg-do run } */ -+/* { dg-options { -fno-peephole2 } } */ -+ -+#include <stdlib.h> -+ -+typedef __UINT16_TYPE__ uint16_t; -+typedef __INT16_TYPE__ int16_t; -+typedef __UINT8_TYPE__ uint8_t; -+ -+uint8_t __attribute__((noinline,noclone)) -+fun_inc (uint8_t c0) -+{ -+ register uint8_t c asm ("r15") = c0; -+ -+ /* Force target value into R15 (lower register) */ -+ asm ("" : "+l" (c)); -+ -+ c++; -+ if (c >= 0x80) -+ c = 0; -+ -+ asm ("" : "+l" (c)); -+ -+ return c; -+} -+ -+uint8_t __attribute__((noinline,noclone)) -+fun_dec (uint8_t c0) -+{ -+ register uint8_t c asm ("r15") = c0; -+ -+ /* Force target value into R15 (lower register) */ -+ asm ("" : "+l" (c)); -+ -+ c--; -+ if (c < 0x80) -+ c = 0; -+ -+ asm ("" : "+l" (c)); -+ -+ return c; -+} -+ -+ -+uint8_t __attribute__((noinline,noclone)) -+fun_neg (uint8_t c0) -+{ -+ register uint8_t c asm ("r15") = c0; -+ -+ c = -c; -+ if (c >= 0x80) -+ c = 0; -+ -+ return c; -+} -+ -+uint16_t __attribute__((noinline,noclone)) -+fun_adiw (uint16_t c0) -+{ -+ register uint16_t c asm ("r24") = c0; -+ -+ /* Force target value into R24 (for ADIW) */ -+ asm ("" : "+r" (c)); -+ -+ c += 2; -+ if (c >= 0x8000) -+ c = 0; -+ -+ asm ("" : "+r" (c)); -+ -+ return c; -+} -+ -+ -+int main() -+{ -+ if (fun_inc (0x7f) != 0) -+ abort(); -+ -+ if (fun_neg (0x80) != 0) -+ abort(); -+ -+ if (fun_adiw (0x7ffe) != 0) -+ abort(); -+ -+ exit (0); -+ return 0; -+} -Index: gcc/testsuite/gcc.target/avr/pr60991.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/avr/pr60991.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/avr/pr60991.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,21 @@ -+/* { dg-do run } */ -+/* { dg-options "-O1" } */ -+ -+/* This testcase (simplified from the original bug report) exposes -+ PR60991. The code generated for writing the __int24 value corrupts -+ the frame pointer if the offset is <= 63 + MAX_LD_OFFSET */ -+ -+#include <stdlib.h> -+ -+int main(void) -+{ -+ volatile char junk[62]; -+ junk[0] = 5; -+ volatile __int24 staticConfig = 0; -+ -+ if (junk[0] != 5) -+ abort(); -+ -+ exit(0); -+ return 0; -+} -Index: gcc/testsuite/gcc.target/i386/clearcap.map -=================================================================== ---- a/src/gcc/testsuite/gcc.target/i386/clearcap.map (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/i386/clearcap.map (.../branches/gcc-4_9-branch) -@@ -1,3 +0,0 @@ --# clear all hardware capabilities emitted by Sun as: the tests here --# guard against execution at runtime --hwcap_1 = V0x0 OVERRIDE; -Index: gcc/testsuite/gcc.target/i386/clearcapv2.map -=================================================================== ---- a/src/gcc/testsuite/gcc.target/i386/clearcapv2.map (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/i386/clearcapv2.map (.../branches/gcc-4_9-branch) -@@ -1,7 +0,0 @@ --# clear all hardware capabilities emitted by Sun as: the tests here --# guard against execution at runtime --# uses mapfile v2 syntax which is the only way to clear AT_SUN_CAP_HW2 flags --$mapfile_version 2 --CAPABILITY { -- HW = ; --}; -Index: gcc/testsuite/gcc.target/i386/i386.exp -=================================================================== ---- a/src/gcc/testsuite/gcc.target/i386/i386.exp (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/i386/i386.exp (.../branches/gcc-4_9-branch) -@@ -23,6 +23,7 @@ - - # Load support procs. - load_lib gcc-dg.exp -+load_lib clearcap.exp - - # Return 1 if attribute ms_hook_prologue is supported. - proc check_effective_target_ms_hook_prologue { } { -@@ -307,39 +308,6 @@ - } "-O2 -msha" ] - } - --# If the linker used understands -M <mapfile>, pass it to clear hardware --# capabilities set by the Sun assembler. --# Try mapfile syntax v2 first which is the only way to clear hwcap_2 flags. --set clearcap_ldflags "-Wl,-M,$srcdir/$subdir/clearcapv2.map" -- --if ![check_no_compiler_messages mapfilev2 executable { -- int main (void) { return 0; } --} $clearcap_ldflags ] { -- # If this doesn't work, fall back to the less capable v1 syntax. -- set clearcap_ldflags "-Wl,-M,$srcdir/$subdir/clearcap.map" -- -- if ![check_no_compiler_messages mapfile executable { -- int main (void) { return 0; } -- } $clearcap_ldflags ] { -- unset clearcap_ldflags -- } --} -- --if [info exists clearcap_ldflags] { -- if { [info procs gcc_target_compile] != [list] \ -- && [info procs saved_gcc_target_compile] == [list] } { -- rename gcc_target_compile saved_gcc_target_compile -- -- proc gcc_target_compile { source dest type options } { -- global clearcap_ldflags -- # Always pass -Wl,-M,<mapfile>, but don't let it show up in gcc.sum. -- lappend options "additional_flags=$clearcap_ldflags" -- -- return [saved_gcc_target_compile $source $dest $type $options] -- } -- } --} -- - # If a testcase doesn't have special options, use these. - global DEFAULT_CFLAGS - if ![info exists DEFAULT_CFLAGS] then { -@@ -348,6 +316,7 @@ - - # Initialize `dg'. - dg-init -+clearcap-init - - # Special case compilation of vect-args.c so we don't have to - # replicate it 10 times. -@@ -367,4 +336,5 @@ - dg-runtest $tests "" $DEFAULT_CFLAGS - - # All done. -+clearcap-finish - dg-finish -Index: gcc/testsuite/gcc.target/i386/avx2-pr57233.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/i386/avx2-pr57233.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/i386/avx2-pr57233.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,16 @@ -+/* PR tree-optimization/57233 */ -+/* { dg-do run { target avx2 } } */ -+/* { dg-options "-O2 -mavx2" } */ -+ -+#include "avx2-check.h" -+ -+static void -+avx2_test (void) -+{ -+ do_main (); -+} -+ -+#undef main -+#define main() do_main () -+ -+#include "../../gcc.dg/pr57233.c" -Index: gcc/testsuite/gcc.target/i386/vec-may_alias.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/i386/vec-may_alias.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/i386/vec-may_alias.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,25 @@ -+/* { dg-do run } */ -+/* { dg-options "-O2 -w -Wno-abi" } */ -+ -+typedef int v2si __attribute__ ((vector_size (8))); -+typedef short v4hi __attribute__ ((vector_size (8))); -+typedef short v4hia __attribute__ ((vector_size (8), may_alias)); -+ -+__attribute__ ((noinline, noclone)) -+int f (v2si A, int N) -+{ return ((v4hia)A)[N]; } -+ -+__attribute__ ((noinline, noclone)) -+int g (v2si A, int N) -+{ return ((v4hi)A)[N]; } -+ -+int main() -+{ -+ v2si x = { 0, 0 }, y = { 1, 1 }; -+ if (f (x, 0) || f (x, 1) || f (x, 2) || f (x, 3)) -+ __builtin_abort (); -+ if (g (y, 0) != 1 || g (y, 1) || g (y, 2) != 1 || g (y, 3)) -+ __builtin_abort (); -+ return 0; -+} -+ -Index: gcc/testsuite/gcc.target/i386/sse2-pr57233.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/i386/sse2-pr57233.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/i386/sse2-pr57233.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,16 @@ -+/* PR tree-optimization/57233 */ -+/* { dg-do run { target sse2 } } */ -+/* { dg-options "-O2 -msse2" } */ -+ -+#include "sse2-check.h" -+ -+static void -+sse2_test (void) -+{ -+ do_main (); -+} -+ -+#undef main -+#define main() do_main () -+ -+#include "../../gcc.dg/pr57233.c" -Index: gcc/testsuite/gcc.target/i386/pr61423.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/i386/pr61423.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/i386/pr61423.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,38 @@ -+/* PR target/61423 */ -+/* { dg-do run { target ia32 } } */ -+/* { dg-options "-O1 -ftree-vectorize -msse2 -mfpmath=387 -mtune=core2" } */ -+ -+#define N 1024 -+static unsigned int A[N]; -+ -+double -+__attribute__((noinline)) -+func (void) -+{ -+ unsigned int sum = 0; -+ unsigned i; -+ double t; -+ -+ for (i = 0; i < N; i++) -+ sum += A[i]; -+ -+ t = sum; -+ return t; -+} -+ -+int -+main () -+{ -+ unsigned i; -+ double d; -+ -+ for(i = 0; i < N; i++) -+ A[i] = 1; -+ -+ d = func(); -+ -+ if (d != 1024.0) -+ __builtin_abort (); -+ -+ return 0; -+} -Index: gcc/testsuite/gcc.target/i386/pr60868.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/i386/pr60868.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/i386/pr60868.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,10 @@ -+/* { dg-do compile } */ -+/* { dg-options "-O0 -minline-all-stringops -minline-stringops-dynamically -march=core2" } */ -+ -+void bar (float *); -+ -+void foo (void) -+{ -+ float b[256] = {0}; -+ bar(b); -+} -Index: gcc/testsuite/gcc.target/i386/avx-pr57233.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/i386/avx-pr57233.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/i386/avx-pr57233.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,16 @@ -+/* PR tree-optimization/57233 */ -+/* { dg-do run { target avx } } */ -+/* { dg-options "-O2 -mavx" } */ -+ -+#include "avx-check.h" -+ -+static void -+avx_test (void) -+{ -+ do_main (); -+} -+ -+#undef main -+#define main() do_main () -+ -+#include "../../gcc.dg/pr57233.c" -Index: gcc/testsuite/gcc.target/i386/pr60901.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/i386/pr60901.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/i386/pr60901.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,17 @@ -+/* { dg-options "-O -fselective-scheduling -fschedule-insns -fsel-sched-pipelining -fsel-sched-pipelining-outer-loops -fno-tree-dominator-opts" } */ -+ -+extern int n; -+extern void bar (void); -+extern int baz (int); -+ -+void -+foo (void) -+{ -+ int i, j; -+ for (j = 0; j < n; j++) -+ { -+ for (i = 1; i < j; i++) -+ bar (); -+ baz (0); -+ } -+} -Index: gcc/testsuite/gcc.target/i386/pr57233.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/i386/pr57233.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/i386/pr57233.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* PR tree-optimization/57233 */ -+/* { dg-do compile { target avx } } */ -+/* { dg-options "-O2 -mavx -mno-xop" } */ -+ -+typedef unsigned V4 __attribute__((vector_size(4 * sizeof (int)))); -+V4 a; -+ -+__attribute__((noinline)) void -+foo (void) -+{ -+ a = (a << 2) | (a >> 30); -+} -+ -+/* { dg-final { scan-assembler "vpsrld\[^\n\r]*30" } } */ -+/* { dg-final { scan-assembler "vpslld\[^\n\r]*2" } } */ -Index: gcc/testsuite/gcc.target/i386/pr60909-1.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/i386/pr60909-1.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/i386/pr60909-1.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,11 @@ -+/* { dg-do compile } */ -+/* { dg-options "-mrdrnd" } */ -+ -+extern void bar (int); -+ -+void -+foo (unsigned *u) -+{ -+ int i = __builtin_ia32_rdrand32_step (u); -+ bar (i); -+} -Index: gcc/testsuite/gcc.target/i386/xop-pr57233.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/i386/xop-pr57233.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/i386/xop-pr57233.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,16 @@ -+/* PR tree-optimization/57233 */ -+/* { dg-do run { target xop } } */ -+/* { dg-options "-O2 -mxop" } */ -+ -+#include "xop-check.h" -+ -+static void -+xop_test (void) -+{ -+ do_main (); -+} -+ -+#undef main -+#define main() do_main () -+ -+#include "../../gcc.dg/pr57233.c" -Index: gcc/testsuite/gcc.target/i386/avx512f-pr57233.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/i386/avx512f-pr57233.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/i386/avx512f-pr57233.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,16 @@ -+/* PR tree-optimization/57233 */ -+/* { dg-do run { target avx512f } } */ -+/* { dg-options "-O2 -mavx512f" } */ -+ -+#include "avx512f-check.h" -+ -+static void -+avx512f_test (void) -+{ -+ do_main (); -+} -+ -+#undef main -+#define main() do_main () -+ -+#include "../../gcc.dg/pr57233.c" -Index: gcc/testsuite/gcc.target/i386/pr60902.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/i386/pr60902.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/i386/pr60902.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,32 @@ -+/* { dg-do run } */ -+/* { dg-options "-O2" } */ -+extern void abort (); -+extern void exit (int); -+ -+int x; -+ -+foo() -+{ -+ static int count; -+ count++; -+ if (count > 1) -+ abort (); -+} -+ -+static inline int -+frob () -+{ -+ int a; -+ __asm__ ("mov %1, %0\n\t" : "=r" (a) : "m" (x)); -+ x++; -+ return a; -+} -+ -+int -+main () -+{ -+ int i; -+ for (i = 0; i < 10 && frob () == 0; i++) -+ foo(); -+ exit (0); -+} -Index: gcc/testsuite/gcc.target/i386/pr61446.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/i386/pr61446.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/i386/pr61446.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,14 @@ -+/* PR rtl-optimization/61446 */ -+ -+/* { dg-do compile { target { ia32 } } } */ -+/* { dg-options "-O2 -march=corei7 -mfpmath=387" } */ -+ -+unsigned long long -+foo (float a) -+{ -+ const double dfa = a; -+ const unsigned int hi = dfa / 0x1p32f; -+ const unsigned int lo = dfa - (double) hi * 0x1p32f; -+ -+ return ((unsigned long long) hi << (4 * (8))) | lo; -+} -Index: gcc/testsuite/gcc.target/i386/pr60909-2.c -=================================================================== ---- a/src/gcc/testsuite/gcc.target/i386/pr60909-2.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/i386/pr60909-2.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,11 @@ -+/* { dg-do compile } */ -+/* { dg-options "-mrdseed" } */ -+ -+extern void bar (int); -+ -+void -+foo (unsigned *u) -+{ -+ int i = __builtin_ia32_rdseed_si_step (u); -+ bar (i); -+} -Index: gcc/testsuite/gcc.target/x86_64/abi/avx512f/abi-avx512f.exp -=================================================================== ---- a/src/gcc/testsuite/gcc.target/x86_64/abi/avx512f/abi-avx512f.exp (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/x86_64/abi/avx512f/abi-avx512f.exp (.../branches/gcc-4_9-branch) -@@ -20,6 +20,7 @@ - load_lib c-torture.exp - load_lib target-supports.exp - load_lib torture-options.exp -+load_lib clearcap.exp - - if { (![istarget x86_64-*-*] && ![istarget i?86-*-*]) - || ![is-effective-target lp64] -@@ -28,20 +29,10 @@ - } - - --# If the linker used understands -M <mapfile>, pass it to clear hardware --# capabilities set by the Sun assembler. --set flags "" --set clearcap_ldflags "-Wl,-M,$srcdir/gcc.target/i386/clearcap.map" -- --if [check_no_compiler_messages mapfile executable { -- int main (void) { return 0; } -- } $clearcap_ldflags ] { -- set flags $clearcap_ldflags --} -- - torture-init -+clearcap-init - set-torture-options $C_TORTURE_OPTIONS --set additional_flags "-W -Wall -mavx512f $flags" -+set additional_flags "-W -Wall -mavx512f" - - foreach src [lsort [glob -nocomplain $srcdir/$subdir/test_*.c]] { - if {[runtest_file_p $runtests $src]} { -@@ -58,4 +49,5 @@ - } - } - -+clearcap-finish - torture-finish -Index: gcc/testsuite/gcc.target/x86_64/abi/avx/abi-avx.exp -=================================================================== ---- a/src/gcc/testsuite/gcc.target/x86_64/abi/avx/abi-avx.exp (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.target/x86_64/abi/avx/abi-avx.exp (.../branches/gcc-4_9-branch) -@@ -20,6 +20,7 @@ - load_lib c-torture.exp - load_lib target-supports.exp - load_lib torture-options.exp -+load_lib clearcap.exp - - if { (![istarget x86_64-*-*] && ![istarget i?86-*-*]) - || ![is-effective-target lp64] -@@ -28,20 +29,10 @@ - } - - --# If the linker used understands -M <mapfile>, pass it to clear hardware --# capabilities set by the Sun assembler. --set flags "" --set clearcap_ldflags "-Wl,-M,$srcdir/gcc.target/i386/clearcap.map" -- --if [check_no_compiler_messages mapfile executable { -- int main (void) { return 0; } -- } $clearcap_ldflags ] { -- set flags $clearcap_ldflags --} -- - torture-init -+clearcap-init - set-torture-options $C_TORTURE_OPTIONS --set additional_flags "-W -Wall -mavx $flags" -+set additional_flags "-W -Wall -mavx" - - foreach src [lsort [glob -nocomplain $srcdir/$subdir/test_*.c]] { - if {[runtest_file_p $runtests $src]} { -@@ -58,4 +49,5 @@ - } - } - -+clearcap-finish - torture-finish -Index: gcc/testsuite/lib/clearcap.exp -=================================================================== ---- a/src/gcc/testsuite/lib/clearcap.exp (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/lib/clearcap.exp (.../branches/gcc-4_9-branch) -@@ -0,0 +1,58 @@ -+# Copyright (C) 2014 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with GCC; see the file COPYING3. If not see -+# <http://www.gnu.org/licenses/>. -+ -+# Clear hardware capabilities on Solaris. -+if [istarget *-*-solaris2*] { -+ set clearcap_ldflags "-mclear-hwcap" -+} -+ -+# -+# clearcap-init -- called at the start of each subdir of tests -+# -+ -+proc clearcap-init { args } { -+ global TEST_ALWAYS_FLAGS -+ global ALWAYS_CXXFLAGS -+ global clearcap_saved_TEST_ALWAYS_FLAGS -+ global clearcap_ldflags -+ -+ if [info exists TEST_ALWAYS_FLAGS] { -+ set clearcap_saved_TEST_ALWAYS_FLAGS $TEST_ALWAYS_FLAGS -+ } -+ if [info exists clearcap_ldflags] { -+ if [info exists ALWAYS_CXXFLAGS] { -+ set ALWAYS_CXXFLAGS [concat "{ldflags=$clearcap_ldflags}" $ALWAYS_CXXFLAGS] -+ } else { -+ append TEST_ALWAYS_FLAGS " $clearcap_ldflags" -+ } -+ } -+ return 0 -+} -+ -+# -+# clearcap-finish -- called at the start of each subdir of tests -+# -+ -+proc clearcap-finish { args } { -+ global TEST_ALWAYS_FLAGS -+ global clearcap_saved_TEST_ALWAYS_FLAGS -+ -+ if [info exists clearcap_saved_TEST_ALWAYS_FLAGS] { -+ set TEST_ALWAYS_FLAGS $clearcap_saved_TEST_ALWAYS_FLAGS -+ } else { -+ unset TEST_ALWAYS_FLAGS -+ } -+} -Index: gcc/testsuite/lib/target-supports.exp -=================================================================== ---- a/src/gcc/testsuite/lib/target-supports.exp (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/lib/target-supports.exp (.../branches/gcc-4_9-branch) -@@ -1862,6 +1862,15 @@ - }] - } - -+# Return 1 if the target supports long double of 128 bits, -+# 0 otherwise. -+ -+proc check_effective_target_longdouble128 { } { -+ return [check_no_compiler_messages longdouble128 object { -+ int dummy[sizeof(long double) == 16 ? 1 : -1]; -+ }] -+} -+ - # Return 1 if the target supports double of 64 bits, - # 0 otherwise. - -@@ -1956,6 +1965,32 @@ - }] - } - -+# Return 1 if the target supports executing DFP hardware instructions, -+# 0 otherwise. Cache the result. -+ -+proc check_dfp_hw_available { } { -+ return [check_cached_effective_target dfp_hw_available { -+ # For now, disable on Darwin -+ if { [istarget powerpc-*-eabi] || [istarget powerpc*-*-eabispe] || [istarget *-*-darwin*]} { -+ expr 0 -+ } else { -+ check_runtime_nocache dfp_hw_available { -+ volatile _Decimal64 r; -+ volatile _Decimal64 a = 4.0DD; -+ volatile _Decimal64 b = 2.0DD; -+ int main() -+ { -+ asm volatile ("dadd %0,%1,%2" : "=d" (r) : "d" (a), "d" (b)); -+ asm volatile ("dsub %0,%1,%2" : "=d" (r) : "d" (a), "d" (b)); -+ asm volatile ("dmul %0,%1,%2" : "=d" (r) : "d" (a), "d" (b)); -+ asm volatile ("ddiv %0,%1,%2" : "=d" (r) : "d" (a), "d" (b)); -+ return 0; -+ } -+ } "-mcpu=power6 -mhard-float" -+ } -+ }] -+} -+ - # Return 1 if the target supports compiling and assembling UCN, 0 otherwise. - - proc check_effective_target_ucn_nocache { } { -@@ -4919,6 +4954,7 @@ - "vsx_hw" { set selected [check_vsx_hw_available] } - "p8vector_hw" { set selected [check_p8vector_hw_available] } - "ppc_recip_hw" { set selected [check_ppc_recip_hw_available] } -+ "dfp_hw" { set selected [check_dfp_hw_available] } - "named_sections" { set selected [check_named_sections_available] } - "gc_sections" { set selected [check_gc_sections_available] } - "cxa_atexit" { set selected [check_cxa_atexit_available] } -@@ -4941,6 +4977,7 @@ - "vsx_hw" { return 1 } - "p8vector_hw" { return 1 } - "ppc_recip_hw" { return 1 } -+ "dfp_hw" { return 1 } - "named_sections" { return 1 } - "gc_sections" { return 1 } - "cxa_atexit" { return 1 } -Index: gcc/testsuite/gfortran.dg/default_format_denormal_2.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/default_format_denormal_2.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/default_format_denormal_2.f90 (.../branches/gcc-4_9-branch) -@@ -1,6 +1,6 @@ - ! { dg-require-effective-target fortran_large_real } --! { dg-do run { xfail powerpc*-apple-darwin* powerpc*-*-linux* } } --! Test XFAILed on these platforms because the system's printf() lacks -+! { dg-do run { xfail powerpc*-apple-darwin* } } -+! Test XFAILed on this platform because the system's printf() lacks - ! proper support for denormalized long doubles. See PR24685 - ! - ! This tests that the default formats for formatted I/O of reals are -Index: gcc/testsuite/gfortran.dg/gomp/udr8.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/gomp/udr8.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/gomp/udr8.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,351 @@ -+! { dg-do compile } -+! { dg-options "-fmax-errors=1000 -fopenmp" } -+ -+module m -+contains -+ function fn1 (x, y) -+ integer, intent(in) :: x, y -+ integer :: fn1 -+ fn1 = x + 2 * y -+ end function -+ subroutine sub1 (x, y) -+ integer, intent(in) :: y -+ integer, intent(out) :: x -+ x = y -+ end subroutine -+ function fn2 (x) -+ integer, intent(in) :: x -+ integer :: fn2 -+ fn2 = x -+ end function -+ subroutine sub2 (x, y) -+ integer, intent(in) :: y -+ integer, intent(inout) :: x -+ x = x + y -+ end subroutine -+ function fn3 (x, y) -+ integer, intent(in) :: x(:), y(:) -+ integer :: fn3(lbound(x, 1):ubound(x, 1)) -+ fn3 = x + 2 * y -+ end function -+ subroutine sub3 (x, y) -+ integer, intent(in) :: y(:) -+ integer, intent(out) :: x(:) -+ x = y -+ end subroutine -+ function fn4 (x) -+ integer, intent(in) :: x(:) -+ integer :: fn4(lbound(x, 1):ubound(x, 1)) -+ fn4 = x -+ end function -+ subroutine sub4 (x, y) -+ integer, intent(in) :: y(:) -+ integer, intent(inout) :: x(:) -+ x = x + y -+ end subroutine -+ function fn5 (x, y) -+ integer, intent(in) :: x(10), y(10) -+ integer :: fn5(10) -+ fn5 = x + 2 * y -+ end function -+ subroutine sub5 (x, y) -+ integer, intent(in) :: y(10) -+ integer, intent(out) :: x(10) -+ x = y -+ end subroutine -+ function fn6 (x) -+ integer, intent(in) :: x(10) -+ integer :: fn6(10) -+ fn6 = x -+ end function -+ subroutine sub6 (x, y) -+ integer, intent(in) :: y(10) -+ integer, intent(inout) :: x(10) -+ x = x + y -+ end subroutine -+ function fn7 (x, y) -+ integer, allocatable, intent(in) :: x(:), y(:) -+ integer, allocatable :: fn7(:) -+ fn7 = x + 2 * y -+ end function -+ subroutine sub7 (x, y) -+ integer, allocatable, intent(in) :: y(:) -+ integer, allocatable, intent(out) :: x(:) -+ x = y -+ end subroutine -+ function fn8 (x) -+ integer, allocatable, intent(in) :: x(:) -+ integer, allocatable :: fn8(:) -+ fn8 = x -+ end function -+ subroutine sub8 (x, y) -+ integer, allocatable, intent(in) :: y(:) -+ integer, allocatable, intent(inout) :: x(:) -+ x = x + y -+ end subroutine -+end module -+subroutine test1 -+ use m -+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) -+!$omp declare reduction (bar : integer : omp_out = fn1 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*scalar and rank-1" } -+!$omp & initializer (sub1 (omp_priv, omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*scalar and rank-1" } -+!$omp declare reduction (baz : integer : sub2 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*scalar and rank-1" } -+!$omp initializer (omp_priv = fn2 (omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*scalar and rank-1" } -+ integer :: a(10) -+!$omp parallel reduction (foo : a) -+!$omp end parallel -+!$omp parallel reduction (bar : a) -+!$omp end parallel -+!$omp parallel reduction (baz : a) -+!$omp end parallel -+end subroutine test1 -+subroutine test2 -+ use m -+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) -+!$omp declare reduction (bar : integer : omp_out = fn1 (omp_out, omp_in)) & -+!$omp & initializer (sub1 (omp_priv, omp_orig)) -+!$omp declare reduction (baz : integer : sub2 (omp_out, omp_in)) & -+!$omp initializer (omp_priv = fn2 (omp_orig)) -+ integer :: a -+!$omp parallel reduction (foo : a) -+!$omp end parallel -+!$omp parallel reduction (bar : a) -+!$omp end parallel -+!$omp parallel reduction (baz : a) -+!$omp end parallel -+end subroutine test2 -+subroutine test3 -+ use m -+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) -+!$omp declare reduction (bar : integer : omp_out = fn1 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*scalar and rank-1" } -+!$omp & initializer (sub1 (omp_priv, omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*scalar and rank-1" } -+!$omp declare reduction (baz : integer : sub2 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*scalar and rank-1" } -+!$omp initializer (omp_priv = fn2 (omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*scalar and rank-1" } -+ integer, allocatable :: a(:) -+ allocate (a(10)) -+!$omp parallel reduction (foo : a) -+!$omp end parallel -+!$omp parallel reduction (bar : a) -+!$omp end parallel -+!$omp parallel reduction (baz : a) -+!$omp end parallel -+end subroutine test3 -+subroutine test4 -+ use m -+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) -+!$omp declare reduction (bar : integer : omp_out = fn1 (omp_out, omp_in)) & -+!$omp & initializer (sub1 (omp_priv, omp_orig)) -+!$omp declare reduction (baz : integer : sub2 (omp_out, omp_in)) & -+!$omp initializer (omp_priv = fn2 (omp_orig)) -+ integer, allocatable :: a -+ allocate (a) -+!$omp parallel reduction (foo : a) -+!$omp end parallel -+!$omp parallel reduction (bar : a) -+!$omp end parallel -+!$omp parallel reduction (baz : a) -+!$omp end parallel -+end subroutine test4 -+subroutine test5 -+ use m -+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) -+!$omp declare reduction (bar : integer : omp_out = fn3 (omp_out, omp_in)) & -+!$omp & initializer (sub3 (omp_priv, omp_orig)) -+!$omp declare reduction (baz : integer : sub4 (omp_out, omp_in)) & -+!$omp initializer (omp_priv = fn4 (omp_orig)) -+ integer :: a(10) -+!$omp parallel reduction (foo : a) -+!$omp end parallel -+!$omp parallel reduction (bar : a) -+!$omp end parallel -+!$omp parallel reduction (baz : a) -+!$omp end parallel -+end subroutine test5 -+subroutine test6 -+ use m -+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) -+!$omp declare reduction (bar : integer : omp_out = fn3 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" } -+!$omp & initializer (sub3 (omp_priv, omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" } -+!$omp declare reduction (baz : integer : sub4 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" } -+!$omp initializer (omp_priv = fn4 (omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" } -+ integer :: a -+!$omp parallel reduction (foo : a) -+!$omp end parallel -+!$omp parallel reduction (bar : a) -+!$omp end parallel -+!$omp parallel reduction (baz : a) -+!$omp end parallel -+end subroutine test6 -+subroutine test7 -+ use m -+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) -+!$omp declare reduction (bar : integer : omp_out = fn3 (omp_out, omp_in)) & -+!$omp & initializer (sub3 (omp_priv, omp_orig)) -+!$omp declare reduction (baz : integer : sub4 (omp_out, omp_in)) & -+!$omp initializer (omp_priv = fn4 (omp_orig)) -+ integer, allocatable :: a(:) -+ allocate (a(10)) -+!$omp parallel reduction (foo : a) -+!$omp end parallel -+!$omp parallel reduction (bar : a) -+!$omp end parallel -+!$omp parallel reduction (baz : a) -+!$omp end parallel -+end subroutine test7 -+subroutine test8 -+ use m -+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) -+!$omp declare reduction (bar : integer : omp_out = fn3 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" } -+!$omp & initializer (sub3 (omp_priv, omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" } -+!$omp declare reduction (baz : integer : sub4 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" } -+!$omp initializer (omp_priv = fn4 (omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" } -+ integer, allocatable :: a -+ allocate (a) -+!$omp parallel reduction (foo : a) -+!$omp end parallel -+!$omp parallel reduction (bar : a) -+!$omp end parallel -+!$omp parallel reduction (baz : a) -+!$omp end parallel -+end subroutine test8 -+subroutine test9 -+ use m -+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) -+!$omp declare reduction (bar : integer : omp_out = fn5 (omp_out, omp_in)) & -+!$omp & initializer (sub5 (omp_priv, omp_orig)) -+!$omp declare reduction (baz : integer : sub6 (omp_out, omp_in)) & -+!$omp initializer (omp_priv = fn6 (omp_orig)) -+ integer :: a(10) -+!$omp parallel reduction (foo : a) -+!$omp end parallel -+!$omp parallel reduction (bar : a) -+!$omp end parallel -+!$omp parallel reduction (baz : a) -+!$omp end parallel -+end subroutine test9 -+subroutine test10 -+ use m -+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) -+!$omp declare reduction (bar : integer : omp_out = fn5 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" } -+!$omp & initializer (sub5 (omp_priv, omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" } -+!$omp declare reduction (baz : integer : sub6 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" } -+!$omp initializer (omp_priv = fn6 (omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" } -+ integer :: a -+!$omp parallel reduction (foo : a) -+!$omp end parallel -+!$omp parallel reduction (bar : a) -+!$omp end parallel -+!$omp parallel reduction (baz : a) -+!$omp end parallel -+end subroutine test10 -+subroutine test11 -+ use m -+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) -+!$omp declare reduction (bar : integer : omp_out = fn5 (omp_out, omp_in)) & -+!$omp & initializer (sub5 (omp_priv, omp_orig)) -+!$omp declare reduction (baz : integer : sub6 (omp_out, omp_in)) & -+!$omp initializer (omp_priv = fn6 (omp_orig)) -+ integer, allocatable :: a(:) -+ allocate (a(10)) -+!$omp parallel reduction (foo : a) -+!$omp end parallel -+!$omp parallel reduction (bar : a) -+!$omp end parallel -+!$omp parallel reduction (baz : a) -+!$omp end parallel -+end subroutine test11 -+subroutine test12 -+ use m -+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) -+!$omp declare reduction (bar : integer : omp_out = fn5 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" } -+!$omp & initializer (sub5 (omp_priv, omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" } -+!$omp declare reduction (baz : integer : sub6 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" } -+!$omp initializer (omp_priv = fn6 (omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" } -+ integer, allocatable :: a -+ allocate (a) -+!$omp parallel reduction (foo : a) -+!$omp end parallel -+!$omp parallel reduction (bar : a) -+!$omp end parallel -+!$omp parallel reduction (baz : a) -+!$omp end parallel -+end subroutine test12 -+subroutine test13 -+ use m -+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) -+!$omp declare reduction (bar : integer : omp_out = & ! { dg-error "Different shape for array assignment at \[^\n\r]* on dimension 1 .9 and 10" } -+!$omp & fn5 (omp_out, omp_in)) & ! { dg-warning "Actual argument contains too few elements for dummy argument \[^\n\r]* .9/10" } -+!$omp & initializer (sub5 (omp_priv, omp_orig)) ! { dg-warning "Actual argument contains too few elements for dummy argument \[^\n\r]* .9/10" } -+!$omp declare reduction (baz : integer : sub6 (omp_out, omp_in)) & ! { dg-warning "Actual argument contains too few elements for dummy argument \[^\n\r]* .9/10" } -+!$omp initializer (omp_priv = & ! { dg-error "Different shape for array assignment at \[^\n\r]* on dimension 1 .9 and 10" } -+!$omp & fn6 (omp_orig)) ! { dg-warning "Actual argument contains too few elements for dummy argument \[^\n\r]* .9/10" } -+ integer :: a(9) -+!$omp parallel reduction (foo : a) -+!$omp end parallel -+!$omp parallel reduction (bar : a) -+!$omp end parallel -+!$omp parallel reduction (baz : a) -+!$omp end parallel -+end subroutine test13 -+subroutine test14 -+ use m -+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) -+!$omp declare reduction (bar : integer : omp_out = fn7 (omp_out, omp_in)) & ! { dg-error "Actual argument for \[^\n\r]* must be ALLOCATABLE" } -+!$omp & initializer (sub7 (omp_priv, omp_orig)) ! { dg-error "Actual argument for \[^\n\r]* must be ALLOCATABLE" } -+!$omp declare reduction (baz : integer : sub8 (omp_out, omp_in)) & ! { dg-error "Actual argument for \[^\n\r]* must be ALLOCATABLE" } -+!$omp initializer (omp_priv = fn8 (omp_orig)) ! { dg-error "Actual argument for \[^\n\r]* must be ALLOCATABLE" } -+ integer :: a(10) -+!$omp parallel reduction (foo : a) -+!$omp end parallel -+!$omp parallel reduction (bar : a) -+!$omp end parallel -+!$omp parallel reduction (baz : a) -+!$omp end parallel -+end subroutine test14 -+subroutine test15 -+ use m -+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) -+!$omp declare reduction (bar : integer : omp_out = fn7 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" } -+!$omp & initializer (sub7 (omp_priv, omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" } -+!$omp declare reduction (baz : integer : sub8 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" } -+!$omp initializer (omp_priv = fn8 (omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" } -+ integer :: a -+!$omp parallel reduction (foo : a) -+!$omp end parallel -+!$omp parallel reduction (bar : a) -+!$omp end parallel -+!$omp parallel reduction (baz : a) -+!$omp end parallel -+end subroutine test15 -+subroutine test16 -+ use m -+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) -+!$omp declare reduction (bar : integer : omp_out = fn7 (omp_out, omp_in)) & -+!$omp & initializer (sub7 (omp_priv, omp_orig)) -+!$omp declare reduction (baz : integer : sub8 (omp_out, omp_in)) & -+!$omp initializer (omp_priv = fn8 (omp_orig)) -+ integer, allocatable :: a(:) -+ allocate (a(10)) -+!$omp parallel reduction (foo : a) -+!$omp end parallel -+!$omp parallel reduction (bar : a) -+!$omp end parallel -+!$omp parallel reduction (baz : a) -+!$omp end parallel -+end subroutine test16 -+subroutine test17 -+ use m -+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) -+!$omp declare reduction (bar : integer : omp_out = fn7 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" } -+!$omp & initializer (sub7 (omp_priv, omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" } -+!$omp declare reduction (baz : integer : sub8 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" } -+!$omp initializer (omp_priv = fn8 (omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" } -+ integer, allocatable :: a -+ allocate (a) -+!$omp parallel reduction (foo : a) -+!$omp end parallel -+!$omp parallel reduction (bar : a) -+!$omp end parallel -+!$omp parallel reduction (baz : a) -+!$omp end parallel -+end subroutine test17 -Index: gcc/testsuite/gfortran.dg/gomp/allocatable_components_1.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/gomp/allocatable_components_1.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/gomp/allocatable_components_1.f90 (.../branches/gcc-4_9-branch) -@@ -14,7 +14,7 @@ - TYPE(t), SAVE :: a - - !$omp threadprivate(a) -- !$omp parallel copyin(a) ! { dg-error "has ALLOCATABLE components" } -+ !$omp parallel copyin(a) - ! do something - !$omp end parallel - END SUBROUTINE -@@ -22,7 +22,7 @@ - SUBROUTINE test_copyprivate() - TYPE(t) :: a - -- !$omp single ! { dg-error "has ALLOCATABLE components" } -+ !$omp single - ! do something - !$omp end single copyprivate (a) - END SUBROUTINE -@@ -30,7 +30,7 @@ - SUBROUTINE test_firstprivate - TYPE(t) :: a - -- !$omp parallel firstprivate(a) ! { dg-error "has ALLOCATABLE components" } -+ !$omp parallel firstprivate(a) - ! do something - !$omp end parallel - END SUBROUTINE -@@ -39,7 +39,7 @@ - TYPE(t) :: a - INTEGER :: i - -- !$omp parallel do lastprivate(a) ! { dg-error "has ALLOCATABLE components" } -+ !$omp parallel do lastprivate(a) - DO i = 1, 1 - END DO - !$omp end parallel do -@@ -49,7 +49,7 @@ - TYPE(t) :: a(10) - INTEGER :: i - -- !$omp parallel do reduction(+: a) ! { dg-error "must be of numeric type" } -+ !$omp parallel do reduction(+: a) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - DO i = 1, SIZE(a) - END DO - !$omp end parallel do -Index: gcc/testsuite/gfortran.dg/gomp/appendix-a/a.31.3.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/gomp/appendix-a/a.31.3.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/gomp/appendix-a/a.31.3.f90 (.../branches/gcc-4_9-branch) -@@ -5,7 +5,7 @@ - !$OMP PARALLEL DO REDUCTION(MAX: M) ! MAX is no longer the - ! intrinsic so this - ! is non-conforming --! { dg-error "is not INTRINSIC procedure name" "" { target *-*-* } 5 } */ -+! { dg-error "OMP DECLARE REDUCTION max not found" "" { target *-*-* } 5 } */ - DO I = 1, 100 - CALL SUB(M,I) - END DO -Index: gcc/testsuite/gfortran.dg/gomp/target1.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/gomp/target1.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/gomp/target1.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,520 @@ -+! { dg-do compile } -+! { dg-options "-fopenmp" } -+ -+module target1 -+ interface -+ subroutine dosomething (a, n, m) -+ integer :: a (:), n, m -+ !$omp declare target -+ end subroutine dosomething -+ end interface -+contains -+ subroutine foo (n, o, p, q, r, pp) -+ integer :: n, o, p, q, r, s, i, j -+ integer :: a (2:o) -+ integer, pointer :: pp -+ !$omp target data device (n + 1) if (n .ne. 6) map (tofrom: n, r) -+ !$omp target device (n + 1) if (n .ne. 6) map (from: n) map (alloc: a(2:o)) -+ call dosomething (a, n, 0) -+ !$omp end target -+ !$omp target teams device (n + 1) num_teams (n + 4) thread_limit (n * 2) & -+ !$omp & if (n .ne. 6)map (from: n) map (alloc: a(2:o)) default(shared) & -+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) -+ r = r + 1 -+ p = q -+ call dosomething (a, n, p + q) -+ !$omp end target teams -+ !$omp target teams distribute device (n + 1) num_teams (n + 4) collapse (2) & -+ !$omp & if (n .ne. 6)map (from: n) map (alloc: a(2:o)) default(shared) & -+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) & -+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) -+ do i = 1, 10 -+ do j = 1, 10 -+ r = r + 1 -+ p = q -+ call dosomething (a, n, p + q) -+ end do -+ end do -+ !$omp target teams distribute device (n + 1) num_teams (n + 4) & -+ !$omp & if (n .ne. 6)map (from: n) map (alloc: a(2:o)) default(shared) & -+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) & -+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) -+ do i = 1, 10 -+ do j = 1, 10 -+ r = r + 1 -+ p = q -+ call dosomething (a, n, p + q) -+ end do -+ end do -+ !$omp end target teams distribute -+ !$omp target teams distribute parallel do device (n + 1) num_teams (n + 4) & -+ !$omp & if (n .ne. 6)map (from: n) map (alloc: a(2:o)) default(shared) & -+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) & -+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) collapse (2) & -+ !$omp & num_threads (n + 4) proc_bind (spread) lastprivate (s) & -+ !$omp & ordered schedule (static, 8) -+ do i = 1, 10 -+ do j = 1, 10 -+ r = r + 1 -+ p = q -+ call dosomething (a, n, p + q) -+ !$omp ordered -+ p = q -+ !$omp end ordered -+ s = i * 10 + j -+ end do -+ end do -+ !$omp target teams distribute parallel do device (n + 1) num_teams (n + 4) & -+ !$omp & if (n .ne. 6)map (from: n) map (alloc: a(2:o)) default(shared) & -+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) & -+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) num_threads (n + 4) & -+ !$omp & proc_bind (master) lastprivate (s) ordered schedule (static, 8) -+ do i = 1, 10 -+ do j = 1, 10 -+ r = r + 1 -+ p = q -+ call dosomething (a, n, p + q) -+ end do -+ !$omp ordered -+ p = q -+ !$omp end ordered -+ s = i * 10 -+ end do -+ !$omp end target teams distribute parallel do -+ !$omp target teams distribute parallel do simd device (n + 1) & -+ !$omp & if (n .ne. 6)map (from: n) map (alloc: a(2:o)) default(shared) & -+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) & -+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) collapse (2) & -+ !$omp & num_threads (n + 4) proc_bind (spread) lastprivate (s) & -+ !$omp & schedule (static, 8) num_teams (n + 4) safelen(8) -+ do i = 1, 10 -+ do j = 1, 10 -+ r = r + 1 -+ p = q -+ a(2+i*10+j) = p + q -+ s = i * 10 + j -+ end do -+ end do -+ !$omp target teams distribute parallel do simd device (n + 1) & -+ !$omp & if (n .ne. 6)map (from: n) map (alloc: a(2:o)) default(shared) & -+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) & -+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) num_threads (n + 4) & -+ !$omp & proc_bind (master) lastprivate (s) schedule (static, 8) & -+ !$omp & num_teams (n + 4) safelen(16) linear(i:1) aligned (pp:4) -+ do i = 1, 10 -+ r = r + 1 -+ p = q -+ a(1+i) = p + q -+ s = i * 10 -+ end do -+ !$omp end target teams distribute parallel do simd -+ !$omp target teams distribute simd device (n + 1) & -+ !$omp & if (n .ne. 6)map (from: n) map (alloc: a(2:o)) default(shared) & -+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) & -+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) collapse (2) & -+ !$omp & lastprivate (s) num_teams (n + 4) safelen(8) -+ do i = 1, 10 -+ do j = 1, 10 -+ r = r + 1 -+ p = q -+ a(2+i*10+j) = p + q -+ s = i * 10 + j -+ end do -+ end do -+ !$omp target teams distribute simd device (n + 1) & -+ !$omp & if (n .ne. 6)map (from: n) map (alloc: a(2:o)) default(shared) & -+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) & -+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) lastprivate (s) & -+ !$omp & num_teams (n + 4) safelen(16) linear(i:1) aligned (pp:4) -+ do i = 1, 10 -+ r = r + 1 -+ p = q -+ a(1+i) = p + q -+ s = i * 10 -+ end do -+ !$omp end target teams distribute simd -+ !$omp target device (n + 1) if (n .ne. 6)map (from: n) map (alloc: a(2:o)) -+ !$omp teams num_teams (n + 4) thread_limit (n * 2) default(shared) & -+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) -+ r = r + 1 -+ p = q -+ call dosomething (a, n, p + q) -+ !$omp end teams -+ !$omp end target -+ !$omp target device (n + 1) if (n .ne. 6)map (from: n) map (alloc: a(2:o)) -+ !$omp teams distribute num_teams (n + 4) collapse (2) default(shared) & -+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) & -+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) -+ do i = 1, 10 -+ do j = 1, 10 -+ r = r + 1 -+ p = q -+ call dosomething (a, n, p + q) -+ end do -+ end do -+ !$omp end target -+ !$omp target device (n + 1) if (n .ne. 6)map (from: n) map (alloc: a(2:o)) -+ !$omp teams distribute num_teams (n + 4) default(shared) & -+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) & -+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) -+ do i = 1, 10 -+ do j = 1, 10 -+ r = r + 1 -+ p = q -+ call dosomething (a, n, p + q) -+ end do -+ end do -+ !$omp end teams distribute -+ !$omp end target -+ !$omp target device (n + 1) if (n .ne. 6)map (from: n) map (alloc: a(2:o)) -+ !$omp teams distribute parallel do num_teams (n + 4) & -+ !$omp & if (n .ne. 6) default(shared) ordered schedule (static, 8) & -+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) & -+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) collapse (2) & -+ !$omp & num_threads (n + 4) proc_bind (spread) lastprivate (s) -+ do i = 1, 10 -+ do j = 1, 10 -+ r = r + 1 -+ p = q -+ call dosomething (a, n, p + q) -+ !$omp ordered -+ p = q -+ !$omp end ordered -+ s = i * 10 + j -+ end do -+ end do -+ !$omp end target -+ !$omp target device (n + 1) if (n .ne. 6)map (from: n) map (alloc: a(2:o)) -+ !$omp teams distribute parallel do num_teams (n + 4)if(n.ne.6)default(shared)& -+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) & -+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) num_threads (n + 4) & -+ !$omp & proc_bind (master) lastprivate (s) ordered schedule (static, 8) -+ do i = 1, 10 -+ do j = 1, 10 -+ r = r + 1 -+ p = q -+ call dosomething (a, n, p + q) -+ end do -+ !$omp ordered -+ p = q -+ !$omp end ordered -+ s = i * 10 -+ end do -+ !$omp end teams distribute parallel do -+ !$omp end target -+ !$omp target device (n + 1) if (n .ne. 6)map (from: n) map (alloc: a(2:o)) -+ !$omp teams distribute parallel do simd if(n.ne.6)default(shared)& -+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) & -+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) collapse (2) & -+ !$omp & num_threads (n + 4) proc_bind (spread) lastprivate (s) & -+ !$omp & schedule (static, 8) num_teams (n + 4) safelen(8) -+ do i = 1, 10 -+ do j = 1, 10 -+ r = r + 1 -+ p = q -+ a(2+i*10+j) = p + q -+ s = i * 10 + j -+ end do -+ end do -+ !$omp end target -+ !$omp target device (n + 1) if (n .ne. 6)map (from: n) map (alloc: a(2:o)) -+ !$omp teams distribute parallel do simd if (n .ne. 6)default(shared) & -+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) & -+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) num_threads (n + 4) & -+ !$omp & proc_bind (master) lastprivate (s) schedule (static, 8) & -+ !$omp & num_teams (n + 4) safelen(16) linear(i:1) aligned (pp:4) -+ do i = 1, 10 -+ r = r + 1 -+ p = q -+ a(1+i) = p + q -+ s = i * 10 -+ end do -+ !$omp end teams distribute parallel do simd -+ !$omp end target -+ !$omp target device (n + 1) if (n .ne. 6)map (from: n) map (alloc: a(2:o)) -+ !$omp teams distribute simd default(shared) safelen(8) & -+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) & -+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) collapse (2) & -+ !$omp & lastprivate (s) num_teams (n + 4) -+ do i = 1, 10 -+ do j = 1, 10 -+ r = r + 1 -+ p = q -+ a(2+i*10+j) = p + q -+ s = i * 10 + j -+ end do -+ end do -+ !$omp end target -+ !$omp target device (n + 1) if (n .ne. 6)map (from: n) map (alloc: a(2:o)) -+ !$omp teams distribute simd default(shared) aligned (pp:4) & -+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) & -+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) lastprivate (s) -+ do i = 1, 10 -+ r = r + 1 -+ p = q -+ a(1+i) = p + q -+ s = i * 10 -+ end do -+ !$omp end teams distribute simd -+ !$omp end target -+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) & -+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) & -+ !$omp & default(shared) shared(n) private (p) reduction ( + : r ) -+ !$omp distribute collapse (2) firstprivate (q) dist_schedule (static, 4) -+ do i = 1, 10 -+ do j = 1, 10 -+ r = r + 1 -+ p = q -+ call dosomething (a, n, p + q) -+ end do -+ end do -+ !$omp end target teams -+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) & -+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) & -+ !$omp & default(shared) shared(n) private (p) reduction(+:r) -+ !$omp distribute firstprivate (q) dist_schedule (static, 4) -+ do i = 1, 10 -+ do j = 1, 10 -+ r = r + 1 -+ p = q -+ call dosomething (a, n, p + q) -+ end do -+ end do -+ !$omp end distribute -+ !$omp end target teams -+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) & -+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) & -+ !$omp & default(shared) shared(n) private (p) reduction(+:r) -+ !$omp distribute parallel do if (n .ne. 6) default(shared) & -+ !$omp & ordered schedule (static, 8) private (p) firstprivate (q) & -+ !$omp & shared(n)reduction(+:r)dist_schedule(static,4)collapse(2)& -+ !$omp & num_threads (n + 4) proc_bind (spread) lastprivate (s) -+ do i = 1, 10 -+ do j = 1, 10 -+ r = r + 1 -+ p = q -+ call dosomething (a, n, p + q) -+ !$omp ordered -+ p = q -+ !$omp end ordered -+ s = i * 10 + j -+ end do -+ end do -+ !$omp end target teams -+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) & -+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) & -+ !$omp & default(shared) shared(n) private (p) reduction(+:r) -+ !$omp distribute parallel do if(n.ne.6)default(shared)& -+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) & -+ !$omp & dist_schedule (static, 4) num_threads (n + 4) & -+ !$omp & proc_bind (master) lastprivate (s) ordered schedule (static, 8) -+ do i = 1, 10 -+ do j = 1, 10 -+ r = r + 1 -+ p = q -+ call dosomething (a, n, p + q) -+ end do -+ !$omp ordered -+ p = q -+ !$omp end ordered -+ s = i * 10 -+ end do -+ !$omp end distribute parallel do -+ !$omp end target teams -+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) & -+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) & -+ !$omp & default(shared) shared(n) private (p) reduction(+:r) -+ !$omp distribute parallel do simd if(n.ne.6)default(shared)& -+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) & -+ !$omp & dist_schedule (static, 4) collapse (2) safelen(8) & -+ !$omp & num_threads (n + 4) proc_bind (spread) lastprivate (s) & -+ !$omp & schedule (static, 8) -+ do i = 1, 10 -+ do j = 1, 10 -+ r = r + 1 -+ p = q -+ a(2+i*10+j) = p + q -+ s = i * 10 + j -+ end do -+ end do -+ !$omp end target teams -+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) & -+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) & -+ !$omp & default(shared) shared(n) private (p) reduction(+:r) -+ !$omp distribute parallel do simd if (n .ne. 6)default(shared) & -+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) & -+ !$omp & dist_schedule (static, 4) num_threads (n + 4) & -+ !$omp & proc_bind (master) lastprivate (s) schedule (static, 8) & -+ !$omp & safelen(16) linear(i:1) aligned (pp:4) -+ do i = 1, 10 -+ r = r + 1 -+ p = q -+ a(1+i) = p + q -+ s = i * 10 -+ end do -+ !$omp end distribute parallel do simd -+ !$omp end target teams -+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) & -+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) & -+ !$omp & default(shared) shared(n) private (p) reduction(+:r) -+ !$omp distribute simd safelen(8) lastprivate(s) & -+ !$omp & private (p) firstprivate (q) reduction (+: r) & -+ !$omp & dist_schedule (static, 4) collapse (2) -+ do i = 1, 10 -+ do j = 1, 10 -+ r = r + 1 -+ p = q -+ a(2+i*10+j) = p + q -+ s = i * 10 + j -+ end do -+ end do -+ !$omp end target teams -+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) & -+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) & -+ !$omp & default(shared) shared(n) private (p) reduction(+:r) -+ !$omp distribute simd aligned (pp:4) & -+ !$omp & private (p) firstprivate (q) reduction (+: r) & -+ !$omp & dist_schedule (static, 4) lastprivate (s) -+ do i = 1, 10 -+ r = r + 1 -+ p = q -+ a(1+i) = p + q -+ s = i * 10 -+ end do -+ !$omp end distribute simd -+ !$omp end target teams -+ !$omp end target data -+ end subroutine -+ subroutine bar (n, o, p, r, pp) -+ integer :: n, o, p, q, r, s, i, j -+ integer :: a (2:o) -+ integer, pointer :: pp -+ common /blk/ i, j, q -+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) & -+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) & -+ !$omp & default(shared) shared(n) private (p) reduction ( + : r ) -+ !$omp distribute collapse (2) firstprivate (q) dist_schedule (static, 4) -+ do i = 1, 10 -+ do j = 1, 10 -+ r = r + 1 -+ p = q -+ call dosomething (a, n, p + q) -+ end do -+ end do -+ !$omp end target teams -+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) & -+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) & -+ !$omp & default(shared) shared(n) private (p) reduction(+:r) -+ !$omp distribute firstprivate (q) dist_schedule (static, 4) -+ do i = 1, 10 -+ do j = 1, 10 -+ r = r + 1 -+ p = q -+ call dosomething (a, n, p + q) -+ end do -+ end do -+ !$omp end distribute -+ !$omp end target teams -+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) & -+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) & -+ !$omp & default(shared) shared(n) private (p) reduction(+:r) -+ !$omp distribute parallel do if (n .ne. 6) default(shared) & -+ !$omp & ordered schedule (static, 8) private (p) firstprivate (q) & -+ !$omp & shared(n)reduction(+:r)dist_schedule(static,4)collapse(2)& -+ !$omp & num_threads (n + 4) proc_bind (spread) lastprivate (s) -+ do i = 1, 10 -+ do j = 1, 10 -+ r = r + 1 -+ p = q -+ call dosomething (a, n, p + q) -+ !$omp ordered -+ p = q -+ !$omp end ordered -+ s = i * 10 + j -+ end do -+ end do -+ !$omp end target teams -+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) & -+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) & -+ !$omp & default(shared) shared(n) private (p) reduction(+:r) -+ !$omp distribute parallel do if(n.ne.6)default(shared)& -+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) & -+ !$omp & dist_schedule (static, 4) num_threads (n + 4) & -+ !$omp & proc_bind (master) lastprivate (s) ordered schedule (static, 8) -+ do i = 1, 10 -+ do j = 1, 10 -+ r = r + 1 -+ p = q -+ call dosomething (a, n, p + q) -+ end do -+ !$omp ordered -+ p = q -+ !$omp end ordered -+ s = i * 10 -+ end do -+ !$omp end distribute parallel do -+ !$omp end target teams -+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) & -+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) & -+ !$omp & default(shared) shared(n) private (p) reduction(+:r) -+ !$omp distribute parallel do simd if(n.ne.6)default(shared)& -+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) & -+ !$omp & dist_schedule (static, 4) collapse (2) safelen(8) & -+ !$omp & num_threads (n + 4) proc_bind (spread) lastprivate (s) & -+ !$omp & schedule (static, 8) -+ do i = 1, 10 -+ do j = 1, 10 -+ r = r + 1 -+ p = q -+ a(2+i*10+j) = p + q -+ s = i * 10 + j -+ end do -+ end do -+ !$omp end target teams -+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) & -+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) & -+ !$omp & default(shared) shared(n) private (p) reduction(+:r) -+ !$omp distribute parallel do simd if (n .ne. 6)default(shared) & -+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) & -+ !$omp & dist_schedule (static, 4) num_threads (n + 4) & -+ !$omp & proc_bind (master) lastprivate (s) schedule (static, 8) & -+ !$omp & safelen(16) linear(i:1) aligned (pp:4) -+ do i = 1, 10 -+ r = r + 1 -+ p = q -+ a(1+i) = p + q -+ s = i * 10 -+ end do -+ !$omp end distribute parallel do simd -+ !$omp end target teams -+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) & -+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) & -+ !$omp & default(shared) shared(n) private (p) reduction(+:r) -+ !$omp distribute simd safelen(8) lastprivate(s) & -+ !$omp & private (p) firstprivate (q) reduction (+: r) & -+ !$omp & dist_schedule (static, 4) collapse (2) -+ do i = 1, 10 -+ do j = 1, 10 -+ r = r + 1 -+ p = q -+ a(2+i*10+j) = p + q -+ s = i * 10 + j -+ end do -+ end do -+ !$omp end target teams -+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) & -+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) & -+ !$omp & default(shared) shared(n) private (p) reduction(+:r) -+ !$omp distribute simd aligned (pp:4) & -+ !$omp & private (p) firstprivate (q) reduction (+: r) & -+ !$omp & dist_schedule (static, 4) lastprivate (s) -+ do i = 1, 10 -+ r = r + 1 -+ p = q -+ a(1+i) = p + q -+ s = i * 10 -+ end do -+ !$omp end distribute simd -+ !$omp end target teams -+ end subroutine -+end module -Index: gcc/testsuite/gfortran.dg/gomp/target2.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/gomp/target2.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/gomp/target2.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,74 @@ -+! { dg-do compile } -+! { dg-options "-fopenmp -ffree-line-length-160" } -+ -+subroutine foo (n, s, t, u, v, w) -+ integer :: n, i, s, t, u, v, w -+ common /bar/ i -+ !$omp simd safelen(s + 1) -+ do i = 1, n -+ end do -+ !$omp do schedule (static, t * 2) -+ do i = 1, n -+ end do -+ !$omp do simd safelen(s + 1) schedule (static, t * 2) -+ do i = 1, n -+ end do -+ !$omp parallel do schedule (static, t * 2) num_threads (u - 1) -+ do i = 1, n -+ end do -+ !$omp parallel do simd safelen(s + 1) schedule (static, t * 2) num_threads (u - 1) -+ do i = 1, n -+ end do -+ !$omp distribute dist_schedule (static, v + 8) -+ do i = 1, n -+ end do -+ !$omp distribute simd dist_schedule (static, v + 8) safelen(s + 1) -+ do i = 1, n -+ end do -+ !$omp distribute parallel do simd dist_schedule (static, v + 8) safelen(s + 1) & -+ !$omp & schedule (static, t * 2) num_threads (u - 1) -+ do i = 1, n -+ end do -+ !$omp distribute parallel do dist_schedule (static, v + 8) num_threads (u - 1) & -+ !$omp & schedule (static, t * 2) -+ do i = 1, n -+ end do -+ !$omp target -+ !$omp teams distribute dist_schedule (static, v + 8) num_teams (w + 8) -+ do i = 1, n -+ end do -+ !$omp end target -+ !$omp target -+ !$omp teams distribute simd dist_schedule (static, v + 8) safelen(s + 1) & -+ !$omp & num_teams (w + 8) -+ do i = 1, n -+ end do -+ !$omp end target -+ !$omp target -+ !$omp teams distribute parallel do simd dist_schedule (static, v + 8) safelen(s + 1) & -+ !$omp & schedule (static, t * 2) num_threads (u - 1) num_teams (w + 8) -+ do i = 1, n -+ end do -+ !$omp end target -+ !$omp target -+ !$omp teams distribute parallel do dist_schedule (static, v + 8) num_threads (u - 1) & -+ !$omp & schedule (static, t * 2) num_teams (w + 8) -+ do i = 1, n -+ end do -+ !$omp end target -+ !$omp target teams distribute dist_schedule (static, v + 8) num_teams (w + 8) -+ do i = 1, n -+ end do -+ !$omp target teams distribute simd dist_schedule (static, v + 8) safelen(s + 1) & -+ !$omp & num_teams (w + 8) -+ do i = 1, n -+ end do -+ !$omp target teams distribute parallel do simd dist_schedule (static, v + 8) safelen(s + 1) & -+ !$omp & schedule (static, t * 2) num_threads (u - 1) num_teams (w + 8) -+ do i = 1, n -+ end do -+ !$omp target teams distribute parallel do dist_schedule (static, v + 8) num_threads (u - 1) & -+ !$omp & schedule (static, t * 2) num_teams (w + 8) -+ do i = 1, n -+ end do -+end subroutine -Index: gcc/testsuite/gfortran.dg/gomp/target3.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/gomp/target3.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/gomp/target3.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,12 @@ -+! { dg-do compile } -+! { dg-options "-fopenmp" } -+ -+subroutine foo (r) -+ integer :: i, r -+ !$omp target -+ !$omp target teams distribute parallel do reduction (+: r) ! { dg-warning "target construct inside of target region" } -+ do i = 1, 10 -+ r = r + 1 -+ end do -+ !$omp end target -+end subroutine -Index: gcc/testsuite/gfortran.dg/gomp/reduction1.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/gomp/reduction1.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/gomp/reduction1.f90 (.../branches/gcc-4_9-branch) -@@ -60,73 +60,73 @@ - !$omp end parallel - !$omp parallel reduction (*:ia1) ! { dg-error "Assumed size" } - !$omp end parallel --!$omp parallel reduction (+:l1) ! { dg-error "must be of numeric type, got LOGICAL" } -+!$omp parallel reduction (+:l1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (*:la1) ! { dg-error "must be of numeric type, got LOGICAL" } -+!$omp parallel reduction (*:la1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (-:a1) ! { dg-error "must be of numeric type, got CHARACTER" } -+!$omp parallel reduction (-:a1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (+:t1) ! { dg-error "must be of numeric type, got TYPE" } -+!$omp parallel reduction (+:t1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (*:ta1) ! { dg-error "must be of numeric type, got TYPE" } -+!$omp parallel reduction (*:ta1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (.and.:i3) ! { dg-error "must be LOGICAL" } -+!$omp parallel reduction (.and.:i3) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (.or.:ia2) ! { dg-error "must be LOGICAL" } -+!$omp parallel reduction (.or.:ia2) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (.eqv.:r1) ! { dg-error "must be LOGICAL" } -+!$omp parallel reduction (.eqv.:r1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (.neqv.:ra1) ! { dg-error "must be LOGICAL" } -+!$omp parallel reduction (.neqv.:ra1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (.and.:d1) ! { dg-error "must be LOGICAL" } -+!$omp parallel reduction (.and.:d1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (.or.:da1) ! { dg-error "must be LOGICAL" } -+!$omp parallel reduction (.or.:da1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (.eqv.:c1) ! { dg-error "must be LOGICAL" } -+!$omp parallel reduction (.eqv.:c1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (.neqv.:ca1) ! { dg-error "must be LOGICAL" } -+!$omp parallel reduction (.neqv.:ca1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (.and.:a1) ! { dg-error "must be LOGICAL" } -+!$omp parallel reduction (.and.:a1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (.or.:t1) ! { dg-error "must be LOGICAL" } -+!$omp parallel reduction (.or.:t1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (.eqv.:ta1) ! { dg-error "must be LOGICAL" } -+!$omp parallel reduction (.eqv.:ta1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (min:c1) ! { dg-error "must be INTEGER or REAL" } -+!$omp parallel reduction (min:c1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (max:ca1) ! { dg-error "must be INTEGER or REAL" } -+!$omp parallel reduction (max:ca1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (max:l1) ! { dg-error "must be INTEGER or REAL" } -+!$omp parallel reduction (max:l1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (min:la1) ! { dg-error "must be INTEGER or REAL" } -+!$omp parallel reduction (min:la1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (max:a1) ! { dg-error "must be INTEGER or REAL" } -+!$omp parallel reduction (max:a1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (min:t1) ! { dg-error "must be INTEGER or REAL" } -+!$omp parallel reduction (min:t1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (max:ta1) ! { dg-error "must be INTEGER or REAL" } -+!$omp parallel reduction (max:ta1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (iand:r1) ! { dg-error "must be INTEGER" } -+!$omp parallel reduction (iand:r1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (ior:ra1) ! { dg-error "must be INTEGER" } -+!$omp parallel reduction (ior:ra1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (ieor:d1) ! { dg-error "must be INTEGER" } -+!$omp parallel reduction (ieor:d1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (ior:da1) ! { dg-error "must be INTEGER" } -+!$omp parallel reduction (ior:da1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (iand:c1) ! { dg-error "must be INTEGER" } -+!$omp parallel reduction (iand:c1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (ior:ca1) ! { dg-error "must be INTEGER" } -+!$omp parallel reduction (ior:ca1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (ieor:l1) ! { dg-error "must be INTEGER" } -+!$omp parallel reduction (ieor:l1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (iand:la1) ! { dg-error "must be INTEGER" } -+!$omp parallel reduction (iand:la1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (ior:a1) ! { dg-error "must be INTEGER" } -+!$omp parallel reduction (ior:a1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (ieor:t1) ! { dg-error "must be INTEGER" } -+!$omp parallel reduction (ieor:t1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel --!$omp parallel reduction (iand:ta1) ! { dg-error "must be INTEGER" } -+!$omp parallel reduction (iand:ta1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" } - !$omp end parallel - - end subroutine -Index: gcc/testsuite/gfortran.dg/gomp/reduction3.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/gomp/reduction3.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/gomp/reduction3.f90 (.../branches/gcc-4_9-branch) -@@ -16,7 +16,7 @@ - integer :: i, ior - ior = 6 - i = 6 --!$omp parallel reduction (ior:i) ! { dg-error "is not INTRINSIC procedure name" } -+!$omp parallel reduction (ior:i) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found" } - !$omp end parallel - end subroutine f1 - subroutine f2 -@@ -27,7 +27,7 @@ - end function - end interface - i = 6 --!$omp parallel reduction (ior:i) ! { dg-error "is not INTRINSIC procedure name" } -+!$omp parallel reduction (ior:i) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found" } - i = ior (i, 3) - !$omp end parallel - end subroutine f2 -@@ -50,7 +50,7 @@ - use mreduction3 - integer :: i - i = 6 --!$omp parallel reduction (ior:i) ! { dg-error "is not INTRINSIC procedure name" } -+!$omp parallel reduction (ior:i) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found" } - i = ior (i, 7) - !$omp end parallel - end subroutine f5 -@@ -58,7 +58,7 @@ - use mreduction3 - integer :: i - i = 6 --!$omp parallel reduction (iand:i) ! { dg-error "is not INTRINSIC procedure name" } -+!$omp parallel reduction (iand:i) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found" } - i = iand (i, 18) - !$omp end parallel - end subroutine f6 -Index: gcc/testsuite/gfortran.dg/gomp/declare-simd-1.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/gomp/declare-simd-1.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/gomp/declare-simd-1.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,9 @@ -+! { dg-do compile } -+ -+subroutine fn1 (x) -+ integer :: x -+!$omp declare simd (fn1) inbranch notinbranch uniform (x) ! { dg-error "Unclassifiable OpenMP directive" } -+end subroutine fn1 -+subroutine fn2 (x) -+!$omp declare simd (fn100) ! { dg-error "should refer to containing procedure" } -+end subroutine fn2 -Index: gcc/testsuite/gfortran.dg/gomp/associate1.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/gomp/associate1.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/gomp/associate1.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,83 @@ -+! { dg-do compile } -+ -+program associate1 -+ type dl -+ integer :: i -+ end type -+ type dt -+ integer :: i -+ real :: a(3, 3) -+ type(dl) :: c(3, 3) -+ end type -+ integer :: v, i, j -+ real :: a(3, 3) -+ type(dt) :: b(3) -+ i = 1 -+ j = 2 -+ associate(k => v, l => a(i, j), m => a(i, :)) -+ associate(n => b(j)%c(:, :)%i, o => a, p => b) -+!$omp parallel shared (l) ! { dg-error "ASSOCIATE name" } -+!$omp end parallel -+!$omp parallel firstprivate (m) ! { dg-error "ASSOCIATE name" } -+!$omp end parallel -+!$omp parallel reduction (+: k) ! { dg-error "ASSOCIATE name" } -+!$omp end parallel -+!$omp parallel do firstprivate (k) ! { dg-error "ASSOCIATE name" } -+ do i = 1, 10 -+ end do -+!$omp parallel do lastprivate (n) ! { dg-error "ASSOCIATE name" } -+ do i = 1, 10 -+ end do -+!$omp parallel do private (o) ! { dg-error "ASSOCIATE name" } -+ do i = 1, 10 -+ end do -+!$omp parallel do shared (p) ! { dg-error "ASSOCIATE name" } -+ do i = 1, 10 -+ end do -+!$omp task private (k) ! { dg-error "ASSOCIATE name" } -+!$omp end task -+!$omp task shared (l) ! { dg-error "ASSOCIATE name" } -+!$omp end task -+!$omp task firstprivate (m) ! { dg-error "ASSOCIATE name" } -+!$omp end task -+!$omp do private (l) ! { dg-error "ASSOCIATE name" } -+ do i = 1, 10 -+ end do -+!$omp do reduction (*: k) ! { dg-error "ASSOCIATE name" } -+ do i = 1, 10 -+ end do -+!$omp sections private(o) ! { dg-error "ASSOCIATE name" } -+!$omp section -+!$omp section -+!$omp end sections -+!$omp parallel sections firstprivate(p) ! { dg-error "ASSOCIATE name" } -+!$omp section -+!$omp section -+!$omp endparallelsections -+!$omp parallelsections lastprivate(m) ! { dg-error "ASSOCIATE name" } -+!$omp section -+!$omp section -+!$omp endparallelsections -+!$omp sections reduction(+:k) ! { dg-error "ASSOCIATE name" } -+!$omp section -+!$omp section -+!$omp end sections -+!$omp simd private (l) ! { dg-error "ASSOCIATE name" } -+ do i = 1, 10 -+ end do -+ k = 1 -+!$omp simd lastprivate (m) ! { dg-error "ASSOCIATE name" } -+ do i = 1, 10 -+ end do -+ k = 1 -+!$omp simd reduction (+: k) ! { dg-error "ASSOCIATE name" } -+ do i = 1, 10 -+ end do -+ k = 1 -+!$omp simd linear (k : 2) ! { dg-error "ASSOCIATE name" } -+ do i = 1, 10 -+ k = k + 2 -+ end do -+ end associate -+ end associate -+end program -Index: gcc/testsuite/gfortran.dg/gomp/openmp-simd-1.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/gomp/openmp-simd-1.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/gomp/openmp-simd-1.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,137 @@ -+! { dg-do compile } -+! { dg-options "-fno-openmp -fopenmp-simd -fdump-tree-original -O2" } -+ -+!$omp declare reduction (foo:integer:omp_out = omp_out + omp_in) -+ interface -+ integer function foo (x, y) -+ integer, value :: x, y -+!$omp declare simd (foo) linear (y : 2) -+ end function foo -+ end interface -+ integer :: i, a(64), b, c -+ integer, save :: d -+!$omp threadprivate (d) -+ d = 5 -+ a = 6 -+!$omp simd -+ do i = 1, 64 -+ a(i) = foo (a(i), 2 * i) -+ end do -+ b = 0 -+ c = 0 -+!$omp simd reduction (+:b) reduction (foo:c) -+ do i = 1, 64 -+ b = b + a(i) -+ c = c + a(i) * 2 -+ end do -+ print *, b -+ b = 0 -+!$omp parallel -+!$omp do simd schedule(static, 4) safelen (8) reduction (+:b) -+ do i = 1, 64 -+ a(i) = a(i) + 1 -+ b = b + 1 -+ end do -+!$omp end parallel -+ print *, b -+ b = 0 -+!$omp parallel do simd schedule(static, 4) safelen (8) & -+!$omp num_threads (4) if (.true.) reduction (+:b) -+ do i = 1, 64 -+ a(i) = a(i) + 1 -+ b = b + 1 -+ end do -+ print *, b -+ b = 0 -+!$omp parallel -+!$omp do simd schedule(static, 4) safelen (8) reduction (+:b) -+ do i = 1, 64 -+ a(i) = a(i) + 1 -+ b = b + 1 -+ end do -+!$omp enddosimd -+!$omp end parallel -+ print *, b -+ b = 0 -+!$omp parallel do simd schedule(static, 4) safelen (8) & -+!$omp num_threads (4) if (.true.) reduction (+:b) -+ do i = 1, 64 -+ a(i) = a(i) + 1 -+ b = b + 1 -+ end do -+!$omp end parallel do simd -+!$omp atomic seq_cst -+ b = b + 1 -+!$omp end atomic -+!$omp barrier -+!$omp parallel private (i) -+!$omp cancellation point parallel -+!$omp critical (bar) -+ b = b + 1 -+!$omp end critical (bar) -+!$omp flush(b) -+!$omp single -+ b = b + 1 -+!$omp end single -+!$omp do ordered -+ do i = 1, 10 -+ !$omp atomic -+ b = b + 1 -+ !$omp end atomic -+ !$omp ordered -+ print *, b -+ !$omp end ordered -+ end do -+!$omp end do -+!$omp master -+ b = b + 1 -+!$omp end master -+!$omp cancel parallel -+!$omp end parallel -+!$omp parallel do schedule(runtime) num_threads(8) -+ do i = 1, 10 -+ print *, b -+ end do -+!$omp end parallel do -+!$omp sections -+!$omp section -+ b = b + 1 -+!$omp section -+ c = c + 1 -+!$omp end sections -+ print *, b -+!$omp parallel sections firstprivate (b) if (.true.) -+!$omp section -+ b = b + 1 -+!$omp section -+ c = c + 1 -+!$omp endparallelsections -+!$omp workshare -+ b = 24 -+!$omp end workshare -+!$omp parallel workshare num_threads (2) -+ b = b + 1 -+ c = c + 1 -+!$omp end parallel workshare -+ print *, b -+!$omp parallel -+!$omp single -+!$omp taskgroup -+!$omp task firstprivate (b) -+ b = b + 1 -+!$omp taskyield -+!$omp end task -+!$omp task firstprivate (b) -+ b = b + 1 -+!$omp end task -+!$omp taskwait -+!$omp end taskgroup -+!$omp end single -+!$omp end parallel -+ print *, a, c -+end -+ -+! { dg-final { scan-tree-dump-times "pragma omp simd" 6 "original" } } -+! { dg-final { scan-tree-dump-times "pragma omp" 6 "original" } } -+! { dg-final { scan-tree-dump-times "__builtin_GOMP" 0 "original" } } -+! { dg-final { cleanup-tree-dump "original" } } -Index: gcc/testsuite/gfortran.dg/gomp/openmp-simd-2.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/gomp/openmp-simd-2.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/gomp/openmp-simd-2.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,28 @@ -+! { dg-do compile } -+! { dg-options "-fopenmp -fopenmp-simd -fdump-tree-original -O2" } -+ -+include 'openmp-simd-1.f90' -+ -+! { dg-final { scan-tree-dump-times "pragma omp simd" 6 "original" } } -+! { dg-final { scan-tree-dump-times "pragma omp" 39 "original" } } -+! { dg-final { scan-tree-dump-times "pragma omp for" 6 "original" } } -+! { dg-final { scan-tree-dump-times "pragma omp parallel" 9 "original" } } -+! { dg-final { scan-tree-dump-times "pragma omp taskgroup" 1 "original" } } -+! Includes the above taskgroup -+! { dg-final { scan-tree-dump-times "pragma omp task" 3 "original" } } -+! { dg-final { scan-tree-dump-times "pragma omp critical" 1 "original" } } -+! { dg-final { scan-tree-dump-times "pragma omp atomic" 2 "original" } } -+! { dg-final { scan-tree-dump-times "pragma omp sections" 2 "original" } } -+! Includes the above sections -+! { dg-final { scan-tree-dump-times "pragma omp section" 6 "original" } } -+! { dg-final { scan-tree-dump-times "pragma omp single" 4 "original" } } -+! { dg-final { scan-tree-dump-times "pragma omp ordered" 1 "original" } } -+! { dg-final { scan-tree-dump-times "pragma omp master" 1 "original" } } -+! { dg-final { scan-tree-dump-times "__builtin_GOMP" 5 "original" } } -+! { dg-final { scan-tree-dump-times "__builtin_GOMP_barrier" 1 "original" } } -+! { dg-final { scan-tree-dump-times "__builtin_GOMP_cancellation_point" 1 "original" } } -+! Includes the above cancellation point -+! { dg-final { scan-tree-dump-times "__builtin_GOMP_cancel" 2 "original" } } -+! { dg-final { scan-tree-dump-times "__builtin_GOMP_taskyield" 1 "original" } } -+! { dg-final { scan-tree-dump-times "__builtin_GOMP_taskwait" 1 "original" } } -+! { dg-final { cleanup-tree-dump "original" } } -Index: gcc/testsuite/gfortran.dg/gomp/openmp-simd-3.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/gomp/openmp-simd-3.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/gomp/openmp-simd-3.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,28 @@ -+! { dg-do compile } -+! { dg-options "-fopenmp -fno-openmp-simd -fdump-tree-original -O2" } -+ -+include 'openmp-simd-1.f90' -+ -+! { dg-final { scan-tree-dump-times "pragma omp simd" 6 "original" } } -+! { dg-final { scan-tree-dump-times "pragma omp" 39 "original" } } -+! { dg-final { scan-tree-dump-times "pragma omp for" 6 "original" } } -+! { dg-final { scan-tree-dump-times "pragma omp parallel" 9 "original" } } -+! { dg-final { scan-tree-dump-times "pragma omp taskgroup" 1 "original" } } -+! Includes the above taskgroup -+! { dg-final { scan-tree-dump-times "pragma omp task" 3 "original" } } -+! { dg-final { scan-tree-dump-times "pragma omp critical" 1 "original" } } -+! { dg-final { scan-tree-dump-times "pragma omp atomic" 2 "original" } } -+! { dg-final { scan-tree-dump-times "pragma omp sections" 2 "original" } } -+! Includes the above sections -+! { dg-final { scan-tree-dump-times "pragma omp section" 6 "original" } } -+! { dg-final { scan-tree-dump-times "pragma omp single" 4 "original" } } -+! { dg-final { scan-tree-dump-times "pragma omp ordered" 1 "original" } } -+! { dg-final { scan-tree-dump-times "pragma omp master" 1 "original" } } -+! { dg-final { scan-tree-dump-times "__builtin_GOMP" 5 "original" } } -+! { dg-final { scan-tree-dump-times "__builtin_GOMP_barrier" 1 "original" } } -+! { dg-final { scan-tree-dump-times "__builtin_GOMP_cancellation_point" 1 "original" } } -+! Includes the above cancellation point -+! { dg-final { scan-tree-dump-times "__builtin_GOMP_cancel" 2 "original" } } -+! { dg-final { scan-tree-dump-times "__builtin_GOMP_taskyield" 1 "original" } } -+! { dg-final { scan-tree-dump-times "__builtin_GOMP_taskwait" 1 "original" } } -+! { dg-final { cleanup-tree-dump "original" } } -Index: gcc/testsuite/gfortran.dg/gomp/depend-1.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/gomp/depend-1.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/gomp/depend-1.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,13 @@ -+! { dg-do compile } -+ -+subroutine foo (x) -+ integer :: x(5, *) -+!$omp parallel -+!$omp single -+!$omp task depend(in:x(:,5)) -+!$omp end task -+!$omp task depend(in:x(5,:)) ! { dg-error "Rightmost upper bound of assumed size array section|proper array section" } -+!$omp end task -+!$omp end single -+!$omp end parallel -+end -Index: gcc/testsuite/gfortran.dg/gomp/affinity-1.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/gomp/affinity-1.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/gomp/affinity-1.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,19 @@ -+ integer :: i, j -+ integer, dimension (10, 10) :: a -+!$omp parallel do default(none)proc_bind(master)shared(a) -+ do i = 1, 10 -+ j = 4 -+ do j = 1, 10 -+ a(i, j) = i + j -+ end do -+ j = 8 -+ end do -+!$omp end parallel do -+!$omp parallel proc_bind (close) -+!$omp parallel default(none) proc_bind (spread) firstprivate(a) private (i) -+ do i = 1, 10 -+ a(i, i) = i -+ enddo -+!$omp end parallel -+!$omp endparallel -+end -Index: gcc/testsuite/gfortran.dg/gomp/intentin1.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/gomp/intentin1.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/gomp/intentin1.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,16 @@ -+! { dg-do compile } -+ -+subroutine foo (x) -+ integer, pointer, intent (in) :: x -+ integer :: i -+!$omp parallel private (x) ! { dg-error "INTENT.IN. POINTER" } -+!$omp end parallel -+!$omp parallel do lastprivate (x) ! { dg-error "INTENT.IN. POINTER" } -+ do i = 1, 10 -+ end do -+!$omp simd linear (x) ! { dg-error "INTENT.IN. POINTER" } -+ do i = 1, 10 -+ end do -+!$omp single ! { dg-error "INTENT.IN. POINTER" } -+!$omp end single copyprivate (x) -+end -Index: gcc/testsuite/gfortran.dg/gomp/omp_do_concurrent.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/gomp/omp_do_concurrent.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/gomp/omp_do_concurrent.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,13 @@ -+! { dg-do compile } -+! { dg-options "-fopenmp" } -+! -+! PR fortran/60127 -+! -+! OpenMP 4.0 doesn't permit DO CONCURRENT (yet) -+! -+ -+!$omp do -+do concurrent(i=1:5) ! { dg-error "OMP DO cannot be a DO CONCURRENT loop" } -+print *, 'Hello' -+end do -+end -Index: gcc/testsuite/gfortran.dg/gomp/proc_ptr_2.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/gomp/proc_ptr_2.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/gomp/proc_ptr_2.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,14 @@ -+! { dg-do compile } -+ procedure(foo), pointer :: ptr -+ integer :: i -+ ptr => foo -+!$omp do reduction (+ : ptr) ! { dg-error "Procedure pointer|not found" } -+ do i = 1, 10 -+ end do -+!$omp simd linear (ptr) ! { dg-error "must be INTEGER" } -+ do i = 1, 10 -+ end do -+contains -+ subroutine foo -+ end subroutine -+end -Index: gcc/testsuite/gfortran.dg/gomp/udr1.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/gomp/udr1.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/gomp/udr1.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,41 @@ -+! { dg-do compile } -+ -+subroutine f1 -+!$omp declare reduction (.le.:integer:omp_out = omp_out + omp_in) ! { dg-error "Invalid operator for" } -+end subroutine f1 -+subroutine f2 -+!$omp declare reduction (bar:real(kind=4):omp_out = omp_out + omp_in) -+ real(kind=4) :: r -+ integer :: i -+ r = 0.0 -+!$omp parallel do reduction (bar:r) -+ do i = 1, 10 -+ r = r + i -+ end do -+!$omp parallel do reduction (foo:r) ! { dg-error "foo not found" } -+ do i = 1, 10 -+ r = r + i -+ end do -+!$omp parallel do reduction (.gt.:r) ! { dg-error "cannot be used as a defined operator" } -+ do i = 1, 10 -+ r = r + i -+ end do -+end subroutine f2 -+subroutine f3 -+!$omp declare reduction (foo:blah:omp_out=omp_out + omp_in) ! { dg-error "Unclassifiable OpenMP directive" } -+end subroutine f3 -+subroutine f4 -+!$omp declare reduction (foo:integer:a => null()) ! { dg-error "Invalid character in name" } -+!$omp declare reduction (foo:integer:omp_out = omp_in + omp_out) & -+!$omp & initializer(a => null()) ! { dg-error "Invalid character in name" } -+end subroutine f4 -+subroutine f5 -+ integer :: a, b -+!$omp declare reduction (foo:integer:a = b + 1) ! { dg-error "Variable other than OMP_OUT or OMP_IN used in combiner" } -+!$omp declare reduction (bar:integer:omp_out = omp_out * omp_in) & -+!$omp & initializer(b = a + 1) ! { dg-error "Variable other than OMP_PRIV or OMP_ORIG used in INITIALIZER clause" } -+end subroutine f5 -+subroutine f6 -+!$omp declare reduction (foo:integer:omp_out=omp_out+omp_in) & -+!$omp & initializer(omp_orig=omp_priv) -+end subroutine f6 -Index: gcc/testsuite/gfortran.dg/gomp/udr2.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/gomp/udr2.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/gomp/udr2.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,53 @@ -+! { dg-do compile } -+ -+subroutine f6 -+!$omp declare reduction (foo:real:omp_out (omp_in)) ! { dg-error "Unclassifiable OpenMP directive" } -+!$omp declare reduction (bar:real:omp_out = omp_in * omp_out) & ! { dg-error "Unclassifiable OpenMP directive" } -+!$omp & initializer (omp_priv (omp_orig)) -+end subroutine f6 -+subroutine f7 -+ integer :: a -+!$omp declare reduction (foo:integer:a (omp_out, omp_in)) ! { dg-error "Unclassifiable OpenMP directive" } -+!$omp declare reduction (bar:real:omp_out = omp_out.or.omp_in) ! { dg-error "Operands of logical operator" } -+!$omp declare reduction (baz:real:omp_out = omp_out + omp_in) -+!$omp & initializer (a (omp_priv, omp_orig)) ! { dg-error "Unclassifiable OpenMP directive" } -+ real :: r -+ r = 0.0 -+!$omp parallel reduction (bar:r) -+!$omp end parallel -+end subroutine f7 -+subroutine f8 -+ interface -+ subroutine f8a (x) -+ integer :: x -+ end subroutine f8a -+ end interface -+!$omp declare reduction (baz:integer:omp_out = omp_out + omp_in) & -+!$omp & initializer (f8a (omp_orig)) ! { dg-error "One of actual subroutine arguments in INITIALIZER clause" } -+!$omp declare reduction (foo:integer:f8a) ! { dg-error "is not a variable" } -+!$omp declare reduction (bar:integer:omp_out = omp_out - omp_in) & -+!$omp & initializer (f8a) ! { dg-error "is not a variable" } -+end subroutine f8 -+subroutine f9 -+ type dt ! { dg-error "which is not consistent with the CALL" } -+ integer :: x = 0 -+ integer :: y = 0 -+ end type dt -+ integer :: i -+!$omp declare reduction (foo:integer:dt (omp_out, omp_in)) ! { dg-error "which is not consistent with the CALL" } -+!$omp declare reduction (bar:integer:omp_out = omp_out + omp_in) & -+!$omp & initializer (dt (omp_priv, omp_orig)) ! { dg-error "which is not consistent with the CALL" } -+ i = 0 -+!$omp parallel reduction (foo : i) -+!$omp end parallel -+!$omp parallel reduction (bar : i) -+!$omp end parallel -+end subroutine f9 -+subroutine f10 -+ integer :: a, b -+!$omp declare reduction(foo:character(len=64) & -+!$omp & :omp_out(a:b) = omp_in(a:b)) ! { dg-error "Variable other than OMP_OUT or OMP_IN used in combiner" } -+!$omp declare reduction(bar:character(len=16) & -+!$omp & :omp_out = trim(omp_out) // omp_in) & -+!$omp & initializer (omp_priv(a:b) = ' ') ! { dg-error "Variable other than OMP_PRIV or OMP_ORIG used in INITIALIZER clause" } -+end subroutine f10 -Index: gcc/testsuite/gfortran.dg/gomp/udr3.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/gomp/udr3.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/gomp/udr3.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,75 @@ -+! { dg-do compile } -+ -+subroutine f1 -+ type dt -+ logical :: l = .false. -+ end type -+ type dt2 -+ logical :: l = .false. -+ end type -+!$omp declare reduction (foo:integer(kind = 4) & ! { dg-error "Previous !.OMP DECLARE REDUCTION" } -+!$omp & :omp_out = omp_out + omp_in) -+!$omp declare reduction (foo:integer(kind = 4) : & ! { dg-error "Redefinition of !.OMP DECLARE REDUCTION" } -+!$omp & omp_out = omp_out + omp_in) -+!$omp declare reduction (bar:integer, & -+!$omp & real:omp_out = omp_out + omp_in) -+!$omp declare reduction (baz:integer,real,integer & ! { dg-error "Redefinition of !.OMP DECLARE REDUCTION|Previous" } -+!$omp & : omp_out = omp_out + omp_in) -+!$omp declare reduction (id1:dt,dt2:omp_out%l=omp_out%l & -+!$omp & .or.omp_in%l) -+!$omp declare reduction (id2:dt,dt:omp_out%l=omp_out%l & ! { dg-error "Redefinition of !.OMP DECLARE REDUCTION|Previous" } -+!$omp & .or.omp_in%l) -+!$omp declare reduction (id3:dt2,dt:omp_out%l=omp_out%l & ! { dg-error "Previous !.OMP DECLARE REDUCTION" } -+!$omp & .or.omp_in%l) -+!$omp declare reduction (id3:dt2:omp_out%l=omp_out%l & ! { dg-error "Redefinition of !.OMP DECLARE REDUCTION" } -+!$omp & .or.omp_in%l) -+end subroutine f1 -+subroutine f2 -+ interface -+ subroutine f2a (x, y, z) -+ character (len = *) :: x, y -+ logical :: z -+ end subroutine -+ end interface -+ interface f2b -+ subroutine f2b (x, y, z) -+ character (len = *, kind = 1) :: x, y -+ logical :: z -+ end subroutine -+ subroutine f2c (x, y, z) -+ character (kind = 4, len = *) :: x, y -+ logical :: z -+ end subroutine -+ end interface -+!$omp declare reduction (foo:character(len=*): & -+!$omp & f2a (omp_out, omp_in, .false.)) & -+!$omp & initializer (f2a (omp_priv, omp_orig, .true.)) -+!$omp declare reduction (bar:character(len=:): & -+!$omp & f2a (omp_out, omp_in, .false.)) & -+!$omp & initializer (f2a (omp_priv, omp_orig, .true.)) -+!$omp declare reduction (baz:character(len=4): & -+!$omp & f2a (omp_out, omp_in, .false.)) & -+!$omp & initializer (f2a (omp_priv, omp_orig, .true.)) -+!$omp declare reduction (baz:character(len=5): & -+!$omp & f2a (omp_out, omp_in, .false.)) & -+!$omp & initializer (f2a (omp_priv, omp_orig, .true.)) -+!$omp declare reduction (baz:character(len=6): & -+!$omp & f2a (omp_out, omp_in, .false.)) & -+!$omp & initializer (f2a (omp_priv, omp_orig, .true.)) -+!$omp declare reduction (id:character(len=*): & ! { dg-error "Previous !.OMP DECLARE REDUCTION" } -+!$omp & f2a (omp_out, omp_in, .false.)) & -+!$omp & initializer (f2a (omp_priv, omp_orig, .true.)) -+!$omp declare reduction (id: & ! { dg-error "Redefinition of !.OMP DECLARE REDUCTION" } -+!$omp & character(len=:) : f2a (omp_out, omp_in, .false.)) & -+!$omp & initializer (f2a (omp_priv, omp_orig, .true.)) -+!$omp declare reduction & ! { dg-error "Redefinition of !.OMP DECLARE REDUCTION|Previous" } -+!$omp (id2:character(len=*), character(len=:): & -+!$omp f2a (omp_out, omp_in, .false.)) & -+!$omp & initializer (f2a (omp_priv, omp_orig, .true.)) -+!$omp declare reduction (id3:character(len=*, kind = 1), character(kind=4, len=:): & -+!$omp f2b (omp_out, omp_in, .false.)) & -+!$omp & initializer (f2b (omp_priv, omp_orig, .true.)) -+!$omp declare reduction (id4:character(kind=4, len=4), character(kind =1, len=4): & -+!$omp f2b (omp_out, omp_in, .false.)) & -+!$omp & initializer (f2b (omp_priv, omp_orig, .true.)) -+end subroutine f2 -Index: gcc/testsuite/gfortran.dg/gomp/udr4.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/gomp/udr4.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/gomp/udr4.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,74 @@ -+! { dg-do compile } -+ -+subroutine f3 -+!$omp declare reduction ! { dg-error "Unclassifiable OpenMP directive" } -+!$omp declare reduction foo ! { dg-error "Unclassifiable OpenMP directive" } -+!$omp declare reduction (foo) ! { dg-error "Unclassifiable OpenMP directive" } -+!$omp declare reduction (foo:integer) ! { dg-error "Unclassifiable OpenMP directive" } -+!$omp declare reduction (foo:integer:omp_out=omp_out+omp_in) & -+!$omp & initializer(omp_priv=0) initializer(omp_priv=0) ! { dg-error "Unexpected junk after" } -+end subroutine f3 -+subroutine f4 -+ implicit integer (o) -+ implicit real (b) -+!$omp declare reduction (foo:integer:omp_priv(omp_out,omp_in)) ! { dg-error "Implicitly declared subroutine omp_priv" } -+!$omp declare reduction (foo:real:bar(omp_out,omp_in)) ! { dg-error "Implicitly declared subroutine bar used" } -+!$omp declare reduction (bar:integer:omp_out=omp_out+omp_in) & -+!$omp & initializer(omp_out (omp_priv)) ! { dg-error "Implicitly declared subroutine omp_out used" } -+!$omp declare reduction (bar:real:omp_out=omp_out+omp_in) & -+!$omp & initializer(bar (omp_priv, omp_orig)) ! { dg-error "Implicitly declared subroutine bar used" } -+!$omp declare reduction (id1:integer:omp_out=omp_orig(omp_out,omp_in)) ! { dg-error "Implicitly declared function omp_orig used" } -+!$omp declare reduction (id1:real:omp_out=foo(omp_out,omp_in)) ! { dg-error "Implicitly declared function foo used" } -+!$omp declare reduction (id2:integer:omp_out=omp_out+omp_in) & -+!$omp & initializer(omp_priv = omp_in (omp_orig)) ! { dg-error "Implicitly declared function omp_in used" } -+!$omp declare reduction (id2:real:omp_out=omp_out+omp_in) & -+!$omp & initializer(omp_priv = baz (omp_orig)) ! { dg-error "Implicitly declared function baz used" } -+ integer :: i -+ real :: r -+ i = 0 -+ r = 0 -+!$omp parallel reduction (foo: i, r) -+!$omp end parallel -+!$omp parallel reduction (bar: i, r) -+!$omp end parallel -+!$omp parallel reduction (id1: i, r) -+!$omp end parallel -+!$omp parallel reduction (id2: i, r) -+!$omp end parallel -+end subroutine f4 -+subroutine f5 -+ interface -+ subroutine f5a (x, *, y) -+ double precision :: x, y -+ end subroutine f5a -+ end interface -+!$omp declare reduction (foo:double precision: & ! { dg-error "Subroutine call with alternate returns in combiner" } -+!$omp & f5a (omp_out, *10, omp_in)) -+!$omp declare reduction (bar:double precision: & -+!$omp omp_out = omp_in + omp_out) & -+!$omp & initializer (f5a (omp_priv, *20, omp_orig)) ! { dg-error "Subroutine call with alternate returns in INITIALIZER clause" } -+10 continue -+20 continue -+end subroutine f5 -+subroutine f6 -+ integer :: a -+!$omp declare reduction(foo:character(len=a*2) & ! { dg-error "cannot appear in the expression|not constant" } -+!$omp & :omp_out=trim(omp_out)//omp_in) & -+!$omp & initializer(omp_priv=' ') -+end subroutine f6 -+subroutine f7 -+ type dt1 -+ integer :: a = 1 -+ integer :: b -+ end type -+ type dt2 -+ integer :: a = 2 -+ integer :: b = 3 -+ end type -+ type dt3 -+ integer :: a -+ integer :: b -+ end type dt3 -+!$omp declare reduction(foo:dt1,dt2:omp_out%a=omp_out%a+omp_in%a) -+!$omp declare reduction(foo:dt3:omp_out%a=omp_out%a+omp_in%a) ! { dg-error "Missing INITIALIZER clause for !.OMP DECLARE REDUCTION of derived type without default initializer" } -+end subroutine f7 -Index: gcc/testsuite/gfortran.dg/gomp/udr5.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/gomp/udr5.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/gomp/udr5.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,59 @@ -+! { dg-do compile } -+ -+module udr5m1 -+ type dt -+ real :: r -+ end type dt -+end module udr5m1 -+module udr5m2 -+ use udr5m1 -+ interface operator(+) -+ module procedure addm2 -+ end interface -+!$omp declare reduction(+:dt:omp_out=omp_out+omp_in) & -+!$omp & initializer(omp_priv=dt(0.0)) -+!$omp declare reduction(.myadd.:dt:omp_out=omp_out.myadd.omp_in) & -+!$omp & initializer(omp_priv=dt(0.0)) -+ interface operator(.myadd.) -+ module procedure addm2 -+ end interface -+contains -+ type(dt) function addm2 (x, y) -+ type(dt), intent (in):: x, y -+ addm2%r = x%r + y%r -+ end function -+end module udr5m2 -+module udr5m3 -+ use udr5m1 -+ interface operator(.myadd.) -+ module procedure addm3 -+ end interface -+!$omp declare reduction(+:dt:omp_out=omp_out+omp_in) & -+!$omp & initializer(omp_priv=dt(0.0)) -+!$omp declare reduction(.myadd.:dt:omp_out=omp_out.myadd.omp_in) & -+!$omp & initializer(omp_priv=dt(0.0)) -+ interface operator(+) -+ module procedure addm3 -+ end interface -+contains -+ type(dt) function addm3 (x, y) -+ type(dt), intent (in):: x, y -+ addm3%r = x%r + y%r -+ end function -+end module udr5m3 -+subroutine f1 -+ use udr5m2 -+ type(dt) :: d, e -+ integer :: i -+ d=dt(0.0) -+ e = dt (0.0) -+!$omp parallel do reduction (+ : d) reduction ( .myadd. : e) -+ do i=1,100 -+ d=d+dt(i) -+ e=e+dt(i) -+ end do -+end subroutine f1 -+subroutine f2 -+ use udr5m3 ! { dg-error "Previous !.OMP DECLARE REDUCTION|Ambiguous interfaces" } -+ use udr5m2 ! { dg-error "Ambiguous !.OMP DECLARE REDUCTION" } -+end subroutine f2 -Index: gcc/testsuite/gfortran.dg/gomp/udr6.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/gomp/udr6.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/gomp/udr6.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,205 @@ -+! { dg-do compile } -+! { dg-options "-fmax-errors=1000 -fopenmp -ffree-line-length-160" } -+ -+module udr6 -+ type dt -+ integer :: i -+ end type -+end module udr6 -+subroutine f1 -+ use udr6, only : dt -+!$omp declare reduction (+:integer:omp_out = omp_out + omp_in) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (+:real(kind=4):omp_out = omp_out + omp_in) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (+:double precision:omp_out = omp_out + omp_in) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (+:integer(kind=8),integer(kind=1) & ! { dg-error "Redefinition of predefined" } -+!$omp & :omp_out = omp_out + omp_in) -+!$omp declare reduction (+:complex:omp_out = omp_out + omp_in) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (+:complex(kind=8):omp_out = omp_out + omp_in) ! { dg-error "Redefinition of predefined" } -+ interface operator(+) -+ function addf1 (x, y) -+ use udr6, only : dt -+ type(dt), intent (in) :: x, y -+ type(dt) :: addf1 -+ end function -+ end interface -+end subroutine f1 -+subroutine f2 -+ use udr6, only : dt -+ interface operator(-) -+ function subf2 (x, y) -+ use udr6, only : dt -+ type(dt), intent (in) :: x, y -+ type(dt) :: subf2 -+ end function -+ end interface -+!$omp declare reduction (-:integer:omp_out = omp_out + omp_in) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (-:real(kind=4):omp_out = omp_out + omp_in) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (-:double precision:omp_out = omp_out + omp_in) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (-:integer(kind=8),integer(kind=1) & ! { dg-error "Redefinition of predefined" } -+!$omp & :omp_out = omp_out + omp_in) -+!$omp declare reduction (-:complex:omp_out = omp_out + omp_in) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (-:complex(kind=8):omp_out = omp_out + omp_in) ! { dg-error "Redefinition of predefined" } -+end subroutine f2 -+subroutine f3 -+ use udr6, only : dt -+ interface operator(*) -+ function mulf3 (x, y) -+ use udr6, only : dt -+ type(dt), intent (in) :: x, y -+ type(dt) :: mulf3 -+ end function -+ end interface -+!$omp declare reduction (*:integer:omp_out = omp_out * omp_in) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (*:real(kind=4):omp_out = omp_out * omp_in) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (*:double precision:omp_out = omp_out * omp_in) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (*:integer(kind=8),integer(kind=1) & ! { dg-error "Redefinition of predefined" } -+!$omp & :omp_out = omp_out * omp_in) -+!$omp declare reduction (*:complex:omp_out = omp_out * omp_in) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (*:complex(kind=8):omp_out = omp_out * omp_in) ! { dg-error "Redefinition of predefined" } -+end subroutine f3 -+subroutine f4 -+ use udr6, only : dt -+ interface operator(.and.) -+ function andf4 (x, y) -+ use udr6, only : dt -+ type(dt), intent (in) :: x, y -+ type(dt) :: andf4 -+ end function -+ end interface -+!$omp declare reduction (.neqv.:logical:omp_out = omp_out .or. omp_in) ! { dg-error "Redefinition of predefined" } -+ interface operator(.or.) -+ function orf4 (x, y) -+ use udr6, only : dt -+ type(dt), intent (in) :: x, y -+ type(dt) :: orf4 -+ end function -+ end interface -+!$omp declare reduction (.eqv.:logical:omp_out = omp_out .or. omp_in) ! { dg-error "Redefinition of predefined" } -+ interface operator(.eqv.) -+ function eqvf4 (x, y) -+ use udr6, only : dt -+ type(dt), intent (in) :: x, y -+ type(dt) :: eqvf4 -+ end function -+ end interface -+!$omp declare reduction (.or.:logical:omp_out = omp_out .or. omp_in) ! { dg-error "Redefinition of predefined" } -+ interface operator(.neqv.) -+ function neqvf4 (x, y) -+ use udr6, only : dt -+ type(dt), intent (in) :: x, y -+ type(dt) :: neqvf4 -+ end function -+ end interface -+!$omp declare reduction (.and.:logical:omp_out = omp_out .and. omp_in) ! { dg-error "Redefinition of predefined" } -+end subroutine f4 -+subroutine f5 -+ use udr6, only : dt -+ interface operator(.and.) -+ function andf5 (x, y) -+ use udr6, only : dt -+ type(dt), intent (in) :: x, y -+ type(dt) :: andf5 -+ end function -+ end interface -+!$omp declare reduction (.neqv.:logical(kind =4):omp_out = omp_out .neqv. omp_in) ! { dg-error "Redefinition of predefined" } -+ interface operator(.or.) -+ function orf5 (x, y) -+ use udr6, only : dt -+ type(dt), intent (in) :: x, y -+ type(dt) :: orf5 -+ end function -+ end interface -+!$omp declare reduction (.eqv.:logical(kind= 4):omp_out = omp_out .eqv. omp_in) ! { dg-error "Redefinition of predefined" } -+ interface operator(.eqv.) -+ function eqvf5 (x, y) -+ use udr6, only : dt -+ type(dt), intent (in) :: x, y -+ type(dt) :: eqvf5 -+ end function -+ end interface -+!$omp declare reduction (.or.:logical(kind=4):omp_out = omp_out .or. omp_in) ! { dg-error "Redefinition of predefined" } -+ interface operator(.neqv.) -+ function neqvf5 (x, y) -+ use udr6, only : dt -+ type(dt), intent (in) :: x, y -+ type(dt) :: neqvf5 -+ end function -+ end interface -+!$omp declare reduction (.and.:logical(kind = 4):omp_out = omp_out .and. omp_in) ! { dg-error "Redefinition of predefined" } -+end subroutine f5 -+subroutine f6 -+!$omp declare reduction (min:integer:omp_out = min (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (max:integer:omp_out = max (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (iand:integer:omp_out = iand (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (ior:integer:omp_out = ior (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (ieor:integer:omp_out = ieor (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (min:real:omp_out = min (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (max:real:omp_out = max (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (min:double precision:omp_out = min (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (max:double precision:omp_out = max (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" } -+end subroutine f6 -+subroutine f7 -+!$omp declare reduction (min:integer(kind=2):omp_out = min (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (max:integer(kind=4):omp_out = max (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (iand:integer(kind=1):omp_out = iand (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (ior:integer(kind=8):omp_out = ior (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (ieor:integer(kind=4):omp_out = ieor (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (min:real(kind=4):omp_out = min (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (max:real(kind=4):omp_out = max (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (min:double precision:omp_out = min (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" } -+!$omp declare reduction (max:double precision:omp_out = max (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" } -+end subroutine f7 -+subroutine f8 -+ integer :: min -+!$omp declare reduction (min:integer:omp_out = omp_out + omp_in) -+!$omp declare reduction (min:real:omp_out = omp_out + omp_in) -+!$omp declare reduction (min:double precision:omp_out = omp_out + omp_in) -+end subroutine f8 -+subroutine f9 -+ integer :: max -+!$omp declare reduction (max:integer:omp_out = omp_out + omp_in) -+!$omp declare reduction (max:real:omp_out = omp_out + omp_in) -+!$omp declare reduction (max:double precision:omp_out = omp_out + omp_in) -+end subroutine f9 -+subroutine f10 -+ integer :: iand -+!$omp declare reduction (iand:integer:omp_out = omp_out + omp_in) -+!$omp declare reduction (iand:real:omp_out = omp_out + omp_in) -+end subroutine f10 -+subroutine f11 -+ integer :: ior -+!$omp declare reduction (ior:integer:omp_out = omp_out + omp_in) -+!$omp declare reduction (ior:real:omp_out = omp_out + omp_in) -+end subroutine f11 -+subroutine f12 -+ integer :: ieor -+!$omp declare reduction (ieor:integer:omp_out = omp_out + omp_in) -+!$omp declare reduction (ieor:real:omp_out = omp_out + omp_in) -+end subroutine f12 -+subroutine f13 -+!$omp declare reduction (min:integer:omp_out = omp_out + omp_in) -+!$omp declare reduction (min:real:omp_out = omp_out + omp_in) -+!$omp declare reduction (min:double precision:omp_out = omp_out + omp_in) -+ integer :: min -+end subroutine f13 -+subroutine f14 -+!$omp declare reduction (max:integer:omp_out = omp_out + omp_in) -+!$omp declare reduction (max:real:omp_out = omp_out + omp_in) -+!$omp declare reduction (max:double precision:omp_out = omp_out + omp_in) -+ integer :: max -+end subroutine f14 -+subroutine f15 -+!$omp declare reduction (iand:integer:omp_out = omp_out + omp_in) -+!$omp declare reduction (iand:real:omp_out = omp_out + omp_in) -+ integer :: iand -+end subroutine f15 -+subroutine f16 -+!$omp declare reduction (ior:integer:omp_out = omp_out + omp_in) -+!$omp declare reduction (ior:real:omp_out = omp_out + omp_in) -+ integer :: ior -+end subroutine f16 -+subroutine f17 -+!$omp declare reduction (ieor:integer:omp_out = omp_out + omp_in) -+!$omp declare reduction (ieor:real:omp_out = omp_out + omp_in) -+ integer :: ieor -+end subroutine f17 -Index: gcc/testsuite/gfortran.dg/gomp/udr7.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/gomp/udr7.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/gomp/udr7.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,90 @@ -+! { dg-do compile } -+ -+module udr7m1 -+ type dt -+ real :: r -+ end type dt -+end module udr7m1 -+module udr7m2 -+ use udr7m1 -+ interface operator(+) -+ module procedure addm2 -+ end interface -+!$omp declare reduction(+:dt:omp_out=omp_out+omp_in) & -+!$omp & initializer(omp_priv=dt(0.0)) -+!$omp declare reduction(.myadd.:dt:omp_out=omp_out.myadd.omp_in) & -+!$omp & initializer(omp_priv=dt(0.0)) -+ interface operator(.myadd.) -+ module procedure addm2 -+ end interface -+ private -+ public :: operator(+), operator(.myadd.), dt -+contains -+ type(dt) function addm2 (x, y) -+ type(dt), intent (in):: x, y -+ addm2%r = x%r + y%r -+ end function -+end module udr7m2 -+module udr7m3 -+ use udr7m1 -+ private -+ public :: operator(.myadd.), operator(+), dt -+ interface operator(.myadd.) -+ module procedure addm3 -+ end interface -+!$omp declare reduction(+:dt:omp_out=omp_out+omp_in) & -+!$omp & initializer(omp_priv=dt(0.0)) -+!$omp declare reduction(.myadd.:dt:omp_out=omp_out.myadd.omp_in) & -+!$omp & initializer(omp_priv=dt(0.0)) -+ interface operator(+) -+ module procedure addm3 -+ end interface -+contains -+ type(dt) function addm3 (x, y) -+ type(dt), intent (in):: x, y -+ addm3%r = x%r + y%r -+ end function -+end module udr7m3 -+module udr7m4 -+ use udr7m1 -+ private -+ interface operator(.myadd.) -+ module procedure addm4 -+ end interface -+!$omp declare reduction(+:dt:omp_out=omp_out+omp_in) & -+!$omp & initializer(omp_priv=dt(0.0)) -+!$omp declare reduction(.myadd.:dt:omp_out=omp_out.myadd.omp_in) & -+!$omp & initializer(omp_priv=dt(0.0)) -+ interface operator(+) -+ module procedure addm4 -+ end interface -+contains -+ type(dt) function addm4 (x, y) -+ type(dt), intent (in):: x, y -+ addm4%r = x%r + y%r -+ end function -+end module udr7m4 -+subroutine f1 -+ use udr7m2 -+ type(dt) :: d, e -+ integer :: i -+ d=dt(0.0) -+ e = dt (0.0) -+!$omp parallel do reduction (+ : d) reduction ( .myadd. : e) -+ do i=1,100 -+ d=d+dt(i) -+ e=e+dt(i) -+ end do -+end subroutine f1 -+subroutine f2 -+ use udr7m3 ! { dg-error "Previous !.OMP DECLARE REDUCTION|Ambiguous interfaces" } -+ use udr7m2 ! { dg-error "Ambiguous !.OMP DECLARE REDUCTION" } -+end subroutine f2 -+subroutine f3 -+ use udr7m4 -+ use udr7m2 -+end subroutine f3 -+subroutine f4 -+ use udr7m3 -+ use udr7m4 -+end subroutine f4 -Index: gcc/testsuite/gfortran.dg/cray_pointers_10.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/cray_pointers_10.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/cray_pointers_10.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,18 @@ -+! { dg-do run } -+! { dg-options "-fcray-pointer" } -+! -+! PR fortran/45187 -+! -+module foo -+ implicit none -+ real :: a -+ pointer(c_a, a) -+end module foo -+ -+program test -+ use foo -+ real :: z -+ c_a = loc(z) -+ a = 42 -+ if (z /= 42) call abort -+end program test -Index: gcc/testsuite/gfortran.dg/arrayio_14.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/arrayio_14.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/arrayio_14.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,18 @@ -+! { dg-do run } -+! PR61173.f90 Bogus END condition -+module bd -+ character(len=25, kind=1), dimension(:), allocatable, save :: source -+ contains -+ subroutine init_data -+ allocate(source(2)) -+ source=[" 1 1 1 ", " 4 4 4 "] -+ end subroutine init_data -+end module bd -+program read_internal -+ use bd -+ integer :: x(6),i -+ -+ call init_data -+ read(source,*) (x(i), i=1,6) -+ if (any(x/=[1,1,1,4,4,4])) call abort -+end program read_internal -Index: gcc/testsuite/gfortran.dg/arrayio_16.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/arrayio_16.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/arrayio_16.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,13 @@ -+! { dg-do run } -+! PR61640 KIND=4 Character Array Internal Unit Read Fail -+program read_internal -+ integer :: x(9),i -+ integer :: y(9) -+ character(kind=4,len=30), dimension(3) :: source -+ -+ y = reshape ((/ 1,1,-1,1,-1,1,-1,1,1 /), shape(x)) -+ source=[4_" 1 1 -1",4_" 1 -1 1",4_" -1 1 1"] -+ !print *, (trim(source(i)), i=1,3) -+ read(source,*) (x(i), i=1,9) ! This read fails for KIND=4 character -+ if (any(x /= y )) call abort -+end program read_internal -Index: gcc/testsuite/gfortran.dg/oldstyle_5.f -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/oldstyle_5.f (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/oldstyle_5.f (.../branches/gcc-4_9-branch) -@@ -0,0 +1,8 @@ -+C { dg-do compile } -+ TYPE T -+ INTEGER A(2)/1,2/ ! { dg-error "Invalid old style initialization for derived type component" } -+ END TYPE -+ TYPE S -+ INTEGER B/1/ ! { dg-error "Invalid old style initialization for derived type component" } -+ END TYPE -+ END -Index: gcc/testsuite/gfortran.dg/nint_2.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/nint_2.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/nint_2.f90 (.../branches/gcc-4_9-branch) -@@ -4,7 +4,8 @@ - ! http://gcc.gnu.org/ml/fortran/2005-04/msg00139.html - ! - ! { dg-do run } --! { dg-xfail-run-if "PR 33271, math library bug" { powerpc-ibm-aix* powerpc*-*-linux* *-*-mingw* } { "-O0" } { "" } } -+! { dg-xfail-run-if "PR 33271, math library bug" { powerpc-ibm-aix* powerpc-*-linux* powerpc64-*-linux* *-*-mingw* } { "-O0" } { "" } } -+! Note that this doesn't fail on powerpc64le-*-linux*. - real(kind=8) :: a - integer(kind=8) :: i1, i2 - real :: b -Index: gcc/testsuite/gfortran.dg/openmp-define-3.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/openmp-define-3.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/openmp-define-3.f90 (.../branches/gcc-4_9-branch) -@@ -6,6 +6,6 @@ - # error _OPENMP not defined - #endif - --#if _OPENMP != 201107 -+#if _OPENMP != 201307 - # error _OPENMP defined to wrong value - #endif -Index: gcc/testsuite/gfortran.dg/associate_17.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/associate_17.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/associate_17.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,12 @@ -+! { dg-do run } -+! Test the fix for PR61406 -+! Contributed by Adam Hirst <adam@aphirst.karoo.co.uk> -+program test -+ implicit none -+ real :: theta = 1.0 -+ -+ associate (n => [cos(theta), sin(theta)]) -+ if (abs (norm2(n) - 1.0) .gt. 1.0e-4) call abort -+ end associate -+ -+end program test -Index: gcc/testsuite/gfortran.dg/graphite/pr59817.f -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/graphite/pr59817.f (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/graphite/pr59817.f (.../branches/gcc-4_9-branch) -@@ -0,0 +1,14 @@ -+! { dg-do compile } -+! { dg-options "-O2 -floop-interchange" } -+ SUBROUTINE PREPD(ICAST,ICAS,ICASX,ICAS1,ICAS2,NDET,NM,III,IMP, -+ * CASMIN) -+ LOGICAL CASMIN -+ DIMENSION ICAST(NDET,NM),IMP(NM) -+ IF(CASMIN) THEN -+ DO K=1,NDET -+ DO L=1,NM -+ IF(L.EQ.K-1) ICAST(K,L) = 1 -+ END DO -+ END DO -+ END IF -+ END SUBROUTINE -Index: gcc/testsuite/gfortran.dg/finalize_25.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/finalize_25.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/finalize_25.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,55 @@ -+! { dg-do run } -+! -+! PR fortran/58880 -+! PR fortran/60495 -+! -+! Contributed by Andrew Benson and Janus Weil -+! -+ -+module gn -+ implicit none -+ type sl -+ integer, allocatable, dimension(:) :: lv -+ contains -+ final :: sld -+ end type -+ type :: nde -+ type(sl) :: r -+ end type nde -+ -+ integer :: cnt = 0 -+ -+contains -+ -+ subroutine sld(s) -+ type(sl) :: s -+ cnt = cnt + 1 -+ ! print *,'Finalize sl' -+ end subroutine -+ subroutine ndm(s) -+ type(nde), intent(inout) :: s -+ type(nde) :: i -+ i=s -+ end subroutine ndm -+end module -+ -+program main -+ use gn -+ type :: nde2 -+ type(sl) :: r -+ end type nde2 -+ type(nde) :: x -+ -+ cnt = 0 -+ call ndm(x) -+ if (cnt /= 2) call abort() -+ -+ cnt = 0 -+ call ndm2() -+ if (cnt /= 3) call abort() -+contains -+ subroutine ndm2 -+ type(nde2) :: s,i -+ i=s -+ end subroutine ndm2 -+end program main -Index: gcc/testsuite/gfortran.dg/arrayio_15.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/arrayio_15.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/arrayio_15.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,11 @@ -+! { dg-do run } -+! PR61499 -+program read_internal -+ -+ integer :: x(9),i,iostat -+ character(len=512) :: iomsg -+ character(kind=1,len=30), dimension(:), allocatable, save :: source -+ allocate(source(3)) -+ source=[" 1 1 -1"," 1 -1 1"," -1 1 1"] !This fails -+ read(source,*) (x(i), i=1,6) -+end program read_internal -Index: gcc/testsuite/gfortran.dg/allocatable_function_8.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/allocatable_function_8.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/allocatable_function_8.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,59 @@ -+! { dg-do run } -+! Test the fix for PR61459 and PR58883. -+! -+! Contributed by John Wingate <johnww@tds.net> -+! and Tao Song <songtao.thu@gmail.com> -+! -+module a -+ -+ implicit none -+ private -+ public :: f_segfault, f_segfault_plus, f_workaround -+ integer, dimension(2,2) :: b = reshape([1,-1,1,1],[2,2]) -+ -+contains -+ -+ function f_segfault(x) -+ real, dimension(:), allocatable :: f_segfault -+ real, dimension(:), intent(in) :: x -+ allocate(f_segfault(2)) -+ f_segfault = matmul(b,x) -+ end function f_segfault -+ -+! Sefaulted without the ALLOCATE as well. -+ function f_segfault_plus(x) -+ real, dimension(:), allocatable :: f_segfault_plus -+ real, dimension(:), intent(in) :: x -+ f_segfault_plus = matmul(b,x) -+ end function f_segfault_plus -+ -+ function f_workaround(x) -+ real, dimension(:), allocatable :: f_workaround -+ real, dimension(:), intent(in) :: x -+ real, dimension(:), allocatable :: tmp -+ allocate(f_workaround(2),tmp(2)) -+ tmp = matmul(b,x) -+ f_workaround = tmp -+ end function f_workaround -+ -+end module a -+ -+program main -+ use a -+ implicit none -+ real, dimension(2) :: x = 1.0, y -+! PR61459 -+ y = f_workaround (x) -+ if (any (f_segfault (x) .ne. y)) call abort -+ if (any (f_segfault_plus (x) .ne. y)) call abort -+! PR58883 -+ if (any (foo () .ne. reshape([1,2,3,4,5,6,7,8],[2,4]))) call abort -+contains -+ function foo() -+ integer, allocatable :: foo(:,:) -+ integer, allocatable :: temp(:) -+ -+ temp = [1,2,3,4,5,6,7,8] -+ foo = reshape(temp,[2,4]) -+ end function -+end program main -Index: gcc/testsuite/gfortran.dg/class_array_15.f03 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/class_array_15.f03 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/class_array_15.f03 (.../branches/gcc-4_9-branch) -@@ -1,4 +1,5 @@ - ! { dg-do run } -+! { dg-options "-fdump-tree-original" } - ! - ! Tests the fixes for three bugs with the same underlying cause. All are regressions - ! that come about because class array elements end up with a different tree type -@@ -114,3 +115,5 @@ - bh => bhGet(b,instance=2) - if (loc (b) .ne. loc(bh%hostNode)) call abort - end -+! { dg-final { scan-tree-dump-times "builtin_free" 12 "original" } } -+! { dg-final { cleanup-tree-dump "original" } } -Index: gcc/testsuite/gfortran.dg/associate_16.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/associate_16.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/associate_16.f90 (.../branches/gcc-4_9-branch) -@@ -0,0 +1,23 @@ -+! { dg-do compile } -+! PR 60834 - this used to ICE. -+ -+module m -+ implicit none -+ type :: t -+ real :: diffusion=1. -+ end type -+contains -+ subroutine solve(this, x) -+ class(t), intent(in) :: this -+ real, intent(in) :: x(:) -+ integer :: i -+ integer, parameter :: n(1:5)=[(i,i=1, 5)] -+ -+ associate( nu=>this%diffusion) -+ associate( exponential=>exp(-(x(i)-n) )) -+ do i = 1, size(x) -+ end do -+ end associate -+ end associate -+ end subroutine solve -+end module m -Index: gcc/testsuite/gfortran.dg/list_read_13.f -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/list_read_13.f (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/list_read_13.f (.../branches/gcc-4_9-branch) -@@ -0,0 +1,13 @@ -+c { dg-do run } -+c PR61049, reduced test case by Dominique d'Humieres -+ character(len=30) :: buff = ", (2.0, 3.0),,6.0D0, 2*," -+ DOUBLE PRECISION AVD, BVD, CVD, DVCORR -+ COMPLEX AVC, BVC, CVC, ZVCORR -+ -+ read(buff, *, err=10) AVD, AVC, BVC, BVD, CVC, CVD -+ goto 20 -+ 10 call abort -+ 20 continue -+ end -+ -+ -Index: gcc/testsuite/gfortran.dg/round_4.f90 -=================================================================== ---- a/src/gcc/testsuite/gfortran.dg/round_4.f90 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gfortran.dg/round_4.f90 (.../branches/gcc-4_9-branch) -@@ -1,6 +1,7 @@ - ! { dg-do run } - ! { dg-add-options ieee } - ! { dg-skip-if "PR libfortran/58015" { *-*-solaris2.9* hppa*-*-hpux* } } -+! { dg-skip-if "IBM long double 31 bits of precision, test requires 38" { powerpc*-*-linux* } } - ! - ! PR fortran/35862 - ! -Index: gcc/testsuite/gcc.c-torture/execute/pr61306-1.c -=================================================================== ---- a/src/gcc/testsuite/gcc.c-torture/execute/pr61306-1.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.c-torture/execute/pr61306-1.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,39 @@ -+#ifdef __INT32_TYPE__ -+typedef __INT32_TYPE__ int32_t; -+#else -+typedef int int32_t; -+#endif -+ -+#ifdef __UINT32_TYPE__ -+typedef __UINT32_TYPE__ uint32_t; -+#else -+typedef unsigned uint32_t; -+#endif -+ -+#define __fake_const_swab32(x) ((uint32_t)( \ -+ (((uint32_t)(x) & (uint32_t)0x000000ffUL) << 24) | \ -+ (((uint32_t)(x) & (uint32_t)0x0000ff00UL) << 8) | \ -+ (((uint32_t)(x) & (uint32_t)0x00ff0000UL) >> 8) | \ -+ (( (int32_t)(x) & (int32_t)0xff000000UL) >> 24))) -+ -+/* Previous version of bswap optimization failed to consider sign extension -+ and as a result would replace an expression *not* doing a bswap by a -+ bswap. */ -+ -+__attribute__ ((noinline, noclone)) uint32_t -+fake_bswap32 (uint32_t in) -+{ -+ return __fake_const_swab32 (in); -+} -+ -+int -+main(void) -+{ -+ if (sizeof (int32_t) * __CHAR_BIT__ != 32) -+ return 0; -+ if (sizeof (uint32_t) * __CHAR_BIT__ != 32) -+ return 0; -+ if (fake_bswap32 (0x87654321) != 0xffffff87) -+ __builtin_abort (); -+ return 0; -+} -Index: gcc/testsuite/gcc.c-torture/execute/pr61306-3.c -=================================================================== ---- a/src/gcc/testsuite/gcc.c-torture/execute/pr61306-3.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.c-torture/execute/pr61306-3.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,13 @@ -+short a = -1; -+int b; -+char c; -+ -+int -+main () -+{ -+ c = a; -+ b = a | c; -+ if (b != -1) -+ __builtin_abort (); -+ return 0; -+} -Index: gcc/testsuite/gcc.c-torture/execute/pr61725.c -=================================================================== ---- a/src/gcc/testsuite/gcc.c-torture/execute/pr61725.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.c-torture/execute/pr61725.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,14 @@ -+/* PR tree-optimization/61725 */ -+ -+int -+main () -+{ -+ int x; -+ for (x = -128; x <= 128; x++) -+ { -+ int a = __builtin_ffs (x); -+ if (x == 0 && a != 0) -+ __builtin_abort (); -+ } -+ return 0; -+} -Index: gcc/testsuite/gcc.c-torture/execute/20140425-1.c -=================================================================== ---- a/src/gcc/testsuite/gcc.c-torture/execute/20140425-1.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.c-torture/execute/20140425-1.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,23 @@ -+/* PR target/60941 */ -+/* Reported by Martin Husemann <martin@netbsd.org> */ -+ -+extern void abort (void); -+ -+static void __attribute__((noinline)) -+set (unsigned long *l) -+{ -+ *l = 31; -+} -+ -+int main (void) -+{ -+ unsigned long l; -+ int i; -+ -+ set (&l); -+ i = (int) l; -+ l = (unsigned long)(2U << i); -+ if (l != 0) -+ abort (); -+ return 0; -+} -Index: gcc/testsuite/gcc.c-torture/execute/pr61306-2.c -=================================================================== ---- a/src/gcc/testsuite/gcc.c-torture/execute/pr61306-2.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.c-torture/execute/pr61306-2.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,40 @@ -+#ifdef __INT16_TYPE__ -+typedef __INT16_TYPE__ int16_t; -+#else -+typedef short int16_t; -+#endif -+ -+#ifdef __UINT32_TYPE__ -+typedef __UINT32_TYPE__ uint32_t; -+#else -+typedef unsigned uint32_t; -+#endif -+ -+#define __fake_const_swab32(x) ((uint32_t)( \ -+ (((uint32_t) (x) & (uint32_t)0x000000ffUL) << 24) | \ -+ (((uint32_t)(int16_t)(x) & (uint32_t)0x00ffff00UL) << 8) | \ -+ (((uint32_t) (x) & (uint32_t)0x00ff0000UL) >> 8) | \ -+ (((uint32_t) (x) & (uint32_t)0xff000000UL) >> 24))) -+ -+ -+/* Previous version of bswap optimization failed to consider sign extension -+ and as a result would replace an expression *not* doing a bswap by a -+ bswap. */ -+ -+__attribute__ ((noinline, noclone)) uint32_t -+fake_bswap32 (uint32_t in) -+{ -+ return __fake_const_swab32 (in); -+} -+ -+int -+main(void) -+{ -+ if (sizeof (uint32_t) * __CHAR_BIT__ != 32) -+ return 0; -+ if (sizeof (int16_t) * __CHAR_BIT__ != 16) -+ return 0; -+ if (fake_bswap32 (0x81828384) != 0xff838281) -+ __builtin_abort (); -+ return 0; -+} -Index: gcc/testsuite/gcc.c-torture/execute/pr60960.c -=================================================================== ---- a/src/gcc/testsuite/gcc.c-torture/execute/pr60960.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.c-torture/execute/pr60960.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,38 @@ -+/* PR tree-optimization/60960 */ -+ -+typedef unsigned char v4qi __attribute__ ((vector_size (4))); -+ -+__attribute__((noinline, noclone)) v4qi -+f1 (v4qi v) -+{ -+ return v / 2; -+} -+ -+__attribute__((noinline, noclone)) v4qi -+f2 (v4qi v) -+{ -+ return v / (v4qi) { 2, 2, 2, 2 }; -+} -+ -+__attribute__((noinline, noclone)) v4qi -+f3 (v4qi x, v4qi y) -+{ -+ return x / y; -+} -+ -+int -+main () -+{ -+ v4qi x = { 5, 5, 5, 5 }; -+ v4qi y = { 2, 2, 2, 2 }; -+ v4qi z = f1 (x); -+ if (__builtin_memcmp (&y, &z, sizeof (y)) != 0) -+ __builtin_abort (); -+ z = f2 (x); -+ if (__builtin_memcmp (&y, &z, sizeof (y)) != 0) -+ __builtin_abort (); -+ z = f3 (x, y); -+ if (__builtin_memcmp (&y, &z, sizeof (y)) != 0) -+ __builtin_abort (); -+ return 0; -+} -Index: gcc/testsuite/gcc.c-torture/execute/pr61673.c -=================================================================== ---- a/src/gcc/testsuite/gcc.c-torture/execute/pr61673.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.c-torture/execute/pr61673.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,50 @@ -+/* PR rtl-optimization/61673 */ -+ -+char e; -+ -+__attribute__((noinline, noclone)) void -+bar (char x) -+{ -+ if (x != 0x54 && x != (char) 0x87) -+ __builtin_abort (); -+} -+ -+__attribute__((noinline, noclone)) void -+foo (const char *x) -+{ -+ char d = x[0]; -+ int c = d; -+ if ((c >= 0 && c <= 0x7f) == 0) -+ e = d; -+ bar (d); -+} -+ -+__attribute__((noinline, noclone)) void -+baz (const char *x) -+{ -+ char d = x[0]; -+ int c = d; -+ if ((c >= 0 && c <= 0x7f) == 0) -+ e = d; -+} -+ -+int -+main () -+{ -+ const char c[] = { 0x54, 0x87 }; -+ e = 0x21; -+ foo (c); -+ if (e != 0x21) -+ __builtin_abort (); -+ foo (c + 1); -+ if (e != (char) 0x87) -+ __builtin_abort (); -+ e = 0x21; -+ baz (c); -+ if (e != 0x21) -+ __builtin_abort (); -+ baz (c + 1); -+ if (e != (char) 0x87) -+ __builtin_abort (); -+ return 0; -+} -Index: gcc/testsuite/gcc.c-torture/compile/pr61684.c -=================================================================== ---- a/src/gcc/testsuite/gcc.c-torture/compile/pr61684.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.c-torture/compile/pr61684.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* PR tree-optimization/61684 */ -+ -+int a, c; -+static int *b = 0; -+short d; -+static short **e = 0; -+ -+void -+foo () -+{ -+ for (; c < 1; c++) -+ ; -+ *e = &d; -+ a = d && (c && 1) & *b; -+} -Index: gcc/testsuite/gnat.dg/opt38.adb -=================================================================== ---- a/src/gcc/testsuite/gnat.dg/opt38.adb (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gnat.dg/opt38.adb (.../branches/gcc-4_9-branch) -@@ -0,0 +1,9 @@ -+-- { dg-do run } -+-- { dg-options "-O2 -gnatn" } -+ -+with Opt38_Pkg; use Opt38_Pkg; -+ -+procedure Opt38 is -+begin -+ Test (-1); -+end; -Index: gcc/testsuite/gnat.dg/opt39.adb -=================================================================== ---- a/src/gcc/testsuite/gnat.dg/opt39.adb (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gnat.dg/opt39.adb (.../branches/gcc-4_9-branch) -@@ -0,0 +1,31 @@ -+-- { dg-do compile } -+-- { dg-options "-O2 -fno-inline -fdump-tree-optimized" } -+ -+procedure Opt39 (I : Integer) is -+ -+ type Rec is record -+ I1 : Integer; -+ I2 : Integer; -+ I3 : Integer; -+ I4 : Integer; -+ I5 : Integer; -+ end record; -+ -+ procedure Set (A : access Rec; I : Integer) is -+ Tmp : Rec := A.all; -+ begin -+ Tmp.I1 := I; -+ A.all := Tmp; -+ end; -+ -+ R : aliased Rec; -+ -+begin -+ Set (R'Access, I); -+ if R.I1 /= I then -+ raise Program_Error; -+ end if; -+end; -+ -+-- { dg-final { scan-tree-dump-times "MEM" 1 "optimized" } } -+-- { dg-final { cleanup-tree-dump "optimized" } } -Index: gcc/testsuite/gnat.dg/overflow_fixed.adb -=================================================================== ---- a/src/gcc/testsuite/gnat.dg/overflow_fixed.adb (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gnat.dg/overflow_fixed.adb (.../branches/gcc-4_9-branch) -@@ -0,0 +1,19 @@ -+-- { dg-do run } -+-- { dg-options "-gnato -O" } -+ -+procedure Overflow_Fixed is -+ -+ type Unsigned_8_Bit is mod 2**8; -+ -+ procedure Fixed_To_Eight (Value : Duration) is -+ Item : Unsigned_8_Bit; -+ begin -+ Item := Unsigned_8_Bit(Value); -+ raise Program_Error; -+ exception -+ when Constraint_Error => null; -- expected case -+ end; -+ -+begin -+ Fixed_To_Eight (-0.5); -+end; -Index: gcc/testsuite/gnat.dg/opt38_pkg.adb -=================================================================== ---- a/src/gcc/testsuite/gnat.dg/opt38_pkg.adb (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gnat.dg/opt38_pkg.adb (.../branches/gcc-4_9-branch) -@@ -0,0 +1,33 @@ -+package body Opt38_Pkg is -+ -+ procedure Proc (I : Integer); -+ pragma Inline (Proc); -+ -+ procedure Proc (I : Integer) is -+ -+ procedure Inner; -+ pragma No_Inline (Inner); -+ -+ procedure Inner is -+ begin -+ if I /= 110 then -+ raise Program_Error; -+ end if; -+ end; -+ -+ begin -+ if I > 0 then -+ Inner; -+ end if; -+ end; -+ -+ procedure Test (I : Integer) is -+ begin -+ if I > -1 then -+ Proc (I); -+ else -+ Proc (I + 111); -+ end if; -+ end; -+ -+end Opt38_Pkg; -Index: gcc/testsuite/gnat.dg/opt38_pkg.ads -=================================================================== ---- a/src/gcc/testsuite/gnat.dg/opt38_pkg.ads (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gnat.dg/opt38_pkg.ads (.../branches/gcc-4_9-branch) -@@ -0,0 +1,5 @@ -+package Opt38_Pkg is -+ -+ procedure Test (I : Integer); -+ -+end Opt38_Pkg; -Index: gcc/testsuite/gnat.dg/enum3.adb -=================================================================== ---- a/src/gcc/testsuite/gnat.dg/enum3.adb (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gnat.dg/enum3.adb (.../branches/gcc-4_9-branch) -@@ -0,0 +1,23 @@ -+-- { dg-do run } -+ -+procedure Enum3 is -+ type Enum is (Aaa, Bbb, Ccc); -+ for Enum use (1,2,4); -+begin -+ for Lo in Enum loop -+ for Hi in Enum loop -+ declare -+ subtype S is Enum range Lo .. Hi; -+ type Vector is array (S) of Integer; -+ Vec : Vector; -+ begin -+ for I in S loop -+ Vec (I) := 0; -+ end loop; -+ if Vec /= (S => 0) then -+ raise Program_Error; -+ end if; -+ end; -+ end loop; -+ end loop; -+end; -Index: gcc/testsuite/gnat.dg/aliasing1.adb -=================================================================== ---- a/src/gcc/testsuite/gnat.dg/aliasing1.adb (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gnat.dg/aliasing1.adb (.../branches/gcc-4_9-branch) -@@ -18,5 +18,5 @@ - - end Aliasing1; - ---- { dg-final { scan-tree-dump-not "__gnat_rcheck" "optimized" } } -+-- { dg-final { scan-tree-dump-not "gnat_rcheck" "optimized" } } - -- { dg-final { cleanup-tree-dump "optimized" } } -Index: gcc/testsuite/gcc.dg/pr60866.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/pr60866.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/pr60866.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,18 @@ -+/* { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } } */ -+/* { dg-options "-O -fselective-scheduling -fno-if-conversion -fschedule-insns" } */ -+ -+int n; -+ -+void -+foo (int w, int **dnroot, int **dn) -+{ -+ int *child; -+ int *xchild = xchild; -+ for (; w < n; w++) -+ if (!dnroot) -+ { -+ dnroot = dn; -+ for (child = *dn; child; child = xchild) -+ ; -+ } -+} -Index: gcc/testsuite/gcc.dg/typeof-2.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/typeof-2.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/typeof-2.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,28 @@ -+/* Test qualifier discard of typeof for atomic types. */ -+/* { dg-do compile } */ -+/* { dg-options "-std=c11" } */ -+ -+extern int i; -+ -+extern int * p; -+ -+extern int _Atomic const ci; -+extern __typeof (ci) i; -+ -+extern int _Atomic volatile vi; -+extern __typeof (vi) i; -+ -+extern int * _Atomic restrict ri; -+extern __typeof (ri) p; -+ -+void f(void) -+{ -+ __auto_type aci = ci; -+ int *paci = &aci; -+ -+ __auto_type avi = vi; -+ int *pavi = &avi; -+ -+ __auto_type ari = ri; -+ int **pari = &ari; -+} -Index: gcc/testsuite/gcc.dg/vmx/merge-vsx-be-order.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/vmx/merge-vsx-be-order.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/vmx/merge-vsx-be-order.c (.../branches/gcc-4_9-branch) -@@ -21,10 +21,19 @@ - vector long long vlb = {0,1}; - vector double vda = {-2.0,-1.0}; - vector double vdb = {0.0,1.0}; -+ vector unsigned int vuia = {0,1,2,3}; -+ vector unsigned int vuib = {4,5,6,7}; -+ vector signed int vsia = {-4,-3,-2,-1}; -+ vector signed int vsib = {0,1,2,3}; -+ vector float vfa = {-4.0,-3.0,-2.0,-1.0}; -+ vector float vfb = {0.0,1.0,2.0,3.0}; - - /* Result vectors. */ - vector long long vlh, vll; - vector double vdh, vdl; -+ vector unsigned int vuih, vuil; -+ vector signed int vsih, vsil; -+ vector float vfh, vfl; - - /* Expected result vectors. */ - #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ -@@ -32,11 +41,23 @@ - vector long long vlrl = {0,-2}; - vector double vdrh = {1.0,-1.0}; - vector double vdrl = {0.0,-2.0}; -+ vector unsigned int vuirh = {6,2,7,3}; -+ vector unsigned int vuirl = {4,0,5,1}; -+ vector signed int vsirh = {2,-2,3,-1}; -+ vector signed int vsirl = {0,-4,1,-3}; -+ vector float vfrh = {2.0,-2.0,3.0,-1.0}; -+ vector float vfrl = {0.0,-4.0,1.0,-3.0}; - #else - vector long long vlrh = {-2,0}; - vector long long vlrl = {-1,1}; - vector double vdrh = {-2.0,0.0}; - vector double vdrl = {-1.0,1.0}; -+ vector unsigned int vuirh = {0,4,1,5}; -+ vector unsigned int vuirl = {2,6,3,7}; -+ vector signed int vsirh = {-4,0,-3,1}; -+ vector signed int vsirl = {-2,2,-1,3}; -+ vector float vfrh = {-4.0,0.0,-3.0,1.0}; -+ vector float vfrl = {-2.0,2.0,-1.0,3.0}; - #endif - - vlh = vec_mergeh (vla, vlb); -@@ -43,9 +64,21 @@ - vll = vec_mergel (vla, vlb); - vdh = vec_mergeh (vda, vdb); - vdl = vec_mergel (vda, vdb); -+ vuih = vec_mergeh (vuia, vuib); -+ vuil = vec_mergel (vuia, vuib); -+ vsih = vec_mergeh (vsia, vsib); -+ vsil = vec_mergel (vsia, vsib); -+ vfh = vec_mergeh (vfa, vfb ); -+ vfl = vec_mergel (vfa, vfb ); - - check (vec_long_long_eq (vlh, vlrh), "vlh"); - check (vec_long_long_eq (vll, vlrl), "vll"); - check (vec_double_eq (vdh, vdrh), "vdh" ); - check (vec_double_eq (vdl, vdrl), "vdl" ); -+ check (vec_all_eq (vuih, vuirh), "vuih"); -+ check (vec_all_eq (vuil, vuirl), "vuil"); -+ check (vec_all_eq (vsih, vsirh), "vsih"); -+ check (vec_all_eq (vsil, vsirl), "vsil"); -+ check (vec_all_eq (vfh, vfrh), "vfh"); -+ check (vec_all_eq (vfl, vfrl), "vfl"); - } -Index: gcc/testsuite/gcc.dg/vmx/merge-vsx.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/vmx/merge-vsx.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/vmx/merge-vsx.c (.../branches/gcc-4_9-branch) -@@ -21,10 +21,19 @@ - vector long long vlb = {0,1}; - vector double vda = {-2.0,-1.0}; - vector double vdb = {0.0,1.0}; -+ vector unsigned int vuia = {0,1,2,3}; -+ vector unsigned int vuib = {4,5,6,7}; -+ vector signed int vsia = {-4,-3,-2,-1}; -+ vector signed int vsib = {0,1,2,3}; -+ vector float vfa = {-4.0,-3.0,-2.0,-1.0}; -+ vector float vfb = {0.0,1.0,2.0,3.0}; - - /* Result vectors. */ - vector long long vlh, vll; - vector double vdh, vdl; -+ vector unsigned int vuih, vuil; -+ vector signed int vsih, vsil; -+ vector float vfh, vfl; - - /* Expected result vectors. */ - vector long long vlrh = {-2,0}; -@@ -31,14 +40,32 @@ - vector long long vlrl = {-1,1}; - vector double vdrh = {-2.0,0.0}; - vector double vdrl = {-1.0,1.0}; -+ vector unsigned int vuirh = {0,4,1,5}; -+ vector unsigned int vuirl = {2,6,3,7}; -+ vector signed int vsirh = {-4,0,-3,1}; -+ vector signed int vsirl = {-2,2,-1,3}; -+ vector float vfrh = {-4.0,0.0,-3.0,1.0}; -+ vector float vfrl = {-2.0,2.0,-1.0,3.0}; - - vlh = vec_mergeh (vla, vlb); - vll = vec_mergel (vla, vlb); - vdh = vec_mergeh (vda, vdb); - vdl = vec_mergel (vda, vdb); -+ vuih = vec_mergeh (vuia, vuib); -+ vuil = vec_mergel (vuia, vuib); -+ vsih = vec_mergeh (vsia, vsib); -+ vsil = vec_mergel (vsia, vsib); -+ vfh = vec_mergeh (vfa, vfb ); -+ vfl = vec_mergel (vfa, vfb ); - - check (vec_long_long_eq (vlh, vlrh), "vlh"); - check (vec_long_long_eq (vll, vlrl), "vll"); - check (vec_double_eq (vdh, vdrh), "vdh" ); - check (vec_double_eq (vdl, vdrl), "vdl" ); -+ check (vec_all_eq (vuih, vuirh), "vuih"); -+ check (vec_all_eq (vuil, vuirl), "vuil"); -+ check (vec_all_eq (vsih, vsirh), "vsih"); -+ check (vec_all_eq (vsil, vsirl), "vsil"); -+ check (vec_all_eq (vfh, vfrh), "vfh"); -+ check (vec_all_eq (vfl, vfrl), "vfl"); - } -Index: gcc/testsuite/gcc.dg/graphite/pr55022.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/graphite/pr55022.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/graphite/pr55022.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,27 @@ -+/* { dg-do run } */ -+/* { dg-options "-O2 -fgraphite-identity" } */ -+ -+extern void abort (void); -+ -+void __attribute__((noinline,noclone)) -+f(int *limit, int minLen, int maxLen) -+{ -+ int i; -+ -+ for (i = minLen; i <= maxLen; i++) { -+ limit[i] = i; -+ } -+} -+ -+int main() -+{ -+ int limit[256], i; -+ f (limit, 0, 255); -+ for (i = 0; i < 256; ++i) -+ { -+ if (limit[i] != i) -+ abort (); -+ __asm__ volatile ("" : : : "memory"); -+ } -+ return 0; -+} -Index: gcc/testsuite/gcc.dg/graphite/pr59817-2.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/graphite/pr59817-2.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/graphite/pr59817-2.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* { dg-do compile } */ -+/* { dg-options "-O2 -floop-interchange" } */ -+ -+void -+xl(void) -+{ -+ static int j3; -+ for (j3 = 0; j3 < 1; ++j3) { -+ static int f2; -+ static int w7; -+ short int b5; -+ int ok; -+ f2 = (b5 += ok) ? (w7 = 0): (w7 ? 0 : (f2 = ok)); -+ } -+} -Index: gcc/testsuite/gcc.dg/graphite/pr60979.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/graphite/pr60979.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/graphite/pr60979.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,37 @@ -+/* { dg-options "-O -fgraphite-identity" } */ -+ -+#include <setjmp.h> -+ -+struct x; -+ -+typedef struct x **(*a)(struct x *); -+ -+struct x { -+ union { -+ struct { -+ union { -+ a *i; -+ } l; -+ int s; -+ } y; -+ } e; -+}; -+ -+jmp_buf c; -+ -+void -+b(struct x *r) -+{ -+ int f; -+ static int w = 0; -+ volatile jmp_buf m; -+ f = (*(((struct x *)r)->e.y.l.i[2]((struct x *)r)))->e.y.s; -+ if (w++ != 0) -+ __builtin_memcpy((char *)m, (const char *)c, sizeof(jmp_buf)); -+ if (setjmp (c) == 0) { -+ int z; -+ for (z = 0; z < 0; ++z) -+ ; -+ } -+ d((const char *)m); -+} -Index: gcc/testsuite/gcc.dg/graphite/pr59817-1.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/graphite/pr59817-1.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/graphite/pr59817-1.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,16 @@ -+/* { dg-do compile } */ -+/* { dg-options "-O2 -floop-interchange" } */ -+ -+int kd; -+ -+void -+n2(void) -+{ -+ static int so; -+ static short int i5; -+ int wj; -+ int *il; -+ int *nk = &so; -+ for (wj = 0; wj < 2; ++wj) -+ *nk = ((i5 += *il) || kd ); -+} -Index: gcc/testsuite/gcc.dg/pr61045.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/pr61045.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/pr61045.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,12 @@ -+/* { dg-do run } */ -+/* { dg-options "-fstrict-overflow" } */ -+ -+int main () -+{ -+ int a = 0; -+ int b = __INT_MAX__; -+ int t = (a - 2) > (b - 1); -+ if (t != 0) -+ __builtin_abort(); -+ return 0; -+} -Index: gcc/testsuite/gcc.dg/pr61158.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/pr61158.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/pr61158.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,12 @@ -+/* PR tree-optimization/61158 */ -+/* { dg-do compile } */ -+/* { dg-options "-O2 -fdump-tree-original" } */ -+ -+unsigned long long -+foo (unsigned int x) -+{ -+ return ((unsigned long long) x & 0x00ff000000000000ULL) >> 40; -+} -+ -+/* { dg-final { scan-tree-dump "return 0;" "original" { target { ilp32 || lp64 } } } } */ -+/* { dg-final { cleanup-tree-dump "original" } } */ -Index: gcc/testsuite/gcc.dg/lto/pr60720_0.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/lto/pr60720_0.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/lto/pr60720_0.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* { dg-lto-do run } */ -+/* { dg-extra-ld-options { -w } } */ -+ -+/* ??? lto.exp does not allow to scan for -+ :1:12: warning: type of 'x' does not match original declaration -+ extern int x[]; -+ ^ -+ :1:5: note: previously declared here -+ int x; -+ ^ */ -+ -+extern int x[]; -+int *foo[] = { &x[0] }; -+ -+int main() { return *foo[0]; } -Index: gcc/testsuite/gcc.dg/lto/pr60720_1.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/lto/pr60720_1.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/lto/pr60720_1.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1 @@ -+int x; -Index: gcc/testsuite/gcc.dg/lto/pr60911_0.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/lto/pr60911_0.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/lto/pr60911_0.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,21 @@ -+// { dg-lto-do run } -+// { dg-lto-options { { -O2 -flto -fipa-pta } } } -+ -+int __attribute__ ((__noinline__)) f (unsigned *p, int *x) -+{ -+ int y = *p++ & 0xfff; -+ *x++ = y; -+ *x = *p; -+ return y; -+} -+ -+int -+main () -+{ -+ unsigned u[2] = { 0x3aad, 0x5ad1 }; -+ int x[2] = { 17689, 23456 }; -+ -+ if (f (u, x) != 0xaad || x[0] != 0xaad || x[1] != 0x5ad1) -+ __builtin_abort (); -+ return 0; -+} -Index: gcc/testsuite/gcc.dg/lto/pr61526_0.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/lto/pr61526_0.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/lto/pr61526_0.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,6 @@ -+/* { dg-lto-do link } */ -+/* { dg-lto-options { { -fPIC -flto -flto-partition=1to1 } } } */ -+/* { dg-extra-ld-options { -shared } } */ -+ -+static void *master; -+void *foo () { return master; } -Index: gcc/testsuite/gcc.dg/lto/pr61526_1.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/lto/pr61526_1.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/lto/pr61526_1.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,2 @@ -+extern void *master; -+void *bar () { return master; } -Index: gcc/testsuite/gcc.dg/pr57233.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/pr57233.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/pr57233.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,171 @@ -+/* PR tree-optimization/57233 */ -+/* { dg-do run { target { ilp32 || lp64 } } } */ -+/* { dg-options "-O2" } */ -+ -+typedef unsigned V4 __attribute__((vector_size(4 * sizeof (int)))); -+typedef unsigned V8 __attribute__((vector_size(8 * sizeof (int)))); -+typedef unsigned V16 __attribute__((vector_size(16 * sizeof (int)))); -+V4 a, b, g; -+V8 c, d, h; -+V16 e, f, j; -+ -+__attribute__((noinline)) void -+f1 (void) -+{ -+ a = (a << 2) | (a >> 30); -+} -+ -+__attribute__((noinline)) void -+f2 (void) -+{ -+ a = (a << 30) | (a >> 2); -+} -+ -+__attribute__((noinline)) void -+f3 (void) -+{ -+ a = (a << b) | (a >> (32 - b)); -+} -+ -+__attribute__((noinline, noclone)) void -+f4 (int x) -+{ -+ a = (a << x) | (a >> (32 - x)); -+} -+ -+__attribute__((noinline)) void -+f5 (void) -+{ -+ c = (c << 2) | (c >> 30); -+} -+ -+__attribute__((noinline)) void -+f6 (void) -+{ -+ c = (c << 30) | (c >> 2); -+} -+ -+__attribute__((noinline)) void -+f7 (void) -+{ -+ c = (c << d) | (c >> (32 - d)); -+} -+ -+__attribute__((noinline, noclone)) void -+f8 (int x) -+{ -+ c = (c << x) | (c >> (32 - x)); -+} -+ -+__attribute__((noinline)) void -+f9 (void) -+{ -+ e = (e << 2) | (e >> 30); -+} -+ -+__attribute__((noinline)) void -+f10 (void) -+{ -+ e = (e << 30) | (e >> 2); -+} -+ -+__attribute__((noinline)) void -+f11 (void) -+{ -+ e = (e << f) | (e >> (32 - f)); -+} -+ -+__attribute__((noinline, noclone)) void -+f12 (int x) -+{ -+ e = (e << x) | (e >> (32 - x)); -+} -+ -+unsigned -+r (void) -+{ -+ static unsigned x = 0xdeadbeefU; -+ static unsigned y = 0x12347654U; -+ static unsigned z = 0x1a2b3c4dU; -+ static unsigned w = 0x87654321U; -+ unsigned t = x ^ (x << 11); -+ x = y; -+ y = z; -+ z = w; -+ w = w ^ (w >> 19) ^ t ^ (t >> 8); -+ return w; -+} -+ -+void -+init (unsigned int *p, int count, int mod) -+{ -+ int i; -+ for (i = 0; i < count; i++) -+ { -+ unsigned int v = r (); -+ if (mod) -+ v = (v % 31) + 1; -+ p[i] = v; -+ } -+} -+ -+void -+check (unsigned int *p, unsigned int *q, int count, unsigned int *s, int ss) -+{ -+ int i; -+ for (i = 0; i < count; i++) -+ { -+ if (s) -+ ss = s[i]; -+ if (p[i] != ((q[i] << ss) | (q[i] >> (32 - ss)))) -+ __builtin_abort (); -+ } -+} -+ -+int -+main () -+{ -+ init ((unsigned int *) &a, 4, 0); -+ init ((unsigned int *) &b, 4, 1); -+ init ((unsigned int *) &c, 8, 0); -+ init ((unsigned int *) &d, 8, 1); -+ init ((unsigned int *) &e, 16, 0); -+ init ((unsigned int *) &f, 16, 1); -+ g = a; -+ h = c; -+ j = e; -+ f1 (); -+ f5 (); -+ f9 (); -+ check ((unsigned int *) &a, (unsigned int *) &g, 4, 0, 2); -+ check ((unsigned int *) &c, (unsigned int *) &h, 8, 0, 2); -+ check ((unsigned int *) &e, (unsigned int *) &j, 16, 0, 2); -+ g = a; -+ h = c; -+ j = e; -+ f2 (); -+ f6 (); -+ f10 (); -+ check ((unsigned int *) &a, (unsigned int *) &g, 4, 0, 30); -+ check ((unsigned int *) &c, (unsigned int *) &h, 8, 0, 30); -+ check ((unsigned int *) &e, (unsigned int *) &j, 16, 0, 30); -+ g = a; -+ h = c; -+ j = e; -+ f3 (); -+ f7 (); -+ f11 (); -+ check ((unsigned int *) &a, (unsigned int *) &g, 4, (unsigned int *) &b, 0); -+ check ((unsigned int *) &c, (unsigned int *) &h, 8, (unsigned int *) &d, 0); -+ check ((unsigned int *) &e, (unsigned int *) &j, 16, (unsigned int *) &f, 0); -+ g = a; -+ h = c; -+ j = e; -+ f4 (5); -+ f8 (5); -+ f12 (5); -+ check ((unsigned int *) &a, (unsigned int *) &g, 4, 0, 5); -+ check ((unsigned int *) &c, (unsigned int *) &h, 8, 0, 5); -+ check ((unsigned int *) &e, (unsigned int *) &j, 16, 0, 5); -+ return 0; -+} -Index: gcc/testsuite/gcc.dg/pr61060.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/pr61060.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/pr61060.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,19 @@ -+/* PR target/61060 */ -+/* { dg-do compile } */ -+/* { dg-options "-O0 -ftree-ter" } */ -+ -+typedef __SIZE_TYPE__ size_t; -+ -+extern inline __attribute__ ((gnu_inline, always_inline, artificial)) -+void *memset (void *dest, int ch, size_t len) -+{ -+ return __builtin_memset (dest, ch, len); -+} -+ -+char buf[10]; -+ -+void -+foo (void) -+{ -+ memset (buf, sizeof (buf), 0); -+} -Index: gcc/testsuite/gcc.dg/pr61583.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/pr61583.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/pr61583.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,18 @@ -+/* { dg-do compile } */ -+/* { dg-options "-O2 -fcompare-debug" } */ -+ -+void -+f1 (int n, int b) -+{ -+ extern void f2 (int); -+ int j; -+ -+ if (b) -+ n = 1; -+ -+ if (n < 1) -+ __builtin_unreachable (); -+ -+ for (j = 0; j < n; j++) -+ f2 (j); -+} -Index: gcc/testsuite/gcc.dg/torture/pr60891.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/torture/pr60891.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/torture/pr60891.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,23 @@ -+/* { dg-do compile } */ -+/* { dg-additional-options "-fno-tree-ch -fno-tree-cselim -fno-tree-dominator-opts" } */ -+ -+int a, b, c, d, e, f; -+ -+void foo (int x) -+{ -+ for (;;) -+ { -+ int g = c; -+ if (x) -+ { -+ if (e) -+ while (a) -+ --f; -+ } -+ for (b = 5; b; b--) -+ { -+ } -+ if (!g) -+ x = 0; -+ } -+} -Index: gcc/testsuite/gcc.dg/torture/pr61010.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/torture/pr61010.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/torture/pr61010.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,8 @@ -+/* { dg-do compile } */ -+ -+int main (void) -+{ -+ int a = 0; -+ unsigned b = (a * 64 & 192) | 63U; -+ return 0; -+} -Index: gcc/testsuite/gcc.dg/torture/pr61452.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/torture/pr61452.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/torture/pr61452.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,31 @@ -+/* { dg-do run } */ -+ -+int a, b; -+short c, d; -+char e, f; -+ -+int -+fn1 (int p1, char p2) -+{ -+ return p1 || p2 ? 0 : p2; -+} -+ -+void -+fn2 () -+{ -+ for (; a;) -+ { -+ int g; -+ g = c = e; -+ for (; a;) -+ b = fn1 (g = d = e, g); -+ f = g; -+ } -+} -+ -+int -+main () -+{ -+ fn2 (); -+ return 0; -+} -Index: gcc/testsuite/gcc.dg/torture/pr61383-1.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/torture/pr61383-1.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/torture/pr61383-1.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,35 @@ -+/* { dg-do run } */ -+ -+int a, b = 1, c, d, e, f, g; -+ -+int -+fn1 () -+{ -+ int h; -+ for (;;) -+ { -+ g = b; -+ g = g ? 0 : 1 % g; -+ e = a + 1; -+ for (; d < 1; d = e) -+ { -+ if (f == 0) -+ h = 0; -+ else -+ h = 1 % f; -+ if (f < 1) -+ c = 0; -+ else if (h) -+ break; -+ } -+ if (b) -+ return 0; -+ } -+} -+ -+int -+main () -+{ -+ fn1 (); -+ return 0; -+} -Index: gcc/testsuite/gcc.dg/torture/pr60903.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/torture/pr60903.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/torture/pr60903.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,22 @@ -+/* { dg-do compile } */ -+ -+extern int a, b, k, q; -+ -+void -+foo () -+{ -+ if (a) -+ { -+ while (q) -+ { -+ lbl: -+ if (a) -+ { -+ a = 0; -+ goto lbl; -+ } -+ } -+ b = k; -+ } -+ goto lbl; -+} -Index: gcc/testsuite/gcc.dg/torture/pr60930.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/torture/pr60930.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/torture/pr60930.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,22 @@ -+/* { dg-do run } */ -+ -+int x = 1; -+ -+__attribute__((noinline, noclone)) void -+foo (unsigned long long t) -+{ -+ asm volatile ("" : : "r" (&t)); -+ if (t == 1) -+ __builtin_abort (); -+} -+ -+int -+main () -+{ -+#if __SIZEOF_LONG_LONG__ >= 8 -+ unsigned long long t = 0xffffffffffffffffULL * (0xffffffffUL * x); -+ if (t != 0xffffffff00000001ULL) -+ foo (t);; -+#endif -+ return 0; -+} -Index: gcc/testsuite/gcc.dg/torture/pr61681.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/torture/pr61681.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/torture/pr61681.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,37 @@ -+/* { dg-do run } */ -+ -+extern void abort (void); -+ -+int a = 1, *e = &a, **f = &e, *l, *p, j; -+static int b; -+long d; -+short g; -+ -+void -+fn1 (int *p) -+{ -+ int m; -+ if (!(*p & j)) -+ { -+ int *n = &m; -+ for (d = 6; d; d--) -+ { -+ for (g = 0; g < 1; g++) -+ { -+ n = l = *f; -+ b = *p; -+ } -+ *n = 0; -+ } -+ } -+} -+ -+int -+main () -+{ -+ p = *f; -+ fn1 (p); -+ if (b != 0) -+ abort (); -+ return 0; -+} -Index: gcc/testsuite/gcc.dg/torture/pr57864.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/torture/pr57864.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/torture/pr57864.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,37 @@ -+/* { dg-do compile } */ -+ -+union U { -+ double val; -+ union U *ptr; -+}; -+ -+union U *d; -+double a; -+int b; -+int c; -+ -+static void fn1(union U *p1, int p2, _Bool p3) -+{ -+ union U *e; -+ -+ if (p2 == 0) -+ a = ((union U*)((unsigned long)p1 & ~1))->val; -+ -+ if (b) { -+ e = p1; -+ } else if (c) { -+ e = ((union U*)((unsigned long)p1 & ~1))->ptr; -+ d = e; -+ } else { -+ e = 0; -+ d = ((union U*)0)->ptr; -+ } -+ -+ fn1 (e, 0, 0); -+ fn1 (0, 0, p3); -+} -+ -+void fn2 (void) -+{ -+ fn1 (0, 0, 0); -+} -Index: gcc/testsuite/gcc.dg/unused-8b.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/unused-8b.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/unused-8b.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,4 @@ -+/* { dg-do compile } */ -+/* { dg-options "-Wall -Wno-unused -Wextra" } */ -+ -+void foo(int x) { } -Index: gcc/testsuite/gcc.dg/pr61053.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/pr61053.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/pr61053.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,75 @@ -+/* PR c/61053 */ -+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ -+/* { dg-options "-std=c11 -pedantic-errors" } */ -+ -+_Alignas (char) char cc; -+_Alignas (short int) char cs; -+_Alignas (int) char ci; -+_Alignas (long int) char cl; -+_Alignas (long long int) char cll; -+_Alignas (float) char cf; -+_Alignas (double) char cd; -+_Alignas (long double) char cld; -+ -+_Alignas (char) short int sc; /* { dg-error "cannot reduce alignment" } */ -+_Alignas (short int) short int ss; -+_Alignas (int) short int si; -+_Alignas (long int) short int sl; -+_Alignas (long long int) short int sll; -+_Alignas (float) short int sf; -+_Alignas (double) short int sd; -+_Alignas (long double) short int sld; -+ -+_Alignas (char) int ic; /* { dg-error "cannot reduce alignment" } */ -+_Alignas (short int) int is; /* { dg-error "cannot reduce alignment" } */ -+_Alignas (int) int ii; -+_Alignas (long int) int il; -+_Alignas (long long int) int ill; -+_Alignas (float) int if_; -+_Alignas (double) int id; -+_Alignas (long double) int ild; -+ -+_Alignas (char) long int lic; /* { dg-error "cannot reduce alignment" } */ -+_Alignas (short int) long int lis; /* { dg-error "cannot reduce alignment" } */ -+_Alignas (int) long int lii; /* { dg-error "cannot reduce alignment" "" { target { ! { ia32 } } } } */ -+_Alignas (long int) long int lil; -+_Alignas (long long int) long int lill; -+_Alignas (float) long int lif; /* { dg-error "cannot reduce alignment" "" { target { ! { ia32 } } } } */ -+_Alignas (double) long int lid; -+_Alignas (long double) long int lild; -+ -+_Alignas (char) long long int llic; /* { dg-error "cannot reduce alignment" } */ -+_Alignas (short int) long long int llis; /* { dg-error "cannot reduce alignment" } */ -+_Alignas (int) long long int llii; /* { dg-error "cannot reduce alignment" "" { target { ! { ia32 } } } } */ -+_Alignas (long int) long long int llil; -+_Alignas (long long int) long long int llill; -+_Alignas (float) long long int llif; /* { dg-error "cannot reduce alignment" "" { target { ! { ia32 } } } } */ -+_Alignas (double) long long int llid; -+_Alignas (long double) long long int llild; -+ -+_Alignas (char) float fc; /* { dg-error "cannot reduce alignment" } */ -+_Alignas (short int) float fs; /* { dg-error "cannot reduce alignment" } */ -+_Alignas (int) float fi; -+_Alignas (long int) float fl; -+_Alignas (long long int) float fll; -+_Alignas (float) float ff; -+_Alignas (double) float fd; -+_Alignas (long double) float fld; -+ -+_Alignas (char) double dc; /* { dg-error "cannot reduce alignment" } */ -+_Alignas (short int) double ds; /* { dg-error "cannot reduce alignment" } */ -+_Alignas (int) double di; /* { dg-error "cannot reduce alignment" "" { target { ! { ia32 } } } } */ -+_Alignas (long int) double dl; -+_Alignas (long long int) double dll; -+_Alignas (float) double df; /* { dg-error "cannot reduce alignment" "" { target { ! { ia32 } } } } */ -+_Alignas (double) double dd; -+_Alignas (long double) double dld; -+ -+_Alignas (char) long double ldc; /* { dg-error "cannot reduce alignment" } */ -+_Alignas (short int) long double lds; /* { dg-error "cannot reduce alignment" } */ -+_Alignas (int) long double ldi; /* { dg-error "cannot reduce alignment" "" { target { ! { ia32 } } } } */ -+_Alignas (long int) long double ldl; /* { dg-error "cannot reduce alignment" "" { target { ! { ia32 } } } } */ -+_Alignas (long long int) long double ldll; /* { dg-error "cannot reduce alignment" "" { target { ! { ia32 } } } } */ -+_Alignas (float) long double ldf; /* { dg-error "cannot reduce alignment" "" { target { ! { ia32 } } } } */ -+_Alignas (double) long double ldd; /* { dg-error "cannot reduce alignment" "" { target { ! { ia32 } } } } */ -+_Alignas (long double) long double ldld; -Index: gcc/testsuite/gcc.dg/tree-ssa/alias-30.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/tree-ssa/alias-30.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/tree-ssa/alias-30.c (.../branches/gcc-4_9-branch) -@@ -1,5 +1,5 @@ - /* { dg-do compile } */ --/* { dg-options "-O -fdump-tree-fre-details" } */ -+/* { dg-options "-O -fdump-tree-fre1-details" } */ - - extern int posix_memalign(void **memptr, - __SIZE_TYPE__ alignment, __SIZE_TYPE__ size); -Index: gcc/testsuite/gcc.dg/tree-ssa/vrp93.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/tree-ssa/vrp93.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/tree-ssa/vrp93.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,36 @@ -+/* PR target/29776 */ -+/* PR tree-optimization/61725 */ -+/* { dg-do compile } */ -+/* { dg-options "-O2 -fdump-tree-vrp1" } */ -+/* { dg-final { scan-tree-dump-not "link_error" "vrp1"} } */ -+/* { dg-final { cleanup-tree-dump "vrp1" } } */ -+ -+#define A(fn, arg, min, max) \ -+ if (__builtin_##fn (arg) < min || __builtin_##fn (arg) > max) \ -+ link_error (); -+#define B(fn, min, max) \ -+ A (fn, a, min, max) A (fn##l, b, min, max) A (fn##ll, c, min, max) -+#define C(fn, min, sub) \ -+ A (fn, a, min, ((int) sizeof (a) * __CHAR_BIT__ - sub)) \ -+ A (fn##l, b, min, ((int) sizeof (b) * __CHAR_BIT__ - sub)) \ -+ A (fn##ll, c, min, ((int) sizeof (c) * __CHAR_BIT__ - sub)) -+ -+extern void link_error (void); -+ -+unsigned int d; -+unsigned long e; -+unsigned long long f; -+ -+void -+foo (int a, long b, long long c) -+{ -+ C (ffs, 0, 0) -+ a &= 63; b &= 63; c &= 63; -+ B (ffs, 0, 6) -+ a++; b++; c++; -+ B (ffs, 1, 7) -+ a -= 2; b -= 2; c -= 2; -+ C (ffs, 0, 0) -+ a -= 63; b -= 63; c -= 63; -+ C (ffs, 1, 0) -+} -Index: gcc/testsuite/gcc.dg/pr60844.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/pr60844.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/pr60844.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,16 @@ -+/* PR tree-optimization/60844 */ -+/* { dg-do compile } */ -+/* { dg-options "-O2 -g" } */ -+/* { dg-additional-options "-mtune=atom" { target { i?86-*-* x86_64-*-* } } } */ -+ -+void -+foo (int *x, int y, int z) -+{ -+ int b, c = x[0], d = x[1]; -+ for (b = 0; b < 1; b++) -+ { -+ int e = (y ? 1 : 0) | (d ? 2 : 0) | (z ? 1 : 0); -+ e |= (c ? 2 : 0) | ((1 >> b) ? 1 : 0); -+ x[2 + b] = e; -+ } -+} -Index: gcc/testsuite/gcc.dg/vect/pr60505.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/vect/pr60505.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/vect/pr60505.c (.../branches/gcc-4_9-branch) -@@ -10,3 +10,5 @@ - out[i] = (ovec[i] = in[i]); - out[num] = ovec[num/2]; - } -+ -+/* { dg-final { cleanup-tree-dump "vect" } } */ -Index: gcc/testsuite/gcc.dg/vect/vect-singleton_1.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/vect/vect-singleton_1.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/vect/vect-singleton_1.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,38 @@ -+/* PR target/59843 ICE on function taking/returning vector of one float64_t. */ -+ -+/* { dg-do compile } */ -+/* { dg-options "-Warray-bounds -O2 -fno-inline -std=c99" } */ -+ -+#define TEST(BASETYPE, VECTYPE, SUFFIX) \ -+ typedef BASETYPE VECTYPE \ -+ __attribute__ ((__vector_size__ (sizeof (BASETYPE)))); \ -+ VECTYPE \ -+ test_vadd_##SUFFIX (VECTYPE a, VECTYPE b) \ -+ { \ -+ return a + b; \ -+ } \ -+ \ -+ void \ -+ test_##SUFFIX (BASETYPE val) \ -+ { \ -+ VECTYPE var = { val }; \ -+ BASETYPE v0 = var[0]; \ -+ BASETYPE v1 = var[1]; /* { dg-warning "index value is out of bound" } */ \ -+ } -+ -+TEST (double, float64x1_t, f64) -+ -+/* Original bug was for above type; -+ in a nod to completeness, test other types too. */ -+ -+TEST (long long, int64x1_t, s64) -+ -+TEST (float, float32x1_t, f32) -+ -+TEST (long, longx1_t, l) -+ -+TEST (int, intx1_t, i) -+ -+TEST (short, int16x1_t, s16) -+ -+TEST (char, int8x1_t, s8) -Index: gcc/testsuite/gcc.dg/vect/pr60841.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/vect/pr60841.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/vect/pr60841.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,183 @@ -+/* { dg-do compile } */ -+/* { dg-additional-options "-ffast-math" } */ -+ -+/* This testcase shouldn't consume much memory or produce a 1GB vectorizer -+ dump file due to SLP tree explosion. */ -+ -+struct S { int f1, f2, f3, f4; } a; -+struct T { short f3, f2, f1, f4; }; -+int b, c, d, e, f, g; -+unsigned long z; -+ -+void -+foo (struct T *p, struct T *q, int x, int w) -+{ -+ for (; x; x++) -+ { -+ struct S h; -+ int i; -+ struct T j; -+ struct T *r; -+ h = a; -+ g = 0; -+ r = p + 2 * (c + 4) + 1; -+ j = *r; -+ r = p; -+ f = r->f1 - 1; -+ b = +1.0 + f * f; -+ i = (r->f2 + j.f2) / 2; -+ f = r->f3 - 1; -+ b += 1.0 - i * f * f; -+ f = r->f4 - 1; -+ if (b) -+ b += -1.0 - i * f; -+ if (b / w) -+ { -+ h.f1 += 8.0 * r->f1; -+ h.f2 += 8.0 * r->f2; -+ h.f3 += 8.0 * r->f3; -+ h.f4 += 8.0 * r->f4; -+ g = 1; -+ } -+ r++; -+ f = r->f1; -+ i = (r->f2 + j.f2) / 2; -+ f = r->f3 - 1; -+ b += 1.0 - i * f * f; -+ i = (r->f4); -+ if (b * 65535UL / w) -+ { -+ h.f1 += 10.0 * r->f1; -+ h.f2 += 10.0 * r->f2; -+ h.f3 += 10.0 * r->f3; -+ h.f4 += 10.0 * r->f4; -+ g += 10.0; -+ } -+ r++; -+ f = r->f1; -+ z = 5UL * i; -+ f = r->f2; -+ i = (r->f3 + j.f3) / 2; -+ b = -i * f * f; -+ i = (r->f4 + j.f4) / 2; -+ if (b * 65535UL / 25.0f) -+ { -+ h.f1 += 8.0 * r->f1; -+ h.f2 += 8.0 * r->f2; -+ h.f3 += 8.0 * r->f3; -+ h.f4 += 8.0 * r->f4; -+ g += 8.0; -+ } -+ r++; -+ f = r->f1 - j.f1; -+ b = 1 * 2.0 * i * f * f; -+ f = r->f2; -+ b += 4.0 * f; -+ i = r->f3 / 2; -+ f = r->f4 - 1; -+ if (b * 1) -+ { -+ h.f1 += 8.0 * r->f1; -+ h.f2 += 8.0 * r->f2; -+ h.f3 += 8.0 * r->f3; -+ h.f4 += 8.0 * r->f4; -+ g += 8.0; -+ } -+ b = 4.0 * 1 * f; -+ if (b * 65535UL / 25.0f) -+ { -+ h.f1 += 20.0 * r->f1; -+ h.f2 += 20.0 * r->f2; -+ h.f3 += 20.0 * r->f3; -+ h.f4 += 20.0 * r->f4; -+ g += 20.0; -+ } -+ b = 5 * (0.0 - i); -+ if (b < 0) -+ { -+ h.f1 += 8.0 * r->f1; -+ h.f2 += 8.0 * r->f2; -+ h.f3 += 8.0 * r->f3; -+ h.f4 += 8.0 * r->f4; -+ g += 8.0; -+ } -+ r = p + 2 * (c + 4); -+ i = (r->f1 + j.f1); -+ b = 1 * 2.0 * i * 1; -+ f = r->f2 - 1; -+ i = (r->f3 + j.f3) / 2; -+ b = 5 * (0.0 - i) * f * f; -+ i = (r->f4 + j.f4) / 2; -+ if (b * 65535UL / 25.0f) -+ { -+ h.f1 += 10.0 * r->f1; -+ h.f2 += 10.0 * r->f2; -+ h.f3 += 10.0 * r->f3; -+ h.f4 += 10.0 * r->f4; -+ g += 10.0; -+ } -+ r++; -+ f = r->f1; -+ b = 5UL * i * f; -+ i = (r->f2 + j.f2) / 2; -+ f = r->f3 - 1; -+ b = 5 * (0.0 - i) * f * f; -+ f = r->f4 - 1; -+ if (b * 65535UL / 25.0f) -+ { -+ h.f1 += 40.0 * r->f1; -+ h.f2 += 40.0 * r->f2; -+ h.f3 += 40.0 * r->f3; -+ h.f4 += 40.0 * r->f4; -+ g += 40.0; -+ } -+ r++; -+ i = (r->f1 + j.f1); -+ b = 5 * i * f; -+ f = r->f2; -+ b = 4.0 * f * f; -+ f = r->f3; -+ i = (r->f4 + j.f4) / 2; -+ b = 5 * (0.0 - i) * f * f; -+ if (b * 25.0f) -+ { -+ h.f1 += 8.0 * r->f1; -+ h.f2 += 8.0 * r->f2; -+ h.f3 += 8.0 * r->f3; -+ h.f4 += 8.0 * r->f4; -+ g += 8.0; -+ } -+ r = p + 4 * (c + 4); -+ i = r->f1 / 2; -+ b = 5 * (1.0 + i); -+ i = r->f2 + j.f2; -+ f = r->f3 - 1; -+ b = 5 * (0.0 - i) * f * f; -+ i = (r->f4 + j.f4) / 2; -+ if (b * 65535UL / 25.0f) -+ { -+ h.f1 += 5.0 * r->f1; -+ h.f2 += 5.0 * r->f2; -+ h.f3 += 5.0 * r->f3; -+ h.f4 += 5.0 * r->f4; -+ g += 5.0; -+ } -+ b = 5 * (1.0 + i); -+ if (b < 0) -+ { -+ h.f1 += 5.0 * r->f1; -+ h.f2 += 5.0 * r->f2; -+ h.f3 += 5.0 * r->f3; -+ h.f4 += 5.0 * r->f4; -+ g += 5.0; -+ } -+ q->f1 = (h.f1 + g / 2 - 1) / g; -+ q->f2 = (h.f2 + g / 2 - 1) / g; -+ q->f3 = (h.f3 + g / 2 - 1) / g; -+ q->f4 = (h.f4 + g / 2 - 1) / g; -+ p++; -+ q++; -+ } -+} -+ -+/* { dg-final { cleanup-tree-dump "vect" } } */ -Index: gcc/testsuite/gcc.dg/vect/pr61680.c -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/vect/pr61680.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/vect/pr61680.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,51 @@ -+/* { dg-do run } */ -+ -+#include "tree-vect.h" -+ -+double v[4096][4]; -+ -+__attribute__((noinline, noclone)) void -+bar (double p[][4]) -+{ -+ int i; -+ double d = 172.0; -+ for (i = 0; i < 4096; i++) -+ { -+ if (p[i][0] != 6.0 || p[i][1] != 6.0 || p[i][2] != 10.0) -+ __builtin_abort (); -+ if (__builtin_fabs (p[i][3] - d) > 0.25) -+ __builtin_abort (); -+ } -+} -+ -+__attribute__((noinline, noclone)) void -+foo (void) -+{ -+ int i; -+ double w[4096][4], t; -+ for (i = 0; i < 4096; i++) -+ { -+ w[i][0] = v[i][0] + 2.0; -+ w[i][1] = v[i][1] + 1.0; -+ w[i][2] = v[i][2] + 4.0; -+ w[i][3] = (w[i][0] * w[i][0] + w[i][1] * w[i][1] + w[i][2] * w[i][2]); -+ } -+ bar (w); -+} -+ -+int -+main () -+{ -+ int i; -+ -+ check_vect (); -+ -+ for (i = 0; i < 4096; i++) -+ { -+ v[i][0] = 4.0; -+ v[i][1] = 5.0; -+ v[i][2] = 6.0; -+ } -+ foo (); -+ return 0; -+} -Index: gcc/testsuite/gcc.dg/vect/vect.exp -=================================================================== ---- a/src/gcc/testsuite/gcc.dg/vect/vect.exp (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/gcc.dg/vect/vect.exp (.../branches/gcc-4_9-branch) -@@ -18,6 +18,7 @@ - - # Load support procs. - load_lib gcc-dg.exp -+load_lib clearcap.exp - - # Set up flags used for tests that don't specify options. - global DEFAULT_VECTCFLAGS -@@ -41,30 +42,9 @@ - # These flags are used for all targets. - lappend DEFAULT_VECTCFLAGS "-ftree-vectorize" "-fno-vect-cost-model" "-fno-common" - --# If the linker used understands -M <mapfile>, pass it to clear hardware --# capabilities set by the Sun assembler. --# Try mapfile syntax v2 first which is the only way to clear hwcap_2 flags. --set clearcap_ldflags "-Wl,-M,$srcdir/gcc.target/i386/clearcapv2.map" -- --if ![check_no_compiler_messages mapfilev2 executable { -- int main (void) { return 0; } --} $clearcap_ldflags ] { -- # If this doesn't work, fall back to the less capable v1 syntax. -- set clearcap_ldflags "-Wl,-M,$srcdir/gcc.target/i386/clearcap.map" -- -- if ![check_no_compiler_messages mapfile executable { -- int main (void) { return 0; } -- } $clearcap_ldflags ] { -- unset clearcap_ldflags -- } --} -- --if [info exists clearcap_ldflags] { -- lappend DEFAULT_VECTCFLAGS $clearcap_ldflags --} -- - # Initialize `dg'. - dg-init -+clearcap-init - - global VEC_FLAGS - set VEC_FLAGS $DEFAULT_VECTCFLAGS -@@ -308,4 +288,5 @@ - set dg-do-what-default ${save-dg-do-what-default} - - # All done. -+clearcap-finish - dg-finish -Index: gcc/testsuite/ChangeLog -=================================================================== ---- a/src/gcc/testsuite/ChangeLog (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/ChangeLog (.../branches/gcc-4_9-branch) -@@ -1,3 +1,874 @@ -+2014-07-10 Eric Botcazou <ebotcazou@adacore.com> -+ -+ * gnat.dg/opt39.adb: New test. -+ -+2014-07-09 Edward Smith-Rowland <3dw4rd@verizon.net> -+ -+ PR c++/58155 - -Wliteral-suffix warns about tokens which are skipped -+ g++.dg/cpp0x/pr58155.C: New. -+ -+2014-07-09 Alan Lawrence <alan.lawrence@arm.com> -+ -+ Backport r211369 from trunk. -+ 2014-06-09 Alan Lawrence <alan.lawrence@arm.com> -+ -+ PR target/61062 -+ * gcc.target/arm/pr48252.c (main): Expect same result as endian-neutral. -+ -+2014-07-08 Jakub Jelinek <jakub@redhat.com> -+ -+ PR rtl-optimization/61673 -+ * gcc.c-torture/execute/pr61673.c: New test. -+ -+2014-07-08 Richard Biener <rguenther@suse.de> -+ -+ PR tree-optimization/61680 -+ * gcc.dg/vect/pr61680.c: New testcase. -+ -+ PR tree-optimization/61681 -+ * gcc.dg/torture/pr61681.c: New testcase. -+ -+2014-07-08 Alan Lawrence <alan.lawrence@arm.com> -+ -+ Backport r211502 from mainline. -+ 2014-06-10 Alan Lawrence <alan.lawrence@arm.com> -+ -+ PR target/59843 -+ * gcc.dg/vect/vect-singleton_1.c: New file. -+ -+2014-07-08 Jakub Jelinek <jakub@redhat.com> -+ -+ PR tree-optimization/61725 -+ * gcc.dg/tree-ssa/vrp93.c: New test. -+ * gcc.c-torture/execute/pr61725.c: New test. -+ -+2014-07-07 Paul Thomas <pault@gcc.gnu.org> -+ -+ PR fortran/61459 -+ PR fortran/58883 -+ * gfortran.dg/allocatable_function_8.f90 : New test -+ -+2014-07-07 Dominique d'Humieres <dominiq@lps.ens.fr> -+ Mikael Morin <mikael@gcc.gnu.org> -+ -+ PR fortran/41936 -+ * gfortran.dg/class_array_15.f03: Check memory leaks. -+ -+2014-07-06 Jerry DeLisle <jvdelisle@gcc.gnu.org> -+ -+ Backport from mainline. -+ PR libgfortran/61640 -+ * gfortran.dg/arrayio_16.f90: New test. -+ -+2014-07-04 Jakub Jelinek <jakub@redhat.com> -+ -+ PR middle-end/61654 -+ * g++.dg/opt/pr61654.C: New test. -+ -+ PR tree-optimization/61684 -+ * gcc.c-torture/compile/pr61684.c: New test. -+ -+ PR c++/61382 -+ Backport from mainline -+ 2014-06-05 Andreas Schwab <schwab@suse.de> -+ -+ * g++.dg/cpp0x/initlist86.C (main): Initialize i. -+ -+2014-07-02 Jakub Jelinek <jakub@redhat.com> -+ Fritz Reese <Reese-Fritz@zai.com> -+ -+ * gfortran.dg/oldstyle_5.f: New test. -+ -+2014-07-01 Paul Pluzhnikov <ppluzhnikov@google.com> -+ -+ PR c++/58753 -+ PR c++/58930 -+ PR c++/58704 -+ -+ Backported from mainline -+ 2014-05-20 Paolo Carlini <paolo.carlini@oracle.com> -+ -+ * g++.dg/cpp0x/nsdmi-template11.C: New. -+ * g++.dg/cpp0x/nsdmi-template12.C: Likewise. -+ * g++.dg/cpp0x/nsdmi-template13.C: Likewise. -+ -+2014-06-28 Edward Smith-Rowland <3dw4rd@verizon.net> -+ -+ PR c++/58781 -+ PR c++/60249 -+ PR c++/59867 -+ * testsuite/g++.dg/cpp0x/pr58781.C: New. -+ * testsuite/g++.dg/cpp0x/pr60249.C: New. -+ * testsuite/g++.dg/cpp1y/pr59867.C: New. -+ -+2014-06-30 Bill Schmidt <wschmidt@linux.vnet.ibm.com> -+ -+ * gfortran.dg/round_4.f90: Skip for powerpc*-*-linux* since the -+ test requires greater precision than the current PowerPC long -+ double implementation supports. -+ -+2014-06-30 Jakub Jelinek <jakub@redhat.com> -+ -+ Backported from mainline -+ 2014-06-27 Jakub Jelinek <jakub@redhat.com> -+ -+ PR tree-optimization/57233 -+ PR tree-optimization/61299 -+ * gcc.dg/pr57233.c: New test. -+ * gcc.target/i386/pr57233.c: New test. -+ * gcc.target/i386/sse2-pr57233.c: New test. -+ * gcc.target/i386/avx-pr57233.c: New test. -+ * gcc.target/i386/avx2-pr57233.c: New test. -+ * gcc.target/i386/avx512f-pr57233.c: New test. -+ * gcc.target/i386/xop-pr57233.c: New test. -+ -+ 2014-06-24 Jakub Jelinek <jakub@redhat.com> -+ -+ * gfortran.dg/gomp/udr2.f90 (f7, f9): Add !$omp parallel with -+ reduction clause. -+ * gfortran.dg/gomp/udr4.f90 (f4): Likewise. -+ Remove Label is never defined expected error. -+ * gfortran.dg/gomp/udr8.f90: New test. -+ -+ 2014-06-18 Jakub Jelinek <jakub@redhat.com> -+ -+ * gfortran.dg/gomp/declare-simd-1.f90: New test. -+ * gfortran.dg/gomp/depend-1.f90: New test. -+ * gfortran.dg/gomp/target1.f90: New test. -+ * gfortran.dg/gomp/target2.f90: New test. -+ * gfortran.dg/gomp/target3.f90: New test. -+ * gfortran.dg/gomp/udr4.f90: Adjust expected diagnostics. -+ * gfortran.dg/openmp-define-3.f90: Expect _OPENMP 201307 instead of -+ 201107. -+ -+ 2014-06-10 Jakub Jelinek <jakub@redhat.com> -+ -+ PR fortran/60928 -+ * gfortran.dg/gomp/allocatable_components_1.f90: Remove dg-error -+ directives. -+ * gfortran.dg/gomp/associate1.f90: New test. -+ * gfortran.dg/gomp/intentin1.f90: New test. -+ * gfortran.dg/gomp/openmp-simd-1.f90: New test. -+ * gfortran.dg/gomp/openmp-simd-2.f90: New test. -+ * gfortran.dg/gomp/openmp-simd-3.f90: New test. -+ * gfortran.dg/gomp/proc_ptr_2.f90: New test. -+ -+ 2014-06-09 Jakub Jelinek <jakub@redhat.com> -+ -+ * gfortran.dg/gomp/udr6.f90 (f1, f2, f3): Use complex(kind=8) -+ instead of complex(kind=16). -+ -+ 2014-06-06 Jakub Jelinek <jakub@redhat.com> -+ -+ * gfortran.dg/gomp/allocatable_components_1.f90: Adjust for -+ reduction clause diagnostic changes. -+ * gfortran.dg/gomp/appendix-a/a.31.3.f90: Likewise. -+ * gfortran.dg/gomp/reduction1.f90: Likewise. -+ * gfortran.dg/gomp/reduction3.f90: Likewise. -+ * gfortran.dg/gomp/udr1.f90: New test. -+ * gfortran.dg/gomp/udr2.f90: New test. -+ * gfortran.dg/gomp/udr3.f90: New test. -+ * gfortran.dg/gomp/udr4.f90: New test. -+ * gfortran.dg/gomp/udr5.f90: New test. -+ * gfortran.dg/gomp/udr6.f90: New test. -+ * gfortran.dg/gomp/udr7.f90: New test. -+ -+ 2014-05-12 Tobias Burnus <burnus@net-b.de> -+ -+ PR fortran/60127 -+ * gfortran.dg/gomp/omp_do_concurrent.f90: New. -+ -+ 2014-05-11 Jakub Jelinek <jakub@redhat.com> -+ -+ * gfortran.dg/gomp/affinity-1.f90: New test. -+ -+2014-06-30 Sebastian Huber <sebastian.huber@embedded-brains.de> -+ -+ * gcc.dg/typeof-2.c: New testcase. -+ -+2014-06-30 Kyrylo Tkachov <kyrylo.tkachov@arm.com> -+ -+ * gcc.target/aarch64/vqdmulhh_lane_s16.c: New test. -+ * gcc.target/aarch64/vqdmulhs_lane_s32.c: Likewise. -+ * gcc.target/aarch64/vqrdmulhh_lane_s16.c: Likewise. -+ * gcc.target/aarch64/vqrdmulhs_lane_s32.c: Likewise. -+ * gcc.target/aarch64/vqdmlal_high_lane_s16.c: New test. -+ * gcc.target/aarch64/vqdmlal_high_lane_s32.c: Likewise. -+ * gcc.target/aarch64/vqdmlal_high_laneq_s16.c: Likewise. -+ * gcc.target/aarch64/vqdmlal_high_laneq_s32.c: Likewise. -+ * gcc.target/aarch64/vqdmlal_lane_s16.c: Likewise. -+ * gcc.target/aarch64/vqdmlal_lane_s32.c: Likewise. -+ * gcc.target/aarch64/vqdmlal_laneq_s16.c: Likewise. -+ * gcc.target/aarch64/vqdmlal_laneq_s32.c: Likewise. -+ * gcc.target/aarch64/vqdmlalh_lane_s16.c: Likewise. -+ * gcc.target/aarch64/vqdmlals_lane_s32.c: Likewise. -+ * gcc.target/aarch64/vqdmlsl_high_lane_s16.c: Likewise. -+ * gcc.target/aarch64/vqdmlsl_high_lane_s32.c: Likewise. -+ * gcc.target/aarch64/vqdmlsl_high_laneq_s16.c: Likewise. -+ * gcc.target/aarch64/vqdmlsl_high_laneq_s32.c: Likewise. -+ * gcc.target/aarch64/vqdmlsl_lane_s16.c: Likewise. -+ * gcc.target/aarch64/vqdmlsl_lane_s32.c: Likewise. -+ * gcc.target/aarch64/vqdmlsl_laneq_s32.c: Likewise. -+ * gcc.target/aarch64/vqdmlslh_lane_s16.c: Likewise. -+ * gcc.target/aarch64/vqdmlsls_lane_s32.c: Likewise. -+ * gcc.target/aarch64/vqdmulh_laneq_s16.c: Likewise. -+ * gcc.target/aarch64/vqdmulh_laneq_s32.c: Likewise. -+ * gcc.target/aarch64/vqdmulhq_laneq_s16.c: Likewise. -+ * gcc.target/aarch64/vqdmulhq_laneq_s32.c: Likewise. -+ * gcc.target/aarch64/vqdmull_high_lane_s16.c: Likewise. -+ * gcc.target/aarch64/vqdmull_high_lane_s32.c: Likewise. -+ * gcc.target/aarch64/vqdmull_high_laneq_s16.c: Likewise. -+ * gcc.target/aarch64/vqdmull_high_laneq_s32.c: Likewise. -+ * gcc.target/aarch64/vqdmull_lane_s16.c: Likewise. -+ * gcc.target/aarch64/vqdmull_lane_s32.c: Likewise. -+ * gcc.target/aarch64/vqdmull_laneq_s16.c: Likewise. -+ * gcc.target/aarch64/vqdmull_laneq_s32.c: Likewise. -+ * gcc.target/aarch64/vqdmullh_lane_s16.c: Likewise. -+ * gcc.target/aarch64/vqdmulls_lane_s32.c: Likewise. -+ * gcc.target/aarch64/vqrdmulh_laneq_s16.c: Likewise. -+ * gcc.target/aarch64/vqrdmulh_laneq_s32.c: Likewise. -+ * gcc.target/aarch64/vqrdmulhq_laneq_s16.c: Likewise. -+ * gcc.target/aarch64/vqrdmulhq_laneq_s32.c: Likewise. -+ * gcc.target/aarch64/vector_intrinsics.c: Simplify arm_neon.h include. -+ (test_vqdmlal_high_lane_s16): Fix parameter type. -+ (test_vqdmlal_high_lane_s32): Likewise. -+ (test_vqdmull_high_lane_s16): Likewise. -+ (test_vqdmull_high_lane_s32): Likewise. -+ (test_vqdmlsl_high_lane_s32): Likewise. -+ (test_vqdmlsl_high_lane_s16): Likewise. -+ * gcc.target/aarch64/scalar_intrinsics.c (test_vqdmlalh_lane_s16): -+ Fix argument type. -+ (test_vqdmlals_lane_s32): Likewise. -+ (test_vqdmlslh_lane_s16): Likewise. -+ (test_vqdmlsls_lane_s32): Likewise. -+ (test_vqdmulhh_lane_s16): Likewise. -+ (test_vqdmulhs_lane_s32): Likewise. -+ (test_vqdmullh_lane_s16): Likewise. -+ (test_vqdmulls_lane_s32): Likewise. -+ (test_vqrdmulhh_lane_s16): Likewise. -+ (test_vqrdmulhs_lane_s32): Likewise. -+ -+2014-06-30 Igor Zamyatin <igor.zamyatin@intel.com> -+ -+ PR middle-end/57541 -+ * c-c++-common/cilk-plus/AN/pr57541.c: New case added. -+ * c-c++-common/cilk-plus/AN/pr57541-2.c: New test. -+ -+2014-06-30 Thomas Preud'homme <thomas.preudhomme@arm.com> -+ -+ Backport from mainline -+ 2014-06-11 Thomas Preud'homme <thomas.preudhomme@arm.com> -+ -+ PR tree-optimization/61306 -+ * gcc.c-torture/execute/pr61306-1.c: New test. -+ * gcc.c-torture/execute/pr61306-2.c: Likewise. -+ * gcc.c-torture/execute/pr61306-3.c: Likewise. -+ -+2014-06-27 Jerry DeLisle <jvdelisle@gcc.gnu.org> -+ -+ Backport from mainline. -+ PR libgfortran/61499 -+ * gfortran.dg/arrayio_15.f90: New test. -+ -+2014-06-27 Bill Schmidt <wschmidt@linux.vnet.ibm.com> -+ -+ * gfortran.dg/nint_2.f90: Don't XFAIL for powerpc64le-*-linux*. -+ -+2014-06-27 Paolo Carlini <paolo.carlini@oracle.com> -+ -+ PR c++/61614 -+ * g++.dg/ext/complit14.C: New. -+ -+2014-06-27 Martin Jambor <mjambor@suse.cz> -+ -+ PR ipa/61160 -+ * g++.dg/ipa/pr61160-2.C: New test. -+ * g++.dg/ipa/pr61160-3.C: Likewise. -+ -+2014-06-27 Uros Bizjak <ubizjak@gmail.com> -+ -+ Backport from mainline -+ 2014-06-26 Uros Bizjak <ubizjak@gmail.com> -+ -+ PR target/61586 -+ * gcc.target/alpha/pr61586.c: New test. -+ -+2014-06-26 Adam Butcher <adam@jessamine.co.uk> -+ -+ PR c++/61537 -+ * g++.dg/template/pr61537.C: New testcase. -+ -+2014-06-26 Martin Jambor <mjambor@suse.cz> -+ -+ * g++.dg/ipa/pr60600.C: Fix typo. -+ * g++.dg/ipa/devirt-25.C: Likewise. -+ * g++.dg/ipa/pr61540.C: Likewise. -+ -+2014-06-26 Martin Jambor <mjambor@suse.cz> -+ -+ * g++.dg/ipa/pr61540.C: Remove dumping test. -+ -+2014-06-25 Bill Schmidt <wschmidt@linux.vnet.ibm.com> -+ -+ * gfortran.dg/default_format_denormal_2.f90: Remove xfail for -+ powerpc*-*-linux*. -+ -+2014-06-23 Alan Modra <amodra@gmail.com> -+ -+ * gcc.dg/pr61583.c: New. -+ -+2014-06-20 Martin Jambor <mjambor@suse.cz> -+ -+ PR ipa/61540 -+ * g++.dg/ipa/pr61540.C: New test. -+ -+2014-06-17 Yufeng Zhang <yufeng.zhang@arm.com> -+ -+ PR target/61483 -+ * gcc.target/aarch64/aapcs64/type-def.h (struct hfa_fx2_t): New type. -+ * gcc.target/aarch64/aapcs64/va_arg-13.c: New test. -+ * gcc.target/aarch64/aapcs64/va_arg-14.c: Ditto. -+ * gcc.target/aarch64/aapcs64/va_arg-15.c: Ditto. -+ -+2014-06-17 Richard Biener <rguenther@suse.de> -+ -+ PR lto/61012 -+ * gcc.dg/lto/pr61526_0.c: New testcase. -+ * gcc.dg/lto/pr61526_1.c: Likewise. -+ -+2014-06-17 Uros Bizjak <ubizjak@gmail.com> -+ -+ Backport from mainline -+ 2014-06-06 Uros Bizjak <ubizjak@gmail.com> -+ -+ PR target/61423 -+ * gcc.target/i386/pr61423.c: New test. -+ -+2014-06-15 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> -+ -+ Backport from trunk. -+ PR fortran/45187 -+ * gfortran.dg/cray_pointers_10.f90: New file. -+ -+2014-06-13 Peter Bergner <bergner@vnet.ibm.com> -+ -+ Backport from mainline -+ -+ 2014-06-13 Peter Bergner <bergner@vnet.ibm.com> -+ PR target/61415 -+ * lib/target-supports.exp (check_effective_target_longdouble128): New. -+ * gcc.target/powerpc/pack02.c: Use it. -+ * gcc.target/powerpc/tfmode_off.c: Likewise. -+ -+2014-06-13 Jeff Law <law@redhat.com> -+ -+ Backports from mainline: -+ -+ 2014-06-13 Ilya Enkovich <ilya.enkovich@intel.com> -+ -+ PR rtl-optimization/61094 -+ PR rtl-optimization/61446 -+ * gcc.target/i386/pr61446.c : New. -+ -+ 2014-06-02 Jeff Law <law@redhat.com> -+ -+ PR rtl-optimization/61094 -+ * g++.dg/pr61094: New test. -+ -+2014-06-12 Jakub Jelinek <jakub@redhat.com> -+ -+ PR middle-end/61486 -+ * c-c++-common/gomp/pr61486-1.c: New test. -+ * c-c++-common/gomp/pr61486-2.c: New test. -+ -+2014-06-12 Jeff Law <law@redhat.com> -+ -+ Backports from mainline: -+ 2014-06-05 Jeff Law <law@redhat.com> -+ -+ PR tree-optimization/61289 -+ * g++.dg/pr61289.C: New test. -+ * g++.dg/pr61289-2.C: New test. -+ -+2014-06-12 Georg-Johann Lay <avr@gjlay.de> -+ -+ Backport from 2014-06-12 trunk r211491 -+ -+ PR target/61443 -+ * gcc.target/avr/torture/pr61443.c: New test. -+ -+2014-06-11 Richard Biener <rguenther@suse.de> -+ -+ PR tree-optimization/61452 -+ * gcc.dg/torture/pr61452.c: New testcase. -+ -+2014-06-11 Richard Biener <rguenther@suse.de> -+ -+ PR middle-end/61456 -+ * g++.dg/opt/pr61456.C: New testcase. -+ -+2014-06-09 Paul Thomas <pault@gcc.gnu.org> -+ -+ Backport from trunk. -+ PR fortran/61406 -+ * gfortran.dg/associate_17.f90 : New test -+ -+2014-06-07 Jerry DeLisle <jvdelisle@gcc.gnu> -+ -+ Backport from trunk. -+ PR libfortran/61173 -+ * gfortran.dg/arrayio_14.f90: New test. -+ -+2014-06-07 Eric Botcazou <ebotcazou@adacore.com> -+ -+ * gnat.dg/opt38.adb: New test. -+ * gnat.dg/opt38_pkg.ad[sb]: New helper. -+ -+2014-06-04 Richard Biener <rguenther@suse.de> -+ -+ PR tree-optimization/61383 -+ * gcc.dg/torture/pr61383-1.c: New testcase. -+ -+2014-06-04 Igor Zamyatin <igor.zamyatin@intel.com> -+ -+ PR c/58942 -+ * c-c++-common/cilk-plus/AN/pr58942.c: Check for correct handling of -+ the case with a pointer. -+ -+2014-06-04 Marek Polacek <polacek@redhat.com> -+ -+ Backport from mainline -+ 2014-05-08 Marek Polacek <polacek@redhat.com> -+ -+ PR c/61053 -+ * gcc.dg/pr61053.c: New test. -+ -+2014-06-03 Martin Jambor <mjambor@suse.cz> -+ -+ PR ipa/61160 -+ * g++.dg/ipa/pr61160-1.C: New test. -+ -+2014-06-03 Andrey Belevantsev <abel@ispras.ru> -+ -+ Backport from mainline -+ 2014-05-14 Andrey Belevantsev <abel@ispras.ru> -+ -+ PR rtl-optimization/60866 -+ * gcc.dg/pr60866.c: New test. -+ -+2014-06-03 Andrey Belevantsev <abel@ispras.ru> -+ -+ Backport from mainline -+ 2014-05-14 Andrey Belevantsev <abel@ispras.ru> -+ -+ PR rtl-optimization/60901 -+ * gcc.target/i386/pr60901.c: New test. -+ -+2014-06-01 Uros Bizjak <ubizjak@gmail.com> -+ -+ * g++.dg/pr60969.C (dg-do compile): Change ilp32 target to ia32. -+ -+2014-05-29 Vladimir Makarov <vmakarov@redhat.com> -+ -+ PR rtl-optimization/61325 -+ * gcc.target/aarch64/pr61325.c: New. -+ -+2014-05-29 Thomas Koenig <tkoenig@gcc.gnu.org> -+ -+ PR fortran/60834 -+ Backport from mainline -+ * gfortran.dg/associate_16.f90: New test. -+ -+2014-05-28 Eric Botcazou <ebotcazou@adacore.com> -+ -+ Backport from mainline -+ 2014-05-27 Eric Botcazou <ebotcazou@adacore.com> -+ -+ * gnat.dg/overflow_fixed.adb: New test. -+ -+2014-05-28 Richard Biener <rguenther@suse.de> -+ -+ Backport from mainline -+ 2014-05-28 Richard Biener <rguenther@suse.de> -+ -+ PR middle-end/61045 -+ * gcc.dg/pr61045.c: New testcase. -+ -+ 2014-05-05 Richard Biener <rguenther@suse.de> -+ -+ PR middle-end/61010 -+ * gcc.dg/torture/pr61010.c: New testcase. -+ -+ 2014-04-28 Richard Biener <rguenther@suse.de> -+ -+ PR tree-optimization/60979 -+ * gcc.dg/graphite/pr60979.c: New testcase. -+ -+2014-05-28 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> -+ -+ * lib/clearcap.exp: New file. -+ * gcc.dg/vect/vect.exp: Load clearcap.exp. -+ Remove clearcap_ldflags handling. -+ Call clearcap-init, clearcap-finish. -+ * gcc.target/i386/i386.exp: Likewise. -+ * gcc.target/i386/clearcap.map: Move to ../config/sol2-clearcap.map. -+ * gcc.target/i386/clearcapv2.map: Move to -+ ../config/sol2-clearcapv2.map. -+ * gcc.target/x86_64/abi/avx/abi-avx.exp: Likewise. -+ * gcc.target/x86_64/abi/avx512f/abi-avx512f.exp: Likewise. -+ -+2014-05-27 Eric Botcazou <ebotcazou@adacore.com> -+ -+ * gnat.dg/aliasing1.adb (dg-final): Robustify pattern matching. -+ -+2014-05-26 Uros Bizjak <ubizjak@gmail.com> -+ -+ * c-c++-common/cilk-plus/AN/pr61191.c: Fix dg-error directives. -+ -+2014-05-26 Igor Zamyatin <igor.zamyatin@intel.com> -+ -+ PR c/61191 -+ * c-c++-common/cilk-plus/AN/pr61191.c: Check for correct handling of -+ the case with syntax error. -+ -+2014-05-22 Peter Bergner <bergner@vnet.ibm.com> -+ -+ * gcc.target/powerpc/htm-ttest.c: New test. -+ -+2014-05-21 Igor Zamyatin <igor.zamyatin@intel.com> -+ -+ PR c++/60189 -+ * c-c++-common/cilk-plus/CK/invalid_sync.cc: New test. -+ -+2014-05-18 Jan Hubicka <hubicka@ucw.cz> -+ -+ PR middle-end/58094 -+ * g++.dg/ipa/devirt-11.C: Be lax about number of devirtualizations. -+ -+2014-05-18 Eric Botcazou <ebotcazou@adacore.com> -+ -+ * gnat.dg/enum3.adb: New test. -+ -+2014-04-16 Jan Hubicka <hubicka@ucw.cz> -+ -+ PR ipa/60854 -+ * g++.dg/torture/pr60854.C: New testcase. -+ -+2014-05-17 Uros Bizjak <ubizjak@gmail.com> -+ -+ * g++.dg/pr60969.C: Compile for all ilp32 x86 targets. -+ (dg-options): Add -mfpmath=387. -+ (dg-final): Check that no MMX registers are used. -+ -+2014-05-16 Vladimir Makarov <vmakarov@redhat.com> -+ -+ PR rtl-optimization/60969 -+ * g++.dg/pr60969.C: New. -+ -+2014-05-15 Martin Jambor <mjambor@suse.cz> -+ -+ PR ipa/61085 -+ * g++.dg/ipa/pr61085.C: New test. -+ -+2014-05-15 Jakub Jelinek <jakub@redhat.com> -+ -+ PR tree-optimization/61158 -+ * gcc.dg/pr61158.c: New test. -+ -+2014-05-14 Matthias Klose <doko@ubuntu.com> -+ -+ PR driver/61106 -+ * gcc-dg/unused-8a.c: Remove. -+ -+2014-05-13 Peter Bergner <bergner@vnet.ibm.com> -+ -+ * lib/target-support.exp (check_dfp_hw_available): New function. -+ (is-effective-target): Check $arg for dfp_hw. -+ (is-effective-target-keyword): Likewise. -+ * gcc.target/powerpc/pack03.c: (dg-require-effective-target): -+ Change target to dfp_hw. -+ -+2014-05-13 Jeff Law <law@redhat.com> -+ -+ Backports from mainline -+ -+ 2014-05-08 Jeff Law <law@redhat.com> -+ -+ PR tree-optimization/61009 -+ * g++.dg/tree-ssa/pr61009.C: New test. -+ -+ 2014-04-23 Jeff Law <law@redhat.com> -+ -+ PR tree-optimization/60902 -+ * gcc.target/i386/pr60902.c: New test. -+ -+2014-05-13 Jakub Jelinek <jakub@redhat.com> -+ -+ PR target/61060 -+ * gcc.dg/pr61060.c: New test. -+ -+2014-05-12 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com> -+ -+ Backport from mainline -+ 2014-05-12 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com> -+ -+ PR target/60991 -+ * gcc.target/avr/pr60991.c: New testcase. -+ -+2014-05-10 Jerry DeLisle <jvdelisle@gcc.gnu> -+ -+ Backport from trunk. -+ PR libfortran/61049 -+ * gfortran.dg/list_read_13.f: New test. -+ -+2014-05-09 Georg-Johann Lay <avr@gjlay.de> -+ -+ Backport from 2014-05-09 trunk r210267 -+ -+ PR target/61055 -+ * gcc.target/avr/torture/pr61055.c: New test. -+ -+2014-05-08 Matthias Klose <doko@ubuntu.com> -+ -+ PR driver/61106 -+ * gcc-dg/unused-8a.c: New. -+ * gcc-dg/unused-8b.c: Likewise. -+ -+2014-05-07 Paolo Carlini <paolo.carlini@oracle.com> -+ -+ PR c++/61083 -+ * g++.dg/cpp0x/sfinae50.C: New. -+ -+2014-05-07 Richard Biener <rguenther@suse.de> -+ -+ PR tree-optimization/57864 -+ * gcc.dg/torture/pr57864.c: New testcase. -+ -+2014-05-06 Paolo Carlini <paolo.carlini@oracle.com> -+ -+ PR c++/60999 -+ * g++.dg/cpp0x/nsdmi-template9.C: New. -+ * g++.dg/cpp0x/nsdmi-template10.C: Likewise. -+ -+2014-05-04 Jan Hubicka <hubicka@ucw.cz> -+ -+ PR ipa/60965 -+ * g++.dg/ipa/devirt-31.C: New testcase. -+ * g++.dg/ipa/devirt-11.C: Adjust testcase. -+ -+2014-05-04 Peter Bergner <bergner@vnet.ibm.com> -+ -+ * gcc.target/powerpc/pack02.c (dg-options): Add -mhard-float. -+ (dg-require-effective-target): Change target to powerpc_fprs. -+ * gcc.target/powerpc/pack03.c (dg-options): Add -mhard-dfp. -+ (dg-require-effective-target): Change target to dfprt. -+ -+2014-05-02 Bill Schmidt <wschmidt@linux.vnet.ibm.com> -+ -+ PR tree-optimization/60930 -+ * gcc.dg/torture/pr60930.c: New test. -+ -+2014-04-30 Michael Meissner <meissner@linux.vnet.ibm.com> -+ -+ Back port from mainline -+ 2014-04-24 Michael Meissner <meissner@linux.vnet.ibm.com> -+ -+ * gcc.target/powerpc/pack01.c: New test to test the new pack and -+ unpack builtin functionss for 128-bit types. -+ * gcc.target/powerpc/pack02.c: Likewise. -+ * gcc.target/powerpc/pack03.c: Likewise. -+ * gcc.target/powerpc/extend-divide-1.c: New test to test extended -+ divide builtin functionss. -+ * gcc.target/powerpc/extend-divide-2.c: Likewise. -+ * gcc.target/powerpc/bcd-1.c: New test for the new BCD builtin -+ functions. -+ * gcc.target/powerpc/bcd-2.c: Likewise. -+ * gcc.target/powerpc/bcd-3.c: Likewise. -+ * gcc.target/powerpc/dfp-builtin-1.c: New test for the new DFP -+ builtin functionss. -+ * gcc.target/powerpc/dfp-builtin-2.c: Likewise. -+ -+2014-04-29 Pat Haugen <pthaugen@us.ibm.com> -+ -+ Backport from mainline -+ 2014-04-17 Pat Haugen <pthaugen@us.ibm.com> -+ -+ * gcc.target/powerpc/ti_math1.c: New. -+ * gcc.target/powerpc/ti_math2.c: New. -+ -+2014-04-29 Jakub Jelinek <jakub@redhat.com> -+ -+ PR tree-optimization/60971 -+ * c-c++-common/turtore/pr60971.c: New test. -+ -+2014-04-26 Uros Bizjak <ubizjak@gmail.com> -+ -+ * gcc.dg/tree-ssa/alias-30.c (dg-options): Dump only fre1 details. -+ * gcc.dg/vect/pr60505.c: Cleanup vect tree dump. -+ * g++.dg/ipa/devirt-27.C (dg-options): Remove -fdump-ipa-devirt. -+ -+2014-04-25 Uros Bizjak <ubizjak@gmail.com> -+ -+ * c-c++-common/gomp/pr60823-2.c: Require effective target -+ vect_simd_clones. -+ -+2014-04-25 Jakub Jelinek <jakub@redhat.com> -+ -+ PR tree-optimization/60960 -+ * gcc.c-torture/execute/pr60960.c: New test. -+ -+2014-04-25 Eric Botcazou <ebotcazou@adacore.com> -+ -+ * gcc.c-torture/execute/20140425-1.c: New test. -+ -+2014-04-25 Richard Biener <rguenther@suse.de> -+ -+ PR ipa/60912 -+ * g++.dg/opt/pr60912.C: New testcase. -+ -+2014-04-25 Richard Biener <rguenther@suse.de> -+ -+ PR ipa/60911 -+ * gcc.dg/lto/pr60911_0.c: New testcase. -+ -+2014-04-24 Jakub Jelinek <jakub@redhat.com> -+ -+ * c-c++-common/gomp/atomic-16.c: Remove all dg-error directives. -+ Replace load with read and store with write. -+ -+2014-04-23 Uros Bizjak <ubizjak@gmail.com> -+ -+ Backport from mainline -+ 2014-04-21 Uros Bizjak <ubizjak@gmail.com> -+ -+ PR target/60909 -+ * gcc.target/i386/pr60909-1.c: New test. -+ * gcc.target/i386/pr60909-2.c: Ditto. -+ -+2014-04-23 Richard Biener <rguenther@suse.de> -+ -+ PR tree-optimization/60903 -+ * gcc.dg/torture/pr60903.c: New testcase. -+ -+2014-04-23 Richard Biener <rguenther@suse.de> -+ -+ Backport from mainline -+ 2014-04-14 Richard Biener <rguenther@suse.de> -+ -+ PR lto/60720 -+ * gcc.dg/lto/pr60720_0.c: New testcase. -+ * gcc.dg/lto/pr60720_1.c: Likewise. -+ -+2014-04-23 Richard Biener <rguenther@suse.de> -+ -+ PR middle-end/60895 -+ * g++.dg/torture/pr60895.C: New testcase. -+ -+2014-04-23 Richard Biener <rguenther@suse.de> -+ -+ PR middle-end/60891 -+ * gcc.dg/torture/pr60891.c: New testcase. -+ -+2014-04-22 Michael Meissner <meissner@linux.vnet.ibm.com> -+ -+ Backport from mainline -+ 2014-04-21 Michael Meissner <meissner@linux.vnet.ibm.com> -+ -+ PR target/60735 -+ * gcc.target/powerpc/pr60735.c: New test. Insure _Decimal64 does -+ not cause errors if -mspe. -+ -+2014-04-22 Tobias Burnus <burnus@net-b.de> -+ -+ Backport from mainline -+ 2014-04-11 Tobias Burnus <burnus@net-b.de> -+ -+ PR fortran/58880 -+ PR fortran/60495 -+ * gfortran.dg/finalize_25.f90: New. -+ -+2014-04-22 H.J. Lu <hongjiu.lu@intel.com> -+ -+ Backport from mainline -+ 2014-04-22 H.J. Lu <hongjiu.lu@intel.com> -+ -+ * gcc.target/i386/pr60868.c: New testcase. -+ -+2014-04-22 Jakub Jelinek <jakub@redhat.com> -+ -+ PR c/59073 -+ * c-c++-common/gomp/pr59073.c: New test. -+ -+2014-04-22 Bill Schmidt <wschmidt@linux.vnet.ibm.com> -+ -+ * gcc.dg/vmx/merge-vsx.c: Add V4SI and V4SF tests. -+ * gcc.dg/vmx/merge-vsx-be-order.c: Likewise. -+ -+2014-04-22 Richard Biener <rguenther@suse.de> -+ -+ Backport from mainline -+ 2014-04-14 Richard Biener <rguenther@suse.de> -+ -+ PR middle-end/55022 -+ * gcc.dg/graphite/pr55022.c: New testcase. -+ -+2014-04-22 Richard Biener <rguenther@suse.de> -+ -+ Backport from mainline -+ 2014-04-17 Richard Biener <rguenther@suse.de> -+ -+ PR middle-end/60849 -+ * g++.dg/opt/pr60849.C: New testcase. -+ -+2014-04-22 Richard Biener <rguenther@suse.de> -+ -+ Backport from mainline -+ 2014-04-17 Richard Biener <rguenther@suse.de> -+ -+ PR tree-optimization/60841 -+ * gcc.dg/vect/pr60841.c: New testcase. -+ -+2014-04-22 Richard Biener <rguenther@suse.de> -+ -+ Backport from mainline -+ 2014-04-17 Richard Biener <rguenther@suse.de> -+ -+ PR tree-optimization/60836 -+ * g++.dg/vect/pr60836.cc: New testcase. -+ -+2014-04-22 Richard Biener <rguenther@suse.de> -+ -+ Backport from mainline -+ 2014-04-14 Richard Biener <rguenther@suse.de> -+ Marc Glisse <marc.glisse@inria.fr> -+ -+ PR c/60819 -+ * gcc.target/i386/vec-may_alias.c: New testcase. -+ -+2014-04-22 Richard Biener <rguenther@suse.de> -+ -+ Backport from mainline -+ 2014-04-14 Richard Biener <rguenther@suse.de> -+ -+ PR tree-optimization/59817 -+ PR tree-optimization/60453 -+ * gfortran.dg/graphite/pr59817.f: New testcase. -+ * gcc.dg/graphite/pr59817-1.c: Likewise. -+ * gcc.dg/graphite/pr59817-2.c: Likewise. -+ -+2014-04-22 Jakub Jelinek <jakub@redhat.com> -+ -+ PR tree-optimization/60823 -+ * c-c++-common/gomp/pr60823-1.c: New test. -+ * c-c++-common/gomp/pr60823-2.c: New test. -+ * c-c++-common/gomp/pr60823-3.c: New test. -+ -+ Backported from mainline -+ 2014-04-16 Jakub Jelinek <jakub@redhat.com> -+ -+ PR tree-optimization/60844 -+ * gcc.dg/pr60844.c: New test. -+ - 2014-04-22 Release Manager - - * GCC 4.9.0 released. -@@ -51,7 +922,7 @@ - 2014-04-12 Jerry DeLisle <jvdelisle@gcc.gnu> - - PR libfortran/60810 -- gfortran.dg/arrayio_13.f90: New test. -+ * gfortran.dg/arrayio_13.f90: New test. - - 2014-04-11 Steve Ellcey <sellcey@mips.com> - Jakub Jelinek <jakub@redhat.com> -@@ -135,8 +1006,7 @@ - - 2014-04-08 Jason Merrill <jason@redhat.com> - -- * lib/gcc-dg.exp (dg-build-dso): Reset dg-do-what-default to -- compile. -+ * lib/gcc-dg.exp (dg-build-dso): Reset dg-do-what-default to compile. - - 2014-04-08 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> - -@@ -256,10 +1126,10 @@ - 2014-04-04 Martin Jambor <mjambor@suse.cz> - - PR ipa/60640 -- * g++.dg/ipa/pr60640-1.C: New test. -- * g++.dg/ipa/pr60640-2.C: Likewise. -- * g++.dg/ipa/pr60640-3.C: Likewise. -- * g++.dg/ipa/pr60640-4.C: Likewise. -+ * g++.dg/ipa/pr60640-1.C: New test. -+ * g++.dg/ipa/pr60640-2.C: Likewise. -+ * g++.dg/ipa/pr60640-3.C: Likewise. -+ * g++.dg/ipa/pr60640-4.C: Likewise. - - 2014-04-04 Jeff Law <law@redhat.com> - -@@ -371,7 +1241,7 @@ - - 2014-04-01 Fabien Chêne <fabien@gcc.gnu.org> - -- * g++.dg/init/ctor4.C: Adjust. -+ * g++.dg/init/ctor4.C: Adjust. - * g++.dg/init/ctor4-1.C: New. - * g++.dg/cpp0x/defaulted2.C: Adjust. - -@@ -459,8 +1329,8 @@ - - 2014-03-27 Jeff Law <law@redhat.com> - -- PR target/60648 -- * g++.dg/pr60648.C: New test. -+ PR target/60648 -+ * g++.dg/pr60648.C: New test. - - 2014-03-28 Adam Butcher <adam@jessamine.co.uk> - -@@ -493,14 +1363,13 @@ - - 2014-03-28 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> - -- * gcc.dg/tree-ssa/ssa-dom-thread-4.c: Remove s390 special -- option. -+ * gcc.dg/tree-ssa/ssa-dom-thread-4.c: Remove s390 special option. - * lib/target-supports.exp: Return true for s390 -- in check_effective_logical_op_short_circuit. -+ in check_effective_logical_op_short_circuit. - - 2014-03-28 Kirill Yukhin <kirill.yukhin@intel.com> - -- * gcc.target/i386/avx512f-vshuff32x4-2.c: Fix initialization -+ * gcc.target/i386/avx512f-vshuff32x4-2.c: Fix initialization - of second source operand. - * gcc.target/i386/avx512f-vshuff64x2-2.c: Ditto. - * gcc.target/i386/avx512f-vshufi32x4-2.c: Ditto. -@@ -635,8 +1504,8 @@ - - 2014-03-24 Marek Polacek <polacek@redhat.com> - -- * c-c++-common/ubsan/div-by-zero-4.c: Don't include limits.h. Define -- INT_MIN. -+ * c-c++-common/ubsan/div-by-zero-4.c: Don't include limits.h. -+ Define INT_MIN. - * c-c++-common/ubsan/overflow-1.c: Check for unwanted output. - * c-c++-common/ubsan/overflow-add-1.c: Likewise. - * c-c++-common/ubsan/overflow-mul-1.c: Likewise. -@@ -721,8 +1590,7 @@ - 2014-03-21 Tobias Burnus <burnus@net-b.de> - - PR fortran/60599 -- * lib/gcc-dg.exp (scan-module): Uncompress .mod files for -- reading. -+ * lib/gcc-dg.exp (scan-module): Uncompress .mod files for reading. - - 2014-03-20 Jakub Jelinek <jakub@redhat.com> - -@@ -1540,8 +2408,7 @@ - - 2014-02-19 Paul Pluzhnikov <ppluzhnikov@google.com> - -- * gcc.dg/vect/no-vfa-vect-depend-2.c (main1): Fix buffer -- overflow. -+ * gcc.dg/vect/no-vfa-vect-depend-2.c (main1): Fix buffer overflow. - - 2014-02-19 Jakub Jelinek <jakub@redhat.com> - -@@ -1850,8 +2717,7 @@ - - 2014-02-10 Jakub Jelinek <jakub@redhat.com> - -- * gcc.dg/vect/pr59984.c: Require effective target -- vect_simd_clones. -+ * gcc.dg/vect/pr59984.c: Require effective target vect_simd_clones. - - 2014-02-09 Paul Thomas <pault@gcc.gnu.org> - -@@ -3098,8 +3964,8 @@ - * gfortran.dg/vect/fast-math-mgrid-resid.f: Change - -fdump-tree-optimized to -fdump-tree-pcom-details in dg-options and - cleanup-tree-dump from optimized to pcom. Remove scan-tree-dump-times -- for vect_\[^\\n\]*\\+, add scan-tree-dump-times for no suitable chains and -- Executing predictive commoning without unrolling. -+ for vect_\[^\\n\]*\\+, add scan-tree-dump-times for no suitable -+ chains and Executing predictive commoning without unrolling. - - 2014-01-14 Kirill Yukhin <kirill.yukhin@intel.com> - -Index: gcc/testsuite/g++.dg/debug/dwarf2/imported-decl-2.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/debug/dwarf2/imported-decl-2.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/debug/dwarf2/imported-decl-2.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,32 @@ -+// { dg-do compile } -+// { dg-options "-gdwarf-2 -dA -O0 -fno-merge-debug-strings" } -+ -+class AAAA -+{ -+ public: -+ int method (void); -+ int a; -+}; -+ -+int -+AAAA::method (void) -+{ -+ return a; -+} -+ -+class BBBB : public AAAA -+{ -+ public: -+ using AAAA::method; -+ -+ int method (int b); -+}; -+ -+int -+BBBB::method (int b) -+{ -+ return a + b; -+} -+ -+// { dg-final { scan-assembler-not "ascii \"BBBB\\\\0\".*ascii \"AAAA\\\\0\".*DW_TAG_imported_declaration" } } -+// { dg-final { scan-assembler-times "ascii \"AAAA\\\\0\".*ascii \"BBBB\\\\0\".*DIE .0x\[0-9a-f\]*. DW_TAG_imported_declaration" 1 } } -Index: gcc/testsuite/g++.dg/debug/dwarf2/pr61433.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/debug/dwarf2/pr61433.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/debug/dwarf2/pr61433.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,23 @@ -+// PR c++/61433 -+// { dg-do compile { target c++11 } } -+// { dg-options "-O -fcompare-debug -fno-inline -fno-ipa-pure-const -fipa-sra" } -+ -+template <class T> -+struct A -+{ -+ template <class V> -+ struct B -+ { -+ int MEM; -+ }; -+}; -+struct D {}; -+struct C: public A<int>::B<D> -+{}; -+template <class T, class U, class V> -+auto k(T t, U u, V v) -> decltype (t.U::template B<V>::MEM) -+{} -+int main() -+{ -+ k( C(), A<int>(), D() ); -+} -Index: gcc/testsuite/g++.dg/cpp1y/pr59867.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/cpp1y/pr59867.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/cpp1y/pr59867.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,52 @@ -+// PR c++/59867 -+// { dg-do compile { target c++1y } } -+ -+#include <iostream> -+using namespace std; -+ -+// constant -+template<typename T, T x> -+ struct meta_value -+ { -+ typedef meta_value type; -+ typedef T value_type; -+ static const T value = x; -+ }; -+ -+// array -+template<typename T, T... data> -+ struct meta_array -+ { -+ typedef meta_array type; -+ typedef T item_type; -+ }; -+ -+// static array -> runtime array conversion utility -+template<typename T> -+ struct array_gen; -+ -+template<typename T, T... xs> -+ struct array_gen<meta_array<T, xs...>> -+ { -+ static const T value[sizeof...(xs)]; -+ }; -+ -+template<typename T, T... xs> -+ const T -+ array_gen<meta_array<T, xs...>>::value[sizeof...(xs)] = {xs...}; -+ -+// static string -+template<typename T, T... xs> -+ constexpr meta_array<T, xs...> -+ operator""_s() -+ { -+ static_assert(sizeof...(xs) == 3, "What's wrong with you?"); -+ return meta_array<T, xs...>(); -+ } -+ -+int -+main() -+{ -+ auto a = "123"_s; -+ const char (& xs)[3] = array_gen<decltype("123"_s)>::value; -+} -Index: gcc/testsuite/g++.dg/ext/complit14.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/ext/complit14.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/ext/complit14.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,11 @@ -+// PR c++/61614 -+// { dg-options "" } -+ -+int Fn (...); -+ -+void -+Test () -+{ -+ int j = Fn ((const int[]) { 0 }); // OK -+ unsigned long sz = sizeof Fn ((const int[]) { 0 }); // Error -+} -Index: gcc/testsuite/g++.dg/vect/pr60836.cc -=================================================================== ---- a/src/gcc/testsuite/g++.dg/vect/pr60836.cc (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/vect/pr60836.cc (.../branches/gcc-4_9-branch) -@@ -0,0 +1,39 @@ -+// { dg-do compile } -+ -+int a, b; -+typedef double (*NormFunc) (const int &); -+int & -+max (int &p1, int &p2) -+{ -+ if (p1 < p2) -+ return p2; -+ return p1; -+} -+ -+struct A -+{ -+ int operator () (int p1, int p2) -+ { -+ return max (p1, p2); -+ } -+}; -+template < class, class > double -+norm_ (const int &) -+{ -+ char c, d; -+ A e; -+ for (; a; a++) -+ { -+ b = e (b, d); -+ b = e (b, c); -+ } -+} -+ -+void -+norm () -+{ -+ static NormFunc f = norm_ < int, A >; -+ f = 0; -+} -+ -+// { dg-final { cleanup-tree-dump "vect" } } -Index: gcc/testsuite/g++.dg/opt/pr60849.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/opt/pr60849.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/opt/pr60849.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,13 @@ -+// { dg-do compile } -+// { dg-options "-O2" } -+ -+int g; -+ -+extern "C" int isnan (); -+ -+void foo(float a) { -+ int (*xx)(...); -+ xx = isnan; -+ if (xx(a)) -+ g++; -+} -Index: gcc/testsuite/g++.dg/opt/pr61456.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/opt/pr61456.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/opt/pr61456.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,26 @@ -+// { dg-do compile } -+// { dg-options "-O2 -std=c++11 -Werror=uninitialized" } -+ -+int rand (); -+ -+class Funcs -+{ -+public: -+ int *f1 (); -+ int *f2 (); -+}; -+typedef decltype (&Funcs::f1) pfunc; -+ -+static int Set (Funcs * f, const pfunc & fp) -+{ -+ (f->*fp) (); -+} -+ -+void -+Foo () -+{ -+ pfunc fp = &Funcs::f1; -+ if (rand ()) -+ fp = &Funcs::f2; -+ Set (0, fp); -+} -Index: gcc/testsuite/g++.dg/opt/pr61654.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/opt/pr61654.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/opt/pr61654.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,27 @@ -+// PR middle-end/61654 -+// { dg-do compile } -+ -+class A -+{ -+ virtual int a (int, int = 0) = 0; -+ int b (const int &); -+ int c; -+}; -+ -+class B : virtual A -+{ -+ int d; -+ int a (int, int); -+}; -+ -+int -+A::b (const int &) -+{ -+ return a ('\0'); -+} -+ -+int -+B::a (int, int) -+{ -+ return 0 ? 0 : d; -+} -Index: gcc/testsuite/g++.dg/opt/typeinfo1.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/opt/typeinfo1.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/opt/typeinfo1.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,27 @@ -+// PR c++/61020 -+// { dg-options "-O2" } -+// { dg-do run } -+ -+#include <typeinfo> -+ -+struct Base { -+ virtual ~Base() { } -+}; -+ -+struct Derived : public Base { -+}; -+ -+int compare(const Base& base) -+{ -+ return typeid(base) == typeid(typeid(Derived)); -+} -+ -+int main() -+{ -+ Base base; -+ Derived derived; -+ -+ if (compare(base)) return 1; -+ if (compare(derived)) return 2; -+ return 0; -+} -Index: gcc/testsuite/g++.dg/opt/pr60912.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/opt/pr60912.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/opt/pr60912.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,18 @@ -+// { dg-do run } -+// { dg-options "-O -fno-inline -fipa-pta" } -+ -+struct IFoo -+{ -+ virtual void Foo () = 0; -+}; -+ -+struct Bar:IFoo -+{ -+ void Foo () {} -+}; -+ -+int main () -+{ -+ (new Bar ())->Foo (); -+ return 0; -+} -Index: gcc/testsuite/g++.dg/pr61289-2.c -=================================================================== ---- a/src/gcc/testsuite/g++.dg/pr61289-2.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/pr61289-2.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,62 @@ -+/* { dg-do run } */ -+/* { dg-options "-O2 -fno-exceptions" } */ -+struct S -+{ -+ inline int fn1 () const { return s; } -+ __attribute__ ((noinline, noclone)) S *fn2 (int); -+ __attribute__ ((noinline, noclone)) void fn3 (); -+ __attribute__ ((noinline, noclone)) static S *fn4 (int); -+ S (int i) : s (i) {} -+ int s; -+}; -+ -+int a = 0; -+S *b = 0; -+ -+S * -+S::fn2 (int i) -+{ -+ a++; -+ if (a == 1) -+ return b; -+ if (a > 3) -+ __builtin_abort (); -+ b = this; -+ return new S (i + s); -+} -+ -+S * -+S::fn4 (int i) -+{ -+ b = new S (i); -+ return b; -+} -+ -+void -+S::fn3 () -+{ -+ delete this; -+} -+ -+void -+foo () -+{ -+ S *c = S::fn4 (20); -+ for (int i = 0; i < 2;) -+ { -+ S *d = c->fn2 (c->fn1 () + 10); -+ if (c != d) -+{ -+ c->fn3 (); -+ c = d; -+ ++i; -+} -+ } -+ c->fn3 (); -+} -+ -+int -+main () -+{ -+ foo (); -+} -Index: gcc/testsuite/g++.dg/init/copy7.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/init/copy7.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/init/copy7.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,9 @@ -+// CWG 5 -+ -+struct C { }; -+C c; -+struct A { -+ A(const A&); -+ A(const C&); -+}; -+const volatile A a = c; // Okay -Index: gcc/testsuite/g++.dg/pr61289.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/pr61289.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/pr61289.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,63 @@ -+/* { dg-do run } */ -+/* { dg-options "-O2 -fno-exceptions" } */ -+ -+struct S -+{ -+ inline int fn1 () const { return s; } -+ __attribute__ ((noinline, noclone)) S *fn2 (int); -+ __attribute__ ((noinline, noclone)) void fn3 (); -+ __attribute__ ((noinline, noclone)) static S *fn4 (int); -+ S (int i) : s (i) {} -+ int s; -+}; -+ -+int a = 0; -+S *b = 0; -+ -+S * -+S::fn2 (int i) -+{ -+ a++; -+ if (a == 1) -+ return b; -+ if (a > 3) -+ __builtin_abort (); -+ b = this; -+ return new S (i + s); -+} -+ -+S * -+S::fn4 (int i) -+{ -+ b = new S (i); -+ return b; -+} -+ -+void -+S::fn3 () -+{ -+ delete this; -+} -+ -+void -+foo () -+{ -+ S *c = S::fn4 (20); -+ for (int i = 0; i < 2;) -+ { -+ S *d = c->fn2 (c->fn1 () + 10); -+ if (d != c) -+{ -+ c->fn3 (); -+ c = d; -+ ++i; -+} -+ } -+ c->fn3 (); -+} -+ -+int -+main () -+{ -+ foo (); -+} -Index: gcc/testsuite/g++.dg/tree-ssa/pr61009.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/tree-ssa/pr61009.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/tree-ssa/pr61009.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,53 @@ -+/* { dg-do compile } */ -+/* { dg-options "-O2 -fno-tree-vrp -std=c++11 -fno-strict-aliasing -fdump-tree-dom1" } */ -+ -+#include <stdio.h> -+struct Field { -+ virtual int Compare(void*, void*); -+}; -+extern int NKF, NR; -+extern int idxs[]; -+extern Field* the_field; -+extern int *incs; -+extern char** fptrs; -+inline int doCmp(int this_row_offset, int field_idx) { -+ void *p = fptrs[field_idx] + this_row_offset * incs[field_idx]; -+ return the_field->Compare(p,0); -+} -+bool Test(void) { -+ -+ int row_offset = 0; -+ -+ for (; row_offset < NR; ++row_offset) { -+ -+ bool is_different = false; -+ for (int j = 0; j < NKF ; ++j) { -+ int field_idx = idxs[j]; -+ int cmp = doCmp(row_offset, field_idx); -+ fprintf (stderr, "cmp=%d\n",cmp); -+ -+ if (cmp == 0) { -+ continue; -+ } -+ if (cmp > 0) { -+ is_different = true; -+ break; -+ } else { -+ fprintf (stderr, "Incorrect\n"); -+ return false; -+ } -+ } -+ if (!is_different) { -+ -+ return false; -+ } -+ } -+ -+ return true; -+} -+ -+// The block ending with cmp == 0 should not be threaded. ie, -+// there should be a single == 0 comparison in the dump file. -+ -+// { dg-final { scan-tree-dump-times "== 0" 1 "dom1" } } -+// { dg-final { cleanup-tree-dump "dom1" } } -Index: gcc/testsuite/g++.dg/tls/thread_local9.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/tls/thread_local9.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/tls/thread_local9.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,23 @@ -+// PR c++/61343 -+ -+// { dg-do run { target c++11 } } -+// { dg-add-options tls } -+// { dg-require-effective-target tls_runtime } -+ -+struct Foo { -+ int value; -+ -+ Foo() noexcept { -+ value = 12; -+ } -+}; -+ -+static thread_local Foo a{}; -+ -+static __attribute__((noinline)) void UseA() { -+ if (a.value != 12) __builtin_abort(); -+} -+ -+int main() { -+ UseA(); -+} -Index: gcc/testsuite/g++.dg/pr61094.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/pr61094.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/pr61094.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,31 @@ -+/* { dg-do compile } */ -+/* { dg-options "-O3" } */ -+ -+template <typename> struct A { -+ unsigned _width, _height, _depth, _spectrum; -+ template <typename t> A(t p1) { -+ int a = p1.size(); -+ if (a) { -+ _width = p1._width; -+ _depth = _height = _spectrum = p1._spectrum; -+ } -+ } -+ long size() { return (long)_width * _height * _depth * _spectrum; } -+}; -+ -+int d; -+void fn1(void *); -+A<int> *fn2(); -+void fn3() { -+ int b; -+ for (;;) { -+ A<char> c(*fn2()); -+ fn1(&c); -+ if (d || !b) -+ throw; -+ } -+} -+ -+ -+ -+ -Index: gcc/testsuite/g++.dg/pr60969.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/pr60969.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/pr60969.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,32 @@ -+/* { dg-do compile { target { { i?86-*-* x86_64-*-* } && ia32 } } } */ -+/* { dg-options "-O2 -ftree-vectorize -march=pentium4 -mfpmath=387" } */ -+ -+struct A -+{ -+ float f, g, h, k; -+ A () {} -+ A (float v0, float x, float y) : f(v0), g(x), h(y), k(0.0f) {} -+ A bar (A &a, float t) { return A (f + a.f * t, g + a.g * t, h + a.h * t); } -+}; -+ -+A -+baz (A &x, A &y, float t) -+{ -+ return x.bar (y, t); -+} -+ -+A * -+foo (A &s, A &t, A &u, A &v, int y, int z) -+{ -+ A *x = new A[y * z]; -+ for (int i = 0; i < 7; i++) -+ { -+ A s = baz (s, u, i / (float) z); -+ A t = baz (t, v, i / (float) z); -+ for (int j = 0; j < 7; j++) -+ x[i * y + j] = baz (s, t, j / (float) y); -+ } -+ return x; -+} -+ -+/* { dg-final { scan-assembler-not "%mm" } } */ -Index: gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template13.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template13.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template13.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,20 @@ -+// PR c++/61566 -+// { dg-do compile { target c++11 } } -+ -+struct function -+{ -+ template < typename _Functor> -+ function (_Functor); -+}; -+ -+struct C -+{ -+ template <typename T> -+ void foo (T, function = [] {}); -+}; -+ -+void bar () -+{ -+ C c; -+ c.foo (1); -+} -Index: gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const3.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const3.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const3.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,38 @@ -+// PR c++/60992 -+// { dg-do compile { target c++11 } } -+ -+struct ScopeGuardGenerator { }; -+ -+struct FF -+{ -+ template < class F, class ... Ts > -+ void -+ operator () (F & ...) -+ { -+ const int n = sizeof ... (Ts) + 1; -+ void *mutexes[n]; -+ auto _on_scope_exit_var_0 = -+ ScopeGuardGenerator () + [&mutexes] { }; -+ } -+}; -+ -+template < class F > -+int operator+ (ScopeGuardGenerator, F) { return 1; } -+ -+struct D -+{ -+ template < class T0, class T1, class T2, class ... T > -+ void -+ operator () (T0, T1, const T2 & t2, T & ... t) -+ { -+ base (t2, t ...); -+ } -+ FF base; -+}; -+ -+D run_with_locks; -+ -+void Fn () -+{ -+ run_with_locks ([] { }, 0, 0); -+} -Index: gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this18.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this18.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this18.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,30 @@ -+// PR c++/61151 -+// { dg-do compile { target c++11 } } -+ -+struct B -+{ -+ void foo () {} -+}; -+ -+template <class> -+struct A -+{ -+ template <class> void bar (); -+ B a; -+}; -+ -+template <class T> -+template <class U> -+void -+A<T>::bar () -+{ -+ auto f = [this] () { auto g = [=] () { a.foo (); }; g (); }; -+ f (); -+} -+ -+int -+main () -+{ -+ A<int> a; -+ a.bar <int> (); -+} -Index: gcc/testsuite/g++.dg/cpp0x/nsdmi-template9.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/cpp0x/nsdmi-template9.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/cpp0x/nsdmi-template9.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,16 @@ -+// PR c++/60999 -+// { dg-do compile { target c++11 } } -+ -+template <typename A> -+struct foo -+{ -+}; -+ -+template<> -+struct foo<int> -+{ -+ static constexpr int code = 42; -+ unsigned int bar = static_cast<unsigned int>(code); -+}; -+ -+foo<int> a; -Index: gcc/testsuite/g++.dg/cpp0x/variadic158.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/cpp0x/variadic158.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/cpp0x/variadic158.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,24 @@ -+// PR c++/61134 -+// { dg-do compile { target c++11 } } -+ -+struct Base { }; -+ -+template <typename> -+struct Fixed { -+ typedef const char* name; -+}; -+ -+template <typename VT, typename... Fields> -+void New(const char* name, -+ typename Fixed<Fields>::name... field_names); -+ -+template <typename VT, typename... Fields> -+void CreateMetric(const char* name, -+ typename Fixed<Fields>::name... field_names, -+ const Base&) { } -+ -+ -+void Fn() -+{ -+ CreateMetric<int, const char*>("abcd", "def", Base()); -+} -Index: gcc/testsuite/g++.dg/cpp0x/pr60249.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/cpp0x/pr60249.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/cpp0x/pr60249.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,6 @@ -+// PR c++/60249 -+// { dg-do compile { target c++11 } } -+ -+decltype(""_) x; // { dg-error "unable to find string literal operator" } -+ -+// { dg-error "invalid type in declaration before" "invalid" { target *-*-* } 4 } -Index: gcc/testsuite/g++.dg/cpp0x/nsdmi-template11.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/cpp0x/nsdmi-template11.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/cpp0x/nsdmi-template11.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+// PR c++/58930 -+// { dg-do compile { target c++11 } } -+ -+struct SampleModule -+{ -+ explicit SampleModule (int); -+}; -+ -+template < typename > -+struct BaseHandler -+{ -+ SampleModule module_ { 0 }; -+}; -+ -+BaseHandler<int> a; -Index: gcc/testsuite/g++.dg/cpp0x/nsdmi-template13.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/cpp0x/nsdmi-template13.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/cpp0x/nsdmi-template13.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,11 @@ -+// PR c++/58704 -+// { dg-do compile { target c++11 } } -+ -+struct A {}; -+ -+template<typename> struct B -+{ -+ A a[1] = { }; -+}; -+ -+B<int> b; -Index: gcc/testsuite/g++.dg/cpp0x/variadic160.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/cpp0x/variadic160.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/cpp0x/variadic160.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,49 @@ -+// PR c++/61539 -+// { dg-do compile { target c++11 } } -+ -+template <typename _CharT> class A; -+template <typename> class B; -+template <class charT> class C; -+template <> class C<char> -+{ -+ virtual void xparse (int &, const B<A<char> > &) const; -+}; -+template <class T, class charT = char> class G : C<charT> -+{ -+public: -+ G (void *) {} -+ void default_value (const T &); -+ void xparse (int &, const B<A<charT> > &) const; -+}; -+template <class T, class charT> -+void validate (int &, const B<A<charT> > &, T *, int); -+template <class T, class charT> -+void G<T, charT>::xparse (int &p1, const B<A<charT> > &p2) const -+{ -+ validate (p1, p2, (T *)0, 0); -+} -+template <class T> G<T> *value (T *) { return new G<T>(0); } -+namespace Eigen -+{ -+template <typename T> struct D; -+template <typename, int, int, int = 0, int = 0, int = 0 > class F; -+template <typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, -+ int _MaxCols> -+struct D<F<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> > -+{ -+ typedef _Scalar Scalar; -+}; -+template <typename, int, int, int, int, int _MaxCols> class F -+{ -+public: -+ typedef typename Eigen::D<F>::Scalar Scalar; -+ F (const Scalar &, const Scalar &, const Scalar &); -+}; -+template <class... T> -+void validate (int &, const B<A<char> > &, Eigen::F<T...> *); -+} -+int main (int, char *[]) -+{ -+ Eigen::F<double, 3, 1> a (0, 0, 0); -+ value (&a)->default_value (Eigen::F<double, 3, 1>(0, 0, 0)); -+} -Index: gcc/testsuite/g++.dg/cpp0x/pr58781.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/cpp0x/pr58781.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/cpp0x/pr58781.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,18 @@ -+// PR c++/58781 -+// { dg-do compile { target c++11 } } -+ -+#include <cstddef> -+ -+int -+operator""_s(const char32_t *a, size_t b) -+{ -+ return 0; -+} -+ -+int -+f() -+{ -+ using a = decltype(U"\x1181"_s); -+ using b = decltype(U"\x8111"_s); -+ using c = decltype(U" \x1181"_s); -+} -Index: gcc/testsuite/g++.dg/cpp0x/constexpr-aggr1.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/cpp0x/constexpr-aggr1.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/cpp0x/constexpr-aggr1.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,17 @@ -+// PR c++/60951 -+// { dg-do compile { target c++11 } } -+ -+struct Foo { -+ constexpr Foo(int x = 0) : memb(x) {} -+ int memb; -+}; -+ -+struct FooContainer { -+ Foo foo[2]; -+}; -+ -+void fubar() { -+ int nonConst = 0; -+ FooContainer fooContainer; -+ fooContainer = { { 0, nonConst } }; -+} -Index: gcc/testsuite/g++.dg/cpp0x/pr58155.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/cpp0x/pr58155.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/cpp0x/pr58155.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,13 @@ -+// { dg-do compile { target c++11 } } -+ -+#define BAZ "baz" -+ -+#if 0 -+ -+"bar"BAZ -+ -+R"( -+ bar -+)"BAZ -+ -+#endif -Index: gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem2.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem2.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem2.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,13 @@ -+// PR c++/61661 -+// { dg-do compile { target c++11 } } -+ -+struct Outer { -+ -+ void Bar(); -+ -+ struct Foo { -+ void (Outer::*ptr)() ; -+ }; -+ -+ static constexpr Foo foo = { &Outer::Bar }; -+}; -Index: gcc/testsuite/g++.dg/cpp0x/variadic159.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/cpp0x/variadic159.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/cpp0x/variadic159.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,14 @@ -+// PR c++/61507 -+// { dg-do compile { target c++11 } } -+ -+struct A { -+ void foo(const int &); -+ void foo(float); -+}; -+ -+template <typename... Args> -+void bar(void (A::*memfun)(Args...), Args... args); -+ -+void go(const int& i) { -+ bar<const int &>(&A::foo, i); -+} -Index: gcc/testsuite/g++.dg/cpp0x/defaulted49.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/cpp0x/defaulted49.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/cpp0x/defaulted49.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+// PR c++/60980 -+// { dg-do compile { target c++11 } } -+ -+struct x0 -+{ -+ x0 () = default; -+}; -+struct x1 -+{ -+ x0 x2[2]; -+ void x3 () -+ { -+ x1 (); -+ } -+}; -Index: gcc/testsuite/g++.dg/cpp0x/ref-qual15.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/cpp0x/ref-qual15.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/cpp0x/ref-qual15.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,13 @@ -+// PR c++/59296 -+// { dg-do compile { target c++11 } } -+ -+struct Type -+{ -+ void get() const& { } -+ void get() const&& { } -+}; -+ -+int main() -+{ -+ Type{}.get(); -+} -Index: gcc/testsuite/g++.dg/cpp0x/nsdmi-template10.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/cpp0x/nsdmi-template10.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/cpp0x/nsdmi-template10.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,14 @@ -+// PR c++/60999 -+// { dg-do compile { target c++11 } } -+ -+struct B -+{ -+ template<int N, int M> -+ struct A; -+ -+ template<int M> -+ struct A<1, M> -+ { -+ int X = M; -+ }; -+}; -Index: gcc/testsuite/g++.dg/cpp0x/sfinae50.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/cpp0x/sfinae50.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/cpp0x/sfinae50.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,41 @@ -+// PR c++/61083 -+// { dg-do compile { target c++11 } } -+ -+template<typename T> T declval(); -+ -+template<typename T, typename U> -+struct is_same { -+ static const bool value = false; -+}; -+ -+template<typename T> -+struct is_same<T, T> { -+ static const bool value = true; -+}; -+ -+struct true_type {}; -+struct false_type {}; -+ -+template <typename T> -+struct is_foo { -+private: -+ template<typename U, U> struct helper {}; -+ -+ template <typename Z> static auto -+ test(Z z) -> decltype(helper<void (Z::*)() const, &Z::foo>(), true_type()); -+ -+ template <typename> static auto test(...) -> false_type; -+ -+public: -+ enum { value = is_same<decltype(test<T>(declval<T>())), true_type>::value }; -+}; -+ -+struct A { -+ int foo(); -+ void foo() const; -+}; -+ -+struct A1 : public A {}; -+ -+static_assert (is_foo<A>::value == 1, ""); -+static_assert (is_foo<A1>::value == 0, ""); -Index: gcc/testsuite/g++.dg/cpp0x/nsdmi-template12.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/cpp0x/nsdmi-template12.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/cpp0x/nsdmi-template12.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,17 @@ -+// PR c++/58753 -+// { dg-do compile { target c++11 } } -+ -+#include <initializer_list> -+ -+template <class T> -+struct X {X(std::initializer_list<int>) {}}; -+ -+template <class zomg> -+class T { -+ X<T> x{1}; -+}; -+ -+int main() -+{ -+ T<int> t; -+} -Index: gcc/testsuite/g++.dg/cpp0x/initlist84.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/cpp0x/initlist84.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/cpp0x/initlist84.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,17 @@ -+// PR c++/61242 -+// { dg-do compile { target c++11 } } -+ -+struct Foo -+{ -+ struct A -+ { -+ const int &container; -+ const int &args; -+ }; -+ static void Create (const A &); -+}; -+ -+int main () -+{ -+ Foo::Create ({{}, {}}); -+} -Index: gcc/testsuite/g++.dg/cpp0x/initlist86.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/cpp0x/initlist86.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/cpp0x/initlist86.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,18 @@ -+// PR c++/61382 -+// { dg-do run { target c++11 } } -+ -+struct A -+{ -+ int i,j; -+ A(int i,int j):i(i),j(j){} -+}; -+ -+extern "C" int printf (const char *, ...); -+ -+int main() -+{ -+ int i = 0; -+ A a{i++,i++}; -+ if (a.i != 0 || a.j != 1) -+ __builtin_abort(); -+} -Index: gcc/testsuite/g++.dg/cpp0x/constexpr-template7.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/cpp0x/constexpr-template7.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/cpp0x/constexpr-template7.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,32 @@ -+// PR c++/61556 -+// { dg-do compile { target c++11 } } -+ -+class ValueType { -+public: -+ constexpr operator int() const {return m_ID;}; -+ constexpr ValueType(const int v) -+ : m_ID(v) {} -+private: -+ int m_ID; -+}; -+ -+class ValueTypeEnum { -+public: -+ static constexpr ValueType doubleval = ValueType(1); -+}; -+ -+template <int format> -+class ValueTypeInfo { -+}; -+ -+template <typename Format> -+class FillFunctor { -+public: -+ FillFunctor() { -+ ValueTypeInfo<ValueTypeEnum::doubleval> v; -+ } -+}; -+ -+int main() { -+ ValueTypeInfo<ValueTypeEnum::doubleval> v; -+} -Index: gcc/testsuite/g++.dg/torture/pr60895.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/torture/pr60895.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/torture/pr60895.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,32 @@ -+// { dg-do compile } -+ -+struct C -+{ -+ double elems[3]; -+}; -+ -+C -+foo () -+{ -+ C a; -+ double *f = a.elems; -+ int b; -+ for (; b;) -+ { -+ *f = 0; -+ ++f; -+ } -+ return a; -+} -+ -+struct J -+{ -+ C c; -+ __attribute__((always_inline)) J () : c (foo ()) {} -+}; -+ -+void -+bar () -+{ -+ J (); -+} -Index: gcc/testsuite/g++.dg/torture/pr60854.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/torture/pr60854.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/torture/pr60854.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,13 @@ -+template <typename T> -+class MyClass -+{ -+public: -+ __attribute__ ((__always_inline__)) inline MyClass () { ; } -+}; -+ -+extern template class MyClass<double>; -+ -+void Func() -+{ -+ MyClass<double> x; -+} -Index: gcc/testsuite/g++.dg/ipa/pr61160-1.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/ipa/pr61160-1.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/ipa/pr61160-1.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,31 @@ -+/* { dg-do compile } */ -+/* { dg-options "-O3" } */ -+ -+struct CBase { -+ virtual void BaseFunc () {} -+}; -+ -+struct MMixin { -+ virtual void * MixinFunc (int, void *) = 0; -+}; -+ -+struct CExample: CBase, public MMixin -+{ -+ void *MixinFunc (int arg, void *arg2) -+ { -+ if (arg != 1 || arg2) -+ return 0; -+ return this; -+ } -+}; -+ -+void *test (MMixin & anExample) -+{ -+ return anExample.MixinFunc (1, 0); -+} -+ -+int main () -+{ -+ CExample c; -+ return (test (c) != &c); -+} -Index: gcc/testsuite/g++.dg/ipa/devirt-31.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/ipa/devirt-31.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/ipa/devirt-31.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,23 @@ -+/* { dg-options "-O2 -std=c++11 -fdump-ipa-inline" } */ -+#include <new> -+ -+class EmbeddedObject { -+public: -+ virtual int val() { return 2; } -+}; -+ -+class Container { -+ alignas(EmbeddedObject) char buffer[sizeof(EmbeddedObject)]; -+public: -+ EmbeddedObject *obj() { return (EmbeddedObject*)buffer; } -+ Container() { new (buffer) EmbeddedObject(); } -+}; -+ -+Container o; -+ -+int main() -+{ -+ __builtin_printf("%d\n", o.obj()->val()); -+} -+/* { dg-final { scan-ipa-dump-not "__builtin_unreachable" "inline" } } */ -+/* { dg-final { cleanup-ipa-dump "inline" } } */ -Index: gcc/testsuite/g++.dg/ipa/pr61160-3.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/ipa/pr61160-3.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/ipa/pr61160-3.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,37 @@ -+/* { dg-do run } */ -+/* { dg-options "-O3" } */ -+ -+struct A { -+ void *p; -+ A (void *q) : p (q) {} -+ A (const A &) : p () {} -+}; -+ -+struct CBase { -+ virtual void BaseFunc () {} -+}; -+ -+struct MMixin { -+ virtual A MixinFunc (int, A) = 0; -+}; -+ -+struct CExample: CBase, public MMixin -+{ -+ A MixinFunc (int arg, A arg2) -+ { -+ if (arg != 1 || arg2.p) -+ return 0; -+ return this; -+ } -+}; -+ -+void *test (MMixin & anExample) -+{ -+ return anExample.MixinFunc (1, (0)).p; -+} -+ -+int main () -+{ -+ CExample c; -+ return (test (c) != &c); -+} -Index: gcc/testsuite/g++.dg/ipa/pr61085.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/ipa/pr61085.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/ipa/pr61085.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,33 @@ -+/* { dg-do run } */ -+/* { dg-options "-O2 -fno-early-inlining" } */ -+ -+struct A {}; -+struct B : virtual A { -+ unsigned m_i; -+ B() : m_i () {} -+ virtual A *m_virt () -+ { -+ return 0; -+ } -+ ~B () -+ { -+ m_foo (); -+ while (m_i) -+ ; -+ } -+ void m_foo () -+ { -+ m_virt (); -+ } -+}; -+ -+class C : B { -+ A *m_virt () { -+ __builtin_abort (); -+ } -+}; -+ -+int main () -+{ -+ C c; -+} -Index: gcc/testsuite/g++.dg/ipa/pr60600.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/ipa/pr60600.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/ipa/pr60600.C (.../branches/gcc-4_9-branch) -@@ -30,5 +30,5 @@ - test(d); - } - --/* { dg-final { scan-ipa-dump "Type inconsident devirtualization" "cp" } } */ -+/* { dg-final { scan-ipa-dump "Type inconsistent devirtualization" "cp" } } */ - /* { dg-final { cleanup-ipa-dump "cp" } } */ -Index: gcc/testsuite/g++.dg/ipa/devirt-25.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/ipa/devirt-25.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/ipa/devirt-25.C (.../branches/gcc-4_9-branch) -@@ -22,5 +22,5 @@ - dpr_Job jobL; - dpr_run(jobL); - } --/* { dg-final { scan-ipa-dump "Type inconsident devirtualization" "cp" } } */ -+/* { dg-final { scan-ipa-dump "Type inconsistent devirtualization" "cp" } } */ - /* { dg-final { cleanup-ipa-dump "cp" } } */ -Index: gcc/testsuite/g++.dg/ipa/devirt-27.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/ipa/devirt-27.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/ipa/devirt-27.C (.../branches/gcc-4_9-branch) -@@ -1,5 +1,5 @@ - /* { dg-do compile } */ --/* { dg-options "-O3 -fdump-ipa-devirt -fdump-tree-optimized" } */ -+/* { dg-options "-O3 -fdump-tree-optimized" } */ - struct A - { - int a; -Index: gcc/testsuite/g++.dg/ipa/devirt-11.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/ipa/devirt-11.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/ipa/devirt-11.C (.../branches/gcc-4_9-branch) -@@ -45,5 +45,5 @@ - /* While inlining function called once we should devirtualize a new call to fn2 - and two to fn3. While doing so the new symbol for fn2 needs to be - introduced. */ --/* { dg-final { scan-ipa-dump-times "Discovered a virtual call to a known target" 3 "inline" } } */ -+/* { dg-final { scan-ipa-dump "Discovered a virtual call to a known target" "inline" } } */ - /* { dg-final { cleanup-ipa-dump "inline" } } */ -Index: gcc/testsuite/g++.dg/ipa/pr61160-2.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/ipa/pr61160-2.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/ipa/pr61160-2.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,43 @@ -+/* { dg-do run } */ -+/* { dg-options "-O3 --param ipa-cp-eval-threshold=1" } */ -+ -+extern "C" void abort (void); -+ -+struct CBase { -+ virtual void BaseFunc () {} -+}; -+ -+struct MMixin { -+ virtual void * MixinFunc (int, void *) = 0; -+}; -+ -+struct CExample: CBase, public MMixin -+{ -+ int stuff, magic, more_stuff; -+ -+ CExample () -+ { -+ stuff = 0; -+ magic = 0xbeef; -+ more_stuff = 0; -+ } -+ void *MixinFunc (int arg, void *arg2) -+ { -+ if (arg != 1 || arg2) -+ return 0; -+ if (magic != 0xbeef) -+ abort(); -+ return this; -+ } -+}; -+ -+void *test (MMixin & anExample) -+{ -+ return anExample.MixinFunc (1, 0); -+} -+ -+int main () -+{ -+ CExample c; -+ return (test (c) != &c); -+} -Index: gcc/testsuite/g++.dg/ipa/pr61540.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/ipa/pr61540.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/ipa/pr61540.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,38 @@ -+/* { dg-do compile } */ -+/* { dg-options "-O3 -fno-early-inlining" } */ -+ -+struct data { -+ data(int) {} -+}; -+ -+struct top { -+ virtual int topf() {} -+}; -+ -+struct intermediate: top { -+ int topf() /* override */ { return 0; } -+}; -+ -+struct child1: top { -+ void childf() -+ { -+ data d(topf()); -+ } -+}; -+ -+struct child2: intermediate {}; -+ -+void test(top& t) -+{ -+ child1& c = static_cast<child1&>(t); -+ c.childf(); -+ child2 d; -+ test(d); -+} -+ -+int main (int argc, char **argv) -+{ -+ child1 c; -+ test (c); -+ return 0; -+} -Index: gcc/testsuite/g++.dg/template/local-fn1.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/template/local-fn1.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/template/local-fn1.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,8 @@ -+// PR c++/60605 -+ -+template <typename T = int> -+struct Foo { -+ void bar() { -+ void bug(); -+ } -+}; -Index: gcc/testsuite/g++.dg/template/ptrmem28.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/template/ptrmem28.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/template/ptrmem28.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,10 @@ -+// PR c++/61488 -+ -+struct A { -+ typedef int (A::*cont_func)(); -+ template <A::cont_func> void wait(int); -+ int notify(); -+ -+ void fix() { wait<&A::notify>(0); } // OK -+ template <int> void repair() { wait<&A::notify>(0); } -+}; -Index: gcc/testsuite/g++.dg/template/conv14.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/template/conv14.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/template/conv14.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,30 @@ -+// PR c++/61647 -+ -+class XX; -+ -+template<typename Container, typename Key> -+struct Accessor; -+ -+template<typename Container, typename Key, typename KeyStore = Key> -+class Variant { -+protected: -+ KeyStore index; -+ Container state; -+public: -+ Variant(Container st, const Key& i) : index(i), state(st) {} -+ -+ template<typename T> -+ operator T() const { -+ return Accessor<Container, KeyStore>::template get<T>(state, index); -+ } -+}; -+ -+class AutoCleanVariant : public Variant<XX*, int> { -+public: -+ AutoCleanVariant(XX* st, int i) : Variant<XX*,int>(st,i) {} -+ -+ template<typename T> -+ operator T() const { -+ return Variant<XX*, int>::operator T(); -+ } -+}; -Index: gcc/testsuite/g++.dg/template/pr61537.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/template/pr61537.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/template/pr61537.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,23 @@ -+// PR c++/61537 -+// { dg-do compile } -+ -+struct A {}; -+ -+template <typename T> -+struct B -+{ -+ template <typename U> -+ void f(U, struct A); -+}; -+ -+template <typename T> -+template <typename U> -+void B<T>::f(U, struct A) -+{ -+} -+ -+int main() -+{ -+ B<char> b; -+ b.f(42, A()); -+} -Index: gcc/testsuite/g++.dg/template/ptrmem27.C -=================================================================== ---- a/src/gcc/testsuite/g++.dg/template/ptrmem27.C (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/g++.dg/template/ptrmem27.C (.../branches/gcc-4_9-branch) -@@ -0,0 +1,22 @@ -+// PR c++/61500 -+ -+struct X { -+ int i; -+ int j; -+ -+ int foo(int X::* ptr); -+ -+ template <int X::* ptr> -+ int bar(); -+}; -+ -+int X::foo(int X::* ptr) { -+ int* p = &(this->*ptr); // OK. -+ return *p; -+} -+ -+template <int X::* ptr> -+int X::bar() { -+ int* p = &(this->*ptr); // gcc 4.9.0: OK in C++98 mode, fails in C++11 mode. -+ return *p; -+} -Index: gcc/testsuite/c-c++-common/cilk-plus/CK/invalid_sync.cc -=================================================================== ---- a/src/gcc/testsuite/c-c++-common/cilk-plus/CK/invalid_sync.cc (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/c-c++-common/cilk-plus/CK/invalid_sync.cc (.../branches/gcc-4_9-branch) -@@ -0,0 +1,9 @@ -+/* PR c/60189 */ -+/* { dg-do compile } */ -+/* { dg-options "-fcilkplus" } */ -+ -+int main (void) -+{ -+ _Cilk_sync return; /* { dg-error " expected ';' before 'return'" } */ -+ return 0; -+} -Index: gcc/testsuite/c-c++-common/cilk-plus/AN/pr57541-2.c -=================================================================== ---- a/src/gcc/testsuite/c-c++-common/cilk-plus/AN/pr57541-2.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/c-c++-common/cilk-plus/AN/pr57541-2.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,15 @@ -+/* PR middle-end/57541 */ -+/* { dg-do compile } */ -+/* { dg-options "-fcilkplus" } */ -+ -+int foo1 () -+{ -+ int a; -+ a = __sec_reduce_add (1); /* { dg-error "Invalid builtin arguments" } */ -+} -+ -+int foo2 () -+{ -+ int a; -+ a = __sec_reduce_add (); /* { dg-error "Invalid builtin arguments" } */ -+} -Index: gcc/testsuite/c-c++-common/cilk-plus/AN/pr57541.c -=================================================================== ---- a/src/gcc/testsuite/c-c++-common/cilk-plus/AN/pr57541.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/c-c++-common/cilk-plus/AN/pr57541.c (.../branches/gcc-4_9-branch) -@@ -1,9 +1,10 @@ -+/* PR middle-end/57541 */ - /* { dg-do compile } */ - /* { dg-options "-fcilkplus" } */ - - int A[10]; - --int main () { -+int foo () { - - /* C compiler uses the term "undeclared" whereas C++ compiler uses - "not declared". Thus, grepping for declared seem to be the easiest. */ -@@ -13,5 +14,13 @@ - A[l:s:c]; - } - --/* { dg-message "note: each" "defined" { target c } 10 } */ -+int foo1 (int N) { - -+ char c = (char)N; -+ short s = (short)N; -+ A[l:s:c]; /* { dg-error "declared" } */ -+} -+ -+ -+/* { dg-message "note: each" "defined" { target c } 11 } */ -+ -Index: gcc/testsuite/c-c++-common/cilk-plus/AN/pr61191.c -=================================================================== ---- a/src/gcc/testsuite/c-c++-common/cilk-plus/AN/pr61191.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/c-c++-common/cilk-plus/AN/pr61191.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,10 @@ -+/* PR c/61191 */ -+/* { dg-do compile } */ -+/* { dg-options "-fcilkplus" } */ -+ -+double f(double * A, double * B) -+{ -+ return __sec_reduce_add((B[0:500])(; /* { dg-error "called object" "" { target c } } */ -+/* { dg-error "expected expression before ';' token" "" { target c } 7 } */ -+/* { dg-error "expected primary-expression before ';' token" "" { target c++ } 7 } */ -+} /* { dg-error "expected" "" { target c } } */ -Index: gcc/testsuite/c-c++-common/cilk-plus/AN/pr58942.c -=================================================================== ---- a/src/gcc/testsuite/c-c++-common/cilk-plus/AN/pr58942.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/c-c++-common/cilk-plus/AN/pr58942.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,8 @@ -+/* PR c/58942 */ -+/* { dg-do compile } */ -+/* { dg-options "-fcilkplus" } */ -+ -+int foo (int*p, int i) -+{ -+ return __sec_reduce_max_ind(p[1:i]); -+} -Index: gcc/testsuite/c-c++-common/torture/pr60971.c -=================================================================== ---- a/src/gcc/testsuite/c-c++-common/torture/pr60971.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/c-c++-common/torture/pr60971.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,34 @@ -+/* PR tree-optimization/60971 */ -+/* { dg-do run } */ -+ -+#ifndef __cplusplus -+#define bool _Bool -+#endif -+ -+volatile unsigned char c; -+ -+__attribute__((noinline)) unsigned char -+foo (void) -+{ -+ return c; -+} -+ -+__attribute__((noinline)) bool -+bar (void) -+{ -+ return foo () & 1; -+} -+ -+int -+main () -+{ -+ c = 0x41; -+ c = bar (); -+ if (c != 1) -+ __builtin_abort (); -+ c = 0x20; -+ c = bar (); -+ if (c != 0) -+ __builtin_abort (); -+ return 0; -+} -Index: gcc/testsuite/c-c++-common/gomp/atomic-16.c -=================================================================== ---- a/src/gcc/testsuite/c-c++-common/gomp/atomic-16.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/c-c++-common/gomp/atomic-16.c (.../branches/gcc-4_9-branch) -@@ -7,28 +7,28 @@ - foo () - { - int v; -- #pragma omp atomic seq_cst load /* { dg-error "expected end of line" } */ -- v = x; /* { dg-error "invalid form" } */ -- #pragma omp atomic seq_cst, load /* { dg-error "expected end of line" } */ -- v = x; /* { dg-error "invalid form" } */ -- #pragma omp atomic seq_cst store /* { dg-error "expected end of line" } */ -- x = v; /* { dg-error "invalid form" } */ -- #pragma omp atomic seq_cst ,store /* { dg-error "expected end of line" } */ -- x = v; /* { dg-error "invalid form" } */ -- #pragma omp atomic seq_cst update /* { dg-error "expected end of line" } */ -+ #pragma omp atomic seq_cst read -+ v = x; -+ #pragma omp atomic seq_cst, read -+ v = x; -+ #pragma omp atomic seq_cst write -+ x = v; -+ #pragma omp atomic seq_cst ,write -+ x = v; -+ #pragma omp atomic seq_cst update - x += v; -- #pragma omp atomic seq_cst , update /* { dg-error "expected end of line" } */ -+ #pragma omp atomic seq_cst , update - x += v; -- #pragma omp atomic seq_cst capture /* { dg-error "expected end of line" } */ -- v = x += 2; /* { dg-error "invalid form" } */ -- #pragma omp atomic seq_cst, capture /* { dg-error "expected end of line" } */ -- v = x += 2; /* { dg-error "invalid form" } */ -- #pragma omp atomic load , seq_cst /* { dg-error "expected end of line" } */ -- v = x; /* { dg-error "invalid form" } */ -- #pragma omp atomic store ,seq_cst /* { dg-error "expected end of line" } */ -- x = v; /* { dg-error "invalid form" } */ -- #pragma omp atomic update, seq_cst /* { dg-error "expected end of line" } */ -+ #pragma omp atomic seq_cst capture -+ v = x += 2; -+ #pragma omp atomic seq_cst, capture -+ v = x += 2; -+ #pragma omp atomic read , seq_cst -+ v = x; -+ #pragma omp atomic write ,seq_cst -+ x = v; -+ #pragma omp atomic update, seq_cst - x += v; -- #pragma omp atomic capture, seq_cst /* { dg-error "expected end of line" } */ -+ #pragma omp atomic capture, seq_cst - v = x += 2; - } -Index: gcc/testsuite/c-c++-common/gomp/pr61486-1.c -=================================================================== ---- a/src/gcc/testsuite/c-c++-common/gomp/pr61486-1.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/c-c++-common/gomp/pr61486-1.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,13 @@ -+/* PR middle-end/61486 */ -+/* { dg-do compile } */ -+/* { dg-options "-fopenmp" } */ -+ -+int -+foo (int *a) -+{ -+ int i, j = 0; -+ #pragma omp target teams distribute simd linear(i, j) map(a[:10]) -+ for (i = 0; i < 10; i++) -+ a[i] = j++; -+ return i + j; -+} -Index: gcc/testsuite/c-c++-common/gomp/pr61486-2.c -=================================================================== ---- a/src/gcc/testsuite/c-c++-common/gomp/pr61486-2.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/c-c++-common/gomp/pr61486-2.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,458 @@ -+/* PR middle-end/61486 */ -+/* { dg-do compile } */ -+/* { dg-options "-fopenmp" } */ -+ -+#pragma omp declare target -+void dosomething (int *a, int n, int m); -+#pragma omp end declare target -+ -+void -+test (int n, int o, int p, int q, int r, int s, int *pp) -+{ -+ int a[o], i, j; -+ #pragma omp target data device (n + 1) if (n != 6) map (tofrom: n, r) -+ { -+ #pragma omp target device (n + 1) if (n != 6) map (from: n) map (alloc: a[2:o-2]) -+ dosomething (a, n, 0); -+ #pragma omp target teams device (n + 1) num_teams (n + 4) thread_limit (n * 2) \ -+ if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \ -+ private (p) firstprivate (q) shared (n) reduction (+: r) -+ { -+ r = r + 1; -+ p = q; -+ dosomething (a, n, p + q); -+ } -+ #pragma omp target teams distribute device (n + 1) num_teams (n + 4) collapse (2) \ -+ if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \ -+ private (p) firstprivate (q) shared (n) reduction (+: r) \ -+ thread_limit (n * 2) dist_schedule (static, 4) -+ for (i = 0; i < 10; i++) -+ for (j = 0; j < 10; j++) -+ { -+ r = r + 1; -+ p = q; -+ dosomething (a, n, p + q); -+ } -+ #pragma omp target teams distribute device (n + 1) num_teams (n + 4) \ -+ if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \ -+ private (p) firstprivate (q) shared (n) reduction (+: r) \ -+ thread_limit (n * 2) dist_schedule (static, 4) -+ for (i = 0; i < 10; i++) -+ for (j = 0; j < 10; j++) -+ { -+ r = r + 1; -+ p = q; -+ dosomething (a, n, p + q); -+ } -+ #pragma omp target teams distribute parallel for device (n + 1) num_teams (n + 4) \ -+ if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \ -+ private (p) firstprivate (q) shared (n) reduction (+: r) \ -+ thread_limit (n * 2) dist_schedule (static, 4) collapse (2) \ -+ num_threads (n + 4) proc_bind (spread) lastprivate (s) \ -+ ordered schedule (static, 8) -+ for (i = 0; i < 10; i++) -+ for (j = 0; j < 10; j++) -+ { -+ r = r + 1; -+ p = q; -+ dosomething (a, n, p + q); -+ #pragma omp ordered -+ p = q; -+ s = i * 10 + j; -+ } -+ #pragma omp target teams distribute parallel for device (n + 1) num_teams (n + 4) \ -+ if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \ -+ private (p) firstprivate (q) shared (n) reduction (+: r) \ -+ thread_limit (n * 2) dist_schedule (static, 4) num_threads (n + 4) \ -+ proc_bind (master) lastprivate (s) ordered schedule (static, 8) -+ for (i = 0; i < 10; i++) -+ { -+ for (j = 0; j < 10; j++) -+ { -+ r = r + 1; -+ p = q; -+ dosomething (a, n, p + q); -+ } -+ #pragma omp ordered -+ p = q; -+ s = i * 10; -+ } -+ #pragma omp target teams distribute parallel for simd device (n + 1) \ -+ if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \ -+ private (p) firstprivate (q) shared (n) reduction (+: r) \ -+ thread_limit (n * 2) dist_schedule (static, 4) collapse (2) \ -+ num_threads (n + 4) proc_bind (spread) lastprivate (s) \ -+ schedule (static, 8) num_teams (n + 4) safelen(8) -+ for (i = 0; i < 10; i++) -+ for (j = 0; j < 10; j++) -+ { -+ r = r + 1; -+ p = q; -+ a[2+i*10+j] = p + q; -+ s = i * 10 + j; -+ } -+ #pragma omp target teams distribute parallel for simd device (n + 1) \ -+ if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \ -+ private (p) firstprivate (q) shared (n) reduction (+: r) \ -+ thread_limit (n * 2) dist_schedule (static, 4) num_threads (n + 4) \ -+ proc_bind (master) lastprivate (s) schedule (static, 8) \ -+ num_teams (n + 4) safelen(16) linear(i:1) aligned (pp:4) -+ for (i = 0; i < 10; i++) -+ { -+ r = r + 1; -+ p = q; -+ a[2+i] = p + q; -+ s = i * 10; -+ } -+ #pragma omp target teams distribute simd device (n + 1) \ -+ if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \ -+ private (p) firstprivate (q) shared (n) reduction (+: r) \ -+ thread_limit (n * 2) dist_schedule (static, 4) collapse (2) \ -+ lastprivate (s) num_teams (n + 4) safelen(8) -+ for (i = 0; i < 10; i++) -+ for (j = 0; j < 10; j++) -+ { -+ r = r + 1; -+ p = q; -+ a[2+i*10+j] = p + q; -+ s = i * 10 + j; -+ } -+ #pragma omp target teams distribute simd device (n + 1) \ -+ if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \ -+ private (p) firstprivate (q) shared (n) reduction (+: r) \ -+ thread_limit (n * 2) dist_schedule (static, 4) lastprivate (s) \ -+ num_teams (n + 4) safelen(16) linear(i:1) aligned (pp:4) -+ for (i = 0; i < 10; i++) -+ { -+ r = r + 1; -+ p = q; -+ a[2+i] = p + q; -+ s = i * 10; -+ } -+ #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) -+ #pragma omp teams num_teams (n + 4) thread_limit (n * 2) default(shared) \ -+ private (p) firstprivate (q) shared (n) reduction (+: r) -+ { -+ r = r + 1; -+ p = q; -+ dosomething (a, n, p + q); -+ } -+ #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) -+ #pragma omp teams distribute num_teams (n + 4) collapse (2) default(shared) \ -+ private (p) firstprivate (q) shared (n) reduction (+: r) \ -+ thread_limit (n * 2) dist_schedule (static, 4) -+ for (i = 0; i < 10; i++) -+ for (j = 0; j < 10; j++) -+ { -+ r = r + 1; -+ p = q; -+ dosomething (a, n, p + q); -+ } -+ #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) -+ #pragma omp teams distribute num_teams (n + 4) default(shared) \ -+ private (p) firstprivate (q) shared (n) reduction (+: r) \ -+ thread_limit (n * 2) dist_schedule (static, 4) -+ for (i = 0; i < 10; i++) -+ for (j = 0; j < 10; j++) -+ { -+ r = r + 1; -+ p = q; -+ dosomething (a, n, p + q); -+ } -+ #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) -+ #pragma omp teams distribute parallel for num_teams (n + 4) if (n != 6) \ -+ default(shared) private (p) firstprivate (q) shared (n) reduction (+: r) \ -+ thread_limit (n * 2) dist_schedule (static, 4) collapse (2) \ -+ num_threads (n + 4) proc_bind (spread) lastprivate (s) \ -+ ordered schedule (static, 8) -+ for (i = 0; i < 10; i++) -+ for (j = 0; j < 10; j++) -+ { -+ r = r + 1; -+ p = q; -+ dosomething (a, n, p + q); -+ #pragma omp ordered -+ p = q; -+ s = i * 10 + j; -+ } -+ #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) -+ #pragma omp teams distribute parallel for num_teams (n + 4) if (n != 6) \ -+ default(shared) private (p) firstprivate (q) shared (n) reduction (+: r) \ -+ thread_limit (n * 2) dist_schedule (static, 4) num_threads (n + 4) \ -+ proc_bind (master) lastprivate (s) ordered schedule (static, 8) -+ for (i = 0; i < 10; i++) -+ { -+ for (j = 0; j < 10; j++) -+ { -+ r = r + 1; -+ p = q; -+ dosomething (a, n, p + q); -+ } -+ #pragma omp ordered -+ p = q; -+ s = i * 10; -+ } -+ #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) -+ #pragma omp teams distribute parallel for simd if (n != 6)default(shared) \ -+ private (p) firstprivate (q) shared (n) reduction (+: r) \ -+ thread_limit (n * 2) dist_schedule (static, 4) collapse (2) \ -+ num_threads (n + 4) proc_bind (spread) lastprivate (s) \ -+ schedule (static, 8) num_teams (n + 4) safelen(8) -+ for (i = 0; i < 10; i++) -+ for (j = 0; j < 10; j++) -+ { -+ r = r + 1; -+ p = q; -+ a[2+i*10+j] = p + q; -+ s = i * 10 + j; -+ } -+ #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) -+ #pragma omp teams distribute parallel for simd if (n != 6)default(shared) \ -+ private (p) firstprivate (q) shared (n) reduction (+: r) \ -+ thread_limit (n * 2) dist_schedule (static, 4) num_threads (n + 4) \ -+ proc_bind (master) lastprivate (s) schedule (static, 8) \ -+ num_teams (n + 4) safelen(16) linear(i:1) aligned (pp:4) -+ for (i = 0; i < 10; i++) -+ { -+ r = r + 1; -+ p = q; -+ a[2+i] = p + q; -+ s = i * 10; -+ } -+ #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) -+ #pragma omp teams distribute simd default(shared) \ -+ private (p) firstprivate (q) shared (n) reduction (+: r) \ -+ thread_limit (n * 2) dist_schedule (static, 4) collapse (2) \ -+ lastprivate (s) num_teams (n + 4) safelen(8) -+ for (i = 0; i < 10; i++) -+ for (j = 0; j < 10; j++) -+ { -+ r = r + 1; -+ p = q; -+ a[2+i*10+j] = p + q; -+ s = i * 10 + j; -+ } -+ #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) -+ #pragma omp teams distribute simd default(shared) \ -+ private (p) firstprivate (q) shared (n) reduction (+: r) \ -+ thread_limit (n * 2) dist_schedule (static, 4) lastprivate (s) \ -+ num_teams (n + 4) safelen(16) linear(i:1) aligned (pp:4) -+ for (i = 0; i < 10; i++) -+ { -+ r = r + 1; -+ p = q; -+ a[2+i] = p + q; -+ s = i * 10; -+ } -+ #pragma omp target teams device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) \ -+ num_teams (n + 4) thread_limit (n * 2)default(shared) shared(n) \ -+ private (p) reduction (+: r) -+ #pragma omp distribute collapse (2) dist_schedule (static, 4) firstprivate (q) -+ for (i = 0; i < 10; i++) -+ for (j = 0; j < 10; j++) -+ { -+ r = r + 1; -+ p = q; -+ dosomething (a, n, p + q); -+ } -+ #pragma omp target teams device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) \ -+ num_teams (n + 4) thread_limit (n * 2) shared(n) private(p) reduction (+ : r) \ -+ default(shared) -+ #pragma omp distribute dist_schedule (static, 4) firstprivate (q) -+ for (i = 0; i < 10; i++) -+ for (j = 0; j < 10; j++) -+ { -+ r = r + 1; -+ p = q; -+ dosomething (a, n, p + q); -+ } -+ #pragma omp target teams device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) \ -+ num_teams (n + 4) thread_limit (n * 2) -+ #pragma omp distribute parallel for if (n != 6) \ -+ default(shared) private (p) firstprivate (q) shared (n) reduction (+: r) \ -+ collapse (2) dist_schedule (static, 4) \ -+ num_threads (n + 4) proc_bind (spread) lastprivate (s) \ -+ ordered schedule (static, 8) -+ for (i = 0; i < 10; i++) -+ for (j = 0; j < 10; j++) -+ { -+ r = r + 1; -+ p = q; -+ dosomething (a, n, p + q); -+ #pragma omp ordered -+ p = q; -+ s = i * 10 + j; -+ } -+ #pragma omp target teams device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) \ -+ num_teams (n + 4) thread_limit (n * 2) -+ #pragma omp distribute parallel for if (n != 6) \ -+ default(shared) private (p) firstprivate (q) shared (n) reduction (+: r) \ -+ num_threads (n + 4) dist_schedule (static, 4) \ -+ proc_bind (master) lastprivate (s) ordered schedule (static, 8) -+ for (i = 0; i < 10; i++) -+ { -+ for (j = 0; j < 10; j++) -+ { -+ r = r + 1; -+ p = q; -+ dosomething (a, n, p + q); -+ } -+ #pragma omp ordered -+ p = q; -+ s = i * 10; -+ } -+ #pragma omp target teams device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) \ -+ num_teams (n + 4) thread_limit (n * 2) -+ #pragma omp distribute parallel for simd if (n != 6)default(shared) \ -+ private (p) firstprivate (q) shared (n) reduction (+: r) \ -+ collapse (2) dist_schedule (static, 4) \ -+ num_threads (n + 4) proc_bind (spread) lastprivate (s) \ -+ schedule (static, 8) safelen(8) -+ for (i = 0; i < 10; i++) -+ for (j = 0; j < 10; j++) -+ { -+ r = r + 1; -+ p = q; -+ a[2+i*10+j] = p + q; -+ s = i * 10 + j; -+ } -+ #pragma omp target teams device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) \ -+ num_teams (n + 4) thread_limit (n * 2) -+ #pragma omp distribute parallel for simd if (n != 6)default(shared) \ -+ private (p) firstprivate (q) shared (n) reduction (+: r) \ -+ num_threads (n + 4) dist_schedule (static, 4) \ -+ proc_bind (master) lastprivate (s) schedule (static, 8) \ -+ safelen(16) linear(i:1) aligned (pp:4) -+ for (i = 0; i < 10; i++) -+ { -+ r = r + 1; -+ p = q; -+ a[2+i] = p + q; -+ s = i * 10; -+ } -+ #pragma omp target teams device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) \ -+ num_teams (n + 4) thread_limit (n * 2) default(shared) shared(n) private(p) \ -+ reduction(+:r) -+ #pragma omp distribute simd private (p) firstprivate (q) reduction (+: r) \ -+ collapse (2) dist_schedule (static, 4) lastprivate (s) safelen(8) -+ for (i = 0; i < 10; i++) -+ for (j = 0; j < 10; j++) -+ { -+ r = r + 1; -+ p = q; -+ a[2+i*10+j] = p + q; -+ s = i * 10 + j; -+ } -+ #pragma omp target teams device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) \ -+ num_teams (n + 4) thread_limit (n * 2) default(shared) shared(n) private(p) \ -+ reduction(+:r) -+ #pragma omp distribute simd private (p) firstprivate (q) reduction (+: r) \ -+ lastprivate (s) dist_schedule (static, 4) safelen(16) linear(i:1) aligned (pp:4) -+ for (i = 0; i < 10; i++) -+ { -+ r = r + 1; -+ p = q; -+ a[2+i] = p + q; -+ s = i * 10; -+ } -+ } -+} -+ -+int q, i, j; -+ -+void -+test2 (int n, int o, int p, int r, int s, int *pp) -+{ -+ int a[o]; -+ #pragma omp distribute collapse (2) dist_schedule (static, 4) firstprivate (q) -+ for (i = 0; i < 10; i++) -+ for (j = 0; j < 10; j++) -+ { -+ r = r + 1; -+ p = q; -+ dosomething (a, n, p + q); -+ } -+ #pragma omp distribute dist_schedule (static, 4) firstprivate (q) -+ for (i = 0; i < 10; i++) -+ for (j = 0; j < 10; j++) -+ { -+ r = r + 1; -+ p = q; -+ dosomething (a, n, p + q); -+ } -+ #pragma omp distribute parallel for if (n != 6) \ -+ default(shared) private (p) firstprivate (q) shared (n) reduction (+: r) \ -+ collapse (2) dist_schedule (static, 4) \ -+ num_threads (n + 4) proc_bind (spread) lastprivate (s) \ -+ ordered schedule (static, 8) -+ for (i = 0; i < 10; i++) -+ for (j = 0; j < 10; j++) -+ { -+ r = r + 1; -+ p = q; -+ dosomething (a, n, p + q); -+ #pragma omp ordered -+ p = q; -+ s = i * 10 + j; -+ } -+ #pragma omp distribute parallel for if (n != 6) \ -+ default(shared) private (p) firstprivate (q) shared (n) reduction (+: r) \ -+ num_threads (n + 4) dist_schedule (static, 4) \ -+ proc_bind (master) lastprivate (s) ordered schedule (static, 8) -+ for (i = 0; i < 10; i++) -+ { -+ for (j = 0; j < 10; j++) -+ { -+ r = r + 1; -+ p = q; -+ dosomething (a, n, p + q); -+ } -+ #pragma omp ordered -+ p = q; -+ s = i * 10; -+ } -+ #pragma omp distribute parallel for simd if (n != 6)default(shared) \ -+ private (p) firstprivate (q) shared (n) reduction (+: r) \ -+ collapse (2) dist_schedule (static, 4) \ -+ num_threads (n + 4) proc_bind (spread) lastprivate (s) \ -+ schedule (static, 8) safelen(8) -+ for (i = 0; i < 10; i++) -+ for (j = 0; j < 10; j++) -+ { -+ r = r + 1; -+ p = q; -+ a[2+i*10+j] = p + q; -+ s = i * 10 + j; -+ } -+ #pragma omp distribute parallel for simd if (n != 6)default(shared) \ -+ private (p) firstprivate (q) shared (n) reduction (+: r) \ -+ num_threads (n + 4) dist_schedule (static, 4) \ -+ proc_bind (master) lastprivate (s) schedule (static, 8) \ -+ safelen(16) linear(i:1) aligned (pp:4) -+ for (i = 0; i < 10; i++) -+ { -+ r = r + 1; -+ p = q; -+ a[2+i] = p + q; -+ s = i * 10; -+ } -+ #pragma omp distribute simd private (p) firstprivate (q) reduction (+: r) \ -+ collapse (2) dist_schedule (static, 4) lastprivate (s) safelen(8) -+ for (i = 0; i < 10; i++) -+ for (j = 0; j < 10; j++) -+ { -+ r = r + 1; -+ p = q; -+ a[2+i*10+j] = p + q; -+ s = i * 10 + j; -+ } -+ #pragma omp distribute simd private (p) firstprivate (q) reduction (+: r) \ -+ lastprivate (s) dist_schedule (static, 4) safelen(16) linear(i:1) aligned (pp:4) -+ for (i = 0; i < 10; i++) -+ { -+ r = r + 1; -+ p = q; -+ a[2+i] = p + q; -+ s = i * 10; -+ } -+} -Index: gcc/testsuite/c-c++-common/gomp/pr60823-1.c -=================================================================== ---- a/src/gcc/testsuite/c-c++-common/gomp/pr60823-1.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/c-c++-common/gomp/pr60823-1.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,19 @@ -+/* PR tree-optimization/60823 */ -+/* { dg-do compile } */ -+/* { dg-options "-O2 -fopenmp-simd" } */ -+ -+#pragma omp declare simd simdlen(4) notinbranch -+int -+foo (const double c1, const double c2) -+{ -+ double z1 = c1, z2 = c2; -+ int res = 100, i; -+ -+ for (i = 0; i < 100; i++) -+ { -+ res = (z1 * z1 + z2 * z2 > 4.0) ? (i < res ? i : res) : res; -+ z1 = c1 + z1 * z1 - z2 * z2; -+ z2 = c2 + 2.0 * z1 * z2; -+ } -+ return res; -+} -Index: gcc/testsuite/c-c++-common/gomp/pr60823-2.c -=================================================================== ---- a/src/gcc/testsuite/c-c++-common/gomp/pr60823-2.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/c-c++-common/gomp/pr60823-2.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,44 @@ -+/* PR tree-optimization/60823 */ -+/* { dg-do run } */ -+/* { dg-require-effective-target vect_simd_clones } */ -+/* { dg-options "-O2 -fopenmp-simd" } */ -+ -+#pragma omp declare simd simdlen(4) notinbranch -+__attribute__((noinline)) int -+foo (double c1, double c2) -+{ -+ double z1 = c1, z2 = c2; -+ int res = 100, i; -+ -+ for (i = 0; i < 5; i++) -+ { -+ res = (z1 * z1 + z2 * z2 > 4.0) ? (i < res ? i : res) : res; -+ z1 = c1 + z1 * z1 - z2 * z2; -+ z2 = c2 + 2.0 * z1 * z2; -+ c1 += 0.5; -+ c2 += 0.5; -+ } -+ return res; -+} -+ -+__attribute__((noinline, noclone)) void -+bar (double *x, double *y) -+{ -+ asm volatile ("" : : "rm" (x), "rm" (y) : "memory"); -+} -+ -+int -+main () -+{ -+ int i; -+ double c[4] = { 0.0, 1.0, 0.0, 1.0 }; -+ double d[4] = { 0.0, 1.0, 2.0, 0.0 }; -+ int e[4]; -+ bar (c, d); -+#pragma omp simd safelen(4) -+ for (i = 0; i < 4; i++) -+ e[i] = foo (c[i], d[i]); -+ if (e[0] != 3 || e[1] != 1 || e[2] != 1 || e[3] != 2) -+ __builtin_abort (); -+ return 0; -+} -Index: gcc/testsuite/c-c++-common/gomp/pr60823-3.c -=================================================================== ---- a/src/gcc/testsuite/c-c++-common/gomp/pr60823-3.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/c-c++-common/gomp/pr60823-3.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,32 @@ -+/* PR tree-optimization/60823 */ -+/* { dg-do compile } */ -+/* { dg-options "-O2 -fopenmp-simd -fno-strict-aliasing" } */ -+ -+void bar (char *, double *); -+ -+#if __SIZEOF_DOUBLE__ >= 4 -+ -+struct S { char c[sizeof (double)]; }; -+void baz (struct S, struct S); -+union U { struct S s; double d; }; -+ -+#pragma omp declare simd simdlen(4) notinbranch -+__attribute__((noinline)) int -+foo (double c1, double c2) -+{ -+ double *a = &c1; -+ char *b = (char *) &c1 + 2; -+ -+ b[-2]++; -+ b[1]--; -+ *a++; -+ c2++; -+ bar ((char *) &c2 + 1, &c2); -+ c2 *= 3.0; -+ bar (b, a); -+ baz (((union U) { .d = c1 }).s, ((union U) { .d = c2 }).s); -+ baz (*(struct S *)&c1, *(struct S *)&c2); -+ return c1 + c2 + ((struct S *)&c1)->c[1]; -+} -+ -+#endif -Index: gcc/testsuite/c-c++-common/gomp/pr59073.c -=================================================================== ---- a/src/gcc/testsuite/c-c++-common/gomp/pr59073.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/testsuite/c-c++-common/gomp/pr59073.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,12 @@ -+/* PR c/59073 */ -+/* { dg-do compile } */ -+/* { dg-options "-fopenmp" } */ -+ -+void -+foo () -+{ -+ int i; -+#pragma omp distribute parallel for -+ for (i = 0; i < 10; i) /* { dg-error "invalid increment expression" } */ -+ ; -+} -Index: gcc/cp/init.c -=================================================================== ---- a/src/gcc/cp/init.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/cp/init.c (.../branches/gcc-4_9-branch) -@@ -339,7 +339,8 @@ - gcc_assert (!processing_template_decl - || (SCALAR_TYPE_P (type) || TREE_CODE (type) == ARRAY_TYPE)); - -- if (type_build_ctor_call (type)) -+ if (CLASS_TYPE_P (type) -+ && type_build_ctor_call (type)) - { - tree ctor = build_aggr_init_expr - (type, -@@ -521,6 +522,49 @@ - } - } - -+/* Return the non-static data initializer for FIELD_DECL MEMBER. */ -+ -+tree -+get_nsdmi (tree member, bool in_ctor) -+{ -+ tree init; -+ tree save_ccp = current_class_ptr; -+ tree save_ccr = current_class_ref; -+ if (!in_ctor) -+ inject_this_parameter (DECL_CONTEXT (member), TYPE_UNQUALIFIED); -+ if (DECL_LANG_SPECIFIC (member) && DECL_TEMPLATE_INFO (member)) -+ { -+ /* Do deferred instantiation of the NSDMI. */ -+ init = (tsubst_copy_and_build -+ (DECL_INITIAL (DECL_TI_TEMPLATE (member)), -+ DECL_TI_ARGS (member), -+ tf_warning_or_error, member, /*function_p=*/false, -+ /*integral_constant_expression_p=*/false)); -+ -+ init = digest_nsdmi_init (member, init); -+ } -+ else -+ { -+ init = DECL_INITIAL (member); -+ if (init && TREE_CODE (init) == DEFAULT_ARG) -+ { -+ error ("constructor required before non-static data member " -+ "for %qD has been parsed", member); -+ DECL_INITIAL (member) = error_mark_node; -+ init = NULL_TREE; -+ } -+ /* Strip redundant TARGET_EXPR so we don't need to remap it, and -+ so the aggregate init code below will see a CONSTRUCTOR. */ -+ if (init && TREE_CODE (init) == TARGET_EXPR -+ && !VOID_TYPE_P (TREE_TYPE (TARGET_EXPR_INITIAL (init)))) -+ init = TARGET_EXPR_INITIAL (init); -+ init = break_out_target_exprs (init); -+ } -+ current_class_ptr = save_ccp; -+ current_class_ref = save_ccr; -+ return init; -+} -+ - /* Initialize MEMBER, a FIELD_DECL, with INIT, a TREE_LIST of - arguments. If TREE_LIST is void_type_node, an empty initializer - list was given; if NULL_TREE no initializer was given. */ -@@ -534,31 +578,7 @@ - /* Use the non-static data member initializer if there was no - mem-initializer for this field. */ - if (init == NULL_TREE) -- { -- if (DECL_LANG_SPECIFIC (member) && DECL_TEMPLATE_INFO (member)) -- /* Do deferred instantiation of the NSDMI. */ -- init = (tsubst_copy_and_build -- (DECL_INITIAL (DECL_TI_TEMPLATE (member)), -- DECL_TI_ARGS (member), -- tf_warning_or_error, member, /*function_p=*/false, -- /*integral_constant_expression_p=*/false)); -- else -- { -- init = DECL_INITIAL (member); -- if (init && TREE_CODE (init) == DEFAULT_ARG) -- { -- error ("constructor required before non-static data member " -- "for %qD has been parsed", member); -- init = NULL_TREE; -- } -- /* Strip redundant TARGET_EXPR so we don't need to remap it, and -- so the aggregate init code below will see a CONSTRUCTOR. */ -- if (init && TREE_CODE (init) == TARGET_EXPR -- && !VOID_TYPE_P (TREE_TYPE (TARGET_EXPR_INITIAL (init)))) -- init = TARGET_EXPR_INITIAL (init); -- init = break_out_target_exprs (init); -- } -- } -+ init = get_nsdmi (member, /*ctor*/true); - - if (init == error_mark_node) - return; -Index: gcc/cp/class.c -=================================================================== ---- a/src/gcc/cp/class.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/cp/class.c (.../branches/gcc-4_9-branch) -@@ -1300,7 +1300,7 @@ - old_value = NULL_TREE; - } - -- cp_emit_debug_info_for_using (decl, USING_DECL_SCOPE (using_decl)); -+ cp_emit_debug_info_for_using (decl, t); - - if (is_overloaded_fn (decl)) - flist = decl; -Index: gcc/cp/decl.c -=================================================================== ---- a/src/gcc/cp/decl.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/cp/decl.c (.../branches/gcc-4_9-branch) -@@ -5797,6 +5797,13 @@ - if (init && init != error_mark_node) - init_code = build2 (INIT_EXPR, type, decl, init); - -+ if (init_code) -+ { -+ /* We might have set these in cp_finish_decl. */ -+ DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl) = false; -+ TREE_CONSTANT (decl) = false; -+ } -+ - if (init_code && DECL_IN_AGGR_P (decl)) - { - static int explained = 0; -Index: gcc/cp/error.c -=================================================================== ---- a/src/gcc/cp/error.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/cp/error.c (.../branches/gcc-4_9-branch) -@@ -318,6 +318,11 @@ - if (vec_safe_is_empty (typenames) || uses_template_parms (args)) - return; - -+ /* Don't try to print typenames when we're processing a clone. */ -+ if (current_function_decl -+ && !DECL_LANG_SPECIFIC (current_function_decl)) -+ return; -+ - FOR_EACH_VEC_SAFE_ELT (typenames, i, t) - { - if (need_semicolon) -Index: gcc/cp/tree.c -=================================================================== ---- a/src/gcc/cp/tree.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/cp/tree.c (.../branches/gcc-4_9-branch) -@@ -101,6 +101,16 @@ - case IMAGPART_EXPR: - return lvalue_kind (TREE_OPERAND (ref, 0)); - -+ case MEMBER_REF: -+ case DOTSTAR_EXPR: -+ if (TREE_CODE (ref) == MEMBER_REF) -+ op1_lvalue_kind = clk_ordinary; -+ else -+ op1_lvalue_kind = lvalue_kind (TREE_OPERAND (ref, 0)); -+ if (TYPE_PTRMEMFUNC_P (TREE_TYPE (TREE_OPERAND (ref, 1)))) -+ op1_lvalue_kind = clk_none; -+ return op1_lvalue_kind; -+ - case COMPONENT_REF: - op1_lvalue_kind = lvalue_kind (TREE_OPERAND (ref, 0)); - /* Look at the member designator. */ -@@ -453,6 +463,7 @@ - TREE_SIDE_EFFECTS (rval) = 1; - AGGR_INIT_VIA_CTOR_P (rval) = is_ctor; - TREE_NOTHROW (rval) = TREE_NOTHROW (init); -+ CALL_EXPR_LIST_INIT_P (rval) = CALL_EXPR_LIST_INIT_P (init); - } - else - rval = init; -Index: gcc/cp/ChangeLog -=================================================================== ---- a/src/gcc/cp/ChangeLog (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/cp/ChangeLog (.../branches/gcc-4_9-branch) -@@ -1,3 +1,219 @@ -+2014-07-10 Jason Merrill <jason@redhat.com> -+ -+ PR c++/61661 -+ * semantics.c (reduced_constant_expression_p): Handle CONSTRUCTOR. -+ -+2014-07-01 Paul Pluzhnikov <ppluzhnikov@google.com> -+ -+ PR c++/58753 -+ PR c++/58930 -+ PR c++/58704 -+ -+ Backported from mainline -+ 2014-05-20 Paolo Carlini <paolo.carlini@oracle.com> -+ -+ * typeck2.c (digest_nsdmi_init): New. -+ * parser.c (cp_parser_late_parse_one_default_arg): Use it. -+ * init.c (get_nsdmi): Likewise. -+ * cp-tree.h (digest_nsdmi_init): Declare. -+ -+2014-06-30 Edward Smith-Rowland <3dw4rd@verizon.net> -+ -+ PR c++/58781 -+ PR c++/60249 -+ PR c++/59867 -+ * parser.c (cp_parser_userdef_string_literal()): Take a tree -+ not a cp_token*. (cp_parser_string_literal(): Don't hack -+ the token stream! -+ -+2014-06-30 Jason Merrill <jason@redhat.com> -+ -+ PR c++/61647 -+ * pt.c (type_dependent_expression_p): Check BASELINK_OPTYPE. -+ -+ PR c++/61566 -+ * mangle.c (decl_mangling_context): Look through a TEMPLATE_DECL. -+ -+2014-06-30 Jakub Jelinek <jakub@redhat.com> -+ -+ Backported from mainline -+ 2014-06-25 Jakub Jelinek <jakub@redhat.com> -+ -+ * semantics.c (finish_omp_clauses): Make sure -+ OMP_CLAUSE_LINEAR_STEP has correct type. -+ -+ 2014-06-18 Jakub Jelinek <jakub@redhat.com> -+ -+ * cp-gimplify.c (cxx_omp_finish_clause): Add a gimple_seq * -+ argument. -+ * cp-tree.h (cxx_omp_finish_clause): Adjust prototype. -+ -+2014-06-30 Jason Merrill <jason@redhat.com> -+ -+ PR c++/61539 -+ * pt.c (unify_one_argument): Type/expression mismatch just causes -+ deduction failure. -+ -+ DR 1030 -+ PR c++/51253 -+ PR c++/61382 -+ * cp-tree.h (CALL_EXPR_LIST_INIT_P): New. -+ * call.c (struct z_candidate): Add flags field. -+ (add_candidate): Add flags parm. -+ (add_function_candidate, add_conv_candidate, build_builtin_candidate) -+ (add_template_candidate_real): Pass it. -+ (build_over_call): Set CALL_EXPR_LIST_INIT_P. -+ * tree.c (build_aggr_init_expr): Copy it. -+ * semantics.c (simplify_aggr_init_expr): Copy it. -+ * cp-gimplify.c (cp_gimplify_expr): Handle it. -+ -+ PR c++/61488 -+ * pt.c (check_valid_ptrmem_cst_expr): Fix for template context. -+ -+ PR c++/61500 -+ * tree.c (lvalue_kind): Handle MEMBER_REF and DOTSTAR_EXPR. -+ -+2014-06-30 Igor Zamyatin <igor.zamyatin@intel.com> -+ -+ PR middle-end/57541 -+ * cp-array-notation.c (expand_sec_reduce_builtin): -+ Check that bultin argument is correct. -+ * call.c (build_cxx_call): Check for 0 arguments in builtin call. -+ -+2014-06-27 Jason Merrill <jason@redhat.com> -+ -+ PR c++/61433 -+ * error.c (dump_template_bindings): Don't tsubst in a clone. -+ -+2014-06-27 Paolo Carlini <paolo.carlini@oracle.com> -+ -+ PR c++/61614 -+ * semantics.c (finish_compound_literal): Revert r204228. -+ -+2014-06-26 Adam Butcher <adam@jessamine.co.uk> -+ -+ PR c++/61537 -+ * parser.c (cp_parser_elaborated_type_specifier): Only consider template -+ parameter lists outside of function parameter scope. -+ -+2014-06-25 Jason Merrill <jason@redhat.com> -+ -+ PR c++/61242 -+ * call.c (build_aggr_conv): Ignore passed in flags. -+ (build_array_conv, build_complex_conv): Likewise. -+ -+2014-06-24 Jakub Jelinek <jakub@redhat.com> -+ -+ * parser.c (cp_parser_omp_for_loop): For -+ #pragma omp parallel for simd move lastprivate clause from parallel -+ to for rather than simd. -+ -+2014-06-20 Jason Merrill <jason@redhat.com> -+ -+ PR c++/59296 -+ * call.c (add_function_candidate): Avoid special 'this' handling -+ if we have a ref-qualifier. -+ -+ PR c++/61556 -+ * call.c (build_over_call): Call build_this in template path. -+ -+2014-06-19 Jason Merrill <jason@redhat.com> -+ -+ PR c++/59296 -+ * call.c (add_function_candidate): Set LOOKUP_NO_RVAL_BIND -+ |LOOKUP_NO_TEMP_BIND for ref-qualifier handling. -+ -+ PR c++/61507 -+ * pt.c (resolve_overloaded_unification): Preserve -+ ARGUMENT_PACK_EXPLICIT_ARGS. -+ -+2014-06-18 Jason Merrill <jason@redhat.com> -+ -+ PR c++/60605 -+ * pt.c (check_default_tmpl_args): Check DECL_LOCAL_FUNCTION_P. -+ -+2014-06-18 Siva Chandra Reddy <sivachandra@google.com> -+ -+ PR debug/57519 -+ * class.c (handle_using_decl): Pass the correct scope to -+ cp_emit_debug_info_for_using. -+ -+2014-06-09 Jason Merrill <jason@redhat.com> -+ -+ PR c++/61343 -+ * decl.c (check_initializer): Maybe clear -+ DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P. -+ -+2014-06-04 Igor Zamyatin <igor.zamyatin@intel.com> -+ -+ PR c/58942 -+ * c-c++-common/cilk-plus/AN/pr58942.c: Check for correct handling of -+ the case with a pointer. -+ -+2014-06-02 Jason Merrill <jason@redhat.com> -+ -+ PR c++/61134 -+ * pt.c (pack_deducible_p): Handle canonicalization. -+ -+2014-05-21 Igor Zamyatin <igor.zamyatin@intel.com> -+ -+ PR c/60189 -+ * parser.c (cp_parser_postfix_expression): Move handling of cilk_sync -+ from here to... -+ (cp_parser_statement): ...here. Make sure only semicolon can go after -+ Cilk_sync. -+ -+2014-05-13 Jason Merrill <jason@redhat.com> -+ -+ PR c++/61151 -+ * lambda.c (is_this): Allow capture proxies too. -+ -+ DR 5 -+ PR c++/60019 -+ * call.c (build_user_type_conversion_1): The copy-init temporary -+ is cv-unqualified. -+ -+2014-05-07 Paolo Carlini <paolo.carlini@oracle.com> -+ -+ PR c++/61083 -+ * pt.c (convert_nontype_argument): Protect all the error calls -+ with complain & tf_error. -+ -+2014-05-06 Paolo Carlini <paolo.carlini@oracle.com> -+ -+ PR c++/60999 -+ * pt.c (maybe_begin_member_template_processing): Use -+ uses_template_parms. -+ -+2014-05-02 Jason Merrill <jason@redhat.com> -+ -+ PR c++/60992 -+ * lambda.c (lambda_capture_field_type): Wrap anything dependent -+ other than 'this' or a VLA. -+ (is_this): New. -+ * pt.c (tsubst_copy) [VAR_DECL]: Also build a new VAR_DECL if -+ the operand was static or constant. -+ -+2014-04-30 Jason Merrill <jason@redhat.com> -+ -+ PR c++/60980 -+ * init.c (build_value_init): Don't try to call an array constructor. -+ -+ PR c++/60951 -+ * typeck2.c (massage_init_elt): Use maybe_constant_init. -+ -+2014-04-24 Jakub Jelinek <jakub@redhat.com> -+ -+ * parser.c (cp_parser_omp_atomic): Allow seq_cst before -+ atomic-clause, allow comma in between atomic-clause and -+ seq_cst. -+ -+2014-04-22 Jakub Jelinek <jakub@redhat.com> -+ -+ PR c/59073 -+ * parser.c (cp_parser_omp_parallel): If cp_parser_omp_for -+ fails, don't set OM_PARALLEL_COMBINED and return NULL. -+ - 2014-04-22 Release Manager - - * GCC 4.9.0 released. -Index: gcc/cp/cp-array-notation.c -=================================================================== ---- a/src/gcc/cp/cp-array-notation.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/cp/cp-array-notation.c (.../branches/gcc-4_9-branch) -@@ -250,7 +250,10 @@ - if (!find_rank (location, an_builtin_fn, an_builtin_fn, true, &rank)) - return error_mark_node; - if (rank == 0) -- return an_builtin_fn; -+ { -+ error_at (location, "Invalid builtin arguments"); -+ return error_mark_node; -+ } - else if (rank > 1 - && (an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_MAX_IND - || an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_MIN_IND)) -@@ -340,6 +343,8 @@ - array_ind_value = get_temp_regvar (TREE_TYPE (func_parm), func_parm); - - array_op0 = (*array_operand)[0]; -+ if (TREE_CODE (array_op0) == INDIRECT_REF) -+ array_op0 = TREE_OPERAND (array_op0, 0); - switch (an_type) - { - case BUILT_IN_CILKPLUS_SEC_REDUCE_ADD: -Index: gcc/cp/cp-gimplify.c -=================================================================== ---- a/src/gcc/cp/cp-gimplify.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/cp/cp-gimplify.c (.../branches/gcc-4_9-branch) -@@ -723,6 +723,27 @@ - && !seen_error ()) - return (enum gimplify_status) gimplify_cilk_spawn (expr_p); - -+ /* DR 1030 says that we need to evaluate the elements of an -+ initializer-list in forward order even when it's used as arguments to -+ a constructor. So if the target wants to evaluate them in reverse -+ order and there's more than one argument other than 'this', gimplify -+ them in order. */ -+ ret = GS_OK; -+ if (PUSH_ARGS_REVERSED && CALL_EXPR_LIST_INIT_P (*expr_p) -+ && call_expr_nargs (*expr_p) > 2) -+ { -+ int nargs = call_expr_nargs (*expr_p); -+ location_t loc = EXPR_LOC_OR_LOC (*expr_p, input_location); -+ for (int i = 1; i < nargs; ++i) -+ { -+ enum gimplify_status t -+ = gimplify_arg (&CALL_EXPR_ARG (*expr_p, i), pre_p, loc); -+ if (t == GS_ERROR) -+ ret = GS_ERROR; -+ } -+ } -+ break; -+ - default: - ret = (enum gimplify_status) c_gimplify_expr (expr_p, pre_p, post_p); - break; -@@ -1578,7 +1599,7 @@ - /* Finalize an implicitly determined clause. */ - - void --cxx_omp_finish_clause (tree c) -+cxx_omp_finish_clause (tree c, gimple_seq *) - { - tree decl, inner_type; - bool make_shared = false; -Index: gcc/cp/typeck2.c -=================================================================== ---- a/src/gcc/cp/typeck2.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/cp/typeck2.c (.../branches/gcc-4_9-branch) -@@ -1097,6 +1097,22 @@ - { - return digest_init_r (type, init, false, flags, tf_warning_or_error); - } -+ -+/* Process the initializer INIT for an NSDMI DECL (a FIELD_DECL). */ -+tree -+digest_nsdmi_init (tree decl, tree init) -+{ -+ gcc_assert (TREE_CODE (decl) == FIELD_DECL); -+ -+ int flags = LOOKUP_IMPLICIT; -+ if (DIRECT_LIST_INIT_P (init)) -+ flags = LOOKUP_NORMAL; -+ init = digest_init_flags (TREE_TYPE (decl), init, flags); -+ if (TREE_CODE (init) == TARGET_EXPR) -+ /* This represents the whole initialization. */ -+ TARGET_EXPR_DIRECT_INIT_P (init) = true; -+ return init; -+} - - /* Set of flags used within process_init_constructor to describe the - initializers. */ -@@ -1138,7 +1154,7 @@ - /* When we defer constant folding within a statement, we may want to - defer this folding as well. */ - tree t = fold_non_dependent_expr_sfinae (init, complain); -- t = maybe_constant_value (t); -+ t = maybe_constant_init (t); - if (TREE_CONSTANT (t)) - init = t; - return init; -Index: gcc/cp/pt.c -=================================================================== ---- a/src/gcc/cp/pt.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/cp/pt.c (.../branches/gcc-4_9-branch) -@@ -462,9 +462,13 @@ - bool nsdmi = TREE_CODE (decl) == FIELD_DECL; - - if (nsdmi) -- decl = (CLASSTYPE_TEMPLATE_INFO (DECL_CONTEXT (decl)) -- ? CLASSTYPE_TI_TEMPLATE (DECL_CONTEXT (decl)) -- : NULL_TREE); -+ { -+ tree ctx = DECL_CONTEXT (decl); -+ decl = (CLASSTYPE_TEMPLATE_INFO (ctx) -+ /* Disregard full specializations (c++/60999). */ -+ && uses_template_parms (ctx) -+ ? CLASSTYPE_TI_TEMPLATE (ctx) : NULL_TREE); -+ } - - if (inline_needs_template_parms (decl, nsdmi)) - { -@@ -4419,7 +4423,8 @@ - in the template-parameter-list of the definition of a member of a - class template. */ - -- if (TREE_CODE (CP_DECL_CONTEXT (decl)) == FUNCTION_DECL) -+ if (TREE_CODE (CP_DECL_CONTEXT (decl)) == FUNCTION_DECL -+ || (TREE_CODE (decl) == FUNCTION_DECL && DECL_LOCAL_FUNCTION_P (decl))) - /* You can't have a function template declaration in a local - scope, nor you can you define a member of a class template in a - local scope. */ -@@ -5341,6 +5346,10 @@ - return true; - if (cxx_dialect >= cxx11 && null_member_pointer_value_p (expr)) - return true; -+ if (processing_template_decl -+ && TREE_CODE (expr) == ADDR_EXPR -+ && TREE_CODE (TREE_OPERAND (expr, 0)) == OFFSET_REF) -+ return true; - if (complain & tf_error) - { - error ("%qE is not a valid template argument for type %qT", -@@ -5817,17 +5826,18 @@ - { - if (VAR_P (expr)) - { -- error ("%qD is not a valid template argument " -- "because %qD is a variable, not the address of " -- "a variable", -- expr, expr); -+ if (complain & tf_error) -+ error ("%qD is not a valid template argument " -+ "because %qD is a variable, not the address of " -+ "a variable", expr, expr); - return NULL_TREE; - } - if (POINTER_TYPE_P (expr_type)) - { -- error ("%qE is not a valid template argument for %qT " -- "because it is not the address of a variable", -- expr, type); -+ if (complain & tf_error) -+ error ("%qE is not a valid template argument for %qT " -+ "because it is not the address of a variable", -+ expr, type); - return NULL_TREE; - } - /* Other values, like integer constants, might be valid -@@ -5842,23 +5852,24 @@ - ? TREE_OPERAND (expr, 0) : expr); - if (!VAR_P (decl)) - { -- error ("%qE is not a valid template argument of type %qT " -- "because %qE is not a variable", -- expr, type, decl); -+ if (complain & tf_error) -+ error ("%qE is not a valid template argument of type %qT " -+ "because %qE is not a variable", expr, type, decl); - return NULL_TREE; - } - else if (cxx_dialect < cxx11 && !DECL_EXTERNAL_LINKAGE_P (decl)) - { -- error ("%qE is not a valid template argument of type %qT " -- "because %qD does not have external linkage", -- expr, type, decl); -+ if (complain & tf_error) -+ error ("%qE is not a valid template argument of type %qT " -+ "because %qD does not have external linkage", -+ expr, type, decl); - return NULL_TREE; - } - else if (cxx_dialect >= cxx11 && decl_linkage (decl) == lk_none) - { -- error ("%qE is not a valid template argument of type %qT " -- "because %qD has no linkage", -- expr, type, decl); -+ if (complain & tf_error) -+ error ("%qE is not a valid template argument of type %qT " -+ "because %qD has no linkage", expr, type, decl); - return NULL_TREE; - } - } -@@ -5886,15 +5897,17 @@ - - if (!at_least_as_qualified_p (TREE_TYPE (type), expr_type)) - { -- error ("%qE is not a valid template argument for type %qT " -- "because of conflicts in cv-qualification", expr, type); -+ if (complain & tf_error) -+ error ("%qE is not a valid template argument for type %qT " -+ "because of conflicts in cv-qualification", expr, type); - return NULL_TREE; - } - - if (!real_lvalue_p (expr)) - { -- error ("%qE is not a valid template argument for type %qT " -- "because it is not an lvalue", expr, type); -+ if (complain & tf_error) -+ error ("%qE is not a valid template argument for type %qT " -+ "because it is not an lvalue", expr, type); - return NULL_TREE; - } - -@@ -5910,9 +5923,10 @@ - expr = TREE_OPERAND (expr, 0); - if (DECL_P (expr)) - { -- error ("%q#D is not a valid template argument for type %qT " -- "because a reference variable does not have a constant " -- "address", expr, type); -+ if (complain & tf_error) -+ error ("%q#D is not a valid template argument for type %qT " -+ "because a reference variable does not have a constant " -+ "address", expr, type); - return NULL_TREE; - } - } -@@ -5919,17 +5933,19 @@ - - if (!DECL_P (expr)) - { -- error ("%qE is not a valid template argument for type %qT " -- "because it is not an object with external linkage", -- expr, type); -+ if (complain & tf_error) -+ error ("%qE is not a valid template argument for type %qT " -+ "because it is not an object with external linkage", -+ expr, type); - return NULL_TREE; - } - - if (!DECL_EXTERNAL_LINKAGE_P (expr)) - { -- error ("%qE is not a valid template argument for type %qT " -- "because object %qD has not external linkage", -- expr, type, expr); -+ if (complain & tf_error) -+ error ("%qE is not a valid template argument for type %qT " -+ "because object %qD has not external linkage", -+ expr, type, expr); - return NULL_TREE; - } - -@@ -5971,9 +5987,13 @@ - { - if (TREE_CODE (expr) == ADDR_EXPR) - { -- error ("%qE is not a valid template argument for type %qT " -- "because it is a pointer", expr, type); -- inform (input_location, "try using %qE instead", TREE_OPERAND (expr, 0)); -+ if (complain & tf_error) -+ { -+ error ("%qE is not a valid template argument for type %qT " -+ "because it is a pointer", expr, type); -+ inform (input_location, "try using %qE instead", -+ TREE_OPERAND (expr, 0)); -+ } - return NULL_TREE; - } - -@@ -6011,13 +6031,16 @@ - provide a superior diagnostic. */ - if (!same_type_p (TREE_TYPE (expr), type)) - { -- error ("%qE is not a valid template argument for type %qT " -- "because it is of type %qT", expr, type, -- TREE_TYPE (expr)); -- /* If we are just one standard conversion off, explain. */ -- if (can_convert_standard (type, TREE_TYPE (expr), complain)) -- inform (input_location, -- "standard conversions are not allowed in this context"); -+ if (complain & tf_error) -+ { -+ error ("%qE is not a valid template argument for type %qT " -+ "because it is of type %qT", expr, type, -+ TREE_TYPE (expr)); -+ /* If we are just one standard conversion off, explain. */ -+ if (can_convert_standard (type, TREE_TYPE (expr), complain)) -+ inform (input_location, -+ "standard conversions are not allowed in this context"); -+ } - return NULL_TREE; - } - } -@@ -6040,8 +6063,9 @@ - { - if (expr != nullptr_node) - { -- error ("%qE is not a valid template argument for type %qT " -- "because it is of type %qT", expr, type, TREE_TYPE (expr)); -+ if (complain & tf_error) -+ error ("%qE is not a valid template argument for type %qT " -+ "because it is of type %qT", expr, type, TREE_TYPE (expr)); - return NULL_TREE; - } - return expr; -@@ -12638,13 +12662,17 @@ - } - else - { -- /* This can happen for a variable used in a late-specified -- return type of a local lambda. Just make a dummy decl -- since it's only used for its type. */ -- if (cp_unevaluated_operand) -- return tsubst_decl (t, args, complain); -- gcc_assert (errorcount || sorrycount); -- return error_mark_node; -+ /* This can happen for a variable used in a -+ late-specified return type of a local lambda, or for a -+ local static or constant. Building a new VAR_DECL -+ should be OK in all those cases. */ -+ r = tsubst_decl (t, args, complain); -+ if (decl_constant_var_p (r)) -+ /* A use of a local constant must decay to its value. */ -+ return integral_constant_value (r); -+ gcc_assert (cp_unevaluated_operand || TREE_STATIC (r) -+ || errorcount || sorrycount); -+ return r; - } - } - } -@@ -15613,7 +15641,7 @@ - continue; - for (packs = PACK_EXPANSION_PARAMETER_PACKS (type); - packs; packs = TREE_CHAIN (packs)) -- if (TREE_VALUE (packs) == parm) -+ if (template_args_equal (TREE_VALUE (packs), parm)) - { - /* The template parameter pack is used in a function parameter - pack. If this is the end of the parameter list, the -@@ -16337,8 +16365,9 @@ - maybe_adjust_types_for_deduction (strict, &parm, &arg, arg_expr); - } - else -- gcc_assert ((TYPE_P (parm) || TREE_CODE (parm) == TEMPLATE_DECL) -- == (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL)); -+ if ((TYPE_P (parm) || TREE_CODE (parm) == TEMPLATE_DECL) -+ != (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL)) -+ return unify_template_argument_mismatch (explain_p, parm, arg); - - /* For deduction from an init-list we need the actual list. */ - if (arg_expr && BRACE_ENCLOSED_INITIALIZER_P (arg_expr)) -@@ -16674,7 +16703,16 @@ - int i = TREE_VEC_LENGTH (targs); - for (; i--; ) - if (TREE_VEC_ELT (tempargs, i)) -- TREE_VEC_ELT (targs, i) = TREE_VEC_ELT (tempargs, i); -+ { -+ tree old = TREE_VEC_ELT (targs, i); -+ tree new_ = TREE_VEC_ELT (tempargs, i); -+ if (new_ && old && ARGUMENT_PACK_P (old) -+ && ARGUMENT_PACK_EXPLICIT_ARGS (old)) -+ /* Don't forget explicit template arguments in a pack. */ -+ ARGUMENT_PACK_EXPLICIT_ARGS (new_) -+ = ARGUMENT_PACK_EXPLICIT_ARGS (old); -+ TREE_VEC_ELT (targs, i) = new_; -+ } - } - if (good) - return true; -@@ -20913,7 +20951,12 @@ - return true; - - if (BASELINK_P (expression)) -- expression = BASELINK_FUNCTIONS (expression); -+ { -+ if (BASELINK_OPTYPE (expression) -+ && dependent_type_p (BASELINK_OPTYPE (expression))) -+ return true; -+ expression = BASELINK_FUNCTIONS (expression); -+ } - - if (TREE_CODE (expression) == TEMPLATE_ID_EXPR) - { -Index: gcc/cp/semantics.c -=================================================================== ---- a/src/gcc/cp/semantics.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/cp/semantics.c (.../branches/gcc-4_9-branch) -@@ -2600,7 +2600,6 @@ - if ((!at_function_scope_p () || CP_TYPE_CONST_P (type)) - && TREE_CODE (type) == ARRAY_TYPE - && !TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type) -- && !cp_unevaluated_operand - && initializer_constant_valid_p (compound_literal, type)) - { - tree decl = create_temporary_var (type); -@@ -3867,6 +3866,7 @@ - aggr_init_expr_nargs (aggr_init_expr), - AGGR_INIT_EXPR_ARGP (aggr_init_expr)); - TREE_NOTHROW (call_expr) = TREE_NOTHROW (aggr_init_expr); -+ CALL_EXPR_LIST_INIT_P (call_expr) = CALL_EXPR_LIST_INIT_P (aggr_init_expr); - - if (style == ctor) - { -@@ -5283,6 +5283,8 @@ - break; - } - } -+ else -+ t = fold_convert (TREE_TYPE (OMP_CLAUSE_DECL (c)), t); - } - OMP_CLAUSE_LINEAR_STEP (c) = t; - } -@@ -8511,11 +8513,24 @@ - bool - reduced_constant_expression_p (tree t) - { -- if (TREE_CODE (t) == PTRMEM_CST) -- /* Even if we can't lower this yet, it's constant. */ -- return true; -- /* FIXME are we calling this too much? */ -- return initializer_constant_valid_p (t, TREE_TYPE (t)) != NULL_TREE; -+ switch (TREE_CODE (t)) -+ { -+ case PTRMEM_CST: -+ /* Even if we can't lower this yet, it's constant. */ -+ return true; -+ -+ case CONSTRUCTOR: -+ /* And we need to handle PTRMEM_CST wrapped in a CONSTRUCTOR. */ -+ tree elt; unsigned HOST_WIDE_INT idx; -+ FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (t), idx, elt) -+ if (!reduced_constant_expression_p (elt)) -+ return false; -+ return true; -+ -+ default: -+ /* FIXME are we calling this too much? */ -+ return initializer_constant_valid_p (t, TREE_TYPE (t)) != NULL_TREE; -+ } - } - - /* Some expressions may have constant operands but are not constant -Index: gcc/cp/parser.c -=================================================================== ---- a/src/gcc/cp/parser.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/cp/parser.c (.../branches/gcc-4_9-branch) -@@ -1891,7 +1891,7 @@ - static tree cp_parser_userdef_char_literal - (cp_parser *); - static tree cp_parser_userdef_string_literal -- (cp_token *); -+ (tree); - static tree cp_parser_userdef_numeric_literal - (cp_parser *); - -@@ -3696,8 +3696,7 @@ - { - tree literal = build_userdef_literal (suffix_id, value, - OT_NONE, NULL_TREE); -- tok->u.value = literal; -- return cp_parser_userdef_string_literal (tok); -+ value = cp_parser_userdef_string_literal (literal); - } - } - else -@@ -3945,9 +3944,8 @@ - as arguments. */ - - static tree --cp_parser_userdef_string_literal (cp_token *token) -+cp_parser_userdef_string_literal (tree literal) - { -- tree literal = token->u.value; - tree suffix_id = USERDEF_LITERAL_SUFFIX_ID (literal); - tree name = cp_literal_operator_id (IDENTIFIER_POINTER (suffix_id)); - tree value = USERDEF_LITERAL_VALUE (literal); -@@ -5835,20 +5833,6 @@ - } - break; - } -- -- case RID_CILK_SYNC: -- if (flag_cilkplus) -- { -- tree sync_expr = build_cilk_sync (); -- SET_EXPR_LOCATION (sync_expr, -- cp_lexer_peek_token (parser->lexer)->location); -- finish_expr_stmt (sync_expr); -- } -- else -- error_at (token->location, "-fcilkplus must be enabled to use" -- " %<_Cilk_sync%>"); -- cp_lexer_consume_token (parser->lexer); -- break; - - case RID_BUILTIN_SHUFFLE: - { -@@ -9400,6 +9384,24 @@ - statement = cp_parser_jump_statement (parser); - break; - -+ case RID_CILK_SYNC: -+ cp_lexer_consume_token (parser->lexer); -+ if (flag_cilkplus) -+ { -+ tree sync_expr = build_cilk_sync (); -+ SET_EXPR_LOCATION (sync_expr, -+ token->location); -+ statement = finish_expr_stmt (sync_expr); -+ } -+ else -+ { -+ error_at (token->location, "-fcilkplus must be enabled to use" -+ " %<_Cilk_sync%>"); -+ statement = error_mark_node; -+ } -+ cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON); -+ break; -+ - /* Objective-C++ exception-handling constructs. */ - case RID_AT_TRY: - case RID_AT_CATCH: -@@ -15045,6 +15047,18 @@ - return cp_parser_make_typename_type (parser, parser->scope, - identifier, - token->location); -+ -+ /* Template parameter lists apply only if we are not within a -+ function parameter list. */ -+ bool template_parm_lists_apply -+ = parser->num_template_parameter_lists; -+ if (template_parm_lists_apply) -+ for (cp_binding_level *s = current_binding_level; -+ s && s->kind != sk_template_parms; -+ s = s->level_chain) -+ if (s->kind == sk_function_parms) -+ template_parm_lists_apply = false; -+ - /* Look up a qualified name in the usual way. */ - if (parser->scope) - { -@@ -15087,7 +15101,7 @@ - - decl = (cp_parser_maybe_treat_template_as_class - (decl, /*tag_name_p=*/is_friend -- && parser->num_template_parameter_lists)); -+ && template_parm_lists_apply)); - - if (TREE_CODE (decl) != TYPE_DECL) - { -@@ -15100,9 +15114,9 @@ - - if (TREE_CODE (TREE_TYPE (decl)) != TYPENAME_TYPE) - { -- bool allow_template = (parser->num_template_parameter_lists -- || DECL_SELF_REFERENCE_P (decl)); -- type = check_elaborated_type_specifier (tag_type, decl, -+ bool allow_template = (template_parm_lists_apply -+ || DECL_SELF_REFERENCE_P (decl)); -+ type = check_elaborated_type_specifier (tag_type, decl, - allow_template); - - if (type == error_mark_node) -@@ -15188,15 +15202,16 @@ - ts = ts_global; - - template_p = -- (parser->num_template_parameter_lists -+ (template_parm_lists_apply - && (cp_parser_next_token_starts_class_definition_p (parser) - || cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))); - /* An unqualified name was used to reference this type, so - there were no qualifying templates. */ -- if (!cp_parser_check_template_parameters (parser, -- /*num_templates=*/0, -- token->location, -- /*declarator=*/NULL)) -+ if (template_parm_lists_apply -+ && !cp_parser_check_template_parameters (parser, -+ /*num_templates=*/0, -+ token->location, -+ /*declarator=*/NULL)) - return error_mark_node; - type = xref_tag (tag_type, identifier, ts, template_p); - } -@@ -17837,7 +17852,7 @@ - /* Used by handling of trailing-return-types and NSDMI, in which 'this' - is in scope even though it isn't real. */ - --static void -+void - inject_this_parameter (tree ctype, cp_cv_quals quals) - { - tree this_parm; -@@ -23090,10 +23105,17 @@ - ok = false; - } - if (!ok) -- error ("literal operator template %qD has invalid parameter list." -- " Expected non-type template argument pack <char...>" -- " or <typename CharT, CharT...>", -- decl); -+ { -+ if (cxx_dialect >= cxx1y) -+ error ("literal operator template %qD has invalid parameter list." -+ " Expected non-type template argument pack <char...>" -+ " or <typename CharT, CharT...>", -+ decl); -+ else -+ error ("literal operator template %qD has invalid parameter list." -+ " Expected non-type template argument pack <char...>", -+ decl); -+ } - } - /* Register member declarations. */ - if (member_p && !friend_p && decl && !DECL_CLASS_TEMPLATE_P (decl)) -@@ -23664,16 +23686,7 @@ - parsed_arg = check_default_argument (parmtype, parsed_arg, - tf_warning_or_error); - else -- { -- int flags = LOOKUP_IMPLICIT; -- if (BRACE_ENCLOSED_INITIALIZER_P (parsed_arg) -- && CONSTRUCTOR_IS_DIRECT_INIT (parsed_arg)) -- flags = LOOKUP_NORMAL; -- parsed_arg = digest_init_flags (TREE_TYPE (decl), parsed_arg, flags); -- if (TREE_CODE (parsed_arg) == TARGET_EXPR) -- /* This represents the whole initialization. */ -- TARGET_EXPR_DIRECT_INIT_P (parsed_arg) = true; -- } -+ parsed_arg = digest_nsdmi_init (decl, parsed_arg); - } - - /* If the token stream has not been completely used up, then -@@ -28530,6 +28543,20 @@ - tree id = cp_lexer_peek_token (parser->lexer)->u.value; - const char *p = IDENTIFIER_POINTER (id); - -+ if (!strcmp (p, "seq_cst")) -+ { -+ seq_cst = true; -+ cp_lexer_consume_token (parser->lexer); -+ if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA) -+ && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_NAME) -+ cp_lexer_consume_token (parser->lexer); -+ } -+ } -+ if (cp_lexer_next_token_is (parser->lexer, CPP_NAME)) -+ { -+ tree id = cp_lexer_peek_token (parser->lexer)->u.value; -+ const char *p = IDENTIFIER_POINTER (id); -+ - if (!strcmp (p, "read")) - code = OMP_ATOMIC_READ; - else if (!strcmp (p, "write")) -@@ -28543,16 +28570,22 @@ - if (p) - cp_lexer_consume_token (parser->lexer); - } -- -- if (cp_lexer_next_token_is (parser->lexer, CPP_NAME)) -+ if (!seq_cst) - { -- tree id = cp_lexer_peek_token (parser->lexer)->u.value; -- const char *p = IDENTIFIER_POINTER (id); -+ if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA) -+ && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_NAME) -+ cp_lexer_consume_token (parser->lexer); - -- if (!strcmp (p, "seq_cst")) -+ if (cp_lexer_next_token_is (parser->lexer, CPP_NAME)) - { -- seq_cst = true; -- cp_lexer_consume_token (parser->lexer); -+ tree id = cp_lexer_peek_token (parser->lexer)->u.value; -+ const char *p = IDENTIFIER_POINTER (id); -+ -+ if (!strcmp (p, "seq_cst")) -+ { -+ seq_cst = true; -+ cp_lexer_consume_token (parser->lexer); -+ } - } - } - cp_parser_require_pragma_eol (parser, pragma_tok); -@@ -29341,9 +29374,17 @@ - change it to shared (decl) in OMP_PARALLEL_CLAUSES. */ - tree l = build_omp_clause (loc, OMP_CLAUSE_LASTPRIVATE); - OMP_CLAUSE_DECL (l) = real_decl; -- OMP_CLAUSE_CHAIN (l) = clauses; - CP_OMP_CLAUSE_INFO (l) = CP_OMP_CLAUSE_INFO (*c); -- clauses = l; -+ if (code == OMP_SIMD) -+ { -+ OMP_CLAUSE_CHAIN (l) = cclauses[C_OMP_CLAUSE_SPLIT_FOR]; -+ cclauses[C_OMP_CLAUSE_SPLIT_FOR] = l; -+ } -+ else -+ { -+ OMP_CLAUSE_CHAIN (l) = clauses; -+ clauses = l; -+ } - OMP_CLAUSE_SET_CODE (*c, OMP_CLAUSE_SHARED); - CP_OMP_CLAUSE_INFO (*c) = NULL; - add_private_clause = false; -@@ -29825,10 +29866,12 @@ - return cp_parser_omp_for (parser, pragma_tok, p_name, mask, cclauses); - block = begin_omp_parallel (); - save = cp_parser_begin_omp_structured_block (parser); -- cp_parser_omp_for (parser, pragma_tok, p_name, mask, cclauses); -+ tree ret = cp_parser_omp_for (parser, pragma_tok, p_name, mask, cclauses); - cp_parser_end_omp_structured_block (parser, save); - stmt = finish_omp_parallel (cclauses[C_OMP_CLAUSE_SPLIT_PARALLEL], - block); -+ if (ret == NULL_TREE) -+ return ret; - OMP_PARALLEL_COMBINED (stmt) = 1; - return stmt; - } -Index: gcc/cp/call.c -=================================================================== ---- a/src/gcc/cp/call.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/cp/call.c (.../branches/gcc-4_9-branch) -@@ -206,7 +206,7 @@ - static void maybe_handle_implicit_object (conversion **); - static struct z_candidate *add_candidate - (struct z_candidate **, tree, tree, const vec<tree, va_gc> *, size_t, -- conversion **, tree, tree, int, struct rejection_reason *); -+ conversion **, tree, tree, int, struct rejection_reason *, int); - static tree source_type (conversion *); - static void add_warning (struct z_candidate *, struct z_candidate *); - static bool reference_compatible_p (tree, tree); -@@ -520,7 +520,6 @@ - sequence from the type returned by FN to the desired destination - type. */ - conversion *second_conv; -- int viable; - struct rejection_reason *reason; - /* If FN is a member function, the binfo indicating the path used to - qualify the name of FN at the call site. This path is used to -@@ -538,6 +537,10 @@ - tree explicit_targs; - candidate_warning *warnings; - z_candidate *next; -+ int viable; -+ -+ /* The flags active in add_candidate. */ -+ int flags; - }; - - /* Returns true iff T is a null pointer constant in the sense of -@@ -886,7 +889,9 @@ - if (ctor == error_mark_node) - return NULL; - -- flags |= LOOKUP_NO_NARROWING; -+ /* The conversions within the init-list aren't affected by the enclosing -+ context; they're always simple copy-initialization. */ -+ flags = LOOKUP_IMPLICIT|LOOKUP_NO_NARROWING; - - for (; field; field = next_initializable_field (DECL_CHAIN (field))) - { -@@ -959,6 +964,8 @@ - return NULL; - } - -+ flags = LOOKUP_IMPLICIT|LOOKUP_NO_NARROWING; -+ - FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (ctor), i, val) - { - conversion *sub -@@ -1003,6 +1010,8 @@ - if (len != 2) - return NULL; - -+ flags = LOOKUP_IMPLICIT|LOOKUP_NO_NARROWING; -+ - FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (ctor), i, val) - { - conversion *sub -@@ -1810,7 +1819,8 @@ - tree fn, tree first_arg, const vec<tree, va_gc> *args, - size_t num_convs, conversion **convs, - tree access_path, tree conversion_path, -- int viable, struct rejection_reason *reason) -+ int viable, struct rejection_reason *reason, -+ int flags) - { - struct z_candidate *cand = (struct z_candidate *) - conversion_obstack_alloc (sizeof (struct z_candidate)); -@@ -1825,6 +1835,7 @@ - cand->viable = viable; - cand->reason = reason; - cand->next = *candidates; -+ cand->flags = flags; - *candidates = cand; - - return cand; -@@ -1994,6 +2005,9 @@ - object parameter has reference type. */ - bool rv = FUNCTION_RVALUE_QUALIFIED (TREE_TYPE (fn)); - parmtype = cp_build_reference_type (parmtype, rv); -+ /* The special handling of 'this' conversions in compare_ics -+ does not apply if there is a ref-qualifier. */ -+ is_this = false; - } - else - { -@@ -2061,7 +2075,7 @@ - - out: - return add_candidate (candidates, fn, orig_first_arg, args, len, convs, -- access_path, conversion_path, viable, reason); -+ access_path, conversion_path, viable, reason, flags); - } - - /* Create an overload candidate for the conversion function FN which will -@@ -2163,7 +2177,7 @@ - } - - return add_candidate (candidates, totype, first_arg, arglist, len, convs, -- access_path, conversion_path, viable, reason); -+ access_path, conversion_path, viable, reason, flags); - } - - static void -@@ -2238,7 +2252,7 @@ - num_convs, convs, - /*access_path=*/NULL_TREE, - /*conversion_path=*/NULL_TREE, -- viable, reason); -+ viable, reason, flags); - } - - static bool -@@ -3056,7 +3070,7 @@ - return cand; - fail: - return add_candidate (candidates, tmpl, first_arg, arglist, nargs, NULL, -- access_path, conversion_path, 0, reason); -+ access_path, conversion_path, 0, reason, flags); - } - - -@@ -3677,11 +3691,20 @@ - return cand; - } - -+ tree convtype; -+ if (!DECL_CONSTRUCTOR_P (cand->fn)) -+ convtype = non_reference (TREE_TYPE (TREE_TYPE (cand->fn))); -+ else if (cand->second_conv->kind == ck_rvalue) -+ /* DR 5: [in the first step of copy-initialization]...if the function -+ is a constructor, the call initializes a temporary of the -+ cv-unqualified version of the destination type. */ -+ convtype = cv_unqualified (totype); -+ else -+ convtype = totype; - /* Build the user conversion sequence. */ - conv = build_conv - (ck_user, -- (DECL_CONSTRUCTOR_P (cand->fn) -- ? totype : non_reference (TREE_TYPE (TREE_TYPE (cand->fn)))), -+ convtype, - build_identity_conv (TREE_TYPE (expr), expr)); - conv->cand = cand; - if (cand->viable == -1) -@@ -6751,7 +6774,7 @@ - - ++nargs; - alcarray = XALLOCAVEC (tree, nargs); -- alcarray[0] = first_arg; -+ alcarray[0] = build_this (first_arg); - FOR_EACH_VEC_SAFE_ELT (args, ix, arg) - alcarray[ix + 1] = arg; - argarray = alcarray; -@@ -7219,7 +7242,11 @@ - return error_mark_node; - } - -- return build_cxx_call (fn, nargs, argarray, complain|decltype_flag); -+ tree call = build_cxx_call (fn, nargs, argarray, complain|decltype_flag); -+ if (TREE_CODE (call) == CALL_EXPR -+ && (cand->flags & LOOKUP_LIST_INIT_CTOR)) -+ CALL_EXPR_LIST_INIT_P (call) = true; -+ return call; - } - - /* Build and return a call to FN, using NARGS arguments in ARGARRAY. -@@ -7261,6 +7288,11 @@ - || bif == BUILT_IN_CILKPLUS_SEC_REDUCE - || bif == BUILT_IN_CILKPLUS_SEC_REDUCE_MUTATING) - { -+ if (call_expr_nargs (fn) == 0) -+ { -+ error_at (EXPR_LOCATION (fn), "Invalid builtin arguments"); -+ return error_mark_node; -+ } - /* for bif == BUILT_IN_CILKPLUS_SEC_REDUCE_ALL_ZERO or - BUILT_IN_CILKPLUS_SEC_REDUCE_ANY_ZERO or - BUILT_IN_CILKPLUS_SEC_REDUCE_ANY_NONZERO or -@@ -8446,10 +8478,11 @@ - /* [over.ics.rank] - - --S1 and S2 are reference bindings (_dcl.init.ref_) and neither refers -- to an implicit object parameter, and either S1 binds an lvalue reference -- to an lvalue and S2 binds an rvalue reference or S1 binds an rvalue -- reference to an rvalue and S2 binds an lvalue reference -- (C++0x draft standard, 13.3.3.2) -+ to an implicit object parameter of a non-static member function -+ declared without a ref-qualifier, and either S1 binds an lvalue -+ reference to an lvalue and S2 binds an rvalue reference or S1 binds an -+ rvalue reference to an rvalue and S2 binds an lvalue reference (C++0x -+ draft standard, 13.3.3.2) - - --S1 and S2 are reference bindings (_dcl.init.ref_), and the - types to which the references refer are the same type except for -Index: gcc/cp/lambda.c -=================================================================== ---- a/src/gcc/cp/lambda.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/cp/lambda.c (.../branches/gcc-4_9-branch) -@@ -201,6 +201,14 @@ - return lambda; - } - -+static inline bool -+is_this (tree t) -+{ -+ return ((TREE_CODE (t) == PARM_DECL -+ || TREE_CODE (t) == VAR_DECL) -+ && DECL_NAME (t) == this_identifier); -+} -+ - /* Returns the type to use for the FIELD_DECL corresponding to the - capture of EXPR. - The caller should add REFERENCE_TYPE for capture by reference. */ -@@ -216,8 +224,9 @@ - } - else - type = non_reference (unlowered_expr_type (expr)); -- if (!type || WILDCARD_TYPE_P (type) || type_uses_auto (type) -- || DECL_PACK_P (expr)) -+ if (type_dependent_expression_p (expr) -+ && !is_this (tree_strip_nop_conversions (expr)) -+ && !array_of_runtime_bound_p (type)) - { - type = cxx_make_type (DECLTYPE_TYPE); - DECLTYPE_TYPE_EXPR (type) = expr; -Index: gcc/cp/mangle.c -=================================================================== ---- a/src/gcc/cp/mangle.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/cp/mangle.c (.../branches/gcc-4_9-branch) -@@ -752,6 +752,10 @@ - if (tcontext != NULL_TREE) - return tcontext; - -+ if (TREE_CODE (decl) == TEMPLATE_DECL -+ && DECL_TEMPLATE_RESULT (decl)) -+ decl = DECL_TEMPLATE_RESULT (decl); -+ - if (TREE_CODE (decl) == TYPE_DECL - && LAMBDA_TYPE_P (TREE_TYPE (decl))) - { -Index: gcc/cp/cp-tree.h -=================================================================== ---- a/src/gcc/cp/cp-tree.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/cp/cp-tree.h (.../branches/gcc-4_9-branch) -@@ -101,6 +101,7 @@ - FNDECL_USED_AUTO (in FUNCTION_DECL) - DECLTYPE_FOR_LAMBDA_PROXY (in DECLTYPE_TYPE) - REF_PARENTHESIZED_P (in COMPONENT_REF, SCOPE_REF) -+ AGGR_INIT_ZERO_FIRST (in AGGR_INIT_EXPR) - 3: (TREE_REFERENCE_EXPR) (in NON_LVALUE_EXPR) (commented-out). - ICS_BAD_FLAG (in _CONV) - FN_TRY_BLOCK_P (in TRY_BLOCK) -@@ -107,6 +108,7 @@ - IDENTIFIER_CTOR_OR_DTOR_P (in IDENTIFIER_NODE) - BIND_EXPR_BODY_BLOCK (in BIND_EXPR) - DECL_NON_TRIVIALLY_INITIALIZED_P (in VAR_DECL) -+ CALL_EXPR_LIST_INIT_P (in CALL_EXPR, AGGR_INIT_EXPR) - 4: TREE_HAS_CONSTRUCTOR (in INDIRECT_REF, SAVE_EXPR, CONSTRUCTOR, - or FIELD_DECL). - IDENTIFIER_TYPENAME_P (in IDENTIFIER_NODE) -@@ -3026,6 +3028,10 @@ - should be performed at instantiation time. */ - #define KOENIG_LOOKUP_P(NODE) TREE_LANG_FLAG_0 (CALL_EXPR_CHECK (NODE)) - -+/* True if CALL_EXPR expresses list-initialization of an object. */ -+#define CALL_EXPR_LIST_INIT_P(NODE) \ -+ TREE_LANG_FLAG_3 (TREE_CHECK2 ((NODE),CALL_EXPR,AGGR_INIT_EXPR)) -+ - /* Indicates whether a string literal has been parenthesized. Such - usages are disallowed in certain circumstances. */ - -@@ -3430,6 +3436,9 @@ - B b{1,2}, not B b({1,2}) or B b = {1,2}. */ - #define CONSTRUCTOR_IS_DIRECT_INIT(NODE) (TREE_LANG_FLAG_0 (CONSTRUCTOR_CHECK (NODE))) - -+#define DIRECT_LIST_INIT_P(NODE) \ -+ (BRACE_ENCLOSED_INITIALIZER_P (NODE) && CONSTRUCTOR_IS_DIRECT_INIT (NODE)) -+ - /* True if NODE represents a conversion for direct-initialization in a - template. Set by perform_implicit_conversion_flags. */ - #define IMPLICIT_CONV_EXPR_DIRECT_INIT(NODE) \ -@@ -4347,6 +4356,11 @@ - PARM_DECLs in cp_tree_equal. */ - extern int comparing_specializations; - -+/* A type-qualifier, or bitmask therefore, using the TYPE_QUAL -+ constants. */ -+ -+typedef int cp_cv_quals; -+ - /* In parser.c. */ - - /* Nonzero if we are parsing an unevaluated operand: an operand to -@@ -4356,6 +4370,7 @@ - extern int cp_unevaluated_operand; - extern tree cp_convert_range_for (tree, tree, tree, bool); - extern bool parsing_nsdmi (void); -+extern void inject_this_parameter (tree, cp_cv_quals); - - /* in pt.c */ - -@@ -4735,11 +4750,6 @@ - extern GTY(()) operator_name_info_t assignment_operator_name_info - [(int) MAX_TREE_CODES]; - --/* A type-qualifier, or bitmask therefore, using the TYPE_QUAL -- constants. */ -- --typedef int cp_cv_quals; -- - /* Non-static member functions have an optional virt-specifier-seq. - There is a VIRT_SPEC value for each virt-specifier. - They can be combined by bitwise-or to form the complete set of -@@ -5415,6 +5425,7 @@ - extern tree build_zero_init (tree, tree, bool); - extern tree build_value_init (tree, tsubst_flags_t); - extern tree build_value_init_noctor (tree, tsubst_flags_t); -+extern tree get_nsdmi (tree, bool); - extern tree build_offset_ref (tree, tree, bool, - tsubst_flags_t); - extern tree throw_bad_array_new_length (void); -@@ -6151,6 +6162,7 @@ - extern void check_narrowing (tree, tree); - extern tree digest_init (tree, tree, tsubst_flags_t); - extern tree digest_init_flags (tree, tree, int); -+extern tree digest_nsdmi_init (tree, tree); - extern tree build_scoped_ref (tree, tree, tree *); - extern tree build_x_arrow (location_t, tree, - tsubst_flags_t); -@@ -6201,7 +6213,7 @@ - extern tree cxx_omp_clause_copy_ctor (tree, tree, tree); - extern tree cxx_omp_clause_assign_op (tree, tree, tree); - extern tree cxx_omp_clause_dtor (tree, tree); --extern void cxx_omp_finish_clause (tree); -+extern void cxx_omp_finish_clause (tree, gimple_seq *); - extern bool cxx_omp_privatize_by_reference (const_tree); - - /* in name-lookup.c */ -Index: gcc/double-int.c -=================================================================== ---- a/src/gcc/double-int.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/double-int.c (.../branches/gcc-4_9-branch) -@@ -588,7 +588,7 @@ - == (unsigned HOST_WIDE_INT) htwice) - && (labs_den <= ltwice))) - { -- if (*hquo < 0) -+ if (quo_neg) - /* quo = quo - 1; */ - add_double (*lquo, *hquo, - (HOST_WIDE_INT) -1, (HOST_WIDE_INT) -1, lquo, hquo); -Index: gcc/cgraphclones.c -=================================================================== ---- a/src/gcc/cgraphclones.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/cgraphclones.c (.../branches/gcc-4_9-branch) -@@ -302,14 +302,13 @@ - thunk is this_adjusting but we are removing this parameter. */ - - static cgraph_node * --duplicate_thunk_for_node (cgraph_node *thunk, cgraph_node *node, -- bitmap args_to_skip) -+duplicate_thunk_for_node (cgraph_node *thunk, cgraph_node *node) - { - cgraph_node *new_thunk, *thunk_of; - thunk_of = cgraph_function_or_thunk_node (thunk->callees->callee); - - if (thunk_of->thunk.thunk_p) -- node = duplicate_thunk_for_node (thunk_of, node, args_to_skip); -+ node = duplicate_thunk_for_node (thunk_of, node); - - struct cgraph_edge *cs; - for (cs = node->callers; cs; cs = cs->next_caller) -@@ -321,7 +320,7 @@ - return cs->caller; - - tree new_decl; -- if (!args_to_skip) -+ if (!node->clone.args_to_skip) - new_decl = copy_node (thunk->decl); - else - { -@@ -328,10 +327,11 @@ - /* We do not need to duplicate this_adjusting thunks if we have removed - this. */ - if (thunk->thunk.this_adjusting -- && bitmap_bit_p (args_to_skip, 0)) -+ && bitmap_bit_p (node->clone.args_to_skip, 0)) - return node; - -- new_decl = build_function_decl_skip_args (thunk->decl, args_to_skip, -+ new_decl = build_function_decl_skip_args (thunk->decl, -+ node->clone.args_to_skip, - false); - } - gcc_checking_assert (!DECL_STRUCT_FUNCTION (new_decl)); -@@ -349,6 +349,8 @@ - new_thunk->thunk = thunk->thunk; - new_thunk->unique_name = in_lto_p; - new_thunk->former_clone_of = thunk->decl; -+ new_thunk->clone.args_to_skip = node->clone.args_to_skip; -+ new_thunk->clone.combined_args_to_skip = node->clone.combined_args_to_skip; - - struct cgraph_edge *e = cgraph_create_edge (new_thunk, node, NULL, 0, - CGRAPH_FREQ_BASE); -@@ -365,12 +367,11 @@ - chain. */ - - void --redirect_edge_duplicating_thunks (struct cgraph_edge *e, struct cgraph_node *n, -- bitmap args_to_skip) -+redirect_edge_duplicating_thunks (struct cgraph_edge *e, struct cgraph_node *n) - { - cgraph_node *orig_to = cgraph_function_or_thunk_node (e->callee); - if (orig_to->thunk.thunk_p) -- n = duplicate_thunk_for_node (orig_to, n, args_to_skip); -+ n = duplicate_thunk_for_node (orig_to, n); - - cgraph_redirect_edge_callee (e, n); - } -@@ -423,9 +424,21 @@ - new_node->rtl = n->rtl; - new_node->count = count; - new_node->frequency = n->frequency; -- new_node->clone = n->clone; -+ new_node->tp_first_run = n->tp_first_run; -+ - new_node->clone.tree_map = NULL; -- new_node->tp_first_run = n->tp_first_run; -+ new_node->clone.args_to_skip = args_to_skip; -+ if (!args_to_skip) -+ new_node->clone.combined_args_to_skip = n->clone.combined_args_to_skip; -+ else if (n->clone.combined_args_to_skip) -+ { -+ new_node->clone.combined_args_to_skip = BITMAP_GGC_ALLOC (); -+ bitmap_ior (new_node->clone.combined_args_to_skip, -+ n->clone.combined_args_to_skip, args_to_skip); -+ } -+ else -+ new_node->clone.combined_args_to_skip = args_to_skip; -+ - if (n->count) - { - if (new_node->count > n->count) -@@ -450,10 +463,9 @@ - if (!e->callee - || DECL_BUILT_IN_CLASS (e->callee->decl) != BUILT_IN_NORMAL - || DECL_FUNCTION_CODE (e->callee->decl) != BUILT_IN_UNREACHABLE) -- redirect_edge_duplicating_thunks (e, new_node, args_to_skip); -+ redirect_edge_duplicating_thunks (e, new_node); - } - -- - for (e = n->callees;e; e=e->next_callee) - cgraph_clone_edge (e, new_node, e->call_stmt, e->lto_stmt_uid, - count_scale, freq, update_original); -@@ -562,7 +574,6 @@ - DECL_SECTION_NAME (new_node->decl) = NULL; - set_new_clone_decl_and_node_flags (new_node); - new_node->clone.tree_map = tree_map; -- new_node->clone.args_to_skip = args_to_skip; - - /* Clones of global symbols or symbols with unique names are unique. */ - if ((TREE_PUBLIC (old_decl) -@@ -574,32 +585,6 @@ - FOR_EACH_VEC_SAFE_ELT (tree_map, i, map) - ipa_maybe_record_reference (new_node, map->new_tree, - IPA_REF_ADDR, NULL); -- if (!args_to_skip) -- new_node->clone.combined_args_to_skip = old_node->clone.combined_args_to_skip; -- else if (old_node->clone.combined_args_to_skip) -- { -- int newi = 0, oldi = 0; -- tree arg; -- bitmap new_args_to_skip = BITMAP_GGC_ALLOC (); -- struct cgraph_node *orig_node; -- for (orig_node = old_node; orig_node->clone_of; orig_node = orig_node->clone_of) -- ; -- for (arg = DECL_ARGUMENTS (orig_node->decl); -- arg; arg = DECL_CHAIN (arg), oldi++) -- { -- if (bitmap_bit_p (old_node->clone.combined_args_to_skip, oldi)) -- { -- bitmap_set_bit (new_args_to_skip, oldi); -- continue; -- } -- if (bitmap_bit_p (args_to_skip, newi)) -- bitmap_set_bit (new_args_to_skip, oldi); -- newi++; -- } -- new_node->clone.combined_args_to_skip = new_args_to_skip; -- } -- else -- new_node->clone.combined_args_to_skip = args_to_skip; - - cgraph_call_node_duplication_hooks (old_node, new_node); - -Index: gcc/lto-streamer-out.c -=================================================================== ---- a/src/gcc/lto-streamer-out.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/lto-streamer-out.c (.../branches/gcc-4_9-branch) -@@ -2022,7 +2022,30 @@ - lto_end_section (); - } - -+/* Wrap symbol references in *TP inside a type-preserving MEM_REF. */ - -+static tree -+wrap_refs (tree *tp, int *ws, void *) -+{ -+ tree t = *tp; -+ if (handled_component_p (t) -+ && TREE_CODE (TREE_OPERAND (t, 0)) == VAR_DECL) -+ { -+ tree decl = TREE_OPERAND (t, 0); -+ tree ptrtype = build_pointer_type (TREE_TYPE (decl)); -+ TREE_OPERAND (t, 0) = build2 (MEM_REF, TREE_TYPE (decl), -+ build1 (ADDR_EXPR, ptrtype, decl), -+ build_int_cst (ptrtype, 0)); -+ TREE_THIS_VOLATILE (TREE_OPERAND (t, 0)) = TREE_THIS_VOLATILE (decl); -+ *ws = 0; -+ } -+ else if (TREE_CODE (t) == CONSTRUCTOR) -+ ; -+ else if (!EXPR_P (t)) -+ *ws = 0; -+ return NULL_TREE; -+} -+ - /* Main entry point from the pass manager. */ - - void -@@ -2043,25 +2066,34 @@ - for (i = 0; i < n_nodes; i++) - { - symtab_node *snode = lto_symtab_encoder_deref (encoder, i); -- cgraph_node *node = dyn_cast <cgraph_node> (snode); -- if (node -- && lto_symtab_encoder_encode_body_p (encoder, node) -- && !node->alias) -+ if (cgraph_node *node = dyn_cast <cgraph_node> (snode)) - { -+ if (lto_symtab_encoder_encode_body_p (encoder, node) -+ && !node->alias) -+ { - #ifdef ENABLE_CHECKING -- gcc_assert (!bitmap_bit_p (output, DECL_UID (node->decl))); -- bitmap_set_bit (output, DECL_UID (node->decl)); -+ gcc_assert (!bitmap_bit_p (output, DECL_UID (node->decl))); -+ bitmap_set_bit (output, DECL_UID (node->decl)); - #endif -- decl_state = lto_new_out_decl_state (); -- lto_push_out_decl_state (decl_state); -- if (gimple_has_body_p (node->decl) || !flag_wpa) -- output_function (node); -- else -- copy_function (node); -- gcc_assert (lto_get_out_decl_state () == decl_state); -- lto_pop_out_decl_state (); -- lto_record_function_out_decl_state (node->decl, decl_state); -+ decl_state = lto_new_out_decl_state (); -+ lto_push_out_decl_state (decl_state); -+ if (gimple_has_body_p (node->decl) || !flag_wpa) -+ output_function (node); -+ else -+ copy_function (node); -+ gcc_assert (lto_get_out_decl_state () == decl_state); -+ lto_pop_out_decl_state (); -+ lto_record_function_out_decl_state (node->decl, decl_state); -+ } - } -+ else if (varpool_node *node = dyn_cast <varpool_node> (snode)) -+ { -+ /* Wrap symbol references inside the ctor in a type -+ preserving MEM_REF. */ -+ tree ctor = DECL_INITIAL (node->decl); -+ if (ctor && !in_lto_p) -+ walk_tree (&ctor, wrap_refs, NULL, NULL); -+ } - } - - /* Emit the callgraph after emitting function bodies. This needs to -Index: gcc/tree-ssa-math-opts.c -=================================================================== ---- a/src/gcc/tree-ssa-math-opts.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/tree-ssa-math-opts.c (.../branches/gcc-4_9-branch) -@@ -1620,7 +1620,7 @@ - - struct symbolic_number { - unsigned HOST_WIDEST_INT n; -- int size; -+ tree type; - }; - - /* Perform a SHIFT or ROTATE operation by COUNT bits on symbolic -@@ -1632,13 +1632,15 @@ - struct symbolic_number *n, - int count) - { -+ int bitsize = TYPE_PRECISION (n->type); -+ - if (count % 8 != 0) - return false; - - /* Zero out the extra bits of N in order to avoid them being shifted - into the significant bits. */ -- if (n->size < (int)sizeof (HOST_WIDEST_INT)) -- n->n &= ((unsigned HOST_WIDEST_INT)1 << (n->size * BITS_PER_UNIT)) - 1; -+ if (bitsize < 8 * (int)sizeof (HOST_WIDEST_INT)) -+ n->n &= ((unsigned HOST_WIDEST_INT)1 << bitsize) - 1; - - switch (code) - { -@@ -1646,20 +1648,24 @@ - n->n <<= count; - break; - case RSHIFT_EXPR: -+ /* Arithmetic shift of signed type: result is dependent on the value. */ -+ if (!TYPE_UNSIGNED (n->type) -+ && (n->n & ((unsigned HOST_WIDEST_INT) 0xff << (bitsize - 8)))) -+ return false; - n->n >>= count; - break; - case LROTATE_EXPR: -- n->n = (n->n << count) | (n->n >> ((n->size * BITS_PER_UNIT) - count)); -+ n->n = (n->n << count) | (n->n >> (bitsize - count)); - break; - case RROTATE_EXPR: -- n->n = (n->n >> count) | (n->n << ((n->size * BITS_PER_UNIT) - count)); -+ n->n = (n->n >> count) | (n->n << (bitsize - count)); - break; - default: - return false; - } - /* Zero unused bits for size. */ -- if (n->size < (int)sizeof (HOST_WIDEST_INT)) -- n->n &= ((unsigned HOST_WIDEST_INT)1 << (n->size * BITS_PER_UNIT)) - 1; -+ if (bitsize < 8 * (int)sizeof (HOST_WIDEST_INT)) -+ n->n &= ((unsigned HOST_WIDEST_INT)1 << bitsize) - 1; - return true; - } - -@@ -1676,7 +1682,7 @@ - if (TREE_CODE (lhs_type) != INTEGER_TYPE) - return false; - -- if (TYPE_PRECISION (lhs_type) != n->size * BITS_PER_UNIT) -+ if (TYPE_PRECISION (lhs_type) != TYPE_PRECISION (n->type)) - return false; - - return true; -@@ -1733,20 +1739,23 @@ - to initialize the symbolic number. */ - if (!source_expr1) - { -+ int size; -+ - /* Set up the symbolic number N by setting each byte to a - value between 1 and the byte size of rhs1. The highest - order byte is set to n->size and the lowest order - byte to 1. */ -- n->size = TYPE_PRECISION (TREE_TYPE (rhs1)); -- if (n->size % BITS_PER_UNIT != 0) -+ n->type = TREE_TYPE (rhs1); -+ size = TYPE_PRECISION (n->type); -+ if (size % BITS_PER_UNIT != 0) - return NULL_TREE; -- n->size /= BITS_PER_UNIT; -+ size /= BITS_PER_UNIT; - n->n = (sizeof (HOST_WIDEST_INT) < 8 ? 0 : - (unsigned HOST_WIDEST_INT)0x08070605 << 32 | 0x04030201); - -- if (n->size < (int)sizeof (HOST_WIDEST_INT)) -+ if (size < (int)sizeof (HOST_WIDEST_INT)) - n->n &= ((unsigned HOST_WIDEST_INT)1 << -- (n->size * BITS_PER_UNIT)) - 1; -+ (size * BITS_PER_UNIT)) - 1; - - source_expr1 = rhs1; - } -@@ -1755,12 +1764,12 @@ - { - case BIT_AND_EXPR: - { -- int i; -+ int i, size = TYPE_PRECISION (n->type) / BITS_PER_UNIT; - unsigned HOST_WIDEST_INT val = widest_int_cst_value (rhs2); - unsigned HOST_WIDEST_INT tmp = val; - - /* Only constants masking full bytes are allowed. */ -- for (i = 0; i < n->size; i++, tmp >>= BITS_PER_UNIT) -+ for (i = 0; i < size; i++, tmp >>= BITS_PER_UNIT) - if ((tmp & 0xff) != 0 && (tmp & 0xff) != 0xff) - return NULL_TREE; - -@@ -1776,12 +1785,22 @@ - break; - CASE_CONVERT: - { -- int type_size; -+ int type_size, old_type_size; -+ tree type; - -- type_size = TYPE_PRECISION (gimple_expr_type (stmt)); -+ type = gimple_expr_type (stmt); -+ type_size = TYPE_PRECISION (type); - if (type_size % BITS_PER_UNIT != 0) - return NULL_TREE; - -+ /* Sign extension: result is dependent on the value. */ -+ old_type_size = TYPE_PRECISION (n->type); -+ if (!TYPE_UNSIGNED (n->type) -+ && type_size > old_type_size -+ && n->n & -+ ((unsigned HOST_WIDEST_INT) 0xff << (old_type_size - 8))) -+ return NULL_TREE; -+ - if (type_size / BITS_PER_UNIT < (int)(sizeof (HOST_WIDEST_INT))) - { - /* If STMT casts to a smaller type mask out the bits not -@@ -1788,7 +1807,7 @@ - belonging to the target type. */ - n->n &= ((unsigned HOST_WIDEST_INT)1 << type_size) - 1; - } -- n->size = type_size / BITS_PER_UNIT; -+ n->type = type; - } - break; - default: -@@ -1801,7 +1820,7 @@ - - if (rhs_class == GIMPLE_BINARY_RHS) - { -- int i; -+ int i, size; - struct symbolic_number n1, n2; - unsigned HOST_WIDEST_INT mask; - tree source_expr2; -@@ -1825,11 +1844,12 @@ - source_expr2 = find_bswap_1 (rhs2_stmt, &n2, limit - 1); - - if (source_expr1 != source_expr2 -- || n1.size != n2.size) -+ || TYPE_PRECISION (n1.type) != TYPE_PRECISION (n2.type)) - return NULL_TREE; - -- n->size = n1.size; -- for (i = 0, mask = 0xff; i < n->size; i++, mask <<= BITS_PER_UNIT) -+ n->type = n1.type; -+ size = TYPE_PRECISION (n->type) / BITS_PER_UNIT; -+ for (i = 0, mask = 0xff; i < size; i++, mask <<= BITS_PER_UNIT) - { - unsigned HOST_WIDEST_INT masked1, masked2; - -@@ -1868,7 +1888,7 @@ - - struct symbolic_number n; - tree source_expr; -- int limit; -+ int limit, bitsize; - - /* The last parameter determines the depth search limit. It usually - correlates directly to the number of bytes to be touched. We -@@ -1883,13 +1903,14 @@ - return NULL_TREE; - - /* Zero out the extra bits of N and CMP. */ -- if (n.size < (int)sizeof (HOST_WIDEST_INT)) -+ bitsize = TYPE_PRECISION (n.type); -+ if (bitsize < 8 * (int)sizeof (HOST_WIDEST_INT)) - { - unsigned HOST_WIDEST_INT mask = -- ((unsigned HOST_WIDEST_INT)1 << (n.size * BITS_PER_UNIT)) - 1; -+ ((unsigned HOST_WIDEST_INT)1 << bitsize) - 1; - - n.n &= mask; -- cmp >>= (sizeof (HOST_WIDEST_INT) - n.size) * BITS_PER_UNIT; -+ cmp >>= sizeof (HOST_WIDEST_INT) * BITS_PER_UNIT - bitsize; - } - - /* A complete byte swap should make the symbolic number to start -Index: gcc/tree-ssa-propagate.c -=================================================================== ---- a/src/gcc/tree-ssa-propagate.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/tree-ssa-propagate.c (.../branches/gcc-4_9-branch) -@@ -571,8 +571,18 @@ - /* All constants are ok. */ - break; - -+ case tcc_comparison: -+ /* GENERIC allows comparisons with non-boolean types, reject -+ those for GIMPLE. Let vector-typed comparisons pass - rules -+ for GENERIC and GIMPLE are the same here. */ -+ if (!(INTEGRAL_TYPE_P (TREE_TYPE (expr)) -+ && (TREE_CODE (TREE_TYPE (expr)) == BOOLEAN_TYPE -+ || TYPE_PRECISION (TREE_TYPE (expr)) == 1)) -+ && TREE_CODE (TREE_TYPE (expr)) != VECTOR_TYPE) -+ return false; -+ -+ /* Fallthru. */ - case tcc_binary: -- case tcc_comparison: - if (!is_gimple_val (TREE_OPERAND (expr, 0)) - || !is_gimple_val (TREE_OPERAND (expr, 1))) - return false; -Index: gcc/tree-ssa-alias.c -=================================================================== ---- a/src/gcc/tree-ssa-alias.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/tree-ssa-alias.c (.../branches/gcc-4_9-branch) -@@ -835,8 +835,8 @@ - /* ??? We cannot simply use the type of operand #0 of the refs here - as the Fortran compiler smuggles type punning into COMPONENT_REFs - for common blocks instead of using unions like everyone else. */ -- tree type1 = TYPE_MAIN_VARIANT (DECL_CONTEXT (field1)); -- tree type2 = TYPE_MAIN_VARIANT (DECL_CONTEXT (field2)); -+ tree type1 = DECL_CONTEXT (field1); -+ tree type2 = DECL_CONTEXT (field2); - - /* We cannot disambiguate fields in a union or qualified union. */ - if (type1 != type2 || TREE_CODE (type1) != RECORD_TYPE) -Index: gcc/loop-init.c -=================================================================== ---- a/src/gcc/loop-init.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/loop-init.c (.../branches/gcc-4_9-branch) -@@ -94,6 +94,7 @@ - else - { - bool recorded_exits = loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS); -+ bool needs_fixup = loops_state_satisfies_p (LOOPS_NEED_FIXUP); - - gcc_assert (cfun->curr_properties & PROP_loops); - -@@ -100,14 +101,8 @@ - /* Ensure that the dominators are computed, like flow_loops_find does. */ - calculate_dominance_info (CDI_DOMINATORS); - -- if (loops_state_satisfies_p (LOOPS_NEED_FIXUP)) -- { -- loops_state_clear (~0U); -- fix_loop_structure (NULL); -- } -- - #ifdef ENABLE_CHECKING -- else -+ if (!needs_fixup) - verify_loop_structure (); - #endif - -@@ -115,6 +110,14 @@ - if (recorded_exits) - release_recorded_exits (); - loops_state_clear (~0U); -+ -+ if (needs_fixup) -+ { -+ /* Apply LOOPS_MAY_HAVE_MULTIPLE_LATCHES early as fix_loop_structure -+ re-applies flags. */ -+ loops_state_set (flags & LOOPS_MAY_HAVE_MULTIPLE_LATCHES); -+ fix_loop_structure (NULL); -+ } - } - - /* Apply flags to loops. */ -Index: gcc/gimple-low.c -=================================================================== ---- a/src/gcc/gimple-low.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/gimple-low.c (.../branches/gcc-4_9-branch) -@@ -722,7 +722,7 @@ - these builtins are modelled as non-local label jumps to the label - that is passed to these two builtins, so pretend we have a non-local - label during GIMPLE passes too. See PR60003. */ -- cfun->has_nonlocal_label = true; -+ cfun->has_nonlocal_label = 1; - - /* NEXT_LABEL is the label __builtin_longjmp will jump to. Its address is - passed to both __builtin_setjmp_setup and __builtin_setjmp_receiver. */ -Index: gcc/ipa-inline.c -=================================================================== ---- a/src/gcc/ipa-inline.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/ipa-inline.c (.../branches/gcc-4_9-branch) -@@ -1961,6 +1961,8 @@ - inline_to_all_callers (struct cgraph_node *node, void *data) - { - int *num_calls = (int *)data; -+ bool callee_removed = false; -+ - while (node->callers && !node->global.inlined_to) - { - struct cgraph_node *caller = node->callers->caller; -@@ -1977,7 +1979,7 @@ - inline_summary (node->callers->caller)->size); - } - -- inline_call (node->callers, true, NULL, NULL, true); -+ inline_call (node->callers, true, NULL, NULL, true, &callee_removed); - if (dump_file) - fprintf (dump_file, - " Inlined into %s which now has %i size\n", -@@ -1987,8 +1989,10 @@ - { - if (dump_file) - fprintf (dump_file, "New calls found; giving up.\n"); -- return true; -+ return callee_removed; - } -+ if (callee_removed) -+ return true; - } - return false; - } -@@ -2107,8 +2111,9 @@ - int num_calls = 0; - cgraph_for_node_and_aliases (node, sum_callers, - &num_calls, true); -- cgraph_for_node_and_aliases (node, inline_to_all_callers, -- &num_calls, true); -+ while (cgraph_for_node_and_aliases (node, inline_to_all_callers, -+ &num_calls, true)) -+ ; - remove_functions = true; - } - } -Index: gcc/config.in -=================================================================== ---- a/src/gcc/config.in (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config.in (.../branches/gcc-4_9-branch) -@@ -1254,6 +1254,13 @@ - #endif - - -+/* Define if the linker supports clearing hardware capabilities via mapfile. -+ */ -+#ifndef USED_FOR_TARGET -+#undef HAVE_LD_CLEARCAP -+#endif -+ -+ - /* Define if your linker supports --demangle option. */ - #ifndef USED_FOR_TARGET - #undef HAVE_LD_DEMANGLE -Index: gcc/ipa-inline.h -=================================================================== ---- a/src/gcc/ipa-inline.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/ipa-inline.h (.../branches/gcc-4_9-branch) -@@ -234,7 +234,8 @@ - bool speculation_useful_p (struct cgraph_edge *e, bool anticipate_inlining); - - /* In ipa-inline-transform.c */ --bool inline_call (struct cgraph_edge *, bool, vec<cgraph_edge_p> *, int *, bool); -+bool inline_call (struct cgraph_edge *, bool, vec<cgraph_edge_p> *, int *, bool, -+ bool *callee_removed = NULL); - unsigned int inline_transform (struct cgraph_node *); - void clone_inlined_nodes (struct cgraph_edge *e, bool, bool, int *, - int freq_scale); -Index: gcc/dwarf2out.c -=================================================================== ---- a/src/gcc/dwarf2out.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/dwarf2out.c (.../branches/gcc-4_9-branch) -@@ -4222,13 +4222,10 @@ - static void - remove_addr_table_entry (addr_table_entry *entry) - { -- addr_table_entry *node; -- - gcc_assert (dwarf_split_debug_info && addr_index_table); -- node = (addr_table_entry *) htab_find (addr_index_table, entry); - /* After an index is assigned, the table is frozen. */ -- gcc_assert (node->refcount > 0 && node->index == NO_INDEX_ASSIGNED); -- node->refcount--; -+ gcc_assert (entry->refcount > 0 && entry->index == NO_INDEX_ASSIGNED); -+ entry->refcount--; - } - - /* Given a location list, remove all addresses it refers to from the -@@ -23099,11 +23096,16 @@ - break; - case DW_OP_GNU_addr_index: - case DW_OP_GNU_const_index: -- if ((loc->dw_loc_opc == DW_OP_GNU_addr_index -- || (loc->dw_loc_opc == DW_OP_GNU_const_index && loc->dtprel)) -- && resolve_one_addr (&loc->dw_loc_oprnd1.val_entry->addr.rtl, -- NULL)) -- return false; -+ if (loc->dw_loc_opc == DW_OP_GNU_addr_index -+ || (loc->dw_loc_opc == DW_OP_GNU_const_index && loc->dtprel)) -+ { -+ rtx rtl = loc->dw_loc_oprnd1.val_entry->addr.rtl; -+ if (resolve_one_addr (&rtl, NULL)) -+ return false; -+ remove_addr_table_entry (loc->dw_loc_oprnd1.val_entry); -+ loc->dw_loc_oprnd1.val_entry = -+ add_addr_table_entry (rtl, ate_kind_rtx); -+ } - break; - case DW_OP_const4u: - case DW_OP_const8u: -@@ -24195,7 +24197,7 @@ - dwarf_strict ? DW_AT_macro_info : DW_AT_GNU_macros, - macinfo_section_label); - -- if (dwarf_split_debug_info && addr_index_table != NULL) -+ if (dwarf_split_debug_info) - { - /* optimize_location_lists calculates the size of the lists, - so index them first, and assign indices to the entries. -@@ -24202,11 +24204,16 @@ - Although optimize_location_lists will remove entries from - the table, it only does so for duplicates, and therefore - only reduces ref_counts to 1. */ -- unsigned int index = 0; - index_location_lists (comp_unit_die ()); -- htab_traverse_noresize (addr_index_table, -- index_addr_table_entry, &index); -+ -+ if (addr_index_table != NULL) -+ { -+ unsigned int index = 0; -+ htab_traverse_noresize (addr_index_table, -+ index_addr_table_entry, &index); -+ } - } -+ - if (have_location_lists) - optimize_location_lists (comp_unit_die ()); - -Index: gcc/go/gofrontend/types.h -=================================================================== ---- a/src/gcc/go/gofrontend/types.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/go/gofrontend/types.h (.../branches/gcc-4_9-branch) -@@ -1171,14 +1171,11 @@ - static tree - build_receive_return_type(tree type); - -- // A hash table we use to avoid infinite recursion. -- typedef Unordered_set_hash(const Named_type*, Type_hash_identical, -- Type_identical) Types_seen; -- - // Add all methods for TYPE to the list of methods for THIS. - static void - add_methods_for_type(const Type* type, const Method::Field_indexes*, -- unsigned int depth, bool, bool, Types_seen*, -+ unsigned int depth, bool, bool, -+ std::vector<const Named_type*>*, - Methods**); - - static void -@@ -1189,7 +1186,8 @@ - static void - add_embedded_methods_for_type(const Type* type, - const Method::Field_indexes*, -- unsigned int depth, bool, bool, Types_seen*, -+ unsigned int depth, bool, bool, -+ std::vector<const Named_type*>*, - Methods**); - - static void -Index: gcc/go/gofrontend/lex.cc -=================================================================== ---- a/src/gcc/go/gofrontend/lex.cc (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/go/gofrontend/lex.cc (.../branches/gcc-4_9-branch) -@@ -598,7 +598,7 @@ - } - else if (p[1] == '*') - { -- this->lineoff_ = p - this->linebuf_; -+ this->lineoff_ = p + 2 - this->linebuf_; - Location location = this->location(); - if (!this->skip_c_comment()) - return Token::make_invalid_token(location); -Index: gcc/go/gofrontend/types.cc -=================================================================== ---- a/src/gcc/go/gofrontend/types.cc (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/go/gofrontend/types.cc (.../branches/gcc-4_9-branch) -@@ -8966,9 +8966,8 @@ - Methods** all_methods) - { - *all_methods = NULL; -- Types_seen types_seen; -- Type::add_methods_for_type(type, NULL, 0, false, false, &types_seen, -- all_methods); -+ std::vector<const Named_type*> seen; -+ Type::add_methods_for_type(type, NULL, 0, false, false, &seen, all_methods); - Type::build_stub_methods(gogo, type, *all_methods, location); - } - -@@ -8986,7 +8985,7 @@ - unsigned int depth, - bool is_embedded_pointer, - bool needs_stub_method, -- Types_seen* types_seen, -+ std::vector<const Named_type*>* seen, - Methods** methods) - { - // Pointer types may not have methods. -@@ -8996,19 +8995,24 @@ - const Named_type* nt = type->named_type(); - if (nt != NULL) - { -- std::pair<Types_seen::iterator, bool> ins = types_seen->insert(nt); -- if (!ins.second) -- return; -+ for (std::vector<const Named_type*>::const_iterator p = seen->begin(); -+ p != seen->end(); -+ ++p) -+ { -+ if (*p == nt) -+ return; -+ } -+ -+ seen->push_back(nt); -+ -+ Type::add_local_methods_for_type(nt, field_indexes, depth, -+ is_embedded_pointer, needs_stub_method, -+ methods); - } - -- if (nt != NULL) -- Type::add_local_methods_for_type(nt, field_indexes, depth, -- is_embedded_pointer, needs_stub_method, -- methods); -- - Type::add_embedded_methods_for_type(type, field_indexes, depth, - is_embedded_pointer, needs_stub_method, -- types_seen, methods); -+ seen, methods); - - // If we are called with depth > 0, then we are looking at an - // anonymous field of a struct. If such a field has interface type, -@@ -9017,6 +9021,9 @@ - // following the usual rules for an interface type. - if (depth > 0) - Type::add_interface_methods_for_type(type, field_indexes, depth, methods); -+ -+ if (nt != NULL) -+ seen->pop_back(); - } - - // Add the local methods for the named type NT to *METHODS. The -@@ -9062,7 +9069,7 @@ - unsigned int depth, - bool is_embedded_pointer, - bool needs_stub_method, -- Types_seen* types_seen, -+ std::vector<const Named_type*>* seen, - Methods** methods) - { - // Look for anonymous fields in TYPE. TYPE has fields if it is a -@@ -9106,7 +9113,7 @@ - (needs_stub_method - || is_pointer - || i > 0), -- types_seen, -+ seen, - methods); - } - } -Index: gcc/go/gofrontend/import-archive.cc -=================================================================== ---- a/src/gcc/go/gofrontend/import-archive.cc (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/go/gofrontend/import-archive.cc (.../branches/gcc-4_9-branch) -@@ -261,7 +261,7 @@ - char size_string[size_string_size + 1]; - memcpy(size_string, hdr->ar_size, size_string_size); - char* ps = size_string + size_string_size; -- while (ps[-1] == ' ') -+ while (ps > size_string && ps[-1] == ' ') - --ps; - *ps = '\0'; - -Index: gcc/opts.c -=================================================================== ---- a/src/gcc/opts.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/opts.c (.../branches/gcc-4_9-branch) -@@ -431,8 +431,8 @@ - { OPT_LEVELS_1_PLUS, OPT_fguess_branch_probability, NULL, 1 }, - { OPT_LEVELS_1_PLUS, OPT_fcprop_registers, NULL, 1 }, - { OPT_LEVELS_1_PLUS, OPT_fforward_propagate, NULL, 1 }, -- { OPT_LEVELS_1_PLUS, OPT_fif_conversion, NULL, 1 }, -- { OPT_LEVELS_1_PLUS, OPT_fif_conversion2, NULL, 1 }, -+ { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion, NULL, 1 }, -+ { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion2, NULL, 1 }, - { OPT_LEVELS_1_PLUS, OPT_fipa_pure_const, NULL, 1 }, - { OPT_LEVELS_1_PLUS, OPT_fipa_reference, NULL, 1 }, - { OPT_LEVELS_1_PLUS, OPT_fipa_profile, NULL, 1 }, -@@ -1501,9 +1501,9 @@ - } - - if (! found) -- warning_at (loc, 0, -- "unrecognized argument to -fsanitize= option: %q.*s", -- (int) len, p); -+ error_at (loc, -+ "unrecognized argument to -fsanitize= option: %q.*s", -+ (int) len, p); - - if (comma == NULL) - break; -@@ -1740,7 +1740,7 @@ - /* FIXME: Instrumentation we insert makes ipa-reference bitmaps - quadratic. Disable the pass until better memory representation - is done. */ -- if (!opts_set->x_flag_ipa_reference && opts->x_in_lto_p) -+ if (!opts_set->x_flag_ipa_reference) - opts->x_flag_ipa_reference = false; - break; - -@@ -1820,13 +1820,8 @@ - break; - - case OPT_g: -- /* -g by itself should force -g2. */ -- if (*arg == '\0') -- set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, "2", opts, opts_set, -- loc); -- else -- set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg, opts, opts_set, -- loc); -+ set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg, opts, opts_set, -+ loc); - break; - - case OPT_gcoff: -@@ -2076,10 +2071,12 @@ - opts_set->x_write_symbols = type; - } - -- /* A debug flag without a level defaults to level 2. */ -+ /* A debug flag without a level defaults to level 2. -+ If off or at level 1, set it to level 2, but if already -+ at level 3, don't lower it. */ - if (*arg == '\0') - { -- if (!opts->x_debug_info_level) -+ if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL) - opts->x_debug_info_level = DINFO_LEVEL_NORMAL; - } - else -Index: gcc/ada/comperr.adb -=================================================================== ---- a/src/gcc/ada/comperr.adb (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/ada/comperr.adb (.../branches/gcc-4_9-branch) -@@ -6,7 +6,7 @@ - -- -- - -- B o d y -- - -- -- ---- Copyright (C) 1992-2013, Free Software Foundation, Inc. -- -+-- Copyright (C) 1992-2014, Free Software Foundation, Inc. -- - -- -- - -- GNAT is free software; you can redistribute it and/or modify it under -- - -- terms of the GNU General Public License as published by the Free Soft- -- -@@ -74,8 +74,8 @@ - - procedure Compiler_Abort - (X : String; -- Code : Integer := 0; -- Fallback_Loc : String := "") -+ Fallback_Loc : String := ""; -+ From_GCC : Boolean := False) - is - -- The procedures below output a "bug box" with information about - -- the cause of the compiler abort and about the preferred method -@@ -206,7 +206,7 @@ - Write_Str (") "); - - if X'Length + Column > 76 then -- if Code < 0 then -+ if From_GCC then - Write_Str ("GCC error:"); - end if; - -@@ -235,12 +235,8 @@ - Write_Str (X); - end if; - -- if Code > 0 then -- Write_Str (", Code="); -- Write_Int (Int (Code)); -+ if not From_GCC then - -- elsif Code = 0 then -- - -- For exception case, get exception message from the TSD. Note - -- that it would be neater and cleaner to pass the exception - -- message (obtained from Exception_Message) as a parameter to -Index: gcc/ada/comperr.ads -=================================================================== ---- a/src/gcc/ada/comperr.ads (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/ada/comperr.ads (.../branches/gcc-4_9-branch) -@@ -6,7 +6,7 @@ - -- -- - -- S p e c -- - -- -- ---- Copyright (C) 1992-2013, Free Software Foundation, Inc. -- -+-- Copyright (C) 1992-2014, Free Software Foundation, Inc. -- - -- -- - -- GNAT is free software; you can redistribute it and/or modify it under -- - -- terms of the GNU General Public License as published by the Free Soft- -- -@@ -31,8 +31,8 @@ - - procedure Compiler_Abort - (X : String; -- Code : Integer := 0; -- Fallback_Loc : String := ""); -+ Fallback_Loc : String := ""; -+ From_GCC : Boolean := False); - pragma No_Return (Compiler_Abort); - -- Signals an internal compiler error. Never returns control. Depending on - -- processing may end up raising Unrecoverable_Error, or exiting directly. -@@ -46,10 +46,9 @@ - -- Note that this is only used at the outer level (to handle constraint - -- errors or assert errors etc.) In the normal logic of the compiler we - -- always use pragma Assert to check for errors, and if necessary an -- -- explicit abort is achieved by pragma Assert (False). Code is positive -- -- for a gigi abort (giving the gigi abort code), zero for a front -- -- end exception (with possible message stored in TSD.Current_Excep, -- -- and negative (an unused value) for a GCC abort. -+ -- explicit abort is achieved by pragma Assert (False). From_GCC is true -+ -- for a GCC abort and false for a front end exception (with a possible -+ -- message stored in TSD.Current_Excep). - - procedure Delete_SCIL_Files; - -- Delete SCIL files associated with the main unit -Index: gcc/ada/fe.h -=================================================================== ---- a/src/gcc/ada/fe.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/ada/fe.h (.../branches/gcc-4_9-branch) -@@ -29,17 +29,20 @@ - * * - ****************************************************************************/ - --/* This file contains definitions to access front-end functions and -- variables used by gigi. */ -+/* This file contains declarations to access front-end functions and variables -+ used by gigi. - -+ WARNING: functions taking String_Pointer parameters must abide by the rule -+ documented alongside the definition of String_Pointer in types.h. */ -+ - #ifdef __cplusplus - extern "C" { - #endif - --/* comperr: */ -+/* comperr: */ - - #define Compiler_Abort comperr__compiler_abort --extern int Compiler_Abort (Fat_Pointer, int, Fat_Pointer) ATTRIBUTE_NORETURN; -+extern int Compiler_Abort (String_Pointer, String_Pointer, Boolean) ATTRIBUTE_NORETURN; - - /* csets: */ - -@@ -72,8 +75,6 @@ - extern void Set_RM_Size (Entity_Id, Uint); - extern void Set_Present_Expr (Node_Id, Uint); - --/* Test if the node N is the name of an entity (i.e. is an identifier, -- expanded name, or an attribute reference that returns an entity). */ - #define Is_Entity_Name einfo__is_entity_name - extern Boolean Is_Entity_Name (Node_Id); - -@@ -90,8 +91,8 @@ - #define Error_Msg_NE errout__error_msg_ne - #define Set_Identifier_Casing errout__set_identifier_casing - --extern void Error_Msg_N (Fat_Pointer, Node_Id); --extern void Error_Msg_NE (Fat_Pointer, Node_Id, Entity_Id); -+extern void Error_Msg_N (String_Pointer, Node_Id); -+extern void Error_Msg_NE (String_Pointer, Node_Id, Entity_Id); - extern void Set_Identifier_Casing (Char *, const Char *); - - /* err_vars: */ -@@ -147,11 +148,9 @@ - - #define Get_Encoded_Name exp_dbug__get_encoded_name - #define Get_External_Name exp_dbug__get_external_name --#define Get_External_Name_With_Suffix exp_dbug__get_external_name_with_suffix - --extern void Get_Encoded_Name (Entity_Id); --extern void Get_External_Name (Entity_Id, Boolean); --extern void Get_External_Name_With_Suffix (Entity_Id, Fat_Pointer); -+extern void Get_Encoded_Name (Entity_Id); -+extern void Get_External_Name (Entity_Id, Boolean, String_Pointer); - - /* exp_util: */ - -Index: gcc/ada/types.h -=================================================================== ---- a/src/gcc/ada/types.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/ada/types.h (.../branches/gcc-4_9-branch) -@@ -76,11 +76,19 @@ - /* Pointer to string of Chars */ - typedef Char *Str_Ptr; - --/* Types for the fat pointer used for strings and the template it -- points to. */ --typedef struct {int Low_Bound, High_Bound; } String_Template; --typedef struct {const char *Array; String_Template *Bounds; } -- __attribute ((aligned (sizeof (char *) * 2))) Fat_Pointer; -+/* Types for the fat pointer used for strings and the template it points to. -+ The fat pointer is conceptually a couple of pointers, but it is wrapped -+ up in a special record type. On the Ada side, the record is naturally -+ aligned (i.e. given pointer alignment) on regular platforms, but it is -+ given twice this alignment on strict-alignment platforms for performance -+ reasons. On the C side, for the sake of portability and simplicity, we -+ overalign it on all platforms (so the machine mode is always the same as -+ on the Ada side) but arrange to pass it in an even scalar position as a -+ parameter to functions (so the scalar parameter alignment is always the -+ same as on the Ada side). */ -+typedef struct { int Low_Bound, High_Bound; } String_Template; -+typedef struct { const char *Array; String_Template *Bounds; } -+ __attribute ((aligned (sizeof (char *) * 2))) String_Pointer; - - /* Types for Node/Entity Kinds: */ - -Index: gcc/ada/exp_dbug.adb -=================================================================== ---- a/src/gcc/ada/exp_dbug.adb (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/ada/exp_dbug.adb (.../branches/gcc-4_9-branch) -@@ -507,8 +507,8 @@ - begin - -- If not generating code, there is no need to create encoded names, and - -- problems when the back-end is called to annotate types without full -- -- code generation. See comments in Get_External_Name_With_Suffix for -- -- additional details. -+ -- code generation. See comments in Get_External_Name for additional -+ -- details. - - -- However we do create encoded names if the back end is active, even - -- if Operating_Mode got reset. Otherwise any serious error reported -@@ -556,7 +556,7 @@ - -- Fixed-point case - - if Is_Fixed_Point_Type (E) then -- Get_External_Name_With_Suffix (E, "XF_"); -+ Get_External_Name (E, True, "XF_"); - Add_Real_To_Buffer (Delta_Value (E)); - - if Small_Value (E) /= Delta_Value (E) then -@@ -568,14 +568,14 @@ - - elsif Vax_Float (E) then - if Digits_Value (Base_Type (E)) = 6 then -- Get_External_Name_With_Suffix (E, "XFF"); -+ Get_External_Name (E, True, "XFF"); - - elsif Digits_Value (Base_Type (E)) = 9 then -- Get_External_Name_With_Suffix (E, "XFF"); -+ Get_External_Name (E, True, "XFF"); - - else - pragma Assert (Digits_Value (Base_Type (E)) = 15); -- Get_External_Name_With_Suffix (E, "XFG"); -+ Get_External_Name (E, True, "XFG"); - end if; - - -- Discrete case where bounds do not match size -@@ -607,9 +607,9 @@ - - begin - if Biased then -- Get_External_Name_With_Suffix (E, "XB"); -+ Get_External_Name (E, True, "XB"); - else -- Get_External_Name_With_Suffix (E, "XD"); -+ Get_External_Name (E, True, "XD"); - end if; - - if Lo_Encode or Hi_Encode then -@@ -649,7 +649,7 @@ - - else - Has_Suffix := False; -- Get_External_Name (E, Has_Suffix); -+ Get_External_Name (E); - end if; - - if Debug_Flag_B and then Has_Suffix then -@@ -667,7 +667,11 @@ - -- Get_External_Name -- - ----------------------- - -- procedure Get_External_Name (Entity : Entity_Id; Has_Suffix : Boolean) is -+ procedure Get_External_Name -+ (Entity : Entity_Id; -+ Has_Suffix : Boolean := False; -+ Suffix : String := "") -+ is - E : Entity_Id := Entity; - Kind : Entity_Kind; - -@@ -704,6 +708,20 @@ - -- Start of processing for Get_External_Name - - begin -+ -- If we are not in code generation mode, this procedure may still be -+ -- called from Back_End (more specifically - from gigi for doing type -+ -- representation annotation or some representation-specific checks). -+ -- But in this mode there is no need to mess with external names. -+ -+ -- Furthermore, the call causes difficulties in this case because the -+ -- string representing the homonym number is not correctly reset as a -+ -- part of the call to Output_Homonym_Numbers_Suffix (which is not -+ -- called in gigi). -+ -+ if Operating_Mode /= Generate_Code then -+ return; -+ end if; -+ - Reset_Buffers; - - -- If this is a child unit, we want the child -@@ -762,43 +780,14 @@ - Get_Qualified_Name_And_Append (E); - end if; - -- Name_Buffer (Name_Len + 1) := ASCII.NUL; -- end Get_External_Name; -- -- ----------------------------------- -- -- Get_External_Name_With_Suffix -- -- ----------------------------------- -- -- procedure Get_External_Name_With_Suffix -- (Entity : Entity_Id; -- Suffix : String) -- is -- Has_Suffix : constant Boolean := (Suffix /= ""); -- -- begin -- -- If we are not in code generation mode, this procedure may still be -- -- called from Back_End (more specifically - from gigi for doing type -- -- representation annotation or some representation-specific checks). -- -- But in this mode there is no need to mess with external names. -- -- -- Furthermore, the call causes difficulties in this case because the -- -- string representing the homonym number is not correctly reset as a -- -- part of the call to Output_Homonym_Numbers_Suffix (which is not -- -- called in gigi). -- -- if Operating_Mode /= Generate_Code then -- return; -- end if; -- -- Get_External_Name (Entity, Has_Suffix); -- - if Has_Suffix then - Add_Str_To_Name_Buffer ("___"); - Add_Str_To_Name_Buffer (Suffix); -- Name_Buffer (Name_Len + 1) := ASCII.NUL; - end if; -- end Get_External_Name_With_Suffix; - -+ Name_Buffer (Name_Len + 1) := ASCII.NUL; -+ end Get_External_Name; -+ - -------------------------- - -- Get_Variant_Encoding -- - -------------------------- -@@ -944,7 +933,7 @@ - Suffix_Index : Int) - is - begin -- Get_External_Name (Typ, Has_Suffix => False); -+ Get_External_Name (Typ); - - if Ancestor_Typ /= Typ then - declare -@@ -952,7 +941,7 @@ - Save_Str : constant String (1 .. Name_Len) - := Name_Buffer (1 .. Name_Len); - begin -- Get_External_Name (Ancestor_Typ, Has_Suffix => False); -+ Get_External_Name (Ancestor_Typ); - - -- Append the extended name of the ancestor to the - -- extended name of Typ -Index: gcc/ada/exp_dbug.ads -=================================================================== ---- a/src/gcc/ada/exp_dbug.ads (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/ada/exp_dbug.ads (.../branches/gcc-4_9-branch) -@@ -413,10 +413,11 @@ - - procedure Get_External_Name - (Entity : Entity_Id; -- Has_Suffix : Boolean); -- -- Set Name_Buffer and Name_Len to the external name of entity E. The -+ Has_Suffix : Boolean := False; -+ Suffix : String := ""); -+ -- Set Name_Buffer and Name_Len to the external name of the entity. The - -- external name is the Interface_Name, if specified, unless the entity -- -- has an address clause or a suffix. -+ -- has an address clause or Has_Suffix is true. - -- - -- If the Interface is not present, or not used, the external name is the - -- concatenation of: -@@ -428,26 +429,11 @@ - -- - the string "$" (or "__" if target does not allow "$"), followed - -- by homonym suffix, if the entity is an overloaded subprogram - -- or is defined within an overloaded subprogram. -- -- procedure Get_External_Name_With_Suffix -- (Entity : Entity_Id; -- Suffix : String); -- -- Set Name_Buffer and Name_Len to the external name of entity E. If -- -- Suffix is the empty string the external name is as above, otherwise -- -- the external name is the concatenation of: -+ -- - the string "___" followed by Suffix if Has_Suffix is true. - -- -- -- - the string "_ada_", if the entity is a library subprogram, -- -- - the names of any enclosing scopes, each followed by "__", -- -- or "X_" if the next entity is a subunit) -- -- - the name of the entity -- -- - the string "$" (or "__" if target does not allow "$"), followed -- -- by homonym suffix, if the entity is an overloaded subprogram -- -- or is defined within an overloaded subprogram. -- -- - the string "___" followed by Suffix -- -- - -- Note that a call to this procedure has no effect if we are not - -- generating code, since the necessary information for computing the -- -- proper encoded name is not available in this case. -+ -- proper external name is not available in this case. - - -------------------------------------------- - -- Subprograms for Handling Qualification -- -Index: gcc/ada/init.c -=================================================================== ---- a/src/gcc/ada/init.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/ada/init.c (.../branches/gcc-4_9-branch) -@@ -556,9 +556,14 @@ - Raise_From_Signal_Handler (exception, msg); - } - --#if defined (i386) || defined (__x86_64__) || defined (__powerpc__) --/* This must be in keeping with System.OS_Interface.Alternate_Stack_Size. */ --char __gnat_alternate_stack[16 * 1024]; /* 2 * SIGSTKSZ */ -+#ifndef __ia64__ -+#define HAVE_GNAT_ALTERNATE_STACK 1 -+/* This must be in keeping with System.OS_Interface.Alternate_Stack_Size. -+ It must be larger than MINSIGSTKSZ and hopefully near 2 * SIGSTKSZ. */ -+# if 16 * 1024 < MINSIGSTKSZ -+# error "__gnat_alternate_stack too small" -+# endif -+char __gnat_alternate_stack[16 * 1024]; - #endif - - #ifdef __XENO__ -@@ -612,7 +617,7 @@ - sigaction (SIGBUS, &act, NULL); - if (__gnat_get_interrupt_state (SIGSEGV) != 's') - { --#if defined (i386) || defined (__x86_64__) || defined (__powerpc__) -+#ifdef HAVE_GNAT_ALTERNATE_STACK - /* Setup an alternate stack region for the handler execution so that - stack overflows can be handled properly, avoiding a SEGV generation - from stack usage by the handler itself. */ -Index: gcc/ada/ChangeLog -=================================================================== ---- a/src/gcc/ada/ChangeLog (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/ada/ChangeLog (.../branches/gcc-4_9-branch) -@@ -1,3 +1,59 @@ -+2014-05-19 Eric Botcazou <ebotcazou@adacore.com> -+ -+ Backport from mainline -+ 2014-04-22 Richard Henderson <rth@redhat.com> -+ -+ * init.c [__linux__] (HAVE_GNAT_ALTERNATE_STACK): New define. -+ (__gnat_alternate_stack): Enable for all linux except ia64. -+ -+2014-05-18 Eric Botcazou <ebotcazou@adacore.com> -+ -+ * utils.c (gnat_write_global_declarations): Adjust the flags put on -+ dummy_global. -+ -+2014-05-18 Eric Botcazou <ebotcazou@adacore.com> -+ -+ * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Array_Subtype>: Do not -+ consider that regular packed arrays can never be superflat. -+ -+2014-05-17 Eric Botcazou <ebotcazou@adacore.com> -+ -+ Backport from mainline -+ 2014-04-28 Richard Henderson <rth@redhat.com> -+ -+ * gcc-interface/Makefile.in: Support aarch64-linux. -+ -+ 2014-04-28 Eric Botcazou <ebotcazou@adacore.com> -+ -+ * exp_dbug.ads (Get_External_Name): Add 'False' default to Has_Suffix, -+ add 'Suffix' parameter and adjust comment. -+ (Get_External_Name_With_Suffix): Delete. -+ * exp_dbug.adb (Get_External_Name_With_Suffix): Merge into... -+ (Get_External_Name): ...here. Add 'False' default to Has_Suffix, add -+ 'Suffix' parameter. -+ (Get_Encoded_Name): Remove 2nd argument in call to Get_External_Name. -+ Call Get_External_Name instead of Get_External_Name_With_Suffix. -+ (Get_Secondary_DT_External_Name): Likewise. -+ * exp_cg.adb (Write_Call_Info): Likewise. -+ * exp_disp.adb (Export_DT): Likewise. -+ (Import_DT): Likewise. -+ * comperr.ads (Compiler_Abort): Remove Code parameter and add From_GCC -+ parameter with False default. -+ * comperr.adb (Compiler_Abort): Likewise. Adjust accordingly. -+ * types.h (Fat_Pointer): Rename into... -+ (String_Pointer): ...this. Add comment on interfacing rules. -+ * fe.h (Compiler_Abort): Adjust for above renaming. -+ (Error_Msg_N): Likewise. -+ (Error_Msg_NE): Likewise. -+ (Get_External_Name): Likewise. Add third parameter. -+ (Get_External_Name_With_Suffix): Delete. -+ * gcc-interface/decl.c (STDCALL_PREFIX): Define. -+ (create_concat_name): Adjust call to Get_External_Name, remove call to -+ Get_External_Name_With_Suffix, use STDCALL_PREFIX, adjust for renaming. -+ * gcc-interface/trans.c (post_error): Likewise. -+ (post_error_ne): Likewise. -+ * gcc-interface/misc.c (internal_error_function): Likewise. -+ - 2014-04-22 Release Manager - - * GCC 4.9.0 released. -Index: gcc/ada/exp_disp.adb -=================================================================== ---- a/src/gcc/ada/exp_disp.adb (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/ada/exp_disp.adb (.../branches/gcc-4_9-branch) -@@ -3913,10 +3913,7 @@ - - pragma Assert (Related_Type (Node (Elmt)) = Typ); - -- Get_External_Name -- (Entity => Node (Elmt), -- Has_Suffix => True); -- -+ Get_External_Name (Node (Elmt)); - Set_Interface_Name (DT, - Make_String_Literal (Loc, - Strval => String_From_Name_Buffer)); -@@ -7088,7 +7085,7 @@ - - Set_Scope (DT, Current_Scope); - -- Get_External_Name (DT, True); -+ Get_External_Name (DT); - Set_Interface_Name (DT, - Make_String_Literal (Loc, Strval => String_From_Name_Buffer)); - -Index: gcc/ada/gcc-interface/utils.c -=================================================================== ---- a/src/gcc/ada/gcc-interface/utils.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/ada/gcc-interface/utils.c (.../branches/gcc-4_9-branch) -@@ -5662,9 +5662,10 @@ - dummy_global - = build_decl (BUILTINS_LOCATION, VAR_DECL, get_identifier (label), - void_type_node); -+ DECL_HARD_REGISTER (dummy_global) = 1; - TREE_STATIC (dummy_global) = 1; -- TREE_ASM_WRITTEN (dummy_global) = 1; - node = varpool_node_for_decl (dummy_global); -+ node->definition = 1; - node->force_output = 1; - - while (!types_used_by_cur_var_decl->is_empty ()) -Index: gcc/ada/gcc-interface/Makefile.in -=================================================================== ---- a/src/gcc/ada/gcc-interface/Makefile.in (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/ada/gcc-interface/Makefile.in (.../branches/gcc-4_9-branch) -@@ -1988,6 +1988,44 @@ - LIBRARY_VERSION := $(LIB_VERSION) - endif - -+# AArch64 Linux -+ifeq ($(strip $(filter-out aarch64% linux%,$(target_cpu) $(target_os))),) -+ LIBGNAT_TARGET_PAIRS = \ -+ a-exetim.adb<a-exetim-posix.adb \ -+ a-exetim.ads<a-exetim-default.ads \ -+ a-intnam.ads<a-intnam-linux.ads \ -+ a-synbar.adb<a-synbar-posix.adb \ -+ a-synbar.ads<a-synbar-posix.ads \ -+ s-inmaop.adb<s-inmaop-posix.adb \ -+ s-intman.adb<s-intman-posix.adb \ -+ s-linux.ads<s-linux.ads \ -+ s-mudido.adb<s-mudido-affinity.adb \ -+ s-osinte.ads<s-osinte-linux.ads \ -+ s-osinte.adb<s-osinte-posix.adb \ -+ s-osprim.adb<s-osprim-posix.adb \ -+ s-taprop.adb<s-taprop-linux.adb \ -+ s-tasinf.ads<s-tasinf-linux.ads \ -+ s-tasinf.adb<s-tasinf-linux.adb \ -+ s-tpopsp.adb<s-tpopsp-tls.adb \ -+ s-taspri.ads<s-taspri-posix.ads \ -+ g-sercom.adb<g-sercom-linux.adb \ -+ $(ATOMICS_TARGET_PAIRS) \ -+ $(ATOMICS_BUILTINS_TARGET_PAIRS) \ -+ system.ads<system-linux-x86_64.ads -+ ## ^^ Note the above is a pretty-close placeholder. -+ -+ TOOLS_TARGET_PAIRS = \ -+ mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \ -+ indepsw.adb<indepsw-gnu.adb -+ -+ EXTRA_GNATRTL_TASKING_OBJS=s-linux.o a-exetim.o -+ EH_MECHANISM=-gcc -+ THREADSLIB=-lpthread -lrt -+ GNATLIB_SHARED=gnatlib-shared-dual -+ GMEM_LIB = gmemlib -+ LIBRARY_VERSION := $(LIB_VERSION) -+endif -+ - # Sparc Linux - ifeq ($(strip $(filter-out sparc% linux%,$(target_cpu) $(target_os))),) - LIBGNAT_TARGET_PAIRS_COMMON = \ -Index: gcc/ada/gcc-interface/decl.c -=================================================================== ---- a/src/gcc/ada/gcc-interface/decl.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/ada/gcc-interface/decl.c (.../branches/gcc-4_9-branch) -@@ -72,6 +72,8 @@ - #define Has_Thiscall_Convention(E) 0 - #endif - -+#define STDCALL_PREFIX "_imp__" -+ - /* Stack realignment is necessary for functions with foreign conventions when - the ABI doesn't mandate as much as what the compiler assumes - that is, up - to PREFERRED_STACK_BOUNDARY. -@@ -2433,8 +2435,10 @@ - we can just use the high bound of the index type. */ - else if ((Nkind (gnat_index) == N_Range - && cannot_be_superflat_p (gnat_index)) -- /* Packed Array Types are never superflat. */ -- || Is_Packed_Array_Type (gnat_entity)) -+ /* Bit-Packed Array Types are never superflat. */ -+ || (Is_Packed_Array_Type (gnat_entity) -+ && Is_Bit_Packed_Array -+ (Original_Array_Type (gnat_entity)))) - gnu_high = gnu_max; - - /* Otherwise, if the high bound is constant but the low bound is -@@ -8879,16 +8883,12 @@ - tree - create_concat_name (Entity_Id gnat_entity, const char *suffix) - { -- Entity_Kind kind = Ekind (gnat_entity); -+ const Entity_Kind kind = Ekind (gnat_entity); -+ const bool has_suffix = (suffix != NULL); -+ String_Template temp = {1, has_suffix ? strlen (suffix) : 0}; -+ String_Pointer sp = {suffix, &temp}; - -- if (suffix) -- { -- String_Template temp = {1, (int) strlen (suffix)}; -- Fat_Pointer fp = {suffix, &temp}; -- Get_External_Name_With_Suffix (gnat_entity, fp); -- } -- else -- Get_External_Name (gnat_entity, 0); -+ Get_External_Name (gnat_entity, has_suffix, sp); - - /* A variable using the Stdcall convention lives in a DLL. We adjust - its name to use the jump table, the _imp__NAME contains the address -@@ -8896,9 +8896,9 @@ - if ((kind == E_Variable || kind == E_Constant) - && Has_Stdcall_Convention (gnat_entity)) - { -- const int len = 6 + Name_Len; -+ const int len = strlen (STDCALL_PREFIX) + Name_Len; - char *new_name = (char *) alloca (len + 1); -- strcpy (new_name, "_imp__"); -+ strcpy (new_name, STDCALL_PREFIX); - strcat (new_name, Name_Buffer); - return get_identifier_with_length (new_name, len); - } -Index: gcc/ada/gcc-interface/trans.c -=================================================================== ---- a/src/gcc/ada/gcc-interface/trans.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/ada/gcc-interface/trans.c (.../branches/gcc-4_9-branch) -@@ -9262,7 +9262,7 @@ - post_error (const char *msg, Node_Id node) - { - String_Template temp; -- Fat_Pointer fp; -+ String_Pointer sp; - - if (No (node)) - return; -@@ -9269,9 +9269,9 @@ - - temp.Low_Bound = 1; - temp.High_Bound = strlen (msg); -- fp.Bounds = &temp; -- fp.Array = msg; -- Error_Msg_N (fp, node); -+ sp.Bounds = &temp; -+ sp.Array = msg; -+ Error_Msg_N (sp, node); - } - - /* Similar to post_error, but NODE is the node at which to post the error and -@@ -9281,7 +9281,7 @@ - post_error_ne (const char *msg, Node_Id node, Entity_Id ent) - { - String_Template temp; -- Fat_Pointer fp; -+ String_Pointer sp; - - if (No (node)) - return; -@@ -9288,9 +9288,9 @@ - - temp.Low_Bound = 1; - temp.High_Bound = strlen (msg); -- fp.Bounds = &temp; -- fp.Array = msg; -- Error_Msg_NE (fp, node, ent); -+ sp.Bounds = &temp; -+ sp.Array = msg; -+ Error_Msg_NE (sp, node, ent); - } - - /* Similar to post_error_ne, but NUM is the number to use for the '^'. */ -Index: gcc/ada/gcc-interface/misc.c -=================================================================== ---- a/src/gcc/ada/gcc-interface/misc.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/ada/gcc-interface/misc.c (.../branches/gcc-4_9-branch) -@@ -283,8 +283,8 @@ - text_info tinfo; - char *buffer, *p, *loc; - String_Template temp, temp_loc; -- Fat_Pointer fp, fp_loc; -- expanded_location s; -+ String_Pointer sp, sp_loc; -+ expanded_location xloc; - - /* Warn if plugins present. */ - warn_if_plugins (); -@@ -311,21 +311,21 @@ - - temp.Low_Bound = 1; - temp.High_Bound = p - buffer; -- fp.Bounds = &temp; -- fp.Array = buffer; -+ sp.Bounds = &temp; -+ sp.Array = buffer; - -- s = expand_location (input_location); -- if (context->show_column && s.column != 0) -- asprintf (&loc, "%s:%d:%d", s.file, s.line, s.column); -+ xloc = expand_location (input_location); -+ if (context->show_column && xloc.column != 0) -+ asprintf (&loc, "%s:%d:%d", xloc.file, xloc.line, xloc.column); - else -- asprintf (&loc, "%s:%d", s.file, s.line); -+ asprintf (&loc, "%s:%d", xloc.file, xloc.line); - temp_loc.Low_Bound = 1; - temp_loc.High_Bound = strlen (loc); -- fp_loc.Bounds = &temp_loc; -- fp_loc.Array = loc; -+ sp_loc.Bounds = &temp_loc; -+ sp_loc.Array = loc; - - Current_Error_Node = error_gnat_node; -- Compiler_Abort (fp, -1, fp_loc); -+ Compiler_Abort (sp, sp_loc, true); - } - - /* Perform all the initialization steps that are language-specific. */ -Index: gcc/ada/exp_cg.adb -=================================================================== ---- a/src/gcc/ada/exp_cg.adb (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/ada/exp_cg.adb (.../branches/gcc-4_9-branch) -@@ -6,7 +6,7 @@ - -- -- - -- B o d y -- - -- -- ---- Copyright (C) 2010-2013, Free Software Foundation, Inc. -- -+-- Copyright (C) 2010-2014, Free Software Foundation, Inc. -- - -- -- - -- GNAT is free software; you can redistribute it and/or modify it under -- - -- terms of the GNU General Public License as published by the Free Soft- -- -@@ -437,10 +437,10 @@ - if Nkind (P) = N_Subprogram_Body - and then not Acts_As_Spec (P) - then -- Get_External_Name (Corresponding_Spec (P), Has_Suffix => False); -+ Get_External_Name (Corresponding_Spec (P)); - - else -- Get_External_Name (Defining_Entity (P), Has_Suffix => False); -+ Get_External_Name (Defining_Entity (P)); - end if; - - Write_Str (Name_Buffer (1 .. Name_Len)); -Index: gcc/common/config/msp430/msp430-common.c -=================================================================== ---- a/src/gcc/common/config/msp430/msp430-common.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/common/config/msp430/msp430-common.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,91 @@ -+/* Common hooks for Texas Instruments MSP430. -+ Copyright (C) 2014 Free Software Foundation, Inc. -+ -+ This file is part of GCC. -+ -+ GCC is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3, or (at your option) -+ any later version. -+ -+ GCC is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with GCC; see the file COPYING3. If not see -+ <http://www.gnu.org/licenses/>. */ -+ -+#include "config.h" -+#include "system.h" -+#include "coretypes.h" -+#include "diagnostic-core.h" -+#include "tm.h" -+#include "common/common-target.h" -+#include "common/common-target-def.h" -+#include "opts.h" -+#include "flags.h" -+ -+/* Handle -mcpu= and -mmcu= here. We want to ensure that only one -+ of these two options - the last specified on the command line - -+ is passed on to the msp430 backend. */ -+ -+static bool -+msp430_handle_option (struct gcc_options *opts ATTRIBUTE_UNUSED, -+ struct gcc_options *opts_set ATTRIBUTE_UNUSED, -+ const struct cl_decoded_option *decoded, -+ location_t loc ATTRIBUTE_UNUSED) -+{ -+ switch (decoded->opt_index) -+ { -+ case OPT_mcpu_: -+ if (strcasecmp (decoded->arg, "msp430x") == 0 -+ || strcasecmp (decoded->arg, "msp430xv2") == 0 -+ || strcasecmp (decoded->arg, "430x") == 0 -+ || strcasecmp (decoded->arg, "430xv2") == 0) -+ { -+ target_cpu = "msp430x"; -+ target_mcu = NULL; -+ } -+ else if (strcasecmp (decoded->arg, "msp430") == 0 -+ || strcasecmp (decoded->arg, "430") == 0) -+ { -+ target_cpu = "msp430"; -+ target_mcu = NULL; -+ } -+ else -+ { -+ error ("unrecognised argument of -mcpu: %s", decoded->arg); -+ return false; -+ } -+ break; -+ -+ case OPT_mmcu_: -+ /* For backwards compatibility we recognise two generic MCU -+ 430X names. However we want to be able to generate special C -+ preprocessor defines for them, which is why we set target_mcu -+ to NULL. */ -+ if (strcasecmp (decoded->arg, "msp430") == 0) -+ { -+ target_cpu = "msp430"; -+ target_mcu = NULL; -+ } -+ else if (strcasecmp (decoded->arg, "msp430x") == 0 -+ || strcasecmp (decoded->arg, "msp430xv2") == 0) -+ { -+ target_cpu = "msp430x"; -+ target_mcu = NULL; -+ } -+ else -+ target_cpu = NULL; -+ break; -+ } -+ -+ return true; -+} -+ -+#undef TARGET_HANDLE_OPTION -+#define TARGET_HANDLE_OPTION msp430_handle_option -+ -+struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER; -Index: gcc/tree-ssa-ifcombine.c -=================================================================== ---- a/src/gcc/tree-ssa-ifcombine.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/tree-ssa-ifcombine.c (.../branches/gcc-4_9-branch) -@@ -127,7 +127,11 @@ - { - gimple stmt = gsi_stmt (gsi); - -+ if (is_gimple_debug (stmt)) -+ continue; -+ - if (gimple_has_side_effects (stmt) -+ || gimple_could_trap_p (stmt) - || gimple_vuse (stmt)) - return false; - } -@@ -229,7 +233,8 @@ - while (is_gimple_assign (stmt) - && ((CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (stmt)) - && (TYPE_PRECISION (TREE_TYPE (gimple_assign_lhs (stmt))) -- <= TYPE_PRECISION (TREE_TYPE (gimple_assign_rhs1 (stmt))))) -+ <= TYPE_PRECISION (TREE_TYPE (gimple_assign_rhs1 (stmt)))) -+ && TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME) - || gimple_assign_ssa_name_copy_p (stmt))) - stmt = SSA_NAME_DEF_STMT (gimple_assign_rhs1 (stmt)); - -Index: gcc/sel-sched-ir.c -=================================================================== ---- a/src/gcc/sel-sched-ir.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/sel-sched-ir.c (.../branches/gcc-4_9-branch) -@@ -162,7 +162,7 @@ - static void free_av_set (basic_block); - static void invalidate_av_set (basic_block); - static void extend_insn_data (void); --static void sel_init_new_insn (insn_t, int); -+static void sel_init_new_insn (insn_t, int, int = -1); - static void finish_insns (void); - - /* Various list functions. */ -@@ -4007,9 +4007,10 @@ - return seqno; - } - --/* Compute seqno for INSN by its preds or succs. */ -+/* Compute seqno for INSN by its preds or succs. Use OLD_SEQNO to compute -+ seqno in corner cases. */ - static int --get_seqno_for_a_jump (insn_t insn) -+get_seqno_for_a_jump (insn_t insn, int old_seqno) - { - int seqno; - -@@ -4065,8 +4066,16 @@ - if (seqno < 0) - seqno = get_seqno_by_succs (insn); - -+ if (seqno < 0) -+ { -+ /* The only case where this could be here legally is that the only -+ unscheduled insn was a conditional jump that got removed and turned -+ into this unconditional one. Initialize from the old seqno -+ of that jump passed down to here. */ -+ seqno = old_seqno; -+ } -+ - gcc_assert (seqno >= 0); -- - return seqno; - } - -@@ -4246,22 +4255,24 @@ - } - - /* This is used to initialize spurious jumps generated by -- sel_redirect_edge (). */ -+ sel_redirect_edge (). OLD_SEQNO is used for initializing seqnos -+ in corner cases within get_seqno_for_a_jump. */ - static void --init_simplejump_data (insn_t insn) -+init_simplejump_data (insn_t insn, int old_seqno) - { - init_expr (INSN_EXPR (insn), vinsn_create (insn, false), 0, - REG_BR_PROB_BASE, 0, 0, 0, 0, 0, 0, - vNULL, true, false, false, - false, true); -- INSN_SEQNO (insn) = get_seqno_for_a_jump (insn); -+ INSN_SEQNO (insn) = get_seqno_for_a_jump (insn, old_seqno); - init_first_time_insn_data (insn); - } - - /* Perform deferred initialization of insns. This is used to process -- a new jump that may be created by redirect_edge. */ --void --sel_init_new_insn (insn_t insn, int flags) -+ a new jump that may be created by redirect_edge. OLD_SEQNO is used -+ for initializing simplejumps in init_simplejump_data. */ -+static void -+sel_init_new_insn (insn_t insn, int flags, int old_seqno) - { - /* We create data structures for bb when the first insn is emitted in it. */ - if (INSN_P (insn) -@@ -4288,7 +4299,7 @@ - if (flags & INSN_INIT_TODO_SIMPLEJUMP) - { - extend_insn_data (); -- init_simplejump_data (insn); -+ init_simplejump_data (insn, old_seqno); - } - - gcc_assert (CONTAINING_RGN (BLOCK_NUM (insn)) -@@ -5575,8 +5586,7 @@ - } - - /* A wrapper for redirect_edge_and_branch_force, which also initializes -- data structures for possibly created bb and insns. Returns the newly -- added bb or NULL, when a bb was not needed. */ -+ data structures for possibly created bb and insns. */ - void - sel_redirect_edge_and_branch_force (edge e, basic_block to) - { -@@ -5583,6 +5593,7 @@ - basic_block jump_bb, src, orig_dest = e->dest; - int prev_max_uid; - rtx jump; -+ int old_seqno = -1; - - /* This function is now used only for bookkeeping code creation, where - we'll never get the single pred of orig_dest block and thus will not -@@ -5591,8 +5602,13 @@ - && !single_pred_p (orig_dest)); - src = e->src; - prev_max_uid = get_max_uid (); -+ /* Compute and pass old_seqno down to sel_init_new_insn only for the case -+ when the conditional jump being redirected may become unconditional. */ -+ if (any_condjump_p (BB_END (src)) -+ && INSN_SEQNO (BB_END (src)) >= 0) -+ old_seqno = INSN_SEQNO (BB_END (src)); -+ - jump_bb = redirect_edge_and_branch_force (e, to); -- - if (jump_bb != NULL) - sel_add_bb (jump_bb); - -@@ -5604,7 +5620,8 @@ - - jump = find_new_jump (src, jump_bb, prev_max_uid); - if (jump) -- sel_init_new_insn (jump, INSN_INIT_TODO_LUID | INSN_INIT_TODO_SIMPLEJUMP); -+ sel_init_new_insn (jump, INSN_INIT_TODO_LUID | INSN_INIT_TODO_SIMPLEJUMP, -+ old_seqno); - set_immediate_dominator (CDI_DOMINATORS, to, - recompute_dominator (CDI_DOMINATORS, to)); - set_immediate_dominator (CDI_DOMINATORS, orig_dest, -@@ -5623,6 +5640,7 @@ - edge redirected; - bool recompute_toporder_p = false; - bool maybe_unreachable = single_pred_p (orig_dest); -+ int old_seqno = -1; - - latch_edge_p = (pipelining_p - && current_loop_nest -@@ -5631,6 +5649,12 @@ - src = e->src; - prev_max_uid = get_max_uid (); - -+ /* Compute and pass old_seqno down to sel_init_new_insn only for the case -+ when the conditional jump being redirected may become unconditional. */ -+ if (any_condjump_p (BB_END (src)) -+ && INSN_SEQNO (BB_END (src)) >= 0) -+ old_seqno = INSN_SEQNO (BB_END (src)); -+ - redirected = redirect_edge_and_branch (e, to); - - gcc_assert (redirected && !last_added_blocks.exists ()); -@@ -5651,7 +5675,7 @@ - - jump = find_new_jump (src, NULL, prev_max_uid); - if (jump) -- sel_init_new_insn (jump, INSN_INIT_TODO_LUID | INSN_INIT_TODO_SIMPLEJUMP); -+ sel_init_new_insn (jump, INSN_INIT_TODO_LUID | INSN_INIT_TODO_SIMPLEJUMP, old_seqno); - - /* Only update dominator info when we don't have unreachable blocks. - Otherwise we'll update in maybe_tidy_empty_bb. */ -Index: gcc/asan.c -=================================================================== ---- a/src/gcc/asan.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/asan.c (.../branches/gcc-4_9-branch) -@@ -1017,8 +1017,17 @@ - base_align_bias = ((asan_frame_size + alignb - 1) - & ~(alignb - HOST_WIDE_INT_1)) - asan_frame_size; - } -+ /* Align base if target is STRICT_ALIGNMENT. */ -+ if (STRICT_ALIGNMENT) -+ base = expand_binop (Pmode, and_optab, base, -+ gen_int_mode (-((GET_MODE_ALIGNMENT (SImode) -+ << ASAN_SHADOW_SHIFT) -+ / BITS_PER_UNIT), Pmode), NULL_RTX, -+ 1, OPTAB_DIRECT); -+ - if (use_after_return_class == -1 && pbase) - emit_move_insn (pbase, base); -+ - base = expand_binop (Pmode, add_optab, base, - gen_int_mode (base_offset - base_align_bias, Pmode), - NULL_RTX, 1, OPTAB_DIRECT); -@@ -1097,6 +1106,8 @@ - && (ASAN_RED_ZONE_SIZE >> ASAN_SHADOW_SHIFT) == 4); - shadow_mem = gen_rtx_MEM (SImode, shadow_base); - set_mem_alias_set (shadow_mem, asan_shadow_set); -+ if (STRICT_ALIGNMENT) -+ set_mem_align (shadow_mem, (GET_MODE_ALIGNMENT (SImode))); - prev_offset = base_offset; - for (l = length; l; l -= 2) - { -@@ -1186,6 +1197,10 @@ - - shadow_mem = gen_rtx_MEM (BLKmode, shadow_base); - set_mem_alias_set (shadow_mem, asan_shadow_set); -+ -+ if (STRICT_ALIGNMENT) -+ set_mem_align (shadow_mem, (GET_MODE_ALIGNMENT (SImode))); -+ - prev_offset = base_offset; - last_offset = base_offset; - last_size = 0; -Index: gcc/gimple-ssa-strength-reduction.c -=================================================================== ---- a/src/gcc/gimple-ssa-strength-reduction.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/gimple-ssa-strength-reduction.c (.../branches/gcc-4_9-branch) -@@ -1114,15 +1114,18 @@ - X = Y * c - ============================ - X = (B + i') * (S * c) */ -- base = base_cand->base_expr; -- index = base_cand->index; - temp = tree_to_double_int (base_cand->stride) - * tree_to_double_int (stride_in); -- stride = double_int_to_tree (TREE_TYPE (stride_in), temp); -- ctype = base_cand->cand_type; -- if (has_single_use (base_in)) -- savings = (base_cand->dead_savings -- + stmt_cost (base_cand->cand_stmt, speed)); -+ if (double_int_fits_to_tree_p (TREE_TYPE (stride_in), temp)) -+ { -+ base = base_cand->base_expr; -+ index = base_cand->index; -+ stride = double_int_to_tree (TREE_TYPE (stride_in), temp); -+ ctype = base_cand->cand_type; -+ if (has_single_use (base_in)) -+ savings = (base_cand->dead_savings -+ + stmt_cost (base_cand->cand_stmt, speed)); -+ } - } - else if (base_cand->kind == CAND_ADD && integer_onep (base_cand->stride)) - { -Index: gcc/fortran/openmp.c -=================================================================== ---- a/src/gcc/fortran/openmp.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/openmp.c (.../branches/gcc-4_9-branch) -@@ -23,6 +23,7 @@ - #include "coretypes.h" - #include "flags.h" - #include "gfortran.h" -+#include "arith.h" - #include "match.h" - #include "parse.h" - #include "pointer-set.h" -@@ -69,19 +70,111 @@ - gfc_free_expr (c->final_expr); - gfc_free_expr (c->num_threads); - gfc_free_expr (c->chunk_size); -+ gfc_free_expr (c->safelen_expr); -+ gfc_free_expr (c->simdlen_expr); -+ gfc_free_expr (c->num_teams); -+ gfc_free_expr (c->device); -+ gfc_free_expr (c->thread_limit); -+ gfc_free_expr (c->dist_chunk_size); - for (i = 0; i < OMP_LIST_NUM; i++) -- gfc_free_namelist (c->lists[i]); -+ gfc_free_omp_namelist (c->lists[i]); - free (c); - } - -+/* Free an !$omp declare simd construct list. */ -+ -+void -+gfc_free_omp_declare_simd (gfc_omp_declare_simd *ods) -+{ -+ if (ods) -+ { -+ gfc_free_omp_clauses (ods->clauses); -+ free (ods); -+ } -+} -+ -+void -+gfc_free_omp_declare_simd_list (gfc_omp_declare_simd *list) -+{ -+ while (list) -+ { -+ gfc_omp_declare_simd *current = list; -+ list = list->next; -+ gfc_free_omp_declare_simd (current); -+ } -+} -+ -+/* Free an !$omp declare reduction. */ -+ -+void -+gfc_free_omp_udr (gfc_omp_udr *omp_udr) -+{ -+ if (omp_udr) -+ { -+ gfc_free_omp_udr (omp_udr->next); -+ gfc_free_namespace (omp_udr->combiner_ns); -+ if (omp_udr->initializer_ns) -+ gfc_free_namespace (omp_udr->initializer_ns); -+ free (omp_udr); -+ } -+} -+ -+ -+static gfc_omp_udr * -+gfc_find_omp_udr (gfc_namespace *ns, const char *name, gfc_typespec *ts) -+{ -+ gfc_symtree *st; -+ -+ if (ns == NULL) -+ ns = gfc_current_ns; -+ do -+ { -+ gfc_omp_udr *omp_udr; -+ -+ st = gfc_find_symtree (ns->omp_udr_root, name); -+ if (st != NULL) -+ for (omp_udr = st->n.omp_udr; omp_udr; omp_udr = omp_udr->next) -+ if (ts == NULL) -+ return omp_udr; -+ else if (gfc_compare_types (&omp_udr->ts, ts)) -+ { -+ if (ts->type == BT_CHARACTER) -+ { -+ if (omp_udr->ts.u.cl->length == NULL) -+ return omp_udr; -+ if (ts->u.cl->length == NULL) -+ continue; -+ if (gfc_compare_expr (omp_udr->ts.u.cl->length, -+ ts->u.cl->length, -+ INTRINSIC_EQ) != 0) -+ continue; -+ } -+ return omp_udr; -+ } -+ -+ /* Don't escape an interface block. */ -+ if (ns && !ns->has_import_set -+ && ns->proc_name && ns->proc_name->attr.if_source == IFSRC_IFBODY) -+ break; -+ -+ ns = ns->parent; -+ } -+ while (ns != NULL); -+ -+ return NULL; -+} -+ -+ - /* Match a variable/common block list and construct a namelist from it. */ - - static match --gfc_match_omp_variable_list (const char *str, gfc_namelist **list, -- bool allow_common) -+gfc_match_omp_variable_list (const char *str, gfc_omp_namelist **list, -+ bool allow_common, bool *end_colon = NULL, -+ gfc_omp_namelist ***headp = NULL, -+ bool allow_sections = false) - { -- gfc_namelist *head, *tail, *p; -- locus old_loc; -+ gfc_omp_namelist *head, *tail, *p; -+ locus old_loc, cur_loc; - char n[GFC_MAX_SYMBOL_LEN+1]; - gfc_symbol *sym; - match m; -@@ -97,12 +190,29 @@ - - for (;;) - { -+ cur_loc = gfc_current_locus; - m = gfc_match_symbol (&sym, 1); - switch (m) - { - case MATCH_YES: -+ gfc_expr *expr; -+ expr = NULL; -+ if (allow_sections && gfc_peek_ascii_char () == '(') -+ { -+ gfc_current_locus = cur_loc; -+ m = gfc_match_variable (&expr, 0); -+ switch (m) -+ { -+ case MATCH_ERROR: -+ goto cleanup; -+ case MATCH_NO: -+ goto syntax; -+ default: -+ break; -+ } -+ } - gfc_set_sym_referenced (sym); -- p = gfc_get_namelist (); -+ p = gfc_get_omp_namelist (); - if (head == NULL) - head = tail = p; - else -@@ -111,6 +221,7 @@ - tail = tail->next; - } - tail->sym = sym; -+ tail->expr = expr; - goto next_item; - case MATCH_NO: - break; -@@ -136,7 +247,7 @@ - for (sym = st->n.common->head; sym; sym = sym->common_next) - { - gfc_set_sym_referenced (sym); -- p = gfc_get_namelist (); -+ p = gfc_get_omp_namelist (); - if (head == NULL) - head = tail = p; - else -@@ -148,6 +259,11 @@ - } - - next_item: -+ if (end_colon && gfc_match_char (':') == MATCH_YES) -+ { -+ *end_colon = true; -+ break; -+ } - if (gfc_match_char (')') == MATCH_YES) - break; - if (gfc_match_char (',') != MATCH_YES) -@@ -158,6 +274,8 @@ - list = &(*list)->next; - - *list = head; -+ if (headp) -+ *headp = list; - return MATCH_YES; - - syntax: -@@ -164,37 +282,53 @@ - gfc_error ("Syntax error in OpenMP variable list at %C"); - - cleanup: -- gfc_free_namelist (head); -+ gfc_free_omp_namelist (head); - gfc_current_locus = old_loc; - return MATCH_ERROR; - } - --#define OMP_CLAUSE_PRIVATE (1 << 0) --#define OMP_CLAUSE_FIRSTPRIVATE (1 << 1) --#define OMP_CLAUSE_LASTPRIVATE (1 << 2) --#define OMP_CLAUSE_COPYPRIVATE (1 << 3) --#define OMP_CLAUSE_SHARED (1 << 4) --#define OMP_CLAUSE_COPYIN (1 << 5) --#define OMP_CLAUSE_REDUCTION (1 << 6) --#define OMP_CLAUSE_IF (1 << 7) --#define OMP_CLAUSE_NUM_THREADS (1 << 8) --#define OMP_CLAUSE_SCHEDULE (1 << 9) --#define OMP_CLAUSE_DEFAULT (1 << 10) --#define OMP_CLAUSE_ORDERED (1 << 11) --#define OMP_CLAUSE_COLLAPSE (1 << 12) --#define OMP_CLAUSE_UNTIED (1 << 13) --#define OMP_CLAUSE_FINAL (1 << 14) --#define OMP_CLAUSE_MERGEABLE (1 << 15) -+#define OMP_CLAUSE_PRIVATE (1U << 0) -+#define OMP_CLAUSE_FIRSTPRIVATE (1U << 1) -+#define OMP_CLAUSE_LASTPRIVATE (1U << 2) -+#define OMP_CLAUSE_COPYPRIVATE (1U << 3) -+#define OMP_CLAUSE_SHARED (1U << 4) -+#define OMP_CLAUSE_COPYIN (1U << 5) -+#define OMP_CLAUSE_REDUCTION (1U << 6) -+#define OMP_CLAUSE_IF (1U << 7) -+#define OMP_CLAUSE_NUM_THREADS (1U << 8) -+#define OMP_CLAUSE_SCHEDULE (1U << 9) -+#define OMP_CLAUSE_DEFAULT (1U << 10) -+#define OMP_CLAUSE_ORDERED (1U << 11) -+#define OMP_CLAUSE_COLLAPSE (1U << 12) -+#define OMP_CLAUSE_UNTIED (1U << 13) -+#define OMP_CLAUSE_FINAL (1U << 14) -+#define OMP_CLAUSE_MERGEABLE (1U << 15) -+#define OMP_CLAUSE_ALIGNED (1U << 16) -+#define OMP_CLAUSE_DEPEND (1U << 17) -+#define OMP_CLAUSE_INBRANCH (1U << 18) -+#define OMP_CLAUSE_LINEAR (1U << 19) -+#define OMP_CLAUSE_NOTINBRANCH (1U << 20) -+#define OMP_CLAUSE_PROC_BIND (1U << 21) -+#define OMP_CLAUSE_SAFELEN (1U << 22) -+#define OMP_CLAUSE_SIMDLEN (1U << 23) -+#define OMP_CLAUSE_UNIFORM (1U << 24) -+#define OMP_CLAUSE_DEVICE (1U << 25) -+#define OMP_CLAUSE_MAP (1U << 26) -+#define OMP_CLAUSE_TO (1U << 27) -+#define OMP_CLAUSE_FROM (1U << 28) -+#define OMP_CLAUSE_NUM_TEAMS (1U << 29) -+#define OMP_CLAUSE_THREAD_LIMIT (1U << 30) -+#define OMP_CLAUSE_DIST_SCHEDULE (1U << 31) - - /* Match OpenMP directive clauses. MASK is a bitmask of - clauses that are allowed for a particular directive. */ - - static match --gfc_match_omp_clauses (gfc_omp_clauses **cp, int mask) -+gfc_match_omp_clauses (gfc_omp_clauses **cp, unsigned int mask, -+ bool first = true, bool needs_space = true) - { - gfc_omp_clauses *c = gfc_get_omp_clauses (); - locus old_loc; -- bool needs_space = true, first = true; - - *cp = NULL; - while (1) -@@ -251,22 +385,30 @@ - if ((mask & OMP_CLAUSE_REDUCTION) - && gfc_match ("reduction ( ") == MATCH_YES) - { -- int reduction = OMP_LIST_NUM; -- char buffer[GFC_MAX_SYMBOL_LEN + 1]; -+ gfc_omp_reduction_op rop = OMP_REDUCTION_NONE; -+ char buffer[GFC_MAX_SYMBOL_LEN + 3]; - if (gfc_match_char ('+') == MATCH_YES) -- reduction = OMP_LIST_PLUS; -+ rop = OMP_REDUCTION_PLUS; - else if (gfc_match_char ('*') == MATCH_YES) -- reduction = OMP_LIST_MULT; -+ rop = OMP_REDUCTION_TIMES; - else if (gfc_match_char ('-') == MATCH_YES) -- reduction = OMP_LIST_SUB; -+ rop = OMP_REDUCTION_MINUS; - else if (gfc_match (".and.") == MATCH_YES) -- reduction = OMP_LIST_AND; -+ rop = OMP_REDUCTION_AND; - else if (gfc_match (".or.") == MATCH_YES) -- reduction = OMP_LIST_OR; -+ rop = OMP_REDUCTION_OR; - else if (gfc_match (".eqv.") == MATCH_YES) -- reduction = OMP_LIST_EQV; -+ rop = OMP_REDUCTION_EQV; - else if (gfc_match (".neqv.") == MATCH_YES) -- reduction = OMP_LIST_NEQV; -+ rop = OMP_REDUCTION_NEQV; -+ if (rop != OMP_REDUCTION_NONE) -+ snprintf (buffer, sizeof buffer, -+ "operator %s", gfc_op2string ((gfc_intrinsic_op) rop)); -+ else if (gfc_match_defined_op_name (buffer + 1, 1) == MATCH_YES) -+ { -+ buffer[0] = '.'; -+ strcat (buffer, "."); -+ } - else if (gfc_match_name (buffer) == MATCH_YES) - { - gfc_symbol *sym; -@@ -294,40 +436,64 @@ - || sym->attr.if_source != IFSRC_UNKNOWN - || sym == sym->ns->proc_name) - { -- gfc_error_now ("%s is not INTRINSIC procedure name " -- "at %C", buffer); - sym = NULL; -+ n = NULL; - } - else - n = sym->name; - } -- if (strcmp (n, "max") == 0) -- reduction = OMP_LIST_MAX; -+ if (n == NULL) -+ rop = OMP_REDUCTION_NONE; -+ else if (strcmp (n, "max") == 0) -+ rop = OMP_REDUCTION_MAX; - else if (strcmp (n, "min") == 0) -- reduction = OMP_LIST_MIN; -+ rop = OMP_REDUCTION_MIN; - else if (strcmp (n, "iand") == 0) -- reduction = OMP_LIST_IAND; -+ rop = OMP_REDUCTION_IAND; - else if (strcmp (n, "ior") == 0) -- reduction = OMP_LIST_IOR; -+ rop = OMP_REDUCTION_IOR; - else if (strcmp (n, "ieor") == 0) -- reduction = OMP_LIST_IEOR; -- if (reduction != OMP_LIST_NUM -+ rop = OMP_REDUCTION_IEOR; -+ if (rop != OMP_REDUCTION_NONE - && sym != NULL - && ! sym->attr.intrinsic - && ! sym->attr.use_assoc - && ((sym->attr.flavor == FL_UNKNOWN -- && !gfc_add_flavor (&sym->attr, FL_PROCEDURE, sym->name, NULL)) -+ && !gfc_add_flavor (&sym->attr, FL_PROCEDURE, -+ sym->name, NULL)) - || !gfc_add_intrinsic (&sym->attr, NULL))) -+ rop = OMP_REDUCTION_NONE; -+ } -+ gfc_omp_udr *udr = gfc_find_omp_udr (gfc_current_ns, buffer, NULL); -+ gfc_omp_namelist **head = NULL; -+ if (rop == OMP_REDUCTION_NONE && udr) -+ rop = OMP_REDUCTION_USER; -+ -+ if (gfc_match_omp_variable_list (" :", -+ &c->lists[OMP_LIST_REDUCTION], -+ false, NULL, &head) == MATCH_YES) -+ { -+ gfc_omp_namelist *n; -+ if (rop == OMP_REDUCTION_NONE) - { -- gfc_free_omp_clauses (c); -- return MATCH_ERROR; -+ n = *head; -+ *head = NULL; -+ gfc_error_now ("!$OMP DECLARE REDUCTION %s not found " -+ "at %L", buffer, &old_loc); -+ gfc_free_omp_namelist (n); - } -+ else -+ for (n = *head; n; n = n->next) -+ { -+ n->u.reduction_op = rop; -+ if (udr) -+ { -+ n->udr = gfc_get_omp_namelist_udr (); -+ n->udr->udr = udr; -+ } -+ } -+ continue; - } -- if (reduction != OMP_LIST_NUM -- && gfc_match_omp_variable_list (" :", &c->lists[reduction], -- false) -- == MATCH_YES) -- continue; - else - gfc_current_locus = old_loc; - } -@@ -419,7 +585,189 @@ - continue; - } - } -+ if ((mask & OMP_CLAUSE_INBRANCH) && !c->inbranch && !c->notinbranch -+ && gfc_match ("inbranch") == MATCH_YES) -+ { -+ c->inbranch = needs_space = true; -+ continue; -+ } -+ if ((mask & OMP_CLAUSE_NOTINBRANCH) && !c->notinbranch && !c->inbranch -+ && gfc_match ("notinbranch") == MATCH_YES) -+ { -+ c->notinbranch = needs_space = true; -+ continue; -+ } -+ if ((mask & OMP_CLAUSE_PROC_BIND) -+ && c->proc_bind == OMP_PROC_BIND_UNKNOWN) -+ { -+ if (gfc_match ("proc_bind ( master )") == MATCH_YES) -+ c->proc_bind = OMP_PROC_BIND_MASTER; -+ else if (gfc_match ("proc_bind ( spread )") == MATCH_YES) -+ c->proc_bind = OMP_PROC_BIND_SPREAD; -+ else if (gfc_match ("proc_bind ( close )") == MATCH_YES) -+ c->proc_bind = OMP_PROC_BIND_CLOSE; -+ if (c->proc_bind != OMP_PROC_BIND_UNKNOWN) -+ continue; -+ } -+ if ((mask & OMP_CLAUSE_SAFELEN) && c->safelen_expr == NULL -+ && gfc_match ("safelen ( %e )", &c->safelen_expr) == MATCH_YES) -+ continue; -+ if ((mask & OMP_CLAUSE_SIMDLEN) && c->simdlen_expr == NULL -+ && gfc_match ("simdlen ( %e )", &c->simdlen_expr) == MATCH_YES) -+ continue; -+ if ((mask & OMP_CLAUSE_UNIFORM) -+ && gfc_match_omp_variable_list ("uniform (", -+ &c->lists[OMP_LIST_UNIFORM], false) -+ == MATCH_YES) -+ continue; -+ bool end_colon = false; -+ gfc_omp_namelist **head = NULL; -+ old_loc = gfc_current_locus; -+ if ((mask & OMP_CLAUSE_ALIGNED) -+ && gfc_match_omp_variable_list ("aligned (", -+ &c->lists[OMP_LIST_ALIGNED], false, -+ &end_colon, &head) -+ == MATCH_YES) -+ { -+ gfc_expr *alignment = NULL; -+ gfc_omp_namelist *n; - -+ if (end_colon -+ && gfc_match (" %e )", &alignment) != MATCH_YES) -+ { -+ gfc_free_omp_namelist (*head); -+ gfc_current_locus = old_loc; -+ *head = NULL; -+ break; -+ } -+ for (n = *head; n; n = n->next) -+ if (n->next && alignment) -+ n->expr = gfc_copy_expr (alignment); -+ else -+ n->expr = alignment; -+ continue; -+ } -+ end_colon = false; -+ head = NULL; -+ old_loc = gfc_current_locus; -+ if ((mask & OMP_CLAUSE_LINEAR) -+ && gfc_match_omp_variable_list ("linear (", -+ &c->lists[OMP_LIST_LINEAR], false, -+ &end_colon, &head) -+ == MATCH_YES) -+ { -+ gfc_expr *step = NULL; -+ -+ if (end_colon -+ && gfc_match (" %e )", &step) != MATCH_YES) -+ { -+ gfc_free_omp_namelist (*head); -+ gfc_current_locus = old_loc; -+ *head = NULL; -+ break; -+ } -+ else if (!end_colon) -+ { -+ step = gfc_get_constant_expr (BT_INTEGER, -+ gfc_default_integer_kind, -+ &old_loc); -+ mpz_set_si (step->value.integer, 1); -+ } -+ (*head)->expr = step; -+ continue; -+ } -+ if ((mask & OMP_CLAUSE_DEPEND) -+ && gfc_match ("depend ( ") == MATCH_YES) -+ { -+ match m = MATCH_YES; -+ gfc_omp_depend_op depend_op = OMP_DEPEND_OUT; -+ if (gfc_match ("inout") == MATCH_YES) -+ depend_op = OMP_DEPEND_INOUT; -+ else if (gfc_match ("in") == MATCH_YES) -+ depend_op = OMP_DEPEND_IN; -+ else if (gfc_match ("out") == MATCH_YES) -+ depend_op = OMP_DEPEND_OUT; -+ else -+ m = MATCH_NO; -+ head = NULL; -+ if (m == MATCH_YES -+ && gfc_match_omp_variable_list (" : ", -+ &c->lists[OMP_LIST_DEPEND], -+ false, NULL, &head, true) -+ == MATCH_YES) -+ { -+ gfc_omp_namelist *n; -+ for (n = *head; n; n = n->next) -+ n->u.depend_op = depend_op; -+ continue; -+ } -+ else -+ gfc_current_locus = old_loc; -+ } -+ if ((mask & OMP_CLAUSE_DIST_SCHEDULE) -+ && c->dist_sched_kind == OMP_SCHED_NONE -+ && gfc_match ("dist_schedule ( static") == MATCH_YES) -+ { -+ match m = MATCH_NO; -+ c->dist_sched_kind = OMP_SCHED_STATIC; -+ m = gfc_match (" , %e )", &c->dist_chunk_size); -+ if (m != MATCH_YES) -+ m = gfc_match_char (')'); -+ if (m != MATCH_YES) -+ { -+ c->dist_sched_kind = OMP_SCHED_NONE; -+ gfc_current_locus = old_loc; -+ } -+ else -+ continue; -+ } -+ if ((mask & OMP_CLAUSE_NUM_TEAMS) && c->num_teams == NULL -+ && gfc_match ("num_teams ( %e )", &c->num_teams) == MATCH_YES) -+ continue; -+ if ((mask & OMP_CLAUSE_DEVICE) && c->device == NULL -+ && gfc_match ("device ( %e )", &c->device) == MATCH_YES) -+ continue; -+ if ((mask & OMP_CLAUSE_THREAD_LIMIT) && c->thread_limit == NULL -+ && gfc_match ("thread_limit ( %e )", &c->thread_limit) == MATCH_YES) -+ continue; -+ if ((mask & OMP_CLAUSE_MAP) -+ && gfc_match ("map ( ") == MATCH_YES) -+ { -+ gfc_omp_map_op map_op = OMP_MAP_TOFROM; -+ if (gfc_match ("alloc : ") == MATCH_YES) -+ map_op = OMP_MAP_ALLOC; -+ else if (gfc_match ("tofrom : ") == MATCH_YES) -+ map_op = OMP_MAP_TOFROM; -+ else if (gfc_match ("to : ") == MATCH_YES) -+ map_op = OMP_MAP_TO; -+ else if (gfc_match ("from : ") == MATCH_YES) -+ map_op = OMP_MAP_FROM; -+ head = NULL; -+ if (gfc_match_omp_variable_list ("", &c->lists[OMP_LIST_MAP], -+ false, NULL, &head, true) -+ == MATCH_YES) -+ { -+ gfc_omp_namelist *n; -+ for (n = *head; n; n = n->next) -+ n->u.map_op = map_op; -+ continue; -+ } -+ else -+ gfc_current_locus = old_loc; -+ } -+ if ((mask & OMP_CLAUSE_TO) -+ && gfc_match_omp_variable_list ("to (", -+ &c->lists[OMP_LIST_TO], false, -+ NULL, &head, true) -+ == MATCH_YES) -+ continue; -+ if ((mask & OMP_CLAUSE_FROM) -+ && gfc_match_omp_variable_list ("from (", -+ &c->lists[OMP_LIST_FROM], false, -+ NULL, &head, true) -+ == MATCH_YES) -+ continue; -+ - break; - } - -@@ -436,7 +784,10 @@ - #define OMP_PARALLEL_CLAUSES \ - (OMP_CLAUSE_PRIVATE | OMP_CLAUSE_FIRSTPRIVATE | OMP_CLAUSE_SHARED \ - | OMP_CLAUSE_COPYIN | OMP_CLAUSE_REDUCTION | OMP_CLAUSE_IF \ -- | OMP_CLAUSE_NUM_THREADS | OMP_CLAUSE_DEFAULT) -+ | OMP_CLAUSE_NUM_THREADS | OMP_CLAUSE_DEFAULT | OMP_CLAUSE_PROC_BIND) -+#define OMP_DECLARE_SIMD_CLAUSES \ -+ (OMP_CLAUSE_SIMDLEN | OMP_CLAUSE_LINEAR | OMP_CLAUSE_UNIFORM \ -+ | OMP_CLAUSE_ALIGNED | OMP_CLAUSE_INBRANCH | OMP_CLAUSE_NOTINBRANCH) - #define OMP_DO_CLAUSES \ - (OMP_CLAUSE_PRIVATE | OMP_CLAUSE_FIRSTPRIVATE \ - | OMP_CLAUSE_LASTPRIVATE | OMP_CLAUSE_REDUCTION \ -@@ -444,18 +795,36 @@ - #define OMP_SECTIONS_CLAUSES \ - (OMP_CLAUSE_PRIVATE | OMP_CLAUSE_FIRSTPRIVATE \ - | OMP_CLAUSE_LASTPRIVATE | OMP_CLAUSE_REDUCTION) -+#define OMP_SIMD_CLAUSES \ -+ (OMP_CLAUSE_PRIVATE | OMP_CLAUSE_LASTPRIVATE | OMP_CLAUSE_REDUCTION \ -+ | OMP_CLAUSE_COLLAPSE | OMP_CLAUSE_SAFELEN | OMP_CLAUSE_LINEAR \ -+ | OMP_CLAUSE_ALIGNED) - #define OMP_TASK_CLAUSES \ - (OMP_CLAUSE_PRIVATE | OMP_CLAUSE_FIRSTPRIVATE | OMP_CLAUSE_SHARED \ - | OMP_CLAUSE_IF | OMP_CLAUSE_DEFAULT | OMP_CLAUSE_UNTIED \ -- | OMP_CLAUSE_FINAL | OMP_CLAUSE_MERGEABLE) -+ | OMP_CLAUSE_FINAL | OMP_CLAUSE_MERGEABLE | OMP_CLAUSE_DEPEND) -+#define OMP_TARGET_CLAUSES \ -+ (OMP_CLAUSE_DEVICE | OMP_CLAUSE_MAP | OMP_CLAUSE_IF) -+#define OMP_TARGET_DATA_CLAUSES \ -+ (OMP_CLAUSE_DEVICE | OMP_CLAUSE_MAP | OMP_CLAUSE_IF) -+#define OMP_TARGET_UPDATE_CLAUSES \ -+ (OMP_CLAUSE_DEVICE | OMP_CLAUSE_IF | OMP_CLAUSE_TO | OMP_CLAUSE_FROM) -+#define OMP_TEAMS_CLAUSES \ -+ (OMP_CLAUSE_NUM_TEAMS | OMP_CLAUSE_THREAD_LIMIT | OMP_CLAUSE_DEFAULT \ -+ | OMP_CLAUSE_PRIVATE | OMP_CLAUSE_FIRSTPRIVATE | OMP_CLAUSE_SHARED \ -+ | OMP_CLAUSE_REDUCTION) -+#define OMP_DISTRIBUTE_CLAUSES \ -+ (OMP_CLAUSE_PRIVATE | OMP_CLAUSE_FIRSTPRIVATE | OMP_CLAUSE_COLLAPSE \ -+ | OMP_CLAUSE_DIST_SCHEDULE) - --match --gfc_match_omp_parallel (void) -+ -+static match -+match_omp (gfc_exec_op op, unsigned int mask) - { - gfc_omp_clauses *c; -- if (gfc_match_omp_clauses (&c, OMP_PARALLEL_CLAUSES) != MATCH_YES) -+ if (gfc_match_omp_clauses (&c, mask) != MATCH_YES) - return MATCH_ERROR; -- new_st.op = EXEC_OMP_PARALLEL; -+ new_st.op = op; - new_st.ext.omp_clauses = c; - return MATCH_YES; - } -@@ -462,89 +831,597 @@ - - - match --gfc_match_omp_task (void) -+gfc_match_omp_critical (void) - { -- gfc_omp_clauses *c; -- if (gfc_match_omp_clauses (&c, OMP_TASK_CLAUSES) != MATCH_YES) -- return MATCH_ERROR; -- new_st.op = EXEC_OMP_TASK; -- new_st.ext.omp_clauses = c; -- return MATCH_YES; --} -+ char n[GFC_MAX_SYMBOL_LEN+1]; - -- --match --gfc_match_omp_taskwait (void) --{ -+ if (gfc_match (" ( %n )", n) != MATCH_YES) -+ n[0] = '\0'; - if (gfc_match_omp_eos () != MATCH_YES) - { -- gfc_error ("Unexpected junk after TASKWAIT clause at %C"); -+ gfc_error ("Unexpected junk after $OMP CRITICAL statement at %C"); - return MATCH_ERROR; - } -- new_st.op = EXEC_OMP_TASKWAIT; -- new_st.ext.omp_clauses = NULL; -+ new_st.op = EXEC_OMP_CRITICAL; -+ new_st.ext.omp_name = n[0] ? xstrdup (n) : NULL; - return MATCH_YES; - } - - - match --gfc_match_omp_taskyield (void) -+gfc_match_omp_distribute (void) - { -- if (gfc_match_omp_eos () != MATCH_YES) -- { -- gfc_error ("Unexpected junk after TASKYIELD clause at %C"); -- return MATCH_ERROR; -- } -- new_st.op = EXEC_OMP_TASKYIELD; -- new_st.ext.omp_clauses = NULL; -- return MATCH_YES; -+ return match_omp (EXEC_OMP_DISTRIBUTE, OMP_DISTRIBUTE_CLAUSES); - } - - - match --gfc_match_omp_critical (void) -+gfc_match_omp_distribute_parallel_do (void) - { -- char n[GFC_MAX_SYMBOL_LEN+1]; -+ return match_omp (EXEC_OMP_DISTRIBUTE_PARALLEL_DO, -+ OMP_DISTRIBUTE_CLAUSES | OMP_PARALLEL_CLAUSES -+ | OMP_DO_CLAUSES); -+} - -- if (gfc_match (" ( %n )", n) != MATCH_YES) -- n[0] = '\0'; -+ -+match -+gfc_match_omp_distribute_parallel_do_simd (void) -+{ -+ return match_omp (EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD, -+ (OMP_DISTRIBUTE_CLAUSES | OMP_PARALLEL_CLAUSES -+ | OMP_DO_CLAUSES | OMP_SIMD_CLAUSES) -+ & ~OMP_CLAUSE_ORDERED); -+} -+ -+ -+match -+gfc_match_omp_distribute_simd (void) -+{ -+ return match_omp (EXEC_OMP_DISTRIBUTE_SIMD, -+ OMP_DISTRIBUTE_CLAUSES | OMP_SIMD_CLAUSES); -+} -+ -+ -+match -+gfc_match_omp_do (void) -+{ -+ return match_omp (EXEC_OMP_DO, OMP_DO_CLAUSES); -+} -+ -+ -+match -+gfc_match_omp_do_simd (void) -+{ -+ return match_omp (EXEC_OMP_DO_SIMD, ((OMP_DO_CLAUSES | OMP_SIMD_CLAUSES) -+ & ~OMP_CLAUSE_ORDERED)); -+} -+ -+ -+match -+gfc_match_omp_flush (void) -+{ -+ gfc_omp_namelist *list = NULL; -+ gfc_match_omp_variable_list (" (", &list, true); - if (gfc_match_omp_eos () != MATCH_YES) - { -- gfc_error ("Unexpected junk after $OMP CRITICAL statement at %C"); -+ gfc_error ("Unexpected junk after $OMP FLUSH statement at %C"); -+ gfc_free_omp_namelist (list); - return MATCH_ERROR; - } -- new_st.op = EXEC_OMP_CRITICAL; -- new_st.ext.omp_name = n[0] ? xstrdup (n) : NULL; -+ new_st.op = EXEC_OMP_FLUSH; -+ new_st.ext.omp_namelist = list; - return MATCH_YES; - } - - - match --gfc_match_omp_do (void) -+gfc_match_omp_declare_simd (void) - { -+ locus where = gfc_current_locus; -+ gfc_symbol *proc_name; - gfc_omp_clauses *c; -- if (gfc_match_omp_clauses (&c, OMP_DO_CLAUSES) != MATCH_YES) -+ gfc_omp_declare_simd *ods; -+ -+ if (gfc_match (" ( %s ) ", &proc_name) != MATCH_YES) - return MATCH_ERROR; -- new_st.op = EXEC_OMP_DO; -- new_st.ext.omp_clauses = c; -+ -+ if (gfc_match_omp_clauses (&c, OMP_DECLARE_SIMD_CLAUSES, true, -+ false) != MATCH_YES) -+ return MATCH_ERROR; -+ -+ ods = gfc_get_omp_declare_simd (); -+ ods->where = where; -+ ods->proc_name = proc_name; -+ ods->clauses = c; -+ ods->next = gfc_current_ns->omp_declare_simd; -+ gfc_current_ns->omp_declare_simd = ods; - return MATCH_YES; - } - - -+static bool -+match_udr_expr (gfc_symtree *omp_sym1, gfc_symtree *omp_sym2) -+{ -+ match m; -+ locus old_loc = gfc_current_locus; -+ char sname[GFC_MAX_SYMBOL_LEN + 1]; -+ gfc_symbol *sym; -+ gfc_namespace *ns = gfc_current_ns; -+ gfc_expr *lvalue = NULL, *rvalue = NULL; -+ gfc_symtree *st; -+ gfc_actual_arglist *arglist; -+ -+ m = gfc_match (" %v =", &lvalue); -+ if (m != MATCH_YES) -+ gfc_current_locus = old_loc; -+ else -+ { -+ m = gfc_match (" %e )", &rvalue); -+ if (m == MATCH_YES) -+ { -+ ns->code = gfc_get_code (EXEC_ASSIGN); -+ ns->code->expr1 = lvalue; -+ ns->code->expr2 = rvalue; -+ ns->code->loc = old_loc; -+ return true; -+ } -+ -+ gfc_current_locus = old_loc; -+ gfc_free_expr (lvalue); -+ } -+ -+ m = gfc_match (" %n", sname); -+ if (m != MATCH_YES) -+ return false; -+ -+ if (strcmp (sname, omp_sym1->name) == 0 -+ || strcmp (sname, omp_sym2->name) == 0) -+ return false; -+ -+ gfc_current_ns = ns->parent; -+ if (gfc_get_ha_sym_tree (sname, &st)) -+ return false; -+ -+ sym = st->n.sym; -+ if (sym->attr.flavor != FL_PROCEDURE -+ && sym->attr.flavor != FL_UNKNOWN) -+ return false; -+ -+ if (!sym->attr.generic -+ && !sym->attr.subroutine -+ && !sym->attr.function) -+ { -+ if (!(sym->attr.external && !sym->attr.referenced)) -+ { -+ /* ...create a symbol in this scope... */ -+ if (sym->ns != gfc_current_ns -+ && gfc_get_sym_tree (sname, NULL, &st, false) == 1) -+ return false; -+ -+ if (sym != st->n.sym) -+ sym = st->n.sym; -+ } -+ -+ /* ...and then to try to make the symbol into a subroutine. */ -+ if (!gfc_add_subroutine (&sym->attr, sym->name, NULL)) -+ return false; -+ } -+ -+ gfc_set_sym_referenced (sym); -+ gfc_gobble_whitespace (); -+ if (gfc_peek_ascii_char () != '(') -+ return false; -+ -+ gfc_current_ns = ns; -+ m = gfc_match_actual_arglist (1, &arglist); -+ if (m != MATCH_YES) -+ return false; -+ -+ if (gfc_match_char (')') != MATCH_YES) -+ return false; -+ -+ ns->code = gfc_get_code (EXEC_CALL); -+ ns->code->symtree = st; -+ ns->code->ext.actual = arglist; -+ ns->code->loc = old_loc; -+ return true; -+} -+ -+static bool -+gfc_omp_udr_predef (gfc_omp_reduction_op rop, const char *name, -+ gfc_typespec *ts, const char **n) -+{ -+ if (!gfc_numeric_ts (ts) && ts->type != BT_LOGICAL) -+ return false; -+ -+ switch (rop) -+ { -+ case OMP_REDUCTION_PLUS: -+ case OMP_REDUCTION_MINUS: -+ case OMP_REDUCTION_TIMES: -+ return ts->type != BT_LOGICAL; -+ case OMP_REDUCTION_AND: -+ case OMP_REDUCTION_OR: -+ case OMP_REDUCTION_EQV: -+ case OMP_REDUCTION_NEQV: -+ return ts->type == BT_LOGICAL; -+ case OMP_REDUCTION_USER: -+ if (name[0] != '.' && (ts->type == BT_INTEGER || ts->type == BT_REAL)) -+ { -+ gfc_symbol *sym; -+ -+ gfc_find_symbol (name, NULL, 1, &sym); -+ if (sym != NULL) -+ { -+ if (sym->attr.intrinsic) -+ *n = sym->name; -+ else if ((sym->attr.flavor != FL_UNKNOWN -+ && sym->attr.flavor != FL_PROCEDURE) -+ || sym->attr.external -+ || sym->attr.generic -+ || sym->attr.entry -+ || sym->attr.result -+ || sym->attr.dummy -+ || sym->attr.subroutine -+ || sym->attr.pointer -+ || sym->attr.target -+ || sym->attr.cray_pointer -+ || sym->attr.cray_pointee -+ || (sym->attr.proc != PROC_UNKNOWN -+ && sym->attr.proc != PROC_INTRINSIC) -+ || sym->attr.if_source != IFSRC_UNKNOWN -+ || sym == sym->ns->proc_name) -+ *n = NULL; -+ else -+ *n = sym->name; -+ } -+ else -+ *n = name; -+ if (*n -+ && (strcmp (*n, "max") == 0 || strcmp (*n, "min") == 0)) -+ return true; -+ else if (*n -+ && ts->type == BT_INTEGER -+ && (strcmp (*n, "iand") == 0 -+ || strcmp (*n, "ior") == 0 -+ || strcmp (*n, "ieor") == 0)) -+ return true; -+ } -+ break; -+ default: -+ break; -+ } -+ return false; -+} -+ -+gfc_omp_udr * -+gfc_omp_udr_find (gfc_symtree *st, gfc_typespec *ts) -+{ -+ gfc_omp_udr *omp_udr; -+ -+ if (st == NULL) -+ return NULL; -+ -+ for (omp_udr = st->n.omp_udr; omp_udr; omp_udr = omp_udr->next) -+ if (omp_udr->ts.type == ts->type -+ || ((omp_udr->ts.type == BT_DERIVED || omp_udr->ts.type == BT_CLASS) -+ && (ts->type == BT_DERIVED && ts->type == BT_CLASS))) -+ { -+ if (omp_udr->ts.type == BT_DERIVED || omp_udr->ts.type == BT_CLASS) -+ { -+ if (strcmp (omp_udr->ts.u.derived->name, ts->u.derived->name) == 0) -+ return omp_udr; -+ } -+ else if (omp_udr->ts.kind == ts->kind) -+ { -+ if (omp_udr->ts.type == BT_CHARACTER) -+ { -+ if (omp_udr->ts.u.cl->length == NULL -+ || ts->u.cl->length == NULL) -+ return omp_udr; -+ if (omp_udr->ts.u.cl->length->expr_type != EXPR_CONSTANT) -+ return omp_udr; -+ if (ts->u.cl->length->expr_type != EXPR_CONSTANT) -+ return omp_udr; -+ if (omp_udr->ts.u.cl->length->ts.type != BT_INTEGER) -+ return omp_udr; -+ if (ts->u.cl->length->ts.type != BT_INTEGER) -+ return omp_udr; -+ if (gfc_compare_expr (omp_udr->ts.u.cl->length, -+ ts->u.cl->length, INTRINSIC_EQ) != 0) -+ continue; -+ } -+ return omp_udr; -+ } -+ } -+ return NULL; -+} -+ - match --gfc_match_omp_flush (void) -+gfc_match_omp_declare_reduction (void) - { -- gfc_namelist *list = NULL; -- gfc_match_omp_variable_list (" (", &list, true); -+ match m; -+ gfc_intrinsic_op op; -+ char name[GFC_MAX_SYMBOL_LEN + 3]; -+ auto_vec<gfc_typespec, 5> tss; -+ gfc_typespec ts; -+ unsigned int i; -+ gfc_symtree *st; -+ locus where = gfc_current_locus; -+ locus end_loc = gfc_current_locus; -+ bool end_loc_set = false; -+ gfc_omp_reduction_op rop = OMP_REDUCTION_NONE; -+ -+ if (gfc_match_char ('(') != MATCH_YES) -+ return MATCH_ERROR; -+ -+ m = gfc_match (" %o : ", &op); -+ if (m == MATCH_ERROR) -+ return MATCH_ERROR; -+ if (m == MATCH_YES) -+ { -+ snprintf (name, sizeof name, "operator %s", gfc_op2string (op)); -+ rop = (gfc_omp_reduction_op) op; -+ } -+ else -+ { -+ m = gfc_match_defined_op_name (name + 1, 1); -+ if (m == MATCH_ERROR) -+ return MATCH_ERROR; -+ if (m == MATCH_YES) -+ { -+ name[0] = '.'; -+ strcat (name, "."); -+ if (gfc_match (" : ") != MATCH_YES) -+ return MATCH_ERROR; -+ } -+ else -+ { -+ if (gfc_match (" %n : ", name) != MATCH_YES) -+ return MATCH_ERROR; -+ } -+ rop = OMP_REDUCTION_USER; -+ } -+ -+ m = gfc_match_type_spec (&ts); -+ if (m != MATCH_YES) -+ return MATCH_ERROR; -+ /* Treat len=: the same as len=*. */ -+ if (ts.type == BT_CHARACTER) -+ ts.deferred = false; -+ tss.safe_push (ts); -+ -+ while (gfc_match_char (',') == MATCH_YES) -+ { -+ m = gfc_match_type_spec (&ts); -+ if (m != MATCH_YES) -+ return MATCH_ERROR; -+ tss.safe_push (ts); -+ } -+ if (gfc_match_char (':') != MATCH_YES) -+ return MATCH_ERROR; -+ -+ st = gfc_find_symtree (gfc_current_ns->omp_udr_root, name); -+ for (i = 0; i < tss.length (); i++) -+ { -+ gfc_symtree *omp_out, *omp_in; -+ gfc_symtree *omp_priv = NULL, *omp_orig = NULL; -+ gfc_namespace *combiner_ns, *initializer_ns = NULL; -+ gfc_omp_udr *prev_udr, *omp_udr; -+ const char *predef_name = NULL; -+ -+ omp_udr = gfc_get_omp_udr (); -+ omp_udr->name = gfc_get_string (name); -+ omp_udr->rop = rop; -+ omp_udr->ts = tss[i]; -+ omp_udr->where = where; -+ -+ gfc_current_ns = combiner_ns = gfc_get_namespace (gfc_current_ns, 1); -+ combiner_ns->proc_name = combiner_ns->parent->proc_name; -+ -+ gfc_get_sym_tree ("omp_out", combiner_ns, &omp_out, false); -+ gfc_get_sym_tree ("omp_in", combiner_ns, &omp_in, false); -+ combiner_ns->omp_udr_ns = 1; -+ omp_out->n.sym->ts = tss[i]; -+ omp_in->n.sym->ts = tss[i]; -+ omp_out->n.sym->attr.omp_udr_artificial_var = 1; -+ omp_in->n.sym->attr.omp_udr_artificial_var = 1; -+ omp_out->n.sym->attr.flavor = FL_VARIABLE; -+ omp_in->n.sym->attr.flavor = FL_VARIABLE; -+ gfc_commit_symbols (); -+ omp_udr->combiner_ns = combiner_ns; -+ omp_udr->omp_out = omp_out->n.sym; -+ omp_udr->omp_in = omp_in->n.sym; -+ -+ locus old_loc = gfc_current_locus; -+ -+ if (!match_udr_expr (omp_out, omp_in)) -+ { -+ syntax: -+ gfc_current_locus = old_loc; -+ gfc_current_ns = combiner_ns->parent; -+ gfc_free_omp_udr (omp_udr); -+ return MATCH_ERROR; -+ } -+ -+ if (gfc_match (" initializer ( ") == MATCH_YES) -+ { -+ gfc_current_ns = combiner_ns->parent; -+ initializer_ns = gfc_get_namespace (gfc_current_ns, 1); -+ gfc_current_ns = initializer_ns; -+ initializer_ns->proc_name = initializer_ns->parent->proc_name; -+ -+ gfc_get_sym_tree ("omp_priv", initializer_ns, &omp_priv, false); -+ gfc_get_sym_tree ("omp_orig", initializer_ns, &omp_orig, false); -+ initializer_ns->omp_udr_ns = 1; -+ omp_priv->n.sym->ts = tss[i]; -+ omp_orig->n.sym->ts = tss[i]; -+ omp_priv->n.sym->attr.omp_udr_artificial_var = 1; -+ omp_orig->n.sym->attr.omp_udr_artificial_var = 1; -+ omp_priv->n.sym->attr.flavor = FL_VARIABLE; -+ omp_orig->n.sym->attr.flavor = FL_VARIABLE; -+ gfc_commit_symbols (); -+ omp_udr->initializer_ns = initializer_ns; -+ omp_udr->omp_priv = omp_priv->n.sym; -+ omp_udr->omp_orig = omp_orig->n.sym; -+ -+ if (!match_udr_expr (omp_priv, omp_orig)) -+ goto syntax; -+ } -+ -+ gfc_current_ns = combiner_ns->parent; -+ if (!end_loc_set) -+ { -+ end_loc_set = true; -+ end_loc = gfc_current_locus; -+ } -+ gfc_current_locus = old_loc; -+ -+ prev_udr = gfc_omp_udr_find (st, &tss[i]); -+ if (gfc_omp_udr_predef (rop, name, &tss[i], &predef_name) -+ /* Don't error on !$omp declare reduction (min : integer : ...) -+ just yet, there could be integer :: min afterwards, -+ making it valid. When the UDR is resolved, we'll get -+ to it again. */ -+ && (rop != OMP_REDUCTION_USER || name[0] == '.')) -+ { -+ if (predef_name) -+ gfc_error_now ("Redefinition of predefined %s " -+ "!$OMP DECLARE REDUCTION at %L", -+ predef_name, &where); -+ else -+ gfc_error_now ("Redefinition of predefined " -+ "!$OMP DECLARE REDUCTION at %L", &where); -+ } -+ else if (prev_udr) -+ { -+ gfc_error_now ("Redefinition of !$OMP DECLARE REDUCTION at %L", -+ &where); -+ gfc_error_now ("Previous !$OMP DECLARE REDUCTION at %L", -+ &prev_udr->where); -+ } -+ else if (st) -+ { -+ omp_udr->next = st->n.omp_udr; -+ st->n.omp_udr = omp_udr; -+ } -+ else -+ { -+ st = gfc_new_symtree (&gfc_current_ns->omp_udr_root, name); -+ st->n.omp_udr = omp_udr; -+ } -+ } -+ -+ if (end_loc_set) -+ { -+ gfc_current_locus = end_loc; -+ if (gfc_match_omp_eos () != MATCH_YES) -+ { -+ gfc_error ("Unexpected junk after !$OMP DECLARE REDUCTION at %C"); -+ gfc_current_locus = where; -+ return MATCH_ERROR; -+ } -+ -+ return MATCH_YES; -+ } -+ gfc_clear_error (); -+ return MATCH_ERROR; -+} -+ -+ -+match -+gfc_match_omp_declare_target (void) -+{ -+ locus old_loc; -+ char n[GFC_MAX_SYMBOL_LEN+1]; -+ gfc_symbol *sym; -+ match m; -+ gfc_symtree *st; -+ -+ old_loc = gfc_current_locus; -+ -+ m = gfc_match (" ("); -+ -+ if (gfc_current_ns->proc_name -+ && gfc_current_ns->proc_name->attr.if_source == IFSRC_IFBODY -+ && m == MATCH_YES) -+ { -+ gfc_error ("Only the !$OMP DECLARE TARGET form without " -+ "list is allowed in interface block at %C"); -+ goto cleanup; -+ } -+ -+ if (m == MATCH_NO -+ && gfc_current_ns->proc_name -+ && gfc_match_omp_eos () == MATCH_YES) -+ { -+ if (!gfc_add_omp_declare_target (&gfc_current_ns->proc_name->attr, -+ gfc_current_ns->proc_name->name, -+ &old_loc)) -+ goto cleanup; -+ return MATCH_YES; -+ } -+ -+ if (m != MATCH_YES) -+ return m; -+ -+ for (;;) -+ { -+ m = gfc_match_symbol (&sym, 0); -+ switch (m) -+ { -+ case MATCH_YES: -+ if (sym->attr.in_common) -+ gfc_error_now ("OMP DECLARE TARGET on a variable at %C is an " -+ "element of a COMMON block"); -+ else if (!gfc_add_omp_declare_target (&sym->attr, sym->name, -+ &sym->declared_at)) -+ goto cleanup; -+ goto next_item; -+ case MATCH_NO: -+ break; -+ case MATCH_ERROR: -+ goto cleanup; -+ } -+ -+ m = gfc_match (" / %n /", n); -+ if (m == MATCH_ERROR) -+ goto cleanup; -+ if (m == MATCH_NO || n[0] == '\0') -+ goto syntax; -+ -+ st = gfc_find_symtree (gfc_current_ns->common_root, n); -+ if (st == NULL) -+ { -+ gfc_error ("COMMON block /%s/ not found at %C", n); -+ goto cleanup; -+ } -+ st->n.common->omp_declare_target = 1; -+ for (sym = st->n.common->head; sym; sym = sym->common_next) -+ if (!gfc_add_omp_declare_target (&sym->attr, sym->name, -+ &sym->declared_at)) -+ goto cleanup; -+ -+ next_item: -+ if (gfc_match_char (')') == MATCH_YES) -+ break; -+ if (gfc_match_char (',') != MATCH_YES) -+ goto syntax; -+ } -+ - if (gfc_match_omp_eos () != MATCH_YES) - { -- gfc_error ("Unexpected junk after $OMP FLUSH statement at %C"); -- gfc_free_namelist (list); -- return MATCH_ERROR; -+ gfc_error ("Unexpected junk after !$OMP DECLARE TARGET at %C"); -+ goto cleanup; - } -- new_st.op = EXEC_OMP_FLUSH; -- new_st.ext.omp_namelist = list; - return MATCH_YES; -+ -+syntax: -+ gfc_error ("Syntax error in !$OMP DECLARE TARGET list at %C"); -+ -+cleanup: -+ gfc_current_locus = old_loc; -+ return MATCH_ERROR; - } - - -@@ -605,6 +1482,12 @@ - goto syntax; - } - -+ if (gfc_match_omp_eos () != MATCH_YES) -+ { -+ gfc_error ("Unexpected junk after OMP THREADPRIVATE at %C"); -+ goto cleanup; -+ } -+ - return MATCH_YES; - - syntax: -@@ -617,28 +1500,34 @@ - - - match -+gfc_match_omp_parallel (void) -+{ -+ return match_omp (EXEC_OMP_PARALLEL, OMP_PARALLEL_CLAUSES); -+} -+ -+ -+match - gfc_match_omp_parallel_do (void) - { -- gfc_omp_clauses *c; -- if (gfc_match_omp_clauses (&c, OMP_PARALLEL_CLAUSES | OMP_DO_CLAUSES) -- != MATCH_YES) -- return MATCH_ERROR; -- new_st.op = EXEC_OMP_PARALLEL_DO; -- new_st.ext.omp_clauses = c; -- return MATCH_YES; -+ return match_omp (EXEC_OMP_PARALLEL_DO, -+ OMP_PARALLEL_CLAUSES | OMP_DO_CLAUSES); - } - - - match -+gfc_match_omp_parallel_do_simd (void) -+{ -+ return match_omp (EXEC_OMP_PARALLEL_DO_SIMD, -+ (OMP_PARALLEL_CLAUSES | OMP_DO_CLAUSES | OMP_SIMD_CLAUSES) -+ & ~OMP_CLAUSE_ORDERED); -+} -+ -+ -+match - gfc_match_omp_parallel_sections (void) - { -- gfc_omp_clauses *c; -- if (gfc_match_omp_clauses (&c, OMP_PARALLEL_CLAUSES | OMP_SECTIONS_CLAUSES) -- != MATCH_YES) -- return MATCH_ERROR; -- new_st.op = EXEC_OMP_PARALLEL_SECTIONS; -- new_st.ext.omp_clauses = c; -- return MATCH_YES; -+ return match_omp (EXEC_OMP_PARALLEL_SECTIONS, -+ OMP_PARALLEL_CLAUSES | OMP_SECTIONS_CLAUSES); - } - - -@@ -645,12 +1534,7 @@ - match - gfc_match_omp_parallel_workshare (void) - { -- gfc_omp_clauses *c; -- if (gfc_match_omp_clauses (&c, OMP_PARALLEL_CLAUSES) != MATCH_YES) -- return MATCH_ERROR; -- new_st.op = EXEC_OMP_PARALLEL_WORKSHARE; -- new_st.ext.omp_clauses = c; -- return MATCH_YES; -+ return match_omp (EXEC_OMP_PARALLEL_WORKSHARE, OMP_PARALLEL_CLAUSES); - } - - -@@ -657,29 +1541,172 @@ - match - gfc_match_omp_sections (void) - { -- gfc_omp_clauses *c; -- if (gfc_match_omp_clauses (&c, OMP_SECTIONS_CLAUSES) != MATCH_YES) -- return MATCH_ERROR; -- new_st.op = EXEC_OMP_SECTIONS; -- new_st.ext.omp_clauses = c; -- return MATCH_YES; -+ return match_omp (EXEC_OMP_SECTIONS, OMP_SECTIONS_CLAUSES); - } - - - match -+gfc_match_omp_simd (void) -+{ -+ return match_omp (EXEC_OMP_SIMD, OMP_SIMD_CLAUSES); -+} -+ -+ -+match - gfc_match_omp_single (void) - { -- gfc_omp_clauses *c; -- if (gfc_match_omp_clauses (&c, OMP_CLAUSE_PRIVATE | OMP_CLAUSE_FIRSTPRIVATE) -- != MATCH_YES) -- return MATCH_ERROR; -- new_st.op = EXEC_OMP_SINGLE; -- new_st.ext.omp_clauses = c; -+ return match_omp (EXEC_OMP_SINGLE, -+ OMP_CLAUSE_PRIVATE | OMP_CLAUSE_FIRSTPRIVATE); -+} -+ -+ -+match -+gfc_match_omp_task (void) -+{ -+ return match_omp (EXEC_OMP_TASK, OMP_TASK_CLAUSES); -+} -+ -+ -+match -+gfc_match_omp_taskwait (void) -+{ -+ if (gfc_match_omp_eos () != MATCH_YES) -+ { -+ gfc_error ("Unexpected junk after TASKWAIT clause at %C"); -+ return MATCH_ERROR; -+ } -+ new_st.op = EXEC_OMP_TASKWAIT; -+ new_st.ext.omp_clauses = NULL; - return MATCH_YES; - } - - - match -+gfc_match_omp_taskyield (void) -+{ -+ if (gfc_match_omp_eos () != MATCH_YES) -+ { -+ gfc_error ("Unexpected junk after TASKYIELD clause at %C"); -+ return MATCH_ERROR; -+ } -+ new_st.op = EXEC_OMP_TASKYIELD; -+ new_st.ext.omp_clauses = NULL; -+ return MATCH_YES; -+} -+ -+ -+match -+gfc_match_omp_target (void) -+{ -+ return match_omp (EXEC_OMP_TARGET, OMP_TARGET_CLAUSES); -+} -+ -+ -+match -+gfc_match_omp_target_data (void) -+{ -+ return match_omp (EXEC_OMP_TARGET_DATA, OMP_TARGET_DATA_CLAUSES); -+} -+ -+ -+match -+gfc_match_omp_target_teams (void) -+{ -+ return match_omp (EXEC_OMP_TARGET_TEAMS, -+ OMP_TARGET_CLAUSES | OMP_TEAMS_CLAUSES); -+} -+ -+ -+match -+gfc_match_omp_target_teams_distribute (void) -+{ -+ return match_omp (EXEC_OMP_TARGET_TEAMS_DISTRIBUTE, -+ OMP_TARGET_CLAUSES | OMP_TEAMS_CLAUSES -+ | OMP_DISTRIBUTE_CLAUSES); -+} -+ -+ -+match -+gfc_match_omp_target_teams_distribute_parallel_do (void) -+{ -+ return match_omp (EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO, -+ OMP_TARGET_CLAUSES | OMP_TEAMS_CLAUSES -+ | OMP_DISTRIBUTE_CLAUSES | OMP_PARALLEL_CLAUSES -+ | OMP_DO_CLAUSES); -+} -+ -+ -+match -+gfc_match_omp_target_teams_distribute_parallel_do_simd (void) -+{ -+ return match_omp (EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD, -+ (OMP_TARGET_CLAUSES | OMP_TEAMS_CLAUSES -+ | OMP_DISTRIBUTE_CLAUSES | OMP_PARALLEL_CLAUSES -+ | OMP_DO_CLAUSES | OMP_SIMD_CLAUSES) -+ & ~OMP_CLAUSE_ORDERED); -+} -+ -+ -+match -+gfc_match_omp_target_teams_distribute_simd (void) -+{ -+ return match_omp (EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD, -+ OMP_TARGET_CLAUSES | OMP_TEAMS_CLAUSES -+ | OMP_DISTRIBUTE_CLAUSES | OMP_SIMD_CLAUSES); -+} -+ -+ -+match -+gfc_match_omp_target_update (void) -+{ -+ return match_omp (EXEC_OMP_TARGET_UPDATE, OMP_TARGET_UPDATE_CLAUSES); -+} -+ -+ -+match -+gfc_match_omp_teams (void) -+{ -+ return match_omp (EXEC_OMP_TEAMS, OMP_TEAMS_CLAUSES); -+} -+ -+ -+match -+gfc_match_omp_teams_distribute (void) -+{ -+ return match_omp (EXEC_OMP_TEAMS_DISTRIBUTE, -+ OMP_TEAMS_CLAUSES | OMP_DISTRIBUTE_CLAUSES); -+} -+ -+ -+match -+gfc_match_omp_teams_distribute_parallel_do (void) -+{ -+ return match_omp (EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO, -+ OMP_TEAMS_CLAUSES | OMP_DISTRIBUTE_CLAUSES -+ | OMP_PARALLEL_CLAUSES | OMP_DO_CLAUSES); -+} -+ -+ -+match -+gfc_match_omp_teams_distribute_parallel_do_simd (void) -+{ -+ return match_omp (EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD, -+ (OMP_TEAMS_CLAUSES | OMP_DISTRIBUTE_CLAUSES -+ | OMP_PARALLEL_CLAUSES | OMP_DO_CLAUSES -+ | OMP_SIMD_CLAUSES) & ~OMP_CLAUSE_ORDERED); -+} -+ -+ -+match -+gfc_match_omp_teams_distribute_simd (void) -+{ -+ return match_omp (EXEC_OMP_TEAMS_DISTRIBUTE_SIMD, -+ OMP_TEAMS_CLAUSES | OMP_DISTRIBUTE_CLAUSES -+ | OMP_SIMD_CLAUSES); -+} -+ -+ -+match - gfc_match_omp_workshare (void) - { - if (gfc_match_omp_eos () != MATCH_YES) -@@ -725,14 +1752,36 @@ - gfc_match_omp_atomic (void) - { - gfc_omp_atomic_op op = GFC_OMP_ATOMIC_UPDATE; -- if (gfc_match ("% update") == MATCH_YES) -- op = GFC_OMP_ATOMIC_UPDATE; -- else if (gfc_match ("% read") == MATCH_YES) -- op = GFC_OMP_ATOMIC_READ; -- else if (gfc_match ("% write") == MATCH_YES) -- op = GFC_OMP_ATOMIC_WRITE; -- else if (gfc_match ("% capture") == MATCH_YES) -- op = GFC_OMP_ATOMIC_CAPTURE; -+ int seq_cst = 0; -+ if (gfc_match ("% seq_cst") == MATCH_YES) -+ seq_cst = 1; -+ locus old_loc = gfc_current_locus; -+ if (seq_cst && gfc_match_char (',') == MATCH_YES) -+ seq_cst = 2; -+ if (seq_cst == 2 -+ || gfc_match_space () == MATCH_YES) -+ { -+ gfc_gobble_whitespace (); -+ if (gfc_match ("update") == MATCH_YES) -+ op = GFC_OMP_ATOMIC_UPDATE; -+ else if (gfc_match ("read") == MATCH_YES) -+ op = GFC_OMP_ATOMIC_READ; -+ else if (gfc_match ("write") == MATCH_YES) -+ op = GFC_OMP_ATOMIC_WRITE; -+ else if (gfc_match ("capture") == MATCH_YES) -+ op = GFC_OMP_ATOMIC_CAPTURE; -+ else -+ { -+ if (seq_cst == 2) -+ gfc_current_locus = old_loc; -+ goto finish; -+ } -+ if (!seq_cst -+ && (gfc_match (", seq_cst") == MATCH_YES -+ || gfc_match ("% seq_cst") == MATCH_YES)) -+ seq_cst = 1; -+ } -+ finish: - if (gfc_match_omp_eos () != MATCH_YES) - { - gfc_error ("Unexpected junk after $OMP ATOMIC statement at %C"); -@@ -739,6 +1788,8 @@ - return MATCH_ERROR; - } - new_st.op = EXEC_OMP_ATOMIC; -+ if (seq_cst) -+ op = (gfc_omp_atomic_op) (op | GFC_OMP_ATOMIC_SEQ_CST); - new_st.ext.omp_atomic = op; - return MATCH_YES; - } -@@ -759,6 +1810,73 @@ - - - match -+gfc_match_omp_taskgroup (void) -+{ -+ if (gfc_match_omp_eos () != MATCH_YES) -+ { -+ gfc_error ("Unexpected junk after $OMP TASKGROUP statement at %C"); -+ return MATCH_ERROR; -+ } -+ new_st.op = EXEC_OMP_TASKGROUP; -+ return MATCH_YES; -+} -+ -+ -+static enum gfc_omp_cancel_kind -+gfc_match_omp_cancel_kind (void) -+{ -+ if (gfc_match_space () != MATCH_YES) -+ return OMP_CANCEL_UNKNOWN; -+ if (gfc_match ("parallel") == MATCH_YES) -+ return OMP_CANCEL_PARALLEL; -+ if (gfc_match ("sections") == MATCH_YES) -+ return OMP_CANCEL_SECTIONS; -+ if (gfc_match ("do") == MATCH_YES) -+ return OMP_CANCEL_DO; -+ if (gfc_match ("taskgroup") == MATCH_YES) -+ return OMP_CANCEL_TASKGROUP; -+ return OMP_CANCEL_UNKNOWN; -+} -+ -+ -+match -+gfc_match_omp_cancel (void) -+{ -+ gfc_omp_clauses *c; -+ enum gfc_omp_cancel_kind kind = gfc_match_omp_cancel_kind (); -+ if (kind == OMP_CANCEL_UNKNOWN) -+ return MATCH_ERROR; -+ if (gfc_match_omp_clauses (&c, OMP_CLAUSE_IF, false) != MATCH_YES) -+ return MATCH_ERROR; -+ c->cancel = kind; -+ new_st.op = EXEC_OMP_CANCEL; -+ new_st.ext.omp_clauses = c; -+ return MATCH_YES; -+} -+ -+ -+match -+gfc_match_omp_cancellation_point (void) -+{ -+ gfc_omp_clauses *c; -+ enum gfc_omp_cancel_kind kind = gfc_match_omp_cancel_kind (); -+ if (kind == OMP_CANCEL_UNKNOWN) -+ return MATCH_ERROR; -+ if (gfc_match_omp_eos () != MATCH_YES) -+ { -+ gfc_error ("Unexpected junk after $OMP CANCELLATION POINT statement " -+ "at %C"); -+ return MATCH_ERROR; -+ } -+ c = gfc_get_omp_clauses (); -+ c->cancel = kind; -+ new_st.op = EXEC_OMP_CANCELLATION_POINT; -+ new_st.ext.omp_clauses = c; -+ return MATCH_YES; -+} -+ -+ -+match - gfc_match_omp_end_nowait (void) - { - bool nowait = false; -@@ -793,17 +1911,116 @@ - } - - -+struct resolve_omp_udr_callback_data -+{ -+ gfc_symbol *sym1, *sym2; -+}; -+ -+ -+static int -+resolve_omp_udr_callback (gfc_expr **e, int *, void *data) -+{ -+ struct resolve_omp_udr_callback_data *rcd -+ = (struct resolve_omp_udr_callback_data *) data; -+ if ((*e)->expr_type == EXPR_VARIABLE -+ && ((*e)->symtree->n.sym == rcd->sym1 -+ || (*e)->symtree->n.sym == rcd->sym2)) -+ { -+ gfc_ref *ref = gfc_get_ref (); -+ ref->type = REF_ARRAY; -+ ref->u.ar.where = (*e)->where; -+ ref->u.ar.as = (*e)->symtree->n.sym->as; -+ ref->u.ar.type = AR_FULL; -+ ref->u.ar.dimen = 0; -+ ref->next = (*e)->ref; -+ (*e)->ref = ref; -+ } -+ return 0; -+} -+ -+ -+static int -+resolve_omp_udr_callback2 (gfc_expr **e, int *, void *) -+{ -+ if ((*e)->expr_type == EXPR_FUNCTION -+ && (*e)->value.function.isym == NULL) -+ { -+ gfc_symbol *sym = (*e)->symtree->n.sym; -+ if (!sym->attr.intrinsic -+ && sym->attr.if_source == IFSRC_UNKNOWN) -+ gfc_error ("Implicitly declared function %s used in " -+ "!$OMP DECLARE REDUCTION at %L ", sym->name, &(*e)->where); -+ } -+ return 0; -+} -+ -+ -+static gfc_code * -+resolve_omp_udr_clause (gfc_omp_namelist *n, gfc_namespace *ns, -+ gfc_symbol *sym1, gfc_symbol *sym2) -+{ -+ gfc_code *copy; -+ gfc_symbol sym1_copy, sym2_copy; -+ -+ if (ns->code->op == EXEC_ASSIGN) -+ { -+ copy = gfc_get_code (EXEC_ASSIGN); -+ copy->expr1 = gfc_copy_expr (ns->code->expr1); -+ copy->expr2 = gfc_copy_expr (ns->code->expr2); -+ } -+ else -+ { -+ copy = gfc_get_code (EXEC_CALL); -+ copy->symtree = ns->code->symtree; -+ copy->ext.actual = gfc_copy_actual_arglist (ns->code->ext.actual); -+ } -+ copy->loc = ns->code->loc; -+ sym1_copy = *sym1; -+ sym2_copy = *sym2; -+ *sym1 = *n->sym; -+ *sym2 = *n->sym; -+ sym1->name = sym1_copy.name; -+ sym2->name = sym2_copy.name; -+ ns->proc_name = ns->parent->proc_name; -+ if (n->sym->attr.dimension) -+ { -+ struct resolve_omp_udr_callback_data rcd; -+ rcd.sym1 = sym1; -+ rcd.sym2 = sym2; -+ gfc_code_walker (©, gfc_dummy_code_callback, -+ resolve_omp_udr_callback, &rcd); -+ } -+ gfc_resolve_code (copy, gfc_current_ns); -+ if (copy->op == EXEC_CALL && copy->resolved_isym == NULL) -+ { -+ gfc_symbol *sym = copy->resolved_sym; -+ if (sym -+ && !sym->attr.intrinsic -+ && sym->attr.if_source == IFSRC_UNKNOWN) -+ gfc_error ("Implicitly declared subroutine %s used in " -+ "!$OMP DECLARE REDUCTION at %L ", sym->name, -+ ©->loc); -+ } -+ gfc_code_walker (©, gfc_dummy_code_callback, -+ resolve_omp_udr_callback2, NULL); -+ *sym1 = sym1_copy; -+ *sym2 = sym2_copy; -+ return copy; -+} -+ -+ - /* OpenMP directive resolving routines. */ - - static void --resolve_omp_clauses (gfc_code *code) -+resolve_omp_clauses (gfc_code *code, locus *where, -+ gfc_omp_clauses *omp_clauses, gfc_namespace *ns) - { -- gfc_omp_clauses *omp_clauses = code->ext.omp_clauses; -- gfc_namelist *n; -+ gfc_omp_namelist *n; - int list; - static const char *clause_names[] - = { "PRIVATE", "FIRSTPRIVATE", "LASTPRIVATE", "COPYPRIVATE", "SHARED", -- "COPYIN", "REDUCTION" }; -+ "COPYIN", "UNIFORM", "ALIGNED", "LINEAR", "DEPEND", "MAP", -+ "TO", "FROM", "REDUCTION" }; - - if (omp_clauses == NULL) - return; -@@ -847,8 +2064,15 @@ - for (n = omp_clauses->lists[list]; n; n = n->next) - { - n->sym->mark = 0; -- if (n->sym->attr.flavor == FL_VARIABLE || n->sym->attr.proc_pointer) -- continue; -+ if (n->sym->attr.flavor == FL_VARIABLE -+ || n->sym->attr.proc_pointer -+ || (!code && (!n->sym->attr.dummy || n->sym->ns != ns))) -+ { -+ if (!code && (!n->sym->attr.dummy || n->sym->ns != ns)) -+ gfc_error ("Variable '%s' is not a dummy argument at %L", -+ n->sym->name, where); -+ continue; -+ } - if (n->sym->attr.flavor == FL_PROCEDURE - && n->sym->result == n->sym - && n->sym->attr.function) -@@ -878,16 +2102,22 @@ - } - } - gfc_error ("Object '%s' is not a variable at %L", n->sym->name, -- &code->loc); -+ where); - } - - for (list = 0; list < OMP_LIST_NUM; list++) -- if (list != OMP_LIST_FIRSTPRIVATE && list != OMP_LIST_LASTPRIVATE) -+ if (list != OMP_LIST_FIRSTPRIVATE -+ && list != OMP_LIST_LASTPRIVATE -+ && list != OMP_LIST_ALIGNED -+ && list != OMP_LIST_DEPEND -+ && list != OMP_LIST_MAP -+ && list != OMP_LIST_FROM -+ && list != OMP_LIST_TO) - for (n = omp_clauses->lists[list]; n; n = n->next) - { - if (n->sym->mark) - gfc_error ("Symbol '%s' present on multiple clauses at %L", -- n->sym->name, &code->loc); -+ n->sym->name, where); - else - n->sym->mark = 1; - } -@@ -898,7 +2128,7 @@ - if (n->sym->mark) - { - gfc_error ("Symbol '%s' present on multiple clauses at %L", -- n->sym->name, &code->loc); -+ n->sym->name, where); - n->sym->mark = 0; - } - -@@ -906,7 +2136,7 @@ - { - if (n->sym->mark) - gfc_error ("Symbol '%s' present on multiple clauses at %L", -- n->sym->name, &code->loc); -+ n->sym->name, where); - else - n->sym->mark = 1; - } -@@ -917,19 +2147,44 @@ - { - if (n->sym->mark) - gfc_error ("Symbol '%s' present on multiple clauses at %L", -- n->sym->name, &code->loc); -+ n->sym->name, where); - else - n->sym->mark = 1; - } -+ -+ for (n = omp_clauses->lists[OMP_LIST_ALIGNED]; n; n = n->next) -+ n->sym->mark = 0; -+ -+ for (n = omp_clauses->lists[OMP_LIST_ALIGNED]; n; n = n->next) -+ { -+ if (n->sym->mark) -+ gfc_error ("Symbol '%s' present on multiple clauses at %L", -+ n->sym->name, where); -+ else -+ n->sym->mark = 1; -+ } -+ -+ for (n = omp_clauses->lists[OMP_LIST_TO]; n; n = n->next) -+ n->sym->mark = 0; -+ for (n = omp_clauses->lists[OMP_LIST_FROM]; n; n = n->next) -+ if (n->expr == NULL) -+ n->sym->mark = 1; -+ for (n = omp_clauses->lists[OMP_LIST_TO]; n; n = n->next) -+ { -+ if (n->expr == NULL && n->sym->mark) -+ gfc_error ("Symbol '%s' present on both FROM and TO clauses at %L", -+ n->sym->name, where); -+ else -+ n->sym->mark = 1; -+ } -+ - for (list = 0; list < OMP_LIST_NUM; list++) - if ((n = omp_clauses->lists[list]) != NULL) - { - const char *name; - -- if (list < OMP_LIST_REDUCTION_FIRST) -+ if (list < OMP_LIST_NUM) - name = clause_names[list]; -- else if (list <= OMP_LIST_REDUCTION_LAST) -- name = clause_names[OMP_LIST_REDUCTION_FIRST]; - else - gcc_unreachable (); - -@@ -940,10 +2195,7 @@ - { - if (!n->sym->attr.threadprivate) - gfc_error ("Non-THREADPRIVATE object '%s' in COPYIN clause" -- " at %L", n->sym->name, &code->loc); -- if (n->sym->ts.type == BT_DERIVED && n->sym->ts.u.derived->attr.alloc_comp) -- gfc_error ("COPYIN clause object '%s' at %L has ALLOCATABLE components", -- n->sym->name, &code->loc); -+ " at %L", n->sym->name, where); - } - break; - case OMP_LIST_COPYPRIVATE: -@@ -951,10 +2203,10 @@ - { - if (n->sym->as && n->sym->as->type == AS_ASSUMED_SIZE) - gfc_error ("Assumed size array '%s' in COPYPRIVATE clause " -- "at %L", n->sym->name, &code->loc); -- if (n->sym->ts.type == BT_DERIVED && n->sym->ts.u.derived->attr.alloc_comp) -- gfc_error ("COPYPRIVATE clause object '%s' at %L has ALLOCATABLE components", -- n->sym->name, &code->loc); -+ "at %L", n->sym->name, where); -+ if (n->sym->attr.pointer && n->sym->attr.intent == INTENT_IN) -+ gfc_error ("INTENT(IN) POINTER '%s' in COPYPRIVATE clause " -+ "at %L", n->sym->name, where); - } - break; - case OMP_LIST_SHARED: -@@ -962,96 +2214,286 @@ - { - if (n->sym->attr.threadprivate) - gfc_error ("THREADPRIVATE object '%s' in SHARED clause at " -- "%L", n->sym->name, &code->loc); -+ "%L", n->sym->name, where); - if (n->sym->attr.cray_pointee) - gfc_error ("Cray pointee '%s' in SHARED clause at %L", -- n->sym->name, &code->loc); -+ n->sym->name, where); -+ if (n->sym->attr.associate_var) -+ gfc_error ("ASSOCIATE name '%s' in SHARED clause at %L", -+ n->sym->name, where); - } - break; -+ case OMP_LIST_ALIGNED: -+ for (; n != NULL; n = n->next) -+ { -+ if (!n->sym->attr.pointer -+ && !n->sym->attr.allocatable -+ && !n->sym->attr.cray_pointer -+ && (n->sym->ts.type != BT_DERIVED -+ || (n->sym->ts.u.derived->from_intmod -+ != INTMOD_ISO_C_BINDING) -+ || (n->sym->ts.u.derived->intmod_sym_id -+ != ISOCBINDING_PTR))) -+ gfc_error ("'%s' in ALIGNED clause must be POINTER, " -+ "ALLOCATABLE, Cray pointer or C_PTR at %L", -+ n->sym->name, where); -+ else if (n->expr) -+ { -+ gfc_expr *expr = n->expr; -+ int alignment = 0; -+ if (!gfc_resolve_expr (expr) -+ || expr->ts.type != BT_INTEGER -+ || expr->rank != 0 -+ || gfc_extract_int (expr, &alignment) -+ || alignment <= 0) -+ gfc_error ("'%s' in ALIGNED clause at %L requires a scalar " -+ "positive constant integer alignment " -+ "expression", n->sym->name, where); -+ } -+ } -+ break; -+ case OMP_LIST_DEPEND: -+ case OMP_LIST_MAP: -+ case OMP_LIST_TO: -+ case OMP_LIST_FROM: -+ for (; n != NULL; n = n->next) -+ if (n->expr) -+ { -+ if (!gfc_resolve_expr (n->expr) -+ || n->expr->expr_type != EXPR_VARIABLE -+ || n->expr->ref == NULL -+ || n->expr->ref->next -+ || n->expr->ref->type != REF_ARRAY) -+ gfc_error ("'%s' in %s clause at %L is not a proper " -+ "array section", n->sym->name, name, where); -+ else if (n->expr->ref->u.ar.codimen) -+ gfc_error ("Coarrays not supported in %s clause at %L", -+ name, where); -+ else -+ { -+ int i; -+ gfc_array_ref *ar = &n->expr->ref->u.ar; -+ for (i = 0; i < ar->dimen; i++) -+ if (ar->stride[i]) -+ { -+ gfc_error ("Stride should not be specified for " -+ "array section in %s clause at %L", -+ name, where); -+ break; -+ } -+ else if (ar->dimen_type[i] != DIMEN_ELEMENT -+ && ar->dimen_type[i] != DIMEN_RANGE) -+ { -+ gfc_error ("'%s' in %s clause at %L is not a " -+ "proper array section", -+ n->sym->name, name, where); -+ break; -+ } -+ else if (list == OMP_LIST_DEPEND -+ && ar->start[i] -+ && ar->start[i]->expr_type == EXPR_CONSTANT -+ && ar->end[i] -+ && ar->end[i]->expr_type == EXPR_CONSTANT -+ && mpz_cmp (ar->start[i]->value.integer, -+ ar->end[i]->value.integer) > 0) -+ { -+ gfc_error ("'%s' in DEPEND clause at %L is a zero " -+ "size array section", n->sym->name, -+ where); -+ break; -+ } -+ } -+ } -+ if (list != OMP_LIST_DEPEND) -+ for (n = omp_clauses->lists[list]; n != NULL; n = n->next) -+ { -+ n->sym->attr.referenced = 1; -+ if (n->sym->attr.threadprivate) -+ gfc_error ("THREADPRIVATE object '%s' in %s clause at %L", -+ n->sym->name, name, where); -+ if (n->sym->attr.cray_pointee) -+ gfc_error ("Cray pointee '%s' in %s clause at %L", -+ n->sym->name, name, where); -+ } -+ break; - default: - for (; n != NULL; n = n->next) - { -+ bool bad = false; - if (n->sym->attr.threadprivate) - gfc_error ("THREADPRIVATE object '%s' in %s clause at %L", -- n->sym->name, name, &code->loc); -+ n->sym->name, name, where); - if (n->sym->attr.cray_pointee) - gfc_error ("Cray pointee '%s' in %s clause at %L", -- n->sym->name, name, &code->loc); -+ n->sym->name, name, where); -+ if (n->sym->attr.associate_var) -+ gfc_error ("ASSOCIATE name '%s' in %s clause at %L", -+ n->sym->name, name, where); - if (list != OMP_LIST_PRIVATE) - { -- if (n->sym->attr.pointer -- && list >= OMP_LIST_REDUCTION_FIRST -- && list <= OMP_LIST_REDUCTION_LAST) -+ if (n->sym->attr.proc_pointer && list == OMP_LIST_REDUCTION) -+ gfc_error ("Procedure pointer '%s' in %s clause at %L", -+ n->sym->name, name, where); -+ if (n->sym->attr.pointer && list == OMP_LIST_REDUCTION) - gfc_error ("POINTER object '%s' in %s clause at %L", -- n->sym->name, name, &code->loc); -- /* Variables in REDUCTION-clauses must be of intrinsic type (flagged below). */ -- if ((list < OMP_LIST_REDUCTION_FIRST || list > OMP_LIST_REDUCTION_LAST) -- && n->sym->ts.type == BT_DERIVED -- && n->sym->ts.u.derived->attr.alloc_comp) -- gfc_error ("%s clause object '%s' has ALLOCATABLE components at %L", -- name, n->sym->name, &code->loc); -- if (n->sym->attr.cray_pointer -- && list >= OMP_LIST_REDUCTION_FIRST -- && list <= OMP_LIST_REDUCTION_LAST) -+ n->sym->name, name, where); -+ if (n->sym->attr.cray_pointer && list == OMP_LIST_REDUCTION) - gfc_error ("Cray pointer '%s' in %s clause at %L", -- n->sym->name, name, &code->loc); -+ n->sym->name, name, where); - } - if (n->sym->as && n->sym->as->type == AS_ASSUMED_SIZE) - gfc_error ("Assumed size array '%s' in %s clause at %L", -- n->sym->name, name, &code->loc); -- if (n->sym->attr.in_namelist -- && (list < OMP_LIST_REDUCTION_FIRST -- || list > OMP_LIST_REDUCTION_LAST)) -+ n->sym->name, name, where); -+ if (n->sym->attr.in_namelist && list != OMP_LIST_REDUCTION) - gfc_error ("Variable '%s' in %s clause is used in " - "NAMELIST statement at %L", -- n->sym->name, name, &code->loc); -+ n->sym->name, name, where); -+ if (n->sym->attr.pointer && n->sym->attr.intent == INTENT_IN) -+ switch (list) -+ { -+ case OMP_LIST_PRIVATE: -+ case OMP_LIST_LASTPRIVATE: -+ case OMP_LIST_LINEAR: -+ /* case OMP_LIST_REDUCTION: */ -+ gfc_error ("INTENT(IN) POINTER '%s' in %s clause at %L", -+ n->sym->name, name, where); -+ break; -+ default: -+ break; -+ } - switch (list) - { -- case OMP_LIST_PLUS: -- case OMP_LIST_MULT: -- case OMP_LIST_SUB: -- if (!gfc_numeric_ts (&n->sym->ts)) -- gfc_error ("%c REDUCTION variable '%s' at %L must be of numeric type, got %s", -- list == OMP_LIST_PLUS ? '+' -- : list == OMP_LIST_MULT ? '*' : '-', -- n->sym->name, &code->loc, -- gfc_typename (&n->sym->ts)); -+ case OMP_LIST_REDUCTION: -+ switch (n->u.reduction_op) -+ { -+ case OMP_REDUCTION_PLUS: -+ case OMP_REDUCTION_TIMES: -+ case OMP_REDUCTION_MINUS: -+ if (!gfc_numeric_ts (&n->sym->ts)) -+ bad = true; -+ break; -+ case OMP_REDUCTION_AND: -+ case OMP_REDUCTION_OR: -+ case OMP_REDUCTION_EQV: -+ case OMP_REDUCTION_NEQV: -+ if (n->sym->ts.type != BT_LOGICAL) -+ bad = true; -+ break; -+ case OMP_REDUCTION_MAX: -+ case OMP_REDUCTION_MIN: -+ if (n->sym->ts.type != BT_INTEGER -+ && n->sym->ts.type != BT_REAL) -+ bad = true; -+ break; -+ case OMP_REDUCTION_IAND: -+ case OMP_REDUCTION_IOR: -+ case OMP_REDUCTION_IEOR: -+ if (n->sym->ts.type != BT_INTEGER) -+ bad = true; -+ break; -+ case OMP_REDUCTION_USER: -+ bad = true; -+ break; -+ default: -+ break; -+ } -+ if (!bad) -+ n->udr = NULL; -+ else -+ { -+ const char *udr_name = NULL; -+ if (n->udr) -+ { -+ udr_name = n->udr->udr->name; -+ n->udr->udr -+ = gfc_find_omp_udr (NULL, udr_name, -+ &n->sym->ts); -+ if (n->udr->udr == NULL) -+ { -+ free (n->udr); -+ n->udr = NULL; -+ } -+ } -+ if (n->udr == NULL) -+ { -+ if (udr_name == NULL) -+ switch (n->u.reduction_op) -+ { -+ case OMP_REDUCTION_PLUS: -+ case OMP_REDUCTION_TIMES: -+ case OMP_REDUCTION_MINUS: -+ case OMP_REDUCTION_AND: -+ case OMP_REDUCTION_OR: -+ case OMP_REDUCTION_EQV: -+ case OMP_REDUCTION_NEQV: -+ udr_name = gfc_op2string ((gfc_intrinsic_op) -+ n->u.reduction_op); -+ break; -+ case OMP_REDUCTION_MAX: -+ udr_name = "max"; -+ break; -+ case OMP_REDUCTION_MIN: -+ udr_name = "min"; -+ break; -+ case OMP_REDUCTION_IAND: -+ udr_name = "iand"; -+ break; -+ case OMP_REDUCTION_IOR: -+ udr_name = "ior"; -+ break; -+ case OMP_REDUCTION_IEOR: -+ udr_name = "ieor"; -+ break; -+ default: -+ gcc_unreachable (); -+ } -+ gfc_error ("!$OMP DECLARE REDUCTION %s not found " -+ "for type %s at %L", udr_name, -+ gfc_typename (&n->sym->ts), where); -+ } -+ else -+ { -+ gfc_omp_udr *udr = n->udr->udr; -+ n->u.reduction_op = OMP_REDUCTION_USER; -+ n->udr->combiner -+ = resolve_omp_udr_clause (n, udr->combiner_ns, -+ udr->omp_out, -+ udr->omp_in); -+ if (udr->initializer_ns) -+ n->udr->initializer -+ = resolve_omp_udr_clause (n, -+ udr->initializer_ns, -+ udr->omp_priv, -+ udr->omp_orig); -+ } -+ } - break; -- case OMP_LIST_AND: -- case OMP_LIST_OR: -- case OMP_LIST_EQV: -- case OMP_LIST_NEQV: -- if (n->sym->ts.type != BT_LOGICAL) -- gfc_error ("%s REDUCTION variable '%s' must be LOGICAL " -- "at %L", -- list == OMP_LIST_AND ? ".AND." -- : list == OMP_LIST_OR ? ".OR." -- : list == OMP_LIST_EQV ? ".EQV." : ".NEQV.", -- n->sym->name, &code->loc); -- break; -- case OMP_LIST_MAX: -- case OMP_LIST_MIN: -- if (n->sym->ts.type != BT_INTEGER -- && n->sym->ts.type != BT_REAL) -- gfc_error ("%s REDUCTION variable '%s' must be " -- "INTEGER or REAL at %L", -- list == OMP_LIST_MAX ? "MAX" : "MIN", -- n->sym->name, &code->loc); -- break; -- case OMP_LIST_IAND: -- case OMP_LIST_IOR: -- case OMP_LIST_IEOR: -+ case OMP_LIST_LINEAR: - if (n->sym->ts.type != BT_INTEGER) -- gfc_error ("%s REDUCTION variable '%s' must be INTEGER " -- "at %L", -- list == OMP_LIST_IAND ? "IAND" -- : list == OMP_LIST_MULT ? "IOR" : "IEOR", -- n->sym->name, &code->loc); -+ gfc_error ("LINEAR variable '%s' must be INTEGER " -+ "at %L", n->sym->name, where); -+ else if (!code && !n->sym->attr.value) -+ gfc_error ("LINEAR dummy argument '%s' must have VALUE " -+ "attribute at %L", n->sym->name, where); -+ else if (n->expr) -+ { -+ gfc_expr *expr = n->expr; -+ if (!gfc_resolve_expr (expr) -+ || expr->ts.type != BT_INTEGER -+ || expr->rank != 0) -+ gfc_error ("'%s' in LINEAR clause at %L requires " -+ "a scalar integer linear-step expression", -+ n->sym->name, where); -+ else if (!code && expr->expr_type != EXPR_CONSTANT) -+ gfc_error ("'%s' in LINEAR clause at %L requires " -+ "a constant integer linear-step expression", -+ n->sym->name, where); -+ } - break; - /* Workaround for PR middle-end/26316, nothing really needs - to be done here for OMP_LIST_PRIVATE. */ - case OMP_LIST_PRIVATE: -- gcc_assert (code->op != EXEC_NOP); -+ gcc_assert (code && code->op != EXEC_NOP); - default: - break; - } -@@ -1059,6 +2501,54 @@ - break; - } - } -+ if (omp_clauses->safelen_expr) -+ { -+ gfc_expr *expr = omp_clauses->safelen_expr; -+ if (!gfc_resolve_expr (expr) -+ || expr->ts.type != BT_INTEGER || expr->rank != 0) -+ gfc_error ("SAFELEN clause at %L requires a scalar " -+ "INTEGER expression", &expr->where); -+ } -+ if (omp_clauses->simdlen_expr) -+ { -+ gfc_expr *expr = omp_clauses->simdlen_expr; -+ if (!gfc_resolve_expr (expr) -+ || expr->ts.type != BT_INTEGER || expr->rank != 0) -+ gfc_error ("SIMDLEN clause at %L requires a scalar " -+ "INTEGER expression", &expr->where); -+ } -+ if (omp_clauses->num_teams) -+ { -+ gfc_expr *expr = omp_clauses->num_teams; -+ if (!gfc_resolve_expr (expr) -+ || expr->ts.type != BT_INTEGER || expr->rank != 0) -+ gfc_error ("NUM_TEAMS clause at %L requires a scalar " -+ "INTEGER expression", &expr->where); -+ } -+ if (omp_clauses->device) -+ { -+ gfc_expr *expr = omp_clauses->device; -+ if (!gfc_resolve_expr (expr) -+ || expr->ts.type != BT_INTEGER || expr->rank != 0) -+ gfc_error ("DEVICE clause at %L requires a scalar " -+ "INTEGER expression", &expr->where); -+ } -+ if (omp_clauses->dist_chunk_size) -+ { -+ gfc_expr *expr = omp_clauses->dist_chunk_size; -+ if (!gfc_resolve_expr (expr) -+ || expr->ts.type != BT_INTEGER || expr->rank != 0) -+ gfc_error ("DIST_SCHEDULE clause's chunk_size at %L requires " -+ "a scalar INTEGER expression", &expr->where); -+ } -+ if (omp_clauses->thread_limit) -+ { -+ gfc_expr *expr = omp_clauses->thread_limit; -+ if (!gfc_resolve_expr (expr) -+ || expr->ts.type != BT_INTEGER || expr->rank != 0) -+ gfc_error ("THREAD_LIMIT clause at %L requires a scalar " -+ "INTEGER expression", &expr->where); -+ } - } - - -@@ -1142,12 +2632,13 @@ - gfc_code *atomic_code = code; - gfc_symbol *var; - gfc_expr *expr2, *expr2_tmp; -+ gfc_omp_atomic_op aop -+ = (gfc_omp_atomic_op) (atomic_code->ext.omp_atomic & GFC_OMP_ATOMIC_MASK); - - code = code->block->next; - gcc_assert (code->op == EXEC_ASSIGN); -- gcc_assert ((atomic_code->ext.omp_atomic != GFC_OMP_ATOMIC_CAPTURE -- && code->next == NULL) -- || (atomic_code->ext.omp_atomic == GFC_OMP_ATOMIC_CAPTURE -+ gcc_assert (((aop != GFC_OMP_ATOMIC_CAPTURE) && code->next == NULL) -+ || ((aop == GFC_OMP_ATOMIC_CAPTURE) - && code->next != NULL - && code->next->op == EXEC_ASSIGN - && code->next->next == NULL)); -@@ -1169,14 +2660,13 @@ - expr2 = is_conversion (code->expr2, false); - if (expr2 == NULL) - { -- if (atomic_code->ext.omp_atomic == GFC_OMP_ATOMIC_READ -- || atomic_code->ext.omp_atomic == GFC_OMP_ATOMIC_WRITE) -+ if (aop == GFC_OMP_ATOMIC_READ || aop == GFC_OMP_ATOMIC_WRITE) - expr2 = is_conversion (code->expr2, true); - if (expr2 == NULL) - expr2 = code->expr2; - } - -- switch (atomic_code->ext.omp_atomic) -+ switch (aop) - { - case GFC_OMP_ATOMIC_READ: - if (expr2->expr_type != EXPR_VARIABLE -@@ -1249,8 +2739,22 @@ - break; - } - -- if (expr2->expr_type == EXPR_OP) -+ if (var->attr.allocatable) - { -+ gfc_error ("!$OMP ATOMIC with ALLOCATABLE variable at %L", -+ &code->loc); -+ return; -+ } -+ -+ if (aop == GFC_OMP_ATOMIC_CAPTURE -+ && code->next == NULL -+ && code->expr2->rank == 0 -+ && !expr_references_sym (code->expr2, var, NULL)) -+ atomic_code->ext.omp_atomic -+ = (gfc_omp_atomic_op) (atomic_code->ext.omp_atomic -+ | GFC_OMP_ATOMIC_SWAP); -+ else if (expr2->expr_type == EXPR_OP) -+ { - gfc_expr *v = NULL, *e, *c; - gfc_intrinsic_op op = expr2->value.op.op; - gfc_intrinsic_op alt_op = INTRINSIC_NONE; -@@ -1420,11 +2924,18 @@ - && arg->expr->symtree->n.sym == var) - var_arg = arg; - else if (expr_references_sym (arg->expr, var, NULL)) -- gfc_error ("!$OMP ATOMIC intrinsic arguments except one must not " -- "reference '%s' at %L", var->name, &arg->expr->where); -+ { -+ gfc_error ("!$OMP ATOMIC intrinsic arguments except one must " -+ "not reference '%s' at %L", -+ var->name, &arg->expr->where); -+ return; -+ } - if (arg->expr->rank != 0) -- gfc_error ("!$OMP ATOMIC intrinsic arguments must be scalar " -- "at %L", &arg->expr->where); -+ { -+ gfc_error ("!$OMP ATOMIC intrinsic arguments must be scalar " -+ "at %L", &arg->expr->where); -+ return; -+ } - } - - if (var_arg == NULL) -@@ -1447,10 +2958,10 @@ - } - } - else -- gfc_error ("!$OMP ATOMIC assignment must have an operator or intrinsic " -- "on right hand side at %L", &expr2->where); -+ gfc_error ("!$OMP ATOMIC assignment must have an operator or " -+ "intrinsic on right hand side at %L", &expr2->where); - -- if (atomic_code->ext.omp_atomic == GFC_OMP_ATOMIC_CAPTURE && code->next) -+ if (aop == GFC_OMP_ATOMIC_CAPTURE && code->next) - { - code = code->next; - if (code->expr1->expr_type != EXPR_VARIABLE -@@ -1542,7 +3053,7 @@ - { - struct omp_context ctx; - gfc_omp_clauses *omp_clauses = code->ext.omp_clauses; -- gfc_namelist *n; -+ gfc_omp_namelist *n; - int list; - - ctx.code = code; -@@ -1552,13 +3063,38 @@ - omp_current_ctx = &ctx; - - for (list = 0; list < OMP_LIST_NUM; list++) -- for (n = omp_clauses->lists[list]; n; n = n->next) -- pointer_set_insert (ctx.sharing_clauses, n->sym); -+ switch (list) -+ { -+ case OMP_LIST_SHARED: -+ case OMP_LIST_PRIVATE: -+ case OMP_LIST_FIRSTPRIVATE: -+ case OMP_LIST_LASTPRIVATE: -+ case OMP_LIST_REDUCTION: -+ case OMP_LIST_LINEAR: -+ for (n = omp_clauses->lists[list]; n; n = n->next) -+ pointer_set_insert (ctx.sharing_clauses, n->sym); -+ break; -+ default: -+ break; -+ } - -- if (code->op == EXEC_OMP_PARALLEL_DO) -- gfc_resolve_omp_do_blocks (code, ns); -- else -- gfc_resolve_blocks (code->block, ns); -+ switch (code->op) -+ { -+ case EXEC_OMP_PARALLEL_DO: -+ case EXEC_OMP_PARALLEL_DO_SIMD: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD: -+ case EXEC_OMP_TEAMS_DISTRIBUTE: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD: -+ gfc_resolve_omp_do_blocks (code, ns); -+ break; -+ default: -+ gfc_resolve_blocks (code->block, ns); -+ } - - omp_current_ctx = ctx.previous; - pointer_set_destroy (ctx.sharing_clauses); -@@ -1624,9 +3160,9 @@ - if (! pointer_set_insert (omp_current_ctx->private_iterators, sym)) - { - gfc_omp_clauses *omp_clauses = omp_current_ctx->code->ext.omp_clauses; -- gfc_namelist *p; -+ gfc_omp_namelist *p; - -- p = gfc_get_namelist (); -+ p = gfc_get_omp_namelist (); - p->sym = sym; - p->next = omp_clauses->lists[OMP_LIST_PRIVATE]; - omp_clauses->lists[OMP_LIST_PRIVATE] = p; -@@ -1639,11 +3175,64 @@ - { - gfc_code *do_code, *c; - int list, i, collapse; -- gfc_namelist *n; -+ gfc_omp_namelist *n; - gfc_symbol *dovar; -+ const char *name; -+ bool is_simd = false; - -+ switch (code->op) -+ { -+ case EXEC_OMP_DISTRIBUTE: name = "!$OMP DISTRIBUTE"; break; -+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO: -+ name = "!$OMP DISTRIBUTE PARALLEL DO"; -+ break; -+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD: -+ name = "!$OMP DISTRIBUTE PARALLEL DO SIMD"; -+ is_simd = true; -+ break; -+ case EXEC_OMP_DISTRIBUTE_SIMD: -+ name = "!$OMP DISTRIBUTE SIMD"; -+ is_simd = true; -+ break; -+ case EXEC_OMP_DO: name = "!$OMP DO"; break; -+ case EXEC_OMP_DO_SIMD: name = "!$OMP DO SIMD"; is_simd = true; break; -+ case EXEC_OMP_PARALLEL_DO: name = "!$OMP PARALLEL DO"; break; -+ case EXEC_OMP_PARALLEL_DO_SIMD: -+ name = "!$OMP PARALLEL DO SIMD"; -+ is_simd = true; -+ break; -+ case EXEC_OMP_SIMD: name = "!$OMP SIMD"; is_simd = true; break; -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE: -+ name = "!$OMP TARGET TEAMS_DISTRIBUTE"; -+ break; -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ name = "!$OMP TARGET TEAMS DISTRIBUTE PARALLEL DO"; -+ break; -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ name = "!$OMP TARGET TEAMS DISTRIBUTE PARALLEL DO SIMD"; -+ is_simd = true; -+ break; -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD: -+ name = "!$OMP TARGET TEAMS DISTRIBUTE SIMD"; -+ is_simd = true; -+ break; -+ case EXEC_OMP_TEAMS_DISTRIBUTE: name = "!$OMP TEAMS_DISTRIBUTE"; break; -+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ name = "!$OMP TEAMS DISTRIBUTE PARALLEL DO"; -+ break; -+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ name = "!$OMP TEAMS DISTRIBUTE PARALLEL DO SIMD"; -+ is_simd = true; -+ break; -+ case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD: -+ name = "!$OMP TEAMS DISTRIBUTE SIMD"; -+ is_simd = true; -+ break; -+ default: gcc_unreachable (); -+ } -+ - if (code->ext.omp_clauses) -- resolve_omp_clauses (code); -+ resolve_omp_clauses (code, &code->loc, code->ext.omp_clauses, NULL); - - do_code = code->block->next; - collapse = code->ext.omp_clauses->collapse; -@@ -1653,27 +3242,46 @@ - { - if (do_code->op == EXEC_DO_WHILE) - { -- gfc_error ("!$OMP DO cannot be a DO WHILE or DO without loop control " -- "at %L", &do_code->loc); -+ gfc_error ("%s cannot be a DO WHILE or DO without loop control " -+ "at %L", name, &do_code->loc); - break; - } -+ if (do_code->op == EXEC_DO_CONCURRENT) -+ { -+ gfc_error ("%s cannot be a DO CONCURRENT loop at %L", name, -+ &do_code->loc); -+ break; -+ } - gcc_assert (do_code->op == EXEC_DO); - if (do_code->ext.iterator->var->ts.type != BT_INTEGER) -- gfc_error ("!$OMP DO iteration variable must be of type integer at %L", -- &do_code->loc); -+ gfc_error ("%s iteration variable must be of type integer at %L", -+ name, &do_code->loc); - dovar = do_code->ext.iterator->var->symtree->n.sym; - if (dovar->attr.threadprivate) -- gfc_error ("!$OMP DO iteration variable must not be THREADPRIVATE " -- "at %L", &do_code->loc); -+ gfc_error ("%s iteration variable must not be THREADPRIVATE " -+ "at %L", name, &do_code->loc); - if (code->ext.omp_clauses) - for (list = 0; list < OMP_LIST_NUM; list++) -- if (list != OMP_LIST_PRIVATE && list != OMP_LIST_LASTPRIVATE) -+ if (!is_simd -+ ? (list != OMP_LIST_PRIVATE && list != OMP_LIST_LASTPRIVATE) -+ : code->ext.omp_clauses->collapse > 1 -+ ? (list != OMP_LIST_LASTPRIVATE) -+ : (list != OMP_LIST_LINEAR)) - for (n = code->ext.omp_clauses->lists[list]; n; n = n->next) - if (dovar == n->sym) - { -- gfc_error ("!$OMP DO iteration variable present on clause " -- "other than PRIVATE or LASTPRIVATE at %L", -- &do_code->loc); -+ if (!is_simd) -+ gfc_error ("%s iteration variable present on clause " -+ "other than PRIVATE or LASTPRIVATE at %L", -+ name, &do_code->loc); -+ else if (code->ext.omp_clauses->collapse > 1) -+ gfc_error ("%s iteration variable present on clause " -+ "other than LASTPRIVATE at %L", -+ name, &do_code->loc); -+ else -+ gfc_error ("%s iteration variable present on clause " -+ "other than LINEAR at %L", -+ name, &do_code->loc); - break; - } - if (i > 1) -@@ -1689,8 +3297,8 @@ - || gfc_find_sym_in_expr (ivar, do_code->ext.iterator->end) - || gfc_find_sym_in_expr (ivar, do_code->ext.iterator->step)) - { -- gfc_error ("!$OMP DO collapsed loops don't form rectangular iteration space at %L", -- &do_code->loc); -+ gfc_error ("%s collapsed loops don't form rectangular " -+ "iteration space at %L", name, &do_code->loc); - break; - } - if (j < i) -@@ -1703,8 +3311,8 @@ - for (c = do_code->next; c; c = c->next) - if (c->op != EXEC_NOP && c->op != EXEC_CONTINUE) - { -- gfc_error ("collapsed !$OMP DO loops not perfectly nested at %L", -- &c->loc); -+ gfc_error ("collapsed %s loops not perfectly nested at %L", -+ name, &c->loc); - break; - } - if (c) -@@ -1712,8 +3320,8 @@ - do_code = do_code->block; - if (do_code->op != EXEC_DO && do_code->op != EXEC_DO_WHILE) - { -- gfc_error ("not enough DO loops for collapsed !$OMP DO at %L", -- &code->loc); -+ gfc_error ("not enough DO loops for collapsed %s at %L", -+ name, &code->loc); - break; - } - do_code = do_code->next; -@@ -1720,8 +3328,8 @@ - if (do_code == NULL - || (do_code->op != EXEC_DO && do_code->op != EXEC_DO_WHILE)) - { -- gfc_error ("not enough DO loops for collapsed !$OMP DO at %L", -- &code->loc); -+ gfc_error ("not enough DO loops for collapsed %s at %L", -+ name, &code->loc); - break; - } - } -@@ -1739,20 +3347,49 @@ - - switch (code->op) - { -+ case EXEC_OMP_DISTRIBUTE: -+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO: -+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case EXEC_OMP_DISTRIBUTE_SIMD: - case EXEC_OMP_DO: -+ case EXEC_OMP_DO_SIMD: - case EXEC_OMP_PARALLEL_DO: -+ case EXEC_OMP_PARALLEL_DO_SIMD: -+ case EXEC_OMP_SIMD: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD: -+ case EXEC_OMP_TEAMS_DISTRIBUTE: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD: - resolve_omp_do (code); - break; -- case EXEC_OMP_WORKSHARE: -+ case EXEC_OMP_CANCEL: - case EXEC_OMP_PARALLEL_WORKSHARE: - case EXEC_OMP_PARALLEL: - case EXEC_OMP_PARALLEL_SECTIONS: - case EXEC_OMP_SECTIONS: - case EXEC_OMP_SINGLE: -+ case EXEC_OMP_TARGET: -+ case EXEC_OMP_TARGET_DATA: -+ case EXEC_OMP_TARGET_TEAMS: - case EXEC_OMP_TASK: -+ case EXEC_OMP_TEAMS: -+ case EXEC_OMP_WORKSHARE: - if (code->ext.omp_clauses) -- resolve_omp_clauses (code); -+ resolve_omp_clauses (code, &code->loc, code->ext.omp_clauses, NULL); - break; -+ case EXEC_OMP_TARGET_UPDATE: -+ if (code->ext.omp_clauses) -+ resolve_omp_clauses (code, &code->loc, code->ext.omp_clauses, NULL); -+ if (code->ext.omp_clauses == NULL -+ || (code->ext.omp_clauses->lists[OMP_LIST_TO] == NULL -+ && code->ext.omp_clauses->lists[OMP_LIST_FROM] == NULL)) -+ gfc_error ("OMP TARGET UPDATE at %L requires at least one TO or " -+ "FROM clause", &code->loc); -+ break; - case EXEC_OMP_ATOMIC: - resolve_omp_atomic (code); - break; -@@ -1760,3 +3397,165 @@ - break; - } - } -+ -+/* Resolve !$omp declare simd constructs in NS. */ -+ -+void -+gfc_resolve_omp_declare_simd (gfc_namespace *ns) -+{ -+ gfc_omp_declare_simd *ods; -+ -+ for (ods = ns->omp_declare_simd; ods; ods = ods->next) -+ { -+ if (ods->proc_name != ns->proc_name) -+ gfc_error ("!$OMP DECLARE SIMD should refer to containing procedure " -+ "'%s' at %L", ns->proc_name->name, &ods->where); -+ if (ods->clauses) -+ resolve_omp_clauses (NULL, &ods->where, ods->clauses, ns); -+ } -+} -+ -+struct omp_udr_callback_data -+{ -+ gfc_omp_udr *omp_udr; -+ bool is_initializer; -+}; -+ -+static int -+omp_udr_callback (gfc_expr **e, int *walk_subtrees ATTRIBUTE_UNUSED, -+ void *data) -+{ -+ struct omp_udr_callback_data *cd = (struct omp_udr_callback_data *) data; -+ if ((*e)->expr_type == EXPR_VARIABLE) -+ { -+ if (cd->is_initializer) -+ { -+ if ((*e)->symtree->n.sym != cd->omp_udr->omp_priv -+ && (*e)->symtree->n.sym != cd->omp_udr->omp_orig) -+ gfc_error ("Variable other than OMP_PRIV or OMP_ORIG used in " -+ "INITIALIZER clause of !$OMP DECLARE REDUCTION at %L", -+ &(*e)->where); -+ } -+ else -+ { -+ if ((*e)->symtree->n.sym != cd->omp_udr->omp_out -+ && (*e)->symtree->n.sym != cd->omp_udr->omp_in) -+ gfc_error ("Variable other than OMP_OUT or OMP_IN used in " -+ "combiner of !$OMP DECLARE REDUCTION at %L", -+ &(*e)->where); -+ } -+ } -+ return 0; -+} -+ -+/* Resolve !$omp declare reduction constructs. */ -+ -+static void -+gfc_resolve_omp_udr (gfc_omp_udr *omp_udr) -+{ -+ gfc_actual_arglist *a; -+ const char *predef_name = NULL; -+ -+ switch (omp_udr->rop) -+ { -+ case OMP_REDUCTION_PLUS: -+ case OMP_REDUCTION_TIMES: -+ case OMP_REDUCTION_MINUS: -+ case OMP_REDUCTION_AND: -+ case OMP_REDUCTION_OR: -+ case OMP_REDUCTION_EQV: -+ case OMP_REDUCTION_NEQV: -+ case OMP_REDUCTION_MAX: -+ case OMP_REDUCTION_USER: -+ break; -+ default: -+ gfc_error ("Invalid operator for !$OMP DECLARE REDUCTION %s at %L", -+ omp_udr->name, &omp_udr->where); -+ return; -+ } -+ -+ if (gfc_omp_udr_predef (omp_udr->rop, omp_udr->name, -+ &omp_udr->ts, &predef_name)) -+ { -+ if (predef_name) -+ gfc_error_now ("Redefinition of predefined %s " -+ "!$OMP DECLARE REDUCTION at %L", -+ predef_name, &omp_udr->where); -+ else -+ gfc_error_now ("Redefinition of predefined " -+ "!$OMP DECLARE REDUCTION at %L", &omp_udr->where); -+ return; -+ } -+ -+ if (omp_udr->ts.type == BT_CHARACTER -+ && omp_udr->ts.u.cl->length -+ && omp_udr->ts.u.cl->length->expr_type != EXPR_CONSTANT) -+ { -+ gfc_error ("CHARACTER length in !$OMP DECLARE REDUCTION %s not " -+ "constant at %L", omp_udr->name, &omp_udr->where); -+ return; -+ } -+ -+ struct omp_udr_callback_data cd; -+ cd.omp_udr = omp_udr; -+ cd.is_initializer = false; -+ gfc_code_walker (&omp_udr->combiner_ns->code, gfc_dummy_code_callback, -+ omp_udr_callback, &cd); -+ if (omp_udr->combiner_ns->code->op == EXEC_CALL) -+ { -+ for (a = omp_udr->combiner_ns->code->ext.actual; a; a = a->next) -+ if (a->expr == NULL) -+ break; -+ if (a) -+ gfc_error ("Subroutine call with alternate returns in combiner " -+ "of !$OMP DECLARE REDUCTION at %L", -+ &omp_udr->combiner_ns->code->loc); -+ } -+ if (omp_udr->initializer_ns) -+ { -+ cd.is_initializer = true; -+ gfc_code_walker (&omp_udr->initializer_ns->code, gfc_dummy_code_callback, -+ omp_udr_callback, &cd); -+ if (omp_udr->initializer_ns->code->op == EXEC_CALL) -+ { -+ for (a = omp_udr->initializer_ns->code->ext.actual; a; a = a->next) -+ if (a->expr == NULL) -+ break; -+ if (a) -+ gfc_error ("Subroutine call with alternate returns in " -+ "INITIALIZER clause of !$OMP DECLARE REDUCTION " -+ "at %L", &omp_udr->initializer_ns->code->loc); -+ for (a = omp_udr->initializer_ns->code->ext.actual; a; a = a->next) -+ if (a->expr -+ && a->expr->expr_type == EXPR_VARIABLE -+ && a->expr->symtree->n.sym == omp_udr->omp_priv -+ && a->expr->ref == NULL) -+ break; -+ if (a == NULL) -+ gfc_error ("One of actual subroutine arguments in INITIALIZER " -+ "clause of !$OMP DECLARE REDUCTION must be OMP_PRIV " -+ "at %L", &omp_udr->initializer_ns->code->loc); -+ } -+ } -+ else if (omp_udr->ts.type == BT_DERIVED -+ && !gfc_has_default_initializer (omp_udr->ts.u.derived)) -+ { -+ gfc_error ("Missing INITIALIZER clause for !$OMP DECLARE REDUCTION " -+ "of derived type without default initializer at %L", -+ &omp_udr->where); -+ return; -+ } -+} -+ -+void -+gfc_resolve_omp_udrs (gfc_symtree *st) -+{ -+ gfc_omp_udr *omp_udr; -+ -+ if (st == NULL) -+ return; -+ gfc_resolve_omp_udrs (st->left); -+ gfc_resolve_omp_udrs (st->right); -+ for (omp_udr = st->n.omp_udr; omp_udr; omp_udr = omp_udr->next) -+ gfc_resolve_omp_udr (omp_udr); -+} -Index: gcc/fortran/trans-expr.c -=================================================================== ---- a/src/gcc/fortran/trans-expr.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/trans-expr.c (.../branches/gcc-4_9-branch) -@@ -6472,6 +6472,20 @@ - - /* Take the address of that value. */ - se->expr = gfc_build_addr_expr (NULL_TREE, var); -+ if (expr->ts.type == BT_DERIVED && expr->rank -+ && !gfc_is_finalizable (expr->ts.u.derived, NULL) -+ && expr->ts.u.derived->attr.alloc_comp -+ && expr->expr_type != EXPR_VARIABLE) -+ { -+ tree tmp; -+ -+ tmp = build_fold_indirect_ref_loc (input_location, se->expr); -+ tmp = gfc_deallocate_alloc_comp (expr->ts.u.derived, tmp, expr->rank); -+ -+ /* The components shall be deallocated before -+ their containing entity. */ -+ gfc_prepend_expr_to_block (&se->post, tmp); -+ } - } - - -@@ -7251,7 +7265,7 @@ - - res_desc = gfc_evaluate_now (desc, &se->pre); - gfc_conv_descriptor_data_set (&se->pre, res_desc, null_pointer_node); -- se->expr = gfc_build_addr_expr (TREE_TYPE (se->expr), res_desc); -+ se->expr = gfc_build_addr_expr (NULL_TREE, res_desc); - - /* Free the lhs after the function call and copy the result data to - the lhs descriptor. */ -Index: gcc/fortran/trans-array.c -=================================================================== ---- a/src/gcc/fortran/trans-array.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/trans-array.c (.../branches/gcc-4_9-branch) -@@ -7389,8 +7389,8 @@ - - /* This helper function calculates the size in words of a full array. */ - --static tree --get_full_array_size (stmtblock_t *block, tree decl, int rank) -+tree -+gfc_full_array_size (stmtblock_t *block, tree decl, int rank) - { - tree idx; - tree nelems; -@@ -7416,7 +7416,7 @@ - - static tree - duplicate_allocatable (tree dest, tree src, tree type, int rank, -- bool no_malloc, tree str_sz) -+ bool no_malloc, bool no_memcpy, tree str_sz) - { - tree tmp; - tree size; -@@ -7450,9 +7450,13 @@ - gfc_add_expr_to_block (&block, tmp); - } - -- tmp = builtin_decl_explicit (BUILT_IN_MEMCPY); -- tmp = build_call_expr_loc (input_location, tmp, 3, dest, src, -- fold_convert (size_type_node, size)); -+ if (!no_memcpy) -+ { -+ tmp = builtin_decl_explicit (BUILT_IN_MEMCPY); -+ tmp = build_call_expr_loc (input_location, tmp, 3, dest, src, -+ fold_convert (size_type_node, size)); -+ gfc_add_expr_to_block (&block, tmp); -+ } - } - else - { -@@ -7461,7 +7465,7 @@ - - gfc_init_block (&block); - if (rank) -- nelems = get_full_array_size (&block, src, rank); -+ nelems = gfc_full_array_size (&block, src, rank); - else - nelems = gfc_index_one_node; - -@@ -7481,14 +7485,17 @@ - - /* We know the temporary and the value will be the same length, - so can use memcpy. */ -- tmp = builtin_decl_explicit (BUILT_IN_MEMCPY); -- tmp = build_call_expr_loc (input_location, -- tmp, 3, gfc_conv_descriptor_data_get (dest), -- gfc_conv_descriptor_data_get (src), -- fold_convert (size_type_node, size)); -+ if (!no_memcpy) -+ { -+ tmp = builtin_decl_explicit (BUILT_IN_MEMCPY); -+ tmp = build_call_expr_loc (input_location, tmp, 3, -+ gfc_conv_descriptor_data_get (dest), -+ gfc_conv_descriptor_data_get (src), -+ fold_convert (size_type_node, size)); -+ gfc_add_expr_to_block (&block, tmp); -+ } - } - -- gfc_add_expr_to_block (&block, tmp); - tmp = gfc_finish_block (&block); - - /* Null the destination if the source is null; otherwise do -@@ -7510,7 +7517,8 @@ - tree - gfc_duplicate_allocatable (tree dest, tree src, tree type, int rank) - { -- return duplicate_allocatable (dest, src, type, rank, false, NULL_TREE); -+ return duplicate_allocatable (dest, src, type, rank, false, false, -+ NULL_TREE); - } - - -@@ -7519,10 +7527,19 @@ - tree - gfc_copy_allocatable_data (tree dest, tree src, tree type, int rank) - { -- return duplicate_allocatable (dest, src, type, rank, true, NULL_TREE); -+ return duplicate_allocatable (dest, src, type, rank, true, false, -+ NULL_TREE); - } - -+/* Allocate dest to the same size as src, but don't copy anything. */ - -+tree -+gfc_duplicate_allocatable_nocopy (tree dest, tree src, tree type, int rank) -+{ -+ return duplicate_allocatable (dest, src, type, rank, false, true, NULL_TREE); -+} -+ -+ - /* Recursively traverse an object of derived type, generating code to - deallocate, nullify or copy allocatable components. This is the work horse - function for the functions named in this enum. */ -@@ -7579,7 +7596,7 @@ - /* Use the descriptor for an allocatable array. Since this - is a full array reference, we only need the descriptor - information from dimension = rank. */ -- tmp = get_full_array_size (&fnblock, decl, rank); -+ tmp = gfc_full_array_size (&fnblock, decl, rank); - tmp = fold_build2_loc (input_location, MINUS_EXPR, - gfc_array_index_type, tmp, - gfc_index_one_node); -@@ -7938,7 +7955,7 @@ - gfc_add_expr_to_block (&fnblock, tmp); - size = size_of_string_in_bytes (c->ts.kind, len); - tmp = duplicate_allocatable (dcmp, comp, ctype, rank, -- false, size); -+ false, false, size); - gfc_add_expr_to_block (&fnblock, tmp); - } - else if (c->attr.allocatable && !c->attr.proc_pointer -Index: gcc/fortran/symbol.c -=================================================================== ---- a/src/gcc/fortran/symbol.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/symbol.c (.../branches/gcc-4_9-branch) -@@ -367,6 +367,7 @@ - *asynchronous = "ASYNCHRONOUS", *codimension = "CODIMENSION", - *contiguous = "CONTIGUOUS", *generic = "GENERIC"; - static const char *threadprivate = "THREADPRIVATE"; -+ static const char *omp_declare_target = "OMP DECLARE TARGET"; - - const char *a1, *a2; - int standard; -@@ -453,6 +454,7 @@ - conf (dummy, entry); - conf (dummy, intrinsic); - conf (dummy, threadprivate); -+ conf (dummy, omp_declare_target); - conf (pointer, target); - conf (pointer, intrinsic); - conf (pointer, elemental); -@@ -495,6 +497,7 @@ - conf (in_equivalence, entry); - conf (in_equivalence, allocatable); - conf (in_equivalence, threadprivate); -+ conf (in_equivalence, omp_declare_target); - - conf (dummy, result); - conf (entry, result); -@@ -543,6 +546,7 @@ - conf (cray_pointee, in_common); - conf (cray_pointee, in_equivalence); - conf (cray_pointee, threadprivate); -+ conf (cray_pointee, omp_declare_target); - - conf (data, dummy); - conf (data, function); -@@ -596,6 +600,8 @@ - - conf (proc_pointer, abstract) - -+ conf (entry, omp_declare_target) -+ - a1 = gfc_code2string (flavors, attr->flavor); - - if (attr->in_namelist -@@ -631,6 +637,7 @@ - conf2 (function); - conf2 (subroutine); - conf2 (threadprivate); -+ conf2 (omp_declare_target); - - if (attr->access == ACCESS_PUBLIC || attr->access == ACCESS_PRIVATE) - { -@@ -712,6 +719,7 @@ - conf2 (subroutine); - conf2 (threadprivate); - conf2 (result); -+ conf2 (omp_declare_target); - - if (attr->intent != INTENT_UNKNOWN) - { -@@ -1207,6 +1215,22 @@ - - - bool -+gfc_add_omp_declare_target (symbol_attribute *attr, const char *name, -+ locus *where) -+{ -+ -+ if (check_used (attr, name, where)) -+ return false; -+ -+ if (attr->omp_declare_target) -+ return true; -+ -+ attr->omp_declare_target = 1; -+ return check_conflict (attr, name, where); -+} -+ -+ -+bool - gfc_add_target (symbol_attribute *attr, locus *where) - { - -@@ -1761,6 +1785,9 @@ - if (src->threadprivate - && !gfc_add_threadprivate (dest, NULL, where)) - goto fail; -+ if (src->omp_declare_target -+ && !gfc_add_omp_declare_target (dest, NULL, where)) -+ goto fail; - if (src->target && !gfc_add_target (dest, where)) - goto fail; - if (src->dummy && !gfc_add_dummy (dest, NULL, where)) -@@ -2450,17 +2477,20 @@ - { - gfc_user_op *uop; - gfc_symtree *st; -+ gfc_namespace *ns = gfc_current_ns; - -- st = gfc_find_symtree (gfc_current_ns->uop_root, name); -+ if (ns->omp_udr_ns) -+ ns = ns->parent; -+ st = gfc_find_symtree (ns->uop_root, name); - if (st != NULL) - return st->n.uop; - -- st = gfc_new_symtree (&gfc_current_ns->uop_root, name); -+ st = gfc_new_symtree (&ns->uop_root, name); - - uop = st->n.uop = XCNEW (gfc_user_op); - uop->name = gfc_get_string (name); - uop->access = ACCESS_UNKNOWN; -- uop->ns = gfc_current_ns; -+ uop->ns = ns; - - return uop; - } -@@ -2771,6 +2801,12 @@ - /* Try to find the symbol in ns. */ - st = gfc_find_symtree (ns->sym_root, name); - -+ if (st == NULL && ns->omp_udr_ns) -+ { -+ ns = ns->parent; -+ st = gfc_find_symtree (ns->sym_root, name); -+ } -+ - if (st == NULL) - { - /* If not there, create a new symbol. */ -@@ -3269,6 +3305,23 @@ - } - - -+/* Recursive function that deletes an entire tree and all the common -+ head structures it points to. */ -+ -+static void -+free_omp_udr_tree (gfc_symtree * omp_udr_tree) -+{ -+ if (omp_udr_tree == NULL) -+ return; -+ -+ free_omp_udr_tree (omp_udr_tree->left); -+ free_omp_udr_tree (omp_udr_tree->right); -+ -+ gfc_free_omp_udr (omp_udr_tree->n.omp_udr); -+ free (omp_udr_tree); -+} -+ -+ - /* Recursive function that deletes an entire tree and all the user - operator nodes that it contains. */ - -@@ -3465,9 +3518,11 @@ - free_sym_tree (ns->sym_root); - free_uop_tree (ns->uop_root); - free_common_tree (ns->common_root); -+ free_omp_udr_tree (ns->omp_udr_root); - free_tb_tree (ns->tb_sym_root); - free_tb_tree (ns->tb_uop_root); - gfc_free_finalizer_list (ns->finalizers); -+ gfc_free_omp_declare_simd_list (ns->omp_declare_simd); - gfc_free_charlen (ns->cl_list, NULL); - free_st_labels (ns->st_labels); - -Index: gcc/fortran/decl.c -=================================================================== ---- a/src/gcc/fortran/decl.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/decl.c (.../branches/gcc-4_9-branch) -@@ -1997,6 +1997,13 @@ - if (!gfc_notify_std (GFC_STD_GNU, "Old-style " - "initialization at %C")) - return MATCH_ERROR; -+ else if (gfc_current_state () == COMP_DERIVED) -+ { -+ gfc_error ("Invalid old style initialization for derived type " -+ "component at %C"); -+ m = MATCH_ERROR; -+ goto cleanup; -+ } - - return match_old_style_init (name); - } -Index: gcc/fortran/trans-array.h -=================================================================== ---- a/src/gcc/fortran/trans-array.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/trans-array.h (.../branches/gcc-4_9-branch) -@@ -44,10 +44,14 @@ - /* Generate code to deallocate an array, if it is allocated. */ - tree gfc_trans_dealloc_allocated (tree, bool, gfc_expr *); - -+tree gfc_full_array_size (stmtblock_t *, tree, int); -+ - tree gfc_duplicate_allocatable (tree dest, tree src, tree type, int rank); - - tree gfc_copy_allocatable_data (tree dest, tree src, tree type, int rank); - -+tree gfc_duplicate_allocatable_nocopy (tree, tree, tree, int); -+ - tree gfc_nullify_alloc_comp (gfc_symbol *, tree, int); - - tree gfc_deallocate_alloc_comp (gfc_symbol *, tree, int); -Index: gcc/fortran/dump-parse-tree.c -=================================================================== ---- a/src/gcc/fortran/dump-parse-tree.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/dump-parse-tree.c (.../branches/gcc-4_9-branch) -@@ -1016,11 +1016,60 @@ - } - - static void --show_namelist (gfc_namelist *n) -+show_omp_namelist (int list_type, gfc_omp_namelist *n) - { -- for (; n->next; n = n->next) -- fprintf (dumpfile, "%s,", n->sym->name); -- fprintf (dumpfile, "%s", n->sym->name); -+ for (; n; n = n->next) -+ { -+ if (list_type == OMP_LIST_REDUCTION) -+ switch (n->u.reduction_op) -+ { -+ case OMP_REDUCTION_PLUS: -+ case OMP_REDUCTION_TIMES: -+ case OMP_REDUCTION_MINUS: -+ case OMP_REDUCTION_AND: -+ case OMP_REDUCTION_OR: -+ case OMP_REDUCTION_EQV: -+ case OMP_REDUCTION_NEQV: -+ fprintf (dumpfile, "%s:", -+ gfc_op2string ((gfc_intrinsic_op) n->u.reduction_op)); -+ break; -+ case OMP_REDUCTION_MAX: fputs ("max:", dumpfile); break; -+ case OMP_REDUCTION_MIN: fputs ("min:", dumpfile); break; -+ case OMP_REDUCTION_IAND: fputs ("iand:", dumpfile); break; -+ case OMP_REDUCTION_IOR: fputs ("ior:", dumpfile); break; -+ case OMP_REDUCTION_IEOR: fputs ("ieor:", dumpfile); break; -+ case OMP_REDUCTION_USER: -+ if (n->udr) -+ fprintf (dumpfile, "%s:", n->udr->udr->name); -+ break; -+ default: break; -+ } -+ else if (list_type == OMP_LIST_DEPEND) -+ switch (n->u.depend_op) -+ { -+ case OMP_DEPEND_IN: fputs ("in:", dumpfile); break; -+ case OMP_DEPEND_OUT: fputs ("out:", dumpfile); break; -+ case OMP_DEPEND_INOUT: fputs ("inout:", dumpfile); break; -+ default: break; -+ } -+ else if (list_type == OMP_LIST_MAP) -+ switch (n->u.map_op) -+ { -+ case OMP_MAP_ALLOC: fputs ("alloc:", dumpfile); break; -+ case OMP_MAP_TO: fputs ("to:", dumpfile); break; -+ case OMP_MAP_FROM: fputs ("from:", dumpfile); break; -+ case OMP_MAP_TOFROM: fputs ("tofrom:", dumpfile); break; -+ default: break; -+ } -+ fprintf (dumpfile, "%s", n->sym->name); -+ if (n->expr) -+ { -+ fputc (':', dumpfile); -+ show_expr (n->expr); -+ } -+ if (n->next) -+ fputc (',', dumpfile); -+ } - } - - /* Show a single OpenMP directive node and everything underneath it -@@ -1036,18 +1085,24 @@ - { - case EXEC_OMP_ATOMIC: name = "ATOMIC"; break; - case EXEC_OMP_BARRIER: name = "BARRIER"; break; -+ case EXEC_OMP_CANCEL: name = "CANCEL"; break; -+ case EXEC_OMP_CANCELLATION_POINT: name = "CANCELLATION POINT"; break; - case EXEC_OMP_CRITICAL: name = "CRITICAL"; break; - case EXEC_OMP_FLUSH: name = "FLUSH"; break; - case EXEC_OMP_DO: name = "DO"; break; -+ case EXEC_OMP_DO_SIMD: name = "DO SIMD"; break; - case EXEC_OMP_MASTER: name = "MASTER"; break; - case EXEC_OMP_ORDERED: name = "ORDERED"; break; - case EXEC_OMP_PARALLEL: name = "PARALLEL"; break; - case EXEC_OMP_PARALLEL_DO: name = "PARALLEL DO"; break; -+ case EXEC_OMP_PARALLEL_DO_SIMD: name = "PARALLEL DO SIMD"; break; - case EXEC_OMP_PARALLEL_SECTIONS: name = "PARALLEL SECTIONS"; break; - case EXEC_OMP_PARALLEL_WORKSHARE: name = "PARALLEL WORKSHARE"; break; - case EXEC_OMP_SECTIONS: name = "SECTIONS"; break; -+ case EXEC_OMP_SIMD: name = "SIMD"; break; - case EXEC_OMP_SINGLE: name = "SINGLE"; break; - case EXEC_OMP_TASK: name = "TASK"; break; -+ case EXEC_OMP_TASKGROUP: name = "TASKGROUP"; break; - case EXEC_OMP_TASKWAIT: name = "TASKWAIT"; break; - case EXEC_OMP_TASKYIELD: name = "TASKYIELD"; break; - case EXEC_OMP_WORKSHARE: name = "WORKSHARE"; break; -@@ -1057,11 +1112,16 @@ - fprintf (dumpfile, "!$OMP %s", name); - switch (c->op) - { -+ case EXEC_OMP_CANCEL: -+ case EXEC_OMP_CANCELLATION_POINT: - case EXEC_OMP_DO: -+ case EXEC_OMP_DO_SIMD: - case EXEC_OMP_PARALLEL: - case EXEC_OMP_PARALLEL_DO: -+ case EXEC_OMP_PARALLEL_DO_SIMD: - case EXEC_OMP_PARALLEL_SECTIONS: - case EXEC_OMP_SECTIONS: -+ case EXEC_OMP_SIMD: - case EXEC_OMP_SINGLE: - case EXEC_OMP_WORKSHARE: - case EXEC_OMP_PARALLEL_WORKSHARE: -@@ -1076,7 +1136,7 @@ - if (c->ext.omp_namelist) - { - fputs (" (", dumpfile); -- show_namelist (c->ext.omp_namelist); -+ show_omp_namelist (OMP_LIST_NUM, c->ext.omp_namelist); - fputc (')', dumpfile); - } - return; -@@ -1091,6 +1151,23 @@ - { - int list_type; - -+ switch (omp_clauses->cancel) -+ { -+ case OMP_CANCEL_UNKNOWN: -+ break; -+ case OMP_CANCEL_PARALLEL: -+ fputs (" PARALLEL", dumpfile); -+ break; -+ case OMP_CANCEL_SECTIONS: -+ fputs (" SECTIONS", dumpfile); -+ break; -+ case OMP_CANCEL_DO: -+ fputs (" DO", dumpfile); -+ break; -+ case OMP_CANCEL_TASKGROUP: -+ fputs (" TASKGROUP", dumpfile); -+ break; -+ } - if (omp_clauses->if_expr) - { - fputs (" IF(", dumpfile); -@@ -1156,45 +1233,83 @@ - if (omp_clauses->lists[list_type] != NULL - && list_type != OMP_LIST_COPYPRIVATE) - { -- const char *type; -- if (list_type >= OMP_LIST_REDUCTION_FIRST) -+ const char *type = NULL; -+ switch (list_type) - { -- switch (list_type) -- { -- case OMP_LIST_PLUS: type = "+"; break; -- case OMP_LIST_MULT: type = "*"; break; -- case OMP_LIST_SUB: type = "-"; break; -- case OMP_LIST_AND: type = ".AND."; break; -- case OMP_LIST_OR: type = ".OR."; break; -- case OMP_LIST_EQV: type = ".EQV."; break; -- case OMP_LIST_NEQV: type = ".NEQV."; break; -- case OMP_LIST_MAX: type = "MAX"; break; -- case OMP_LIST_MIN: type = "MIN"; break; -- case OMP_LIST_IAND: type = "IAND"; break; -- case OMP_LIST_IOR: type = "IOR"; break; -- case OMP_LIST_IEOR: type = "IEOR"; break; -- default: -- gcc_unreachable (); -- } -- fprintf (dumpfile, " REDUCTION(%s:", type); -+ case OMP_LIST_PRIVATE: type = "PRIVATE"; break; -+ case OMP_LIST_FIRSTPRIVATE: type = "FIRSTPRIVATE"; break; -+ case OMP_LIST_LASTPRIVATE: type = "LASTPRIVATE"; break; -+ case OMP_LIST_SHARED: type = "SHARED"; break; -+ case OMP_LIST_COPYIN: type = "COPYIN"; break; -+ case OMP_LIST_UNIFORM: type = "UNIFORM"; break; -+ case OMP_LIST_ALIGNED: type = "ALIGNED"; break; -+ case OMP_LIST_LINEAR: type = "LINEAR"; break; -+ case OMP_LIST_REDUCTION: type = "REDUCTION"; break; -+ case OMP_LIST_DEPEND: type = "DEPEND"; break; -+ default: -+ gcc_unreachable (); - } -- else -- { -- switch (list_type) -- { -- case OMP_LIST_PRIVATE: type = "PRIVATE"; break; -- case OMP_LIST_FIRSTPRIVATE: type = "FIRSTPRIVATE"; break; -- case OMP_LIST_LASTPRIVATE: type = "LASTPRIVATE"; break; -- case OMP_LIST_SHARED: type = "SHARED"; break; -- case OMP_LIST_COPYIN: type = "COPYIN"; break; -- default: -- gcc_unreachable (); -- } -- fprintf (dumpfile, " %s(", type); -- } -- show_namelist (omp_clauses->lists[list_type]); -+ fprintf (dumpfile, " %s(", type); -+ show_omp_namelist (list_type, omp_clauses->lists[list_type]); - fputc (')', dumpfile); - } -+ if (omp_clauses->safelen_expr) -+ { -+ fputs (" SAFELEN(", dumpfile); -+ show_expr (omp_clauses->safelen_expr); -+ fputc (')', dumpfile); -+ } -+ if (omp_clauses->simdlen_expr) -+ { -+ fputs (" SIMDLEN(", dumpfile); -+ show_expr (omp_clauses->simdlen_expr); -+ fputc (')', dumpfile); -+ } -+ if (omp_clauses->inbranch) -+ fputs (" INBRANCH", dumpfile); -+ if (omp_clauses->notinbranch) -+ fputs (" NOTINBRANCH", dumpfile); -+ if (omp_clauses->proc_bind != OMP_PROC_BIND_UNKNOWN) -+ { -+ const char *type; -+ switch (omp_clauses->proc_bind) -+ { -+ case OMP_PROC_BIND_MASTER: type = "MASTER"; break; -+ case OMP_PROC_BIND_SPREAD: type = "SPREAD"; break; -+ case OMP_PROC_BIND_CLOSE: type = "CLOSE"; break; -+ default: -+ gcc_unreachable (); -+ } -+ fprintf (dumpfile, " PROC_BIND(%s)", type); -+ } -+ if (omp_clauses->num_teams) -+ { -+ fputs (" NUM_TEAMS(", dumpfile); -+ show_expr (omp_clauses->num_teams); -+ fputc (')', dumpfile); -+ } -+ if (omp_clauses->device) -+ { -+ fputs (" DEVICE(", dumpfile); -+ show_expr (omp_clauses->device); -+ fputc (')', dumpfile); -+ } -+ if (omp_clauses->thread_limit) -+ { -+ fputs (" THREAD_LIMIT(", dumpfile); -+ show_expr (omp_clauses->thread_limit); -+ fputc (')', dumpfile); -+ } -+ if (omp_clauses->dist_sched_kind != OMP_SCHED_NONE) -+ { -+ fprintf (dumpfile, " DIST_SCHEDULE (static"); -+ if (omp_clauses->dist_chunk_size) -+ { -+ fputc (',', dumpfile); -+ show_expr (omp_clauses->dist_chunk_size); -+ } -+ fputc (')', dumpfile); -+ } - } - fputc ('\n', dumpfile); - if (c->op == EXEC_OMP_SECTIONS || c->op == EXEC_OMP_PARALLEL_SECTIONS) -@@ -1214,6 +1329,7 @@ - show_code (level + 1, c->block->next); - if (c->op == EXEC_OMP_ATOMIC) - return; -+ fputc ('\n', dumpfile); - code_indent (level, 0); - fprintf (dumpfile, "!$OMP END %s", name); - if (omp_clauses != NULL) -@@ -1221,7 +1337,8 @@ - if (omp_clauses->lists[OMP_LIST_COPYPRIVATE]) - { - fputs (" COPYPRIVATE(", dumpfile); -- show_namelist (omp_clauses->lists[OMP_LIST_COPYPRIVATE]); -+ show_omp_namelist (OMP_LIST_COPYPRIVATE, -+ omp_clauses->lists[OMP_LIST_COPYPRIVATE]); - fputc (')', dumpfile); - } - else if (omp_clauses->nowait) -@@ -2195,19 +2312,25 @@ - break; - - case EXEC_OMP_ATOMIC: -+ case EXEC_OMP_CANCEL: -+ case EXEC_OMP_CANCELLATION_POINT: - case EXEC_OMP_BARRIER: - case EXEC_OMP_CRITICAL: - case EXEC_OMP_FLUSH: - case EXEC_OMP_DO: -+ case EXEC_OMP_DO_SIMD: - case EXEC_OMP_MASTER: - case EXEC_OMP_ORDERED: - case EXEC_OMP_PARALLEL: - case EXEC_OMP_PARALLEL_DO: -+ case EXEC_OMP_PARALLEL_DO_SIMD: - case EXEC_OMP_PARALLEL_SECTIONS: - case EXEC_OMP_PARALLEL_WORKSHARE: - case EXEC_OMP_SECTIONS: -+ case EXEC_OMP_SIMD: - case EXEC_OMP_SINGLE: - case EXEC_OMP_TASK: -+ case EXEC_OMP_TASKGROUP: - case EXEC_OMP_TASKWAIT: - case EXEC_OMP_TASKYIELD: - case EXEC_OMP_WORKSHARE: -Index: gcc/fortran/trans-common.c -=================================================================== ---- a/src/gcc/fortran/trans-common.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/trans-common.c (.../branches/gcc-4_9-branch) -@@ -456,6 +456,11 @@ - if (com->threadprivate) - DECL_TLS_MODEL (decl) = decl_default_tls_model (decl); - -+ if (com->omp_declare_target) -+ DECL_ATTRIBUTES (decl) -+ = tree_cons (get_identifier ("omp declare target"), -+ NULL_TREE, DECL_ATTRIBUTES (decl)); -+ - /* Place the back end declaration for this common block in - GLOBAL_BINDING_LEVEL. */ - gfc_map_of_all_commons[identifier] = pushdecl_top_level (decl); -@@ -705,6 +710,7 @@ - TREE_ADDRESSABLE (var_decl) = 1; - /* Fake variables are not visible from other translation units. */ - TREE_PUBLIC (var_decl) = 0; -+ gfc_finish_decl_attrs (var_decl, &s->sym->attr); - - /* To preserve identifier names in COMMON, chain to procedure - scope unless at top level in a module definition. */ -Index: gcc/fortran/cpp.c -=================================================================== ---- a/src/gcc/fortran/cpp.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/cpp.c (.../branches/gcc-4_9-branch) -@@ -171,7 +171,7 @@ - cpp_define (pfile, "_LANGUAGE_FORTRAN=1"); - - if (gfc_option.gfc_flag_openmp) -- cpp_define (pfile, "_OPENMP=201107"); -+ cpp_define (pfile, "_OPENMP=201307"); - - /* The defines below are necessary for the TARGET_* macros. - -Index: gcc/fortran/trans-openmp.c -=================================================================== ---- a/src/gcc/fortran/trans-openmp.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/trans-openmp.c (.../branches/gcc-4_9-branch) -@@ -53,9 +53,13 @@ - if (TREE_CODE (type) == POINTER_TYPE) - { - /* Array POINTER/ALLOCATABLE have aggregate types, all user variables -- that have POINTER_TYPE type and don't have GFC_POINTER_TYPE_P -- set are supposed to be privatized by reference. */ -- if (GFC_POINTER_TYPE_P (type)) -+ that have POINTER_TYPE type and aren't scalar pointers, scalar -+ allocatables, Cray pointees or C pointers are supposed to be -+ privatized by reference. */ -+ if (GFC_DECL_GET_SCALAR_POINTER (decl) -+ || GFC_DECL_GET_SCALAR_ALLOCATABLE (decl) -+ || GFC_DECL_CRAY_POINTEE (decl) -+ || VOID_TYPE_P (TREE_TYPE (TREE_TYPE (decl)))) - return false; - - if (!DECL_ARTIFICIAL (decl) -@@ -77,6 +81,19 @@ - enum omp_clause_default_kind - gfc_omp_predetermined_sharing (tree decl) - { -+ /* Associate names preserve the association established during ASSOCIATE. -+ As they are implemented either as pointers to the selector or array -+ descriptor and shouldn't really change in the ASSOCIATE region, -+ this decl can be either shared or firstprivate. If it is a pointer, -+ use firstprivate, as it is cheaper that way, otherwise make it shared. */ -+ if (GFC_DECL_ASSOCIATE_VAR_P (decl)) -+ { -+ if (TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE) -+ return OMP_CLAUSE_DEFAULT_FIRSTPRIVATE; -+ else -+ return OMP_CLAUSE_DEFAULT_SHARED; -+ } -+ - if (DECL_ARTIFICIAL (decl) - && ! GFC_DECL_RESULT (decl) - && ! (DECL_LANG_SPECIFIC (decl) -@@ -135,6 +152,41 @@ - return decl; - } - -+/* Return true if TYPE has any allocatable components. */ -+ -+static bool -+gfc_has_alloc_comps (tree type, tree decl) -+{ -+ tree field, ftype; -+ -+ if (POINTER_TYPE_P (type)) -+ { -+ if (GFC_DECL_GET_SCALAR_ALLOCATABLE (decl)) -+ type = TREE_TYPE (type); -+ else if (GFC_DECL_GET_SCALAR_POINTER (decl)) -+ return false; -+ } -+ -+ while (GFC_DESCRIPTOR_TYPE_P (type) || GFC_ARRAY_TYPE_P (type)) -+ type = gfc_get_element_type (type); -+ -+ if (TREE_CODE (type) != RECORD_TYPE) -+ return false; -+ -+ for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field)) -+ { -+ ftype = TREE_TYPE (field); -+ if (GFC_DECL_GET_SCALAR_ALLOCATABLE (field)) -+ return true; -+ if (GFC_DESCRIPTOR_TYPE_P (ftype) -+ && GFC_TYPE_ARRAY_AKIND (ftype) == GFC_ARRAY_ALLOCATABLE) -+ return true; -+ if (gfc_has_alloc_comps (ftype, field)) -+ return true; -+ } -+ return false; -+} -+ - /* Return true if DECL in private clause needs - OMP_CLAUSE_PRIVATE_OUTER_REF on the private clause. */ - bool -@@ -146,9 +198,230 @@ - && GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ALLOCATABLE) - return true; - -+ if (GFC_DECL_GET_SCALAR_ALLOCATABLE (decl)) -+ return true; -+ -+ if (gfc_omp_privatize_by_reference (decl)) -+ type = TREE_TYPE (type); -+ -+ if (gfc_has_alloc_comps (type, decl)) -+ return true; -+ - return false; - } - -+/* Callback for gfc_omp_unshare_expr. */ -+ -+static tree -+gfc_omp_unshare_expr_r (tree *tp, int *walk_subtrees, void *) -+{ -+ tree t = *tp; -+ enum tree_code code = TREE_CODE (t); -+ -+ /* Stop at types, decls, constants like copy_tree_r. */ -+ if (TREE_CODE_CLASS (code) == tcc_type -+ || TREE_CODE_CLASS (code) == tcc_declaration -+ || TREE_CODE_CLASS (code) == tcc_constant -+ || code == BLOCK) -+ *walk_subtrees = 0; -+ else if (handled_component_p (t) -+ || TREE_CODE (t) == MEM_REF) -+ { -+ *tp = unshare_expr (t); -+ *walk_subtrees = 0; -+ } -+ -+ return NULL_TREE; -+} -+ -+/* Unshare in expr anything that the FE which normally doesn't -+ care much about tree sharing (because during gimplification -+ everything is unshared) could cause problems with tree sharing -+ at omp-low.c time. */ -+ -+static tree -+gfc_omp_unshare_expr (tree expr) -+{ -+ walk_tree (&expr, gfc_omp_unshare_expr_r, NULL, NULL); -+ return expr; -+} -+ -+enum walk_alloc_comps -+{ -+ WALK_ALLOC_COMPS_DTOR, -+ WALK_ALLOC_COMPS_DEFAULT_CTOR, -+ WALK_ALLOC_COMPS_COPY_CTOR -+}; -+ -+/* Handle allocatable components in OpenMP clauses. */ -+ -+static tree -+gfc_walk_alloc_comps (tree decl, tree dest, tree var, -+ enum walk_alloc_comps kind) -+{ -+ stmtblock_t block, tmpblock; -+ tree type = TREE_TYPE (decl), then_b, tem, field; -+ gfc_init_block (&block); -+ -+ if (GFC_ARRAY_TYPE_P (type) || GFC_DESCRIPTOR_TYPE_P (type)) -+ { -+ if (GFC_DESCRIPTOR_TYPE_P (type)) -+ { -+ gfc_init_block (&tmpblock); -+ tem = gfc_full_array_size (&tmpblock, decl, -+ GFC_TYPE_ARRAY_RANK (type)); -+ then_b = gfc_finish_block (&tmpblock); -+ gfc_add_expr_to_block (&block, gfc_omp_unshare_expr (then_b)); -+ tem = gfc_omp_unshare_expr (tem); -+ tem = fold_build2_loc (input_location, MINUS_EXPR, -+ gfc_array_index_type, tem, -+ gfc_index_one_node); -+ } -+ else -+ { -+ if (!TYPE_DOMAIN (type) -+ || TYPE_MAX_VALUE (TYPE_DOMAIN (type)) == NULL_TREE -+ || TYPE_MIN_VALUE (TYPE_DOMAIN (type)) == error_mark_node -+ || TYPE_MAX_VALUE (TYPE_DOMAIN (type)) == error_mark_node) -+ { -+ tem = fold_build2 (EXACT_DIV_EXPR, sizetype, -+ TYPE_SIZE_UNIT (type), -+ TYPE_SIZE_UNIT (TREE_TYPE (type))); -+ tem = size_binop (MINUS_EXPR, tem, size_one_node); -+ } -+ else -+ tem = array_type_nelts (type); -+ tem = fold_convert (gfc_array_index_type, tem); -+ } -+ -+ tree nelems = gfc_evaluate_now (tem, &block); -+ tree index = gfc_create_var (gfc_array_index_type, "S"); -+ -+ gfc_init_block (&tmpblock); -+ tem = gfc_conv_array_data (decl); -+ tree declvar = build_fold_indirect_ref_loc (input_location, tem); -+ tree declvref = gfc_build_array_ref (declvar, index, NULL); -+ tree destvar, destvref = NULL_TREE; -+ if (dest) -+ { -+ tem = gfc_conv_array_data (dest); -+ destvar = build_fold_indirect_ref_loc (input_location, tem); -+ destvref = gfc_build_array_ref (destvar, index, NULL); -+ } -+ gfc_add_expr_to_block (&tmpblock, -+ gfc_walk_alloc_comps (declvref, destvref, -+ var, kind)); -+ -+ gfc_loopinfo loop; -+ gfc_init_loopinfo (&loop); -+ loop.dimen = 1; -+ loop.from[0] = gfc_index_zero_node; -+ loop.loopvar[0] = index; -+ loop.to[0] = nelems; -+ gfc_trans_scalarizing_loops (&loop, &tmpblock); -+ gfc_add_block_to_block (&block, &loop.pre); -+ return gfc_finish_block (&block); -+ } -+ else if (GFC_DECL_GET_SCALAR_ALLOCATABLE (var)) -+ { -+ decl = build_fold_indirect_ref_loc (input_location, decl); -+ if (dest) -+ dest = build_fold_indirect_ref_loc (input_location, dest); -+ type = TREE_TYPE (decl); -+ } -+ -+ gcc_assert (TREE_CODE (type) == RECORD_TYPE); -+ for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field)) -+ { -+ tree ftype = TREE_TYPE (field); -+ tree declf, destf = NULL_TREE; -+ bool has_alloc_comps = gfc_has_alloc_comps (ftype, field); -+ if ((!GFC_DESCRIPTOR_TYPE_P (ftype) -+ || GFC_TYPE_ARRAY_AKIND (ftype) != GFC_ARRAY_ALLOCATABLE) -+ && !GFC_DECL_GET_SCALAR_ALLOCATABLE (field) -+ && !has_alloc_comps) -+ continue; -+ declf = fold_build3_loc (input_location, COMPONENT_REF, ftype, -+ decl, field, NULL_TREE); -+ if (dest) -+ destf = fold_build3_loc (input_location, COMPONENT_REF, ftype, -+ dest, field, NULL_TREE); -+ -+ tem = NULL_TREE; -+ switch (kind) -+ { -+ case WALK_ALLOC_COMPS_DTOR: -+ break; -+ case WALK_ALLOC_COMPS_DEFAULT_CTOR: -+ if (GFC_DESCRIPTOR_TYPE_P (ftype) -+ && GFC_TYPE_ARRAY_AKIND (ftype) == GFC_ARRAY_ALLOCATABLE) -+ { -+ gfc_add_modify (&block, unshare_expr (destf), -+ unshare_expr (declf)); -+ tem = gfc_duplicate_allocatable_nocopy -+ (destf, declf, ftype, -+ GFC_TYPE_ARRAY_RANK (ftype)); -+ } -+ else if (GFC_DECL_GET_SCALAR_ALLOCATABLE (field)) -+ tem = gfc_duplicate_allocatable_nocopy (destf, declf, ftype, 0); -+ break; -+ case WALK_ALLOC_COMPS_COPY_CTOR: -+ if (GFC_DESCRIPTOR_TYPE_P (ftype) -+ && GFC_TYPE_ARRAY_AKIND (ftype) == GFC_ARRAY_ALLOCATABLE) -+ tem = gfc_duplicate_allocatable (destf, declf, ftype, -+ GFC_TYPE_ARRAY_RANK (ftype)); -+ else if (GFC_DECL_GET_SCALAR_ALLOCATABLE (field)) -+ tem = gfc_duplicate_allocatable (destf, declf, ftype, 0); -+ break; -+ } -+ if (tem) -+ gfc_add_expr_to_block (&block, gfc_omp_unshare_expr (tem)); -+ if (has_alloc_comps) -+ { -+ gfc_init_block (&tmpblock); -+ gfc_add_expr_to_block (&tmpblock, -+ gfc_walk_alloc_comps (declf, destf, -+ field, kind)); -+ then_b = gfc_finish_block (&tmpblock); -+ if (GFC_DESCRIPTOR_TYPE_P (ftype) -+ && GFC_TYPE_ARRAY_AKIND (ftype) == GFC_ARRAY_ALLOCATABLE) -+ tem = gfc_conv_descriptor_data_get (unshare_expr (declf)); -+ else if (GFC_DECL_GET_SCALAR_ALLOCATABLE (field)) -+ tem = unshare_expr (declf); -+ else -+ tem = NULL_TREE; -+ if (tem) -+ { -+ tem = fold_convert (pvoid_type_node, tem); -+ tem = fold_build2_loc (input_location, NE_EXPR, -+ boolean_type_node, tem, -+ null_pointer_node); -+ then_b = build3_loc (input_location, COND_EXPR, void_type_node, -+ tem, then_b, -+ build_empty_stmt (input_location)); -+ } -+ gfc_add_expr_to_block (&block, then_b); -+ } -+ if (kind == WALK_ALLOC_COMPS_DTOR) -+ { -+ if (GFC_DESCRIPTOR_TYPE_P (ftype) -+ && GFC_TYPE_ARRAY_AKIND (ftype) == GFC_ARRAY_ALLOCATABLE) -+ { -+ tem = gfc_trans_dealloc_allocated (unshare_expr (declf), -+ false, NULL); -+ gfc_add_expr_to_block (&block, gfc_omp_unshare_expr (tem)); -+ } -+ else if (GFC_DECL_GET_SCALAR_ALLOCATABLE (field)) -+ { -+ tem = gfc_call_free (unshare_expr (declf)); -+ gfc_add_expr_to_block (&block, gfc_omp_unshare_expr (tem)); -+ } -+ } -+ } -+ -+ return gfc_finish_block (&block); -+} -+ - /* Return code to initialize DECL with its default constructor, or - NULL if there's nothing to do. */ - -@@ -155,21 +428,34 @@ - tree - gfc_omp_clause_default_ctor (tree clause, tree decl, tree outer) - { -- tree type = TREE_TYPE (decl), rank, size, esize, ptr, cond, then_b, else_b; -+ tree type = TREE_TYPE (decl), size, ptr, cond, then_b, else_b; - stmtblock_t block, cond_block; - -- if (! GFC_DESCRIPTOR_TYPE_P (type) -- || GFC_TYPE_ARRAY_AKIND (type) != GFC_ARRAY_ALLOCATABLE) -- return NULL; -+ gcc_assert (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_PRIVATE -+ || OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_LASTPRIVATE -+ || OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_LINEAR -+ || OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_REDUCTION); - -- if (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_REDUCTION) -- return NULL; -+ if ((! GFC_DESCRIPTOR_TYPE_P (type) -+ || GFC_TYPE_ARRAY_AKIND (type) != GFC_ARRAY_ALLOCATABLE) -+ && !GFC_DECL_GET_SCALAR_ALLOCATABLE (OMP_CLAUSE_DECL (clause))) -+ { -+ if (gfc_has_alloc_comps (type, OMP_CLAUSE_DECL (clause))) -+ { -+ gcc_assert (outer); -+ gfc_start_block (&block); -+ tree tem = gfc_walk_alloc_comps (outer, decl, -+ OMP_CLAUSE_DECL (clause), -+ WALK_ALLOC_COMPS_DEFAULT_CTOR); -+ gfc_add_expr_to_block (&block, tem); -+ return gfc_finish_block (&block); -+ } -+ return NULL_TREE; -+ } - -- gcc_assert (outer != NULL); -- gcc_assert (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_PRIVATE -- || OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_LASTPRIVATE); -+ gcc_assert (outer != NULL_TREE); - -- /* Allocatable arrays in PRIVATE clauses need to be set to -+ /* Allocatable arrays and scalars in PRIVATE clauses need to be set to - "not currently allocated" allocation status if outer - array is "not currently allocated", otherwise should be allocated. */ - gfc_start_block (&block); -@@ -176,38 +462,71 @@ - - gfc_init_block (&cond_block); - -- gfc_add_modify (&cond_block, decl, outer); -- rank = gfc_rank_cst[GFC_TYPE_ARRAY_RANK (type) - 1]; -- size = gfc_conv_descriptor_ubound_get (decl, rank); -- size = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type, -- size, gfc_conv_descriptor_lbound_get (decl, rank)); -- size = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type, -- size, gfc_index_one_node); -- if (GFC_TYPE_ARRAY_RANK (type) > 1) -- size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, -- size, gfc_conv_descriptor_stride_get (decl, rank)); -- esize = fold_convert (gfc_array_index_type, -- TYPE_SIZE_UNIT (gfc_get_element_type (type))); -- size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, -- size, esize); -- size = gfc_evaluate_now (fold_convert (size_type_node, size), &cond_block); -- -+ if (GFC_DESCRIPTOR_TYPE_P (type)) -+ { -+ gfc_add_modify (&cond_block, decl, outer); -+ tree rank = gfc_rank_cst[GFC_TYPE_ARRAY_RANK (type) - 1]; -+ size = gfc_conv_descriptor_ubound_get (decl, rank); -+ size = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type, -+ size, -+ gfc_conv_descriptor_lbound_get (decl, rank)); -+ size = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type, -+ size, gfc_index_one_node); -+ if (GFC_TYPE_ARRAY_RANK (type) > 1) -+ size = fold_build2_loc (input_location, MULT_EXPR, -+ gfc_array_index_type, size, -+ gfc_conv_descriptor_stride_get (decl, rank)); -+ tree esize = fold_convert (gfc_array_index_type, -+ TYPE_SIZE_UNIT (gfc_get_element_type (type))); -+ size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, -+ size, esize); -+ size = unshare_expr (size); -+ size = gfc_evaluate_now (fold_convert (size_type_node, size), -+ &cond_block); -+ } -+ else -+ size = fold_convert (size_type_node, TYPE_SIZE_UNIT (TREE_TYPE (type))); - ptr = gfc_create_var (pvoid_type_node, NULL); - gfc_allocate_using_malloc (&cond_block, ptr, size, NULL_TREE); -- gfc_conv_descriptor_data_set (&cond_block, decl, ptr); -- -+ if (GFC_DESCRIPTOR_TYPE_P (type)) -+ gfc_conv_descriptor_data_set (&cond_block, unshare_expr (decl), ptr); -+ else -+ gfc_add_modify (&cond_block, unshare_expr (decl), -+ fold_convert (TREE_TYPE (decl), ptr)); -+ if (gfc_has_alloc_comps (type, OMP_CLAUSE_DECL (clause))) -+ { -+ tree tem = gfc_walk_alloc_comps (outer, decl, -+ OMP_CLAUSE_DECL (clause), -+ WALK_ALLOC_COMPS_DEFAULT_CTOR); -+ gfc_add_expr_to_block (&cond_block, tem); -+ } - then_b = gfc_finish_block (&cond_block); - -- gfc_init_block (&cond_block); -- gfc_conv_descriptor_data_set (&cond_block, decl, null_pointer_node); -- else_b = gfc_finish_block (&cond_block); -+ /* Reduction clause requires allocated ALLOCATABLE. */ -+ if (OMP_CLAUSE_CODE (clause) != OMP_CLAUSE_REDUCTION) -+ { -+ gfc_init_block (&cond_block); -+ if (GFC_DESCRIPTOR_TYPE_P (type)) -+ gfc_conv_descriptor_data_set (&cond_block, unshare_expr (decl), -+ null_pointer_node); -+ else -+ gfc_add_modify (&cond_block, unshare_expr (decl), -+ build_zero_cst (TREE_TYPE (decl))); -+ else_b = gfc_finish_block (&cond_block); - -- cond = fold_build2_loc (input_location, NE_EXPR, boolean_type_node, -- fold_convert (pvoid_type_node, -- gfc_conv_descriptor_data_get (outer)), -- null_pointer_node); -- gfc_add_expr_to_block (&block, build3_loc (input_location, COND_EXPR, -- void_type_node, cond, then_b, else_b)); -+ tree tem = fold_convert (pvoid_type_node, -+ GFC_DESCRIPTOR_TYPE_P (type) -+ ? gfc_conv_descriptor_data_get (outer) : outer); -+ tem = unshare_expr (tem); -+ cond = fold_build2_loc (input_location, NE_EXPR, boolean_type_node, -+ tem, null_pointer_node); -+ gfc_add_expr_to_block (&block, -+ build3_loc (input_location, COND_EXPR, -+ void_type_node, cond, then_b, -+ else_b)); -+ } -+ else -+ gfc_add_expr_to_block (&block, then_b); - - return gfc_finish_block (&block); - } -@@ -217,15 +536,29 @@ - tree - gfc_omp_clause_copy_ctor (tree clause, tree dest, tree src) - { -- tree type = TREE_TYPE (dest), ptr, size, esize, rank, call; -+ tree type = TREE_TYPE (dest), ptr, size, call; - tree cond, then_b, else_b; - stmtblock_t block, cond_block; - -- if (! GFC_DESCRIPTOR_TYPE_P (type) -- || GFC_TYPE_ARRAY_AKIND (type) != GFC_ARRAY_ALLOCATABLE) -- return build2_v (MODIFY_EXPR, dest, src); -+ gcc_assert (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_FIRSTPRIVATE -+ || OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_LINEAR); - -- gcc_assert (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_FIRSTPRIVATE); -+ if ((! GFC_DESCRIPTOR_TYPE_P (type) -+ || GFC_TYPE_ARRAY_AKIND (type) != GFC_ARRAY_ALLOCATABLE) -+ && !GFC_DECL_GET_SCALAR_ALLOCATABLE (OMP_CLAUSE_DECL (clause))) -+ { -+ if (gfc_has_alloc_comps (type, OMP_CLAUSE_DECL (clause))) -+ { -+ gfc_start_block (&block); -+ gfc_add_modify (&block, dest, src); -+ tree tem = gfc_walk_alloc_comps (src, dest, OMP_CLAUSE_DECL (clause), -+ WALK_ALLOC_COMPS_COPY_CTOR); -+ gfc_add_expr_to_block (&block, tem); -+ return gfc_finish_block (&block); -+ } -+ else -+ return build2_v (MODIFY_EXPR, dest, src); -+ } - - /* Allocatable arrays in FIRSTPRIVATE clauses need to be allocated - and copied from SRC. */ -@@ -234,110 +567,554 @@ - gfc_init_block (&cond_block); - - gfc_add_modify (&cond_block, dest, src); -- rank = gfc_rank_cst[GFC_TYPE_ARRAY_RANK (type) - 1]; -- size = gfc_conv_descriptor_ubound_get (dest, rank); -- size = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type, -- size, gfc_conv_descriptor_lbound_get (dest, rank)); -- size = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type, -- size, gfc_index_one_node); -- if (GFC_TYPE_ARRAY_RANK (type) > 1) -- size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, -- size, gfc_conv_descriptor_stride_get (dest, rank)); -- esize = fold_convert (gfc_array_index_type, -- TYPE_SIZE_UNIT (gfc_get_element_type (type))); -- size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, -- size, esize); -- size = gfc_evaluate_now (fold_convert (size_type_node, size), &cond_block); -- -+ if (GFC_DESCRIPTOR_TYPE_P (type)) -+ { -+ tree rank = gfc_rank_cst[GFC_TYPE_ARRAY_RANK (type) - 1]; -+ size = gfc_conv_descriptor_ubound_get (dest, rank); -+ size = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type, -+ size, -+ gfc_conv_descriptor_lbound_get (dest, rank)); -+ size = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type, -+ size, gfc_index_one_node); -+ if (GFC_TYPE_ARRAY_RANK (type) > 1) -+ size = fold_build2_loc (input_location, MULT_EXPR, -+ gfc_array_index_type, size, -+ gfc_conv_descriptor_stride_get (dest, rank)); -+ tree esize = fold_convert (gfc_array_index_type, -+ TYPE_SIZE_UNIT (gfc_get_element_type (type))); -+ size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, -+ size, esize); -+ size = unshare_expr (size); -+ size = gfc_evaluate_now (fold_convert (size_type_node, size), -+ &cond_block); -+ } -+ else -+ size = fold_convert (size_type_node, TYPE_SIZE_UNIT (TREE_TYPE (type))); - ptr = gfc_create_var (pvoid_type_node, NULL); - gfc_allocate_using_malloc (&cond_block, ptr, size, NULL_TREE); -- gfc_conv_descriptor_data_set (&cond_block, dest, ptr); -+ if (GFC_DESCRIPTOR_TYPE_P (type)) -+ gfc_conv_descriptor_data_set (&cond_block, unshare_expr (dest), ptr); -+ else -+ gfc_add_modify (&cond_block, unshare_expr (dest), -+ fold_convert (TREE_TYPE (dest), ptr)); - -+ tree srcptr = GFC_DESCRIPTOR_TYPE_P (type) -+ ? gfc_conv_descriptor_data_get (src) : src; -+ srcptr = unshare_expr (srcptr); -+ srcptr = fold_convert (pvoid_type_node, srcptr); - call = build_call_expr_loc (input_location, -- builtin_decl_explicit (BUILT_IN_MEMCPY), -- 3, ptr, -- fold_convert (pvoid_type_node, -- gfc_conv_descriptor_data_get (src)), -- size); -+ builtin_decl_explicit (BUILT_IN_MEMCPY), 3, ptr, -+ srcptr, size); - gfc_add_expr_to_block (&cond_block, fold_convert (void_type_node, call)); -+ if (gfc_has_alloc_comps (type, OMP_CLAUSE_DECL (clause))) -+ { -+ tree tem = gfc_walk_alloc_comps (src, dest, -+ OMP_CLAUSE_DECL (clause), -+ WALK_ALLOC_COMPS_COPY_CTOR); -+ gfc_add_expr_to_block (&cond_block, tem); -+ } - then_b = gfc_finish_block (&cond_block); - - gfc_init_block (&cond_block); -- gfc_conv_descriptor_data_set (&cond_block, dest, null_pointer_node); -+ if (GFC_DESCRIPTOR_TYPE_P (type)) -+ gfc_conv_descriptor_data_set (&cond_block, unshare_expr (dest), -+ null_pointer_node); -+ else -+ gfc_add_modify (&cond_block, unshare_expr (dest), -+ build_zero_cst (TREE_TYPE (dest))); - else_b = gfc_finish_block (&cond_block); - - cond = fold_build2_loc (input_location, NE_EXPR, boolean_type_node, -- fold_convert (pvoid_type_node, -- gfc_conv_descriptor_data_get (src)), -- null_pointer_node); -- gfc_add_expr_to_block (&block, build3_loc (input_location, COND_EXPR, -- void_type_node, cond, then_b, else_b)); -+ unshare_expr (srcptr), null_pointer_node); -+ gfc_add_expr_to_block (&block, -+ build3_loc (input_location, COND_EXPR, -+ void_type_node, cond, then_b, else_b)); - - return gfc_finish_block (&block); - } - --/* Similarly, except use an assignment operator instead. */ -+/* Similarly, except use an intrinsic or pointer assignment operator -+ instead. */ - - tree --gfc_omp_clause_assign_op (tree clause ATTRIBUTE_UNUSED, tree dest, tree src) -+gfc_omp_clause_assign_op (tree clause, tree dest, tree src) - { -- tree type = TREE_TYPE (dest), rank, size, esize, call; -- stmtblock_t block; -+ tree type = TREE_TYPE (dest), ptr, size, call, nonalloc; -+ tree cond, then_b, else_b; -+ stmtblock_t block, cond_block, cond_block2, inner_block; - -- if (! GFC_DESCRIPTOR_TYPE_P (type) -- || GFC_TYPE_ARRAY_AKIND (type) != GFC_ARRAY_ALLOCATABLE) -- return build2_v (MODIFY_EXPR, dest, src); -+ if ((! GFC_DESCRIPTOR_TYPE_P (type) -+ || GFC_TYPE_ARRAY_AKIND (type) != GFC_ARRAY_ALLOCATABLE) -+ && !GFC_DECL_GET_SCALAR_ALLOCATABLE (OMP_CLAUSE_DECL (clause))) -+ { -+ if (gfc_has_alloc_comps (type, OMP_CLAUSE_DECL (clause))) -+ { -+ gfc_start_block (&block); -+ /* First dealloc any allocatable components in DEST. */ -+ tree tem = gfc_walk_alloc_comps (dest, NULL_TREE, -+ OMP_CLAUSE_DECL (clause), -+ WALK_ALLOC_COMPS_DTOR); -+ gfc_add_expr_to_block (&block, tem); -+ /* Then copy over toplevel data. */ -+ gfc_add_modify (&block, dest, src); -+ /* Finally allocate any allocatable components and copy. */ -+ tem = gfc_walk_alloc_comps (src, dest, OMP_CLAUSE_DECL (clause), -+ WALK_ALLOC_COMPS_COPY_CTOR); -+ gfc_add_expr_to_block (&block, tem); -+ return gfc_finish_block (&block); -+ } -+ else -+ return build2_v (MODIFY_EXPR, dest, src); -+ } - -- /* Handle copying allocatable arrays. */ - gfc_start_block (&block); - -- rank = gfc_rank_cst[GFC_TYPE_ARRAY_RANK (type) - 1]; -- size = gfc_conv_descriptor_ubound_get (dest, rank); -- size = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type, -- size, gfc_conv_descriptor_lbound_get (dest, rank)); -- size = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type, -- size, gfc_index_one_node); -- if (GFC_TYPE_ARRAY_RANK (type) > 1) -- size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, -- size, gfc_conv_descriptor_stride_get (dest, rank)); -- esize = fold_convert (gfc_array_index_type, -- TYPE_SIZE_UNIT (gfc_get_element_type (type))); -- size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, -- size, esize); -- size = gfc_evaluate_now (fold_convert (size_type_node, size), &block); -+ if (gfc_has_alloc_comps (type, OMP_CLAUSE_DECL (clause))) -+ { -+ then_b = gfc_walk_alloc_comps (dest, NULL_TREE, OMP_CLAUSE_DECL (clause), -+ WALK_ALLOC_COMPS_DTOR); -+ tree tem = fold_convert (pvoid_type_node, -+ GFC_DESCRIPTOR_TYPE_P (type) -+ ? gfc_conv_descriptor_data_get (dest) : dest); -+ tem = unshare_expr (tem); -+ cond = fold_build2_loc (input_location, NE_EXPR, boolean_type_node, -+ tem, null_pointer_node); -+ tem = build3_loc (input_location, COND_EXPR, void_type_node, cond, -+ then_b, build_empty_stmt (input_location)); -+ gfc_add_expr_to_block (&block, tem); -+ } -+ -+ gfc_init_block (&cond_block); -+ -+ if (GFC_DESCRIPTOR_TYPE_P (type)) -+ { -+ tree rank = gfc_rank_cst[GFC_TYPE_ARRAY_RANK (type) - 1]; -+ size = gfc_conv_descriptor_ubound_get (src, rank); -+ size = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type, -+ size, -+ gfc_conv_descriptor_lbound_get (src, rank)); -+ size = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type, -+ size, gfc_index_one_node); -+ if (GFC_TYPE_ARRAY_RANK (type) > 1) -+ size = fold_build2_loc (input_location, MULT_EXPR, -+ gfc_array_index_type, size, -+ gfc_conv_descriptor_stride_get (src, rank)); -+ tree esize = fold_convert (gfc_array_index_type, -+ TYPE_SIZE_UNIT (gfc_get_element_type (type))); -+ size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, -+ size, esize); -+ size = unshare_expr (size); -+ size = gfc_evaluate_now (fold_convert (size_type_node, size), -+ &cond_block); -+ } -+ else -+ size = fold_convert (size_type_node, TYPE_SIZE_UNIT (TREE_TYPE (type))); -+ ptr = gfc_create_var (pvoid_type_node, NULL); -+ -+ tree destptr = GFC_DESCRIPTOR_TYPE_P (type) -+ ? gfc_conv_descriptor_data_get (dest) : dest; -+ destptr = unshare_expr (destptr); -+ destptr = fold_convert (pvoid_type_node, destptr); -+ gfc_add_modify (&cond_block, ptr, destptr); -+ -+ nonalloc = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node, -+ destptr, null_pointer_node); -+ cond = nonalloc; -+ if (GFC_DESCRIPTOR_TYPE_P (type)) -+ { -+ int i; -+ for (i = 0; i < GFC_TYPE_ARRAY_RANK (type); i++) -+ { -+ tree rank = gfc_rank_cst[i]; -+ tree tem = gfc_conv_descriptor_ubound_get (src, rank); -+ tem = fold_build2_loc (input_location, MINUS_EXPR, -+ gfc_array_index_type, tem, -+ gfc_conv_descriptor_lbound_get (src, rank)); -+ tem = fold_build2_loc (input_location, PLUS_EXPR, -+ gfc_array_index_type, tem, -+ gfc_conv_descriptor_lbound_get (dest, rank)); -+ tem = fold_build2_loc (input_location, NE_EXPR, boolean_type_node, -+ tem, gfc_conv_descriptor_ubound_get (dest, -+ rank)); -+ cond = fold_build2_loc (input_location, TRUTH_ORIF_EXPR, -+ boolean_type_node, cond, tem); -+ } -+ } -+ -+ gfc_init_block (&cond_block2); -+ -+ if (GFC_DESCRIPTOR_TYPE_P (type)) -+ { -+ gfc_init_block (&inner_block); -+ gfc_allocate_using_malloc (&inner_block, ptr, size, NULL_TREE); -+ then_b = gfc_finish_block (&inner_block); -+ -+ gfc_init_block (&inner_block); -+ gfc_add_modify (&inner_block, ptr, -+ gfc_call_realloc (&inner_block, ptr, size)); -+ else_b = gfc_finish_block (&inner_block); -+ -+ gfc_add_expr_to_block (&cond_block2, -+ build3_loc (input_location, COND_EXPR, -+ void_type_node, -+ unshare_expr (nonalloc), -+ then_b, else_b)); -+ gfc_add_modify (&cond_block2, dest, src); -+ gfc_conv_descriptor_data_set (&cond_block2, unshare_expr (dest), ptr); -+ } -+ else -+ { -+ gfc_allocate_using_malloc (&cond_block2, ptr, size, NULL_TREE); -+ gfc_add_modify (&cond_block2, unshare_expr (dest), -+ fold_convert (type, ptr)); -+ } -+ then_b = gfc_finish_block (&cond_block2); -+ else_b = build_empty_stmt (input_location); -+ -+ gfc_add_expr_to_block (&cond_block, -+ build3_loc (input_location, COND_EXPR, -+ void_type_node, unshare_expr (cond), -+ then_b, else_b)); -+ -+ tree srcptr = GFC_DESCRIPTOR_TYPE_P (type) -+ ? gfc_conv_descriptor_data_get (src) : src; -+ srcptr = unshare_expr (srcptr); -+ srcptr = fold_convert (pvoid_type_node, srcptr); - call = build_call_expr_loc (input_location, -- builtin_decl_explicit (BUILT_IN_MEMCPY), 3, -- fold_convert (pvoid_type_node, -- gfc_conv_descriptor_data_get (dest)), -- fold_convert (pvoid_type_node, -- gfc_conv_descriptor_data_get (src)), -- size); -- gfc_add_expr_to_block (&block, fold_convert (void_type_node, call)); -+ builtin_decl_explicit (BUILT_IN_MEMCPY), 3, ptr, -+ srcptr, size); -+ gfc_add_expr_to_block (&cond_block, fold_convert (void_type_node, call)); -+ if (gfc_has_alloc_comps (type, OMP_CLAUSE_DECL (clause))) -+ { -+ tree tem = gfc_walk_alloc_comps (src, dest, -+ OMP_CLAUSE_DECL (clause), -+ WALK_ALLOC_COMPS_COPY_CTOR); -+ gfc_add_expr_to_block (&cond_block, tem); -+ } -+ then_b = gfc_finish_block (&cond_block); - -+ if (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_COPYIN) -+ { -+ gfc_init_block (&cond_block); -+ if (GFC_DESCRIPTOR_TYPE_P (type)) -+ gfc_add_expr_to_block (&cond_block, -+ gfc_trans_dealloc_allocated (unshare_expr (dest), -+ false, NULL)); -+ else -+ { -+ destptr = gfc_evaluate_now (destptr, &cond_block); -+ gfc_add_expr_to_block (&cond_block, gfc_call_free (destptr)); -+ gfc_add_modify (&cond_block, unshare_expr (dest), -+ build_zero_cst (TREE_TYPE (dest))); -+ } -+ else_b = gfc_finish_block (&cond_block); -+ -+ cond = fold_build2_loc (input_location, NE_EXPR, boolean_type_node, -+ unshare_expr (srcptr), null_pointer_node); -+ gfc_add_expr_to_block (&block, -+ build3_loc (input_location, COND_EXPR, -+ void_type_node, cond, -+ then_b, else_b)); -+ } -+ else -+ gfc_add_expr_to_block (&block, then_b); -+ - return gfc_finish_block (&block); - } - -+static void -+gfc_omp_linear_clause_add_loop (stmtblock_t *block, tree dest, tree src, -+ tree add, tree nelems) -+{ -+ stmtblock_t tmpblock; -+ tree desta, srca, index = gfc_create_var (gfc_array_index_type, "S"); -+ nelems = gfc_evaluate_now (nelems, block); -+ -+ gfc_init_block (&tmpblock); -+ if (TREE_CODE (TREE_TYPE (dest)) == ARRAY_TYPE) -+ { -+ desta = gfc_build_array_ref (dest, index, NULL); -+ srca = gfc_build_array_ref (src, index, NULL); -+ } -+ else -+ { -+ gcc_assert (POINTER_TYPE_P (TREE_TYPE (dest))); -+ tree idx = fold_build2 (MULT_EXPR, sizetype, -+ fold_convert (sizetype, index), -+ TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (dest)))); -+ desta = build_fold_indirect_ref (fold_build2 (POINTER_PLUS_EXPR, -+ TREE_TYPE (dest), dest, -+ idx)); -+ srca = build_fold_indirect_ref (fold_build2 (POINTER_PLUS_EXPR, -+ TREE_TYPE (src), src, -+ idx)); -+ } -+ gfc_add_modify (&tmpblock, desta, -+ fold_build2 (PLUS_EXPR, TREE_TYPE (desta), -+ srca, add)); -+ -+ gfc_loopinfo loop; -+ gfc_init_loopinfo (&loop); -+ loop.dimen = 1; -+ loop.from[0] = gfc_index_zero_node; -+ loop.loopvar[0] = index; -+ loop.to[0] = nelems; -+ gfc_trans_scalarizing_loops (&loop, &tmpblock); -+ gfc_add_block_to_block (block, &loop.pre); -+} -+ -+/* Build and return code for a constructor of DEST that initializes -+ it to SRC plus ADD (ADD is scalar integer). */ -+ -+tree -+gfc_omp_clause_linear_ctor (tree clause, tree dest, tree src, tree add) -+{ -+ tree type = TREE_TYPE (dest), ptr, size, nelems = NULL_TREE; -+ stmtblock_t block; -+ -+ gcc_assert (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_LINEAR); -+ -+ gfc_start_block (&block); -+ add = gfc_evaluate_now (add, &block); -+ -+ if ((! GFC_DESCRIPTOR_TYPE_P (type) -+ || GFC_TYPE_ARRAY_AKIND (type) != GFC_ARRAY_ALLOCATABLE) -+ && !GFC_DECL_GET_SCALAR_ALLOCATABLE (OMP_CLAUSE_DECL (clause))) -+ { -+ gcc_assert (TREE_CODE (type) == ARRAY_TYPE); -+ if (!TYPE_DOMAIN (type) -+ || TYPE_MAX_VALUE (TYPE_DOMAIN (type)) == NULL_TREE -+ || TYPE_MIN_VALUE (TYPE_DOMAIN (type)) == error_mark_node -+ || TYPE_MAX_VALUE (TYPE_DOMAIN (type)) == error_mark_node) -+ { -+ nelems = fold_build2 (EXACT_DIV_EXPR, sizetype, -+ TYPE_SIZE_UNIT (type), -+ TYPE_SIZE_UNIT (TREE_TYPE (type))); -+ nelems = size_binop (MINUS_EXPR, nelems, size_one_node); -+ } -+ else -+ nelems = array_type_nelts (type); -+ nelems = fold_convert (gfc_array_index_type, nelems); -+ -+ gfc_omp_linear_clause_add_loop (&block, dest, src, add, nelems); -+ return gfc_finish_block (&block); -+ } -+ -+ /* Allocatable arrays in LINEAR clauses need to be allocated -+ and copied from SRC. */ -+ gfc_add_modify (&block, dest, src); -+ if (GFC_DESCRIPTOR_TYPE_P (type)) -+ { -+ tree rank = gfc_rank_cst[GFC_TYPE_ARRAY_RANK (type) - 1]; -+ size = gfc_conv_descriptor_ubound_get (dest, rank); -+ size = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type, -+ size, -+ gfc_conv_descriptor_lbound_get (dest, rank)); -+ size = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type, -+ size, gfc_index_one_node); -+ if (GFC_TYPE_ARRAY_RANK (type) > 1) -+ size = fold_build2_loc (input_location, MULT_EXPR, -+ gfc_array_index_type, size, -+ gfc_conv_descriptor_stride_get (dest, rank)); -+ tree esize = fold_convert (gfc_array_index_type, -+ TYPE_SIZE_UNIT (gfc_get_element_type (type))); -+ nelems = gfc_evaluate_now (unshare_expr (size), &block); -+ size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, -+ nelems, unshare_expr (esize)); -+ size = gfc_evaluate_now (fold_convert (size_type_node, size), -+ &block); -+ nelems = fold_build2_loc (input_location, MINUS_EXPR, -+ gfc_array_index_type, nelems, -+ gfc_index_one_node); -+ } -+ else -+ size = fold_convert (size_type_node, TYPE_SIZE_UNIT (TREE_TYPE (type))); -+ ptr = gfc_create_var (pvoid_type_node, NULL); -+ gfc_allocate_using_malloc (&block, ptr, size, NULL_TREE); -+ if (GFC_DESCRIPTOR_TYPE_P (type)) -+ { -+ gfc_conv_descriptor_data_set (&block, unshare_expr (dest), ptr); -+ tree etype = gfc_get_element_type (type); -+ ptr = fold_convert (build_pointer_type (etype), ptr); -+ tree srcptr = gfc_conv_descriptor_data_get (unshare_expr (src)); -+ srcptr = fold_convert (build_pointer_type (etype), srcptr); -+ gfc_omp_linear_clause_add_loop (&block, ptr, srcptr, add, nelems); -+ } -+ else -+ { -+ gfc_add_modify (&block, unshare_expr (dest), -+ fold_convert (TREE_TYPE (dest), ptr)); -+ ptr = fold_convert (TREE_TYPE (dest), ptr); -+ tree dstm = build_fold_indirect_ref (ptr); -+ tree srcm = build_fold_indirect_ref (unshare_expr (src)); -+ gfc_add_modify (&block, dstm, -+ fold_build2 (PLUS_EXPR, TREE_TYPE (add), srcm, add)); -+ } -+ return gfc_finish_block (&block); -+} -+ - /* Build and return code destructing DECL. Return NULL if nothing - to be done. */ - - tree --gfc_omp_clause_dtor (tree clause ATTRIBUTE_UNUSED, tree decl) -+gfc_omp_clause_dtor (tree clause, tree decl) - { -- tree type = TREE_TYPE (decl); -+ tree type = TREE_TYPE (decl), tem; - -- if (! GFC_DESCRIPTOR_TYPE_P (type) -- || GFC_TYPE_ARRAY_AKIND (type) != GFC_ARRAY_ALLOCATABLE) -- return NULL; -+ if ((! GFC_DESCRIPTOR_TYPE_P (type) -+ || GFC_TYPE_ARRAY_AKIND (type) != GFC_ARRAY_ALLOCATABLE) -+ && !GFC_DECL_GET_SCALAR_ALLOCATABLE (OMP_CLAUSE_DECL (clause))) -+ { -+ if (gfc_has_alloc_comps (type, OMP_CLAUSE_DECL (clause))) -+ return gfc_walk_alloc_comps (decl, NULL_TREE, -+ OMP_CLAUSE_DECL (clause), -+ WALK_ALLOC_COMPS_DTOR); -+ return NULL_TREE; -+ } - -- if (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_REDUCTION) -- return NULL; -+ if (GFC_DESCRIPTOR_TYPE_P (type)) -+ /* Allocatable arrays in FIRSTPRIVATE/LASTPRIVATE etc. clauses need -+ to be deallocated if they were allocated. */ -+ tem = gfc_trans_dealloc_allocated (decl, false, NULL); -+ else -+ tem = gfc_call_free (decl); -+ tem = gfc_omp_unshare_expr (tem); - -- /* Allocatable arrays in FIRSTPRIVATE/LASTPRIVATE etc. clauses need -- to be deallocated if they were allocated. */ -- return gfc_trans_dealloc_allocated (decl, false, NULL); -+ if (gfc_has_alloc_comps (type, OMP_CLAUSE_DECL (clause))) -+ { -+ stmtblock_t block; -+ tree then_b; -+ -+ gfc_init_block (&block); -+ gfc_add_expr_to_block (&block, -+ gfc_walk_alloc_comps (decl, NULL_TREE, -+ OMP_CLAUSE_DECL (clause), -+ WALK_ALLOC_COMPS_DTOR)); -+ gfc_add_expr_to_block (&block, tem); -+ then_b = gfc_finish_block (&block); -+ -+ tem = fold_convert (pvoid_type_node, -+ GFC_DESCRIPTOR_TYPE_P (type) -+ ? gfc_conv_descriptor_data_get (decl) : decl); -+ tem = unshare_expr (tem); -+ tree cond = fold_build2_loc (input_location, NE_EXPR, boolean_type_node, -+ tem, null_pointer_node); -+ tem = build3_loc (input_location, COND_EXPR, void_type_node, cond, -+ then_b, build_empty_stmt (input_location)); -+ } -+ return tem; - } - - -+void -+gfc_omp_finish_clause (tree c, gimple_seq *pre_p) -+{ -+ if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_MAP) -+ return; -+ -+ tree decl = OMP_CLAUSE_DECL (c); -+ tree c2 = NULL_TREE, c3 = NULL_TREE, c4 = NULL_TREE; -+ if (POINTER_TYPE_P (TREE_TYPE (decl))) -+ { -+ if (!gfc_omp_privatize_by_reference (decl) -+ && !GFC_DECL_GET_SCALAR_POINTER (decl) -+ && !GFC_DECL_GET_SCALAR_ALLOCATABLE (decl) -+ && !GFC_DECL_CRAY_POINTEE (decl) -+ && !GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (TREE_TYPE (decl)))) -+ return; -+ c4 = build_omp_clause (OMP_CLAUSE_LOCATION (c), OMP_CLAUSE_MAP); -+ OMP_CLAUSE_MAP_KIND (c4) = OMP_CLAUSE_MAP_POINTER; -+ OMP_CLAUSE_DECL (c4) = decl; -+ OMP_CLAUSE_SIZE (c4) = size_int (0); -+ decl = build_fold_indirect_ref (decl); -+ OMP_CLAUSE_DECL (c) = decl; -+ OMP_CLAUSE_SIZE (c) = NULL_TREE; -+ } -+ if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (decl))) -+ { -+ stmtblock_t block; -+ gfc_start_block (&block); -+ tree type = TREE_TYPE (decl); -+ tree ptr = gfc_conv_descriptor_data_get (decl); -+ ptr = fold_convert (build_pointer_type (char_type_node), ptr); -+ ptr = build_fold_indirect_ref (ptr); -+ OMP_CLAUSE_DECL (c) = ptr; -+ c2 = build_omp_clause (input_location, OMP_CLAUSE_MAP); -+ OMP_CLAUSE_MAP_KIND (c2) = OMP_CLAUSE_MAP_TO_PSET; -+ OMP_CLAUSE_DECL (c2) = decl; -+ OMP_CLAUSE_SIZE (c2) = TYPE_SIZE_UNIT (type); -+ c3 = build_omp_clause (OMP_CLAUSE_LOCATION (c), OMP_CLAUSE_MAP); -+ OMP_CLAUSE_MAP_KIND (c3) = OMP_CLAUSE_MAP_POINTER; -+ OMP_CLAUSE_DECL (c3) = gfc_conv_descriptor_data_get (decl); -+ OMP_CLAUSE_SIZE (c3) = size_int (0); -+ tree size = create_tmp_var (gfc_array_index_type, NULL); -+ tree elemsz = TYPE_SIZE_UNIT (gfc_get_element_type (type)); -+ elemsz = fold_convert (gfc_array_index_type, elemsz); -+ if (GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_POINTER -+ || GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_POINTER_CONT) -+ { -+ stmtblock_t cond_block; -+ tree tem, then_b, else_b, zero, cond; -+ -+ gfc_init_block (&cond_block); -+ tem = gfc_full_array_size (&cond_block, decl, -+ GFC_TYPE_ARRAY_RANK (type)); -+ gfc_add_modify (&cond_block, size, tem); -+ gfc_add_modify (&cond_block, size, -+ fold_build2 (MULT_EXPR, gfc_array_index_type, -+ size, elemsz)); -+ then_b = gfc_finish_block (&cond_block); -+ gfc_init_block (&cond_block); -+ zero = build_int_cst (gfc_array_index_type, 0); -+ gfc_add_modify (&cond_block, size, zero); -+ else_b = gfc_finish_block (&cond_block); -+ tem = gfc_conv_descriptor_data_get (decl); -+ tem = fold_convert (pvoid_type_node, tem); -+ cond = fold_build2_loc (input_location, NE_EXPR, -+ boolean_type_node, tem, null_pointer_node); -+ gfc_add_expr_to_block (&block, build3_loc (input_location, COND_EXPR, -+ void_type_node, cond, -+ then_b, else_b)); -+ } -+ else -+ { -+ gfc_add_modify (&block, size, -+ gfc_full_array_size (&block, decl, -+ GFC_TYPE_ARRAY_RANK (type))); -+ gfc_add_modify (&block, size, -+ fold_build2 (MULT_EXPR, gfc_array_index_type, -+ size, elemsz)); -+ } -+ OMP_CLAUSE_SIZE (c) = size; -+ tree stmt = gfc_finish_block (&block); -+ gimplify_and_add (stmt, pre_p); -+ } -+ tree last = c; -+ if (OMP_CLAUSE_SIZE (c) == NULL_TREE) -+ OMP_CLAUSE_SIZE (c) -+ = DECL_P (decl) ? DECL_SIZE_UNIT (decl) -+ : TYPE_SIZE_UNIT (TREE_TYPE (decl)); -+ if (c2) -+ { -+ OMP_CLAUSE_CHAIN (c2) = OMP_CLAUSE_CHAIN (last); -+ OMP_CLAUSE_CHAIN (last) = c2; -+ last = c2; -+ } -+ if (c3) -+ { -+ OMP_CLAUSE_CHAIN (c3) = OMP_CLAUSE_CHAIN (last); -+ OMP_CLAUSE_CHAIN (last) = c3; -+ last = c3; -+ } -+ if (c4) -+ { -+ OMP_CLAUSE_CHAIN (c4) = OMP_CLAUSE_CHAIN (last); -+ OMP_CLAUSE_CHAIN (last) = c4; -+ last = c4; -+ } -+} -+ -+ - /* Return true if DECL's DECL_VALUE_EXPR (if any) should be - disregarded in OpenMP construct, because it is going to be - remapped during OpenMP lowering. SHARED is true if DECL -@@ -427,8 +1204,33 @@ - } - - static tree --gfc_trans_omp_variable (gfc_symbol *sym) -+gfc_trans_omp_variable (gfc_symbol *sym, bool declare_simd) - { -+ if (declare_simd) -+ { -+ int cnt = 0; -+ gfc_symbol *proc_sym; -+ gfc_formal_arglist *f; -+ -+ gcc_assert (sym->attr.dummy); -+ proc_sym = sym->ns->proc_name; -+ if (proc_sym->attr.entry_master) -+ ++cnt; -+ if (gfc_return_by_reference (proc_sym)) -+ { -+ ++cnt; -+ if (proc_sym->ts.type == BT_CHARACTER) -+ ++cnt; -+ } -+ for (f = gfc_sym_get_dummy_args (proc_sym); f; f = f->next) -+ if (f->sym == sym) -+ break; -+ else if (f->sym) -+ ++cnt; -+ gcc_assert (f); -+ return build_int_cst (integer_type_node, cnt); -+ } -+ - tree t = gfc_get_symbol_decl (sym); - tree parent_decl; - int parent_flag; -@@ -442,7 +1244,8 @@ - entry_master = sym->attr.result - && sym->ns->proc_name->attr.entry_master - && !gfc_return_by_reference (sym->ns->proc_name); -- parent_decl = DECL_CONTEXT (current_function_decl); -+ parent_decl = current_function_decl -+ ? DECL_CONTEXT (current_function_decl) : NULL_TREE; - - if ((t == parent_decl && return_value) - || (sym->ns && sym->ns->proc_name -@@ -481,13 +1284,14 @@ - } - - static tree --gfc_trans_omp_variable_list (enum omp_clause_code code, gfc_namelist *namelist, -- tree list) -+gfc_trans_omp_variable_list (enum omp_clause_code code, -+ gfc_omp_namelist *namelist, tree list, -+ bool declare_simd) - { - for (; namelist != NULL; namelist = namelist->next) -- if (namelist->sym->attr.referenced) -+ if (namelist->sym->attr.referenced || declare_simd) - { -- tree t = gfc_trans_omp_variable (namelist->sym); -+ tree t = gfc_trans_omp_variable (namelist->sym, declare_simd); - if (t != error_mark_node) - { - tree node = build_omp_clause (input_location, code); -@@ -498,12 +1302,32 @@ - return list; - } - -+struct omp_udr_find_orig_data -+{ -+ gfc_omp_udr *omp_udr; -+ bool omp_orig_seen; -+}; -+ -+static int -+omp_udr_find_orig (gfc_expr **e, int *walk_subtrees ATTRIBUTE_UNUSED, -+ void *data) -+{ -+ struct omp_udr_find_orig_data *cd = (struct omp_udr_find_orig_data *) data; -+ if ((*e)->expr_type == EXPR_VARIABLE -+ && (*e)->symtree->n.sym == cd->omp_udr->omp_orig) -+ cd->omp_orig_seen = true; -+ -+ return 0; -+} -+ - static void --gfc_trans_omp_array_reduction (tree c, gfc_symbol *sym, locus where) -+gfc_trans_omp_array_reduction_or_udr (tree c, gfc_omp_namelist *n, locus where) - { -+ gfc_symbol *sym = n->sym; - gfc_symtree *root1 = NULL, *root2 = NULL, *root3 = NULL, *root4 = NULL; - gfc_symtree *symtree1, *symtree2, *symtree3, *symtree4 = NULL; - gfc_symbol init_val_sym, outer_sym, intrinsic_sym; -+ gfc_symbol omp_var_copy[4]; - gfc_expr *e1, *e2, *e3, *e4; - gfc_ref *ref; - tree decl, backend_decl, stmt, type, outer_decl; -@@ -510,6 +1334,7 @@ - locus old_loc = gfc_current_locus; - const char *iname; - bool t; -+ gfc_omp_udr *udr = n->udr ? n->udr->udr : NULL; - - decl = OMP_CLAUSE_DECL (c); - gfc_current_locus = where; -@@ -532,12 +1357,29 @@ - init_val_sym.attr.referenced = 1; - init_val_sym.declared_at = where; - init_val_sym.attr.flavor = FL_VARIABLE; -- backend_decl = omp_reduction_init (c, gfc_sym_type (&init_val_sym)); -+ if (OMP_CLAUSE_REDUCTION_CODE (c) != ERROR_MARK) -+ backend_decl = omp_reduction_init (c, gfc_sym_type (&init_val_sym)); -+ else if (udr->initializer_ns) -+ backend_decl = NULL; -+ else -+ switch (sym->ts.type) -+ { -+ case BT_LOGICAL: -+ case BT_INTEGER: -+ case BT_REAL: -+ case BT_COMPLEX: -+ backend_decl = build_zero_cst (gfc_sym_type (&init_val_sym)); -+ break; -+ default: -+ backend_decl = NULL_TREE; -+ break; -+ } - init_val_sym.backend_decl = backend_decl; - - /* Create a fake symbol for the outer array reference. */ - outer_sym = *sym; -- outer_sym.as = gfc_copy_array_spec (sym->as); -+ if (sym->as) -+ outer_sym.as = gfc_copy_array_spec (sym->as); - outer_sym.attr.dummy = 0; - outer_sym.attr.result = 0; - outer_sym.attr.flavor = FL_VARIABLE; -@@ -558,6 +1400,22 @@ - symtree3->n.sym = &outer_sym; - gcc_assert (symtree3 == root3); - -+ memset (omp_var_copy, 0, sizeof omp_var_copy); -+ if (udr) -+ { -+ omp_var_copy[0] = *udr->omp_out; -+ omp_var_copy[1] = *udr->omp_in; -+ *udr->omp_out = outer_sym; -+ *udr->omp_in = *sym; -+ if (udr->initializer_ns) -+ { -+ omp_var_copy[2] = *udr->omp_priv; -+ omp_var_copy[3] = *udr->omp_orig; -+ *udr->omp_priv = *sym; -+ *udr->omp_orig = outer_sym; -+ } -+ } -+ - /* Create expressions. */ - e1 = gfc_get_expr (); - e1->expr_type = EXPR_VARIABLE; -@@ -564,22 +1422,53 @@ - e1->where = where; - e1->symtree = symtree1; - e1->ts = sym->ts; -- e1->ref = ref = gfc_get_ref (); -- ref->type = REF_ARRAY; -- ref->u.ar.where = where; -- ref->u.ar.as = sym->as; -- ref->u.ar.type = AR_FULL; -- ref->u.ar.dimen = 0; -+ if (sym->attr.dimension) -+ { -+ e1->ref = ref = gfc_get_ref (); -+ ref->type = REF_ARRAY; -+ ref->u.ar.where = where; -+ ref->u.ar.as = sym->as; -+ ref->u.ar.type = AR_FULL; -+ ref->u.ar.dimen = 0; -+ } - t = gfc_resolve_expr (e1); - gcc_assert (t); - -- e2 = gfc_get_expr (); -- e2->expr_type = EXPR_VARIABLE; -- e2->where = where; -- e2->symtree = symtree2; -- e2->ts = sym->ts; -- t = gfc_resolve_expr (e2); -- gcc_assert (t); -+ e2 = NULL; -+ if (backend_decl != NULL_TREE) -+ { -+ e2 = gfc_get_expr (); -+ e2->expr_type = EXPR_VARIABLE; -+ e2->where = where; -+ e2->symtree = symtree2; -+ e2->ts = sym->ts; -+ t = gfc_resolve_expr (e2); -+ gcc_assert (t); -+ } -+ else if (udr->initializer_ns == NULL) -+ { -+ gcc_assert (sym->ts.type == BT_DERIVED); -+ e2 = gfc_default_initializer (&sym->ts); -+ gcc_assert (e2); -+ t = gfc_resolve_expr (e2); -+ gcc_assert (t); -+ } -+ else if (n->udr->initializer->op == EXEC_ASSIGN) -+ { -+ e2 = gfc_copy_expr (n->udr->initializer->expr2); -+ t = gfc_resolve_expr (e2); -+ gcc_assert (t); -+ } -+ if (udr && udr->initializer_ns) -+ { -+ struct omp_udr_find_orig_data cd; -+ cd.omp_udr = udr; -+ cd.omp_orig_seen = false; -+ gfc_code_walker (&n->udr->initializer, -+ gfc_dummy_code_callback, omp_udr_find_orig, &cd); -+ if (cd.omp_orig_seen) -+ OMP_CLAUSE_REDUCTION_OMP_ORIG_REF (c) = 1; -+ } - - e3 = gfc_copy_expr (e1); - e3->symtree = symtree3; -@@ -587,6 +1476,7 @@ - gcc_assert (t); - - iname = NULL; -+ e4 = NULL; - switch (OMP_CLAUSE_REDUCTION_CODE (c)) - { - case PLUS_EXPR: -@@ -623,6 +1513,18 @@ - case BIT_XOR_EXPR: - iname = "ieor"; - break; -+ case ERROR_MARK: -+ if (n->udr->combiner->op == EXEC_ASSIGN) -+ { -+ gfc_free_expr (e3); -+ e3 = gfc_copy_expr (n->udr->combiner->expr1); -+ e4 = gfc_copy_expr (n->udr->combiner->expr2); -+ t = gfc_resolve_expr (e3); -+ gcc_assert (t); -+ t = gfc_resolve_expr (e4); -+ gcc_assert (t); -+ } -+ break; - default: - gcc_unreachable (); - } -@@ -646,58 +1548,27 @@ - e4->expr_type = EXPR_FUNCTION; - e4->where = where; - e4->symtree = symtree4; -- e4->value.function.isym = gfc_find_function (iname); - e4->value.function.actual = gfc_get_actual_arglist (); - e4->value.function.actual->expr = e3; - e4->value.function.actual->next = gfc_get_actual_arglist (); - e4->value.function.actual->next->expr = e1; - } -- /* e1 and e3 have been stored as arguments of e4, avoid sharing. */ -- e1 = gfc_copy_expr (e1); -- e3 = gfc_copy_expr (e3); -- t = gfc_resolve_expr (e4); -- gcc_assert (t); -+ if (OMP_CLAUSE_REDUCTION_CODE (c) != ERROR_MARK) -+ { -+ /* e1 and e3 have been stored as arguments of e4, avoid sharing. */ -+ e1 = gfc_copy_expr (e1); -+ e3 = gfc_copy_expr (e3); -+ t = gfc_resolve_expr (e4); -+ gcc_assert (t); -+ } - - /* Create the init statement list. */ - pushlevel (); -- if (GFC_DESCRIPTOR_TYPE_P (type) -- && GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ALLOCATABLE) -- { -- /* If decl is an allocatable array, it needs to be allocated -- with the same bounds as the outer var. */ -- tree rank, size, esize, ptr; -- stmtblock_t block; -- -- gfc_start_block (&block); -- -- gfc_add_modify (&block, decl, outer_sym.backend_decl); -- rank = gfc_rank_cst[GFC_TYPE_ARRAY_RANK (type) - 1]; -- size = gfc_conv_descriptor_ubound_get (decl, rank); -- size = fold_build2_loc (input_location, MINUS_EXPR, -- gfc_array_index_type, size, -- gfc_conv_descriptor_lbound_get (decl, rank)); -- size = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type, -- size, gfc_index_one_node); -- if (GFC_TYPE_ARRAY_RANK (type) > 1) -- size = fold_build2_loc (input_location, MULT_EXPR, -- gfc_array_index_type, size, -- gfc_conv_descriptor_stride_get (decl, rank)); -- esize = fold_convert (gfc_array_index_type, -- TYPE_SIZE_UNIT (gfc_get_element_type (type))); -- size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, -- size, esize); -- size = gfc_evaluate_now (fold_convert (size_type_node, size), &block); -- -- ptr = gfc_create_var (pvoid_type_node, NULL); -- gfc_allocate_using_malloc (&block, ptr, size, NULL_TREE); -- gfc_conv_descriptor_data_set (&block, decl, ptr); -- -- gfc_add_expr_to_block (&block, gfc_trans_assignment (e1, e2, false, -- false)); -- stmt = gfc_finish_block (&block); -- } -+ if (e2) -+ stmt = gfc_trans_assignment (e1, e2, false, false); - else -- stmt = gfc_trans_assignment (e1, e2, false, false); -+ stmt = gfc_trans_call (n->udr->initializer, false, -+ NULL_TREE, NULL_TREE, false); - if (TREE_CODE (stmt) != BIND_EXPR) - stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0)); - else -@@ -706,22 +1577,11 @@ - - /* Create the merge statement list. */ - pushlevel (); -- if (GFC_DESCRIPTOR_TYPE_P (type) -- && GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ALLOCATABLE) -- { -- /* If decl is an allocatable array, it needs to be deallocated -- afterwards. */ -- stmtblock_t block; -- -- gfc_start_block (&block); -- gfc_add_expr_to_block (&block, gfc_trans_assignment (e3, e4, false, -- true)); -- gfc_add_expr_to_block (&block, gfc_trans_dealloc_allocated (decl, false, -- NULL)); -- stmt = gfc_finish_block (&block); -- } -+ if (e4) -+ stmt = gfc_trans_assignment (e3, e4, false, true); - else -- stmt = gfc_trans_assignment (e3, e4, false, true); -+ stmt = gfc_trans_call (n->udr->combiner, false, -+ NULL_TREE, NULL_TREE, false); - if (TREE_CODE (stmt) != BIND_EXPR) - stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0)); - else -@@ -734,32 +1594,91 @@ - gfc_current_locus = old_loc; - - gfc_free_expr (e1); -- gfc_free_expr (e2); -+ if (e2) -+ gfc_free_expr (e2); - gfc_free_expr (e3); -- gfc_free_expr (e4); -+ if (e4) -+ gfc_free_expr (e4); - free (symtree1); - free (symtree2); - free (symtree3); - free (symtree4); -- gfc_free_array_spec (outer_sym.as); -+ if (outer_sym.as) -+ gfc_free_array_spec (outer_sym.as); -+ -+ if (udr) -+ { -+ *udr->omp_out = omp_var_copy[0]; -+ *udr->omp_in = omp_var_copy[1]; -+ if (udr->initializer_ns) -+ { -+ *udr->omp_priv = omp_var_copy[2]; -+ *udr->omp_orig = omp_var_copy[3]; -+ } -+ } - } - - static tree --gfc_trans_omp_reduction_list (gfc_namelist *namelist, tree list, -- enum tree_code reduction_code, locus where) -+gfc_trans_omp_reduction_list (gfc_omp_namelist *namelist, tree list, -+ locus where) - { - for (; namelist != NULL; namelist = namelist->next) - if (namelist->sym->attr.referenced) - { -- tree t = gfc_trans_omp_variable (namelist->sym); -+ tree t = gfc_trans_omp_variable (namelist->sym, false); - if (t != error_mark_node) - { - tree node = build_omp_clause (where.lb->location, - OMP_CLAUSE_REDUCTION); - OMP_CLAUSE_DECL (node) = t; -- OMP_CLAUSE_REDUCTION_CODE (node) = reduction_code; -- if (namelist->sym->attr.dimension) -- gfc_trans_omp_array_reduction (node, namelist->sym, where); -+ switch (namelist->u.reduction_op) -+ { -+ case OMP_REDUCTION_PLUS: -+ OMP_CLAUSE_REDUCTION_CODE (node) = PLUS_EXPR; -+ break; -+ case OMP_REDUCTION_MINUS: -+ OMP_CLAUSE_REDUCTION_CODE (node) = MINUS_EXPR; -+ break; -+ case OMP_REDUCTION_TIMES: -+ OMP_CLAUSE_REDUCTION_CODE (node) = MULT_EXPR; -+ break; -+ case OMP_REDUCTION_AND: -+ OMP_CLAUSE_REDUCTION_CODE (node) = TRUTH_ANDIF_EXPR; -+ break; -+ case OMP_REDUCTION_OR: -+ OMP_CLAUSE_REDUCTION_CODE (node) = TRUTH_ORIF_EXPR; -+ break; -+ case OMP_REDUCTION_EQV: -+ OMP_CLAUSE_REDUCTION_CODE (node) = EQ_EXPR; -+ break; -+ case OMP_REDUCTION_NEQV: -+ OMP_CLAUSE_REDUCTION_CODE (node) = NE_EXPR; -+ break; -+ case OMP_REDUCTION_MAX: -+ OMP_CLAUSE_REDUCTION_CODE (node) = MAX_EXPR; -+ break; -+ case OMP_REDUCTION_MIN: -+ OMP_CLAUSE_REDUCTION_CODE (node) = MIN_EXPR; -+ break; -+ case OMP_REDUCTION_IAND: -+ OMP_CLAUSE_REDUCTION_CODE (node) = BIT_AND_EXPR; -+ break; -+ case OMP_REDUCTION_IOR: -+ OMP_CLAUSE_REDUCTION_CODE (node) = BIT_IOR_EXPR; -+ break; -+ case OMP_REDUCTION_IEOR: -+ OMP_CLAUSE_REDUCTION_CODE (node) = BIT_XOR_EXPR; -+ break; -+ case OMP_REDUCTION_USER: -+ OMP_CLAUSE_REDUCTION_CODE (node) = ERROR_MARK; -+ break; -+ default: -+ gcc_unreachable (); -+ } -+ if (namelist->sym->attr.dimension -+ || namelist->u.reduction_op == OMP_REDUCTION_USER -+ || namelist->sym->attr.allocatable) -+ gfc_trans_omp_array_reduction_or_udr (node, namelist, where); - list = gfc_trans_add_clause (node, list); - } - } -@@ -768,7 +1687,7 @@ - - static tree - gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses, -- locus where) -+ locus where, bool declare_simd = false) - { - tree omp_clauses = NULL_TREE, chunk_size, c; - int list; -@@ -780,62 +1699,15 @@ - - for (list = 0; list < OMP_LIST_NUM; list++) - { -- gfc_namelist *n = clauses->lists[list]; -+ gfc_omp_namelist *n = clauses->lists[list]; - - if (n == NULL) - continue; -- if (list >= OMP_LIST_REDUCTION_FIRST -- && list <= OMP_LIST_REDUCTION_LAST) -- { -- enum tree_code reduction_code; -- switch (list) -- { -- case OMP_LIST_PLUS: -- reduction_code = PLUS_EXPR; -- break; -- case OMP_LIST_MULT: -- reduction_code = MULT_EXPR; -- break; -- case OMP_LIST_SUB: -- reduction_code = MINUS_EXPR; -- break; -- case OMP_LIST_AND: -- reduction_code = TRUTH_ANDIF_EXPR; -- break; -- case OMP_LIST_OR: -- reduction_code = TRUTH_ORIF_EXPR; -- break; -- case OMP_LIST_EQV: -- reduction_code = EQ_EXPR; -- break; -- case OMP_LIST_NEQV: -- reduction_code = NE_EXPR; -- break; -- case OMP_LIST_MAX: -- reduction_code = MAX_EXPR; -- break; -- case OMP_LIST_MIN: -- reduction_code = MIN_EXPR; -- break; -- case OMP_LIST_IAND: -- reduction_code = BIT_AND_EXPR; -- break; -- case OMP_LIST_IOR: -- reduction_code = BIT_IOR_EXPR; -- break; -- case OMP_LIST_IEOR: -- reduction_code = BIT_XOR_EXPR; -- break; -- default: -- gcc_unreachable (); -- } -- omp_clauses -- = gfc_trans_omp_reduction_list (n, omp_clauses, reduction_code, -- where); -- continue; -- } - switch (list) - { -+ case OMP_LIST_REDUCTION: -+ omp_clauses = gfc_trans_omp_reduction_list (n, omp_clauses, where); -+ break; - case OMP_LIST_PRIVATE: - clause_code = OMP_CLAUSE_PRIVATE; - goto add_clause; -@@ -853,11 +1725,412 @@ - goto add_clause; - case OMP_LIST_COPYPRIVATE: - clause_code = OMP_CLAUSE_COPYPRIVATE; -+ goto add_clause; -+ case OMP_LIST_UNIFORM: -+ clause_code = OMP_CLAUSE_UNIFORM; - /* FALLTHROUGH */ - add_clause: - omp_clauses -- = gfc_trans_omp_variable_list (clause_code, n, omp_clauses); -+ = gfc_trans_omp_variable_list (clause_code, n, omp_clauses, -+ declare_simd); - break; -+ case OMP_LIST_ALIGNED: -+ for (; n != NULL; n = n->next) -+ if (n->sym->attr.referenced || declare_simd) -+ { -+ tree t = gfc_trans_omp_variable (n->sym, declare_simd); -+ if (t != error_mark_node) -+ { -+ tree node = build_omp_clause (input_location, -+ OMP_CLAUSE_ALIGNED); -+ OMP_CLAUSE_DECL (node) = t; -+ if (n->expr) -+ { -+ tree alignment_var; -+ -+ if (block == NULL) -+ alignment_var = gfc_conv_constant_to_tree (n->expr); -+ else -+ { -+ gfc_init_se (&se, NULL); -+ gfc_conv_expr (&se, n->expr); -+ gfc_add_block_to_block (block, &se.pre); -+ alignment_var = gfc_evaluate_now (se.expr, block); -+ gfc_add_block_to_block (block, &se.post); -+ } -+ OMP_CLAUSE_ALIGNED_ALIGNMENT (node) = alignment_var; -+ } -+ omp_clauses = gfc_trans_add_clause (node, omp_clauses); -+ } -+ } -+ break; -+ case OMP_LIST_LINEAR: -+ { -+ gfc_expr *last_step_expr = NULL; -+ tree last_step = NULL_TREE; -+ -+ for (; n != NULL; n = n->next) -+ { -+ if (n->expr) -+ { -+ last_step_expr = n->expr; -+ last_step = NULL_TREE; -+ } -+ if (n->sym->attr.referenced || declare_simd) -+ { -+ tree t = gfc_trans_omp_variable (n->sym, declare_simd); -+ if (t != error_mark_node) -+ { -+ tree node = build_omp_clause (input_location, -+ OMP_CLAUSE_LINEAR); -+ OMP_CLAUSE_DECL (node) = t; -+ if (last_step_expr && last_step == NULL_TREE) -+ { -+ if (block == NULL) -+ last_step -+ = gfc_conv_constant_to_tree (last_step_expr); -+ else -+ { -+ gfc_init_se (&se, NULL); -+ gfc_conv_expr (&se, last_step_expr); -+ gfc_add_block_to_block (block, &se.pre); -+ last_step = gfc_evaluate_now (se.expr, block); -+ gfc_add_block_to_block (block, &se.post); -+ } -+ } -+ OMP_CLAUSE_LINEAR_STEP (node) -+ = fold_convert (gfc_typenode_for_spec (&n->sym->ts), -+ last_step); -+ if (n->sym->attr.dimension || n->sym->attr.allocatable) -+ OMP_CLAUSE_LINEAR_ARRAY (node) = 1; -+ omp_clauses = gfc_trans_add_clause (node, omp_clauses); -+ } -+ } -+ } -+ } -+ break; -+ case OMP_LIST_DEPEND: -+ for (; n != NULL; n = n->next) -+ { -+ if (!n->sym->attr.referenced) -+ continue; -+ -+ tree node = build_omp_clause (input_location, OMP_CLAUSE_DEPEND); -+ if (n->expr == NULL || n->expr->ref->u.ar.type == AR_FULL) -+ { -+ tree decl = gfc_get_symbol_decl (n->sym); -+ if (gfc_omp_privatize_by_reference (decl)) -+ decl = build_fold_indirect_ref (decl); -+ if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (decl))) -+ { -+ decl = gfc_conv_descriptor_data_get (decl); -+ decl = fold_convert (build_pointer_type (char_type_node), -+ decl); -+ decl = build_fold_indirect_ref (decl); -+ } -+ else if (DECL_P (decl)) -+ TREE_ADDRESSABLE (decl) = 1; -+ OMP_CLAUSE_DECL (node) = decl; -+ } -+ else -+ { -+ tree ptr; -+ gfc_init_se (&se, NULL); -+ if (n->expr->ref->u.ar.type == AR_ELEMENT) -+ { -+ gfc_conv_expr_reference (&se, n->expr); -+ ptr = se.expr; -+ } -+ else -+ { -+ gfc_conv_expr_descriptor (&se, n->expr); -+ ptr = gfc_conv_array_data (se.expr); -+ } -+ gfc_add_block_to_block (block, &se.pre); -+ gfc_add_block_to_block (block, &se.post); -+ ptr = fold_convert (build_pointer_type (char_type_node), -+ ptr); -+ OMP_CLAUSE_DECL (node) = build_fold_indirect_ref (ptr); -+ } -+ switch (n->u.depend_op) -+ { -+ case OMP_DEPEND_IN: -+ OMP_CLAUSE_DEPEND_KIND (node) = OMP_CLAUSE_DEPEND_IN; -+ break; -+ case OMP_DEPEND_OUT: -+ OMP_CLAUSE_DEPEND_KIND (node) = OMP_CLAUSE_DEPEND_OUT; -+ break; -+ case OMP_DEPEND_INOUT: -+ OMP_CLAUSE_DEPEND_KIND (node) = OMP_CLAUSE_DEPEND_INOUT; -+ break; -+ default: -+ gcc_unreachable (); -+ } -+ omp_clauses = gfc_trans_add_clause (node, omp_clauses); -+ } -+ break; -+ case OMP_LIST_MAP: -+ for (; n != NULL; n = n->next) -+ { -+ if (!n->sym->attr.referenced) -+ continue; -+ -+ tree node = build_omp_clause (input_location, OMP_CLAUSE_MAP); -+ tree node2 = NULL_TREE; -+ tree node3 = NULL_TREE; -+ tree node4 = NULL_TREE; -+ tree decl = gfc_get_symbol_decl (n->sym); -+ if (DECL_P (decl)) -+ TREE_ADDRESSABLE (decl) = 1; -+ if (n->expr == NULL || n->expr->ref->u.ar.type == AR_FULL) -+ { -+ if (POINTER_TYPE_P (TREE_TYPE (decl))) -+ { -+ node4 = build_omp_clause (input_location, -+ OMP_CLAUSE_MAP); -+ OMP_CLAUSE_MAP_KIND (node4) = OMP_CLAUSE_MAP_POINTER; -+ OMP_CLAUSE_DECL (node4) = decl; -+ OMP_CLAUSE_SIZE (node4) = size_int (0); -+ decl = build_fold_indirect_ref (decl); -+ } -+ if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (decl))) -+ { -+ tree type = TREE_TYPE (decl); -+ tree ptr = gfc_conv_descriptor_data_get (decl); -+ ptr = fold_convert (build_pointer_type (char_type_node), -+ ptr); -+ ptr = build_fold_indirect_ref (ptr); -+ OMP_CLAUSE_DECL (node) = ptr; -+ node2 = build_omp_clause (input_location, -+ OMP_CLAUSE_MAP); -+ OMP_CLAUSE_MAP_KIND (node2) = OMP_CLAUSE_MAP_TO_PSET; -+ OMP_CLAUSE_DECL (node2) = decl; -+ OMP_CLAUSE_SIZE (node2) = TYPE_SIZE_UNIT (type); -+ node3 = build_omp_clause (input_location, -+ OMP_CLAUSE_MAP); -+ OMP_CLAUSE_MAP_KIND (node3) = OMP_CLAUSE_MAP_POINTER; -+ OMP_CLAUSE_DECL (node3) -+ = gfc_conv_descriptor_data_get (decl); -+ OMP_CLAUSE_SIZE (node3) = size_int (0); -+ if (n->sym->attr.pointer) -+ { -+ stmtblock_t cond_block; -+ tree size -+ = gfc_create_var (gfc_array_index_type, NULL); -+ tree tem, then_b, else_b, zero, cond; -+ -+ gfc_init_block (&cond_block); -+ tem -+ = gfc_full_array_size (&cond_block, decl, -+ GFC_TYPE_ARRAY_RANK (type)); -+ gfc_add_modify (&cond_block, size, tem); -+ then_b = gfc_finish_block (&cond_block); -+ gfc_init_block (&cond_block); -+ zero = build_int_cst (gfc_array_index_type, 0); -+ gfc_add_modify (&cond_block, size, zero); -+ else_b = gfc_finish_block (&cond_block); -+ tem = gfc_conv_descriptor_data_get (decl); -+ tem = fold_convert (pvoid_type_node, tem); -+ cond = fold_build2_loc (input_location, NE_EXPR, -+ boolean_type_node, -+ tem, null_pointer_node); -+ gfc_add_expr_to_block (block, -+ build3_loc (input_location, -+ COND_EXPR, -+ void_type_node, -+ cond, then_b, -+ else_b)); -+ OMP_CLAUSE_SIZE (node) = size; -+ } -+ else -+ OMP_CLAUSE_SIZE (node) -+ = gfc_full_array_size (block, decl, -+ GFC_TYPE_ARRAY_RANK (type)); -+ tree elemsz -+ = TYPE_SIZE_UNIT (gfc_get_element_type (type)); -+ elemsz = fold_convert (gfc_array_index_type, elemsz); -+ OMP_CLAUSE_SIZE (node) -+ = fold_build2 (MULT_EXPR, gfc_array_index_type, -+ OMP_CLAUSE_SIZE (node), elemsz); -+ } -+ else -+ OMP_CLAUSE_DECL (node) = decl; -+ } -+ else -+ { -+ tree ptr, ptr2; -+ gfc_init_se (&se, NULL); -+ if (n->expr->ref->u.ar.type == AR_ELEMENT) -+ { -+ gfc_conv_expr_reference (&se, n->expr); -+ gfc_add_block_to_block (block, &se.pre); -+ ptr = se.expr; -+ OMP_CLAUSE_SIZE (node) -+ = TYPE_SIZE_UNIT (TREE_TYPE (ptr)); -+ } -+ else -+ { -+ gfc_conv_expr_descriptor (&se, n->expr); -+ ptr = gfc_conv_array_data (se.expr); -+ tree type = TREE_TYPE (se.expr); -+ gfc_add_block_to_block (block, &se.pre); -+ OMP_CLAUSE_SIZE (node) -+ = gfc_full_array_size (block, se.expr, -+ GFC_TYPE_ARRAY_RANK (type)); -+ tree elemsz -+ = TYPE_SIZE_UNIT (gfc_get_element_type (type)); -+ elemsz = fold_convert (gfc_array_index_type, elemsz); -+ OMP_CLAUSE_SIZE (node) -+ = fold_build2 (MULT_EXPR, gfc_array_index_type, -+ OMP_CLAUSE_SIZE (node), elemsz); -+ } -+ gfc_add_block_to_block (block, &se.post); -+ ptr = fold_convert (build_pointer_type (char_type_node), -+ ptr); -+ OMP_CLAUSE_DECL (node) = build_fold_indirect_ref (ptr); -+ -+ if (POINTER_TYPE_P (TREE_TYPE (decl)) -+ && GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (TREE_TYPE (decl)))) -+ { -+ node4 = build_omp_clause (input_location, -+ OMP_CLAUSE_MAP); -+ OMP_CLAUSE_MAP_KIND (node4) = OMP_CLAUSE_MAP_POINTER; -+ OMP_CLAUSE_DECL (node4) = decl; -+ OMP_CLAUSE_SIZE (node4) = size_int (0); -+ decl = build_fold_indirect_ref (decl); -+ } -+ ptr = fold_convert (sizetype, ptr); -+ if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (decl))) -+ { -+ tree type = TREE_TYPE (decl); -+ ptr2 = gfc_conv_descriptor_data_get (decl); -+ node2 = build_omp_clause (input_location, -+ OMP_CLAUSE_MAP); -+ OMP_CLAUSE_MAP_KIND (node2) = OMP_CLAUSE_MAP_TO_PSET; -+ OMP_CLAUSE_DECL (node2) = decl; -+ OMP_CLAUSE_SIZE (node2) = TYPE_SIZE_UNIT (type); -+ node3 = build_omp_clause (input_location, -+ OMP_CLAUSE_MAP); -+ OMP_CLAUSE_MAP_KIND (node3) = OMP_CLAUSE_MAP_POINTER; -+ OMP_CLAUSE_DECL (node3) -+ = gfc_conv_descriptor_data_get (decl); -+ } -+ else -+ { -+ if (TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE) -+ ptr2 = build_fold_addr_expr (decl); -+ else -+ { -+ gcc_assert (POINTER_TYPE_P (TREE_TYPE (decl))); -+ ptr2 = decl; -+ } -+ node3 = build_omp_clause (input_location, -+ OMP_CLAUSE_MAP); -+ OMP_CLAUSE_MAP_KIND (node3) = OMP_CLAUSE_MAP_POINTER; -+ OMP_CLAUSE_DECL (node3) = decl; -+ } -+ ptr2 = fold_convert (sizetype, ptr2); -+ OMP_CLAUSE_SIZE (node3) -+ = fold_build2 (MINUS_EXPR, sizetype, ptr, ptr2); -+ } -+ switch (n->u.map_op) -+ { -+ case OMP_MAP_ALLOC: -+ OMP_CLAUSE_MAP_KIND (node) = OMP_CLAUSE_MAP_ALLOC; -+ break; -+ case OMP_MAP_TO: -+ OMP_CLAUSE_MAP_KIND (node) = OMP_CLAUSE_MAP_TO; -+ break; -+ case OMP_MAP_FROM: -+ OMP_CLAUSE_MAP_KIND (node) = OMP_CLAUSE_MAP_FROM; -+ break; -+ case OMP_MAP_TOFROM: -+ OMP_CLAUSE_MAP_KIND (node) = OMP_CLAUSE_MAP_TOFROM; -+ break; -+ default: -+ gcc_unreachable (); -+ } -+ omp_clauses = gfc_trans_add_clause (node, omp_clauses); -+ if (node2) -+ omp_clauses = gfc_trans_add_clause (node2, omp_clauses); -+ if (node3) -+ omp_clauses = gfc_trans_add_clause (node3, omp_clauses); -+ if (node4) -+ omp_clauses = gfc_trans_add_clause (node4, omp_clauses); -+ } -+ break; -+ case OMP_LIST_TO: -+ case OMP_LIST_FROM: -+ for (; n != NULL; n = n->next) -+ { -+ if (!n->sym->attr.referenced) -+ continue; -+ -+ tree node = build_omp_clause (input_location, -+ list == OMP_LIST_TO -+ ? OMP_CLAUSE_TO : OMP_CLAUSE_FROM); -+ if (n->expr == NULL || n->expr->ref->u.ar.type == AR_FULL) -+ { -+ tree decl = gfc_get_symbol_decl (n->sym); -+ if (gfc_omp_privatize_by_reference (decl)) -+ decl = build_fold_indirect_ref (decl); -+ if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (decl))) -+ { -+ tree type = TREE_TYPE (decl); -+ tree ptr = gfc_conv_descriptor_data_get (decl); -+ ptr = fold_convert (build_pointer_type (char_type_node), -+ ptr); -+ ptr = build_fold_indirect_ref (ptr); -+ OMP_CLAUSE_DECL (node) = ptr; -+ OMP_CLAUSE_SIZE (node) -+ = gfc_full_array_size (block, decl, -+ GFC_TYPE_ARRAY_RANK (type)); -+ tree elemsz -+ = TYPE_SIZE_UNIT (gfc_get_element_type (type)); -+ elemsz = fold_convert (gfc_array_index_type, elemsz); -+ OMP_CLAUSE_SIZE (node) -+ = fold_build2 (MULT_EXPR, gfc_array_index_type, -+ OMP_CLAUSE_SIZE (node), elemsz); -+ } -+ else -+ OMP_CLAUSE_DECL (node) = decl; -+ } -+ else -+ { -+ tree ptr; -+ gfc_init_se (&se, NULL); -+ if (n->expr->ref->u.ar.type == AR_ELEMENT) -+ { -+ gfc_conv_expr_reference (&se, n->expr); -+ ptr = se.expr; -+ gfc_add_block_to_block (block, &se.pre); -+ OMP_CLAUSE_SIZE (node) -+ = TYPE_SIZE_UNIT (TREE_TYPE (ptr)); -+ } -+ else -+ { -+ gfc_conv_expr_descriptor (&se, n->expr); -+ ptr = gfc_conv_array_data (se.expr); -+ tree type = TREE_TYPE (se.expr); -+ gfc_add_block_to_block (block, &se.pre); -+ OMP_CLAUSE_SIZE (node) -+ = gfc_full_array_size (block, se.expr, -+ GFC_TYPE_ARRAY_RANK (type)); -+ tree elemsz -+ = TYPE_SIZE_UNIT (gfc_get_element_type (type)); -+ elemsz = fold_convert (gfc_array_index_type, elemsz); -+ OMP_CLAUSE_SIZE (node) -+ = fold_build2 (MULT_EXPR, gfc_array_index_type, -+ OMP_CLAUSE_SIZE (node), elemsz); -+ } -+ gfc_add_block_to_block (block, &se.post); -+ ptr = fold_convert (build_pointer_type (char_type_node), -+ ptr); -+ OMP_CLAUSE_DECL (node) = build_fold_indirect_ref (ptr); -+ } -+ omp_clauses = gfc_trans_add_clause (node, omp_clauses); -+ } -+ break; - default: - break; - } -@@ -1000,7 +2273,146 @@ - omp_clauses = gfc_trans_add_clause (c, omp_clauses); - } - -- return omp_clauses; -+ if (clauses->inbranch) -+ { -+ c = build_omp_clause (where.lb->location, OMP_CLAUSE_INBRANCH); -+ omp_clauses = gfc_trans_add_clause (c, omp_clauses); -+ } -+ -+ if (clauses->notinbranch) -+ { -+ c = build_omp_clause (where.lb->location, OMP_CLAUSE_NOTINBRANCH); -+ omp_clauses = gfc_trans_add_clause (c, omp_clauses); -+ } -+ -+ switch (clauses->cancel) -+ { -+ case OMP_CANCEL_UNKNOWN: -+ break; -+ case OMP_CANCEL_PARALLEL: -+ c = build_omp_clause (where.lb->location, OMP_CLAUSE_PARALLEL); -+ omp_clauses = gfc_trans_add_clause (c, omp_clauses); -+ break; -+ case OMP_CANCEL_SECTIONS: -+ c = build_omp_clause (where.lb->location, OMP_CLAUSE_SECTIONS); -+ omp_clauses = gfc_trans_add_clause (c, omp_clauses); -+ break; -+ case OMP_CANCEL_DO: -+ c = build_omp_clause (where.lb->location, OMP_CLAUSE_FOR); -+ omp_clauses = gfc_trans_add_clause (c, omp_clauses); -+ break; -+ case OMP_CANCEL_TASKGROUP: -+ c = build_omp_clause (where.lb->location, OMP_CLAUSE_TASKGROUP); -+ omp_clauses = gfc_trans_add_clause (c, omp_clauses); -+ break; -+ } -+ -+ if (clauses->proc_bind != OMP_PROC_BIND_UNKNOWN) -+ { -+ c = build_omp_clause (where.lb->location, OMP_CLAUSE_PROC_BIND); -+ switch (clauses->proc_bind) -+ { -+ case OMP_PROC_BIND_MASTER: -+ OMP_CLAUSE_PROC_BIND_KIND (c) = OMP_CLAUSE_PROC_BIND_MASTER; -+ break; -+ case OMP_PROC_BIND_SPREAD: -+ OMP_CLAUSE_PROC_BIND_KIND (c) = OMP_CLAUSE_PROC_BIND_SPREAD; -+ break; -+ case OMP_PROC_BIND_CLOSE: -+ OMP_CLAUSE_PROC_BIND_KIND (c) = OMP_CLAUSE_PROC_BIND_CLOSE; -+ break; -+ default: -+ gcc_unreachable (); -+ } -+ omp_clauses = gfc_trans_add_clause (c, omp_clauses); -+ } -+ -+ if (clauses->safelen_expr) -+ { -+ tree safelen_var; -+ -+ gfc_init_se (&se, NULL); -+ gfc_conv_expr (&se, clauses->safelen_expr); -+ gfc_add_block_to_block (block, &se.pre); -+ safelen_var = gfc_evaluate_now (se.expr, block); -+ gfc_add_block_to_block (block, &se.post); -+ -+ c = build_omp_clause (where.lb->location, OMP_CLAUSE_SAFELEN); -+ OMP_CLAUSE_SAFELEN_EXPR (c) = safelen_var; -+ omp_clauses = gfc_trans_add_clause (c, omp_clauses); -+ } -+ -+ if (clauses->simdlen_expr) -+ { -+ c = build_omp_clause (where.lb->location, OMP_CLAUSE_SIMDLEN); -+ OMP_CLAUSE_SIMDLEN_EXPR (c) -+ = gfc_conv_constant_to_tree (clauses->simdlen_expr); -+ omp_clauses = gfc_trans_add_clause (c, omp_clauses); -+ } -+ -+ if (clauses->num_teams) -+ { -+ tree num_teams; -+ -+ gfc_init_se (&se, NULL); -+ gfc_conv_expr (&se, clauses->num_teams); -+ gfc_add_block_to_block (block, &se.pre); -+ num_teams = gfc_evaluate_now (se.expr, block); -+ gfc_add_block_to_block (block, &se.post); -+ -+ c = build_omp_clause (where.lb->location, OMP_CLAUSE_NUM_TEAMS); -+ OMP_CLAUSE_NUM_TEAMS_EXPR (c) = num_teams; -+ omp_clauses = gfc_trans_add_clause (c, omp_clauses); -+ } -+ -+ if (clauses->device) -+ { -+ tree device; -+ -+ gfc_init_se (&se, NULL); -+ gfc_conv_expr (&se, clauses->device); -+ gfc_add_block_to_block (block, &se.pre); -+ device = gfc_evaluate_now (se.expr, block); -+ gfc_add_block_to_block (block, &se.post); -+ -+ c = build_omp_clause (where.lb->location, OMP_CLAUSE_DEVICE); -+ OMP_CLAUSE_DEVICE_ID (c) = device; -+ omp_clauses = gfc_trans_add_clause (c, omp_clauses); -+ } -+ -+ if (clauses->thread_limit) -+ { -+ tree thread_limit; -+ -+ gfc_init_se (&se, NULL); -+ gfc_conv_expr (&se, clauses->thread_limit); -+ gfc_add_block_to_block (block, &se.pre); -+ thread_limit = gfc_evaluate_now (se.expr, block); -+ gfc_add_block_to_block (block, &se.post); -+ -+ c = build_omp_clause (where.lb->location, OMP_CLAUSE_THREAD_LIMIT); -+ OMP_CLAUSE_THREAD_LIMIT_EXPR (c) = thread_limit; -+ omp_clauses = gfc_trans_add_clause (c, omp_clauses); -+ } -+ -+ chunk_size = NULL_TREE; -+ if (clauses->dist_chunk_size) -+ { -+ gfc_init_se (&se, NULL); -+ gfc_conv_expr (&se, clauses->dist_chunk_size); -+ gfc_add_block_to_block (block, &se.pre); -+ chunk_size = gfc_evaluate_now (se.expr, block); -+ gfc_add_block_to_block (block, &se.post); -+ } -+ -+ if (clauses->dist_sched_kind != OMP_SCHED_NONE) -+ { -+ c = build_omp_clause (where.lb->location, OMP_CLAUSE_DIST_SCHEDULE); -+ OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (c) = chunk_size; -+ omp_clauses = gfc_trans_add_clause (c, omp_clauses); -+ } -+ -+ return nreverse (omp_clauses); - } - - /* Like gfc_trans_code, but force creation of a BIND_EXPR around it. */ -@@ -1045,6 +2457,7 @@ - enum tree_code op = ERROR_MARK; - enum tree_code aop = OMP_ATOMIC; - bool var_on_left = false; -+ bool seq_cst = (atomic_code->ext.omp_atomic & GFC_OMP_ATOMIC_SEQ_CST) != 0; - - code = code->block->next; - gcc_assert (code->op == EXEC_ASSIGN); -@@ -1060,7 +2473,7 @@ - && expr2->value.function.isym->id == GFC_ISYM_CONVERSION) - expr2 = expr2->value.function.actual->expr; - -- switch (atomic_code->ext.omp_atomic) -+ switch (atomic_code->ext.omp_atomic & GFC_OMP_ATOMIC_MASK) - { - case GFC_OMP_ATOMIC_READ: - gfc_conv_expr (&vse, code->expr1); -@@ -1072,6 +2485,7 @@ - lhsaddr = gfc_build_addr_expr (NULL, lse.expr); - - x = build1 (OMP_ATOMIC_READ, type, lhsaddr); -+ OMP_ATOMIC_SEQ_CST (x) = seq_cst; - x = convert (TREE_TYPE (vse.expr), x); - gfc_add_modify (&block, vse.expr, x); - -@@ -1107,7 +2521,9 @@ - type = TREE_TYPE (lse.expr); - lhsaddr = gfc_build_addr_expr (NULL, lse.expr); - -- if (atomic_code->ext.omp_atomic == GFC_OMP_ATOMIC_WRITE) -+ if (((atomic_code->ext.omp_atomic & GFC_OMP_ATOMIC_MASK) -+ == GFC_OMP_ATOMIC_WRITE) -+ || (atomic_code->ext.omp_atomic & GFC_OMP_ATOMIC_SWAP)) - { - gfc_conv_expr (&rse, expr2); - gfc_add_block_to_block (&block, &rse.pre); -@@ -1229,7 +2645,9 @@ - lhsaddr = save_expr (lhsaddr); - rhs = gfc_evaluate_now (rse.expr, &block); - -- if (atomic_code->ext.omp_atomic == GFC_OMP_ATOMIC_WRITE) -+ if (((atomic_code->ext.omp_atomic & GFC_OMP_ATOMIC_MASK) -+ == GFC_OMP_ATOMIC_WRITE) -+ || (atomic_code->ext.omp_atomic & GFC_OMP_ATOMIC_SWAP)) - x = rhs; - else - { -@@ -1252,6 +2670,7 @@ - if (aop == OMP_ATOMIC) - { - x = build2_v (OMP_ATOMIC, lhsaddr, convert (type, x)); -+ OMP_ATOMIC_SEQ_CST (x) = seq_cst; - gfc_add_expr_to_block (&block, x); - } - else -@@ -1273,6 +2692,7 @@ - gfc_add_block_to_block (&block, &lse.pre); - } - x = build2 (aop, type, lhsaddr, convert (type, x)); -+ OMP_ATOMIC_SEQ_CST (x) = seq_cst; - x = convert (TREE_TYPE (vse.expr), x); - gfc_add_modify (&block, vse.expr, x); - } -@@ -1288,6 +2708,63 @@ - } - - static tree -+gfc_trans_omp_cancel (gfc_code *code) -+{ -+ int mask = 0; -+ tree ifc = boolean_true_node; -+ stmtblock_t block; -+ switch (code->ext.omp_clauses->cancel) -+ { -+ case OMP_CANCEL_PARALLEL: mask = 1; break; -+ case OMP_CANCEL_DO: mask = 2; break; -+ case OMP_CANCEL_SECTIONS: mask = 4; break; -+ case OMP_CANCEL_TASKGROUP: mask = 8; break; -+ default: gcc_unreachable (); -+ } -+ gfc_start_block (&block); -+ if (code->ext.omp_clauses->if_expr) -+ { -+ gfc_se se; -+ tree if_var; -+ -+ gfc_init_se (&se, NULL); -+ gfc_conv_expr (&se, code->ext.omp_clauses->if_expr); -+ gfc_add_block_to_block (&block, &se.pre); -+ if_var = gfc_evaluate_now (se.expr, &block); -+ gfc_add_block_to_block (&block, &se.post); -+ tree type = TREE_TYPE (if_var); -+ ifc = fold_build2_loc (input_location, NE_EXPR, -+ boolean_type_node, if_var, -+ build_zero_cst (type)); -+ } -+ tree decl = builtin_decl_explicit (BUILT_IN_GOMP_CANCEL); -+ tree c_bool_type = TREE_TYPE (TREE_TYPE (decl)); -+ ifc = fold_convert (c_bool_type, ifc); -+ gfc_add_expr_to_block (&block, -+ build_call_expr_loc (input_location, decl, 2, -+ build_int_cst (integer_type_node, -+ mask), ifc)); -+ return gfc_finish_block (&block); -+} -+ -+static tree -+gfc_trans_omp_cancellation_point (gfc_code *code) -+{ -+ int mask = 0; -+ switch (code->ext.omp_clauses->cancel) -+ { -+ case OMP_CANCEL_PARALLEL: mask = 1; break; -+ case OMP_CANCEL_DO: mask = 2; break; -+ case OMP_CANCEL_SECTIONS: mask = 4; break; -+ case OMP_CANCEL_TASKGROUP: mask = 8; break; -+ default: gcc_unreachable (); -+ } -+ tree decl = builtin_decl_explicit (BUILT_IN_GOMP_CANCELLATION_POINT); -+ return build_call_expr_loc (input_location, decl, 1, -+ build_int_cst (integer_type_node, mask)); -+} -+ -+static tree - gfc_trans_omp_critical (gfc_code *code) - { - tree name = NULL_TREE, stmt; -@@ -1304,7 +2781,7 @@ - - - static tree --gfc_trans_omp_do (gfc_code *code, stmtblock_t *pblock, -+gfc_trans_omp_do (gfc_code *code, gfc_exec_op op, stmtblock_t *pblock, - gfc_omp_clauses *do_clauses, tree par_clauses) - { - gfc_se se; -@@ -1344,14 +2821,16 @@ - - if (clauses) - { -- gfc_namelist *n; -- for (n = clauses->lists[OMP_LIST_LASTPRIVATE]; n != NULL; -- n = n->next) -- if (code->ext.iterator->var->symtree->n.sym == n->sym) -- break; -+ gfc_omp_namelist *n = NULL; -+ if (op != EXEC_OMP_DISTRIBUTE) -+ for (n = clauses->lists[(op == EXEC_OMP_SIMD && collapse == 1) -+ ? OMP_LIST_LINEAR : OMP_LIST_LASTPRIVATE]; -+ n != NULL; n = n->next) -+ if (code->ext.iterator->var->symtree->n.sym == n->sym) -+ break; - if (n != NULL) - dovar_found = 1; -- else if (n == NULL) -+ else if (n == NULL && op != EXEC_OMP_SIMD) - for (n = clauses->lists[OMP_LIST_PRIVATE]; n != NULL; n = n->next) - if (code->ext.iterator->var->symtree->n.sym == n->sym) - break; -@@ -1393,7 +2872,8 @@ - } - else - dovar_decl -- = gfc_trans_omp_variable (code->ext.iterator->var->symtree->n.sym); -+ = gfc_trans_omp_variable (code->ext.iterator->var->symtree->n.sym, -+ false); - - /* Loop body. */ - if (simple) -@@ -1447,11 +2927,24 @@ - - if (!dovar_found) - { -- tmp = build_omp_clause (input_location, OMP_CLAUSE_PRIVATE); -+ if (op == EXEC_OMP_SIMD) -+ { -+ if (collapse == 1) -+ { -+ tmp = build_omp_clause (input_location, OMP_CLAUSE_LINEAR); -+ OMP_CLAUSE_LINEAR_STEP (tmp) = step; -+ } -+ else -+ tmp = build_omp_clause (input_location, OMP_CLAUSE_LASTPRIVATE); -+ if (!simple) -+ dovar_found = 2; -+ } -+ else -+ tmp = build_omp_clause (input_location, OMP_CLAUSE_PRIVATE); - OMP_CLAUSE_DECL (tmp) = dovar_decl; - omp_clauses = gfc_trans_add_clause (tmp, omp_clauses); - } -- else if (dovar_found == 2) -+ if (dovar_found == 2) - { - tree c = NULL; - -@@ -1475,8 +2968,14 @@ - OMP_CLAUSE_LASTPRIVATE_STMT (c) = tmp; - break; - } -+ else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR -+ && OMP_CLAUSE_DECL (c) == dovar_decl) -+ { -+ OMP_CLAUSE_LINEAR_STMT (c) = tmp; -+ break; -+ } - } -- if (c == NULL && par_clauses != NULL) -+ if (c == NULL && op == EXEC_OMP_DO && par_clauses != NULL) - { - for (c = par_clauses; c ; c = OMP_CLAUSE_CHAIN (c)) - if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE -@@ -1496,7 +2995,17 @@ - } - if (!simple) - { -- tmp = build_omp_clause (input_location, OMP_CLAUSE_PRIVATE); -+ if (op != EXEC_OMP_SIMD) -+ tmp = build_omp_clause (input_location, OMP_CLAUSE_PRIVATE); -+ else if (collapse == 1) -+ { -+ tmp = build_omp_clause (input_location, OMP_CLAUSE_LINEAR); -+ OMP_CLAUSE_LINEAR_STEP (tmp) = step; -+ OMP_CLAUSE_LINEAR_NO_COPYIN (tmp) = 1; -+ OMP_CLAUSE_LINEAR_NO_COPYOUT (tmp) = 1; -+ } -+ else -+ tmp = build_omp_clause (input_location, OMP_CLAUSE_LASTPRIVATE); - OMP_CLAUSE_DECL (tmp) = count; - omp_clauses = gfc_trans_add_clause (tmp, omp_clauses); - } -@@ -1538,7 +3047,13 @@ - } - - /* End of loop body. */ -- stmt = make_node (OMP_FOR); -+ switch (op) -+ { -+ case EXEC_OMP_SIMD: stmt = make_node (OMP_SIMD); break; -+ case EXEC_OMP_DO: stmt = make_node (OMP_FOR); break; -+ case EXEC_OMP_DISTRIBUTE: stmt = make_node (OMP_DISTRIBUTE); break; -+ default: gcc_unreachable (); -+ } - - TREE_TYPE (stmt) = void_type_node; - OMP_FOR_BODY (stmt) = gfc_finish_block (&body); -@@ -1589,41 +3104,352 @@ - return gfc_finish_block (&block); - } - --static tree --gfc_trans_omp_parallel_do (gfc_code *code) -+enum - { -- stmtblock_t block, *pblock = NULL; -- gfc_omp_clauses parallel_clauses, do_clauses; -- tree stmt, omp_clauses = NULL_TREE; -+ GFC_OMP_SPLIT_SIMD, -+ GFC_OMP_SPLIT_DO, -+ GFC_OMP_SPLIT_PARALLEL, -+ GFC_OMP_SPLIT_DISTRIBUTE, -+ GFC_OMP_SPLIT_TEAMS, -+ GFC_OMP_SPLIT_TARGET, -+ GFC_OMP_SPLIT_NUM -+}; - -- gfc_start_block (&block); -+enum -+{ -+ GFC_OMP_MASK_SIMD = (1 << GFC_OMP_SPLIT_SIMD), -+ GFC_OMP_MASK_DO = (1 << GFC_OMP_SPLIT_DO), -+ GFC_OMP_MASK_PARALLEL = (1 << GFC_OMP_SPLIT_PARALLEL), -+ GFC_OMP_MASK_DISTRIBUTE = (1 << GFC_OMP_SPLIT_DISTRIBUTE), -+ GFC_OMP_MASK_TEAMS = (1 << GFC_OMP_SPLIT_TEAMS), -+ GFC_OMP_MASK_TARGET = (1 << GFC_OMP_SPLIT_TARGET) -+}; - -- memset (&do_clauses, 0, sizeof (do_clauses)); -+static void -+gfc_split_omp_clauses (gfc_code *code, -+ gfc_omp_clauses clausesa[GFC_OMP_SPLIT_NUM]) -+{ -+ int mask = 0, innermost = 0; -+ memset (clausesa, 0, GFC_OMP_SPLIT_NUM * sizeof (gfc_omp_clauses)); -+ switch (code->op) -+ { -+ case EXEC_OMP_DISTRIBUTE: -+ innermost = GFC_OMP_SPLIT_DISTRIBUTE; -+ break; -+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO: -+ mask = GFC_OMP_MASK_DISTRIBUTE | GFC_OMP_MASK_PARALLEL | GFC_OMP_MASK_DO; -+ innermost = GFC_OMP_SPLIT_DO; -+ break; -+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD: -+ mask = GFC_OMP_MASK_DISTRIBUTE | GFC_OMP_MASK_PARALLEL -+ | GFC_OMP_MASK_DO | GFC_OMP_MASK_SIMD; -+ innermost = GFC_OMP_SPLIT_SIMD; -+ break; -+ case EXEC_OMP_DISTRIBUTE_SIMD: -+ mask = GFC_OMP_MASK_DISTRIBUTE | GFC_OMP_MASK_SIMD; -+ innermost = GFC_OMP_SPLIT_SIMD; -+ break; -+ case EXEC_OMP_DO: -+ innermost = GFC_OMP_SPLIT_DO; -+ break; -+ case EXEC_OMP_DO_SIMD: -+ mask = GFC_OMP_MASK_DO | GFC_OMP_MASK_SIMD; -+ innermost = GFC_OMP_SPLIT_SIMD; -+ break; -+ case EXEC_OMP_PARALLEL: -+ innermost = GFC_OMP_SPLIT_PARALLEL; -+ break; -+ case EXEC_OMP_PARALLEL_DO: -+ mask = GFC_OMP_MASK_PARALLEL | GFC_OMP_MASK_DO; -+ innermost = GFC_OMP_SPLIT_DO; -+ break; -+ case EXEC_OMP_PARALLEL_DO_SIMD: -+ mask = GFC_OMP_MASK_PARALLEL | GFC_OMP_MASK_DO | GFC_OMP_MASK_SIMD; -+ innermost = GFC_OMP_SPLIT_SIMD; -+ break; -+ case EXEC_OMP_SIMD: -+ innermost = GFC_OMP_SPLIT_SIMD; -+ break; -+ case EXEC_OMP_TARGET: -+ innermost = GFC_OMP_SPLIT_TARGET; -+ break; -+ case EXEC_OMP_TARGET_TEAMS: -+ mask = GFC_OMP_MASK_TARGET | GFC_OMP_MASK_TEAMS; -+ innermost = GFC_OMP_SPLIT_TEAMS; -+ break; -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE: -+ mask = GFC_OMP_MASK_TARGET | GFC_OMP_MASK_TEAMS -+ | GFC_OMP_MASK_DISTRIBUTE; -+ innermost = GFC_OMP_SPLIT_DISTRIBUTE; -+ break; -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ mask = GFC_OMP_MASK_TARGET | GFC_OMP_MASK_TEAMS | GFC_OMP_MASK_DISTRIBUTE -+ | GFC_OMP_MASK_PARALLEL | GFC_OMP_MASK_DO; -+ innermost = GFC_OMP_SPLIT_DO; -+ break; -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ mask = GFC_OMP_MASK_TARGET | GFC_OMP_MASK_TEAMS | GFC_OMP_MASK_DISTRIBUTE -+ | GFC_OMP_MASK_PARALLEL | GFC_OMP_MASK_DO | GFC_OMP_MASK_SIMD; -+ innermost = GFC_OMP_SPLIT_SIMD; -+ break; -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD: -+ mask = GFC_OMP_MASK_TARGET | GFC_OMP_MASK_TEAMS -+ | GFC_OMP_MASK_DISTRIBUTE | GFC_OMP_MASK_SIMD; -+ innermost = GFC_OMP_SPLIT_SIMD; -+ break; -+ case EXEC_OMP_TEAMS: -+ innermost = GFC_OMP_SPLIT_TEAMS; -+ break; -+ case EXEC_OMP_TEAMS_DISTRIBUTE: -+ mask = GFC_OMP_MASK_TEAMS | GFC_OMP_MASK_DISTRIBUTE; -+ innermost = GFC_OMP_SPLIT_DISTRIBUTE; -+ break; -+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ mask = GFC_OMP_MASK_TEAMS | GFC_OMP_MASK_DISTRIBUTE -+ | GFC_OMP_MASK_PARALLEL | GFC_OMP_MASK_DO; -+ innermost = GFC_OMP_SPLIT_DO; -+ break; -+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ mask = GFC_OMP_MASK_TEAMS | GFC_OMP_MASK_DISTRIBUTE -+ | GFC_OMP_MASK_PARALLEL | GFC_OMP_MASK_DO | GFC_OMP_MASK_SIMD; -+ innermost = GFC_OMP_SPLIT_SIMD; -+ break; -+ case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD: -+ mask = GFC_OMP_MASK_TEAMS | GFC_OMP_MASK_DISTRIBUTE | GFC_OMP_MASK_SIMD; -+ innermost = GFC_OMP_SPLIT_SIMD; -+ break; -+ default: -+ gcc_unreachable (); -+ } -+ if (mask == 0) -+ { -+ clausesa[innermost] = *code->ext.omp_clauses; -+ return; -+ } - if (code->ext.omp_clauses != NULL) - { -- memcpy (¶llel_clauses, code->ext.omp_clauses, -- sizeof (parallel_clauses)); -- do_clauses.sched_kind = parallel_clauses.sched_kind; -- do_clauses.chunk_size = parallel_clauses.chunk_size; -- do_clauses.ordered = parallel_clauses.ordered; -- do_clauses.collapse = parallel_clauses.collapse; -- parallel_clauses.sched_kind = OMP_SCHED_NONE; -- parallel_clauses.chunk_size = NULL; -- parallel_clauses.ordered = false; -- parallel_clauses.collapse = 0; -- omp_clauses = gfc_trans_omp_clauses (&block, ¶llel_clauses, -- code->loc); -+ if (mask & GFC_OMP_MASK_TARGET) -+ { -+ /* First the clauses that are unique to some constructs. */ -+ clausesa[GFC_OMP_SPLIT_TARGET].lists[OMP_LIST_MAP] -+ = code->ext.omp_clauses->lists[OMP_LIST_MAP]; -+ clausesa[GFC_OMP_SPLIT_TARGET].device -+ = code->ext.omp_clauses->device; -+ } -+ if (mask & GFC_OMP_MASK_TEAMS) -+ { -+ /* First the clauses that are unique to some constructs. */ -+ clausesa[GFC_OMP_SPLIT_TEAMS].num_teams -+ = code->ext.omp_clauses->num_teams; -+ clausesa[GFC_OMP_SPLIT_TEAMS].thread_limit -+ = code->ext.omp_clauses->thread_limit; -+ /* Shared and default clauses are allowed on parallel and teams. */ -+ clausesa[GFC_OMP_SPLIT_TEAMS].lists[OMP_LIST_SHARED] -+ = code->ext.omp_clauses->lists[OMP_LIST_SHARED]; -+ clausesa[GFC_OMP_SPLIT_TEAMS].default_sharing -+ = code->ext.omp_clauses->default_sharing; -+ } -+ if (mask & GFC_OMP_MASK_DISTRIBUTE) -+ { -+ /* First the clauses that are unique to some constructs. */ -+ clausesa[GFC_OMP_SPLIT_DISTRIBUTE].dist_sched_kind -+ = code->ext.omp_clauses->dist_sched_kind; -+ clausesa[GFC_OMP_SPLIT_DISTRIBUTE].dist_chunk_size -+ = code->ext.omp_clauses->dist_chunk_size; -+ /* Duplicate collapse. */ -+ clausesa[GFC_OMP_SPLIT_DISTRIBUTE].collapse -+ = code->ext.omp_clauses->collapse; -+ } -+ if (mask & GFC_OMP_MASK_PARALLEL) -+ { -+ /* First the clauses that are unique to some constructs. */ -+ clausesa[GFC_OMP_SPLIT_PARALLEL].lists[OMP_LIST_COPYIN] -+ = code->ext.omp_clauses->lists[OMP_LIST_COPYIN]; -+ clausesa[GFC_OMP_SPLIT_PARALLEL].num_threads -+ = code->ext.omp_clauses->num_threads; -+ clausesa[GFC_OMP_SPLIT_PARALLEL].proc_bind -+ = code->ext.omp_clauses->proc_bind; -+ /* Shared and default clauses are allowed on parallel and teams. */ -+ clausesa[GFC_OMP_SPLIT_PARALLEL].lists[OMP_LIST_SHARED] -+ = code->ext.omp_clauses->lists[OMP_LIST_SHARED]; -+ clausesa[GFC_OMP_SPLIT_PARALLEL].default_sharing -+ = code->ext.omp_clauses->default_sharing; -+ } -+ if (mask & GFC_OMP_MASK_DO) -+ { -+ /* First the clauses that are unique to some constructs. */ -+ clausesa[GFC_OMP_SPLIT_DO].ordered -+ = code->ext.omp_clauses->ordered; -+ clausesa[GFC_OMP_SPLIT_DO].sched_kind -+ = code->ext.omp_clauses->sched_kind; -+ clausesa[GFC_OMP_SPLIT_DO].chunk_size -+ = code->ext.omp_clauses->chunk_size; -+ clausesa[GFC_OMP_SPLIT_DO].nowait -+ = code->ext.omp_clauses->nowait; -+ /* Duplicate collapse. */ -+ clausesa[GFC_OMP_SPLIT_DO].collapse -+ = code->ext.omp_clauses->collapse; -+ } -+ if (mask & GFC_OMP_MASK_SIMD) -+ { -+ clausesa[GFC_OMP_SPLIT_SIMD].safelen_expr -+ = code->ext.omp_clauses->safelen_expr; -+ clausesa[GFC_OMP_SPLIT_SIMD].lists[OMP_LIST_LINEAR] -+ = code->ext.omp_clauses->lists[OMP_LIST_LINEAR]; -+ clausesa[GFC_OMP_SPLIT_SIMD].lists[OMP_LIST_ALIGNED] -+ = code->ext.omp_clauses->lists[OMP_LIST_ALIGNED]; -+ /* Duplicate collapse. */ -+ clausesa[GFC_OMP_SPLIT_SIMD].collapse -+ = code->ext.omp_clauses->collapse; -+ } -+ /* Private clause is supported on all constructs but target, -+ it is enough to put it on the innermost one. For -+ !$ omp do put it on parallel though, -+ as that's what we did for OpenMP 3.1. */ -+ clausesa[innermost == GFC_OMP_SPLIT_DO -+ ? (int) GFC_OMP_SPLIT_PARALLEL -+ : innermost].lists[OMP_LIST_PRIVATE] -+ = code->ext.omp_clauses->lists[OMP_LIST_PRIVATE]; -+ /* Firstprivate clause is supported on all constructs but -+ target and simd. Put it on the outermost of those and -+ duplicate on parallel. */ -+ if (mask & GFC_OMP_MASK_TEAMS) -+ clausesa[GFC_OMP_SPLIT_TEAMS].lists[OMP_LIST_FIRSTPRIVATE] -+ = code->ext.omp_clauses->lists[OMP_LIST_FIRSTPRIVATE]; -+ else if (mask & GFC_OMP_MASK_DISTRIBUTE) -+ clausesa[GFC_OMP_SPLIT_DISTRIBUTE].lists[OMP_LIST_FIRSTPRIVATE] -+ = code->ext.omp_clauses->lists[OMP_LIST_FIRSTPRIVATE]; -+ if (mask & GFC_OMP_MASK_PARALLEL) -+ clausesa[GFC_OMP_SPLIT_PARALLEL].lists[OMP_LIST_FIRSTPRIVATE] -+ = code->ext.omp_clauses->lists[OMP_LIST_FIRSTPRIVATE]; -+ else if (mask & GFC_OMP_MASK_DO) -+ clausesa[GFC_OMP_SPLIT_DO].lists[OMP_LIST_FIRSTPRIVATE] -+ = code->ext.omp_clauses->lists[OMP_LIST_FIRSTPRIVATE]; -+ /* Lastprivate is allowed on do and simd. In -+ parallel do{, simd} we actually want to put it on -+ parallel rather than do. */ -+ if (mask & GFC_OMP_MASK_PARALLEL) -+ clausesa[GFC_OMP_SPLIT_PARALLEL].lists[OMP_LIST_LASTPRIVATE] -+ = code->ext.omp_clauses->lists[OMP_LIST_LASTPRIVATE]; -+ else if (mask & GFC_OMP_MASK_DO) -+ clausesa[GFC_OMP_SPLIT_DO].lists[OMP_LIST_LASTPRIVATE] -+ = code->ext.omp_clauses->lists[OMP_LIST_LASTPRIVATE]; -+ if (mask & GFC_OMP_MASK_SIMD) -+ clausesa[GFC_OMP_SPLIT_SIMD].lists[OMP_LIST_LASTPRIVATE] -+ = code->ext.omp_clauses->lists[OMP_LIST_LASTPRIVATE]; -+ /* Reduction is allowed on simd, do, parallel and teams. -+ Duplicate it on all of them, but omit on do if -+ parallel is present. */ -+ if (mask & GFC_OMP_MASK_TEAMS) -+ clausesa[GFC_OMP_SPLIT_TEAMS].lists[OMP_LIST_REDUCTION] -+ = code->ext.omp_clauses->lists[OMP_LIST_REDUCTION]; -+ if (mask & GFC_OMP_MASK_PARALLEL) -+ clausesa[GFC_OMP_SPLIT_PARALLEL].lists[OMP_LIST_REDUCTION] -+ = code->ext.omp_clauses->lists[OMP_LIST_REDUCTION]; -+ else if (mask & GFC_OMP_MASK_DO) -+ clausesa[GFC_OMP_SPLIT_DO].lists[OMP_LIST_REDUCTION] -+ = code->ext.omp_clauses->lists[OMP_LIST_REDUCTION]; -+ if (mask & GFC_OMP_MASK_SIMD) -+ clausesa[GFC_OMP_SPLIT_SIMD].lists[OMP_LIST_REDUCTION] -+ = code->ext.omp_clauses->lists[OMP_LIST_REDUCTION]; -+ /* FIXME: This is currently being discussed. */ -+ if (mask & GFC_OMP_MASK_PARALLEL) -+ clausesa[GFC_OMP_SPLIT_PARALLEL].if_expr -+ = code->ext.omp_clauses->if_expr; -+ else -+ clausesa[GFC_OMP_SPLIT_TARGET].if_expr -+ = code->ext.omp_clauses->if_expr; - } -- do_clauses.nowait = true; -- if (!do_clauses.ordered && do_clauses.sched_kind != OMP_SCHED_STATIC) -- pblock = █ -+ if ((mask & (GFC_OMP_MASK_PARALLEL | GFC_OMP_MASK_DO)) -+ == (GFC_OMP_MASK_PARALLEL | GFC_OMP_MASK_DO)) -+ clausesa[GFC_OMP_SPLIT_DO].nowait = true; -+} -+ -+static tree -+gfc_trans_omp_do_simd (gfc_code *code, stmtblock_t *pblock, -+ gfc_omp_clauses *clausesa, tree omp_clauses) -+{ -+ stmtblock_t block; -+ gfc_omp_clauses clausesa_buf[GFC_OMP_SPLIT_NUM]; -+ tree stmt, body, omp_do_clauses = NULL_TREE; -+ -+ if (pblock == NULL) -+ gfc_start_block (&block); - else -- pushlevel (); -- stmt = gfc_trans_omp_do (code, pblock, &do_clauses, omp_clauses); -- if (TREE_CODE (stmt) != BIND_EXPR) -- stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0)); -+ gfc_init_block (&block); -+ -+ if (clausesa == NULL) -+ { -+ clausesa = clausesa_buf; -+ gfc_split_omp_clauses (code, clausesa); -+ } -+ if (gfc_option.gfc_flag_openmp) -+ omp_do_clauses -+ = gfc_trans_omp_clauses (&block, &clausesa[GFC_OMP_SPLIT_DO], code->loc); -+ body = gfc_trans_omp_do (code, EXEC_OMP_SIMD, pblock ? pblock : &block, -+ &clausesa[GFC_OMP_SPLIT_SIMD], omp_clauses); -+ if (pblock == NULL) -+ { -+ if (TREE_CODE (body) != BIND_EXPR) -+ body = build3_v (BIND_EXPR, NULL, body, poplevel (1, 0)); -+ else -+ poplevel (0, 0); -+ } -+ else if (TREE_CODE (body) != BIND_EXPR) -+ body = build3_v (BIND_EXPR, NULL, body, NULL_TREE); -+ if (gfc_option.gfc_flag_openmp) -+ { -+ stmt = make_node (OMP_FOR); -+ TREE_TYPE (stmt) = void_type_node; -+ OMP_FOR_BODY (stmt) = body; -+ OMP_FOR_CLAUSES (stmt) = omp_do_clauses; -+ } - else -- poplevel (0, 0); -+ stmt = body; -+ gfc_add_expr_to_block (&block, stmt); -+ return gfc_finish_block (&block); -+} -+ -+static tree -+gfc_trans_omp_parallel_do (gfc_code *code, stmtblock_t *pblock, -+ gfc_omp_clauses *clausesa) -+{ -+ stmtblock_t block, *new_pblock = pblock; -+ gfc_omp_clauses clausesa_buf[GFC_OMP_SPLIT_NUM]; -+ tree stmt, omp_clauses = NULL_TREE; -+ -+ if (pblock == NULL) -+ gfc_start_block (&block); -+ else -+ gfc_init_block (&block); -+ -+ if (clausesa == NULL) -+ { -+ clausesa = clausesa_buf; -+ gfc_split_omp_clauses (code, clausesa); -+ } -+ omp_clauses -+ = gfc_trans_omp_clauses (&block, &clausesa[GFC_OMP_SPLIT_PARALLEL], -+ code->loc); -+ if (pblock == NULL) -+ { -+ if (!clausesa[GFC_OMP_SPLIT_DO].ordered -+ && clausesa[GFC_OMP_SPLIT_DO].sched_kind != OMP_SCHED_STATIC) -+ new_pblock = █ -+ else -+ pushlevel (); -+ } -+ stmt = gfc_trans_omp_do (code, EXEC_OMP_DO, new_pblock, -+ &clausesa[GFC_OMP_SPLIT_DO], omp_clauses); -+ if (pblock == NULL) -+ { -+ if (TREE_CODE (stmt) != BIND_EXPR) -+ stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0)); -+ else -+ poplevel (0, 0); -+ } -+ else if (TREE_CODE (stmt) != BIND_EXPR) -+ stmt = build3_v (BIND_EXPR, NULL, stmt, NULL_TREE); - stmt = build2_loc (input_location, OMP_PARALLEL, void_type_node, stmt, - omp_clauses); - OMP_PARALLEL_COMBINED (stmt) = 1; -@@ -1632,6 +3458,50 @@ - } - - static tree -+gfc_trans_omp_parallel_do_simd (gfc_code *code, stmtblock_t *pblock, -+ gfc_omp_clauses *clausesa) -+{ -+ stmtblock_t block; -+ gfc_omp_clauses clausesa_buf[GFC_OMP_SPLIT_NUM]; -+ tree stmt, omp_clauses = NULL_TREE; -+ -+ if (pblock == NULL) -+ gfc_start_block (&block); -+ else -+ gfc_init_block (&block); -+ -+ if (clausesa == NULL) -+ { -+ clausesa = clausesa_buf; -+ gfc_split_omp_clauses (code, clausesa); -+ } -+ if (gfc_option.gfc_flag_openmp) -+ omp_clauses -+ = gfc_trans_omp_clauses (&block, &clausesa[GFC_OMP_SPLIT_PARALLEL], -+ code->loc); -+ if (pblock == NULL) -+ pushlevel (); -+ stmt = gfc_trans_omp_do_simd (code, pblock, clausesa, omp_clauses); -+ if (pblock == NULL) -+ { -+ if (TREE_CODE (stmt) != BIND_EXPR) -+ stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0)); -+ else -+ poplevel (0, 0); -+ } -+ else if (TREE_CODE (stmt) != BIND_EXPR) -+ stmt = build3_v (BIND_EXPR, NULL, stmt, NULL_TREE); -+ if (gfc_option.gfc_flag_openmp) -+ { -+ stmt = build2_loc (input_location, OMP_PARALLEL, void_type_node, stmt, -+ omp_clauses); -+ OMP_PARALLEL_COMBINED (stmt) = 1; -+ } -+ gfc_add_expr_to_block (&block, stmt); -+ return gfc_finish_block (&block); -+} -+ -+static tree - gfc_trans_omp_parallel_sections (gfc_code *code) - { - stmtblock_t block; -@@ -1743,6 +3613,13 @@ - } - - static tree -+gfc_trans_omp_taskgroup (gfc_code *code) -+{ -+ tree stmt = gfc_trans_code (code->block->next); -+ return build1_loc (input_location, OMP_TASKGROUP, void_type_node, stmt); -+} -+ -+static tree - gfc_trans_omp_taskwait (void) - { - tree decl = builtin_decl_explicit (BUILT_IN_GOMP_TASKWAIT); -@@ -1757,6 +3634,170 @@ - } - - static tree -+gfc_trans_omp_distribute (gfc_code *code, gfc_omp_clauses *clausesa) -+{ -+ stmtblock_t block; -+ gfc_omp_clauses clausesa_buf[GFC_OMP_SPLIT_NUM]; -+ tree stmt, omp_clauses = NULL_TREE; -+ -+ gfc_start_block (&block); -+ if (clausesa == NULL) -+ { -+ clausesa = clausesa_buf; -+ gfc_split_omp_clauses (code, clausesa); -+ } -+ if (gfc_option.gfc_flag_openmp) -+ omp_clauses -+ = gfc_trans_omp_clauses (&block, &clausesa[GFC_OMP_SPLIT_DISTRIBUTE], -+ code->loc); -+ switch (code->op) -+ { -+ case EXEC_OMP_DISTRIBUTE: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE: -+ case EXEC_OMP_TEAMS_DISTRIBUTE: -+ /* This is handled in gfc_trans_omp_do. */ -+ gcc_unreachable (); -+ break; -+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ stmt = gfc_trans_omp_parallel_do (code, &block, clausesa); -+ if (TREE_CODE (stmt) != BIND_EXPR) -+ stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0)); -+ else -+ poplevel (0, 0); -+ break; -+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ stmt = gfc_trans_omp_parallel_do_simd (code, &block, clausesa); -+ if (TREE_CODE (stmt) != BIND_EXPR) -+ stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0)); -+ else -+ poplevel (0, 0); -+ break; -+ case EXEC_OMP_DISTRIBUTE_SIMD: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD: -+ stmt = gfc_trans_omp_do (code, EXEC_OMP_SIMD, &block, -+ &clausesa[GFC_OMP_SPLIT_SIMD], NULL_TREE); -+ if (TREE_CODE (stmt) != BIND_EXPR) -+ stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0)); -+ else -+ poplevel (0, 0); -+ break; -+ default: -+ gcc_unreachable (); -+ } -+ if (gfc_option.gfc_flag_openmp) -+ { -+ tree distribute = make_node (OMP_DISTRIBUTE); -+ TREE_TYPE (distribute) = void_type_node; -+ OMP_FOR_BODY (distribute) = stmt; -+ OMP_FOR_CLAUSES (distribute) = omp_clauses; -+ stmt = distribute; -+ } -+ gfc_add_expr_to_block (&block, stmt); -+ return gfc_finish_block (&block); -+} -+ -+static tree -+gfc_trans_omp_teams (gfc_code *code, gfc_omp_clauses *clausesa) -+{ -+ stmtblock_t block; -+ gfc_omp_clauses clausesa_buf[GFC_OMP_SPLIT_NUM]; -+ tree stmt, omp_clauses = NULL_TREE; -+ -+ gfc_start_block (&block); -+ if (clausesa == NULL) -+ { -+ clausesa = clausesa_buf; -+ gfc_split_omp_clauses (code, clausesa); -+ } -+ if (gfc_option.gfc_flag_openmp) -+ omp_clauses -+ = gfc_trans_omp_clauses (&block, &clausesa[GFC_OMP_SPLIT_TEAMS], -+ code->loc); -+ switch (code->op) -+ { -+ case EXEC_OMP_TARGET_TEAMS: -+ case EXEC_OMP_TEAMS: -+ stmt = gfc_trans_omp_code (code->block->next, true); -+ break; -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE: -+ case EXEC_OMP_TEAMS_DISTRIBUTE: -+ stmt = gfc_trans_omp_do (code, EXEC_OMP_DISTRIBUTE, NULL, -+ &clausesa[GFC_OMP_SPLIT_DISTRIBUTE], -+ NULL); -+ break; -+ default: -+ stmt = gfc_trans_omp_distribute (code, clausesa); -+ break; -+ } -+ stmt = build2_loc (input_location, OMP_TEAMS, void_type_node, stmt, -+ omp_clauses); -+ gfc_add_expr_to_block (&block, stmt); -+ return gfc_finish_block (&block); -+} -+ -+static tree -+gfc_trans_omp_target (gfc_code *code) -+{ -+ stmtblock_t block; -+ gfc_omp_clauses clausesa[GFC_OMP_SPLIT_NUM]; -+ tree stmt, omp_clauses = NULL_TREE; -+ -+ gfc_start_block (&block); -+ gfc_split_omp_clauses (code, clausesa); -+ if (gfc_option.gfc_flag_openmp) -+ omp_clauses -+ = gfc_trans_omp_clauses (&block, &clausesa[GFC_OMP_SPLIT_TARGET], -+ code->loc); -+ if (code->op == EXEC_OMP_TARGET) -+ stmt = gfc_trans_omp_code (code->block->next, true); -+ else -+ stmt = gfc_trans_omp_teams (code, clausesa); -+ if (TREE_CODE (stmt) != BIND_EXPR) -+ stmt = build3_v (BIND_EXPR, NULL, stmt, NULL_TREE); -+ if (gfc_option.gfc_flag_openmp) -+ stmt = build2_loc (input_location, OMP_TARGET, void_type_node, stmt, -+ omp_clauses); -+ gfc_add_expr_to_block (&block, stmt); -+ return gfc_finish_block (&block); -+} -+ -+static tree -+gfc_trans_omp_target_data (gfc_code *code) -+{ -+ stmtblock_t block; -+ tree stmt, omp_clauses; -+ -+ gfc_start_block (&block); -+ omp_clauses = gfc_trans_omp_clauses (&block, code->ext.omp_clauses, -+ code->loc); -+ stmt = gfc_trans_omp_code (code->block->next, true); -+ stmt = build2_loc (input_location, OMP_TARGET_DATA, void_type_node, stmt, -+ omp_clauses); -+ gfc_add_expr_to_block (&block, stmt); -+ return gfc_finish_block (&block); -+} -+ -+static tree -+gfc_trans_omp_target_update (gfc_code *code) -+{ -+ stmtblock_t block; -+ tree stmt, omp_clauses; -+ -+ gfc_start_block (&block); -+ omp_clauses = gfc_trans_omp_clauses (&block, code->ext.omp_clauses, -+ code->loc); -+ stmt = build1_loc (input_location, OMP_TARGET_UPDATE, void_type_node, -+ omp_clauses); -+ gfc_add_expr_to_block (&block, stmt); -+ return gfc_finish_block (&block); -+} -+ -+static tree - gfc_trans_omp_workshare (gfc_code *code, gfc_omp_clauses *clauses) - { - tree res, tmp, stmt; -@@ -1923,10 +3964,23 @@ - return gfc_trans_omp_atomic (code); - case EXEC_OMP_BARRIER: - return gfc_trans_omp_barrier (); -+ case EXEC_OMP_CANCEL: -+ return gfc_trans_omp_cancel (code); -+ case EXEC_OMP_CANCELLATION_POINT: -+ return gfc_trans_omp_cancellation_point (code); - case EXEC_OMP_CRITICAL: - return gfc_trans_omp_critical (code); -+ case EXEC_OMP_DISTRIBUTE: - case EXEC_OMP_DO: -- return gfc_trans_omp_do (code, NULL, code->ext.omp_clauses, NULL); -+ case EXEC_OMP_SIMD: -+ return gfc_trans_omp_do (code, code->op, NULL, code->ext.omp_clauses, -+ NULL); -+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO: -+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case EXEC_OMP_DISTRIBUTE_SIMD: -+ return gfc_trans_omp_distribute (code, NULL); -+ case EXEC_OMP_DO_SIMD: -+ return gfc_trans_omp_do_simd (code, NULL, NULL, NULL_TREE); - case EXEC_OMP_FLUSH: - return gfc_trans_omp_flush (); - case EXEC_OMP_MASTER: -@@ -1936,7 +3990,9 @@ - case EXEC_OMP_PARALLEL: - return gfc_trans_omp_parallel (code); - case EXEC_OMP_PARALLEL_DO: -- return gfc_trans_omp_parallel_do (code); -+ return gfc_trans_omp_parallel_do (code, NULL, NULL); -+ case EXEC_OMP_PARALLEL_DO_SIMD: -+ return gfc_trans_omp_parallel_do_simd (code, NULL, NULL); - case EXEC_OMP_PARALLEL_SECTIONS: - return gfc_trans_omp_parallel_sections (code); - case EXEC_OMP_PARALLEL_WORKSHARE: -@@ -1945,12 +4001,31 @@ - return gfc_trans_omp_sections (code, code->ext.omp_clauses); - case EXEC_OMP_SINGLE: - return gfc_trans_omp_single (code, code->ext.omp_clauses); -+ case EXEC_OMP_TARGET: -+ case EXEC_OMP_TARGET_TEAMS: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD: -+ return gfc_trans_omp_target (code); -+ case EXEC_OMP_TARGET_DATA: -+ return gfc_trans_omp_target_data (code); -+ case EXEC_OMP_TARGET_UPDATE: -+ return gfc_trans_omp_target_update (code); - case EXEC_OMP_TASK: - return gfc_trans_omp_task (code); -+ case EXEC_OMP_TASKGROUP: -+ return gfc_trans_omp_taskgroup (code); - case EXEC_OMP_TASKWAIT: - return gfc_trans_omp_taskwait (); - case EXEC_OMP_TASKYIELD: - return gfc_trans_omp_taskyield (); -+ case EXEC_OMP_TEAMS: -+ case EXEC_OMP_TEAMS_DISTRIBUTE: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD: -+ return gfc_trans_omp_teams (code, NULL); - case EXEC_OMP_WORKSHARE: - return gfc_trans_omp_workshare (code, code->ext.omp_clauses); - default: -@@ -1957,3 +4032,22 @@ - gcc_unreachable (); - } - } -+ -+void -+gfc_trans_omp_declare_simd (gfc_namespace *ns) -+{ -+ if (ns->entries) -+ return; -+ -+ gfc_omp_declare_simd *ods; -+ for (ods = ns->omp_declare_simd; ods; ods = ods->next) -+ { -+ tree c = gfc_trans_omp_clauses (NULL, ods->clauses, ods->where, true); -+ tree fndecl = ns->proc_name->backend_decl; -+ if (c != NULL_TREE) -+ c = tree_cons (NULL_TREE, c, NULL_TREE); -+ c = build_tree_list (get_identifier ("omp declare simd"), c); -+ TREE_CHAIN (c) = DECL_ATTRIBUTES (fndecl); -+ DECL_ATTRIBUTES (fndecl) = c; -+ } -+} -Index: gcc/fortran/gfortran.h -=================================================================== ---- a/src/gcc/fortran/gfortran.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/gfortran.h (.../branches/gcc-4_9-branch) -@@ -211,8 +211,30 @@ - ST_OMP_PARALLEL, ST_OMP_PARALLEL_DO, ST_OMP_PARALLEL_SECTIONS, - ST_OMP_PARALLEL_WORKSHARE, ST_OMP_SECTIONS, ST_OMP_SECTION, ST_OMP_SINGLE, - ST_OMP_THREADPRIVATE, ST_OMP_WORKSHARE, ST_OMP_TASK, ST_OMP_END_TASK, -- ST_OMP_TASKWAIT, ST_OMP_TASKYIELD, ST_PROCEDURE, ST_GENERIC, ST_CRITICAL, -- ST_END_CRITICAL, ST_GET_FCN_CHARACTERISTICS, ST_LOCK, ST_UNLOCK, ST_NONE -+ ST_OMP_TASKWAIT, ST_OMP_TASKYIELD, ST_OMP_CANCEL, ST_OMP_CANCELLATION_POINT, -+ ST_OMP_TASKGROUP, ST_OMP_END_TASKGROUP, ST_OMP_SIMD, ST_OMP_END_SIMD, -+ ST_OMP_DO_SIMD, ST_OMP_END_DO_SIMD, ST_OMP_PARALLEL_DO_SIMD, -+ ST_OMP_END_PARALLEL_DO_SIMD, ST_OMP_DECLARE_SIMD, ST_OMP_DECLARE_REDUCTION, -+ ST_OMP_TARGET, ST_OMP_END_TARGET, ST_OMP_TARGET_DATA, ST_OMP_END_TARGET_DATA, -+ ST_OMP_TARGET_UPDATE, ST_OMP_DECLARE_TARGET, -+ ST_OMP_TEAMS, ST_OMP_END_TEAMS, ST_OMP_DISTRIBUTE, ST_OMP_END_DISTRIBUTE, -+ ST_OMP_DISTRIBUTE_SIMD, ST_OMP_END_DISTRIBUTE_SIMD, -+ ST_OMP_DISTRIBUTE_PARALLEL_DO, ST_OMP_END_DISTRIBUTE_PARALLEL_DO, -+ ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD, ST_OMP_END_DISTRIBUTE_PARALLEL_DO_SIMD, -+ ST_OMP_TARGET_TEAMS, ST_OMP_END_TARGET_TEAMS, ST_OMP_TEAMS_DISTRIBUTE, -+ ST_OMP_END_TEAMS_DISTRIBUTE, ST_OMP_TEAMS_DISTRIBUTE_SIMD, -+ ST_OMP_END_TEAMS_DISTRIBUTE_SIMD, ST_OMP_TARGET_TEAMS_DISTRIBUTE, -+ ST_OMP_END_TARGET_TEAMS_DISTRIBUTE, ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD, -+ ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_SIMD, ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO, -+ ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO, -+ ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO, -+ ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO, -+ ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD, -+ ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD, -+ ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD, -+ ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD, -+ ST_PROCEDURE, ST_GENERIC, ST_CRITICAL, ST_END_CRITICAL, -+ ST_GET_FCN_CHARACTERISTICS, ST_LOCK, ST_UNLOCK, ST_NONE - } - gfc_statement; - -@@ -808,6 +830,13 @@ - variable for SELECT_TYPE or ASSOCIATE. */ - unsigned select_type_temporary:1, associate_var:1; - -+ /* This is omp_{out,in,priv,orig} artificial variable in -+ !$OMP DECLARE REDUCTION. */ -+ unsigned omp_udr_artificial_var:1; -+ -+ /* Mentioned in OMP DECLARE TARGET. */ -+ unsigned omp_declare_target:1; -+ - /* Attributes set by compiler extensions (!GCC$ ATTRIBUTES). */ - unsigned ext_attr:EXT_ATTR_NUM; - -@@ -1028,6 +1057,62 @@ - - #define gfc_get_namelist() XCNEW (gfc_namelist) - -+typedef enum -+{ -+ OMP_REDUCTION_NONE = -1, -+ OMP_REDUCTION_PLUS = INTRINSIC_PLUS, -+ OMP_REDUCTION_MINUS = INTRINSIC_MINUS, -+ OMP_REDUCTION_TIMES = INTRINSIC_TIMES, -+ OMP_REDUCTION_AND = INTRINSIC_AND, -+ OMP_REDUCTION_OR = INTRINSIC_OR, -+ OMP_REDUCTION_EQV = INTRINSIC_EQV, -+ OMP_REDUCTION_NEQV = INTRINSIC_NEQV, -+ OMP_REDUCTION_MAX = GFC_INTRINSIC_END, -+ OMP_REDUCTION_MIN, -+ OMP_REDUCTION_IAND, -+ OMP_REDUCTION_IOR, -+ OMP_REDUCTION_IEOR, -+ OMP_REDUCTION_USER -+} -+gfc_omp_reduction_op; -+ -+typedef enum -+{ -+ OMP_DEPEND_IN, -+ OMP_DEPEND_OUT, -+ OMP_DEPEND_INOUT -+} -+gfc_omp_depend_op; -+ -+typedef enum -+{ -+ OMP_MAP_ALLOC, -+ OMP_MAP_TO, -+ OMP_MAP_FROM, -+ OMP_MAP_TOFROM -+} -+gfc_omp_map_op; -+ -+/* For use in OpenMP clauses in case we need extra information -+ (aligned clause alignment, linear clause step, etc.). */ -+ -+typedef struct gfc_omp_namelist -+{ -+ struct gfc_symbol *sym; -+ struct gfc_expr *expr; -+ union -+ { -+ gfc_omp_reduction_op reduction_op; -+ gfc_omp_depend_op depend_op; -+ gfc_omp_map_op map_op; -+ } u; -+ struct gfc_omp_namelist_udr *udr; -+ struct gfc_omp_namelist *next; -+} -+gfc_omp_namelist; -+ -+#define gfc_get_omp_namelist() XCNEW (gfc_omp_namelist) -+ - enum - { - OMP_LIST_PRIVATE, -@@ -1036,20 +1121,14 @@ - OMP_LIST_COPYPRIVATE, - OMP_LIST_SHARED, - OMP_LIST_COPYIN, -- OMP_LIST_PLUS, -- OMP_LIST_REDUCTION_FIRST = OMP_LIST_PLUS, -- OMP_LIST_MULT, -- OMP_LIST_SUB, -- OMP_LIST_AND, -- OMP_LIST_OR, -- OMP_LIST_EQV, -- OMP_LIST_NEQV, -- OMP_LIST_MAX, -- OMP_LIST_MIN, -- OMP_LIST_IAND, -- OMP_LIST_IOR, -- OMP_LIST_IEOR, -- OMP_LIST_REDUCTION_LAST = OMP_LIST_IEOR, -+ OMP_LIST_UNIFORM, -+ OMP_LIST_ALIGNED, -+ OMP_LIST_LINEAR, -+ OMP_LIST_DEPEND, -+ OMP_LIST_MAP, -+ OMP_LIST_TO, -+ OMP_LIST_FROM, -+ OMP_LIST_REDUCTION, - OMP_LIST_NUM - }; - -@@ -1075,17 +1154,44 @@ - OMP_DEFAULT_FIRSTPRIVATE - }; - -+enum gfc_omp_proc_bind_kind -+{ -+ OMP_PROC_BIND_UNKNOWN, -+ OMP_PROC_BIND_MASTER, -+ OMP_PROC_BIND_SPREAD, -+ OMP_PROC_BIND_CLOSE -+}; -+ -+enum gfc_omp_cancel_kind -+{ -+ OMP_CANCEL_UNKNOWN, -+ OMP_CANCEL_PARALLEL, -+ OMP_CANCEL_SECTIONS, -+ OMP_CANCEL_DO, -+ OMP_CANCEL_TASKGROUP -+}; -+ - typedef struct gfc_omp_clauses - { - struct gfc_expr *if_expr; - struct gfc_expr *final_expr; - struct gfc_expr *num_threads; -- gfc_namelist *lists[OMP_LIST_NUM]; -+ gfc_omp_namelist *lists[OMP_LIST_NUM]; - enum gfc_omp_sched_kind sched_kind; - struct gfc_expr *chunk_size; - enum gfc_omp_default_sharing default_sharing; - int collapse; - bool nowait, ordered, untied, mergeable; -+ bool inbranch, notinbranch; -+ enum gfc_omp_cancel_kind cancel; -+ enum gfc_omp_proc_bind_kind proc_bind; -+ struct gfc_expr *safelen_expr; -+ struct gfc_expr *simdlen_expr; -+ struct gfc_expr *num_teams; -+ struct gfc_expr *device; -+ struct gfc_expr *thread_limit; -+ enum gfc_omp_sched_kind dist_sched_kind; -+ struct gfc_expr *dist_chunk_size; - } - gfc_omp_clauses; - -@@ -1092,6 +1198,49 @@ - #define gfc_get_omp_clauses() XCNEW (gfc_omp_clauses) - - -+/* Node in the linked list used for storing !$omp declare simd constructs. */ -+ -+typedef struct gfc_omp_declare_simd -+{ -+ struct gfc_omp_declare_simd *next; -+ locus where; /* Where the !$omp declare simd construct occurred. */ -+ -+ gfc_symbol *proc_name; -+ -+ gfc_omp_clauses *clauses; -+} -+gfc_omp_declare_simd; -+#define gfc_get_omp_declare_simd() XCNEW (gfc_omp_declare_simd) -+ -+typedef struct gfc_omp_udr -+{ -+ struct gfc_omp_udr *next; -+ locus where; /* Where the !$omp declare reduction construct occurred. */ -+ -+ const char *name; -+ gfc_typespec ts; -+ gfc_omp_reduction_op rop; -+ -+ struct gfc_symbol *omp_out; -+ struct gfc_symbol *omp_in; -+ struct gfc_namespace *combiner_ns; -+ -+ struct gfc_symbol *omp_priv; -+ struct gfc_symbol *omp_orig; -+ struct gfc_namespace *initializer_ns; -+} -+gfc_omp_udr; -+#define gfc_get_omp_udr() XCNEW (gfc_omp_udr) -+ -+typedef struct gfc_omp_namelist_udr -+{ -+ struct gfc_omp_udr *udr; -+ struct gfc_code *combiner; -+ struct gfc_code *initializer; -+} -+gfc_omp_namelist_udr; -+#define gfc_get_omp_namelist_udr() XCNEW (gfc_omp_namelist_udr) -+ - /* The gfc_st_label structure is a BBT attached to a namespace that - records the usage of statement labels within that space. */ - -@@ -1292,7 +1441,7 @@ - typedef struct gfc_common_head - { - locus where; -- char use_assoc, saved, threadprivate; -+ char use_assoc, saved, threadprivate, omp_declare_target; - char name[GFC_MAX_SYMBOL_LEN + 1]; - struct gfc_symbol *head; - const char* binding_label; -@@ -1368,6 +1517,7 @@ - gfc_user_op *uop; - gfc_common_head *common; - gfc_typebound_proc *tb; -+ gfc_omp_udr *omp_udr; - } - n; - } -@@ -1398,6 +1548,8 @@ - gfc_symtree *uop_root; - /* Tree containing all the common blocks. */ - gfc_symtree *common_root; -+ /* Tree containing all the OpenMP user defined reductions. */ -+ gfc_symtree *omp_udr_root; - - /* Tree containing type-bound procedures. */ - gfc_symtree *tb_sym_root; -@@ -1464,6 +1616,9 @@ - /* A list of USE statements in this namespace. */ - gfc_use_list *use_stmts; - -+ /* Linked list of !$omp declare simd constructs. */ -+ struct gfc_omp_declare_simd *omp_declare_simd; -+ - /* Set to 1 if namespace is a BLOCK DATA program unit. */ - unsigned is_block_data:1; - -@@ -1480,6 +1635,9 @@ - /* Set to 1 if symbols in this namespace should be 'construct entities', - i.e. for BLOCK local variables. */ - unsigned construct_entities:1; -+ -+ /* Set to 1 for !$OMP DECLARE REDUCTION namespaces. */ -+ unsigned omp_udr_ns:1; - } - gfc_namespace; - -@@ -2111,16 +2269,31 @@ - EXEC_OMP_SECTIONS, EXEC_OMP_SINGLE, EXEC_OMP_WORKSHARE, - EXEC_OMP_ATOMIC, EXEC_OMP_BARRIER, EXEC_OMP_END_NOWAIT, - EXEC_OMP_END_SINGLE, EXEC_OMP_TASK, EXEC_OMP_TASKWAIT, -- EXEC_OMP_TASKYIELD -+ EXEC_OMP_TASKYIELD, EXEC_OMP_CANCEL, EXEC_OMP_CANCELLATION_POINT, -+ EXEC_OMP_TASKGROUP, EXEC_OMP_SIMD, EXEC_OMP_DO_SIMD, -+ EXEC_OMP_PARALLEL_DO_SIMD, EXEC_OMP_TARGET, EXEC_OMP_TARGET_DATA, -+ EXEC_OMP_TEAMS, EXEC_OMP_DISTRIBUTE, EXEC_OMP_DISTRIBUTE_SIMD, -+ EXEC_OMP_DISTRIBUTE_PARALLEL_DO, EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD, -+ EXEC_OMP_TARGET_TEAMS, EXEC_OMP_TEAMS_DISTRIBUTE, -+ EXEC_OMP_TEAMS_DISTRIBUTE_SIMD, EXEC_OMP_TARGET_TEAMS_DISTRIBUTE, -+ EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD, -+ EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO, -+ EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO, -+ EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD, -+ EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD, -+ EXEC_OMP_TARGET_UPDATE - } - gfc_exec_op; - - typedef enum - { -- GFC_OMP_ATOMIC_UPDATE, -- GFC_OMP_ATOMIC_READ, -- GFC_OMP_ATOMIC_WRITE, -- GFC_OMP_ATOMIC_CAPTURE -+ GFC_OMP_ATOMIC_UPDATE = 0, -+ GFC_OMP_ATOMIC_READ = 1, -+ GFC_OMP_ATOMIC_WRITE = 2, -+ GFC_OMP_ATOMIC_CAPTURE = 3, -+ GFC_OMP_ATOMIC_MASK = 3, -+ GFC_OMP_ATOMIC_SEQ_CST = 4, -+ GFC_OMP_ATOMIC_SWAP = 8 - } - gfc_omp_atomic_op; - -@@ -2172,7 +2345,7 @@ - gfc_entry_list *entry; - gfc_omp_clauses *omp_clauses; - const char *omp_name; -- gfc_namelist *omp_namelist; -+ gfc_omp_namelist *omp_namelist; - bool omp_bool; - gfc_omp_atomic_op omp_atomic; - } -@@ -2573,6 +2746,7 @@ - bool gfc_add_result (symbol_attribute *, const char *, locus *); - bool gfc_add_save (symbol_attribute *, save_state, const char *, locus *); - bool gfc_add_threadprivate (symbol_attribute *, const char *, locus *); -+bool gfc_add_omp_declare_target (symbol_attribute *, const char *, locus *); - bool gfc_add_saved_common (symbol_attribute *, locus *); - bool gfc_add_target (symbol_attribute *, locus *); - bool gfc_add_dummy (symbol_attribute *, const char *, locus *); -@@ -2728,6 +2902,7 @@ - void gfc_free_forall_iterator (gfc_forall_iterator *); - void gfc_free_alloc_list (gfc_alloc *); - void gfc_free_namelist (gfc_namelist *); -+void gfc_free_omp_namelist (gfc_omp_namelist *); - void gfc_free_equiv (gfc_equiv *); - void gfc_free_equiv_until (gfc_equiv *, gfc_equiv *); - void gfc_free_data (gfc_data *); -@@ -2739,10 +2914,16 @@ - /* openmp.c */ - struct gfc_omp_saved_state { void *ptrs[2]; int ints[1]; }; - void gfc_free_omp_clauses (gfc_omp_clauses *); -+void gfc_free_omp_declare_simd (gfc_omp_declare_simd *); -+void gfc_free_omp_declare_simd_list (gfc_omp_declare_simd *); -+void gfc_free_omp_udr (gfc_omp_udr *); -+gfc_omp_udr *gfc_omp_udr_find (gfc_symtree *, gfc_typespec *); - void gfc_resolve_omp_directive (gfc_code *, gfc_namespace *); - void gfc_resolve_do_iterator (gfc_code *, gfc_symbol *); - void gfc_resolve_omp_parallel_blocks (gfc_code *, gfc_namespace *); - void gfc_resolve_omp_do_blocks (gfc_code *, gfc_namespace *); -+void gfc_resolve_omp_declare_simd (gfc_namespace *); -+void gfc_resolve_omp_udrs (gfc_symtree *); - void gfc_omp_save_and_clear_state (struct gfc_omp_saved_state *); - void gfc_omp_restore_state (struct gfc_omp_saved_state *); - -@@ -2833,6 +3014,7 @@ - /* resolve.c */ - bool gfc_resolve_expr (gfc_expr *); - void gfc_resolve (gfc_namespace *); -+void gfc_resolve_code (gfc_code *, gfc_namespace *); - void gfc_resolve_blocks (gfc_code *, gfc_namespace *); - int gfc_impure_variable (gfc_symbol *); - int gfc_pure (gfc_symbol *); -@@ -3019,6 +3201,7 @@ - typedef int (*walk_code_fn_t) (gfc_code **, int *, void *); - typedef int (*walk_expr_fn_t) (gfc_expr **, int *, void *); - -+int gfc_dummy_code_callback (gfc_code **, int *, void *); - int gfc_expr_walker (gfc_expr **, walk_expr_fn_t, void *); - int gfc_code_walker (gfc_code **, walk_code_fn_t, walk_expr_fn_t, void *); - -Index: gcc/fortran/ChangeLog -=================================================================== ---- a/src/gcc/fortran/ChangeLog (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/ChangeLog (.../branches/gcc-4_9-branch) -@@ -1,3 +1,617 @@ -+2014-07-07 Paul Thomas <pault@gcc.gnu.org> -+ -+ PR fortran/61459 -+ PR fortran/58883 -+ * trans-expr.c (fcncall_realloc_result): Use the natural type -+ for the address expression of 'res_desc'. -+ -+2014-07-07 Dominique d'Humieres <dominiq@lps.ens.fr> -+ Mikael Morin <mikael@gcc.gnu.org> -+ -+ PR fortran/41936 -+ * trans-expr.c (gfc_conv_expr_reference): Deallocate array -+ components. -+ -+2014-07-02 Jakub Jelinek <jakub@redhat.com> -+ Fritz Reese <Reese-Fritz@zai.com> -+ -+ * decl.c (variable_decl): Reject old style initialization -+ for derived type components. -+ -+2014-06-30 Jakub Jelinek <jakub@redhat.com> -+ -+ * module.c (MOD_VERSION): Revert back to 12. -+ (MOD_VERSION_OMP4): Define. -+ (module_omp4): New variable. -+ (mio_symbol): Call mio_omp_declare_simd only if module_omp4. -+ (read_module): Load omp udrs only if module_omp4. -+ (write_module): Write omp udrs only if module_omp4. -+ (find_omp_declare_simd): New function. -+ (gfc_dump_module): Compute module_omp4. Use MOD_VERSION_OMP4 -+ if module_omp4. -+ (gfc_use_module): Handle MOD_VERSION_OMP4, set module_omp4. -+ -+ Backported from mainline -+ 2014-06-25 Jakub Jelinek <jakub@redhat.com> -+ -+ * trans.h (gfc_omp_clause_linear_ctor): New prototype. -+ * trans-openmp.c (gfc_omp_linear_clause_add_loop, -+ gfc_omp_clause_linear_ctor): New functions. -+ (gfc_trans_omp_clauses): Make sure OMP_CLAUSE_LINEAR_STEP has -+ correct type. Set OMP_CLAUSE_LINEAR_ARRAY flag if needed. -+ * f95-lang.c (LANG_HOOKS_OMP_CLAUSE_LINEAR_CTOR): Redefine. -+ -+ 2014-06-24 Jakub Jelinek <jakub@redhat.com> -+ -+ * dump-parse-tree.c (show_omp_namelist): Use n->udr->udr instead -+ of n->udr. -+ * f95-lang.c (gfc_init_builtin_functions): Initialize -+ BUILT_IN_ASSUME_ALIGNED. -+ * gfortran.h (gfc_omp_namelist): Change udr field type to -+ struct gfc_omp_namelist_udr. -+ (gfc_omp_namelist_udr): New type. -+ (gfc_get_omp_namelist_udr): Define. -+ (gfc_resolve_code): New prototype. -+ * match.c (gfc_free_omp_namelist): Free name->udr. -+ * module.c (intrinsics): Add INTRINSIC_USER. -+ (fix_mio_expr): Likewise. -+ (mio_expr): Handle INSTRINSIC_USER and non-resolved EXPR_FUNCTION. -+ * openmp.c (gfc_match_omp_clauses): Adjust initialization of n->udr. -+ (gfc_match_omp_declare_reduction): Treat len=: the same as len=*. -+ Set attr.flavor on omp_{out,in,priv,orig} artificial variables. -+ (struct resolve_omp_udr_callback_data): New type. -+ (resolve_omp_udr_callback, resolve_omp_udr_callback2, -+ resolve_omp_udr_clause): New functions. -+ (resolve_omp_clauses): Adjust for n->udr changes, resolve UDR clauses -+ here. -+ (omp_udr_callback): Don't check for implicitly declared functions -+ here. -+ (gfc_resolve_omp_udr): Don't call gfc_resolve. Don't check for -+ implicitly declared subroutines here. -+ * resolve.c (resolve_function): If value.function.isym is non-NULL, -+ consider it already resolved. -+ (resolve_code): Renamed to ... -+ (gfc_resolve_code): ... this. No longer static. -+ (gfc_resolve_blocks, generate_component_assignments, resolve_codes): -+ Adjust callers. -+ * trans-openmp.c (gfc_omp_privatize_by_reference): Don't privatize -+ by reference type (C_PTR) variables. -+ (gfc_omp_finish_clause): Make sure OMP_CLAUSE_SIZE is non-NULL. -+ (gfc_trans_omp_udr_expr): Remove. -+ (gfc_trans_omp_array_reduction_or_udr): Adjust for n->udr changes. -+ Don't call gfc_trans_omp_udr_expr, even for sym->attr.dimension -+ expand it as assignment or subroutine call. Don't initialize -+ value.function.isym. -+ -+ 2014-06-18 Tobias Burnus <burnus@net-b.de> -+ -+ * gfortran.texi (OpenMP): Update refs to OpenMP 4.0. -+ * intrinsic.texi (OpenMP Modules): Ditto. -+ -+ 2014-06-18 Jakub Jelinek <jakub@redhat.com> -+ -+ * cpp.c (cpp_define_builtins): Change _OPENMP macro to -+ 201307. -+ * dump-parse-tree.c (show_omp_namelist): Add list_type -+ argument. Adjust for rop being u.reduction_op now, -+ handle depend_op or map_op. -+ (show_omp_node): Adjust callers. Print some new -+ OpenMP 4.0 clauses, adjust for OMP_LIST_DEPEND_{IN,OUT} -+ becoming a single OMP_LIST_DEPEND. -+ * f95-lang.c (gfc_handle_omp_declare_target_attribute): New -+ function. -+ (gfc_attribute_table): New variable. -+ (LANG_HOOKS_OMP_FINISH_CLAUSE, LANG_HOOKS_ATTRIBUTE_TABLE): Redefine. -+ * frontend-passes.c (gfc_code_walker): Handle new OpenMP target -+ EXEC_OMP_* codes and new clauses. -+ * gfortran.h (gfc_statement): Add ST_OMP_TARGET, ST_OMP_END_TARGET, -+ ST_OMP_TARGET_DATA, ST_OMP_END_TARGET_DATA, ST_OMP_TARGET_UPDATE, -+ ST_OMP_DECLARE_TARGET, ST_OMP_TEAMS, ST_OMP_END_TEAMS, -+ ST_OMP_DISTRIBUTE, ST_OMP_END_DISTRIBUTE, ST_OMP_DISTRIBUTE_SIMD, -+ ST_OMP_END_DISTRIBUTE_SIMD, ST_OMP_DISTRIBUTE_PARALLEL_DO, -+ ST_OMP_END_DISTRIBUTE_PARALLEL_DO, ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD, -+ ST_OMP_END_DISTRIBUTE_PARALLEL_DO_SIMD, ST_OMP_TARGET_TEAMS, -+ ST_OMP_END_TARGET_TEAMS, ST_OMP_TEAMS_DISTRIBUTE, -+ ST_OMP_END_TEAMS_DISTRIBUTE, ST_OMP_TEAMS_DISTRIBUTE_SIMD, -+ ST_OMP_END_TEAMS_DISTRIBUTE_SIMD, ST_OMP_TARGET_TEAMS_DISTRIBUTE, -+ ST_OMP_END_TARGET_TEAMS_DISTRIBUTE, -+ ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD, -+ ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_SIMD, -+ ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO, -+ ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO, -+ ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO, -+ ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO, -+ ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD, -+ ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD, -+ ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD and -+ ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD. -+ (symbol_attribute): Add omp_declare_target field. -+ (gfc_omp_depend_op, gfc_omp_map_op): New enums. -+ (gfc_omp_namelist): Replace rop field with union -+ containing reduction_op, depend_op and map_op. -+ (OMP_LIST_DEPEND_IN, OMP_LIST_DEPEND_OUT): Remove. -+ (OMP_LIST_DEPEND, OMP_LIST_MAP, OMP_LIST_TO, OMP_LIST_FROM): New. -+ (gfc_omp_clauses): Add num_teams, device, thread_limit, -+ dist_sched_kind, dist_chunk_size fields. -+ (gfc_common_head): Add omp_declare_target field. -+ (gfc_exec_op): Add EXEC_OMP_TARGET, EXEC_OMP_TARGET_DATA, -+ EXEC_OMP_TEAMS, EXEC_OMP_DISTRIBUTE, EXEC_OMP_DISTRIBUTE_SIMD, -+ EXEC_OMP_DISTRIBUTE_PARALLEL_DO, EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD, -+ EXEC_OMP_TARGET_TEAMS, EXEC_OMP_TEAMS_DISTRIBUTE, -+ EXEC_OMP_TEAMS_DISTRIBUTE_SIMD, EXEC_OMP_TARGET_TEAMS_DISTRIBUTE, -+ EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD, -+ EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO, -+ EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO, -+ EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD, -+ EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD and -+ EXEC_OMP_TARGET_UPDATE. -+ (gfc_add_omp_declare_target): New prototype. -+ * match.h (gfc_match_omp_declare_target, gfc_match_omp_distribute, -+ gfc_match_omp_distribute_parallel_do, -+ gfc_match_omp_distribute_parallel_do_simd, -+ gfc_match_omp_distribute_simd, gfc_match_omp_target, -+ gfc_match_omp_target_data, gfc_match_omp_target_teams, -+ gfc_match_omp_target_teams_distribute, -+ gfc_match_omp_target_teams_distribute_parallel_do, -+ gfc_match_omp_target_teams_distribute_parallel_do_simd, -+ gfc_match_omp_target_teams_distribute_simd, -+ gfc_match_omp_target_update, gfc_match_omp_teams, -+ gfc_match_omp_teams_distribute, -+ gfc_match_omp_teams_distribute_parallel_do, -+ gfc_match_omp_teams_distribute_parallel_do_simd, -+ gfc_match_omp_teams_distribute_simd): New prototypes. -+ * module.c (ab_attribute): Add AB_OMP_DECLARE_TARGET. -+ (attr_bits): Likewise. -+ (mio_symbol_attribute): Handle omp_declare_target attribute. -+ (gfc_free_omp_clauses): Free num_teams, device, thread_limit -+ and dist_chunk_size expressions. -+ (OMP_CLAUSE_PRIVATE, OMP_CLAUSE_FIRSTPRIVATE, OMP_CLAUSE_LASTPRIVATE, -+ OMP_CLAUSE_COPYPRIVATE, OMP_CLAUSE_SHARED, OMP_CLAUSE_COPYIN, -+ OMP_CLAUSE_REDUCTION, OMP_CLAUSE_IF, OMP_CLAUSE_NUM_THREADS, -+ OMP_CLAUSE_SCHEDULE, OMP_CLAUSE_DEFAULT, OMP_CLAUSE_ORDERED, -+ OMP_CLAUSE_COLLAPSE, OMP_CLAUSE_UNTIED, OMP_CLAUSE_FINAL, -+ OMP_CLAUSE_MERGEABLE, OMP_CLAUSE_ALIGNED, OMP_CLAUSE_DEPEND, -+ OMP_CLAUSE_INBRANCH, OMP_CLAUSE_LINEAR, OMP_CLAUSE_NOTINBRANCH, -+ OMP_CLAUSE_PROC_BIND, OMP_CLAUSE_SAFELEN, OMP_CLAUSE_SIMDLEN, -+ OMP_CLAUSE_UNIFORM): Use 1U instead of 1. -+ (OMP_CLAUSE_DEVICE, OMP_CLAUSE_MAP, OMP_CLAUSE_TO, OMP_CLAUSE_FROM, -+ OMP_CLAUSE_NUM_TEAMS, OMP_CLAUSE_THREAD_LIMIT, -+ OMP_CLAUSE_DIST_SCHEDULE): Define. -+ (gfc_match_omp_clauses): Change mask parameter to unsigned int. -+ Adjust for rop becoming u.reduction_op. Disallow inbranch with -+ notinbranch. For depend clause, always create OMP_LIST_DEPEND -+ and fill in u.depend_op. Handle num_teams, device, map, -+ to, from, thread_limit and dist_schedule clauses. -+ (OMP_DECLARE_SIMD_CLAUSES): Or in OMP_CLAUSE_INBRANCH and -+ OMP_CLAUSE_NOTINBRANCH. -+ (OMP_TARGET_CLAUSES, OMP_TARGET_DATA_CLAUSES, -+ OMP_TARGET_UPDATE_CLAUSES, OMP_TEAMS_CLAUSES, -+ OMP_DISTRIBUTE_CLAUSES): Define. -+ (match_omp): New function. -+ (gfc_match_omp_do, gfc_match_omp_do_simd, gfc_match_omp_parallel, -+ gfc_match_omp_parallel_do, gfc_match_omp_parallel_do_simd, -+ gfc_match_omp_parallel_sections, gfc_match_omp_parallel_workshare, -+ gfc_match_omp_sections, gfc_match_omp_simd, gfc_match_omp_single, -+ gfc_match_omp_task): Rewritten using match_omp. -+ (gfc_match_omp_threadprivate, gfc_match_omp_declare_reduction): -+ Diagnose if the directives are followed by unexpected junk. -+ (gfc_match_omp_distribute, gfc_match_omp_distribute_parallel_do, -+ gfc_match_omp_distribute_parallel_do_simd, -+ gfc_match_omp_distrbute_simd, gfc_match_omp_declare_target, -+ gfc_match_omp_target, gfc_match_omp_target_data, -+ gfc_match_omp_target_teams, gfc_match_omp_target_teams_distribute, -+ gfc_match_omp_target_teams_distribute_parallel_do, -+ gfc_match_omp_target_teams_distribute_parallel_do_simd, -+ gfc_match_omp_target_teams_distrbute_simd, gfc_match_omp_target_update, -+ gfc_match_omp_teams, gfc_match_omp_teams_distribute, -+ gfc_match_omp_teams_distribute_parallel_do, -+ gfc_match_omp_teams_distribute_parallel_do_simd, -+ gfc_match_omp_teams_distrbute_simd): New functions. -+ * openmp.c (resolve_omp_clauses): Adjust for -+ OMP_LIST_DEPEND_{IN,OUT} being changed to OMP_LIST_DEPEND. Handle -+ OMP_LIST_MAP, OMP_LIST_FROM, OMP_LIST_TO, num_teams, device, -+ dist_chunk_size and thread_limit. -+ (gfc_resolve_omp_parallel_blocks): Only put sharing clauses into -+ ctx.sharing_clauses. Call gfc_resolve_omp_do_blocks for various -+ new EXEC_OMP_* codes. -+ (resolve_omp_do): Handle various new EXEC_OMP_* codes. -+ (gfc_resolve_omp_directive): Likewise. -+ (gfc_resolve_omp_declare_simd): Add missing space to diagnostics. -+ * parse.c (decode_omp_directive): Handle parsing of OpenMP 4.0 -+ offloading related directives. -+ (case_executable): Add ST_OMP_TARGET_UPDATE. -+ (case_exec_markers): Add ST_OMP_TARGET*, ST_OMP_TEAMS*, -+ ST_OMP_DISTRIBUTE*. -+ (case_decl): Add ST_OMP_DECLARE_TARGET. -+ (gfc_ascii_statement): Handle new ST_OMP_* codes. -+ (parse_omp_do): Handle various new ST_OMP_* codes. -+ (parse_executable): Likewise. -+ * resolve.c (gfc_resolve_blocks): Handle various new EXEC_OMP_* -+ codes. -+ (resolve_code): Likewise. -+ (resolve_symbol): Change that !$OMP DECLARE TARGET variables -+ are saved. -+ * st.c (gfc_free_statement): Handle various new EXEC_OMP_* codes. -+ * symbol.c (check_conflict): Check omp_declare_target conflicts. -+ (gfc_add_omp_declare_target): New function. -+ (gfc_copy_attr): Copy omp_declare_target. -+ * trans.c (trans_code): Handle various new EXEC_OMP_* codes. -+ * trans-common.c (build_common_decl): Add "omp declare target" -+ attribute if needed. -+ * trans-decl.c (add_attributes_to_decl): Likewise. -+ * trans.h (gfc_omp_finish_clause): New prototype. -+ * trans-openmp.c (gfc_omp_finish_clause): New function. -+ (gfc_trans_omp_reduction_list): Adjust for rop being renamed -+ to u.reduction_op. -+ (gfc_trans_omp_clauses): Adjust for OMP_LIST_DEPEND_{IN,OUT} -+ change to OMP_LIST_DEPEND and fix up depend handling. -+ Handle OMP_LIST_MAP, OMP_LIST_TO, OMP_LIST_FROM, num_teams, -+ thread_limit, device, dist_chunk_size and dist_sched_kind. -+ (gfc_trans_omp_do): Handle EXEC_OMP_DISTRIBUTE. -+ (GFC_OMP_SPLIT_DISTRIBUTE, GFC_OMP_SPLIT_TEAMS, -+ GFC_OMP_SPLIT_TARGET, GFC_OMP_SPLIT_NUM, GFC_OMP_MASK_DISTRIBUTE, -+ GFC_OMP_MASK_TEAMS, GFC_OMP_MASK_TARGET, GFC_OMP_MASK_NUM): New. -+ (gfc_split_omp_clauses): Handle splitting of clauses for new -+ EXEC_OMP_* codes. -+ (gfc_trans_omp_do_simd): Add pblock argument, adjust for being -+ callable for combined constructs. -+ (gfc_trans_omp_parallel_do, gfc_trans_omp_parallel_do_simd): Likewise. -+ (gfc_trans_omp_distribute, gfc_trans_omp_teams, -+ gfc_trans_omp_target, gfc_trans_omp_target_data, -+ gfc_trans_omp_target_update): New functions. -+ (gfc_trans_omp_directive): Adjust gfc_trans_omp_* callers, handle -+ new EXEC_OMP_* codes. -+ -+ 2014-06-10 Jakub Jelinek <jakub@redhat.com> -+ -+ PR fortran/60928 -+ * f95-lang.c (gfc_init_builtin_functions): Handle -fopenmp-simd -+ like -fopenmp. -+ * openmp.c (resolve_omp_clauses): Remove allocatable components -+ diagnostics. Add associate-name and intent(in) pointer -+ diagnostics for various clauses, diagnose procedure pointers in -+ reduction clause. -+ * parse.c (match_word_omp_simd): New function. -+ (matchs, matcho): New macros. -+ (decode_omp_directive): Change match macros to either matchs -+ or matcho. Handle -fopenmp-simd. -+ (next_free, next_fixed): Handle -fopenmp-simd like -fopenmp. -+ * scanner.c (skip_free_comments, skip_fixed_comments, include_line): -+ Likewise. -+ * trans-array.c (get_full_array_size): Rename to... -+ (gfc_full_array_size): ... this. No longer static. -+ (duplicate_allocatable): Adjust caller. Add NO_MEMCPY argument -+ and handle it. -+ (gfc_duplicate_allocatable, gfc_copy_allocatable_data): Adjust -+ duplicate_allocatable callers. -+ (gfc_duplicate_allocatable_nocopy): New function. -+ (structure_alloc_comps): Adjust g*_full_array_size and -+ duplicate_allocatable caller. -+ * trans-array.h (gfc_full_array_size, -+ gfc_duplicate_allocatable_nocopy): New prototypes. -+ * trans-common.c (create_common): Call gfc_finish_decl_attrs. -+ * trans-decl.c (gfc_finish_decl_attrs): New function. -+ (gfc_finish_var_decl, create_function_arglist, -+ gfc_get_fake_result_decl): Call it. -+ (gfc_allocate_lang_decl): If DECL_LANG_SPECIFIC is already allocated, -+ don't allocate it again. -+ (gfc_get_symbol_decl): Set GFC_DECL_ASSOCIATE_VAR_P on -+ associate-names. -+ * trans.h (gfc_finish_decl_attrs): New prototype. -+ (struct lang_decl): Add scalar_allocatable and scalar_pointer -+ bitfields. -+ (GFC_DECL_SCALAR_ALLOCATABLE, GFC_DECL_SCALAR_POINTER, -+ GFC_DECL_GET_SCALAR_ALLOCATABLE, GFC_DECL_GET_SCALAR_POINTER, -+ GFC_DECL_ASSOCIATE_VAR_P): Define. -+ (GFC_POINTER_TYPE_P): Remove. -+ * trans-openmp.c (gfc_omp_privatize_by_reference): Don't check -+ GFC_POINTER_TYPE_P, instead test GFC_DECL_GET_SCALAR_ALLOCATABLE, -+ GFC_DECL_GET_SCALAR_POINTER or GFC_DECL_CRAY_POINTEE on decl. -+ (gfc_omp_predetermined_sharing): Associate-names are predetermined. -+ (enum walk_alloc_comps): New. -+ (gfc_has_alloc_comps, gfc_omp_unshare_expr_r, gfc_omp_unshare_expr, -+ gfc_walk_alloc_comps): New functions. -+ (gfc_omp_private_outer_ref): Return true for scalar allocatables or -+ decls with allocatable components. -+ (gfc_omp_clause_default_ctor, gfc_omp_clause_copy_ctor, -+ gfc_omp_clause_assign_op, gfc_omp_clause_dtor): Fix up handling of -+ allocatables, handle also OMP_CLAUSE_REDUCTION, handle scalar -+ allocatables and decls with allocatable components. -+ (gfc_trans_omp_array_reduction_or_udr): Don't handle allocatable -+ arrays here. -+ (gfc_trans_omp_reduction_list): Call -+ gfc_trans_omp_array_reduction_or_udr even for allocatable scalars. -+ (gfc_trans_omp_do_simd): If -fno-openmp, just expand it as OMP_SIMD. -+ (gfc_trans_omp_parallel_do_simd): Likewise. -+ * trans-types.c (gfc_sym_type): Don't set GFC_POINTER_TYPE_P. -+ (gfc_get_derived_type): Call gfc_finish_decl_attrs. -+ -+ 2014-06-06 Jakub Jelinek <jakub@redhat.com> -+ -+ * dump-parse-tree.c (show_omp_namelist): Dump reduction -+ id in each list item. -+ (show_omp_node): Only handle OMP_LIST_REDUCTION, not -+ OMP_LIST_REDUCTION_FIRST .. OMP_LIST_REDUCTION_LAST. Don't -+ dump reduction id here. -+ * frontend-passes.c (dummy_code_callback): Renamed to... -+ (gfc_dummy_code_callback): ... this. No longer static. -+ (optimize_reduction): Use gfc_dummy_code_callback instead of -+ dummy_code_callback. -+ * gfortran.h (gfc_statement): Add ST_OMP_DECLARE_REDUCTION. -+ (symbol_attribute): Add omp_udr_artificial_var bitfield. -+ (gfc_omp_reduction_op): New enum. -+ (gfc_omp_namelist): Add rop and udr fields. -+ (OMP_LIST_PLUS, OMP_LIST_REDUCTION_FIRST, OMP_LIST_MULT, -+ OMP_LIST_SUB, OMP_LIST_AND, OMP_LIST_OR, OMP_LIST_EQV, -+ OMP_LIST_NEQV, OMP_LIST_MAX, OMP_LIST_MIN, OMP_LIST_IAND, -+ OMP_LIST_IOR, OMP_LIST_IEOR, OMP_LIST_REDUCTION_LAST): Removed. -+ (OMP_LIST_REDUCTION): New. -+ (gfc_omp_udr): New type. -+ (gfc_get_omp_udr): Define. -+ (gfc_symtree): Add n.omp_udr field. -+ (gfc_namespace): Add omp_udr_root field, add omp_udr_ns bitfield. -+ (gfc_free_omp_udr, gfc_omp_udr_find, gfc_resolve_omp_udrs, -+ gfc_dummy_code_callback): New prototypes. -+ * match.h (gfc_match_omp_declare_reduction): New prototype. -+ * module.c (MOD_VERSION): Increase to 13. -+ (omp_declare_reduction_stmt): New array. -+ (mio_omp_udr_expr, write_omp_udr, write_omp_udrs, load_omp_udrs): -+ New functions. -+ (read_module): Read OpenMP user defined reductions. -+ (write_module): Write OpenMP user defined reductions. -+ * openmp.c: Include arith.h. -+ (gfc_free_omp_udr, gfc_find_omp_udr): New functions. -+ (gfc_match_omp_clauses): Handle user defined reductions. -+ Store reduction kind into gfc_omp_namelist instead of using -+ several OMP_LIST_* entries. -+ (match_udr_expr, gfc_omp_udr_predef, gfc_omp_udr_find, -+ gfc_match_omp_declare_reduction): New functions. -+ (resolve_omp_clauses): Adjust for reduction clauses being only -+ in OMP_LIST_REDUCTION list. Diagnose missing UDRs. -+ (struct omp_udr_callback_data): New type. -+ (omp_udr_callback, gfc_resolve_omp_udr, gfc_resolve_omp_udrs): New -+ functions. -+ * parse.c (decode_omp_directive): Handle !$omp declare reduction. -+ (case_decl): Add ST_OMP_DECLARE_REDUCTION. -+ (gfc_ascii_statement): Print ST_OMP_DECLARE_REDUCTION. -+ * resolve.c (resolve_fl_variable): Allow len=: or len=* on -+ sym->attr.omp_udr_artificial_var symbols. -+ (resolve_types): Call gfc_resolve_omp_udrs. -+ * symbol.c (gfc_get_uop): If gfc_current_ns->omp_udr_ns, -+ use parent ns instead of gfc_current_ns. -+ (gfc_get_sym_tree): Don't insert symbols into -+ namespaces with omp_udr_ns set. -+ (free_omp_udr_tree): New function. -+ (gfc_free_namespace): Call it. -+ * trans-openmp.c (struct omp_udr_find_orig_data): New type. -+ (omp_udr_find_orig, gfc_trans_omp_udr_expr): New functions. -+ (gfc_trans_omp_array_reduction): Renamed to... -+ (gfc_trans_omp_array_reduction_or_udr): ... this. Remove SYM -+ argument, instead pass gfc_omp_namelist pointer N. Handle -+ user defined reductions. -+ (gfc_trans_omp_reduction_list): Remove REDUCTION_CODE argument. -+ Handle user defined reductions and reduction ops in gfc_omp_namelist. -+ (gfc_trans_omp_clauses): Adjust for just a single OMP_LIST_REDUCTION -+ list. -+ (gfc_split_omp_clauses): Likewise. -+ -+ 2014-05-12 Tobias Burnus <burnus@net-b.de> -+ -+ PR fortran/60127 -+ * openmp.c (resolve_omp_do): Reject do concurrent loops. -+ -+ 2014-05-11 Jakub Jelinek <jakub@redhat.com> -+ -+ * gfortran.h (gfc_statement): Add ST_OMP_CANCEL, -+ ST_OMP_CANCELLATION_POINT, ST_OMP_TASKGROUP, ST_OMP_END_TASKGROUP, -+ ST_OMP_SIMD, ST_OMP_END_SIMD, ST_OMP_DO_SIMD, ST_OMP_END_DO_SIMD, -+ ST_OMP_PARALLEL_DO_SIMD, ST_OMP_END_PARALLEL_DO_SIMD and -+ ST_OMP_DECLARE_SIMD. -+ (gfc_omp_namelist): New typedef. -+ (gfc_get_omp_namelist): Define. -+ (OMP_LIST_UNIFORM, OMP_LIST_ALIGNED, OMP_LIST_LINEAR, -+ OMP_LIST_DEPEND_IN, OMP_LIST_DEPEND_OUT): New clause list kinds. -+ (gfc_omp_proc_bind_kind, gfc_omp_cancel_kind): New enums. -+ (gfc_omp_clauses): Change type of lists to gfc_omp_namelist *. -+ Add inbranch, notinbranch, cancel, proc_bind, safelen_expr and -+ simdlen_expr fields. -+ (gfc_omp_declare_simd): New typedef. -+ (gfc_get_omp_declare_simd): Define. -+ (gfc_namespace): Add omp_declare_simd field. -+ (gfc_exec_op): Add EXEC_OMP_CANCEL, EXEC_OMP_CANCELLATION_POINT, -+ EXEC_OMP_TASKGROUP, EXEC_OMP_SIMD, EXEC_OMP_DO_SIMD and -+ EXEC_OMP_PARALLEL_DO_SIMD. -+ (gfc_omp_atomic_op): Add GFC_OMP_ATOMIC_MASK, GFC_OMP_ATOMIC_SEQ_CST -+ and GFC_OMP_ATOMIC_SWAP. -+ (gfc_code): Change type of omp_namelist field to gfc_omp_namelist *. -+ (gfc_free_omp_namelist, gfc_free_omp_declare_simd, -+ gfc_free_omp_declare_simd_list, gfc_resolve_omp_declare_simd): New -+ prototypes. -+ * trans-stmt.h (gfc_trans_omp_declare_simd): New prototype. -+ * symbol.c (gfc_free_namespace): Call gfc_free_omp_declare_simd. -+ * openmp.c (gfc_free_omp_clauses): Free safelen_expr and -+ simdlen_expr. Use gfc_free_omp_namelist instead of -+ gfc_free_namelist. -+ (gfc_free_omp_declare_simd, gfc_free_omp_declare_simd_list): New -+ functions. -+ (gfc_match_omp_variable_list): Add end_colon, headp and -+ allow_sections arguments. Handle parsing of array sections. -+ Use *omp_namelist* instead of *namelist* data structure and -+ functions/macros. Allow termination at : character. -+ (OMP_CLAUSE_ALIGNED, OMP_CLAUSE_DEPEND, OMP_CLAUSE_INBRANCH, -+ OMP_CLAUSE_LINEAR, OMP_CLAUSE_NOTINBRANCH, OMP_CLAUSE_PROC_BIND, -+ OMP_CLAUSE_SAFELEN, OMP_CLAUSE_SIMDLEN, OMP_CLAUSE_UNIFORM): Define. -+ (gfc_match_omp_clauses): Change first and needs_space variables -+ into arguments with default values. Parse inbranch, notinbranch, -+ proc_bind, safelen, simdlen, uniform, linear, aligned and -+ depend clauses. -+ (OMP_PARALLEL_CLAUSES): Add OMP_CLAUSE_PROC_BIND. -+ (OMP_DECLARE_SIMD_CLAUSES, OMP_SIMD_CLAUSES): Define. -+ (OMP_TASK_CLAUSES): Add OMP_CLAUSE_DEPEND. -+ (gfc_match_omp_do_simd): New function. -+ (gfc_match_omp_flush): Use *omp_namelist* instead of *namelist* -+ data structure and functions/macros. -+ (gfc_match_omp_simd, gfc_match_omp_declare_simd, -+ gfc_match_omp_parallel_do_simd): New functions. -+ (gfc_match_omp_atomic): Handle seq_cst clause. Handle atomic swap. -+ (gfc_match_omp_taskgroup, gfc_match_omp_cancel_kind, -+ gfc_match_omp_cancel, gfc_match_omp_cancellation_point): New -+ functions. -+ (resolve_omp_clauses): Add where, omp_clauses and ns arguments. -+ Use *omp_namelist* instead of *namelist* data structure and -+ functions/macros. Resolve uniform, aligned, linear, depend, -+ safelen and simdlen clauses. -+ (resolve_omp_atomic): Adjust for GFC_OMP_ATOMIC_{MASK,SEQ_CST,SWAP} -+ addition, recognize atomic swap. -+ (gfc_resolve_omp_parallel_blocks): Use gfc_omp_namelist instead -+ of gfc_namelist. Handle EXEC_OMP_PARALLEL_DO_SIMD the same as -+ EXEC_OMP_PARALLEL_DO. -+ (gfc_resolve_do_iterator): Use *omp_namelist* instead of *namelist* -+ data structure and functions/macros. -+ (resolve_omp_do): Likewise. Handle EXEC_OMP_SIMD, EXEC_OMP_DO_SIMD, -+ EXEC_OMP_PARALLEL_DO_SIMD. -+ (gfc_resolve_omp_directive): Handle EXEC_OMP_SIMD, EXEC_OMP_DO_SIMD, -+ EXEC_OMP_PARALLEL_DO_SIMD and EXEC_OMP_CANCEL. Adjust -+ resolve_omp_clauses caller. -+ (gfc_resolve_omp_declare_simd): New function. -+ * parse.c (decode_omp_directive): Parse cancellation point, cancel, -+ declare simd, end do simd, end simd, end parallel do simd, -+ end taskgroup, parallel do simd, simd and taskgroup directives. -+ (case_executable): Add ST_OMP_CANCEL and ST_OMP_CANCELLATION_POINT. -+ (case_exec_markers): Add ST_OMP_TASKGROUP, case ST_OMP_SIMD, -+ ST_OMP_DO_SIMD and ST_OMP_PARALLEL_DO_SIMD. -+ (case_decl): Add ST_OMP_DECLARE_SIMD. -+ (gfc_ascii_statement): Handle ST_OMP_CANCEL, -+ ST_OMP_CANCELLATION_POINT, ST_OMP_TASKGROUP, ST_OMP_END_TASKGROUP, -+ ST_OMP_SIMD, ST_OMP_END_SIMD, ST_OMP_DO_SIMD, ST_OMP_END_DO_SIMD, -+ ST_OMP_PARALLEL_DO_SIMD, ST_OMP_END_PARALLEL_DO_SIMD and -+ ST_OMP_DECLARE_SIMD. -+ (parse_omp_do): Handle ST_OMP_SIMD, ST_OMP_DO_SIMD and -+ ST_OMP_PARALLEL_DO_SIMD. -+ (parse_omp_atomic): Adjust for GFC_OMP_ATOMIC_* additions. -+ (parse_omp_structured_block): Handle ST_OMP_TASKGROUP and -+ ST_OMP_PARALLEL_DO_SIMD. -+ (parse_executable): Handle ST_OMP_SIMD, ST_OMP_DO_SIMD, -+ ST_OMP_PARALLEL_DO_SIMD and ST_OMP_TASKGROUP. -+ * trans-decl.c (gfc_get_extern_function_decl, -+ gfc_create_function_decl): Call gfc_trans_omp_declare_simd if -+ needed. -+ * frontend-passes.c (gfc_code_walker): Handle EXEC_OMP_SIMD, -+ EXEC_OMP_DO_SIMD and EXEC_OMP_PARALLEL_DO_SIMD. Walk -+ safelen_expr and simdlen_expr. Walk expressions in gfc_omp_namelist -+ of depend, aligned and linear clauses. -+ * match.c (match_exit_cycle): Handle EXEC_OMP_SIMD, EXEC_OMP_DO_SIMD -+ and EXEC_OMP_PARALLEL_DO_SIMD. -+ (gfc_free_omp_namelist): New function. -+ * dump-parse-tree.c (show_namelist): Removed. -+ (show_omp_namelist): New function. -+ (show_omp_node): Handle OpenMP 4.0 additions. -+ (show_code_node): Handle EXEC_OMP_CANCEL, EXEC_OMP_CANCELLATION_POINT, -+ EXEC_OMP_DO_SIMD, EXEC_OMP_PARALLEL_DO_SIMD, EXEC_OMP_SIMD and -+ EXEC_OMP_TASKGROUP. -+ * match.h (gfc_match_omp_cancel, gfc_match_omp_cancellation_point, -+ gfc_match_omp_declare_simd, gfc_match_omp_do_simd, -+ gfc_match_omp_parallel_do_simd, gfc_match_omp_simd, -+ gfc_match_omp_taskgroup): New prototypes. -+ * trans-openmp.c (gfc_trans_omp_variable): Add declare_simd -+ argument, handle it. Allow current_function_decl to be NULL. -+ (gfc_trans_omp_variable_list): Add declare_simd argument, pass -+ it through to gfc_trans_omp_variable and disregard whether -+ sym is referenced if declare_simd is true. Work on gfc_omp_namelist -+ instead of gfc_namelist. -+ (gfc_trans_omp_reduction_list): Work on gfc_omp_namelist instead of -+ gfc_namelist. Adjust gfc_trans_omp_variable caller. -+ (gfc_trans_omp_clauses): Add declare_simd argument, pass it through -+ to gfc_trans_omp_variable{,_list} callers. Work on gfc_omp_namelist -+ instead of gfc_namelist. Handle inbranch, notinbranch, safelen, -+ simdlen, depend, uniform, linear, proc_bind and aligned clauses. -+ Handle cancel kind. -+ (gfc_trans_omp_atomic): Handle seq_cst clause, handle atomic swap, -+ adjust for GFC_OMP_ATOMIC_* changes. -+ (gfc_trans_omp_cancel, gfc_trans_omp_cancellation_point): New -+ functions. -+ (gfc_trans_omp_do): Add op argument, handle simd translation into -+ generic. -+ (GFC_OMP_SPLIT_SIMD, GFC_OMP_SPLIT_DO, GFC_OMP_SPLIT_PARALLEL, -+ GFC_OMP_SPLIT_NUM, GFC_OMP_MASK_SIMD, GFC_OMP_MASK_DO, -+ GFC_OMP_MASK_PARALLEL): New. -+ (gfc_split_omp_clauses, gfc_trans_omp_do_simd): New functions. -+ (gfc_trans_omp_parallel_do): Rework to use gfc_split_omp_clauses. -+ (gfc_trans_omp_parallel_do_simd, gfc_trans_omp_taskgroup): New -+ functions. -+ (gfc_trans_omp_directive): Handle EXEC_OMP_CANCEL, -+ EXEC_OMP_CANCELLATION_POINT, EXEC_OMP_DO_SIMD, -+ EXEC_OMP_PARALLEL_DO_SIMD, EXEC_OMP_SIMD and EXEC_OMP_TASKGROUP. -+ Adjust gfc_trans_omp_do caller. -+ (gfc_trans_omp_declare_simd): New function. -+ * st.c (gfc_free_statement): Handle EXEC_OMP_CANCEL, -+ EXEC_OMP_CANCELLATION_POINT, EXEC_OMP_DO_SIMD, -+ EXEC_OMP_PARALLEL_DO_SIMD, EXEC_OMP_SIMD and EXEC_OMP_TASKGROUP. -+ For EXEC_OMP_FLUSH call gfc_free_omp_namelist instead of -+ gfc_free_namelist. -+ * module.c (omp_declare_simd_clauses): New variable. -+ (mio_omp_declare_simd): New function. -+ (mio_symbol): Call it. -+ * trans.c (trans_code): Handle EXEC_OMP_CANCEL, -+ EXEC_OMP_CANCELLATION_POINT, EXEC_OMP_DO_SIMD, -+ EXEC_OMP_PARALLEL_DO_SIMD, EXEC_OMP_SIMD and EXEC_OMP_TASKGROUP. -+ * resolve.c (gfc_resolve_blocks): Handle EXEC_OMP_DO_SIMD, -+ EXEC_OMP_PARALLEL_DO_SIMD, EXEC_OMP_SIMD and EXEC_OMP_TASKGROUP. -+ (resolve_code): Handle EXEC_OMP_CANCEL, -+ EXEC_OMP_CANCELLATION_POINT, EXEC_OMP_DO_SIMD, -+ EXEC_OMP_PARALLEL_DO_SIMD, EXEC_OMP_SIMD and EXEC_OMP_TASKGROUP. -+ (resolve_types): Call gfc_resolve_omp_declare_simd. -+ -+2014-06-15 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> -+ -+ Backport from trunk. -+ PR fortran/45187 -+ * trans-decl.c (gfc_create_module_variable): Don't create -+ Cray-pointee decls twice. -+ -+2014-06-09 Paul Thomas <pault@gcc.gnu.org> -+ -+ Backport from trunk. -+ PR fortran/61406 -+ * trans-stmt.c (trans_associate_var): Check that array -+ constructors are constant for direct reference. -+ -+2014-06-05 Richard Biener <rguenther@suse.de> -+ -+ PR fortran/61418 -+ * gfortranspec.c (spec_file): Remove. -+ (find_spec_file): Likewise. -+ (lang_specific_driver): Do not look for specs file in -L -+ or append -specs command line argument. -+ (lang_specific_pre_link): Always %:include libgfortran.spec. -+ -+2014-05-29 Thomas Koenig <tkoenig@gcc.gnu.org> -+ -+ PR fortran/60834 -+ Backport from mainline -+ * frontend-passes.c (in_assoc_list): New variable. -+ (optimize_namespace): Initialize in_assoc_list -+ (combine_array_constructor): Don't try to combine -+ assoc lists. -+ (gfc_code_walker): Keep track of in_assoc_list. -+ -+2014-05-26 Janne Blomqvist <jb@gcc.gnu.org> -+ -+ Backport from mainline -+ PR libfortran/61310 -+ * intrinsics.texi (CTIME): Remove mention of locale-dependent -+ behavior. -+ -+2014-04-22 Tobias Burnus <burnus@net-b.de> -+ -+ Backport from mainline -+ 2014-04-11 Tobias Burnus <burnus@net-b.de> -+ -+ PR fortran/58880 -+ PR fortran/60495 -+ * resolve.c (gfc_resolve_finalizers): Ensure that vtables -+ and finalization wrappers are generated. -+ - 2014-04-22 Release Manager - - * GCC 4.9.0 released. -Index: gcc/fortran/trans-stmt.c -=================================================================== ---- a/src/gcc/fortran/trans-stmt.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/trans-stmt.c (.../branches/gcc-4_9-branch) -@@ -1164,13 +1164,16 @@ - { - gfc_se se; - tree desc; -+ bool cst_array_ctor; - - desc = sym->backend_decl; -+ cst_array_ctor = e->expr_type == EXPR_ARRAY -+ && gfc_constant_array_constructor_p (e->value.constructor); - - /* If association is to an expression, evaluate it and create temporary. - Otherwise, get descriptor of target for pointer assignment. */ - gfc_init_se (&se, NULL); -- if (sym->assoc->variable || e->expr_type == EXPR_ARRAY) -+ if (sym->assoc->variable || cst_array_ctor) - { - se.direct_byref = 1; - se.use_offset = 1; -@@ -1181,7 +1184,7 @@ - - /* If we didn't already do the pointer assignment, set associate-name - descriptor to the one generated for the temporary. */ -- if (!sym->assoc->variable && e->expr_type != EXPR_ARRAY) -+ if (!sym->assoc->variable && !cst_array_ctor) - { - int dim; - -Index: gcc/fortran/trans-stmt.h -=================================================================== ---- a/src/gcc/fortran/trans-stmt.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/trans-stmt.h (.../branches/gcc-4_9-branch) -@@ -63,6 +63,7 @@ - - /* trans-openmp.c */ - tree gfc_trans_omp_directive (gfc_code *); -+void gfc_trans_omp_declare_simd (gfc_namespace *); - - /* trans-io.c */ - tree gfc_trans_open (gfc_code *); -Index: gcc/fortran/module.c -=================================================================== ---- a/src/gcc/fortran/module.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/module.c (.../branches/gcc-4_9-branch) -@@ -83,6 +83,7 @@ - /* Don't put any single quote (') in MOD_VERSION, if you want it to be - recognized. */ - #define MOD_VERSION "12" -+#define MOD_VERSION_OMP4 "12 OpenMP 4" - - - /* Structure that describes a position within a module file. */ -@@ -196,6 +197,7 @@ - static long module_pos; - static int module_line, module_column, only_flag; - static int prev_module_line, prev_module_column; -+static bool module_omp4; - - static enum - { IO_INPUT, IO_OUTPUT } -@@ -1877,7 +1879,7 @@ - AB_IS_BIND_C, AB_IS_C_INTEROP, AB_IS_ISO_C, AB_ABSTRACT, AB_ZERO_COMP, - AB_IS_CLASS, AB_PROCEDURE, AB_PROC_POINTER, AB_ASYNCHRONOUS, AB_CODIMENSION, - AB_COARRAY_COMP, AB_VTYPE, AB_VTAB, AB_CONTIGUOUS, AB_CLASS_POINTER, -- AB_IMPLICIT_PURE, AB_ARTIFICIAL, AB_UNLIMITED_POLY -+ AB_IMPLICIT_PURE, AB_ARTIFICIAL, AB_UNLIMITED_POLY, AB_OMP_DECLARE_TARGET - } - ab_attribute; - -@@ -1932,6 +1934,7 @@ - minit ("CLASS_POINTER", AB_CLASS_POINTER), - minit ("IMPLICIT_PURE", AB_IMPLICIT_PURE), - minit ("UNLIMITED_POLY", AB_UNLIMITED_POLY), -+ minit ("OMP_DECLARE_TARGET", AB_OMP_DECLARE_TARGET), - minit (NULL, -1) - }; - -@@ -2110,6 +2113,8 @@ - MIO_NAME (ab_attribute) (AB_VTYPE, attr_bits); - if (attr->vtab) - MIO_NAME (ab_attribute) (AB_VTAB, attr_bits); -+ if (attr->omp_declare_target) -+ MIO_NAME (ab_attribute) (AB_OMP_DECLARE_TARGET, attr_bits); - - mio_rparen (); - -@@ -2273,6 +2278,9 @@ - case AB_VTAB: - attr->vtab = 1; - break; -+ case AB_OMP_DECLARE_TARGET: -+ attr->omp_declare_target = 1; -+ break; - } - } - } -@@ -3130,6 +3138,7 @@ - minit ("LE", INTRINSIC_LE_OS), - minit ("NOT", INTRINSIC_NOT), - minit ("PARENTHESES", INTRINSIC_PARENTHESES), -+ minit ("USER", INTRINSIC_USER), - minit (NULL, -1) - }; - -@@ -3166,7 +3175,8 @@ - && !e->symtree->n.sym->attr.dummy) - e->symtree = ns_st; - } -- else if (e->expr_type == EXPR_FUNCTION && e->value.function.name) -+ else if (e->expr_type == EXPR_FUNCTION -+ && (e->value.function.name || e->value.function.isym)) - { - gfc_symbol *sym; - -@@ -3281,6 +3291,32 @@ - mio_expr (&e->value.op.op2); - break; - -+ case INTRINSIC_USER: -+ /* INTRINSIC_USER should not appear in resolved expressions, -+ though for UDRs we need to stream unresolved ones. */ -+ if (iomode == IO_OUTPUT) -+ write_atom (ATOM_STRING, e->value.op.uop->name); -+ else -+ { -+ char *name = read_string (); -+ const char *uop_name = find_use_name (name, true); -+ if (uop_name == NULL) -+ { -+ size_t len = strlen (name); -+ char *name2 = XCNEWVEC (char, len + 2); -+ memcpy (name2, name, len); -+ name2[len] = ' '; -+ name2[len + 1] = '\0'; -+ free (name); -+ uop_name = name = name2; -+ } -+ e->value.op.uop = gfc_get_uop (uop_name); -+ free (name); -+ } -+ mio_expr (&e->value.op.op1); -+ mio_expr (&e->value.op.op2); -+ break; -+ - default: - bad_module ("Bad operator"); - } -@@ -3299,6 +3335,8 @@ - flag = 1; - else if (e->ref) - flag = 2; -+ else if (e->value.function.isym == NULL) -+ flag = 3; - else - flag = 0; - mio_integer (&flag); -@@ -3310,6 +3348,8 @@ - case 2: - mio_ref_list (&e->ref); - break; -+ case 3: -+ break; - default: - write_atom (ATOM_STRING, e->value.function.isym->name); - } -@@ -3317,7 +3357,10 @@ - else - { - require_atom (ATOM_STRING); -- e->value.function.name = gfc_get_string (atom_string); -+ if (atom_string[0] == '\0') -+ e->value.function.name = NULL; -+ else -+ e->value.function.name = gfc_get_string (atom_string); - free (atom_string); - - mio_integer (&flag); -@@ -3329,6 +3372,8 @@ - case 2: - mio_ref_list (&e->ref); - break; -+ case 3: -+ break; - default: - require_atom (ATOM_STRING); - e->value.function.isym = gfc_find_function (atom_string); -@@ -3790,7 +3835,204 @@ - mio_rparen (); - } - -+static const mstring omp_declare_simd_clauses[] = -+{ -+ minit ("INBRANCH", 0), -+ minit ("NOTINBRANCH", 1), -+ minit ("SIMDLEN", 2), -+ minit ("UNIFORM", 3), -+ minit ("LINEAR", 4), -+ minit ("ALIGNED", 5), -+ minit (NULL, -1) -+}; - -+/* Handle !$omp declare simd. */ -+ -+static void -+mio_omp_declare_simd (gfc_namespace *ns, gfc_omp_declare_simd **odsp) -+{ -+ if (iomode == IO_OUTPUT) -+ { -+ if (*odsp == NULL) -+ return; -+ } -+ else if (peek_atom () != ATOM_LPAREN) -+ return; -+ -+ gfc_omp_declare_simd *ods = *odsp; -+ -+ mio_lparen (); -+ if (iomode == IO_OUTPUT) -+ { -+ write_atom (ATOM_NAME, "OMP_DECLARE_SIMD"); -+ if (ods->clauses) -+ { -+ gfc_omp_namelist *n; -+ -+ if (ods->clauses->inbranch) -+ mio_name (0, omp_declare_simd_clauses); -+ if (ods->clauses->notinbranch) -+ mio_name (1, omp_declare_simd_clauses); -+ if (ods->clauses->simdlen_expr) -+ { -+ mio_name (2, omp_declare_simd_clauses); -+ mio_expr (&ods->clauses->simdlen_expr); -+ } -+ for (n = ods->clauses->lists[OMP_LIST_UNIFORM]; n; n = n->next) -+ { -+ mio_name (3, omp_declare_simd_clauses); -+ mio_symbol_ref (&n->sym); -+ } -+ for (n = ods->clauses->lists[OMP_LIST_LINEAR]; n; n = n->next) -+ { -+ mio_name (4, omp_declare_simd_clauses); -+ mio_symbol_ref (&n->sym); -+ mio_expr (&n->expr); -+ } -+ for (n = ods->clauses->lists[OMP_LIST_ALIGNED]; n; n = n->next) -+ { -+ mio_name (5, omp_declare_simd_clauses); -+ mio_symbol_ref (&n->sym); -+ mio_expr (&n->expr); -+ } -+ } -+ } -+ else -+ { -+ gfc_omp_namelist **ptrs[3] = { NULL, NULL, NULL }; -+ -+ require_atom (ATOM_NAME); -+ *odsp = ods = gfc_get_omp_declare_simd (); -+ ods->where = gfc_current_locus; -+ ods->proc_name = ns->proc_name; -+ if (peek_atom () == ATOM_NAME) -+ { -+ ods->clauses = gfc_get_omp_clauses (); -+ ptrs[0] = &ods->clauses->lists[OMP_LIST_UNIFORM]; -+ ptrs[1] = &ods->clauses->lists[OMP_LIST_LINEAR]; -+ ptrs[2] = &ods->clauses->lists[OMP_LIST_ALIGNED]; -+ } -+ while (peek_atom () == ATOM_NAME) -+ { -+ gfc_omp_namelist *n; -+ int t = mio_name (0, omp_declare_simd_clauses); -+ -+ switch (t) -+ { -+ case 0: ods->clauses->inbranch = true; break; -+ case 1: ods->clauses->notinbranch = true; break; -+ case 2: mio_expr (&ods->clauses->simdlen_expr); break; -+ case 3: -+ case 4: -+ case 5: -+ *ptrs[t - 3] = n = gfc_get_omp_namelist (); -+ ptrs[t - 3] = &n->next; -+ mio_symbol_ref (&n->sym); -+ if (t != 3) -+ mio_expr (&n->expr); -+ break; -+ } -+ } -+ } -+ -+ mio_omp_declare_simd (ns, &ods->next); -+ -+ mio_rparen (); -+} -+ -+ -+static const mstring omp_declare_reduction_stmt[] = -+{ -+ minit ("ASSIGN", 0), -+ minit ("CALL", 1), -+ minit (NULL, -1) -+}; -+ -+ -+static void -+mio_omp_udr_expr (gfc_omp_udr *udr, gfc_symbol **sym1, gfc_symbol **sym2, -+ gfc_namespace *ns, bool is_initializer) -+{ -+ if (iomode == IO_OUTPUT) -+ { -+ if ((*sym1)->module == NULL) -+ { -+ (*sym1)->module = module_name; -+ (*sym2)->module = module_name; -+ } -+ mio_symbol_ref (sym1); -+ mio_symbol_ref (sym2); -+ if (ns->code->op == EXEC_ASSIGN) -+ { -+ mio_name (0, omp_declare_reduction_stmt); -+ mio_expr (&ns->code->expr1); -+ mio_expr (&ns->code->expr2); -+ } -+ else -+ { -+ int flag; -+ mio_name (1, omp_declare_reduction_stmt); -+ mio_symtree_ref (&ns->code->symtree); -+ mio_actual_arglist (&ns->code->ext.actual); -+ -+ flag = ns->code->resolved_isym != NULL; -+ mio_integer (&flag); -+ if (flag) -+ write_atom (ATOM_STRING, ns->code->resolved_isym->name); -+ else -+ mio_symbol_ref (&ns->code->resolved_sym); -+ } -+ } -+ else -+ { -+ pointer_info *p1 = mio_symbol_ref (sym1); -+ pointer_info *p2 = mio_symbol_ref (sym2); -+ gfc_symbol *sym; -+ gcc_assert (p1->u.rsym.ns == p2->u.rsym.ns); -+ gcc_assert (p1->u.rsym.sym == NULL); -+ /* Add hidden symbols to the symtree. */ -+ pointer_info *q = get_integer (p1->u.rsym.ns); -+ q->u.pointer = (void *) ns; -+ sym = gfc_new_symbol (is_initializer ? "omp_priv" : "omp_out", ns); -+ sym->ts = udr->ts; -+ sym->module = gfc_get_string (p1->u.rsym.module); -+ associate_integer_pointer (p1, sym); -+ sym->attr.omp_udr_artificial_var = 1; -+ gcc_assert (p2->u.rsym.sym == NULL); -+ sym = gfc_new_symbol (is_initializer ? "omp_orig" : "omp_in", ns); -+ sym->ts = udr->ts; -+ sym->module = gfc_get_string (p2->u.rsym.module); -+ associate_integer_pointer (p2, sym); -+ sym->attr.omp_udr_artificial_var = 1; -+ if (mio_name (0, omp_declare_reduction_stmt) == 0) -+ { -+ ns->code = gfc_get_code (EXEC_ASSIGN); -+ mio_expr (&ns->code->expr1); -+ mio_expr (&ns->code->expr2); -+ } -+ else -+ { -+ int flag; -+ ns->code = gfc_get_code (EXEC_CALL); -+ mio_symtree_ref (&ns->code->symtree); -+ mio_actual_arglist (&ns->code->ext.actual); -+ -+ mio_integer (&flag); -+ if (flag) -+ { -+ require_atom (ATOM_STRING); -+ ns->code->resolved_isym = gfc_find_subroutine (atom_string); -+ free (atom_string); -+ } -+ else -+ mio_symbol_ref (&ns->code->resolved_sym); -+ } -+ ns->code->loc = gfc_current_locus; -+ ns->omp_udr_ns = 1; -+ } -+} -+ -+ - /* Unlike most other routines, the address of the symbol node is already - fixed on input and the name/module has already been filled in. - If you update the symbol format here, don't forget to update read_module -@@ -3864,6 +4106,17 @@ - if (sym->attr.flavor == FL_DERIVED) - mio_integer (&(sym->hash_value)); - -+ if (sym->formal_ns -+ && sym->formal_ns->proc_name == sym -+ && sym->formal_ns->entries == NULL) -+ { -+ if (module_omp4) -+ mio_omp_declare_simd (sym->formal_ns, -+ &sym->formal_ns->omp_declare_simd); -+ else if (iomode == IO_OUTPUT) -+ gcc_assert (sym->formal_ns->omp_declare_simd == NULL); -+ } -+ - mio_rparen (); - } - -@@ -4343,6 +4596,119 @@ - } - - -+/* This function loads OpenMP user defined reductions. */ -+static void -+load_omp_udrs (void) -+{ -+ mio_lparen (); -+ while (peek_atom () != ATOM_RPAREN) -+ { -+ const char *name, *newname; -+ char *altname; -+ gfc_typespec ts; -+ gfc_symtree *st; -+ gfc_omp_reduction_op rop = OMP_REDUCTION_USER; -+ -+ mio_lparen (); -+ mio_pool_string (&name); -+ mio_typespec (&ts); -+ if (strncmp (name, "operator ", sizeof ("operator ") - 1) == 0) -+ { -+ const char *p = name + sizeof ("operator ") - 1; -+ if (strcmp (p, "+") == 0) -+ rop = OMP_REDUCTION_PLUS; -+ else if (strcmp (p, "*") == 0) -+ rop = OMP_REDUCTION_TIMES; -+ else if (strcmp (p, "-") == 0) -+ rop = OMP_REDUCTION_MINUS; -+ else if (strcmp (p, ".and.") == 0) -+ rop = OMP_REDUCTION_AND; -+ else if (strcmp (p, ".or.") == 0) -+ rop = OMP_REDUCTION_OR; -+ else if (strcmp (p, ".eqv.") == 0) -+ rop = OMP_REDUCTION_EQV; -+ else if (strcmp (p, ".neqv.") == 0) -+ rop = OMP_REDUCTION_NEQV; -+ } -+ altname = NULL; -+ if (rop == OMP_REDUCTION_USER && name[0] == '.') -+ { -+ size_t len = strlen (name + 1); -+ altname = XALLOCAVEC (char, len); -+ gcc_assert (name[len] == '.'); -+ memcpy (altname, name + 1, len - 1); -+ altname[len - 1] = '\0'; -+ } -+ newname = name; -+ if (rop == OMP_REDUCTION_USER) -+ newname = find_use_name (altname ? altname : name, !!altname); -+ else if (only_flag && find_use_operator ((gfc_intrinsic_op) rop) == NULL) -+ newname = NULL; -+ if (newname == NULL) -+ { -+ skip_list (1); -+ continue; -+ } -+ if (altname && newname != altname) -+ { -+ size_t len = strlen (newname); -+ altname = XALLOCAVEC (char, len + 3); -+ altname[0] = '.'; -+ memcpy (altname + 1, newname, len); -+ altname[len + 1] = '.'; -+ altname[len + 2] = '\0'; -+ name = gfc_get_string (altname); -+ } -+ st = gfc_find_symtree (gfc_current_ns->omp_udr_root, name); -+ gfc_omp_udr *udr = gfc_omp_udr_find (st, &ts); -+ if (udr) -+ { -+ require_atom (ATOM_INTEGER); -+ pointer_info *p = get_integer (atom_int); -+ if (strcmp (p->u.rsym.module, udr->omp_out->module)) -+ { -+ gfc_error ("Ambiguous !$OMP DECLARE REDUCTION from " -+ "module %s at %L", -+ p->u.rsym.module, &gfc_current_locus); -+ gfc_error ("Previous !$OMP DECLARE REDUCTION from module " -+ "%s at %L", -+ udr->omp_out->module, &udr->where); -+ } -+ skip_list (1); -+ continue; -+ } -+ udr = gfc_get_omp_udr (); -+ udr->name = name; -+ udr->rop = rop; -+ udr->ts = ts; -+ udr->where = gfc_current_locus; -+ udr->combiner_ns = gfc_get_namespace (gfc_current_ns, 1); -+ udr->combiner_ns->proc_name = gfc_current_ns->proc_name; -+ mio_omp_udr_expr (udr, &udr->omp_out, &udr->omp_in, udr->combiner_ns, -+ false); -+ if (peek_atom () != ATOM_RPAREN) -+ { -+ udr->initializer_ns = gfc_get_namespace (gfc_current_ns, 1); -+ udr->initializer_ns->proc_name = gfc_current_ns->proc_name; -+ mio_omp_udr_expr (udr, &udr->omp_priv, &udr->omp_orig, -+ udr->initializer_ns, true); -+ } -+ if (st) -+ { -+ udr->next = st->n.omp_udr; -+ st->n.omp_udr = udr; -+ } -+ else -+ { -+ st = gfc_new_symtree (&gfc_current_ns->omp_udr_root, name); -+ st->n.omp_udr = udr; -+ } -+ mio_rparen (); -+ } -+ mio_rparen (); -+} -+ -+ - /* Recursive function to traverse the pointer_info tree and load a - needed symbol. We return nonzero if we load a symbol and stop the - traversal, because the act of loading can alter the tree. */ -@@ -4530,7 +4896,7 @@ - static void - read_module (void) - { -- module_locus operator_interfaces, user_operators, extensions; -+ module_locus operator_interfaces, user_operators, extensions, omp_udrs; - const char *p; - char name[GFC_MAX_SYMBOL_LEN + 1]; - int i; -@@ -4554,6 +4920,11 @@ - get_module_locus (&extensions); - skip_list (); - -+ /* Skip OpenMP UDRs. */ -+ get_module_locus (&omp_udrs); -+ if (module_omp4) -+ skip_list (); -+ - mio_lparen (); - - /* Create the fixup nodes for all the symbols. */ -@@ -4819,6 +5190,13 @@ - load_commons (); - load_equiv (); - -+ if (module_omp4) -+ { -+ /* Load OpenMP user defined reductions. */ -+ set_module_locus (&omp_udrs); -+ load_omp_udrs (); -+ } -+ - /* At this point, we read those symbols that are needed but haven't - been loaded yet. If one symbol requires another, the other gets - marked as NEEDED if its previous state was UNUSED. */ -@@ -5197,6 +5575,80 @@ - } - - -+static void -+write_omp_udr (gfc_omp_udr *udr) -+{ -+ switch (udr->rop) -+ { -+ case OMP_REDUCTION_USER: -+ /* Non-operators can't be used outside of the module. */ -+ if (udr->name[0] != '.') -+ return; -+ else -+ { -+ gfc_symtree *st; -+ size_t len = strlen (udr->name + 1); -+ char *name = XALLOCAVEC (char, len); -+ memcpy (name, udr->name, len - 1); -+ name[len - 1] = '\0'; -+ st = gfc_find_symtree (gfc_current_ns->uop_root, name); -+ /* If corresponding user operator is private, don't write -+ the UDR. */ -+ if (st != NULL) -+ { -+ gfc_user_op *uop = st->n.uop; -+ if (!check_access (uop->access, uop->ns->default_access)) -+ return; -+ } -+ } -+ break; -+ case OMP_REDUCTION_PLUS: -+ case OMP_REDUCTION_MINUS: -+ case OMP_REDUCTION_TIMES: -+ case OMP_REDUCTION_AND: -+ case OMP_REDUCTION_OR: -+ case OMP_REDUCTION_EQV: -+ case OMP_REDUCTION_NEQV: -+ /* If corresponding operator is private, don't write the UDR. */ -+ if (!check_access (gfc_current_ns->operator_access[udr->rop], -+ gfc_current_ns->default_access)) -+ return; -+ break; -+ default: -+ break; -+ } -+ if (udr->ts.type == BT_DERIVED || udr->ts.type == BT_CLASS) -+ { -+ /* If derived type is private, don't write the UDR. */ -+ if (!gfc_check_symbol_access (udr->ts.u.derived)) -+ return; -+ } -+ -+ mio_lparen (); -+ mio_pool_string (&udr->name); -+ mio_typespec (&udr->ts); -+ mio_omp_udr_expr (udr, &udr->omp_out, &udr->omp_in, udr->combiner_ns, false); -+ if (udr->initializer_ns) -+ mio_omp_udr_expr (udr, &udr->omp_priv, &udr->omp_orig, -+ udr->initializer_ns, true); -+ mio_rparen (); -+} -+ -+ -+static void -+write_omp_udrs (gfc_symtree *st) -+{ -+ if (st == NULL) -+ return; -+ -+ write_omp_udrs (st->left); -+ gfc_omp_udr *udr; -+ for (udr = st->n.omp_udr; udr; udr = udr->next) -+ write_omp_udr (udr); -+ write_omp_udrs (st->right); -+} -+ -+ - /* Type for the temporary tree used when writing secondary symbols. */ - - struct sorted_pointer_info -@@ -5445,6 +5897,17 @@ - write_char ('\n'); - write_char ('\n'); - -+ if (module_omp4) -+ { -+ mio_lparen (); -+ write_omp_udrs (gfc_current_ns->omp_udr_root); -+ mio_rparen (); -+ write_char ('\n'); -+ write_char ('\n'); -+ } -+ else -+ gcc_assert (gfc_current_ns->omp_udr_root == NULL); -+ - /* Write symbol information. First we traverse all symbols in the - primary namespace, writing those that need to be written. - Sometimes writing one symbol will cause another to need to be -@@ -5513,6 +5976,21 @@ - } - - -+/* Set module_omp4 if any symbol has !$OMP DECLARE SIMD directives. */ -+ -+static void -+find_omp_declare_simd (gfc_symtree *st) -+{ -+ gfc_symbol *sym = st->n.sym; -+ if (sym->formal_ns -+ && sym->formal_ns->proc_name == sym -+ && sym->formal_ns->omp_declare_simd) -+ module_omp4 = true; -+ else if (sym->attr.omp_declare_target) -+ module_omp4 = true; -+} -+ -+ - /* Given module, dump it to disk. If there was an error while - processing the module, dump_flag will be set to zero and we delete - the module file, even if it was already there. */ -@@ -5555,6 +6033,12 @@ - if (gfc_cpp_makedep ()) - gfc_cpp_add_target (filename); - -+ module_omp4 = false; -+ if (gfc_current_ns->omp_udr_root) -+ module_omp4 = true; -+ else -+ gfc_traverse_symtree (gfc_current_ns->sym_root, find_omp_declare_simd); -+ - /* Write the module to the temporary file. */ - module_fp = gzopen (filename_tmp, "w"); - if (module_fp == NULL) -@@ -5562,7 +6046,7 @@ - filename_tmp, xstrerror (errno)); - - gzprintf (module_fp, "GFORTRAN module version '%s' created from %s\n", -- MOD_VERSION, gfc_source_file); -+ module_omp4 ? MOD_VERSION_OMP4 : MOD_VERSION, gfc_source_file); - - /* Write the module itself. */ - iomode = IO_OUTPUT; -@@ -6353,6 +6837,8 @@ - read_module_to_tmpbuf (); - gzclose (module_fp); - -+ module_omp4 = false; -+ - /* Skip the first line of the module, after checking that this is - a gfortran module file. */ - line = 0; -@@ -6372,11 +6858,15 @@ - if (strcmp (atom_name, " version") != 0 - || module_char () != ' ' - || parse_atom () != ATOM_STRING -- || strcmp (atom_string, MOD_VERSION)) -+ || (strcmp (atom_string, MOD_VERSION) -+ && strcmp (atom_string, MOD_VERSION_OMP4))) - gfc_fatal_error ("Cannot read module file '%s' opened at %C," - " because it was created by a different" - " version of GNU Fortran", filename); - -+ if (strcmp (atom_string, MOD_VERSION_OMP4) == 0) -+ module_omp4 = true; -+ - free (atom_string); - } - -Index: gcc/fortran/trans.c -=================================================================== ---- a/src/gcc/fortran/trans.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/trans.c (.../branches/gcc-4_9-branch) -@@ -1848,20 +1848,43 @@ - - case EXEC_OMP_ATOMIC: - case EXEC_OMP_BARRIER: -+ case EXEC_OMP_CANCEL: -+ case EXEC_OMP_CANCELLATION_POINT: - case EXEC_OMP_CRITICAL: -+ case EXEC_OMP_DISTRIBUTE: -+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO: -+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case EXEC_OMP_DISTRIBUTE_SIMD: - case EXEC_OMP_DO: -+ case EXEC_OMP_DO_SIMD: - case EXEC_OMP_FLUSH: - case EXEC_OMP_MASTER: - case EXEC_OMP_ORDERED: - case EXEC_OMP_PARALLEL: - case EXEC_OMP_PARALLEL_DO: -+ case EXEC_OMP_PARALLEL_DO_SIMD: - case EXEC_OMP_PARALLEL_SECTIONS: - case EXEC_OMP_PARALLEL_WORKSHARE: - case EXEC_OMP_SECTIONS: -+ case EXEC_OMP_SIMD: - case EXEC_OMP_SINGLE: -+ case EXEC_OMP_TARGET: -+ case EXEC_OMP_TARGET_DATA: -+ case EXEC_OMP_TARGET_TEAMS: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD: -+ case EXEC_OMP_TARGET_UPDATE: - case EXEC_OMP_TASK: -+ case EXEC_OMP_TASKGROUP: - case EXEC_OMP_TASKWAIT: - case EXEC_OMP_TASKYIELD: -+ case EXEC_OMP_TEAMS: -+ case EXEC_OMP_TEAMS_DISTRIBUTE: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD: - case EXEC_OMP_WORKSHARE: - res = gfc_trans_omp_directive (code); - break; -Index: gcc/fortran/trans-types.c -=================================================================== ---- a/src/gcc/fortran/trans-types.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/trans-types.c (.../branches/gcc-4_9-branch) -@@ -2162,9 +2162,6 @@ - restricted); - byref = 0; - } -- -- if (sym->attr.cray_pointee) -- GFC_POINTER_TYPE_P (type) = 1; - } - else - { -@@ -2183,8 +2180,6 @@ - if (sym->attr.allocatable || sym->attr.pointer - || gfc_is_associate_pointer (sym)) - type = gfc_build_pointer_type (sym, type); -- if (sym->attr.pointer || sym->attr.cray_pointee) -- GFC_POINTER_TYPE_P (type) = 1; - } - - /* We currently pass all parameters by reference. -@@ -2554,6 +2549,8 @@ - else if (derived->declared_at.lb) - gfc_set_decl_location (field, &derived->declared_at); - -+ gfc_finish_decl_attrs (field, &c->attr); -+ - DECL_PACKED (field) |= TYPE_PACKED (typenode); - - gcc_assert (field); -Index: gcc/fortran/scanner.c -=================================================================== ---- a/src/gcc/fortran/scanner.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/scanner.c (.../branches/gcc-4_9-branch) -@@ -752,7 +752,8 @@ - 2) handle OpenMP conditional compilation, where - !$ should be treated as 2 spaces (for initial lines - only if followed by space). */ -- if (gfc_option.gfc_flag_openmp && at_bol) -+ if ((gfc_option.gfc_flag_openmp -+ || gfc_option.gfc_flag_openmp_simd) && at_bol) - { - locus old_loc = gfc_current_locus; - if (next_char () == '$') -@@ -878,7 +879,7 @@ - && continue_line < gfc_linebuf_linenum (gfc_current_locus.lb)) - continue_line = gfc_linebuf_linenum (gfc_current_locus.lb); - -- if (gfc_option.gfc_flag_openmp) -+ if (gfc_option.gfc_flag_openmp || gfc_option.gfc_flag_openmp_simd) - { - if (next_char () == '$') - { -@@ -1821,7 +1822,7 @@ - - c = line; - -- if (gfc_option.gfc_flag_openmp) -+ if (gfc_option.gfc_flag_openmp || gfc_option.gfc_flag_openmp_simd) - { - if (gfc_current_form == FORM_FREE) - { -Index: gcc/fortran/trans.h -=================================================================== ---- a/src/gcc/fortran/trans.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/trans.h (.../branches/gcc-4_9-branch) -@@ -547,6 +547,9 @@ - /* Returns true if a variable of specified size should go on the stack. */ - int gfc_can_put_var_on_stack (tree); - -+/* Set GFC_DECL_SCALAR_* on decl from sym if needed. */ -+void gfc_finish_decl_attrs (tree, symbol_attribute *); -+ - /* Allocate the lang-specific part of a decl node. */ - void gfc_allocate_lang_decl (tree); - -@@ -666,7 +669,9 @@ - tree gfc_omp_clause_default_ctor (tree, tree, tree); - tree gfc_omp_clause_copy_ctor (tree, tree, tree); - tree gfc_omp_clause_assign_op (tree, tree, tree); -+tree gfc_omp_clause_linear_ctor (tree, tree, tree, tree); - tree gfc_omp_clause_dtor (tree, tree); -+void gfc_omp_finish_clause (tree, gimple_seq *); - bool gfc_omp_disregard_value_expr (tree, bool); - bool gfc_omp_private_debug_clause (tree, bool); - bool gfc_omp_private_outer_ref (tree); -@@ -824,6 +829,8 @@ - tree span; - /* For assumed-shape coarrays. */ - tree token, caf_offset; -+ unsigned int scalar_allocatable : 1; -+ unsigned int scalar_pointer : 1; - }; - - -@@ -834,6 +841,14 @@ - #define GFC_DECL_CAF_OFFSET(node) DECL_LANG_SPECIFIC(node)->caf_offset - #define GFC_DECL_SAVED_DESCRIPTOR(node) \ - (DECL_LANG_SPECIFIC(node)->saved_descriptor) -+#define GFC_DECL_SCALAR_ALLOCATABLE(node) \ -+ (DECL_LANG_SPECIFIC (node)->scalar_allocatable) -+#define GFC_DECL_SCALAR_POINTER(node) \ -+ (DECL_LANG_SPECIFIC (node)->scalar_pointer) -+#define GFC_DECL_GET_SCALAR_ALLOCATABLE(node) \ -+ (DECL_LANG_SPECIFIC (node) ? GFC_DECL_SCALAR_ALLOCATABLE (node) : 0) -+#define GFC_DECL_GET_SCALAR_POINTER(node) \ -+ (DECL_LANG_SPECIFIC (node) ? GFC_DECL_SCALAR_POINTER (node) : 0) - #define GFC_DECL_PACKED_ARRAY(node) DECL_LANG_FLAG_0(node) - #define GFC_DECL_PARTIAL_PACKED_ARRAY(node) DECL_LANG_FLAG_1(node) - #define GFC_DECL_ASSIGN(node) DECL_LANG_FLAG_2(node) -@@ -841,6 +856,7 @@ - #define GFC_DECL_CRAY_POINTEE(node) DECL_LANG_FLAG_4(node) - #define GFC_DECL_RESULT(node) DECL_LANG_FLAG_5(node) - #define GFC_DECL_SUBREF_ARRAY_P(node) DECL_LANG_FLAG_6(node) -+#define GFC_DECL_ASSOCIATE_VAR_P(node) DECL_LANG_FLAG_7(node) - #define GFC_DECL_CLASS(node) DECL_LANG_FLAG_8(node) - - /* An array descriptor. */ -@@ -847,8 +863,6 @@ - #define GFC_DESCRIPTOR_TYPE_P(node) TYPE_LANG_FLAG_1(node) - /* An array without a descriptor. */ - #define GFC_ARRAY_TYPE_P(node) TYPE_LANG_FLAG_2(node) --/* Fortran POINTER type. */ --#define GFC_POINTER_TYPE_P(node) TYPE_LANG_FLAG_3(node) - /* Fortran CLASS type. */ - #define GFC_CLASS_TYPE_P(node) TYPE_LANG_FLAG_4(node) - /* The GFC_TYPE_ARRAY_* members are present in both descriptor and -Index: gcc/fortran/gfortranspec.c -=================================================================== ---- a/src/gcc/fortran/gfortranspec.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/gfortranspec.c (.../branches/gcc-4_9-branch) -@@ -73,34 +73,11 @@ - static unsigned int g77_newargc; - static struct cl_decoded_option *g77_new_decoded_options; - --/* The path to the spec file. */ --static char *spec_file = NULL; -- - /* This will be NULL if we encounter a situation where we should not - link in the fortran libraries. */ - static const char *library = NULL; - - --/* Return full path name of spec file if it is in DIR, or NULL if -- not. */ --static char * --find_spec_file (const char *dir) --{ -- const char dirsep_string[] = { DIR_SEPARATOR, '\0' }; -- char *spec; -- struct stat sb; -- -- spec = XNEWVEC (char, strlen (dir) + sizeof (SPEC_FILE) + 4); -- strcpy (spec, dir); -- strcat (spec, dirsep_string); -- strcat (spec, SPEC_FILE); -- if (!stat (spec, &sb)) -- return spec; -- free (spec); -- return NULL; --} -- -- - /* Return whether strings S1 and S2 are both NULL or both the same - string. */ - -@@ -313,12 +290,6 @@ - cool facility for handling --help and --verbose --help. */ - return; - -- case OPT_L: -- if (!spec_file) -- spec_file = find_spec_file (decoded_options[i].arg); -- break; -- -- - default: - break; - } -@@ -449,12 +420,6 @@ - - #endif - -- /* Read the specs file corresponding to libgfortran. -- If we didn't find the spec file on the -L path, we load it -- via lang_specific_pre_link. */ -- if (spec_file) -- append_option (OPT_specs_, spec_file, 1); -- - if (verbose && g77_new_decoded_options != g77_x_decoded_options) - { - fprintf (stderr, _("Driving:")); -@@ -473,8 +438,7 @@ - int - lang_specific_pre_link (void) - { -- free (spec_file); -- if (spec_file == NULL && library) -+ if (library) - do_spec ("%:include(libgfortran.spec)"); - - return 0; -Index: gcc/fortran/frontend-passes.c -=================================================================== ---- a/src/gcc/fortran/frontend-passes.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/frontend-passes.c (.../branches/gcc-4_9-branch) -@@ -88,6 +88,10 @@ - - struct my_struct *evec; - -+/* Keep track of association lists. */ -+ -+static bool in_assoc_list; -+ - /* Entry point - run all passes for a namespace. */ - - void -@@ -672,10 +676,10 @@ - - /* Dummy function for code callback, for use when we really - don't want to do anything. */ --static int --dummy_code_callback (gfc_code **e ATTRIBUTE_UNUSED, -- int *walk_subtrees ATTRIBUTE_UNUSED, -- void *data ATTRIBUTE_UNUSED) -+int -+gfc_dummy_code_callback (gfc_code **e ATTRIBUTE_UNUSED, -+ int *walk_subtrees ATTRIBUTE_UNUSED, -+ void *data ATTRIBUTE_UNUSED) - { - return 0; - } -@@ -820,6 +824,7 @@ - current_ns = ns; - forall_level = 0; - iterator_level = 0; -+ in_assoc_list = false; - in_omp_workshare = false; - - gfc_code_walker (&ns->code, convert_do_while, dummy_expr_callback, NULL); -@@ -839,7 +844,8 @@ - optimize_reduction (gfc_namespace *ns) - { - current_ns = ns; -- gfc_code_walker (&ns->code, dummy_code_callback, callback_reduction, NULL); -+ gfc_code_walker (&ns->code, gfc_dummy_code_callback, -+ callback_reduction, NULL); - - /* BLOCKs are handled in the expression walker below. */ - for (ns = ns->contained; ns; ns = ns->sibling) -@@ -1054,6 +1060,11 @@ - if (e->rank != 1) - return false; - -+ /* Don't try to combine association lists, this makes no sense -+ and leads to an ICE. */ -+ if (in_assoc_list) -+ return false; -+ - op1 = e->value.op.op1; - op2 = e->value.op.op2; - -@@ -1940,8 +1951,17 @@ - - case EXEC_BLOCK: - WALK_SUBCODE (co->ext.block.ns->code); -- for (alist = co->ext.block.assoc; alist; alist = alist->next) -- WALK_SUBEXPR (alist->target); -+ if (co->ext.block.assoc) -+ { -+ bool saved_in_assoc_list = in_assoc_list; -+ -+ in_assoc_list = true; -+ for (alist = co->ext.block.assoc; alist; alist = alist->next) -+ WALK_SUBEXPR (alist->target); -+ -+ in_assoc_list = saved_in_assoc_list; -+ } -+ - break; - - case EXEC_DO: -@@ -2112,6 +2132,7 @@ - - case EXEC_OMP_PARALLEL: - case EXEC_OMP_PARALLEL_DO: -+ case EXEC_OMP_PARALLEL_DO_SIMD: - case EXEC_OMP_PARALLEL_SECTIONS: - - in_omp_workshare = false; -@@ -2126,12 +2147,31 @@ - in_omp_workshare = true; - - /* Fall through */ -- -+ -+ case EXEC_OMP_DISTRIBUTE: -+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO: -+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case EXEC_OMP_DISTRIBUTE_SIMD: - case EXEC_OMP_DO: -+ case EXEC_OMP_DO_SIMD: - case EXEC_OMP_SECTIONS: - case EXEC_OMP_SINGLE: - case EXEC_OMP_END_SINGLE: -+ case EXEC_OMP_SIMD: -+ case EXEC_OMP_TARGET: -+ case EXEC_OMP_TARGET_DATA: -+ case EXEC_OMP_TARGET_TEAMS: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD: -+ case EXEC_OMP_TARGET_UPDATE: - case EXEC_OMP_TASK: -+ case EXEC_OMP_TEAMS: -+ case EXEC_OMP_TEAMS_DISTRIBUTE: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD: - - /* Come to this label only from the - EXEC_OMP_PARALLEL_* cases above. */ -@@ -2140,10 +2180,27 @@ - - if (co->ext.omp_clauses) - { -+ gfc_omp_namelist *n; -+ static int list_types[] -+ = { OMP_LIST_ALIGNED, OMP_LIST_LINEAR, OMP_LIST_DEPEND, -+ OMP_LIST_MAP, OMP_LIST_TO, OMP_LIST_FROM }; -+ size_t idx; - WALK_SUBEXPR (co->ext.omp_clauses->if_expr); - WALK_SUBEXPR (co->ext.omp_clauses->final_expr); - WALK_SUBEXPR (co->ext.omp_clauses->num_threads); - WALK_SUBEXPR (co->ext.omp_clauses->chunk_size); -+ WALK_SUBEXPR (co->ext.omp_clauses->safelen_expr); -+ WALK_SUBEXPR (co->ext.omp_clauses->simdlen_expr); -+ WALK_SUBEXPR (co->ext.omp_clauses->num_teams); -+ WALK_SUBEXPR (co->ext.omp_clauses->device); -+ WALK_SUBEXPR (co->ext.omp_clauses->thread_limit); -+ WALK_SUBEXPR (co->ext.omp_clauses->dist_chunk_size); -+ for (idx = 0; -+ idx < sizeof (list_types) / sizeof (list_types[0]); -+ idx++) -+ for (n = co->ext.omp_clauses->lists[list_types[idx]]; -+ n; n = n->next) -+ WALK_SUBEXPR (n->expr); - } - break; - default: -Index: gcc/fortran/resolve.c -=================================================================== ---- a/src/gcc/fortran/resolve.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/resolve.c (.../branches/gcc-4_9-branch) -@@ -40,7 +40,7 @@ - seq_type; - - /* Stack to keep track of the nesting of blocks as we move through the -- code. See resolve_branch() and resolve_code(). */ -+ code. See resolve_branch() and gfc_resolve_code(). */ - - typedef struct code_stack - { -@@ -2887,7 +2887,8 @@ - - /* See if function is already resolved. */ - -- if (expr->value.function.name != NULL) -+ if (expr->value.function.name != NULL -+ || expr->value.function.isym != NULL) - { - if (expr->ts.type == BT_UNKNOWN) - expr->ts = sym->ts; -@@ -4884,7 +4885,7 @@ - if (check_assumed_size_reference (sym, e)) - return false; - -- /* Deal with forward references to entries during resolve_code, to -+ /* Deal with forward references to entries during gfc_resolve_code, to - satisfy, at least partially, 12.5.2.5. */ - if (gfc_current_ns->entries - && current_entry_id == sym->entry_id -@@ -8926,8 +8927,6 @@ - /* Resolve lists of blocks found in IF, SELECT CASE, WHERE, FORALL, GOTO and - DO code nodes. */ - --static void resolve_code (gfc_code *, gfc_namespace *); -- - void - gfc_resolve_blocks (gfc_code *b, gfc_namespace *ns) - { -@@ -8979,18 +8978,39 @@ - - case EXEC_OMP_ATOMIC: - case EXEC_OMP_CRITICAL: -+ case EXEC_OMP_DISTRIBUTE: -+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO: -+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case EXEC_OMP_DISTRIBUTE_SIMD: - case EXEC_OMP_DO: -+ case EXEC_OMP_DO_SIMD: - case EXEC_OMP_MASTER: - case EXEC_OMP_ORDERED: - case EXEC_OMP_PARALLEL: - case EXEC_OMP_PARALLEL_DO: -+ case EXEC_OMP_PARALLEL_DO_SIMD: - case EXEC_OMP_PARALLEL_SECTIONS: - case EXEC_OMP_PARALLEL_WORKSHARE: - case EXEC_OMP_SECTIONS: -+ case EXEC_OMP_SIMD: - case EXEC_OMP_SINGLE: -+ case EXEC_OMP_TARGET: -+ case EXEC_OMP_TARGET_DATA: -+ case EXEC_OMP_TARGET_TEAMS: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD: -+ case EXEC_OMP_TARGET_UPDATE: - case EXEC_OMP_TASK: -+ case EXEC_OMP_TASKGROUP: - case EXEC_OMP_TASKWAIT: - case EXEC_OMP_TASKYIELD: -+ case EXEC_OMP_TEAMS: -+ case EXEC_OMP_TEAMS_DISTRIBUTE: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD: - case EXEC_OMP_WORKSHARE: - break; - -@@ -8998,7 +9018,7 @@ - gfc_internal_error ("gfc_resolve_blocks(): Bad block type"); - } - -- resolve_code (b->next, ns); -+ gfc_resolve_code (b->next, ns); - } - } - -@@ -9411,7 +9431,7 @@ - The pointer assignments are taken care of by the intrinsic - assignment of the structure itself. This function recursively adds - defined assignments where required. The recursion is accomplished -- by calling resolve_code. -+ by calling gfc_resolve_code. - - When the lhs in a defined assignment has intent INOUT, we need a - temporary for the lhs. In pseudo-code: -@@ -9529,9 +9549,9 @@ - comp1, comp2, (*code)->loc); - - /* Convert the assignment if there is a defined assignment for -- this type. Otherwise, using the call from resolve_code, -+ this type. Otherwise, using the call from gfc_resolve_code, - recurse into its components. */ -- resolve_code (this_code, ns); -+ gfc_resolve_code (this_code, ns); - - if (this_code->op == EXEC_ASSIGN_CALL) - { -@@ -9695,8 +9715,8 @@ - /* Given a block of code, recursively resolve everything pointed to by this - code block. */ - --static void --resolve_code (gfc_code *code, gfc_namespace *ns) -+void -+gfc_resolve_code (gfc_code *code, gfc_namespace *ns) - { - int omp_workshare_save; - int forall_save, do_concurrent_save; -@@ -9733,13 +9753,28 @@ - break; - case EXEC_OMP_PARALLEL: - case EXEC_OMP_PARALLEL_DO: -+ case EXEC_OMP_PARALLEL_DO_SIMD: - case EXEC_OMP_PARALLEL_SECTIONS: -+ case EXEC_OMP_TARGET_TEAMS: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD: - case EXEC_OMP_TASK: -+ case EXEC_OMP_TEAMS: -+ case EXEC_OMP_TEAMS_DISTRIBUTE: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD: - omp_workshare_save = omp_workshare_flag; - omp_workshare_flag = 0; - gfc_resolve_omp_parallel_blocks (code, ns); - break; -+ case EXEC_OMP_DISTRIBUTE: -+ case EXEC_OMP_DISTRIBUTE_SIMD: - case EXEC_OMP_DO: -+ case EXEC_OMP_DO_SIMD: -+ case EXEC_OMP_SIMD: - gfc_resolve_omp_do_blocks (code, ns); - break; - case EXEC_SELECT_TYPE: -@@ -9960,7 +9995,8 @@ - - case EXEC_DO_WHILE: - if (code->expr1 == NULL) -- gfc_internal_error ("resolve_code(): No expression on DO WHILE"); -+ gfc_internal_error ("gfc_resolve_code(): No expression on " -+ "DO WHILE"); - if (t - && (code->expr1->rank != 0 - || code->expr1->ts.type != BT_LOGICAL)) -@@ -10054,15 +10090,38 @@ - - case EXEC_OMP_ATOMIC: - case EXEC_OMP_BARRIER: -+ case EXEC_OMP_CANCEL: -+ case EXEC_OMP_CANCELLATION_POINT: - case EXEC_OMP_CRITICAL: - case EXEC_OMP_FLUSH: -+ case EXEC_OMP_DISTRIBUTE: -+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO: -+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case EXEC_OMP_DISTRIBUTE_SIMD: - case EXEC_OMP_DO: -+ case EXEC_OMP_DO_SIMD: - case EXEC_OMP_MASTER: - case EXEC_OMP_ORDERED: - case EXEC_OMP_SECTIONS: -+ case EXEC_OMP_SIMD: - case EXEC_OMP_SINGLE: -+ case EXEC_OMP_TARGET: -+ case EXEC_OMP_TARGET_DATA: -+ case EXEC_OMP_TARGET_TEAMS: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD: -+ case EXEC_OMP_TARGET_UPDATE: -+ case EXEC_OMP_TASK: -+ case EXEC_OMP_TASKGROUP: - case EXEC_OMP_TASKWAIT: - case EXEC_OMP_TASKYIELD: -+ case EXEC_OMP_TEAMS: -+ case EXEC_OMP_TEAMS_DISTRIBUTE: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD: - case EXEC_OMP_WORKSHARE: - gfc_resolve_omp_directive (code, ns); - break; -@@ -10069,9 +10128,9 @@ - - case EXEC_OMP_PARALLEL: - case EXEC_OMP_PARALLEL_DO: -+ case EXEC_OMP_PARALLEL_DO_SIMD: - case EXEC_OMP_PARALLEL_SECTIONS: - case EXEC_OMP_PARALLEL_WORKSHARE: -- case EXEC_OMP_TASK: - omp_workshare_save = omp_workshare_flag; - omp_workshare_flag = 0; - gfc_resolve_omp_directive (code, ns); -@@ -10079,7 +10138,7 @@ - break; - - default: -- gfc_internal_error ("resolve_code(): Bad statement code"); -+ gfc_internal_error ("gfc_resolve_code(): Bad statement code"); - } - } - -@@ -10779,7 +10838,10 @@ - } - - /* Constraints on deferred type parameter. */ -- if (sym->ts.deferred && !(sym->attr.pointer || sym->attr.allocatable)) -+ if (sym->ts.deferred -+ && !(sym->attr.pointer -+ || sym->attr.allocatable -+ || sym->attr.omp_udr_artificial_var)) - { - gfc_error ("Entity '%s' at %L has a deferred type parameter and " - "requires either the pointer or allocatable attribute", -@@ -10794,7 +10856,8 @@ - dummy arguments. */ - e = sym->ts.u.cl->length; - if (e == NULL && !sym->attr.dummy && !sym->attr.result -- && !sym->ts.deferred && !sym->attr.select_type_temporary) -+ && !sym->ts.deferred && !sym->attr.select_type_temporary -+ && !sym->attr.omp_udr_artificial_var) - { - gfc_error ("Entity with assumed character length at %L must be a " - "dummy argument or a PARAMETER", &sym->declared_at); -@@ -11200,15 +11263,36 @@ - the requirements of the standard for procedures used as finalizers. */ - - static bool --gfc_resolve_finalizers (gfc_symbol* derived) -+gfc_resolve_finalizers (gfc_symbol* derived, bool *finalizable) - { - gfc_finalizer* list; - gfc_finalizer** prev_link; /* For removing wrong entries from the list. */ - bool result = true; - bool seen_scalar = false; -+ gfc_symbol *vtab; -+ gfc_component *c; - -+ /* Return early when not finalizable. Additionally, ensure that derived-type -+ components have a their finalizables resolved. */ - if (!derived->f2k_derived || !derived->f2k_derived->finalizers) -- return true; -+ { -+ bool has_final = false; -+ for (c = derived->components; c; c = c->next) -+ if (c->ts.type == BT_DERIVED -+ && !c->attr.pointer && !c->attr.proc_pointer && !c->attr.allocatable) -+ { -+ bool has_final2 = false; -+ if (!gfc_resolve_finalizers (c->ts.u.derived, &has_final)) -+ return false; /* Error. */ -+ has_final = has_final || has_final2; -+ } -+ if (!has_final) -+ { -+ if (finalizable) -+ *finalizable = false; -+ return true; -+ } -+ } - - /* Walk over the list of finalizer-procedures, check them, and if any one - does not fit in with the standard's definition, print an error and remove -@@ -11330,12 +11414,15 @@ - /* Remove wrong nodes immediately from the list so we don't risk any - troubles in the future when they might fail later expectations. */ - error: -- result = false; - i = list; - *prev_link = list->next; - gfc_free_finalizer (i); -+ result = false; - } - -+ if (result == false) -+ return false; -+ - /* Warn if we haven't seen a scalar finalizer procedure (but we know there - were nodes in the list, must have been for arrays. It is surely a good - idea to have a scalar version there if there's something to finalize. */ -@@ -11344,8 +11431,14 @@ - " defined at %L, suggest also scalar one", - derived->name, &derived->declared_at); - -- gfc_find_derived_vtab (derived); -- return result; -+ vtab = gfc_find_derived_vtab (derived); -+ c = vtab->ts.u.derived->components->next->next->next->next->next; -+ gfc_set_sym_referenced (c->initializer->symtree->n.sym); -+ -+ if (finalizable) -+ *finalizable = true; -+ -+ return true; - } - - -@@ -12513,7 +12606,7 @@ - return false; - - /* Resolve the finalizer procedures. */ -- if (!gfc_resolve_finalizers (sym)) -+ if (!gfc_resolve_finalizers (sym, NULL)) - return false; - - if (sym->attr.is_class && sym->ts.u.derived == NULL) -@@ -13399,6 +13492,18 @@ - || sym->ns->proc_name->attr.flavor != FL_MODULE))) - gfc_error ("Threadprivate at %L isn't SAVEd", &sym->declared_at); - -+ /* Check omp declare target restrictions. */ -+ if (sym->attr.omp_declare_target -+ && sym->attr.flavor == FL_VARIABLE -+ && !sym->attr.save -+ && !sym->ns->save_all -+ && (!sym->attr.in_common -+ && sym->module == NULL -+ && (sym->ns->proc_name == NULL -+ || sym->ns->proc_name->attr.flavor != FL_MODULE))) -+ gfc_error ("!$OMP DECLARE TARGET variable '%s' at %L isn't SAVEd", -+ sym->name, &sym->declared_at); -+ - /* If we have come this far we can apply default-initializers, as - described in 14.7.5, to those variables that have not already - been assigned one. */ -@@ -14496,7 +14601,7 @@ - assign types to all intermediate expressions, make sure that all - assignments are to compatible types and figure out which names - refer to which functions or subroutines. It doesn't check code -- block, which is handled by resolve_code. */ -+ block, which is handled by gfc_resolve_code. */ - - static void - resolve_types (gfc_namespace *ns) -@@ -14577,11 +14682,15 @@ - - gfc_resolve_uops (ns->uop_root); - -+ gfc_resolve_omp_declare_simd (ns); -+ -+ gfc_resolve_omp_udrs (ns->omp_udr_root); -+ - gfc_current_ns = old_ns; - } - - --/* Call resolve_code recursively. */ -+/* Call gfc_resolve_code recursively. */ - - static void - resolve_codes (gfc_namespace *ns) -@@ -14607,7 +14716,7 @@ - old_obstack = labels_obstack; - bitmap_obstack_initialize (&labels_obstack); - -- resolve_code (ns->code, ns); -+ gfc_resolve_code (ns->code, ns); - - bitmap_obstack_release (&labels_obstack); - labels_obstack = old_obstack; -Index: gcc/fortran/f95-lang.c -=================================================================== ---- a/src/gcc/fortran/f95-lang.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/f95-lang.c (.../branches/gcc-4_9-branch) -@@ -87,6 +87,24 @@ - static void gfc_init_ts (void); - static tree gfc_builtin_function (tree); - -+/* Handle an "omp declare target" attribute; arguments as in -+ struct attribute_spec.handler. */ -+static tree -+gfc_handle_omp_declare_target_attribute (tree *, tree, tree, int, bool *) -+{ -+ return NULL_TREE; -+} -+ -+/* Table of valid Fortran attributes. */ -+static const struct attribute_spec gfc_attribute_table[] = -+{ -+ /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler, -+ affects_type_identity } */ -+ { "omp declare target", 0, 0, true, false, false, -+ gfc_handle_omp_declare_target_attribute, false }, -+ { NULL, 0, 0, false, false, false, NULL, false } -+}; -+ - #undef LANG_HOOKS_NAME - #undef LANG_HOOKS_INIT - #undef LANG_HOOKS_FINISH -@@ -108,7 +126,9 @@ - #undef LANG_HOOKS_OMP_CLAUSE_DEFAULT_CTOR - #undef LANG_HOOKS_OMP_CLAUSE_COPY_CTOR - #undef LANG_HOOKS_OMP_CLAUSE_ASSIGN_OP -+#undef LANG_HOOKS_OMP_CLAUSE_LINEAR_CTOR - #undef LANG_HOOKS_OMP_CLAUSE_DTOR -+#undef LANG_HOOKS_OMP_FINISH_CLAUSE - #undef LANG_HOOKS_OMP_DISREGARD_VALUE_EXPR - #undef LANG_HOOKS_OMP_PRIVATE_DEBUG_CLAUSE - #undef LANG_HOOKS_OMP_PRIVATE_OUTER_REF -@@ -116,6 +136,7 @@ - #undef LANG_HOOKS_BUILTIN_FUNCTION - #undef LANG_HOOKS_BUILTIN_FUNCTION - #undef LANG_HOOKS_GET_ARRAY_DESCR_INFO -+#undef LANG_HOOKS_ATTRIBUTE_TABLE - - /* Define lang hooks. */ - #define LANG_HOOKS_NAME "GNU Fortran" -@@ -138,14 +159,17 @@ - #define LANG_HOOKS_OMP_CLAUSE_DEFAULT_CTOR gfc_omp_clause_default_ctor - #define LANG_HOOKS_OMP_CLAUSE_COPY_CTOR gfc_omp_clause_copy_ctor - #define LANG_HOOKS_OMP_CLAUSE_ASSIGN_OP gfc_omp_clause_assign_op -+#define LANG_HOOKS_OMP_CLAUSE_LINEAR_CTOR gfc_omp_clause_linear_ctor - #define LANG_HOOKS_OMP_CLAUSE_DTOR gfc_omp_clause_dtor -+#define LANG_HOOKS_OMP_FINISH_CLAUSE gfc_omp_finish_clause - #define LANG_HOOKS_OMP_DISREGARD_VALUE_EXPR gfc_omp_disregard_value_expr - #define LANG_HOOKS_OMP_PRIVATE_DEBUG_CLAUSE gfc_omp_private_debug_clause - #define LANG_HOOKS_OMP_PRIVATE_OUTER_REF gfc_omp_private_outer_ref - #define LANG_HOOKS_OMP_FIRSTPRIVATIZE_TYPE_SIZES \ - gfc_omp_firstprivatize_type_sizes --#define LANG_HOOKS_BUILTIN_FUNCTION gfc_builtin_function --#define LANG_HOOKS_GET_ARRAY_DESCR_INFO gfc_get_array_descr_info -+#define LANG_HOOKS_BUILTIN_FUNCTION gfc_builtin_function -+#define LANG_HOOKS_GET_ARRAY_DESCR_INFO gfc_get_array_descr_info -+#define LANG_HOOKS_ATTRIBUTE_TABLE gfc_attribute_table - - struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER; - -@@ -1038,7 +1062,9 @@ - #include "../sync-builtins.def" - #undef DEF_SYNC_BUILTIN - -- if (gfc_option.gfc_flag_openmp || flag_tree_parallelize_loops) -+ if (gfc_option.gfc_flag_openmp -+ || gfc_option.gfc_flag_openmp_simd -+ || flag_tree_parallelize_loops) - { - #undef DEF_GOMP_BUILTIN - #define DEF_GOMP_BUILTIN(code, name, type, attr) \ -@@ -1052,6 +1078,13 @@ - BUILT_IN_TRAP, NULL, ATTR_NOTHROW_LEAF_LIST); - TREE_THIS_VOLATILE (builtin_decl_explicit (BUILT_IN_TRAP)) = 1; - -+ ftype = build_varargs_function_type_list (ptr_type_node, const_ptr_type_node, -+ size_type_node, NULL_TREE); -+ gfc_define_builtin ("__builtin_assume_aligned", ftype, -+ BUILT_IN_ASSUME_ALIGNED, -+ "__builtin_assume_aligned", -+ ATTR_CONST_NOTHROW_LEAF_LIST); -+ - gfc_define_builtin ("__emutls_get_address", - builtin_types[BT_FN_PTR_PTR], - BUILT_IN_EMUTLS_GET_ADDRESS, -Index: gcc/fortran/st.c -=================================================================== ---- a/src/gcc/fortran/st.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/st.c (.../branches/gcc-4_9-branch) -@@ -185,14 +185,36 @@ - gfc_free_forall_iterator (p->ext.forall_iterator); - break; - -+ case EXEC_OMP_CANCEL: -+ case EXEC_OMP_CANCELLATION_POINT: -+ case EXEC_OMP_DISTRIBUTE: -+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO: -+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case EXEC_OMP_DISTRIBUTE_SIMD: - case EXEC_OMP_DO: -+ case EXEC_OMP_DO_SIMD: - case EXEC_OMP_END_SINGLE: - case EXEC_OMP_PARALLEL: - case EXEC_OMP_PARALLEL_DO: -+ case EXEC_OMP_PARALLEL_DO_SIMD: - case EXEC_OMP_PARALLEL_SECTIONS: - case EXEC_OMP_SECTIONS: -+ case EXEC_OMP_SIMD: - case EXEC_OMP_SINGLE: -+ case EXEC_OMP_TARGET: -+ case EXEC_OMP_TARGET_DATA: -+ case EXEC_OMP_TARGET_TEAMS: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD: -+ case EXEC_OMP_TARGET_UPDATE: - case EXEC_OMP_TASK: -+ case EXEC_OMP_TEAMS: -+ case EXEC_OMP_TEAMS_DISTRIBUTE: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD: - case EXEC_OMP_WORKSHARE: - case EXEC_OMP_PARALLEL_WORKSHARE: - gfc_free_omp_clauses (p->ext.omp_clauses); -@@ -203,7 +225,7 @@ - break; - - case EXEC_OMP_FLUSH: -- gfc_free_namelist (p->ext.omp_namelist); -+ gfc_free_omp_namelist (p->ext.omp_namelist); - break; - - case EXEC_OMP_ATOMIC: -@@ -211,6 +233,7 @@ - case EXEC_OMP_MASTER: - case EXEC_OMP_ORDERED: - case EXEC_OMP_END_NOWAIT: -+ case EXEC_OMP_TASKGROUP: - case EXEC_OMP_TASKWAIT: - case EXEC_OMP_TASKYIELD: - break; -Index: gcc/fortran/trans-decl.c -=================================================================== ---- a/src/gcc/fortran/trans-decl.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/trans-decl.c (.../branches/gcc-4_9-branch) -@@ -496,6 +496,29 @@ - } - - -+/* Handle setting of GFC_DECL_SCALAR* on DECL. */ -+ -+void -+gfc_finish_decl_attrs (tree decl, symbol_attribute *attr) -+{ -+ if (!attr->dimension && !attr->codimension) -+ { -+ /* Handle scalar allocatable variables. */ -+ if (attr->allocatable) -+ { -+ gfc_allocate_lang_decl (decl); -+ GFC_DECL_SCALAR_ALLOCATABLE (decl) = 1; -+ } -+ /* Handle scalar pointer variables. */ -+ if (attr->pointer) -+ { -+ gfc_allocate_lang_decl (decl); -+ GFC_DECL_SCALAR_POINTER (decl) = 1; -+ } -+ } -+} -+ -+ - /* Apply symbol attributes to a variable, and add it to the function scope. */ - - static void -@@ -607,6 +630,8 @@ - if (sym->attr.threadprivate - && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))) - DECL_TLS_MODEL (decl) = decl_default_tls_model (decl); -+ -+ gfc_finish_decl_attrs (decl, &sym->attr); - } - - -@@ -615,8 +640,9 @@ - void - gfc_allocate_lang_decl (tree decl) - { -- DECL_LANG_SPECIFIC (decl) = ggc_alloc_cleared_lang_decl(sizeof -- (struct lang_decl)); -+ if (DECL_LANG_SPECIFIC (decl) == NULL) -+ DECL_LANG_SPECIFIC (decl) -+ = ggc_alloc_cleared_lang_decl (sizeof (struct lang_decl)); - } - - /* Remember a symbol to generate initialization/cleanup code at function -@@ -1192,6 +1218,10 @@ - list = chainon (list, attr); - } - -+ if (sym_attr.omp_declare_target) -+ list = tree_cons (get_identifier ("omp declare target"), -+ NULL_TREE, list); -+ - return list; - } - -@@ -1518,6 +1548,9 @@ - && !sym->attr.select_type_temporary) - DECL_BY_REFERENCE (decl) = 1; - -+ if (sym->attr.associate_var) -+ GFC_DECL_ASSOCIATE_VAR_P (decl) = 1; -+ - if (sym->attr.vtab - || (sym->name[0] == '_' && strncmp ("__def_init", sym->name, 10) == 0)) - TREE_READONLY (decl) = 1; -@@ -1850,6 +1883,11 @@ - if (DECL_CONTEXT (fndecl) == NULL_TREE) - pushdecl_top_level (fndecl); - -+ if (sym->formal_ns -+ && sym->formal_ns->proc_name == sym -+ && sym->formal_ns->omp_declare_simd) -+ gfc_trans_omp_declare_simd (sym->formal_ns); -+ - return fndecl; - } - -@@ -2232,6 +2270,7 @@ - DECL_BY_REFERENCE (parm) = 1; - - gfc_finish_decl (parm); -+ gfc_finish_decl_attrs (parm, &f->sym->attr); - - f->sym->backend_decl = parm; - -@@ -2544,6 +2583,9 @@ - - /* Now create the read argument list. */ - create_function_arglist (ns->proc_name); -+ -+ if (ns->omp_declare_simd) -+ gfc_trans_omp_declare_simd (ns); - } - - /* Return the decl used to hold the function return value. If -@@ -2672,6 +2714,7 @@ - TREE_ADDRESSABLE (decl) = 1; - - layout_decl (decl, 0); -+ gfc_finish_decl_attrs (decl, &sym->attr); - - if (parent_flag) - gfc_add_decl_to_parent_function (decl); -@@ -4237,8 +4280,8 @@ - } - - /* Don't generate variables from other modules. Variables from -- COMMONs will already have been generated. */ -- if (sym->attr.use_assoc || sym->attr.in_common) -+ COMMONs and Cray pointees will already have been generated. */ -+ if (sym->attr.use_assoc || sym->attr.in_common || sym->attr.cray_pointee) - return; - - /* Equivalenced variables arrive here after creation. */ -Index: gcc/fortran/match.c -=================================================================== ---- a/src/gcc/fortran/match.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/match.c (.../branches/gcc-4_9-branch) -@@ -2595,7 +2595,10 @@ - && o != NULL - && o->state == COMP_OMP_STRUCTURED_BLOCK - && (o->head->op == EXEC_OMP_DO -- || o->head->op == EXEC_OMP_PARALLEL_DO)) -+ || o->head->op == EXEC_OMP_PARALLEL_DO -+ || o->head->op == EXEC_OMP_SIMD -+ || o->head->op == EXEC_OMP_DO_SIMD -+ || o->head->op == EXEC_OMP_PARALLEL_DO_SIMD)) - { - int collapse = 1; - gcc_assert (o->head->next != NULL -@@ -4564,6 +4567,30 @@ - } - - -+/* Free an OpenMP namelist structure. */ -+ -+void -+gfc_free_omp_namelist (gfc_omp_namelist *name) -+{ -+ gfc_omp_namelist *n; -+ -+ for (; name; name = n) -+ { -+ gfc_free_expr (name->expr); -+ if (name->udr) -+ { -+ if (name->udr->combiner) -+ gfc_free_statement (name->udr->combiner); -+ if (name->udr->initializer) -+ gfc_free_statement (name->udr->initializer); -+ free (name->udr); -+ } -+ n = name->next; -+ free (name); -+ } -+} -+ -+ - /* Match a NAMELIST statement. */ - - match -Index: gcc/fortran/match.h -=================================================================== ---- a/src/gcc/fortran/match.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/match.h (.../branches/gcc-4_9-branch) -@@ -126,20 +126,46 @@ - match gfc_match_omp_eos (void); - match gfc_match_omp_atomic (void); - match gfc_match_omp_barrier (void); -+match gfc_match_omp_cancel (void); -+match gfc_match_omp_cancellation_point (void); - match gfc_match_omp_critical (void); -+match gfc_match_omp_declare_reduction (void); -+match gfc_match_omp_declare_simd (void); -+match gfc_match_omp_declare_target (void); -+match gfc_match_omp_distribute (void); -+match gfc_match_omp_distribute_parallel_do (void); -+match gfc_match_omp_distribute_parallel_do_simd (void); -+match gfc_match_omp_distribute_simd (void); - match gfc_match_omp_do (void); -+match gfc_match_omp_do_simd (void); - match gfc_match_omp_flush (void); - match gfc_match_omp_master (void); - match gfc_match_omp_ordered (void); - match gfc_match_omp_parallel (void); - match gfc_match_omp_parallel_do (void); -+match gfc_match_omp_parallel_do_simd (void); - match gfc_match_omp_parallel_sections (void); - match gfc_match_omp_parallel_workshare (void); - match gfc_match_omp_sections (void); -+match gfc_match_omp_simd (void); - match gfc_match_omp_single (void); -+match gfc_match_omp_target (void); -+match gfc_match_omp_target_data (void); -+match gfc_match_omp_target_teams (void); -+match gfc_match_omp_target_teams_distribute (void); -+match gfc_match_omp_target_teams_distribute_parallel_do (void); -+match gfc_match_omp_target_teams_distribute_parallel_do_simd (void); -+match gfc_match_omp_target_teams_distribute_simd (void); -+match gfc_match_omp_target_update (void); - match gfc_match_omp_task (void); -+match gfc_match_omp_taskgroup (void); - match gfc_match_omp_taskwait (void); - match gfc_match_omp_taskyield (void); -+match gfc_match_omp_teams (void); -+match gfc_match_omp_teams_distribute (void); -+match gfc_match_omp_teams_distribute_parallel_do (void); -+match gfc_match_omp_teams_distribute_parallel_do_simd (void); -+match gfc_match_omp_teams_distribute_simd (void); - match gfc_match_omp_threadprivate (void); - match gfc_match_omp_workshare (void); - match gfc_match_omp_end_nowait (void); -Index: gcc/fortran/parse.c -=================================================================== ---- a/src/gcc/fortran/parse.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/fortran/parse.c (.../branches/gcc-4_9-branch) -@@ -74,6 +74,34 @@ - } - - -+/* Like match_word, but if str is matched, set a flag that it -+ was matched. */ -+static match -+match_word_omp_simd (const char *str, match (*subr) (void), locus *old_locus, -+ bool *simd_matched) -+{ -+ match m; -+ -+ if (str != NULL) -+ { -+ m = gfc_match (str); -+ if (m != MATCH_YES) -+ return m; -+ *simd_matched = true; -+ } -+ -+ m = (*subr) (); -+ -+ if (m != MATCH_YES) -+ { -+ gfc_current_locus = *old_locus; -+ reject_statement (); -+ } -+ -+ return m; -+} -+ -+ - /* Load symbols from all USE statements encountered in this scoping unit. */ - - static void -@@ -103,7 +131,7 @@ - if (match_word (keyword, subr, &old_locus) == MATCH_YES) \ - return st; \ - else \ -- undo_new_statement (); \ -+ undo_new_statement (); \ - } while (0); - - -@@ -531,11 +559,34 @@ - return ST_NONE; - } - -+/* Like match, but set a flag simd_matched if keyword matched. */ -+#define matchs(keyword, subr, st) \ -+ do { \ -+ if (match_word_omp_simd (keyword, subr, &old_locus, \ -+ &simd_matched) == MATCH_YES) \ -+ return st; \ -+ else \ -+ undo_new_statement (); \ -+ } while (0); -+ -+/* Like match, but don't match anything if not -fopenmp. */ -+#define matcho(keyword, subr, st) \ -+ do { \ -+ if (!gfc_option.gfc_flag_openmp) \ -+ ; \ -+ else if (match_word (keyword, subr, &old_locus) \ -+ == MATCH_YES) \ -+ return st; \ -+ else \ -+ undo_new_statement (); \ -+ } while (0); -+ - static gfc_statement - decode_omp_directive (void) - { - locus old_locus; - char c; -+ bool simd_matched = false; - - gfc_enforce_clean_symbol_state (); - -@@ -560,77 +611,167 @@ - - c = gfc_peek_ascii_char (); - -+ /* match is for directives that should be recognized only if -+ -fopenmp, matchs for directives that should be recognized -+ if either -fopenmp or -fopenmp-simd. */ - switch (c) - { - case 'a': -- match ("atomic", gfc_match_omp_atomic, ST_OMP_ATOMIC); -+ matcho ("atomic", gfc_match_omp_atomic, ST_OMP_ATOMIC); - break; - case 'b': -- match ("barrier", gfc_match_omp_barrier, ST_OMP_BARRIER); -+ matcho ("barrier", gfc_match_omp_barrier, ST_OMP_BARRIER); - break; - case 'c': -- match ("critical", gfc_match_omp_critical, ST_OMP_CRITICAL); -+ matcho ("cancellation% point", gfc_match_omp_cancellation_point, -+ ST_OMP_CANCELLATION_POINT); -+ matcho ("cancel", gfc_match_omp_cancel, ST_OMP_CANCEL); -+ matcho ("critical", gfc_match_omp_critical, ST_OMP_CRITICAL); - break; - case 'd': -- match ("do", gfc_match_omp_do, ST_OMP_DO); -+ matchs ("declare reduction", gfc_match_omp_declare_reduction, -+ ST_OMP_DECLARE_REDUCTION); -+ matchs ("declare simd", gfc_match_omp_declare_simd, -+ ST_OMP_DECLARE_SIMD); -+ matcho ("declare target", gfc_match_omp_declare_target, -+ ST_OMP_DECLARE_TARGET); -+ matchs ("distribute parallel do simd", -+ gfc_match_omp_distribute_parallel_do_simd, -+ ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD); -+ matcho ("distribute parallel do", gfc_match_omp_distribute_parallel_do, -+ ST_OMP_DISTRIBUTE_PARALLEL_DO); -+ matchs ("distribute simd", gfc_match_omp_distribute_simd, -+ ST_OMP_DISTRIBUTE_SIMD); -+ matcho ("distribute", gfc_match_omp_distribute, ST_OMP_DISTRIBUTE); -+ matchs ("do simd", gfc_match_omp_do_simd, ST_OMP_DO_SIMD); -+ matcho ("do", gfc_match_omp_do, ST_OMP_DO); - break; - case 'e': -- match ("end atomic", gfc_match_omp_eos, ST_OMP_END_ATOMIC); -- match ("end critical", gfc_match_omp_critical, ST_OMP_END_CRITICAL); -- match ("end do", gfc_match_omp_end_nowait, ST_OMP_END_DO); -- match ("end master", gfc_match_omp_eos, ST_OMP_END_MASTER); -- match ("end ordered", gfc_match_omp_eos, ST_OMP_END_ORDERED); -- match ("end parallel do", gfc_match_omp_eos, ST_OMP_END_PARALLEL_DO); -- match ("end parallel sections", gfc_match_omp_eos, -- ST_OMP_END_PARALLEL_SECTIONS); -- match ("end parallel workshare", gfc_match_omp_eos, -- ST_OMP_END_PARALLEL_WORKSHARE); -- match ("end parallel", gfc_match_omp_eos, ST_OMP_END_PARALLEL); -- match ("end sections", gfc_match_omp_end_nowait, ST_OMP_END_SECTIONS); -- match ("end single", gfc_match_omp_end_single, ST_OMP_END_SINGLE); -- match ("end task", gfc_match_omp_eos, ST_OMP_END_TASK); -- match ("end workshare", gfc_match_omp_end_nowait, -- ST_OMP_END_WORKSHARE); -+ matcho ("end atomic", gfc_match_omp_eos, ST_OMP_END_ATOMIC); -+ matcho ("end critical", gfc_match_omp_critical, ST_OMP_END_CRITICAL); -+ matchs ("end distribute parallel do simd", gfc_match_omp_eos, -+ ST_OMP_END_DISTRIBUTE_PARALLEL_DO_SIMD); -+ matcho ("end distribute parallel do", gfc_match_omp_eos, -+ ST_OMP_END_DISTRIBUTE_PARALLEL_DO); -+ matchs ("end distribute simd", gfc_match_omp_eos, -+ ST_OMP_END_DISTRIBUTE_SIMD); -+ matcho ("end distribute", gfc_match_omp_eos, ST_OMP_END_DISTRIBUTE); -+ matchs ("end do simd", gfc_match_omp_end_nowait, ST_OMP_END_DO_SIMD); -+ matcho ("end do", gfc_match_omp_end_nowait, ST_OMP_END_DO); -+ matchs ("end simd", gfc_match_omp_eos, ST_OMP_END_SIMD); -+ matcho ("end master", gfc_match_omp_eos, ST_OMP_END_MASTER); -+ matcho ("end ordered", gfc_match_omp_eos, ST_OMP_END_ORDERED); -+ matchs ("end parallel do simd", gfc_match_omp_eos, -+ ST_OMP_END_PARALLEL_DO_SIMD); -+ matcho ("end parallel do", gfc_match_omp_eos, ST_OMP_END_PARALLEL_DO); -+ matcho ("end parallel sections", gfc_match_omp_eos, -+ ST_OMP_END_PARALLEL_SECTIONS); -+ matcho ("end parallel workshare", gfc_match_omp_eos, -+ ST_OMP_END_PARALLEL_WORKSHARE); -+ matcho ("end parallel", gfc_match_omp_eos, ST_OMP_END_PARALLEL); -+ matcho ("end sections", gfc_match_omp_end_nowait, ST_OMP_END_SECTIONS); -+ matcho ("end single", gfc_match_omp_end_single, ST_OMP_END_SINGLE); -+ matcho ("end target data", gfc_match_omp_eos, ST_OMP_END_TARGET_DATA); -+ matchs ("end target teams distribute parallel do simd", -+ gfc_match_omp_eos, -+ ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD); -+ matcho ("end target teams distribute parallel do", gfc_match_omp_eos, -+ ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO); -+ matchs ("end target teams distribute simd", gfc_match_omp_eos, -+ ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_SIMD); -+ matcho ("end target teams distribute", gfc_match_omp_eos, -+ ST_OMP_END_TARGET_TEAMS_DISTRIBUTE); -+ matcho ("end target teams", gfc_match_omp_eos, ST_OMP_END_TARGET_TEAMS); -+ matcho ("end target", gfc_match_omp_eos, ST_OMP_END_TARGET); -+ matcho ("end taskgroup", gfc_match_omp_eos, ST_OMP_END_TASKGROUP); -+ matcho ("end task", gfc_match_omp_eos, ST_OMP_END_TASK); -+ matchs ("end teams distribute parallel do simd", gfc_match_omp_eos, -+ ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD); -+ matcho ("end teams distribute parallel do", gfc_match_omp_eos, -+ ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO); -+ matchs ("end teams distribute simd", gfc_match_omp_eos, -+ ST_OMP_END_TEAMS_DISTRIBUTE_SIMD); -+ matcho ("end teams distribute", gfc_match_omp_eos, -+ ST_OMP_END_TEAMS_DISTRIBUTE); -+ matcho ("end teams", gfc_match_omp_eos, ST_OMP_END_TEAMS); -+ matcho ("end workshare", gfc_match_omp_end_nowait, -+ ST_OMP_END_WORKSHARE); - break; - case 'f': -- match ("flush", gfc_match_omp_flush, ST_OMP_FLUSH); -+ matcho ("flush", gfc_match_omp_flush, ST_OMP_FLUSH); - break; - case 'm': -- match ("master", gfc_match_omp_master, ST_OMP_MASTER); -+ matcho ("master", gfc_match_omp_master, ST_OMP_MASTER); - break; - case 'o': -- match ("ordered", gfc_match_omp_ordered, ST_OMP_ORDERED); -+ matcho ("ordered", gfc_match_omp_ordered, ST_OMP_ORDERED); - break; - case 'p': -- match ("parallel do", gfc_match_omp_parallel_do, ST_OMP_PARALLEL_DO); -- match ("parallel sections", gfc_match_omp_parallel_sections, -- ST_OMP_PARALLEL_SECTIONS); -- match ("parallel workshare", gfc_match_omp_parallel_workshare, -- ST_OMP_PARALLEL_WORKSHARE); -- match ("parallel", gfc_match_omp_parallel, ST_OMP_PARALLEL); -+ matchs ("parallel do simd", gfc_match_omp_parallel_do_simd, -+ ST_OMP_PARALLEL_DO_SIMD); -+ matcho ("parallel do", gfc_match_omp_parallel_do, ST_OMP_PARALLEL_DO); -+ matcho ("parallel sections", gfc_match_omp_parallel_sections, -+ ST_OMP_PARALLEL_SECTIONS); -+ matcho ("parallel workshare", gfc_match_omp_parallel_workshare, -+ ST_OMP_PARALLEL_WORKSHARE); -+ matcho ("parallel", gfc_match_omp_parallel, ST_OMP_PARALLEL); - break; - case 's': -- match ("sections", gfc_match_omp_sections, ST_OMP_SECTIONS); -- match ("section", gfc_match_omp_eos, ST_OMP_SECTION); -- match ("single", gfc_match_omp_single, ST_OMP_SINGLE); -+ matcho ("sections", gfc_match_omp_sections, ST_OMP_SECTIONS); -+ matcho ("section", gfc_match_omp_eos, ST_OMP_SECTION); -+ matchs ("simd", gfc_match_omp_simd, ST_OMP_SIMD); -+ matcho ("single", gfc_match_omp_single, ST_OMP_SINGLE); - break; - case 't': -- match ("task", gfc_match_omp_task, ST_OMP_TASK); -- match ("taskwait", gfc_match_omp_taskwait, ST_OMP_TASKWAIT); -- match ("taskyield", gfc_match_omp_taskyield, ST_OMP_TASKYIELD); -- match ("threadprivate", gfc_match_omp_threadprivate, -- ST_OMP_THREADPRIVATE); -+ matcho ("target data", gfc_match_omp_target_data, ST_OMP_TARGET_DATA); -+ matchs ("target teams distribute parallel do simd", -+ gfc_match_omp_target_teams_distribute_parallel_do_simd, -+ ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD); -+ matcho ("target teams distribute parallel do", -+ gfc_match_omp_target_teams_distribute_parallel_do, -+ ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO); -+ matchs ("target teams distribute simd", -+ gfc_match_omp_target_teams_distribute_simd, -+ ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD); -+ matcho ("target teams distribute", gfc_match_omp_target_teams_distribute, -+ ST_OMP_TARGET_TEAMS_DISTRIBUTE); -+ matcho ("target teams", gfc_match_omp_target_teams, ST_OMP_TARGET_TEAMS); -+ matcho ("target update", gfc_match_omp_target_update, -+ ST_OMP_TARGET_UPDATE); -+ matcho ("target", gfc_match_omp_target, ST_OMP_TARGET); -+ matcho ("taskgroup", gfc_match_omp_taskgroup, ST_OMP_TASKGROUP); -+ matcho ("taskwait", gfc_match_omp_taskwait, ST_OMP_TASKWAIT); -+ matcho ("taskyield", gfc_match_omp_taskyield, ST_OMP_TASKYIELD); -+ matcho ("task", gfc_match_omp_task, ST_OMP_TASK); -+ matchs ("teams distribute parallel do simd", -+ gfc_match_omp_teams_distribute_parallel_do_simd, -+ ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD); -+ matcho ("teams distribute parallel do", -+ gfc_match_omp_teams_distribute_parallel_do, -+ ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO); -+ matchs ("teams distribute simd", gfc_match_omp_teams_distribute_simd, -+ ST_OMP_TEAMS_DISTRIBUTE_SIMD); -+ matcho ("teams distribute", gfc_match_omp_teams_distribute, -+ ST_OMP_TEAMS_DISTRIBUTE); -+ matcho ("teams", gfc_match_omp_teams, ST_OMP_TEAMS); -+ matcho ("threadprivate", gfc_match_omp_threadprivate, -+ ST_OMP_THREADPRIVATE); - break; - case 'w': -- match ("workshare", gfc_match_omp_workshare, ST_OMP_WORKSHARE); -+ matcho ("workshare", gfc_match_omp_workshare, ST_OMP_WORKSHARE); - break; - } - - /* All else has failed, so give up. See if any of the matchers has -- stored an error message of some sort. */ -+ stored an error message of some sort. Don't error out if -+ not -fopenmp and simd_matched is false, i.e. if a directive other -+ than one marked with match has been seen. */ - -- if (gfc_error_check () == 0) -- gfc_error_now ("Unclassifiable OpenMP directive at %C"); -+ if (gfc_option.gfc_flag_openmp || simd_matched) -+ { -+ if (gfc_error_check () == 0) -+ gfc_error_now ("Unclassifiable OpenMP directive at %C"); -+ } - - reject_statement (); - -@@ -753,7 +894,9 @@ - return decode_gcc_attribute (); - - } -- else if (c == '$' && gfc_option.gfc_flag_openmp) -+ else if (c == '$' -+ && (gfc_option.gfc_flag_openmp -+ || gfc_option.gfc_flag_openmp_simd)) - { - int i; - -@@ -842,7 +985,9 @@ - - return decode_gcc_attribute (); - } -- else if (c == '$' && gfc_option.gfc_flag_openmp) -+ else if (c == '$' -+ && (gfc_option.gfc_flag_openmp -+ || gfc_option.gfc_flag_openmp_simd)) - { - for (i = 0; i < 4; i++, c = gfc_next_char_literal (NONSTRING)) - gcc_assert ((char) gfc_wide_tolower (c) == "$omp"[i]); -@@ -1013,8 +1158,9 @@ - case ST_ASSIGNMENT: case ST_ARITHMETIC_IF: case ST_WHERE: case ST_FORALL: \ - case ST_LABEL_ASSIGNMENT: case ST_FLUSH: case ST_OMP_FLUSH: \ - case ST_OMP_BARRIER: case ST_OMP_TASKWAIT: case ST_OMP_TASKYIELD: \ -- case ST_ERROR_STOP: case ST_SYNC_ALL: case ST_SYNC_IMAGES: \ -- case ST_SYNC_MEMORY: case ST_LOCK: case ST_UNLOCK -+ case ST_OMP_CANCEL: case ST_OMP_CANCELLATION_POINT: \ -+ case ST_OMP_TARGET_UPDATE: case ST_ERROR_STOP: case ST_SYNC_ALL: \ -+ case ST_SYNC_IMAGES: case ST_SYNC_MEMORY: case ST_LOCK: case ST_UNLOCK - - /* Statements that mark other executable statements. */ - -@@ -1026,7 +1172,20 @@ - case ST_OMP_CRITICAL: case ST_OMP_MASTER: case ST_OMP_SINGLE: \ - case ST_OMP_DO: case ST_OMP_PARALLEL_DO: case ST_OMP_ATOMIC: \ - case ST_OMP_WORKSHARE: case ST_OMP_PARALLEL_WORKSHARE: \ -- case ST_OMP_TASK: case ST_CRITICAL -+ case ST_OMP_TASK: case ST_OMP_TASKGROUP: case ST_OMP_SIMD: \ -+ case ST_OMP_DO_SIMD: case ST_OMP_PARALLEL_DO_SIMD: case ST_OMP_TARGET: \ -+ case ST_OMP_TARGET_DATA: case ST_OMP_TARGET_TEAMS: \ -+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE: \ -+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD: \ -+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO: \ -+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: \ -+ case ST_OMP_TEAMS: case ST_OMP_TEAMS_DISTRIBUTE: \ -+ case ST_OMP_TEAMS_DISTRIBUTE_SIMD: \ -+ case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO: \ -+ case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: case ST_OMP_DISTRIBUTE: \ -+ case ST_OMP_DISTRIBUTE_SIMD: case ST_OMP_DISTRIBUTE_PARALLEL_DO: \ -+ case ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD: \ -+ case ST_CRITICAL - - /* Declaration statements */ - -@@ -1033,7 +1192,8 @@ - #define case_decl case ST_ATTR_DECL: case ST_COMMON: case ST_DATA_DECL: \ - case ST_EQUIVALENCE: case ST_NAMELIST: case ST_STATEMENT_FUNCTION: \ - case ST_TYPE: case ST_INTERFACE: case ST_OMP_THREADPRIVATE: \ -- case ST_PROCEDURE -+ case ST_PROCEDURE: case ST_OMP_DECLARE_SIMD: case ST_OMP_DECLARE_REDUCTION: \ -+ case ST_OMP_DECLARE_TARGET - - /* Block end statements. Errors associated with interchanging these - are detected in gfc_match_end(). */ -@@ -1524,12 +1684,42 @@ - case ST_OMP_BARRIER: - p = "!$OMP BARRIER"; - break; -+ case ST_OMP_CANCEL: -+ p = "!$OMP CANCEL"; -+ break; -+ case ST_OMP_CANCELLATION_POINT: -+ p = "!$OMP CANCELLATION POINT"; -+ break; - case ST_OMP_CRITICAL: - p = "!$OMP CRITICAL"; - break; -+ case ST_OMP_DECLARE_REDUCTION: -+ p = "!$OMP DECLARE REDUCTION"; -+ break; -+ case ST_OMP_DECLARE_SIMD: -+ p = "!$OMP DECLARE SIMD"; -+ break; -+ case ST_OMP_DECLARE_TARGET: -+ p = "!$OMP DECLARE TARGET"; -+ break; -+ case ST_OMP_DISTRIBUTE: -+ p = "!$OMP DISTRIBUTE"; -+ break; -+ case ST_OMP_DISTRIBUTE_PARALLEL_DO: -+ p = "!$OMP DISTRIBUTE PARALLEL DO"; -+ break; -+ case ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD: -+ p = "!$OMP DISTRIBUTE PARALLEL DO SIMD"; -+ break; -+ case ST_OMP_DISTRIBUTE_SIMD: -+ p = "!$OMP DISTRIBUTE SIMD"; -+ break; - case ST_OMP_DO: - p = "!$OMP DO"; - break; -+ case ST_OMP_DO_SIMD: -+ p = "!$OMP DO SIMD"; -+ break; - case ST_OMP_END_ATOMIC: - p = "!$OMP END ATOMIC"; - break; -@@ -1536,9 +1726,27 @@ - case ST_OMP_END_CRITICAL: - p = "!$OMP END CRITICAL"; - break; -+ case ST_OMP_END_DISTRIBUTE: -+ p = "!$OMP END DISTRIBUTE"; -+ break; -+ case ST_OMP_END_DISTRIBUTE_PARALLEL_DO: -+ p = "!$OMP END DISTRIBUTE PARALLEL DO"; -+ break; -+ case ST_OMP_END_DISTRIBUTE_PARALLEL_DO_SIMD: -+ p = "!$OMP END DISTRIBUTE PARALLEL DO SIMD"; -+ break; -+ case ST_OMP_END_DISTRIBUTE_SIMD: -+ p = "!$OMP END DISTRIBUTE SIMD"; -+ break; - case ST_OMP_END_DO: - p = "!$OMP END DO"; - break; -+ case ST_OMP_END_DO_SIMD: -+ p = "!$OMP END DO SIMD"; -+ break; -+ case ST_OMP_END_SIMD: -+ p = "!$OMP END SIMD"; -+ break; - case ST_OMP_END_MASTER: - p = "!$OMP END MASTER"; - break; -@@ -1551,6 +1759,9 @@ - case ST_OMP_END_PARALLEL_DO: - p = "!$OMP END PARALLEL DO"; - break; -+ case ST_OMP_END_PARALLEL_DO_SIMD: -+ p = "!$OMP END PARALLEL DO SIMD"; -+ break; - case ST_OMP_END_PARALLEL_SECTIONS: - p = "!$OMP END PARALLEL SECTIONS"; - break; -@@ -1566,6 +1777,45 @@ - case ST_OMP_END_TASK: - p = "!$OMP END TASK"; - break; -+ case ST_OMP_END_TARGET: -+ p = "!$OMP END TARGET"; -+ break; -+ case ST_OMP_END_TARGET_DATA: -+ p = "!$OMP END TARGET DATA"; -+ break; -+ case ST_OMP_END_TARGET_TEAMS: -+ p = "!$OMP END TARGET TEAMS"; -+ break; -+ case ST_OMP_END_TARGET_TEAMS_DISTRIBUTE: -+ p = "!$OMP END TARGET TEAMS DISTRIBUTE"; -+ break; -+ case ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ p = "!$OMP END TARGET TEAMS DISTRIBUTE PARALLEL DO"; -+ break; -+ case ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ p = "!$OMP END TARGET TEAMS DISTRIBUTE PARALLEL DO SIMD"; -+ break; -+ case ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_SIMD: -+ p = "!$OMP END TARGET TEAMS DISTRIBUTE SIMD"; -+ break; -+ case ST_OMP_END_TASKGROUP: -+ p = "!$OMP END TASKGROUP"; -+ break; -+ case ST_OMP_END_TEAMS: -+ p = "!$OMP END TEAMS"; -+ break; -+ case ST_OMP_END_TEAMS_DISTRIBUTE: -+ p = "!$OMP END TEAMS DISTRIBUTE"; -+ break; -+ case ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ p = "!$OMP END TEAMS DISTRIBUTE PARALLEL DO"; -+ break; -+ case ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ p = "!$OMP END TEAMS DISTRIBUTE PARALLEL DO SIMD"; -+ break; -+ case ST_OMP_END_TEAMS_DISTRIBUTE_SIMD: -+ p = "!$OMP END TEAMS DISTRIBUTE SIMD"; -+ break; - case ST_OMP_END_WORKSHARE: - p = "!$OMP END WORKSHARE"; - break; -@@ -1584,6 +1834,9 @@ - case ST_OMP_PARALLEL_DO: - p = "!$OMP PARALLEL DO"; - break; -+ case ST_OMP_PARALLEL_DO_SIMD: -+ p = "!$OMP PARALLEL DO SIMD"; -+ break; - case ST_OMP_PARALLEL_SECTIONS: - p = "!$OMP PARALLEL SECTIONS"; - break; -@@ -1596,12 +1849,42 @@ - case ST_OMP_SECTION: - p = "!$OMP SECTION"; - break; -+ case ST_OMP_SIMD: -+ p = "!$OMP SIMD"; -+ break; - case ST_OMP_SINGLE: - p = "!$OMP SINGLE"; - break; -+ case ST_OMP_TARGET: -+ p = "!$OMP TARGET"; -+ break; -+ case ST_OMP_TARGET_DATA: -+ p = "!$OMP TARGET DATA"; -+ break; -+ case ST_OMP_TARGET_TEAMS: -+ p = "!$OMP TARGET TEAMS"; -+ break; -+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE: -+ p = "!$OMP TARGET TEAMS DISTRIBUTE"; -+ break; -+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ p = "!$OMP TARGET TEAMS DISTRIBUTE PARALLEL DO"; -+ break; -+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ p = "!$OMP TARGET TEAMS DISTRIBUTE PARALLEL DO SIMD"; -+ break; -+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD: -+ p = "!$OMP TARGET TEAMS DISTRIBUTE SIMD"; -+ break; -+ case ST_OMP_TARGET_UPDATE: -+ p = "!$OMP TARGET UPDATE"; -+ break; - case ST_OMP_TASK: - p = "!$OMP TASK"; - break; -+ case ST_OMP_TASKGROUP: -+ p = "!$OMP TASKGROUP"; -+ break; - case ST_OMP_TASKWAIT: - p = "!$OMP TASKWAIT"; - break; -@@ -1608,6 +1891,21 @@ - case ST_OMP_TASKYIELD: - p = "!$OMP TASKYIELD"; - break; -+ case ST_OMP_TEAMS: -+ p = "!$OMP TEAMS"; -+ break; -+ case ST_OMP_TEAMS_DISTRIBUTE: -+ p = "!$OMP TEAMS DISTRIBUTE"; -+ break; -+ case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ p = "!$OMP TEAMS DISTRIBUTE PARALLEL DO"; -+ break; -+ case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ p = "!$OMP TEAMS DISTRIBUTE PARALLEL DO SIMD"; -+ break; -+ case ST_OMP_TEAMS_DISTRIBUTE_SIMD: -+ p = "!$OMP TEAMS DISTRIBUTE SIMD"; -+ break; - case ST_OMP_THREADPRIVATE: - p = "!$OMP THREADPRIVATE"; - break; -@@ -3578,8 +3876,54 @@ - pop_state (); - - st = next_statement (); -- if (st == (omp_st == ST_OMP_DO ? ST_OMP_END_DO : ST_OMP_END_PARALLEL_DO)) -+ gfc_statement omp_end_st = ST_OMP_END_DO; -+ switch (omp_st) - { -+ case ST_OMP_DISTRIBUTE: omp_end_st = ST_OMP_END_DISTRIBUTE; break; -+ case ST_OMP_DISTRIBUTE_PARALLEL_DO: -+ omp_end_st = ST_OMP_END_DISTRIBUTE_PARALLEL_DO; -+ break; -+ case ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD: -+ omp_end_st = ST_OMP_END_DISTRIBUTE_PARALLEL_DO_SIMD; -+ break; -+ case ST_OMP_DISTRIBUTE_SIMD: -+ omp_end_st = ST_OMP_END_DISTRIBUTE_SIMD; -+ break; -+ case ST_OMP_DO: omp_end_st = ST_OMP_END_DO; break; -+ case ST_OMP_DO_SIMD: omp_end_st = ST_OMP_END_DO_SIMD; break; -+ case ST_OMP_PARALLEL_DO: omp_end_st = ST_OMP_END_PARALLEL_DO; break; -+ case ST_OMP_PARALLEL_DO_SIMD: -+ omp_end_st = ST_OMP_END_PARALLEL_DO_SIMD; -+ break; -+ case ST_OMP_SIMD: omp_end_st = ST_OMP_END_SIMD; break; -+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE: -+ omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE; -+ break; -+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO; -+ break; -+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD; -+ break; -+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD: -+ omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_SIMD; -+ break; -+ case ST_OMP_TEAMS_DISTRIBUTE: -+ omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE; -+ break; -+ case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO; -+ break; -+ case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD; -+ break; -+ case ST_OMP_TEAMS_DISTRIBUTE_SIMD: -+ omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE_SIMD; -+ break; -+ default: gcc_unreachable (); -+ } -+ if (st == omp_end_st) -+ { - if (new_st.op == EXEC_OMP_END_NOWAIT) - cp->ext.omp_clauses->nowait |= new_st.ext.omp_bool; - else -@@ -3610,7 +3954,8 @@ - np = new_level (cp); - np->op = cp->op; - np->block = NULL; -- count = 1 + (cp->ext.omp_atomic == GFC_OMP_ATOMIC_CAPTURE); -+ count = 1 + ((cp->ext.omp_atomic & GFC_OMP_ATOMIC_MASK) -+ == GFC_OMP_ATOMIC_CAPTURE); - - while (count) - { -@@ -3636,7 +3981,8 @@ - gfc_warning_check (); - st = next_statement (); - } -- else if (cp->ext.omp_atomic == GFC_OMP_ATOMIC_CAPTURE) -+ else if ((cp->ext.omp_atomic & GFC_OMP_ATOMIC_MASK) -+ == GFC_OMP_ATOMIC_CAPTURE) - gfc_error ("Missing !$OMP END ATOMIC after !$OMP ATOMIC CAPTURE at %C"); - return st; - } -@@ -3682,9 +4028,60 @@ - case ST_OMP_SINGLE: - omp_end_st = ST_OMP_END_SINGLE; - break; -+ case ST_OMP_TARGET: -+ omp_end_st = ST_OMP_END_TARGET; -+ break; -+ case ST_OMP_TARGET_DATA: -+ omp_end_st = ST_OMP_END_TARGET_DATA; -+ break; -+ case ST_OMP_TARGET_TEAMS: -+ omp_end_st = ST_OMP_END_TARGET_TEAMS; -+ break; -+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE: -+ omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE; -+ break; -+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO; -+ break; -+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD; -+ break; -+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD: -+ omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_SIMD; -+ break; - case ST_OMP_TASK: - omp_end_st = ST_OMP_END_TASK; - break; -+ case ST_OMP_TASKGROUP: -+ omp_end_st = ST_OMP_END_TASKGROUP; -+ break; -+ case ST_OMP_TEAMS: -+ omp_end_st = ST_OMP_END_TEAMS; -+ break; -+ case ST_OMP_TEAMS_DISTRIBUTE: -+ omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE; -+ break; -+ case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO; -+ break; -+ case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD; -+ break; -+ case ST_OMP_TEAMS_DISTRIBUTE_SIMD: -+ omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE_SIMD; -+ break; -+ case ST_OMP_DISTRIBUTE: -+ omp_end_st = ST_OMP_END_DISTRIBUTE; -+ break; -+ case ST_OMP_DISTRIBUTE_PARALLEL_DO: -+ omp_end_st = ST_OMP_END_DISTRIBUTE_PARALLEL_DO; -+ break; -+ case ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD: -+ omp_end_st = ST_OMP_END_DISTRIBUTE_PARALLEL_DO_SIMD; -+ break; -+ case ST_OMP_DISTRIBUTE_SIMD: -+ omp_end_st = ST_OMP_END_DISTRIBUTE_SIMD; -+ break; - case ST_OMP_WORKSHARE: - omp_end_st = ST_OMP_END_WORKSHARE; - break; -@@ -3744,6 +4141,7 @@ - break; - - case ST_OMP_PARALLEL_DO: -+ case ST_OMP_PARALLEL_DO_SIMD: - st = parse_omp_do (st); - continue; - -@@ -3916,7 +4314,12 @@ - case ST_OMP_CRITICAL: - case ST_OMP_MASTER: - case ST_OMP_SINGLE: -+ case ST_OMP_TARGET: -+ case ST_OMP_TARGET_DATA: -+ case ST_OMP_TARGET_TEAMS: -+ case ST_OMP_TEAMS: - case ST_OMP_TASK: -+ case ST_OMP_TASKGROUP: - parse_omp_structured_block (st, false); - break; - -@@ -3925,8 +4328,23 @@ - parse_omp_structured_block (st, true); - break; - -+ case ST_OMP_DISTRIBUTE: -+ case ST_OMP_DISTRIBUTE_PARALLEL_DO: -+ case ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case ST_OMP_DISTRIBUTE_SIMD: - case ST_OMP_DO: -+ case ST_OMP_DO_SIMD: - case ST_OMP_PARALLEL_DO: -+ case ST_OMP_PARALLEL_DO_SIMD: -+ case ST_OMP_SIMD: -+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE: -+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD: -+ case ST_OMP_TEAMS_DISTRIBUTE: -+ case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO: -+ case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: -+ case ST_OMP_TEAMS_DISTRIBUTE_SIMD: - st = parse_omp_do (st); - if (st == ST_IMPLIED_ENDDO) - return st; -Index: gcc/ipa-devirt.c -=================================================================== ---- a/src/gcc/ipa-devirt.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/ipa-devirt.c (.../branches/gcc-4_9-branch) -@@ -987,6 +987,17 @@ - context->outer_type = expected_type; - context->offset = 0; - context->maybe_derived_type = true; -+ context->maybe_in_construction = true; -+ /* POD can be changed to an instance of a polymorphic type by -+ placement new. Here we play safe and assume that any -+ non-polymorphic type is POD. */ -+ if ((TREE_CODE (type) != RECORD_TYPE -+ || !TYPE_BINFO (type) -+ || !polymorphic_type_binfo_p (TYPE_BINFO (type))) -+ && (TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST -+ || (offset + tree_to_uhwi (TYPE_SIZE (expected_type)) <= -+ tree_to_uhwi (TYPE_SIZE (type))))) -+ return true; - return false; - } - -@@ -1438,6 +1449,8 @@ - { - if (completep) - *completep = false; -+ if (cache_token) -+ *cache_token = NULL; - if (nonconstruction_targetsp) - *nonconstruction_targetsp = 0; - return nodes; -@@ -1448,6 +1461,8 @@ - { - if (completep) - *completep = true; -+ if (cache_token) -+ *cache_token = NULL; - if (nonconstruction_targetsp) - *nonconstruction_targetsp = 0; - return nodes; -@@ -1461,6 +1476,8 @@ - { - if (completep) - *completep = false; -+ if (cache_token) -+ *cache_token = NULL; - if (nonconstruction_targetsp) - *nonconstruction_targetsp = 0; - return nodes; -Index: gcc/configure.ac -=================================================================== ---- a/src/gcc/configure.ac (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/configure.ac (.../branches/gcc-4_9-branch) -@@ -3725,7 +3725,7 @@ - .align 4 - smac %g2, %g3, %g1 - umac %g2, %g3, %g1 -- cas [[%g2]], %g3, %g1],, -+ casa [[%g2]] 0xb, %g3, %g1],, - [AC_DEFINE(HAVE_AS_LEON, 1, - [Define if your assembler supports LEON instructions.])]) - ;; -@@ -4806,6 +4806,21 @@ - [Define to the linker option to keep unused dependencies.]) - fi - -+AC_MSG_CHECKING(linker mapfile support for clearing hardware capabilities) -+saved_LDFLAGS="$LDFLAGS" -+for clearcap_map in sol2-clearcapv2.map sol2-clearcap.map; do -+ LDFLAGS="$saved_LDFLAGS -Wl,-M,${srcdir}/config/$clearcap_map" -+ AC_LINK_IFELSE([int main(void) {return 0;}], -+ [gcc_cv_ld_clearcap=yes; break], [gcc_cv_ld_clearcap=no]) -+done -+LDFLAGS="$saved_LDFLAGS" -+if test "x$gcc_cv_ld_clearcap" = xyes; then -+ AC_DEFINE([HAVE_LD_CLEARCAP], 1, -+[Define if the linker supports clearing hardware capabilities via mapfile.]) -+ AC_CONFIG_LINKS([clearcap.map:${srcdir}/config/$clearcap_map]) -+fi -+AC_MSG_RESULT($gcc_cv_ld_clearcap) -+ - case "$target:$tm_file" in - powerpc64-*-freebsd* | powerpc64*-*-linux* | powerpc*-*-linux*rs6000/biarch64.h*) - case "$target" in -Index: gcc/function.c -=================================================================== ---- a/src/gcc/function.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/function.c (.../branches/gcc-4_9-branch) -@@ -1347,9 +1347,13 @@ - #define STACK_POINTER_OFFSET 0 - #endif - -+#if defined (REG_PARM_STACK_SPACE) && !defined (INCOMING_REG_PARM_STACK_SPACE) -+#define INCOMING_REG_PARM_STACK_SPACE REG_PARM_STACK_SPACE -+#endif -+ - /* If not defined, pick an appropriate default for the offset of dynamically - allocated memory depending on the value of ACCUMULATE_OUTGOING_ARGS, -- REG_PARM_STACK_SPACE, and OUTGOING_REG_PARM_STACK_SPACE. */ -+ INCOMING_REG_PARM_STACK_SPACE, and OUTGOING_REG_PARM_STACK_SPACE. */ - - #ifndef STACK_DYNAMIC_OFFSET - -@@ -1361,12 +1365,12 @@ - `crtl->outgoing_args_size'. Nevertheless, we must allow - for it when allocating stack dynamic objects. */ - --#if defined(REG_PARM_STACK_SPACE) -+#ifdef INCOMING_REG_PARM_STACK_SPACE - #define STACK_DYNAMIC_OFFSET(FNDECL) \ - ((ACCUMULATE_OUTGOING_ARGS \ - ? (crtl->outgoing_args_size \ - + (OUTGOING_REG_PARM_STACK_SPACE ((!(FNDECL) ? NULL_TREE : TREE_TYPE (FNDECL))) ? 0 \ -- : REG_PARM_STACK_SPACE (FNDECL))) \ -+ : INCOMING_REG_PARM_STACK_SPACE (FNDECL))) \ - : 0) + (STACK_POINTER_OFFSET)) - #else - #define STACK_DYNAMIC_OFFSET(FNDECL) \ -@@ -2221,8 +2225,9 @@ - #endif - all->args_so_far = pack_cumulative_args (&all->args_so_far_v); - --#ifdef REG_PARM_STACK_SPACE -- all->reg_parm_stack_space = REG_PARM_STACK_SPACE (current_function_decl); -+#ifdef INCOMING_REG_PARM_STACK_SPACE -+ all->reg_parm_stack_space -+ = INCOMING_REG_PARM_STACK_SPACE (current_function_decl); - #endif - } - -@@ -4536,6 +4541,7 @@ - /* ??? This could be set on a per-function basis by the front-end - but is this worth the hassle? */ - cfun->can_throw_non_call_exceptions = flag_non_call_exceptions; -+ cfun->can_delete_dead_exceptions = flag_delete_dead_exceptions; - } - } - -Index: gcc/langhooks.c -=================================================================== ---- a/src/gcc/langhooks.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/langhooks.c (.../branches/gcc-4_9-branch) -@@ -515,6 +515,13 @@ - return build2 (MODIFY_EXPR, TREE_TYPE (dst), dst, src); - } - -+/* Finalize clause C. */ -+ -+void -+lhd_omp_finish_clause (tree, gimple_seq *) -+{ -+} -+ - /* Register language specific type size variables as potentially OpenMP - firstprivate variables. */ - -Index: gcc/langhooks.h -=================================================================== ---- a/src/gcc/langhooks.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/langhooks.h (.../branches/gcc-4_9-branch) -@@ -219,12 +219,16 @@ - /* Similarly, except use an assignment operator instead. */ - tree (*omp_clause_assign_op) (tree clause, tree dst, tree src); - -+ /* Build and return code for a constructor of DST that sets it to -+ SRC + ADD. */ -+ tree (*omp_clause_linear_ctor) (tree clause, tree dst, tree src, tree add); -+ - /* Build and return code destructing DECL. Return NULL if nothing - to be done. */ - tree (*omp_clause_dtor) (tree clause, tree decl); - - /* Do language specific checking on an implicitly determined clause. */ -- void (*omp_finish_clause) (tree clause); -+ void (*omp_finish_clause) (tree clause, gimple_seq *pre_p); - }; - - /* Language hooks related to LTO serialization. */ -Index: gcc/tree-vectorizer.h -=================================================================== ---- a/src/gcc/tree-vectorizer.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/tree-vectorizer.h (.../branches/gcc-4_9-branch) -@@ -1057,7 +1057,8 @@ - extern bool vect_prune_runtime_alias_test_list (loop_vec_info); - extern tree vect_check_gather (gimple, loop_vec_info, tree *, tree *, - int *); --extern bool vect_analyze_data_refs (loop_vec_info, bb_vec_info, int *); -+extern bool vect_analyze_data_refs (loop_vec_info, bb_vec_info, int *, -+ unsigned *); - extern tree vect_create_data_ref_ptr (gimple, tree, struct loop *, tree, - tree *, gimple_stmt_iterator *, - gimple *, bool, bool *); -@@ -1107,7 +1108,7 @@ - slp_instance, bool); - extern bool vect_schedule_slp (loop_vec_info, bb_vec_info); - extern void vect_update_slp_costs_according_to_vf (loop_vec_info); --extern bool vect_analyze_slp (loop_vec_info, bb_vec_info); -+extern bool vect_analyze_slp (loop_vec_info, bb_vec_info, unsigned); - extern bool vect_make_slp_decision (loop_vec_info); - extern void vect_detect_hybrid_slp (loop_vec_info); - extern void vect_get_slp_defs (vec<tree> , slp_tree, -Index: gcc/tree-vect-loop.c -=================================================================== ---- a/src/gcc/tree-vect-loop.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/tree-vect-loop.c (.../branches/gcc-4_9-branch) -@@ -1629,6 +1629,7 @@ - int max_vf = MAX_VECTORIZATION_FACTOR; - int min_vf = 2; - unsigned int th; -+ unsigned int n_stmts = 0; - - /* Find all data references in the loop (which correspond to vdefs/vuses) - and analyze their evolution in the loop. Also adjust the minimal -@@ -1637,7 +1638,7 @@ - FORNOW: Handle only simple, array references, which - alignment can be forced, and aligned pointer-references. */ - -- ok = vect_analyze_data_refs (loop_vinfo, NULL, &min_vf); -+ ok = vect_analyze_data_refs (loop_vinfo, NULL, &min_vf, &n_stmts); - if (!ok) - { - if (dump_enabled_p ()) -@@ -1747,7 +1748,7 @@ - } - - /* Check the SLP opportunities in the loop, analyze and build SLP trees. */ -- ok = vect_analyze_slp (loop_vinfo, NULL); -+ ok = vect_analyze_slp (loop_vinfo, NULL, n_stmts); - if (ok) - { - /* Decide which possible SLP instances to SLP. */ -@@ -3951,8 +3952,12 @@ - /* Set phi nodes arguments. */ - FOR_EACH_VEC_ELT (reduction_phis, i, phi) - { -- tree vec_init_def = vec_initial_defs[i]; -- tree def = vect_defs[i]; -+ tree vec_init_def, def; -+ gimple_seq stmts; -+ vec_init_def = force_gimple_operand (vec_initial_defs[i], &stmts, -+ true, NULL_TREE); -+ gsi_insert_seq_on_edge_immediate (loop_preheader_edge (loop), stmts); -+ def = vect_defs[i]; - for (j = 0; j < ncopies; j++) - { - /* Set the loop-entry arg of the reduction-phi. */ -Index: gcc/ipa.c -=================================================================== ---- a/src/gcc/ipa.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/ipa.c (.../branches/gcc-4_9-branch) -@@ -415,7 +415,18 @@ - || !DECL_EXTERNAL (e->callee->decl) - || e->callee->alias - || before_inlining_p)) -- pointer_set_insert (reachable, e->callee); -+ { -+ /* Be sure that we will not optimize out alias target -+ body. */ -+ if (DECL_EXTERNAL (e->callee->decl) -+ && e->callee->alias -+ && before_inlining_p) -+ { -+ pointer_set_insert (reachable, -+ cgraph_function_node (e->callee)); -+ } -+ pointer_set_insert (reachable, e->callee); -+ } - enqueue_node (e->callee, &first, reachable); - } - -@@ -506,6 +517,7 @@ - if (!node->in_other_partition) - node->local.local = false; - cgraph_node_remove_callees (node); -+ symtab_remove_from_same_comdat_group (node); - ipa_remove_all_references (&node->ref_list); - changed = true; - } -@@ -561,6 +573,8 @@ - vnode->analyzed = false; - vnode->aux = NULL; - -+ symtab_remove_from_same_comdat_group (vnode); -+ - /* Keep body if it may be useful for constant folding. */ - if ((init = ctor_for_folding (vnode->decl)) == error_mark_node) - varpool_remove_initializer (vnode); -@@ -697,6 +711,8 @@ - static bool - comdat_can_be_unshared_p_1 (symtab_node *node) - { -+ if (!node->externally_visible) -+ return true; - /* When address is taken, we don't know if equality comparison won't - break eventually. Exception are virutal functions, C++ - constructors/destructors and vtables, where this is not possible by -Index: gcc/tree-vect-data-refs.c -=================================================================== ---- a/src/gcc/tree-vect-data-refs.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/tree-vect-data-refs.c (.../branches/gcc-4_9-branch) -@@ -373,11 +373,14 @@ - .. = a[i+1]; - where we will end up loading { a[i], a[i+1] } once, make - sure that inserting group loads before the first load and -- stores after the last store will do the right thing. */ -- if ((STMT_VINFO_GROUPED_ACCESS (stmtinfo_a) -- && GROUP_SAME_DR_STMT (stmtinfo_a)) -- || (STMT_VINFO_GROUPED_ACCESS (stmtinfo_b) -- && GROUP_SAME_DR_STMT (stmtinfo_b))) -+ stores after the last store will do the right thing. -+ Similar for groups like -+ a[i] = ...; -+ ... = a[i]; -+ a[i+1] = ...; -+ where loads from the group interleave with the store. */ -+ if (STMT_VINFO_GROUPED_ACCESS (stmtinfo_a) -+ || STMT_VINFO_GROUPED_ACCESS (stmtinfo_b)) - { - gimple earlier_stmt; - earlier_stmt = get_earlier_stmt (DR_STMT (dra), DR_STMT (drb)); -@@ -3172,7 +3175,7 @@ - bool - vect_analyze_data_refs (loop_vec_info loop_vinfo, - bb_vec_info bb_vinfo, -- int *min_vf) -+ int *min_vf, unsigned *n_stmts) - { - struct loop *loop = NULL; - basic_block bb = NULL; -@@ -3207,6 +3210,9 @@ - for (gsi = gsi_start_bb (bbs[i]); !gsi_end_p (gsi); gsi_next (&gsi)) - { - gimple stmt = gsi_stmt (gsi); -+ if (is_gimple_debug (stmt)) -+ continue; -+ ++*n_stmts; - if (!find_data_references_in_stmt (loop, stmt, &datarefs)) - { - if (is_gimple_call (stmt) && loop->safelen) -@@ -3260,6 +3266,9 @@ - for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) - { - gimple stmt = gsi_stmt (gsi); -+ if (is_gimple_debug (stmt)) -+ continue; -+ ++*n_stmts; - if (!find_data_references_in_stmt (NULL, stmt, - &BB_VINFO_DATAREFS (bb_vinfo))) - { -Index: gcc/gimplify.c -=================================================================== ---- a/src/gcc/gimplify.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/gimplify.c (.../branches/gcc-4_9-branch) -@@ -138,6 +138,7 @@ - enum omp_clause_default_kind default_kind; - enum omp_region_type region_type; - bool combined_loop; -+ bool distribute; - }; - - static struct gimplify_ctx *gimplify_ctxp; -@@ -2169,7 +2170,7 @@ - Store any side-effects in PRE_P. CALL_LOCATION is the location of - the CALL_EXPR. */ - --static enum gimplify_status -+enum gimplify_status - gimplify_arg (tree *arg_p, gimple_seq *pre_p, location_t call_location) - { - bool (*test) (tree); -@@ -5642,6 +5643,7 @@ - n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl); - if (ctx->region_type == ORT_TARGET) - { -+ ret = lang_hooks.decls.omp_disregard_value_expr (decl, true); - if (n == NULL) - { - if (!lang_hooks.types.omp_mappable_type (TREE_TYPE (decl))) -@@ -5654,8 +5656,12 @@ - omp_add_variable (ctx, decl, GOVD_MAP | flags); - } - else -- n->value |= flags; -- ret = lang_hooks.decls.omp_disregard_value_expr (decl, true); -+ { -+ /* If nothing changed, there's nothing left to do. */ -+ if ((n->value & flags) == flags) -+ return ret; -+ n->value |= flags; -+ } - goto do_outer; - } - -@@ -5793,7 +5799,7 @@ - to the contrary in the innermost scope, generate an error. */ - - static bool --omp_is_private (struct gimplify_omp_ctx *ctx, tree decl, bool simd) -+omp_is_private (struct gimplify_omp_ctx *ctx, tree decl, int simd) - { - splay_tree_node n; - -@@ -5827,13 +5833,13 @@ - else if ((n->value & GOVD_REDUCTION) != 0) - error ("iteration variable %qE should not be reduction", - DECL_NAME (decl)); -- else if (simd && (n->value & GOVD_LASTPRIVATE) != 0) -+ else if (simd == 1 && (n->value & GOVD_LASTPRIVATE) != 0) - error ("iteration variable %qE should not be lastprivate", - DECL_NAME (decl)); - else if (simd && (n->value & GOVD_PRIVATE) != 0) - error ("iteration variable %qE should not be private", - DECL_NAME (decl)); -- else if (simd && (n->value & GOVD_LINEAR) != 0) -+ else if (simd == 2 && (n->value & GOVD_LINEAR) != 0) - error ("iteration variable %qE is predetermined linear", - DECL_NAME (decl)); - } -@@ -5941,14 +5947,21 @@ - goto do_add; - - case OMP_CLAUSE_MAP: -- if (OMP_CLAUSE_SIZE (c) -- && gimplify_expr (&OMP_CLAUSE_SIZE (c), pre_p, -- NULL, is_gimple_val, fb_rvalue) == GS_ERROR) -+ decl = OMP_CLAUSE_DECL (c); -+ if (error_operand_p (decl)) - { - remove = true; - break; - } -- decl = OMP_CLAUSE_DECL (c); -+ if (OMP_CLAUSE_SIZE (c) == NULL_TREE) -+ OMP_CLAUSE_SIZE (c) = DECL_P (decl) ? DECL_SIZE_UNIT (decl) -+ : TYPE_SIZE_UNIT (TREE_TYPE (decl)); -+ if (gimplify_expr (&OMP_CLAUSE_SIZE (c), pre_p, -+ NULL, is_gimple_val, fb_rvalue) == GS_ERROR) -+ { -+ remove = true; -+ break; -+ } - if (!DECL_P (decl)) - { - if (gimplify_expr (&OMP_CLAUSE_DECL (c), pre_p, -@@ -5986,15 +5999,17 @@ - - case OMP_CLAUSE_TO: - case OMP_CLAUSE_FROM: -- if (OMP_CLAUSE_SIZE (c) -- && gimplify_expr (&OMP_CLAUSE_SIZE (c), pre_p, -- NULL, is_gimple_val, fb_rvalue) == GS_ERROR) -+ decl = OMP_CLAUSE_DECL (c); -+ if (error_operand_p (decl)) - { - remove = true; - break; - } -- decl = OMP_CLAUSE_DECL (c); -- if (error_operand_p (decl)) -+ if (OMP_CLAUSE_SIZE (c) == NULL_TREE) -+ OMP_CLAUSE_SIZE (c) = DECL_P (decl) ? DECL_SIZE_UNIT (decl) -+ : TYPE_SIZE_UNIT (TREE_TYPE (decl)); -+ if (gimplify_expr (&OMP_CLAUSE_SIZE (c), pre_p, -+ NULL, is_gimple_val, fb_rvalue) == GS_ERROR) - { - remove = true; - break; -@@ -6066,6 +6081,27 @@ - - gimplify_omp_ctxp = outer_ctx; - } -+ else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR -+ && OMP_CLAUSE_LINEAR_STMT (c)) -+ { -+ gimplify_omp_ctxp = ctx; -+ push_gimplify_context (); -+ if (TREE_CODE (OMP_CLAUSE_LINEAR_STMT (c)) != BIND_EXPR) -+ { -+ tree bind = build3 (BIND_EXPR, void_type_node, NULL, -+ NULL, NULL); -+ TREE_SIDE_EFFECTS (bind) = 1; -+ BIND_EXPR_BODY (bind) = OMP_CLAUSE_LINEAR_STMT (c); -+ OMP_CLAUSE_LINEAR_STMT (c) = bind; -+ } -+ gimplify_and_add (OMP_CLAUSE_LINEAR_STMT (c), -+ &OMP_CLAUSE_LINEAR_GIMPLE_SEQ (c)); -+ pop_gimplify_context -+ (gimple_seq_first_stmt (OMP_CLAUSE_LINEAR_GIMPLE_SEQ (c))); -+ OMP_CLAUSE_LINEAR_STMT (c) = NULL_TREE; -+ -+ gimplify_omp_ctxp = outer_ctx; -+ } - if (notice_outer) - goto do_notice; - break; -@@ -6148,6 +6184,12 @@ - remove = true; - break; - } -+ if (gimplify_expr (&OMP_CLAUSE_ALIGNED_ALIGNMENT (c), pre_p, NULL, -+ is_gimple_val, fb_rvalue) == GS_ERROR) -+ { -+ remove = true; -+ break; -+ } - if (!is_global_var (decl) - && TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE) - omp_add_variable (ctx, decl, GOVD_ALIGNED); -@@ -6170,6 +6212,12 @@ - gimplify_omp_ctxp = ctx; - } - -+struct gimplify_adjust_omp_clauses_data -+{ -+ tree *list_p; -+ gimple_seq *pre_p; -+}; -+ - /* For all variables that were not actually used within the context, - remove PRIVATE, SHARED, and FIRSTPRIVATE clauses. */ - -@@ -6176,7 +6224,9 @@ - static int - gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data) - { -- tree *list_p = (tree *) data; -+ tree *list_p = ((struct gimplify_adjust_omp_clauses_data *) data)->list_p; -+ gimple_seq *pre_p -+ = ((struct gimplify_adjust_omp_clauses_data *) data)->pre_p; - tree decl = (tree) n->key; - unsigned flags = n->value; - enum omp_clause_code code; -@@ -6269,15 +6319,31 @@ - OMP_CLAUSE_CHAIN (nc) = OMP_CLAUSE_CHAIN (clause); - OMP_CLAUSE_CHAIN (clause) = nc; - } -+ else -+ OMP_CLAUSE_SIZE (clause) = DECL_SIZE_UNIT (decl); - } -+ if (code == OMP_CLAUSE_FIRSTPRIVATE && (flags & GOVD_LASTPRIVATE) != 0) -+ { -+ tree nc = build_omp_clause (input_location, OMP_CLAUSE_LASTPRIVATE); -+ OMP_CLAUSE_DECL (nc) = decl; -+ OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE (nc) = 1; -+ OMP_CLAUSE_CHAIN (nc) = *list_p; -+ OMP_CLAUSE_CHAIN (clause) = nc; -+ struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp; -+ gimplify_omp_ctxp = ctx->outer_context; -+ lang_hooks.decls.omp_finish_clause (nc, pre_p); -+ gimplify_omp_ctxp = ctx; -+ } - *list_p = clause; -- lang_hooks.decls.omp_finish_clause (clause); -- -+ struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp; -+ gimplify_omp_ctxp = ctx->outer_context; -+ lang_hooks.decls.omp_finish_clause (clause, pre_p); -+ gimplify_omp_ctxp = ctx; - return 0; - } - - static void --gimplify_adjust_omp_clauses (tree *list_p) -+gimplify_adjust_omp_clauses (gimple_seq *pre_p, tree *list_p) - { - struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp; - tree c, decl; -@@ -6311,10 +6377,10 @@ - if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR - && ctx->outer_context - && !(OMP_CLAUSE_LINEAR_NO_COPYIN (c) -- && OMP_CLAUSE_LINEAR_NO_COPYOUT (c)) -- && !is_global_var (decl)) -+ && OMP_CLAUSE_LINEAR_NO_COPYOUT (c))) - { -- if (ctx->outer_context->region_type == ORT_COMBINED_PARALLEL) -+ if (ctx->outer_context->combined_loop -+ && !OMP_CLAUSE_LINEAR_NO_COPYIN (c)) - { - n = splay_tree_lookup (ctx->outer_context->variables, - (splay_tree_key) decl); -@@ -6321,8 +6387,11 @@ - if (n == NULL - || (n->value & GOVD_DATA_SHARE_CLASS) == 0) - { -- int flags = OMP_CLAUSE_LINEAR_NO_COPYIN (c) -- ? GOVD_LASTPRIVATE : GOVD_SHARED; -+ int flags = GOVD_FIRSTPRIVATE; -+ /* #pragma omp distribute does not allow -+ lastprivate clause. */ -+ if (!ctx->outer_context->distribute) -+ flags |= GOVD_LASTPRIVATE; - if (n == NULL) - omp_add_variable (ctx->outer_context, decl, - flags | GOVD_SEEN); -@@ -6330,7 +6399,7 @@ - n->value |= flags | GOVD_SEEN; - } - } -- else -+ else if (!is_global_var (decl)) - omp_notice_variable (ctx->outer_context, decl, true); - } - } -@@ -6420,6 +6489,8 @@ - OMP_CLAUSE_CHAIN (c) = nc; - c = nc; - } -+ else if (OMP_CLAUSE_SIZE (c) == NULL_TREE) -+ OMP_CLAUSE_SIZE (c) = DECL_SIZE_UNIT (decl); - break; - - case OMP_CLAUSE_TO: -@@ -6444,6 +6515,8 @@ - OMP_CLAUSE_SIZE (c), true); - } - } -+ else if (OMP_CLAUSE_SIZE (c) == NULL_TREE) -+ OMP_CLAUSE_SIZE (c) = DECL_SIZE_UNIT (decl); - break; - - case OMP_CLAUSE_REDUCTION: -@@ -6479,7 +6552,10 @@ - } - - /* Add in any implicit data sharing. */ -- splay_tree_foreach (ctx->variables, gimplify_adjust_omp_clauses_1, list_p); -+ struct gimplify_adjust_omp_clauses_data data; -+ data.list_p = list_p; -+ data.pre_p = pre_p; -+ splay_tree_foreach (ctx->variables, gimplify_adjust_omp_clauses_1, &data); - - gimplify_omp_ctxp = ctx->outer_context; - delete_omp_context (ctx); -@@ -6510,7 +6586,7 @@ - else - pop_gimplify_context (NULL); - -- gimplify_adjust_omp_clauses (&OMP_PARALLEL_CLAUSES (expr)); -+ gimplify_adjust_omp_clauses (pre_p, &OMP_PARALLEL_CLAUSES (expr)); - - g = gimple_build_omp_parallel (body, - OMP_PARALLEL_CLAUSES (expr), -@@ -6546,7 +6622,7 @@ - else - pop_gimplify_context (NULL); - -- gimplify_adjust_omp_clauses (&OMP_TASK_CLAUSES (expr)); -+ gimplify_adjust_omp_clauses (pre_p, &OMP_TASK_CLAUSES (expr)); - - g = gimple_build_omp_task (body, - OMP_TASK_CLAUSES (expr), -@@ -6599,10 +6675,12 @@ - - orig_for_stmt = for_stmt = *expr_p; - -- simd = TREE_CODE (for_stmt) == OMP_SIMD -- || TREE_CODE (for_stmt) == CILK_SIMD; -+ simd = (TREE_CODE (for_stmt) == OMP_SIMD -+ || TREE_CODE (for_stmt) == CILK_SIMD); - gimplify_scan_omp_clauses (&OMP_FOR_CLAUSES (for_stmt), pre_p, - simd ? ORT_SIMD : ORT_WORKSHARE); -+ if (TREE_CODE (for_stmt) == OMP_DISTRIBUTE) -+ gimplify_omp_ctxp->distribute = true; - - /* Handle OMP_FOR_INIT. */ - for_pre_body = NULL; -@@ -6656,6 +6734,7 @@ - - /* Make sure the iteration variable is private. */ - tree c = NULL_TREE; -+ tree c2 = NULL_TREE; - if (orig_for_stmt != for_stmt) - /* Do this only on innermost construct for combined ones. */; - else if (simd) -@@ -6662,7 +6741,9 @@ - { - splay_tree_node n = splay_tree_lookup (gimplify_omp_ctxp->variables, - (splay_tree_key)decl); -- omp_is_private (gimplify_omp_ctxp, decl, simd); -+ omp_is_private (gimplify_omp_ctxp, decl, -+ 1 + (TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)) -+ != 1)); - if (n != NULL && (n->value & GOVD_DATA_SHARE_CLASS) != 0) - omp_notice_variable (gimplify_omp_ctxp, decl, true); - else if (TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)) == 1) -@@ -6683,18 +6764,44 @@ - bool lastprivate - = (!has_decl_expr - || !bitmap_bit_p (has_decl_expr, DECL_UID (decl))); -+ if (lastprivate -+ && gimplify_omp_ctxp->outer_context -+ && gimplify_omp_ctxp->outer_context->region_type -+ == ORT_WORKSHARE -+ && gimplify_omp_ctxp->outer_context->combined_loop -+ && !gimplify_omp_ctxp->outer_context->distribute) -+ { -+ struct gimplify_omp_ctx *outer -+ = gimplify_omp_ctxp->outer_context; -+ n = splay_tree_lookup (outer->variables, -+ (splay_tree_key) decl); -+ if (n != NULL -+ && (n->value & GOVD_DATA_SHARE_CLASS) == GOVD_LOCAL) -+ lastprivate = false; -+ else if (omp_check_private (outer, decl, false)) -+ error ("lastprivate variable %qE is private in outer " -+ "context", DECL_NAME (decl)); -+ else -+ { -+ omp_add_variable (outer, decl, -+ GOVD_LASTPRIVATE | GOVD_SEEN); -+ if (outer->outer_context) -+ omp_notice_variable (outer->outer_context, decl, true); -+ } -+ } - c = build_omp_clause (input_location, - lastprivate ? OMP_CLAUSE_LASTPRIVATE - : OMP_CLAUSE_PRIVATE); - OMP_CLAUSE_DECL (c) = decl; - OMP_CLAUSE_CHAIN (c) = OMP_FOR_CLAUSES (for_stmt); -+ OMP_FOR_CLAUSES (for_stmt) = c; - omp_add_variable (gimplify_omp_ctxp, decl, - (lastprivate ? GOVD_LASTPRIVATE : GOVD_PRIVATE) -- | GOVD_SEEN); -+ | GOVD_EXPLICIT | GOVD_SEEN); - c = NULL_TREE; - } - } -- else if (omp_is_private (gimplify_omp_ctxp, decl, simd)) -+ else if (omp_is_private (gimplify_omp_ctxp, decl, 0)) - omp_notice_variable (gimplify_omp_ctxp, decl, true); - else - omp_add_variable (gimplify_omp_ctxp, decl, GOVD_PRIVATE | GOVD_SEEN); -@@ -6701,10 +6808,13 @@ - - /* If DECL is not a gimple register, create a temporary variable to act - as an iteration counter. This is valid, since DECL cannot be -- modified in the body of the loop. */ -+ modified in the body of the loop. Similarly for any iteration vars -+ in simd with collapse > 1 where the iterator vars must be -+ lastprivate. */ - if (orig_for_stmt != for_stmt) - var = decl; -- else if (!is_gimple_reg (decl)) -+ else if (!is_gimple_reg (decl) -+ || (simd && TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)) > 1)) - { - var = create_tmp_var (TREE_TYPE (decl), get_name (decl)); - TREE_OPERAND (t, 0) = var; -@@ -6711,7 +6821,25 @@ - - gimplify_seq_add_stmt (&for_body, gimple_build_assign (decl, var)); - -- omp_add_variable (gimplify_omp_ctxp, var, GOVD_PRIVATE | GOVD_SEEN); -+ if (simd && TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)) == 1) -+ { -+ c2 = build_omp_clause (input_location, OMP_CLAUSE_LINEAR); -+ OMP_CLAUSE_LINEAR_NO_COPYIN (c2) = 1; -+ OMP_CLAUSE_LINEAR_NO_COPYOUT (c2) = 1; -+ OMP_CLAUSE_DECL (c2) = var; -+ OMP_CLAUSE_CHAIN (c2) = OMP_FOR_CLAUSES (for_stmt); -+ OMP_FOR_CLAUSES (for_stmt) = c2; -+ omp_add_variable (gimplify_omp_ctxp, var, -+ GOVD_LINEAR | GOVD_EXPLICIT | GOVD_SEEN); -+ if (c == NULL_TREE) -+ { -+ c = c2; -+ c2 = NULL_TREE; -+ } -+ } -+ else -+ omp_add_variable (gimplify_omp_ctxp, var, -+ GOVD_PRIVATE | GOVD_SEEN); - } - else - var = decl; -@@ -6739,8 +6867,8 @@ - case POSTINCREMENT_EXPR: - { - tree decl = TREE_OPERAND (t, 0); -- // c_omp_for_incr_canonicalize_ptr() should have been -- // called to massage things appropriately. -+ /* c_omp_for_incr_canonicalize_ptr() should have been -+ called to massage things appropriately. */ - gcc_assert (!POINTER_TYPE_P (TREE_TYPE (decl))); - - if (orig_for_stmt != for_stmt) -@@ -6756,6 +6884,9 @@ - - case PREDECREMENT_EXPR: - case POSTDECREMENT_EXPR: -+ /* c_omp_for_incr_canonicalize_ptr() should have been -+ called to massage things appropriately. */ -+ gcc_assert (!POINTER_TYPE_P (TREE_TYPE (decl))); - if (orig_for_stmt != for_stmt) - break; - t = build_int_cst (TREE_TYPE (decl), -1); -@@ -6796,12 +6927,16 @@ - ret = MIN (ret, tret); - if (c) - { -- OMP_CLAUSE_LINEAR_STEP (c) = TREE_OPERAND (t, 1); -+ tree step = TREE_OPERAND (t, 1); -+ tree stept = TREE_TYPE (decl); -+ if (POINTER_TYPE_P (stept)) -+ stept = sizetype; -+ step = fold_convert (stept, step); - if (TREE_CODE (t) == MINUS_EXPR) -+ step = fold_build1 (NEGATE_EXPR, stept, step); -+ OMP_CLAUSE_LINEAR_STEP (c) = step; -+ if (step != TREE_OPERAND (t, 1)) - { -- t = TREE_OPERAND (t, 1); -- OMP_CLAUSE_LINEAR_STEP (c) -- = fold_build1 (NEGATE_EXPR, TREE_TYPE (t), t); - tret = gimplify_expr (&OMP_CLAUSE_LINEAR_STEP (c), - &for_pre_body, NULL, - is_gimple_val, fb_rvalue); -@@ -6814,13 +6949,22 @@ - gcc_unreachable (); - } - -+ if (c2) -+ { -+ gcc_assert (c); -+ OMP_CLAUSE_LINEAR_STEP (c2) = OMP_CLAUSE_LINEAR_STEP (c); -+ } -+ - if ((var != decl || TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)) > 1) - && orig_for_stmt == for_stmt) - { - for (c = OMP_FOR_CLAUSES (for_stmt); c ; c = OMP_CLAUSE_CHAIN (c)) -- if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE -- && OMP_CLAUSE_DECL (c) == decl -- && OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c) == NULL) -+ if (((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE -+ && OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c) == NULL) -+ || (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR -+ && !OMP_CLAUSE_LINEAR_NO_COPYOUT (c) -+ && OMP_CLAUSE_LINEAR_GIMPLE_SEQ (c) == NULL)) -+ && OMP_CLAUSE_DECL (c) == decl) - { - t = TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i); - gcc_assert (TREE_CODE (t) == MODIFY_EXPR); -@@ -6832,8 +6976,12 @@ - gcc_assert (TREE_OPERAND (t, 0) == var); - t = build2 (TREE_CODE (t), TREE_TYPE (decl), decl, - TREE_OPERAND (t, 1)); -- gimplify_assign (decl, t, -- &OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c)); -+ gimple_seq *seq; -+ if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE) -+ seq = &OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c); -+ else -+ seq = &OMP_CLAUSE_LINEAR_GIMPLE_SEQ (c); -+ gimplify_assign (decl, t, seq); - } - } - } -@@ -6855,7 +7003,7 @@ - TREE_OPERAND (TREE_OPERAND (t, 1), 0) = var; - } - -- gimplify_adjust_omp_clauses (&OMP_FOR_CLAUSES (orig_for_stmt)); -+ gimplify_adjust_omp_clauses (pre_p, &OMP_FOR_CLAUSES (orig_for_stmt)); - - int kind; - switch (TREE_CODE (orig_for_stmt)) -@@ -6955,7 +7103,7 @@ - } - else - gimplify_and_add (OMP_BODY (expr), &body); -- gimplify_adjust_omp_clauses (&OMP_CLAUSES (expr)); -+ gimplify_adjust_omp_clauses (pre_p, &OMP_CLAUSES (expr)); - - switch (TREE_CODE (expr)) - { -@@ -6994,7 +7142,7 @@ - - gimplify_scan_omp_clauses (&OMP_TARGET_UPDATE_CLAUSES (expr), pre_p, - ORT_WORKSHARE); -- gimplify_adjust_omp_clauses (&OMP_TARGET_UPDATE_CLAUSES (expr)); -+ gimplify_adjust_omp_clauses (pre_p, &OMP_TARGET_UPDATE_CLAUSES (expr)); - stmt = gimple_build_omp_target (NULL, GF_OMP_TARGET_KIND_UPDATE, - OMP_TARGET_UPDATE_CLAUSES (expr)); - -Index: gcc/graphite-scop-detection.c -=================================================================== ---- a/src/gcc/graphite-scop-detection.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/graphite-scop-detection.c (.../branches/gcc-4_9-branch) -@@ -219,7 +219,14 @@ - - switch (TREE_CODE (scev)) - { -+ case NEGATE_EXPR: -+ case BIT_NOT_EXPR: -+ CASE_CONVERT: -+ case NON_LVALUE_EXPR: -+ return graphite_can_represent_scev (TREE_OPERAND (scev, 0)); -+ - case PLUS_EXPR: -+ case POINTER_PLUS_EXPR: - case MINUS_EXPR: - return graphite_can_represent_scev (TREE_OPERAND (scev, 0)) - && graphite_can_represent_scev (TREE_OPERAND (scev, 1)); -@@ -241,6 +248,7 @@ - if (!evolution_function_right_is_integer_cst (scev) - || !graphite_can_represent_init (scev)) - return false; -+ return graphite_can_represent_scev (CHREC_LEFT (scev)); - - default: - break; -@@ -247,7 +255,8 @@ - } - - /* Only affine functions can be represented. */ -- if (!scev_is_linear_expression (scev)) -+ if (tree_contains_chrecs (scev, NULL) -+ || !scev_is_linear_expression (scev)) - return false; - - return true; -@@ -465,8 +474,10 @@ - result.exits = false; - - /* Mark bbs terminating a SESE region difficult, if they start -- a condition. */ -- if (!single_succ_p (bb)) -+ a condition or if the block it exits to cannot be split -+ with make_forwarder_block. */ -+ if (!single_succ_p (bb) -+ || bb_has_abnormal_pred (single_succ (bb))) - result.difficult = true; - else - result.exit = single_succ (bb); -Index: gcc/lra-constraints.c -=================================================================== ---- a/src/gcc/lra-constraints.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/lra-constraints.c (.../branches/gcc-4_9-branch) -@@ -1231,6 +1231,8 @@ - } - } - -+static int valid_address_p (enum machine_mode mode, rtx addr, addr_space_t as); -+ - /* Make reloads for subreg in operand NOP with internal subreg mode - REG_MODE, add new reloads for further processing. Return true if - any reload was generated. */ -@@ -1261,12 +1263,28 @@ - equivalences in function lra_constraints) and because for spilled - pseudos we allocate stack memory enough for the biggest - corresponding paradoxical subreg. */ -- if ((MEM_P (reg) -- && (! SLOW_UNALIGNED_ACCESS (mode, MEM_ALIGN (reg)) -- || MEM_ALIGN (reg) >= GET_MODE_ALIGNMENT (mode))) -- || (REG_P (reg) && REGNO (reg) < FIRST_PSEUDO_REGISTER)) -+ if (MEM_P (reg) -+ && (! SLOW_UNALIGNED_ACCESS (mode, MEM_ALIGN (reg)) -+ || MEM_ALIGN (reg) >= GET_MODE_ALIGNMENT (mode))) - { -+ rtx subst, old = *curr_id->operand_loc[nop]; -+ - alter_subreg (curr_id->operand_loc[nop], false); -+ subst = *curr_id->operand_loc[nop]; -+ lra_assert (MEM_P (subst)); -+ if (! valid_address_p (GET_MODE (reg), XEXP (reg, 0), -+ MEM_ADDR_SPACE (reg)) -+ || valid_address_p (GET_MODE (subst), XEXP (subst, 0), -+ MEM_ADDR_SPACE (subst))) -+ return true; -+ /* If the address was valid and became invalid, prefer to reload -+ the memory. Typical case is when the index scale should -+ correspond the memory. */ -+ *curr_id->operand_loc[nop] = old; -+ } -+ else if (REG_P (reg) && REGNO (reg) < FIRST_PSEUDO_REGISTER) -+ { -+ alter_subreg (curr_id->operand_loc[nop], false); - return true; - } - /* Put constant into memory when we have mixed modes. It generates -@@ -2787,9 +2805,14 @@ - - Add reloads to the lists *BEFORE and *AFTER. We might need to add - reloads to *AFTER because of inc/dec, {pre, post} modify in the -- address. Return true for any RTL change. */ -+ address. Return true for any RTL change. -+ -+ The function is a helper function which does not produce all -+ transformations which can be necessary. It does just basic steps. -+ To do all necessary transformations use function -+ process_address. */ - static bool --process_address (int nop, rtx *before, rtx *after) -+process_address_1 (int nop, rtx *before, rtx *after) - { - struct address_info ad; - rtx new_reg; -@@ -2972,6 +2995,13 @@ - *ad.inner = simplify_gen_binary (PLUS, GET_MODE (new_reg), - new_reg, *ad.index); - } -+ else if (get_index_scale (&ad) == 1) -+ { -+ /* The last transformation to one reg will be made in -+ curr_insn_transform function. */ -+ end_sequence (); -+ return false; -+ } - else - { - /* base + scale * index => base + new_reg, -@@ -2989,6 +3019,18 @@ - return true; - } - -+/* Do address reloads until it is necessary. Use process_address_1 as -+ a helper function. Return true for any RTL changes. */ -+static bool -+process_address (int nop, rtx *before, rtx *after) -+{ -+ bool res = false; -+ -+ while (process_address_1 (nop, before, after)) -+ res = true; -+ return res; -+} -+ - /* Emit insns to reload VALUE into a new register. VALUE is an - auto-increment or auto-decrement RTX whose operand is a register or - memory location; so reloading involves incrementing that location. -@@ -3273,7 +3315,7 @@ - change_p = true; - lra_update_dup (curr_id, i); - } -- -+ - if (change_p) - /* If we've changed the instruction then any alternative that - we chose previously may no longer be valid. */ -Index: gcc/gimplify.h -=================================================================== ---- a/src/gcc/gimplify.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/gimplify.h (.../branches/gcc-4_9-branch) -@@ -77,6 +77,7 @@ - extern void gimplify_type_sizes (tree, gimple_seq *); - extern void gimplify_one_sizepos (tree *, gimple_seq *); - extern gimple gimplify_body (tree, bool); -+extern enum gimplify_status gimplify_arg (tree *, gimple_seq *, location_t); - extern void gimplify_function_tree (tree); - extern enum gimplify_status gimplify_va_arg_expr (tree *, gimple_seq *, - gimple_seq *); -Index: gcc/expmed.c -=================================================================== ---- a/src/gcc/expmed.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/expmed.c (.../branches/gcc-4_9-branch) -@@ -2141,9 +2141,12 @@ - optab lrotate_optab = rotl_optab; - optab rrotate_optab = rotr_optab; - enum machine_mode op1_mode; -+ enum machine_mode scalar_mode = mode; - int attempt; - bool speed = optimize_insn_for_speed_p (); - -+ if (VECTOR_MODE_P (mode)) -+ scalar_mode = GET_MODE_INNER (mode); - op1 = amount; - op1_mode = GET_MODE (op1); - -@@ -2166,9 +2169,9 @@ - { - if (CONST_INT_P (op1) - && ((unsigned HOST_WIDE_INT) INTVAL (op1) >= -- (unsigned HOST_WIDE_INT) GET_MODE_BITSIZE (mode))) -+ (unsigned HOST_WIDE_INT) GET_MODE_BITSIZE (scalar_mode))) - op1 = GEN_INT ((unsigned HOST_WIDE_INT) INTVAL (op1) -- % GET_MODE_BITSIZE (mode)); -+ % GET_MODE_BITSIZE (scalar_mode)); - else if (GET_CODE (op1) == SUBREG - && subreg_lowpart_p (op1) - && SCALAR_INT_MODE_P (GET_MODE (SUBREG_REG (op1))) -@@ -2182,10 +2185,10 @@ - amount instead. */ - if (rotate - && CONST_INT_P (op1) -- && IN_RANGE (INTVAL (op1), GET_MODE_BITSIZE (mode) / 2 + left, -- GET_MODE_BITSIZE (mode) - 1)) -+ && IN_RANGE (INTVAL (op1), GET_MODE_BITSIZE (scalar_mode) / 2 + left, -+ GET_MODE_BITSIZE (scalar_mode) - 1)) - { -- op1 = GEN_INT (GET_MODE_BITSIZE (mode) - INTVAL (op1)); -+ op1 = GEN_INT (GET_MODE_BITSIZE (scalar_mode) - INTVAL (op1)); - left = !left; - code = left ? LROTATE_EXPR : RROTATE_EXPR; - } -@@ -2198,7 +2201,7 @@ - if (code == LSHIFT_EXPR - && CONST_INT_P (op1) - && INTVAL (op1) > 0 -- && INTVAL (op1) < GET_MODE_PRECISION (mode) -+ && INTVAL (op1) < GET_MODE_PRECISION (scalar_mode) - && INTVAL (op1) < MAX_BITS_PER_WORD - && (shift_cost (speed, mode, INTVAL (op1)) - > INTVAL (op1) * add_cost (speed, mode)) -@@ -2253,7 +2256,7 @@ - if (op1 == const0_rtx) - return shifted; - else if (CONST_INT_P (op1)) -- other_amount = GEN_INT (GET_MODE_BITSIZE (mode) -+ other_amount = GEN_INT (GET_MODE_BITSIZE (scalar_mode) - - INTVAL (op1)); - else - { -@@ -2260,7 +2263,7 @@ - other_amount - = simplify_gen_unary (NEG, GET_MODE (op1), - op1, GET_MODE (op1)); -- HOST_WIDE_INT mask = GET_MODE_PRECISION (mode) - 1; -+ HOST_WIDE_INT mask = GET_MODE_PRECISION (scalar_mode) - 1; - other_amount - = simplify_gen_binary (AND, GET_MODE (op1), other_amount, - gen_int_mode (mask, GET_MODE (op1))); -Index: gcc/tree-dfa.c -=================================================================== ---- a/src/gcc/tree-dfa.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/tree-dfa.c (.../branches/gcc-4_9-branch) -@@ -343,7 +343,7 @@ - { - loc = htab_find_slot_with_hash (DEFAULT_DEFS (fn), &in, - DECL_UID (var), NO_INSERT); -- if (*loc) -+ if (loc) - { - SSA_NAME_IS_DEFAULT_DEF (*(tree *)loc) = false; - htab_clear_slot (DEFAULT_DEFS (fn), loc); -Index: gcc/cfgexpand.c -=================================================================== ---- a/src/gcc/cfgexpand.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/cfgexpand.c (.../branches/gcc-4_9-branch) -@@ -1013,10 +1013,19 @@ - if (data->asan_base == NULL) - data->asan_base = gen_reg_rtx (Pmode); - base = data->asan_base; -+ -+ if (!STRICT_ALIGNMENT) -+ base_align = crtl->max_used_stack_slot_alignment; -+ else -+ base_align = MAX (crtl->max_used_stack_slot_alignment, -+ GET_MODE_ALIGNMENT (SImode) -+ << ASAN_SHADOW_SHIFT); - } - else -- offset = alloc_stack_frame_space (stack_vars[i].size, alignb); -- base_align = crtl->max_used_stack_slot_alignment; -+ { -+ offset = alloc_stack_frame_space (stack_vars[i].size, alignb); -+ base_align = crtl->max_used_stack_slot_alignment; -+ } - } - else - { -@@ -1845,6 +1854,11 @@ - = alloc_stack_frame_space (redzonesz, ASAN_RED_ZONE_SIZE); - data.asan_vec.safe_push (prev_offset); - data.asan_vec.safe_push (offset); -+ /* Leave space for alignment if STRICT_ALIGNMENT. */ -+ if (STRICT_ALIGNMENT) -+ alloc_stack_frame_space ((GET_MODE_ALIGNMENT (SImode) -+ << ASAN_SHADOW_SHIFT) -+ / BITS_PER_UNIT, 1); - - var_end_seq - = asan_emit_stack_protection (virtual_stack_vars_rtx, -Index: gcc/lto/ChangeLog -=================================================================== ---- a/src/gcc/lto/ChangeLog (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/lto/ChangeLog (.../branches/gcc-4_9-branch) -@@ -1,3 +1,8 @@ -+2014-04-22 Jan Hubicka <hubicka@ucw.cz> -+ -+ PR lto/61012 -+ * lto-symtab.c (lto_symtab_merge_decls_1): -+ - 2014-04-22 Release Manager - - * GCC 4.9.0 released. -Index: gcc/lto/lto-symtab.c -=================================================================== ---- a/src/gcc/lto/lto-symtab.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/lto/lto-symtab.c (.../branches/gcc-4_9-branch) -@@ -453,7 +453,12 @@ - cgraph or a varpool node. */ - if (!prevailing) - { -- prevailing = first; -+ for (prevailing = first; -+ prevailing; prevailing = prevailing->next_sharing_asm_name) -+ if (lto_symtab_symbol_p (prevailing)) -+ break; -+ if (!prevailing) -+ return; - /* For variables chose with a priority variant with vnode - attached (i.e. from unit where external declaration of - variable is actually used). -Index: gcc/ipa-prop.c -=================================================================== ---- a/src/gcc/ipa-prop.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/ipa-prop.c (.../branches/gcc-4_9-branch) -@@ -2701,6 +2701,29 @@ - return cs; - } - -+/* Return the target to be used in cases of impossible devirtualization. IE -+ and target (the latter can be NULL) are dumped when dumping is enabled. */ -+ -+tree -+ipa_impossible_devirt_target (struct cgraph_edge *ie, tree target) -+{ -+ if (dump_file) -+ { -+ if (target) -+ fprintf (dump_file, -+ "Type inconsistent devirtualization: %s/%i->%s\n", -+ ie->caller->name (), ie->caller->order, -+ IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (target))); -+ else -+ fprintf (dump_file, -+ "No devirtualization target in %s/%i\n", -+ ie->caller->name (), ie->caller->order); -+ } -+ tree new_target = builtin_decl_implicit (BUILT_IN_UNREACHABLE); -+ cgraph_get_create_node (new_target); -+ return new_target; -+} -+ - /* Try to find a destination for indirect edge IE that corresponds to a virtual - call based on a formal parameter which is described by jump function JFUNC - and if it can be determined, make it direct and return the direct edge. -@@ -2735,15 +2758,7 @@ - && DECL_FUNCTION_CODE (target) == BUILT_IN_UNREACHABLE) - || !possible_polymorphic_call_target_p - (ie, cgraph_get_node (target))) -- { -- if (dump_file) -- fprintf (dump_file, -- "Type inconsident devirtualization: %s/%i->%s\n", -- ie->caller->name (), ie->caller->order, -- IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (target))); -- target = builtin_decl_implicit (BUILT_IN_UNREACHABLE); -- cgraph_get_create_node (target); -- } -+ target = ipa_impossible_devirt_target (ie, target); - return ipa_make_edge_direct_to_target (ie, target); - } - } -@@ -2773,10 +2788,7 @@ - if (targets.length () == 1) - target = targets[0]->decl; - else -- { -- target = builtin_decl_implicit (BUILT_IN_UNREACHABLE); -- cgraph_get_create_node (target); -- } -+ target = ipa_impossible_devirt_target (ie, NULL_TREE); - } - else - { -@@ -2791,10 +2803,8 @@ - - if (target) - { --#ifdef ENABLE_CHECKING -- gcc_assert (possible_polymorphic_call_target_p -- (ie, cgraph_get_node (target))); --#endif -+ if (!possible_polymorphic_call_target_p (ie, cgraph_get_node (target))) -+ target = ipa_impossible_devirt_target (ie, target); - return ipa_make_edge_direct_to_target (ie, target); - } - else -@@ -2877,8 +2887,10 @@ - else if (jfunc->type == IPA_JF_PASS_THROUGH - && ipa_get_jf_pass_through_operation (jfunc) == NOP_EXPR) - { -- if (ici->agg_contents -- && !ipa_get_jf_pass_through_agg_preserved (jfunc)) -+ if ((ici->agg_contents -+ && !ipa_get_jf_pass_through_agg_preserved (jfunc)) -+ || (ici->polymorphic -+ && !ipa_get_jf_pass_through_type_preserved (jfunc))) - ici->param_index = -1; - else - ici->param_index = ipa_get_jf_pass_through_formal_id (jfunc); -@@ -2885,8 +2897,10 @@ - } - else if (jfunc->type == IPA_JF_ANCESTOR) - { -- if (ici->agg_contents -- && !ipa_get_jf_ancestor_agg_preserved (jfunc)) -+ if ((ici->agg_contents -+ && !ipa_get_jf_ancestor_agg_preserved (jfunc)) -+ || (ici->polymorphic -+ && !ipa_get_jf_ancestor_type_preserved (jfunc))) - ici->param_index = -1; - else - { -@@ -3650,6 +3664,7 @@ - - TREE_TYPE (fndecl) = new_type; - DECL_VIRTUAL_P (fndecl) = 0; -+ DECL_LANG_SPECIFIC (fndecl) = NULL; - otypes.release (); - oparms.release (); - } -Index: gcc/ipa-prop.h -=================================================================== ---- a/src/gcc/ipa-prop.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/ipa-prop.h (.../branches/gcc-4_9-branch) -@@ -585,6 +585,7 @@ - struct cgraph_edge *ipa_make_edge_direct_to_target (struct cgraph_edge *, tree); - tree ipa_binfo_from_known_type_jfunc (struct ipa_jump_func *); - tree ipa_intraprocedural_devirtualization (gimple); -+tree ipa_impossible_devirt_target (struct cgraph_edge *, tree); - - /* Functions related to both. */ - void ipa_analyze_node (struct cgraph_node *); -Index: gcc/po/ChangeLog -=================================================================== ---- a/src/gcc/po/ChangeLog (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/po/ChangeLog (.../branches/gcc-4_9-branch) -@@ -1,3 +1,11 @@ -+2014-05-14 Joseph Myers <joseph@codesourcery.com> -+ -+ * zh_CN.po: Update. -+ -+2014-05-01 Joseph Myers <joseph@codesourcery.com> -+ -+ * sv.po: Update. -+ - 2014-04-22 Release Manager - - * GCC 4.9.0 released. -Index: gcc/po/sv.po -=================================================================== ---- a/src/gcc/po/sv.po (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/po/sv.po (.../branches/gcc-4_9-branch) -@@ -16,7 +16,7 @@ - "Project-Id-Version: gcc 4.9-b20140202\n" - "Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n" - "POT-Creation-Date: 2014-02-02 17:35+0000\n" --"PO-Revision-Date: 2014-03-30 20:23+0200\n" -+"PO-Revision-Date: 2014-04-11 20:56+0200\n" - "Last-Translator: Göran Uddeborg <goeran@uddeborg.se>\n" - "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n" - "Language: sv\n" -@@ -1493,7 +1493,7 @@ - - #: cif-code.def:125 - msgid "callee refers to comdat-local symbols" --msgstr "den anropade referarar till comdat-lokala symboler" -+msgstr "den anropade refererar till comdat-lokala symboler" - - #. The remainder are real diagnostic types. - #: diagnostic.def:33 -@@ -6065,7 +6065,7 @@ - - #: c-family/c.opt:653 - msgid "Warn about __TIME__, __DATE__ and __TIMESTAMP__ usage" --msgstr "Warn för använding av __TIME__, __DATE__ och __TIMESTAMP__" -+msgstr "Varna för användning av __TIME__, __DATE__ och __TIMESTAMP__" - - #: c-family/c.opt:657 - msgid "Warn if a property for an Objective-C object has no assign semantics specified" -@@ -12220,7 +12220,7 @@ - - #: common.opt:811 - msgid "Aggressively optimize loops using language constraints" --msgstr "Optimera aggresivt slingor med användning av sprÃ¥kbegränsningar" -+msgstr "Optimera aggressivt slingor med användning av sprÃ¥kbegränsningar" - - #: common.opt:815 - msgid "Align the start of functions" -@@ -13449,7 +13449,7 @@ - - #: common.opt:2332 - msgid "Enables the dynamic vectorizer cost model. Preserved for backward compatibility." --msgstr "Aktivera den dynamiska kostnadsmodellen för vekoriseraren. Bevarad för bakÃ¥tkompatibilitet." -+msgstr "Aktivera den dynamiska kostnadsmodellen för vektoriseraren. Bevarad för bakÃ¥tkompatibilitet." - - #: common.opt:2336 - msgid "Enables the unlimited vectorizer cost model. Preserved for backward compatibility." -@@ -19151,7 +19151,7 @@ - #: c/c-array-notation.c:721 cp/cp-array-notation.c:610 - #, gcc-internal-format - msgid "rank mismatch between %qE and %qE" --msgstr "ordingen stämmer inte mellan %qE och %qE" -+msgstr "ordningen stämmer inte mellan %qE och %qE" - - #. Here the original expression is printed as a "heads-up" - #. to the programmer. This is because since there is no -@@ -25782,7 +25782,7 @@ - msgid "too much stack space to dispose of: %d" - msgstr "för mycket stackutrymme att göra av med: %d" - --# Förmodligen en felstavning i orginalet, men tills jag vet säkert -+# Förmodligen en felstavning i originalet, men tills jag vet säkert - # behÃ¥ller jag den - #: config/v850/v850.c:2788 - #, gcc-internal-format, gfc-internal-format -@@ -28130,7 +28130,7 @@ - #: c/c-parser.c:6884 - #, gcc-internal-format - msgid "%<_Generic%> selector of type %qT is not compatible with any association" --msgstr "%<_Generic%>-väljare av typ %qT är inte kompatiblem med nÃ¥gon association" -+msgstr "%<_Generic%>-väljare av typ %qT är inte kompatibel med nÃ¥gon association" - - #: c/c-parser.c:7039 c/c-parser.c:7519 c/c-parser.c:7538 - #, gcc-internal-format -@@ -28185,7 +28185,7 @@ - #: c/c-parser.c:7505 cp/parser.c:5807 - #, gcc-internal-format - msgid "consecutive %<_Cilk_spawn%> keywords are not permitted" --msgstr "konsektiva %<_Cilk_spawn%>-nyckelord är inte tillÃ¥tet" -+msgstr "konsekutiva %<_Cilk_spawn%>-nyckelord är inte tillÃ¥tet" - - #: c/c-parser.c:7573 - #, gcc-internal-format -@@ -31055,7 +31055,7 @@ - #: cp/cp-array-notation.c:849 cp/cp-array-notation.c:855 - #, gcc-internal-format - msgid "rank mismatch with controlling expression of parent if-statement" --msgstr "ordingen stämmer inte med det styrande uttrycket i förälder-if-satsen" -+msgstr "ordningen stämmer inte med det styrande uttrycket i förälder-if-satsen" - - #: cp/cp-array-notation.c:1250 - #, gcc-internal-format -@@ -31090,7 +31090,7 @@ - #: cp/cp-array-notation.c:1422 - #, gcc-internal-format - msgid "array notation cannot be used with function type" --msgstr "vektornotation kan inte användas användas med en funktionstyp" -+msgstr "vektornotation kan inte användas med en funktionstyp" - - #: cp/cp-array-notation.c:1432 - #, gcc-internal-format -@@ -31100,7 +31100,7 @@ - #: cp/cp-array-notation.c:1438 - #, gcc-internal-format - msgid "rank of an array notation triplet%'s length is not zero" --msgstr "ordingen pÃ¥ en vektornotations trippels längd är inte noll" -+msgstr "ordningen pÃ¥ en vektornotations trippels längd är inte noll" - - #: cp/cp-array-notation.c:1443 - #, gcc-internal-format -@@ -31450,7 +31450,7 @@ - #: cp/cvt.c:1659 - #, gcc-internal-format - msgid "ambiguous default type conversion from %qT" --msgstr "tvetydig standartypkonvertering frÃ¥n %qT" -+msgstr "tvetydig standardtypkonvertering frÃ¥n %qT" - - #: cp/cvt.c:1661 - #, gcc-internal-format -@@ -33747,7 +33747,7 @@ - #: cp/decl.c:14531 cp/decl2.c:4673 - #, gcc-internal-format - msgid "use of %qD before deduction of %<auto%>" --msgstr "använding av %qD före härledning av %<auto%>" -+msgstr "användning av %qD före härledning av %<auto%>" - - #: cp/decl2.c:322 - #, gcc-internal-format -@@ -36027,7 +36027,7 @@ - #: cp/parser.c:14516 - #, gcc-internal-format - msgid "use of %<auto%> in parameter declaration only available with -std=c++1y or -std=gnu++1y" --msgstr "använding av %<auto%> i parameterdeklarationer är endast tillgängligt med -std=c++1y eller -std=gnu++1y" -+msgstr "användning av %<auto%> i parameterdeklarationer är endast tillgängligt med -std=c++1y eller -std=gnu++1y" - - #: cp/parser.c:14521 - #, gcc-internal-format -@@ -37288,7 +37288,7 @@ - #: cp/pt.c:4861 - #, gcc-internal-format - msgid "template arguments to %qD do not match original template %qD" --msgstr "mallargument till %qD stämmer inte med orginalmallen %qD" -+msgstr "mallargument till %qD stämmer inte med originalmallen %qD" - - #: cp/pt.c:4865 - #, gcc-internal-format -@@ -38326,7 +38326,7 @@ - #: cp/semantics.c:3800 - #, gcc-internal-format - msgid "second operand of %<offsetof%> is neither a single identifier nor a sequence of member accesses and array references" --msgstr "andra operanden till %<offsetof%> är varken en ensam idientifierare eller en sekvens av medlemsÃ¥tkomster och vektorreferenser" -+msgstr "andra operanden till %<offsetof%> är varken en ensam identifierare eller en sekvens av medlemsÃ¥tkomster och vektorreferenser" - - #: cp/semantics.c:3808 - #, gcc-internal-format -@@ -48120,7 +48120,7 @@ - #: fortran/resolve.c:13229 - #, gcc-internal-format, gfc-internal-format - msgid "Variable '%s' at %L with coarray component shall be a nonpointer, nonallocatable scalar, which is not a coarray" --msgstr "Variabeln â€%s†vid %L med co-vektorkomponent skall vara en skalär som inte är en pekare eller allokerbar och inte en co-vaktor" -+msgstr "Variabeln â€%s†vid %L med co-vektorkomponent skall vara en skalär som inte är en pekare eller allokerbar och inte en co-vektor" - - #: fortran/resolve.c:13244 - #, gcc-internal-format, gfc-internal-format -@@ -49576,12 +49576,12 @@ - #: lto/lto-symtab.c:404 - #, gcc-internal-format - msgid "type of %qD does not match original declaration" --msgstr "typen pÃ¥ %qD stämmer inte med orginaldeklarationen" -+msgstr "typen pÃ¥ %qD stämmer inte med originaldeklarationen" - - #: lto/lto-symtab.c:412 - #, gcc-internal-format - msgid "alignment of %qD is bigger than original declaration" --msgstr "justering av %qD är större än orginaldeklarationen" -+msgstr "justering av %qD är större än originaldeklarationen" - - #: lto/lto-symtab.c:418 lto/lto-symtab.c:517 - #, gcc-internal-format -Index: gcc/po/zh_CN.po -=================================================================== ---- a/src/gcc/po/zh_CN.po (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/po/zh_CN.po (.../branches/gcc-4_9-branch) -@@ -1,14 +1,14 @@ - # Simplified Chinese translation for gcc. - # Copyright (C) 2005 Free Software Foundation, Inc. - # This file is distributed under the same license as the gcc package. --# Meng Jie <zuxy.meng@gmail.com>, 2005-2011. -+# Meng Jie <zuxy.meng@gmail.com>, 2005-2014. - # - msgid "" - msgstr "" --"Project-Id-Version: gcc 4.6.0\n" -+"Project-Id-Version: gcc 4.9-b20140202\n" - "Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n" - "POT-Creation-Date: 2014-02-02 17:35+0000\n" --"PO-Revision-Date: 2011-05-19 15:04+0800\n" -+"PO-Revision-Date: 2014-05-14 14:25-0800\n" - "Last-Translator: Meng Jie <zuxy.meng@gmail.com>\n" - "Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n" - "Language: zh_CN\n" -@@ -38,7 +38,6 @@ - - #: collect2.c:1578 - #, fuzzy, c-format --#| msgid "collect2 version %s" - msgid "collect2 version %s\n" - msgstr "collect2 版本 %s" - -@@ -94,13 +93,11 @@ - - #: diagnostic.c:170 - #, fuzzy, c-format --#| msgid "%s: all warnings being treated as errors\n" - msgid "%s: all warnings being treated as errors" - msgstr "%s:所有的è¦å‘Šéƒ½è¢«å½“作是错误\n" - - #: diagnostic.c:175 - #, fuzzy, c-format --#| msgid "%s: some warnings being treated as errors\n" - msgid "%s: some warnings being treated as errors" - msgstr "%s:有些è¦å‘Šè¢«å½“作是错误\n" - -@@ -120,10 +117,6 @@ - - #: diagnostic.c:479 - #, fuzzy, c-format --#| msgid "" --#| "Please submit a full bug report,\n" --#| "with preprocessed source if appropriate.\n" --#| "See %s for instructions.\n" - msgid "" - "Please submit a full bug report,\n" - "with preprocessed source if appropriate.\n" -@@ -134,7 +127,6 @@ - - #: diagnostic.c:485 - #, fuzzy, c-format --#| msgid "Use fp double instructions" - msgid "See %s for instructions.\n" - msgstr "使用浮点åŒç²¾åº¦æŒ‡ä»¤" - -@@ -293,7 +285,6 @@ - - #: gcc.c:3073 - #, fuzzy --#| msgid " --help={target|optimizers|warnings|params|[^]{joined|separate|undocumented}}[,...]\n" - msgid " --help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...]\n" - msgstr " --help={target|optimizers|warnings|params|[^]{joined|separate|undocumented}}[,...]\n" - -@@ -339,9 +330,6 @@ - - #: gcc.c:3085 - #, fuzzy --#| msgid "" --#| " -print-multi-lib Display the mapping between command line options and\n" --#| " multiple library search directories\n" - msgid "" - " -print-multiarch Display the target's normalized GNU triplet, used as\n" - " a component in the library path\n" -@@ -461,13 +449,11 @@ - - #: gcc.c:3120 - #, fuzzy --#| msgid "Create a position independent executable" - msgid " -pie Create a position independent executable\n" - msgstr "生æˆä½ç½®æ— å…³å¯æ‰§è¡Œæ–‡ä»¶" - - #: gcc.c:3121 - #, fuzzy --#| msgid "Create a shared library" - msgid " -shared Create a shared library\n" - msgstr "生æˆä¸€ä¸ªå…±äº«åº“" - -@@ -497,7 +483,6 @@ - - #: gcc.c:5402 - #, fuzzy, c-format --#| msgid "Processing spec %c%s%c, which is '%s'\n" - msgid "Processing spec (%s), which is '%s'\n" - msgstr "å¤„ç† spec %c%s%c,å³â€˜%s’\n" - -@@ -613,9 +598,6 @@ - - #: gcov.c:472 - #, fuzzy, c-format --#| msgid "" --#| "Usage: gcov [OPTION]... SOURCEFILE...\n" --#| "\n" - msgid "" - "Usage: gcov [OPTION]... SOURCE|OBJ...\n" - "\n" -@@ -649,9 +631,6 @@ - - #: gcov.c:477 - #, fuzzy, c-format --#| msgid "" --#| " -c, --branch-counts Given counts of branches taken\n" --#| " rather than percentages\n" - msgid "" - " -c, --branch-counts Output counts of branches taken\n" - " rather than percentages\n" -@@ -701,7 +680,6 @@ - - #: gcov.c:488 - #, fuzzy, c-format --#| msgid " -a, --all-blocks Show information for every basic block\n" - msgid " -r, --relative-only Only show data for relative sources\n" - msgstr " -a, --all-blocks 显示æ¯ä¸ªåŸºæœ¬å—çš„ä¿¡æ¯\n" - -@@ -749,25 +727,21 @@ - - #: gcov.c:794 - #, fuzzy, c-format --#| msgid "%s:creating '%s'\n" - msgid "Creating '%s'\n" - msgstr "%s:æ£åœ¨åˆ›å»ºâ€˜%s’\n" - - #: gcov.c:797 - #, fuzzy, c-format --#| msgid "%s:error writing output file '%s'\n" - msgid "Error writing output file '%s'\n" - msgstr "%s:写入输出文件‘%s’时出错\n" - - #: gcov.c:801 - #, fuzzy, c-format --#| msgid "%s:could not open output file '%s'\n" - msgid "Could not open output file '%s'\n" - msgstr "%s:ä¸èƒ½æ‰“开输出文件‘%s’\n" - - #: gcov.c:806 - #, fuzzy, c-format --#| msgid "[Leaving %s]\n" - msgid "Removing '%s'\n" - msgstr "[离开 %s]\n" - -@@ -778,13 +752,11 @@ - - #: gcov.c:856 - #, fuzzy, c-format --#| msgid "%s: Cannot open output file: %s\n" - msgid "Cannot open intermediate output file %s\n" - msgstr "%sï¼šæ— æ³•æ‰“å¼€è¾“å‡ºæ–‡ä»¶ï¼š%s\n" - - #: gcov.c:1139 - #, fuzzy, c-format --#| msgid "%s:source file is newer than graph file '%s'\n" - msgid "%s:source file is newer than notes file '%s'\n" - msgstr "%s:æºæ–‡ä»¶è¾ƒå›¾æ–‡ä»¶â€˜%s’新\n" - -@@ -795,13 +767,11 @@ - - #: gcov.c:1169 - #, fuzzy, c-format --#| msgid "%s:cannot open source file\n" - msgid "%s:cannot open notes file\n" - msgstr "%sï¼šæ— æ³•æ‰“å¼€æºæ–‡ä»¶\n" - - #: gcov.c:1175 - #, fuzzy, c-format --#| msgid "%s:not a gcov data file\n" - msgid "%s:not a gcov notes file\n" - msgstr "%s:ä¸æ˜¯ä¸€ä¸ª gcov æ•°æ®æ–‡ä»¶\n" - -@@ -842,7 +812,6 @@ - - #: gcov.c:1417 - #, fuzzy, c-format --#| msgid "%s:stamp mismatch with graph file\n" - msgid "%s:stamp mismatch with notes file\n" - msgstr "%s:时间戳与图文件ä¸åŒ¹é…\n" - -@@ -958,7 +927,6 @@ - - #: gcov.c:2424 - #, fuzzy, c-format --#| msgid "%s:cannot open source file\n" - msgid "Cannot open source file %s\n" - msgstr "%sï¼šæ— æ³•æ‰“å¼€æºæ–‡ä»¶\n" - -@@ -1109,13 +1077,11 @@ - - #: langhooks.c:456 cp/error.c:3131 - #, fuzzy --#| msgid " inlined from %qs at %s:%d:%d" - msgid " inlined from %qs at %r%s:%d:%d%R" - msgstr " 内è”自%qs于 %s:%d:%d" - - #: langhooks.c:461 cp/error.c:3136 - #, fuzzy --#| msgid " inlined from %qs at %s:%d" - msgid " inlined from %qs at %r%s:%d%R" - msgstr " 内è”自%qs于 %s:%d" - -@@ -1419,7 +1385,6 @@ - - #: cif-code.def:43 - #, fuzzy --#| msgid "%qE is not initialized" - msgid "caller is not optimized" - msgstr "%qE未ç»åˆå§‹åŒ–" - -@@ -1437,7 +1402,6 @@ - - #: cif-code.def:60 - #, fuzzy --#| msgid "function body can be overwriten at linktime" - msgid "function body can be overwritten at link time" - msgstr "函数体å¯èƒ½åœ¨é“¾æŽ¥æ—¶è¢«æ”¹å†™" - -@@ -1499,7 +1463,6 @@ - - #: cif-code.def:113 - #, fuzzy --#| msgid "Enable exception handling" - msgid "non-call exception handling mismatch" - msgstr "å¯ç”¨å¼‚常处ç†" - -@@ -1602,7 +1565,6 @@ - - #: params.def:117 - #, fuzzy --#| msgid "Probability that COMDAT function will be shared with different compilatoin unit" - msgid "Probability that COMDAT function will be shared with different compilation unit" - msgstr "与其他编译å•å…ƒå…±äº« COMDAT 函数的概率" - -@@ -1632,7 +1594,6 @@ - - #: params.def:175 - #, fuzzy --#| msgid "The maximum number of instructions to consider to unroll in a loop" - msgid "The maximum number of backtrack attempts the scheduler should make when modulo scheduling a loop" - msgstr "å•ä¸ªå¾ªçŽ¯ä¸è€ƒè™‘展开的最大指令数" - -@@ -1719,7 +1680,6 @@ - - #: params.def:300 - #, fuzzy --#| msgid "The maximum number of iterations through CFG to extend regions" - msgid "The maximum number of branches on the path through the peeled sequence" - msgstr "通过 CFG 以扩展区域的最大循环次数" - -@@ -2152,7 +2112,6 @@ - - #: params.def:980 - #, fuzzy --#| msgid "Maximum number of times that an insn could be scheduled" - msgid "Maximum number of conditional store pairs that can be sunk" - msgstr "指定一æ¡æŒ‡ä»¤æœ€å¤šèƒ½è¢«è°ƒåº¦å‡ 次" - -@@ -2170,13 +2129,11 @@ - - #: params.def:1006 - #, fuzzy --#| msgid "Allow branches to be packed with other instructions" - msgid "Allow new data races on packed data loads to be introduced" - msgstr "å…许跳转与其他指令打包在一起" - - #: params.def:1011 - #, fuzzy --#| msgid "Allow branches to be packed with other instructions" - msgid "Allow new data races on packed data stores to be introduced" - msgstr "å…许跳转与其他指令打包在一起" - -@@ -2206,31 +2163,26 @@ - - #: params.def:1054 - #, fuzzy --#| msgid "Enable stack probing" - msgid "Enable asan stack protection" - msgstr "å¯ç”¨å †æ ˆæŽ¢æµ‹" - - #: params.def:1059 - #, fuzzy --#| msgid "Enable all optional instructions" - msgid "Enable asan globals protection" - msgstr "å¯ç”¨æ‰€æœ‰å¯é€‰æŒ‡ä»¤" - - #: params.def:1064 - #, fuzzy --#| msgid "Enable saturation instructions" - msgid "Enable asan store operations protection" - msgstr "å¯ç”¨é¥±å’ŒæŒ‡ä»¤" - - #: params.def:1069 - #, fuzzy --#| msgid "Enable all optional instructions" - msgid "Enable asan load operations protection" - msgstr "å¯ç”¨æ‰€æœ‰å¯é€‰æŒ‡ä»¤" - - #: params.def:1074 params.def:1079 - #, fuzzy --#| msgid "Enable saturation instructions" - msgid "Enable asan builtin functions protection" - msgstr "å¯ç”¨é¥±å’ŒæŒ‡ä»¤" - -@@ -2510,7 +2462,6 @@ - #: config/aarch64/aarch64.c:3487 config/arm/arm.c:21114 config/arm/arm.c:21127 - #: config/nios2/nios2.c:1885 - #, fuzzy, c-format --#| msgid "invalid operand for code '%c'" - msgid "Unsupported operand for code '%c'" - msgstr "代ç ‘%c’的æ“ä½œæ•°æ— æ•ˆ" - -@@ -2519,7 +2470,6 @@ - #: config/aarch64/aarch64.c:3551 config/aarch64/aarch64.c:3567 - #: config/aarch64/aarch64.c:3586 config/aarch64/aarch64.c:3625 - #, fuzzy, c-format --#| msgid "invalid operand for code '%c'" - msgid "invalid operand for '%%%c'" - msgstr "代ç ‘%c’的æ“ä½œæ•°æ— æ•ˆ" - -@@ -2535,19 +2485,16 @@ - - #: config/aarch64/aarch64.c:3724 - #, fuzzy, c-format --#| msgid "invalid insn:" - msgid "invalid constant" - msgstr "æ— æ•ˆæŒ‡ä»¤ï¼š" - - #: config/aarch64/aarch64.c:3727 - #, fuzzy, c-format --#| msgid "invalid %%d operand" - msgid "invalid operand" - msgstr "æ— æ•ˆçš„ %%d æ“作数" - - #: config/aarch64/aarch64.c:3815 - #, fuzzy, c-format --#| msgid "invalid operand code '%c'" - msgid "invalid operand prefix '%%%c'" - msgstr "æ— æ•ˆçš„æ“作数代ç ‘%c’" - -@@ -2637,19 +2584,16 @@ - - #: config/arc/arc.c:2782 - #, fuzzy, c-format --#| msgid "invalid operand to %%R code" - msgid "invalid operand to %%Z code" - msgstr "%%R 代ç çš„æ“ä½œæ•°æ— æ•ˆ" - - #: config/arc/arc.c:2790 - #, fuzzy, c-format --#| msgid "invalid operand to %%R code" - msgid "invalid operand to %%z code" - msgstr "%%R 代ç çš„æ“ä½œæ•°æ— æ•ˆ" - - #: config/arc/arc.c:2798 - #, fuzzy, c-format --#| msgid "invalid operand to %%R code" - msgid "invalid operand to %%M code" - msgstr "%%R 代ç çš„æ“ä½œæ•°æ— æ•ˆ" - -@@ -2675,7 +2619,6 @@ - - #: config/arc/arc.c:3099 - #, fuzzy, c-format --#| msgid "invalid operand to %%R code" - msgid "invalid operand to %%O code" - msgstr "%%R 代ç çš„æ“ä½œæ•°æ— æ•ˆ" - -@@ -2689,7 +2632,6 @@ - - #: config/arc/arc.c:4676 - #, fuzzy, c-format --#| msgid "invalid UNSPEC as operand" - msgid "invalid UNSPEC as operand: %d" - msgstr "æ— æ•ˆçš„ UNSPEC 用作æ“作数" - -@@ -2749,19 +2691,16 @@ - - #: config/avr/avr.c:2140 - #, fuzzy --#| msgid "output operand %d must use %<&%> constraint" - msgid "operands to %T/%t must be reg + const_int:" - msgstr "输出æ“作数 %d 必须使用%<&%>约æŸ" - - #: config/avr/avr.c:2180 config/avr/avr.c:2235 - #, fuzzy --#| msgid "bad address, not (reg+disp):" - msgid "bad address, not an I/O address:" - msgstr "地å€é”™è¯¯ï¼Œä¸æ˜¯(reg+disp):" - - #: config/avr/avr.c:2189 - #, fuzzy --#| msgid "bad address, not a constant):" - msgid "bad address, not a constant:" - msgstr "错误的地å€ï¼Œä¸æ˜¯ä¸€ä¸ªå¸¸é‡):" - -@@ -2813,7 +2752,6 @@ - - #: config/avr/avr.c:7100 - #, fuzzy --#| msgid "invalid types in fixed-point conversion" - msgid "unsupported fixed-point conversion" - msgstr "整点转æ¢ä¸ç±»åž‹æ— 效" - -@@ -3058,25 +2996,21 @@ - - #: config/i386/i386.c:14839 - #, fuzzy, c-format --#| msgid "invalid operand size for operand code '%c'" - msgid "invalid operand size for operand code 'O'" - msgstr "æ“作数代ç ‘%c’的æ“作数大å°æ— 效" - - #: config/i386/i386.c:14874 - #, fuzzy, c-format --#| msgid "invalid operand size for operand code '%c'" - msgid "invalid operand size for operand code 'z'" - msgstr "æ“作数代ç ‘%c’的æ“作数大å°æ— 效" - - #: config/i386/i386.c:14944 - #, fuzzy, c-format --#| msgid "invalid operand type used with operand code '%c'" - msgid "invalid operand type used with operand code 'Z'" - msgstr "æ“作数代ç ‘%c’的æ“ä½œæ•°ç±»åž‹æ— æ•ˆ" - - #: config/i386/i386.c:14949 - #, fuzzy, c-format --#| msgid "invalid operand size for operand code '%c'" - msgid "invalid operand size for operand code 'Z'" - msgstr "æ“作数代ç ‘%c’的æ“作数大å°æ— 效" - -@@ -3092,13 +3026,11 @@ - - #: config/i386/i386.c:15115 - #, fuzzy, c-format --#| msgid "operand is not a condition code, invalid operand code 'D'" - msgid "operand is not a condition code, invalid operand code '%c'" - msgstr "æ“作数ä¸æ˜¯ä¸€ä¸ªæ¡ä»¶ç ï¼Œæ— æ•ˆçš„æ“作数代ç ‘D’" - - #: config/i386/i386.c:15128 - #, fuzzy, c-format --#| msgid "operand is not a condition code, invalid operand code 'D'" - msgid "operand is not an offsettable memory reference, invalid operand code 'H'" - msgstr "æ“作数ä¸æ˜¯ä¸€ä¸ªæ¡ä»¶ç ï¼Œæ— æ•ˆçš„æ“作数代ç ‘D’" - -@@ -3127,7 +3059,6 @@ - - #: config/i386/i386-interix.h:78 - #, fuzzy --#| msgid "Use native (MS) bitfield layout" - msgid "Use gcc default bitfield layout" - msgstr "使用本地 (MS) ä½æ®µå˜å‚¨æ–¹å¼" - -@@ -3343,7 +3274,6 @@ - - #: config/msp430/msp430.c:2130 - #, fuzzy, c-format --#| msgid "invalid reference prefix" - msgid "invalid operand prefix" - msgstr "æ— æ•ˆçš„å¼•ç”¨å‰ç¼€" - -@@ -3404,7 +3334,6 @@ - - #: config/rs6000/rs6000.c:3363 - #, fuzzy --#| msgid "--resource requires -o" - msgid "-mquad-memory requires 64-bit mode" - msgstr "--resource éœ€è¦ -o" - -@@ -3414,7 +3343,6 @@ - - #: config/rs6000/rs6000.c:3378 - #, fuzzy --#| msgid "Generate code in little endian mode" - msgid "-mquad-memory is not available in little endian mode" - msgstr "生æˆå°ç«¯åœ¨å‰çš„代ç " - -@@ -3503,13 +3431,11 @@ - - #: config/rs6000/rs6000.c:32382 - #, fuzzy --#| msgid "Do not generate a single exit point for each function" - msgid "Could not generate addis value for fusion" - msgstr "ä¸ä¸ºæ¯ä¸ªå‡½æ•°ç”Ÿæˆå•ä¸€çš„退出点" - - #: config/rs6000/rs6000.c:32441 - #, fuzzy --#| msgid "unable to generate reloads for:" - msgid "Unable to generate load offset for fusion" - msgstr "æ— æ³•ç”Ÿæˆé‡æ–°è½½å…¥ï¼Œä¸ºï¼š" - -@@ -3638,13 +3564,11 @@ - #: config/sparc/sparc.c:8830 config/tilegx/tilegx.c:5061 - #: config/tilepro/tilepro.c:4516 - #, fuzzy, c-format --#| msgid "invalid %%P operand" - msgid "invalid %%C operand" - msgstr "æ— æ•ˆçš„ %%P æ“作数" - - #: config/sparc/sparc.c:8847 config/tilegx/tilegx.c:5094 - #, fuzzy, c-format --#| msgid "invalid %%P operand" - msgid "invalid %%D operand" - msgstr "æ— æ•ˆçš„ %%P æ“作数" - -@@ -3700,49 +3624,41 @@ - - #: config/tilegx/tilegx.c:5174 - #, fuzzy, c-format --#| msgid "invalid %%L code" - msgid "invalid %%H specifier" - msgstr "æ— æ•ˆ %%L 代ç " - - #: config/tilegx/tilegx.c:5216 config/tilepro/tilepro.c:4530 - #, fuzzy, c-format --#| msgid "invalid %%P operand" - msgid "invalid %%h operand" - msgstr "æ— æ•ˆçš„ %%P æ“作数" - - #: config/tilegx/tilegx.c:5228 config/tilepro/tilepro.c:4594 - #, fuzzy, c-format --#| msgid "invalid %%P operand" - msgid "invalid %%I operand" - msgstr "æ— æ•ˆçš„ %%P æ“作数" - - #: config/tilegx/tilegx.c:5242 config/tilepro/tilepro.c:4608 - #, fuzzy, c-format --#| msgid "invalid %%P operand" - msgid "invalid %%i operand" - msgstr "æ— æ•ˆçš„ %%P æ“作数" - - #: config/tilegx/tilegx.c:5265 config/tilepro/tilepro.c:4631 - #, fuzzy, c-format --#| msgid "invalid %%P operand" - msgid "invalid %%j operand" - msgstr "æ— æ•ˆçš„ %%P æ“作数" - - #: config/tilegx/tilegx.c:5296 - #, fuzzy, c-format --#| msgid "invalid %%c operand" - msgid "invalid %%%c operand" - msgstr "æ— æ•ˆçš„ %%c æ“作数" - - #: config/tilegx/tilegx.c:5311 config/tilepro/tilepro.c:4745 - #, fuzzy, c-format --#| msgid "invalid %%P operand" - msgid "invalid %%N operand" - msgstr "æ— æ•ˆçš„ %%P æ“作数" - - #: config/tilegx/tilegx.c:5355 - #, fuzzy, c-format --#| msgid "invalid operand for 'b' modifier" - msgid "invalid operand for 'r' specifier" - msgstr "‘b’修饰符的æ“ä½œæ•°æ— æ•ˆ" - -@@ -3753,37 +3669,31 @@ - - #: config/tilepro/tilepro.c:4566 - #, fuzzy, c-format --#| msgid "invalid %%P operand" - msgid "invalid %%H operand" - msgstr "æ— æ•ˆçš„ %%P æ“作数" - - #: config/tilepro/tilepro.c:4670 - #, fuzzy, c-format --#| msgid "invalid %%P operand" - msgid "invalid %%L operand" - msgstr "æ— æ•ˆçš„ %%P æ“作数" - - #: config/tilepro/tilepro.c:4730 - #, fuzzy, c-format --#| msgid "invalid %%P operand" - msgid "invalid %%M operand" - msgstr "æ— æ•ˆçš„ %%P æ“作数" - - #: config/tilepro/tilepro.c:4773 - #, fuzzy, c-format --#| msgid "invalid %%P operand" - msgid "invalid %%t operand" - msgstr "æ— æ•ˆçš„ %%P æ“作数" - - #: config/tilepro/tilepro.c:4780 - #, fuzzy, c-format --#| msgid "invalid %%P operand" - msgid "invalid %%t operand '" - msgstr "æ— æ•ˆçš„ %%P æ“作数" - - #: config/tilepro/tilepro.c:4801 - #, fuzzy, c-format --#| msgid "invalid %%P operand" - msgid "invalid %%r operand" - msgstr "æ— æ•ˆçš„ %%P æ“作数" - -@@ -4057,13 +3967,11 @@ - - #: cp/error.c:1060 - #, fuzzy --#| msgid "(anonymous)" - msgid "(anonymous namespace)" - msgstr "(匿å)" - - #: cp/error.c:1169 - #, fuzzy --#| msgid "<template parameter error>" - msgid "<template arguments error>" - msgstr "<模æ¿å‚数数错误>" - -@@ -4104,7 +4012,6 @@ - - #: cp/error.c:2616 - #, fuzzy --#| msgid "<lambda" - msgid "<lambda>" - msgstr "<lambda" - -@@ -4150,13 +4057,11 @@ - - #: cp/error.c:3196 - #, fuzzy, c-format --#| msgid "%s: In instantiation of %qs:\n" - msgid "%s: In substitution of %qS:\n" - msgstr "%s:在%qs的实例化ä¸ï¼š\n" - - #: cp/error.c:3197 - #, fuzzy --#| msgid "%s: In instantiation of %qs:\n" - msgid "%s: In instantiation of %q#D:\n" - msgstr "%s:在%qs的实例化ä¸ï¼š\n" - -@@ -4185,7 +4090,6 @@ - - #: cp/error.c:3240 - #, fuzzy --#| msgid "provided for %q+D" - msgid "required from %q#D\n" - msgstr "æ供给%q+D" - -@@ -4196,31 +4100,26 @@ - - #: cp/error.c:3248 - #, fuzzy --#| msgid "called from here" - msgid "required from here" - msgstr "从æ¤å¤„调用" - - #: cp/error.c:3300 - #, fuzzy --#| msgid "%s:%d:%d: [ skipping %d instantiation contexts ]\n" - msgid "%r%s:%d:%d:%R [ skipping %d instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ]\n" - msgstr "%s:%d:%d:[ 跳过 %d 个实例化上下文 ]\n" - - #: cp/error.c:3306 - #, fuzzy --#| msgid "%s:%d:%d: [ skipping %d instantiation contexts ]\n" - msgid "%r%s:%d:%R [ skipping %d instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ]\n" - msgstr "%s:%d:%d:[ 跳过 %d 个实例化上下文 ]\n" - - #: cp/error.c:3371 - #, fuzzy --#| msgid "%s:%d:%d: in constexpr expansion of %qs" - msgid "%r%s:%d:%d:%R in constexpr expansion of %qs" - msgstr "%s:%d:%d:在%qs的广义常表达å¼æ‰©å±•ä¸" - - #: cp/error.c:3375 - #, fuzzy --#| msgid "%s:%d: in constexpr expansion of %qs" - msgid "%r%s:%d:%R in constexpr expansion of %qs" - msgstr "%s:%d:在%qs的广义常表达å¼æ‰©å±•ä¸" - -@@ -4390,13 +4289,11 @@ - - #: fortran/error.c:899 - #, fuzzy --#| msgid "Obsolescent feature: Computed GOTO at %C" - msgid "Obsolescent feature:" - msgstr "已过时的特性:%C处的计算转移 GOTO è¯å¥" - - #: fortran/error.c:902 - #, fuzzy --#| msgid "expected operator" - msgid "Deleted feature:" - msgstr "需è¦æ“作符" - -@@ -4647,61 +4544,51 @@ - - #: fortran/resolve.c:2225 - #, fuzzy --#| msgid "no arguments" - msgid "allocatable argument" - msgstr "没有å‚æ•°" - - #: fortran/resolve.c:2230 - #, fuzzy --#| msgid "not enough arguments" - msgid "asynchronous argument" - msgstr "实å‚太少" - - #: fortran/resolve.c:2235 - #, fuzzy --#| msgid "invalid PHI argument" - msgid "optional argument" - msgstr "æ— æ•ˆçš„ PHI 实å‚" - - #: fortran/resolve.c:2240 - #, fuzzy --#| msgid "pointer assignment" - msgid "pointer argument" - msgstr "指针赋值" - - #: fortran/resolve.c:2245 - #, fuzzy --#| msgid "no arguments" - msgid "target argument" - msgstr "没有å‚æ•°" - - #: fortran/resolve.c:2250 - #, fuzzy --#| msgid "invalid PHI argument" - msgid "value argument" - msgstr "æ— æ•ˆçš„ PHI 实å‚" - - #: fortran/resolve.c:2255 - #, fuzzy --#| msgid "no arguments" - msgid "volatile argument" - msgstr "没有å‚æ•°" - - #: fortran/resolve.c:2260 - #, fuzzy --#| msgid "mismatched arguments" - msgid "assumed-shape argument" - msgstr "å‚æ•°ä¸åŒ¹é…" - - #: fortran/resolve.c:2265 - #, fuzzy --#| msgid "mismatched arguments" - msgid "assumed-rank argument" - msgstr "å‚æ•°ä¸åŒ¹é…" - - #: fortran/resolve.c:2270 - #, fuzzy --#| msgid "array assignment" - msgid "coarray argument" - msgstr "数组赋值" - -@@ -4711,7 +4598,6 @@ - - #: fortran/resolve.c:2280 - #, fuzzy --#| msgid "no arguments" - msgid "polymorphic argument" - msgstr "没有å‚æ•°" - -@@ -4723,7 +4609,6 @@ - #. See also TS 29113, Note 6.1. - #: fortran/resolve.c:2292 - #, fuzzy --#| msgid "mismatched arguments" - msgid "assumed-type argument" - msgstr "å‚æ•°ä¸åŒ¹é…" - -@@ -4738,13 +4623,11 @@ - - #: fortran/resolve.c:2315 - #, fuzzy --#| msgid "'%s' at %L must have constant character length in this context" - msgid "result with non-constant character length" - msgstr "å˜é‡â€˜%s’在%L处上下文ä¸å—符长度必须为常é‡" - - #: fortran/resolve.c:2327 - #, fuzzy --#| msgid "module procedure" - msgid "bind(c) procedure" - msgstr "模å—过程" - -@@ -4894,7 +4777,6 @@ - - #: fortran/trans-intrinsic.c:6165 - #, fuzzy, c-format --#| msgid "Argument NCOPIES of REPEAT intrinsic is negative (its value is %lld)" - msgid "Argument NCOPIES of REPEAT intrinsic is negative (its value is %ld)" - msgstr "内建函数 REPEAT çš„ NCOPIES å‚数为负(其值是 %lld)" - -@@ -4964,7 +4846,6 @@ - - #: go/go-backend.c:171 - #, fuzzy --#| msgid "Memory allocation failed" - msgid "memory allocation failed while reading export data" - msgstr "内å˜åˆ†é…失败" - -@@ -5230,13 +5111,11 @@ - - #: ada/gcc-interface/lang-specs.h:52 - #, fuzzy --#| msgid "-c or -S required for Ada" - msgid "-c required for gnat2why" - msgstr "Ada 需è¦æŒ‡å®š -c 或 -S" - - #: ada/gcc-interface/lang-specs.h:65 - #, fuzzy --#| msgid "-c or -S required for Ada" - msgid "-c required for gnat2scil" - msgstr "Ada 需è¦æŒ‡å®š -c 或 -S" - -@@ -5266,7 +5145,6 @@ - - #: config/avr/avr.h:526 - #, fuzzy --#| msgid "-fpic is not supported" - msgid "shared is not supported" - msgstr "ä¸æ”¯æŒ -fpic" - -@@ -5284,7 +5162,6 @@ - - #: config/rx/rx.h:76 - #, fuzzy --#| msgid "rx200 cpu does not have FPU hardware" - msgid "rx100 cpu does not have FPU hardware" - msgstr "RX200 CPU 没有 FPU 硬件" - -@@ -5306,7 +5183,6 @@ - - #: config/rs6000/freebsd64.h:161 config/rs6000/freebsd64.h:173 - #, fuzzy --#| msgid "consider using `-pg' instead of `-p' with gprof(1) " - msgid "consider using `-pg' instead of `-p' with gprof(1)" - msgstr "与 gprof(1) 一起使用时请考虑使用‘-pg’以代替‘-p’" - -@@ -5321,7 +5197,6 @@ - - #: gcc.c:731 - #, fuzzy --#| msgid "-fdirectives-only is incompatible with -traditional" - msgid "-fsanitize=address is incompatible with -fsanitize=thread" - msgstr "-fdirectives-only 与 -traditional ä¸å…¼å®¹" - -@@ -5339,7 +5214,6 @@ - - #: config/arm/arm.h:217 - #, fuzzy --#| msgid "-msoft-float and -mhard_float may not be used together" - msgid "-mfloat-abi=soft and -mfloat-abi=hard may not be used together" - msgstr "-msoft-float å’Œ -mhard_float ä¸èƒ½ä¸€èµ·ä½¿ç”¨" - -@@ -5410,7 +5284,6 @@ - - #: fortran/lang.opt:242 - #, fuzzy --#| msgid "Warn about implicit function declarations" - msgid "Warn about function call elimination" - msgstr "对éšå¼å‡½æ•°å£°æ˜Žç»™å‡ºè¦å‘Š" - -@@ -5436,13 +5309,11 @@ - - #: fortran/lang.opt:270 - #, fuzzy --#| msgid "Warn when a register variable is declared volatile" - msgid "Warn when a left-hand-side array variable is reallocated" - msgstr "当一个寄å˜å™¨å˜é‡è¢«å£°æ˜Žä¸º volatile 时给出è¦å‘Š" - - #: fortran/lang.opt:274 - #, fuzzy --#| msgid "Warn when a register variable is declared volatile" - msgid "Warn when a left-hand-side variable is reallocated" - msgstr "当一个寄å˜å™¨å˜é‡è¢«å£°æ˜Žä¸º volatile 时给出è¦å‘Š" - -@@ -5473,7 +5344,6 @@ - - #: fortran/lang.opt:306 - #, fuzzy --#| msgid "Warn about zero-length formats" - msgid "Warn about zero-trip DO loops" - msgstr "对长度为 0 çš„æ ¼å¼å—符串给出è¦å‘Š" - -@@ -5616,7 +5486,6 @@ - - #: fortran/lang.opt:458 - #, fuzzy --#| msgid "-ffpe-trap=[...]\tStop on following floating point exceptions" - msgid "-ffpe-summary=[...]\tPrint summary of floating point exceptions" - msgstr "-ffpe-trap=[...]\t在以下浮点异常的情况下åœæ¢" - -@@ -5634,7 +5503,6 @@ - - #: fortran/lang.opt:474 - #, fuzzy --#| msgid "Enable linker optimizations" - msgid "Enable front end optimization" - msgstr "å¯ç”¨é“¾æŽ¥å™¨ä¼˜åŒ–" - -@@ -5784,7 +5652,6 @@ - - #: fortran/lang.opt:670 - #, fuzzy --#| msgid "Conform to the ISO Fortran 2008 standard" - msgid "Conform to the ISO Fortran 2008 standard including TS 29113" - msgstr "éµå¾ª ISO Fortran 2008 æ ‡å‡†" - -@@ -5937,13 +5804,11 @@ - - #: c-family/c.opt:296 - #, fuzzy --#| msgid "Deprecated in favor of -std=c99" - msgid "Deprecated in favor of -Wc++11-compat" - msgstr "ä¸å»ºè®®ä½¿ç”¨ï¼Œè¯·æ”¹ç”¨ -std=c99" - - #: c-family/c.opt:300 - #, fuzzy --#| msgid "Warn about C++ constructs whose meaning differs between ISO C++ 1998 and ISO C++ 200x" - msgid "Warn about C++ constructs whose meaning differs between ISO C++ 1998 and ISO C++ 2011" - msgstr "当 C++ æž„é€ çš„æ„义在 ISO C++ 1998 å’Œ ISO C++ 200x ä¸ä¸åŒæ—¶ç»™å‡ºè¦å‘Š" - -@@ -5989,13 +5854,11 @@ - - #: c-family/c.opt:344 - #, fuzzy --#| msgid "dereferencing pointer to incomplete type" - msgid "Warn when deleting a pointer to incomplete type" - msgstr "æ领指å‘ä¸å®Œå…¨ç±»åž‹çš„指针" - - #: c-family/c.opt:348 - #, fuzzy --#| msgid "Warn about non-virtual destructors" - msgid "Warn about deleting polymorphic objects with non-virtual destructors" - msgstr "当æžæž„函数ä¸æ˜¯è™šå‡½æ•°æ—¶ç»™å‡ºè¦å‘Š" - -@@ -6029,7 +5892,6 @@ - - #: c-family/c.opt:392 - #, fuzzy --#| msgid "Warn for implicit type conversions that may change a value" - msgid "Warn for implicit type conversions that cause loss of floating point precision" - msgstr "当éšå¼ç±»åž‹è½¬æ¢å¯èƒ½æ”¹å˜å€¼æ—¶ç»™å‡ºè¦å‘Š" - -@@ -6286,7 +6148,6 @@ - - #: c-family/c.opt:673 - #, fuzzy --#| msgid "returning reference to temporary" - msgid "Warn about returning a pointer/reference to a local or temporary variable." - msgstr "返回临时å˜é‡çš„引用" - -@@ -6364,7 +6225,6 @@ - - #: c-family/c.opt:777 - #, fuzzy --#| msgid "Warn about macros defined in the main file that are not used" - msgid "Warn when typedefs locally defined in a function are not used" - msgstr "当定义在主文件ä¸çš„å®æœªè¢«ä½¿ç”¨æ—¶ç»™å‡ºè¦å‘Š" - -@@ -6378,7 +6238,6 @@ - - #: c-family/c.opt:789 - #, fuzzy --#| msgid "Do not warn about using variadic macros when -pedantic" - msgid "Warn about using variadic macros" - msgstr "指定 -pedantic æ—¶ä¸ä¸ºå¯å˜å‚æ•°å®ç»™å‡ºè¦å‘Š" - -@@ -6404,13 +6263,11 @@ - - #: c-family/c.opt:813 - #, fuzzy --#| msgid "Warn when a label is unused" - msgid "Warn when a literal '0' is used as null pointer" - msgstr "æœ‰æœªä½¿ç”¨çš„æ ‡å·æ—¶è¦å‘Š" - - #: c-family/c.opt:817 - #, fuzzy --#| msgid "Warn about misuses of pragmas" - msgid "Warn about useless casts" - msgstr "对错误使用的 pragma åŠ ä»¥è¦å‘Š" - -@@ -6467,25 +6324,21 @@ - - #: c-family/c.opt:883 - #, fuzzy --#| msgid "-ftemplate-depth=<number>\tSpecify maximum template instantiation depth" - msgid "-fconstexpr-depth=<number>\tSpecify maximum constexpr recursion depth" - msgstr "-ftemplate-depth=<N>\t指定模æ¿å®žä¾‹åŒ–的最大深度" - - #: c-family/c.opt:887 - #, fuzzy --#| msgid "Enable traditional preprocessing" - msgid "Emit debug annotations during preprocessing" - msgstr "å¯ç”¨ä¼ 统预处ç†" - - #: c-family/c.opt:891 - #, fuzzy --#| msgid "-fno-deduce-init-list\tdisable deduction of std::initializer_list for a template type parameter from a brace-enclosed initializer-list" - msgid "-fdeduce-init-list\tenable deduction of std::initializer_list for a template type parameter from a brace-enclosed initializer-list" - msgstr "-fno-deduce-init-list\tç¦ç”¨ä¸ºæ¨¡æ¿ç±»åž‹å‚数从花括å·ä¸çš„åˆå§‹å€¼è®¾å®šåˆ—表演绎 std::initializer_list" - - #: c-family/c.opt:895 - #, fuzzy --#| msgid "Warn when all constructors and destructors are private" - msgid "Factor complex constructors and destructors to favor space over speed" - msgstr "å½“æ‰€æœ‰æž„é€ å‡½æ•°å’Œæžæž„函数都是ç§æœ‰æ—¶ç»™å‡ºè¦å‘Š" - -@@ -6632,7 +6485,6 @@ - - #: c-family/c.opt:1090 - #, fuzzy --#| msgid "Unclassifiable OpenMP directive at %C" - msgid "Enable OpenMP's SIMD directives" - msgstr "%C处的 OpenMP æŒ‡ç¤ºæ— æ³•åˆ†ç±»" - -@@ -6710,7 +6562,6 @@ - - #: c-family/c.opt:1183 - #, fuzzy --#| msgid "The maximum number of peelings of a single loop" - msgid "Set the maximum number of template instantiation notes for a single warning or error" - msgstr "å•ä¸ªå¾ªçŽ¯æœ€å¤§çš„剥离数" - -@@ -6740,7 +6591,6 @@ - - #: c-family/c.opt:1217 - #, fuzzy --#| msgid "Marks all inlined methods as having hidden visibility" - msgid "Marks all inlined functions and methods as having hidden visibility" - msgstr "将所有内è”å‡½æ•°æ ‡è®°ä¸ºå…·æœ‰éšè—çš„å¯è§æ€§" - -@@ -6842,37 +6692,31 @@ - - #: c-family/c.opt:1344 c-family/c.opt:1348 - #, fuzzy --#| msgid "Conform to the ISO 1998 C++ standard with GNU extensions" - msgid "Conform to the ISO 1998 C++ standard revised by the 2003 technical corrigendum" - msgstr "éµå¾ª ISO 1998 C++ æ ‡å‡†ï¼Œä¹Ÿæ”¯æŒ GNU 扩展" - - #: c-family/c.opt:1352 - #, fuzzy --#| msgid "Conform to the ISO 201X C standard draft (experimental and incomplete support)" - msgid "Conform to the ISO 2011 C++ standard (experimental and incomplete support)" - msgstr "éµå¾ª ISO 201X C æ ‡å‡†è‰æ¡ˆ(试验性质的ä¸å®Œå…¨æ”¯æŒ)" - - #: c-family/c.opt:1356 - #, fuzzy --#| msgid "Deprecated in favor of -std=c99" - msgid "Deprecated in favor of -std=c++11" - msgstr "ä¸å»ºè®®ä½¿ç”¨ï¼Œè¯·æ”¹ç”¨ -std=c99" - - #: c-family/c.opt:1360 - #, fuzzy --#| msgid "Conform to the ISO 201X C standard draft (experimental and incomplete support)" - msgid "Conform to the ISO 201y(7?) C++ draft standard (experimental and incomplete support)" - msgstr "éµå¾ª ISO 201X C æ ‡å‡†è‰æ¡ˆ(试验性质的ä¸å®Œå…¨æ”¯æŒ)" - - #: c-family/c.opt:1364 c-family/c.opt:1450 - #, fuzzy --#| msgid "Conform to the ISO 201X C standard draft (experimental and incomplete support)" - msgid "Conform to the ISO 2011 C standard (experimental and incomplete support)" - msgstr "éµå¾ª ISO 201X C æ ‡å‡†è‰æ¡ˆ(试验性质的ä¸å®Œå…¨æ”¯æŒ)" - - #: c-family/c.opt:1368 - #, fuzzy --#| msgid "Deprecated in favor of -std=c99" - msgid "Deprecated in favor of -std=c11" - msgstr "ä¸å»ºè®®ä½¿ç”¨ï¼Œè¯·æ”¹ç”¨ -std=c99" - -@@ -6890,37 +6734,31 @@ - - #: c-family/c.opt:1388 c-family/c.opt:1393 - #, fuzzy --#| msgid "Conform to the ISO 1998 C++ standard with GNU extensions" - msgid "Conform to the ISO 1998 C++ standard revised by the 2003 technical" - msgstr "éµå¾ª ISO 1998 C++ æ ‡å‡†ï¼Œä¹Ÿæ”¯æŒ GNU 扩展" - - #: c-family/c.opt:1398 - #, fuzzy --#| msgid "Conform to the ISO 201X C standard draft with GNU extensions (experimental and incomplete support)" - msgid "Conform to the ISO 2011 C++ standard with GNU extensions (experimental and incomplete support)" - msgstr "éµå¾ª ISO 201X C æ ‡å‡†è‰æ¡ˆå’Œ GNU 扩展(试验性质的ä¸å®Œå…¨æ”¯æŒ)" - - #: c-family/c.opt:1402 - #, fuzzy --#| msgid "Deprecated in favor of -std=gnu99" - msgid "Deprecated in favor of -std=gnu++11" - msgstr "ä¸å»ºè®®ä½¿ç”¨ï¼Œè¯·æ”¹ç”¨ -std=gnu99" - - #: c-family/c.opt:1406 - #, fuzzy --#| msgid "Conform to the ISO 201X C standard draft with GNU extensions (experimental and incomplete support)" - msgid "Conform to the ISO 201y(7?) C++ draft standard with GNU extensions (experimental and incomplete support)" - msgstr "éµå¾ª ISO 201X C æ ‡å‡†è‰æ¡ˆå’Œ GNU 扩展(试验性质的ä¸å®Œå…¨æ”¯æŒ)" - - #: c-family/c.opt:1410 - #, fuzzy --#| msgid "Conform to the ISO 201X C standard draft with GNU extensions (experimental and incomplete support)" - msgid "Conform to the ISO 2011 C standard with GNU extensions (experimental and incomplete support)" - msgstr "éµå¾ª ISO 201X C æ ‡å‡†è‰æ¡ˆå’Œ GNU 扩展(试验性质的ä¸å®Œå…¨æ”¯æŒ)" - - #: c-family/c.opt:1414 - #, fuzzy --#| msgid "Deprecated in favor of -std=gnu99" - msgid "Deprecated in favor of -std=gnu11" - msgstr "ä¸å»ºè®®ä½¿ç”¨ï¼Œè¯·æ”¹ç”¨ -std=gnu99" - -@@ -6958,7 +6796,6 @@ - - #: ada/gcc-interface/lang.opt:61 - #, fuzzy --#| msgid "Synonym for -Wcomment" - msgid "Synonym of -gnatk8" - msgstr "-Wcomment çš„åŒä¹‰è¯" - -@@ -6968,7 +6805,6 @@ - - #: ada/gcc-interface/lang.opt:73 - #, fuzzy --#| msgid "Select code model" - msgid "Select the runtime" - msgstr "选择代ç 模型" - -@@ -7036,7 +6872,6 @@ - - #: config/vms/vms.opt:42 - #, fuzzy, c-format --#| msgid "unknown TLS model %qs" - msgid "unknown pointer size model %qs" - msgstr "未知的 TLS 模型%qs" - -@@ -7547,7 +7382,6 @@ - - #: config/aarch64/aarch64.opt:68 - #, fuzzy --#| msgid "Generate code which uses hardware floating point instructions" - msgid "Generate code which uses only the general registers" - msgstr "生æˆä½¿ç”¨ç¡¬ä»¶æµ®ç‚¹æŒ‡ä»¤çš„代ç " - -@@ -7558,7 +7392,6 @@ - - #: config/aarch64/aarch64.opt:76 - #, fuzzy --#| msgid "Select code model" - msgid "Specify the code model" - msgstr "选择代ç 模型" - -@@ -7576,13 +7409,11 @@ - - #: config/aarch64/aarch64.opt:92 - #, fuzzy --#| msgid "-mcpu=\tUse features of and schedule code for given CPU" - msgid "-march=ARCH\tUse features of architecture ARCH" - msgstr "-mcpu=\t使用指定 CPU 的特性和调度代ç " - - #: config/aarch64/aarch64.opt:96 - #, fuzzy --#| msgid "-mcpu=\tUse features of and schedule code for given CPU" - msgid "-mcpu=CPU\tUse features of and optimize for CPU" - msgstr "-mcpu=\t使用指定 CPU 的特性和调度代ç " - -@@ -7592,7 +7423,6 @@ - - #: config/aarch64/aarch64.opt:104 - #, fuzzy --#| msgid "-mabi=ABI\tGenerate code that conforms to the given ABI" - msgid "-mabi=ABI\tGenerate code that conforms to the specified ABI" - msgstr "-mabi=ABI\t生æˆéµå¾ªç»™å®š ABI 的代ç " - -@@ -7874,25 +7704,21 @@ - - #: config/epiphany/epiphany.opt:32 - #, fuzzy --#| msgid "Relax branches" - msgid "Set branch cost" - msgstr "放宽跳转" - - #: config/epiphany/epiphany.opt:36 - #, fuzzy --#| msgid "Enable all optional instructions" - msgid "enable conditional move instruction usage." - msgstr "å¯ç”¨æ‰€æœ‰å¯é€‰æŒ‡ä»¤" - - #: config/epiphany/epiphany.opt:40 - #, fuzzy --#| msgid "The number of insns executed before prefetch is completed" - msgid "set number of nops to emit before each insn pattern" - msgstr "预å–æ“作完æˆå‰æ‰§è¡ŒæŒ‡ä»¤çš„æ•°ç›®" - - #: config/epiphany/epiphany.opt:52 - #, fuzzy --#| msgid "Use software floating point" - msgid "Use software floating point comparisons" - msgstr "使用软件浮点å•å…ƒ" - -@@ -7918,13 +7744,11 @@ - - #: config/epiphany/epiphany.opt:76 - #, fuzzy --#| msgid "Generate call insns as indirect calls, if necessary" - msgid "Generate call insns as indirect calls" - msgstr "如有必须,为调用指令生æˆé—´æŽ¥è°ƒç”¨" - - #: config/epiphany/epiphany.opt:80 - #, fuzzy --#| msgid "Generate call insns as indirect calls, if necessary" - msgid "Generate call insns as direct calls" - msgstr "如有必须,为调用指令生æˆé—´æŽ¥è°ƒç”¨" - -@@ -7938,7 +7762,6 @@ - - #: config/epiphany/epiphany.opt:112 - #, fuzzy --#| msgid "Use structs on stronger alignment for double-word copies" - msgid "Vectorize for double-word operations." - msgstr "为结构使用更强的对é½ä»¥ä½¿ç”¨åŒå—å¤åˆ¶" - -@@ -7948,7 +7771,6 @@ - - #: config/epiphany/epiphany.opt:132 - #, fuzzy --#| msgid "Use hardware floating point conversion instructions" - msgid "Use the floating point unit for integer add/subtract." - msgstr "使用浮点转æ¢æŒ‡ä»¤" - -@@ -8184,7 +8006,6 @@ - - #: config/i386/i386.opt:190 - #, fuzzy --#| msgid "Use 128-bit long double" - msgid "Use 80-bit long double" - msgstr "使用 128 ä½ long double" - -@@ -8244,7 +8065,6 @@ - - #: config/i386/i386.opt:271 - #, fuzzy --#| msgid "Use given x86-64 code model" - msgid "Use given address mode" - msgstr "使用给定的 x86-64 代ç 模å¼" - -@@ -8291,19 +8111,16 @@ - - #: config/i386/i386.opt:369 - #, fuzzy --#| msgid "Set 80387 floating-point precision (-mpc32, -mpc64, -mpc80)" - msgid "Set 80387 floating-point precision to 32-bit" - msgstr "设定 80387 浮点精度(-mpc32ã€-mpc64ã€-mpc80)" - - #: config/i386/i386.opt:373 - #, fuzzy --#| msgid "Set 80387 floating-point precision (-mpc32, -mpc64, -mpc80)" - msgid "Set 80387 floating-point precision to 64-bit" - msgstr "设定 80387 浮点精度(-mpc32ã€-mpc64ã€-mpc80)" - - #: config/i386/i386.opt:377 - #, fuzzy --#| msgid "Set 80387 floating-point precision (-mpc32, -mpc64, -mpc80)" - msgid "Set 80387 floating-point precision to 80-bit" - msgstr "设定 80387 浮点精度(-mpc32ã€-mpc64ã€-mpc80)" - -@@ -8361,7 +8178,6 @@ - - #: config/i386/i386.opt:433 - #, fuzzy --#| msgid "bad value (%s) for %sstringop-strategy=%s %s" - msgid "Valid arguments to -mstringop-strategy=:" - msgstr "%2$sstringop-strategy=%3$s %4$s所带å‚æ•°(%1$s)ä¸æ£ç¡®" - -@@ -8425,7 +8241,6 @@ - - #: config/i386/i386.opt:543 - #, fuzzy --#| msgid "Do dispatch scheduling if processor is bdver1 and Haifa scheduling" - msgid "Do dispatch scheduling if processor is bdver1 or bdver2 or bdver3 or bdver4 and Haifa scheduling" - msgstr "进行海法调度,当处ç†å™¨æ˜¯ bdver1 时也进行派é£è°ƒåº¦" - -@@ -8443,13 +8258,11 @@ - - #: config/i386/i386.opt:562 - #, fuzzy --#| msgid "Generate 64bit x86-64 code" - msgid "Generate 32bit x86-64 code" - msgstr "ç”Ÿæˆ 64 ä½ x86-64 代ç " - - #: config/i386/i386.opt:566 - #, fuzzy --#| msgid "Generate 32bit i386 code" - msgid "Generate 16bit i386 code" - msgstr "ç”Ÿæˆ 32 ä½ i386 代ç " - -@@ -8503,31 +8316,26 @@ - - #: config/i386/i386.opt:622 - #, fuzzy --#| msgid "Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX and FMA built-in functions and code generation" - msgid "Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX and AVX2 built-in functions and code generation" - msgstr "æ”¯æŒ MMXã€SSEã€SSE2ã€SSE3ã€SSSE3ã€SSE4.1ã€SSE4.2ã€AVX å’Œ FMA 内建函数åŠä»£ç 生æˆ" - - #: config/i386/i386.opt:626 - #, fuzzy --#| msgid "Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX and FMA built-in functions and code generation" - msgid "Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and AVX512F built-in functions and code generation" - msgstr "æ”¯æŒ MMXã€SSEã€SSE2ã€SSE3ã€SSSE3ã€SSE4.1ã€SSE4.2ã€AVX å’Œ FMA 内建函数åŠä»£ç 生æˆ" - - #: config/i386/i386.opt:630 - #, fuzzy --#| msgid "Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX and FMA built-in functions and code generation" - msgid "Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and AVX512F and AVX512PF built-in functions and code generation" - msgstr "æ”¯æŒ MMXã€SSEã€SSE2ã€SSE3ã€SSSE3ã€SSE4.1ã€SSE4.2ã€AVX å’Œ FMA 内建函数åŠä»£ç 生æˆ" - - #: config/i386/i386.opt:634 - #, fuzzy --#| msgid "Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX and FMA built-in functions and code generation" - msgid "Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and AVX512F and AVX512ER built-in functions and code generation" - msgstr "æ”¯æŒ MMXã€SSEã€SSE2ã€SSE3ã€SSSE3ã€SSE4.1ã€SSE4.2ã€AVX å’Œ FMA 内建函数åŠä»£ç 生æˆ" - - #: config/i386/i386.opt:638 - #, fuzzy --#| msgid "Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX and FMA built-in functions and code generation" - msgid "Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and AVX512F and AVX512CD built-in functions and code generation" - msgstr "æ”¯æŒ MMXã€SSEã€SSE2ã€SSE3ã€SSSE3ã€SSE4.1ã€SSE4.2ã€AVX å’Œ FMA 内建函数åŠä»£ç 生æˆ" - -@@ -8565,13 +8373,11 @@ - - #: config/i386/i386.opt:674 - #, fuzzy --#| msgid "Support BMI built-in functions and code generation" - msgid "Support BMI2 built-in functions and code generation" - msgstr "æ”¯æŒ BMI 内建函数åŠä»£ç 生æˆ" - - #: config/i386/i386.opt:678 - #, fuzzy --#| msgid "Support TBM built-in functions and code generation" - msgid "Support LZCNT built-in function and code generation" - msgstr "æ”¯æŒ TBM 内建函数åŠä»£ç 生æˆ" - -@@ -8581,7 +8387,6 @@ - - #: config/i386/i386.opt:686 - #, fuzzy --#| msgid "Use SmartMIPS instructions" - msgid "Support RDSEED instruction" - msgstr "使用 SmartMIPS 指令" - -@@ -8591,7 +8396,6 @@ - - #: config/i386/i386.opt:694 - #, fuzzy --#| msgid "Support code generation of crc32 instruction." - msgid "Support flag-preserving add-carry instructions" - msgstr "支æŒç”Ÿæˆ crc32 指令。" - -@@ -8601,13 +8405,11 @@ - - #: config/i386/i386.opt:702 - #, fuzzy --#| msgid "Support calls between Thumb and ARM instruction sets" - msgid "Support XSAVE and XRSTOR instructions" - msgstr "æ”¯æŒ Thumb å’Œ ARM 指令集间互相调用g" - - #: config/i386/i386.opt:706 - #, fuzzy --#| msgid "Support MMX built-in functions" - msgid "Support XSAVEOPT instruction" - msgstr "æ”¯æŒ MMX 内建函数" - -@@ -8637,7 +8439,6 @@ - - #: config/i386/i386.opt:734 - #, fuzzy --#| msgid "Support MMX and SSE built-in functions and code generation" - msgid "Support SHA1 and SHA256 built-in functions and code generation" - msgstr "æ”¯æŒ MMX å’Œ SSE 内建函数åŠä»£ç 生æˆ" - -@@ -8680,13 +8481,11 @@ - - #: config/i386/i386.opt:774 - #, fuzzy --#| msgid "Support TBM built-in functions and code generation" - msgid "Support RTM built-in functions and code generation" - msgstr "æ”¯æŒ TBM 内建函数åŠä»£ç 生æˆ" - - #: config/i386/i386.opt:778 - #, fuzzy --#| msgid "Use propolice as a stack protection method" - msgid "Use given stack-protector guard" - msgstr "使用 propolice æ¥ä¿æŠ¤å †æ ˆ" - -@@ -8805,7 +8604,6 @@ - - #: config/v850/v850.opt:41 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the callt instruction (default)" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -8871,13 +8669,11 @@ - - #: config/v850/v850.opt:117 - #, fuzzy --#| msgid "Compile for the v850e processor" - msgid "Compile for the v850e3v5 processor" - msgstr "为 v850e 处ç†å™¨ç¼–译" - - #: config/v850/v850.opt:124 - #, fuzzy --#| msgid "Enable clip instructions" - msgid "Enable v850e3v5 loop instructions" - msgstr "å¯ç”¨ clip 指令" - -@@ -8887,37 +8683,31 @@ - - #: config/v850/v850.opt:135 - #, fuzzy --#| msgid "Enable the rank heuristic in the scheduler" - msgid "Enable relaxing in the assembler" - msgstr "在调度器ä¸å¯ç”¨ç§©å¯å‘" - - #: config/v850/v850.opt:139 - #, fuzzy --#| msgid "Prohibit PC relative function calls" - msgid "Prohibit PC relative jumps" - msgstr "ç¦æ¢ç›¸å¯¹ PC 的函数调用" - - #: config/v850/v850.opt:143 - #, fuzzy --#| msgid "Prevent the use of all hardware floating-point instructions" - msgid "Inhibit the use of hardware floating point instructions" - msgstr "ä¸å…许使用任何硬件浮点指令" - - #: config/v850/v850.opt:147 - #, fuzzy --#| msgid "Allow the use of hardware floating-point ABI and instructions" - msgid "Allow the use of hardware floating point instructions for V850E2V3 and up" - msgstr "å…许使用硬件浮点 ABI 和指令" - - #: config/v850/v850.opt:151 - #, fuzzy --#| msgid "Enable the use of RX FPU instructions. This is the default." - msgid "Enable support for the RH850 ABI. This is the default" - msgstr "å¯ç”¨ä½¿ç”¨ RX FPU 指令。这是默认值。" - - #: config/v850/v850.opt:155 - #, fuzzy --#| msgid "Enable support for huge objects" - msgid "Enable support for the old GCC ABI" - msgstr "å¯ç”¨å¯¹å·¨åž‹å¯¹è±¡çš„支æŒ" - -@@ -8951,13 +8741,11 @@ - - #: config/cr16/cr16.opt:23 - #, fuzzy --#| msgid "-msim\tUse simulator runtime" - msgid "-msim Use simulator runtime" - msgstr "-msim\t使用仿真器è¿è¡Œæ—¶" - - #: config/cr16/cr16.opt:27 - #, fuzzy --#| msgid "Generate bit instructions" - msgid "Generate SBIT, CBIT instructions" - msgstr "生æˆä½æŒ‡ä»¤" - -@@ -8971,19 +8759,16 @@ - - #: config/cr16/cr16.opt:42 - #, fuzzy --#| msgid "Generate code for a cpu32" - msgid "Generate code for CR16C architecture" - msgstr "为 cpu32 生æˆä»£ç " - - #: config/cr16/cr16.opt:46 - #, fuzzy --#| msgid "Generate code for GNU assembler (gas)" - msgid "Generate code for CR16C+ architecture (Default)" - msgstr "为 GNU 汇编器(gas)生æˆä»£ç " - - #: config/cr16/cr16.opt:50 - #, fuzzy --#| msgid "Pointers are 32-bit" - msgid "Treat integers as 32-bit." - msgstr "指针是 32 ä½" - -@@ -9038,7 +8823,6 @@ - - #: config/avr/avr.opt:80 - #, fuzzy --#| msgid "taking the address of a label is non-standard" - msgid "Warn if the address space of an address is changed." - msgstr "å–æ ‡å·çš„地å€ä¸ç¬¦åˆæ ‡å‡†" - -@@ -9157,7 +8941,6 @@ - - #: config/s390/s390.opt:117 - #, fuzzy --#| msgid "Use hardware floating point instructions" - msgid "Use hardware transactional execution instructions" - msgstr "使用硬件浮点指令" - -@@ -9203,7 +8986,6 @@ - - #: config/s390/s390.opt:167 config/rs6000/rs6000.opt:470 - #, fuzzy --#| msgid "Use ROM instead of RAM" - msgid "Use LRA instead of reload" - msgstr "使用 ROM 而ä¸æ˜¯ RAM" - -@@ -9217,7 +8999,6 @@ - - #: config/rl78/rl78.opt:47 - #, fuzzy --#| msgid "Specifies the number of registers to reserve for interrupt handlers." - msgid "Use all registers, reserving none for interrupt handlers." - msgstr "指定ä¿ç•™ç»™ä¸æ–处ç†å‡½æ•°ä½¿ç”¨çš„寄å˜å™¨çš„æ•°é‡" - -@@ -9227,7 +9008,6 @@ - - #: config/rl78/rl78.opt:55 - #, fuzzy --#| msgid "Target the AM33/2.0 processor" - msgid "Target the RL78/G10 series" - msgstr "ç›®æ ‡ä¸º AM33/2.0 处ç†å™¨" - -@@ -9277,7 +9057,6 @@ - - #: config/arm/arm.opt:90 - #, fuzzy --#| msgid "Generate code for 32 bit addressing" - msgid "Generate code in 32 bit ARM state." - msgstr "为 32 ä½å¯»å€ç”Ÿæˆä»£ç " - -@@ -9303,7 +9082,6 @@ - - #: config/arm/arm.opt:131 - #, fuzzy --#| msgid "invalid __fp16 format option: -mfp16-format=%s" - msgid "Known __fp16 formats (for use with the -mfp16-format= option):" - msgstr "æ— æ•ˆçš„ __fp16 浮点选项:-mfp16-format=%s" - -@@ -9317,7 +9095,6 @@ - - #: config/arm/arm.opt:163 - #, fuzzy --#| msgid "Assume arguments alias no other storage" - msgid "Assume data segments are relative to text segment." - msgstr "å‡å®šå®žå‚ä¸ä¸Žå…¶ä»–å˜å‚¨é‡å " - -@@ -9343,7 +9120,6 @@ - - #: config/arm/arm.opt:190 - #, fuzzy --#| msgid "Generate code for GNU as" - msgid "Generate code for Thumb state" - msgstr "为 GNU as 生æˆä»£ç " - -@@ -9353,7 +9129,6 @@ - - #: config/arm/arm.opt:198 - #, fuzzy --#| msgid "Use given thread-local storage dialect" - msgid "Specify thread local storage scheme" - msgstr "使用给定的线程局部å˜å‚¨æ¨¡å¼" - -@@ -9380,7 +9155,6 @@ - - #: config/arm/arm.opt:236 - #, fuzzy --#| msgid "Assume big endian bytes, little endian words" - msgid "Assume big endian bytes, little endian words. This option is deprecated." - msgstr "å‡å®šé«˜ä½å—节在å‰ï¼Œä½Žä½å—在å‰" - -@@ -9390,7 +9164,6 @@ - - #: config/arm/arm.opt:244 - #, fuzzy --#| msgid "Use Neon quad-word (rather than double-word) registers for vectorization" - msgid "Use Neon double-word (rather than quad-word) registers for vectorization" - msgstr "使用 Neon å››å—(而éžåŒå—)寄å˜å™¨æ¥è¿›è¡Œå‘é‡åŒ–" - -@@ -9436,7 +9209,6 @@ - - #: config/sparc/sparc.opt:42 - #, fuzzy --#| msgid "Use alternate register names" - msgid "Use flat register window model" - msgstr "使用å¦ä¸€å¥—寄å˜å™¨å" - -@@ -9462,37 +9234,31 @@ - - #: config/sparc/sparc.opt:66 - #, fuzzy --#| msgid "Use UltraSPARC Visual Instruction Set extensions" - msgid "Use UltraSPARC Visual Instruction Set version 1.0 extensions" - msgstr "使用 UltraSPARC å¯è§†åŒ–指令集" - - #: config/sparc/sparc.opt:70 - #, fuzzy --#| msgid "Use UltraSPARC Visual Instruction Set extensions" - msgid "Use UltraSPARC Visual Instruction Set version 2.0 extensions" - msgstr "使用 UltraSPARC å¯è§†åŒ–指令集" - - #: config/sparc/sparc.opt:74 - #, fuzzy --#| msgid "Use UltraSPARC Visual Instruction Set extensions" - msgid "Use UltraSPARC Visual Instruction Set version 3.0 extensions" - msgstr "使用 UltraSPARC å¯è§†åŒ–指令集" - - #: config/sparc/sparc.opt:78 - #, fuzzy --#| msgid "Use UltraSPARC Visual Instruction Set extensions" - msgid "Use UltraSPARC Compare-and-Branch extensions" - msgstr "使用 UltraSPARC å¯è§†åŒ–指令集" - - #: config/sparc/sparc.opt:82 - #, fuzzy --#| msgid "Use UltraSPARC Visual Instruction Set extensions" - msgid "Use UltraSPARC Fused Multiply-Add extensions" - msgstr "使用 UltraSPARC å¯è§†åŒ–指令集" - - #: config/sparc/sparc.opt:86 - #, fuzzy --#| msgid "Use hardware floating point instructions" - msgid "Use UltraSPARC Population-Count instruction" - msgstr "使用硬件浮点指令" - -@@ -9534,7 +9300,6 @@ - - #: config/sparc/sparc.opt:196 - #, fuzzy --#| msgid "-mdebug=\tEnable debug output" - msgid "Enable debug output" - msgstr "-mdebug=\tå¯ç”¨è°ƒè¯•è¾“出" - -@@ -9628,13 +9393,11 @@ - - #: config/rs6000/rs6000.opt:145 - #, fuzzy --#| msgid "Generate code in little endian mode" - msgid "Generate Altivec instructions using little-endian element order" - msgstr "生æˆå°ç«¯åœ¨å‰çš„代ç " - - #: config/rs6000/rs6000.opt:149 - #, fuzzy --#| msgid "Generate VRSAVE instructions when generating AltiVec code" - msgid "Generate Altivec instructions using big-endian element order" - msgstr "ç”Ÿæˆ AltiVec 代ç æ—¶ç”Ÿæˆ VRSAVE 指令" - -@@ -9741,13 +9504,11 @@ - - #: config/rs6000/rs6000.opt:322 - #, fuzzy --#| msgid "-mvrsave=yes/no\tDeprecated option. Use -mvrsave/-mno-vrsave instead" - msgid "Deprecated option. Use -mno-vrsave instead" - msgstr "-mvrsave=yes/no\tä¸å»ºè®®ä½¿ç”¨çš„选项。请改用 -mvrsave/-mno-vrsave" - - #: config/rs6000/rs6000.opt:326 - #, fuzzy --#| msgid "Deprecated. Use -Os instead" - msgid "Deprecated option. Use -mvrsave instead" - msgstr "ä¸å»ºè®®ä½¿ç”¨ã€‚请改用 -Os" - -@@ -9761,13 +9522,11 @@ - - #: config/rs6000/rs6000.opt:338 - #, fuzzy --#| msgid "-misel=yes/no\tDeprecated option. Use -misel/-mno-isel instead" - msgid "Deprecated option. Use -mno-isel instead" - msgstr "-misel=yes/no\tä¸å»ºè®®ä½¿ç”¨çš„选项。请改用 -misel/-mno-isel" - - #: config/rs6000/rs6000.opt:342 - #, fuzzy --#| msgid "Deprecated. Use -Os instead" - msgid "Deprecated option. Use -misel instead" - msgstr "ä¸å»ºè®®ä½¿ç”¨ã€‚请改用 -Os" - -@@ -9781,13 +9540,11 @@ - - #: config/rs6000/rs6000.opt:354 - #, fuzzy --#| msgid "-mspe=yes/no\tDeprecated option. Use -mspe/-mno-spe instead" - msgid "Deprecated option. Use -mno-spe instead" - msgstr "-mspe=yes/no\tä¸å»ºè®®ä½¿ç”¨çš„选项。请改用 -mspe/-mno-spe" - - #: config/rs6000/rs6000.opt:358 - #, fuzzy --#| msgid "Deprecated. Use -Os instead" - msgid "Deprecated option. Use -mspe instead" - msgstr "ä¸å»ºè®®ä½¿ç”¨ã€‚请改用 -Os" - -@@ -9797,37 +9554,31 @@ - - #: config/rs6000/rs6000.opt:366 - #, fuzzy --#| msgid "Use the Cray Pointer extension" - msgid "Use the AltiVec ABI extensions" - msgstr "使用 Cray 指针扩展" - - #: config/rs6000/rs6000.opt:370 - #, fuzzy --#| msgid "Do not use the bit-field instructions" - msgid "Do not use the AltiVec ABI extensions" - msgstr "ä¸ä½¿ç”¨ä½æ®µæŒ‡ä»¤" - - #: config/rs6000/rs6000.opt:374 - #, fuzzy --#| msgid "Use the Cray Pointer extension" - msgid "Use the SPE ABI extensions" - msgstr "使用 Cray 指针扩展" - - #: config/rs6000/rs6000.opt:378 - #, fuzzy --#| msgid "Do not use the bit-field instructions" - msgid "Do not use the SPE ABI extensions" - msgstr "ä¸ä½¿ç”¨ä½æ®µæŒ‡ä»¤" - - #: config/rs6000/rs6000.opt:382 - #, fuzzy --#| msgid "Use EABI" - msgid "Use the ELFv1 ABI" - msgstr "使用 EABI" - - #: config/rs6000/rs6000.opt:386 - #, fuzzy --#| msgid "Use EABI" - msgid "Use the ELFv2 ABI" - msgstr "使用 EABI" - -@@ -9947,7 +9698,6 @@ - - #: config/rs6000/rs6000.opt:554 - #, fuzzy --#| msgid "Align destination of the string operations" - msgid "Allow sign extension in fusion operations" - msgstr "对é½å—符串æ“ä½œçš„ç›®æ ‡" - -@@ -9957,7 +9707,6 @@ - - #: config/rs6000/rs6000.opt:562 - #, fuzzy --#| msgid "Use SmartMIPS instructions" - msgid "Use ISA 2.07 crypto instructions" - msgstr "使用 SmartMIPS 指令" - -@@ -9967,13 +9716,11 @@ - - #: config/rs6000/rs6000.opt:570 - #, fuzzy --#| msgid "Use vector/scalar (VSX) instructions" - msgid "Use ISA 2.07 transactional memory (HTM) instructions" - msgstr "使用å‘é‡/æ ‡é‡(VSX)指令" - - #: config/rs6000/rs6000.opt:574 - #, fuzzy --#| msgid "Generate load/store multiple instructions" - msgid "Generate the quad word memory instructions (lq/stq)." - msgstr "生æˆåŠ è½½/å˜å‚¨ä¹˜æ³•æŒ‡ä»¤" - -@@ -10165,7 +9912,6 @@ - - #: config/tilepro/tilepro.opt:28 config/tilegx/tilegx.opt:26 - #, fuzzy --#| msgid "-mcpu=\tUse features of and schedule code for given CPU" - msgid "-mcpu=CPU\tUse features of and schedule code for given CPU" - msgstr "-mcpu=\t使用指定 CPU 的特性和调度代ç " - -@@ -10195,7 +9941,6 @@ - - #: config/nios2/elf.opt:26 - #, fuzzy --#| msgid "Link with the fast floating-point library" - msgid "Link with a limited version of the C library" - msgstr "与快速浮点库链接" - -@@ -10217,7 +9962,6 @@ - - #: config/nios2/nios2.opt:39 - #, fuzzy --#| msgid "Enable clip instructions" - msgid "Enable MUL instructions" - msgstr "å¯ç”¨ clip 指令" - -@@ -10227,19 +9971,16 @@ - - #: config/nios2/nios2.opt:47 - #, fuzzy --#| msgid "Use the software emulation for divides (default)" - msgid "Use table based fast divide (default at -O3)" - msgstr "使用软件模拟除法(默认)" - - #: config/nios2/nios2.opt:51 - #, fuzzy --#| msgid "Enable unaligned load/store instruction" - msgid "All memory accesses use I/O load/store instructions" - msgstr "å¯ç”¨ä¸å¯¹é½çš„载入/å˜å‚¨æŒ‡ä»¤" - - #: config/nios2/nios2.opt:55 - #, fuzzy --#| msgid "Enable unaligned load/store instruction" - msgid "Volatile memory accesses use I/O load/store instructions" - msgstr "å¯ç”¨ä¸å¯¹é½çš„载入/å˜å‚¨æŒ‡ä»¤" - -@@ -10268,7 +10009,6 @@ - - #: config/nios2/nios2.opt:79 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the ftruncds custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10278,7 +10018,6 @@ - - #: config/nios2/nios2.opt:87 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fextsd custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10288,19 +10027,16 @@ - - #: config/nios2/nios2.opt:95 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fixdu custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - - #: config/nios2/nios2.opt:99 - #, fuzzy --#| msgid "Enable divide and modulus instructions" - msgid "Integer id (N) of fixdu custom instruction" - msgstr "å¯ç”¨é™¤æ³•å’Œæ±‚余指令" - - #: config/nios2/nios2.opt:103 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fixdi custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10310,7 +10046,6 @@ - - #: config/nios2/nios2.opt:111 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fixsu custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10320,7 +10055,6 @@ - - #: config/nios2/nios2.opt:119 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fixsi custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10330,31 +10064,26 @@ - - #: config/nios2/nios2.opt:127 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the floatud custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - - #: config/nios2/nios2.opt:131 - #, fuzzy --#| msgid "Enable unaligned load/store instruction" - msgid "Integer id (N) of floatud custom instruction" - msgstr "å¯ç”¨ä¸å¯¹é½çš„载入/å˜å‚¨æŒ‡ä»¤" - - #: config/nios2/nios2.opt:135 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the floatid custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - - #: config/nios2/nios2.opt:139 - #, fuzzy --#| msgid "Enable unaligned load/store instruction" - msgid "Integer id (N) of floatid custom instruction" - msgstr "å¯ç”¨ä¸å¯¹é½çš„载入/å˜å‚¨æŒ‡ä»¤" - - #: config/nios2/nios2.opt:143 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the floatus custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10364,7 +10093,6 @@ - - #: config/nios2/nios2.opt:151 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the floatis custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10374,7 +10102,6 @@ - - #: config/nios2/nios2.opt:159 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fcmpned custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10384,7 +10111,6 @@ - - #: config/nios2/nios2.opt:167 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fcmpeqd custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10394,7 +10120,6 @@ - - #: config/nios2/nios2.opt:175 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fcmpged custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10404,7 +10129,6 @@ - - #: config/nios2/nios2.opt:183 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fcmpgtd custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10414,7 +10138,6 @@ - - #: config/nios2/nios2.opt:191 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fcmpled custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10424,7 +10147,6 @@ - - #: config/nios2/nios2.opt:199 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fcmpltd custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10434,7 +10156,6 @@ - - #: config/nios2/nios2.opt:207 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the flogd custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10444,7 +10165,6 @@ - - #: config/nios2/nios2.opt:215 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fexpd custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10454,7 +10174,6 @@ - - #: config/nios2/nios2.opt:223 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fatand custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10464,19 +10183,16 @@ - - #: config/nios2/nios2.opt:231 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the ftand custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - - #: config/nios2/nios2.opt:235 - #, fuzzy --#| msgid "Enable divide and modulus instructions" - msgid "Integer id (N) of ftand custom instruction" - msgstr "å¯ç”¨é™¤æ³•å’Œæ±‚余指令" - - #: config/nios2/nios2.opt:239 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fsind custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10486,7 +10202,6 @@ - - #: config/nios2/nios2.opt:247 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fcosd custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10496,7 +10211,6 @@ - - #: config/nios2/nios2.opt:255 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fsqrtd custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10506,7 +10220,6 @@ - - #: config/nios2/nios2.opt:263 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fabsd custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10516,7 +10229,6 @@ - - #: config/nios2/nios2.opt:271 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fnegd custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10526,7 +10238,6 @@ - - #: config/nios2/nios2.opt:279 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fmaxd custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10536,7 +10247,6 @@ - - #: config/nios2/nios2.opt:287 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fmind custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10546,7 +10256,6 @@ - - #: config/nios2/nios2.opt:295 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fdivd custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10556,19 +10265,16 @@ - - #: config/nios2/nios2.opt:303 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fmuld custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - - #: config/nios2/nios2.opt:307 - #, fuzzy --#| msgid "Enable divide and modulus instructions" - msgid "Integer id (N) of fmuld custom instruction" - msgstr "å¯ç”¨é™¤æ³•å’Œæ±‚余指令" - - #: config/nios2/nios2.opt:311 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fsubd custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10578,7 +10284,6 @@ - - #: config/nios2/nios2.opt:319 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the faddd custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10588,7 +10293,6 @@ - - #: config/nios2/nios2.opt:327 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fcmpnes custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10598,7 +10302,6 @@ - - #: config/nios2/nios2.opt:335 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fcmpeqs custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10608,7 +10311,6 @@ - - #: config/nios2/nios2.opt:343 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fcmpges custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10618,7 +10320,6 @@ - - #: config/nios2/nios2.opt:351 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fcmpgts custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10628,7 +10329,6 @@ - - #: config/nios2/nios2.opt:359 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fcmples custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10638,7 +10338,6 @@ - - #: config/nios2/nios2.opt:367 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fcmplts custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10648,7 +10347,6 @@ - - #: config/nios2/nios2.opt:375 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the flogs custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10658,7 +10356,6 @@ - - #: config/nios2/nios2.opt:383 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fexps custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10668,7 +10365,6 @@ - - #: config/nios2/nios2.opt:391 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fatans custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10678,7 +10374,6 @@ - - #: config/nios2/nios2.opt:399 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the ftans custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10688,7 +10383,6 @@ - - #: config/nios2/nios2.opt:407 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fsins custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10698,7 +10392,6 @@ - - #: config/nios2/nios2.opt:415 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fcoss custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10708,7 +10401,6 @@ - - #: config/nios2/nios2.opt:423 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fsqrts custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10718,7 +10410,6 @@ - - #: config/nios2/nios2.opt:431 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fabss custom instr" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10728,7 +10419,6 @@ - - #: config/nios2/nios2.opt:439 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fnegs custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10738,7 +10428,6 @@ - - #: config/nios2/nios2.opt:447 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fmaxs custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10748,7 +10437,6 @@ - - #: config/nios2/nios2.opt:455 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fmins custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10758,7 +10446,6 @@ - - #: config/nios2/nios2.opt:463 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fdivs custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10768,19 +10455,16 @@ - - #: config/nios2/nios2.opt:471 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fmuls custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - - #: config/nios2/nios2.opt:475 - #, fuzzy --#| msgid "Enable divide and modulus instructions" - msgid "Integer id (N) of fmuls custom instruction" - msgstr "å¯ç”¨é™¤æ³•å’Œæ±‚余指令" - - #: config/nios2/nios2.opt:479 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fsubs custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10790,7 +10474,6 @@ - - #: config/nios2/nios2.opt:487 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fadds custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10800,7 +10483,6 @@ - - #: config/nios2/nios2.opt:495 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the frdy custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10810,7 +10492,6 @@ - - #: config/nios2/nios2.opt:503 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the frdxhi custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10820,7 +10501,6 @@ - - #: config/nios2/nios2.opt:511 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the frdxlo custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10830,7 +10510,6 @@ - - #: config/nios2/nios2.opt:519 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fwry custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10840,7 +10519,6 @@ - - #: config/nios2/nios2.opt:527 - #, fuzzy --#| msgid "Do not use the callt instruction" - msgid "Do not use the fwrx custom instruction" - msgstr "ä¸ä½¿ç”¨ callt 指令" - -@@ -10882,7 +10560,6 @@ - - #: config/rx/rx.opt:93 - #, fuzzy --#| msgid "Generate assembler output that is compatible with the Renesas AS100 assembler. This may restrict some of the compiler's capabilities. The default is to generate GAS compatable syntax." - msgid "Generate assembler output that is compatible with the Renesas AS100 assembler. This may restrict some of the compiler's capabilities. The default is to generate GAS compatible syntax." - msgstr "生æˆä¸Ž Renesas AS100 兼容的汇编输出。这å¯èƒ½ä¼šé™åˆ¶ç¼–译器的æŸäº›åŠŸèƒ½ã€‚默认是使用与 GAS 兼容的è¯æ³•ã€‚" - -@@ -10920,7 +10597,6 @@ - - #: config/rx/rx.opt:141 - #, fuzzy --#| msgid "Enable the use of the short load instructions" - msgid "Enable the use of the LRA register allocator." - msgstr "å¯ç”¨å¯¹çŸåŠ 载指令的使用" - -@@ -10977,7 +10653,6 @@ - - #: config/microblaze/microblaze.opt:87 - #, fuzzy, c-format --#| msgid "%qE is deprecated: %s" - msgid "%qs is deprecated; use -fstack-check" - msgstr "ä¸å»ºè®®ä½¿ç”¨%qE:%s" - -@@ -10991,7 +10666,6 @@ - - #: config/microblaze/microblaze.opt:95 - #, fuzzy, c-format --#| msgid "-mno-clearbss is deprecated; use -fno-zero-initialized-in-bss" - msgid "%qs is deprecated; use -fno-zero-initialized-in-bss" - msgstr "-mno-clearbsså·²ä¸å»ºè®®ä½¿ç”¨ï¼›è¯·æ”¹ç”¨ -fno-zero-initialized-in-bss" - -@@ -11225,61 +10899,51 @@ - - #: config/mn10300/mn10300.opt:67 - #, fuzzy --#| msgid "Allow gcc to generate LIW instructions" - msgid "Allow gcc to generate the SETLB and Lcc instructions" - msgstr "å…许 gcc ç”Ÿæˆ LIW 指令" - - #: config/nds32/nds32.opt:26 - #, fuzzy --#| msgid "Generate code in big endian mode" - msgid "Generate code in big-endian mode." - msgstr "生æˆå¤§ç«¯åœ¨å‰çš„代ç " - - #: config/nds32/nds32.opt:30 - #, fuzzy --#| msgid "Generate code in little endian mode" - msgid "Generate code in little-endian mode." - msgstr "生æˆå°ç«¯åœ¨å‰çš„代ç " - - #: config/nds32/nds32.opt:34 - #, fuzzy --#| msgid "Reschedule instructions before register allocation" - msgid "Use reduced-set registers for register allocation." - msgstr "分é…寄å˜å™¨å‰é‡æ–°è°ƒåº¦æŒ‡ä»¤" - - #: config/nds32/nds32.opt:38 - #, fuzzy --#| msgid "Reschedule instructions before register allocation" - msgid "Use full-set registers for register allocation." - msgstr "分é…寄å˜å™¨å‰é‡æ–°è°ƒåº¦æŒ‡ä»¤" - - #: config/nds32/nds32.opt:42 - #, fuzzy --#| msgid "Generate bit instructions" - msgid "Generate conditional move instructions." - msgstr "生æˆä½æŒ‡ä»¤" - - #: config/nds32/nds32.opt:46 - #, fuzzy --#| msgid "Generate bit instructions" - msgid "Generate performance extension instructions." - msgstr "生æˆä½æŒ‡ä»¤" - - #: config/nds32/nds32.opt:50 - #, fuzzy --#| msgid "Generate isel instructions" - msgid "Generate v3 push25/pop25 instructions." - msgstr "ç”Ÿæˆ isel 指令" - - #: config/nds32/nds32.opt:54 - #, fuzzy --#| msgid "Generate bit instructions" - msgid "Generate 16-bit instructions." - msgstr "生æˆä½æŒ‡ä»¤" - - #: config/nds32/nds32.opt:58 - #, fuzzy --#| msgid "Generate isel instructions" - msgid "Generate GP base instructions directly." - msgstr "ç”Ÿæˆ isel 指令" - -@@ -11293,7 +10957,6 @@ - - #: config/nds32/nds32.opt:70 - #, fuzzy --#| msgid "Specify the name of the target architecture" - msgid "Specify the name of the target architecture." - msgstr "æŒ‡å®šç›®æ ‡æž¶æž„çš„å称" - -@@ -11307,19 +10970,16 @@ - - #: config/nds32/nds32.opt:94 - #, fuzzy --#| msgid "Run predictive commoning optimization." - msgid "Use special directives to guide linker doing ex9 optimization." - msgstr "å¯ç”¨é¢„æµ‹å…¬å› å优化。" - - #: config/nds32/nds32.opt:98 - #, fuzzy --#| msgid "Warn when all constructors and destructors are private" - msgid "Enable constructor/destructor feature." - msgstr "å½“æ‰€æœ‰æž„é€ å‡½æ•°å’Œæžæž„函数都是ç§æœ‰æ—¶ç»™å‡ºè¦å‘Š" - - #: config/nds32/nds32.opt:102 - #, fuzzy --#| msgid "Generate isel instructions" - msgid "Guide linker to relax instructions." - msgstr "ç”Ÿæˆ isel 指令" - -@@ -11353,13 +11013,11 @@ - - #: config/c6x/c6x.opt:46 - #, fuzzy --#| msgid "alias argument not a string" - msgid "Valid arguments for the -msdata= option" - msgstr "alias çš„å‚æ•°ä¸æ˜¯ä¸€ä¸ªå—符串" - - #: config/c6x/c6x.opt:59 - #, fuzzy --#| msgid "Create a shared library" - msgid "Compile for the DSBT shared library ABI" - msgstr "生æˆä¸€ä¸ªå…±äº«åº“" - -@@ -11633,7 +11291,6 @@ - - #: config/sh/sh.opt:236 config/sh/sh.opt:240 - #, fuzzy, c-format --#| msgid "Deprecated. This switch has no effect" - msgid "%qs is deprecated and has no effect" - msgstr "ä¸å»ºè®®ä½¿ç”¨ã€‚æ¤å¼€å…³ä¸èµ·ä½œç”¨ã€‚" - -@@ -11675,7 +11332,6 @@ - - #: config/sh/sh.opt:277 - #, fuzzy --#| msgid "Increase the IEEE compliance for floating-point code" - msgid "Increase the IEEE compliance for floating-point comparisons" - msgstr "让浮点代ç æ›´åŠ éµå¾ª IEEE æ ‡å‡†" - -@@ -11725,7 +11381,6 @@ - - #: config/sh/sh.opt:331 - #, fuzzy --#| msgid "Generate code for built-in atomic operations" - msgid "Specify the model for atomic operations" - msgstr "为内建原åæ“作生æˆä»£ç " - -@@ -11751,13 +11406,11 @@ - - #: config/sh/sh.opt:357 - #, fuzzy --#| msgid "Enable the use of the short load instructions" - msgid "Enable the use of the fsca instruction" - msgstr "å¯ç”¨å¯¹çŸåŠ 载指令的使用" - - #: config/sh/sh.opt:361 - #, fuzzy --#| msgid "Enable the use of the short load instructions" - msgid "Enable the use of the fsrra instruction" - msgstr "å¯ç”¨å¯¹çŸåŠ 载指令的使用" - -@@ -11895,7 +11548,6 @@ - - #: config/mips/mips.opt:63 - #, fuzzy --#| msgid "Use multiply add/subtract instructions" - msgid "Use integer madd/msub instructions" - msgstr "ä½¿ç”¨ä¹˜åŠ /å‡æŒ‡ä»¤" - -@@ -11925,7 +11577,6 @@ - - #: config/mips/mips.opt:91 - #, fuzzy --#| msgid "invalid argument %qs to -fdebug-prefix-map" - msgid "Valid arguments to -mcode-readable=:" - msgstr "-fdebug-prefix-map çš„å‚æ•°%qsæ— æ•ˆ" - -@@ -11955,7 +11606,6 @@ - - #: config/mips/mips.opt:146 - #, fuzzy --#| msgid "Use the bit-field instructions" - msgid "Use Enhanced Virtual Addressing instructions" - msgstr "使用ä½æ®µæŒ‡ä»¤" - -@@ -11969,7 +11619,6 @@ - - #: config/mips/mips.opt:158 - #, fuzzy --#| msgid "Work around certain R4000 errata" - msgid "Work around certain 24K errata" - msgstr "为æŸäº› R4000 缺陷æä¾›å˜é€š" - -@@ -11983,7 +11632,6 @@ - - #: config/mips/mips.opt:170 - #, fuzzy --#| msgid "Work around certain R4000 errata" - msgid "Work around certain RM7000 errata" - msgstr "为æŸäº› R4000 缺陷æä¾›å˜é€š" - -@@ -12057,13 +11705,11 @@ - - #: config/mips/mips.opt:252 - #, fuzzy --#| msgid "Generate code that can be safely linked with MIPS16 code." - msgid "Generate code that is link-compatible with MIPS16 and microMIPS code." - msgstr "生æˆèƒ½ä¸Ž MIPS16 代ç 安全链接的代ç 。" - - #: config/mips/mips.opt:256 - #, fuzzy --#| msgid "Does nothing. Preserved for backward compatibility." - msgid "An alias for minterlink-compressed provided for backward-compatibility." - msgstr "ä¸èµ·ä½œç”¨ã€‚为å‘å‰å…¼å®¹ä¿ç•™çš„选项。" - -@@ -12109,7 +11755,6 @@ - - #: config/mips/mips.opt:300 - #, fuzzy --#| msgid "Use SmartMIPS instructions" - msgid "Use microMIPS instructions" - msgstr "使用 SmartMIPS 指令" - -@@ -12123,7 +11768,6 @@ - - #: config/mips/mips.opt:312 - #, fuzzy --#| msgid "Use MIPS-3D instructions" - msgid "Use MCU instructions" - msgstr "使用 MIPS-3D 指令" - -@@ -12214,31 +11858,26 @@ - - #: config/tilegx/tilegx.opt:37 - #, fuzzy --#| msgid "Compile for 32-bit pointers" - msgid "Compile with 32 bit longs and pointers." - msgstr "为 32 ä½æŒ‡é’ˆç¼–译" - - #: config/tilegx/tilegx.opt:41 - #, fuzzy --#| msgid "Compile for 64-bit pointers" - msgid "Compile with 64 bit longs and pointers." - msgstr "为 64 ä½æŒ‡é’ˆç¼–译" - - #: config/tilegx/tilegx.opt:45 - #, fuzzy --#| msgid "Use given x86-64 code model" - msgid "Use given TILE-Gx code model" - msgstr "使用给定的 x86-64 代ç 模å¼" - - #: config/arc/arc.opt:26 - #, fuzzy --#| msgid "Generate code in big endian mode" - msgid "Compile code for big endian mode" - msgstr "生æˆå¤§ç«¯åœ¨å‰çš„代ç " - - #: config/arc/arc.opt:30 - #, fuzzy --#| msgid "Stores doubles in 32 bits. This is the default." - msgid "Compile code for little endian mode. This is the default" - msgstr "以 32 ä½åŒç²¾åº¦æ•°å˜å‚¨ã€‚这是默认值。" - -@@ -12284,31 +11923,26 @@ - - #: config/arc/arc.opt:80 - #, fuzzy --#| msgid "Generate string instructions for block moves" - msgid "Generate instructions supported by barrel shifter" - msgstr "为å—移动使用å—符串指令" - - #: config/arc/arc.opt:84 - #, fuzzy --#| msgid "Generate bit instructions" - msgid "Generate norm instruction" - msgstr "生æˆä½æŒ‡ä»¤" - - #: config/arc/arc.opt:88 - #, fuzzy --#| msgid "Generate isel instructions" - msgid "Generate swap instruction" - msgstr "ç”Ÿæˆ isel 指令" - - #: config/arc/arc.opt:92 - #, fuzzy --#| msgid "Generate load/store multiple instructions" - msgid "Generate mul64 and mulu64 instructions" - msgstr "生æˆåŠ è½½/å˜å‚¨ä¹˜æ³•æŒ‡ä»¤" - - #: config/arc/arc.opt:96 - #, fuzzy --#| msgid "Do not generate fused multiply/add instructions" - msgid "Do not generate mpy instructions for ARC700" - msgstr "ä¸ç”Ÿæˆèžåˆçš„乘/åŠ æŒ‡ä»¤" - -@@ -12322,13 +11956,11 @@ - - #: config/arc/arc.opt:108 - #, fuzzy --#| msgid "Generate call insns as indirect calls, if necessary" - msgid "Generate call insns as register indirect calls" - msgstr "如有必须,为调用指令生æˆé—´æŽ¥è°ƒç”¨" - - #: config/arc/arc.opt:112 - #, fuzzy --#| msgid "Generate cld instruction in the function prologue." - msgid "Do no generate BRcc instructions in arc_reorg." - msgstr "在函数åºè¨€ä¸ç”Ÿæˆ cld 指令" - -@@ -12346,7 +11978,6 @@ - - #: config/arc/arc.opt:132 - #, fuzzy --#| msgid "Generate bit instructions" - msgid "FPX: Generate Single Precision FPX (fast) instructions." - msgstr "生æˆä½æŒ‡ä»¤" - -@@ -12356,13 +11987,11 @@ - - #: config/arc/arc.opt:140 config/arc/arc.opt:144 - #, fuzzy --#| msgid "Generate bit instructions" - msgid "FPX: Generate Double Precision FPX (compact) instructions." - msgstr "生æˆä½æŒ‡ä»¤" - - #: config/arc/arc.opt:148 - #, fuzzy --#| msgid "Generate bit instructions" - msgid "FPX: Generate Double Precision FPX (fast) instructions." - msgstr "生æˆä½æŒ‡ä»¤" - -@@ -12384,7 +12013,6 @@ - - #: config/arc/arc.opt:187 - #, fuzzy --#| msgid "Cost to assume for a multiply insn" - msgid "Cost to assume for a multiply instruction, with 4 being equal to a normal insn." - msgstr "为乘法指令设定的开销" - -@@ -12406,7 +12034,6 @@ - - #: config/arc/arc.opt:215 - #, fuzzy --#| msgid "Enable the use of the short load instructions" - msgid "Enable the use of indexed loads" - msgstr "å¯ç”¨å¯¹çŸåŠ 载指令的使用" - -@@ -12416,7 +12043,6 @@ - - #: config/arc/arc.opt:223 - #, fuzzy --#| msgid "Generate fused multiply/add instructions" - msgid "Generate 32x16 multiply and mac instructions" - msgstr "生æˆèžåˆçš„乘/åŠ æŒ‡ä»¤" - -@@ -12434,7 +12060,6 @@ - - #: config/arc/arc.opt:241 - #, fuzzy --#| msgid "Avoid all range limits on call instructions" - msgid "Do alignment optimizations for call instructions." - msgstr "为调用指令é¿å…一切范围é™åˆ¶" - -@@ -12448,7 +12073,6 @@ - - #: config/arc/arc.opt:253 - #, fuzzy --#| msgid "Enable cbranchdi4 pattern" - msgid "Enable pre-reload use of cbranchsi pattern" - msgstr "å¯ç”¨ cbranchdi4 æ ·å¼" - -@@ -12462,13 +12086,11 @@ - - #: config/arc/arc.opt:265 - #, fuzzy --#| msgid "Enable cbranchdi4 pattern" - msgid "Enable compact casesi pattern" - msgstr "å¯ç”¨ cbranchdi4 æ ·å¼" - - #: config/arc/arc.opt:269 - #, fuzzy --#| msgid "Enable clip instructions" - msgid "Enable 'q' instruction alternatives." - msgstr "å¯ç”¨ clip 指令" - -@@ -12478,25 +12100,21 @@ - - #: config/arc/arc.opt:280 - #, fuzzy --#| msgid "Enable Plan 9 language extensions" - msgid "Enable variable polynomial CRC extension" - msgstr "å¯ç”¨ä¹å·è®¡åˆ’è¯è¨€æ‰©å±•" - - #: config/arc/arc.opt:284 - #, fuzzy --#| msgid "Enable Plan 9 language extensions" - msgid "Enable DSP 3.1 Pack A extensions" - msgstr "å¯ç”¨ä¹å·è®¡åˆ’è¯è¨€æ‰©å±•" - - #: config/arc/arc.opt:288 - #, fuzzy --#| msgid "Enable Plan 9 language extensions" - msgid "Enable dual viterbi butterfly extension" - msgstr "å¯ç”¨ä¹å·è®¡åˆ’è¯è¨€æ‰©å±•" - - #: config/arc/arc.opt:298 - #, fuzzy --#| msgid "Enable leading zero instructions" - msgid "Enable Dual and Single Operand Instructions for Telephony" - msgstr "å¯ç”¨å‰å¯¼é›¶æŒ‡ä»¤" - -@@ -12506,19 +12124,16 @@ - - #: config/arc/arc.opt:307 - #, fuzzy --#| msgid "Enable dead store elimination" - msgid "Enable Locked Load/Store Conditional extension" - msgstr "åˆ é™¤æ»å˜å‚¨" - - #: config/arc/arc.opt:311 - #, fuzzy --#| msgid "Enable sign extend instructions" - msgid "Enable swap byte ordering extension instruction" - msgstr "å¯ç”¨ç¬¦å·æ‰©å±•æŒ‡ä»¤" - - #: config/arc/arc.opt:315 - #, fuzzy --#| msgid "Enable bit manipulation instructions" - msgid "Enable 64-bit Time-Stamp Counter extension instruction" - msgstr "å¯ç”¨ä½æ“作指令" - -@@ -12532,19 +12147,16 @@ - - #: config/arc/arc.opt:327 - #, fuzzy --#| msgid "Pass -z text to linker" - msgid "Pass -EB option through to linker." - msgstr "å°† -z text ä¼ é€’ç»™é“¾æŽ¥å™¨" - - #: config/arc/arc.opt:331 - #, fuzzy --#| msgid "Pass -z text to linker" - msgid "Pass -EL option through to linker." - msgstr "å°† -z text ä¼ é€’ç»™é“¾æŽ¥å™¨" - - #: config/arc/arc.opt:335 - #, fuzzy --#| msgid "Pass -z text to linker" - msgid "Pass -marclinux option through to linker." - msgstr "å°† -z text ä¼ é€’ç»™é“¾æŽ¥å™¨" - -@@ -12722,7 +12334,6 @@ - - #: common.opt:457 - #, fuzzy --#| msgid "Optimize for space rather than speed" - msgid "Optimize for debugging experience rather than speed or size" - msgstr "为最å°ç©ºé—´è€Œä¸æ˜¯æœ€å¤§é€Ÿåº¦ä¼˜åŒ–" - -@@ -12781,7 +12392,6 @@ - - #: common.opt:562 - #, fuzzy --#| msgid "%Kattempt to free a non-heap object" - msgid "Warn when attempting to free a non-heap object" - msgstr "%K试图 free 一个ä¸åœ¨å †ä¸Šçš„对象" - -@@ -12870,7 +12480,6 @@ - - #: common.opt:660 - #, fuzzy --#| msgid "Warn about uninitialized automatic variables" - msgid "Warn about maybe uninitialized automatic variables" - msgstr "自动å˜é‡æœªåˆå§‹åŒ–æ—¶è¦å‘Š" - -@@ -13007,7 +12616,6 @@ - - #: common.opt:918 - #, fuzzy --#| msgid "Check the return value of new" - msgid "Check the return value of new in C++" - msgstr "检查 new 的返回值" - -@@ -13094,7 +12702,6 @@ - - #: common.opt:1012 - #, fuzzy --#| msgid "Perform superblock formation via tail duplication" - msgid "Perform speculative devirtualization" - msgstr "通过尾å¤åˆ¶è¿›è¡Œè¶…å—åˆæˆ" - -@@ -13145,7 +12752,6 @@ - - #: common.opt:1096 - #, fuzzy --#| msgid "Do the full register move optimization pass" - msgid "Dump optimization passes" - msgstr "进行全寄å˜å™¨ä¼ é€ä¼˜åŒ–" - -@@ -13265,7 +12871,6 @@ - - #: common.opt:1243 - #, fuzzy --#| msgid "Enable hoisting loads from conditional pointers." - msgid "Enable hoisting adjacent loads to encourage generating conditional move" - msgstr "为æ¡ä»¶æŒ‡é’ˆå¤–æ内å˜è¯»å–æ“作。" - -@@ -13319,7 +12924,6 @@ - - #: common.opt:1303 - #, fuzzy, c-format --#| msgid "unknown TLS model %qs" - msgid "unknown Stack Reuse Level %qs" - msgstr "未知的 TLS 模型%qs" - -@@ -13346,19 +12950,16 @@ - - #: common.opt:1342 - #, fuzzy --#| msgid "Integrate simple functions into their callers when code size is known to not growth" - msgid "Integrate functions into their callers when code size is known not to grow" - msgstr "在ä¸å¯¼è‡´ä»£ç 膨胀的情况下将简å•å‡½æ•°é›†æˆåˆ°å®ƒä»¬çš„调用者ä¸" - - #: common.opt:1346 - #, fuzzy --#| msgid "Integrate functions called once into their callers" - msgid "Integrate functions not declared \"inline\" into their callers when profitable" - msgstr "å°†åªè¢«è°ƒç”¨ä¸€æ¬¡çš„函数集æˆåˆ°å®ƒä»¬çš„调用者ä¸" - - #: common.opt:1350 - #, fuzzy --#| msgid "Integrate functions called once into their callers" - msgid "Integrate functions only required by their single caller" - msgstr "å°†åªè¢«è°ƒç”¨ä¸€æ¬¡çš„函数集æˆåˆ°å®ƒä»¬çš„调用者ä¸" - -@@ -13384,7 +12985,6 @@ - - #: common.opt:1377 - #, fuzzy --#| msgid "Perform Interprocedural constant propagation" - msgid "Perform interprocedural constant propagation" - msgstr "进行进程间的å¤å†™ä¼ 递" - -@@ -13407,7 +13007,6 @@ - - #: common.opt:1397 - #, fuzzy --#| msgid "unimplemented functionality" - msgid "Perform Semantic function equality" - msgstr "未实现的功能" - -@@ -13504,7 +13103,6 @@ - - #: common.opt:1521 - #, fuzzy --#| msgid "Report various link-time optimization statistics" - msgid "Report various link-time optimization statistics for WPA only" - msgstr "报告å„ç§é“¾æŽ¥æ—¶ä¼˜åŒ–统计" - -@@ -13522,7 +13120,6 @@ - - #: common.opt:1537 - #, fuzzy --#| msgid "Report on permanent memory allocation" - msgid "Report on permanent memory allocation in WPA only" - msgstr "报告永久性内å˜åˆ†é…" - -@@ -13576,7 +13173,6 @@ - - #: common.opt:1592 - #, fuzzy --#| msgid "Enable loop optimizations on tree level" - msgid "Enable all optimization info dumps on stderr" - msgstr "åœ¨æ ‘çº§åˆ«è¿›è¡Œå¾ªçŽ¯ä¼˜åŒ–" - -@@ -13690,13 +13286,11 @@ - - #: common.opt:1713 - #, fuzzy --#| msgid "internal consistency failure" - msgid "Report on consistency of profile" - msgstr "内部一致性错误" - - #: common.opt:1717 - #, fuzzy --#| msgid "Reorder functions to improve code placement" - msgid "Enable function reordering that improves code placement" - msgstr "函数é‡æ–°æŽ’åºä»¥æ”¹å–„代ç 布局" - -@@ -13714,7 +13308,6 @@ - - #: common.opt:1746 - #, fuzzy --#| msgid "Enable register pressure sensitive insn scheduling" - msgid "Relief of register pressure through live range shrinkage" - msgstr "å¯ç”¨å¯¹å¯„å˜å™¨åŽ‹åŠ›æ•æ„Ÿçš„指令调度" - -@@ -13909,7 +13502,6 @@ - - #: common.opt:1967 - #, fuzzy --#| msgid "Use a stack protection method for every function" - msgid "Use a smart stack protection method for certain functions" - msgstr "为æ¯ä¸ªå‡½æ•°ä½¿ç”¨å †æ ˆä¿æŠ¤æœºåˆ¶" - -@@ -13986,7 +13578,6 @@ - - #: common.opt:2065 - #, fuzzy --#| msgid "Perform variable tracking and also tag variables that are uninitialized" - msgid "Enable coalescing of copy-related user variables that are inlined" - msgstr "进行å˜é‡è¿½è¸ªå¹¶ä¸”æ ‡è®°æœªè¢«åˆå§‹åŒ–çš„å˜é‡" - -@@ -14020,7 +13611,6 @@ - - #: common.opt:2101 - #, fuzzy --#| msgid "Enable loop header copying on trees" - msgid "Enable tail merging on trees" - msgstr "å¯ç”¨æ ‘上的循环ä¸å˜é‡è½¬ç§»" - -@@ -14038,13 +13628,11 @@ - - #: common.opt:2117 - #, fuzzy --#| msgid "Enable SSA-CCP optimization on trees" - msgid "Enable string length optimizations on trees" - msgstr "å¯ç”¨æ ‘上的 SSA-CCP 优化" - - #: common.opt:2121 - #, fuzzy --#| msgid "comparison with string literal results in unspecified behaviour" - msgid "Detect paths which trigger erroneous or undefined behaviour due to" - msgstr "与å—é¢å—符串比较的结构是ä¸å¯é¢„测的" - -@@ -14164,13 +13752,11 @@ - - #: common.opt:2254 - #, fuzzy --#| msgid "Use the hardware barrel shifter instead of emulation" - msgid "Use the bfd linker instead of the default linker" - msgstr "使用硬件桶型移ä½å™¨ä»£æ›¿ä»¿çœŸ" - - #: common.opt:2258 - #, fuzzy --#| msgid "Use the hardware barrel shifter instead of emulation" - msgid "Use the gold linker instead of the default linker" - msgstr "使用硬件桶型移ä½å™¨ä»£æ›¿ä»¿çœŸ" - -@@ -14192,7 +13778,6 @@ - - #: common.opt:2296 - #, fuzzy --#| msgid "Enable loop vectorization on trees" - msgid "Enable vectorization on trees" - msgstr "åœ¨æ ‘ä¸Šè¿›è¡Œå¾ªçŽ¯å‘é‡åŒ–" - -@@ -14206,7 +13791,6 @@ - - #: common.opt:2312 - #, fuzzy --#| msgid "Enable use of cost model in vectorization" - msgid "Specifies the cost model for vectorization" - msgstr "å¯ç”¨å‘é‡åŒ–开销模型" - -@@ -14216,19 +13800,16 @@ - - #: common.opt:2319 - #, fuzzy, c-format --#| msgid "unknown TLS model %qs" - msgid "unknown vectorizer cost model %qs" - msgstr "未知的 TLS 模型%qs" - - #: common.opt:2332 - #, fuzzy --#| msgid "Does nothing. Preserved for backward compatibility." - msgid "Enables the dynamic vectorizer cost model. Preserved for backward compatibility." - msgstr "ä¸èµ·ä½œç”¨ã€‚为å‘å‰å…¼å®¹ä¿ç•™çš„选项。" - - #: common.opt:2336 - #, fuzzy --#| msgid "Does nothing. Preserved for backward compatibility." - msgid "Enables the unlimited vectorizer cost model. Preserved for backward compatibility." - msgstr "ä¸èµ·ä½œç”¨ã€‚为å‘å‰å…¼å®¹ä¿ç•™çš„选项。" - -@@ -14255,7 +13836,6 @@ - - #: common.opt:2380 - #, fuzzy, c-format --#| msgid "(near initialization for %qs)" - msgid "unknown vtable verify initialization priority %qs" - msgstr "(在%qsçš„åˆå§‹åŒ–附近)" - -@@ -14301,7 +13881,6 @@ - - #: common.opt:2433 - #, fuzzy --#| msgid "Generate debug information in default format" - msgid "Generate debug information in default version of DWARF format" - msgstr "生æˆé»˜è®¤æ ¼å¼çš„调试信æ¯" - -@@ -14327,25 +13906,21 @@ - - #: common.opt:2457 - #, fuzzy --#| msgid "Record gcc command line switches in the object file." - msgid "Don't record gcc command line switches in DWARF DW_AT_producer." - msgstr "åœ¨ç›®æ ‡æ–‡ä»¶ä¸è®°å½• gcc 命令行开关。" - - #: common.opt:2461 - #, fuzzy --#| msgid "Record gcc command line switches in the object file." - msgid "Record gcc command line switches in DWARF DW_AT_producer." - msgstr "åœ¨ç›®æ ‡æ–‡ä»¶ä¸è®°å½• gcc 命令行开关。" - - #: common.opt:2465 - #, fuzzy --#| msgid "Generate debug information in default format" - msgid "Don't generate debug information in separate .dwo files" - msgstr "生æˆé»˜è®¤æ ¼å¼çš„调试信æ¯" - - #: common.opt:2469 - #, fuzzy --#| msgid "Generate debug information in default format" - msgid "Generate debug information in separate .dwo files" - msgstr "生æˆé»˜è®¤æ ¼å¼çš„调试信æ¯" - -@@ -14387,7 +13962,6 @@ - - #: common.opt:2512 - #, fuzzy --#| msgid "-imultilib <dir>\tSet <dir> to be the multilib include subdirectory" - msgid "-imultiarch <dir>\tSet <dir> to be the multiarch include subdirectory" - msgstr "-imultilib <目录>\t将目录设定为 multilib 的包å«å目录" - -@@ -14450,7 +14024,6 @@ - - #: go/gofrontend/expressions.cc:4157 - #, fuzzy --#| msgid "expected integer or boolean type" - msgid "expected boolean type" - msgstr "需è¦æ•´æ•°æˆ–布尔类型" - -@@ -14469,7 +14042,6 @@ - - #: go/gofrontend/expressions.cc:5925 - #, fuzzy --#| msgid "invalid comparison code in gimple cond" - msgid "invalid comparison of nil with nil" - msgstr "gimple æ¡ä»¶ä¸æ¯”较代ç æ— æ•ˆ" - -@@ -14480,7 +14052,6 @@ - - #: go/gofrontend/expressions.cc:5969 - #, fuzzy --#| msgid "division by zero" - msgid "integer division by zero" - msgstr "被零除" - -@@ -14508,13 +14079,11 @@ - - #: go/gofrontend/expressions.cc:7156 - #, fuzzy --#| msgid "invalid argument to built-in function" - msgid "invalid use of %<...%> with builtin function" - msgstr "内建函数实å‚æ— æ•ˆ" - - #: go/gofrontend/expressions.cc:7167 - #, fuzzy --#| msgid "invalid use of template-name %qE without an argument list" - msgid "invalid use of method value as argument of Offsetof" - msgstr "使用模æ¿å%qEæ—¶ä¸å¸¦å®žå‚è¡¨æ— æ•ˆ" - -@@ -14540,7 +14109,6 @@ - - #: go/gofrontend/expressions.cc:7271 - #, fuzzy --#| msgid "argument must be a constant" - msgid "argument 1 must be a map" - msgstr "实å‚必须是常数" - -@@ -14551,7 +14119,6 @@ - - #: go/gofrontend/expressions.cc:7384 - #, fuzzy --#| msgid "bad length when making slice" - msgid "length required when allocating a slice" - msgstr "生æˆåˆ‡ç‰‡æ—¶é•¿åº¦é”™è¯¯" - -@@ -14561,7 +14128,6 @@ - - #: go/gofrontend/expressions.cc:7435 - #, fuzzy --#| msgid "too many arguments to %qE" - msgid "too many arguments to make" - msgstr "%qE实å‚太多" - -@@ -14603,19 +14169,16 @@ - - #: go/gofrontend/expressions.cc:8317 - #, fuzzy --#| msgid "left argument must be a slice" - msgid "first argument must be []byte" - msgstr "左实å‚必须是一个切片" - - #: go/gofrontend/expressions.cc:8320 - #, fuzzy --#| msgid "right argument must be a slice or a string" - msgid "second argument must be slice or string" - msgstr "å³å®žå‚必须是一个切片或å—符串" - - #: go/gofrontend/expressions.cc:8361 - #, fuzzy --#| msgid "parameter %u has void type" - msgid "argument 2 has invalid type" - msgstr "第 %u 个å‚数类型为 void" - -@@ -14638,7 +14201,6 @@ - - #: go/gofrontend/expressions.cc:9332 - #, fuzzy --#| msgid "invalid use of %<this%> at top level" - msgid "invalid use of %<...%> with non-slice" - msgstr "在文件作用域使用%<this%>æ— æ•ˆ" - -@@ -14648,7 +14210,6 @@ - - #: go/gofrontend/expressions.cc:9623 - #, fuzzy --#| msgid "invalid use of %<this%> in non-member function" - msgid "invalid use of %<...%> calling non-variadic function" - msgstr "在éžæˆå‘˜å‡½æ•°ä¸ä½¿ç”¨%<this%>æ— æ•ˆ" - -@@ -14666,7 +14227,6 @@ - - #: go/gofrontend/expressions.cc:10474 - #, fuzzy --#| msgid "slice end must be integer" - msgid "slice capacity must be integer" - msgstr "切片结尾必须是整数" - -@@ -14741,7 +14301,6 @@ - - #: go/gofrontend/statements.cc:2654 go/gofrontend/statements.cc:2683 - #, fuzzy --#| msgid "not enough arguments" - msgid "not enough arguments to return" - msgstr "实å‚太少" - -@@ -14783,49 +14342,41 @@ - - #: go/gofrontend/types.cc:514 - #, fuzzy --#| msgid "invalid comparison code in gimple cond" - msgid "invalid comparison of non-ordered type" - msgstr "gimple æ¡ä»¶ä¸æ¯”较代ç æ— æ•ˆ" - - #: go/gofrontend/types.cc:530 - #, fuzzy --#| msgid "duplicate class will only be compiled once" - msgid "slice can only be compared to nil" - msgstr "é‡å¤çš„ç±»åªä¼šè¢«ç¼–译一次" - - #: go/gofrontend/types.cc:532 - #, fuzzy --#| msgid "duplicate class will only be compiled once" - msgid "map can only be compared to nil" - msgstr "é‡å¤çš„ç±»åªä¼šè¢«ç¼–译一次" - - #: go/gofrontend/types.cc:534 - #, fuzzy --#| msgid "duplicate class will only be compiled once" - msgid "func can only be compared to nil" - msgstr "é‡å¤çš„ç±»åªä¼šè¢«ç¼–译一次" - - #: go/gofrontend/types.cc:540 - #, fuzzy, c-format --#| msgid "invalid operand to %%R" - msgid "invalid operation (%s)" - msgstr "%%R çš„æ“ä½œæ•°æ— æ•ˆ" - - #: go/gofrontend/types.cc:563 - #, fuzzy --#| msgid "invalid comparison code in gimple cond" - msgid "invalid comparison of non-comparable type" - msgstr "gimple æ¡ä»¶ä¸æ¯”较代ç æ— æ•ˆ" - - #: go/gofrontend/types.cc:581 - #, fuzzy --#| msgid "invalid comparison code in gimple cond" - msgid "invalid comparison of non-comparable struct" - msgstr "gimple æ¡ä»¶ä¸æ¯”较代ç æ— æ•ˆ" - - #: go/gofrontend/types.cc:592 - #, fuzzy --#| msgid "invalid use of non-lvalue array" - msgid "invalid comparison of non-comparable array" - msgstr "对éžå·¦å€¼æ•°ç»„çš„ä½¿ç”¨æ— æ•ˆ" - -@@ -14911,13 +14462,11 @@ - - #: go/gofrontend/types.cc:7240 - #, fuzzy, c-format --#| msgid "method %s%s%s requires a pointer" - msgid "method %s%s%s requires a pointer receiver" - msgstr "方法%s%s%s需è¦ä¸€ä¸ªæŒ‡é’ˆ" - - #: go/gofrontend/types.cc:7258 - #, fuzzy, c-format --#| msgid "method %s%s%s requires a pointer" - msgid "method %s%s%s is marked go:nointerface" - msgstr "方法%s%s%s需è¦ä¸€ä¸ªæŒ‡é’ˆ" - -@@ -14930,7 +14479,6 @@ - - #: attribs.c:450 - #, fuzzy, gcc-internal-format --#| msgid "%qE attribute directive ignored" - msgid "%<%E::%E%> scoped attribute directive ignored" - msgstr "%qE属性指定被忽略" - -@@ -14944,7 +14492,6 @@ - #. type. Ignore it. - #: attribs.c:472 - #, fuzzy, gcc-internal-format --#| msgid "%qE attribute ignored" - msgid "attribute ignored" - msgstr "%qE属性被忽略" - -@@ -15045,7 +14592,6 @@ - - #: builtins.c:5248 - #, fuzzy, gcc-internal-format --#| msgid "invalid argument to built-in function" - msgid "invalid memory model argument to builtin" - msgstr "内建函数实å‚æ— æ•ˆ" - -@@ -15066,13 +14612,11 @@ - - #: builtins.c:5360 - #, fuzzy, gcc-internal-format --#| msgid "invalid use of %<auto%>" - msgid "invalid memory model for %<__atomic_load%>" - msgstr "错误地使用了%<auto%>" - - #: builtins.c:5390 builtins.c:5497 - #, fuzzy, gcc-internal-format --#| msgid "invalid use of %<auto%>" - msgid "invalid memory model for %<__atomic_store%>" - msgstr "错误地使用了%<auto%>" - -@@ -15088,13 +14632,11 @@ - - #: builtins.c:5709 - #, fuzzy, gcc-internal-format --#| msgid "__builtin_eh_return not supported on this target" - msgid "__builtin_thread_pointer is not supported on this target" - msgstr "__builtin_eh_return 在æ¤ç›®æ ‡æœºä¸Šä¸å—支æŒ" - - #: builtins.c:5729 - #, fuzzy, gcc-internal-format --#| msgid "__builtin_eh_return not supported on this target" - msgid "__builtin_set_thread_pointer is not supported on this target" - msgstr "__builtin_eh_return 在æ¤ç›®æ ‡æœºä¸Šä¸å—支æŒ" - -@@ -15189,7 +14731,6 @@ - - #: calls.c:3055 - #, fuzzy, gcc-internal-format --#| msgid "missing argument to %qs" - msgid "passing too large argument on stack" - msgstr "%qs缺少å‚æ•°" - -@@ -15335,7 +14876,6 @@ - - #: cfghooks.c:310 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "%s does not support duplicate_block" - msgid "%s does not support dump_bb_for_graph" - msgstr "%s ä¸æ”¯æŒ duplicate_block" - -@@ -15406,7 +14946,6 @@ - - #: cfghooks.c:984 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "%s does not support move_block_after" - msgid "%s does not support force_nonfallthru" - msgstr "%s ä¸æ”¯æŒt move_block_after" - -@@ -15447,7 +14986,6 @@ - - #: cfgloop.c:1356 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Enable loop header copying on trees" - msgid "loop with header %d not in loop tree" - msgstr "å¯ç”¨æ ‘上的循环ä¸å˜é‡è½¬ç§»" - -@@ -15468,13 +15006,11 @@ - - #: cfgloop.c:1395 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "bb %d do not belong to loop %d" - msgid "bb %d does not belong to loop %d" - msgstr "åŸºæœ¬å— %d ä¸å±žäºŽå¾ªçŽ¯ %d" - - #: cfgloop.c:1407 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "size of loop %d should be %d, not %d" - msgid "bb %d has father loop %d, should be loop %d" - msgstr "循环 %d 的大å°åº”该为 %d,而ä¸æ˜¯%d" - -@@ -15595,7 +15131,6 @@ - - #: cfgrtl.c:2428 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "verify_flow_info: REG_BR_PROB does not match cfg %wi %i" - msgid "verify_flow_info: REG_BR_PROB does not match cfg %i %i" - msgstr "verify_flow_info:REG_BR_PROB ä¸åŒ¹é… cfg %wi %i" - -@@ -15606,19 +15141,16 @@ - - #: cfgrtl.c:2454 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "fallthru edge crosses section boundary (bb %i)" - msgid "fallthru edge crosses section boundary in bb %i" - msgstr "直通边越过了节分界(åŸºæœ¬å— %i)" - - #: cfgrtl.c:2460 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "fallthru edge crosses section boundary (bb %i)" - msgid "EH edge crosses section boundary in bb %i" - msgstr "直通边越过了节分界(åŸºæœ¬å— %i)" - - #: cfgrtl.c:2467 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "fallthru edge crosses section boundary (bb %i)" - msgid "No region crossing jump at section boundary in bb %i" - msgstr "直通边越过了节分界(åŸºæœ¬å— %i)" - -@@ -15634,13 +15166,11 @@ - - #: cfgrtl.c:2510 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "missing REG_EH_REGION note in the end of bb %i" - msgid "missing REG_EH_REGION note at the end of bb %i" - msgstr "åŸºæœ¬å— %i 结尾缺少 REG_EH_REGION 记录" - - #: cfgrtl.c:2515 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "too many outgoing branch edges from bb %i" - msgid "too many exception handling edges in bb %i" - msgstr "ä»ŽåŸºæœ¬å— %i 分出太多的分支边" - -@@ -15651,31 +15181,26 @@ - - #: cfgrtl.c:2528 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "fallthru edge after unconditional jump %i" - msgid "fallthru edge after unconditional jump in bb %i" - msgstr "éžæ¡ä»¶è·³è½¬ %i 之åŽçš„直通边" - - #: cfgrtl.c:2533 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "wrong number of branch edges after unconditional jump %i" - msgid "wrong number of branch edges after unconditional jump in bb %i" - msgstr "éžæ¡ä»¶è·³è½¬ %i 之åŽçš„分支边数ä¸å¯¹" - - #: cfgrtl.c:2540 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "wrong amount of branch edges after conditional jump %i" - msgid "wrong amount of branch edges after conditional jump in bb %i" - msgstr "æ¡ä»¶è·³è½¬ %i 之åŽçš„分支边数ä¸å¯¹" - - #: cfgrtl.c:2546 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "call edges for non-call insn in bb %i" - msgid "abnormal call edges for non-call insn in bb %i" - msgstr "åœ¨åŸºæœ¬å— %i ä¸éžè°ƒç”¨æŒ‡ä»¤çš„调用边" - - #: cfgrtl.c:2551 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "call edges for non-call insn in bb %i" - msgid "sibcall edges for non-call insn in bb %i" - msgstr "åœ¨åŸºæœ¬å— %i ä¸éžè°ƒç”¨æŒ‡ä»¤çš„调用边" - -@@ -15801,7 +15326,6 @@ - - #: cgraph.c:2651 - #, fuzzy, gcc-internal-format --#| msgid "Assume symbols might be invalid" - msgid "local symbols must be defined" - msgstr "å‡å®šç¬¦å·å¯èƒ½æ— 效" - -@@ -15817,7 +15341,6 @@ - - #: cgraph.c:2666 - #, fuzzy, gcc-internal-format --#| msgid "inline clone is needed" - msgid "inline clone is forced to output" - msgstr "需è¦å†…è”克隆" - -@@ -15943,7 +15466,6 @@ - - #: cgraph.c:2895 - #, fuzzy, gcc-internal-format --#| msgid "expected statement" - msgid "reference to dead statement" - msgstr "需è¦è¯å¥" - -@@ -15984,7 +15506,6 @@ - - #: cgraphunit.c:774 - #, fuzzy, gcc-internal-format --#| msgid "Warn when an inlined function cannot be inlined" - msgid "always_inline function might not be inlinable" - msgstr "当内è”å‡½æ•°æ— æ³•è¢«å†…è”时给出è¦å‘Š" - -@@ -16010,7 +15531,6 @@ - - #: cgraphunit.c:1200 - #, fuzzy, gcc-internal-format --#| msgid "%q+D used prior to declaration" - msgid "%q+D aliased declaration" - msgstr "%q+D在声明å‰ä½¿ç”¨" - -@@ -16021,7 +15541,6 @@ - - #: cgraphunit.c:1303 - #, fuzzy, gcc-internal-format --#| msgid "failed to reclaim unneeded function" - msgid "failed to reclaim unneeded function in same comdat group" - msgstr "æ— æ³•æ”¶å›žä¸éœ€è¦çš„函数" - -@@ -16072,19 +15591,16 @@ - - #: collect2.c:1567 collect2.c:1750 collect2.c:1790 - #, fuzzy, gcc-internal-format --#| msgid "fopen %s" - msgid "fopen %s: %m" - msgstr "fopen %s" - - #: collect2.c:1570 collect2.c:1755 collect2.c:1793 - #, fuzzy, gcc-internal-format --#| msgid "fclose %s" - msgid "fclose %s: %m" - msgstr "fclose %s" - - #: collect2.c:1857 - #, fuzzy, gcc-internal-format --#| msgid "can't get program status: %s" - msgid "can't get program status: %m" - msgstr "æ— æ³•èŽ·å–程åºçŠ¶æ€ï¼š%s" - -@@ -16130,7 +15646,6 @@ - - #: collect2.c:2546 - #, fuzzy, gcc-internal-format --#| msgid "can't open nm output" - msgid "can't open nm output: %m" - msgstr "æ— æ³•æ‰“å¼€ nm 的输出" - -@@ -16151,7 +15666,6 @@ - - #: collect2.c:2742 - #, fuzzy, gcc-internal-format --#| msgid "can't open ldd output" - msgid "can't open ldd output: %m" - msgstr "æ— æ³•æ‰“å¼€ ldd 输出" - -@@ -16247,7 +15761,6 @@ - - #: coverage.c:291 - #, fuzzy, gcc-internal-format --#| msgid "checksum is %x instead of %x" - msgid "checksum is (%x,%x) instead of (%x,%x)" - msgstr "检验和是 %x 而ä¸æ˜¯ %x" - -@@ -16273,7 +15786,6 @@ - - #: coverage.c:393 - #, fuzzy, gcc-internal-format --#| msgid "execution counts estimated" - msgid "execution counts estimated\n" - msgstr "预计执行次数" - -@@ -16374,7 +15886,6 @@ - - #: dumpfile.c:862 - #, fuzzy, gcc-internal-format --#| msgid "ignoring unknown option %q.*s in %<-fdump-%s%>" - msgid "unknown option %q.*s in %<-fopt-info-%s%>" - msgstr "忽略未知的选项%q.*s,在%<-fdump-%s%>ä¸" - -@@ -16390,7 +15901,6 @@ - - #: dwarf2out.c:11303 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "non-delegitimized UNSPEC %d found in variable location" - msgid "non-delegitimized UNSPEC %s (%d) found in variable location" - msgstr "å˜é‡ä½ç½®å¤„å‘现未被éžæ³•åŒ–çš„ UNSPEC %d" - -@@ -16481,7 +15991,6 @@ - - #: expr.c:7657 - #, fuzzy, gcc-internal-format --#| msgid "global register variable %qD used in nested function" - msgid "local frame unavailable (naked function?)" - msgstr "嵌套函数ä¸ä½¿ç”¨äº†å…¨å±€å¯„å˜å™¨å˜é‡%qD" - -@@ -16853,7 +16362,6 @@ - - #: gcc.c:7131 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "-fuse-linker-plugin, but " - msgid "-fuse-linker-plugin, but %s not found" - msgstr "使用了 -fuse-linker-plugin,但" - -@@ -16944,7 +16452,6 @@ - - #: gcc.c:8636 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "too few arguments to function" - msgid "too few arguments to %%:replace-extension" - msgstr "给予函数的实å‚太少" - -@@ -17042,13 +16549,11 @@ - - #: gimplify.c:5647 - #, fuzzy, gcc-internal-format --#| msgid "%qE not specified in enclosing parallel" - msgid "%qE not specified in enclosing task" - msgstr "%qE未为在括入的并行ä¸æŒ‡å®š" - - #: gimplify.c:5653 - #, fuzzy, gcc-internal-format --#| msgid "%qE not specified in enclosing parallel" - msgid "%qE not specified in enclosing teams construct" - msgstr "%qE未为在括入的并行ä¸æŒ‡å®š" - -@@ -17069,7 +16574,6 @@ - - #: gimplify.c:5770 gimplify.c:5799 - #, fuzzy, gcc-internal-format --#| msgid "iteration variable %qE should not be reduction" - msgid "iteration variable %qE is predetermined linear" - msgstr "è¿ä»£å˜é‡%qEä¸åº”当是 reduction" - -@@ -17090,19 +16594,16 @@ - - #: gimplify.c:5793 - #, fuzzy, gcc-internal-format --#| msgid "iteration variable %qE should not be firstprivate" - msgid "iteration variable %qE should not be lastprivate" - msgstr "è¿ä»£å˜é‡%qEä¸åº”当是 firstprivate" - - #: gimplify.c:5796 - #, fuzzy, gcc-internal-format --#| msgid "iteration variable %qE should be private" - msgid "iteration variable %qE should not be private" - msgstr "è¿ä»£å˜é‡%qE应当是ç§æœ‰çš„" - - #: gimplify.c:6064 - #, fuzzy, gcc-internal-format --#| msgid "%s variable %qE is private in outer context" - msgid "copyprivate variable %qE is not threadprivate or private in outer context" - msgstr "%s å˜é‡%qE在外层上下文ä¸æ˜¯ç§æœ‰çš„" - -@@ -17113,7 +16614,6 @@ - - #: gimplify.c:8063 - #, fuzzy, gcc-internal-format --#| msgid "expected %<}%> before %<else%>" - msgid "expected %<_Cilk_spawn%> before %<_Cilk_sync%>" - msgstr "%<else%>å‰éœ€è¦%<}%>" - -@@ -17170,7 +16670,6 @@ - - #: ipa-devirt.c:302 ipa-devirt.c:337 - #, fuzzy, gcc-internal-format --#| msgid "previous definition here" - msgid "type %qD violates one definition rule " - msgstr "å…ˆå‰çš„定义在这里" - -@@ -17212,7 +16711,6 @@ - - #: ira.c:5544 - #, fuzzy, gcc-internal-format --#| msgid "as %qD" - msgid "for %qD" - msgstr "作为%qD" - -@@ -17238,7 +16736,6 @@ - - #: lto-cgraph.c:1083 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "bytecode stream: found multiple instances of cgraph node %d" - msgid "bytecode stream: found multiple instances of cgraph node with uid %d" - msgstr "å—节ç æµï¼šæ‰¾åˆ° cgraph 节点 %d 的多个实例" - -@@ -17312,19 +16809,16 @@ - - #: lto-streamer-in.c:824 - #, fuzzy, gcc-internal-format --#| msgid "operand number out of range" - msgid "Reference statement index out of range" - msgstr "æ“作数å·è¶…出范围" - - #: lto-streamer-in.c:827 - #, fuzzy, gcc-internal-format --#| msgid "Warn if deprecated empty statements are found" - msgid "Reference statement index not found" - msgstr "å‘现ä¸å»ºè®®ä½¿ç”¨çš„空è¯å¥æ—¶ç»™å‡ºè¦å‘Š" - - #: lto-streamer-out.c:393 lto-streamer-out.c:1307 - #, fuzzy, gcc-internal-format --#| msgid "tree code %qs is not supported in gimple streams" - msgid "tree code %qs is not supported in LTO streams" - msgstr "æ ‘ä»£ç %qs在 gimple æµä¸ä¸è¢«æ”¯æŒ" - -@@ -17370,13 +16864,11 @@ - - #: omp-low.c:2351 omp-low.c:2364 - #, fuzzy, gcc-internal-format --#| msgid "%<#pragma omp section%> may only be used in %<#pragma omp sections%> construct" - msgid "%<#pragma omp cancel sections%> inside %<nowait%> sections construct" - msgstr "%<#pragma omp section%>åªèƒ½ç”¨åœ¨%<#pragma omp sections%>结构ä¸" - - #: omp-low.c:2378 - #, fuzzy, gcc-internal-format --#| msgid "invalid PHI argument" - msgid "invalid arguments" - msgstr "æ— æ•ˆçš„ PHI 实å‚" - -@@ -17417,7 +16909,6 @@ - - #: omp-low.c:2492 - #, fuzzy, gcc-internal-format --#| msgid "master region may not be closely nested inside of work-sharing or explicit task region" - msgid "teams construct not closely nested inside of target region" - msgstr "主è¦åŒºåŸŸä¸å¯ä»¥ç´§å¯†åµŒå¥—在工作共享或显å¼çš„任务区域内" - -@@ -17438,13 +16929,11 @@ - - #: omp-low.c:10275 - #, fuzzy, gcc-internal-format --#| msgid "invalid entry to OpenMP structured block" - msgid "invalid entry to Cilk Plus structured block" - msgstr "OpenMP 结构å—å…¥å£æ— 效" - - #: omp-low.c:10283 - #, fuzzy, gcc-internal-format --#| msgid "invalid branch to/from an OpenMP structured block" - msgid "invalid branch to/from a Cilk Plus structured block" - msgstr "进出 OpenMP 结构å—çš„åˆ†æ”¯æ— æ•ˆ" - -@@ -17455,7 +16944,6 @@ - - #: omp-low.c:10761 - #, fuzzy, gcc-internal-format --#| msgid "ignoring duplicate directory \"%s\"\n" - msgid "ignoring large linear step" - msgstr "忽略é‡å¤çš„目录“%sâ€\n" - -@@ -17558,7 +17046,6 @@ - - #: opts.c:695 - #, fuzzy, gcc-internal-format --#| msgid "-static-libgfortran is not supported in this configuration" - msgid "transactional memory is not supported with non-call exceptions" - msgstr "-static-libgfortran 在æ¤é…置下ä¸å—支æŒ" - -@@ -17705,7 +17192,6 @@ - - #: passes.c:107 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "%s does not support split_edge" - msgid "pass %s does not support cloning" - msgstr "%s ä¸æ”¯æŒ split_edge" - -@@ -17721,13 +17207,11 @@ - - #: passes.c:999 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "unknown field %qE specified in initializer" - msgid "unknown pass %s specified in -fenable" - msgstr "åˆå§‹å€¼è®¾å®šé¡¹é‡Œæœ‰æœªçŸ¥çš„å—段%qE" - - #: passes.c:1001 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "unknown field %qE specified in initializer" - msgid "unknown pass %s specified in -fdisable" - msgstr "åˆå§‹å€¼è®¾å®šé¡¹é‡Œæœ‰æœªçŸ¥çš„å—段%qE" - -@@ -17743,19 +17227,16 @@ - - #: passes.c:1065 passes.c:1093 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "invalid floating point option: -mfpu=%s" - msgid "Invalid range %s in option %s" - msgstr "æ— æ•ˆçš„æµ®ç‚¹é€‰é¡¹ï¼š-mfpu=%s" - - #: passes.c:1111 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "invalid storage class for function %qE" - msgid "enable pass %s for function %s" - msgstr "函数%qEå˜å‚¨ç±»æ— 效" - - #: passes.c:1122 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "invalid storage class for function %qE" - msgid "disable pass %s for function %s" - msgstr "函数%qEå˜å‚¨ç±»æ— 效" - -@@ -17859,7 +17340,6 @@ - - #: predict.c:2805 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Missing argument list in function '%s' at %C" - msgid "Missing counts for called function %s/%i" - msgstr "函数‘%s’在%C处缺少å‚数列表" - -@@ -17967,13 +17447,11 @@ - - #: reginfo.c:770 - #, fuzzy, gcc-internal-format --#| msgid "register used for two global register variables" - msgid "register of %qD used for multiple global register variables" - msgstr "寄å˜å™¨ç”¨ä½œä¸¤ä¸ªå…¨å±€å¯„å˜å™¨å˜é‡" - - #: reginfo.c:773 - #, fuzzy, gcc-internal-format --#| msgid " conflict with %q+D" - msgid "conflicts with %qD" - msgstr " 与%q+D冲çª" - -@@ -18199,25 +17677,21 @@ - - #: symtab.c:736 - #, fuzzy, gcc-internal-format --#| msgid "function returning a function" - msgid "function symbol is not function" - msgstr "函数返回了一个函数" - - #: symtab.c:744 - #, fuzzy, gcc-internal-format --#| msgid "array is not addressable" - msgid "variable symbol is not variable" - msgstr "数组ä¸èƒ½è¢«å–指" - - #: symtab.c:750 - #, fuzzy, gcc-internal-format --#| msgid "node has wrong clone list" - msgid "node has unknown type" - msgstr "节点的克隆列表ä¸æ£ç¡®" - - #: symtab.c:759 - #, fuzzy, gcc-internal-format --#| msgid "node not found in cgraph_hash" - msgid "node not found in symtab decl hashtable" - msgstr "cgraph_hash ä¸æ‰¾ä¸åˆ°èŠ‚点" - -@@ -18233,19 +17707,16 @@ - - #: symtab.c:790 - #, fuzzy, gcc-internal-format --#| msgid "node not found in cgraph_hash" - msgid "node not found in symtab assembler name hash" - msgstr "cgraph_hash ä¸æ‰¾ä¸åˆ°èŠ‚点" - - #: symtab.c:797 - #, fuzzy, gcc-internal-format --#| msgid "double linked list of clones corrupted" - msgid "double linked list of assembler names corrupted" - msgstr "åŒå‘克隆链接列表已æŸå" - - #: symtab.c:802 - #, fuzzy, gcc-internal-format --#| msgid "node is in clone list but it is not clone" - msgid "node is analyzed byt it is not a definition" - msgstr "节点在克隆列表ä¸ï¼Œä½†å¹¶ä¸æ˜¯å…‹éš†" - -@@ -18256,7 +17727,6 @@ - - #: symtab.c:813 - #, fuzzy, gcc-internal-format --#| msgid "node is in clone list but it is not clone" - msgid "node is alias but not definition" - msgstr "节点在克隆列表ä¸ï¼Œä½†å¹¶ä¸æ˜¯å…‹éš†" - -@@ -18272,7 +17742,6 @@ - - #: symtab.c:832 - #, fuzzy, gcc-internal-format --#| msgid "Combining units with different profiles is not supported." - msgid "mixing different types of symbol in same comdat groups is not supported" - msgstr "ä¸æ”¯æŒç»„åˆæœ‰ä¸åŒå–æ ·ä¿¡æ¯çš„å•å…ƒã€‚" - -@@ -18293,13 +17762,11 @@ - - #: symtab.c:885 - #, fuzzy, gcc-internal-format --#| msgid "verify_cgraph_node failed" - msgid "verify_symtab_node failed" - msgstr "verify_cgraph_node 失败" - - #: symtab.c:1110 - #, fuzzy, gcc-internal-format --#| msgid "function %q+D redeclared as inline" - msgid "function %q+D part of alias cycle" - msgstr "函数%q+Dé‡å£°æ˜Žä¸ºå†…è”çš„" - -@@ -18335,13 +17802,11 @@ - - #: tlink.c:489 - #, fuzzy, gcc-internal-format --#| msgid "removing .rpo file" - msgid "removing .rpo file: %m" - msgstr "åˆ é™¤ .rpo 文件" - - #: tlink.c:491 - #, fuzzy, gcc-internal-format --#| msgid "renaming .rpo file" - msgid "renaming .rpo file: %m" - msgstr "é‡å‘½å .rpo 文件" - -@@ -18382,7 +17847,6 @@ - - #: toplev.c:989 - #, fuzzy, gcc-internal-format --#| msgid "-fstack-usage not supported for this target" - msgid "stack usage computation not supported for this target" - msgstr "-fstack-usage 在æ¤ç›®æ ‡æœºä¸Šä¸å—支æŒ" - -@@ -18393,13 +17857,11 @@ - - #: toplev.c:1060 - #, fuzzy, gcc-internal-format --#| msgid "stackframe too big: %d bytes" - msgid "stack usage might be %wd bytes" - msgstr "æ ˆå¸§å¤ªå¤§ï¼š%d å—节" - - #: toplev.c:1063 - #, fuzzy, gcc-internal-format --#| msgid "stackframe too big: %d bytes" - msgid "stack usage is %wd bytes" - msgstr "æ ˆå¸§å¤ªå¤§ï¼š%d å—节" - -@@ -18495,7 +17957,6 @@ - - #: toplev.c:1559 - #, fuzzy, gcc-internal-format --#| msgid "-fdata-sections not supported for this target" - msgid "-fsanitize=address not supported for this target" - msgstr "-fdata-sections 在æ¤ç›®æ ‡æœºä¸Šä¸å—支æŒ" - -@@ -18511,7 +17972,6 @@ - - #: trans-mem.c:614 - #, fuzzy, gcc-internal-format --#| msgid "invalid use of %qD in linkage specification" - msgid "invalid volatile use of %qD inside transaction" - msgstr "指定链接时使用%qDæ— æ•ˆ" - -@@ -18532,7 +17992,6 @@ - - #: trans-mem.c:725 - #, fuzzy, gcc-internal-format --#| msgid "indirect function call with a yet undetermined callee" - msgid "unsafe indirect function call within atomic transaction" - msgstr "é—´æŽ¥å‡½æ•°è°ƒç”¨ç›®æ ‡æœªå®šä¹‰" - -@@ -18548,25 +18007,21 @@ - - #: trans-mem.c:743 - #, fuzzy, gcc-internal-format --#| msgid "indirect function call with a yet undetermined callee" - msgid "unsafe indirect function call within %<transaction_safe%> function" - msgstr "é—´æŽ¥å‡½æ•°è°ƒç”¨ç›®æ ‡æœªå®šä¹‰" - - #: trans-mem.c:758 trans-mem.c:4721 - #, fuzzy, gcc-internal-format --#| msgid "namespace %qD not allowed in using-declaration" - msgid "asm not allowed in atomic transaction" - msgstr "ä¸å…许在 using 声明ä¸ä½¿ç”¨å‘½å空间%qD" - - #: trans-mem.c:761 - #, fuzzy, gcc-internal-format --#| msgid "attributes are not allowed on a function-definition" - msgid "asm not allowed in %<transaction_safe%> function" - msgstr "函数定义ä¸ä¸å…许有属性" - - #: trans-mem.c:772 - #, fuzzy, gcc-internal-format --#| msgid "Place each function into its own section" - msgid "relaxed transaction in atomic transaction" - msgstr "å°†æ¯ä¸ªå‡½æ•°åˆ†åˆ«æ”¾åœ¨å®ƒä»¬å„自的节ä¸" - -@@ -18577,7 +18032,6 @@ - - #: trans-mem.c:782 - #, fuzzy, gcc-internal-format --#| msgid "pointer to a function used in subtraction" - msgid "outer transaction in transaction" - msgstr "函数指针ä¸èƒ½ç›¸å‡" - -@@ -18593,7 +18047,6 @@ - - #: trans-mem.c:4348 - #, fuzzy, gcc-internal-format --#| msgid "attributes are not allowed on a function-definition" - msgid "%Kasm not allowed in %<transaction_safe%> function" - msgstr "函数定义ä¸ä¸å…许有属性" - -@@ -18684,7 +18137,6 @@ - - #: tree-cfg.c:2836 - #, fuzzy, gcc-internal-format --#| msgid "invalid position or size operand to BIT_FIELD_REF" - msgid "position plus size exceeds size of referenced object in BIT_FIELD_REF" - msgstr "BIT_FIELD_REF ä½ç½®æˆ–大å°æ“ä½œæ•°æ— æ•ˆ" - -@@ -18850,31 +18302,26 @@ - - #: tree-cfg.c:3333 - #, fuzzy, gcc-internal-format --#| msgid "type mismatch in comparison expression" - msgid "mismatching comparison operand types" - msgstr "比较表达å¼ç±»åž‹ä¸åŒ¹é…" - - #: tree-cfg.c:3347 - #, fuzzy, gcc-internal-format --#| msgid "function returning a function" - msgid "vector comparison returning a boolean" - msgstr "函数返回了一个函数" - - #: tree-cfg.c:3361 - #, fuzzy, gcc-internal-format --#| msgid "invalid operands in gimple comparison" - msgid "non-vector operands in vector comparison" - msgstr "gimple 比较ä¸æ“ä½œæ•°æ— æ•ˆ" - - #: tree-cfg.c:3374 - #, fuzzy, gcc-internal-format --#| msgid "invalid vector permutation constant" - msgid "invalid vector comparison resulting type" - msgstr "æ— æ•ˆçš„å‘é‡ç½®æ¢å¸¸é‡" - - #: tree-cfg.c:3381 - #, fuzzy, gcc-internal-format --#| msgid "Warn about comparison of different enum types" - msgid "bogus comparison result type" - msgstr "对ä¸åŒæžšä¸¾ç±»åž‹ä¹‹é—´çš„比较给出è¦å‘Š" - -@@ -18950,7 +18397,6 @@ - - #: tree-cfg.c:3660 tree-cfg.c:3681 - #, fuzzy, gcc-internal-format --#| msgid "type mismatch in vector shift expression" - msgid "type mismatch in widening vector shift expression" - msgstr "å‘é‡ç§»ä½è¡¨è¾¾å¼ç±»åž‹ä¸åŒ¹é…" - -@@ -19001,13 +18447,11 @@ - - #: tree-cfg.c:3900 - #, fuzzy, gcc-internal-format --#| msgid "type mismatch in vector shift expression" - msgid "type mismatch in vector permute expression" - msgstr "å‘é‡ç§»ä½è¡¨è¾¾å¼ç±»åž‹ä¸åŒ¹é…" - - #: tree-cfg.c:3912 - #, fuzzy, gcc-internal-format --#| msgid "expected integer expression" - msgid "vector types expected in vector permute expression" - msgstr "需è¦æ•´æ•°è¡¨è¾¾å¼" - -@@ -19018,7 +18462,6 @@ - - #: tree-cfg.c:3939 - #, fuzzy, gcc-internal-format --#| msgid "invalid increment expression" - msgid "invalid mask type in vector permute expression" - msgstr "æ— æ•ˆçš„è‡ªå¢žè¯å¥" - -@@ -19084,43 +18527,36 @@ - - #: tree-cfg.c:4268 - #, fuzzy, gcc-internal-format --#| msgid "invalid operand to switch statement" - msgid "non-integral type switch statement" - msgstr "开关è¯å¥æ“ä½œæ•°æ— æ•ˆ" - - #: tree-cfg.c:4276 - #, fuzzy, gcc-internal-format --#| msgid "%<default%> label not within a switch statement" - msgid "invalid default case label in switch statement" - msgstr "%<default%>æ ‡å·æœªå‡ºçŽ°åœ¨ switch è¯å¥å†…" - - #: tree-cfg.c:4288 - #, fuzzy, gcc-internal-format --#| msgid "case label not within a switch statement" - msgid "invalid case label in switch statement" - msgstr "case æ ‡å·å‡ºçŽ°åœ¨å¼€å…³è¯å¥å¤–" - - #: tree-cfg.c:4295 - #, fuzzy, gcc-internal-format --#| msgid "invalid operand to switch statement" - msgid "invalid case range in switch statement" - msgstr "开关è¯å¥æ“ä½œæ•°æ— æ•ˆ" - - #: tree-cfg.c:4305 - #, fuzzy, gcc-internal-format --#| msgid "case label not within a switch statement" - msgid "type mismatch for case label in switch statement" - msgstr "case æ ‡å·å‡ºçŽ°åœ¨å¼€å…³è¯å¥å¤–" - - #: tree-cfg.c:4315 - #, fuzzy, gcc-internal-format --#| msgid "case label not within a switch statement" - msgid "type precision mismatch in switch statement" - msgstr "case æ ‡å·å‡ºçŽ°åœ¨å¼€å…³è¯å¥å¤–" - - #: tree-cfg.c:4324 - #, fuzzy, gcc-internal-format --#| msgid "case label not within a switch statement" - msgid "case labels not sorted in switch statement" - msgstr "case æ ‡å·å‡ºçŽ°åœ¨å¼€å…³è¯å¥å¤–" - -@@ -19191,7 +18627,6 @@ - - #: tree-cfg.c:4816 - #, fuzzy, gcc-internal-format --#| msgid "from this location" - msgid "PHI node with location" - msgstr "从这个地方" - -@@ -19327,13 +18762,11 @@ - - #: tree-diagnostic.c:203 - #, fuzzy, gcc-internal-format --#| msgid "redefinition of %q+D" - msgid "in definition of macro %qs" - msgstr "%q+Dé‡å®šä¹‰" - - #: tree-diagnostic.c:220 - #, fuzzy, gcc-internal-format --#| msgid "%s:%d: in constexpr expansion of %qs" - msgid "in expansion of macro %qs" - msgstr "%s:%d:在%qs的广义常表达å¼æ‰©å±•ä¸" - -@@ -19439,7 +18872,6 @@ - - #: tree-inline.c:4147 - #, fuzzy, gcc-internal-format --#| msgid "inlining failed in call to %q+F: %s" - msgid "inlining failed in call to always_inline %q+F: %s" - msgstr "调用%q+F时内è”失败:%s" - -@@ -19466,7 +18898,6 @@ - - #: tree-ssa-loop-niter.c:2632 - #, fuzzy, gcc-internal-format --#| msgid "operation on %qE may be undefined" - msgid "iteration %E invokes undefined behavior" - msgstr "%qE上的è¿ç®—结果å¯èƒ½æ˜¯æœªå®šä¹‰çš„" - -@@ -19482,7 +18913,6 @@ - - #: tree-ssa-operands.c:1001 - #, fuzzy, gcc-internal-format --#| msgid "invalid operand in return statement" - msgid "virtual def operand missing for stmt" - msgstr "返回è¯å¥æ“ä½œæ•°æ— æ•ˆ" - -@@ -19503,7 +18933,6 @@ - - #: tree-ssa-operands.c:1042 - #, fuzzy, gcc-internal-format --#| msgid "operand number missing after %%-letter" - msgid "use operand missing for stmt" - msgstr "%% å—æ¯åŽç¼ºå°‘æ“作数å·" - -@@ -19529,13 +18958,11 @@ - - #: tree-ssa-uninit.c:238 - #, fuzzy, gcc-internal-format --#| msgid "%qD is used uninitialized in this function" - msgid "%qE is used uninitialized in this function" - msgstr "æ¤å‡½æ•°ä¸çš„%qD在使用å‰æœªåˆå§‹åŒ–" - - #: tree-ssa-uninit.c:243 - #, fuzzy, gcc-internal-format --#| msgid "%qD may be used uninitialized in this function" - msgid "%qE may be used uninitialized in this function" - msgstr "æ¤å‡½æ•°ä¸çš„%qD在使用å‰å¯èƒ½æœªåˆå§‹åŒ–" - -@@ -19676,7 +19103,6 @@ - - #: tree-streamer-out.c:510 - #, fuzzy, gcc-internal-format --#| msgid "gimple bytecode streams do not support machine specific builtin functions on this target" - msgid "tree bytecode streams do not support machine specific builtin functions on this target" - msgstr "GIMPLE å—节ç æµåœ¨æ¤ç›®æ ‡æœºä¸Šä¸æ”¯æŒæœºå™¨ç›¸å…³çš„内建函数" - -@@ -19882,37 +19308,31 @@ - - #: tree.c:12081 - #, fuzzy --#| msgid "%qD is deprecated (declared at %s:%d): %s" - msgid "%qD is deprecated (declared at %r%s:%d%R): %s" - msgstr "ä¸å»ºè®®ä½¿ç”¨%qD(声明于 %s:%d):%s" - - #: tree.c:12085 - #, fuzzy --#| msgid "%qD is deprecated (declared at %s:%d)" - msgid "%qD is deprecated (declared at %r%s:%d%R)" - msgstr "ä¸å»ºè®®ä½¿ç”¨%qD(声明于 %s:%d)" - - #: tree.c:12110 - #, fuzzy --#| msgid "%qE is deprecated (declared at %s:%d): %s" - msgid "%qE is deprecated (declared at %r%s:%d%R): %s" - msgstr "ä¸å»ºè®®ä½¿ç”¨%qE(声明于 %s:%d):%s" - - #: tree.c:12114 - #, fuzzy --#| msgid "%qE is deprecated (declared at %s:%d)" - msgid "%qE is deprecated (declared at %r%s:%d%R)" - msgstr "ä¸å»ºè®®ä½¿ç”¨%qE(声明于 %s:%d)" - - #: tree.c:12121 - #, fuzzy --#| msgid "type is deprecated (declared at %s:%d): %s" - msgid "type is deprecated (declared at %r%s:%d%R): %s" - msgstr "ä¸å»ºè®®ä½¿ç”¨ç±»åž‹(声明于 %s:%d):%s" - - #: tree.c:12125 - #, fuzzy --#| msgid "type is deprecated (declared at %s:%d)" - msgid "type is deprecated (declared at %r%s:%d%R)" - msgstr "ä¸å»ºè®®ä½¿ç”¨ç±»åž‹(声明于 %s:%d)" - -@@ -19968,13 +19388,11 @@ - - #: varasm.c:319 - #, fuzzy, gcc-internal-format --#| msgid "%+D causes a section type conflict" - msgid "%+D causes a section type conflict with %D" - msgstr "%+D 导致一个节类型冲çª" - - #: varasm.c:322 - #, fuzzy, gcc-internal-format --#| msgid " conflict with %q+D" - msgid "section type conflict with %D" - msgstr " 与%q+D冲çª" - -@@ -19985,13 +19403,11 @@ - - #: varasm.c:329 - #, fuzzy, gcc-internal-format --#| msgid "%+D causes a section type conflict" - msgid "section type conflict" - msgstr "%+D 导致一个节类型冲çª" - - #: varasm.c:977 - #, fuzzy, gcc-internal-format --#| msgid "alignment of %q+D is greater than maximum object file alignment. Using %d" - msgid "alignment of %q+D is greater than maximum object file alignment %d" - msgstr "%q+D的对é½è¦æ±‚å¤§äºŽç›®æ ‡æ–‡ä»¶çš„æœ€å¤§å¯¹é½è¾¹ç•Œã€‚使用 %d" - -@@ -20012,13 +19428,11 @@ - - #: varasm.c:1295 - #, fuzzy, gcc-internal-format --#| msgid "register specified for %q+D isn%'t suitable for data type" - msgid "the register specified for %q+D cannot be accessed by the current target" - msgstr "为%q+D指定的寄å˜å™¨ä¸é€‚åˆæ¤æ•°æ®ç±»åž‹" - - #: varasm.c:1298 - #, fuzzy, gcc-internal-format --#| msgid "register used for two global register variables" - msgid "the register specified for %q+D is not general enough to be used as a register variable" - msgstr "寄å˜å™¨ç”¨ä½œä¸¤ä¸ªå…¨å±€å¯„å˜å™¨å˜é‡" - -@@ -20094,7 +19508,6 @@ - - #: varasm.c:5600 - #, fuzzy, gcc-internal-format --#| msgid "nested functions not supported on this target" - msgid "ifunc is not supported on this target" - msgstr "嵌套函数在æ¤ç›®æ ‡æœºä¸Šä¸å—支æŒ" - -@@ -20141,13 +19554,11 @@ - - #: c-family/array-notation-common.c:70 - #, fuzzy, gcc-internal-format --#| msgid "case label is not an integer constant expression" - msgid "__sec_implicit_index parameter must be an integer constant expression" - msgstr "case æ ‡å·ä¸æ˜¯ä¸€ä¸ªæ•´æ•°å¸¸é‡è¡¨è¾¾å¼" - - #: c-family/array-notation-common.c:106 - #, fuzzy, gcc-internal-format --#| msgid "type mismatch in shift expression" - msgid "length mismatch in expression" - msgstr "移ä½è¡¨è¾¾å¼ç±»åž‹ä¸åŒ¹é…" - -@@ -20154,7 +19565,6 @@ - #: c-family/array-notation-common.c:278 c-family/array-notation-common.c:306 - #: c/c-array-notation.c:721 cp/cp-array-notation.c:610 - #, fuzzy, gcc-internal-format --#| msgid "comparison between %qT and %qT" - msgid "rank mismatch between %qE and %qE" - msgstr "在%qTå’Œ%qT间比较" - -@@ -20166,7 +19576,6 @@ - #. may lie in the original expression. - #: c-family/array-notation-common.c:287 - #, fuzzy, gcc-internal-format --#| msgid "type mismatch in shift expression" - msgid "rank mismatch in expression %qE" - msgstr "移ä½è¡¨è¾¾å¼ç±»åž‹ä¸åŒ¹é…" - -@@ -20177,19 +19586,16 @@ - - #: c-family/c-cilkplus.c:39 - #, fuzzy, gcc-internal-format --#| msgid "iteration variable %qE should be private" - msgid "iteration variable cannot be volatile" - msgstr "è¿ä»£å˜é‡%qE应当是ç§æœ‰çš„" - - #: c-family/c-cilkplus.c:82 - #, fuzzy, gcc-internal-format --#| msgid "%qE appears more than once in data clauses" - msgid "variable appears in more than one clause" - msgstr "%qE在数æ®åå¥ä¸å¤šæ¬¡å‡ºçŽ°" - - #: c-family/c-cilkplus.c:84 - #, fuzzy, gcc-internal-format --#| msgid "struct defined here" - msgid "other clause defined here" - msgstr "结构在æ¤å®šä¹‰" - -@@ -20400,13 +19806,11 @@ - - #: c-family/c-common.c:2333 - #, fuzzy, gcc-internal-format --#| msgid "the last argument must be an 8-bit immediate" - msgid "__builtin_shuffle last argument must be an integer vector" - msgstr "最åŽä¸€ä¸ªå®žå‚必须是一个 8 ä½ç«‹å³æ•°" - - #: c-family/c-common.c:2342 - #, fuzzy, gcc-internal-format --#| msgid "%<__builtin_longjmp%> second argument must be 1" - msgid "__builtin_shuffle arguments must be vectors" - msgstr "%<__builtin_longjmp%>的第二个实å‚必须是 1" - -@@ -20557,13 +19961,11 @@ - - #: c-family/c-common.c:4958 - #, fuzzy, gcc-internal-format --#| msgid "ISO C++ does not allow %<alignof%> with a non-type" - msgid "ISO C++ does not permit %<alignof%> applied to a function type" - msgstr "ISO C++ ä¸å…许对éžç±»åž‹ä½¿ç”¨%<alignof%>" - - #: c-family/c-common.c:4961 - #, fuzzy, gcc-internal-format --#| msgid "ISO C++ does not allow %<alignof%> with a non-type" - msgid "ISO C does not permit %<_Alignof%> applied to a function type" - msgstr "ISO C++ ä¸å…许对éžç±»åž‹ä½¿ç”¨%<alignof%>" - -@@ -20574,13 +19976,11 @@ - - #: c-family/c-common.c:4981 - #, fuzzy, gcc-internal-format --#| msgid "invalid application of %qs to incomplete type %qT " - msgid "invalid application of %qs to incomplete type %qT" - msgstr "%qsä¸èƒ½ç”¨äºŽä¸å®Œå…¨çš„类型%qT" - - #: c-family/c-common.c:4989 - #, fuzzy, gcc-internal-format --#| msgid "invalid application of %qs to incomplete type %qT " - msgid "invalid application of %qs to array type %qT of incomplete element type" - msgstr "%qsä¸èƒ½ç”¨äºŽä¸å®Œå…¨çš„类型%qT" - -@@ -20787,13 +20187,11 @@ - - #: c-family/c-common.c:7417 - #, fuzzy, gcc-internal-format --#| msgid "requested alignment is not a constant" - msgid "requested alignment is not an integer constant" - msgstr "è¦æ±‚的对é½è¾¹ç•Œä¸æ˜¯å¸¸é‡" - - #: c-family/c-common.c:7425 - #, fuzzy, gcc-internal-format --#| msgid "requested alignment is not a power of 2" - msgid "requested alignment is not a positive power of 2" - msgstr "è¦æ±‚的对é½è¾¹ç•Œä¸æ˜¯ 2 çš„æŸæ¬¡æ–¹" - -@@ -20804,7 +20202,6 @@ - - #: c-family/c-common.c:7513 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "requested alignment is too large" - msgid "requested alignment %d is larger than %d" - msgstr "è¦æ±‚的对é½è¾¹ç•Œå¤ªå¤§" - -@@ -20921,37 +20318,31 @@ - - #: c-family/c-common.c:8190 - #, fuzzy, gcc-internal-format --#| msgid "%qE attribute ignored" - msgid "%qE attribute duplicated" - msgstr "%qE属性被忽略" - - #: c-family/c-common.c:8192 - #, fuzzy, gcc-internal-format --#| msgid "%qE attribute ignored for %qE" - msgid "%qE attribute follows %qE" - msgstr "%qE属性为%qE所忽略" - - #: c-family/c-common.c:8291 - #, fuzzy, gcc-internal-format --#| msgid "previously declared here" - msgid "type was previously declared %qE" - msgstr "以å‰åœ¨æ¤å£°æ˜Žè¿‡" - - #: c-family/c-common.c:8344 - #, fuzzy, gcc-internal-format --#| msgid "cleanup argument not an identifier" - msgid "%qE argument not an identifier" - msgstr "cleanup 实å‚ä¸æ˜¯ä¸€ä¸ªæ ‡è¯†ç¬¦" - - #: c-family/c-common.c:8355 - #, fuzzy, gcc-internal-format --#| msgid "%qD is not declared in %qD" - msgid "%qD is not compatible with %qD" - msgstr "%qD未在%qDä¸å£°æ˜Ž" - - #: c-family/c-common.c:8358 - #, fuzzy, gcc-internal-format --#| msgid "cleanup argument not a function" - msgid "transaction_wrap argument is not a function" - msgstr "cleanup 实å‚ä¸æ˜¯ä¸€ä¸ªå‡½æ•°" - -@@ -21095,7 +20486,6 @@ - - #: c-family/c-common.c:9343 - #, fuzzy, gcc-internal-format --#| msgid "non-const integer argument %u in call to function %qE" - msgid "non-integer argument 3 in call to function %qE" - msgstr "给予函数%2$qEçš„å‚æ•°%1$uä¸æ˜¯æ•´åž‹å¸¸é‡" - -@@ -21316,7 +20706,6 @@ - - #: c-family/c-common.c:9932 - #, fuzzy, gcc-internal-format --#| msgid "invalid type argument of %<->%> (have %qT)" - msgid "invalid type argument of %<->*%> (have %qT)" - msgstr "%<->%>å‚æ•°ç±»åž‹æ— æ•ˆ(有%qT)" - -@@ -21342,49 +20731,41 @@ - - #: c-family/c-common.c:10277 - #, fuzzy, gcc-internal-format --#| msgid "not enough arguments to function %qE" - msgid "incorrect number of arguments to function %qE" - msgstr "æ供给函数%qE的实å‚太少" - - #: c-family/c-common.c:10285 - #, fuzzy, gcc-internal-format --#| msgid "argument %d of %qE must be an address" - msgid "argument 1 of %qE must be a non-void pointer type" - msgstr "%2$qEçš„å®žå‚ %1$d 必须是地å€" - - #: c-family/c-common.c:10294 - #, fuzzy, gcc-internal-format --#| msgid "%Kfirst argument of %D must be a pointer, second integer constant" - msgid "argument 1 of %qE must be a pointer to a constant size type" - msgstr "%K%D 的第一个实å‚必须是一个指针,第二个必须是整常é‡" - - #: c-family/c-common.c:10305 - #, fuzzy, gcc-internal-format --#| msgid "%Kfirst argument of %D must be a pointer, second integer constant" - msgid "argument 1 of %qE must be a pointer to a nonzero size object" - msgstr "%K%D 的第一个实å‚必须是一个指针,第二个必须是整常é‡" - - #: c-family/c-common.c:10320 - #, fuzzy, gcc-internal-format --#| msgid "argument %d of %qE must be an address" - msgid "argument %d of %qE must be a pointer type" - msgstr "%2$qEçš„å®žå‚ %1$d 必须是地å€" - - #: c-family/c-common.c:10327 - #, fuzzy, gcc-internal-format --#| msgid "Type/rank mismatch in argument '%s' at %L" - msgid "size mismatch in argument %d of %qE" - msgstr "%2$L处实å‚‘%1$s’类型/秩ä¸åŒ¹é…" - - #: c-family/c-common.c:10343 - #, fuzzy, gcc-internal-format --#| msgid "incompatible type for argument %d of %qE" - msgid "invalid memory model argument %d of %qE" - msgstr "%2$qE的第 %1$d 个实å‚类型ä¸å…¼å®¹" - - #: c-family/c-common.c:10350 - #, fuzzy, gcc-internal-format --#| msgid "incompatible type for argument %d of %qE" - msgid "non-integer memory model argument %d of %qE" - msgstr "%2$qE的第 %1$d 个实å‚类型ä¸å…¼å®¹" - -@@ -21520,7 +20901,6 @@ - - #: c-family/c-common.c:11454 - #, fuzzy, gcc-internal-format --#| msgid "%q+D defined but not used" - msgid "typedef %qD locally defined but not used" - msgstr "%q+D定义åŽæœªä½¿ç”¨" - -@@ -21532,7 +20912,6 @@ - #: c-family/c-common.c:11733 c-family/c-common.c:11783 - #: c-family/c-common.c:11798 cp/call.c:4493 cp/call.c:4500 - #, fuzzy, gcc-internal-format --#| msgid "conversion from %qT to %qT is ambiguous" - msgid "conversion of scalar %qT to vector %qT involves truncation" - msgstr "从%qT到%qT的转æ¢æœ‰æ§ä¹‰" - -@@ -22020,7 +21399,6 @@ - - #: c-family/c-omp.c:976 - #, fuzzy, gcc-internal-format --#| msgid "%qE is not a function name" - msgid "%qD is not an function argument" - msgstr "%qEä¸æ˜¯ä¸€ä¸ªå‡½æ•°å" - -@@ -22091,7 +21469,6 @@ - - #: c-family/c-opts.c:924 - #, fuzzy, gcc-internal-format --#| msgid "nested functions not supported on this target" - msgid "external TLS initialization functions not supported on this target" - msgstr "嵌套函数在æ¤ç›®æ ‡æœºä¸Šä¸å—支æŒ" - -@@ -22502,19 +21879,16 @@ - - #: c-family/cilk.c:93 cp/parser.c:5784 - #, fuzzy, gcc-internal-format --#| msgid "%<friend%> can only be specified inside a class" - msgid "%<_Cilk_spawn%> may only be used inside a function" - msgstr "%<friend%>åªèƒ½åœ¨ç±»ä¸æŒ‡å®š" - - #: c-family/cilk.c:107 - #, fuzzy, gcc-internal-format --#| msgid "virtual functions cannot be friends" - msgid "only function calls can be spawned" - msgstr "虚函数ä¸èƒ½æ˜¯å‹å…ƒ" - - #: c-family/cilk.c:356 - #, fuzzy, gcc-internal-format --#| msgid "address of explicit register variable %qD requested" - msgid "explicit register variable %qD may not be modified in spawn" - msgstr "è¦æ±‚显å¼å¯„å˜å™¨å˜é‡%qD的地å€ã€‚" - -@@ -22525,7 +21899,6 @@ - - #: c-family/cilk.c:436 - #, fuzzy, gcc-internal-format --#| msgid "invalid use of %qD in linkage specification" - msgid "invalid use of label %q+D in %<_Cilk_spawn%>" - msgstr "指定链接时使用%qDæ— æ•ˆ" - -@@ -22551,7 +21924,6 @@ - - #: common/config/arc/arc-common.c:80 - #, fuzzy, gcc-internal-format --#| msgid "multiple function type attributes specified" - msgid "multiple -mcpu= options specified." - msgstr "指定了多个函数类型属性" - -@@ -22572,43 +21944,36 @@ - - #: common/config/i386/i386-common.c:764 - #, fuzzy, gcc-internal-format --#| msgid "%salign-loops%s is obsolete, use -falign-loops%s" - msgid "-malign-loops is obsolete, use -falign-loops" - msgstr "%salign-loops%s å·²ç»è¿‡æ—¶ï¼Œè¯·ä½¿ç”¨ -falign-loops%s" - - #: common/config/i386/i386-common.c:766 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "%salign-loops=%d%s is not between 0 and %d" - msgid "-malign-loops=%d is not between 0 and %d" - msgstr "%salign-loops=%d%s ä¸åœ¨ 0 å’Œ %d 之间" - - #: common/config/i386/i386-common.c:773 - #, fuzzy, gcc-internal-format --#| msgid "%salign-jumps%s is obsolete, use -falign-jumps%s" - msgid "-malign-jumps is obsolete, use -falign-jumps" - msgstr "%salign-jumps%s å·²ç»è¿‡æ—¶ï¼Œè¯·ä½¿ç”¨ -falign-jumps%s" - - #: common/config/i386/i386-common.c:775 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "%salign-loops=%d%s is not between 0 and %d" - msgid "-malign-jumps=%d is not between 0 and %d" - msgstr "%salign-loops=%d%s ä¸åœ¨ 0 å’Œ %d 之间" - - #: common/config/i386/i386-common.c:783 - #, fuzzy, gcc-internal-format --#| msgid "%salign-functions%s is obsolete, use -falign-functions%s" - msgid "-malign-functions is obsolete, use -falign-functions" - msgstr "%salign-functions%s 已过时,请使用 -falign-functions%s" - - #: common/config/i386/i386-common.c:785 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "%salign-loops=%d%s is not between 0 and %d" - msgid "-malign-functions=%d is not between 0 and %d" - msgstr "%salign-loops=%d%s ä¸åœ¨ 0 å’Œ %d 之间" - - #: common/config/i386/i386-common.c:794 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "%sbranch-cost=%d%s is not between 0 and 5" - msgid "-mbranch-cost=%d is not between 0 and 5" - msgstr "%sbranch-cost=%d%sä¸åœ¨ 0 å’Œ 5 之间" - -@@ -22664,7 +22029,6 @@ - - #: common/config/rx/rx-common.c:63 - #, fuzzy, gcc-internal-format --#| msgid "the RX200 cpu does not have FPU hardware" - msgid "the RX100 cpu does not have FPU hardware" - msgstr "RX200 CPU 没有 FPU 硬件" - -@@ -22680,7 +22044,6 @@ - - #: common/config/v850/v850-common.c:47 - #, fuzzy, gcc-internal-format --#| msgid "value passed to %<-m%s%> is too large" - msgid "value passed in %qs is too large" - msgstr "ä¼ é€’ç»™%<-m%s%>的值太大" - -@@ -22777,7 +22140,6 @@ - - #: config/darwin.c:2738 - #, fuzzy, gcc-internal-format --#| msgid "visibility attribute not supported in this configuration; ignored" - msgid "protected visibility attribute not supported in this configuration; ignored" - msgstr "å¯è§æ€§å±žæ€§åœ¨æ¤é…置下ä¸å—支æŒï¼›å·²å¿½ç•¥" - -@@ -22788,19 +22150,16 @@ - - #: config/darwin.c:3096 - #, fuzzy, gcc-internal-format --#| msgid "%<-fobjc-abi-version%> >= 2 is only supported on %<-m64%> targets for %<-fnext-runtime%>" - msgid "%<-fobjc-abi-version%> >= 2 must be used for %<-m64%> targets with %<-fnext-runtime%>" - msgstr "%<-fobjc-abi-version%> >= 2 åªåœ¨%<-m64%>ç›®æ ‡ä¸‹æ”¯æŒ%<-fnext-runtime%>" - - #: config/darwin.c:3100 - #, fuzzy, gcc-internal-format --#| msgid "%<-fobjc-abi-version%> >= 2 is only supported on %<-m64%> targets for %<-fnext-runtime%>" - msgid "%<-fobjc-abi-version%> >= 2 is not supported on %<-m32%> targets with %<-fnext-runtime%>" - msgstr "%<-fobjc-abi-version%> >= 2 åªåœ¨%<-m64%>ç›®æ ‡ä¸‹æ”¯æŒ%<-fnext-runtime%>" - - #: config/darwin.c:3185 - #, fuzzy, gcc-internal-format --#| msgid "-mdynamic-no-pic overrides -fpic or -fPIC" - msgid "%<-mdynamic-no-pic%> overrides %<-fpic%>, %<-fPIC%>, %<-fpie%> or %<-fPIE%>" - msgstr "-mdynamic-no-pic 覆盖了 -fpic 或 -fPIC" - -@@ -22917,13 +22276,11 @@ - - #: config/aarch64/aarch64-builtins.c:817 - #, fuzzy, gcc-internal-format --#| msgid "incompatible type for argument %d of %qE" - msgid "incompatible type for argument %d, expected %<const int%>" - msgstr "%2$qE的第 %1$d 个实å‚类型ä¸å…¼å®¹" - - #: config/aarch64/aarch64.c:5041 - #, fuzzy, gcc-internal-format --#| msgid "missing filename after %qs" - msgid "missing feature modifier after %qs" - msgstr "%qsåŽç¼ºå°‘文件å" - -@@ -22930,13 +22287,11 @@ - #. Extension not found in list. - #: config/aarch64/aarch64.c:5062 - #, fuzzy, gcc-internal-format --#| msgid "unknown TLS model %qs" - msgid "unknown feature modifier %qs" - msgstr "未知的 TLS 模型%qs" - - #: config/aarch64/aarch64.c:5093 - #, fuzzy, gcc-internal-format --#| msgid "missing path after %qs" - msgid "missing arch name in -march=%qs" - msgstr "%qsåŽç¼ºå°‘路径" - -@@ -22948,13 +22303,11 @@ - #. ARCH name not found in list. - #: config/aarch64/aarch64.c:5125 - #, fuzzy, gcc-internal-format --#| msgid "unknown value %s for -mfpu" - msgid "unknown value %qs for -march" - msgstr "-mfpu 的值 %s 未知" - - #: config/aarch64/aarch64.c:5150 - #, fuzzy, gcc-internal-format --#| msgid "missing path after %qs" - msgid "missing cpu name in -mcpu=%qs" - msgstr "%qsåŽç¼ºå°‘路径" - -@@ -22961,7 +22314,6 @@ - #. CPU name not found in list. - #: config/aarch64/aarch64.c:5174 - #, fuzzy, gcc-internal-format --#| msgid "unknown value %s for -mfpu" - msgid "unknown value %qs for -mcpu" - msgstr "-mfpu 的值 %s 未知" - -@@ -22968,13 +22320,11 @@ - #. CPU name not found in list. - #: config/aarch64/aarch64.c:5198 - #, fuzzy, gcc-internal-format --#| msgid "unknown value %s for -mfpu" - msgid "unknown value %qs for -mtune" - msgstr "-mfpu 的值 %s 未知" - - #: config/aarch64/aarch64.c:5234 - #, fuzzy, gcc-internal-format --#| msgid "does not support multilib" - msgid "Assembler does not support -mabi=ilp32" - msgstr "ä¸æ”¯æŒ multilib" - -@@ -22986,19 +22336,16 @@ - #: config/aarch64/aarch64.c:5611 config/aarch64/aarch64.c:5719 - #: config/aarch64/aarch64.c:5958 - #, fuzzy, gcc-internal-format --#| msgid "Use hardware floating point instructions" - msgid "%qs and floating point or vector arguments" - msgstr "使用硬件浮点指令" - - #: config/aarch64/aarch64.c:6830 - #, fuzzy, gcc-internal-format --#| msgid "operand number out of range" - msgid "lane out of range" - msgstr "æ“作数å·è¶…出范围" - - #: config/aarch64/aarch64.c:6840 - #, fuzzy, gcc-internal-format --#| msgid "constant argument out of range for %qs" - msgid "constant out of range" - msgstr "常é‡å®žå‚超过%qs的范围" - -@@ -23066,7 +22413,6 @@ - - #: config/arc/arc.c:738 - #, fuzzy, gcc-internal-format --#| msgid "-mrelax is only supported for RTP PIC" - msgid "-mmul64 not supported for ARC700" - msgstr "-mrelax åªåœ¨ RTP PIC 上å—支æŒ" - -@@ -23107,7 +22453,6 @@ - - #: config/arc/arc.c:1230 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "multiple function type attributes specified" - msgid "multiply option implies r%d is fixed" - msgstr "指定了多个函数类型属性" - -@@ -23131,13 +22476,11 @@ - - #: config/arc/arc.c:5373 - #, fuzzy, gcc-internal-format --#| msgid "%<__builtin_next_arg%> called without an argument" - msgid "__builtin_arc_aligned with non-constant alignment" - msgstr "调用%<__builtin_next_arg%>时没有给定实å‚" - - #: config/arc/arc.c:5381 - #, fuzzy, gcc-internal-format --#| msgid "invalid argument to %<__builtin_frame_address%>" - msgid "invalid alignment value for __builtin_arc_aligned" - msgstr "%<__builtin_frame_address%>的实å‚æ— æ•ˆ" - -@@ -23158,7 +22501,6 @@ - - #: config/arc/arc.c:6206 - #, fuzzy, gcc-internal-format --#| msgid "Bad address, not register:" - msgid "insn addresses not freed" - msgstr "错误的地å€ï¼Œä¸æ˜¯å¯„å˜å™¨ï¼š" - -@@ -23294,7 +22636,6 @@ - - #: config/arm/arm.c:2571 - #, fuzzy, gcc-internal-format --#| msgid "-fPIC and -G are incompatible" - msgid "iWMMXt and NEON are incompatible" - msgstr "-fPIC 与 -G 互ä¸å…¼å®¹" - -@@ -23320,13 +22661,11 @@ - - #: config/arm/arm.c:2638 - #, fuzzy, gcc-internal-format --#| msgid "structure size boundary can only be set to %s" - msgid "structure size boundary can only be set to 8, 32 or 64" - msgstr "结构大å°è¾¹ç•Œåªèƒ½è¢«è®¾å®šä¸º %s" - - #: config/arm/arm.c:2640 - #, fuzzy, gcc-internal-format --#| msgid "structure size boundary can only be set to %s" - msgid "structure size boundary can only be set to 8 or 32" - msgstr "结构大å°è¾¹ç•Œåªèƒ½è¢«è®¾å®šä¸º %s" - -@@ -23352,7 +22691,6 @@ - - #: config/arm/arm.c:2715 - #, fuzzy, gcc-internal-format --#| msgid "target CPU does not support ARM mode" - msgid "target CPU does not support unaligned accesses" - msgstr "ç›®æ ‡ CPU ä¸æ”¯æŒ ARM 模å¼" - -@@ -23440,7 +22778,6 @@ - - #: config/arm/arm.c:25441 - #, fuzzy, gcc-internal-format --#| msgid "%qE attribute argument should be between 0 to 255" - msgid "the range of mask should be in 0 to 255" - msgstr "%qE属性的å‚数应当在 0 å’Œ 255 之间" - -@@ -23566,7 +22903,6 @@ - - #: config/arm/arm.c:26165 - #, fuzzy, gcc-internal-format --#| msgid "Unexpected end of module" - msgid "Unexpected thumb1 far jump" - msgstr "éžé¢„期的模å—结æŸ" - -@@ -23582,13 +22918,11 @@ - - #: config/avr/avr-c.c:66 config/avr/avr-c.c:191 - #, fuzzy, gcc-internal-format --#| msgid "%qs expects a constant argument" - msgid "%qs expects 1 argument but %d given" - msgstr "%qs需è¦ä¸€ä¸ªå¸¸é‡å®žå‚" - - #: config/avr/avr-c.c:77 - #, fuzzy, gcc-internal-format --#| msgid "%qs expects a constant argument" - msgid "%qs expects a fixed-point value as argument" - msgstr "%qs需è¦ä¸€ä¸ªå¸¸é‡å®žå‚" - -@@ -23599,25 +22933,21 @@ - - #: config/avr/avr-c.c:108 config/avr/avr-c.c:174 config/avr/avr-c.c:231 - #, fuzzy, gcc-internal-format --#| msgid "no matching template for %qD found" - msgid "no matching fixed-point overload found for %qs" - msgstr "没有找到与%qD匹é…的模æ¿" - - #: config/avr/avr-c.c:125 - #, fuzzy, gcc-internal-format --#| msgid "%qs expects a constant argument" - msgid "%qs expects 2 arguments but %d given" - msgstr "%qs需è¦ä¸€ä¸ªå¸¸é‡å®žå‚" - - #: config/avr/avr-c.c:137 config/avr/avr-c.c:202 - #, fuzzy, gcc-internal-format --#| msgid "%qs expects a constant argument" - msgid "%qs expects a fixed-point value as first argument" - msgstr "%qs需è¦ä¸€ä¸ªå¸¸é‡å®žå‚" - - #: config/avr/avr-c.c:145 - #, fuzzy, gcc-internal-format --#| msgid "%qs expects a constant argument" - msgid "%qs expects an integer value as second argument" - msgstr "%qs需è¦ä¸€ä¸ªå¸¸é‡å®žå‚" - -@@ -23633,19 +22963,16 @@ - - #: config/avr/avr.c:322 - #, fuzzy, gcc-internal-format --#| msgid "-fpic is not supported" - msgid "-fpie is not supported" - msgstr "ä¸æ”¯æŒ -fpic" - - #: config/avr/avr.c:324 - #, fuzzy, gcc-internal-format --#| msgid "-fPIC is not supported" - msgid "-fPIE is not supported" - msgstr "ä¸æ”¯æŒ -fPIC" - - #: config/avr/avr.c:586 - #, fuzzy, gcc-internal-format --#| msgid "-flto and -fwhopr are mutually exclusive" - msgid "function attributes %qs, %qs and %qs are mutually exclusive" - msgstr "-flto and -fwhopr 互斥" - -@@ -23656,25 +22983,21 @@ - - #: config/avr/avr.c:616 - #, fuzzy, gcc-internal-format --#| msgid "%qD cannot have default arguments" - msgid "%qs function cannot have arguments" - msgstr "%qDä¸èƒ½æœ‰é»˜è®¤å‚æ•°" - - #: config/avr/avr.c:619 - #, fuzzy, gcc-internal-format --#| msgid "functions cannot return __fp16 type" - msgid "%qs function cannot return a value" - msgstr "函数ä¸èƒ½è¿”回 __fp16 类型" - - #: config/avr/avr.c:626 - #, fuzzy, gcc-internal-format --#| msgid "%qs appears to be a misspelled signal handler" - msgid "%qs appears to be a misspelled %s handler" - msgstr "%qs似乎是一个拼写错的信å·å¤„ç†è€…" - - #: config/avr/avr.c:856 - #, fuzzy, gcc-internal-format --#| msgid "'builtin_return_address' contains only 2 bytes of address" - msgid "%<builtin_return_address%> contains only 2 bytes of address" - msgstr "‘builtin_return_address’åªåŒ…å«ä¸¤å—节地å€" - -@@ -23690,19 +23013,16 @@ - - #: config/avr/avr.c:2241 - #, fuzzy, gcc-internal-format --#| msgid "accessing program memory with data memory address" - msgid "accessing program memory with data memory address" - msgstr "用数æ®å†…å˜åœ°å€è®¿é—®ç¨‹åºå†…å˜" - - #: config/avr/avr.c:2660 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Number of registers used to pass integer arguments" - msgid "fixed register %s used to pass parameter to function" - msgstr "ç”¨ä»¥ä¼ é€’æ•´æ•°å‚数的寄å˜å™¨ä¸ªæ•°" - - #: config/avr/avr.c:2931 - #, fuzzy, gcc-internal-format --#| msgid "conflicting named address spaces (%s vs %s)" - msgid "writing to address space %qs not supported" - msgstr "冲çªçš„有å地å€ç©ºé—´(%så’Œ%s)" - -@@ -23718,13 +23038,11 @@ - - #: config/avr/avr.c:8292 - #, fuzzy, gcc-internal-format --#| msgid "pointers to disjoint address spaces used in conditional expression" - msgid "pointer targeting address space %qs must be const in %qT" - msgstr "æ¡ä»¶è¡¨è¾¾å¼ä¸ä½¿ç”¨äº†æŒ‡å‘ä¸ç›¸äº¤åœ°å€ç©ºé—´çš„指针" - - #: config/avr/avr.c:8295 - #, fuzzy, gcc-internal-format --#| msgid "pointers to disjoint address spaces used in conditional expression" - msgid "pointer targeting address space %qs must be const in %s %q+D" - msgstr "æ¡ä»¶è¡¨è¾¾å¼ä¸ä½¿ç”¨äº†æŒ‡å‘ä¸ç›¸äº¤åœ°å€ç©ºé—´çš„指针" - -@@ -23745,7 +23063,6 @@ - - #: config/avr/avr.c:8597 - #, fuzzy, gcc-internal-format --#| msgid "only initialized variables can be placed into program memory area" - msgid "uninitialized variable %q+D put into program memory area" - msgstr "åªæœ‰åˆå§‹åŒ–çš„å˜é‡æ‰èƒ½æ”¾å…¥ç¨‹åºå†…å˜åŒº" - -@@ -23756,19 +23073,16 @@ - - #: config/avr/avr.c:11101 - #, fuzzy, gcc-internal-format --#| msgid "Conversion from %s to %s at %L" - msgid "conversion from address space %qs to address space %qs" - msgstr "从 %s 转æ¢åˆ° %s,ä½äºŽ %L" - - #: config/avr/avr.c:12048 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Unexpected end of module in string constant" - msgid "%s expects a compile time integer constant" - msgstr "å—符串常é‡ä¸å‡ºçŽ°éžé¢„期的模å—结æŸ" - - #: config/avr/avr.c:12062 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "%qs expects a constant argument" - msgid "%s expects a compile time long integer constant as first argument" - msgstr "%qs需è¦ä¸€ä¸ªå¸¸é‡å®žå‚" - -@@ -23855,7 +23169,6 @@ - - #: config/c6x/c6x.c:238 - #, fuzzy, gcc-internal-format --#| msgid "-fPIC and -fpic are not supported for this target" - msgid "-fpic and -fPIC not supported without -mdsbt on this target" - msgstr "-fPIC å’Œ -fpic ä¸è¢«æ¤ç›®æ ‡æ‰€æ”¯æŒ" - -@@ -23871,7 +23184,6 @@ - - #: config/cr16/cr16.c:299 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "invalid thread pointer option: -mtp=%s" - msgid "invalid data model option -mdata-model=%s" - msgstr "æ— æ•ˆçš„çº¿ç¨‹æŒ‡é’Ÿé€‰é¡¹ï¼š-mtp=%s" - -@@ -24020,13 +23332,11 @@ - - #: config/epiphany/epiphany.c:1468 - #, fuzzy, gcc-internal-format --#| msgid "stack size must be an exact power of 2" - msgid "stack_offset must be at least 4" - msgstr "æ ˆå¤§å°å¿…须刚好是 2 çš„æŸæ¬¡æ–¹" - - #: config/epiphany/epiphany.c:1470 - #, fuzzy, gcc-internal-format --#| msgid "stack size must be an exact power of 2" - msgid "stack_offset must be a multiple of 4" - msgstr "æ ˆå¤§å°å¿…须刚好是 2 çš„æŸæ¬¡æ–¹" - -@@ -24092,7 +23402,6 @@ - - #: config/h8300/h8300.c:324 - #, fuzzy, gcc-internal-format --#| msgid "-f%s not supported: ignored" - msgid "-msx is not supported in coff" - msgstr "-f%s ä¸å—支æŒï¼šå·²å¿½ç•¥" - -@@ -24103,25 +23412,21 @@ - - #: config/h8300/h8300.c:352 - #, fuzzy, gcc-internal-format --#| msgid "-mn is used without -mh or -ms" - msgid "-mn is used without -mh or -ms or -msx" - msgstr "-mn 未与 -mh 或 -ms 一起使用" - - #: config/h8300/h8300.c:358 - #, fuzzy, gcc-internal-format --#| msgid "-ms2600 is used without -ms" - msgid "-mexr is used without -ms" - msgstr "-ms2600 未与 -ms 一起使用" - - #: config/h8300/h8300.c:364 - #, fuzzy, gcc-internal-format --#| msgid "%<__int128%> is not supported for this target" - msgid "-mint32 is not supported for H8300 and H8300L targets" - msgstr "%<__int128%>在æ¤ç›®æ ‡æœºä¸Šä¸å—支æŒ" - - #: config/h8300/h8300.c:370 - #, fuzzy, gcc-internal-format --#| msgid "-mn is used without -mh or -ms" - msgid "-mexr is used without -ms or -msx" - msgstr "-mn 未与 -mh 或 -ms 一起使用" - -@@ -24142,7 +23447,6 @@ - - #: config/i386/i386.c:2911 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "-Werror=%s: no option -%s" - msgid "wrong arg %s to option %s" - msgstr "-Werror=%s:没有选项 -%s" - -@@ -24153,13 +23457,11 @@ - - #: config/i386/i386.c:2929 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "register name not specified for %q+D" - msgid "wrong stringop strategy name %s specified for option %s" - msgstr "%q+D的寄å˜å™¨åæ— æ•ˆ" - - #: config/i386/i386.c:2943 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "alignment may not be specified for %q+D" - msgid "unknown alignment %s specified for option %s" - msgstr "ä¸èƒ½ä¸º%q+D指定对é½" - -@@ -24170,13 +23472,11 @@ - - #: config/i386/i386.c:2962 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "no class name specified with %qs" - msgid "too many size ranges specified in option %s" - msgstr "%qs没有指定类å" - - #: config/i386/i386.c:3016 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Unknown argument list function at %L" - msgid "Unknown parameter to option -mtune-ctrl: %s" - msgstr "%L处å‚数列表函数未知" - -@@ -24193,7 +23493,6 @@ - - #: config/i386/i386.c:3424 - #, fuzzy, gcc-internal-format --#| msgid "code model %qs not supported in the %s bit mode" - msgid "address mode %qs not supported in the %s bit mode" - msgstr "代ç 模å¼%qs在 %s ä½æ¨¡å¼ä¸‹ä¸å—支æŒ" - -@@ -24205,7 +23504,6 @@ - - #: config/i386/i386.c:3462 config/i386/i386.c:3474 - #, fuzzy, gcc-internal-format --#| msgid "code model %qs not supported in the %s bit mode" - msgid "code model %qs not supported in x32 mode" - msgstr "代ç 模å¼%qs在 %s ä½æ¨¡å¼ä¸‹ä¸å—支æŒ" - -@@ -24216,7 +23514,6 @@ - - #: config/i386/i386.c:3517 - #, fuzzy, gcc-internal-format --#| msgid "-m%s not supported in this configuration" - msgid "-masm=intel not supported in this configuration" - msgstr "-m%s 在æ¤é…置下ä¸å—支æŒ" - -@@ -24237,7 +23534,6 @@ - - #: config/i386/i386.c:3678 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "generic CPU can be used only for %stune=%s %s" - msgid "intel CPU can be used only for %stune=%s %s" - msgstr "generic åªèƒ½ç”¨åœ¨%stune%s %sä¸" - -@@ -24253,13 +23549,11 @@ - - #: config/i386/i386.c:3777 - #, fuzzy, gcc-internal-format --#| msgid "%sregparm%s is ignored in 64-bit mode" - msgid "-mregparm is ignored in 64-bit mode" - msgstr "%sregparm%s 在 64 ä½æ¨¡å¼ä¸‹è¢«å¿½ç•¥" - - #: config/i386/i386.c:3780 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "%sregparm=%d%s is not between 0 and %d" - msgid "-mregparm=%d is not between 0 and %d" - msgstr "%sregparm=%d%s ä¸åœ¨ 0 å’Œ %d 之间" - -@@ -24270,13 +23564,11 @@ - - #: config/i386/i386.c:3900 - #, fuzzy, gcc-internal-format --#| msgid "%spreferred-stack-boundary%s is not supported for this target" - msgid "-mpreferred-stack-boundary is not supported for this target" - msgstr "%spreferred-stack-boundary%s 在æ¤ç›®æ ‡æœºä¸Šä¸è¢«æ”¯æŒ" - - #: config/i386/i386.c:3903 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "%spreferred-stack-boundary=%d%s is not between %d and %d" - msgid "-mpreferred-stack-boundary=%d is not between %d and %d" - msgstr "%spreferred-stack-boundary=%d%s ä¸åœ¨ %d å’Œ %d 之间" - -@@ -24308,7 +23600,7 @@ - #: config/i386/i386.c:4108 - #, gcc-internal-format - msgid "-mfentry isn%'t supported for 32-bit in combination with -fpic" --msgstr "-mfentry 在 32 ä½ä¸‹ä¸èƒ½å’Œ -pic åŒæ—¶ä½¿ç”¨" -+msgstr "-mfentry 在 32 ä½ä¸‹ä¸èƒ½å’Œ -fpic åŒæ—¶ä½¿ç”¨" - - #: config/i386/i386.c:4115 - #, gcc-internal-format -@@ -24422,7 +23714,6 @@ - - #: config/i386/i386.c:6236 - #, fuzzy, gcc-internal-format --#| msgid "AVX vector argument without AVX enabled changes the ABI" - msgid "AVX vector return without AVX enabled changes the ABI" - msgstr "没有å¯ç”¨ AVX,å´å‡ºçŽ°äº† AVX å‘é‡å®žå‚,这改å˜äº† ABI" - -@@ -24515,7 +23806,6 @@ - - #: config/i386/i386.c:14881 - #, fuzzy, gcc-internal-format --#| msgid "non-integer operand used with operand code '%c'" - msgid "non-integer operand used with operand code 'z'" - msgstr "éžæ•´æ•°æ“作数使用了æ“作数代ç ‘%c’" - -@@ -24541,7 +23831,6 @@ - - #: config/i386/i386.c:31750 config/i386/i386.c:32198 - #, fuzzy, gcc-internal-format --#| msgid "static linking is not supported" - msgid "Virtual function multiversioning not supported" - msgstr "ä¸æ”¯æŒé™æ€é“¾æŽ¥" - -@@ -24552,25 +23841,21 @@ - - #: config/i386/i386.c:31818 - #, fuzzy, gcc-internal-format --#| msgid "previous declaration of %q+D" - msgid "previous declaration of %D" - msgstr "%q+Dçš„å‰ä¸€ä¸ªå£°æ˜Ž" - - #: config/i386/i386.c:32037 - #, fuzzy, gcc-internal-format --#| msgid "nested functions not supported on this target" - msgid "multiversioning needs ifunc which is not supported on this target" - msgstr "嵌套函数在æ¤ç›®æ ‡æœºä¸Šä¸å—支æŒ" - - #: config/i386/i386.c:32405 - #, fuzzy, gcc-internal-format --#| msgid "argument to %qs must be a 2-bit unsigned literal" - msgid "Parameter to builtin must be a string constant or literal" - msgstr "%qs的实å‚必须是一个 2 ä½æ— 符å·å—é¢å¸¸é‡" - - #: config/i386/i386.c:32430 config/i386/i386.c:32480 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Argument to -ffpe-trap is not valid: %s" - msgid "Parameter to builtin not valid: %s" - msgstr "-ffpe-trap çš„å‚æ•°æ— æ•ˆï¼š%s" - -@@ -24581,25 +23866,21 @@ - - #: config/i386/i386.c:33287 - #, fuzzy, gcc-internal-format --#| msgid "the fifth argument must be a 8-bit immediate" - msgid "the fifth argument must be an 8-bit immediate" - msgstr "第五个实å‚必须是一个 8 ä½ç«‹å³æ•°" - - #: config/i386/i386.c:33382 - #, fuzzy, gcc-internal-format --#| msgid "the third argument must be a 8-bit immediate" - msgid "the third argument must be an 8-bit immediate" - msgstr "第三个实å‚必须是一个 8 ä½ç«‹å³æ•°" - - #: config/i386/i386.c:33967 - #, fuzzy, gcc-internal-format --#| msgid "the last argument must be a 1-bit immediate" - msgid "the last argument must be an 1-bit immediate" - msgstr "最åŽä¸€ä¸ªå®žå‚必须是一个 1 ä½ç«‹å³æ•°" - - #: config/i386/i386.c:33974 - #, fuzzy, gcc-internal-format --#| msgid "the last argument must be a 32-bit immediate" - msgid "the last argument must be a 3-bit immediate" - msgstr "最åŽä¸€ä¸ªå‚数必须是一个 32 ä½ç«‹å³æ•°" - -@@ -24630,37 +23911,31 @@ - - #: config/i386/i386.c:34214 - #, fuzzy, gcc-internal-format --#| msgid "argument must be a constant" - msgid "the third argument must be comparison constant" - msgstr "实å‚必须是常数" - - #: config/i386/i386.c:34219 - #, fuzzy, gcc-internal-format --#| msgid "incorrect sharing of tree nodes" - msgid "incorect comparison mode" - msgstr "å¯¹æ ‘ç»“èŠ‚çš„å…±äº«ä¸æ£ç¡®" - - #: config/i386/i386.c:34225 config/i386/i386.c:34421 - #, fuzzy, gcc-internal-format --#| msgid "incorrect sharing of tree nodes" - msgid "incorrect rounding operand" - msgstr "å¯¹æ ‘ç»“èŠ‚çš„å…±äº«ä¸æ£ç¡®" - - #: config/i386/i386.c:34403 - #, fuzzy, gcc-internal-format --#| msgid "the last argument must be a 4-bit immediate" - msgid "the immediate argument must be a 4-bit immediate" - msgstr "最åŽä¸€ä¸ªå®žå‚必须是一个 4 ä½ç«‹å³æ•°" - - #: config/i386/i386.c:34409 - #, fuzzy, gcc-internal-format --#| msgid "the last argument must be a 5-bit immediate" - msgid "the immediate argument must be a 5-bit immediate" - msgstr "最åŽä¸€ä¸ªå®žå‚必须是一个 5 ä½ç«‹å³æ•°" - - #: config/i386/i386.c:34412 - #, fuzzy, gcc-internal-format --#| msgid "the last argument must be an 8-bit immediate" - msgid "the immediate argument must be an 8-bit immediate" - msgstr "最åŽä¸€ä¸ªå®žå‚必须是一个 8 ä½ç«‹å³æ•°" - -@@ -24691,25 +23966,21 @@ - - #: config/i386/i386.c:35816 config/i386/i386.c:35964 - #, fuzzy, gcc-internal-format --#| msgid "the last argument must be a 4-bit immediate" - msgid "the last argument must be scale 1, 2, 4, 8" - msgstr "最åŽä¸€ä¸ªå®žå‚必须是一个 4 ä½ç«‹å³æ•°" - - #: config/i386/i386.c:36016 - #, fuzzy, gcc-internal-format --#| msgid "left argument must be a slice" - msgid "the forth argument must be scale 1, 2, 4, 8" - msgstr "左实å‚必须是一个切片" - - #: config/i386/i386.c:36022 - #, fuzzy, gcc-internal-format --#| msgid "the last argument must be a 4-bit immediate" - msgid "the last argument must be hint 0 or 1" - msgstr "最åŽä¸€ä¸ªå®žå‚必须是一个 4 ä½ç«‹å³æ•°" - - #: config/i386/i386.c:36041 - #, fuzzy, gcc-internal-format --#| msgid "the last argument must be an 8-bit immediate" - msgid "the xabort's argument must be an 8-bit immediate" - msgstr "最åŽä¸€ä¸ªå®žå‚必须是一个 8 ä½ç«‹å³æ•°" - -@@ -24735,7 +24006,6 @@ - - #: config/i386/i386.c:46439 - #, fuzzy, gcc-internal-format --#| msgid "Unknown architecture '%s'" - msgid "Unknown architecture specific memory model" - msgstr "未知的架构‘%s’" - -@@ -24751,7 +24021,6 @@ - - #: config/i386/i386.c:46476 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "unsupported ELF file class" - msgid "unsupported simdlen %d" - msgstr "ä¸æ”¯æŒçš„ ELF 文件类" - -@@ -24955,7 +24224,6 @@ - - #: config/m68k/m68k.c:624 - #, fuzzy, gcc-internal-format --#| msgid "stack limits not supported on this target" - msgid "-fstack-limit- options are not supported on this cpu" - msgstr "å †æ ˆé™åˆ¶åœ¨æ¤ç›®æ ‡æœºä¸Šä¸å—支æŒ" - -@@ -25240,7 +24508,6 @@ - - #: config/microblaze/microblaze.c:1679 - #, fuzzy, gcc-internal-format --#| msgid "-fPIC and -fpic are not supported for this target" - msgid "-fPIC/-fpic not supported for this target" - msgstr "-fPIC å’Œ -fpic ä¸è¢«æ¤ç›®æ ‡æ‰€æ”¯æŒ" - -@@ -25276,7 +24543,6 @@ - - #: config/mips/mips.c:1427 config/mips/mips.c:1433 - #, fuzzy, gcc-internal-format --#| msgid "%qE cannot have both %<mips16%> and %<nomips16%> attributes" - msgid "%qE cannot have both %qs and %qs attributes" - msgstr "%qEä¸èƒ½åŒæ—¶æœ‰%<mips16%>å’Œ%<nomips16%>属性" - -@@ -25385,7 +24651,6 @@ - - #: config/mips/mips.c:17050 config/mips/mips.c:17052 config/mips/mips.c:17065 - #, fuzzy, gcc-internal-format --#| msgid "assert: %s is assign compatible with %s" - msgid "%qs is incompatible with %qs" - msgstr "assert:%s 与 %s 赋值兼容" - -@@ -25396,7 +24661,6 @@ - #. an error. - #: config/mips/mips.c:17059 - #, fuzzy, gcc-internal-format --#| msgid "assert: %s is assign compatible with %s" - msgid "the combination of %qs and %qs is incompatible with %qs" - msgstr "assert:%s 与 %s 赋值兼容" - -@@ -25407,13 +24671,11 @@ - - #: config/mips/mips.c:17120 - #, fuzzy, gcc-internal-format --#| msgid "the %qs architecture does not support the synci instruction" - msgid "the %qs architecture does not support madd or msub instructions" - msgstr "%qs架构ä¸æ”¯æŒ synci 指令" - - #: config/mips/mips.c:17134 - #, fuzzy, gcc-internal-format --#| msgid "Generate position-independent code if possible (large mode)" - msgid "cannot generate position-independent code for %qs" - msgstr "å°½å¯èƒ½ç”Ÿæˆä¸Žä½ç½®æ— 关的代ç (大模å¼)" - -@@ -25530,19 +24792,16 @@ - - #: config/msp430/msp430.c:1102 - #, fuzzy, gcc-internal-format --#| msgid "invalid argument of %qE attribute" - msgid "unrecognised interrupt vector argument of %qE attribute" - msgstr "属性%qEçš„å‚æ•°æ— æ•ˆ" - - #: config/msp430/msp430.c:1111 - #, fuzzy, gcc-internal-format --#| msgid "argument %d of %qE must be in the range %d...%d" - msgid "numeric argument of %qE attribute must be in range 0..63" - msgstr "%2$qE的第 %1$d 个å‚数必须是在 %3$d å’Œ %4$d 之间" - - #: config/msp430/msp430.c:1117 - #, fuzzy, gcc-internal-format --#| msgid "argument of %qE attribute is not a string constant" - msgid "argument of %qE attribute is not a string constant or number" - msgstr "%qE属性的实å‚ä¸æ˜¯ä¸€ä¸ªå—符串常é‡" - -@@ -25564,13 +24823,11 @@ - - #: config/nds32/nds32.c:1213 - #, fuzzy, gcc-internal-format --#| msgid "multiple function type attributes specified" - msgid "multiple nested types attributes to function %qD" - msgstr "指定了多个函数类型属性" - - #: config/nds32/nds32.c:1225 - #, fuzzy, gcc-internal-format --#| msgid "multiple interrupt attributes not allowed" - msgid "multiple interrupt attributes to function %qD" - msgstr "ä¸å…许多个ä¸æ–属性" - -@@ -25581,7 +24838,6 @@ - #: config/nds32/nds32.c:3007 config/nds32/nds32.c:3013 - #: config/nds32/nds32.c:3045 - #, fuzzy, gcc-internal-format --#| msgid "nested functions not supported on this target" - msgid "a nested function is not supported for reduced registers" - msgstr "嵌套函数在æ¤ç›®æ ‡æœºä¸Šä¸å—支æŒ" - -@@ -25588,37 +24844,31 @@ - #. The enum index value for array size is out of range. - #: config/nds32/nds32.c:2848 - #, fuzzy, gcc-internal-format --#| msgid "invalid register in the instruction" - msgid "intrinsic register index is out of range" - msgstr "æ¤æŒ‡ä»¤ä¸å¯„å˜å™¨æ— 效" - - #: config/nds32/nds32.c:3153 - #, fuzzy, gcc-internal-format --#| msgid "invalid type for iteration variable %qE" - msgid "invalid id value for interrupt/exception attribute" - msgstr "è¿ä»£å˜é‡%qEç±»åž‹æ— æ•ˆ" - - #: config/nds32/nds32.c:3181 - #, fuzzy, gcc-internal-format --#| msgid "invalid argument of %qs attribute" - msgid "invalid id value for reset attribute" - msgstr "属性%qsçš„å‚æ•°æ— æ•ˆ" - - #: config/nds32/nds32.c:3197 - #, fuzzy, gcc-internal-format --#| msgid "invalid argument of %qs attribute" - msgid "invalid nmi function for reset attribute" - msgstr "属性%qsçš„å‚æ•°æ— æ•ˆ" - - #: config/nds32/nds32.c:3210 - #, fuzzy, gcc-internal-format --#| msgid "invalid argument of %qs attribute" - msgid "invalid warm function for reset attribute" - msgstr "属性%qsçš„å‚æ•°æ— æ•ˆ" - - #: config/nds32/nds32.c:3284 - #, fuzzy, gcc-internal-format --#| msgid "%s does not support split_block" - msgid "not support -fpic" - msgstr "%s ä¸æ”¯æŒ split_block" - -@@ -25629,7 +24879,6 @@ - - #: config/nios2/nios2.c:794 - #, fuzzy, gcc-internal-format --#| msgid "target attribute or pragma changes double precision floating point" - msgid "switch %<-mcustom-%s%> is required for double precision floating point" - msgstr "ç›®æ ‡å±žæ€§æˆ– pragma 改å˜äº†åŒç²¾åº¦æµ®ç‚¹æ•°" - -@@ -25675,7 +24924,6 @@ - - #: config/nios2/nios2.c:2598 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "invalid argument to built-in function" - msgid "invalid argument to built-in function %s" - msgstr "内建函数实å‚æ— æ•ˆ" - -@@ -25686,7 +24934,6 @@ - - #: config/nios2/nios2.c:2743 - #, fuzzy, gcc-internal-format --#| msgid "switch -mcpu=%s conflicts with -march=%s switch" - msgid "switch %<-mcustom-%s%> conflicts with switch %<-mcustom-%s%>" - msgstr "开关 -mcpu=%s 与 -march=%s 冲çª" - -@@ -25707,7 +24954,6 @@ - - #: config/nios2/nios2.c:2899 - #, fuzzy, gcc-internal-format --#| msgid "%s only accepts 2 arguments" - msgid "%<no-custom-%s%> does not accept arguments" - msgstr "%s åªæŽ¥å— 2 个å‚æ•°" - -@@ -25728,7 +24974,6 @@ - - #: config/nios2/nios2.c:2943 - #, fuzzy, gcc-internal-format --#| msgid "type of %qE is unknown" - msgid "%<%s%> is unknown" - msgstr "%qE的类型未知" - -@@ -25979,13 +25224,11 @@ - - #: config/rs6000/rs6000.c:3173 - #, fuzzy, gcc-internal-format --#| msgid "not configured for ABI: '%s'" - msgid "not configured for SPE ABI" - msgstr "æ²¡æœ‰ä¸ºæ¤ ABI é…置:‘%s’" - - #: config/rs6000/rs6000.c:3178 - #, fuzzy, gcc-internal-format --#| msgid "Do not use PowerPC instruction set" - msgid "not configured for SPE instruction set" - msgstr "ä¸ä½¿ç”¨ PowerPC 指令集" - -@@ -26021,7 +25264,6 @@ - - #: config/rs6000/rs6000.c:3333 - #, fuzzy, gcc-internal-format --#| msgid "--resource requires -o" - msgid "-mdirect-move requires -mvsx" - msgstr "--resource éœ€è¦ -o" - -@@ -26032,13 +25274,11 @@ - - #: config/rs6000/rs6000.c:3347 - #, fuzzy, gcc-internal-format --#| msgid "--resource requires -o" - msgid "-mpower8-vector requires -mvsx" - msgstr "--resource éœ€è¦ -o" - - #: config/rs6000/rs6000.c:3354 - #, fuzzy, gcc-internal-format --#| msgid "--resource requires -o" - msgid "-mvsx-timode requires -mvsx" - msgstr "--resource éœ€è¦ -o" - -@@ -26099,7 +25339,6 @@ - - #: config/rs6000/rs6000.c:11517 - #, fuzzy, gcc-internal-format --#| msgid "argument 1 must be a 5-bit signed literal" - msgid "argument 1 must be an 8-bit field value" - msgstr "å®žå‚ 1 必须是一个 5 ä½æœ‰ç¬¦å·å—é¢å€¼" - -@@ -26125,13 +25364,11 @@ - - #: config/rs6000/rs6000.c:12074 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "argument 2 must be a 5-bit unsigned literal" - msgid "argument %d must be an unsigned literal" - msgstr "å®žå‚ 2 必须是一个 5 ä½æ— 符å·å—é¢å€¼" - - #: config/rs6000/rs6000.c:12076 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "argument 1 of __builtin_spe_predicate is out of range" - msgid "argument %d is an unsigned literal that is out of range" - msgstr "__builtin_spe_predicate 的第 1 个实å‚越界" - -@@ -26152,13 +25389,11 @@ - - #: config/rs6000/rs6000.c:12246 - #, fuzzy, gcc-internal-format --#| msgid "number must be 0 or 1" - msgid "argument 2 must be 0 or 1" - msgstr "æ•°å—必须是 0 或 1" - - #: config/rs6000/rs6000.c:12254 - #, fuzzy, gcc-internal-format --#| msgid "argument %d of %qE must be in the range %d...%d" - msgid "argument 3 must be in the range 0..15" - msgstr "%2$qE的第 %1$d 个å‚数必须是在 %3$d å’Œ %4$d 之间" - -@@ -26199,7 +25434,6 @@ - - #: config/rs6000/rs6000.c:13239 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "this builtin function is only available on the fr450" - msgid "Builtin function %s is only valid for the cell processor" - msgstr "æ¤å†…建函数åªåœ¨ fr450 上å¯ç”¨" - -@@ -26464,19 +25698,16 @@ - - #: config/rs6000/e500.h:37 - #, fuzzy, gcc-internal-format --#| msgid "AltiVec and E500 instructions cannot coexist" - msgid "AltiVec and SPE instructions cannot coexist" - msgstr "AltiVec å’Œ E500 指令ä¸èƒ½å…±å˜" - - #: config/rs6000/e500.h:39 - #, fuzzy, gcc-internal-format --#| msgid "VSX and E500 instructions cannot coexist" - msgid "VSX and SPE instructions cannot coexist" - msgstr "VSX å’Œ E500 指令ä¸èƒ½å…±å˜" - - #: config/rs6000/e500.h:41 - #, fuzzy, gcc-internal-format --#| msgid "64-bit E500 not supported" - msgid "64-bit SPE not supported" - msgstr "ä¸æ”¯æŒ 64 ä½ E500" - -@@ -26492,7 +25723,6 @@ - - #: config/rs6000/linux64.h:116 - #, fuzzy, gcc-internal-format --#| msgid "-mas100-syntax is incompatible with -gdwarf" - msgid "-mcall-aixdesc incompatible with -mabi=elfv2" - msgstr "-mas100-syntax 与 -gdwarf ä¸å…¼å®¹" - -@@ -26550,13 +25780,11 @@ - - #: config/rx/rx.c:644 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "unreocgnized control register number: %d - using 'psw'" - msgid "unrecognized control register number: %d - using 'psw'" - msgstr "æ— æ³•è¯†åˆ«çš„æŽ§åˆ¶å¯„å˜å™¨å·ï¼š%d - 使用‘psw’" - - #: config/rx/rx.c:1380 - #, fuzzy, gcc-internal-format --#| msgid "multiple interrupt attributes not allowed" - msgid "multiple fast interrupt routines seen: %qE and %qE" - msgstr "ä¸å…许多个ä¸æ–属性" - -@@ -26577,13 +25805,11 @@ - - #: config/s390/s390.c:479 - #, fuzzy, gcc-internal-format --#| msgid "argument of %qE attribute is not a string constant" - msgid "requested %qE attribute is not a non-negative integer constant or too large (max. %d)" - msgstr "%qE属性的实å‚ä¸æ˜¯ä¸€ä¸ªå—符串常é‡" - - #: config/s390/s390.c:1712 - #, fuzzy, gcc-internal-format --#| msgid "argument to %qE attribute larger than %d" - msgid "argument to %qs is too large (max. %d)" - msgstr "%qE属性的实å‚大于 %d" - -@@ -26634,13 +25860,11 @@ - - #: config/s390/s390.c:5480 - #, fuzzy, gcc-internal-format --#| msgid "function %q+D redeclared with attribute noinline" - msgid "function %qE with the %qs attribute is not hotpatchable" - msgstr "函数%q+Dé‡å£°æ˜Žä¸ºå¸¦æœ‰ä¸å¯å†…è”属性" - - #: config/s390/s390.c:5521 - #, fuzzy, gcc-internal-format --#| msgid "ms_hook_prologue is not compatible with nested function" - msgid "hotpatch_prologue is not compatible with nested function" - msgstr "ms_hook_prologue 与嵌套函数ä¸å…¼å®¹" - -@@ -26661,7 +25885,6 @@ - - #: config/s390/s390.c:9019 - #, fuzzy, gcc-internal-format --#| msgid "frame size of %qs is " - msgid "frame size of %qs is %wd bytes" - msgstr "%qs的框架大å°æ˜¯" - -@@ -26770,7 +25993,6 @@ - - #: config/sparc/sparc.c:1298 - #, fuzzy, gcc-internal-format --#| msgid "-fdata-sections not supported for this target" - msgid "-fcall-saved-REG is not supported for out registers" - msgstr "-fdata-sections 在æ¤ç›®æ ‡æœºä¸Šä¸å—支æŒ" - -@@ -26856,13 +26078,11 @@ - - #: config/tilegx/tilegx.c:3512 config/tilepro/tilepro.c:3118 - #, fuzzy, gcc-internal-format --#| msgid "bad builtin code" - msgid "bad builtin icode" - msgstr "错误的内建代ç " - - #: config/tilegx/tilegx.c:3553 config/tilepro/tilepro.c:3144 - #, fuzzy, gcc-internal-format --#| msgid "mask must be an immediate" - msgid "operand must be an immediate of the right size" - msgstr "掩ç 必须是一个立å³æ•°" - -@@ -26983,19 +26203,16 @@ - - #: config/vms/vms-c.c:44 - #, fuzzy, gcc-internal-format --#| msgid "junk at end of #pragma ghs starttda" - msgid "junk at end of #pragma __nostandard" - msgstr "#pragma ghs starttda 末尾有垃圾å—符" - - #: config/vms/vms-c.c:55 - #, fuzzy, gcc-internal-format --#| msgid "junk at end of #pragma %s" - msgid "junk at end of #pragma __standard" - msgstr "#pragma %s 末尾有垃圾å—符" - - #: config/vms/vms-c.c:80 - #, fuzzy, gcc-internal-format --#| msgid "malformed %<#pragma align%>, ignoring" - msgid "malformed '#pragma member_alignment', ignoring" - msgstr "%<#pragma align%>æ ¼å¼é”™è¯¯ - 已忽略" - -@@ -27006,25 +26223,21 @@ - - #: config/vms/vms-c.c:100 - #, fuzzy, gcc-internal-format --#| msgid "malformed %<#pragma align%>" - msgid "malformed '#pragma member_alignment'" - msgstr "%<#pragma align%>æ ¼å¼é”™è¯¯" - - #: config/vms/vms-c.c:134 - #, fuzzy, gcc-internal-format --#| msgid "invalid alignment for %<#pragma align%>, ignoring" - msgid "unhandled alignment for '#pragma nomember_alignment'" - msgstr "%<#pragma align%>指定的对é½è¾¹ç•Œæ— 效,忽略" - - #: config/vms/vms-c.c:147 - #, fuzzy, gcc-internal-format --#| msgid "junk at end of '#pragma options'" - msgid "garbage at end of '#pragma nomember_alignment'" - msgstr "‘#pragma options’末尾有垃圾å—符" - - #: config/vms/vms-c.c:202 - #, fuzzy, gcc-internal-format --#| msgid "malformed '#pragma options', ignoring" - msgid "malformed '#pragma extern_model', ignoring" - msgstr "‘#pragma optionsâ€™æ ¼å¼é”™è¯¯ - 已忽略" - -@@ -27040,31 +26253,26 @@ - - #: config/vms/vms-c.c:234 - #, fuzzy, gcc-internal-format --#| msgid "junk at end of %<#pragma extern_prefix%>" - msgid "junk at end of '#pragma extern_model'" - msgstr "%<#pragma extern_prefix%>末尾有垃圾å—符" - - #: config/vms/vms-c.c:248 - #, fuzzy, gcc-internal-format --#| msgid "malformed %<#pragma message%>, ignored" - msgid "vms '#pragma __message' is ignored" - msgstr "%<#pragma message%>æ ¼å¼é”™è¯¯ï¼Œå·²å¿½ç•¥" - - #: config/vms/vms-c.c:273 config/vms/vms-c.c:279 - #, fuzzy, gcc-internal-format --#| msgid "malformed #pragma extern_prefix, ignored" - msgid "malformed '#pragma __extern_prefix', ignoring" - msgstr "#pragma extern_prefix æ ¼å¼é”™è¯¯ï¼Œå·²å¿½ç•¥" - - #: config/vms/vms-c.c:312 config/vms/vms-c.c:332 - #, fuzzy, gcc-internal-format --#| msgid "malformed %<#pragma %s%>, ignored" - msgid "malformed %<#pragma %s%>, ignoring" - msgstr "%<#pragma %s%>æ ¼å¼é”™è¯¯ï¼Œå·²å¿½ç•¥" - - #: config/vms/vms-c.c:328 - #, fuzzy, gcc-internal-format --#| msgid "invalid constant in %<#pragma pack%> - ignored" - msgid "invalid constant in %<#pragma %s%>" - msgstr "%<#pragma pack%>ä¸æœ‰æ— æ•ˆå¸¸é‡ - 已忽略" - -@@ -27146,31 +26354,26 @@ - - #: c/c-array-notation.c:708 c/c-array-notation.c:714 - #, fuzzy, gcc-internal-format --#| msgid "%qD cannot be declared as constexpr" - msgid "%qE cannot be scalar when %qE is not" - msgstr "%qDä¸èƒ½è¢«å£°æ˜Žä¸ºå¹¿ä¹‰å¸¸è¡¨è¾¾å¼" - - #: c/c-array-notation.c:776 cp/cp-array-notation.c:658 - #, fuzzy, gcc-internal-format --#| msgid "type mismatch between an SSA_NAME and its symbol" - msgid "length mismatch between LHS and RHS" - msgstr "SSA_NAME 和其符å·é—´ç±»åž‹ä¸åŒ¹é…" - - #: c/c-array-notation.c:1323 cp/cp-array-notation.c:1407 - #, fuzzy, gcc-internal-format --#| msgid "array subscript is not an integer" - msgid "start-index of array notation triplet is not an integer" - msgstr "æ•°ç»„ä¸‹æ ‡ä¸æ˜¯ä¸€ä¸ªæ•´æ•°" - - #: c/c-array-notation.c:1328 cp/cp-array-notation.c:1412 - #, fuzzy, gcc-internal-format --#| msgid "array subscript is not an integer" - msgid "length of array notation triplet is not an integer" - msgstr "æ•°ç»„ä¸‹æ ‡ä¸æ˜¯ä¸€ä¸ªæ•´æ•°" - - #: c/c-array-notation.c:1335 cp/cp-array-notation.c:1417 - #, fuzzy, gcc-internal-format --#| msgid "array subscript is not an integer" - msgid "stride of array notation triplet is not an integer" - msgstr "æ•°ç»„ä¸‹æ ‡ä¸æ˜¯ä¸€ä¸ªæ•´æ•°" - -@@ -27593,7 +26796,6 @@ - - #: c/c-decl.c:3755 - #, fuzzy, gcc-internal-format --#| msgid "empty declaration with type qualifier does not redeclare tag" - msgid "empty declaration with %<_Alignas%> does not redeclare tag" - msgstr "带有类型é™å®šçš„空声明没有é‡å£°æ˜Žæ ‡è®°" - -@@ -27609,7 +26811,6 @@ - - #: c/c-decl.c:3799 - #, fuzzy, gcc-internal-format --#| msgid "%<inline%> in empty declaration" - msgid "%<_Noreturn%> in empty declaration" - msgstr "%<inline%>用于空声明ä¸" - -@@ -27630,7 +26831,6 @@ - - #: c/c-decl.c:3824 - #, fuzzy, gcc-internal-format --#| msgid "useless type name in empty declaration" - msgid "useless %qs in empty declaration" - msgstr "空声明ä¸ç±»åž‹åæ— ç”¨" - -@@ -27641,7 +26841,6 @@ - - #: c/c-decl.c:3844 - #, fuzzy, gcc-internal-format --#| msgid "useless %<__thread%> in empty declaration" - msgid "useless %<_Alignas%> in empty declaration" - msgstr "空声明ä¸%<__thread%>æ— ç”¨" - -@@ -27890,7 +27089,6 @@ - - #: c/c-decl.c:5147 - #, fuzzy, gcc-internal-format --#| msgid "duplicate %<restrict%>" - msgid "duplicate %<_Atomic%>" - msgstr "é‡å¤çš„%<restrict%>" - -@@ -27921,7 +27119,6 @@ - - #: c/c-decl.c:5190 - #, fuzzy, gcc-internal-format --#| msgid "function definition declared %<auto%>" - msgid "function definition declared %qs" - msgstr "函数声明定义为%<auto%>" - -@@ -27977,7 +27174,6 @@ - - #: c/c-decl.c:5259 - #, fuzzy, gcc-internal-format --#| msgid "function-scope %qE implicitly auto and declared %<__thread%>" - msgid "function-scope %qE implicitly auto and declared %qs" - msgstr "函数作用域的%qEéšå¼ä¸º auto,å´è¢«å£°æ˜Žä¸º%<__thread%>" - -@@ -28103,7 +27299,6 @@ - #: c/c-decl.c:5754 c/c-decl.c:5952 c/c-decl.c:6005 c/c-decl.c:6078 - #: c/c-decl.c:6179 c/c-parser.c:2401 - #, fuzzy, gcc-internal-format --#| msgid "ISO C forbids qualified function types" - msgid "%<_Atomic%>-qualified function type" - msgstr "ISO C ä¸å…许使用 const 或 volatile é™å®šå‡½æ•°ç±»åž‹" - -@@ -28149,55 +27344,46 @@ - - #: c/c-decl.c:5880 - #, fuzzy, gcc-internal-format --#| msgid "bit-field %qs has invalid type" - msgid "bit-field %qE has atomic type" - msgstr "ä½æ®µ%qsç±»åž‹æ— æ•ˆ" - - #: c/c-decl.c:5882 - #, fuzzy, gcc-internal-format --#| msgid "bit-field %qs has invalid type" - msgid "bit-field has atomic type" - msgstr "ä½æ®µ%qsç±»åž‹æ— æ•ˆ" - - #: c/c-decl.c:5891 - #, fuzzy, gcc-internal-format --#| msgid "alignment may not be specified for %q+D" - msgid "alignment specified for typedef %qE" - msgstr "ä¸èƒ½ä¸º%q+D指定对é½" - - #: c/c-decl.c:5893 - #, fuzzy, gcc-internal-format --#| msgid "%qs specified for parameter %qE" - msgid "alignment specified for %<register%> object %qE" - msgstr "为形å‚%2$qE指定了%1$qs" - - #: c/c-decl.c:5898 - #, fuzzy, gcc-internal-format --#| msgid "%qs specified for parameter %qE" - msgid "alignment specified for parameter %qE" - msgstr "为形å‚%2$qE指定了%1$qs" - - #: c/c-decl.c:5900 - #, fuzzy, gcc-internal-format --#| msgid "%qs specified for unnamed parameter" - msgid "alignment specified for unnamed parameter" - msgstr "ä¸ºæ— åå½¢å‚指定了%qs" - - #: c/c-decl.c:5905 - #, fuzzy, gcc-internal-format --#| msgid "alignment may not be specified for %q+D" - msgid "alignment specified for bit-field %qE" - msgstr "ä¸èƒ½ä¸º%q+D指定对é½" - - #: c/c-decl.c:5907 - #, fuzzy, gcc-internal-format --#| msgid "%qs specified for unnamed parameter" - msgid "alignment specified for unnamed bit-field" - msgstr "ä¸ºæ— åå½¢å‚指定了%qs" - - #: c/c-decl.c:5910 - #, fuzzy, gcc-internal-format --#| msgid "assignment of function %qD" - msgid "alignment specified for function %qE" - msgstr "å‘函数%qD赋值" - -@@ -28218,7 +27404,6 @@ - - #: c/c-decl.c:5968 - #, fuzzy, gcc-internal-format --#| msgid "typedef %q+D declared %<inline%>" - msgid "typedef %q+D declared %<_Noreturn%>" - msgstr "typedef%q+D声明为%<inline%>" - -@@ -28250,7 +27435,6 @@ - - #: c/c-decl.c:6111 - #, fuzzy, gcc-internal-format --#| msgid "parameter %q+D declared %<inline%>" - msgid "parameter %q+D declared %<_Noreturn%>" - msgstr "å½¢å‚%q+D声明为%<inline%>" - -@@ -28281,19 +27465,16 @@ - - #: c/c-decl.c:6223 - #, fuzzy, gcc-internal-format --#| msgid "%qE initialized and declared %<extern%>" - msgid "%<main%> declared %<_Noreturn%>" - msgstr "%qEå·²åˆå§‹åŒ–,å´åˆè¢«å£°æ˜Žä¸º%<extern%>" - - #: c/c-decl.c:6236 - #, fuzzy, gcc-internal-format --#| msgid "ISO C99 does not support %<_Static_assert%>" - msgid "ISO C99 does not support %<_Noreturn%>" - msgstr "ISO C90 ä¸æ”¯æŒ%<_Static_assert%>" - - #: c/c-decl.c:6239 - #, fuzzy, gcc-internal-format --#| msgid "ISO C90 does not support %<long long%>" - msgid "ISO C90 does not support %<_Noreturn%>" - msgstr "ISO C90 ä¸æ”¯æŒ%<long long%>" - -@@ -28309,7 +27490,6 @@ - - #: c/c-decl.c:6280 - #, fuzzy, gcc-internal-format --#| msgid "variable %q+D declared %<inline%>" - msgid "variable %q+D declared %<_Noreturn%>" - msgstr "å˜é‡%q+D声明为%<inline%>" - -@@ -28482,7 +27662,6 @@ - - #: c/c-decl.c:7352 cp/class.c:6386 - #, fuzzy, gcc-internal-format --#| msgid "size of array %qE is too large" - msgid "type %qT is too large" - msgstr "数组%qE太大" - -@@ -28682,13 +27861,11 @@ - #. allow it. - #: c/c-decl.c:8697 - #, fuzzy, gcc-internal-format --#| msgid "%<for%> loop initial declarations are only allowed in C99 mode" - msgid "%<for%> loop initial declarations are only allowed in C99 or C11 mode" - msgstr "åªå…许在 C99 模å¼ä¸‹ä½¿ç”¨%<for%>循环åˆå§‹åŒ–声明" - - #: c/c-decl.c:8702 - #, fuzzy, gcc-internal-format --#| msgid "use option -std=c99 or -std=gnu99 to compile your code" - msgid "use option -std=c99, -std=gnu99, -std=c11 or -std=gnu11 to compile your code" - msgstr "使用 -std=c99 或 -std=gnu99 æ¥ç¼–译您的代ç " - -@@ -28799,31 +27976,26 @@ - - #: c/c-decl.c:9862 - #, fuzzy, gcc-internal-format --#| msgid "%<__thread%> used with %<auto%>" - msgid "%qE used with %<auto%>" - msgstr "%<__thread%>与%<auto%>一起使用" - - #: c/c-decl.c:9864 - #, fuzzy, gcc-internal-format --#| msgid "%<__thread%> used with %<register%>" - msgid "%qE used with %<register%>" - msgstr "%<__thread%>与%<register%>一起使用" - - #: c/c-decl.c:9866 - #, fuzzy, gcc-internal-format --#| msgid "%<__thread%> used with %<typedef%>" - msgid "%qE used with %<typedef%>" - msgstr "%<__thread%>与%<typedef%>一起使用" - - #: c/c-decl.c:9880 c/c-parser.c:6560 - #, fuzzy, gcc-internal-format --#| msgid "%s does not support %s" - msgid "ISO C99 does not support %qE" - msgstr "%s ä¸æ”¯æŒ %s" - - #: c/c-decl.c:9883 c/c-parser.c:6563 - #, fuzzy, gcc-internal-format --#| msgid "ISO C90 does not support %<long long%>" - msgid "ISO C90 does not support %qE" - msgstr "ISO C90 ä¸æ”¯æŒ%<long long%>" - -@@ -28849,7 +28021,6 @@ - - #: c/c-decl.c:9933 - #, fuzzy, gcc-internal-format --#| msgid "%qs must be used with %qs" - msgid "%qs used with %qE" - msgstr "%qs必须与%qs一起使用" - -@@ -28906,7 +28077,6 @@ - - #: c/c-parser.c:1535 - #, fuzzy, gcc-internal-format --#| msgid "%<inline%> in empty declaration" - msgid "%<__auto_type%> in empty declaration" - msgstr "%<inline%>用于空声明ä¸" - -@@ -28942,13 +28112,11 @@ - - #: c/c-parser.c:1706 - #, fuzzy, gcc-internal-format --#| msgid "%<typeof%> applied to a bit-field" - msgid "%<__auto_type%> used with a bit-field initializer" - msgstr "为ä½æ®µä½¿ç”¨%<typeof%>" - - #: c/c-parser.c:1778 c/c-parser.c:1863 - #, fuzzy, gcc-internal-format --#| msgid "%<auto%> in file-scope empty declaration" - msgid "%<__auto_type%> requires an initialized data declaration" - msgstr "文件作用域ä¸å‡ºçŽ°%<auto%>空声明" - -@@ -29022,19 +28190,16 @@ - - #: c/c-parser.c:2372 - #, fuzzy, gcc-internal-format --#| msgid "ISO C99 does not support %<_Static_assert%>" - msgid "ISO C99 does not support the %<_Atomic%> qualifier" - msgstr "ISO C90 ä¸æ”¯æŒ%<_Static_assert%>" - - #: c/c-parser.c:2375 - #, fuzzy, gcc-internal-format --#| msgid "ISO C90 does not support %<_Static_assert%>" - msgid "ISO C90 does not support the %<_Atomic%> qualifier" - msgstr "ISO C90 ä¸æ”¯æŒ%<_Static_assert%>" - - #: c/c-parser.c:2403 - #, fuzzy, gcc-internal-format --#| msgid "%<typeof%> applied to a bit-field" - msgid "%<_Atomic%> applied to a qualified type" - msgstr "为ä½æ®µä½¿ç”¨%<typeof%>" - -@@ -29109,13 +28274,11 @@ - - #: c/c-parser.c:3049 - #, fuzzy, gcc-internal-format --#| msgid "ISO C90 does not support %<long long%>" - msgid "ISO C99 does not support %<_Alignas%>" - msgstr "ISO C90 ä¸æ”¯æŒ%<long long%>" - - #: c/c-parser.c:3052 - #, fuzzy, gcc-internal-format --#| msgid "ISO C90 does not support %<long long%>" - msgid "ISO C90 does not support %<_Alignas%>" - msgstr "ISO C90 ä¸æ”¯æŒ%<long long%>" - -@@ -29126,7 +28289,6 @@ - - #: c/c-parser.c:3349 c/c-parser.c:3378 - #, fuzzy, gcc-internal-format --#| msgid "Warn for obsolescent usage in a declaration" - msgid "array notations cannot be used in declaration" - msgstr "对声明ä¸çš„过时用法给出è¦å‘Š" - -@@ -29306,37 +28468,31 @@ - - #: c/c-parser.c:6616 - #, fuzzy, gcc-internal-format --#| msgid "ISO C++ does not allow %<alignof%> with a non-type" - msgid "ISO C does not allow %<%E (expression)%>" - msgstr "ISO C++ ä¸å…许对éžç±»åž‹ä½¿ç”¨%<alignof%>" - - #: c/c-parser.c:6643 - #, fuzzy, gcc-internal-format --#| msgid "cannot take address of bit-field %qD" - msgid "cannot take address of %qs" - msgstr "æ— æ³•å–å¾—ä½æ®µ%qD的地å€" - - #: c/c-parser.c:6727 - #, fuzzy, gcc-internal-format --#| msgid "ISO C99 does not support %<_Static_assert%>" - msgid "ISO C99 does not support %<_Generic%>" - msgstr "ISO C90 ä¸æ”¯æŒ%<_Static_assert%>" - - #: c/c-parser.c:6730 - #, fuzzy, gcc-internal-format --#| msgid "ISO C90 does not support %<_Static_assert%>" - msgid "ISO C90 does not support %<_Generic%>" - msgstr "ISO C90 ä¸æ”¯æŒ%<_Static_assert%>" - - #: c/c-parser.c:6797 - #, fuzzy, gcc-internal-format --#| msgid "cast specifies function type" - msgid "%<_Generic%> association has function type" - msgstr "类型转æ¢æŒ‡å®šäº†å‡½æ•°ç±»åž‹" - - #: c/c-parser.c:6800 - #, fuzzy, gcc-internal-format --#| msgid "expression statement has incomplete type" - msgid "%<_Generic%> association has incomplete type" - msgstr "表达å¼è¯å¥ç±»åž‹ä¸å®Œå…¨" - -@@ -29352,7 +28508,6 @@ - - #: c/c-parser.c:6829 - #, fuzzy, gcc-internal-format --#| msgid "originally defined here" - msgid "original %<default%> is here" - msgstr "原先在这里定义" - -@@ -29368,7 +28523,6 @@ - - #: c/c-parser.c:6861 - #, fuzzy, gcc-internal-format --#| msgid "Generate load/store multiple instructions" - msgid "%<_Generic> selector matches multiple associations" - msgstr "生æˆåŠ è½½/å˜å‚¨ä¹˜æ³•æŒ‡ä»¤" - -@@ -29399,7 +28553,6 @@ - - #: c/c-parser.c:7265 - #, fuzzy, gcc-internal-format --#| msgid "wrong number of arguments to function %<__builtin_next_arg%>" - msgid "wrong number of arguments to %<__builtin_choose_expr%>" - msgstr "给函数%<__builtin_next_arg%>çš„å‚æ•°æ•°ç›®ä¸å¯¹" - -@@ -29410,7 +28563,6 @@ - - #: c/c-parser.c:7347 - #, fuzzy, gcc-internal-format --#| msgid "wrong number of arguments to function %<__builtin_next_arg%>" - msgid "wrong number of arguments to %<__builtin_complex%>" - msgstr "给函数%<__builtin_next_arg%>çš„å‚æ•°æ•°ç›®ä¸å¯¹" - -@@ -29421,13 +28573,11 @@ - - #: c/c-parser.c:7378 - #, fuzzy, gcc-internal-format --#| msgid "%<__builtin_longjmp%> second argument must be 1" - msgid "%<__builtin_complex%> operands of different types" - msgstr "%<__builtin_longjmp%>的第二个实å‚必须是 1" - - #: c/c-parser.c:7424 cp/parser.c:5861 - #, fuzzy, gcc-internal-format --#| msgid "wrong number of arguments to function %<__builtin_next_arg%>" - msgid "wrong number of arguments to %<__builtin_shuffle%>" - msgstr "给函数%<__builtin_next_arg%>çš„å‚æ•°æ•°ç›®ä¸å¯¹" - -@@ -29538,19 +28688,16 @@ - - #: c/c-parser.c:9422 cp/parser.c:31380 - #, fuzzy, gcc-internal-format --#| msgid "%<#pragma omp taskwait%> may only be used in compound statements" - msgid "%<#pragma omp taskyield%> may only be used in compound statements" - msgstr "%<#pragma omp taskwait%>åªèƒ½ç”¨åœ¨å¤åˆè¯å¥ä¸" - - #: c/c-parser.c:9433 cp/parser.c:31396 - #, fuzzy, gcc-internal-format --#| msgid "%<#pragma omp barrier%> may only be used in compound statements" - msgid "%<#pragma omp cancel%> may only be used in compound statements" - msgstr "%<#pragma omp barrier%>åªèƒ½ç”¨åœ¨å¤åˆè¯å¥ä¸" - - #: c/c-parser.c:9444 cp/parser.c:31412 - #, fuzzy, gcc-internal-format --#| msgid "%<#pragma omp taskwait%> may only be used in compound statements" - msgid "%<#pragma omp cancellation point%> may only be used in compound statements" - msgstr "%<#pragma omp taskwait%>åªèƒ½ç”¨åœ¨å¤åˆè¯å¥ä¸" - -@@ -29561,7 +28708,6 @@ - - #: c/c-parser.c:9479 cp/parser.c:31468 - #, fuzzy, gcc-internal-format --#| msgid "for statement expected" - msgid "for, while or do statement expected" - msgstr "éœ€è¦ for è¯å¥" - -@@ -29598,7 +28744,6 @@ - - #: c/c-parser.c:10195 - #, fuzzy, gcc-internal-format --#| msgid "expected %<+%>, %<*%>, %<-%>, %<&%>, %<^%>, %<|%>, %<&&%>, or %<||%>" - msgid "expected %<+%>, %<*%>, %<-%>, %<&%>, %<^%>, %<|%>, %<&&%>, %<||%>, %<min%> or %<max%>" - msgstr "需è¦%<+%>ã€%<*%>ã€%<-%>ã€%<&%>ã€%<^%>ã€%<|%>ã€%<&&%>或%<||%>" - -@@ -29619,19 +28764,16 @@ - - #: c/c-parser.c:10410 - #, fuzzy, gcc-internal-format --#| msgid "%<num_threads%> value must be positive" - msgid "%<num_teams%> value must be positive" - msgstr "%<num_threads%>值必须为æ£" - - #: c/c-parser.c:10454 - #, fuzzy, gcc-internal-format --#| msgid "%<num_threads%> value must be positive" - msgid "%<thread_limit%> value must be positive" - msgstr "%<num_threads%>值必须为æ£" - - #: c/c-parser.c:10496 cp/semantics.c:5589 - #, fuzzy, gcc-internal-format --#| msgid "%Hcollapse argument needs positive constant integer expression" - msgid "%<aligned%> clause alignment expression must be positive constant integer expression" - msgstr "%H折å å˜é‡éœ€è¦æ£æ•´å¸¸æ•°è¡¨è¾¾å¼" - -@@ -29642,49 +28784,41 @@ - - #: c/c-parser.c:10538 - #, fuzzy, gcc-internal-format --#| msgid "schedule chunk size expression must be integral" - msgid "%<linear%> clause step expression must be integral" - msgstr "调度å—大å°è¡¨è¾¾å¼å¿…须为整型" - - #: c/c-parser.c:10575 - #, fuzzy, gcc-internal-format --#| msgid "%Hcollapse argument needs positive constant integer expression" - msgid "%<safelen%> clause expression must be positive constant integer expression" - msgstr "%H折å å˜é‡éœ€è¦æ£æ•´å¸¸æ•°è¡¨è¾¾å¼" - - #: c/c-parser.c:10611 - #, fuzzy, gcc-internal-format --#| msgid "%Hcollapse argument needs positive constant integer expression" - msgid "%<simdlen%> clause expression must be positive constant integer expression" - msgstr "%H折å å˜é‡éœ€è¦æ£æ•´å¸¸æ•°è¡¨è¾¾å¼" - - #: c/c-parser.c:10673 cp/parser.c:27875 cp/parser.c:28058 - #, fuzzy, gcc-internal-format --#| msgid "invalid schedule kind" - msgid "invalid depend kind" - msgstr "æ— æ•ˆçš„è°ƒåº¦ç±»åž‹" - - #: c/c-parser.c:10710 cp/parser.c:27915 - #, fuzzy, gcc-internal-format --#| msgid "invalid mask" - msgid "invalid map kind" - msgstr "æ— æ•ˆæŽ©ç " - - #: c/c-parser.c:10775 cp/parser.c:28005 - #, fuzzy, gcc-internal-format --#| msgid "invalid schedule kind" - msgid "invalid dist_schedule kind" - msgstr "æ— æ•ˆçš„è°ƒåº¦ç±»åž‹" - - #: c/c-parser.c:10844 - #, fuzzy, gcc-internal-format --#| msgid "invalid schedule kind" - msgid "invalid proc_bind kind" - msgstr "æ— æ•ˆçš„è°ƒåº¦ç±»åž‹" - - #: c/c-parser.c:10999 cp/parser.c:28194 - #, fuzzy, gcc-internal-format --#| msgid "%qs must be used with %qs" - msgid "%qs must be the first clause of %qs" - msgstr "%qs必须与%qs一起使用" - -@@ -29700,7 +28834,6 @@ - - #: c/c-parser.c:11459 cp/parser.c:28653 cp/parser.c:28679 - #, fuzzy, gcc-internal-format --#| msgid "invalid operator for %<#pragma omp atomic%>" - msgid "invalid form of %<#pragma omp atomic%>" - msgstr "%<#pragma omp atomic%>è¿ç®—ç¬¦æ— æ•ˆ" - -@@ -29746,19 +28879,16 @@ - - #: c/c-parser.c:12219 cp/parser.c:29731 - #, fuzzy, gcc-internal-format --#| msgid "expected %<operator%>" - msgid "expected %<for%> after %qs" - msgstr "需è¦%<operator%>" - - #: c/c-parser.c:12411 cp/parser.c:29918 - #, fuzzy, gcc-internal-format --#| msgid "expected %<using%>" - msgid "expected %<point%>" - msgstr "需è¦%<using%>" - - #: c/c-parser.c:12615 cp/parser.c:30140 - #, fuzzy, gcc-internal-format --#| msgid "%<#pragma omp taskwait%> may only be used in compound statements" - msgid "%<#pragma omp target update%> may only be used in compound statements" - msgstr "%<#pragma omp taskwait%>åªèƒ½ç”¨åœ¨å¤åˆè¯å¥ä¸" - -@@ -29774,7 +28904,6 @@ - - #: c/c-parser.c:12817 c/c-parser.c:12845 - #, fuzzy, gcc-internal-format --#| msgid "%<#pragma align%> must appear before the declaration of %D, ignoring" - msgid "%<#pragma omp declare simd%> must be followed by function declaration or definition" - msgstr "%<#pragma align%>必须出现在 %D 的声明之å‰ï¼Œå¿½ç•¥" - -@@ -29795,19 +28924,16 @@ - - #: c/c-parser.c:12983 cp/parser.c:30450 - #, fuzzy, gcc-internal-format --#| msgid "expected %<try%>" - msgid "expected %<target%>" - msgstr "需è¦%<try%>" - - #: c/c-parser.c:12990 cp/parser.c:30457 - #, fuzzy, gcc-internal-format --#| msgid "expected %<decltype%>" - msgid "expected %<declare%>" - msgstr "需è¦%<decltype%>" - - #: c/c-parser.c:12996 cp/parser.c:30464 - #, fuzzy, gcc-internal-format --#| msgid "%<#pragma GCC pop_options%> without a corresponding %<#pragma GCC push_options%>" - msgid "%<#pragma omp end declare target%> without corresponding %<#pragma omp declare target%>" - msgstr "%<#pragma GCC pop_options%>缺少相应的%<#pragma GCC push_options%>" - -@@ -29818,7 +28944,6 @@ - - #: c/c-parser.c:13074 - #, fuzzy, gcc-internal-format --#| msgid "expected %<+%>, %<*%>, %<-%>, %<&%>, %<^%>, %<|%>, %<&&%>, or %<||%>" - msgid "expected %<+%>, %<*%>, %<-%>, %<&%>, %<^%>, %<|%>, %<&&%>, %<||%>, %<min%> or identifier" - msgstr "需è¦%<+%>ã€%<*%>ã€%<-%>ã€%<&%>ã€%<^%>ã€%<|%>ã€%<&&%>或%<||%>" - -@@ -29844,19 +28969,16 @@ - - #: c/c-parser.c:13125 - #, fuzzy, gcc-internal-format --#| msgid "previous declaration" - msgid "previous %<#pragma omp declare reduction%>" - msgstr "上一个声明" - - #: c/c-parser.c:13242 - #, fuzzy, gcc-internal-format --#| msgid "expected %<(%> or end of line" - msgid "expected %<omp_priv%> or function-name" - msgstr "需è¦%<(%>或行尾" - - #: c/c-parser.c:13253 - #, fuzzy, gcc-internal-format --#| msgid "expected function" - msgid "expected function-name %<(%>" - msgstr "需è¦å‡½æ•°" - -@@ -29867,7 +28989,6 @@ - - #: c/c-parser.c:13388 cp/parser.c:30900 - #, fuzzy, gcc-internal-format --#| msgid "expected %<#pragma omp section%> or %<}%>" - msgid "expected %<simd%> or %<reduction%> or %<target%>" - msgstr "需è¦%<#pragma omp section%>或%<}%>" - -@@ -29898,31 +29019,26 @@ - - #: c/c-parser.c:13536 - #, fuzzy, gcc-internal-format --#| msgid "#pragma GCC optimize is not allowed inside functions" - msgid "pragma simd must be inside a function" - msgstr "#pragma GCC optimize ä¸å…许用在函数ä¸" - - #: c/c-parser.c:13580 cp/parser.c:31586 - #, fuzzy, gcc-internal-format --#| msgid "selector must be an integer constant in the range 0..%wi" - msgid "vectorlength must be an integer constant" - msgstr "选择å必须是 0 到 %wi 间的整常é‡" - - #: c/c-parser.c:13582 cp/parser.c:31589 - #, fuzzy, gcc-internal-format --#| msgid "stack size must be an exact power of 2" - msgid "vectorlength must be a power of 2" - msgstr "æ ˆå¤§å°å¿…须刚好是 2 çš„æŸæ¬¡æ–¹" - - #: c/c-parser.c:13665 cp/parser.c:31696 - #, fuzzy, gcc-internal-format --#| msgid "selector must be an integer constant in the range 0..%wi" - msgid "step size must be an integer constant expression or an integer variable" - msgstr "选择å必须是 0 到 %wi 间的整常é‡" - - #: c/c-parser.c:13764 cp/parser.c:31789 - #, fuzzy, gcc-internal-format --#| msgid "expected %<#pragma omp%> clause" - msgid "expected %<#pragma simd%> clause" - msgstr "需è¦%<#pragma omp%>åå¥" - -@@ -29953,7 +29069,6 @@ - - #: c/c-parser.c:14059 cp/parser.c:6263 - #, fuzzy, gcc-internal-format --#| msgid "expected %<:%> or %<::%>" - msgid "expected %<:%> or numeral" - msgstr "需è¦%<:%>或%<::%>" - -@@ -29964,7 +29079,6 @@ - - #: c/c-parser.c:14077 c/c-parser.c:14120 - #, fuzzy, gcc-internal-format --#| msgid "new cannot be applied to a function type" - msgid "array notations cannot be used with function type" - msgstr "new ä¸èƒ½ç”¨äºŽå‡½æ•°ç±»åž‹" - -@@ -29980,7 +29094,6 @@ - - #: c/c-parser.c:14148 c/c-parser.c:14151 - #, fuzzy, gcc-internal-format --#| msgid "expected boolean expression" - msgid "expected array notation expression" - msgstr "需è¦å¸ƒå°”表达å¼" - -@@ -30062,7 +29175,6 @@ - - #: c/c-typeck.c:1832 - #, fuzzy, gcc-internal-format --#| msgid "defining a type in a compound literal is invalid in C++" - msgid "converting an array compound literal to a pointer is ill-formed in C++" - msgstr "C++ ä¸å…许在组åˆå—é¢å¸¸é‡ä¸å®šä¹‰ç±»åž‹" - -@@ -30088,7 +29200,6 @@ - - #: c/c-typeck.c:2434 - #, fuzzy, gcc-internal-format --#| msgid "alignment of array elements is greater than element size" - msgid "rank of the array's index is greater than 1" - msgstr "æ•°ç»„å…ƒç´ çš„å¯¹é½è¾¹ç•Œæ¯”å…ƒç´ å¤§å°è¿˜è¦å¤§" - -@@ -30129,19 +29240,16 @@ - - #: c/c-typeck.c:2881 - #, fuzzy, gcc-internal-format --#| msgid "called object %qE is not a function" - msgid "called object %qE is not a function or function pointer" - msgstr "被调用的对象%qEä¸æ˜¯ä¸€ä¸ªå‡½æ•°" - - #: c/c-typeck.c:2886 - #, fuzzy, gcc-internal-format --#| msgid "called object %qE is not a function" - msgid "called object %qD is not a function or function pointer" - msgstr "被调用的对象%qEä¸æ˜¯ä¸€ä¸ªå‡½æ•°" - - #: c/c-typeck.c:2892 - #, fuzzy, gcc-internal-format --#| msgid "called object %qE is not a function" - msgid "called object is not a function or function pointer" - msgstr "被调用的对象%qEä¸æ˜¯ä¸€ä¸ªå‡½æ•°" - -@@ -30250,7 +29358,6 @@ - - #: c/c-typeck.c:3515 cp/typeck.c:5054 - #, fuzzy, gcc-internal-format --#| msgid "arithmetic on pointer to an incomplete type" - msgid "arithmetic on pointer to an empty aggregate" - msgstr "在指å‘ä¸å®Œå…¨ç±»åž‹çš„指针上执行算术è¿ç®—" - -@@ -30366,7 +29473,6 @@ - - #: c/c-typeck.c:4725 cp/typeck.c:6204 - #, fuzzy, gcc-internal-format --#| msgid "a function call cannot appear in a constant-expression" - msgid "spawned function call cannot be part of a comma expression" - msgstr "函数调用ä¸èƒ½å‡ºçŽ°åœ¨å¸¸é‡è¡¨è¾¾å¼ä¸" - -@@ -30377,7 +29483,6 @@ - - #: c/c-typeck.c:4777 c/c-typeck.c:9666 - #, fuzzy, gcc-internal-format --#| msgid "left-hand operand of comma expression has no effect" - msgid "right-hand operand of comma expression has no effect" - msgstr "逗å·è¡¨è¾¾å¼çš„å·¦æ“作数ä¸èµ·ä½œç”¨" - -@@ -30473,7 +29578,6 @@ - - #: c/c-typeck.c:5214 - #, fuzzy, gcc-internal-format --#| msgid "assignment suppression" - msgid "assignment to expression with array type" - msgstr "å–消赋值" - -@@ -30819,7 +29923,6 @@ - - #: c/c-typeck.c:7436 - #, fuzzy, gcc-internal-format --#| msgid "missing initializer for member %qD" - msgid "missing initializer for field %qD of %qT" - msgstr "æˆå‘˜%qD缺少åˆå§‹å€¼è®¾å®š" - -@@ -30945,7 +30048,6 @@ - - #: c/c-typeck.c:9139 cp/typeck.c:8333 - #, fuzzy, gcc-internal-format --#| msgid "Logical range in CASE statement at %L is not allowed" - msgid "use of %<_Cilk_spawn%> in a return statement is not allowed" - msgstr "%L处 CASE è¯å¥ä¸çš„逻辑范围是ä¸è¢«å…许的" - -@@ -31031,13 +30133,11 @@ - - #: c/c-typeck.c:9621 - #, fuzzy, gcc-internal-format --#| msgid "break statement not within loop or switch" - msgid "break statement within %<#pragma simd%> loop body" - msgstr "break è¯å¥ä¸åœ¨å¾ªçŽ¯æˆ–开关è¯å¥å†…" - - #: c/c-typeck.c:9623 cp/parser.c:10656 - #, fuzzy, gcc-internal-format --#| msgid "continue statement not within a loop" - msgid "continue statement within %<#pragma simd%> loop body" - msgstr "continue è¯å¥å‡ºçŽ°åœ¨å¾ªçŽ¯ä»¥å¤–" - -@@ -31053,7 +30153,6 @@ - - #: c/c-typeck.c:10464 c/c-typeck.c:10601 cp/typeck.c:4570 - #, fuzzy, gcc-internal-format --#| msgid "Warn about comparison of different enum types" - msgid "comparing vectors with different element types" - msgstr "对ä¸åŒæžšä¸¾ç±»åž‹ä¹‹é—´çš„比较给出è¦å‘Š" - -@@ -31140,7 +30239,6 @@ - - #: c/c-typeck.c:11053 - #, fuzzy, gcc-internal-format --#| msgid "used struct type value where scalar is required" - msgid "used vector type where scalar is required" - msgstr "需è¦æ ‡é‡æ—¶ä½¿ç”¨äº†ç»“构类型" - -@@ -31156,7 +30254,6 @@ - - #: c/c-typeck.c:11269 cp/semantics.c:4222 cp/semantics.c:5655 - #, fuzzy, gcc-internal-format --#| msgid "%qD is not a variable in clause %qs" - msgid "%qD is not a variable in %qs clause" - msgstr "%qD在åå¥%qsä¸ä¸æ˜¯ä¸€ä¸ªå˜é‡" - -@@ -31163,7 +30260,6 @@ - #: c/c-typeck.c:11273 c/c-typeck.c:12044 cp/semantics.c:4226 - #: cp/semantics.c:5658 - #, fuzzy, gcc-internal-format --#| msgid "%qE is not a variable in clause %qs" - msgid "%qE is not a variable in %qs clause" - msgstr "%qE在åå¥%qsä¸ä¸æ˜¯ä¸€ä¸ªå˜é‡" - -@@ -31170,19 +30266,16 @@ - #: c/c-typeck.c:11281 c/c-typeck.c:12051 cp/semantics.c:4234 - #: cp/semantics.c:5664 - #, fuzzy, gcc-internal-format --#| msgid "%qD is not a variable in clause %qs" - msgid "%qD is threadprivate variable in %qs clause" - msgstr "%qD在åå¥%qsä¸ä¸æ˜¯ä¸€ä¸ªå˜é‡" - - #: c/c-typeck.c:11303 cp/semantics.c:4260 - #, fuzzy, gcc-internal-format --#| msgid "size in array new must have integral type" - msgid "low bound %qE of array section does not have integral type" - msgstr "数组 new 的大å°å¿…须有整数类型" - - #: c/c-typeck.c:11310 cp/semantics.c:4267 - #, fuzzy, gcc-internal-format --#| msgid "size in array new must have integral type" - msgid "length %qE of array section does not have integral type" - msgstr "数组 new 的大å°å¿…须有整数类型" - -@@ -31198,7 +30291,6 @@ - - #: c/c-typeck.c:11359 cp/semantics.c:4316 - #, fuzzy, gcc-internal-format --#| msgid "variable length array is used" - msgid "negative length in array section in %qs clause" - msgstr "使用了å˜é•¿æ•°ç»„" - -@@ -31219,7 +30311,6 @@ - - #: c/c-typeck.c:11447 cp/semantics.c:4404 - #, fuzzy, gcc-internal-format --#| msgid "for increment expression has no effect" - msgid "for pointer type length expression must be specified" - msgstr "for 循环増é‡è¡¨è¾¾å¼ä¸èµ·ä½œç”¨" - -@@ -31226,7 +30317,6 @@ - #: c/c-typeck.c:11456 c/c-typeck.c:11571 cp/semantics.c:4413 - #: cp/semantics.c:4524 - #, fuzzy, gcc-internal-format --#| msgid "Copy array sections into a contiguous block on procedure entry" - msgid "array section is not contiguous in %qs clause" - msgstr "在过程入å£å¤„将数组段å¤åˆ¶åˆ°ä¸€ä¸ªè¿žç»çš„å—ä¸" - -@@ -31282,25 +30372,21 @@ - - #: c/c-typeck.c:11975 cp/semantics.c:5545 - #, fuzzy, gcc-internal-format --#| msgid "%qE is not a variable in clause %qs" - msgid "%qE is not a variable in %<aligned%> clause" - msgstr "%qE在åå¥%qsä¸ä¸æ˜¯ä¸€ä¸ªå˜é‡" - - #: c/c-typeck.c:11982 - #, fuzzy, gcc-internal-format --#| msgid "type to vector delete is neither pointer or array type" - msgid "%qE in %<aligned%> clause is neither a pointer nor an array" - msgstr "å‘é‡ delete 的实å‚类型既éžæŒ‡é’ˆä¹Ÿéžæ•°ç»„" - - #: c/c-typeck.c:11989 - #, fuzzy, gcc-internal-format --#| msgid "%qE appears more than once in data clauses" - msgid "%qE appears more than once in %<aligned%> clauses" - msgstr "%qE在数æ®åå¥ä¸å¤šæ¬¡å‡ºçŽ°" - - #: c/c-typeck.c:12010 cp/semantics.c:5615 - #, fuzzy, gcc-internal-format --#| msgid "%qE is not a variable in clause %qs" - msgid "%qE is not a variable in %<depend%> clause" - msgstr "%qE在åå¥%qsä¸ä¸æ˜¯ä¸€ä¸ªå˜é‡" - -@@ -31311,31 +30397,26 @@ - - #: c/c-typeck.c:12062 cp/semantics.c:5680 - #, fuzzy, gcc-internal-format --#| msgid "%qD is not a variable in clause %qs" - msgid "%qD does not have a mappable type in %qs clause" - msgstr "%qD在åå¥%qsä¸ä¸æ˜¯ä¸€ä¸ªå˜é‡" - - #: c/c-typeck.c:12069 cp/semantics.c:5687 - #, fuzzy, gcc-internal-format --#| msgid "%qD appears more than once in data clauses" - msgid "%qD appears more than once in motion clauses" - msgstr "%qD在数æ®åå¥ä¸å¤šæ¬¡å‡ºçŽ°" - - #: c/c-typeck.c:12071 cp/semantics.c:5689 - #, fuzzy, gcc-internal-format --#| msgid "%qD appears more than once in data clauses" - msgid "%qD appears more than once in map clauses" - msgstr "%qD在数æ®åå¥ä¸å¤šæ¬¡å‡ºçŽ°" - - #: c/c-typeck.c:12084 cp/semantics.c:5703 - #, fuzzy, gcc-internal-format --#| msgid "%qD is not a variable in clause %qs" - msgid "%qD is not an argument in %<uniform%> clause" - msgstr "%qD在åå¥%qsä¸ä¸æ˜¯ä¸€ä¸ªå˜é‡" - - #: c/c-typeck.c:12087 cp/semantics.c:5705 - #, fuzzy, gcc-internal-format --#| msgid "%qE is not a variable in clause %qs" - msgid "%qE is not an argument in %<uniform%> clause" - msgstr "%qE在åå¥%qsä¸ä¸æ˜¯ä¸€ä¸ªå˜é‡" - -@@ -31424,7 +30505,6 @@ - #. Re-run template unification with diagnostics. - #: cp/call.c:3279 - #, fuzzy, gcc-internal-format --#| msgid "template argument %d is invalid" - msgid " template argument deduction/substitution failed:" - msgstr "模æ¿ç¬¬ %d 个å‚æ•°æ— æ•ˆ" - -@@ -31472,25 +30552,21 @@ - - #: cp/call.c:4245 - #, fuzzy, gcc-internal-format --#| msgid "ambiguous overload for %qs in %<%s %E%>" - msgid "ambiguous overload for " - msgstr "%qs在%<%s %E%>ä¸çš„é‡è½½æœ‰æ§ä¹‰" - - #: cp/call.c:4246 - #, fuzzy, gcc-internal-format --#| msgid "no match for %qs in %<%s %E%>" - msgid "no match for " - msgstr "%qs在%<%s %E%>ä¸æ²¡æœ‰åŒ¹é…" - - #: cp/call.c:4249 - #, fuzzy, gcc-internal-format --#| msgid "invalid operands to binary %s (have %qT and %qT)" - msgid " (operand types are %qT, %qT, and %qT)" - msgstr "åŒç›®è¿ç®—符 %s æ“作数(%qTå’Œ%qT)æ— æ•ˆ" - - #: cp/call.c:4251 - #, fuzzy, gcc-internal-format --#| msgid "invalid operands to binary %s (have %qT and %qT)" - msgid " (operand types are %qT and %qT)" - msgstr "åŒç›®è¿ç®—符 %s æ“作数(%qTå’Œ%qT)æ— æ•ˆ" - -@@ -31501,61 +30577,51 @@ - - #: cp/call.c:4273 - #, fuzzy, gcc-internal-format --#| msgid "expected %<operator%>" - msgid "ternary %<operator?:%>" - msgstr "需è¦%<operator%>" - - #: cp/call.c:4277 - #, fuzzy, gcc-internal-format --#| msgid "no match for ternary %<operator?:%> in %<%E ? %E : %E%>" - msgid "ternary %<operator?:%> in %<%E ? %E : %E%>" - msgstr "三元%<operator?:%>在%<%E ? %E : %E%>ä¸æ²¡æœ‰åŒ¹é…" - - #: cp/call.c:4286 cp/call.c:4317 cp/call.c:4326 - #, fuzzy, gcc-internal-format --#| msgid "expected %<operator%>" - msgid "%<operator%s%>" - msgstr "需è¦%<operator%>" - - #: cp/call.c:4289 - #, fuzzy, gcc-internal-format --#| msgid "no match for %<operator%s%> in %<%E%s%>" - msgid "%<operator%s%> in %<%E%s%>" - msgstr "%<operator%s%>在%<%E%s%>ä¸æ²¡æœ‰åŒ¹é…" - - #: cp/call.c:4296 - #, fuzzy, gcc-internal-format --#| msgid "expected %<operator%>" - msgid "%<operator[]%>" - msgstr "需è¦%<operator%>" - - #: cp/call.c:4299 - #, fuzzy, gcc-internal-format --#| msgid "no match for %<operator[]%> in %<%E[%E]%>" - msgid "%<operator[]%> in %<%E[%E]%>" - msgstr "%<operator[]%>在%<%E[%E]%>ä¸æ²¡æœ‰åŒ¹é…" - - #: cp/call.c:4307 - #, fuzzy, gcc-internal-format --#| msgid "%s" - msgid "%qs" - msgstr "%s" - - #: cp/call.c:4310 - #, fuzzy, gcc-internal-format --#| msgid "no match for %qs in %<%s %E%>" - msgid "%qs in %<%s %E%>" - msgstr "%qs在%<%s %E%>ä¸æ²¡æœ‰åŒ¹é…" - - #: cp/call.c:4320 - #, fuzzy, gcc-internal-format --#| msgid "no match for %<operator%s%> in %<%E %s %E%>" - msgid "%<operator%s%> in %<%E %s %E%>" - msgstr "%<operator%s%>在%<%E %s %E%>ä¸æ²¡æœ‰åŒ¹é…" - - #: cp/call.c:4329 - #, fuzzy, gcc-internal-format --#| msgid "no match for %<operator%s%> in %<%s%E%>" - msgid "%<operator%s%> in %<%s%E%>" - msgstr "%<operator%s%>在%<%s%E%>ä¸æ²¡æœ‰åŒ¹é…" - -@@ -31571,7 +30637,6 @@ - - #: cp/call.c:4554 - #, fuzzy, gcc-internal-format --#| msgid "enumeral mismatch in conditional expression: %qT vs %qT" - msgid "incompatible vector types in conditional expression: %qT, %qT and %qT" - msgstr "æ¡ä»¶è¡¨è¾¾å¼ä¸æžšä¸¾ä¸åŒ¹é…:%qT对%qT" - -@@ -31672,7 +30737,6 @@ - - #: cp/call.c:5883 - #, fuzzy, gcc-internal-format --#| msgid "converting %<false%> to pointer type for argument %P of %qD" - msgid "converting %<false%> to pointer type %qT" - msgstr "å°†%<false%>转æ¢ä¸ºæŒ‡å‘%2$qDçš„å®žå‚ %1$P 的指针类型" - -@@ -31683,7 +30747,6 @@ - - #: cp/call.c:5940 - #, fuzzy, gcc-internal-format --#| msgid "invalid conversion from %qT to %qT" - msgid "invalid user-defined conversion from %qT to %qT" - msgstr "从类型%qT到类型%qT的转æ¢æ— 效" - -@@ -31694,7 +30757,6 @@ - - #: cp/call.c:5975 - #, fuzzy, gcc-internal-format --#| msgid " initializing argument %P of %qD" - msgid "initializing argument %P of %qD" - msgstr " åˆå§‹åŒ–%2$qDçš„å®žå‚ %1$P" - -@@ -31705,7 +30767,6 @@ - - #: cp/call.c:6080 cp/call.c:6219 - #, fuzzy, gcc-internal-format --#| msgid " initializing argument %P of %q+D" - msgid "initializing argument %P of %q+D" - msgstr "以åˆå§‹åŒ–%2$q+Dçš„å®žå‚ %1$P" - -@@ -31736,7 +30797,6 @@ - - #: cp/call.c:6370 cp/cvt.c:1720 - #, fuzzy, gcc-internal-format --#| msgid "class %qT will be considered nearly empty in a future version of GCC" - msgid "scoped enum %qT will not promote to an integral type in a future version of GCC" - msgstr "在 GCC 的未æ¥ç‰ˆæœ¬ä¸ç±»%qTå°†è¢«çœ‹ä½œå‡ ä¹Žä¸ºç©º" - -@@ -31758,7 +30818,6 @@ - - #: cp/call.c:6507 - #, fuzzy, gcc-internal-format --#| msgid "the default argument for parameter %d of %qD has not yet been parsed" - msgid "call to %qD uses the default argument for parameter %P, which is not yet defined" - msgstr "%2$qD的第 %1$d 个形å‚的默认实å‚尚未被解æžåˆ°" - -@@ -31769,7 +30828,6 @@ - - #: cp/call.c:6668 - #, fuzzy, gcc-internal-format --#| msgid "defaulted function %q+D with default argument" - msgid "use of multiversioned function without a default" - msgstr "默认化函数%q+D有默认å‚æ•°" - -@@ -31820,7 +30878,6 @@ - - #: cp/call.c:7662 - #, fuzzy, gcc-internal-format --#| msgid " for a function-style cast, remove the redundant %<::%D%>" - msgid "for a function-style cast, remove the redundant %<::%D%>" - msgstr "对于函数类型的类型转æ¢ï¼Œç§»é™¤å†—余的%<::%D%>" - -@@ -31891,7 +30948,6 @@ - - #: cp/call.c:9075 - #, fuzzy, gcc-internal-format --#| msgid "could not convert %qE to %qT" - msgid "could not convert %qE from %qT to %qT" - msgstr "ä¸èƒ½å°†%qE转æ¢ä¸º%qT" - -@@ -31912,25 +30968,21 @@ - - #: cp/class.c:302 - #, fuzzy, gcc-internal-format --#| msgid "cannot convert from base %qT to derived type %qT via virtual base %qT" - msgid "cannot convert from pointer to base class %qT to pointer to derived class %qT because the base is virtual" - msgstr "æ— æ³•ä»ŽåŸºç±»%qT转æ¢åˆ°æ´¾ç”Ÿç±»%qT,通过虚基类%qT" - - #: cp/class.c:306 - #, fuzzy, gcc-internal-format --#| msgid "cannot convert from base %qT to derived type %qT via virtual base %qT" - msgid "cannot convert from base class %qT to derived class %qT because the base is virtual" - msgstr "æ— æ³•ä»ŽåŸºç±»%qT转æ¢åˆ°æ´¾ç”Ÿç±»%qT,通过虚基类%qT" - - #: cp/class.c:313 - #, fuzzy, gcc-internal-format --#| msgid "cannot convert from base %qT to derived type %qT via virtual base %qT" - msgid "cannot convert from pointer to base class %qT to pointer to derived class %qT via virtual base %qT" - msgstr "æ— æ³•ä»ŽåŸºç±»%qT转æ¢åˆ°æ´¾ç”Ÿç±»%qT,通过虚基类%qT" - - #: cp/class.c:318 - #, fuzzy, gcc-internal-format --#| msgid "cannot convert from base %qT to derived type %qT via virtual base %qT" - msgid "cannot convert from base class %qT to derived class %qT via virtual base %qT" - msgstr "æ— æ³•ä»ŽåŸºç±»%qT转æ¢åˆ°æ´¾ç”Ÿç±»%qT,通过虚基类%qT" - -@@ -31946,13 +30998,11 @@ - - #: cp/class.c:1159 - #, fuzzy, gcc-internal-format --#| msgid " inlined from %qs" - msgid "%q#D inherited from %qT" - msgstr " 内è”自%qs" - - #: cp/class.c:1162 - #, fuzzy, gcc-internal-format --#| msgid "conflicts with previous declaration here" - msgid "conflicts with version inherited from %qT" - msgstr "与先å‰æ¤å¤„的声明冲çª" - -@@ -31998,7 +31048,6 @@ - - #: cp/class.c:1389 cp/class.c:1399 - #, fuzzy, gcc-internal-format --#| msgid "%qD declared here" - msgid "%qT declared here" - msgstr "%qD在æ¤å£°æ˜Ž" - -@@ -32009,7 +31058,6 @@ - - #: cp/class.c:1508 - #, fuzzy, gcc-internal-format --#| msgid "cannot convert from base %qT to derived type %qT via virtual base %qT" - msgid "cannot derive from %<final%> base %qT in derived type %qT" - msgstr "æ— æ³•ä»ŽåŸºç±»%qT转æ¢åˆ°æ´¾ç”Ÿç±»%qT,通过虚基类%qT" - -@@ -32040,7 +31088,6 @@ - - #: cp/class.c:2753 - #, fuzzy, gcc-internal-format --#| msgid "%q+D defined but not used" - msgid "%q+#D marked final, but is not virtual" - msgstr "%q+D定义åŽæœªä½¿ç”¨" - -@@ -32177,13 +31224,11 @@ - - #: cp/class.c:3594 - #, fuzzy, gcc-internal-format --#| msgid "non-member %qs cannot be declared %<mutable%>" - msgid "member %q+D cannot be declared both %<const%> and %<mutable%>" - msgstr "éžæˆå‘˜%qsä¸èƒ½è¢«å£°æ˜Žä¸º%<mutable%>" - - #: cp/class.c:3600 - #, fuzzy, gcc-internal-format --#| msgid "non-member %qs cannot be declared %<mutable%>" - msgid "member %q+D cannot be declared as a %<mutable%> reference" - msgstr "éžæˆå‘˜%qsä¸èƒ½è¢«å£°æ˜Žä¸º%<mutable%>" - -@@ -32244,13 +31289,11 @@ - - #: cp/class.c:5393 - #, fuzzy, gcc-internal-format --#| msgid "%q#T is not a class" - msgid "%q+T is not literal because:" - msgstr "%q#Tä¸æ˜¯ä¸€ä¸ªç±»" - - #: cp/class.c:5395 - #, fuzzy, gcc-internal-format --#| msgid "base class %q#T has a non-virtual destructor" - msgid " %q+T has a non-trivial destructor" - msgstr "基类%q#T有一个éžè™šæžæž„函数" - -@@ -32266,7 +31309,6 @@ - - #: cp/class.c:5450 - #, fuzzy, gcc-internal-format --#| msgid "non-static data member %qD has Java class type" - msgid " non-static data member %q+D has non-literal type" - msgstr "éžé™æ€æ•°æ®æˆå‘˜%qD具有 Java 类类型" - -@@ -32339,7 +31381,6 @@ - - #: cp/class.c:6643 - #, fuzzy, gcc-internal-format --#| msgid "type %qT does not have a known size" - msgid "type transparent %q#T does not have any fields" - msgstr "类型%qT大å°æœªçŸ¥" - -@@ -32350,7 +31391,6 @@ - - #: cp/class.c:6653 - #, fuzzy, gcc-internal-format --#| msgid "type %qE has virtual member functions" - msgid "type transparent class %qT has virtual functions" - msgstr "类型%qE有虚æˆå‘˜å‡½æ•°" - -@@ -32421,7 +31461,6 @@ - - #: cp/cp-array-notation.c:605 - #, fuzzy, gcc-internal-format --#| msgid "%qD cannot be declared as constexpr" - msgid "%qD cannot be scalar when %qD is not" - msgstr "%qDä¸èƒ½è¢«å£°æ˜Žä¸ºå¹¿ä¹‰å¸¸è¡¨è¾¾å¼" - -@@ -32463,7 +31502,6 @@ - - #: cp/cp-array-notation.c:1422 - #, fuzzy, gcc-internal-format --#| msgid "new cannot be applied to a function type" - msgid "array notation cannot be used with function type" - msgstr "new ä¸èƒ½ç”¨äºŽå‡½æ•°ç±»åž‹" - -@@ -32484,13 +31522,11 @@ - - #: cp/cp-cilkplus.c:53 - #, fuzzy, gcc-internal-format --#| msgid "statement-expressions are not allowed outside functions nor in template-argument lists" - msgid "throw expressions are not allowed inside loops marked with pragma simd" - msgstr "è¯å¥è¡¨è¾¾å¼åªèƒ½ç”¨äºŽå‡½æ•°æˆ–模æ¿å®žå‚列表内" - - #: cp/cp-cilkplus.c:60 - #, fuzzy, gcc-internal-format --#| msgid "%s statement is not allowed inside of BLOCK at %C" - msgid "try statements are not allowed inside loops marked with #pragma simd" - msgstr "%s è¯å¥ä¸èƒ½ç”¨åœ¨%C处 BLOCK 内" - -@@ -32561,7 +31597,6 @@ - - #: cp/cvt.c:780 - #, fuzzy, gcc-internal-format --#| msgid "could not convert %qE to %qT" - msgid "could not convert %qE from %<void%> to %<bool%>" - msgstr "ä¸èƒ½å°†%qE转æ¢ä¸º%qT" - -@@ -32822,7 +31857,6 @@ - - #: cp/cvt.c:1644 - #, fuzzy, gcc-internal-format --#| msgid "could not convert template argument %qE to %qT" - msgid "default type conversion can't deduce template argument for %qD" - msgstr "ä¸èƒ½å°†æ¨¡æ¿å‚数从%qE转æ¢åˆ°%qT" - -@@ -32894,7 +31928,6 @@ - - #: cp/decl.c:1304 - #, fuzzy, gcc-internal-format --#| msgid "previous declaration of %q+D with attribute noinline" - msgid "previous declaration of %qD with attribute noinline" - msgstr "å…ˆå‰%q+D的声明带有 noinline 属性" - -@@ -32905,7 +31938,6 @@ - - #: cp/decl.c:1314 - #, fuzzy, gcc-internal-format --#| msgid "previous declaration of %q+D was inline" - msgid "previous declaration of %qD was inline" - msgstr "%q+Då…ˆå‰è¢«å£°æ˜Žä¸ºå†…è”çš„" - -@@ -32926,25 +31958,21 @@ - - #: cp/decl.c:1349 - #, fuzzy, gcc-internal-format --#| msgid "conflicts with built-in declaration %q#D" - msgid "declaration of %q#D conflicts with built-in declaration %q#D" - msgstr "与内建声明%q#D冲çª" - - #: cp/decl.c:1357 - #, fuzzy, gcc-internal-format --#| msgid "declaration of %qD shadows a global declaration" - msgid "redeclaration of %<pragma omp declare reduction%>" - msgstr "%qD的声明éšè—了一个全局声明" - - #: cp/decl.c:1359 - #, fuzzy, gcc-internal-format --#| msgid "previous non-function declaration %q+#D" - msgid "previous %<pragma omp declare reduction%> declaration" - msgstr "å…ˆå‰å¯¹äºŽ%q+#Dçš„éžå‡½æ•°å£°æ˜Ž" - - #: cp/decl.c:1410 - #, fuzzy, gcc-internal-format --#| msgid "ambiguates built-in declaration %q#D" - msgid "new declaration %q#D ambiguates built-in declaration %q#D" - msgstr "使内建声明%q#D出现æ§ä¹‰" - -@@ -32955,37 +31983,31 @@ - - #: cp/decl.c:1505 cp/decl.c:1526 cp/decl.c:1553 - #, fuzzy, gcc-internal-format --#| msgid "previous declaration %q+D" - msgid "previous declaration %q#D" - msgstr "å…ˆå‰çš„声明%q+D" - - #: cp/decl.c:1524 - #, fuzzy, gcc-internal-format --#| msgid "declaration of template %q#D" - msgid "conflicting declaration of template %q#D" - msgstr "模æ¿å£°æ˜Ž%q#D" - - #: cp/decl.c:1540 - #, fuzzy, gcc-internal-format --#| msgid "ambiguates old declaration %q+#D" - msgid "ambiguating new declaration %q#D" - msgstr "使旧的声明%q+#D出现æ§ä¹‰" - - #: cp/decl.c:1542 cp/decl.c:1565 - #, fuzzy, gcc-internal-format --#| msgid "global declaration %q+#D" - msgid "old declaration %q#D" - msgstr "全局声明%q+#D" - - #: cp/decl.c:1550 - #, fuzzy, gcc-internal-format --#| msgid "conflicting declaration %q#D" - msgid "conflicting declaration of C function %q#D" - msgstr "相互冲çªçš„声明%q#D" - - #: cp/decl.c:1563 - #, fuzzy, gcc-internal-format --#| msgid "ambiguates old declaration %q+#D" - msgid "ambiguating new declaration of %q#D" - msgstr "使旧的声明%q+#D出现æ§ä¹‰" - -@@ -32996,7 +32018,6 @@ - - #: cp/decl.c:1575 - #, fuzzy, gcc-internal-format --#| msgid "previous declaration of %q+#D" - msgid "previous declaration as %q#D" - msgstr "%q+#Dçš„å‰ä¸€ä¸ªå£°æ˜Ž" - -@@ -33009,13 +32030,11 @@ - #. of the program. - #: cp/decl.c:1627 - #, fuzzy, gcc-internal-format --#| msgid "conflicting declaration %q#D" - msgid "conflicting declaration of namespace %qD" - msgstr "相互冲çªçš„声明%q#D" - - #: cp/decl.c:1629 - #, fuzzy, gcc-internal-format --#| msgid "previous declaration of namespace %q+D here" - msgid "previous declaration of namespace %qD here" - msgstr "命å空间%q+D早先的声明在这里" - -@@ -33026,37 +32045,31 @@ - - #: cp/decl.c:1642 cp/name-lookup.c:1152 cp/name-lookup.c:1175 - #, fuzzy, gcc-internal-format --#| msgid "previously declared here" - msgid "%q+#D previously declared here" - msgstr "以å‰åœ¨æ¤å£°æ˜Žè¿‡" - - #: cp/decl.c:1652 - #, fuzzy, gcc-internal-format --#| msgid "prototype for %q+#D" - msgid "prototype specified for %q#D" - msgstr "%q+#D的原型" - - #: cp/decl.c:1654 - #, fuzzy, gcc-internal-format --#| msgid "follows non-prototype definition here" - msgid "previous non-prototype definition here" - msgstr "出现在æ¤å¤„çš„éžåŽŸåž‹å®šä¹‰ä¹‹åŽ" - - #: cp/decl.c:1693 - #, fuzzy, gcc-internal-format --#| msgid "conflicts with new declaration with %qL linkage" - msgid "conflicting declaration of %q#D with %qL linkage" - msgstr "与带有%qL链接的新声明冲çª" - - #: cp/decl.c:1696 - #, fuzzy, gcc-internal-format --#| msgid "previous declaration of %q+#D with %qL linkage" - msgid "previous declaration with %qL linkage" - msgstr "%q+#D的早先声明有%qL链接" - - #: cp/decl.c:1723 - #, fuzzy, gcc-internal-format --#| msgid "redeclaration of friend %q#D may not have default template arguments" - msgid "redeclaration of %q#D may not have default arguments" - msgstr "å‹å…ƒ%q#Dçš„é‡å£°æ˜Žä¸èƒ½æœ‰é»˜è®¤æ¨¡æ¿å‚æ•°" - -@@ -33067,7 +32080,6 @@ - - #: cp/decl.c:1741 cp/decl.c:1749 - #, fuzzy, gcc-internal-format --#| msgid "after previous specification in %q+#D" - msgid "previous specification in %q#D here" - msgstr "但先å‰åœ¨%q+#Dä¸å·²æœ‰æŒ‡å®š" - -@@ -33078,7 +32090,6 @@ - - #: cp/decl.c:1815 cp/decl.c:1825 - #, fuzzy, gcc-internal-format --#| msgid "previous declaration of %q+D" - msgid "previous declaration of %qD" - msgstr "%q+Dçš„å‰ä¸€ä¸ªå£°æ˜Ž" - -@@ -33243,7 +32254,6 @@ - - #: cp/decl.c:3395 - #, fuzzy, gcc-internal-format --#| msgid "no class template named %q#T in %q#T" - msgid "no type named %q#T in %q#T" - msgstr "没有å为%q#T的类模æ¿ï¼Œåœ¨%q#Tä¸ " - -@@ -33299,13 +32309,11 @@ - - #: cp/decl.c:4246 - #, fuzzy, gcc-internal-format --#| msgid "attribute ignored in declaration of %q+#T" - msgid "attribute ignored in declaration of %q#T" - msgstr "属性于%q+#T的声明ä¸è¢«å¿½ç•¥" - - #: cp/decl.c:4249 - #, fuzzy, gcc-internal-format --#| msgid "attribute for %q+#T must follow the %qs keyword" - msgid "attribute for %q#T must follow the %qs keyword" - msgstr "%q+#T的属性必须跟在%qs关键å—åŽé¢" - -@@ -33321,7 +32329,6 @@ - - #: cp/decl.c:4294 - #, fuzzy, gcc-internal-format --#| msgid "%qs can only be specified for functions" - msgid "%<auto%> can only be specified for variables or function declarations" - msgstr "åªèƒ½ä¸ºå‡½æ•°æŒ‡å®š%qs" - -@@ -33372,13 +32379,11 @@ - - #: cp/decl.c:4378 - #, fuzzy, gcc-internal-format --#| msgid "attributes ignored on template instantiation" - msgid "attribute ignored in explicit instantiation %q#T" - msgstr "属性在模æ¿å®žä¾‹åŒ–上被忽略" - - #: cp/decl.c:4381 - #, fuzzy, gcc-internal-format --#| msgid "%qE attribute can only be applied to class definitions" - msgid "no attribute can be applied to an explicit instantiation" - msgstr "åªèƒ½ä¸ºç±»å®šä¹‰åº”用%qE属性" - -@@ -33543,7 +32548,6 @@ - - #: cp/decl.c:5260 - #, fuzzy, gcc-internal-format --#| msgid "name %qD used in a GNU-style designated initializer for an array" - msgid "%<[%E] =%> used in a GNU-style designated initializer for class %qT" - msgstr "åå—%qD用在 GNU é£Žæ ¼çš„æ•°ç»„æŒ‡å®šå…ƒç´ åˆå§‹å€¼è®¾å®šä¸" - -@@ -33590,7 +32594,6 @@ - - #: cp/decl.c:5632 - #, fuzzy, gcc-internal-format --#| msgid "%qD has incomplete type" - msgid "%q#D has incomplete type" - msgstr "%qD类型ä¸å®Œå…¨" - -@@ -33666,19 +32669,16 @@ - - #: cp/decl.c:7176 - #, fuzzy, gcc-internal-format --#| msgid "initializer fails to determine size of %qD" - msgid "initializer fails to determine size of %qT" - msgstr "åˆå§‹å€¼è®¾å®šæ— 法决定%qD的大å°" - - #: cp/decl.c:7180 - #, fuzzy, gcc-internal-format --#| msgid "array size missing in %qD" - msgid "array size missing in %qT" - msgstr "%qD缺少数组大å°" - - #: cp/decl.c:7183 - #, fuzzy, gcc-internal-format --#| msgid "zero-size array %qD" - msgid "zero-size array %qT" - msgstr "大å°ä¸º 0 的数组%qD" - -@@ -33795,7 +32795,6 @@ - - #: cp/decl.c:7499 - #, fuzzy, gcc-internal-format --#| msgid "%<inline%> is not allowed in declaration of friend template specialization %qD" - msgid "%<constexpr%> is not allowed in declaration of friend template specialization %qD" - msgstr "%<inline%>ä¸å…许用于å‹å…ƒæ¨¡æ¿ç‰¹ä¾‹åŒ–%qD的声明" - -@@ -33811,7 +32810,6 @@ - - #: cp/decl.c:7547 - #, fuzzy, gcc-internal-format --#| msgid "cannot declare %<::main%> to be inline" - msgid "cannot declare %<::main%> to be constexpr" - msgstr "ä¸èƒ½å°†%<::main%>声明为 inline" - -@@ -33847,19 +32845,16 @@ - - #: cp/decl.c:7620 - #, fuzzy, gcc-internal-format --#| msgid "static member function %qD cannot have cv-qualifier" - msgid "static member function %qD cannot have ref-qualifier" - msgstr "æˆå‘˜å‡½æ•°%qDä¸èƒ½æ‹¥æœ‰ cv é™å®šç¬¦" - - #: cp/decl.c:7621 - #, fuzzy, gcc-internal-format --#| msgid "non-member function %qD cannot have cv-qualifier" - msgid "non-member function %qD cannot have ref-qualifier" - msgstr "éžæˆå‘˜å‡½æ•°%qDä¸èƒ½æ‹¥æœ‰ cv é™å®šç¬¦" - - #: cp/decl.c:7638 - #, fuzzy, gcc-internal-format --#| msgid "template with C linkage" - msgid "literal operator with C linkage" - msgstr "模æ¿æœ‰ C 链接" - -@@ -33880,7 +32875,6 @@ - - #: cp/decl.c:7667 - #, fuzzy, gcc-internal-format --#| msgid "%qD must be a nonstatic member function" - msgid "%qD must be a non-member function" - msgstr "%qD必须是一个éžé™æ€çš„æˆå‘˜å‡½æ•°" - -@@ -33896,13 +32890,11 @@ - - #: cp/decl.c:7792 - #, fuzzy, gcc-internal-format --#| msgid "definition of implicitly-declared %qD" - msgid "definition of explicitly-defaulted %q+D" - msgstr "éšå¼å£°æ˜Žçš„%qD的定义" - - #: cp/decl.c:7793 - #, fuzzy, gcc-internal-format --#| msgid "%q+#D previously defined here" - msgid "%q+#D explicitly defaulted here" - msgstr "%q+#D已在æ¤å®šä¹‰è¿‡" - -@@ -34017,7 +33009,6 @@ - - #: cp/decl.c:8522 - #, fuzzy, gcc-internal-format --#| msgid "declaration of %qD as array of void" - msgid "declaration of %qD as array of %<auto%>" - msgstr "%qD声明为 void 的数组" - -@@ -34073,7 +33064,6 @@ - - #: cp/decl.c:8578 - #, fuzzy, gcc-internal-format --#| msgid "creating array of functions" - msgid "array of array of runtime bound" - msgstr "创建函数的数组" - -@@ -34144,13 +33134,11 @@ - - #: cp/decl.c:9014 - #, fuzzy, gcc-internal-format --#| msgid "template declaration of %<typedef%>" - msgid "declaration of %qD as %<typedef%>" - msgstr "%<typedef%>的模æ¿å£°æ˜Ž" - - #: cp/decl.c:9019 - #, fuzzy, gcc-internal-format --#| msgid "declaration of %q+D shadows a parameter" - msgid "declaration of %qD as parameter" - msgstr "%q+D的声明éšè—了一个形å‚" - -@@ -34326,25 +33314,21 @@ - - #: cp/decl.c:9608 - #, fuzzy, gcc-internal-format --#| msgid "%qs function uses %<auto%> type specifier without late return type" - msgid "%qs function uses %<auto%> type specifier without trailing return type" - msgstr "%qs函数使用了%<auto%>类型é™å®šå´æ²¡æœ‰è¿Ÿè¿”回类型" - - #: cp/decl.c:9611 - #, fuzzy, gcc-internal-format --#| msgid "scoped enums only available with -std=c++0x or -std=gnu++0x" - msgid "deduced return type only available with -std=c++1y or -std=gnu++1y" - msgstr "带作用域的枚举åªåœ¨ -std=c++0x 或 -std=gnu++0x 下å¯ç”¨" - - #: cp/decl.c:9616 - #, fuzzy, gcc-internal-format --#| msgid "virtual functions cannot be friends" - msgid "virtual function cannot have deduced return type" - msgstr "虚函数ä¸èƒ½æ˜¯å‹å…ƒ" - - #: cp/decl.c:9621 - #, fuzzy, gcc-internal-format --#| msgid "%qs function with late return type has %qT as its type rather than plain %<auto%>" - msgid "%qs function with trailing return type has %qT as its type rather than plain %<auto%>" - msgstr "%qs函数使用迟返回类型%qT作为它的类型,而ä¸æ˜¯%<auto%>" - -@@ -34357,7 +33341,6 @@ - - #: cp/decl.c:9635 - #, fuzzy, gcc-internal-format --#| msgid "%qs function with late return type not declared with %<auto%> type specifier" - msgid "%qs function with trailing return type not declared with %<auto%> type specifier" - msgstr "%qs函数使用了迟返回类型å´æœªç”¨%<auto%>类型é™å®šå£°æ˜Ž" - -@@ -34368,7 +33351,6 @@ - - #: cp/decl.c:9670 - #, fuzzy, gcc-internal-format --#| msgid "destructor cannot be static member function" - msgid "constructor cannot be static member function" - msgstr "æžæž„函数ä¸èƒ½æ˜¯é™æ€æˆå‘˜å‡½æ•°" - -@@ -34379,13 +33361,11 @@ - - #: cp/decl.c:9675 - #, fuzzy, gcc-internal-format --#| msgid "destructors may not be cv-qualified" - msgid "constructors may not be cv-qualified" - msgstr "æžæž„函数ä¸èƒ½è¢« cv é™å®š" - - #: cp/decl.c:9683 - #, fuzzy, gcc-internal-format --#| msgid "destructors may not be cv-qualified" - msgid "destructors may not be ref-qualified" - msgstr "æžæž„函数ä¸èƒ½è¢« cv é™å®š" - -@@ -34447,13 +33427,11 @@ - - #: cp/decl.c:9829 - #, fuzzy, gcc-internal-format --#| msgid "Array reference out of bounds" - msgid "reference to array of runtime bound" - msgstr "对数组的引用超出范围" - - #: cp/decl.c:9830 - #, fuzzy, gcc-internal-format --#| msgid "pointer to a function used in subtraction" - msgid "pointer to array of runtime bound" - msgstr "函数指针ä¸èƒ½ç›¸å‡" - -@@ -34489,7 +33467,6 @@ - - #: cp/decl.c:10028 - #, fuzzy, gcc-internal-format --#| msgid "cannot define member function %<%T::%s%> within %<%T%>" - msgid "cannot declare member function %<%T::%s%> within %<%T%>" - msgstr "æ— æ³•å®šä¹‰æˆå‘˜å‡½æ•°%<%T::%s%>,在%<%T%>ä¸" - -@@ -34557,13 +33534,11 @@ - - #: cp/decl.c:10170 - #, fuzzy, gcc-internal-format --#| msgid "parameter declared %<auto%>" - msgid "typedef declared %<auto%>" - msgstr "å½¢å‚声明为%<auto%>" - - #: cp/decl.c:10176 - #, fuzzy, gcc-internal-format --#| msgid "creating array of functions" - msgid "typedef naming array of runtime bound" - msgstr "创建函数的数组" - -@@ -34624,7 +33599,6 @@ - - #: cp/decl.c:10420 - #, fuzzy, gcc-internal-format --#| msgid "%<this%> may not be used in this context" - msgid "%<auto%> parameter not permitted in this context" - msgstr "%<this%>ä¸èƒ½ç”¨åœ¨æ¤ä¸Šä¸‹æ–‡ä¸" - -@@ -34635,7 +33609,6 @@ - - #: cp/decl.c:10465 - #, fuzzy, gcc-internal-format --#| msgid "non-static data member %qE declared %<constexpr%>" - msgid "non-static data member declared %<auto%>" - msgstr "éžé™æ€æ•°æ®æˆå‘˜%qE被声明为%<constexpr%>" - -@@ -34682,7 +33655,6 @@ - - #: cp/decl.c:10608 - #, fuzzy, gcc-internal-format --#| msgid "field %qD has incomplete type" - msgid "field %qD has incomplete type %qT" - msgstr "å—段%qD类型ä¸å®Œå…¨" - -@@ -34723,13 +33695,11 @@ - - #: cp/decl.c:10747 - #, fuzzy, gcc-internal-format --#| msgid "storage class %<__thread%> invalid for function %qs" - msgid "storage class %<thread_local%> invalid for function %qs" - msgstr "函数%qsçš„å˜å‚¨ç±»%<__thread%>æ— æ•ˆ" - - #: cp/decl.c:10752 - #, fuzzy, gcc-internal-format --#| msgid "an asm-specification is not allowed on a function-definition" - msgid "virt-specifiers in %qs not allowed outside a class definition" - msgstr "函数定义ä¸ä¸å…许出现 asm 指定" - -@@ -34755,7 +33725,6 @@ - - #: cp/decl.c:10783 - #, fuzzy, gcc-internal-format --#| msgid "%qs defined in a non-class scope" - msgid "%qs declared in a non-class scope" - msgstr "%qs定义在在éžç±»ä½œç”¨åŸŸä¸" - -@@ -34802,7 +33771,6 @@ - - #: cp/decl.c:11032 - #, fuzzy, gcc-internal-format --#| msgid "default argument %qE uses local variable %qD" - msgid "default argument %qE uses %qD" - msgstr "默认实å‚%qE使用了局部å˜é‡%qD" - -@@ -34984,7 +33952,6 @@ - - #: cp/decl.c:11915 - #, fuzzy, gcc-internal-format --#| msgid "ambiguous template specialization %qD for %q+D" - msgid "using alias template specialization %qT after %qs" - msgstr "有æ§ä¹‰çš„模æ¿ç‰¹ä¾‹åŒ–%qD(为%q+D)" - -@@ -34995,7 +33962,6 @@ - - #: cp/decl.c:11920 - #, fuzzy, gcc-internal-format --#| msgid "%q+D has a previous declaration here" - msgid "%qD has a previous declaration here" - msgstr "%q+Då…ˆå‰åœ¨æ¤å¤„有过声明" - -@@ -35123,7 +34089,6 @@ - - #: cp/decl.c:12928 - #, fuzzy, gcc-internal-format --#| msgid "integer constant is too large for %<unsigned long%> type" - msgid "incremented enumerator value is too large for %<unsigned long%>" - msgstr "对%<unsigned long%>类型而言整数常é‡å¤ªå¤§" - -@@ -35134,7 +34099,6 @@ - - #: cp/decl.c:12960 - #, fuzzy, gcc-internal-format --#| msgid "enumerator value %E is too large for underlying type %<%T%>" - msgid "enumerator value %E is outside the range of underlying type %<%T%>" - msgstr "枚举值 %E 对其类型%<%T%>而言太大了" - -@@ -35170,13 +34134,11 @@ - - #: cp/decl.c:13960 - #, fuzzy, gcc-internal-format --#| msgid "no return statement in function returning non-void" - msgid "no return statements in function returning %qT" - msgstr "在有返回值的函数ä¸æœªå‘现 return è¯å¥" - - #: cp/decl.c:13962 cp/typeck.c:8384 - #, fuzzy, gcc-internal-format --#| msgid "function return types not compatible due to %<volatile%>" - msgid "only plain %<auto%> return type can be deduced to %<void%>" - msgstr "由于%<volatile%>,函数返回类型ä¸å…¼å®¹" - -@@ -35197,7 +34159,6 @@ - - #: cp/decl.c:14531 cp/decl2.c:4673 - #, fuzzy, gcc-internal-format --#| msgid "type of %qD defaults to %<int%>" - msgid "use of %qD before deduction of %<auto%>" - msgstr "%qD的类型默认为%<int%>" - -@@ -35218,7 +34179,6 @@ - - #: cp/decl2.c:449 - #, fuzzy, gcc-internal-format --#| msgid "deleting array %q#D" - msgid "deleting array %q#E" - msgstr "åˆ é™¤æ•°ç»„%q#D" - -@@ -35337,7 +34297,6 @@ - - #: cp/decl2.c:1388 - #, fuzzy, gcc-internal-format --#| msgid "%qD is not a static data member of a class template" - msgid "%q+D static data member inside of declare target directive" - msgstr "%qDä¸æ˜¯ç±»æ¨¡æ¿çš„éžé™æ€æ•°æ®æˆå‘˜" - -@@ -35444,43 +34403,36 @@ - - #: cp/error.c:3474 - #, fuzzy, gcc-internal-format --#| msgid "extended initializer lists only available with -std=c++0x or -std=gnu++0x" - msgid "extended initializer lists only available with -std=c++11 or -std=gnu++11" - msgstr "扩展åˆå§‹å€¼è®¾å®šåˆ—表åªåœ¨ -std=c++0x 或 -std=gnu++0x 下å¯ç”¨" - - #: cp/error.c:3479 - #, fuzzy, gcc-internal-format --#| msgid "explicit conversion operators only available with -std=c++0x or -std=gnu++0x" - msgid "explicit conversion operators only available with -std=c++11 or -std=gnu++11" - msgstr "显å¼è½¬æ¢è¿ç®—符åªåœ¨ -std=c++0x 或 -std=gnu++0x 下å¯ç”¨" - - #: cp/error.c:3484 - #, fuzzy, gcc-internal-format --#| msgid "variadic templates only available with -std=c++0x or -std=gnu++0x" - msgid "variadic templates only available with -std=c++11 or -std=gnu++11" - msgstr "å¯å˜å‚数模æ¿åªåœ¨ -std=c++0x 或 -std=gnu++0x 下å¯ç”¨" - - #: cp/error.c:3489 - #, fuzzy, gcc-internal-format --#| msgid "lambda expressions only available with -std=c++0x or -std=gnu++0x" - msgid "lambda expressions only available with -std=c++11 or -std=gnu++11" - msgstr "Lambda 表达å¼åªåœ¨ -std=c++0x 或 -std=gnu++0x 下å¯ç”¨" - - #: cp/error.c:3494 - #, fuzzy, gcc-internal-format --#| msgid "C++0x auto only available with -std=c++0x or -std=gnu++0x" - msgid "C++11 auto only available with -std=c++11 or -std=gnu++11" - msgstr "C++0x auto åªåœ¨ -std=c++0x 或 -std=gnu++0x 下å¯ç”¨" - - #: cp/error.c:3498 - #, fuzzy, gcc-internal-format --#| msgid "scoped enums only available with -std=c++0x or -std=gnu++0x" - msgid "scoped enums only available with -std=c++11 or -std=gnu++11" - msgstr "带作用域的枚举åªåœ¨ -std=c++0x 或 -std=gnu++0x 下å¯ç”¨" - - #: cp/error.c:3502 - #, fuzzy, gcc-internal-format --#| msgid "defaulted and deleted functions only available with -std=c++0x or -std=gnu++0x" - msgid "defaulted and deleted functions only available with -std=c++11 or -std=gnu++11" - msgstr "é»˜è®¤åŒ–å’Œè¢«åˆ é™¤çš„å‡½æ•°åªåœ¨ -std=c++0x 或 -std=gnu++0x 下å¯ç”¨" - -@@ -35491,25 +34443,21 @@ - - #: cp/error.c:3512 - #, fuzzy, gcc-internal-format --#| msgid "explicit conversion operators only available with -std=c++0x or -std=gnu++0x" - msgid "override controls (override/final) only available with -std=c++11 or -std=gnu++11" - msgstr "显å¼è½¬æ¢è¿ç®—符åªåœ¨ -std=c++0x 或 -std=gnu++0x 下å¯ç”¨" - - #: cp/error.c:3517 - #, fuzzy, gcc-internal-format --#| msgid "extended initializer lists only available with -std=c++0x or -std=gnu++0x" - msgid "non-static data member initializers only available with -std=c++11 or -std=gnu++11" - msgstr "扩展åˆå§‹å€¼è®¾å®šåˆ—表åªåœ¨ -std=c++0x 或 -std=gnu++0x 下å¯ç”¨" - - #: cp/error.c:3522 - #, fuzzy, gcc-internal-format --#| msgid "extended initializer lists only available with -std=c++0x or -std=gnu++0x" - msgid "user-defined literals only available with -std=c++11 or -std=gnu++11" - msgstr "扩展åˆå§‹å€¼è®¾å®šåˆ—表åªåœ¨ -std=c++0x 或 -std=gnu++0x 下å¯ç”¨" - - #: cp/error.c:3527 - #, fuzzy, gcc-internal-format --#| msgid "explicit conversion operators only available with -std=c++0x or -std=gnu++0x" - msgid "delegating constructors only available with -std=c++11 or -std=gnu++11" - msgstr "显å¼è½¬æ¢è¿ç®—符åªåœ¨ -std=c++0x 或 -std=gnu++0x 下å¯ç”¨" - -@@ -35520,13 +34468,11 @@ - - #: cp/error.c:3537 - #, fuzzy, gcc-internal-format --#| msgid "C++0x auto only available with -std=c++0x or -std=gnu++0x" - msgid "c++11 attributes only available with -std=c++11 or -std=gnu++11" - msgstr "C++0x auto åªåœ¨ -std=c++0x 或 -std=gnu++0x 下å¯ç”¨" - - #: cp/error.c:3542 - #, fuzzy, gcc-internal-format --#| msgid "scoped enums only available with -std=c++0x or -std=gnu++0x" - msgid "ref-qualifiers only available with -std=c++11 or -std=gnu++11" - msgstr "带作用域的枚举åªåœ¨ -std=c++0x 或 -std=gnu++0x 下å¯ç”¨" - -@@ -35599,19 +34545,16 @@ - - #: cp/except.c:987 - #, fuzzy, gcc-internal-format --#| msgid "cannot declare parameter %q+D to be of abstract type %qT" - msgid "cannot declare catch parameter to be of rvalue reference type %qT" - msgstr "ä¸èƒ½å°†å½¢å‚%q+D声明为具有抽象类型%qT" - - #: cp/except.c:994 - #, fuzzy, gcc-internal-format --#| msgid "cannot create type information for type %qT because it involves types of variable size" - msgid "cannot throw expression of type %qT because it involves types of variable size" - msgstr "æ— æ³•ä¸ºç±»åž‹%qT创建类型信æ¯ï¼Œå› 为它的大å°æ˜¯å¯å˜çš„" - - #: cp/except.c:997 - #, fuzzy, gcc-internal-format --#| msgid "cannot create type information for type %qT because it involves types of variable size" - msgid "cannot catch type %qT because it involves types of variable size" - msgstr "æ— æ³•ä¸ºç±»åž‹%qT创建类型信æ¯ï¼Œå› 为它的大å°æ˜¯å¯å˜çš„" - -@@ -35726,7 +34669,6 @@ - - #: cp/init.c:378 - #, fuzzy, gcc-internal-format --#| msgid "invalid application of %qs to incomplete type %qT " - msgid "value-initialization of incomplete type %qT" - msgstr "%qsä¸èƒ½ç”¨äºŽä¸å®Œå…¨çš„类型%qT" - -@@ -35737,13 +34679,11 @@ - - #: cp/init.c:482 - #, fuzzy, gcc-internal-format --#| msgid "value-initialization of reference" - msgid "value-initialization of function type %qT" - msgstr "引用被值所åˆå§‹åŒ–" - - #: cp/init.c:488 - #, fuzzy, gcc-internal-format --#| msgid "value-initialization of reference" - msgid "value-initialization of reference type %qT" - msgstr "引用被值所åˆå§‹åŒ–" - -@@ -35759,7 +34699,6 @@ - - #: cp/init.c:585 - #, fuzzy, gcc-internal-format --#| msgid "%qD is used uninitialized in this function" - msgid "%qD is initialized with itself" - msgstr "æ¤å‡½æ•°ä¸çš„%qD在使用å‰æœªåˆå§‹åŒ–" - -@@ -35910,7 +34849,6 @@ - - #: cp/init.c:2147 - #, fuzzy, gcc-internal-format --#| msgid "uninitialized reference member in %q#T" - msgid "uninitialized reference member in base %q#T of %q#T" - msgstr "%q#Tä¸æœ‰æœªåˆå§‹åŒ–的引用æˆå‘˜" - -@@ -35936,25 +34874,21 @@ - - #: cp/init.c:2317 - #, fuzzy, gcc-internal-format --#| msgid "integer overflow in expression" - msgid "integer overflow in array size" - msgstr "整数溢出" - - #: cp/init.c:2327 - #, fuzzy, gcc-internal-format --#| msgid "Variable '%s' at %L in this context must be constant" - msgid "array size in operator new must be constant" - msgstr "å˜é‡â€˜%s’在%L处上下文ä¸å¿…须是常é‡" - - #: cp/init.c:2341 - #, fuzzy, gcc-internal-format --#| msgid "variably modified field at file scope" - msgid "variably modified type not allowed in operator new" - msgstr "文件域ä¸çš„动æ€å¯å˜å—段" - - #: cp/init.c:2355 - #, fuzzy, gcc-internal-format --#| msgid "ISO C does not support saturating types" - msgid "ISO C++ does not support variable-length array types" - msgstr "ISO C ä¸æ”¯æŒé¥±å’Œç±»åž‹" - -@@ -35970,7 +34904,6 @@ - - #: cp/init.c:2477 - #, fuzzy, gcc-internal-format --#| msgid "not a valid Java .class file" - msgid "%qT isn%'t a valid Java class type" - msgstr "ä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆçš„ Java .class 文件。" - -@@ -35996,7 +34929,6 @@ - - #: cp/init.c:2775 - #, fuzzy, gcc-internal-format --#| msgid "attributes after parenthesized initializer ignored" - msgid "parenthesized initializer in array new" - msgstr "括起的åˆå§‹å€¼è®¾å®šåŽå‡ºçŽ°çš„属性被忽略" - -@@ -36027,7 +34959,6 @@ - - #: cp/init.c:3158 - #, fuzzy, gcc-internal-format --#| msgid "possible problem detected in invocation of delete operator:" - msgid "possible problem detected in invocation of delete [] operator:" - msgstr "检测到调用 delete è¿ç®—符时å¯èƒ½å‡ºçŽ°çš„问题:" - -@@ -36088,7 +35019,6 @@ - - #: cp/lambda.c:477 - #, fuzzy, gcc-internal-format --#| msgid "compound literal has variable size" - msgid "because the array element type %qT has variable size" - msgstr "å¤åˆå—é¢å€¼æœ‰å¯å˜çš„大å°" - -@@ -36099,7 +35029,6 @@ - - #: cp/lambda.c:514 - #, fuzzy, gcc-internal-format --#| msgid "already captured %<this%> in lambda expression" - msgid "already captured %qD in lambda expression" - msgstr "å·²ç»åœ¨ Lambda 表达å¼ä¸æ•èŽ·äº†%<this%>" - -@@ -36170,7 +35099,6 @@ - - #: cp/mangle.c:2116 - #, fuzzy, gcc-internal-format --#| msgid "mangling unknown fixed point type" - msgid "mangling __underlying_type" - msgstr "修饰未知的定点类型" - -@@ -36206,7 +35134,6 @@ - - #: cp/mangle.c:3500 - #, fuzzy, gcc-internal-format --#| msgid "-fabi-version=4 (or =0) avoids this error with a change in vector mangling" - msgid "-fabi-version=6 (or =0) avoids this error with a change in mangling" - msgstr "-fabi-version=4 (or =0) å¯ä»¥æ”¹å˜å‘é‡ä¿®é¥°æ¥é¿å…这个错误" - -@@ -36237,13 +35164,11 @@ - - #: cp/method.c:1010 - #, fuzzy, gcc-internal-format --#| msgid "a destructor cannot be %<constexpr%>" - msgid "defaulted constructor calls non-constexpr %q+D" - msgstr "æžæž„函数ä¸èƒ½æ˜¯%<constexpr%>" - - #: cp/method.c:1071 - #, fuzzy, gcc-internal-format --#| msgid "uninitialized const %qD is invalid in C++" - msgid "initializer for %q+#D is invalid" - msgstr "未åˆå§‹åŒ–的常é‡%qD在C++ä¸æ˜¯æ— 效的" - -@@ -36264,7 +35189,6 @@ - - #: cp/method.c:1128 - #, fuzzy, gcc-internal-format --#| msgid "non-static data member %qD has Java class type" - msgid "copying non-static data member %q#D of rvalue reference type" - msgstr "éžé™æ€æ•°æ®æˆå‘˜%qD具有 Java 类类型" - -@@ -36315,7 +35239,6 @@ - - #: cp/method.c:1814 - #, fuzzy, gcc-internal-format --#| msgid "function %q+D defaulted on its first declaration must not have an exception-specification" - msgid "function %q+D defaulted on its redeclaration with an exception-specification that differs from the implicit declaration %q#D" - msgstr "首次声明时被默认化的函数%q+Dä¸å¯ä»¥æŒ‡å®šå¼‚常" - -@@ -36326,7 +35249,6 @@ - - #: cp/method.c:1860 - #, fuzzy, gcc-internal-format --#| msgid "%qD cannot be defaulted" - msgid "a template cannot be defaulted" - msgstr "%qDä¸èƒ½è¢«é»˜è®¤åŒ–" - -@@ -36347,13 +35269,11 @@ - - #: cp/name-lookup.c:567 - #, fuzzy, gcc-internal-format --#| msgid "%q#D conflicts with previous using declaration %q#D" - msgid "%q#D conflicts with a previous declaration" - msgstr "%q#D与先å‰çš„ using 声明%q#D冲çª" - - #: cp/name-lookup.c:569 - #, fuzzy, gcc-internal-format --#| msgid "previous declaration %q+D" - msgid "previous declaration %q+#D" - msgstr "å…ˆå‰çš„声明%q+D" - -@@ -36420,7 +35340,6 @@ - - #: cp/name-lookup.c:1189 - #, fuzzy, gcc-internal-format --#| msgid "declaration of %q+D shadows a parameter" - msgid "declaration of %qD shadows a lambda capture" - msgstr "%q+D的声明éšè—了一个形å‚" - -@@ -36629,7 +35548,6 @@ - - #: cp/parser.c:792 - #, fuzzy, gcc-internal-format --#| msgid "identifier %qE will become a keyword in C++0x" - msgid "identifier %qE is a keyword in C++11" - msgstr "æ ‡å¿—ç¬¦%qE将会æˆä¸º C++0x 的一个关键å—" - -@@ -36730,7 +35648,6 @@ - - #: cp/parser.c:2719 - #, fuzzy, gcc-internal-format --#| msgid "%qE is not a template" - msgid "%qE is not a class template" - msgstr "%qEä¸æ˜¯ä¸€ä¸ªæ¨¡æ¿" - -@@ -36811,7 +35728,6 @@ - - #: cp/parser.c:2809 - #, fuzzy, gcc-internal-format --#| msgid "a function call cannot appear in a constant-expression" - msgid "a transaction expression cannot appear in a constant-expression" - msgstr "函数调用ä¸èƒ½å‡ºçŽ°åœ¨å¸¸é‡è¡¨è¾¾å¼ä¸" - -@@ -36844,7 +35760,6 @@ - - #: cp/parser.c:2903 - #, fuzzy, gcc-internal-format --#| msgid "C++0x %<constexpr%> only available with -std=c++0x or -std=gnu++0x" - msgid "C++11 %<constexpr%> only available with -std=c++11 or -std=gnu++11" - msgstr "C++0x %<constexpr%>åªåœ¨ -std=c++0x 或 -std=gnu++0x 下å¯ç”¨" - -@@ -36855,7 +35770,6 @@ - - #: cp/parser.c:2948 - #, fuzzy, gcc-internal-format --#| msgid "%qE in namespace %qE does not name a type" - msgid "%qE in namespace %qE does not name a template type" - msgstr "%qEä¸æ˜¯å‘½å空间%qEä¸çš„一个类型å" - -@@ -36882,13 +35796,11 @@ - - #: cp/parser.c:2974 - #, fuzzy, gcc-internal-format --#| msgid "%qE in class %qT does not name a type" - msgid "%qE in %q#T does not name a template type" - msgstr "%qEä¸æ˜¯ç±»%qTä¸çš„一个类型å" - - #: cp/parser.c:2978 - #, fuzzy, gcc-internal-format --#| msgid "%qE in class %qT does not name a type" - msgid "%qE in %q#T does not name a type" - msgstr "%qEä¸æ˜¯ç±»%qTä¸çš„一个类型å" - -@@ -36914,25 +35826,21 @@ - - #: cp/parser.c:3867 - #, fuzzy, gcc-internal-format --#| msgid "floating constant exceeds range of %qT" - msgid "integer literal exceeds range of %qT type" - msgstr "浮点常é‡è¶…出%qT的范围" - - #: cp/parser.c:3873 - #, fuzzy, gcc-internal-format --#| msgid "floating constant exceeds range of %qT" - msgid "floating literal exceeds range of %qT type" - msgstr "浮点常é‡è¶…出%qT的范围" - - #: cp/parser.c:3877 - #, fuzzy, gcc-internal-format --#| msgid "floating constant truncated to zero" - msgid "floating literal truncated to zero" - msgstr "浮点常é‡å‘零截æ–" - - #: cp/parser.c:3920 - #, fuzzy, gcc-internal-format --#| msgid "unable to find a register to spill in class %qs" - msgid "unable to find numeric literal operator %qD" - msgstr "在类%qsä¸æ‰¾ä¸åˆ°å¯æº¢å‡ºçš„寄å˜å™¨" - -@@ -36943,7 +35851,6 @@ - - #: cp/parser.c:3969 - #, fuzzy, gcc-internal-format --#| msgid "unable to find a register to spill in class %qs" - msgid "unable to find string literal operator %qD" - msgstr "在类%qsä¸æ‰¾ä¸åˆ°å¯æº¢å‡ºçš„寄å˜å™¨" - -@@ -37004,7 +35911,6 @@ - - #: cp/parser.c:4935 cp/parser.c:6785 - #, fuzzy, gcc-internal-format --#| msgid "C++0x auto only available with -std=c++0x or -std=gnu++0x" - msgid "%<~auto%> only available with -std=c++1y or -std=gnu++1y" - msgstr "C++0x auto åªåœ¨ -std=c++0x 或 -std=gnu++0x 下å¯ç”¨" - -@@ -37035,7 +35941,6 @@ - - #: cp/parser.c:5276 - #, fuzzy, gcc-internal-format --#| msgid "%qT resolves to %qT, which is not an enumeration type" - msgid "decltype evaluates to %qT, which is not a class or enumeration type" - msgstr "%qT被解æžåˆ°éžæžšä¸¾ç±»åž‹%qT" - -@@ -37076,7 +35981,6 @@ - - #: cp/parser.c:6368 - #, fuzzy, gcc-internal-format --#| msgid "-client_name not allowed with -dynamiclib" - msgid "braced list index is not allowed with array notation" - msgstr "-client_name ä¸èƒ½å’Œ -dynamiclib 一起使用" - -@@ -37092,7 +35996,6 @@ - - #: cp/parser.c:6558 - #, fuzzy, gcc-internal-format --#| msgid "%<%D::%D%> is not a member of %qT" - msgid "%<%D::%D%> is not a class member" - msgstr "%<%D::%D%>ä¸æ˜¯%qTçš„æˆå‘˜" - -@@ -37113,7 +36016,6 @@ - - #: cp/parser.c:7262 - #, fuzzy, gcc-internal-format --#| msgid "types may not be defined in a new-type-id" - msgid "types may not be defined in a new-expression" - msgstr "类型ä¸èƒ½å®šä¹‰åœ¨ new-type-id ä¸" - -@@ -37144,7 +36046,6 @@ - - #: cp/parser.c:7891 - #, fuzzy, gcc-internal-format --#| msgid "%<>>%> operator will be treated as two right angle brackets in C++0x" - msgid "%<>>%> operator is treated as two right angle brackets in C++11" - msgstr "%<>>%>è¿ç®—符在 C++0x ä¸å°†è¢«è®¤ä¸ºæ˜¯ä¸¤ä¸ªå³å°–括å·" - -@@ -37175,7 +36076,6 @@ - - #: cp/parser.c:8901 - #, fuzzy, gcc-internal-format --#| msgid "lambda expressions only available with -std=c++0x or -std=gnu++0x" - msgid "lambda capture initializers only available with -std=c++1y or -std=gnu++1y" - msgstr "Lambda 表达å¼åªåœ¨ -std=c++0x 或 -std=gnu++0x 下å¯ç”¨" - -@@ -37186,13 +36086,11 @@ - - #: cp/parser.c:8931 - #, fuzzy, gcc-internal-format --#| msgid "increment of read-only variable %qD" - msgid "capture of non-variable %qD " - msgstr "令åªè¯»å˜é‡%qD自增" - - #: cp/parser.c:8933 cp/parser.c:8942 cp/semantics.c:3237 - #, fuzzy, gcc-internal-format --#| msgid "%q+D declared here" - msgid "%q+#D declared here" - msgstr "%q+D已在æ¤å£°æ˜Žè¿‡" - -@@ -37213,7 +36111,6 @@ - - #: cp/parser.c:9027 - #, fuzzy, gcc-internal-format --#| msgid "variadic templates only available with -std=c++0x or -std=gnu++0x" - msgid "lambda templates are only available with -std=c++1y or -std=gnu++1y" - msgstr "å¯å˜å‚数模æ¿åªåœ¨ -std=c++0x 或 -std=gnu++0x 下å¯ç”¨" - -@@ -37224,7 +36121,6 @@ - - #: cp/parser.c:9485 - #, fuzzy, gcc-internal-format --#| msgid "attributes after parenthesized initializer ignored" - msgid "attributes at the beginning of statement are ignored" - msgstr "括起的åˆå§‹å€¼è®¾å®šåŽå‡ºçŽ°çš„属性被忽略" - -@@ -37250,7 +36146,6 @@ - - #: cp/parser.c:9692 - #, fuzzy, gcc-internal-format --#| msgid "%qD is not a constexpr function" - msgid "compound-statement in constexpr function" - msgstr "%qDä¸æ˜¯ä¸€ä¸ªå¹¿ä¹‰å¸¸å‡½æ•°" - -@@ -37266,7 +36161,6 @@ - - #: cp/parser.c:10305 - #, fuzzy, gcc-internal-format --#| msgid "expression statement has incomplete type" - msgid "range-based %<for%> expression of type %qT has incomplete type" - msgstr "表达å¼è¯å¥ç±»åž‹ä¸å®Œå…¨" - -@@ -37292,13 +36186,11 @@ - - #: cp/parser.c:10568 - #, fuzzy, gcc-internal-format --#| msgid "range-based-for loops are not allowed in C++98 mode" - msgid "range-based %<for%> loops are not allowed in C++98 mode" - msgstr "C++98 模å¼ä¸‹ä¸å…许使用基于范围的 for 循环" - - #: cp/parser.c:10642 - #, fuzzy, gcc-internal-format --#| msgid "break statement used with OpenMP for loop" - msgid "break statement used with Cilk Plus for loop" - msgstr "OpenMP for 循环ä¸ä½¿ç”¨äº† break è¯å¥" - -@@ -37337,7 +36229,6 @@ - #. we're complaining about C++0x compatibility. - #: cp/parser.c:11485 - #, fuzzy, gcc-internal-format --#| msgid "%<auto%> will change meaning in C++0x; please remove it" - msgid "%<auto%> changes meaning in C++11; please remove it" - msgstr "%<auto%>çš„è¯ä¹‰åœ¨ C++0x ä¸å°†è¢«æ”¹å˜ï¼›è¯·è€ƒè™‘åˆ é™¤å®ƒ" - -@@ -37368,7 +36259,6 @@ - - #: cp/parser.c:12122 - #, fuzzy, gcc-internal-format --#| msgid "types may not be defined in a new-type-id" - msgid "types may not be defined in a conversion-type-id" - msgstr "类型ä¸èƒ½å®šä¹‰åœ¨ new-type-id ä¸" - -@@ -37379,7 +36269,6 @@ - - #: cp/parser.c:12153 - #, fuzzy, gcc-internal-format --#| msgid "invalid use of %<auto%> in conversion operator" - msgid "use of %<auto%> in member template conversion operator can never be deduced" - msgstr "在转æ¢è¿ç®—符ä¸ä½¿ç”¨%<auto%>æ— æ•ˆ" - -@@ -37395,7 +36284,6 @@ - - #: cp/parser.c:12276 - #, fuzzy, gcc-internal-format --#| msgid "static declaration of %q+D follows non-static declaration" - msgid "mem-initializer for %qD follows constructor delegation" - msgstr "对%qDçš„é™æ€å£°æ˜Žå‡ºçŽ°åœ¨éžé™æ€å£°æ˜Žä¹‹åŽ" - -@@ -37421,7 +36309,6 @@ - - #: cp/parser.c:12737 cp/parser.c:12784 - #, fuzzy, gcc-internal-format --#| msgid "expected a string after %<#pragma message%>" - msgid "expected empty string after %<operator%> keyword" - msgstr "%<#pragma message%>åŽéœ€è¦ä¸€ä¸ªå—符串" - -@@ -37432,7 +36319,6 @@ - - #: cp/parser.c:12761 - #, fuzzy, gcc-internal-format --#| msgid "expected identifier" - msgid "expected suffix identifier" - msgstr "需è¦æ ‡è¯†ç¬¦" - -@@ -37484,7 +36370,6 @@ - - #: cp/parser.c:13403 - #, fuzzy, gcc-internal-format --#| msgid "(if you use %<-fpermissive%> G++ will accept your code)" - msgid "(if you use %<-fpermissive%> or %<-std=c++11%>, or %<-std=gnu++11%> G++ will accept your code)" - msgstr "(如果您使用%<-fpermissive%>G++ 会接å—您的代ç )" - -@@ -37547,19 +36432,16 @@ - - #: cp/parser.c:14510 - #, fuzzy, gcc-internal-format --#| msgid "defaulted and deleted functions only available with -std=c++0x or -std=gnu++0x" - msgid "use of %<auto%> in lambda parameter declaration only available with -std=c++1y or -std=gnu++1y" - msgstr "é»˜è®¤åŒ–å’Œè¢«åˆ é™¤çš„å‡½æ•°åªåœ¨ -std=c++0x 或 -std=gnu++0x 下å¯ç”¨" - - #: cp/parser.c:14516 - #, fuzzy, gcc-internal-format --#| msgid "defaulted and deleted functions only available with -std=c++0x or -std=gnu++0x" - msgid "use of %<auto%> in parameter declaration only available with -std=c++1y or -std=gnu++1y" - msgstr "é»˜è®¤åŒ–å’Œè¢«åˆ é™¤çš„å‡½æ•°åªåœ¨ -std=c++0x 或 -std=gnu++0x 下å¯ç”¨" - - #: cp/parser.c:14521 - #, fuzzy, gcc-internal-format --#| msgid "ISO C forbids forward parameter declarations" - msgid "ISO C++ forbids use of %<auto%> in parameter declaration" - msgstr "ISO C ä¸å…许å‰å‘å‚数声明" - -@@ -37640,7 +36522,6 @@ - - #: cp/parser.c:15524 - #, fuzzy, gcc-internal-format --#| msgid "ISO C++ forbids incrementing an enum" - msgid "ISO C++ forbids empty anonymous enum" - msgstr "ISO C++ ä¸å…许枚举自增" - -@@ -37681,7 +36562,6 @@ - - #: cp/parser.c:16101 - #, fuzzy, gcc-internal-format --#| msgid "types may not be defined in exception-declarations" - msgid "types may not be defined in alias template declarations" - msgstr "类型ä¸èƒ½å®šä¹‰åœ¨å¼‚常声明ä¸" - -@@ -37764,7 +36644,6 @@ - #. function. - #: cp/parser.c:17476 - #, fuzzy, gcc-internal-format --#| msgid "invalid type in declaration" - msgid "qualified-id in declaration" - msgstr "声明ä¸æœ‰æ— 效类型" - -@@ -37780,7 +36659,6 @@ - - #: cp/parser.c:17605 - #, fuzzy, gcc-internal-format --#| msgid "creating pointer to member of non-class type %qT" - msgid "cannot form pointer to member of non-class %q#T" - msgstr "生æˆéžç±»ç±»åž‹%qTçš„æˆå‘˜æŒ‡é’ˆ" - -@@ -37796,13 +36674,11 @@ - - #: cp/parser.c:17739 - #, fuzzy, gcc-internal-format --#| msgid "duplicate cv-qualifier" - msgid "multiple ref-qualifiers" - msgstr "é‡å¤çš„ cv é™å®š" - - #: cp/parser.c:17797 - #, fuzzy, gcc-internal-format --#| msgid "duplicate cv-qualifier" - msgid "duplicate virt-specifier" - msgstr "é‡å¤çš„ cv é™å®š" - -@@ -37843,13 +36719,11 @@ - - #: cp/parser.c:18594 - #, fuzzy, gcc-internal-format --#| msgid "%H%sparameter pack %qD cannot have a default argument" - msgid "parameter pack %qD cannot have a default argument" - msgstr "%H%s模æ¿å‚数包%qDä¸èƒ½æœ‰é»˜è®¤å‚æ•°" - - #: cp/parser.c:18602 - #, fuzzy, gcc-internal-format --#| msgid "%H%sparameter pack cannot have a default argument" - msgid "parameter pack cannot have a default argument" - msgstr "%H%s模æ¿å‚数包ä¸èƒ½æœ‰é»˜è®¤å‚æ•°" - -@@ -37860,7 +36734,6 @@ - - #: cp/parser.c:18907 - #, fuzzy, gcc-internal-format --#| msgid "ISO C++ does not allow designated initializers" - msgid "ISO C++ does not allow C99 designated initializers" - msgstr "ISO C++ ä¸å…è®¸æŒ‡å®šå…ƒç´ åˆå§‹å€¼è®¾å®š" - -@@ -37891,7 +36764,6 @@ - - #: cp/parser.c:19667 - #, fuzzy, gcc-internal-format --#| msgid "cannot find file for class %s" - msgid "cannot specify %<override%> for a class" - msgstr "æ— æ³•ä¸ºç±» %s 找到文件" - -@@ -37942,7 +36814,6 @@ - - #: cp/parser.c:20181 - #, fuzzy, gcc-internal-format --#| msgid "a class-key must be used when declaring a friend" - msgid "in C++03 a class-key must be used when declaring a friend" - msgstr "声明å‹å…ƒæ—¶å¿…须使用 class 关键å—" - -@@ -38018,7 +36889,6 @@ - - #: cp/parser.c:21749 - #, fuzzy, gcc-internal-format --#| msgid "expected identifier or %<(%>" - msgid "expected an identifier for the attribute name" - msgstr "需è¦æ ‡è¯†ç¬¦æˆ–%<(%>" - -@@ -38113,13 +36983,11 @@ - - #: cp/parser.c:24031 - #, fuzzy, gcc-internal-format --#| msgid "both %<_Sat%> and %<char%> in declaration specifiers" - msgid "both %<__thread%> and %<thread_local%> specified" - msgstr "声明ä¸åŒæ—¶ä½¿ç”¨äº†%<_Sat%>å’Œ%<char%>" - - #: cp/parser.c:24033 - #, fuzzy, gcc-internal-format --#| msgid "duplicate %qE" - msgid "duplicate %qD" - msgstr "é‡å¤çš„%qE" - -@@ -38225,13 +37093,11 @@ - - #: cp/parser.c:24157 - #, fuzzy, gcc-internal-format --#| msgid "expected %<static_assert%>" - msgid "expected %<__transaction_atomic%>" - msgstr "需è¦%<static_assert%>" - - #: cp/parser.c:24160 - #, fuzzy, gcc-internal-format --#| msgid "expected %<static_assert%>" - msgid "expected %<__transaction_relaxed%>" - msgstr "需è¦%<static_assert%>" - -@@ -38272,7 +37138,6 @@ - - #: cp/parser.c:24488 - #, fuzzy, gcc-internal-format --#| msgid "previously declared here" - msgid "%q#T was previously declared here" - msgstr "以å‰åœ¨æ¤å£°æ˜Žè¿‡" - -@@ -38283,7 +37148,6 @@ - - #: cp/parser.c:24528 - #, fuzzy, gcc-internal-format --#| msgid "%<template%> (as a disambiguator) is only allowed within templates" - msgid "in C++98 %<template%> (as a disambiguator) is only allowed within templates" - msgstr "用作消æ§ä¹‰çš„%<template%>åªèƒ½ç”¨äºŽæ¨¡æ¿å†…" - -@@ -38354,7 +37218,6 @@ - - #: cp/parser.c:27475 - #, fuzzy, gcc-internal-format --#| msgid "invalid initializer" - msgid "invalid reduction-identifier" - msgstr "æ— æ•ˆçš„åˆå§‹å€¼è®¾å®š" - -@@ -38365,7 +37228,6 @@ - - #: cp/parser.c:29045 - #, fuzzy, gcc-internal-format --#| msgid "parenthesized initialization is not allowed in OpenMP %<for%> loop" - msgid "parenthesized initialization is not allowed in for-loop" - msgstr "括起的åˆå§‹åŒ–ä¸å…许使用在 OpenMP %<for%>循环ä¸" - -@@ -38381,13 +37243,11 @@ - - #: cp/parser.c:30334 - #, fuzzy, gcc-internal-format --#| msgid "attributes are not allowed on a function-definition" - msgid "vector attribute not immediately followed by a single function declaration or definition" - msgstr "函数定义ä¸ä¸å…许有属性" - - #: cp/parser.c:30561 - #, fuzzy, gcc-internal-format --#| msgid "invalid initializer" - msgid "invalid initializer clause" - msgstr "æ— æ•ˆçš„åˆå§‹å€¼è®¾å®š" - -@@ -38403,13 +37263,11 @@ - - #: cp/parser.c:30678 - #, fuzzy, gcc-internal-format --#| msgid "expected %<+%>, %<*%>, %<-%>, %<&%>, %<^%>, %<|%>, %<&&%>, or %<||%>" - msgid "expected %<+%>, %<*%>, %<-%>, %<&%>, %<^%>, %<|%>, %<&&%>, %<||%> or identifier" - msgstr "需è¦%<+%>ã€%<*%>ã€%<-%>ã€%<&%>ã€%<^%>ã€%<|%>ã€%<&&%>或%<||%>" - - #: cp/parser.c:30697 - #, fuzzy, gcc-internal-format --#| msgid "new types may not be defined in a return type" - msgid "types may not be defined in declare reduction type list" - msgstr "ä¸èƒ½åœ¨è¿”回类型ä¸å®šä¹‰æ–°ç±»åž‹" - -@@ -38450,7 +37308,6 @@ - - #: cp/parser.c:31479 - #, fuzzy, gcc-internal-format --#| msgid "#pragma GCC optimize is not allowed inside functions" - msgid "%<#pragma simd%> must be inside a function" - msgstr "#pragma GCC optimize ä¸å…许用在函数ä¸" - -@@ -38461,19 +37318,16 @@ - - #: cp/parser.c:31650 - #, fuzzy, gcc-internal-format --#| msgid "Expected variable name at %C" - msgid "expected variable-name" - msgstr "在%C处需è¦å˜é‡å" - - #: cp/parser.c:31714 - #, fuzzy, gcc-internal-format --#| msgid "expected %<,%> or %<)%>" - msgid "expected %<,%> or %<)%> after %qE" - msgstr "éœ€è¦ %<,%> 或 %<)%>" - - #: cp/parser.c:31996 - #, fuzzy, gcc-internal-format --#| msgid "templates may not be %<virtual%>" - msgid "implicit templates may not be %<virtual%>" - msgstr "模æ¿ä¸èƒ½æ˜¯%<virtual%>çš„" - -@@ -38524,7 +37378,6 @@ - - #: cp/pt.c:831 - #, fuzzy, gcc-internal-format --#| msgid "declaration of template %q#D" - msgid "specialization of alias template %qD" - msgstr "模æ¿å£°æ˜Ž%q#D" - -@@ -38562,13 +37415,11 @@ - - #: cp/pt.c:1769 - #, fuzzy, gcc-internal-format --#| msgid "candidate is: %+#D" - msgid "candidate is: %#D" - msgstr "备选为:%+#D" - - #: cp/pt.c:1776 cp/semantics.c:4775 - #, fuzzy, gcc-internal-format --#| msgid "%s %+#D" - msgid "%s %#D" - msgstr "%s %+#D" - -@@ -38599,7 +37450,6 @@ - - #: cp/pt.c:2299 - #, fuzzy, gcc-internal-format --#| msgid "wrong number of template arguments (%d, should be %d)" - msgid "too many template headers for %D (should be %d)" - msgstr "模æ¿å‚æ•°æ•°ç›®ä¸å¯¹(ä¸åº”是 %d 个而应是 %d 个)" - -@@ -38735,7 +37585,6 @@ - - #: cp/pt.c:4159 - #, fuzzy, gcc-internal-format --#| msgid "previously declared here" - msgid "primary template here" - msgstr "以å‰åœ¨æ¤å£°æ˜Žè¿‡" - -@@ -38792,7 +37641,6 @@ - - #: cp/pt.c:4478 - #, fuzzy, gcc-internal-format --#| msgid "default template arguments may not be used in function templates without -std=c++0x or -std=gnu++0x" - msgid "default template arguments may not be used in function templates without -std=c++11 or -std=gnu++11" - msgstr "åªæœ‰æŒ‡å®šäº† -std=c++0x 或 -std=gnu++0x æ—¶æ‰èƒ½åœ¨å‡½æ•°æ¨¡æ¿ä¸ä½¿ç”¨é»˜è®¤å‚æ•°" - -@@ -38914,19 +37762,16 @@ - - #: cp/pt.c:5229 - #, fuzzy, gcc-internal-format --#| msgid "it must be the address of a function with external linkage" - msgid "it must be the name of a function with external linkage" - msgstr "它必须是一个具有外部链接函数的地å€" - - #: cp/pt.c:5237 - #, fuzzy, gcc-internal-format --#| msgid "%qE is not a valid template argument for type %qT because object %qD has not external linkage" - msgid "%qE is not a valid template argument for type %qT because %qD has no linkage" - msgstr "%qEä¸æ˜¯ç±»åž‹%qT的有效模æ¿å®žå‚ï¼Œå› ä¸ºå¯¹è±¡%qD没有外部链接" - - #: cp/pt.c:5241 - #, fuzzy, gcc-internal-format --#| msgid "%qE is not a valid template argument of type %qT because %qD does not have external linkage" - msgid "%qE is not a valid template argument for type %qT because %qD does not have external linkage" - msgstr "%qEä¸æ˜¯ç±»åž‹%qT的有效模æ¿å®žå‚ï¼Œå› ä¸ºå‡½æ•°%qD没有外部链接" - -@@ -38937,7 +37782,6 @@ - - #: cp/pt.c:5318 - #, fuzzy, gcc-internal-format --#| msgid "got %d template parameters for %q#D" - msgid " couldn't deduce template parameter %qD" - msgstr "得到 %d 个模æ¿å‚数,为%q#D" - -@@ -38948,31 +37792,26 @@ - - #: cp/pt.c:5342 - #, fuzzy, gcc-internal-format --#| msgid "comparison between types %qT and %qT" - msgid " mismatched types %qT and %qT" - msgstr "在类型%qTå’Œ%qT间比较" - - #: cp/pt.c:5351 - #, fuzzy, gcc-internal-format --#| msgid "template parameter pack %qD cannot have a default argument" - msgid " template parameter %qD is not a parameter pack, but argument %qD is" - msgstr "模æ¿å‚数包%qDä¸èƒ½æœ‰é»˜è®¤å‚æ•°" - - #: cp/pt.c:5362 - #, fuzzy, gcc-internal-format --#| msgid "template arguments to %qD do not match original template %qD" - msgid " template argument %qE does not match pointer-to-member constant %qE" - msgstr "ç»™%qD的模æ¿å®žå‚ä¸åŒ¹é…原先的模æ¿%qD" - - #: cp/pt.c:5372 - #, fuzzy, gcc-internal-format --#| msgid "%qs is not valid for %qs" - msgid " %qE is not equivalent to %qE" - msgstr "%qs对%qsè€Œè¨€æ— æ•ˆ" - - #: cp/pt.c:5381 - #, fuzzy, gcc-internal-format --#| msgid "inconsistent deduction for %qT: %qT and then %qT" - msgid " inconsistent parameter pack deduction with %qT and %qT" - msgstr "对%qTä¸ä¸€è‡´çš„演绎:先是%qT然åŽæ˜¯%qT" - -@@ -38988,31 +37827,26 @@ - - #: cp/pt.c:5408 - #, fuzzy, gcc-internal-format --#| msgid "partial specialization %qT does not specialize any template arguments" - msgid " variable-sized array type %qT is not a valid template argument" - msgstr "部分特例化%qT并未特例化任何模æ¿å‚æ•°" - - #: cp/pt.c:5419 - #, fuzzy, gcc-internal-format --#| msgid "%qE is not a valid template argument for type %qT" - msgid " member function type %qT is not a valid template argument" - msgstr "%qEä¸æ˜¯ç±»åž‹%qT的有效模æ¿å‚æ•°" - - #: cp/pt.c:5453 - #, fuzzy, gcc-internal-format --#| msgid "cannot convert type %qT to type %qT" - msgid " cannot convert %qE (type %qT) to type %qT" - msgstr "ä¸èƒ½å°†ç±»åž‹%qT转æ¢ä¸ºç±»åž‹%qT" - - #: cp/pt.c:5466 - #, fuzzy, gcc-internal-format --#| msgid "%qT is an ambiguous base of %qT" - msgid " %qT is an ambiguous base class of %qT" - msgstr "%qT是%qT的有æ§ä¹‰çš„基类" - - #: cp/pt.c:5470 - #, fuzzy, gcc-internal-format --#| msgid "type %qT is not derived from type %qT" - msgid " %qT is not derived from %qT" - msgstr "类型%qTä¸æ˜¯ç”±ç±»åž‹%qT派生的" - -@@ -39023,13 +37857,11 @@ - - #: cp/pt.c:5491 - #, fuzzy, gcc-internal-format --#| msgid "cannot decrement a pointer to incomplete type %qT" - msgid " can't deduce a template for %qT from non-template type %qT" - msgstr "指å‘ä¸å®Œå…¨ç±»åž‹%qT的指针ä¸èƒ½è‡ªå‡" - - #: cp/pt.c:5501 - #, fuzzy, gcc-internal-format --#| msgid "template arguments to %qD do not match original template %qD" - msgid " template argument %qE does not match %qD" - msgstr "ç»™%qD的模æ¿å®žå‚ä¸åŒ¹é…原先的模æ¿%qD" - -@@ -39055,7 +37887,6 @@ - - #: cp/pt.c:5747 - #, fuzzy, gcc-internal-format --#| msgid "%qD is not a valid template argument because %qD is a variable, not the address of a variable" - msgid "%qE is not a valid template argument for %qT because it is not the address of a variable" - msgstr "%qDä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆæ¨¡æ¿å®žå‚ï¼Œå› ä¸º%qD是一个å˜é‡ï¼Œè€Œéžå˜é‡çš„地å€" - -@@ -39071,7 +37902,6 @@ - - #: cp/pt.c:5778 - #, fuzzy, gcc-internal-format --#| msgid "%qE is not a valid template argument of type %qT because %qE is not a variable" - msgid "%qE is not a valid template argument of type %qT because %qD has no linkage" - msgstr "%qEä¸æ˜¯ç±»åž‹%qT的有效模æ¿å®žå‚ï¼Œå› ä¸º%qEä¸æ˜¯ä¸€ä¸ªå˜é‡" - -@@ -39132,7 +37962,6 @@ - - #: cp/pt.c:6336 - #, fuzzy, gcc-internal-format --#| msgid "invalid use of destructor %qD as a type" - msgid "invalid use of destructor %qE as a type" - msgstr "å°†æžæž„函数%qDç”¨ä½œç±»åž‹æ— æ•ˆ" - -@@ -39210,13 +38039,11 @@ - - #: cp/pt.c:6754 - #, fuzzy, gcc-internal-format --#| msgid "default argument for template parameter for class enclosing %qD" - msgid "pack expansion argument for non-pack parameter %qD of alias template %qD" - msgstr "包å«%qD的类的模æ¿å‚数有默认å‚æ•°" - - #: cp/pt.c:7085 - #, fuzzy, gcc-internal-format --#| msgid "%qD is not a function template" - msgid "%q#D is not a function template" - msgstr "%qDä¸æ˜¯ä¸€ä¸ªå‡½æ•°æ¨¡æ¿" - -@@ -39232,7 +38059,6 @@ - - #: cp/pt.c:8088 - #, fuzzy --#| msgid "template instantiation depth exceeds maximum of %d (use -ftemplate-depth= to increase the maximum) instantiating %qD" - msgid "template instantiation depth exceeds maximum of %d (use -ftemplate-depth= to increase the maximum) substituting %qS" - msgstr "在实例化%2$qD时模æ¿å®žä¾‹åŒ–深度超过最大值 %1$d(使用 use -ftemplate-depth= æ¥å¢žå¤§æœ€å¤§å€¼)" - -@@ -39253,7 +38079,6 @@ - - #: cp/pt.c:10108 - #, fuzzy, gcc-internal-format --#| msgid "redefinition of default argument for %q#D" - msgid " when instantiating default argument for call to %D" - msgstr "é‡å®šä¹‰%q#D的默认å‚æ•°" - -@@ -39317,25 +38142,21 @@ - - #: cp/pt.c:11791 - #, fuzzy, gcc-internal-format --#| msgid "cannot declare pointer to qualified function type %qT" - msgid "forming pointer to qualified function type %qT" - msgstr "ä¸èƒ½å£°æ˜ŽæŒ‡å‘é™å®šå‡½æ•°ç±»åž‹%qT的指针" - - #: cp/pt.c:11794 - #, fuzzy, gcc-internal-format --#| msgid "cannot declare reference to qualified function type %qT" - msgid "forming reference to qualified function type %qT" - msgstr "ä¸èƒ½å£°æ˜ŽæŒ‡å‘é™å®šå‡½æ•°ç±»åž‹%qT的引用" - - #: cp/pt.c:11831 - #, fuzzy, gcc-internal-format --#| msgid "cannot declare reference to qualified function type %qT" - msgid "cannot declare reference to array of runtime bound" - msgstr "ä¸èƒ½å£°æ˜ŽæŒ‡å‘é™å®šå‡½æ•°ç±»åž‹%qT的引用" - - #: cp/pt.c:11832 - #, fuzzy, gcc-internal-format --#| msgid "cannot declare pointer to %q#T member" - msgid "cannot declare pointer to array of runtime bound" - msgstr "æ— æ³•å£°æ˜ŽæŒ‡å‘%q#Tæˆå‘˜çš„指针" - -@@ -39426,13 +38247,11 @@ - - #: cp/pt.c:14567 - #, fuzzy, gcc-internal-format --#| msgid "%<%T::%E%> is not a type" - msgid "use %<%T::%D%> instead" - msgstr "%<%T::%E%>ä¸æ˜¯ä¸€ä¸ªç±»åž‹" - - #: cp/pt.c:14571 - #, fuzzy, gcc-internal-format --#| msgid "%qE undeclared here (not in a function)" - msgid "%q+D declared here, later in the translation unit" - msgstr "%qE未声明(ä¸åœ¨å‡½æ•°å†…)" - -@@ -39518,7 +38337,6 @@ - - #: cp/pt.c:18935 - #, fuzzy, gcc-internal-format --#| msgid "explicit instantiation of non-template %q#D" - msgid "explicit instantiation of non-class template %qD" - msgstr "对éžæ¨¡æ¿%q#D的显å¼å®žä¾‹åŒ–" - -@@ -39561,13 +38379,11 @@ - - #: cp/pt.c:20137 - #, fuzzy, gcc-internal-format --#| msgid "invalid use of template type parameter %qT" - msgid "invalid template non-type parameter" - msgstr "对模æ¿ç±»åž‹å‚æ•°%qTçš„ä½¿ç”¨æ— æ•ˆ" - - #: cp/pt.c:20139 - #, fuzzy, gcc-internal-format --#| msgid "%q#T is not a valid type for a template constant parameter" - msgid "%q#T is not a valid type for a template non-type parameter" - msgstr "%q#Tä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆçš„模æ¿å¸¸é‡å‚数类型" - -@@ -39583,7 +38399,6 @@ - - #: cp/pt.c:21484 - #, fuzzy, gcc-internal-format --#| msgid "unable to deduce %qT from %qE" - msgid "unable to deduce lambda return type from %qE" - msgstr "æ— æ³•ä»Ž%2$qE推导出%1$qT" - -@@ -39629,7 +38444,6 @@ - - #: cp/rtti.c:399 - #, fuzzy, gcc-internal-format --#| msgid "creating array of functions" - msgid "typeid of array of runtime bound" - msgstr "创建函数的数组" - -@@ -39640,7 +38454,6 @@ - - #: cp/rtti.c:491 - #, fuzzy, gcc-internal-format --#| msgid "cannot declare pointer to qualified function type %qT" - msgid "typeid of qualified function type %qT" - msgstr "ä¸èƒ½å£°æ˜ŽæŒ‡å‘é™å®šå‡½æ•°ç±»åž‹%qT的指针" - -@@ -39671,7 +38484,6 @@ - - #: cp/search.c:1899 - #, fuzzy, gcc-internal-format --#| msgid "invalid covariant return type for %q+#D" - msgid "invalid covariant return type for %q#D" - msgstr "%q+#Dçš„åå˜è¿”å›žç±»åž‹æ— æ•ˆ" - -@@ -39727,13 +38539,11 @@ - - #: cp/search.c:1966 - #, fuzzy, gcc-internal-format --#| msgid "virtual non-class function %qs" - msgid "virtual function %q+D" - msgstr "虚函数%qsä¸æ˜¯ç±»æˆå‘˜" - - #: cp/search.c:1967 - #, fuzzy, gcc-internal-format --#| msgid "overriding deleted function %q+D" - msgid "overriding final function %q+D" - msgstr "éšè—äº†è¢«åˆ é™¤çš„å‡½æ•°%q+D" - -@@ -39851,7 +38661,6 @@ - - #: cp/semantics.c:3218 - #, fuzzy, gcc-internal-format --#| msgid "protected member %q+#D in anonymous union" - msgid "cannot capture member %qD of anonymous union" - msgstr "匿åè”åˆä¸å‡ºçŽ°ä¿æŠ¤æˆå‘˜%q+#D" - -@@ -39862,13 +38671,11 @@ - - #: cp/semantics.c:3235 - #, fuzzy, gcc-internal-format --#| msgid "use of %<auto%> variable from containing function" - msgid "use of local variable with automatic storage from containing function" - msgstr "在包å«å‡½æ•°ä¸ä½¿ç”¨%<auto%>å˜é‡" - - #: cp/semantics.c:3236 - #, fuzzy, gcc-internal-format --#| msgid "use of %<auto%> variable from containing function" - msgid "use of parameter from containing function" - msgstr "在包å«å‡½æ•°ä¸ä½¿ç”¨%<auto%>å˜é‡" - -@@ -39910,7 +38717,6 @@ - - #: cp/semantics.c:3622 - #, fuzzy, gcc-internal-format --#| msgid "%qD is not an enumerator-name" - msgid "%qT is not an enumeration type" - msgstr "%qDä¸æ˜¯ä¸€ä¸ªæžšä¸¾å" - -@@ -39917,7 +38723,6 @@ - #. Parameter packs can only be used in templates - #: cp/semantics.c:3771 - #, fuzzy, gcc-internal-format --#| msgid "storage class specifiers invalid in parameter declarations" - msgid "Parameter pack __bases only valid in template declaration" - msgstr "为形å‚å£°æ˜ŽæŒ‡å®šäº†æ— æ•ˆçš„å˜å‚¨ç±»" - -@@ -39938,7 +38743,6 @@ - - #: cp/semantics.c:4772 - #, fuzzy, gcc-internal-format --#| msgid "reference to %qD is ambiguous" - msgid "user defined reduction lookup is ambiguous" - msgstr "对%qD的引用有æ§ä¹‰" - -@@ -39959,7 +38763,6 @@ - - #: cp/semantics.c:5267 - #, fuzzy, gcc-internal-format --#| msgid "num_threads expression must be integral" - msgid "linear step expression must be integral" - msgstr "num_threads 表达å¼å¿…须是整型的" - -@@ -39995,43 +38798,36 @@ - - #: cp/semantics.c:5434 - #, fuzzy, gcc-internal-format --#| msgid "num_threads expression must be integral" - msgid "%qs length expression must be integral" - msgstr "num_threads 表达å¼å¿…须是整型的" - - #: cp/semantics.c:5447 - #, fuzzy, gcc-internal-format --#| msgid "%Hcollapse argument needs positive constant integer expression" - msgid "%qs length expression must be positive constant integer expression" - msgstr "%H折å å˜é‡éœ€è¦æ£æ•´å¸¸æ•°è¡¨è¾¾å¼" - - #: cp/semantics.c:5464 - #, fuzzy, gcc-internal-format --#| msgid "num_threads expression must be integral" - msgid "%<num_teams%> expression must be integral" - msgstr "num_threads 表达å¼å¿…须是整型的" - - #: cp/semantics.c:5483 - #, fuzzy, gcc-internal-format --#| msgid "num_threads expression must be integral" - msgid "%<thread_limit%> expression must be integral" - msgstr "num_threads 表达å¼å¿…须是整型的" - - #: cp/semantics.c:5502 - #, fuzzy, gcc-internal-format --#| msgid "slice end must be integer" - msgid "%<device%> id must be integral" - msgstr "切片结尾必须是整数" - - #: cp/semantics.c:5523 - #, fuzzy, gcc-internal-format --#| msgid "schedule chunk size expression must be integral" - msgid "%<dist_schedule%> chunk size expression must be integral" - msgstr "调度å—大å°è¡¨è¾¾å¼å¿…须为整型" - - #: cp/semantics.c:5543 - #, fuzzy, gcc-internal-format --#| msgid "%qD is not a variable in clause %qs" - msgid "%qD is not a variable in %<aligned%> clause" - msgstr "%qD在åå¥%qsä¸ä¸æ˜¯ä¸€ä¸ªå˜é‡" - -@@ -40042,19 +38838,16 @@ - - #: cp/semantics.c:5563 - #, fuzzy, gcc-internal-format --#| msgid "%qD appears more than once in data clauses" - msgid "%qD appears more than once in %<aligned%> clauses" - msgstr "%qD在数æ®åå¥ä¸å¤šæ¬¡å‡ºçŽ°" - - #: cp/semantics.c:5576 - #, fuzzy, gcc-internal-format --#| msgid "schedule chunk size expression must be integral" - msgid "%<aligned%> clause alignment expression must be integral" - msgstr "调度å—大å°è¡¨è¾¾å¼å¿…须为整型" - - #: cp/semantics.c:5613 - #, fuzzy, gcc-internal-format --#| msgid "%qD is not a variable in clause %qs" - msgid "%qD is not a variable in %<depend%> clause" - msgstr "%qD在åå¥%qsä¸ä¸æ˜¯ä¸€ä¸ªå˜é‡" - -@@ -40091,7 +38884,6 @@ - #. Report the error. - #: cp/semantics.c:6870 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "static assertion failed: %E" - msgid "static assertion failed: %s" - msgstr "é™æ€æ–言错误:%E" - -@@ -40137,7 +38929,6 @@ - - #: cp/semantics.c:7494 - #, fuzzy, gcc-internal-format --#| msgid "%q#T is not a class" - msgid "%q#T has virtual base classes" - msgstr "%q#Tä¸æ˜¯ä¸€ä¸ªç±»" - -@@ -40168,7 +38959,6 @@ - - #: cp/semantics.c:8033 - #, fuzzy, gcc-internal-format --#| msgid "%qD is not a constexpr function" - msgid "%q+D is not usable as a constexpr function because:" - msgstr "%qDä¸æ˜¯ä¸€ä¸ªå¹¿ä¹‰å¸¸å‡½æ•°" - -@@ -40179,7 +38969,6 @@ - - #: cp/semantics.c:8382 cp/semantics.c:10054 - #, fuzzy, gcc-internal-format --#| msgid "call to non-function %qD" - msgid "call to non-constexpr function %qD" - msgstr "调用éžå‡½æ•°çš„%qD" - -@@ -40186,7 +38975,6 @@ - #. The definition of fun was somehow unsuitable. - #: cp/semantics.c:8416 - #, fuzzy, gcc-internal-format --#| msgid "%qE is not a constant expression" - msgid "%qD called in a constant expression" - msgstr "%qEä¸æ˜¯ä¸€ä¸ªå¸¸é‡è¡¨è¾¾å¼" - -@@ -40202,7 +38990,6 @@ - - #: cp/semantics.c:8462 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "template instantiation depth exceeds maximum of %d (use -ftemplate-depth= to increase the maximum) instantiating %qD" - msgid "constexpr evaluation depth exceeds maximum of %d (use -fconstexpr-depth= to increase the maximum)" - msgstr "在实例化%2$qD时模æ¿å®žä¾‹åŒ–深度超过最大值 %1$d(使用 use -ftemplate-depth= æ¥å¢žå¤§æœ€å¤§å€¼)" - -@@ -40218,7 +39005,6 @@ - - #: cp/semantics.c:8682 - #, fuzzy, gcc-internal-format --#| msgid "Expected array subscript at %C" - msgid "negative array subscript" - msgstr "%C处需è¦æ•°ç»„ä¸‹æ ‡" - -@@ -40284,13 +39070,11 @@ - - #: cp/semantics.c:9492 cp/semantics.c:10361 - #, fuzzy, gcc-internal-format --#| msgid "enumeral and non-enumeral type in conditional expression" - msgid "temporary of non-literal type %qT in a constant expression" - msgstr "枚举和éžæžšä¸¾ç±»åž‹ä¸€èµ·å‡ºçŽ°åœ¨æ¡ä»¶è¡¨è¾¾å¼ä¸" - - #: cp/semantics.c:9735 cp/semantics.c:10146 - #, fuzzy, gcc-internal-format --#| msgid "reinterpret_cast from type %qT to type %qT casts away qualifiers" - msgid "reinterpret_cast from integer to pointer" - msgstr "从类型%qT到类型%qTçš„ reinterpret_cast 丢失了é™å®šç¬¦" - -@@ -40331,7 +39115,6 @@ - - #: cp/semantics.c:10200 - #, fuzzy, gcc-internal-format --#| msgid "%qE is not a constant expression" - msgid "use of %<this%> in a constant expression" - msgstr "%qEä¸æ˜¯ä¸€ä¸ªå¸¸é‡è¡¨è¾¾å¼" - -@@ -40352,7 +39135,6 @@ - - #: cp/semantics.c:10336 - #, fuzzy, gcc-internal-format --#| msgid "Bad type in constant expression" - msgid "cast to non-integral type %qT in a constant expression" - msgstr "常é‡è¡¨è¾¾å¼ä¸ç±»åž‹é”™è¯¯" - -@@ -40423,43 +39205,36 @@ - - #: cp/tree.c:3333 - #, fuzzy, gcc-internal-format --#| msgid "declaration of %qD as member of %qT" - msgid "redeclaration of %qD adds abi tag %E" - msgstr "%qD声明为%qT的一个æˆå‘˜" - - #: cp/tree.c:3339 - #, fuzzy, gcc-internal-format --#| msgid "previous declaration %q+#D here" - msgid "previous declaration here" - msgstr "与æ¤å¤„早先的声明%q+#D冲çª" - - #: cp/tree.c:3356 - #, fuzzy, gcc-internal-format --#| msgid "%qE attribute ignored on non-class types" - msgid "%qE attribute applied to non-class, non-enum type %qT" - msgstr "%qE属性在ä¸æ˜¯ç±»çš„类型上被忽略" - - #: cp/tree.c:3362 - #, fuzzy, gcc-internal-format --#| msgid "ignoring attributes applied to %qT after definition" - msgid "%qE attribute applied to %qT after its definition" - msgstr "忽略在其定义之åŽä¸º%qT应用的属性" - - #: cp/tree.c:3384 - #, fuzzy, gcc-internal-format --#| msgid "%qE attribute applies only to functions" - msgid "%qE attribute applied to non-function %qD" - msgstr "%qE属性åªèƒ½ç”¨äºŽå‡½æ•°" - - #: cp/tree.c:3389 - #, fuzzy, gcc-internal-format --#| msgid "%qE attribute applies only to functions" - msgid "%qE attribute applied to extern \"C\" function %qD" - msgstr "%qE属性åªèƒ½ç”¨äºŽå‡½æ•°" - - #: cp/tree.c:4093 - #, fuzzy, gcc-internal-format --#| msgid "array bound is not an integer constant" - msgid "zero as null pointer constant" - msgstr "数组边界ä¸æ˜¯ä¸€ä¸ªæ•´æ•°å¸¸é‡" - -@@ -40530,7 +39305,6 @@ - - #: cp/typeck.c:1559 - #, fuzzy, gcc-internal-format --#| msgid "creating array of functions" - msgid "taking sizeof array of runtime bound" - msgstr "创建函数的数组" - -@@ -40561,7 +39335,6 @@ - - #: cp/typeck.c:1961 - #, fuzzy, gcc-internal-format --#| msgid "taking address of temporary" - msgid "taking address of temporary array" - msgstr "å–临时å˜é‡çš„地å€" - -@@ -40572,7 +39345,6 @@ - - #: cp/typeck.c:2248 cp/typeck.c:2658 - #, fuzzy, gcc-internal-format --#| msgid "request for member %qD in %qE, which is of non-class type %qT" - msgid "request for member %qD in %qE, which is of pointer type %qT (maybe you meant to use %<->%> ?)" - msgstr "对æˆå‘˜%qD的请求出现在%qEä¸ï¼Œè€ŒåŽè€…具有éžç±»ç±»åž‹%qT" - -@@ -40663,7 +39435,6 @@ - - #: cp/typeck.c:3029 - #, fuzzy, gcc-internal-format --#| msgid "alignment of array elements is greater than element size" - msgid "rank of the array%'s index is greater than 1" - msgstr "æ•°ç»„å…ƒç´ çš„å¯¹é½è¾¹ç•Œæ¯”å…ƒç´ å¤§å°è¿˜è¦å¤§" - -@@ -40704,13 +39475,11 @@ - - #: cp/typeck.c:3486 - #, fuzzy, gcc-internal-format --#| msgid "%qE cannot be used as a function" - msgid "%qD cannot be used as a function" - msgstr "%qEä¸èƒ½ç”¨ä½œå‡½æ•°" - - #: cp/typeck.c:3489 - #, fuzzy, gcc-internal-format --#| msgid "%qE cannot be used as a function" - msgid "expression cannot be used as a function" - msgstr "%qEä¸èƒ½ç”¨ä½œå‡½æ•°" - -@@ -40821,13 +39590,11 @@ - - #: cp/typeck.c:4572 cp/typeck.c:4584 - #, fuzzy, gcc-internal-format --#| msgid "comparison between %qT and %qT" - msgid "operand types are %qT and %qT" - msgstr "在%qTå’Œ%qT间比较" - - #: cp/typeck.c:4596 - #, fuzzy, gcc-internal-format --#| msgid "could not find interface for class %qE" - msgid "could not find an integer type of the same size as %qT" - msgstr "找ä¸åˆ°ç±»%qE的接å£" - -@@ -40925,7 +39692,6 @@ - - #: cp/typeck.c:5473 - #, fuzzy, gcc-internal-format --#| msgid "taking address of expression of type %<void%>" - msgid "taking address of array of runtime bound" - msgstr "å–一个类型为%<void%>的表达å¼çš„地å€" - -@@ -40981,7 +39747,6 @@ - - #: cp/typeck.c:6077 - #, fuzzy, gcc-internal-format --#| msgid "initializer for %qT must be brace-enclosed" - msgid "list-initializer for non-class type must not be parenthesized" - msgstr "%qTçš„åˆå§‹å€¼è®¾å®šå¿…须在花括å·å†…" - -@@ -41027,7 +39792,6 @@ - - #: cp/typeck.c:6296 - #, fuzzy, gcc-internal-format --#| msgid "invalid cast to function type %qT" - msgid "useless cast to type %qT" - msgstr "å‘函数类型%qT的转æ¢æ— 效" - -@@ -41058,7 +39822,6 @@ - - #: cp/typeck.c:6850 - #, fuzzy, gcc-internal-format --#| msgid "ISO C++ forbids casting between pointer-to-function and pointer-to-object" - msgid "casting between pointer-to-function and pointer-to-object is conditionally-supported" - msgstr "ISO C++ ä¸å…许在函数指针和对象指针间进行转æ¢" - -@@ -41253,7 +40016,6 @@ - - #: cp/typeck.c:8390 - #, fuzzy, gcc-internal-format --#| msgid "<brace-enclosed initializer list>" - msgid "returning initializer list" - msgstr "<花括å·å†…çš„åˆå§‹å€¼åˆ—表>" - -@@ -41335,7 +40097,6 @@ - - #: cp/typeck2.c:333 - #, fuzzy, gcc-internal-format --#| msgid "cannot declare parameter %q+D to be of abstract type %qT" - msgid "cannot declare parameter to be of abstract type %qT" - msgstr "ä¸èƒ½å°†å½¢å‚%q+D声明为具有抽象类型%qT" - -@@ -41372,37 +40133,31 @@ - - #: cp/typeck2.c:356 - #, fuzzy, gcc-internal-format --#| msgid "invalid cast to function type %qT" - msgid "invalid cast to abstract class type %qT" - msgstr "å‘函数类型%qT的转æ¢æ— 效" - - #: cp/typeck2.c:359 - #, fuzzy, gcc-internal-format --#| msgid "invalid cast of an rvalue expression of type %qT to type %qT" - msgid "invalid new-expression of abstract class type %qT" - msgstr "从具有类型%qTçš„å³å€¼è¡¨è¾¾å¼åˆ°ç±»åž‹%qTä¸çš„转æ¢æ— 效" - - #: cp/typeck2.c:362 - #, fuzzy, gcc-internal-format --#| msgid "invalid parameter type %qT" - msgid "invalid abstract return type %qT" - msgstr "æ— æ•ˆçš„å‚数类型%qT" - - #: cp/typeck2.c:365 - #, fuzzy, gcc-internal-format --#| msgid "invalid parameter type %qT" - msgid "invalid abstract parameter type %qT" - msgstr "æ— æ•ˆçš„å‚数类型%qT" - - #: cp/typeck2.c:368 - #, fuzzy, gcc-internal-format --#| msgid "expression %qE of abstract class type %qT cannot be used in throw-expression" - msgid "expression of abstract class type %qT cannot be used in throw-expression" - msgstr "表达å¼%qE具有抽象类类型%qT,ä¸èƒ½ç”¨äºŽ throw 表达å¼ä¸" - - #: cp/typeck2.c:372 - #, fuzzy, gcc-internal-format --#| msgid "cannot declare parameter %q+D to be of abstract type %qT" - msgid "cannot declare catch parameter to be of abstract class type %qT" - msgstr "ä¸èƒ½å°†å½¢å‚%q+D声明为具有抽象类型%qT" - -@@ -41448,7 +40203,6 @@ - - #: cp/typeck2.c:501 - #, fuzzy, gcc-internal-format --#| msgid "invalid use of member (did you forget the %<&%> ?)" - msgid "invalid use of member function (did you forget the %<()%> ?)" - msgstr "对æˆå‘˜çš„ä½¿ç”¨æ— æ•ˆ(您是å¦é—忘了%<&%>?)" - -@@ -41474,7 +40228,6 @@ - - #: cp/typeck2.c:534 - #, fuzzy, gcc-internal-format --#| msgid "<brace-enclosed initializer list>" - msgid "invalid use of brace-enclosed initializer list" - msgstr "<花括å·å†…çš„åˆå§‹å€¼åˆ—表>" - -@@ -41510,7 +40263,6 @@ - - #: cp/typeck2.c:922 - #, fuzzy, gcc-internal-format --#| msgid "narrowing conversion of %qE from %qT to %qT inside { }" - msgid "narrowing conversion of %qE from %qT to %qT inside { } is ill-formed in C++11" - msgstr "在 {} 内将%qE从%qT转æ¢ä¸ºè¾ƒçª„的类型%qT" - -@@ -41606,19 +40358,16 @@ - - #: cp/typeck2.c:1759 - #, fuzzy, gcc-internal-format --#| msgid "pointer to member function used in arithmetic" - msgid "pointer-to-member-function type %qT requires an rvalue" - msgstr "在算术表达å¼ä¸ä½¿ç”¨äº†æˆå‘˜æŒ‡é’ˆ" - - #: cp/typeck2.c:1766 - #, fuzzy, gcc-internal-format --#| msgid "pointer to member function used in arithmetic" - msgid "pointer-to-member-function type %qT requires an lvalue" - msgstr "在算术表达å¼ä¸ä½¿ç”¨äº†æˆå‘˜æŒ‡é’ˆ" - - #: cp/typeck2.c:1807 - #, fuzzy, gcc-internal-format --#| msgid "invalid cast to function type %qT" - msgid "functional cast to array type %qT" - msgstr "å‘函数类型%qT的转æ¢æ— 效" - -@@ -41659,7 +40408,6 @@ - - #: fortran/arith.c:904 fortran/arith.c:929 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: Noninteger exponent in an initialization expression at %L" - msgid "Noninteger exponent in an initialization expression at %L" - msgstr "Fortran 2003:%L处åˆå§‹åŒ–表达å¼ä¸éžæ•´æ•°æŒ‡æ•°" - -@@ -41833,7 +40581,6 @@ - - #: fortran/array.c:578 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Array specification at %C has more than %d dimensions" - msgid "Array specification at %C with more than 7 dimensions" - msgstr "%Cå¤„æ•°ç»„è§„æ ¼ä¸æœ‰å¤šäºŽ %d çš„ç»´æ•°" - -@@ -41864,13 +40611,11 @@ - - #: fortran/array.c:1060 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: [...] style array constructors at %C" - msgid "[...] style array constructors at %C" - msgstr "Fortran 2003:%C处 [...] é£Žæ ¼çš„æ•°ç»„æž„é€ " - - #: fortran/array.c:1082 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: Array constructor including type specification at %C" - msgid "Array constructor including type specification at %C" - msgstr "Fortran 2003:%C处包å«ç±»åž‹è§„æ ¼çš„æ•°ç»„æž„é€ " - -@@ -42074,7 +40819,6 @@ - #: fortran/check.c:868 fortran/check.c:1807 fortran/check.c:1933 - #: fortran/check.c:2007 fortran/check.c:2427 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Extension: Different type kinds at %L" - msgid "Different type kinds at %L" - msgstr "扩展:%L处类型ç§åˆ«ä¸åŒ" - -@@ -42085,7 +40829,6 @@ - - #: fortran/check.c:913 fortran/check.c:949 fortran/check.c:2945 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "'%s' argument of '%s' intrinsic at %L must be of kind %d" - msgid "'%s' argument of '%s' intrinsic at %L shall not be coindexed" - msgstr "%3$L处内建函数‘%2$s’的实å‚‘%1$s’必须具有ç§åˆ« %4$d" - -@@ -42121,19 +40864,16 @@ - - #: fortran/check.c:1030 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "'%s' and '%s' arguments of '%s' intrinsic at %L must have the same type" - msgid "ATOM and VALUE argument of the %s intrinsic function shall have the same type at %L" - msgstr "%4$L处‘%3$s’内建函数的‘%1$s’和‘%2$s’实å‚类型必须相åŒ" - - #: fortran/check.c:1048 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "'%s' argument of '%s' intrinsic at %L must be default real" - msgid "ATOM argument of the %s intrinsic function at %L shall be definable" - msgstr "%3$L处内建函数‘%2$s’的‘%1$s’实å‚类型必须为默认实型" - - #: fortran/check.c:1065 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "'%s' argument of '%s' intrinsic at %L must be default real" - msgid "VALUE argument of the %s intrinsic function at %L shall be definable" - msgstr "%3$L处内建函数‘%2$s’的‘%1$s’实å‚类型必须为默认实型" - -@@ -42162,7 +40902,6 @@ - #: fortran/check.c:3609 fortran/check.c:3664 fortran/check.c:4620 - #: fortran/check.c:4749 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: '%s' intrinsic with KIND argument at %L" - msgid "'%s' intrinsic with KIND argument at %L" - msgstr "Fortran 2003:%2$L处的‘%1$s’内建函数有 KIND 实å‚" - -@@ -42203,7 +40942,6 @@ - - #: fortran/check.c:1739 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2008: COMPLEX argument '%s' argument of '%s' intrinsic at %L" - msgid "COMPLEX argument '%s' argument of '%s' intrinsic at %L" - msgstr "Fortran 2008:%3$L处的‘%2$s’内建函数有 COMPLEX å‚数‘%1$s’" - -@@ -42239,19 +40977,16 @@ - - #: fortran/check.c:2384 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "'%s' argument of '%s' intrinsic at %L is empty" - msgid "Missing '%s' argument to the %s intrinsic at %L" - msgstr "%3$L处内建‘%2$s’内建函数的‘%1$s’实å‚为空" - - #: fortran/check.c:2399 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "arguments '%s' and '%s' for intrinsic %s" - msgid "Duplicate argument '%s' at %L to intrinsic %s" - msgstr "‘%s’和‘%s’用作内建函数‘%s’的å‚æ•°" - - #: fortran/check.c:2404 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "arguments '%s' and '%s' for intrinsic %s" - msgid "Unknown argument '%s' at %L to intrinsic %s" - msgstr "‘%s’和‘%s’用作内建函数‘%s’的å‚æ•°" - -@@ -42262,7 +40997,6 @@ - - #: fortran/check.c:2464 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: '%s' intrinsic with CHARACTER argument at %L" - msgid "'%s' intrinsic with CHARACTER argument at %L" - msgstr "Fortran 2003:%2$L处的‘%1$s’内建函数有 CHARACTER 实å‚" - -@@ -42298,13 +41032,11 @@ - - #: fortran/check.c:2815 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Second argument of NEAREST at %L shall not be zero" - msgid "The FROM argument to MOVE_ALLOC at %L shall not be coindexed" - msgstr "%L处 NEAREST 的第二个å‚æ•°ä¸èƒ½ä¸º 0" - - #: fortran/check.c:2826 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Second argument of NEAREST at %L shall not be zero" - msgid "The TO argument to MOVE_ALLOC at %L shall not be coindexed" - msgstr "%L处 NEAREST 的第二个å‚æ•°ä¸èƒ½ä¸º 0" - -@@ -42315,25 +41047,21 @@ - - #: fortran/check.c:2844 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "the '%s' and '%s' arguments of '%s' intrinsic at %L must have the same rank %d/%d" - msgid "The FROM and TO arguments of the MOVE_ALLOC intrinsic at %L must have the same rank %d/%d" - msgstr "%4$L处‘%3$s’内建函数的‘%1$s’和‘%2$s’实å‚必须有相åŒçš„秩 %5$d/%6$d" - - #: fortran/check.c:2853 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "the '%s' and '%s' arguments of '%s' intrinsic at %L must have the same rank %d/%d" - msgid "The FROM and TO arguments of the MOVE_ALLOC intrinsic at %L must have the same corank %d/%d" - msgstr "%4$L处‘%3$s’内建函数的‘%1$s’和‘%2$s’实å‚必须有相åŒçš„秩 %5$d/%6$d" - - #: fortran/check.c:2880 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Second argument of NEAREST at %L shall not be zero" - msgid "Argument 'S' of NEAREST at %L shall not be zero" - msgstr "%L处 NEAREST 的第二个å‚æ•°ä¸èƒ½ä¸º 0" - - #: fortran/check.c:2930 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "'%s' argument of '%s' intrinsic at %L must be ALLOCATABLE" - msgid "'%s' argument of '%s' intrinsic at %L must be a POINTER, ALLOCATABLE or procedure pointer" - msgstr "%3$L处内建函数‘%2$s’的实å‚‘%1$s’必须为 ALLOCATABLE" - -@@ -42364,7 +41092,6 @@ - - #: fortran/check.c:3150 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "'%s' argument of '%s' intrinsic at %L must be a variable" - msgid "The argument of the RANK intrinsic at %L must be a data object" - msgstr "%3$L处内建函数‘%2$s’的实å‚‘%1$s’必须是一个å˜é‡" - -@@ -42410,7 +41137,6 @@ - - #: fortran/check.c:3408 fortran/check.c:3427 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "'%s' argument of '%s' intrinsic at %L must be %s" - msgid "'%s' argument of '%s' intrinsic at %L cannot be of type %s" - msgstr "%3$L处内建函数‘%2$s’的实å‚‘%1$s’必须是 %4$s" - -@@ -42436,19 +41162,16 @@ - - #: fortran/check.c:3679 fortran/check.c:5705 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "'%s' argument of '%s' intrinsic at %L must be a scalar" - msgid "'%s' argument of '%s' intrinsic at %L shall not be a procedure" - msgstr "%3$L处内建函数‘%2$s’的实å‚‘%1$sâ€™å¿…é¡»æ˜¯ä¸€ä¸ªæ ‡é‡" - - #: fortran/check.c:3687 fortran/check.c:3826 fortran/check.c:5697 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "'%s' argument of '%s' intrinsic at %L cannot be INTENT(IN)" - msgid "'%s' argument of '%s' intrinsic at %L shall not be TYPE(*)" - msgstr "%3$L处内建函数‘%2$s’的实å‚‘%1$s’ä¸èƒ½æ˜¯ INTENT(IN)" - - #: fortran/check.c:3698 fortran/check.c:3838 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "'source' argument of 'shape' intrinsic at %L must not be an assumed size array" - msgid "'%s' argument of '%s' intrinsic at %L shall not be an assumed-size array" - msgstr "‘shape’内建函数的‘source’实å‚在%L处ä¸èƒ½æ˜¯å‡å®šå¤§å°çš„数组" - -@@ -42474,7 +41197,6 @@ - - #: fortran/check.c:3906 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Argument dim at %L must be scalar" - msgid "Argument FPTR at %L to C_F_POINTER must be a pointer" - msgstr "%L 实å‚ç»´æ•°å¿…é¡»æ˜¯æ ‡é‡" - -@@ -42540,7 +41262,6 @@ - - #: fortran/check.c:4036 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Function result '%s' at %L has no IMPLICIT type" - msgid "Function result '%s' at %L is invalid as X argument to C_FUNLOC" - msgstr "%2$L处的函数返回值‘%1$s’处没有éšå¼ç±»åž‹" - -@@ -42551,7 +41272,6 @@ - - #: fortran/check.c:4050 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "User operator procedure '%s' at %L must be a FUNCTION" - msgid "Noninteroperable procedure at %L to C_FUNLOC" - msgstr "%2$L处的用户è¿ç®—符‘%1$s’必须是一个 FUNCTION" - -@@ -42567,7 +41287,6 @@ - - #: fortran/check.c:4081 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Component at %C must have the POINTER attribute" - msgid "Argument X at %L to C_LOC shall have either the POINTER or the TARGET attribute" - msgstr "%C处的组件必须有 POINTER 属性" - -@@ -42730,7 +41449,6 @@ - - #: fortran/data.c:327 fortran/data.c:493 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Extension: re-initialization of '%s' at %L" - msgid "re-initialization of '%s' at %L" - msgstr "扩展:‘%s’é‡åˆå§‹åŒ–于 %L" - -@@ -42741,7 +41459,6 @@ - - #: fortran/decl.c:271 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Extension: initialization of common block variable '%s' in DATA statement at %C" - msgid "initialization of common block variable '%s' in DATA statement at %C" - msgstr "扩展:DATA è¯å¥ä¸å¯¹å…¬å…±å—å˜é‡â€˜%s’在%C处åˆå§‹åŒ–" - -@@ -42787,7 +41504,6 @@ - - #: fortran/decl.c:752 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Obsolescent feature: Old-style character length at %C" - msgid "Old-style character length at %C" - msgstr "已过时:%C处的旧å¼å—符长度" - -@@ -42823,13 +41539,11 @@ - - #: fortran/decl.c:1032 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Variable '%s' at %L is a parameter to the BIND(C) procedure '%s' but may not be C interoperable" - msgid "Variable '%s' at %L is a dummy argument to the BIND(C) procedure '%s' but is not C interoperable because it is polymorphic" - msgstr "%2$L处å˜é‡â€˜%1$s’是 BIND(C) 过程‘%3$s’的å‚数,但它ä¸èƒ½ä¸Ž C 互æ“作" - - #: fortran/decl.c:1038 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Variable '%s' at %L is a parameter to the BIND(C) procedure '%s' but may not be C interoperable" - msgid "Variable '%s' at %L is a dummy argument of the BIND(C) procedure '%s' but may not be C interoperable" - msgstr "%2$L处å˜é‡â€˜%1$s’是 BIND(C) 过程‘%3$s’的å‚数,但它ä¸èƒ½ä¸Ž C 互æ“作" - -@@ -42840,37 +41554,31 @@ - - #: fortran/decl.c:1066 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Variable '%s' at %L cannot have the ALLOCATABLE attribute because procedure '%s' is BIND(C)" - msgid "Variable '%s' at %L with ALLOCATABLE attribute in procedure '%s' with BIND(C)" - msgstr "%2$L处å˜é‡â€˜%1$s’ä¸èƒ½æœ‰ ALLOCATABLE å±žæ€§ï¼Œå› ä¸ºè¿‡ç¨‹â€˜%3$s’是 BIND(C)" - - #: fortran/decl.c:1074 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Variable '%s' at %L cannot have the POINTER attribute because procedure '%s' is BIND(C)" - msgid "Variable '%s' at %L with POINTER attribute in procedure '%s' with BIND(C)" - msgstr "%2$L处å˜é‡â€˜%1$s’ä¸èƒ½æœ‰ POINTER å±žæ€§ï¼Œå› ä¸ºè¿‡ç¨‹â€˜%3$s’是 BIND(C)" - - #: fortran/decl.c:1083 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Variable '%s' at %L cannot have the ALLOCATABLE attribute because procedure '%s' is BIND(C)" - msgid "Scalar variable '%s' at %L with POINTER or ALLOCATABLE in procedure '%s' with BIND(C) is not yet supported" - msgstr "%2$L处å˜é‡â€˜%1$s’ä¸èƒ½æœ‰ ALLOCATABLE å±žæ€§ï¼Œå› ä¸ºè¿‡ç¨‹â€˜%3$s’是 BIND(C)" - - #: fortran/decl.c:1092 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Variable '%s' at %L cannot have the OPTIONAL attribute because procedure '%s' is BIND(C)" - msgid "Variable '%s' at %L cannot have both the OPTIONAL and the VALUE attribute because procedure '%s' is BIND(C)" - msgstr "%2$L处å˜é‡â€˜%1$s’ä¸èƒ½æœ‰ OPTIONAL å±žæ€§ï¼Œå› ä¸ºè¿‡ç¨‹â€˜%3$s’是 BIND(C)" - - #: fortran/decl.c:1099 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Variable '%s' at %L cannot have the OPTIONAL attribute because procedure '%s' is BIND(C)" - msgid "Variable '%s' at %L with OPTIONAL attribute in procedure '%s' which is BIND(C)" - msgstr "%2$L处å˜é‡â€˜%1$s’ä¸èƒ½æœ‰ OPTIONAL å±žæ€§ï¼Œå› ä¸ºè¿‡ç¨‹â€˜%3$s’是 BIND(C)" - - #: fortran/decl.c:1110 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Assumed-shape array '%s' at %L cannot be an argument to the procedure '%s' at %L because the procedure is BIND(C)" - msgid "Assumed-shape array '%s' at %L as dummy argument to the BIND(C) procedure '%s' at %L" - msgstr "%2$L处å‡å®šå¤–形数组‘%1$s’ä¸èƒ½æ˜¯%4$L处过程‘%3$s’的å‚æ•°ï¼Œå› ä¸ºè¯¥è¿‡ç¨‹æ˜¯ BIND(C)" - -@@ -42946,7 +41654,6 @@ - - #: fortran/decl.c:1724 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "NULL() initialization at %C is ambiguous" - msgid "NULL() initialization at %C may not have MOLD" - msgstr "%C处的 NULL() åˆå§‹åŒ–有æ§ä¹‰" - -@@ -42987,7 +41694,6 @@ - - #: fortran/decl.c:2003 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Extension: Old-style initialization at %C" - msgid "Old-style initialization at %C" - msgstr "扩展:%C处旧å¼çš„åˆå§‹åŒ–" - -@@ -43068,7 +41774,6 @@ - - #: fortran/decl.c:2597 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Extension: BYTE type at %C" - msgid "BYTE type at %C" - msgstr "扩展:%C处的 BYTE 类型" - -@@ -43079,7 +41784,6 @@ - - #: fortran/decl.c:2624 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "By-value argument at %L is not allowed in this context" - msgid "Assumed type at %C is not allowed for components" - msgstr "%L处上下文ä¸ä¸å…è®¸ä½¿ç”¨æŒ‰å€¼ä¼ é€’çš„å®žå‚" - -@@ -43101,7 +41805,6 @@ - - #: fortran/decl.c:2780 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: CLASS statement at %C" - msgid "CLASS statement at %C" - msgstr "Fortran 2003:%C处的 CLASS è¯å¥" - -@@ -43138,7 +41841,6 @@ - - #: fortran/decl.c:3171 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Empty IMPLICIT statement at %C" - msgid "IMPORT statement at %C" - msgstr "%C处 IMPLICIT è¯å¥ä¸ºç©º" - -@@ -43179,7 +41881,6 @@ - - #: fortran/decl.c:3667 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: ALLOCATABLE attribute at %C in a TYPE definition" - msgid "ALLOCATABLE attribute at %C in a TYPE definition" - msgstr "Fortran 2003:%C处的 ALLOCATABLE 属性出现在 TYPE 定义ä¸" - -@@ -43190,7 +41891,6 @@ - - #: fortran/decl.c:3694 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: Attribute %s at %L in a TYPE definition" - msgid "Attribute %s at %L in a TYPE definition" - msgstr "Fortran 2003:属性 %s 在%L处出现在 TYPE 定义ä¸" - -@@ -43201,7 +41901,6 @@ - - #: fortran/decl.c:3718 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: ASYNCHRONOUS attribute at %C" - msgid "ASYNCHRONOUS attribute at %C" - msgstr "Fortran 2003:%C处的 ASYNCHRONOUS 属性" - -@@ -43217,19 +41916,16 @@ - - #: fortran/decl.c:3780 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: PROTECTED attribute at %C" - msgid "PROTECTED attribute at %C" - msgstr "Fortran 2003:%C处的 PROTECT 属性" - - #: fortran/decl.c:3809 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: VALUE attribute at %C" - msgid "VALUE attribute at %C" - msgstr "Fortran 2003:%C处的 VALUE 属性" - - #: fortran/decl.c:3816 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: VOLATILE attribute at %C" - msgid "VOLATILE attribute at %C" - msgstr "Fortran 2003:%C处的 VOLATILE 属性" - -@@ -43302,7 +41998,6 @@ - - #: fortran/decl.c:4212 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Empty IMPLICIT statement at %C" - msgid "BIND(C) statement at %C" - msgstr "%C处 IMPLICIT è¯å¥ä¸ºç©º" - -@@ -43328,7 +42023,6 @@ - - #: fortran/decl.c:4475 fortran/primary.c:1717 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Expected alternate return label at %C" - msgid "Alternate-return argument at %C" - msgstr "%C处需è¦æ›¿ä»£çš„è¿”å›žæ ‡å·" - -@@ -43359,7 +42053,6 @@ - - #: fortran/decl.c:4687 fortran/decl.c:5753 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2008: BIND(C) attribute at %L may not be specified for an internal procedure" - msgid "BIND(C) attribute at %L may not be specified for an internal procedure" - msgstr "Fortran 2008:%L处的 BIND(C)属性对于内部过程ä¸å¯ä»¥æŒ‡å®š" - -@@ -43400,7 +42093,6 @@ - - #: fortran/decl.c:5031 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: Procedure pointer component at %C" - msgid "Procedure pointer component at %C" - msgstr "Fortran 2003:%C处的过程指针组件" - -@@ -43416,13 +42108,11 @@ - - #: fortran/decl.c:5130 fortran/decl.c:7325 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Syntax error in PROCEDURE statement at %C" - msgid "double colon in MODULE PROCEDURE statement at %L" - msgstr "%C处 PROCEDURE è¯å¥è¯æ³•é”™è¯¯" - - #: fortran/decl.c:5199 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: PROCEDURE statement at %C" - msgid "PROCEDURE statement at %C" - msgstr "Fortran 2003:%C处的 PROCEDURE è¯å¥" - -@@ -43440,7 +42130,6 @@ - - #: fortran/decl.c:5440 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Empty IMPLICIT statement at %C" - msgid "ENTRY statement at %C" - msgstr "%C处 IMPLICIT è¯å¥ä¸ºç©º" - -@@ -43562,13 +42251,11 @@ - - #: fortran/decl.c:6144 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Expecting %s statement at %C" - msgid "Expecting %s statement at %L" - msgstr "éœ€è¦ %s è¯å¥ï¼ŒäºŽ %C" - - #: fortran/decl.c:6162 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Expected block name of '%s' in %s statement at %C" - msgid "Expected block name of '%s' in %s statement at %L" - msgstr "需è¦å—å‘%s’在‘%s’表达å¼ä¸ï¼ŒäºŽ %C" - -@@ -43674,7 +42361,6 @@ - - #: fortran/decl.c:6834 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: PROTECTED statement at %C" - msgid "PROTECTED statement at %C" - msgstr "Fortran 2003:%C处的 PROTECTED è¯å¥" - -@@ -43740,7 +42426,6 @@ - - #: fortran/decl.c:7128 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: VALUE statement at %C" - msgid "VALUE statement at %C" - msgstr "Fortran 2003:%C处的 VALUE è¯å¥" - -@@ -43751,7 +42436,6 @@ - - #: fortran/decl.c:7177 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: VOLATILE statement at %C" - msgid "VOLATILE statement at %C" - msgstr "Fortran 2003:%C处的 VOLATILE è¯å¥" - -@@ -43767,7 +42451,6 @@ - - #: fortran/decl.c:7236 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: ASYNCHRONOUS statement at %C" - msgid "ASYNCHRONOUS statement at %C" - msgstr "Fortran 2003:%C处的 ASYNCHRONOUS è¯å¥" - -@@ -43793,7 +42476,6 @@ - - #: fortran/decl.c:7416 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Symbol '%s' at %C has already been host associated" - msgid "Symbol '%s' at %C has not been previously defined" - msgstr "%2$C处符å·â€˜%1$s’已ç»ä¸Žä¸»æœºç›¸å…³è”" - -@@ -43824,7 +42506,6 @@ - - #: fortran/decl.c:7492 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "ABSTRACT type '%s' used at %L" - msgid "ABSTRACT type at %C" - msgstr "%2$L处使用了 ABSTRACT 类型‘%1$s’" - -@@ -43855,7 +42536,6 @@ - - #: fortran/decl.c:7722 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: ENUM and ENUMERATOR at %C" - msgid "ENUM and ENUMERATOR at %C" - msgstr "Fortran 2003:%C处的 ENUM å’Œ ENUMERATOR" - -@@ -44171,7 +42851,6 @@ - - #: fortran/expr.c:2414 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Extension: Evaluation of nonstandard initialization expression at %L" - msgid "Evaluation of nonstandard initialization expression at %L" - msgstr "扩展:%L处求éžæ ‡é‡åˆå§‹åŒ–表达å¼çš„值" - -@@ -44302,19 +42981,16 @@ - - #: fortran/expr.c:3161 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "POINTER valued function appears on right-hand side of assignment at %L" - msgid "POINTER-valued function appears on right-hand side of assignment at %L" - msgstr "%L处赋值å³æ‰‹è¾¹å‡ºçŽ°å€¼ä¸º POINTER 的函数" - - #: fortran/expr.c:3171 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Extension: BOZ literal at %L used to initialize non-integer variable '%s'" - msgid "BOZ literal at %L used to initialize non-integer variable '%s'" - msgstr "扩展:%L处 BOZ å—é¢å€¼è¢«ç”¨æ¥åˆå§‹åŒ–éžæ•´æ•°å˜é‡â€˜%s’" - - #: fortran/expr.c:3176 fortran/resolve.c:9062 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Extension: BOZ literal at %L outside a DATA statement and outside INT/REAL/DBLE/CMPLX" - msgid "BOZ literal at %L outside a DATA statement and outside INT/REAL/DBLE/CMPLX" - msgstr "扩展:在 %L处的 BOZ å—é¢å€¼åœ¨ä¸€ä¸ª DATA è¯å¥ä¹‹å¤–并且也在 INT/REAL/DBLE/CMPLX 之外" - -@@ -44375,7 +43051,6 @@ - - #: fortran/expr.c:3343 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: Bounds specification for '%s' in pointer assignment at %L" - msgid "Bounds specification for '%s' in pointer assignment at %L" - msgstr "Fortran 2003:%2$L处指针赋值è¯å¥ä¸â€˜%1$sâ€™çš„è¾¹ç•Œè§„æ ¼" - -@@ -44406,7 +43081,6 @@ - - #: fortran/expr.c:3445 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Statement function '%s' is invalid in procedure pointer assignment at %L" - msgid "Function result '%s' is invalid as proc-target in procedure pointer assignment at %L" - msgstr "è¯å¥å‡½æ•°â€˜%s’在%L处的过程指针赋值ä¸æ˜¯éžæ³•çš„" - -@@ -44427,13 +43101,11 @@ - - #: fortran/expr.c:3477 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Internal procedure '%s' is invalid in procedure pointer assignment at %L" - msgid "Intrinsic '%s' at %L is invalid in procedure pointer assignment" - msgstr "内部过程‘%s’在%L处的过程指针赋值ä¸æ˜¯éžæ³•çš„" - - #: fortran/expr.c:3485 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Internal procedure '%s' is invalid in procedure pointer assignment at %L" - msgid "Nonintrinsic elemental procedure '%s' is invalid in procedure pointer assignment at %L" - msgstr "内部过程‘%s’在%L处的过程指针赋值ä¸æ˜¯éžæ³•çš„" - -@@ -44444,7 +43116,6 @@ - - #: fortran/expr.c:3564 fortran/expr.c:3571 fortran/resolve.c:2430 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "NOPASS or explicit interface required at %C" - msgid "Explicit interface required for '%s' at %L: %s" - msgstr "%Cå¤„éœ€è¦ NOPASS 或显å¼æŽ¥å£" - -@@ -44632,31 +43303,26 @@ - - #: fortran/frontend-passes.c:562 fortran/frontend-passes.c:565 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Return value of function '%s' at %L not set" - msgid "Removing call to function '%s' at %L" - msgstr "%2$L处函数‘%1$s’的返回值没有设置" - - #: fortran/frontend-passes.c:1668 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Variable '%s' at %C cannot be redefined inside loop beginning at %L" - msgid "Variable '%s' at %L set to undefined value inside loop beginning at %L as INTENT(OUT) argument to subroutine '%s'" - msgstr "å˜é‡â€˜%s’(ä½äºŽ %C)ä¸èƒ½åœ¨ä»Ž %L 开始的循环的内部é‡å®šä¹‰" - - #: fortran/frontend-passes.c:1674 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Variable '%s' at %C cannot be redefined inside loop beginning at %L" - msgid "Variable '%s' at %L not definable inside loop beginning at %L as INTENT(INOUT) argument to subroutine '%s'" - msgstr "å˜é‡â€˜%s’(ä½äºŽ %C)ä¸èƒ½åœ¨ä»Ž %L 开始的循环的内部é‡å®šä¹‰" - - #: fortran/frontend-passes.c:1738 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Variable '%s' at %C cannot be redefined inside loop beginning at %L" - msgid "Variable '%s' at %L set to undefined value inside loop beginning at %L as INTENT(OUT) argument to function '%s'" - msgstr "å˜é‡â€˜%s’(ä½äºŽ %C)ä¸èƒ½åœ¨ä»Ž %L 开始的循环的内部é‡å®šä¹‰" - - #: fortran/frontend-passes.c:1744 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Variable '%s' at %C cannot be redefined inside loop beginning at %L" - msgid "Variable '%s' at %L not definable inside loop beginning at %L as INTENT(INOUT) argument to function '%s'" - msgstr "å˜é‡â€˜%s’(ä½äºŽ %C)ä¸èƒ½åœ¨ä»Ž %L 开始的循环的内部é‡å®šä¹‰" - -@@ -44687,7 +43353,6 @@ - - #: fortran/interface.c:254 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: ABSTRACT INTERFACE at %C" - msgid "ABSTRACT INTERFACE at %C" - msgstr "Fortran 2003:%C处的 ABSTRACT INTERFACE" - -@@ -44803,7 +43468,6 @@ - - #: fortran/interface.c:1590 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Cray pointee '%s' in %s clause at %L" - msgid "Internal procedure '%s' in %s at %L" - msgstr "%3$L处 %2$s 分å¥ä¸ çš„Cray æŒ‡é’ˆç›®æ ‡â€˜%1$s’" - -@@ -44824,7 +43488,6 @@ - - #: fortran/interface.c:1893 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Assumed shape array at %L must be a dummy argument" - msgid "The assumed-rank array at %L requires that the dummy argument '%s' has assumed-rank" - msgstr "%L处å‡å®šå¤–形的数组必须是一个虚å‚" - -@@ -44865,7 +43528,6 @@ - - #: fortran/interface.c:2007 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Assumed-shape actual argument at %L is incompatible with the non-assumed-shape dummy argument '%s' due to VOLATILE attribute" - msgid "Assumed-type actual argument at %L requires that dummy argument '%s' is of assumed type" - msgstr "%L处å‡å®šå¤–形的实å‚由于 VOLATILE 属性而与éžå‡å®šå¤–形虚å‚‘%s’ä¸å…¼å®¹" - -@@ -45051,7 +43713,6 @@ - - #: fortran/interface.c:2843 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Actual argument for '%s' must be a pointer at %L" - msgid "Actual CLASS array argument for '%s' must be a full array at %L" - msgstr "‘%s’的实å‚在%L处必须是一个指针" - -@@ -45142,7 +43803,6 @@ - - #: fortran/interface.c:3298 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Symbol '%s' at %L already has an explicit interface" - msgid "Assumed-type argument %s at %L requires an explicit interface" - msgstr "符å·â€˜%s’在%L处已ç»æœ‰äº†æ˜¾å¼æŽ¥å£" - -@@ -45158,7 +43818,6 @@ - - #: fortran/interface.c:3328 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Keyword argument requires explicit interface for procedure '%s' at %L" - msgid "Assumed-rank argument requires an explicit interface at %L" - msgstr "%2$L处过程‘%1$s’的关键å—å‚æ•°è¦æ±‚显å¼çš„接å£" - -@@ -45179,7 +43838,6 @@ - - #: fortran/interface.c:3902 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Entity '%s' at %C is already present in the interface" - msgid "Entity '%s' at %L is already present in the interface" - msgstr "%2$C处实体‘%1$s’已ç»å‡ºçŽ°åœ¨æŽ¥å£ä¸" - -@@ -45225,7 +43883,6 @@ - - #: fortran/interface.c:4184 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Interface mismatch in dummy procedure '%s' at %L: %s" - msgid "Result mismatch for the overriding procedure '%s' at %L: %s" - msgstr "哑过程‘%s’接å£åœ¨%L处ä¸åŒ¹é…:%s" - -@@ -45241,7 +43898,6 @@ - - #: fortran/interface.c:4236 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Interface mismatch in dummy procedure '%s' at %L: %s" - msgid "Argument mismatch for the overriding procedure '%s' at %L: %s" - msgstr "哑过程‘%s’接å£åœ¨%L处ä¸åŒ¹é…:%s" - -@@ -45267,31 +43923,26 @@ - - #: fortran/intrinsic.c:196 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "NULL pointer at %L is not permitted as actual argument of '%s' intrinsic function" - msgid "Variable with NO_ARG_CHECK attribute at %L is only permitted as argument to the intrinsic functions C_LOC and PRESENT" - msgstr "%L çš„ NULL 指针ä¸èƒ½ç”¨ä½œå†…建函数‘%s’的实å‚" - - #: fortran/intrinsic.c:210 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "NULL pointer at %L is not permitted as actual argument of '%s' intrinsic function" - msgid "Assumed-type argument at %L is not permitted as actual argument to the intrinsic %s" - msgstr "%L çš„ NULL 指针ä¸èƒ½ç”¨ä½œå†…建函数‘%s’的实å‚" - - #: fortran/intrinsic.c:217 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "NULL pointer at %L is not permitted as actual argument of '%s' intrinsic function" - msgid "Assumed-type argument at %L is only permitted as first actual argument to the intrinsic %s" - msgstr "%L çš„ NULL 指针ä¸èƒ½ç”¨ä½œå†…建函数‘%s’的实å‚" - - #: fortran/intrinsic.c:224 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "NULL pointer at %L is not permitted as actual argument of '%s' intrinsic function" - msgid "Assumed-rank argument at %L is only permitted as actual argument to intrinsic inquiry functions" - msgstr "%L çš„ NULL 指针ä¸èƒ½ç”¨ä½œå†…建函数‘%s’的实å‚" - - #: fortran/intrinsic.c:231 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "NULL pointer at %L is not permitted as actual argument of '%s' intrinsic function" - msgid "Assumed-rank argument at %L is only permitted as first actual argument to the intrinsic inquiry function %s" - msgstr "%L çš„ NULL 指针ä¸èƒ½ç”¨ä½œå†…建函数‘%s’的实å‚" - -@@ -45342,19 +43993,16 @@ - - #: fortran/intrinsic.c:4255 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: Function '%s' as initialization expression at %L" - msgid "Function '%s' as initialization expression at %L" - msgstr "Fortran 2003:函数‘%s’在%L处用作åˆå§‹åŒ–表达å¼" - - #: fortran/intrinsic.c:4331 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: Elemental function as initialization expression with non-integer/non-character arguments at %L" - msgid "Elemental function as initialization expression with non-integer/non-character arguments at %L" - msgstr "Fortran 2003:作为åˆå§‹è¡¨è¾¾å¼çš„基本函数在%L处使用了éžæ•´æ•°æˆ–éžå—符的å‚æ•°" - - #: fortran/intrinsic.c:4402 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Subroutine call to intrinsic '%s' at %L is not PURE" - msgid "Subroutine call to intrinsic '%s' in DO CONCURRENT block at %L is not PURE" - msgstr "在%2$L处调用内建‘%1$s’的å例程ä¸æ˜¯ PURE" - -@@ -45395,25 +44043,21 @@ - - #: fortran/io.c:455 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: DP format specifier not allowed at %C" - msgid "DP format specifier not allowed at %C" - msgstr "Fortran 2003:ä¸å…许在%C处使用 DP æ ¼å¼é™å®šç¬¦" - - #: fortran/io.c:462 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: DC format specifier not allowed at %C" - msgid "DC format specifier not allowed at %C" - msgstr "Fortran 2003:ä¸å…许在%C处使用 DC æ ¼å¼é™å®šç¬¦" - - #: fortran/io.c:651 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Extension: X descriptor requires leading space count at %L" - msgid "X descriptor requires leading space count at %L" - msgstr "扩展:X æ述符在%L需è¦å‰å¯¼ç©ºæ ¼æ•°é‡" - - #: fortran/io.c:680 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Extension: $ descriptor at %L" - msgid "$ descriptor at %L" - msgstr "扩展:%L处的 $ æ述符" - -@@ -45429,7 +44073,6 @@ - - #: fortran/io.c:826 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2008: 'G0' in format at %L" - msgid "'G0' in format at %L" - msgstr "Fortran 2008:%Lå¤„æ ¼å¼ä¸çš„‘G0’" - -@@ -45455,7 +44098,6 @@ - - #: fortran/io.c:1059 fortran/io.c:1121 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Extension: Missing comma at %L" - msgid "Missing comma at %L" - msgstr "扩展:%L处缺少逗å·" - -@@ -45511,13 +44153,11 @@ - - #: fortran/io.c:1399 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "FORMAT tag at %L must be of type CHARACTER or INTEGER" - msgid "FORMAT tag at %L must be of type default-kind CHARACTER or of INTEGER" - msgstr "%L处 FORMAT æ ‡è®°å¿…é¡»å…·æœ‰ç±»åž‹ CHARACTER 或 INTEGER" - - #: fortran/io.c:1405 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Deleted feature: ASSIGNED variable in FORMAT tag at %L" - msgid "ASSIGNED variable in FORMAT tag at %L" - msgstr "å·²åˆ é™¤çš„ç‰¹æ€§ï¼š%L处 FORMAT æ ‡è®°ä¸æœ‰ ASSIGNED å˜é‡" - -@@ -45533,7 +44173,6 @@ - - #: fortran/io.c:1429 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Extension: Non-character in FORMAT tag at %L" - msgid "Non-character in FORMAT tag at %L" - msgstr "扩展:%L处的 FORMAT æ ‡è®°ä¸æœ‰éžå—符" - -@@ -45559,7 +44198,6 @@ - - #: fortran/io.c:1482 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Concat operator at %L must concatenate strings of the same kind" - msgid "%s tag at %L must be a character string of default kind" - msgstr "%L处的毗连è¿ç®—符必须毗连åŒä¸€ç§åˆ«çš„å—符串" - -@@ -45570,7 +44208,6 @@ - - #: fortran/io.c:1495 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: IOMSG tag at %L" - msgid "IOMSG tag at %L" - msgstr "Fortran 2003:%L处的 IOMSG æ ‡è®°" - -@@ -45586,13 +44223,11 @@ - - #: fortran/io.c:1516 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "UNIT not specified at %L" - msgid "NEWUNIT specifier at %L" - msgstr "%L没有指定 UNIT" - - #: fortran/io.c:1534 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Extension: CONVERT tag at %L" - msgid "CONVERT tag at %L" - msgstr "扩展:%L处的 CONVERT æ ‡è®°" - -@@ -45603,7 +44238,6 @@ - - #: fortran/io.c:1727 fortran/io.c:1754 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "%s specifier in %s statement at %C has invalid value '%s'" - msgid "%s specifier in %s statement at %C has value '%s'" - msgstr "为%3$C处 %2$s è¯å¥ä¸ %1$s 指定了éžæ³•çš„值‘%4$s’" - -@@ -45639,37 +44273,31 @@ - - #: fortran/io.c:1889 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: ASYNCHRONOUS= at %C not allowed in Fortran 95" - msgid "ASYNCHRONOUS= at %C not allowed in Fortran 95" - msgstr "Fortran 2003:%C处的 ASYNCHRONOUS= ä¸å…许用在 Fortran 95 ä¸" - - #: fortran/io.c:1907 fortran/io.c:3350 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: BLANK= at %C not allowed in Fortran 95" - msgid "BLANK= at %C not allowed in Fortran 95" - msgstr "Fortran 2003:%C处的 BLANK= ä¸å…许用在 Fortran 95 ä¸" - - #: fortran/io.c:1925 fortran/io.c:3329 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: DECIMAL= at %C not allowed in Fortran 95" - msgid "DECIMAL= at %C not allowed in Fortran 95" - msgstr "Fortran 2003:%C处的 DECIMAL= ä¸å…许用在 Fortran 95 ä¸" - - #: fortran/io.c:1957 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: ENCODING= at %C not allowed in Fortran 95" - msgid "ENCODING= at %C not allowed in Fortran 95" - msgstr "Fortran 2003:%C处的 ENCODING= ä¸å…许用在 Fortran 95 ä¸" - - #: fortran/io.c:2008 fortran/io.c:3392 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: ROUND= at %C not allowed in Fortran 95" - msgid "ROUND= at %C not allowed in Fortran 95" - msgstr "Fortran 2003:%C处的 ROUND= ä¸å…许用在 Fortran 95 ä¸" - - #: fortran/io.c:2028 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: SIGN= at %C not allowed in Fortran 95" - msgid "SIGN= at %C not allowed in Fortran 95" - msgstr "Fortran 2003:%C处的 SIGN= ä¸å…许用在 Fortran 95 ä¸" - -@@ -45680,7 +44308,6 @@ - - #: fortran/io.c:2301 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "ASSIGNED GOTO statement at %L requires an INTEGER variable" - msgid "CLOSE statement at %L requires a UNIT number" - msgstr "ASSIGNED GOTO è¯å¥åœ¨%L处需è¦ä¸€ä¸ª INTEGER å˜é‡" - -@@ -45701,7 +44328,6 @@ - - #: fortran/io.c:2474 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: FLUSH statement at %C" - msgid "FLUSH statement at %C" - msgstr "Fortran 2003:%C处的 FLUSH è¯å¥" - -@@ -45767,7 +44393,6 @@ - - #: fortran/io.c:2904 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Extension: Comma before i/o item list at %L" - msgid "Comma before i/o item list at %L" - msgstr "扩展:%L处 i/o 项目列表å‰çš„逗å·" - -@@ -45814,7 +44439,6 @@ - - #: fortran/io.c:3246 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: Internal file at %L with namelist" - msgid "Internal file at %L with namelist" - msgstr "Fortran 2003:%L处内部文件有åå—列表" - -@@ -45825,13 +44449,11 @@ - - #: fortran/io.c:3371 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: PAD= at %C not allowed in Fortran 95" - msgid "PAD= at %C not allowed in Fortran 95" - msgstr "Fortran 2003:%C处的 PAD= ä¸å…许用在 Fortran 95 ä¸" - - #: fortran/io.c:3437 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: DELIM= at %C not allowed in Fortran 95" - msgid "DELIM= at %C not allowed in Fortran 95" - msgstr "Fortran 2003:%C处的 DELIM= ä¸å…许用在 Fortran 95 ä¸" - -@@ -45877,7 +44499,6 @@ - - #: fortran/io.c:4188 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: WAIT at %C not allowed in Fortran 95" - msgid "WAIT at %C not allowed in Fortran 95" - msgstr "Fortran 2003:%C处的 WAIT ä¸å…许用在 Fortran 95 ä¸" - -@@ -45933,7 +44554,6 @@ - - #: fortran/match.c:560 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Invalid character '$' at %C. Use -fdollar-ok to allow it as an extension" - msgid "Invalid character '$' at %L. Use -fdollar-ok to allow it as an extension" - msgstr "%Cå¤„æ— æ•ˆçš„å—符‘$’。使用 -fdollar-ok 以å…许它作为一个扩展" - -@@ -45974,7 +44594,6 @@ - - #: fortran/match.c:1395 fortran/match.c:1475 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Obsolescent feature: Arithmetic IF statement at %C" - msgid "Arithmetic IF statement at %C" - msgstr "已过时的特性:%C处的算术 IF è¯å¥" - -@@ -46186,7 +44805,6 @@ - - #: fortran/match.c:2766 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Unexpected CASE statement at %C" - msgid "PAUSE statement at %C" - msgstr "%C处éžé¢„期的 CASE è¯å¥" - -@@ -46224,19 +44842,16 @@ - - #: fortran/match.c:2907 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Redundant SOURCE tag found at %L " - msgid "Redundant ACQUIRED_LOCK tag found at %L " - msgstr "%L有多余的 SOURCE æ ‡è®°" - - #: fortran/match.c:2972 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Empty IMPLICIT statement at %C" - msgid "LOCK statement at %C" - msgstr "%C处 IMPLICIT è¯å¥ä¸ºç©º" - - #: fortran/match.c:2982 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Empty IMPLICIT statement at %C" - msgid "UNLOCK statement at %C" - msgstr "%C处 IMPLICIT è¯å¥ä¸ºç©º" - -@@ -46262,13 +44877,11 @@ - - #: fortran/match.c:3211 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Deleted feature: ASSIGN statement at %C" - msgid "ASSIGN statement at %C" - msgstr "å·²åˆ é™¤çš„ç‰¹æ€§ï¼š%C处的 ASSIGN è¯å¥" - - #: fortran/match.c:3255 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Deleted feature: Assigned GOTO statement at %C" - msgid "Assigned GOTO statement at %C" - msgstr "å·²åˆ é™¤çš„ç‰¹æ€§ï¼š%C处赋值 GOTO è¯å¥" - -@@ -46279,7 +44892,6 @@ - - #: fortran/match.c:3360 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Obsolescent feature: Computed GOTO at %C" - msgid "Computed GOTO at %C" - msgstr "已过时的特性:%C处的计算转移 GOTO è¯å¥" - -@@ -46290,7 +44902,6 @@ - - #: fortran/match.c:3442 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: typespec in ALLOCATE at %L" - msgid "typespec in ALLOCATE at %L" - msgstr "Fortran 2003:%L处 ALLOCATE ä¸æœ‰ typespec" - -@@ -46331,13 +44942,11 @@ - - #: fortran/match.c:3607 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: ERRMSG tag at %L" - msgid "ERRMSG tag at %L" - msgstr "Fortran 2003:%L处的 ERRMSG æ ‡è®°" - - #: fortran/match.c:3630 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: SOURCE tag at %L" - msgid "SOURCE tag at %L" - msgstr "Fortran 2003:%L处的 SOURCE æ ‡è®°" - -@@ -46353,7 +44962,6 @@ - - #: fortran/match.c:3649 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "SOURCE tag at %L requires only a single entity in the allocation-list" - msgid "SOURCE tag at %L with more than a single allocate object" - msgstr "%L处的 SOURCE æ ‡è®°åœ¨åˆ†é…列表ä¸åªéœ€è¦ä¸€ä¸ªå•ç‹¬çš„实体" - -@@ -46409,13 +45017,11 @@ - - #: fortran/match.c:3906 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Allocate-object at %C is not a nonprocedure pointer or an allocatable variable" - msgid "Allocate-object at %C is not a nonprocedure pointer nor an allocatable variable" - msgstr "%C处的分é…对象ä¸æ˜¯ä¸€ä¸ªéžè¿‡ç¨‹æŒ‡é’ˆæˆ–å¯åˆ†é…çš„å˜é‡" - - #: fortran/match.c:3943 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: ERRMSG at %L" - msgid "ERRMSG at %L" - msgstr "Fortran 2003:%L处的 ERRMSG" - -@@ -46436,7 +45042,6 @@ - - #: fortran/match.c:4046 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Extension: RETURN statement in main program at %C" - msgid "RETURN statement in main program at %C" - msgstr "扩展:%C处 RETURN è¯å¥å‡ºçŽ°åœ¨ä¸»ç¨‹åºä¸" - -@@ -46545,7 +45150,6 @@ - - #: fortran/match.c:4941 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Statement function at %L is recursive" - msgid "Statement function at %C" - msgstr "%L处的è¯å¥å‡½æ•°æ˜¯é€’å½’çš„" - -@@ -46561,7 +45165,6 @@ - - #: fortran/match.c:5339 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Syntax error in PROTECTED statement at %C" - msgid "parse error in SELECT TYPE statement at %C" - msgstr "%C处 PROTECTED è¯å¥è¯æ³•é”™è¯¯" - -@@ -46638,7 +45241,6 @@ - - #: fortran/module.c:527 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: module nature in USE statement at %C" - msgid "module nature in USE statement at %C" - msgstr "Fortran 2003:%C处的 USE è¯å¥ä¸æ¨¡å—本性" - -@@ -46654,7 +45256,6 @@ - - #: fortran/module.c:562 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: \"USE :: module\" at %C" - msgid "\"USE :: module\" at %C" - msgstr "Fortran 2003:%C处的“USE :: moduleâ€" - -@@ -46665,7 +45266,6 @@ - - #: fortran/module.c:629 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: Renaming operators in USE statements at %C" - msgid "Renaming operators in USE statements at %C" - msgstr "Fortran 2003:%C处的 USE è¯å¥ä¸æ›´åè¿ç®—符" - -@@ -46701,7 +45301,6 @@ - - #: fortran/module.c:4494 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Name '%s' at %C is an ambiguous reference to '%s' from current program unit" - msgid "'%s' of module '%s', imported at %C, is also the name of the current program unit" - msgstr "%2$C处的åå—‘%1$s’是从当å‰ç¨‹åºå•å…ƒå¯¹â€˜%3$s’有æ§ä¹‰çš„引用" - -@@ -46778,13 +45377,11 @@ - - #: fortran/module.c:6307 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: ISO_FORTRAN_ENV intrinsic module at %C" - msgid "ISO_FORTRAN_ENV intrinsic module at %C" - msgstr "Fortran 2003:%C 处的 ISO_FORTRAN_ENV 内建模å—" - - #: fortran/module.c:6319 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: ISO_C_BINDING module at %C" - msgid "ISO_C_BINDING module at %C" - msgstr "Fortran 2003:%C处的 ISO_C_BINDING 模å—" - -@@ -46805,7 +45402,6 @@ - - #: fortran/module.c:6368 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "File '%s' opened at %C is not a GFORTRAN module file" - msgid "File '%s' opened at %C is not a GNU Fortran module file" - msgstr "%2$C处打开的文件的‘%1$s’并éžä¸€ä¸ª GFORTRAN 模å—文件" - -@@ -46906,7 +45502,6 @@ - - #: fortran/openmp.c:824 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "IF clause at %L requires a scalar LOGICAL expression" - msgid "FINAL clause at %L requires a scalar LOGICAL expression" - msgstr "%L处的 IF 分å¥éœ€è¦ä¸€ä¸ªæ ‡é‡ LOGICAL 表达å¼" - -@@ -47023,25 +45618,21 @@ - - #: fortran/openmp.c:1189 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "!$OMP ATOMIC statement must set a scalar variable of intrinsic type at %L" - msgid "!$OMP ATOMIC READ statement must read from a scalar variable of intrinsic type at %L" - msgstr "%L处 !$OMP ATOMIC è¯å¥å¿…é¡»è®¾å®šä¸€ä¸ªå†…å»ºç±»åž‹çš„æ ‡é‡å€¼" - - #: fortran/openmp.c:1194 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "expr in !$OMP ATOMIC assignment var = var op expr must be scalar and cannot reference var at %L" - msgid "expr in !$OMP ATOMIC WRITE assignment var = expr must be scalar and cannot reference var at %L" - msgstr "%L处 !$OMP ATOMIC 赋值“å˜é‡ = å˜é‡ è¿ç®—符 表达å¼â€ä¸çš„“表达å¼â€å¿…é¡»æ˜¯æ ‡é‡å¹¶ä¸”ä¸èƒ½å¼•ç”¨â€œå˜é‡â€" - - #: fortran/openmp.c:1216 fortran/openmp.c:1486 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "!$OMP ATOMIC statement must set a scalar variable of intrinsic type at %L" - msgid "!$OMP ATOMIC CAPTURE capture statement must read from a scalar variable of intrinsic type at %L" - msgstr "%L处 !$OMP ATOMIC è¯å¥å¿…é¡»è®¾å®šä¸€ä¸ªå†…å»ºç±»åž‹çš„æ ‡é‡å€¼" - - #: fortran/openmp.c:1231 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "!$OMP ATOMIC statement must set a scalar variable of intrinsic type at %L" - msgid "!$OMP ATOMIC CAPTURE update statement must set a scalar variable of intrinsic type at %L" - msgstr "%L处 !$OMP ATOMIC è¯å¥å¿…é¡»è®¾å®šä¸€ä¸ªå†…å»ºç±»åž‹çš„æ ‡é‡å€¼" - -@@ -47052,7 +45643,6 @@ - - #: fortran/openmp.c:1282 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "!$OMP ATOMIC assignment operator must be +, *, -, /, .AND., .OR., .EQV. or .NEQV. at %L" - msgid "!$OMP ATOMIC assignment operator must be binary +, *, -, /, .AND., .OR., .EQV. or .NEQV. at %L" - msgstr "%L处 !$OMP ATOMIC 赋值è¿ç®—符必须是 +ã€*ã€-ã€/ã€.AND.ã€.OR.ã€.EQV. 或 .NEQV." - -@@ -47103,7 +45693,6 @@ - - #: fortran/openmp.c:1464 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "!$OMP ATOMIC statement must set a scalar variable of intrinsic type at %L" - msgid "!$OMP ATOMIC CAPTURE capture statement must set a scalar variable of intrinsic type at %L" - msgstr "%L处 !$OMP ATOMIC è¯å¥å¿…é¡»è®¾å®šä¸€ä¸ªå†…å»ºç±»åž‹çš„æ ‡é‡å€¼" - -@@ -47199,7 +45788,6 @@ - - #: fortran/options.c:564 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Argument to -ffpe-trap is not valid: %s" - msgid "Argument to -ffpe-summary is not valid: %s" - msgstr "-ffpe-trap çš„å‚æ•°æ— æ•ˆï¼š%s" - -@@ -47340,25 +45928,21 @@ - - #: fortran/parse.c:1987 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: Type-bound procedure at %C" - msgid "Type-bound procedure at %C" - msgstr "Fortran 2003:%C处的类型é™å®šè¿‡ç¨‹" - - #: fortran/parse.c:1995 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Junk after GENERIC binding at %C" - msgid "GENERIC binding at %C" - msgstr "%C 处的泛型绑定åŽæœ‰åžƒåœ¾å—符" - - #: fortran/parse.c:2003 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: FINAL procedure declaration at %C" - msgid "FINAL procedure declaration at %C" - msgstr "Fortran 2003:%C处的的 FINAL 过程声明" - - #: fortran/parse.c:2015 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2008: Derived type definition at %C with empty CONTAINS section" - msgid "Derived type definition at %C with empty CONTAINS section" - msgstr "Fortran 2008:%C的派生类型定义有空的 CONTAINS 节" - -@@ -47394,7 +45978,6 @@ - - #: fortran/parse.c:2119 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: Derived type definition at %C without components" - msgid "Derived type definition at %C without components" - msgstr "Fortran 2003:%C处的派生类型定义没有组件" - -@@ -47420,7 +46003,6 @@ - - #: fortran/parse.c:2173 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: CONTAINS block in derived type definition at %C" - msgid "CONTAINS block in derived type definition at %C" - msgstr "Fortran 2003:%C处的派生类型定义ä¸çš„ CONTAINS å—" - -@@ -47436,7 +46018,6 @@ - - #: fortran/parse.c:2272 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Allocatable component of structure at %C must have a deferred shape" - msgid "Allocatable component %s at %L of type LOCK_TYPE must have a codimension" - msgstr "%C处å¯åˆ†é…的组件必须有延迟的外形" - -@@ -47487,7 +46068,6 @@ - - #: fortran/parse.c:2653 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "%s statement is not allowed inside of BLOCK at %C" - msgid "%s statement is not allowed inside of BLOCK DATA at %C" - msgstr "%s è¯å¥ä¸èƒ½ç”¨åœ¨%C处 BLOCK 内" - -@@ -47568,7 +46148,6 @@ - - #: fortran/parse.c:3372 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2008: BLOCK construct at %C" - msgid "BLOCK construct at %C" - msgstr "Fortran 2008:%C处的 BLOCK 结构" - -@@ -47604,7 +46183,6 @@ - - #: fortran/parse.c:3863 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "FORMAT statement at %L does not have a statement label" - msgid "DATA statement at %C after the first executable statement" - msgstr "%L处 FORMAT è¯å¥æ²¡æœ‰è¯å¥æ ‡å·" - -@@ -47620,7 +46198,6 @@ - - #: fortran/parse.c:4135 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2008: CONTAINS statement without FUNCTION or SUBROUTINE statement at %C" - msgid "CONTAINS statement without FUNCTION or SUBROUTINE statement at %C" - msgstr "Fortran 2008:%C处 CONTAINS è¯å¥æ²¡æœ‰ FUNCTION 或 SUBROUTINE è¯å¥" - -@@ -47631,7 +46208,6 @@ - - #: fortran/parse.c:4263 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Global name '%s' at %L is already being used as a %s at %L" - msgid "Global binding name '%s' at %L is already being used as a %s at %L" - msgstr "%2$L处的åå—‘%1$s’已ç»åœ¨%4$L处被用作 %3$s" - -@@ -47680,7 +46256,6 @@ - - #: fortran/primary.c:270 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Extension: Hollerith constant at %C" - msgid "Hollerith constant at %C" - msgstr "扩展:%C处的è·å‹’瑞斯常é‡" - -@@ -47701,7 +46276,6 @@ - - #: fortran/primary.c:393 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Extension: Hexadecimal constant at %C uses non-standard syntax" - msgid "Hexadecimal constant at %C uses non-standard syntax" - msgstr "扩展:%C处的åå…进制常é‡ä½¿ç”¨äº†éžæ ‡å‡†è¯æ³•" - -@@ -47717,7 +46291,6 @@ - - #: fortran/primary.c:431 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Extension: BOZ constant at %C uses non-standard postfix syntax" - msgid "BOZ constant at %C uses non-standard postfix syntax" - msgstr "扩展:%C处的 BOZ 常é‡ä½¿ç”¨äº†éžæ ‡å‡†çš„åŽåºè¯æ³•ã€‚" - -@@ -47728,7 +46301,6 @@ - - #: fortran/primary.c:467 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: BOZ used outside a DATA statement at %C" - msgid "BOZ used outside a DATA statement at %C" - msgstr "Fortran 2003:%C处的 BOZ 用在了 DATA è¯å¥ä¹‹å¤–" - -@@ -47739,7 +46311,6 @@ - - #: fortran/primary.c:561 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Extension: Hollerith constant at %C" - msgid "Extension: exponent-letter 'q' in real-literal-constant at %C" - msgstr "扩展:%C处的è·å‹’瑞斯常é‡" - -@@ -47755,13 +46326,11 @@ - - #: fortran/primary.c:663 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Real number at %C has a 'd' exponent and an explicit kind" - msgid "Real number at %C has a 'q' exponent and an explicit kind" - msgstr "%C处的实数有一个‘d’指数和一个显å¼çš„ç§åˆ«" - - #: fortran/primary.c:677 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Invalid initializer %s in Data statement at %C" - msgid "Invalid exponent-letter 'q' in real-literal-constant at %C" - msgstr "%2$C处 DATA è¯å¥åˆå§‹å€¼è®¾å®š %1$s æ— æ•ˆ" - -@@ -47822,7 +46391,6 @@ - - #: fortran/primary.c:1216 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Expected PARAMETER symbol in complex constant at %C" - msgid "PARAMETER symbol in complex constant at %C" - msgstr "%C处å¤æ•°å¸¸é‡ä¸éœ€è¦ PARAMETER 符å·" - -@@ -47843,7 +46411,6 @@ - - #: fortran/primary.c:1645 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Unknown argument list function at %L" - msgid "argument list function at %C" - msgstr "%L处å‚数列表函数未知" - -@@ -47874,13 +46441,11 @@ - - #: fortran/primary.c:1915 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Symbol '%s' at %L has no IMPLICIT type" - msgid "Symbol '%s' at %C has no IMPLICIT type" - msgstr "%2$L处的符å·â€˜%1$s’没有éšå¼ç±»åž‹" - - #: fortran/primary.c:1921 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Unexpected character in variable list at %C" - msgid "Unexpected '%%' for nonderived-type variable '%s' at %C" - msgstr "%C处å˜é‡åˆ—表ä¸æœ‰éžé¢„期的垃圾å—符" - -@@ -47906,7 +46471,6 @@ - - #: fortran/primary.c:2363 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: Structure constructor with missing optional arguments at %C" - msgid "Structure constructor with missing optional arguments at %C" - msgstr "Fortran 2003:%Cå¤„çš„ç»“æž„æž„é€ å‡½æ•°ä¸¢å¤±å¯é€‰çš„å‚æ•°" - -@@ -47917,31 +46481,26 @@ - - #: fortran/primary.c:2418 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Can't construct ABSTRACT type '%s' at %C" - msgid "Can't construct ABSTRACT type '%s' at %L" - msgstr "%2$Cå¤„æ— æ³•æž„å»º ABSTRACT 类型‘%1$s’" - - #: fortran/primary.c:2438 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: Structure constructor with named arguments at %C" - msgid "Structure constructor with named arguments at %C" - msgstr "Fortran 2003:%Cå¤„çš„ç»“æž„æž„é€ å‡½æ•°æœ‰æœ‰åçš„å‚æ•°" - - #: fortran/primary.c:2453 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Component initializer without name after component named %s at %C!" - msgid "Component initializer without name after component named %s at %L!" - msgstr "%2$C处å为 %1$s 的组件之åŽçš„组件åˆå§‹å€¼è®¾å®šæ²¡æœ‰åå—ï¼" - - #: fortran/primary.c:2458 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Too many components in structure constructor at %C!" - msgid "Too many components in structure constructor at %L!" - msgstr "%Cå¤„ç»“æž„æž„é€ å‡½æ•°ä¸ç»„件太多ï¼" - - #: fortran/primary.c:2495 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Component '%s' is initialized twice in the structure constructor at %C!" - msgid "Component '%s' is initialized twice in the structure constructor at %L!" - msgstr "%2$Cå¤„ç»“æž„æž„é€ å‡½æ•°ä¸ç»„件‘%1$s’被åˆå§‹åŒ–两次ï¼" - -@@ -48012,31 +46571,26 @@ - - #: fortran/resolve.c:145 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Interface '%s', used by procedure '%s' at %L, is declared in a later PROCEDURE statement" - msgid "Interface '%s' at %L is declared in a later PROCEDURE statement" - msgstr "为过程‘%2$s’在%3$L处使用的接å£â€˜%1$s’是在之åŽçš„ PROCEDURE è¯å¥ä¸å£°æ˜Žçš„" - - #: fortran/resolve.c:158 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Interface '%s' at %C may not be generic" - msgid "Interface '%s' at %L may not be generic" - msgstr "%2$C处的接å£â€˜%1$s’ä¸èƒ½æ˜¯æ³›åž‹" - - #: fortran/resolve.c:165 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Interface '%s' at %C may not be a statement function" - msgid "Interface '%s' at %L may not be a statement function" - msgstr "%2$C处的接å£â€˜%1$s’ä¸èƒ½æ˜¯ä¸ªè¯å¥å‡½æ•°" - - #: fortran/resolve.c:174 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Intrinsic procedure '%s' not allowed in PROCEDURE statement at %C" - msgid "Intrinsic procedure '%s' not allowed in PROCEDURE statement at %L" - msgstr "内建过程‘%s’ä¸å…许在 %C çš„ PROCEDURE è¯å¥ä¸" - - #: fortran/resolve.c:180 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Interface '%s' of procedure '%s' at %L must be explicit" - msgid "Interface '%s' at %L must be explicit" - msgstr "%3$L处过程‘%2$s’的接å£â€˜%1$s’必须是显å¼çš„" - -@@ -48057,7 +46611,6 @@ - - #: fortran/resolve.c:311 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Keyword argument '%s' at %L is not in the procedure" - msgid "Self-referential argument '%s' at %L is not allowed" - msgstr "%2$L处关键å—实å‚‘%1$s’ä¸åœ¨è¿‡ç¨‹é‡Œ" - -@@ -48148,7 +46701,6 @@ - - #: fortran/resolve.c:788 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Extension: Function %s at %L with entries returning variables of different string lengths" - msgid "Function %s at %L with entries returning variables of different string lengths" - msgstr "扩展:%2$L处函数 %1$s 有返回ä¸åŒå—符串长度的å˜é‡çš„表项" - -@@ -48219,7 +46771,6 @@ - - #: fortran/resolve.c:1001 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "COMMON block '%s' at %L is used as PARAMETER at %L" - msgid "COMMON block '%s' at %L uses the same global identifier as entity at %L" - msgstr "%2$L处的 COMMON å—‘%1$s’在%3$L处被用作 PARAMETER" - -@@ -48240,7 +46791,6 @@ - - #: fortran/resolve.c:1056 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Variable '%s' at %L cannot have both the POINTER and BIND(C) attributes" - msgid "COMMON block '%s' at %L can not have the EXTERNAL attribute" - msgstr "%2$L处å˜é‡â€˜%1$s’ä¸èƒ½æ—¢æœ‰ POINTER åˆæœ‰ BIND(C) 属性" - -@@ -48251,31 +46801,26 @@ - - #: fortran/resolve.c:1064 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: COMMON block '%s' at %L that is also a function result" - msgid "COMMON block '%s' at %L that is also a function result" - msgstr "Fortran 2003:%2$L处的 COMMON å—‘%1$s’也是一个函数返回值" - - #: fortran/resolve.c:1069 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: COMMON block '%s' at %L that is also a global procedure" - msgid "COMMON block '%s' at %L that is also a global procedure" - msgstr "Fortran 2003:%2$L处的 COMMON å—‘%1$s’也是一个全局过程" - - #: fortran/resolve.c:1152 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "The rank of the element in the derived type constructor at %L does not match that of the component (%d/%d)" - msgid "The rank of the element in the structure constructor at %L does not match that of the component (%d/%d)" - msgstr "%Lå¤„çš„æ´¾ç”Ÿç±»åž‹æž„é€ å‡½æ•°ä¸å…ƒç´ 的秩与该组件(%d/%d)çš„ä¸åŒ¹é…" - - #: fortran/resolve.c:1173 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "The element in the derived type constructor at %L, for pointer component '%s', is %s but should be %s" - msgid "The element in the structure constructor at %L, for pointer component '%s', is %s but should be %s" - msgstr "%L处指针组件‘%sâ€™çš„æ´¾ç”Ÿç±»åž‹æž„é€ å‡½æ•°ä¸çš„å…ƒç´ æ˜¯ %s 但应该是 %s" - - #: fortran/resolve.c:1258 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "The NULL in the derived type constructor at %L is being applied to component '%s', which is neither a POINTER nor ALLOCATABLE" - msgid "The NULL in the structure constructor at %L is being applied to component '%s', which is neither a POINTER nor ALLOCATABLE" - msgstr "%Lå¤„æ´¾ç”Ÿç±»åž‹æž„é€ å‡½æ•°ä¸çš„ NULL 被用在既ä¸æ˜¯ä¸€ä¸ªæŒ‡é’ˆä¹Ÿä¸æ˜¯ ALLOCATABLE 的组件‘%s’上" - -@@ -48286,7 +46831,6 @@ - - #: fortran/resolve.c:1308 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "The element in the derived type constructor at %L, for pointer component '%s' should be a POINTER or a TARGET" - msgid "The element in the structure constructor at %L, for pointer component '%s' should be a POINTER or a TARGET" - msgstr "%L处指针组件‘%sâ€™çš„æ´¾ç”Ÿç±»åž‹æž„é€ å‡½æ•°ä¸çš„å…ƒç´ åº”è¯¥æ˜¯ POINTER 或 TARGET" - -@@ -48297,7 +46841,6 @@ - - #: fortran/resolve.c:1336 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Invalid expression in the derived type constructor for pointer component '%s' at %L in PURE procedure" - msgid "Invalid expression in the structure constructor for pointer component '%s' at %L in PURE procedure" - msgstr "%2$L处指针组件‘%1$sâ€™çš„æ´¾ç”Ÿç±»åž‹æž„é€ å‡½æ•°ä¸è¡¨è¾¾å¼æ— 效" - -@@ -48418,7 +46961,6 @@ - - #: fortran/resolve.c:2442 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Interface mismatch in dummy procedure '%s' at %L: %s" - msgid "Interface mismatch in global procedure '%s' at %L: %s " - msgstr "哑过程‘%s’接å£åœ¨%L处ä¸åŒ¹é…:%s" - -@@ -48470,13 +47012,11 @@ - - #: fortran/resolve.c:2990 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "reference to non-PURE function '%s' at %L inside a FORALL %s" - msgid "Reference to non-PURE function '%s' at %L inside a FORALL %s" - msgstr "%2$Lå¤„å¯¹éž PURE 函数‘%1$s’的引用出现在 FORALL %3$s ä¸" - - #: fortran/resolve.c:2997 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "reference to non-PURE function '%s' at %L inside a FORALL %s" - msgid "Reference to non-PURE function '%s' at %L inside a DO CONCURRENT %s" - msgstr "%2$Lå¤„å¯¹éž PURE 函数‘%1$s’的引用出现在 FORALL %3$s ä¸" - -@@ -48502,7 +47042,6 @@ - - #: fortran/resolve.c:3069 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Subroutine call to '%s' in FORALL block at %L is not PURE" - msgid "Subroutine call to '%s' in DO CONCURRENT block at %L is not PURE" - msgstr "%2$L处 FORALL å—内对‘%1$s’å例程的调用ä¸æ˜¯ PURE" - -@@ -48628,7 +47167,6 @@ - - #: fortran/resolve.c:4129 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Extension: REAL array index at %L" - msgid "REAL array index at %L" - msgstr "扩展:%L处的 REAL 数组索引" - -@@ -48704,7 +47242,6 @@ - - #: fortran/resolve.c:4766 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Assumed shape array at %L must be a dummy argument" - msgid "Assumed-type variable %s at %L may only be used as actual argument" - msgstr "%L处å‡å®šå¤–形的数组必须是一个虚å‚" - -@@ -48719,7 +47256,6 @@ - - #: fortran/resolve.c:4791 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Assumed shape array at %L must be a dummy argument" - msgid "Assumed-rank variable %s at %L may only be used as actual argument" - msgstr "%L处å‡å®šå¤–形的数组必须是一个虚å‚" - -@@ -48825,7 +47361,6 @@ - - #: fortran/resolve.c:6292 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "DO loop at %L will be executed zero times" - msgid "DO loop at %L will be executed zero times (use -Wno-zerotrip to suppress)" - msgstr "%L处的 DO 循环会被执行零次" - -@@ -49070,7 +47605,6 @@ - - #: fortran/resolve.c:7966 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Unexpected use of subroutine name '%s' at %C" - msgid "Unexpected intrinsic type '%s' at %L" - msgstr "对å进程å‘%s’éžé¢„期的使用,在%C处" - -@@ -49086,7 +47620,6 @@ - - #: fortran/resolve.c:8256 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Invalid context for NULL() pointer at %%L" - msgid "Invalid context for NULL () intrinsic at %L" - msgstr "%%L处 NULL() æŒ‡é’ˆä¸Šä¸‹æ–‡æ— æ•ˆ" - -@@ -49098,7 +47631,6 @@ - - #: fortran/resolve.c:8296 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Data transfer element at %L cannot have POINTER components" - msgid "Data transfer element at %L cannot have POINTER components unless it is processed by a defined input/output procedure" - msgstr "%L处数æ®ä¼ è¾“å…ƒç´ ä¸èƒ½æœ‰ POINTER 组件" - -@@ -49109,7 +47641,6 @@ - - #: fortran/resolve.c:8312 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Data transfer element at %L cannot have ALLOCATABLE components" - msgid "Data transfer element at %L cannot have ALLOCATABLE components unless it is processed by a defined input/output procedure" - msgstr "%L处数æ®ä¼ è¾“å…ƒç´ ä¸èƒ½æœ‰ ALLOCATABLE 组件" - -@@ -49125,7 +47656,6 @@ - - #: fortran/resolve.c:8388 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Stat-variable at %L must be a scalar INTEGER variable" - msgid "Lock variable at %L must be a scalar of type LOCK_TYPE" - msgstr "%L处 stat å˜é‡å¿…é¡»æ˜¯ä¸€ä¸ªæ ‡é‡ INTEGER å˜é‡" - -@@ -49251,7 +47781,6 @@ - - #: fortran/resolve.c:9196 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Assignment to a FORALL index variable at %L" - msgid "Assignment to an allocatable polymorphic variable at %L" - msgstr "%Lå¤„å‘ FORALL 索引å˜é‡èµ‹å€¼" - -@@ -49318,7 +47847,6 @@ - - #: fortran/resolve.c:10180 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Binding label '%s' at %L collides with the global entity '%s' at %L" - msgid "Variable %s with binding label %s at %L uses the same global identifier as entity at %L" - msgstr "%2$Lå¤„çš„ç»‘å®šæ ‡å·â€˜%1$s’与 %4$L 处的全局实体‘%3$s’冲çª" - -@@ -49334,7 +47862,6 @@ - #. multiple checks for the same procedure. - #: fortran/resolve.c:10210 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Binding label '%s' at %L collides with the global entity '%s' at %L" - msgid "Procedure %s with binding label %s at %L uses the same global identifier as entity at %L" - msgstr "%2$Lå¤„çš„ç»‘å®šæ ‡å·â€˜%1$s’与 %4$L 处的全局实体‘%3$s’冲çª" - -@@ -49350,7 +47877,6 @@ - - #: fortran/resolve.c:10628 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Allocatable array '%s' at %L must have a deferred shape" - msgid "Allocatable array '%s' at %L must have a deferred shape or assumed rank" - msgstr "å¯åˆ†é…的数组‘%s’在%L处必须有延迟的外形" - -@@ -49361,7 +47887,6 @@ - - #: fortran/resolve.c:10640 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Array pointer '%s' at %L must have a deferred shape" - msgid "Array pointer '%s' at %L must have a deferred shape or assumed rank" - msgstr "数组指针‘%s’在%L处必须有延迟的外形" - -@@ -49387,7 +47912,6 @@ - - #: fortran/resolve.c:10730 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2008: Implied SAVE for module variable '%s' at %L, needed due to the default initialization" - msgid "Implied SAVE for module variable '%s' at %L, needed due to the default initialization" - msgstr "Fortran 2008:%2$L处模å—å˜é‡â€˜%1$s’éšå«ä½¿ç”¨äº† SAVEï¼Œå› ä¸ºé»˜è®¤åˆå§‹åŒ–有æ¤éœ€æ±‚" - -@@ -49415,7 +47939,6 @@ - - #: fortran/resolve.c:10830 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "'%s' at %L must have constant character length in this context" - msgid "COMMON variable '%s' at %L must have constant character length" - msgstr "å˜é‡â€˜%s’在%L处上下文ä¸å—符长度必须为常é‡" - -@@ -49456,13 +47979,11 @@ - - #: fortran/resolve.c:10958 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: '%s' is of a PRIVATE type and cannot be a dummy argument of '%s', which is PUBLIC at %L" - msgid "'%s' is of a PRIVATE type and cannot be a dummy argument of '%s', which is PUBLIC at %L" - msgstr "Fortran 2003:%3$L处‘%1$s’是 PRIVATE ç±»åž‹å› è€Œä¸èƒ½æ˜¯ PUBLIC 类型‘%2$s’的虚å‚" - - #: fortran/resolve.c:10980 fortran/resolve.c:11004 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: Procedure '%s' in PUBLIC interface '%s' at %L takes dummy arguments of '%s' which is PRIVATE" - msgid "Procedure '%s' in PUBLIC interface '%s' at %L takes dummy arguments of '%s' which is PRIVATE" - msgstr "Fortran 2003: %3$L处 PUBLIC 接å£â€˜%2$s’ä¸çš„过程‘%1$s’有 PRIVATE 的虚å‚‘%4$s’" - -@@ -49508,19 +48029,16 @@ - - #: fortran/resolve.c:11093 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "CHARACTER(*) function '%s' at %L cannot be pure" - msgid "CHARACTER(*) function '%s' at %L" - msgstr "CHARACTER(*) 函数‘%s’在%L处ä¸èƒ½ä¸ºçº¯å‡½æ•°" - - #: fortran/resolve.c:11102 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Procedure pointer component '%s' with PASS at %L must have at least one argument" - msgid "Procedure pointer '%s' at %L shall not be elemental" - msgstr "%2$L处的具有 PASS 的过程指针组件‘%1$s’必须至少有一个实å‚" - - #: fortran/resolve.c:11108 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Dummy procedure '%s' at %C cannot have a generic interface" - msgid "Dummy procedure '%s' at %L shall not be elemental" - msgstr "哑过程‘%s’在%C处ä¸èƒ½æœ‰æ³›åž‹æŽ¥å£" - -@@ -49766,7 +48284,6 @@ - - #: fortran/resolve.c:12356 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: the component '%s' is a PRIVATE type and cannot be a component of '%s', which is PUBLIC at %L" - msgid "the component '%s' is a PRIVATE type and cannot be a component of '%s', which is PUBLIC at %L" - msgstr "Fortran 2003:%3$L处组åˆâ€˜%1$s’是一个 PRIVATE ç±»åž‹ï¼Œå› æ¤ä¸èƒ½æ˜¯ PUBLIC‘%2$s’的组åˆ" - -@@ -49792,7 +48309,6 @@ - - #: fortran/resolve.c:12484 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Component '%s' of '%s' at %L has the same name as an inherited type-bound procedure" - msgid "Generic name '%s' of function '%s' at %L being the same name as derived type at %L" - msgstr "%3$L处‘%2$s’的组件‘%1$s’与一个继承的类型é™å®šè¿‡ç¨‹åŒå" - -@@ -49895,7 +48411,6 @@ - - #: fortran/resolve.c:12900 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Assumed shape array at %L must be a dummy argument" - msgid "Assumed-rank array at %L must be a dummy argument" - msgstr "%L处å‡å®šå¤–形的数组必须是一个虚å‚" - -@@ -49941,13 +48456,11 @@ - - #: fortran/resolve.c:12990 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Variable '%s' at %L cannot have both the ALLOCATABLE and BIND(C) attributes" - msgid "Variable %s at %L with NO_ARG_CHECK attribute may not have the ALLOCATABLE, CODIMENSION, POINTER or VALUE attribute" - msgstr "%2$L处å˜é‡â€˜%1$s’ä¸èƒ½æ—¢æœ‰ ALLOCATABLE åˆæœ‰ BIND(C) 属性" - - #: fortran/resolve.c:12998 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Variable '%s' at %L cannot have both the POINTER and BIND(C) attributes" - msgid "Variable %s at %L with NO_ARG_CHECK attribute may not have the INTENT(OUT) attribute" - msgstr "%2$L处å˜é‡â€˜%1$s’ä¸èƒ½æ—¢æœ‰ POINTER åˆæœ‰ BIND(C) 属性" - -@@ -49958,19 +48471,16 @@ - - #: fortran/resolve.c:13025 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Assumed shape array '%s' at %L is not permitted in an initialization expression" - msgid "Assumed type of variable %s at %L is only permitted for dummy variables" - msgstr "%2$L处å‡å®šå¤–形数组‘%1$s’ä¸èƒ½ç”¨åœ¨åˆå§‹åŒ–表达å¼ä¸" - - #: fortran/resolve.c:13032 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Variable '%s' at %L cannot have both the ALLOCATABLE and BIND(C) attributes" - msgid "Assumed-type variable %s at %L may not have the ALLOCATABLE, CODIMENSION, POINTER or VALUE attribute" - msgstr "%2$L处å˜é‡â€˜%1$s’ä¸èƒ½æ—¢æœ‰ ALLOCATABLE åˆæœ‰ BIND(C) 属性" - - #: fortran/resolve.c:13039 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Variable '%s' at %L cannot have both the POINTER and BIND(C) attributes" - msgid "Assumed-type variable %s at %L may not have the INTENT(OUT) attribute" - msgstr "%2$L处å˜é‡â€˜%1$s’ä¸èƒ½æ—¢æœ‰ POINTER åˆæœ‰ BIND(C) 属性" - -@@ -49986,7 +48496,6 @@ - - #: fortran/resolve.c:13151 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: PUBLIC %s '%s' at %L of PRIVATE derived type '%s'" - msgid "PUBLIC %s '%s' at %L of PRIVATE derived type '%s'" - msgstr "Fortran 2003:%3$L处 PUBLIC %1$s‘%2$s’具有 PRIVATE 派生类型‘%4$s’" - -@@ -50002,7 +48511,6 @@ - - #: fortran/resolve.c:13196 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Dummy argument '%s' at %L cannot be INTENT(OUT)" - msgid "Dummy argument '%s' at %L of LOCK_TYPE shall not be INTENT(OUT)" - msgstr "%2$L处的‘%1$s’虚å‚ä¸èƒ½æ˜¯ INTENT(OUT)" - -@@ -50178,7 +48686,6 @@ - - #: fortran/resolve.c:14338 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: PUBLIC function '%s' at %L of PRIVATE type '%s'" - msgid "PUBLIC function '%s' at %L of PRIVATE type '%s'" - msgstr "Fortran 2003:%2$L处 PRIVATE 类型‘%3$s’的 PUBLIC 函数‘%1$s’" - -@@ -50224,19 +48731,16 @@ - - #: fortran/scanner.c:327 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "ignoring duplicate directory \"%s\"\n" - msgid "Include directory \"%s\": %s" - msgstr "忽略é‡å¤çš„目录“%sâ€\n" - - #: fortran/scanner.c:333 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "ignoring nonexistent directory \"%s\"\n" - msgid "Nonexistent include directory \"%s\"" - msgstr "忽略ä¸å˜åœ¨çš„目录“%sâ€\n" - - #: fortran/scanner.c:339 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "%qD is not a type" - msgid "\"%s\" is not a directory" - msgstr "%qDä¸æ˜¯ä¸€ä¸ªç±»åž‹" - -@@ -50536,7 +49040,6 @@ - - #: fortran/symbol.c:474 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: Procedure pointer at %C" - msgid "Procedure pointer at %C" - msgstr "Fortran 2003:%C处的过程指针" - -@@ -50562,13 +49065,11 @@ - - #: fortran/symbol.c:767 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "%s attribute conflicts with %s attribute at %L" - msgid "%s attribute with %s attribute at %L" - msgstr "%s 属性与 %s 属性在%L处冲çª" - - #: fortran/symbol.c:773 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "%s attribute conflicts with %s attribute in '%s' at %L" - msgid "%s attribute with %s attribute in '%s' at %L" - msgstr "%s 属性与 %s 属性冲çªï¼Œåœ¨â€˜%s’ä¸ï¼Œä½äºŽ %L" - -@@ -50664,7 +49165,6 @@ - - #: fortran/symbol.c:1590 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: BIND(C) at %L" - msgid "BIND(C) at %L" - msgstr "Fortran 2003:%L处的 BIND(C)" - -@@ -50675,7 +49175,6 @@ - - #: fortran/symbol.c:1610 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Fortran 2003: EXTENDS at %L" - msgid "EXTENDS at %L" - msgstr "Fortran 2003:%L处的 EXTENDS" - -@@ -50771,7 +49270,6 @@ - - #: fortran/symbol.c:2270 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Expected terminating name at %C" - msgid "Shared DO termination label %d at %C" - msgstr "%C处需è¦ç»“æŸå" - -@@ -50868,7 +49366,6 @@ - - #: fortran/trans-common.c:400 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Named COMMON block '%s' at %L shall be of the same size" - msgid "Named COMMON block '%s' at %L shall be of the same size as elsewhere (%lu vs %lu bytes)" - msgstr "%2$L处的 COMMON å—‘%1$s’应该有åŒæ ·çš„大å°" - -@@ -50920,13 +49417,11 @@ - - #: fortran/trans-common.c:1167 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "COMMON '%s' at %L requires %d bytes of padding at start; reorder elements or use -fno-align-commons" - msgid "COMMON '%s' at %L requires %d bytes of padding; reorder elements or use -fno-align-commons" - msgstr "%2$L处的 COMMON‘%1$sâ€™éœ€è¦ %3$d å—节填充在开始处;é‡æŽ’åºå…ƒç´ 或使用 -fno-align-commons" - - #: fortran/trans-common.c:1171 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "COMMON at %L requires %d bytes of padding at start; reorder elements or use -fno-align-commons" - msgid "COMMON at %L requires %d bytes of padding; reorder elements or use -fno-align-commons" - msgstr "%L处的 COMMON éœ€è¦ %d å—节填充在开始处;é‡æŽ’åºå…ƒç´ 或使用 -fno-align-commons" - -@@ -50967,7 +49462,6 @@ - - #: fortran/trans-decl.c:4257 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Unused variable '%s' declared at %L" - msgid "Unused PRIVATE module variable '%s' declared at %L" - msgstr "%2$L处声明了未使用的å˜é‡â€˜%1$s’" - -@@ -50988,7 +49482,6 @@ - - #: fortran/trans-decl.c:4837 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Unused variable '%s' declared at %L" - msgid "Unused module variable '%s' which has been explicitly imported at %L" - msgstr "%2$L处声明了未使用的å˜é‡â€˜%1$s’" - -@@ -51004,7 +49497,6 @@ - - #: fortran/trans-decl.c:4896 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Unused parameter '%s' declared at %L" - msgid "Unused parameter '%s' which has been explicitly imported at %L" - msgstr "%2$L处声明了未使用的å‚数‘%1$s’" - -@@ -51066,37 +49558,31 @@ - - #: fortran/trans-types.c:496 - #, fuzzy, gcc-internal-format --#| msgid "integer kind=8 not available for -fdefault-integer-8 option" - msgid "INTEGER(KIND=8) is not available for -fdefault-integer-8 option" - msgstr "integer kind=8 在指定了 -fdefault-integer-8 选项时ä¸å¯ç”¨" - - #: fortran/trans-types.c:504 - #, fuzzy, gcc-internal-format --#| msgid "integer kind=8 not available for -fdefault-integer-8 option" - msgid "INTEGER(KIND=8) is not available for -finteger-4-integer-8 option" - msgstr "integer kind=8 在指定了 -fdefault-integer-8 选项时ä¸å¯ç”¨" - - #: fortran/trans-types.c:522 - #, fuzzy, gcc-internal-format --#| msgid "real kind=8 not available for -fdefault-real-8 option" - msgid "REAL(KIND=8) is not available for -fdefault-real-8 option" - msgstr "real kind=8 在指定了 -fdefault-real-8 选项时ä¸å¯ç”¨" - - #: fortran/trans-types.c:529 - #, fuzzy, gcc-internal-format --#| msgid "real kind=8 not available for -fdefault-real-8 option" - msgid "REAL(KIND=8) is not available for -freal-4-real-8 option" - msgstr "real kind=8 在指定了 -fdefault-real-8 选项时ä¸å¯ç”¨" - - #: fortran/trans-types.c:536 - #, fuzzy, gcc-internal-format --#| msgid "real kind=8 not available for -fdefault-real-8 option" - msgid "REAL(KIND=10) is not available for -freal-4-real-10 option" - msgstr "real kind=8 在指定了 -fdefault-real-8 选项时ä¸å¯ç”¨" - - #: fortran/trans-types.c:543 - #, fuzzy, gcc-internal-format --#| msgid "real kind=8 not available for -fdefault-real-8 option" - msgid "REAL(KIND=16) is not available for -freal-4-real-16 option" - msgstr "real kind=8 在指定了 -fdefault-real-8 选项时ä¸å¯ç”¨" - -@@ -51107,25 +49593,21 @@ - - #: fortran/trans-types.c:566 - #, fuzzy, gcc-internal-format --#| msgid "real kind=8 not available for -fdefault-real-8 option" - msgid "REAL(KIND=4) is not available for -freal-8-real-4 option" - msgstr "real kind=8 在指定了 -fdefault-real-8 选项时ä¸å¯ç”¨" - - #: fortran/trans-types.c:573 - #, fuzzy, gcc-internal-format --#| msgid "real kind=8 not available for -fdefault-real-8 option" - msgid "REAL(KIND=10) is not available for -freal-8-real-10 option" - msgstr "real kind=8 在指定了 -fdefault-real-8 选项时ä¸å¯ç”¨" - - #: fortran/trans-types.c:580 - #, fuzzy, gcc-internal-format --#| msgid "real kind=8 not available for -fdefault-real-8 option" - msgid "REAL(KIND=10) is not available for -freal-8-real-16 option" - msgstr "real kind=8 在指定了 -fdefault-real-8 选项时ä¸å¯ç”¨" - - #: fortran/trans-types.c:1458 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "Array element size too big" - msgid "Array element size too big at %C" - msgstr "æ•°ç»„å…ƒç´ å¤ªå¤§" - -@@ -51272,7 +49754,6 @@ - #. duplicate code from LOAD macro - #: java/expr.c:3549 - #, fuzzy, gcc-internal-format --#| msgid "unrecogized wide sub-instruction" - msgid "unrecognized wide sub-instruction" - msgstr "æ— æ³•è¯†åˆ«çš„å®½å指令" - -@@ -51570,19 +50051,16 @@ - - #: lto/lto.c:2302 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "cannot open %s" - msgid "Cannot open %s" - msgstr "ä¸èƒ½æ‰“å¼€ %s" - - #: lto/lto.c:2323 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "cannot open %s" - msgid "Cannot map %s" - msgstr "ä¸èƒ½æ‰“å¼€ %s" - - #: lto/lto.c:2334 - #, fuzzy, gcc-internal-format, gfc-internal-format --#| msgid "cannot open %s" - msgid "Cannot read %s" - msgstr "ä¸èƒ½æ‰“å¼€ %s" - -@@ -52006,7 +50484,6 @@ - - #: objc/objc-act.c:3964 objc/objc-act.c:3992 objc/objc-act.c:4048 - #, fuzzy, gcc-internal-format --#| msgid "unused variable %q+D" - msgid "duplicate instance variable %q+D" - msgstr "未使用的å˜é‡%q+D" - -@@ -52125,7 +50602,6 @@ - #. rtype is an IDENTIFIER_NODE at this point. - #: objc/objc-act.c:5398 objc/objc-act.c:5532 - #, fuzzy, gcc-internal-format --#| msgid "definition of protocol %qE not found" - msgid "@interface of class %qE not found" - msgstr "找ä¸åˆ°åè®®%qE的方法定义" - -Index: gcc/tree-nested.c -=================================================================== ---- a/src/gcc/tree-nested.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/tree-nested.c (.../branches/gcc-4_9-branch) -@@ -1082,6 +1082,15 @@ - need_stmts = true; - goto do_decl_clause; - -+ case OMP_CLAUSE_LINEAR: -+ if (OMP_CLAUSE_LINEAR_GIMPLE_SEQ (clause)) -+ need_stmts = true; -+ wi->val_only = true; -+ wi->is_lhs = false; -+ convert_nonlocal_reference_op (&OMP_CLAUSE_LINEAR_STEP (clause), -+ &dummy, wi); -+ goto do_decl_clause; -+ - case OMP_CLAUSE_PRIVATE: - case OMP_CLAUSE_FIRSTPRIVATE: - case OMP_CLAUSE_COPYPRIVATE: -@@ -1107,12 +1116,66 @@ - case OMP_CLAUSE_FINAL: - case OMP_CLAUSE_IF: - case OMP_CLAUSE_NUM_THREADS: -+ case OMP_CLAUSE_DEPEND: -+ case OMP_CLAUSE_DEVICE: -+ case OMP_CLAUSE_NUM_TEAMS: -+ case OMP_CLAUSE_THREAD_LIMIT: -+ case OMP_CLAUSE_SAFELEN: - wi->val_only = true; - wi->is_lhs = false; - convert_nonlocal_reference_op (&OMP_CLAUSE_OPERAND (clause, 0), -- &dummy, wi); -+ &dummy, wi); - break; - -+ case OMP_CLAUSE_DIST_SCHEDULE: -+ if (OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause) != NULL) -+ { -+ wi->val_only = true; -+ wi->is_lhs = false; -+ convert_nonlocal_reference_op (&OMP_CLAUSE_OPERAND (clause, 0), -+ &dummy, wi); -+ } -+ break; -+ -+ case OMP_CLAUSE_MAP: -+ case OMP_CLAUSE_TO: -+ case OMP_CLAUSE_FROM: -+ if (OMP_CLAUSE_SIZE (clause)) -+ { -+ wi->val_only = true; -+ wi->is_lhs = false; -+ convert_nonlocal_reference_op (&OMP_CLAUSE_SIZE (clause), -+ &dummy, wi); -+ } -+ if (DECL_P (OMP_CLAUSE_DECL (clause))) -+ goto do_decl_clause; -+ wi->val_only = true; -+ wi->is_lhs = false; -+ walk_tree (&OMP_CLAUSE_DECL (clause), convert_nonlocal_reference_op, -+ wi, NULL); -+ break; -+ -+ case OMP_CLAUSE_ALIGNED: -+ if (OMP_CLAUSE_ALIGNED_ALIGNMENT (clause)) -+ { -+ wi->val_only = true; -+ wi->is_lhs = false; -+ convert_nonlocal_reference_op -+ (&OMP_CLAUSE_ALIGNED_ALIGNMENT (clause), &dummy, wi); -+ } -+ /* Like do_decl_clause, but don't add any suppression. */ -+ decl = OMP_CLAUSE_DECL (clause); -+ if (TREE_CODE (decl) == VAR_DECL -+ && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))) -+ break; -+ if (decl_function_context (decl) != info->context) -+ { -+ OMP_CLAUSE_DECL (clause) = get_nonlocal_debug_decl (info, decl); -+ if (OMP_CLAUSE_CODE (clause) != OMP_CLAUSE_PRIVATE) -+ need_chain = true; -+ } -+ break; -+ - case OMP_CLAUSE_NOWAIT: - case OMP_CLAUSE_ORDERED: - case OMP_CLAUSE_DEFAULT: -@@ -1120,6 +1183,7 @@ - case OMP_CLAUSE_COLLAPSE: - case OMP_CLAUSE_UNTIED: - case OMP_CLAUSE_MERGEABLE: -+ case OMP_CLAUSE_PROC_BIND: - break; - - default: -@@ -1157,6 +1221,12 @@ - &OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (clause)); - break; - -+ case OMP_CLAUSE_LINEAR: -+ walk_body (convert_nonlocal_reference_stmt, -+ convert_nonlocal_reference_op, info, -+ &OMP_CLAUSE_LINEAR_GIMPLE_SEQ (clause)); -+ break; -+ - default: - break; - } -@@ -1304,10 +1374,42 @@ - break; - - case GIMPLE_OMP_TARGET: -+ if (gimple_omp_target_kind (stmt) != GF_OMP_TARGET_KIND_REGION) -+ { -+ save_suppress = info->suppress_expansion; -+ convert_nonlocal_omp_clauses (gimple_omp_target_clauses_ptr (stmt), -+ wi); -+ info->suppress_expansion = save_suppress; -+ walk_body (convert_nonlocal_reference_stmt, -+ convert_nonlocal_reference_op, info, -+ gimple_omp_body_ptr (stmt)); -+ break; -+ } - save_suppress = info->suppress_expansion; -- convert_nonlocal_omp_clauses (gimple_omp_target_clauses_ptr (stmt), wi); -+ if (convert_nonlocal_omp_clauses (gimple_omp_target_clauses_ptr (stmt), -+ wi)) -+ { -+ tree c, decl; -+ decl = get_chain_decl (info); -+ c = build_omp_clause (gimple_location (stmt), OMP_CLAUSE_MAP); -+ OMP_CLAUSE_DECL (c) = decl; -+ OMP_CLAUSE_MAP_KIND (c) = OMP_CLAUSE_MAP_TO; -+ OMP_CLAUSE_SIZE (c) = DECL_SIZE_UNIT (decl); -+ OMP_CLAUSE_CHAIN (c) = gimple_omp_target_clauses (stmt); -+ gimple_omp_target_set_clauses (stmt, c); -+ } -+ -+ save_local_var_chain = info->new_local_var_chain; -+ info->new_local_var_chain = NULL; -+ - walk_body (convert_nonlocal_reference_stmt, convert_nonlocal_reference_op, - info, gimple_omp_body_ptr (stmt)); -+ -+ if (info->new_local_var_chain) -+ declare_vars (info->new_local_var_chain, -+ gimple_seq_first_stmt (gimple_omp_body (stmt)), -+ false); -+ info->new_local_var_chain = save_local_var_chain; - info->suppress_expansion = save_suppress; - break; - -@@ -1605,6 +1707,15 @@ - need_stmts = true; - goto do_decl_clause; - -+ case OMP_CLAUSE_LINEAR: -+ if (OMP_CLAUSE_LINEAR_GIMPLE_SEQ (clause)) -+ need_stmts = true; -+ wi->val_only = true; -+ wi->is_lhs = false; -+ convert_local_reference_op (&OMP_CLAUSE_LINEAR_STEP (clause), &dummy, -+ wi); -+ goto do_decl_clause; -+ - case OMP_CLAUSE_PRIVATE: - case OMP_CLAUSE_FIRSTPRIVATE: - case OMP_CLAUSE_COPYPRIVATE: -@@ -1635,6 +1746,11 @@ - case OMP_CLAUSE_FINAL: - case OMP_CLAUSE_IF: - case OMP_CLAUSE_NUM_THREADS: -+ case OMP_CLAUSE_DEPEND: -+ case OMP_CLAUSE_DEVICE: -+ case OMP_CLAUSE_NUM_TEAMS: -+ case OMP_CLAUSE_THREAD_LIMIT: -+ case OMP_CLAUSE_SAFELEN: - wi->val_only = true; - wi->is_lhs = false; - convert_local_reference_op (&OMP_CLAUSE_OPERAND (clause, 0), &dummy, -@@ -1641,6 +1757,60 @@ - wi); - break; - -+ case OMP_CLAUSE_DIST_SCHEDULE: -+ if (OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause) != NULL) -+ { -+ wi->val_only = true; -+ wi->is_lhs = false; -+ convert_local_reference_op (&OMP_CLAUSE_OPERAND (clause, 0), -+ &dummy, wi); -+ } -+ break; -+ -+ case OMP_CLAUSE_MAP: -+ case OMP_CLAUSE_TO: -+ case OMP_CLAUSE_FROM: -+ if (OMP_CLAUSE_SIZE (clause)) -+ { -+ wi->val_only = true; -+ wi->is_lhs = false; -+ convert_local_reference_op (&OMP_CLAUSE_SIZE (clause), -+ &dummy, wi); -+ } -+ if (DECL_P (OMP_CLAUSE_DECL (clause))) -+ goto do_decl_clause; -+ wi->val_only = true; -+ wi->is_lhs = false; -+ walk_tree (&OMP_CLAUSE_DECL (clause), convert_local_reference_op, -+ wi, NULL); -+ break; -+ -+ case OMP_CLAUSE_ALIGNED: -+ if (OMP_CLAUSE_ALIGNED_ALIGNMENT (clause)) -+ { -+ wi->val_only = true; -+ wi->is_lhs = false; -+ convert_local_reference_op -+ (&OMP_CLAUSE_ALIGNED_ALIGNMENT (clause), &dummy, wi); -+ } -+ /* Like do_decl_clause, but don't add any suppression. */ -+ decl = OMP_CLAUSE_DECL (clause); -+ if (TREE_CODE (decl) == VAR_DECL -+ && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))) -+ break; -+ if (decl_function_context (decl) == info->context -+ && !use_pointer_in_frame (decl)) -+ { -+ tree field = lookup_field_for_decl (info, decl, NO_INSERT); -+ if (field) -+ { -+ OMP_CLAUSE_DECL (clause) -+ = get_local_debug_decl (info, decl, field); -+ need_frame = true; -+ } -+ } -+ break; -+ - case OMP_CLAUSE_NOWAIT: - case OMP_CLAUSE_ORDERED: - case OMP_CLAUSE_DEFAULT: -@@ -1648,6 +1818,7 @@ - case OMP_CLAUSE_COLLAPSE: - case OMP_CLAUSE_UNTIED: - case OMP_CLAUSE_MERGEABLE: -+ case OMP_CLAUSE_PROC_BIND: - break; - - default: -@@ -1685,6 +1856,12 @@ - &OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (clause)); - break; - -+ case OMP_CLAUSE_LINEAR: -+ walk_body (convert_local_reference_stmt, -+ convert_local_reference_op, info, -+ &OMP_CLAUSE_LINEAR_GIMPLE_SEQ (clause)); -+ break; -+ - default: - break; - } -@@ -1763,10 +1940,38 @@ - break; - - case GIMPLE_OMP_TARGET: -+ if (gimple_omp_target_kind (stmt) != GF_OMP_TARGET_KIND_REGION) -+ { -+ save_suppress = info->suppress_expansion; -+ convert_local_omp_clauses (gimple_omp_target_clauses_ptr (stmt), wi); -+ info->suppress_expansion = save_suppress; -+ walk_body (convert_local_reference_stmt, convert_local_reference_op, -+ info, gimple_omp_body_ptr (stmt)); -+ break; -+ } - save_suppress = info->suppress_expansion; -- convert_local_omp_clauses (gimple_omp_target_clauses_ptr (stmt), wi); -- walk_body (convert_local_reference_stmt, convert_local_reference_op, -- info, gimple_omp_body_ptr (stmt)); -+ if (convert_local_omp_clauses (gimple_omp_target_clauses_ptr (stmt), wi)) -+ { -+ tree c; -+ (void) get_frame_type (info); -+ c = build_omp_clause (gimple_location (stmt), OMP_CLAUSE_MAP); -+ OMP_CLAUSE_DECL (c) = info->frame_decl; -+ OMP_CLAUSE_MAP_KIND (c) = OMP_CLAUSE_MAP_TOFROM; -+ OMP_CLAUSE_SIZE (c) = DECL_SIZE_UNIT (info->frame_decl); -+ OMP_CLAUSE_CHAIN (c) = gimple_omp_target_clauses (stmt); -+ gimple_omp_target_set_clauses (stmt, c); -+ } -+ -+ save_local_var_chain = info->new_local_var_chain; -+ info->new_local_var_chain = NULL; -+ -+ walk_body (convert_local_reference_stmt, convert_local_reference_op, info, -+ gimple_omp_body_ptr (stmt)); -+ -+ if (info->new_local_var_chain) -+ declare_vars (info->new_local_var_chain, -+ gimple_seq_first_stmt (gimple_omp_body (stmt)), false); -+ info->new_local_var_chain = save_local_var_chain; - info->suppress_expansion = save_suppress; - break; - -@@ -2067,6 +2272,13 @@ - break; - } - -+ case GIMPLE_OMP_TARGET: -+ if (gimple_omp_target_kind (stmt) != GF_OMP_TARGET_KIND_REGION) -+ { -+ *handled_ops_p = false; -+ return NULL_TREE; -+ } -+ /* FALLTHRU */ - case GIMPLE_OMP_PARALLEL: - case GIMPLE_OMP_TASK: - { -@@ -2087,7 +2299,6 @@ - default: - *handled_ops_p = false; - return NULL_TREE; -- break; - } - - *handled_ops_p = true; -@@ -2159,6 +2370,42 @@ - info->static_chain_added |= save_static_chain_added; - break; - -+ case GIMPLE_OMP_TARGET: -+ if (gimple_omp_target_kind (stmt) != GF_OMP_TARGET_KIND_REGION) -+ { -+ walk_body (convert_gimple_call, NULL, info, gimple_omp_body_ptr (stmt)); -+ break; -+ } -+ save_static_chain_added = info->static_chain_added; -+ info->static_chain_added = 0; -+ walk_body (convert_gimple_call, NULL, info, gimple_omp_body_ptr (stmt)); -+ for (i = 0; i < 2; i++) -+ { -+ tree c, decl; -+ if ((info->static_chain_added & (1 << i)) == 0) -+ continue; -+ decl = i ? get_chain_decl (info) : info->frame_decl; -+ /* Don't add CHAIN.* or FRAME.* twice. */ -+ for (c = gimple_omp_target_clauses (stmt); -+ c; -+ c = OMP_CLAUSE_CHAIN (c)) -+ if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP -+ && OMP_CLAUSE_DECL (c) == decl) -+ break; -+ if (c == NULL) -+ { -+ c = build_omp_clause (gimple_location (stmt), OMP_CLAUSE_MAP); -+ OMP_CLAUSE_DECL (c) = decl; -+ OMP_CLAUSE_MAP_KIND (c) -+ = i ? OMP_CLAUSE_MAP_TO : OMP_CLAUSE_MAP_TOFROM; -+ OMP_CLAUSE_SIZE (c) = DECL_SIZE_UNIT (decl); -+ OMP_CLAUSE_CHAIN (c) = gimple_omp_target_clauses (stmt); -+ gimple_omp_target_set_clauses (stmt, c); -+ } -+ } -+ info->static_chain_added |= save_static_chain_added; -+ break; -+ - case GIMPLE_OMP_FOR: - walk_body (convert_gimple_call, NULL, info, - gimple_omp_for_pre_body_ptr (stmt)); -@@ -2166,7 +2413,6 @@ - case GIMPLE_OMP_SECTIONS: - case GIMPLE_OMP_SECTION: - case GIMPLE_OMP_SINGLE: -- case GIMPLE_OMP_TARGET: - case GIMPLE_OMP_TEAMS: - case GIMPLE_OMP_MASTER: - case GIMPLE_OMP_TASKGROUP: -Index: gcc/ira-costs.c -=================================================================== ---- a/src/gcc/ira-costs.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/ira-costs.c (.../branches/gcc-4_9-branch) -@@ -407,6 +407,8 @@ - int alt; - int i, j, k; - int insn_allows_mem[MAX_RECOG_OPERANDS]; -+ move_table *move_in_cost, *move_out_cost; -+ short (*mem_cost)[2]; - - for (i = 0; i < n_ops; i++) - insn_allows_mem[i] = 0; -@@ -517,42 +519,79 @@ - bool in_p = recog_data.operand_type[i] != OP_OUT; - bool out_p = recog_data.operand_type[i] != OP_IN; - enum reg_class op_class = classes[i]; -- move_table *move_in_cost, *move_out_cost; - - ira_init_register_move_cost_if_necessary (mode); - if (! in_p) - { - ira_assert (out_p); -- move_out_cost = ira_may_move_out_cost[mode]; -- for (k = cost_classes_ptr->num - 1; k >= 0; k--) -+ if (op_class == NO_REGS) - { -- rclass = cost_classes[k]; -- pp_costs[k] -- = move_out_cost[op_class][rclass] * frequency; -+ mem_cost = ira_memory_move_cost[mode]; -+ for (k = cost_classes_ptr->num - 1; k >= 0; k--) -+ { -+ rclass = cost_classes[k]; -+ pp_costs[k] = mem_cost[rclass][0] * frequency; -+ } - } -+ else -+ { -+ move_out_cost = ira_may_move_out_cost[mode]; -+ for (k = cost_classes_ptr->num - 1; k >= 0; k--) -+ { -+ rclass = cost_classes[k]; -+ pp_costs[k] -+ = move_out_cost[op_class][rclass] * frequency; -+ } -+ } - } - else if (! out_p) - { - ira_assert (in_p); -- move_in_cost = ira_may_move_in_cost[mode]; -- for (k = cost_classes_ptr->num - 1; k >= 0; k--) -+ if (op_class == NO_REGS) - { -- rclass = cost_classes[k]; -- pp_costs[k] -- = move_in_cost[rclass][op_class] * frequency; -+ mem_cost = ira_memory_move_cost[mode]; -+ for (k = cost_classes_ptr->num - 1; k >= 0; k--) -+ { -+ rclass = cost_classes[k]; -+ pp_costs[k] = mem_cost[rclass][1] * frequency; -+ } - } -+ else -+ { -+ move_in_cost = ira_may_move_in_cost[mode]; -+ for (k = cost_classes_ptr->num - 1; k >= 0; k--) -+ { -+ rclass = cost_classes[k]; -+ pp_costs[k] -+ = move_in_cost[rclass][op_class] * frequency; -+ } -+ } - } - else - { -- move_in_cost = ira_may_move_in_cost[mode]; -- move_out_cost = ira_may_move_out_cost[mode]; -- for (k = cost_classes_ptr->num - 1; k >= 0; k--) -+ if (op_class == NO_REGS) - { -- rclass = cost_classes[k]; -- pp_costs[k] = ((move_in_cost[rclass][op_class] -- + move_out_cost[op_class][rclass]) -- * frequency); -+ mem_cost = ira_memory_move_cost[mode]; -+ for (k = cost_classes_ptr->num - 1; k >= 0; k--) -+ { -+ rclass = cost_classes[k]; -+ pp_costs[k] = ((mem_cost[rclass][0] -+ + mem_cost[rclass][1]) -+ * frequency); -+ } - } -+ else -+ { -+ move_in_cost = ira_may_move_in_cost[mode]; -+ move_out_cost = ira_may_move_out_cost[mode]; -+ for (k = cost_classes_ptr->num - 1; k >= 0; k--) -+ { -+ rclass = cost_classes[k]; -+ pp_costs[k] = ((move_in_cost[rclass][op_class] -+ + move_out_cost[op_class][rclass]) -+ * frequency); -+ } -+ } - } - - /* If the alternative actually allows memory, make -@@ -762,10 +801,11 @@ - into that class. */ - if (REG_P (op) && REGNO (op) >= FIRST_PSEUDO_REGISTER) - { -- if (classes[i] == NO_REGS) -+ if (classes[i] == NO_REGS && ! allows_mem[i]) - { - /* We must always fail if the operand is a REG, but -- we did not find a suitable class. -+ we did not find a suitable class and memory is -+ not allowed. - - Otherwise we may perform an uninitialized read - from this_op_costs after the `continue' statement -@@ -782,51 +822,94 @@ - bool in_p = recog_data.operand_type[i] != OP_OUT; - bool out_p = recog_data.operand_type[i] != OP_IN; - enum reg_class op_class = classes[i]; -- move_table *move_in_cost, *move_out_cost; - - ira_init_register_move_cost_if_necessary (mode); - if (! in_p) - { - ira_assert (out_p); -- move_out_cost = ira_may_move_out_cost[mode]; -- for (k = cost_classes_ptr->num - 1; k >= 0; k--) -+ if (op_class == NO_REGS) - { -- rclass = cost_classes[k]; -- pp_costs[k] -- = move_out_cost[op_class][rclass] * frequency; -+ mem_cost = ira_memory_move_cost[mode]; -+ for (k = cost_classes_ptr->num - 1; k >= 0; k--) -+ { -+ rclass = cost_classes[k]; -+ pp_costs[k] = mem_cost[rclass][0] * frequency; -+ } - } -+ else -+ { -+ move_out_cost = ira_may_move_out_cost[mode]; -+ for (k = cost_classes_ptr->num - 1; k >= 0; k--) -+ { -+ rclass = cost_classes[k]; -+ pp_costs[k] -+ = move_out_cost[op_class][rclass] * frequency; -+ } -+ } - } - else if (! out_p) - { - ira_assert (in_p); -- move_in_cost = ira_may_move_in_cost[mode]; -- for (k = cost_classes_ptr->num - 1; k >= 0; k--) -+ if (op_class == NO_REGS) - { -- rclass = cost_classes[k]; -- pp_costs[k] -- = move_in_cost[rclass][op_class] * frequency; -+ mem_cost = ira_memory_move_cost[mode]; -+ for (k = cost_classes_ptr->num - 1; k >= 0; k--) -+ { -+ rclass = cost_classes[k]; -+ pp_costs[k] = mem_cost[rclass][1] * frequency; -+ } - } -+ else -+ { -+ move_in_cost = ira_may_move_in_cost[mode]; -+ for (k = cost_classes_ptr->num - 1; k >= 0; k--) -+ { -+ rclass = cost_classes[k]; -+ pp_costs[k] -+ = move_in_cost[rclass][op_class] * frequency; -+ } -+ } - } - else - { -- move_in_cost = ira_may_move_in_cost[mode]; -- move_out_cost = ira_may_move_out_cost[mode]; -- for (k = cost_classes_ptr->num - 1; k >= 0; k--) -+ if (op_class == NO_REGS) - { -- rclass = cost_classes[k]; -- pp_costs[k] = ((move_in_cost[rclass][op_class] -- + move_out_cost[op_class][rclass]) -- * frequency); -+ mem_cost = ira_memory_move_cost[mode]; -+ for (k = cost_classes_ptr->num - 1; k >= 0; k--) -+ { -+ rclass = cost_classes[k]; -+ pp_costs[k] = ((mem_cost[rclass][0] -+ + mem_cost[rclass][1]) -+ * frequency); -+ } - } -+ else -+ { -+ move_in_cost = ira_may_move_in_cost[mode]; -+ move_out_cost = ira_may_move_out_cost[mode]; -+ for (k = cost_classes_ptr->num - 1; k >= 0; k--) -+ { -+ rclass = cost_classes[k]; -+ pp_costs[k] = ((move_in_cost[rclass][op_class] -+ + move_out_cost[op_class][rclass]) -+ * frequency); -+ } -+ } - } - -- /* If the alternative actually allows memory, make -- things a bit cheaper since we won't need an extra -- insn to load it. */ -- pp->mem_cost -- = ((out_p ? ira_memory_move_cost[mode][op_class][0] : 0) -- + (in_p ? ira_memory_move_cost[mode][op_class][1] : 0) -- - allows_mem[i]) * frequency; -+ if (op_class == NO_REGS) -+ /* Although we don't need insn to reload from -+ memory, still accessing memory is usually more -+ expensive than a register. */ -+ pp->mem_cost = frequency; -+ else -+ /* If the alternative actually allows memory, make -+ things a bit cheaper since we won't need an -+ extra insn to load it. */ -+ pp->mem_cost -+ = ((out_p ? ira_memory_move_cost[mode][op_class][0] : 0) -+ + (in_p ? ira_memory_move_cost[mode][op_class][1] : 0) -+ - allows_mem[i]) * frequency; - /* If we have assigned a class to this allocno in - our first pass, add a cost to this alternative - corresponding to what we would add if this -@@ -836,15 +919,28 @@ - enum reg_class pref_class = pref[COST_INDEX (REGNO (op))]; - - if (pref_class == NO_REGS) -+ { -+ if (op_class != NO_REGS) -+ alt_cost -+ += ((out_p -+ ? ira_memory_move_cost[mode][op_class][0] -+ : 0) -+ + (in_p -+ ? ira_memory_move_cost[mode][op_class][1] -+ : 0)); -+ } -+ else if (op_class == NO_REGS) - alt_cost - += ((out_p -- ? ira_memory_move_cost[mode][op_class][0] : 0) -+ ? ira_memory_move_cost[mode][pref_class][1] -+ : 0) - + (in_p -- ? ira_memory_move_cost[mode][op_class][1] -+ ? ira_memory_move_cost[mode][pref_class][0] - : 0)); - else if (ira_reg_class_intersect[pref_class][op_class] - == NO_REGS) -- alt_cost += ira_register_move_cost[mode][pref_class][op_class]; -+ alt_cost += (ira_register_move_cost -+ [mode][pref_class][op_class]); - } - } - } -Index: gcc/tree-inline.c -=================================================================== ---- a/src/gcc/tree-inline.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/tree-inline.c (.../branches/gcc-4_9-branch) -@@ -1485,6 +1485,11 @@ - /* Create a new deep copy of the statement. */ - copy = gimple_copy (stmt); - -+ /* Clear flags that need revisiting. */ -+ if (is_gimple_call (copy) -+ && gimple_call_tail_p (copy)) -+ gimple_call_set_tail (copy, false); -+ - /* Remap the region numbers for __builtin_eh_{pointer,filter}, - RESX and EH_DISPATCH. */ - if (id->eh_map) -@@ -3119,7 +3124,8 @@ - { - var = return_slot; - gcc_assert (TREE_CODE (var) != SSA_NAME); -- TREE_ADDRESSABLE (var) |= TREE_ADDRESSABLE (result); -+ if (TREE_ADDRESSABLE (result)) -+ mark_addressable (var); - } - if ((TREE_CODE (TREE_TYPE (result)) == COMPLEX_TYPE - || TREE_CODE (TREE_TYPE (result)) == VECTOR_TYPE) -Index: gcc/tree-streamer-in.c -=================================================================== ---- a/src/gcc/tree-streamer-in.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/tree-streamer-in.c (.../branches/gcc-4_9-branch) -@@ -167,6 +167,9 @@ - REAL_VALUE_TYPE r; - REAL_VALUE_TYPE *rp; - -+ /* Clear all bits of the real value type so that we can later do -+ bitwise comparisons to see if two values are the same. */ -+ memset (&r, 0, sizeof r); - r.cl = (unsigned) bp_unpack_value (bp, 2); - r.decimal = (unsigned) bp_unpack_value (bp, 1); - r.sign = (unsigned) bp_unpack_value (bp, 1); -Index: gcc/symtab.c -=================================================================== ---- a/src/gcc/symtab.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/symtab.c (.../branches/gcc-4_9-branch) -@@ -323,16 +323,11 @@ - *slot = node; - } - --/* Remove node from symbol table. This function is not used directly, but via -- cgraph/varpool node removal routines. */ -+/* Remove NODE from same comdat group. */ - - void --symtab_unregister_node (symtab_node *node) -+symtab_remove_from_same_comdat_group (symtab_node *node) - { -- void **slot; -- ipa_remove_all_references (&node->ref_list); -- ipa_remove_all_referring (&node->ref_list); -- - if (node->same_comdat_group) - { - symtab_node *prev; -@@ -346,7 +341,20 @@ - prev->same_comdat_group = node->same_comdat_group; - node->same_comdat_group = NULL; - } -+} - -+/* Remove node from symbol table. This function is not used directly, but via -+ cgraph/varpool node removal routines. */ -+ -+void -+symtab_unregister_node (symtab_node *node) -+{ -+ void **slot; -+ ipa_remove_all_references (&node->ref_list); -+ ipa_remove_all_referring (&node->ref_list); -+ -+ symtab_remove_from_same_comdat_group (node); -+ - if (node->previous) - node->previous->next = node->next; - else -@@ -829,6 +837,16 @@ - error ("non-DECL_ONE_ONLY node in a same_comdat_group list"); - error_found = true; - } -+ if (DECL_COMDAT_GROUP (n->decl) != DECL_COMDAT_GROUP (node->same_comdat_group->decl)) -+ { -+ error ("same_comdat_group list across different groups"); -+ error_found = true; -+ } -+ if (!n->definition) -+ { -+ error ("Node has same_comdat_group but it is not a definition"); -+ error_found = true; -+ } - if (n->type != node->type) - { - error ("mixing different types of symbol in same comdat groups is not supported"); -Index: gcc/combine.c -=================================================================== ---- a/src/gcc/combine.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/combine.c (.../branches/gcc-4_9-branch) -@@ -11987,7 +11987,7 @@ - = (unsigned HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1); - op0 = simplify_gen_binary (AND, tmode, - gen_lowpart (tmode, op0), -- gen_int_mode (sign, mode)); -+ gen_int_mode (sign, tmode)); - code = (code == LT) ? NE : EQ; - break; - } -Index: gcc/tree-vect-generic.c -=================================================================== ---- a/src/gcc/tree-vect-generic.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/tree-vect-generic.c (.../branches/gcc-4_9-branch) -@@ -971,7 +971,8 @@ - - if (!optimize - || !VECTOR_INTEGER_TYPE_P (type) -- || TREE_CODE (rhs2) != VECTOR_CST) -+ || TREE_CODE (rhs2) != VECTOR_CST -+ || !VECTOR_MODE_P (TYPE_MODE (type))) - break; - - ret = expand_vector_divmod (gsi, type, rhs1, rhs2, code); -@@ -1335,6 +1336,59 @@ - update_stmt (gsi_stmt (*gsi)); - } - -+/* Return type in which CODE operation with optab OP can be -+ computed. */ -+ -+static tree -+get_compute_type (enum tree_code code, optab op, tree type) -+{ -+ /* For very wide vectors, try using a smaller vector mode. */ -+ tree compute_type = type; -+ if (op -+ && (!VECTOR_MODE_P (TYPE_MODE (type)) -+ || optab_handler (op, TYPE_MODE (type)) == CODE_FOR_nothing)) -+ { -+ tree vector_compute_type -+ = type_for_widest_vector_mode (TREE_TYPE (type), op); -+ if (vector_compute_type != NULL_TREE -+ && (TYPE_VECTOR_SUBPARTS (vector_compute_type) -+ < TYPE_VECTOR_SUBPARTS (compute_type)) -+ && (optab_handler (op, TYPE_MODE (vector_compute_type)) -+ != CODE_FOR_nothing)) -+ compute_type = vector_compute_type; -+ } -+ -+ /* If we are breaking a BLKmode vector into smaller pieces, -+ type_for_widest_vector_mode has already looked into the optab, -+ so skip these checks. */ -+ if (compute_type == type) -+ { -+ enum machine_mode compute_mode = TYPE_MODE (compute_type); -+ if (VECTOR_MODE_P (compute_mode)) -+ { -+ if (op && optab_handler (op, compute_mode) != CODE_FOR_nothing) -+ return compute_type; -+ if (code == MULT_HIGHPART_EXPR -+ && can_mult_highpart_p (compute_mode, -+ TYPE_UNSIGNED (compute_type))) -+ return compute_type; -+ } -+ /* There is no operation in hardware, so fall back to scalars. */ -+ compute_type = TREE_TYPE (type); -+ } -+ -+ return compute_type; -+} -+ -+/* Helper function of expand_vector_operations_1. Return number of -+ vector elements for vector types or 1 for other types. */ -+ -+static inline int -+count_type_subparts (tree type) -+{ -+ return VECTOR_TYPE_P (type) ? TYPE_VECTOR_SUBPARTS (type) : 1; -+} -+ - /* Process one statement. If we identify a vector operation, expand it. */ - - static void -@@ -1341,9 +1395,8 @@ - expand_vector_operations_1 (gimple_stmt_iterator *gsi) - { - gimple stmt = gsi_stmt (*gsi); -- tree lhs, rhs1, rhs2 = NULL, type, compute_type; -+ tree lhs, rhs1, rhs2 = NULL, type, compute_type = NULL_TREE; - enum tree_code code; -- enum machine_mode compute_mode; - optab op = unknown_optab; - enum gimple_rhs_class rhs_class; - tree new_rhs; -@@ -1456,11 +1509,76 @@ - { - op = optab_for_tree_code (code, type, optab_scalar); - -+ compute_type = get_compute_type (code, op, type); -+ if (compute_type == type) -+ return; - /* The rtl expander will expand vector/scalar as vector/vector -- if necessary. Don't bother converting the stmt here. */ -- if (optab_handler (op, TYPE_MODE (type)) == CODE_FOR_nothing -- && optab_handler (opv, TYPE_MODE (type)) != CODE_FOR_nothing) -+ if necessary. Pick one with wider vector type. */ -+ tree compute_vtype = get_compute_type (code, opv, type); -+ if (count_type_subparts (compute_vtype) -+ > count_type_subparts (compute_type)) -+ { -+ compute_type = compute_vtype; -+ op = opv; -+ } -+ } -+ -+ if (code == LROTATE_EXPR || code == RROTATE_EXPR) -+ { -+ if (compute_type == NULL_TREE) -+ compute_type = get_compute_type (code, op, type); -+ if (compute_type == type) - return; -+ /* Before splitting vector rotates into scalar rotates, -+ see if we can't use vector shifts and BIT_IOR_EXPR -+ instead. For vector by vector rotates we'd also -+ need to check BIT_AND_EXPR and NEGATE_EXPR, punt there -+ for now, fold doesn't seem to create such rotates anyway. */ -+ if (compute_type == TREE_TYPE (type) -+ && !VECTOR_INTEGER_TYPE_P (TREE_TYPE (rhs2))) -+ { -+ optab oplv = vashl_optab, opl = ashl_optab; -+ optab oprv = vlshr_optab, opr = lshr_optab, opo = ior_optab; -+ tree compute_lvtype = get_compute_type (LSHIFT_EXPR, oplv, type); -+ tree compute_rvtype = get_compute_type (RSHIFT_EXPR, oprv, type); -+ tree compute_otype = get_compute_type (BIT_IOR_EXPR, opo, type); -+ tree compute_ltype = get_compute_type (LSHIFT_EXPR, opl, type); -+ tree compute_rtype = get_compute_type (RSHIFT_EXPR, opr, type); -+ /* The rtl expander will expand vector/scalar as vector/vector -+ if necessary. Pick one with wider vector type. */ -+ if (count_type_subparts (compute_lvtype) -+ > count_type_subparts (compute_ltype)) -+ { -+ compute_ltype = compute_lvtype; -+ opl = oplv; -+ } -+ if (count_type_subparts (compute_rvtype) -+ > count_type_subparts (compute_rtype)) -+ { -+ compute_rtype = compute_rvtype; -+ opr = oprv; -+ } -+ /* Pick the narrowest type from LSHIFT_EXPR, RSHIFT_EXPR and -+ BIT_IOR_EXPR. */ -+ compute_type = compute_ltype; -+ if (count_type_subparts (compute_type) -+ > count_type_subparts (compute_rtype)) -+ compute_type = compute_rtype; -+ if (count_type_subparts (compute_type) -+ > count_type_subparts (compute_otype)) -+ compute_type = compute_otype; -+ /* Verify all 3 operations can be performed in that type. */ -+ if (compute_type != TREE_TYPE (type)) -+ { -+ if (optab_handler (opl, TYPE_MODE (compute_type)) -+ == CODE_FOR_nothing -+ || optab_handler (opr, TYPE_MODE (compute_type)) -+ == CODE_FOR_nothing -+ || optab_handler (opo, TYPE_MODE (compute_type)) -+ == CODE_FOR_nothing) -+ compute_type = TREE_TYPE (type); -+ } -+ } - } - } - else -@@ -1474,38 +1592,10 @@ - && INTEGRAL_TYPE_P (TREE_TYPE (type))) - op = optab_for_tree_code (MINUS_EXPR, type, optab_default); - -- /* For very wide vectors, try using a smaller vector mode. */ -- compute_type = type; -- if (!VECTOR_MODE_P (TYPE_MODE (type)) && op) -- { -- tree vector_compute_type -- = type_for_widest_vector_mode (TREE_TYPE (type), op); -- if (vector_compute_type != NULL_TREE -- && (TYPE_VECTOR_SUBPARTS (vector_compute_type) -- < TYPE_VECTOR_SUBPARTS (compute_type)) -- && (optab_handler (op, TYPE_MODE (vector_compute_type)) -- != CODE_FOR_nothing)) -- compute_type = vector_compute_type; -- } -- -- /* If we are breaking a BLKmode vector into smaller pieces, -- type_for_widest_vector_mode has already looked into the optab, -- so skip these checks. */ -+ if (compute_type == NULL_TREE) -+ compute_type = get_compute_type (code, op, type); - if (compute_type == type) -- { -- compute_mode = TYPE_MODE (compute_type); -- if (VECTOR_MODE_P (compute_mode)) -- { -- if (op && optab_handler (op, compute_mode) != CODE_FOR_nothing) -- return; -- if (code == MULT_HIGHPART_EXPR -- && can_mult_highpart_p (compute_mode, -- TYPE_UNSIGNED (compute_type))) -- return; -- } -- /* There is no operation in hardware, so fall back to scalars. */ -- compute_type = TREE_TYPE (type); -- } -+ return; - - gcc_assert (code != VEC_LSHIFT_EXPR && code != VEC_RSHIFT_EXPR); - new_rhs = expand_vector_operation (gsi, type, compute_type, stmt, code); -Index: gcc/config.gcc -=================================================================== ---- a/src/gcc/config.gcc (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config.gcc (.../branches/gcc-4_9-branch) -@@ -1021,7 +1021,7 @@ - ;; - esac - tmake_file="${tmake_file} arm/t-arm arm/t-arm-elf arm/t-bpabi arm/t-linux-eabi" -- tm_file="$tm_file arm/bpabi.h arm/linux-eabi.h arm/aout.h arm/arm.h" -+ tm_file="$tm_file arm/bpabi.h arm/linux-eabi.h arm/aout.h vxworks-dummy.h arm/arm.h" - # Define multilib configuration for arm-linux-androideabi. - case ${target} in - *-androideabi) -@@ -2131,7 +2131,6 @@ - tm_file="dbxelf.h elfos.h newlib-stdint.h ${tm_file}" - c_target_objs="msp430-c.o" - cxx_target_objs="msp430-c.o" -- target_has_targetm_common=no - tmake_file="${tmake_file} msp430/t-msp430" - ;; - nds32le-*-*) -Index: gcc/tree-ssa-structalias.c -=================================================================== ---- a/src/gcc/tree-ssa-structalias.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/tree-ssa-structalias.c (.../branches/gcc-4_9-branch) -@@ -6091,6 +6091,10 @@ - pt->ipa_escaped = 1; - else - pt->escaped = 1; -+ /* Expand some special vars of ESCAPED in-place here. */ -+ varinfo_t evi = get_varinfo (find (escaped_id)); -+ if (bitmap_bit_p (evi->solution, nonlocal_id)) -+ pt->nonlocal = 1; - } - else if (vi->id == nonlocal_id) - pt->nonlocal = 1; -@@ -7264,10 +7268,7 @@ - tree ptr; - struct function *fn; - unsigned i; -- varinfo_t fi; - basic_block bb; -- struct pt_solution uses, clobbers; -- struct cgraph_edge *e; - - /* Nodes without a body are not interesting. */ - if (!cgraph_function_with_gimple_body_p (node) || node->clone_of) -@@ -7283,21 +7284,6 @@ - find_what_p_points_to (ptr); - } - -- /* Compute the call-use and call-clobber sets for all direct calls. */ -- fi = lookup_vi_for_tree (node->decl); -- gcc_assert (fi->is_fn_info); -- clobbers -- = find_what_var_points_to (first_vi_for_offset (fi, fi_clobbers)); -- uses = find_what_var_points_to (first_vi_for_offset (fi, fi_uses)); -- for (e = node->callers; e; e = e->next_caller) -- { -- if (!e->call_stmt) -- continue; -- -- *gimple_call_clobber_set (e->call_stmt) = clobbers; -- *gimple_call_use_set (e->call_stmt) = uses; -- } -- - /* Compute the call-use and call-clobber sets for indirect calls - and calls to external functions. */ - FOR_EACH_BB_FN (bb, fn) -@@ -7308,18 +7294,28 @@ - { - gimple stmt = gsi_stmt (gsi); - struct pt_solution *pt; -- varinfo_t vi; -+ varinfo_t vi, fi; - tree decl; - - if (!is_gimple_call (stmt)) - continue; - -- /* Handle direct calls to external functions. */ -+ /* Handle direct calls to functions with body. */ - decl = gimple_call_fndecl (stmt); - if (decl -- && (!(fi = lookup_vi_for_tree (decl)) -- || !fi->is_fn_info)) -+ && (fi = lookup_vi_for_tree (decl)) -+ && fi->is_fn_info) - { -+ *gimple_call_clobber_set (stmt) -+ = find_what_var_points_to -+ (first_vi_for_offset (fi, fi_clobbers)); -+ *gimple_call_use_set (stmt) -+ = find_what_var_points_to -+ (first_vi_for_offset (fi, fi_uses)); -+ } -+ /* Handle direct calls to external functions. */ -+ else if (decl) -+ { - pt = gimple_call_use_set (stmt); - if (gimple_call_flags (stmt) & ECF_CONST) - memset (pt, 0, sizeof (struct pt_solution)); -@@ -7362,10 +7358,9 @@ - pt->nonlocal = 1; - } - } -- - /* Handle indirect calls. */ -- if (!decl -- && (fi = get_fi_for_callee (stmt))) -+ else if (!decl -+ && (fi = get_fi_for_callee (stmt))) - { - /* We need to accumulate all clobbers/uses of all possible - callees. */ -Index: gcc/tree-core.h -=================================================================== ---- a/src/gcc/tree-core.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/tree-core.h (.../branches/gcc-4_9-branch) -@@ -987,7 +987,7 @@ - SSA_NAME_IN_FREELIST in - SSA_NAME - -- VAR_DECL_NONALIASED in -+ DECL_NONALIASED in - VAR_DECL - - deprecated_flag: -@@ -1127,6 +1127,11 @@ - array sections. OMP_CLAUSE_SIZE for these is not the pointer size, - which is implicitly POINTER_SIZE / BITS_PER_UNIT, but the bias. */ - OMP_CLAUSE_MAP_POINTER, -+ /* Also internal, behaves like OMP_CLAUS_MAP_TO, but additionally any -+ OMP_CLAUSE_MAP_POINTER records consecutive after it which have addresses -+ falling into that range will not be ignored if OMP_CLAUSE_MAP_TO_PSET -+ wasn't mapped already. */ -+ OMP_CLAUSE_MAP_TO_PSET, - OMP_CLAUSE_MAP_LAST - }; - -Index: gcc/passes.c -=================================================================== ---- a/src/gcc/passes.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/passes.c (.../branches/gcc-4_9-branch) -@@ -2109,20 +2109,6 @@ - } - } - --/* Callback for do_per_function to apply all IPA transforms. */ -- --static void --apply_ipa_transforms (void *data) --{ -- struct cgraph_node *node = cgraph_get_node (current_function_decl); -- if (!node->global.inlined_to && node->ipa_transforms_to_apply.exists ()) -- { -- *(bool *)data = true; -- execute_all_ipa_transforms (); -- rebuild_cgraph_edges (); -- } --} -- - /* Check if PASS is explicitly disabled or enabled and return - the gate status. FUNC is the function to be processed, and - GATE_STATUS is the gate status determined by pass manager by -@@ -2194,8 +2180,26 @@ - Apply all trnasforms first. */ - if (pass->type == SIMPLE_IPA_PASS) - { -+ struct cgraph_node *node; - bool applied = false; -- do_per_function (apply_ipa_transforms, (void *)&applied); -+ FOR_EACH_DEFINED_FUNCTION (node) -+ if (node->analyzed -+ && cgraph_function_with_gimple_body_p (node) -+ && (!node->clone_of || node->decl != node->clone_of->decl)) -+ { -+ if (!node->global.inlined_to -+ && node->ipa_transforms_to_apply.exists ()) -+ { -+ cgraph_get_body (node); -+ push_cfun (DECL_STRUCT_FUNCTION (node->decl)); -+ execute_all_ipa_transforms (); -+ rebuild_cgraph_edges (); -+ free_dominance_info (CDI_DOMINATORS); -+ free_dominance_info (CDI_POST_DOMINATORS); -+ pop_cfun (); -+ applied = true; -+ } -+ } - if (applied) - symtab_remove_unreachable_nodes (true, dump_file); - /* Restore current_pass. */ -Index: gcc/ree.c -=================================================================== ---- a/src/gcc/ree.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/ree.c (.../branches/gcc-4_9-branch) -@@ -507,6 +507,8 @@ - /* Kind of modification of the insn. */ - ENUM_BITFIELD(ext_modified_kind) kind : 2; - -+ unsigned int do_not_reextend : 1; -+ - /* True if the insn is scheduled to be deleted. */ - unsigned int deleted : 1; - }; -@@ -712,8 +714,10 @@ - register than the source operand, then additional restrictions - are needed. Note we have to handle cases where we have nested - extensions in the source operand. */ -- if (REGNO (SET_DEST (PATTERN (cand->insn))) -- != REGNO (get_extended_src_reg (SET_SRC (PATTERN (cand->insn))))) -+ bool copy_needed -+ = (REGNO (SET_DEST (PATTERN (cand->insn))) -+ != REGNO (get_extended_src_reg (SET_SRC (PATTERN (cand->insn))))); -+ if (copy_needed) - { - /* In theory we could handle more than one reaching def, it - just makes the code to update the insn stream more complex. */ -@@ -722,7 +726,7 @@ - - /* We require the candidate not already be modified. It may, - for example have been changed from a (sign_extend (reg)) -- into (zero_extend (sign_extend (reg)). -+ into (zero_extend (sign_extend (reg))). - - Handling that case shouldn't be terribly difficult, but the code - here and the code to emit copies would need auditing. Until -@@ -777,6 +781,34 @@ - || reg_set_between_p (SET_DEST (PATTERN (cand->insn)), - def_insn, cand->insn)) - return false; -+ -+ /* We must be able to copy between the two registers. Generate, -+ recognize and verify constraints of the copy. Also fail if this -+ generated more than one insn. -+ -+ This generates garbage since we throw away the insn when we're -+ done, only to recreate it later if this test was successful. -+ -+ Make sure to get the mode from the extension (cand->insn). This -+ is different than in the code to emit the copy as we have not -+ modified the defining insn yet. */ -+ start_sequence (); -+ rtx pat = PATTERN (cand->insn); -+ rtx new_dst = gen_rtx_REG (GET_MODE (SET_DEST (pat)), -+ REGNO (XEXP (SET_SRC (pat), 0))); -+ rtx new_src = gen_rtx_REG (GET_MODE (SET_DEST (pat)), -+ REGNO (SET_DEST (pat))); -+ emit_move_insn (new_dst, new_src); -+ -+ rtx insn = get_insns(); -+ end_sequence (); -+ if (NEXT_INSN (insn)) -+ return false; -+ if (recog_memoized (insn) == -1) -+ return false; -+ extract_insn (insn); -+ if (!constrain_operands (1)) -+ return false; - } - - -@@ -843,11 +875,15 @@ - fprintf (dump_file, "All merges were successful.\n"); - - FOR_EACH_VEC_ELT (state->modified_list, i, def_insn) -- if (state->modified[INSN_UID (def_insn)].kind == EXT_MODIFIED_NONE) -- state->modified[INSN_UID (def_insn)].kind -- = (cand->code == ZERO_EXTEND -- ? EXT_MODIFIED_ZEXT : EXT_MODIFIED_SEXT); -+ { -+ ext_modified *modified = &state->modified[INSN_UID (def_insn)]; -+ if (modified->kind == EXT_MODIFIED_NONE) -+ modified->kind = (cand->code == ZERO_EXTEND ? EXT_MODIFIED_ZEXT -+ : EXT_MODIFIED_SEXT); - -+ if (copy_needed) -+ modified->do_not_reextend = 1; -+ } - return true; - } - else -Index: gcc/tree-ssa-reassoc.c -=================================================================== ---- a/src/gcc/tree-ssa-reassoc.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/tree-ssa-reassoc.c (.../branches/gcc-4_9-branch) -@@ -221,7 +221,36 @@ - static long get_rank (tree); - static bool reassoc_stmt_dominates_stmt_p (gimple, gimple); - -+/* Wrapper around gsi_remove, which adjusts gimple_uid of debug stmts -+ possibly added by gsi_remove. */ - -+bool -+reassoc_remove_stmt (gimple_stmt_iterator *gsi) -+{ -+ gimple stmt = gsi_stmt (*gsi); -+ -+ if (!MAY_HAVE_DEBUG_STMTS || gimple_code (stmt) == GIMPLE_PHI) -+ return gsi_remove (gsi, true); -+ -+ gimple_stmt_iterator prev = *gsi; -+ gsi_prev (&prev); -+ unsigned uid = gimple_uid (stmt); -+ basic_block bb = gimple_bb (stmt); -+ bool ret = gsi_remove (gsi, true); -+ if (!gsi_end_p (prev)) -+ gsi_next (&prev); -+ else -+ prev = gsi_start_bb (bb); -+ gimple end_stmt = gsi_stmt (*gsi); -+ while ((stmt = gsi_stmt (prev)) != end_stmt) -+ { -+ gcc_assert (stmt && is_gimple_debug (stmt) && gimple_uid (stmt) == 0); -+ gimple_set_uid (stmt, uid); -+ gsi_next (&prev); -+ } -+ return ret; -+} -+ - /* Bias amount for loop-carried phis. We want this to be larger than - the depth of any reassociation tree we can see, but not larger than - the rank difference between two blocks. */ -@@ -1123,7 +1152,7 @@ - update_stmt (use_stmt); - gsi = gsi_for_stmt (stmt); - unlink_stmt_vdef (stmt); -- gsi_remove (&gsi, true); -+ reassoc_remove_stmt (&gsi); - release_defs (stmt); - } - -@@ -3072,7 +3101,7 @@ - { - var = gimple_assign_rhs1 (stmt); - gsi = gsi_for_stmt (stmt); -- gsi_remove (&gsi, true); -+ reassoc_remove_stmt (&gsi); - release_defs (stmt); - } - else -@@ -3494,7 +3523,7 @@ - update_stmt (stmt); - - gsi = gsi_for_stmt (oldbinrhs); -- gsi_remove (&gsi, true); -+ reassoc_remove_stmt (&gsi); - release_defs (oldbinrhs); - - gimple_set_visited (stmt, true); -@@ -3896,7 +3925,7 @@ - gimple_assign_set_rhs_with_ops (&gsi2, NEGATE_EXPR, x, NULL); - user = gsi_stmt (gsi2); - update_stmt (user); -- gsi_remove (&gsi, true); -+ reassoc_remove_stmt (&gsi); - release_defs (feed); - plus_negates.safe_push (gimple_assign_lhs (user)); - } -@@ -4413,7 +4442,7 @@ - reassociations. */ - if (has_zero_uses (gimple_get_lhs (stmt))) - { -- gsi_remove (&gsi, true); -+ reassoc_remove_stmt (&gsi); - release_defs (stmt); - /* We might end up removing the last stmt above which - places the iterator to the end of the sequence. -Index: gcc/config/alpha/alpha.c -=================================================================== ---- a/src/gcc/config/alpha/alpha.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/alpha/alpha.c (.../branches/gcc-4_9-branch) -@@ -62,6 +62,7 @@ - #include "gimple-expr.h" - #include "is-a.h" - #include "gimple.h" -+#include "gimple-iterator.h" - #include "gimplify.h" - #include "gimple-ssa.h" - #include "stringpool.h" -@@ -7042,9 +7043,6 @@ - case ALPHA_BUILTIN_MSKQH: - return alpha_fold_builtin_mskxx (op, opint, op_const, 0xff, true); - -- case ALPHA_BUILTIN_UMULH: -- return fold_build2 (MULT_HIGHPART_EXPR, alpha_dimode_u, op[0], op[1]); -- - case ALPHA_BUILTIN_ZAP: - opint[1] ^= 0xff; - /* FALLTHRU */ -@@ -7094,6 +7092,49 @@ - return NULL; - } - } -+ -+bool -+alpha_gimple_fold_builtin (gimple_stmt_iterator *gsi) -+{ -+ bool changed = false; -+ gimple stmt = gsi_stmt (*gsi); -+ tree call = gimple_call_fn (stmt); -+ gimple new_stmt = NULL; -+ -+ if (call) -+ { -+ tree fndecl = gimple_call_fndecl (stmt); -+ -+ if (fndecl) -+ { -+ tree arg0, arg1; -+ -+ switch (DECL_FUNCTION_CODE (fndecl)) -+ { -+ case ALPHA_BUILTIN_UMULH: -+ arg0 = gimple_call_arg (stmt, 0); -+ arg1 = gimple_call_arg (stmt, 1); -+ -+ new_stmt -+ = gimple_build_assign_with_ops (MULT_HIGHPART_EXPR, -+ gimple_call_lhs (stmt), -+ arg0, -+ arg1); -+ break; -+ default: -+ break; -+ } -+ } -+ } -+ -+ if (new_stmt) -+ { -+ gsi_replace (gsi, new_stmt, true); -+ changed = true; -+ } -+ -+ return changed; -+} - - /* This page contains routines that are used to determine what the function - prologue and epilogue code will do and write them out. */ -@@ -8674,6 +8715,11 @@ - } - break; - -+ case BARRIER: -+ /* __builtin_unreachable can expand to no code at all, -+ leaving (barrier) RTXes in the instruction stream. */ -+ goto close_shadow_notrapb; -+ - case JUMP_INSN: - case CALL_INSN: - case CODE_LABEL: -@@ -8689,6 +8735,7 @@ - n = emit_insn_before (gen_trapb (), i); - PUT_MODE (n, TImode); - PUT_MODE (i, TImode); -+ close_shadow_notrapb: - trap_pending = 0; - shadow.used.i = 0; - shadow.used.fp = 0; -@@ -9790,6 +9837,8 @@ - #define TARGET_EXPAND_BUILTIN alpha_expand_builtin - #undef TARGET_FOLD_BUILTIN - #define TARGET_FOLD_BUILTIN alpha_fold_builtin -+#undef TARGET_GIMPLE_FOLD_BUILTIN -+#define TARGET_GIMPLE_FOLD_BUILTIN alpha_gimple_fold_builtin - - #undef TARGET_FUNCTION_OK_FOR_SIBCALL - #define TARGET_FUNCTION_OK_FOR_SIBCALL alpha_function_ok_for_sibcall -Index: gcc/config/sparc/sparc.md -=================================================================== ---- a/src/gcc/config/sparc/sparc.md (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/sparc/sparc.md (.../branches/gcc-4_9-branch) -@@ -424,6 +424,10 @@ - (define_attr "fptype" "single,double" - (const_string "single")) - -+;; FP precision specific to the UT699. -+(define_attr "fptype_ut699" "none,single" -+ (const_string "none")) -+ - ;; UltraSPARC-III integer load type. - (define_attr "us3load_type" "2cycle,3cycle" - (const_string "2cycle")) -@@ -464,7 +468,8 @@ - (const_string "false") - (and (eq_attr "fix_ut699" "true") - (and (eq_attr "type" "fpload,fp,fpmove,fpmul,fpdivs,fpsqrts") -- (eq_attr "fptype" "single"))) -+ (ior (eq_attr "fptype" "single") -+ (eq_attr "fptype_ut699" "single")))) - (const_string "false") - (eq_attr "length" "1") - (const_string "true") -@@ -3455,7 +3460,8 @@ - "TARGET_FPU" - "fdtos\t%1, %0" - [(set_attr "type" "fp") -- (set_attr "fptype" "double")]) -+ (set_attr "fptype" "double") -+ (set_attr "fptype_ut699" "single")]) - - (define_expand "trunctfsf2" - [(set (match_operand:SF 0 "register_operand" "") -@@ -3496,7 +3502,7 @@ - "TARGET_FPU" - "fitos\t%1, %0" - [(set_attr "type" "fp") -- (set_attr "fptype" "double")]) -+ (set_attr "fptype" "single")]) - - (define_insn "floatsidf2" - [(set (match_operand:DF 0 "register_operand" "=e") -@@ -3583,7 +3589,7 @@ - "TARGET_FPU" - "fstoi\t%1, %0" - [(set_attr "type" "fp") -- (set_attr "fptype" "double")]) -+ (set_attr "fptype" "single")]) - - (define_insn "fix_truncdfsi2" - [(set (match_operand:SI 0 "register_operand" "=f") -@@ -3591,7 +3597,8 @@ - "TARGET_FPU" - "fdtoi\t%1, %0" - [(set_attr "type" "fp") -- (set_attr "fptype" "double")]) -+ (set_attr "fptype" "double") -+ (set_attr "fptype_ut699" "single")]) - - (define_expand "fix_trunctfsi2" - [(set (match_operand:SI 0 "register_operand" "") -@@ -5554,54 +5561,53 @@ - [(set_attr "type" "fpdivs")]) - - (define_expand "negtf2" -- [(set (match_operand:TF 0 "register_operand" "=e,e") -- (neg:TF (match_operand:TF 1 "register_operand" "0,e")))] -+ [(set (match_operand:TF 0 "register_operand" "") -+ (neg:TF (match_operand:TF 1 "register_operand" "")))] - "TARGET_FPU" - "") - --(define_insn_and_split "*negtf2_notv9" -- [(set (match_operand:TF 0 "register_operand" "=e,e") -- (neg:TF (match_operand:TF 1 "register_operand" "0,e")))] -- ; We don't use quad float insns here so we don't need TARGET_HARD_QUAD. -- "TARGET_FPU -- && ! TARGET_V9" -- "@ -- fnegs\t%0, %0 -- #" -- "&& reload_completed -- && sparc_absnegfloat_split_legitimate (operands[0], operands[1])" -- [(set (match_dup 2) (neg:SF (match_dup 3))) -- (set (match_dup 4) (match_dup 5)) -- (set (match_dup 6) (match_dup 7))] -- "operands[2] = gen_rtx_raw_REG (SFmode, REGNO (operands[0])); -- operands[3] = gen_rtx_raw_REG (SFmode, REGNO (operands[1])); -- operands[4] = gen_rtx_raw_REG (SFmode, REGNO (operands[0]) + 1); -- operands[5] = gen_rtx_raw_REG (SFmode, REGNO (operands[1]) + 1); -- operands[6] = gen_rtx_raw_REG (DFmode, REGNO (operands[0]) + 2); -- operands[7] = gen_rtx_raw_REG (DFmode, REGNO (operands[1]) + 2);" -- [(set_attr "type" "fpmove,*") -- (set_attr "length" "*,2")]) -+(define_insn "*negtf2_hq" -+ [(set (match_operand:TF 0 "register_operand" "=e") -+ (neg:TF (match_operand:TF 1 "register_operand" "e")))] -+ "TARGET_FPU && TARGET_HARD_QUAD" -+ "fnegq\t%1, %0" -+ [(set_attr "type" "fpmove")]) - --(define_insn_and_split "*negtf2_v9" -- [(set (match_operand:TF 0 "register_operand" "=e,e") -- (neg:TF (match_operand:TF 1 "register_operand" "0,e")))] -- ; We don't use quad float insns here so we don't need TARGET_HARD_QUAD. -- "TARGET_FPU && TARGET_V9" -- "@ -- fnegd\t%0, %0 -- #" -- "&& reload_completed -- && sparc_absnegfloat_split_legitimate (operands[0], operands[1])" -- [(set (match_dup 2) (neg:DF (match_dup 3))) -- (set (match_dup 4) (match_dup 5))] -- "operands[2] = gen_rtx_raw_REG (DFmode, REGNO (operands[0])); -- operands[3] = gen_rtx_raw_REG (DFmode, REGNO (operands[1])); -- operands[4] = gen_rtx_raw_REG (DFmode, REGNO (operands[0]) + 2); -- operands[5] = gen_rtx_raw_REG (DFmode, REGNO (operands[1]) + 2);" -- [(set_attr "type" "fpmove,*") -- (set_attr "length" "*,2") -- (set_attr "fptype" "double")]) -+(define_insn_and_split "*negtf2" -+ [(set (match_operand:TF 0 "register_operand" "=e") -+ (neg:TF (match_operand:TF 1 "register_operand" "e")))] -+ "TARGET_FPU && !TARGET_HARD_QUAD" -+ "#" -+ "&& reload_completed" -+ [(clobber (const_int 0))] -+{ -+ rtx set_dest = operands[0]; -+ rtx set_src = operands[1]; -+ rtx dest1, dest2; -+ rtx src1, src2; - -+ dest1 = gen_df_reg (set_dest, 0); -+ dest2 = gen_df_reg (set_dest, 1); -+ src1 = gen_df_reg (set_src, 0); -+ src2 = gen_df_reg (set_src, 1); -+ -+ /* Now emit using the real source and destination we found, swapping -+ the order if we detect overlap. */ -+ if (reg_overlap_mentioned_p (dest1, src2)) -+ { -+ emit_insn (gen_movdf (dest2, src2)); -+ emit_insn (gen_negdf2 (dest1, src1)); -+ } -+ else -+ { -+ emit_insn (gen_negdf2 (dest1, src1)); -+ if (REGNO (dest2) != REGNO (src2)) -+ emit_insn (gen_movdf (dest2, src2)); -+ } -+ DONE; -+} -+ [(set_attr "length" "2")]) -+ - (define_expand "negdf2" - [(set (match_operand:DF 0 "register_operand" "") - (neg:DF (match_operand:DF 1 "register_operand" "")))] -@@ -5609,23 +5615,40 @@ - "") - - (define_insn_and_split "*negdf2_notv9" -- [(set (match_operand:DF 0 "register_operand" "=e,e") -- (neg:DF (match_operand:DF 1 "register_operand" "0,e")))] -- "TARGET_FPU && ! TARGET_V9" -- "@ -- fnegs\t%0, %0 -- #" -- "&& reload_completed -- && sparc_absnegfloat_split_legitimate (operands[0], operands[1])" -- [(set (match_dup 2) (neg:SF (match_dup 3))) -- (set (match_dup 4) (match_dup 5))] -- "operands[2] = gen_rtx_raw_REG (SFmode, REGNO (operands[0])); -- operands[3] = gen_rtx_raw_REG (SFmode, REGNO (operands[1])); -- operands[4] = gen_rtx_raw_REG (SFmode, REGNO (operands[0]) + 1); -- operands[5] = gen_rtx_raw_REG (SFmode, REGNO (operands[1]) + 1);" -- [(set_attr "type" "fpmove,*") -- (set_attr "length" "*,2")]) -+ [(set (match_operand:DF 0 "register_operand" "=e") -+ (neg:DF (match_operand:DF 1 "register_operand" "e")))] -+ "TARGET_FPU && !TARGET_V9" -+ "#" -+ "&& reload_completed" -+ [(clobber (const_int 0))] -+{ -+ rtx set_dest = operands[0]; -+ rtx set_src = operands[1]; -+ rtx dest1, dest2; -+ rtx src1, src2; - -+ dest1 = gen_highpart (SFmode, set_dest); -+ dest2 = gen_lowpart (SFmode, set_dest); -+ src1 = gen_highpart (SFmode, set_src); -+ src2 = gen_lowpart (SFmode, set_src); -+ -+ /* Now emit using the real source and destination we found, swapping -+ the order if we detect overlap. */ -+ if (reg_overlap_mentioned_p (dest1, src2)) -+ { -+ emit_insn (gen_movsf (dest2, src2)); -+ emit_insn (gen_negsf2 (dest1, src1)); -+ } -+ else -+ { -+ emit_insn (gen_negsf2 (dest1, src1)); -+ if (REGNO (dest2) != REGNO (src2)) -+ emit_insn (gen_movsf (dest2, src2)); -+ } -+ DONE; -+} -+ [(set_attr "length" "2")]) -+ - (define_insn "*negdf2_v9" - [(set (match_operand:DF 0 "register_operand" "=e") - (neg:DF (match_operand:DF 1 "register_operand" "e")))] -@@ -5647,57 +5670,48 @@ - "TARGET_FPU" - "") - --(define_insn_and_split "*abstf2_notv9" -- [(set (match_operand:TF 0 "register_operand" "=e,e") -- (abs:TF (match_operand:TF 1 "register_operand" "0,e")))] -- ; We don't use quad float insns here so we don't need TARGET_HARD_QUAD. -- "TARGET_FPU && ! TARGET_V9" -- "@ -- fabss\t%0, %0 -- #" -- "&& reload_completed -- && sparc_absnegfloat_split_legitimate (operands[0], operands[1])" -- [(set (match_dup 2) (abs:SF (match_dup 3))) -- (set (match_dup 4) (match_dup 5)) -- (set (match_dup 6) (match_dup 7))] -- "operands[2] = gen_rtx_raw_REG (SFmode, REGNO (operands[0])); -- operands[3] = gen_rtx_raw_REG (SFmode, REGNO (operands[1])); -- operands[4] = gen_rtx_raw_REG (SFmode, REGNO (operands[0]) + 1); -- operands[5] = gen_rtx_raw_REG (SFmode, REGNO (operands[1]) + 1); -- operands[6] = gen_rtx_raw_REG (DFmode, REGNO (operands[0]) + 2); -- operands[7] = gen_rtx_raw_REG (DFmode, REGNO (operands[1]) + 2);" -- [(set_attr "type" "fpmove,*") -- (set_attr "length" "*,2")]) -+(define_insn "*abstf2_hq" -+ [(set (match_operand:TF 0 "register_operand" "=e") -+ (abs:TF (match_operand:TF 1 "register_operand" "e")))] -+ "TARGET_FPU && TARGET_HARD_QUAD" -+ "fabsq\t%1, %0" -+ [(set_attr "type" "fpmove")]) - --(define_insn "*abstf2_hq_v9" -- [(set (match_operand:TF 0 "register_operand" "=e,e") -- (abs:TF (match_operand:TF 1 "register_operand" "0,e")))] -- "TARGET_FPU && TARGET_V9 && TARGET_HARD_QUAD" -- "@ -- fabsd\t%0, %0 -- fabsq\t%1, %0" -- [(set_attr "type" "fpmove") -- (set_attr "fptype" "double,*")]) -+(define_insn_and_split "*abstf2" -+ [(set (match_operand:TF 0 "register_operand" "=e") -+ (abs:TF (match_operand:TF 1 "register_operand" "e")))] -+ "TARGET_FPU && !TARGET_HARD_QUAD" -+ "#" -+ "&& reload_completed" -+ [(clobber (const_int 0))] -+{ -+ rtx set_dest = operands[0]; -+ rtx set_src = operands[1]; -+ rtx dest1, dest2; -+ rtx src1, src2; - --(define_insn_and_split "*abstf2_v9" -- [(set (match_operand:TF 0 "register_operand" "=e,e") -- (abs:TF (match_operand:TF 1 "register_operand" "0,e")))] -- "TARGET_FPU && TARGET_V9 && !TARGET_HARD_QUAD" -- "@ -- fabsd\t%0, %0 -- #" -- "&& reload_completed -- && sparc_absnegfloat_split_legitimate (operands[0], operands[1])" -- [(set (match_dup 2) (abs:DF (match_dup 3))) -- (set (match_dup 4) (match_dup 5))] -- "operands[2] = gen_rtx_raw_REG (DFmode, REGNO (operands[0])); -- operands[3] = gen_rtx_raw_REG (DFmode, REGNO (operands[1])); -- operands[4] = gen_rtx_raw_REG (DFmode, REGNO (operands[0]) + 2); -- operands[5] = gen_rtx_raw_REG (DFmode, REGNO (operands[1]) + 2);" -- [(set_attr "type" "fpmove,*") -- (set_attr "length" "*,2") -- (set_attr "fptype" "double,*")]) -+ dest1 = gen_df_reg (set_dest, 0); -+ dest2 = gen_df_reg (set_dest, 1); -+ src1 = gen_df_reg (set_src, 0); -+ src2 = gen_df_reg (set_src, 1); - -+ /* Now emit using the real source and destination we found, swapping -+ the order if we detect overlap. */ -+ if (reg_overlap_mentioned_p (dest1, src2)) -+ { -+ emit_insn (gen_movdf (dest2, src2)); -+ emit_insn (gen_absdf2 (dest1, src1)); -+ } -+ else -+ { -+ emit_insn (gen_absdf2 (dest1, src1)); -+ if (REGNO (dest2) != REGNO (src2)) -+ emit_insn (gen_movdf (dest2, src2)); -+ } -+ DONE; -+} -+ [(set_attr "length" "2")]) -+ - (define_expand "absdf2" - [(set (match_operand:DF 0 "register_operand" "") - (abs:DF (match_operand:DF 1 "register_operand" "")))] -@@ -5705,23 +5719,40 @@ - "") - - (define_insn_and_split "*absdf2_notv9" -- [(set (match_operand:DF 0 "register_operand" "=e,e") -- (abs:DF (match_operand:DF 1 "register_operand" "0,e")))] -- "TARGET_FPU && ! TARGET_V9" -- "@ -- fabss\t%0, %0 -- #" -- "&& reload_completed -- && sparc_absnegfloat_split_legitimate (operands[0], operands[1])" -- [(set (match_dup 2) (abs:SF (match_dup 3))) -- (set (match_dup 4) (match_dup 5))] -- "operands[2] = gen_rtx_raw_REG (SFmode, REGNO (operands[0])); -- operands[3] = gen_rtx_raw_REG (SFmode, REGNO (operands[1])); -- operands[4] = gen_rtx_raw_REG (SFmode, REGNO (operands[0]) + 1); -- operands[5] = gen_rtx_raw_REG (SFmode, REGNO (operands[1]) + 1);" -- [(set_attr "type" "fpmove,*") -- (set_attr "length" "*,2")]) -+ [(set (match_operand:DF 0 "register_operand" "=e") -+ (abs:DF (match_operand:DF 1 "register_operand" "e")))] -+ "TARGET_FPU && !TARGET_V9" -+ "#" -+ "&& reload_completed" -+ [(clobber (const_int 0))] -+{ -+ rtx set_dest = operands[0]; -+ rtx set_src = operands[1]; -+ rtx dest1, dest2; -+ rtx src1, src2; - -+ dest1 = gen_highpart (SFmode, set_dest); -+ dest2 = gen_lowpart (SFmode, set_dest); -+ src1 = gen_highpart (SFmode, set_src); -+ src2 = gen_lowpart (SFmode, set_src); -+ -+ /* Now emit using the real source and destination we found, swapping -+ the order if we detect overlap. */ -+ if (reg_overlap_mentioned_p (dest1, src2)) -+ { -+ emit_insn (gen_movsf (dest2, src2)); -+ emit_insn (gen_abssf2 (dest1, src1)); -+ } -+ else -+ { -+ emit_insn (gen_abssf2 (dest1, src1)); -+ if (REGNO (dest2) != REGNO (src2)) -+ emit_insn (gen_movsf (dest2, src2)); -+ } -+ DONE; -+} -+ [(set_attr "length" "2")]) -+ - (define_insn "*absdf2_v9" - [(set (match_operand:DF 0 "register_operand" "=e") - (abs:DF (match_operand:DF 1 "register_operand" "e")))] -@@ -5795,19 +5826,6 @@ - } - [(set_attr "type" "shift")]) - --(define_insn "*ashlsi3_extend" -- [(set (match_operand:DI 0 "register_operand" "=r") -- (zero_extend:DI -- (ashift:SI (match_operand:SI 1 "register_operand" "r") -- (match_operand:SI 2 "arith_operand" "rI"))))] -- "TARGET_ARCH64" --{ -- if (GET_CODE (operands[2]) == CONST_INT) -- operands[2] = GEN_INT (INTVAL (operands[2]) & 0x1f); -- return "sll\t%1, %2, %0"; --} -- [(set_attr "type" "shift")]) -- - (define_expand "ashldi3" - [(set (match_operand:DI 0 "register_operand" "=r") - (ashift:DI (match_operand:DI 1 "register_operand" "r") -Index: gcc/config/sparc/sparc.opt -=================================================================== ---- a/src/gcc/config/sparc/sparc.opt (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/sparc/sparc.opt (.../branches/gcc-4_9-branch) -@@ -113,6 +113,10 @@ - Target - Optimize tail call instructions in assembler and linker - -+muser-mode -+Target Report Mask(USER_MODE) -+Do not generate code that can only run in supervisor mode -+ - mcpu= - Target RejectNegative Joined Var(sparc_cpu_and_features) Enum(sparc_processor_type) Init(PROCESSOR_V7) - Use features of and schedule code for given CPU -Index: gcc/config/sparc/sync.md -=================================================================== ---- a/src/gcc/config/sparc/sync.md (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/sparc/sync.md (.../branches/gcc-4_9-branch) -@@ -200,10 +200,27 @@ - [(match_operand:I48MODE 2 "register_operand" "r") - (match_operand:I48MODE 3 "register_operand" "0")] - UNSPECV_CAS))] -- "(TARGET_V9 || TARGET_LEON3) && (<MODE>mode != DImode || TARGET_ARCH64)" -+ "TARGET_V9 && (<MODE>mode != DImode || TARGET_ARCH64)" - "cas<modesuffix>\t%1, %2, %0" - [(set_attr "type" "multi")]) - -+(define_insn "*atomic_compare_and_swap_leon3_1" -+ [(set (match_operand:SI 0 "register_operand" "=r") -+ (match_operand:SI 1 "mem_noofs_operand" "+w")) -+ (set (match_dup 1) -+ (unspec_volatile:SI -+ [(match_operand:SI 2 "register_operand" "r") -+ (match_operand:SI 3 "register_operand" "0")] -+ UNSPECV_CAS))] -+ "TARGET_LEON3" -+{ -+ if (TARGET_USER_MODE) -+ return "casa\t%1 0xa, %2, %0"; /* ASI for user data space. */ -+ else -+ return "casa\t%1 0xb, %2, %0"; /* ASI for supervisor data space. */ -+} -+ [(set_attr "type" "multi")]) -+ - (define_insn "*atomic_compare_and_swapdi_v8plus" - [(set (match_operand:DI 0 "register_operand" "=h") - (match_operand:DI 1 "mem_noofs_operand" "+w")) -Index: gcc/config/sparc/sparc-protos.h -=================================================================== ---- a/src/gcc/config/sparc/sparc-protos.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/sparc/sparc-protos.h (.../branches/gcc-4_9-branch) -@@ -69,7 +69,6 @@ - extern void sparc_emit_set_symbolic_const64 (rtx, rtx, rtx); - extern int sparc_splitdi_legitimate (rtx, rtx); - extern int sparc_split_regreg_legitimate (rtx, rtx); --extern int sparc_absnegfloat_split_legitimate (rtx, rtx); - extern const char *output_ubranch (rtx, rtx); - extern const char *output_cbranch (rtx, rtx, int, int, int, rtx); - extern const char *output_return (rtx); -Index: gcc/config/sparc/sparc.c -=================================================================== ---- a/src/gcc/config/sparc/sparc.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/sparc/sparc.c (.../branches/gcc-4_9-branch) -@@ -8539,22 +8539,6 @@ - return 0; - } - --/* Return 1 if x and y are some kind of REG and they refer to -- different hard registers. This test is guaranteed to be -- run after reload. */ -- --int --sparc_absnegfloat_split_legitimate (rtx x, rtx y) --{ -- if (GET_CODE (x) != REG) -- return 0; -- if (GET_CODE (y) != REG) -- return 0; -- if (REGNO (x) == REGNO (y)) -- return 0; -- return 1; --} -- - /* Return 1 if REGNO (reg1) is even and REGNO (reg1) == REGNO (reg2) - 1. - This makes them candidates for using ldd and std insns. - -Index: gcc/config/i386/cygwin.h -=================================================================== ---- a/src/gcc/config/i386/cygwin.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/i386/cygwin.h (.../branches/gcc-4_9-branch) -@@ -45,6 +45,7 @@ - #undef ENDFILE_SPEC - #define ENDFILE_SPEC \ - "%{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s}\ -+ %{!shared:%:if-exists(default-manifest.o%s)}\ - crtend.o%s" - - /* Normally, -lgcc is not needed since everything in it is in the DLL, but we -Index: gcc/config/i386/i386.md -=================================================================== ---- a/src/gcc/config/i386/i386.md (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/i386/i386.md (.../branches/gcc-4_9-branch) -@@ -3201,7 +3201,7 @@ - (const_string "1") - (const_string "*"))) - (set (attr "mode") -- (cond [(eq_attr "alternative" "3,4,9,10,13,14,15") -+ (cond [(eq_attr "alternative" "3,4,9,10,12,13,14,15") - (const_string "SI") - (eq_attr "alternative" "11") - (const_string "DI") -@@ -4933,66 +4933,37 @@ - - ;; Avoid store forwarding (partial memory) stall penalty by extending - ;; SImode value to DImode through XMM register instead of pushing two --;; SImode values to stack. Note that even !TARGET_INTER_UNIT_MOVES_TO_VEC --;; targets benefit from this optimization. Also note that fild --;; loads from memory only. -+;; SImode values to stack. Also note that fild loads from memory only. - --(define_insn "*floatunssi<mode>2_1" -- [(set (match_operand:X87MODEF 0 "register_operand" "=f,f") -+(define_insn_and_split "*floatunssi<mode>2_i387_with_xmm" -+ [(set (match_operand:X87MODEF 0 "register_operand" "=f") - (unsigned_float:X87MODEF -- (match_operand:SI 1 "nonimmediate_operand" "x,m"))) -- (clobber (match_operand:DI 2 "memory_operand" "=m,m")) -- (clobber (match_scratch:SI 3 "=X,x"))] -+ (match_operand:SI 1 "nonimmediate_operand" "rm"))) -+ (clobber (match_scratch:DI 3 "=x")) -+ (clobber (match_operand:DI 2 "memory_operand" "=m"))] - "!TARGET_64BIT - && TARGET_80387 && X87_ENABLE_FLOAT (<X87MODEF:MODE>mode, DImode) -- && TARGET_SSE" -+ && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES_TO_VEC" - "#" -+ "&& reload_completed" -+ [(set (match_dup 3) (zero_extend:DI (match_dup 1))) -+ (set (match_dup 2) (match_dup 3)) -+ (set (match_dup 0) -+ (float:X87MODEF (match_dup 2)))] -+ "" - [(set_attr "type" "multi") - (set_attr "mode" "<MODE>")]) - --(define_split -- [(set (match_operand:X87MODEF 0 "register_operand") -- (unsigned_float:X87MODEF -- (match_operand:SI 1 "register_operand"))) -- (clobber (match_operand:DI 2 "memory_operand")) -- (clobber (match_scratch:SI 3))] -- "!TARGET_64BIT -- && TARGET_80387 && X87_ENABLE_FLOAT (<X87MODEF:MODE>mode, DImode) -- && TARGET_SSE -- && reload_completed" -- [(set (match_dup 2) (match_dup 1)) -- (set (match_dup 0) -- (float:X87MODEF (match_dup 2)))] -- "operands[1] = simplify_gen_subreg (DImode, operands[1], SImode, 0);") -- --(define_split -- [(set (match_operand:X87MODEF 0 "register_operand") -- (unsigned_float:X87MODEF -- (match_operand:SI 1 "memory_operand"))) -- (clobber (match_operand:DI 2 "memory_operand")) -- (clobber (match_scratch:SI 3))] -- "!TARGET_64BIT -- && TARGET_80387 && X87_ENABLE_FLOAT (<X87MODEF:MODE>mode, DImode) -- && TARGET_SSE -- && reload_completed" -- [(set (match_dup 2) (match_dup 3)) -- (set (match_dup 0) -- (float:X87MODEF (match_dup 2)))] --{ -- emit_move_insn (operands[3], operands[1]); -- operands[3] = simplify_gen_subreg (DImode, operands[3], SImode, 0); --}) -- - (define_expand "floatunssi<mode>2" - [(parallel - [(set (match_operand:X87MODEF 0 "register_operand") - (unsigned_float:X87MODEF - (match_operand:SI 1 "nonimmediate_operand"))) -- (clobber (match_dup 2)) -- (clobber (match_scratch:SI 3))])] -+ (clobber (match_scratch:DI 3)) -+ (clobber (match_dup 2))])] - "!TARGET_64BIT - && ((TARGET_80387 && X87_ENABLE_FLOAT (<X87MODEF:MODE>mode, DImode) -- && TARGET_SSE) -+ && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES_TO_VEC) - || (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH))" - { - if (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH) -@@ -9627,7 +9598,7 @@ - - (define_insn "x86_64_shrd" - [(set (match_operand:DI 0 "nonimmediate_operand" "+r*m") -- (ior:DI (ashiftrt:DI (match_dup 0) -+ (ior:DI (lshiftrt:DI (match_dup 0) - (match_operand:QI 2 "nonmemory_operand" "Jc")) - (ashift:DI (match_operand:DI 1 "register_operand" "r") - (minus:QI (const_int 64) (match_dup 2))))) -@@ -9643,7 +9614,7 @@ - - (define_insn "x86_shrd" - [(set (match_operand:SI 0 "nonimmediate_operand" "+r*m") -- (ior:SI (ashiftrt:SI (match_dup 0) -+ (ior:SI (lshiftrt:SI (match_dup 0) - (match_operand:QI 2 "nonmemory_operand" "Ic")) - (ashift:SI (match_operand:SI 1 "register_operand" "r") - (minus:QI (const_int 32) (match_dup 2))))) -@@ -10095,13 +10066,13 @@ - [(set (match_dup 3) (match_dup 4)) - (parallel - [(set (match_dup 4) -- (ior:DWIH (ashiftrt:DWIH (match_dup 4) (match_dup 2)) -+ (ior:DWIH (lshiftrt:DWIH (match_dup 4) (match_dup 2)) - (ashift:DWIH (match_dup 5) - (minus:QI (match_dup 6) (match_dup 2))))) - (clobber (reg:CC FLAGS_REG))]) - (parallel - [(set (match_dup 5) -- (ior:DWIH (ashiftrt:DWIH (match_dup 5) (match_dup 2)) -+ (ior:DWIH (lshiftrt:DWIH (match_dup 5) (match_dup 2)) - (ashift:DWIH (match_dup 3) - (minus:QI (match_dup 6) (match_dup 2))))) - (clobber (reg:CC FLAGS_REG))])] -@@ -14427,15 +14398,16 @@ - "TARGET_USE_FANCY_MATH_387 - && flag_unsafe_math_optimizations" - { -+ rtx tmp1, tmp2; - if (optimize_insn_for_size_p ()) - FAIL; - -- operands[3] = gen_reg_rtx (XFmode); -- operands[4] = gen_reg_rtx (XFmode); -+ tmp1 = gen_reg_rtx (XFmode); -+ tmp2 = gen_reg_rtx (XFmode); - -- emit_insn (gen_floatsixf2 (operands[3], operands[2])); -- emit_insn (gen_fscalexf4_i387 (operands[0], operands[4], -- operands[1], operands[3])); -+ emit_insn (gen_floatsixf2 (tmp1, operands[2])); -+ emit_insn (gen_fscalexf4_i387 (operands[0], tmp2, -+ operands[1], tmp1)); - DONE; - }) - -Index: gcc/config/i386/mingw32.h -=================================================================== ---- a/src/gcc/config/i386/mingw32.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/i386/mingw32.h (.../branches/gcc-4_9-branch) -@@ -148,6 +148,7 @@ - #undef ENDFILE_SPEC - #define ENDFILE_SPEC \ - "%{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \ -+ %{!shared:%:if-exists(default-manifest.o%s)}\ - crtend.o%s" - - /* Override startfile prefix defaults. */ -Index: gcc/config/i386/driver-i386.c -=================================================================== ---- a/src/gcc/config/i386/driver-i386.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/i386/driver-i386.c (.../branches/gcc-4_9-branch) -@@ -739,6 +739,11 @@ - /* Assume Core 2. */ - cpu = "core2"; - } -+ else if (has_longmode) -+ /* Perhaps some emulator? Assume x86-64, otherwise gcc -+ -march=native would be unusable for 64-bit compilations, -+ as all the CPUs below are 32-bit only. */ -+ cpu = "x86-64"; - else if (has_sse3) - /* It is Core Duo. */ - cpu = "pentium-m"; -Index: gcc/config/i386/i386.c -=================================================================== ---- a/src/gcc/config/i386/i386.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/i386/i386.c (.../branches/gcc-4_9-branch) -@@ -3128,7 +3128,7 @@ - (PTA_SANDYBRIDGE | PTA_FSGSBASE | PTA_RDRND | PTA_F16C) - #define PTA_HASWELL \ - (PTA_IVYBRIDGE | PTA_AVX2 | PTA_BMI | PTA_BMI2 | PTA_LZCNT \ -- | PTA_FMA | PTA_MOVBE | PTA_RTM | PTA_HLE) -+ | PTA_FMA | PTA_MOVBE | PTA_HLE) - #define PTA_BROADWELL \ - (PTA_HASWELL | PTA_ADX | PTA_PRFCHW | PTA_RDSEED) - #define PTA_BONNELL \ -@@ -21507,7 +21507,7 @@ - t1 = gen_reg_rtx (V32QImode); - t2 = gen_reg_rtx (V32QImode); - t3 = gen_reg_rtx (V32QImode); -- vt2 = GEN_INT (128); -+ vt2 = GEN_INT (-128); - for (i = 0; i < 32; i++) - vec[i] = vt2; - vt = gen_rtx_CONST_VECTOR (V32QImode, gen_rtvec_v (32, vec)); -@@ -23794,7 +23794,7 @@ - { - const struct stringop_algs * algs; - bool optimize_for_speed; -- int max = -1; -+ int max = 0; - const struct processor_costs *cost; - int i; - bool any_alg_usable_p = false; -@@ -23832,7 +23832,7 @@ - /* If expected size is not known but max size is small enough - so inline version is a win, set expected size into - the range. */ -- if (max > 1 && (unsigned HOST_WIDE_INT) max >= max_size -+ if (((max > 1 && (unsigned HOST_WIDE_INT) max >= max_size) || max == -1) - && expected_size == -1) - expected_size = min_size / 2 + max_size / 2; - -@@ -23921,7 +23921,7 @@ - *dynamic_check = 128; - return loop_1_byte; - } -- if (max == -1) -+ if (max <= 0) - max = 4096; - alg = decide_alg (count, max / 2, min_size, max_size, memset, - zero_memset, dynamic_check, noalign); -@@ -24151,8 +24151,13 @@ - align = MEM_ALIGN (dst) / BITS_PER_UNIT; - - if (CONST_INT_P (count_exp)) -- min_size = max_size = probable_max_size = count = expected_size -- = INTVAL (count_exp); -+ { -+ min_size = max_size = probable_max_size = count = expected_size -+ = INTVAL (count_exp); -+ /* When COUNT is 0, there is nothing to do. */ -+ if (!count) -+ return true; -+ } - else - { - if (min_size_exp) -@@ -24161,7 +24166,7 @@ - max_size = INTVAL (max_size_exp); - if (probable_max_size_exp) - probable_max_size = INTVAL (probable_max_size_exp); -- if (CONST_INT_P (expected_size_exp) && count == 0) -+ if (CONST_INT_P (expected_size_exp)) - expected_size = INTVAL (expected_size_exp); - } - -@@ -24390,7 +24395,8 @@ - if (jump_around_label == NULL_RTX) - jump_around_label = gen_label_rtx (); - emit_cmp_and_jump_insns (count_exp, GEN_INT (dynamic_check - 1), -- LEU, 0, GET_MODE (count_exp), 1, hot_label); -+ LEU, 0, counter_mode (count_exp), -+ 1, hot_label); - predict_jump (REG_BR_PROB_BASE * 90 / 100); - if (issetmem) - set_storage_via_libcall (dst, count_exp, val_exp, false); -@@ -26232,13 +26238,17 @@ - { - edge e; - edge_iterator ei; -- /* Assume that region is SCC, i.e. all immediate predecessors -- of non-head block are in the same region. */ -+ -+ /* Regions are SCCs with the exception of selective -+ scheduling with pipelining of outer blocks enabled. -+ So also check that immediate predecessors of a non-head -+ block are in the same region. */ - FOR_EACH_EDGE (e, ei, bb->preds) - { - /* Avoid creating of loop-carried dependencies through -- using topological odering in region. */ -- if (BLOCK_TO_BB (bb->index) > BLOCK_TO_BB (e->src->index)) -+ using topological ordering in the region. */ -+ if (rgn == CONTAINING_RGN (e->src->index) -+ && BLOCK_TO_BB (bb->index) > BLOCK_TO_BB (e->src->index)) - add_dependee_for_func_arg (first_arg, e->src); - } - } -@@ -35406,7 +35416,8 @@ - else - op2 = gen_rtx_SUBREG (SImode, op0, 0); - -- if (target == 0) -+ if (target == 0 -+ || !register_operand (target, SImode)) - target = gen_reg_rtx (SImode); - - pat = gen_rtx_GEU (VOIDmode, gen_rtx_REG (CCCmode, FLAGS_REG), -@@ -35448,7 +35459,8 @@ - const0_rtx); - emit_insn (gen_rtx_SET (VOIDmode, op2, pat)); - -- if (target == 0) -+ if (target == 0 -+ || !register_operand (target, SImode)) - target = gen_reg_rtx (SImode); - - emit_insn (gen_zero_extendqisi2 (target, op2)); -@@ -37794,10 +37806,10 @@ - else if (TARGET_64BIT && !x86_64_zext_immediate_operand (x, VOIDmode)) - *total = 2; - else if (flag_pic && SYMBOLIC_CONST (x) -- && (!TARGET_64BIT -- || (!GET_CODE (x) != LABEL_REF -- && (GET_CODE (x) != SYMBOL_REF -- || !SYMBOL_REF_LOCAL_P (x))))) -+ && !(TARGET_64BIT -+ && (GET_CODE (x) == LABEL_REF -+ || (GET_CODE (x) == SYMBOL_REF -+ && SYMBOL_REF_LOCAL_P (x))))) - *total = 1; - else - *total = 0; -Index: gcc/config/sol2-clearcap.map -=================================================================== ---- a/src/gcc/config/sol2-clearcap.map (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/sol2-clearcap.map (.../branches/gcc-4_9-branch) -@@ -0,0 +1,2 @@ -+# Clear all hardware capabilities emitted by Sun as. -+hwcap_1 = V0x0 OVERRIDE; -Index: gcc/config/sol2.h -=================================================================== ---- a/src/gcc/config/sol2.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/sol2.h (.../branches/gcc-4_9-branch) -@@ -183,12 +183,21 @@ - #define LINK_LIBGCC_MAPFILE_SPEC "" - #endif - -+/* Clear hardware capabilities, either explicitly or with OpenMP: -+ #pragma openmp declare simd creates clones for SSE2, AVX, and AVX2. */ -+#ifdef HAVE_LD_CLEARCAP -+#define LINK_CLEARCAP_SPEC " %{mclear-hwcap|fopenmp*:-M %sclearcap.map}" -+#else -+#define LINK_CLEARCAP_SPEC "" -+#endif -+ - #undef LINK_SPEC - #define LINK_SPEC \ - "%{h*} %{v:-V} \ - %{!shared:%{!static:%{rdynamic: " RDYNAMIC_SPEC "}}} \ - %{static:-dn -Bstatic} \ -- %{shared:-G -dy %{!mimpure-text:-z text}} " LINK_LIBGCC_MAPFILE_SPEC " \ -+ %{shared:-G -dy %{!mimpure-text:-z text}} " \ -+ LINK_LIBGCC_MAPFILE_SPEC LINK_CLEARCAP_SPEC " \ - %{symbolic:-Bsymbolic -G -dy -z text} \ - %(link_arch) \ - %{Qy:} %{!Qn:-Qy}" -Index: gcc/config/sh/sh.c -=================================================================== ---- a/src/gcc/config/sh/sh.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/sh/sh.c (.../branches/gcc-4_9-branch) -@@ -19,6 +19,10 @@ - along with GCC; see the file COPYING3. If not see - <http://www.gnu.org/licenses/>. */ - -+#include <sstream> -+#include <vector> -+#include <algorithm> -+ - #include "config.h" - #include "system.h" - #include "coretypes.h" -@@ -70,10 +74,6 @@ - #include "pass_manager.h" - #include "context.h" - --#include <sstream> --#include <vector> --#include <algorithm> -- - int code_for_indirect_jump_scratch = CODE_FOR_indirect_jump_scratch; - - /* These are some macros to abstract register modes. */ -Index: gcc/config/initfini-array.h -=================================================================== ---- a/src/gcc/config/initfini-array.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/initfini-array.h (.../branches/gcc-4_9-branch) -@@ -14,8 +14,13 @@ - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - -- You should have received a copy of the GNU General Public License -- along with GCC; see the file COPYING3. If not see -+ Under Section 7 of GPL version 3, you are granted additional -+ permissions described in the GCC Runtime Library Exception, version -+ 3.1, as published by the Free Software Foundation. -+ -+ You should have received a copy of the GNU General Public License and -+ a copy of the GCC Runtime Library Exception along with this program; -+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see - <http://www.gnu.org/licenses/>. */ - - #ifdef HAVE_INITFINI_ARRAY_SUPPORT -Index: gcc/config/avr/avr-fixed.md -=================================================================== ---- a/src/gcc/config/avr/avr-fixed.md (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/avr/avr-fixed.md (.../branches/gcc-4_9-branch) -@@ -430,8 +430,8 @@ - } - - // Input and output of the libgcc function -- const unsigned int regno_in[] = { -1, 22, 22, -1, 18 }; -- const unsigned int regno_out[] = { -1, 24, 24, -1, 22 }; -+ const unsigned int regno_in[] = { -1U, 22, 22, -1U, 18 }; -+ const unsigned int regno_out[] = { -1U, 24, 24, -1U, 22 }; - - operands[3] = gen_rtx_REG (<MODE>mode, regno_out[(size_t) GET_MODE_SIZE (<MODE>mode)]); - operands[4] = gen_rtx_REG (<MODE>mode, regno_in[(size_t) GET_MODE_SIZE (<MODE>mode)]); -Index: gcc/config/avr/avr.md -=================================================================== ---- a/src/gcc/config/avr/avr.md (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/avr/avr.md (.../branches/gcc-4_9-branch) -@@ -90,7 +90,7 @@ - (include "constraints.md") - - ;; Condition code settings. --(define_attr "cc" "none,set_czn,set_zn,set_n,compare,clobber, -+(define_attr "cc" "none,set_czn,set_zn,set_vzn,set_n,compare,clobber, - plus,ldi" - (const_string "none")) - -@@ -368,6 +368,15 @@ - "" - { - int i; -+ -+ // Avoid (subreg (mem)) for non-generic address spaces below. Because -+ // of the poor addressing capabilities of these spaces it's better to -+ // load them in one chunk. And it avoids PR61443. -+ -+ if (MEM_P (operands[0]) -+ && !ADDR_SPACE_GENERIC_P (MEM_ADDR_SPACE (operands[0]))) -+ operands[0] = copy_to_mode_reg (<MODE>mode, operands[0]); -+ - for (i = GET_MODE_SIZE (<MODE>mode) - 1; i >= 0; --i) - { - rtx part = simplify_gen_subreg (QImode, operands[0], <MODE>mode, i); -@@ -1098,7 +1107,7 @@ - inc %0\;inc %0 - dec %0\;dec %0" - [(set_attr "length" "1,1,1,1,2,2") -- (set_attr "cc" "set_czn,set_czn,set_zn,set_zn,set_zn,set_zn")]) -+ (set_attr "cc" "set_czn,set_czn,set_vzn,set_vzn,set_vzn,set_vzn")]) - - ;; "addhi3" - ;; "addhq3" "adduhq3" -@@ -1369,7 +1378,7 @@ - dec %0\;dec %0 - inc %0\;inc %0" - [(set_attr "length" "1,1,1,1,2,2") -- (set_attr "cc" "set_czn,set_czn,set_zn,set_zn,set_zn,set_zn")]) -+ (set_attr "cc" "set_czn,set_czn,set_vzn,set_vzn,set_vzn,set_vzn")]) - - ;; "subhi3" - ;; "subhq3" "subuhq3" -@@ -3992,7 +4001,7 @@ - "" - "neg %0" - [(set_attr "length" "1") -- (set_attr "cc" "set_zn")]) -+ (set_attr "cc" "set_vzn")]) - - (define_insn "*negqihi2" - [(set (match_operand:HI 0 "register_operand" "=r") -Index: gcc/config/avr/avr-mcus.def -=================================================================== ---- a/src/gcc/config/avr/avr-mcus.def (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/avr/avr-mcus.def (.../branches/gcc-4_9-branch) -@@ -291,7 +291,7 @@ - AVR_MCU ("atxmega192d3", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega192D3__", 0x2000, 4, "x192d3") - AVR_MCU ("atxmega256a3", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega256A3__", 0x2000, 5, "x256a3") - AVR_MCU ("atxmega256a3b", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega256A3B__", 0x2000, 5, "x256a3b") --AVR_MCU ("atxmega256a3bu", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega258A3BU__", 0x2000, 5, "x256a3bu") -+AVR_MCU ("atxmega256a3bu", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega256A3BU__", 0x2000, 5, "x256a3bu") - AVR_MCU ("atxmega256d3", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega256D3__", 0x2000, 5, "x256d3") - AVR_MCU ("atxmega128a3u", ARCH_AVRXMEGA6, AVR_ISA_RMW, "__AVR_ATxmega128A3U__", 0x2000, 3, "x128a3u") - AVR_MCU ("atxmega128b1", ARCH_AVRXMEGA6, AVR_ISA_RMW, "__AVR_ATxmega128B1__", 0x2000, 3, "x128b1") -Index: gcc/config/avr/avr.c -=================================================================== ---- a/src/gcc/config/avr/avr.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/avr/avr.c (.../branches/gcc-4_9-branch) -@@ -2353,6 +2353,12 @@ - } - break; - -+ case CC_SET_VZN: -+ /* Insn like INC, DEC, NEG that set Z,N,V. We currently don't make use -+ of this combination, cf. also PR61055. */ -+ CC_STATUS_INIT; -+ break; -+ - case CC_SET_CZN: - /* Insn sets the Z,N,C flags of CC to recog_operand[0]. - The V flag may or may not be known but that's ok because -@@ -3987,7 +3993,7 @@ - "std Y+61,%A1" CR_TAB - "std Y+62,%B1" CR_TAB - "std Y+63,%C1" CR_TAB -- "sbiw r28,%o0-60", op, plen, -5); -+ "sbiw r28,%o0-61", op, plen, -5); - - return avr_asm_len ("subi r28,lo8(-%o0)" CR_TAB - "sbci r29,hi8(-%o0)" CR_TAB -@@ -6284,7 +6290,7 @@ - - if (REG_P (xop[2])) - { -- *pcc = MINUS == code ? (int) CC_SET_CZN : (int) CC_SET_N; -+ *pcc = MINUS == code ? (int) CC_SET_CZN : (int) CC_CLOBBER; - - for (i = 0; i < n_bytes; i++) - { -@@ -6393,7 +6399,7 @@ - op, plen, 1); - - if (n_bytes == 2 && PLUS == code) -- *pcc = CC_SET_ZN; -+ *pcc = CC_SET_CZN; - } - - i++; -@@ -6416,6 +6422,7 @@ - { - avr_asm_len ((code == PLUS) ^ (val8 == 1) ? "dec %0" : "inc %0", - op, plen, 1); -+ *pcc = CC_CLOBBER; - break; - } - -Index: gcc/config/avr/avr.h -=================================================================== ---- a/src/gcc/config/avr/avr.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/avr/avr.h (.../branches/gcc-4_9-branch) -@@ -251,18 +251,18 @@ - #define REG_CLASS_CONTENTS { \ - {0x00000000,0x00000000}, /* NO_REGS */ \ - {0x00000001,0x00000000}, /* R0_REG */ \ -- {3 << REG_X,0x00000000}, /* POINTER_X_REGS, r26 - r27 */ \ -- {3 << REG_Y,0x00000000}, /* POINTER_Y_REGS, r28 - r29 */ \ -- {3 << REG_Z,0x00000000}, /* POINTER_Z_REGS, r30 - r31 */ \ -+ {3u << REG_X,0x00000000}, /* POINTER_X_REGS, r26 - r27 */ \ -+ {3u << REG_Y,0x00000000}, /* POINTER_Y_REGS, r28 - r29 */ \ -+ {3u << REG_Z,0x00000000}, /* POINTER_Z_REGS, r30 - r31 */ \ - {0x00000000,0x00000003}, /* STACK_REG, STACK */ \ -- {(3 << REG_Y) | (3 << REG_Z), \ -+ {(3u << REG_Y) | (3u << REG_Z), \ - 0x00000000}, /* BASE_POINTER_REGS, r28 - r31 */ \ -- {(3 << REG_X) | (3 << REG_Y) | (3 << REG_Z), \ -+ {(3u << REG_X) | (3u << REG_Y) | (3u << REG_Z), \ - 0x00000000}, /* POINTER_REGS, r26 - r31 */ \ -- {(3 << REG_X) | (3 << REG_Y) | (3 << REG_Z) | (3 << REG_W), \ -+ {(3u << REG_X) | (3u << REG_Y) | (3u << REG_Z) | (3u << REG_W), \ - 0x00000000}, /* ADDW_REGS, r24 - r31 */ \ - {0x00ff0000,0x00000000}, /* SIMPLE_LD_REGS r16 - r23 */ \ -- {(3 << REG_X)|(3 << REG_Y)|(3 << REG_Z)|(3 << REG_W)|(0xff << 16), \ -+ {(3u << REG_X)|(3u << REG_Y)|(3u << REG_Z)|(3u << REG_W)|(0xffu << 16),\ - 0x00000000}, /* LD_REGS, r16 - r31 */ \ - {0x0000ffff,0x00000000}, /* NO_LD_REGS r0 - r15 */ \ - {0xffffffff,0x00000000}, /* GENERAL_REGS, r0 - r31 */ \ -Index: gcc/config/dbx.h -=================================================================== ---- a/src/gcc/config/dbx.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/dbx.h (.../branches/gcc-4_9-branch) -@@ -13,8 +13,13 @@ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - --You should have received a copy of the GNU General Public License --along with GCC; see the file COPYING3. If not see -+Under Section 7 of GPL version 3, you are granted additional -+permissions described in the GCC Runtime Library Exception, version -+3.1, as published by the Free Software Foundation. -+ -+You should have received a copy of the GNU General Public License and -+a copy of the GCC Runtime Library Exception along with this program; -+see the files COPYING3 and COPYING.RUNTIME respectively. If not, see - <http://www.gnu.org/licenses/>. */ - - /* This file causes gcc to prefer using DBX (stabs) debugging -Index: gcc/config/sol2.opt -=================================================================== ---- a/src/gcc/config/sol2.opt (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/sol2.opt (.../branches/gcc-4_9-branch) -@@ -27,6 +27,10 @@ - Ym, - Driver Joined - -+mclear-hwcap -+Target Report -+Clear hardware capabilities when linking -+ - mimpure-text - Target Report - Pass -z text to linker -Index: gcc/config/t-sol2 -=================================================================== ---- a/src/gcc/config/t-sol2 (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/t-sol2 (.../branches/gcc-4_9-branch) -@@ -35,3 +35,10 @@ - sol2.o: $(srcdir)/config/sol2.c - $(COMPILE) $< - $(POSTCOMPILE) -+ -+# Install clearcap.map if present. -+install: install-clearcap-map -+ -+# Ignore failures: file only exists if linker supports it. -+install-clearcap-map: -+ -$(INSTALL_DATA) clearcap.map $(DESTDIR)$(libdir) -Index: gcc/config/newlib-stdint.h -=================================================================== ---- a/src/gcc/config/newlib-stdint.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/newlib-stdint.h (.../branches/gcc-4_9-branch) -@@ -13,8 +13,13 @@ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - --You should have received a copy of the GNU General Public License --along with GCC; see the file COPYING3. If not see -+Under Section 7 of GPL version 3, you are granted additional -+permissions described in the GCC Runtime Library Exception, version -+3.1, as published by the Free Software Foundation. -+ -+You should have received a copy of the GNU General Public License and -+a copy of the GCC Runtime Library Exception along with this program; -+see the files COPYING3 and COPYING.RUNTIME respectively. If not, see - <http://www.gnu.org/licenses/>. */ - - /* newlib uses 32-bit long in certain cases for all non-SPU -Index: gcc/config/sol2-clearcapv2.map -=================================================================== ---- a/src/gcc/config/sol2-clearcapv2.map (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/sol2-clearcapv2.map (.../branches/gcc-4_9-branch) -@@ -0,0 +1,7 @@ -+# Clear all hardware capabilities emitted by Sun as. -+# -+# Uses mapfile v2 syntax which is the only way to clear AT_SUN_CAP_HW2 flags. -+$mapfile_version 2 -+CAPABILITY { -+ HW = ; -+}; -Index: gcc/config/rtems.h -=================================================================== ---- a/src/gcc/config/rtems.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/rtems.h (.../branches/gcc-4_9-branch) -@@ -13,8 +13,13 @@ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - --You should have received a copy of the GNU General Public License --along with GCC; see the file COPYING3. If not see -+Under Section 7 of GPL version 3, you are granted additional -+permissions described in the GCC Runtime Library Exception, version -+3.1, as published by the Free Software Foundation. -+ -+You should have received a copy of the GNU General Public License and -+a copy of the GCC Runtime Library Exception along with this program; -+see the files COPYING3 and COPYING.RUNTIME respectively. If not, see - <http://www.gnu.org/licenses/>. */ - - /* The system headers under RTEMS are C++-aware. */ -Index: gcc/config/aarch64/aarch64-simd.md -=================================================================== ---- a/src/gcc/config/aarch64/aarch64-simd.md (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/aarch64/aarch64-simd.md (.../branches/gcc-4_9-branch) -@@ -934,14 +934,22 @@ - [(set_attr "type" "neon_minmax<q>")] - ) - --;; Move into low-half clearing high half to 0. -+;; vec_concat gives a new vector with the low elements from operand 1, and -+;; the high elements from operand 2. That is to say, given op1 = { a, b } -+;; op2 = { c, d }, vec_concat (op1, op2) = { a, b, c, d }. -+;; What that means, is that the RTL descriptions of the below patterns -+;; need to change depending on endianness. - --(define_insn "move_lo_quad_<mode>" -+;; Move to the low architectural bits of the register. -+;; On little-endian this is { operand, zeroes } -+;; On big-endian this is { zeroes, operand } -+ -+(define_insn "move_lo_quad_internal_<mode>" - [(set (match_operand:VQ 0 "register_operand" "=w,w,w") - (vec_concat:VQ - (match_operand:<VHALF> 1 "register_operand" "w,r,r") - (vec_duplicate:<VHALF> (const_int 0))))] -- "TARGET_SIMD" -+ "TARGET_SIMD && !BYTES_BIG_ENDIAN" - "@ - dup\\t%d0, %1.d[0] - fmov\\t%d0, %1 -@@ -952,8 +960,40 @@ - (set_attr "length" "4")] - ) - --;; Move into high-half. -+(define_insn "move_lo_quad_internal_be_<mode>" -+ [(set (match_operand:VQ 0 "register_operand" "=w,w,w") -+ (vec_concat:VQ -+ (vec_duplicate:<VHALF> (const_int 0)) -+ (match_operand:<VHALF> 1 "register_operand" "w,r,r")))] -+ "TARGET_SIMD && BYTES_BIG_ENDIAN" -+ "@ -+ dup\\t%d0, %1.d[0] -+ fmov\\t%d0, %1 -+ dup\\t%d0, %1" -+ [(set_attr "type" "neon_dup<q>,f_mcr,neon_dup<q>") -+ (set_attr "simd" "yes,*,yes") -+ (set_attr "fp" "*,yes,*") -+ (set_attr "length" "4")] -+) - -+(define_expand "move_lo_quad_<mode>" -+ [(match_operand:VQ 0 "register_operand") -+ (match_operand:VQ 1 "register_operand")] -+ "TARGET_SIMD" -+{ -+ if (BYTES_BIG_ENDIAN) -+ emit_insn (gen_move_lo_quad_internal_be_<mode> (operands[0], operands[1])); -+ else -+ emit_insn (gen_move_lo_quad_internal_<mode> (operands[0], operands[1])); -+ DONE; -+} -+) -+ -+;; Move operand1 to the high architectural bits of the register, keeping -+;; the low architectural bits of operand2. -+;; For little-endian this is { operand2, operand1 } -+;; For big-endian this is { operand1, operand2 } -+ - (define_insn "aarch64_simd_move_hi_quad_<mode>" - [(set (match_operand:VQ 0 "register_operand" "+w,w") - (vec_concat:VQ -@@ -961,22 +1001,39 @@ - (match_dup 0) - (match_operand:VQ 2 "vect_par_cnst_lo_half" "")) - (match_operand:<VHALF> 1 "register_operand" "w,r")))] -- "TARGET_SIMD" -+ "TARGET_SIMD && !BYTES_BIG_ENDIAN" - "@ - ins\\t%0.d[1], %1.d[0] - ins\\t%0.d[1], %1" -- [(set_attr "type" "neon_ins") -- (set_attr "length" "4")] -+ [(set_attr "type" "neon_ins")] - ) - -+(define_insn "aarch64_simd_move_hi_quad_be_<mode>" -+ [(set (match_operand:VQ 0 "register_operand" "+w,w") -+ (vec_concat:VQ -+ (match_operand:<VHALF> 1 "register_operand" "w,r") -+ (vec_select:<VHALF> -+ (match_dup 0) -+ (match_operand:VQ 2 "vect_par_cnst_hi_half" ""))))] -+ "TARGET_SIMD && BYTES_BIG_ENDIAN" -+ "@ -+ ins\\t%0.d[1], %1.d[0] -+ ins\\t%0.d[1], %1" -+ [(set_attr "type" "neon_ins")] -+) -+ - (define_expand "move_hi_quad_<mode>" - [(match_operand:VQ 0 "register_operand" "") - (match_operand:<VHALF> 1 "register_operand" "")] - "TARGET_SIMD" - { -- rtx p = aarch64_simd_vect_par_cnst_half (<MODE>mode, false); -- emit_insn (gen_aarch64_simd_move_hi_quad_<mode> (operands[0], -- operands[1], p)); -+ rtx p = aarch64_simd_vect_par_cnst_half (<MODE>mode, BYTES_BIG_ENDIAN); -+ if (BYTES_BIG_ENDIAN) -+ emit_insn (gen_aarch64_simd_move_hi_quad_be_<mode> (operands[0], -+ operands[1], p)); -+ else -+ emit_insn (gen_aarch64_simd_move_hi_quad_<mode> (operands[0], -+ operands[1], p)); - DONE; - }) - -@@ -2321,13 +2378,45 @@ - (vec_concat:<VDBL> - (match_operand:VDIC 1 "register_operand" "w") - (match_operand:VDIC 2 "aarch64_simd_imm_zero" "Dz")))] -- "TARGET_SIMD" -+ "TARGET_SIMD && !BYTES_BIG_ENDIAN" - "mov\\t%0.8b, %1.8b" - [(set_attr "type" "neon_move<q>")] - ) - --(define_insn_and_split "aarch64_combine<mode>" -+(define_insn "*aarch64_combinez_be<mode>" - [(set (match_operand:<VDBL> 0 "register_operand" "=&w") -+ (vec_concat:<VDBL> -+ (match_operand:VDIC 2 "aarch64_simd_imm_zero" "Dz") -+ (match_operand:VDIC 1 "register_operand" "w")))] -+ "TARGET_SIMD && BYTES_BIG_ENDIAN" -+ "mov\\t%0.8b, %1.8b" -+ [(set_attr "type" "neon_move<q>")] -+) -+ -+(define_expand "aarch64_combine<mode>" -+ [(match_operand:<VDBL> 0 "register_operand") -+ (match_operand:VDC 1 "register_operand") -+ (match_operand:VDC 2 "register_operand")] -+ "TARGET_SIMD" -+{ -+ rtx op1, op2; -+ if (BYTES_BIG_ENDIAN) -+ { -+ op1 = operands[2]; -+ op2 = operands[1]; -+ } -+ else -+ { -+ op1 = operands[1]; -+ op2 = operands[2]; -+ } -+ emit_insn (gen_aarch64_combine_internal<mode> (operands[0], op1, op2)); -+ DONE; -+} -+) -+ -+(define_insn_and_split "aarch64_combine_internal<mode>" -+ [(set (match_operand:<VDBL> 0 "register_operand" "=&w") - (vec_concat:<VDBL> (match_operand:VDC 1 "register_operand" "w") - (match_operand:VDC 2 "register_operand" "w")))] - "TARGET_SIMD" -@@ -2335,7 +2424,10 @@ - "&& reload_completed" - [(const_int 0)] - { -- aarch64_split_simd_combine (operands[0], operands[1], operands[2]); -+ if (BYTES_BIG_ENDIAN) -+ aarch64_split_simd_combine (operands[0], operands[2], operands[1]); -+ else -+ aarch64_split_simd_combine (operands[0], operands[1], operands[2]); - DONE; - } - [(set_attr "type" "multiple")] -@@ -2342,9 +2434,9 @@ - ) - - (define_expand "aarch64_simd_combine<mode>" -- [(set (match_operand:<VDBL> 0 "register_operand" "=&w") -- (vec_concat:<VDBL> (match_operand:VDC 1 "register_operand" "w") -- (match_operand:VDC 2 "register_operand" "w")))] -+ [(match_operand:<VDBL> 0 "register_operand") -+ (match_operand:VDC 1 "register_operand") -+ (match_operand:VDC 2 "register_operand")] - "TARGET_SIMD" - { - emit_insn (gen_move_lo_quad_<Vdbl> (operands[0], operands[1])); -@@ -2633,7 +2725,41 @@ - - ;; sq<r>dmulh_lane - --(define_insn "aarch64_sq<r>dmulh_lane<mode>" -+(define_expand "aarch64_sqdmulh_lane<mode>" -+ [(match_operand:VDQHS 0 "register_operand" "") -+ (match_operand:VDQHS 1 "register_operand" "") -+ (match_operand:<VCOND> 2 "register_operand" "") -+ (match_operand:SI 3 "immediate_operand" "")] -+ "TARGET_SIMD" -+ { -+ aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCOND>mode)); -+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[3]))); -+ emit_insn (gen_aarch64_sqdmulh_lane<mode>_internal (operands[0], -+ operands[1], -+ operands[2], -+ operands[3])); -+ DONE; -+ } -+) -+ -+(define_expand "aarch64_sqrdmulh_lane<mode>" -+ [(match_operand:VDQHS 0 "register_operand" "") -+ (match_operand:VDQHS 1 "register_operand" "") -+ (match_operand:<VCOND> 2 "register_operand" "") -+ (match_operand:SI 3 "immediate_operand" "")] -+ "TARGET_SIMD" -+ { -+ aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCOND>mode)); -+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[3]))); -+ emit_insn (gen_aarch64_sqrdmulh_lane<mode>_internal (operands[0], -+ operands[1], -+ operands[2], -+ operands[3])); -+ DONE; -+ } -+) -+ -+(define_insn "aarch64_sq<r>dmulh_lane<mode>_internal" - [(set (match_operand:VDQHS 0 "register_operand" "=w") - (unspec:VDQHS - [(match_operand:VDQHS 1 "register_operand" "w") -@@ -2649,7 +2775,41 @@ - [(set_attr "type" "neon_sat_mul_<Vetype>_scalar<q>")] - ) - --(define_insn "aarch64_sq<r>dmulh_laneq<mode>" -+(define_expand "aarch64_sqdmulh_laneq<mode>" -+ [(match_operand:VDQHS 0 "register_operand" "") -+ (match_operand:VDQHS 1 "register_operand" "") -+ (match_operand:<VCONQ> 2 "register_operand" "") -+ (match_operand:SI 3 "immediate_operand" "")] -+ "TARGET_SIMD" -+ { -+ aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCONQ>mode)); -+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCONQ>mode, INTVAL (operands[3]))); -+ emit_insn (gen_aarch64_sqdmulh_laneq<mode>_internal (operands[0], -+ operands[1], -+ operands[2], -+ operands[3])); -+ DONE; -+ } -+) -+ -+(define_expand "aarch64_sqrdmulh_laneq<mode>" -+ [(match_operand:VDQHS 0 "register_operand" "") -+ (match_operand:VDQHS 1 "register_operand" "") -+ (match_operand:<VCONQ> 2 "register_operand" "") -+ (match_operand:SI 3 "immediate_operand" "")] -+ "TARGET_SIMD" -+ { -+ aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCONQ>mode)); -+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCONQ>mode, INTVAL (operands[3]))); -+ emit_insn (gen_aarch64_sqrdmulh_laneq<mode>_internal (operands[0], -+ operands[1], -+ operands[2], -+ operands[3])); -+ DONE; -+ } -+) -+ -+(define_insn "aarch64_sq<r>dmulh_laneq<mode>_internal" - [(set (match_operand:VDQHS 0 "register_operand" "=w") - (unspec:VDQHS - [(match_operand:VDQHS 1 "register_operand" "w") -@@ -2659,24 +2819,56 @@ - VQDMULH))] - "TARGET_SIMD" - "* -- aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCONQ>mode)); - operands[3] = GEN_INT (ENDIAN_LANE_N (<VCONQ>mode, INTVAL (operands[3]))); - return \"sq<r>dmulh\\t%0.<Vtype>, %1.<Vtype>, %2.<Vetype>[%3]\";" - [(set_attr "type" "neon_sat_mul_<Vetype>_scalar<q>")] - ) - --(define_insn "aarch64_sq<r>dmulh_lane<mode>" -+(define_expand "aarch64_sqdmulh_lane<mode>" -+ [(match_operand:SD_HSI 0 "register_operand" "") -+ (match_operand:SD_HSI 1 "register_operand" "") -+ (match_operand:<VCOND> 2 "register_operand" "") -+ (match_operand:SI 3 "immediate_operand" "")] -+ "TARGET_SIMD" -+ { -+ aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCOND>mode)); -+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[3]))); -+ emit_insn (gen_aarch64_sqdmulh_lane<mode>_internal (operands[0], -+ operands[1], -+ operands[2], -+ operands[3])); -+ DONE; -+ } -+) -+ -+(define_expand "aarch64_sqrdmulh_lane<mode>" -+ [(match_operand:SD_HSI 0 "register_operand" "") -+ (match_operand:SD_HSI 1 "register_operand" "") -+ (match_operand:<VCOND> 2 "register_operand" "") -+ (match_operand:SI 3 "immediate_operand" "")] -+ "TARGET_SIMD" -+ { -+ aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCOND>mode)); -+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[3]))); -+ emit_insn (gen_aarch64_sqrdmulh_lane<mode>_internal (operands[0], -+ operands[1], -+ operands[2], -+ operands[3])); -+ DONE; -+ } -+) -+ -+(define_insn "aarch64_sq<r>dmulh_lane<mode>_internal" - [(set (match_operand:SD_HSI 0 "register_operand" "=w") - (unspec:SD_HSI - [(match_operand:SD_HSI 1 "register_operand" "w") - (vec_select:<VEL> -- (match_operand:<VCONQ> 2 "register_operand" "<vwx>") -+ (match_operand:<VCOND> 2 "register_operand" "<vwx>") - (parallel [(match_operand:SI 3 "immediate_operand" "i")]))] - VQDMULH))] - "TARGET_SIMD" - "* -- aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCONQ>mode)); -- operands[3] = GEN_INT (ENDIAN_LANE_N (<VCONQ>mode, INTVAL (operands[3]))); -+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[3]))); - return \"sq<r>dmulh\\t%<v>0, %<v>1, %2.<v>[%3]\";" - [(set_attr "type" "neon_sat_mul_<Vetype>_scalar<q>")] - ) -@@ -2712,12 +2904,36 @@ - (sign_extend:<VWIDE> - (vec_duplicate:VD_HSI - (vec_select:<VEL> -- (match_operand:<VCON> 3 "register_operand" "<vwx>") -+ (match_operand:<VCOND> 3 "register_operand" "<vwx>") - (parallel [(match_operand:SI 4 "immediate_operand" "i")]))) - )) - (const_int 1))))] - "TARGET_SIMD" - { -+ operands[4] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[4]))); -+ return -+ "sqdml<SBINQOPS:as>l\\t%<vw2>0<Vmwtype>, %<v>2<Vmtype>, %3.<Vetype>[%4]"; -+ } -+ [(set_attr "type" "neon_sat_mla_<Vetype>_scalar_long")] -+) -+ -+(define_insn "aarch64_sqdml<SBINQOPS:as>l_laneq<mode>_internal" -+ [(set (match_operand:<VWIDE> 0 "register_operand" "=w") -+ (SBINQOPS:<VWIDE> -+ (match_operand:<VWIDE> 1 "register_operand" "0") -+ (ss_ashift:<VWIDE> -+ (mult:<VWIDE> -+ (sign_extend:<VWIDE> -+ (match_operand:VD_HSI 2 "register_operand" "w")) -+ (sign_extend:<VWIDE> -+ (vec_duplicate:VD_HSI -+ (vec_select:<VEL> -+ (match_operand:<VCONQ> 3 "register_operand" "<vwx>") -+ (parallel [(match_operand:SI 4 "immediate_operand" "i")]))) -+ )) -+ (const_int 1))))] -+ "TARGET_SIMD" -+ { - operands[4] = GEN_INT (ENDIAN_LANE_N (<VCONQ>mode, INTVAL (operands[4]))); - return - "sqdml<SBINQOPS:as>l\\t%<vw2>0<Vmwtype>, %<v>2<Vmtype>, %3.<Vetype>[%4]"; -@@ -2735,12 +2951,35 @@ - (match_operand:SD_HSI 2 "register_operand" "w")) - (sign_extend:<VWIDE> - (vec_select:<VEL> -- (match_operand:<VCON> 3 "register_operand" "<vwx>") -+ (match_operand:<VCOND> 3 "register_operand" "<vwx>") - (parallel [(match_operand:SI 4 "immediate_operand" "i")]))) - ) - (const_int 1))))] - "TARGET_SIMD" - { -+ operands[4] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[4]))); -+ return -+ "sqdml<SBINQOPS:as>l\\t%<vw2>0<Vmwtype>, %<v>2<Vmtype>, %3.<Vetype>[%4]"; -+ } -+ [(set_attr "type" "neon_sat_mla_<Vetype>_scalar_long")] -+) -+ -+(define_insn "aarch64_sqdml<SBINQOPS:as>l_laneq<mode>_internal" -+ [(set (match_operand:<VWIDE> 0 "register_operand" "=w") -+ (SBINQOPS:<VWIDE> -+ (match_operand:<VWIDE> 1 "register_operand" "0") -+ (ss_ashift:<VWIDE> -+ (mult:<VWIDE> -+ (sign_extend:<VWIDE> -+ (match_operand:SD_HSI 2 "register_operand" "w")) -+ (sign_extend:<VWIDE> -+ (vec_select:<VEL> -+ (match_operand:<VCONQ> 3 "register_operand" "<vwx>") -+ (parallel [(match_operand:SI 4 "immediate_operand" "i")]))) -+ ) -+ (const_int 1))))] -+ "TARGET_SIMD" -+ { - operands[4] = GEN_INT (ENDIAN_LANE_N (<VCONQ>mode, INTVAL (operands[4]))); - return - "sqdml<SBINQOPS:as>l\\t%<vw2>0<Vmwtype>, %<v>2<Vmtype>, %3.<Vetype>[%4]"; -@@ -2752,11 +2991,12 @@ - [(match_operand:<VWIDE> 0 "register_operand" "=w") - (match_operand:<VWIDE> 1 "register_operand" "0") - (match_operand:VSD_HSI 2 "register_operand" "w") -- (match_operand:<VCON> 3 "register_operand" "<vwx>") -+ (match_operand:<VCOND> 3 "register_operand" "<vwx>") - (match_operand:SI 4 "immediate_operand" "i")] - "TARGET_SIMD" - { -- aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<VCON>mode) / 2); -+ aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<VCOND>mode)); -+ operands[4] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[4]))); - emit_insn (gen_aarch64_sqdmlal_lane<mode>_internal (operands[0], operands[1], - operands[2], operands[3], - operands[4])); -@@ -2767,12 +3007,13 @@ - [(match_operand:<VWIDE> 0 "register_operand" "=w") - (match_operand:<VWIDE> 1 "register_operand" "0") - (match_operand:VSD_HSI 2 "register_operand" "w") -- (match_operand:<VCON> 3 "register_operand" "<vwx>") -+ (match_operand:<VCONQ> 3 "register_operand" "<vwx>") - (match_operand:SI 4 "immediate_operand" "i")] - "TARGET_SIMD" - { -- aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<VCON>mode)); -- emit_insn (gen_aarch64_sqdmlal_lane<mode>_internal (operands[0], operands[1], -+ aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<VCONQ>mode)); -+ operands[4] = GEN_INT (ENDIAN_LANE_N (<VCONQ>mode, INTVAL (operands[4]))); -+ emit_insn (gen_aarch64_sqdmlal_laneq<mode>_internal (operands[0], operands[1], - operands[2], operands[3], - operands[4])); - DONE; -@@ -2782,11 +3023,12 @@ - [(match_operand:<VWIDE> 0 "register_operand" "=w") - (match_operand:<VWIDE> 1 "register_operand" "0") - (match_operand:VSD_HSI 2 "register_operand" "w") -- (match_operand:<VCON> 3 "register_operand" "<vwx>") -+ (match_operand:<VCOND> 3 "register_operand" "<vwx>") - (match_operand:SI 4 "immediate_operand" "i")] - "TARGET_SIMD" - { -- aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<VCON>mode) / 2); -+ aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<VCOND>mode)); -+ operands[4] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[4]))); - emit_insn (gen_aarch64_sqdmlsl_lane<mode>_internal (operands[0], operands[1], - operands[2], operands[3], - operands[4])); -@@ -2797,12 +3039,13 @@ - [(match_operand:<VWIDE> 0 "register_operand" "=w") - (match_operand:<VWIDE> 1 "register_operand" "0") - (match_operand:VSD_HSI 2 "register_operand" "w") -- (match_operand:<VCON> 3 "register_operand" "<vwx>") -+ (match_operand:<VCONQ> 3 "register_operand" "<vwx>") - (match_operand:SI 4 "immediate_operand" "i")] - "TARGET_SIMD" - { -- aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<VCON>mode)); -- emit_insn (gen_aarch64_sqdmlsl_lane<mode>_internal (operands[0], operands[1], -+ aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<VCONQ>mode)); -+ operands[4] = GEN_INT (ENDIAN_LANE_N (<VCONQ>mode, INTVAL (operands[4]))); -+ emit_insn (gen_aarch64_sqdmlsl_laneq<mode>_internal (operands[0], operands[1], - operands[2], operands[3], - operands[4])); - DONE; -@@ -2890,12 +3133,38 @@ - (sign_extend:<VWIDE> - (vec_duplicate:<VHALF> - (vec_select:<VEL> -- (match_operand:<VCON> 3 "register_operand" "<vwx>") -+ (match_operand:<VCOND> 3 "register_operand" "<vwx>") - (parallel [(match_operand:SI 4 "immediate_operand" "i")]) - )))) - (const_int 1))))] - "TARGET_SIMD" - { -+ operands[4] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[4]))); -+ return -+ "sqdml<SBINQOPS:as>l2\\t%<vw2>0<Vmwtype>, %<v>2<Vmtype>, %3.<Vetype>[%4]"; -+ } -+ [(set_attr "type" "neon_sat_mla_<Vetype>_scalar_long")] -+) -+ -+(define_insn "aarch64_sqdml<SBINQOPS:as>l2_laneq<mode>_internal" -+ [(set (match_operand:<VWIDE> 0 "register_operand" "=w") -+ (SBINQOPS:<VWIDE> -+ (match_operand:<VWIDE> 1 "register_operand" "0") -+ (ss_ashift:<VWIDE> -+ (mult:<VWIDE> -+ (sign_extend:<VWIDE> -+ (vec_select:<VHALF> -+ (match_operand:VQ_HSI 2 "register_operand" "w") -+ (match_operand:VQ_HSI 5 "vect_par_cnst_hi_half" ""))) -+ (sign_extend:<VWIDE> -+ (vec_duplicate:<VHALF> -+ (vec_select:<VEL> -+ (match_operand:<VCONQ> 3 "register_operand" "<vwx>") -+ (parallel [(match_operand:SI 4 "immediate_operand" "i")]) -+ )))) -+ (const_int 1))))] -+ "TARGET_SIMD" -+ { - operands[4] = GEN_INT (ENDIAN_LANE_N (<VCONQ>mode, INTVAL (operands[4]))); - return - "sqdml<SBINQOPS:as>l2\\t%<vw2>0<Vmwtype>, %<v>2<Vmtype>, %3.<Vetype>[%4]"; -@@ -2907,12 +3176,13 @@ - [(match_operand:<VWIDE> 0 "register_operand" "=w") - (match_operand:<VWIDE> 1 "register_operand" "w") - (match_operand:VQ_HSI 2 "register_operand" "w") -- (match_operand:<VCON> 3 "register_operand" "<vwx>") -+ (match_operand:<VCOND> 3 "register_operand" "<vwx>") - (match_operand:SI 4 "immediate_operand" "i")] - "TARGET_SIMD" - { - rtx p = aarch64_simd_vect_par_cnst_half (<MODE>mode, true); -- aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<MODE>mode) / 2); -+ aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<VCOND>mode)); -+ operands[4] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[4]))); - emit_insn (gen_aarch64_sqdmlal2_lane<mode>_internal (operands[0], operands[1], - operands[2], operands[3], - operands[4], p)); -@@ -2923,13 +3193,14 @@ - [(match_operand:<VWIDE> 0 "register_operand" "=w") - (match_operand:<VWIDE> 1 "register_operand" "w") - (match_operand:VQ_HSI 2 "register_operand" "w") -- (match_operand:<VCON> 3 "register_operand" "<vwx>") -+ (match_operand:<VCONQ> 3 "register_operand" "<vwx>") - (match_operand:SI 4 "immediate_operand" "i")] - "TARGET_SIMD" - { - rtx p = aarch64_simd_vect_par_cnst_half (<MODE>mode, true); -- aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<MODE>mode)); -- emit_insn (gen_aarch64_sqdmlal2_lane<mode>_internal (operands[0], operands[1], -+ aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<VCONQ>mode)); -+ operands[4] = GEN_INT (ENDIAN_LANE_N (<VCONQ>mode, INTVAL (operands[4]))); -+ emit_insn (gen_aarch64_sqdmlal2_laneq<mode>_internal (operands[0], operands[1], - operands[2], operands[3], - operands[4], p)); - DONE; -@@ -2939,12 +3210,13 @@ - [(match_operand:<VWIDE> 0 "register_operand" "=w") - (match_operand:<VWIDE> 1 "register_operand" "w") - (match_operand:VQ_HSI 2 "register_operand" "w") -- (match_operand:<VCON> 3 "register_operand" "<vwx>") -+ (match_operand:<VCOND> 3 "register_operand" "<vwx>") - (match_operand:SI 4 "immediate_operand" "i")] - "TARGET_SIMD" - { - rtx p = aarch64_simd_vect_par_cnst_half (<MODE>mode, true); -- aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<MODE>mode) / 2); -+ aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<VCOND>mode)); -+ operands[4] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[4]))); - emit_insn (gen_aarch64_sqdmlsl2_lane<mode>_internal (operands[0], operands[1], - operands[2], operands[3], - operands[4], p)); -@@ -2955,13 +3227,14 @@ - [(match_operand:<VWIDE> 0 "register_operand" "=w") - (match_operand:<VWIDE> 1 "register_operand" "w") - (match_operand:VQ_HSI 2 "register_operand" "w") -- (match_operand:<VCON> 3 "register_operand" "<vwx>") -+ (match_operand:<VCONQ> 3 "register_operand" "<vwx>") - (match_operand:SI 4 "immediate_operand" "i")] - "TARGET_SIMD" - { - rtx p = aarch64_simd_vect_par_cnst_half (<MODE>mode, true); -- aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<MODE>mode)); -- emit_insn (gen_aarch64_sqdmlsl2_lane<mode>_internal (operands[0], operands[1], -+ aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<VCONQ>mode)); -+ operands[4] = GEN_INT (ENDIAN_LANE_N (<VCONQ>mode, INTVAL (operands[4]))); -+ emit_insn (gen_aarch64_sqdmlsl2_laneq<mode>_internal (operands[0], operands[1], - operands[2], operands[3], - operands[4], p)); - DONE; -@@ -3041,12 +3314,33 @@ - (sign_extend:<VWIDE> - (vec_duplicate:VD_HSI - (vec_select:<VEL> -- (match_operand:<VCON> 2 "register_operand" "<vwx>") -+ (match_operand:<VCOND> 2 "register_operand" "<vwx>") - (parallel [(match_operand:SI 3 "immediate_operand" "i")]))) - )) - (const_int 1)))] - "TARGET_SIMD" - { -+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[3]))); -+ return "sqdmull\\t%<vw2>0<Vmwtype>, %<v>1<Vmtype>, %2.<Vetype>[%3]"; -+ } -+ [(set_attr "type" "neon_sat_mul_<Vetype>_scalar_long")] -+) -+ -+(define_insn "aarch64_sqdmull_laneq<mode>_internal" -+ [(set (match_operand:<VWIDE> 0 "register_operand" "=w") -+ (ss_ashift:<VWIDE> -+ (mult:<VWIDE> -+ (sign_extend:<VWIDE> -+ (match_operand:VD_HSI 1 "register_operand" "w")) -+ (sign_extend:<VWIDE> -+ (vec_duplicate:VD_HSI -+ (vec_select:<VEL> -+ (match_operand:<VCONQ> 2 "register_operand" "<vwx>") -+ (parallel [(match_operand:SI 3 "immediate_operand" "i")]))) -+ )) -+ (const_int 1)))] -+ "TARGET_SIMD" -+ { - operands[3] = GEN_INT (ENDIAN_LANE_N (<VCONQ>mode, INTVAL (operands[3]))); - return "sqdmull\\t%<vw2>0<Vmwtype>, %<v>1<Vmtype>, %2.<Vetype>[%3]"; - } -@@ -3061,12 +3355,32 @@ - (match_operand:SD_HSI 1 "register_operand" "w")) - (sign_extend:<VWIDE> - (vec_select:<VEL> -- (match_operand:<VCON> 2 "register_operand" "<vwx>") -+ (match_operand:<VCOND> 2 "register_operand" "<vwx>") - (parallel [(match_operand:SI 3 "immediate_operand" "i")])) - )) - (const_int 1)))] - "TARGET_SIMD" - { -+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[3]))); -+ return "sqdmull\\t%<vw2>0<Vmwtype>, %<v>1<Vmtype>, %2.<Vetype>[%3]"; -+ } -+ [(set_attr "type" "neon_sat_mul_<Vetype>_scalar_long")] -+) -+ -+(define_insn "aarch64_sqdmull_laneq<mode>_internal" -+ [(set (match_operand:<VWIDE> 0 "register_operand" "=w") -+ (ss_ashift:<VWIDE> -+ (mult:<VWIDE> -+ (sign_extend:<VWIDE> -+ (match_operand:SD_HSI 1 "register_operand" "w")) -+ (sign_extend:<VWIDE> -+ (vec_select:<VEL> -+ (match_operand:<VCONQ> 2 "register_operand" "<vwx>") -+ (parallel [(match_operand:SI 3 "immediate_operand" "i")])) -+ )) -+ (const_int 1)))] -+ "TARGET_SIMD" -+ { - operands[3] = GEN_INT (ENDIAN_LANE_N (<VCONQ>mode, INTVAL (operands[3]))); - return "sqdmull\\t%<vw2>0<Vmwtype>, %<v>1<Vmtype>, %2.<Vetype>[%3]"; - } -@@ -3076,11 +3390,12 @@ - (define_expand "aarch64_sqdmull_lane<mode>" - [(match_operand:<VWIDE> 0 "register_operand" "=w") - (match_operand:VSD_HSI 1 "register_operand" "w") -- (match_operand:<VCON> 2 "register_operand" "<vwx>") -+ (match_operand:<VCOND> 2 "register_operand" "<vwx>") - (match_operand:SI 3 "immediate_operand" "i")] - "TARGET_SIMD" - { -- aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCON>mode) / 2); -+ aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCOND>mode)); -+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[3]))); - emit_insn (gen_aarch64_sqdmull_lane<mode>_internal (operands[0], operands[1], - operands[2], operands[3])); - DONE; -@@ -3089,12 +3404,13 @@ - (define_expand "aarch64_sqdmull_laneq<mode>" - [(match_operand:<VWIDE> 0 "register_operand" "=w") - (match_operand:VD_HSI 1 "register_operand" "w") -- (match_operand:<VCON> 2 "register_operand" "<vwx>") -+ (match_operand:<VCONQ> 2 "register_operand" "<vwx>") - (match_operand:SI 3 "immediate_operand" "i")] - "TARGET_SIMD" - { -- aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCON>mode)); -- emit_insn (gen_aarch64_sqdmull_lane<mode>_internal -+ aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCONQ>mode)); -+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCONQ>mode, INTVAL (operands[3]))); -+ emit_insn (gen_aarch64_sqdmull_laneq<mode>_internal - (operands[0], operands[1], operands[2], operands[3])); - DONE; - }) -@@ -3143,7 +3459,7 @@ - (define_expand "aarch64_sqdmull2<mode>" - [(match_operand:<VWIDE> 0 "register_operand" "=w") - (match_operand:VQ_HSI 1 "register_operand" "w") -- (match_operand:<VCON> 2 "register_operand" "w")] -+ (match_operand:VQ_HSI 2 "register_operand" "w")] - "TARGET_SIMD" - { - rtx p = aarch64_simd_vect_par_cnst_half (<MODE>mode, true); -@@ -3165,12 +3481,35 @@ - (sign_extend:<VWIDE> - (vec_duplicate:<VHALF> - (vec_select:<VEL> -- (match_operand:<VCON> 2 "register_operand" "<vwx>") -+ (match_operand:<VCOND> 2 "register_operand" "<vwx>") - (parallel [(match_operand:SI 3 "immediate_operand" "i")]))) - )) - (const_int 1)))] - "TARGET_SIMD" - { -+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[3]))); -+ return "sqdmull2\\t%<vw2>0<Vmwtype>, %<v>1<Vmtype>, %2.<Vetype>[%3]"; -+ } -+ [(set_attr "type" "neon_sat_mul_<Vetype>_scalar_long")] -+) -+ -+(define_insn "aarch64_sqdmull2_laneq<mode>_internal" -+ [(set (match_operand:<VWIDE> 0 "register_operand" "=w") -+ (ss_ashift:<VWIDE> -+ (mult:<VWIDE> -+ (sign_extend:<VWIDE> -+ (vec_select:<VHALF> -+ (match_operand:VQ_HSI 1 "register_operand" "w") -+ (match_operand:VQ_HSI 4 "vect_par_cnst_hi_half" ""))) -+ (sign_extend:<VWIDE> -+ (vec_duplicate:<VHALF> -+ (vec_select:<VEL> -+ (match_operand:<VCONQ> 2 "register_operand" "<vwx>") -+ (parallel [(match_operand:SI 3 "immediate_operand" "i")]))) -+ )) -+ (const_int 1)))] -+ "TARGET_SIMD" -+ { - operands[3] = GEN_INT (ENDIAN_LANE_N (<VCONQ>mode, INTVAL (operands[3]))); - return "sqdmull2\\t%<vw2>0<Vmwtype>, %<v>1<Vmtype>, %2.<Vetype>[%3]"; - } -@@ -3180,12 +3519,13 @@ - (define_expand "aarch64_sqdmull2_lane<mode>" - [(match_operand:<VWIDE> 0 "register_operand" "=w") - (match_operand:VQ_HSI 1 "register_operand" "w") -- (match_operand:<VCON> 2 "register_operand" "<vwx>") -+ (match_operand:<VCOND> 2 "register_operand" "<vwx>") - (match_operand:SI 3 "immediate_operand" "i")] - "TARGET_SIMD" - { - rtx p = aarch64_simd_vect_par_cnst_half (<MODE>mode, true); -- aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<MODE>mode) / 2); -+ aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCOND>mode)); -+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[3]))); - emit_insn (gen_aarch64_sqdmull2_lane<mode>_internal (operands[0], operands[1], - operands[2], operands[3], - p)); -@@ -3195,13 +3535,14 @@ - (define_expand "aarch64_sqdmull2_laneq<mode>" - [(match_operand:<VWIDE> 0 "register_operand" "=w") - (match_operand:VQ_HSI 1 "register_operand" "w") -- (match_operand:<VCON> 2 "register_operand" "<vwx>") -+ (match_operand:<VCONQ> 2 "register_operand" "<vwx>") - (match_operand:SI 3 "immediate_operand" "i")] - "TARGET_SIMD" - { - rtx p = aarch64_simd_vect_par_cnst_half (<MODE>mode, true); -- aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<MODE>mode)); -- emit_insn (gen_aarch64_sqdmull2_lane<mode>_internal (operands[0], operands[1], -+ aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCONQ>mode)); -+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCONQ>mode, INTVAL (operands[3]))); -+ emit_insn (gen_aarch64_sqdmull2_laneq<mode>_internal (operands[0], operands[1], - operands[2], operands[3], - p)); - DONE; -Index: gcc/config/aarch64/arm_neon.h -=================================================================== ---- a/src/gcc/config/aarch64/arm_neon.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/aarch64/arm_neon.h (.../branches/gcc-4_9-branch) -@@ -10111,7 +10111,7 @@ - int16x4_t result; - __asm__ ("sqdmulh %0.4h,%1.4h,%2.h[0]" - : "=w"(result) -- : "w"(a), "w"(b) -+ : "w"(a), "x"(b) - : /* No clobbers */); - return result; - } -@@ -10133,7 +10133,7 @@ - int16x8_t result; - __asm__ ("sqdmulh %0.8h,%1.8h,%2.h[0]" - : "=w"(result) -- : "w"(a), "w"(b) -+ : "w"(a), "x"(b) - : /* No clobbers */); - return result; - } -@@ -21008,7 +21008,7 @@ - } - - __extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) --vqdmlal_high_lane_s16 (int32x4_t __a, int16x8_t __b, int16x8_t __c, -+vqdmlal_high_lane_s16 (int32x4_t __a, int16x8_t __b, int16x4_t __c, - int const __d) - { - return __builtin_aarch64_sqdmlal2_lanev8hi (__a, __b, __c, __d); -@@ -21030,8 +21030,7 @@ - __extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) - vqdmlal_lane_s16 (int32x4_t __a, int16x4_t __b, int16x4_t __c, int const __d) - { -- int16x8_t __tmp = vcombine_s16 (__c, vcreate_s16 (__AARCH64_INT64_C (0))); -- return __builtin_aarch64_sqdmlal_lanev4hi (__a, __b, __tmp, __d); -+ return __builtin_aarch64_sqdmlal_lanev4hi (__a, __b, __c, __d); - } - - __extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) -@@ -21059,7 +21058,7 @@ - } - - __extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) --vqdmlal_high_lane_s32 (int64x2_t __a, int32x4_t __b, int32x4_t __c, -+vqdmlal_high_lane_s32 (int64x2_t __a, int32x4_t __b, int32x2_t __c, - int const __d) - { - return __builtin_aarch64_sqdmlal2_lanev4si (__a, __b, __c, __d); -@@ -21081,8 +21080,7 @@ - __extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) - vqdmlal_lane_s32 (int64x2_t __a, int32x2_t __b, int32x2_t __c, int const __d) - { -- int32x4_t __tmp = vcombine_s32 (__c, vcreate_s32 (__AARCH64_INT64_C (0))); -- return __builtin_aarch64_sqdmlal_lanev2si (__a, __b, __tmp, __d); -+ return __builtin_aarch64_sqdmlal_lanev2si (__a, __b, __c, __d); - } - - __extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) -@@ -21104,7 +21102,7 @@ - } - - __extension__ static __inline int32x1_t __attribute__ ((__always_inline__)) --vqdmlalh_lane_s16 (int32x1_t __a, int16x1_t __b, int16x8_t __c, const int __d) -+vqdmlalh_lane_s16 (int32x1_t __a, int16x1_t __b, int16x4_t __c, const int __d) - { - return __builtin_aarch64_sqdmlal_lanehi (__a, __b, __c, __d); - } -@@ -21116,7 +21114,7 @@ - } - - __extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) --vqdmlals_lane_s32 (int64x1_t __a, int32x1_t __b, int32x4_t __c, const int __d) -+vqdmlals_lane_s32 (int64x1_t __a, int32x1_t __b, int32x2_t __c, const int __d) - { - return __builtin_aarch64_sqdmlal_lanesi (__a, __b, __c, __d); - } -@@ -21136,7 +21134,7 @@ - } - - __extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) --vqdmlsl_high_lane_s16 (int32x4_t __a, int16x8_t __b, int16x8_t __c, -+vqdmlsl_high_lane_s16 (int32x4_t __a, int16x8_t __b, int16x4_t __c, - int const __d) - { - return __builtin_aarch64_sqdmlsl2_lanev8hi (__a, __b, __c, __d); -@@ -21158,8 +21156,7 @@ - __extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) - vqdmlsl_lane_s16 (int32x4_t __a, int16x4_t __b, int16x4_t __c, int const __d) - { -- int16x8_t __tmp = vcombine_s16 (__c, vcreate_s16 (__AARCH64_INT64_C (0))); -- return __builtin_aarch64_sqdmlsl_lanev4hi (__a, __b, __tmp, __d); -+ return __builtin_aarch64_sqdmlsl_lanev4hi (__a, __b, __c, __d); - } - - __extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) -@@ -21187,7 +21184,7 @@ - } - - __extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) --vqdmlsl_high_lane_s32 (int64x2_t __a, int32x4_t __b, int32x4_t __c, -+vqdmlsl_high_lane_s32 (int64x2_t __a, int32x4_t __b, int32x2_t __c, - int const __d) - { - return __builtin_aarch64_sqdmlsl2_lanev4si (__a, __b, __c, __d); -@@ -21209,8 +21206,7 @@ - __extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) - vqdmlsl_lane_s32 (int64x2_t __a, int32x2_t __b, int32x2_t __c, int const __d) - { -- int32x4_t __tmp = vcombine_s32 (__c, vcreate_s32 (__AARCH64_INT64_C (0))); -- return __builtin_aarch64_sqdmlsl_lanev2si (__a, __b, __tmp, __d); -+ return __builtin_aarch64_sqdmlsl_lanev2si (__a, __b, __c, __d); - } - - __extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) -@@ -21232,7 +21228,7 @@ - } - - __extension__ static __inline int32x1_t __attribute__ ((__always_inline__)) --vqdmlslh_lane_s16 (int32x1_t __a, int16x1_t __b, int16x8_t __c, const int __d) -+vqdmlslh_lane_s16 (int32x1_t __a, int16x1_t __b, int16x4_t __c, const int __d) - { - return __builtin_aarch64_sqdmlsl_lanehi (__a, __b, __c, __d); - } -@@ -21244,7 +21240,7 @@ - } - - __extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) --vqdmlsls_lane_s32 (int64x1_t __a, int32x1_t __b, int32x4_t __c, const int __d) -+vqdmlsls_lane_s32 (int64x1_t __a, int32x1_t __b, int32x2_t __c, const int __d) - { - return __builtin_aarch64_sqdmlsl_lanesi (__a, __b, __c, __d); - } -@@ -21282,7 +21278,7 @@ - } - - __extension__ static __inline int16x1_t __attribute__ ((__always_inline__)) --vqdmulhh_lane_s16 (int16x1_t __a, int16x8_t __b, const int __c) -+vqdmulhh_lane_s16 (int16x1_t __a, int16x4_t __b, const int __c) - { - return __builtin_aarch64_sqdmulh_lanehi (__a, __b, __c); - } -@@ -21294,7 +21290,7 @@ - } - - __extension__ static __inline int32x1_t __attribute__ ((__always_inline__)) --vqdmulhs_lane_s32 (int32x1_t __a, int32x4_t __b, const int __c) -+vqdmulhs_lane_s32 (int32x1_t __a, int32x2_t __b, const int __c) - { - return __builtin_aarch64_sqdmulh_lanesi (__a, __b, __c); - } -@@ -21314,7 +21310,7 @@ - } - - __extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) --vqdmull_high_lane_s16 (int16x8_t __a, int16x8_t __b, int const __c) -+vqdmull_high_lane_s16 (int16x8_t __a, int16x4_t __b, int const __c) - { - return __builtin_aarch64_sqdmull2_lanev8hi (__a, __b,__c); - } -@@ -21334,8 +21330,7 @@ - __extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) - vqdmull_lane_s16 (int16x4_t __a, int16x4_t __b, int const __c) - { -- int16x8_t __tmp = vcombine_s16 (__b, vcreate_s16 (__AARCH64_INT64_C (0))); -- return __builtin_aarch64_sqdmull_lanev4hi (__a, __tmp, __c); -+ return __builtin_aarch64_sqdmull_lanev4hi (__a, __b, __c); - } - - __extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) -@@ -21363,7 +21358,7 @@ - } - - __extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) --vqdmull_high_lane_s32 (int32x4_t __a, int32x4_t __b, int const __c) -+vqdmull_high_lane_s32 (int32x4_t __a, int32x2_t __b, int const __c) - { - return __builtin_aarch64_sqdmull2_lanev4si (__a, __b, __c); - } -@@ -21383,8 +21378,7 @@ - __extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) - vqdmull_lane_s32 (int32x2_t __a, int32x2_t __b, int const __c) - { -- int32x4_t __tmp = vcombine_s32 (__b, vcreate_s32 (__AARCH64_INT64_C (0))); -- return __builtin_aarch64_sqdmull_lanev2si (__a, __tmp, __c); -+ return __builtin_aarch64_sqdmull_lanev2si (__a, __b, __c); - } - - __extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) -@@ -21406,7 +21400,7 @@ - } - - __extension__ static __inline int32x1_t __attribute__ ((__always_inline__)) --vqdmullh_lane_s16 (int16x1_t __a, int16x8_t __b, const int __c) -+vqdmullh_lane_s16 (int16x1_t __a, int16x4_t __b, const int __c) - { - return __builtin_aarch64_sqdmull_lanehi (__a, __b, __c); - } -@@ -21418,7 +21412,7 @@ - } - - __extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) --vqdmulls_lane_s32 (int32x1_t __a, int32x4_t __b, const int __c) -+vqdmulls_lane_s32 (int32x1_t __a, int32x2_t __b, const int __c) - { - return __builtin_aarch64_sqdmull_lanesi (__a, __b, __c); - } -@@ -21594,7 +21588,7 @@ - } - - __extension__ static __inline int16x1_t __attribute__ ((__always_inline__)) --vqrdmulhh_lane_s16 (int16x1_t __a, int16x8_t __b, const int __c) -+vqrdmulhh_lane_s16 (int16x1_t __a, int16x4_t __b, const int __c) - { - return __builtin_aarch64_sqrdmulh_lanehi (__a, __b, __c); - } -@@ -21606,7 +21600,7 @@ - } - - __extension__ static __inline int32x1_t __attribute__ ((__always_inline__)) --vqrdmulhs_lane_s32 (int32x1_t __a, int32x4_t __b, const int __c) -+vqrdmulhs_lane_s32 (int32x1_t __a, int32x2_t __b, const int __c) - { - return __builtin_aarch64_sqrdmulh_lanesi (__a, __b, __c); - } -Index: gcc/config/aarch64/aarch64.md -=================================================================== ---- a/src/gcc/config/aarch64/aarch64.md (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/aarch64/aarch64.md (.../branches/gcc-4_9-branch) -@@ -2823,17 +2823,18 @@ - - ;; Arithmetic right shift using SISD or Integer instruction - (define_insn "*aarch64_ashr_sisd_or_int_<mode>3" -- [(set (match_operand:GPI 0 "register_operand" "=w,w,r") -+ [(set (match_operand:GPI 0 "register_operand" "=w,&w,&w,r") - (ashiftrt:GPI -- (match_operand:GPI 1 "register_operand" "w,w,r") -- (match_operand:QI 2 "aarch64_reg_or_shift_imm_di" "Us<cmode>,w,rUs<cmode>")))] -+ (match_operand:GPI 1 "register_operand" "w,w,w,r") -+ (match_operand:QI 2 "aarch64_reg_or_shift_imm_di" "Us<cmode>,w,0,rUs<cmode>")))] - "" - "@ - sshr\t%<rtn>0<vas>, %<rtn>1<vas>, %2 - # -+ # - asr\t%<w>0, %<w>1, %<w>2" -- [(set_attr "simd" "yes,yes,no") -- (set_attr "type" "neon_shift_imm<q>,neon_shift_reg<q>,shift_reg")] -+ [(set_attr "simd" "yes,yes,yes,no") -+ (set_attr "type" "neon_shift_imm<q>,neon_shift_reg<q>,neon_shift_reg<q>,shift_reg")] - ) - - (define_split -@@ -2842,11 +2843,13 @@ - (match_operand:DI 1 "aarch64_simd_register") - (match_operand:QI 2 "aarch64_simd_register")))] - "TARGET_SIMD && reload_completed" -- [(set (match_dup 2) -+ [(set (match_dup 3) - (unspec:QI [(match_dup 2)] UNSPEC_SISD_NEG)) - (set (match_dup 0) -- (unspec:DI [(match_dup 1) (match_dup 2)] UNSPEC_SISD_SSHL))] -- "" -+ (unspec:DI [(match_dup 1) (match_dup 3)] UNSPEC_SISD_SSHL))] -+{ -+ operands[3] = gen_lowpart (QImode, operands[0]); -+} - ) - - (define_split -@@ -2855,11 +2858,13 @@ - (match_operand:SI 1 "aarch64_simd_register") - (match_operand:QI 2 "aarch64_simd_register")))] - "TARGET_SIMD && reload_completed" -- [(set (match_dup 2) -+ [(set (match_dup 3) - (unspec:QI [(match_dup 2)] UNSPEC_SISD_NEG)) - (set (match_dup 0) -- (unspec:SI [(match_dup 1) (match_dup 2)] UNSPEC_SSHL_2S))] -- "" -+ (unspec:SI [(match_dup 1) (match_dup 3)] UNSPEC_SSHL_2S))] -+{ -+ operands[3] = gen_lowpart (QImode, operands[0]); -+} - ) - - (define_insn "*aarch64_sisd_ushl" -@@ -3608,6 +3613,7 @@ - (unspec:DI [(match_operand:DI 0 "aarch64_valid_symref" "S")] - UNSPEC_TLSDESC)) - (clobber (reg:DI LR_REGNUM)) -+ (clobber (reg:CC CC_REGNUM)) - (clobber (match_scratch:DI 1 "=r"))] - "TARGET_TLS_DESC" - "adrp\\tx0, %A0\;ldr\\t%1, [x0, #%L0]\;add\\tx0, x0, %L0\;.tlsdesccall\\t%0\;blr\\t%1" -Index: gcc/config/aarch64/aarch64-modes.def -=================================================================== ---- a/src/gcc/config/aarch64/aarch64-modes.def (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/aarch64/aarch64-modes.def (.../branches/gcc-4_9-branch) -@@ -31,6 +31,7 @@ - VECTOR_MODES (INT, 16); /* V16QI V8HI V4SI V2DI. */ - VECTOR_MODES (FLOAT, 8); /* V2SF. */ - VECTOR_MODES (FLOAT, 16); /* V4SF V2DF. */ -+VECTOR_MODE (FLOAT, DF, 1); /* V1DF. */ - - /* Oct Int: 256-bit integer mode needed for 32-byte vector arguments. */ - INT_MODE (OI, 32); -Index: gcc/config/aarch64/aarch64.c -=================================================================== ---- a/src/gcc/config/aarch64/aarch64.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/aarch64/aarch64.c (.../branches/gcc-4_9-branch) -@@ -1405,6 +1405,7 @@ - CUMULATIVE_ARGS *pcum = get_cumulative_args (pcum_v); - int ncrn, nvrn, nregs; - bool allocate_ncrn, allocate_nvrn; -+ HOST_WIDE_INT size; - - /* We need to do this once per argument. */ - if (pcum->aapcs_arg_processed) -@@ -1412,6 +1413,11 @@ - - pcum->aapcs_arg_processed = true; - -+ /* Size in bytes, rounded to the nearest multiple of 8 bytes. */ -+ size -+ = AARCH64_ROUND_UP (type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode), -+ UNITS_PER_WORD); -+ - allocate_ncrn = (type) ? !(FLOAT_TYPE_P (type)) : !FLOAT_MODE_P (mode); - allocate_nvrn = aarch64_vfp_is_call_candidate (pcum_v, - mode, -@@ -1462,10 +1468,8 @@ - } - - ncrn = pcum->aapcs_ncrn; -- nregs = ((type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode)) -- + UNITS_PER_WORD - 1) / UNITS_PER_WORD; -+ nregs = size / UNITS_PER_WORD; - -- - /* C6 - C9. though the sign and zero extension semantics are - handled elsewhere. This is the case where the argument fits - entirely general registers. */ -@@ -1513,13 +1517,12 @@ - pcum->aapcs_nextncrn = NUM_ARG_REGS; - - /* The argument is passed on stack; record the needed number of words for -- this argument (we can re-use NREGS) and align the total size if -- necessary. */ -+ this argument and align the total size if necessary. */ - on_stack: -- pcum->aapcs_stack_words = nregs; -+ pcum->aapcs_stack_words = size / UNITS_PER_WORD; - if (aarch64_function_arg_alignment (mode, type) == 16 * BITS_PER_UNIT) - pcum->aapcs_stack_size = AARCH64_ROUND_UP (pcum->aapcs_stack_size, -- 16 / UNITS_PER_WORD) + 1; -+ 16 / UNITS_PER_WORD); - return; - } - -@@ -6304,7 +6307,8 @@ - || mode == V16QImode || mode == V2DImode - || mode == V2SImode || mode == V4HImode - || mode == V8QImode || mode == V2SFmode -- || mode == V4SFmode || mode == V2DFmode)) -+ || mode == V4SFmode || mode == V2DFmode -+ || mode == V1DFmode)) - return true; - - return false; -Index: gcc/config/aarch64/iterators.md -=================================================================== ---- a/src/gcc/config/aarch64/iterators.md (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/aarch64/iterators.md (.../branches/gcc-4_9-branch) -@@ -396,14 +396,15 @@ - (SI "SI") (HI "HI") - (QI "QI")]) - --;; Define container mode for lane selection. --(define_mode_attr VCOND [(V4HI "V4HI") (V8HI "V4HI") -+;; 64-bit container modes the inner or scalar source mode. -+(define_mode_attr VCOND [(HI "V4HI") (SI "V2SI") -+ (V4HI "V4HI") (V8HI "V4HI") - (V2SI "V2SI") (V4SI "V2SI") - (DI "DI") (V2DI "DI") - (V2SF "V2SF") (V4SF "V2SF") - (V2DF "DF")]) - --;; Define container mode for lane selection. -+;; 128-bit container modes the inner or scalar source mode. - (define_mode_attr VCONQ [(V8QI "V16QI") (V16QI "V16QI") - (V4HI "V8HI") (V8HI "V8HI") - (V2SI "V4SI") (V4SI "V4SI") -@@ -412,15 +413,6 @@ - (V2DF "V2DF") (SI "V4SI") - (HI "V8HI") (QI "V16QI")]) - --;; Define container mode for lane selection. --(define_mode_attr VCON [(V8QI "V16QI") (V16QI "V16QI") -- (V4HI "V8HI") (V8HI "V8HI") -- (V2SI "V4SI") (V4SI "V4SI") -- (DI "V2DI") (V2DI "V2DI") -- (V2SF "V4SF") (V4SF "V4SF") -- (V2DF "V2DF") (SI "V4SI") -- (HI "V8HI") (QI "V16QI")]) -- - ;; Half modes of all vector modes. - (define_mode_attr VHALF [(V8QI "V4QI") (V16QI "V8QI") - (V4HI "V2HI") (V8HI "V4HI") -Index: gcc/config/aarch64/aarch64.h -=================================================================== ---- a/src/gcc/config/aarch64/aarch64.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/aarch64/aarch64.h (.../branches/gcc-4_9-branch) -@@ -32,7 +32,7 @@ - else \ - builtin_define ("__AARCH64EL__"); \ - \ -- if (!TARGET_GENERAL_REGS_ONLY) \ -+ if (TARGET_SIMD) \ - builtin_define ("__ARM_NEON"); \ - \ - switch (aarch64_cmodel) \ -@@ -83,9 +83,9 @@ - #define WORDS_BIG_ENDIAN (BYTES_BIG_ENDIAN) - - /* AdvSIMD is supported in the default configuration, unless disabled by -- -mgeneral-regs-only. */ --#define TARGET_SIMD !TARGET_GENERAL_REGS_ONLY --#define TARGET_FLOAT !TARGET_GENERAL_REGS_ONLY -+ -mgeneral-regs-only or by the +nosimd extension. */ -+#define TARGET_SIMD (!TARGET_GENERAL_REGS_ONLY && AARCH64_ISA_SIMD) -+#define TARGET_FLOAT (!TARGET_GENERAL_REGS_ONLY && AARCH64_ISA_FP) - - #define UNITS_PER_WORD 8 - -@@ -185,8 +185,8 @@ - extern unsigned long aarch64_tune_flags; - #define AARCH64_TUNE_SLOWMUL (aarch64_tune_flags & AARCH64_FL_SLOWMUL) - --/* Crypto is an optional feature. */ --#define TARGET_CRYPTO AARCH64_ISA_CRYPTO -+/* Crypto is an optional extension to AdvSIMD. */ -+#define TARGET_CRYPTO (TARGET_SIMD && AARCH64_ISA_CRYPTO) - - /* Standard register usage. */ - -Index: gcc/config/rs6000/predicates.md -=================================================================== ---- a/src/gcc/config/rs6000/predicates.md (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/rs6000/predicates.md (.../branches/gcc-4_9-branch) -@@ -171,6 +171,11 @@ - (and (match_code "const_int") - (match_test "IN_RANGE (INTVAL (op), 0, 1)"))) - -+;; Match op = 0..3. -+(define_predicate "const_0_to_3_operand" -+ (and (match_code "const_int") -+ (match_test "IN_RANGE (INTVAL (op), 0, 3)"))) -+ - ;; Match op = 2 or op = 3. - (define_predicate "const_2_to_3_operand" - (and (match_code "const_int") -@@ -624,7 +629,7 @@ - (match_test "offsettable_nonstrict_memref_p (op)"))) - - ;; Return 1 if the operand is suitable for load/store quad memory. --;; This predicate only checks for non-atomic loads/stores. -+;; This predicate only checks for non-atomic loads/stores (not lqarx/stqcx). - (define_predicate "quad_memory_operand" - (match_code "mem") - { -@@ -631,7 +636,7 @@ - rtx addr, op0, op1; - int ret; - -- if (!TARGET_QUAD_MEMORY) -+ if (!TARGET_QUAD_MEMORY && !TARGET_SYNC_TI) - ret = 0; - - else if (!memory_operand (op, mode)) -Index: gcc/config/rs6000/htm.md -=================================================================== ---- a/src/gcc/config/rs6000/htm.md (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/rs6000/htm.md (.../branches/gcc-4_9-branch) -@@ -179,7 +179,7 @@ - (const_int 0)] - UNSPECV_HTM_TABORTWCI)) - (set (subreg:CC (match_dup 2) 0) (match_dup 1)) -- (set (match_dup 3) (lshiftrt:SI (match_dup 2) (const_int 24))) -+ (set (match_dup 3) (lshiftrt:SI (match_dup 2) (const_int 28))) - (parallel [(set (match_operand:SI 0 "int_reg_operand" "") - (and:SI (match_dup 3) (const_int 15))) - (clobber (scratch:CC))])] -Index: gcc/config/rs6000/rs6000-protos.h -=================================================================== ---- a/src/gcc/config/rs6000/rs6000-protos.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/rs6000/rs6000-protos.h (.../branches/gcc-4_9-branch) -@@ -163,7 +163,7 @@ - extern rtx rs6000_libcall_value (enum machine_mode); - extern rtx rs6000_va_arg (tree, tree); - extern int function_ok_for_sibcall (tree); --extern int rs6000_reg_parm_stack_space (tree); -+extern int rs6000_reg_parm_stack_space (tree, bool); - extern void rs6000_elf_declare_function_name (FILE *, const char *, tree); - extern bool rs6000_elf_in_small_data_p (const_tree); - #ifdef ARGS_SIZE_RTX -Index: gcc/config/rs6000/htmxlintrin.h -=================================================================== ---- a/src/gcc/config/rs6000/htmxlintrin.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/rs6000/htmxlintrin.h (.../branches/gcc-4_9-branch) -@@ -46,12 +46,17 @@ - - typedef char TM_buff_type[16]; - -+/* Compatibility macro with s390. This macro can be used to determine -+ whether a transaction was successfully started from the __TM_begin() -+ and __TM_simple_begin() intrinsic functions below. */ -+#define _HTM_TBEGIN_STARTED 1 -+ - extern __inline long - __attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) - __TM_simple_begin (void) - { - if (__builtin_expect (__builtin_tbegin (0), 1)) -- return 1; -+ return _HTM_TBEGIN_STARTED; - return 0; - } - -@@ -61,7 +66,7 @@ - { - *_TEXASRL_PTR (TM_buff) = 0; - if (__builtin_expect (__builtin_tbegin (0), 1)) -- return 1; -+ return _HTM_TBEGIN_STARTED; - #ifdef __powerpc64__ - *_TEXASR_PTR (TM_buff) = __builtin_get_texasr (); - #else -Index: gcc/config/rs6000/rs6000-builtin.def -=================================================================== ---- a/src/gcc/config/rs6000/rs6000-builtin.def (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/rs6000/rs6000-builtin.def (.../branches/gcc-4_9-branch) -@@ -570,6 +570,68 @@ - MASK, /* MASK */ \ - (ATTR | RS6000_BTC_SPECIAL), /* ATTR */ \ - CODE_FOR_nothing) /* ICODE */ -+ -+ -+/* Decimal floating point builtins for instructions. */ -+#define BU_DFP_MISC_1(ENUM, NAME, ATTR, ICODE) \ -+ RS6000_BUILTIN_1 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \ -+ "__builtin_" NAME, /* NAME */ \ -+ RS6000_BTM_DFP, /* MASK */ \ -+ (RS6000_BTC_ ## ATTR /* ATTR */ \ -+ | RS6000_BTC_UNARY), \ -+ CODE_FOR_ ## ICODE) /* ICODE */ -+ -+#define BU_DFP_MISC_2(ENUM, NAME, ATTR, ICODE) \ -+ RS6000_BUILTIN_2 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \ -+ "__builtin_" NAME, /* NAME */ \ -+ RS6000_BTM_DFP, /* MASK */ \ -+ (RS6000_BTC_ ## ATTR /* ATTR */ \ -+ | RS6000_BTC_BINARY), \ -+ CODE_FOR_ ## ICODE) /* ICODE */ -+ -+ -+/* Miscellaneous builtins for instructions added in ISA 2.06. These -+ instructions don't require either the DFP or VSX options, just the basic ISA -+ 2.06 (popcntd) enablement since they operate on general purpose -+ registers. */ -+#define BU_P7_MISC_1(ENUM, NAME, ATTR, ICODE) \ -+ RS6000_BUILTIN_1 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \ -+ "__builtin_" NAME, /* NAME */ \ -+ RS6000_BTM_POPCNTD, /* MASK */ \ -+ (RS6000_BTC_ ## ATTR /* ATTR */ \ -+ | RS6000_BTC_UNARY), \ -+ CODE_FOR_ ## ICODE) /* ICODE */ -+ -+#define BU_P7_MISC_2(ENUM, NAME, ATTR, ICODE) \ -+ RS6000_BUILTIN_2 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \ -+ "__builtin_" NAME, /* NAME */ \ -+ RS6000_BTM_POPCNTD, /* MASK */ \ -+ (RS6000_BTC_ ## ATTR /* ATTR */ \ -+ | RS6000_BTC_BINARY), \ -+ CODE_FOR_ ## ICODE) /* ICODE */ -+ -+ -+/* Miscellaneous builtins for instructions added in ISA 2.07. These -+ instructions do require the ISA 2.07 vector support, but they aren't vector -+ instructions. */ -+#define BU_P8V_MISC_3(ENUM, NAME, ATTR, ICODE) \ -+ RS6000_BUILTIN_3 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \ -+ "__builtin_" NAME, /* NAME */ \ -+ RS6000_BTM_P8_VECTOR, /* MASK */ \ -+ (RS6000_BTC_ ## ATTR /* ATTR */ \ -+ | RS6000_BTC_TERNARY), \ -+ CODE_FOR_ ## ICODE) /* ICODE */ -+ -+/* 128-bit long double floating point builtins. */ -+#define BU_LDBL128_2(ENUM, NAME, ATTR, ICODE) \ -+ RS6000_BUILTIN_2 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \ -+ "__builtin_" NAME, /* NAME */ \ -+ (RS6000_BTM_HARD_FLOAT /* MASK */ \ -+ | RS6000_BTM_LDBL128), \ -+ (RS6000_BTC_ ## ATTR /* ATTR */ \ -+ | RS6000_BTC_BINARY), \ -+ CODE_FOR_ ## ICODE) /* ICODE */ -+ - #endif - - /* Insure 0 is not a legitimate index. */ -@@ -1412,10 +1474,10 @@ - BU_P8V_AV_2 (ORC_V2DF, "orc_v2df", CONST, orcv2df3) - - /* 3 argument altivec instructions added in ISA 2.07. */ --BU_P8V_AV_3 (VADDEUQM, "vaddeuqm", CONST, altivec_vaddeuqm) --BU_P8V_AV_3 (VADDECUQ, "vaddecuq", CONST, altivec_vaddecuq) --BU_P8V_AV_3 (VSUBEUQM, "vsubeuqm", CONST, altivec_vsubeuqm) --BU_P8V_AV_3 (VSUBECUQ, "vsubecuq", CONST, altivec_vsubecuq) -+BU_P8V_AV_3 (VADDEUQM, "vaddeuqm", CONST, altivec_vaddeuqm) -+BU_P8V_AV_3 (VADDECUQ, "vaddecuq", CONST, altivec_vaddecuq) -+BU_P8V_AV_3 (VSUBEUQM, "vsubeuqm", CONST, altivec_vsubeuqm) -+BU_P8V_AV_3 (VSUBECUQ, "vsubecuq", CONST, altivec_vsubecuq) - - /* Vector comparison instructions added in ISA 2.07. */ - BU_P8V_AV_2 (VCMPEQUD, "vcmpequd", CONST, vector_eqv2di) -@@ -1475,6 +1537,62 @@ - BU_P8V_OVERLOAD_3 (VSUBEUQM, "vsubeuqm") - - -+/* 2 argument extended divide functions added in ISA 2.06. */ -+BU_P7_MISC_2 (DIVWE, "divwe", CONST, dive_si) -+BU_P7_MISC_2 (DIVWEO, "divweo", CONST, diveo_si) -+BU_P7_MISC_2 (DIVWEU, "divweu", CONST, diveu_si) -+BU_P7_MISC_2 (DIVWEUO, "divweuo", CONST, diveuo_si) -+BU_P7_MISC_2 (DIVDE, "divde", CONST, dive_di) -+BU_P7_MISC_2 (DIVDEO, "divdeo", CONST, diveo_di) -+BU_P7_MISC_2 (DIVDEU, "divdeu", CONST, diveu_di) -+BU_P7_MISC_2 (DIVDEUO, "divdeuo", CONST, diveuo_di) -+ -+/* 1 argument DFP (decimal floating point) functions added in ISA 2.05. */ -+BU_DFP_MISC_1 (DXEX, "dxex", CONST, dfp_dxex_dd) -+BU_DFP_MISC_1 (DXEXQ, "dxexq", CONST, dfp_dxex_td) -+ -+/* 2 argument DFP (decimal floating point) functions added in ISA 2.05. */ -+BU_DFP_MISC_2 (DDEDPD, "ddedpd", CONST, dfp_ddedpd_dd) -+BU_DFP_MISC_2 (DDEDPDQ, "ddedpdq", CONST, dfp_ddedpd_td) -+BU_DFP_MISC_2 (DENBCD, "denbcd", CONST, dfp_denbcd_dd) -+BU_DFP_MISC_2 (DENBCDQ, "denbcdq", CONST, dfp_denbcd_td) -+BU_DFP_MISC_2 (DIEX, "diex", CONST, dfp_diex_dd) -+BU_DFP_MISC_2 (DIEXQ, "diexq", CONST, dfp_diex_td) -+BU_DFP_MISC_2 (DSCLI, "dscli", CONST, dfp_dscli_dd) -+BU_DFP_MISC_2 (DSCLIQ, "dscliq", CONST, dfp_dscli_td) -+BU_DFP_MISC_2 (DSCRI, "dscri", CONST, dfp_dscri_dd) -+BU_DFP_MISC_2 (DSCRIQ, "dscriq", CONST, dfp_dscri_td) -+ -+/* 1 argument BCD functions added in ISA 2.06. */ -+BU_P7_MISC_1 (CDTBCD, "cdtbcd", CONST, cdtbcd) -+BU_P7_MISC_1 (CBCDTD, "cbcdtd", CONST, cbcdtd) -+ -+/* 2 argument BCD functions added in ISA 2.06. */ -+BU_P7_MISC_2 (ADDG6S, "addg6s", CONST, addg6s) -+ -+/* 3 argument BCD functions added in ISA 2.07. */ -+BU_P8V_MISC_3 (BCDADD, "bcdadd", CONST, bcdadd) -+BU_P8V_MISC_3 (BCDADD_LT, "bcdadd_lt", CONST, bcdadd_lt) -+BU_P8V_MISC_3 (BCDADD_EQ, "bcdadd_eq", CONST, bcdadd_eq) -+BU_P8V_MISC_3 (BCDADD_GT, "bcdadd_gt", CONST, bcdadd_gt) -+BU_P8V_MISC_3 (BCDADD_OV, "bcdadd_ov", CONST, bcdadd_unordered) -+BU_P8V_MISC_3 (BCDSUB, "bcdsub", CONST, bcdsub) -+BU_P8V_MISC_3 (BCDSUB_LT, "bcdsub_lt", CONST, bcdsub_lt) -+BU_P8V_MISC_3 (BCDSUB_EQ, "bcdsub_eq", CONST, bcdsub_eq) -+BU_P8V_MISC_3 (BCDSUB_GT, "bcdsub_gt", CONST, bcdsub_gt) -+BU_P8V_MISC_3 (BCDSUB_OV, "bcdsub_ov", CONST, bcdsub_unordered) -+ -+/* 2 argument pack/unpack 128-bit floating point types. */ -+BU_DFP_MISC_2 (PACK_TD, "pack_dec128", CONST, packtd) -+BU_DFP_MISC_2 (UNPACK_TD, "unpack_dec128", CONST, unpacktd) -+ -+BU_LDBL128_2 (PACK_TF, "pack_longdouble", CONST, packtf) -+BU_LDBL128_2 (UNPACK_TF, "unpack_longdouble", CONST, unpacktf) -+ -+BU_P7_MISC_2 (PACK_V1TI, "pack_vector_int128", CONST, packv1ti) -+BU_P7_MISC_2 (UNPACK_V1TI, "unpack_vector_int128", CONST, unpackv1ti) -+ -+ - /* 1 argument crypto functions. */ - BU_CRYPTO_1 (VSBOX, "vsbox", CONST, crypto_vsbox) - -Index: gcc/config/rs6000/rs6000.c -=================================================================== ---- a/src/gcc/config/rs6000/rs6000.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/rs6000/rs6000.c (.../branches/gcc-4_9-branch) -@@ -2283,6 +2283,24 @@ - if (rs6000_float_gprs) - fprintf (stderr, DEBUG_FMT_S, "float_gprs", "true"); - -+ fprintf (stderr, DEBUG_FMT_S, "fprs", -+ (TARGET_FPRS ? "true" : "false")); -+ -+ fprintf (stderr, DEBUG_FMT_S, "single_float", -+ (TARGET_SINGLE_FLOAT ? "true" : "false")); -+ -+ fprintf (stderr, DEBUG_FMT_S, "double_float", -+ (TARGET_DOUBLE_FLOAT ? "true" : "false")); -+ -+ fprintf (stderr, DEBUG_FMT_S, "soft_float", -+ (TARGET_SOFT_FLOAT ? "true" : "false")); -+ -+ fprintf (stderr, DEBUG_FMT_S, "e500_single", -+ (TARGET_E500_SINGLE ? "true" : "false")); -+ -+ fprintf (stderr, DEBUG_FMT_S, "e500_double", -+ (TARGET_E500_DOUBLE ? "true" : "false")); -+ - if (TARGET_LINK_STACK) - fprintf (stderr, DEBUG_FMT_S, "link_stack", "true"); - -@@ -3017,7 +3035,10 @@ - | ((rs6000_cpu == PROCESSOR_CELL) ? RS6000_BTM_CELL : 0) - | ((TARGET_P8_VECTOR) ? RS6000_BTM_P8_VECTOR : 0) - | ((TARGET_CRYPTO) ? RS6000_BTM_CRYPTO : 0) -- | ((TARGET_HTM) ? RS6000_BTM_HTM : 0)); -+ | ((TARGET_HTM) ? RS6000_BTM_HTM : 0) -+ | ((TARGET_DFP) ? RS6000_BTM_DFP : 0) -+ | ((TARGET_HARD_FLOAT) ? RS6000_BTM_HARD_FLOAT : 0) -+ | ((TARGET_LONG_DOUBLE_128) ? RS6000_BTM_LDBL128 : 0)); - } - - /* Override command line options. Mostly we process the processor type and -@@ -3374,6 +3395,13 @@ - rs6000_isa_flags &= ~OPTION_MASK_VSX_TIMODE; - } - -+ if (TARGET_DFP && !TARGET_HARD_FLOAT) -+ { -+ if (rs6000_isa_flags_explicit & OPTION_MASK_DFP) -+ error ("-mhard-dfp requires -mhard-float"); -+ rs6000_isa_flags &= ~OPTION_MASK_DFP; -+ } -+ - /* The quad memory instructions only works in 64-bit mode. In 32-bit mode, - silently turn off quad memory mode. */ - if ((TARGET_QUAD_MEMORY || TARGET_QUAD_MEMORY_ATOMIC) && !TARGET_POWERPC64) -@@ -6091,7 +6119,8 @@ - return false; - - extra = GET_MODE_SIZE (mode) - UNITS_PER_WORD; -- gcc_assert (extra >= 0); -+ if (extra < 0) -+ extra = 0; - - if (GET_CODE (addr) == LO_SUM) - /* For lo_sum addresses, we must allow any offset except one that -@@ -10450,10 +10479,9 @@ - list, or passes any parameter in memory. */ - - static bool --rs6000_function_parms_need_stack (tree fun) -+rs6000_function_parms_need_stack (tree fun, bool incoming) - { -- function_args_iterator args_iter; -- tree arg_type; -+ tree fntype, result; - CUMULATIVE_ARGS args_so_far_v; - cumulative_args_t args_so_far; - -@@ -10460,26 +10488,57 @@ - if (!fun) - /* Must be a libcall, all of which only use reg parms. */ - return false; -+ -+ fntype = fun; - if (!TYPE_P (fun)) -- fun = TREE_TYPE (fun); -+ fntype = TREE_TYPE (fun); - - /* Varargs functions need the parameter save area. */ -- if (!prototype_p (fun) || stdarg_p (fun)) -+ if ((!incoming && !prototype_p (fntype)) || stdarg_p (fntype)) - return true; - -- INIT_CUMULATIVE_INCOMING_ARGS (args_so_far_v, fun, NULL_RTX); -+ INIT_CUMULATIVE_INCOMING_ARGS (args_so_far_v, fntype, NULL_RTX); - args_so_far = pack_cumulative_args (&args_so_far_v); - -- if (aggregate_value_p (TREE_TYPE (fun), fun)) -+ /* When incoming, we will have been passed the function decl. -+ It is necessary to use the decl to handle K&R style functions, -+ where TYPE_ARG_TYPES may not be available. */ -+ if (incoming) - { -- tree type = build_pointer_type (TREE_TYPE (fun)); -- rs6000_parm_needs_stack (args_so_far, type); -+ gcc_assert (DECL_P (fun)); -+ result = DECL_RESULT (fun); - } -+ else -+ result = TREE_TYPE (fntype); - -- FOREACH_FUNCTION_ARGS (fun, arg_type, args_iter) -- if (rs6000_parm_needs_stack (args_so_far, arg_type)) -- return true; -+ if (result && aggregate_value_p (result, fntype)) -+ { -+ if (!TYPE_P (result)) -+ result = TREE_TYPE (result); -+ result = build_pointer_type (result); -+ rs6000_parm_needs_stack (args_so_far, result); -+ } - -+ if (incoming) -+ { -+ tree parm; -+ -+ for (parm = DECL_ARGUMENTS (fun); -+ parm && parm != void_list_node; -+ parm = TREE_CHAIN (parm)) -+ if (rs6000_parm_needs_stack (args_so_far, TREE_TYPE (parm))) -+ return true; -+ } -+ else -+ { -+ function_args_iterator args_iter; -+ tree arg_type; -+ -+ FOREACH_FUNCTION_ARGS (fntype, arg_type, args_iter) -+ if (rs6000_parm_needs_stack (args_so_far, arg_type)) -+ return true; -+ } -+ - return false; - } - -@@ -10490,7 +10549,7 @@ - all parameters in registers. */ - - int --rs6000_reg_parm_stack_space (tree fun) -+rs6000_reg_parm_stack_space (tree fun, bool incoming) - { - int reg_parm_stack_space; - -@@ -10508,7 +10567,7 @@ - case ABI_ELFv2: - /* ??? Recomputing this every time is a bit expensive. Is there - a place to cache this information? */ -- if (rs6000_function_parms_need_stack (fun)) -+ if (rs6000_function_parms_need_stack (fun, incoming)) - reg_parm_stack_space = TARGET_64BIT ? 64 : 32; - else - reg_parm_stack_space = 0; -@@ -12381,7 +12440,15 @@ - } - } - else if (icode == CODE_FOR_vsx_set_v2df -- || icode == CODE_FOR_vsx_set_v2di) -+ || icode == CODE_FOR_vsx_set_v2di -+ || icode == CODE_FOR_bcdadd -+ || icode == CODE_FOR_bcdadd_lt -+ || icode == CODE_FOR_bcdadd_eq -+ || icode == CODE_FOR_bcdadd_gt -+ || icode == CODE_FOR_bcdsub -+ || icode == CODE_FOR_bcdsub_lt -+ || icode == CODE_FOR_bcdsub_eq -+ || icode == CODE_FOR_bcdsub_gt) - { - /* Only allow 1-bit unsigned literals. */ - STRIP_NOPS (arg2); -@@ -12392,6 +12459,44 @@ - return const0_rtx; - } - } -+ else if (icode == CODE_FOR_dfp_ddedpd_dd -+ || icode == CODE_FOR_dfp_ddedpd_td) -+ { -+ /* Only allow 2-bit unsigned literals where the value is 0 or 2. */ -+ STRIP_NOPS (arg0); -+ if (TREE_CODE (arg0) != INTEGER_CST -+ || TREE_INT_CST_LOW (arg2) & ~0x3) -+ { -+ error ("argument 1 must be 0 or 2"); -+ return const0_rtx; -+ } -+ } -+ else if (icode == CODE_FOR_dfp_denbcd_dd -+ || icode == CODE_FOR_dfp_denbcd_td) -+ { -+ /* Only allow 1-bit unsigned literals. */ -+ STRIP_NOPS (arg0); -+ if (TREE_CODE (arg0) != INTEGER_CST -+ || TREE_INT_CST_LOW (arg0) & ~0x1) -+ { -+ error ("argument 1 must be a 1-bit unsigned literal"); -+ return const0_rtx; -+ } -+ } -+ else if (icode == CODE_FOR_dfp_dscli_dd -+ || icode == CODE_FOR_dfp_dscli_td -+ || icode == CODE_FOR_dfp_dscri_dd -+ || icode == CODE_FOR_dfp_dscri_td) -+ { -+ /* Only allow 6-bit unsigned literals. */ -+ STRIP_NOPS (arg1); -+ if (TREE_CODE (arg1) != INTEGER_CST -+ || TREE_INT_CST_LOW (arg1) & ~0x3f) -+ { -+ error ("argument 2 must be a 6-bit unsigned literal"); -+ return const0_rtx; -+ } -+ } - else if (icode == CODE_FOR_crypto_vshasigmaw - || icode == CODE_FOR_crypto_vshasigmad) - { -@@ -13483,6 +13588,20 @@ - error ("Builtin function %s requires the -mpaired option", name); - else if ((fnmask & RS6000_BTM_SPE) != 0) - error ("Builtin function %s requires the -mspe option", name); -+ else if ((fnmask & (RS6000_BTM_DFP | RS6000_BTM_P8_VECTOR)) -+ == (RS6000_BTM_DFP | RS6000_BTM_P8_VECTOR)) -+ error ("Builtin function %s requires the -mhard-dfp and" -+ " -mpower8-vector options", name); -+ else if ((fnmask & RS6000_BTM_DFP) != 0) -+ error ("Builtin function %s requires the -mhard-dfp option", name); -+ else if ((fnmask & RS6000_BTM_P8_VECTOR) != 0) -+ error ("Builtin function %s requires the -mpower8-vector option", name); -+ else if ((fnmask & (RS6000_BTM_HARD_FLOAT | RS6000_BTM_LDBL128)) -+ == (RS6000_BTM_HARD_FLOAT | RS6000_BTM_LDBL128)) -+ error ("Builtin function %s requires the -mhard-float and" -+ " -mlong-double-128 options", name); -+ else if ((fnmask & RS6000_BTM_HARD_FLOAT) != 0) -+ error ("Builtin function %s requires the -mhard-float option", name); - else - error ("Builtin function %s is not supported with the current options", - name); -@@ -13671,7 +13790,10 @@ - return ret; - } - -- gcc_assert (TARGET_ALTIVEC || TARGET_VSX || TARGET_SPE || TARGET_PAIRED_FLOAT); -+ unsigned attr = rs6000_builtin_info[uns_fcode].attr & RS6000_BTC_TYPE_MASK; -+ gcc_assert (attr == RS6000_BTC_UNARY -+ || attr == RS6000_BTC_BINARY -+ || attr == RS6000_BTC_TERNARY); - - /* Handle simple unary operations. */ - d = bdesc_1arg; -@@ -13762,6 +13884,9 @@ - uintTI_type_internal_node = unsigned_intTI_type_node; - float_type_internal_node = float_type_node; - double_type_internal_node = double_type_node; -+ long_double_type_internal_node = long_double_type_node; -+ dfloat64_type_internal_node = dfloat64_type_node; -+ dfloat128_type_internal_node = dfloat128_type_node; - void_type_internal_node = void_type_node; - - /* Initialize the modes for builtin_function_type, mapping a machine mode to -@@ -13776,6 +13901,9 @@ - builtin_mode_to_type[TImode][1] = unsigned_intTI_type_node; - builtin_mode_to_type[SFmode][0] = float_type_node; - builtin_mode_to_type[DFmode][0] = double_type_node; -+ builtin_mode_to_type[TFmode][0] = long_double_type_node; -+ builtin_mode_to_type[DDmode][0] = dfloat64_type_node; -+ builtin_mode_to_type[TDmode][0] = dfloat128_type_node; - builtin_mode_to_type[V1TImode][0] = V1TI_type_node; - builtin_mode_to_type[V1TImode][1] = unsigned_V1TI_type_node; - builtin_mode_to_type[V2SImode][0] = V2SI_type_node; -@@ -14868,6 +14996,8 @@ - /* unsigned 1 argument functions. */ - case CRYPTO_BUILTIN_VSBOX: - case P8V_BUILTIN_VGBBD: -+ case MISC_BUILTIN_CDTBCD: -+ case MISC_BUILTIN_CBCDTD: - h.uns_p[0] = 1; - h.uns_p[1] = 1; - break; -@@ -14886,6 +15016,11 @@ - case CRYPTO_BUILTIN_VPMSUMW: - case CRYPTO_BUILTIN_VPMSUMD: - case CRYPTO_BUILTIN_VPMSUM: -+ case MISC_BUILTIN_ADDG6S: -+ case MISC_BUILTIN_DIVWEU: -+ case MISC_BUILTIN_DIVWEUO: -+ case MISC_BUILTIN_DIVDEU: -+ case MISC_BUILTIN_DIVDEUO: - h.uns_p[0] = 1; - h.uns_p[1] = 1; - h.uns_p[2] = 1; -@@ -14947,9 +15082,18 @@ - /* signed args, unsigned return. */ - case VSX_BUILTIN_XVCVDPUXDS_UNS: - case ALTIVEC_BUILTIN_FIXUNS_V4SF_V4SI: -+ case MISC_BUILTIN_UNPACK_TD: -+ case MISC_BUILTIN_UNPACK_V1TI: - h.uns_p[0] = 1; - break; - -+ /* unsigned arguments for 128-bit pack instructions. */ -+ case MISC_BUILTIN_PACK_TD: -+ case MISC_BUILTIN_PACK_V1TI: -+ h.uns_p[1] = 1; -+ h.uns_p[2] = 1; -+ break; -+ - default: - break; - } -@@ -31203,6 +31347,9 @@ - { "power8-vector", RS6000_BTM_P8_VECTOR, false, false }, - { "crypto", RS6000_BTM_CRYPTO, false, false }, - { "htm", RS6000_BTM_HTM, false, false }, -+ { "hard-dfp", RS6000_BTM_DFP, false, false }, -+ { "hard-float", RS6000_BTM_HARD_FLOAT, false, false }, -+ { "long-double-128", RS6000_BTM_LDBL128, false, false }, - }; - - /* Option variables that we want to support inside attribute((target)) and -Index: gcc/config/rs6000/vsx.md -=================================================================== ---- a/src/gcc/config/rs6000/vsx.md (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/rs6000/vsx.md (.../branches/gcc-4_9-branch) -@@ -24,6 +24,13 @@ - ;; Iterator for the 2 64-bit vector types - (define_mode_iterator VSX_D [V2DF V2DI]) - -+;; Iterator for the 2 64-bit vector types + 128-bit types that are loaded with -+;; lxvd2x to properly handle swapping words on little endian -+(define_mode_iterator VSX_LE [V2DF -+ V2DI -+ V1TI -+ (TI "VECTOR_MEM_VSX_P (TImode)")]) -+ - ;; Iterator for the 2 32-bit vector types - (define_mode_iterator VSX_W [V4SF V4SI]) - -@@ -228,8 +235,8 @@ - ;; The patterns for LE permuted loads and stores come before the general - ;; VSX moves so they match first. - (define_insn_and_split "*vsx_le_perm_load_<mode>" -- [(set (match_operand:VSX_D 0 "vsx_register_operand" "=wa") -- (match_operand:VSX_D 1 "memory_operand" "Z"))] -+ [(set (match_operand:VSX_LE 0 "vsx_register_operand" "=wa") -+ (match_operand:VSX_LE 1 "memory_operand" "Z"))] - "!BYTES_BIG_ENDIAN && TARGET_VSX" - "#" - "!BYTES_BIG_ENDIAN && TARGET_VSX" -@@ -342,8 +349,8 @@ - (set_attr "length" "8")]) - - (define_insn "*vsx_le_perm_store_<mode>" -- [(set (match_operand:VSX_D 0 "memory_operand" "=Z") -- (match_operand:VSX_D 1 "vsx_register_operand" "+wa"))] -+ [(set (match_operand:VSX_LE 0 "memory_operand" "=Z") -+ (match_operand:VSX_LE 1 "vsx_register_operand" "+wa"))] - "!BYTES_BIG_ENDIAN && TARGET_VSX" - "#" - [(set_attr "type" "vecstore") -@@ -350,8 +357,8 @@ - (set_attr "length" "12")]) - - (define_split -- [(set (match_operand:VSX_D 0 "memory_operand" "") -- (match_operand:VSX_D 1 "vsx_register_operand" ""))] -+ [(set (match_operand:VSX_LE 0 "memory_operand" "") -+ (match_operand:VSX_LE 1 "vsx_register_operand" ""))] - "!BYTES_BIG_ENDIAN && TARGET_VSX && !reload_completed" - [(set (match_dup 2) - (vec_select:<MODE> -@@ -369,8 +376,8 @@ - ;; The post-reload split requires that we re-permute the source - ;; register in case it is still live. - (define_split -- [(set (match_operand:VSX_D 0 "memory_operand" "") -- (match_operand:VSX_D 1 "vsx_register_operand" ""))] -+ [(set (match_operand:VSX_LE 0 "memory_operand" "") -+ (match_operand:VSX_LE 1 "vsx_register_operand" ""))] - "!BYTES_BIG_ENDIAN && TARGET_VSX && reload_completed" - [(set (match_dup 1) - (vec_select:<MODE> -@@ -1352,9 +1359,9 @@ - ;; xxpermdi for little endian loads and stores. We need several of - ;; these since the form of the PARALLEL differs by mode. - (define_insn "*vsx_xxpermdi2_le_<mode>" -- [(set (match_operand:VSX_D 0 "vsx_register_operand" "=wa") -- (vec_select:VSX_D -- (match_operand:VSX_D 1 "vsx_register_operand" "wa") -+ [(set (match_operand:VSX_LE 0 "vsx_register_operand" "=wa") -+ (vec_select:VSX_LE -+ (match_operand:VSX_LE 1 "vsx_register_operand" "wa") - (parallel [(const_int 1) (const_int 0)])))] - "!BYTES_BIG_ENDIAN && VECTOR_MEM_VSX_P (<MODE>mode)" - "xxpermdi %x0,%x1,%x1,2" -@@ -1401,9 +1408,9 @@ - ;; lxvd2x for little endian loads. We need several of - ;; these since the form of the PARALLEL differs by mode. - (define_insn "*vsx_lxvd2x2_le_<mode>" -- [(set (match_operand:VSX_D 0 "vsx_register_operand" "=wa") -- (vec_select:VSX_D -- (match_operand:VSX_D 1 "memory_operand" "Z") -+ [(set (match_operand:VSX_LE 0 "vsx_register_operand" "=wa") -+ (vec_select:VSX_LE -+ (match_operand:VSX_LE 1 "memory_operand" "Z") - (parallel [(const_int 1) (const_int 0)])))] - "!BYTES_BIG_ENDIAN && VECTOR_MEM_VSX_P (<MODE>mode)" - "lxvd2x %x0,%y1" -@@ -1450,9 +1457,9 @@ - ;; stxvd2x for little endian stores. We need several of - ;; these since the form of the PARALLEL differs by mode. - (define_insn "*vsx_stxvd2x2_le_<mode>" -- [(set (match_operand:VSX_D 0 "memory_operand" "=Z") -- (vec_select:VSX_D -- (match_operand:VSX_D 1 "vsx_register_operand" "wa") -+ [(set (match_operand:VSX_LE 0 "memory_operand" "=Z") -+ (vec_select:VSX_LE -+ (match_operand:VSX_LE 1 "vsx_register_operand" "wa") - (parallel [(const_int 1) (const_int 0)])))] - "!BYTES_BIG_ENDIAN && VECTOR_MEM_VSX_P (<MODE>mode)" - "stxvd2x %x1,%y0" -@@ -1683,7 +1690,7 @@ - { - if (GET_CODE (op3) == SCRATCH) - op3 = gen_reg_rtx (V4SFmode); -- emit_insn (gen_vsx_xxsldwi_v4sf (op3, op1, op1, op2)); -+ emit_insn (gen_vsx_xxsldwi_v4sf (op3, op1, op1, GEN_INT (ele))); - tmp = op3; - } - emit_insn (gen_vsx_xscvspdp_scalar2 (op0, tmp)); -@@ -1891,7 +1898,12 @@ - (parallel [(const_int 0) (const_int 4) - (const_int 1) (const_int 5)])))] - "VECTOR_MEM_VSX_P (<MODE>mode)" -- "xxmrghw %x0,%x1,%x2" -+{ -+ if (BYTES_BIG_ENDIAN) -+ return "xxmrghw %x0,%x1,%x2"; -+ else -+ return "xxmrglw %x0,%x2,%x1"; -+} - [(set_attr "type" "vecperm")]) - - (define_insn "vsx_xxmrglw_<mode>" -@@ -1903,7 +1915,12 @@ - (parallel [(const_int 2) (const_int 6) - (const_int 3) (const_int 7)])))] - "VECTOR_MEM_VSX_P (<MODE>mode)" -- "xxmrglw %x0,%x1,%x2" -+{ -+ if (BYTES_BIG_ENDIAN) -+ return "xxmrglw %x0,%x1,%x2"; -+ else -+ return "xxmrghw %x0,%x2,%x1"; -+} - [(set_attr "type" "vecperm")]) - - ;; Shift left double by word immediate -Index: gcc/config/rs6000/rs6000.h -=================================================================== ---- a/src/gcc/config/rs6000/rs6000.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/rs6000/rs6000.h (.../branches/gcc-4_9-branch) -@@ -624,7 +624,8 @@ - || TARGET_CMPB /* ISA 2.05 */ \ - || TARGET_POPCNTD /* ISA 2.06 */ \ - || TARGET_ALTIVEC \ -- || TARGET_VSX))) -+ || TARGET_VSX \ -+ || TARGET_HARD_FLOAT))) - - /* E500 cores only support plain "sync", not lwsync. */ - #define TARGET_NO_LWSYNC (rs6000_cpu == PROCESSOR_PPC8540 \ -@@ -1601,8 +1602,15 @@ - /* Define this if stack space is still allocated for a parameter passed - in a register. The value is the number of bytes allocated to this - area. */ --#define REG_PARM_STACK_SPACE(FNDECL) rs6000_reg_parm_stack_space((FNDECL)) -+#define REG_PARM_STACK_SPACE(FNDECL) \ -+ rs6000_reg_parm_stack_space ((FNDECL), false) - -+/* Define this macro if space guaranteed when compiling a function body -+ is different to space required when making a call, a situation that -+ can arise with K&R style function definitions. */ -+#define INCOMING_REG_PARM_STACK_SPACE(FNDECL) \ -+ rs6000_reg_parm_stack_space ((FNDECL), true) -+ - /* Define this if the above stack space is to be considered part of the - space allocated by the caller. */ - #define OUTGOING_REG_PARM_STACK_SPACE(FNTYPE) 1 -@@ -2500,8 +2508,8 @@ - #define RS6000_BTC_SAT RS6000_BTC_MISC /* saturate sets VSCR. */ - - /* Builtin targets. For now, we reuse the masks for those options that are in -- target flags, and pick two random bits for SPE and paired which aren't in -- target_flags. */ -+ target flags, and pick three random bits for SPE, paired and ldbl128 which -+ aren't in target_flags. */ - #define RS6000_BTM_ALWAYS 0 /* Always enabled. */ - #define RS6000_BTM_ALTIVEC MASK_ALTIVEC /* VMX/altivec vectors. */ - #define RS6000_BTM_VSX MASK_VSX /* VSX (vector/scalar). */ -@@ -2516,6 +2524,9 @@ - #define RS6000_BTM_FRSQRTES MASK_POPCNTB /* FRSQRTES instruction. */ - #define RS6000_BTM_POPCNTD MASK_POPCNTD /* Target supports ISA 2.06. */ - #define RS6000_BTM_CELL MASK_FPRND /* Target is cell powerpc. */ -+#define RS6000_BTM_DFP MASK_DFP /* Decimal floating point. */ -+#define RS6000_BTM_HARD_FLOAT MASK_SOFT_FLOAT /* Hardware floating point. */ -+#define RS6000_BTM_LDBL128 MASK_MULTIPLE /* 128-bit long double. */ - - #define RS6000_BTM_COMMON (RS6000_BTM_ALTIVEC \ - | RS6000_BTM_VSX \ -@@ -2527,7 +2538,10 @@ - | RS6000_BTM_FRSQRTES \ - | RS6000_BTM_HTM \ - | RS6000_BTM_POPCNTD \ -- | RS6000_BTM_CELL) -+ | RS6000_BTM_CELL \ -+ | RS6000_BTM_DFP \ -+ | RS6000_BTM_HARD_FLOAT \ -+ | RS6000_BTM_LDBL128) - - /* Define builtin enum index. */ - -@@ -2622,6 +2636,9 @@ - RS6000_BTI_UINTTI, /* unsigned_intTI_type_node */ - RS6000_BTI_float, /* float_type_node */ - RS6000_BTI_double, /* double_type_node */ -+ RS6000_BTI_long_double, /* long_double_type_node */ -+ RS6000_BTI_dfloat64, /* dfloat64_type_node */ -+ RS6000_BTI_dfloat128, /* dfloat128_type_node */ - RS6000_BTI_void, /* void_type_node */ - RS6000_BTI_MAX - }; -@@ -2673,6 +2690,9 @@ - #define uintTI_type_internal_node (rs6000_builtin_types[RS6000_BTI_UINTTI]) - #define float_type_internal_node (rs6000_builtin_types[RS6000_BTI_float]) - #define double_type_internal_node (rs6000_builtin_types[RS6000_BTI_double]) -+#define long_double_type_internal_node (rs6000_builtin_types[RS6000_BTI_long_double]) -+#define dfloat64_type_internal_node (rs6000_builtin_types[RS6000_BTI_dfloat64]) -+#define dfloat128_type_internal_node (rs6000_builtin_types[RS6000_BTI_dfloat128]) - #define void_type_internal_node (rs6000_builtin_types[RS6000_BTI_void]) - - extern GTY(()) tree rs6000_builtin_types[RS6000_BTI_MAX]; -Index: gcc/config/rs6000/altivec.md -=================================================================== ---- a/src/gcc/config/rs6000/altivec.md (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/rs6000/altivec.md (.../branches/gcc-4_9-branch) -@@ -143,6 +143,9 @@ - UNSPEC_VSUBEUQM - UNSPEC_VSUBECUQ - UNSPEC_VBPERMQ -+ UNSPEC_BCDADD -+ UNSPEC_BCDSUB -+ UNSPEC_BCD_OVERFLOW - ]) - - (define_c_enum "unspecv" -@@ -3334,3 +3337,112 @@ - "vbpermq %0,%1,%2" - [(set_attr "length" "4") - (set_attr "type" "vecsimple")]) -+ -+;; Decimal Integer operations -+(define_int_iterator UNSPEC_BCD_ADD_SUB [UNSPEC_BCDADD UNSPEC_BCDSUB]) -+ -+(define_int_attr bcd_add_sub [(UNSPEC_BCDADD "add") -+ (UNSPEC_BCDSUB "sub")]) -+ -+(define_code_iterator BCD_TEST [eq lt gt unordered]) -+ -+(define_insn "bcd<bcd_add_sub>" -+ [(set (match_operand:V1TI 0 "register_operand" "") -+ (unspec:V1TI [(match_operand:V1TI 1 "register_operand" "") -+ (match_operand:V1TI 2 "register_operand" "") -+ (match_operand:QI 3 "const_0_to_1_operand" "")] -+ UNSPEC_BCD_ADD_SUB)) -+ (clobber (reg:CCFP 74))] -+ "TARGET_P8_VECTOR" -+ "bcd<bcd_add_sub>. %0,%1,%2,%3" -+ [(set_attr "length" "4") -+ (set_attr "type" "vecsimple")]) -+ -+;; Use a floating point type (V2DFmode) for the compare to set CR6 so that we -+;; can use the unordered test for BCD nans and add/subtracts that overflow. An -+;; UNORDERED test on an integer type (like V1TImode) is not defined. The type -+;; probably should be one that can go in the VMX (Altivec) registers, so we -+;; can't use DDmode or DFmode. -+(define_insn "*bcd<bcd_add_sub>_test" -+ [(set (reg:CCFP 74) -+ (compare:CCFP -+ (unspec:V2DF [(match_operand:V1TI 1 "register_operand" "v") -+ (match_operand:V1TI 2 "register_operand" "v") -+ (match_operand:QI 3 "const_0_to_1_operand" "i")] -+ UNSPEC_BCD_ADD_SUB) -+ (match_operand:V2DF 4 "zero_constant" "j"))) -+ (clobber (match_scratch:V1TI 0 "=v"))] -+ "TARGET_P8_VECTOR" -+ "bcd<bcd_add_sub>. %0,%1,%2,%3" -+ [(set_attr "length" "4") -+ (set_attr "type" "vecsimple")]) -+ -+(define_insn "*bcd<bcd_add_sub>_test2" -+ [(set (match_operand:V1TI 0 "register_operand" "=v") -+ (unspec:V1TI [(match_operand:V1TI 1 "register_operand" "v") -+ (match_operand:V1TI 2 "register_operand" "v") -+ (match_operand:QI 3 "const_0_to_1_operand" "i")] -+ UNSPEC_BCD_ADD_SUB)) -+ (set (reg:CCFP 74) -+ (compare:CCFP -+ (unspec:V2DF [(match_dup 1) -+ (match_dup 2) -+ (match_dup 3)] -+ UNSPEC_BCD_ADD_SUB) -+ (match_operand:V2DF 4 "zero_constant" "j")))] -+ "TARGET_P8_VECTOR" -+ "bcd<bcd_add_sub>. %0,%1,%2,%3" -+ [(set_attr "length" "4") -+ (set_attr "type" "vecsimple")]) -+ -+(define_expand "bcd<bcd_add_sub>_<code>" -+ [(parallel [(set (reg:CCFP 74) -+ (compare:CCFP -+ (unspec:V2DF [(match_operand:V1TI 1 "register_operand" "") -+ (match_operand:V1TI 2 "register_operand" "") -+ (match_operand:QI 3 "const_0_to_1_operand" "")] -+ UNSPEC_BCD_ADD_SUB) -+ (match_dup 4))) -+ (clobber (match_scratch:V1TI 5 ""))]) -+ (set (match_operand:SI 0 "register_operand" "") -+ (BCD_TEST:SI (reg:CCFP 74) -+ (const_int 0)))] -+ "TARGET_P8_VECTOR" -+{ -+ operands[4] = CONST0_RTX (V2DFmode); -+}) -+ -+;; Peephole2 pattern to combine a bcdadd/bcdsub that calculates the value and -+;; the bcdadd/bcdsub that tests the value. The combiner won't work since -+;; CR6 is a hard coded register. Unfortunately, all of the Altivec predicate -+;; support is hard coded to use the fixed register CR6 instead of creating -+;; a register class for CR6. -+ -+(define_peephole2 -+ [(parallel [(set (match_operand:V1TI 0 "register_operand" "") -+ (unspec:V1TI [(match_operand:V1TI 1 "register_operand" "") -+ (match_operand:V1TI 2 "register_operand" "") -+ (match_operand:QI 3 "const_0_to_1_operand" "")] -+ UNSPEC_BCD_ADD_SUB)) -+ (clobber (reg:CCFP 74))]) -+ (parallel [(set (reg:CCFP 74) -+ (compare:CCFP -+ (unspec:V2DF [(match_dup 1) -+ (match_dup 2) -+ (match_dup 3)] -+ UNSPEC_BCD_ADD_SUB) -+ (match_operand:V2DF 4 "zero_constant" ""))) -+ (clobber (match_operand:V1TI 5 "register_operand" ""))])] -+ "TARGET_P8_VECTOR" -+ [(parallel [(set (match_dup 0) -+ (unspec:V1TI [(match_dup 1) -+ (match_dup 2) -+ (match_dup 3)] -+ UNSPEC_BCD_ADD_SUB)) -+ (set (reg:CCFP 74) -+ (compare:CCFP -+ (unspec:V2DF [(match_dup 1) -+ (match_dup 2) -+ (match_dup 3)] -+ UNSPEC_BCD_ADD_SUB) -+ (match_dup 4)))])]) -Index: gcc/config/rs6000/dfp.md -=================================================================== ---- a/src/gcc/config/rs6000/dfp.md (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/rs6000/dfp.md (.../branches/gcc-4_9-branch) -@@ -322,3 +322,72 @@ - "TARGET_DFP" - "dctfixq %0,%1" - [(set_attr "type" "fp")]) -+ -+ -+;; Decimal builtin support -+ -+(define_c_enum "unspec" -+ [UNSPEC_DDEDPD -+ UNSPEC_DENBCD -+ UNSPEC_DXEX -+ UNSPEC_DIEX -+ UNSPEC_DSCLI -+ UNSPEC_DSCRI]) -+ -+(define_mode_iterator D64_D128 [DD TD]) -+ -+(define_mode_attr dfp_suffix [(DD "") -+ (TD "q")]) -+ -+(define_insn "dfp_ddedpd_<mode>" -+ [(set (match_operand:D64_D128 0 "gpc_reg_operand" "=d") -+ (unspec:D64_D128 [(match_operand:QI 1 "const_0_to_3_operand" "i") -+ (match_operand:D64_D128 2 "gpc_reg_operand" "d")] -+ UNSPEC_DDEDPD))] -+ "TARGET_DFP" -+ "ddedpd<dfp_suffix> %1,%0,%2" -+ [(set_attr "type" "fp")]) -+ -+(define_insn "dfp_denbcd_<mode>" -+ [(set (match_operand:D64_D128 0 "gpc_reg_operand" "=d") -+ (unspec:D64_D128 [(match_operand:QI 1 "const_0_to_1_operand" "i") -+ (match_operand:D64_D128 2 "gpc_reg_operand" "d")] -+ UNSPEC_DENBCD))] -+ "TARGET_DFP" -+ "denbcd<dfp_suffix> %1,%0,%2" -+ [(set_attr "type" "fp")]) -+ -+(define_insn "dfp_dxex_<mode>" -+ [(set (match_operand:D64_D128 0 "gpc_reg_operand" "=d") -+ (unspec:D64_D128 [(match_operand:D64_D128 1 "gpc_reg_operand" "d")] -+ UNSPEC_DXEX))] -+ "TARGET_DFP" -+ "dxex<dfp_suffix> %0,%1" -+ [(set_attr "type" "fp")]) -+ -+(define_insn "dfp_diex_<mode>" -+ [(set (match_operand:D64_D128 0 "gpc_reg_operand" "=d") -+ (unspec:D64_D128 [(match_operand:D64_D128 1 "gpc_reg_operand" "d") -+ (match_operand:D64_D128 2 "gpc_reg_operand" "d")] -+ UNSPEC_DXEX))] -+ "TARGET_DFP" -+ "diex<dfp_suffix> %0,%1,%2" -+ [(set_attr "type" "fp")]) -+ -+(define_insn "dfp_dscli_<mode>" -+ [(set (match_operand:D64_D128 0 "gpc_reg_operand" "=d") -+ (unspec:D64_D128 [(match_operand:D64_D128 1 "gpc_reg_operand" "d") -+ (match_operand:QI 2 "immediate_operand" "i")] -+ UNSPEC_DSCLI))] -+ "TARGET_DFP" -+ "dscli<dfp_suffix> %0,%1,%2" -+ [(set_attr "type" "fp")]) -+ -+(define_insn "dfp_dscri_<mode>" -+ [(set (match_operand:D64_D128 0 "gpc_reg_operand" "=d") -+ (unspec:D64_D128 [(match_operand:D64_D128 1 "gpc_reg_operand" "d") -+ (match_operand:QI 2 "immediate_operand" "i")] -+ UNSPEC_DSCRI))] -+ "TARGET_DFP" -+ "dscri<dfp_suffix> %0,%1,%2" -+ [(set_attr "type" "fp")]) -Index: gcc/config/rs6000/sync.md -=================================================================== ---- a/src/gcc/config/rs6000/sync.md (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/rs6000/sync.md (.../branches/gcc-4_9-branch) -@@ -107,10 +107,17 @@ - "isync" - [(set_attr "type" "isync")]) - -+;; Types that we should provide atomic instructions for. -+(define_mode_iterator AINT [QI -+ HI -+ SI -+ (DI "TARGET_POWERPC64") -+ (TI "TARGET_SYNC_TI")]) -+ - ;; The control dependency used for load dependency described - ;; in B.2.3 of the Power ISA 2.06B. - (define_insn "loadsync_<mode>" -- [(unspec_volatile:BLK [(match_operand:INT1 0 "register_operand" "r")] -+ [(unspec_volatile:BLK [(match_operand:AINT 0 "register_operand" "r")] - UNSPECV_ISYNC) - (clobber (match_scratch:CC 1 "=y"))] - "" -@@ -118,19 +125,57 @@ - [(set_attr "type" "isync") - (set_attr "length" "12")]) - -+(define_insn "load_quadpti" -+ [(set (match_operand:PTI 0 "quad_int_reg_operand" "=&r") -+ (unspec:PTI -+ [(match_operand:TI 1 "quad_memory_operand" "wQ")] UNSPEC_LSQ))] -+ "TARGET_SYNC_TI -+ && !reg_mentioned_p (operands[0], operands[1])" -+ "lq %0,%1" -+ [(set_attr "type" "load") -+ (set_attr "length" "4")]) -+ - (define_expand "atomic_load<mode>" -- [(set (match_operand:INT1 0 "register_operand" "") ;; output -- (match_operand:INT1 1 "memory_operand" "")) ;; memory -+ [(set (match_operand:AINT 0 "register_operand" "") ;; output -+ (match_operand:AINT 1 "memory_operand" "")) ;; memory - (use (match_operand:SI 2 "const_int_operand" ""))] ;; model - "" - { -+ if (<MODE>mode == TImode && !TARGET_SYNC_TI) -+ FAIL; -+ - enum memmodel model = (enum memmodel) INTVAL (operands[2]); - - if (model == MEMMODEL_SEQ_CST) - emit_insn (gen_hwsync ()); - -- emit_move_insn (operands[0], operands[1]); -+ if (<MODE>mode != TImode) -+ emit_move_insn (operands[0], operands[1]); -+ else -+ { -+ rtx op0 = operands[0]; -+ rtx op1 = operands[1]; -+ rtx pti_reg = gen_reg_rtx (PTImode); - -+ // Can't have indexed address for 'lq' -+ if (indexed_address (XEXP (op1, 0), TImode)) -+ { -+ rtx old_addr = XEXP (op1, 0); -+ rtx new_addr = force_reg (Pmode, old_addr); -+ operands[1] = op1 = replace_equiv_address (op1, new_addr); -+ } -+ -+ emit_insn (gen_load_quadpti (pti_reg, op1)); -+ -+ if (WORDS_BIG_ENDIAN) -+ emit_move_insn (op0, gen_lowpart (TImode, pti_reg)); -+ else -+ { -+ emit_move_insn (gen_lowpart (DImode, op0), gen_highpart (DImode, pti_reg)); -+ emit_move_insn (gen_highpart (DImode, op0), gen_lowpart (DImode, pti_reg)); -+ } -+ } -+ - switch (model) - { - case MEMMODEL_RELAXED: -@@ -146,12 +191,24 @@ - DONE; - }) - -+(define_insn "store_quadpti" -+ [(set (match_operand:PTI 0 "quad_memory_operand" "=wQ") -+ (unspec:PTI -+ [(match_operand:PTI 1 "quad_int_reg_operand" "r")] UNSPEC_LSQ))] -+ "TARGET_SYNC_TI" -+ "stq %1,%0" -+ [(set_attr "type" "store") -+ (set_attr "length" "4")]) -+ - (define_expand "atomic_store<mode>" -- [(set (match_operand:INT1 0 "memory_operand" "") ;; memory -- (match_operand:INT1 1 "register_operand" "")) ;; input -+ [(set (match_operand:AINT 0 "memory_operand" "") ;; memory -+ (match_operand:AINT 1 "register_operand" "")) ;; input - (use (match_operand:SI 2 "const_int_operand" ""))] ;; model - "" - { -+ if (<MODE>mode == TImode && !TARGET_SYNC_TI) -+ FAIL; -+ - enum memmodel model = (enum memmodel) INTVAL (operands[2]); - switch (model) - { -@@ -166,7 +223,33 @@ - default: - gcc_unreachable (); - } -- emit_move_insn (operands[0], operands[1]); -+ if (<MODE>mode != TImode) -+ emit_move_insn (operands[0], operands[1]); -+ else -+ { -+ rtx op0 = operands[0]; -+ rtx op1 = operands[1]; -+ rtx pti_reg = gen_reg_rtx (PTImode); -+ -+ // Can't have indexed address for 'stq' -+ if (indexed_address (XEXP (op0, 0), TImode)) -+ { -+ rtx old_addr = XEXP (op0, 0); -+ rtx new_addr = force_reg (Pmode, old_addr); -+ operands[0] = op0 = replace_equiv_address (op0, new_addr); -+ } -+ -+ if (WORDS_BIG_ENDIAN) -+ emit_move_insn (pti_reg, gen_lowpart (PTImode, op1)); -+ else -+ { -+ emit_move_insn (gen_lowpart (DImode, pti_reg), gen_highpart (DImode, op1)); -+ emit_move_insn (gen_highpart (DImode, pti_reg), gen_lowpart (DImode, op1)); -+ } -+ -+ emit_insn (gen_store_quadpti (gen_lowpart (PTImode, op0), pti_reg)); -+ } -+ - DONE; - }) - -@@ -180,14 +263,6 @@ - SI - (DI "TARGET_POWERPC64")]) - --;; Types that we should provide atomic instructions for. -- --(define_mode_iterator AINT [QI -- HI -- SI -- (DI "TARGET_POWERPC64") -- (TI "TARGET_SYNC_TI")]) -- - (define_insn "load_locked<mode>" - [(set (match_operand:ATOMIC 0 "int_reg_operand" "=r") - (unspec_volatile:ATOMIC -Index: gcc/config/rs6000/rs6000.md -=================================================================== ---- a/src/gcc/config/rs6000/rs6000.md (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/rs6000/rs6000.md (.../branches/gcc-4_9-branch) -@@ -125,6 +125,16 @@ - UNSPEC_P8V_MTVSRD - UNSPEC_P8V_XXPERMDI - UNSPEC_P8V_RELOAD_FROM_VSX -+ UNSPEC_ADDG6S -+ UNSPEC_CDTBCD -+ UNSPEC_CBCDTD -+ UNSPEC_DIVE -+ UNSPEC_DIVEO -+ UNSPEC_DIVEU -+ UNSPEC_DIVEUO -+ UNSPEC_UNPACK_128BIT -+ UNSPEC_PACK_128BIT -+ UNSPEC_LSQ - ]) - - ;; -@@ -481,6 +491,10 @@ - (V2DF "X,X,X,X,X") - (V1TI "X,X,X,X,X")]) - -+;; Mode attribute to give the correct type for integer divides -+(define_mode_attr idiv_ldiv [(SI "idiv") -+ (DI "ldiv")]) -+ - - ;; Start with fixed-point load and store insns. Here we put only the more - ;; complex forms. Basic data transfer is done later. -@@ -732,7 +746,7 @@ - - (define_insn "*extendsidi2_lfiwax" - [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r,??wm,!wl,!wu") -- (sign_extend:DI (match_operand:SI 1 "lwa_operand" "m,r,r,Z,Z")))] -+ (sign_extend:DI (match_operand:SI 1 "lwa_operand" "Y,r,r,Z,Z")))] - "TARGET_POWERPC64 && TARGET_LFIWAX" - "@ - lwa%U1%X1 %0,%1 -@@ -755,7 +769,7 @@ - - (define_insn "*extendsidi2_nocell" - [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r") -- (sign_extend:DI (match_operand:SI 1 "lwa_operand" "m,r")))] -+ (sign_extend:DI (match_operand:SI 1 "lwa_operand" "Y,r")))] - "TARGET_POWERPC64 && rs6000_gen_cell_microcode && !TARGET_LFIWAX" - "@ - lwa%U1%X1 %0,%1 -@@ -2755,10 +2769,7 @@ - (match_operand:GPR 2 "gpc_reg_operand" "r")))] - "" - "div<wd>u %0,%1,%2" -- [(set (attr "type") -- (cond [(match_operand:SI 0 "" "") -- (const_string "idiv")] -- (const_string "ldiv")))]) -+ [(set_attr "type" "<idiv_ldiv>")]) - - - ;; For powers of two we can do srai/aze for divide and then adjust for -@@ -2782,10 +2793,7 @@ - (match_operand:GPR 2 "gpc_reg_operand" "r")))] - "" - "div<wd> %0,%1,%2" -- [(set (attr "type") -- (cond [(match_operand:SI 0 "" "") -- (const_string "idiv")] -- (const_string "ldiv")))]) -+ [(set_attr "type" "<idiv_ldiv>")]) - - (define_expand "mod<mode>3" - [(use (match_operand:GPR 0 "gpc_reg_operand" "")) -@@ -6534,6 +6542,49 @@ - [(set_attr "length" "8") - (set_attr "type" "fpload")]) - -+;; Define the TImode operations that can be done in a small number -+;; of instructions. The & constraints are to prevent the register -+;; allocator from allocating registers that overlap with the inputs -+;; (for example, having an input in 7,8 and an output in 6,7). We -+;; also allow for the output being the same as one of the inputs. -+ -+(define_insn "addti3" -+ [(set (match_operand:TI 0 "gpc_reg_operand" "=&r,&r,r,r") -+ (plus:TI (match_operand:TI 1 "gpc_reg_operand" "%r,r,0,0") -+ (match_operand:TI 2 "reg_or_short_operand" "r,I,r,I")))] -+ "TARGET_64BIT" -+{ -+ if (WORDS_BIG_ENDIAN) -+ return (GET_CODE (operands[2])) != CONST_INT -+ ? \"addc %L0,%L1,%L2\;adde %0,%1,%2\" -+ : \"addic %L0,%L1,%2\;add%G2e %0,%1\"; -+ else -+ return (GET_CODE (operands[2])) != CONST_INT -+ ? \"addc %0,%1,%2\;adde %L0,%L1,%L2\" -+ : \"addic %0,%1,%2\;add%G2e %L0,%L1\"; -+} -+ [(set_attr "type" "two") -+ (set_attr "length" "8")]) -+ -+(define_insn "subti3" -+ [(set (match_operand:TI 0 "gpc_reg_operand" "=&r,&r,r,r,r") -+ (minus:TI (match_operand:TI 1 "reg_or_short_operand" "r,I,0,r,I") -+ (match_operand:TI 2 "gpc_reg_operand" "r,r,r,0,0")))] -+ "TARGET_64BIT" -+{ -+ if (WORDS_BIG_ENDIAN) -+ return (GET_CODE (operands[1]) != CONST_INT) -+ ? \"subfc %L0,%L2,%L1\;subfe %0,%2,%1\" -+ : \"subfic %L0,%L2,%1\;subf%G1e %0,%2\"; -+ else -+ return (GET_CODE (operands[1]) != CONST_INT) -+ ? \"subfc %0,%2,%1\;subfe %L0,%L2,%L1\" -+ : \"subfic %0,%2,%1\;subf%G1e %L0,%L2\"; -+} -+ [(set_attr "type" "two") -+ (set_attr "length" "8")]) -+ -+ - ;; Define the DImode operations that can be done in a small number - ;; of instructions. The & constraints are to prevent the register - ;; allocator from allocating registers that overlap with the inputs -@@ -9395,7 +9446,8 @@ - (match_operand:FMOVE64 1 "input_operand" "r,Y,r,G,H,F"))] - "! TARGET_POWERPC64 - && ((TARGET_FPRS && TARGET_SINGLE_FLOAT) -- || TARGET_SOFT_FLOAT || TARGET_E500_SINGLE) -+ || TARGET_SOFT_FLOAT || TARGET_E500_SINGLE -+ || (<MODE>mode == DDmode && TARGET_E500_DOUBLE)) - && (gpc_reg_operand (operands[0], <MODE>mode) - || gpc_reg_operand (operands[1], <MODE>mode))" - "#" -@@ -15691,7 +15743,172 @@ - }) - - -+;; Miscellaneous ISA 2.06 (power7) instructions -+(define_insn "addg6s" -+ [(set (match_operand:SI 0 "register_operand" "=r") -+ (unspec:SI [(match_operand:SI 1 "register_operand" "r") -+ (match_operand:SI 2 "register_operand" "r")] -+ UNSPEC_ADDG6S))] -+ "TARGET_POPCNTD" -+ "addg6s %0,%1,%2" -+ [(set_attr "type" "integer") -+ (set_attr "length" "4")]) - -+(define_insn "cdtbcd" -+ [(set (match_operand:SI 0 "register_operand" "=r") -+ (unspec:SI [(match_operand:SI 1 "register_operand" "r")] -+ UNSPEC_CDTBCD))] -+ "TARGET_POPCNTD" -+ "cdtbcd %0,%1" -+ [(set_attr "type" "integer") -+ (set_attr "length" "4")]) -+ -+(define_insn "cbcdtd" -+ [(set (match_operand:SI 0 "register_operand" "=r") -+ (unspec:SI [(match_operand:SI 1 "register_operand" "r")] -+ UNSPEC_CBCDTD))] -+ "TARGET_POPCNTD" -+ "cbcdtd %0,%1" -+ [(set_attr "type" "integer") -+ (set_attr "length" "4")]) -+ -+(define_int_iterator UNSPEC_DIV_EXTEND [UNSPEC_DIVE -+ UNSPEC_DIVEO -+ UNSPEC_DIVEU -+ UNSPEC_DIVEUO]) -+ -+(define_int_attr div_extend [(UNSPEC_DIVE "e") -+ (UNSPEC_DIVEO "eo") -+ (UNSPEC_DIVEU "eu") -+ (UNSPEC_DIVEUO "euo")]) -+ -+(define_insn "div<div_extend>_<mode>" -+ [(set (match_operand:GPR 0 "register_operand" "=r") -+ (unspec:GPR [(match_operand:GPR 1 "register_operand" "r") -+ (match_operand:GPR 2 "register_operand" "r")] -+ UNSPEC_DIV_EXTEND))] -+ "TARGET_POPCNTD" -+ "div<wd><div_extend> %0,%1,%2" -+ [(set_attr "type" "<idiv_ldiv>")]) -+ -+ -+;; Pack/unpack 128-bit floating point types that take 2 scalar registers -+ -+; Type of the 64-bit part when packing/unpacking 128-bit floating point types -+(define_mode_attr FP128_64 [(TF "DF") (TD "DI")]) -+ -+(define_expand "unpack<mode>" -+ [(set (match_operand:<FP128_64> 0 "nonimmediate_operand" "") -+ (unspec:<FP128_64> -+ [(match_operand:FMOVE128 1 "register_operand" "") -+ (match_operand:QI 2 "const_0_to_1_operand" "")] -+ UNSPEC_UNPACK_128BIT))] -+ "" -+ "") -+ -+(define_insn_and_split "unpack<mode>_dm" -+ [(set (match_operand:<FP128_64> 0 "nonimmediate_operand" "=d,m,d,r,m") -+ (unspec:<FP128_64> -+ [(match_operand:FMOVE128 1 "register_operand" "d,d,r,d,r") -+ (match_operand:QI 2 "const_0_to_1_operand" "i,i,i,i,i")] -+ UNSPEC_UNPACK_128BIT))] -+ "TARGET_POWERPC64 && TARGET_DIRECT_MOVE" -+ "#" -+ "&& reload_completed" -+ [(set (match_dup 0) (match_dup 3))] -+{ -+ unsigned fp_regno = REGNO (operands[1]) + UINTVAL (operands[2]); -+ -+ if (REG_P (operands[0]) && REGNO (operands[0]) == fp_regno) -+ { -+ emit_note (NOTE_INSN_DELETED); -+ DONE; -+ } -+ -+ operands[3] = gen_rtx_REG (<FP128_64>mode, fp_regno); -+} -+ [(set_attr "type" "fp,fpstore,mffgpr,mftgpr,store") -+ (set_attr "length" "4")]) -+ -+(define_insn_and_split "unpack<mode>_nodm" -+ [(set (match_operand:<FP128_64> 0 "nonimmediate_operand" "=d,m") -+ (unspec:<FP128_64> -+ [(match_operand:FMOVE128 1 "register_operand" "d,d") -+ (match_operand:QI 2 "const_0_to_1_operand" "i,i")] -+ UNSPEC_UNPACK_128BIT))] -+ "!TARGET_POWERPC64 || !TARGET_DIRECT_MOVE" -+ "#" -+ "&& reload_completed" -+ [(set (match_dup 0) (match_dup 3))] -+{ -+ unsigned fp_regno = REGNO (operands[1]) + UINTVAL (operands[2]); -+ -+ if (REG_P (operands[0]) && REGNO (operands[0]) == fp_regno) -+ { -+ emit_note (NOTE_INSN_DELETED); -+ DONE; -+ } -+ -+ operands[3] = gen_rtx_REG (<FP128_64>mode, fp_regno); -+} -+ [(set_attr "type" "fp,fpstore") -+ (set_attr "length" "4")]) -+ -+(define_insn_and_split "pack<mode>" -+ [(set (match_operand:FMOVE128 0 "register_operand" "=d,&d") -+ (unspec:FMOVE128 -+ [(match_operand:<FP128_64> 1 "register_operand" "0,d") -+ (match_operand:<FP128_64> 2 "register_operand" "d,d")] -+ UNSPEC_PACK_128BIT))] -+ "" -+ "@ -+ fmr %L0,%2 -+ #" -+ "&& reload_completed && REGNO (operands[0]) != REGNO (operands[1])" -+ [(set (match_dup 3) (match_dup 1)) -+ (set (match_dup 4) (match_dup 2))] -+{ -+ unsigned dest_hi = REGNO (operands[0]); -+ unsigned dest_lo = dest_hi + 1; -+ -+ gcc_assert (!IN_RANGE (REGNO (operands[1]), dest_hi, dest_lo)); -+ gcc_assert (!IN_RANGE (REGNO (operands[2]), dest_hi, dest_lo)); -+ -+ operands[3] = gen_rtx_REG (<FP128_64>mode, dest_hi); -+ operands[4] = gen_rtx_REG (<FP128_64>mode, dest_lo); -+} -+ [(set_attr "type" "fp,fp") -+ (set_attr "length" "4,8")]) -+ -+(define_insn "unpackv1ti" -+ [(set (match_operand:DI 0 "register_operand" "=d,d") -+ (unspec:DI [(match_operand:V1TI 1 "register_operand" "0,wa") -+ (match_operand:QI 2 "const_0_to_1_operand" "O,i")] -+ UNSPEC_UNPACK_128BIT))] -+ "TARGET_VSX" -+{ -+ if (REGNO (operands[0]) == REGNO (operands[1]) && INTVAL (operands[2]) == 0) -+ return ASM_COMMENT_START " xxpermdi to same register"; -+ -+ operands[3] = GEN_INT (INTVAL (operands[2]) == 0 ? 0 : 3); -+ return "xxpermdi %x0,%x1,%x1,%3"; -+} -+ [(set_attr "type" "vecperm") -+ (set_attr "length" "4")]) -+ -+(define_insn "packv1ti" -+ [(set (match_operand:V1TI 0 "register_operand" "=wa") -+ (unspec:V1TI -+ [(match_operand:DI 1 "register_operand" "d") -+ (match_operand:DI 2 "register_operand" "d")] -+ UNSPEC_PACK_128BIT))] -+ "TARGET_VSX" -+ "xxpermdi %x0,%x1,%x2,0" -+ [(set_attr "type" "vecperm") -+ (set_attr "length" "4")]) -+ -+ -+ - (include "sync.md") - (include "vector.md") - (include "vsx.md") -Index: gcc/config/arm/neon-docgen.ml -=================================================================== ---- a/src/gcc/config/arm/neon-docgen.ml (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/arm/neon-docgen.ml (.../branches/gcc-4_9-branch) -@@ -1,424 +0,0 @@ --(* ARM NEON documentation generator. -- -- Copyright (C) 2006-2014 Free Software Foundation, Inc. -- Contributed by CodeSourcery. -- -- This file is part of GCC. -- -- GCC is free software; you can redistribute it and/or modify it under -- the terms of the GNU General Public License as published by the Free -- Software Foundation; either version 3, or (at your option) any later -- version. -- -- GCC is distributed in the hope that it will be useful, but WITHOUT ANY -- WARRANTY; without even the implied warranty of MERCHANTABILITY or -- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- for more details. -- -- You should have received a copy of the GNU General Public License -- along with GCC; see the file COPYING3. If not see -- <http://www.gnu.org/licenses/>. -- -- This is an O'Caml program. The O'Caml compiler is available from: -- -- http://caml.inria.fr/ -- -- Or from your favourite OS's friendly packaging system. Tested with version -- 3.09.2, though other versions will probably work too. -- -- Compile with: -- ocamlc -c neon.ml -- ocamlc -o neon-docgen neon.cmo neon-docgen.ml -- -- Run with: -- /path/to/neon-docgen /path/to/gcc/doc/arm-neon-intrinsics.texi --*) -- --open Neon -- --(* The combined "ops" and "reinterp" table. *) --let ops_reinterp = reinterp @ ops -- --(* Helper functions for extracting things from the "ops" table. *) --let single_opcode desired_opcode () = -- List.fold_left (fun got_so_far -> -- fun row -> -- match row with -- (opcode, _, _, _, _, _) -> -- if opcode = desired_opcode then row :: got_so_far -- else got_so_far -- ) [] ops_reinterp -- --let multiple_opcodes desired_opcodes () = -- List.fold_left (fun got_so_far -> -- fun desired_opcode -> -- (single_opcode desired_opcode ()) @ got_so_far) -- [] desired_opcodes -- --let ldx_opcode number () = -- List.fold_left (fun got_so_far -> -- fun row -> -- match row with -- (opcode, _, _, _, _, _) -> -- match opcode with -- Vldx n | Vldx_lane n | Vldx_dup n when n = number -> -- row :: got_so_far -- | _ -> got_so_far -- ) [] ops_reinterp -- --let stx_opcode number () = -- List.fold_left (fun got_so_far -> -- fun row -> -- match row with -- (opcode, _, _, _, _, _) -> -- match opcode with -- Vstx n | Vstx_lane n when n = number -> -- row :: got_so_far -- | _ -> got_so_far -- ) [] ops_reinterp -- --let tbl_opcode () = -- List.fold_left (fun got_so_far -> -- fun row -> -- match row with -- (opcode, _, _, _, _, _) -> -- match opcode with -- Vtbl _ -> row :: got_so_far -- | _ -> got_so_far -- ) [] ops_reinterp -- --let tbx_opcode () = -- List.fold_left (fun got_so_far -> -- fun row -> -- match row with -- (opcode, _, _, _, _, _) -> -- match opcode with -- Vtbx _ -> row :: got_so_far -- | _ -> got_so_far -- ) [] ops_reinterp -- --(* The groups of intrinsics. *) --let intrinsic_groups = -- [ "Addition", single_opcode Vadd; -- "Multiplication", single_opcode Vmul; -- "Multiply-accumulate", single_opcode Vmla; -- "Multiply-subtract", single_opcode Vmls; -- "Fused-multiply-accumulate", single_opcode Vfma; -- "Fused-multiply-subtract", single_opcode Vfms; -- "Round to integral (to nearest, ties to even)", single_opcode Vrintn; -- "Round to integral (to nearest, ties away from zero)", single_opcode Vrinta; -- "Round to integral (towards +Inf)", single_opcode Vrintp; -- "Round to integral (towards -Inf)", single_opcode Vrintm; -- "Round to integral (towards 0)", single_opcode Vrintz; -- "Subtraction", single_opcode Vsub; -- "Comparison (equal-to)", single_opcode Vceq; -- "Comparison (greater-than-or-equal-to)", single_opcode Vcge; -- "Comparison (less-than-or-equal-to)", single_opcode Vcle; -- "Comparison (greater-than)", single_opcode Vcgt; -- "Comparison (less-than)", single_opcode Vclt; -- "Comparison (absolute greater-than-or-equal-to)", single_opcode Vcage; -- "Comparison (absolute less-than-or-equal-to)", single_opcode Vcale; -- "Comparison (absolute greater-than)", single_opcode Vcagt; -- "Comparison (absolute less-than)", single_opcode Vcalt; -- "Test bits", single_opcode Vtst; -- "Absolute difference", single_opcode Vabd; -- "Absolute difference and accumulate", single_opcode Vaba; -- "Maximum", single_opcode Vmax; -- "Minimum", single_opcode Vmin; -- "Pairwise add", single_opcode Vpadd; -- "Pairwise add, single_opcode widen and accumulate", single_opcode Vpada; -- "Folding maximum", single_opcode Vpmax; -- "Folding minimum", single_opcode Vpmin; -- "Reciprocal step", multiple_opcodes [Vrecps; Vrsqrts]; -- "Vector shift left", single_opcode Vshl; -- "Vector shift left by constant", single_opcode Vshl_n; -- "Vector shift right by constant", single_opcode Vshr_n; -- "Vector shift right by constant and accumulate", single_opcode Vsra_n; -- "Vector shift right and insert", single_opcode Vsri; -- "Vector shift left and insert", single_opcode Vsli; -- "Absolute value", single_opcode Vabs; -- "Negation", single_opcode Vneg; -- "Bitwise not", single_opcode Vmvn; -- "Count leading sign bits", single_opcode Vcls; -- "Count leading zeros", single_opcode Vclz; -- "Count number of set bits", single_opcode Vcnt; -- "Reciprocal estimate", single_opcode Vrecpe; -- "Reciprocal square-root estimate", single_opcode Vrsqrte; -- "Get lanes from a vector", single_opcode Vget_lane; -- "Set lanes in a vector", single_opcode Vset_lane; -- "Create vector from literal bit pattern", single_opcode Vcreate; -- "Set all lanes to the same value", -- multiple_opcodes [Vdup_n; Vmov_n; Vdup_lane]; -- "Combining vectors", single_opcode Vcombine; -- "Splitting vectors", multiple_opcodes [Vget_high; Vget_low]; -- "Conversions", multiple_opcodes [Vcvt; Vcvt_n]; -- "Move, single_opcode narrowing", single_opcode Vmovn; -- "Move, single_opcode long", single_opcode Vmovl; -- "Table lookup", tbl_opcode; -- "Extended table lookup", tbx_opcode; -- "Multiply, lane", single_opcode Vmul_lane; -- "Long multiply, lane", single_opcode Vmull_lane; -- "Saturating doubling long multiply, lane", single_opcode Vqdmull_lane; -- "Saturating doubling multiply high, lane", single_opcode Vqdmulh_lane; -- "Multiply-accumulate, lane", single_opcode Vmla_lane; -- "Multiply-subtract, lane", single_opcode Vmls_lane; -- "Vector multiply by scalar", single_opcode Vmul_n; -- "Vector long multiply by scalar", single_opcode Vmull_n; -- "Vector saturating doubling long multiply by scalar", -- single_opcode Vqdmull_n; -- "Vector saturating doubling multiply high by scalar", -- single_opcode Vqdmulh_n; -- "Vector multiply-accumulate by scalar", single_opcode Vmla_n; -- "Vector multiply-subtract by scalar", single_opcode Vmls_n; -- "Vector extract", single_opcode Vext; -- "Reverse elements", multiple_opcodes [Vrev64; Vrev32; Vrev16]; -- "Bit selection", single_opcode Vbsl; -- "Transpose elements", single_opcode Vtrn; -- "Zip elements", single_opcode Vzip; -- "Unzip elements", single_opcode Vuzp; -- "Element/structure loads, VLD1 variants", ldx_opcode 1; -- "Element/structure stores, VST1 variants", stx_opcode 1; -- "Element/structure loads, VLD2 variants", ldx_opcode 2; -- "Element/structure stores, VST2 variants", stx_opcode 2; -- "Element/structure loads, VLD3 variants", ldx_opcode 3; -- "Element/structure stores, VST3 variants", stx_opcode 3; -- "Element/structure loads, VLD4 variants", ldx_opcode 4; -- "Element/structure stores, VST4 variants", stx_opcode 4; -- "Logical operations (AND)", single_opcode Vand; -- "Logical operations (OR)", single_opcode Vorr; -- "Logical operations (exclusive OR)", single_opcode Veor; -- "Logical operations (AND-NOT)", single_opcode Vbic; -- "Logical operations (OR-NOT)", single_opcode Vorn; -- "Reinterpret casts", single_opcode Vreinterp ] -- --(* Given an intrinsic shape, produce a string to document the corresponding -- operand shapes. *) --let rec analyze_shape shape = -- let rec n_things n thing = -- match n with -- 0 -> [] -- | n -> thing :: (n_things (n - 1) thing) -- in -- let rec analyze_shape_elt reg_no elt = -- match elt with -- Dreg -> "@var{d" ^ (string_of_int reg_no) ^ "}" -- | Qreg -> "@var{q" ^ (string_of_int reg_no) ^ "}" -- | Corereg -> "@var{r" ^ (string_of_int reg_no) ^ "}" -- | Immed -> "#@var{0}" -- | VecArray (1, elt) -> -- let elt_regexp = analyze_shape_elt 0 elt in -- "@{" ^ elt_regexp ^ "@}" -- | VecArray (n, elt) -> -- let rec f m = -- match m with -- 0 -> [] -- | m -> (analyze_shape_elt (m - 1) elt) :: (f (m - 1)) -- in -- let ops = List.rev (f n) in -- "@{" ^ (commas (fun x -> x) ops "") ^ "@}" -- | (PtrTo elt | CstPtrTo elt) -> -- "[" ^ (analyze_shape_elt reg_no elt) ^ "]" -- | Element_of_dreg -> (analyze_shape_elt reg_no Dreg) ^ "[@var{0}]" -- | Element_of_qreg -> (analyze_shape_elt reg_no Qreg) ^ "[@var{0}]" -- | All_elements_of_dreg -> (analyze_shape_elt reg_no Dreg) ^ "[]" -- | Alternatives alts -> (analyze_shape_elt reg_no (List.hd alts)) -- in -- match shape with -- All (n, elt) -> commas (analyze_shape_elt 0) (n_things n elt) "" -- | Long -> (analyze_shape_elt 0 Qreg) ^ ", " ^ (analyze_shape_elt 0 Dreg) ^ -- ", " ^ (analyze_shape_elt 0 Dreg) -- | Long_noreg elt -> (analyze_shape_elt 0 elt) ^ ", " ^ -- (analyze_shape_elt 0 elt) -- | Wide -> (analyze_shape_elt 0 Qreg) ^ ", " ^ (analyze_shape_elt 0 Qreg) ^ -- ", " ^ (analyze_shape_elt 0 Dreg) -- | Wide_noreg elt -> analyze_shape (Long_noreg elt) -- | Narrow -> (analyze_shape_elt 0 Dreg) ^ ", " ^ (analyze_shape_elt 0 Qreg) ^ -- ", " ^ (analyze_shape_elt 0 Qreg) -- | Use_operands elts -> commas (analyze_shape_elt 0) (Array.to_list elts) "" -- | By_scalar Dreg -> -- analyze_shape (Use_operands [| Dreg; Dreg; Element_of_dreg |]) -- | By_scalar Qreg -> -- analyze_shape (Use_operands [| Qreg; Qreg; Element_of_dreg |]) -- | By_scalar _ -> assert false -- | Wide_lane -> -- analyze_shape (Use_operands [| Qreg; Dreg; Element_of_dreg |]) -- | Wide_scalar -> -- analyze_shape (Use_operands [| Qreg; Dreg; Element_of_dreg |]) -- | Pair_result elt -> -- let elt_regexp = analyze_shape_elt 0 elt in -- let elt_regexp' = analyze_shape_elt 1 elt in -- elt_regexp ^ ", " ^ elt_regexp' -- | Unary_scalar _ -> "FIXME Unary_scalar" -- | Binary_imm elt -> analyze_shape (Use_operands [| elt; elt; Immed |]) -- | Narrow_imm -> analyze_shape (Use_operands [| Dreg; Qreg; Immed |]) -- | Long_imm -> analyze_shape (Use_operands [| Qreg; Dreg; Immed |]) -- --(* Document a single intrinsic. *) --let describe_intrinsic first chan -- (elt_ty, (_, features, shape, name, munge, _)) = -- let c_arity, new_elt_ty = munge shape elt_ty in -- let c_types = strings_of_arity c_arity in -- Printf.fprintf chan "@itemize @bullet\n"; -- let item_code = if first then "@item" else "@itemx" in -- Printf.fprintf chan "%s %s %s_%s (" item_code (List.hd c_types) -- (intrinsic_name name) (string_of_elt elt_ty); -- Printf.fprintf chan "%s)\n" (commas (fun ty -> ty) (List.tl c_types) ""); -- if not (List.exists (fun feature -> feature = No_op) features) then -- begin -- let print_one_insn name = -- Printf.fprintf chan "@code{"; -- let no_suffix = (new_elt_ty = NoElts) in -- let name_with_suffix = -- if no_suffix then name -- else name ^ "." ^ (string_of_elt_dots new_elt_ty) -- in -- let possible_operands = analyze_all_shapes features shape -- analyze_shape -- in -- let rec print_one_possible_operand op = -- Printf.fprintf chan "%s %s}" name_with_suffix op -- in -- (* If the intrinsic expands to multiple instructions, we assume -- they are all of the same form. *) -- print_one_possible_operand (List.hd possible_operands) -- in -- let rec print_insns names = -- match names with -- [] -> () -- | [name] -> print_one_insn name -- | name::names -> (print_one_insn name; -- Printf.fprintf chan " @emph{or} "; -- print_insns names) -- in -- let insn_names = get_insn_names features name in -- Printf.fprintf chan "@*@emph{Form of expected instruction(s):} "; -- print_insns insn_names; -- Printf.fprintf chan "\n" -- end; -- Printf.fprintf chan "@end itemize\n"; -- Printf.fprintf chan "\n\n" -- --(* Document a group of intrinsics. *) --let document_group chan (group_title, group_extractor) = -- (* Extract the rows in question from the ops table and then turn them -- into a list of intrinsics. *) -- let intrinsics = -- List.fold_left (fun got_so_far -> -- fun row -> -- match row with -- (_, _, _, _, _, elt_tys) -> -- List.fold_left (fun got_so_far' -> -- fun elt_ty -> -- (elt_ty, row) :: got_so_far') -- got_so_far elt_tys -- ) [] (group_extractor ()) -- in -- (* Emit the title for this group. *) -- Printf.fprintf chan "@subsubsection %s\n\n" group_title; -- (* Emit a description of each intrinsic. *) -- List.iter (describe_intrinsic true chan) intrinsics; -- (* Close this group. *) -- Printf.fprintf chan "\n\n" -- --let gnu_header chan = -- List.iter (fun s -> Printf.fprintf chan "%s\n" s) [ -- "@c Copyright (C) 2006-2014 Free Software Foundation, Inc."; -- "@c This is part of the GCC manual."; -- "@c For copying conditions, see the file gcc.texi."; -- ""; -- "@c This file is generated automatically using gcc/config/arm/neon-docgen.ml"; -- "@c Please do not edit manually."] -- --let crypto_doc = --" --@itemize @bullet --@item poly128_t vldrq_p128(poly128_t const *) --@end itemize -- --@itemize @bullet --@item void vstrq_p128(poly128_t *, poly128_t) --@end itemize -- --@itemize @bullet --@item uint64x1_t vceq_p64 (poly64x1_t, poly64x1_t) --@end itemize -- --@itemize @bullet --@item uint64x1_t vtst_p64 (poly64x1_t, poly64x1_t) --@end itemize -- --@itemize @bullet --@item uint32_t vsha1h_u32 (uint32_t) --@*@emph{Form of expected instruction(s):} @code{sha1h.32 @var{q0}, @var{q1}} --@end itemize -- --@itemize @bullet --@item uint32x4_t vsha1cq_u32 (uint32x4_t, uint32_t, uint32x4_t) --@*@emph{Form of expected instruction(s):} @code{sha1c.32 @var{q0}, @var{q1}, @var{q2}} --@end itemize -- --@itemize @bullet --@item uint32x4_t vsha1pq_u32 (uint32x4_t, uint32_t, uint32x4_t) --@*@emph{Form of expected instruction(s):} @code{sha1p.32 @var{q0}, @var{q1}, @var{q2}} --@end itemize -- --@itemize @bullet --@item uint32x4_t vsha1mq_u32 (uint32x4_t, uint32_t, uint32x4_t) --@*@emph{Form of expected instruction(s):} @code{sha1m.32 @var{q0}, @var{q1}, @var{q2}} --@end itemize -- --@itemize @bullet --@item uint32x4_t vsha1su0q_u32 (uint32x4_t, uint32x4_t, uint32x4_t) --@*@emph{Form of expected instruction(s):} @code{sha1su0.32 @var{q0}, @var{q1}, @var{q2}} --@end itemize -- --@itemize @bullet --@item uint32x4_t vsha1su1q_u32 (uint32x4_t, uint32x4_t) --@*@emph{Form of expected instruction(s):} @code{sha1su1.32 @var{q0}, @var{q1}, @var{q2}} --@end itemize -- --@itemize @bullet --@item uint32x4_t vsha256hq_u32 (uint32x4_t, uint32x4_t, uint32x4_t) --@*@emph{Form of expected instruction(s):} @code{sha256h.32 @var{q0}, @var{q1}, @var{q2}} --@end itemize -- --@itemize @bullet --@item uint32x4_t vsha256h2q_u32 (uint32x4_t, uint32x4_t, uint32x4_t) --@*@emph{Form of expected instruction(s):} @code{sha256h2.32 @var{q0}, @var{q1}, @var{q2}} --@end itemize -- --@itemize @bullet --@item uint32x4_t vsha256su0q_u32 (uint32x4_t, uint32x4_t) --@*@emph{Form of expected instruction(s):} @code{sha256su0.32 @var{q0}, @var{q1}} --@end itemize -- --@itemize @bullet --@item uint32x4_t vsha256su1q_u32 (uint32x4_t, uint32x4_t, uint32x4_t) --@*@emph{Form of expected instruction(s):} @code{sha256su1.32 @var{q0}, @var{q1}, @var{q2}} --@end itemize -- --@itemize @bullet --@item poly128_t vmull_p64 (poly64_t a, poly64_t b) --@*@emph{Form of expected instruction(s):} @code{vmull.p64 @var{q0}, @var{d1}, @var{d2}} --@end itemize -- --@itemize @bullet --@item poly128_t vmull_high_p64 (poly64x2_t a, poly64x2_t b) --@*@emph{Form of expected instruction(s):} @code{vmull.p64 @var{q0}, @var{d1}, @var{d2}} --@end itemize --" -- --(* Program entry point. *) --let _ = -- if Array.length Sys.argv <> 2 then -- failwith "Usage: neon-docgen <output filename>" -- else -- let file = Sys.argv.(1) in -- try -- let chan = open_out file in -- gnu_header chan; -- List.iter (document_group chan) intrinsic_groups; -- Printf.fprintf chan "%s\n" crypto_doc; -- close_out chan -- with Sys_error sys -> -- failwith ("Could not create output file " ^ file ^ ": " ^ sys) -Index: gcc/config/arm/neon-gen.ml -=================================================================== ---- a/src/gcc/config/arm/neon-gen.ml (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/arm/neon-gen.ml (.../branches/gcc-4_9-branch) -@@ -1,520 +0,0 @@ --(* Auto-generate ARM Neon intrinsics header file. -- Copyright (C) 2006-2014 Free Software Foundation, Inc. -- Contributed by CodeSourcery. -- -- This file is part of GCC. -- -- GCC is free software; you can redistribute it and/or modify it under -- the terms of the GNU General Public License as published by the Free -- Software Foundation; either version 3, or (at your option) any later -- version. -- -- GCC is distributed in the hope that it will be useful, but WITHOUT ANY -- WARRANTY; without even the implied warranty of MERCHANTABILITY or -- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- for more details. -- -- You should have received a copy of the GNU General Public License -- along with GCC; see the file COPYING3. If not see -- <http://www.gnu.org/licenses/>. -- -- This is an O'Caml program. The O'Caml compiler is available from: -- -- http://caml.inria.fr/ -- -- Or from your favourite OS's friendly packaging system. Tested with version -- 3.09.2, though other versions will probably work too. -- -- Compile with: -- ocamlc -c neon.ml -- ocamlc -o neon-gen neon.cmo neon-gen.ml -- -- Run with: -- ./neon-gen > arm_neon.h --*) -- --open Neon -- --(* The format codes used in the following functions are documented at: -- http://caml.inria.fr/pub/docs/manual-ocaml/libref/Format.html\ -- #6_printflikefunctionsforprettyprinting -- (one line, remove the backslash.) --*) -- --(* Following functions can be used to approximate GNU indentation style. *) --let start_function () = -- Format.printf "@[<v 0>"; -- ref 0 -- --let end_function nesting = -- match !nesting with -- 0 -> Format.printf "@;@;@]" -- | _ -> failwith ("Bad nesting (ending function at level " -- ^ (string_of_int !nesting) ^ ")") -- --let open_braceblock nesting = -- begin match !nesting with -- 0 -> Format.printf "@,@<0>{@[<v 2>@," -- | _ -> Format.printf "@,@[<v 2> @<0>{@[<v 2>@," -- end; -- incr nesting -- --let close_braceblock nesting = -- decr nesting; -- match !nesting with -- 0 -> Format.printf "@]@,@<0>}" -- | _ -> Format.printf "@]@,@<0>}@]" -- --let print_function arity fnname body = -- let ffmt = start_function () in -- Format.printf "__extension__ static __inline "; -- let inl = "__attribute__ ((__always_inline__))" in -- begin match arity with -- Arity0 ret -> -- Format.printf "%s %s@,%s (void)" (string_of_vectype ret) inl fnname -- | Arity1 (ret, arg0) -> -- Format.printf "%s %s@,%s (%s __a)" (string_of_vectype ret) inl fnname -- (string_of_vectype arg0) -- | Arity2 (ret, arg0, arg1) -> -- Format.printf "%s %s@,%s (%s __a, %s __b)" -- (string_of_vectype ret) inl fnname (string_of_vectype arg0) -- (string_of_vectype arg1) -- | Arity3 (ret, arg0, arg1, arg2) -> -- Format.printf "%s %s@,%s (%s __a, %s __b, %s __c)" -- (string_of_vectype ret) inl fnname (string_of_vectype arg0) -- (string_of_vectype arg1) (string_of_vectype arg2) -- | Arity4 (ret, arg0, arg1, arg2, arg3) -> -- Format.printf "%s %s@,%s (%s __a, %s __b, %s __c, %s __d)" -- (string_of_vectype ret) inl fnname (string_of_vectype arg0) -- (string_of_vectype arg1) (string_of_vectype arg2) -- (string_of_vectype arg3) -- end; -- open_braceblock ffmt; -- let rec print_lines = function -- [] -> () -- | "" :: lines -> print_lines lines -- | [line] -> Format.printf "%s" line -- | line::lines -> Format.printf "%s@," line ; print_lines lines in -- print_lines body; -- close_braceblock ffmt; -- end_function ffmt -- --let union_string num elts base = -- let itype = inttype_for_array num elts in -- let iname = string_of_inttype itype -- and sname = string_of_vectype (T_arrayof (num, elts)) in -- Printf.sprintf "union { %s __i; %s __o; } %s" sname iname base -- --let rec signed_ctype = function -- T_uint8x8 | T_poly8x8 -> T_int8x8 -- | T_uint8x16 | T_poly8x16 -> T_int8x16 -- | T_uint16x4 | T_poly16x4 -> T_int16x4 -- | T_uint16x8 | T_poly16x8 -> T_int16x8 -- | T_uint32x2 -> T_int32x2 -- | T_uint32x4 -> T_int32x4 -- | T_uint64x1 -> T_int64x1 -- | T_uint64x2 -> T_int64x2 -- | T_poly64x2 -> T_int64x2 -- (* Cast to types defined by mode in arm.c, not random types pulled in from -- the <stdint.h> header in use. This fixes incompatible pointer errors when -- compiling with C++. *) -- | T_uint8 | T_int8 -> T_intQI -- | T_uint16 | T_int16 -> T_intHI -- | T_uint32 | T_int32 -> T_intSI -- | T_uint64 | T_int64 -> T_intDI -- | T_float16 -> T_floatHF -- | T_float32 -> T_floatSF -- | T_poly8 -> T_intQI -- | T_poly16 -> T_intHI -- | T_poly64 -> T_intDI -- | T_poly128 -> T_intTI -- | T_arrayof (n, elt) -> T_arrayof (n, signed_ctype elt) -- | T_ptrto elt -> T_ptrto (signed_ctype elt) -- | T_const elt -> T_const (signed_ctype elt) -- | x -> x -- --let add_cast ctype cval = -- let stype = signed_ctype ctype in -- if ctype <> stype then -- Printf.sprintf "(%s) %s" (string_of_vectype stype) cval -- else -- cval -- --let cast_for_return to_ty = "(" ^ (string_of_vectype to_ty) ^ ")" -- --(* Return a tuple of a list of declarations to go at the start of the function, -- and a list of statements needed to return THING. *) --let return arity thing = -- match arity with -- Arity0 (ret) | Arity1 (ret, _) | Arity2 (ret, _, _) | Arity3 (ret, _, _, _) -- | Arity4 (ret, _, _, _, _) -> -- begin match ret with -- T_arrayof (num, vec) -> -- let uname = union_string num vec "__rv" in -- [uname ^ ";"], ["__rv.__o = " ^ thing ^ ";"; "return __rv.__i;"] -- | T_void -> -- [], [thing ^ ";"] -- | _ -> -- [], ["return " ^ (cast_for_return ret) ^ thing ^ ";"] -- end -- --let mask_shape_for_shuffle = function -- All (num, reg) -> All (num, reg) -- | Pair_result reg -> All (2, reg) -- | _ -> failwith "mask_for_shuffle" -- --let mask_elems shuffle shape elttype part = -- let elem_size = elt_width elttype in -- let num_elems = -- match regmap shape 0 with -- Dreg -> 64 / elem_size -- | Qreg -> 128 / elem_size -- | _ -> failwith "mask_elems" in -- shuffle elem_size num_elems part -- --(* Return a tuple of a list of declarations 0and a list of statements needed -- to implement an intrinsic using __builtin_shuffle. SHUFFLE is a function -- which returns a list of elements suitable for using as a mask. *) -- --let shuffle_fn shuffle shape arity elttype = -- let mshape = mask_shape_for_shuffle shape in -- let masktype = type_for_elt mshape (unsigned_of_elt elttype) 0 in -- let masktype_str = string_of_vectype masktype in -- let shuffle_res = type_for_elt mshape elttype 0 in -- let shuffle_res_str = string_of_vectype shuffle_res in -- match arity with -- Arity0 (ret) | Arity1 (ret, _) | Arity2 (ret, _, _) | Arity3 (ret, _, _, _) -- | Arity4 (ret, _, _, _, _) -> -- begin match ret with -- T_arrayof (num, vec) -> -- let elems1 = mask_elems shuffle mshape elttype `lo -- and elems2 = mask_elems shuffle mshape elttype `hi in -- let mask1 = (String.concat ", " (List.map string_of_int elems1)) -- and mask2 = (String.concat ", " (List.map string_of_int elems2)) in -- let shuf1 = Printf.sprintf -- "__rv.val[0] = (%s) __builtin_shuffle (__a, __b, (%s) { %s });" -- shuffle_res_str masktype_str mask1 -- and shuf2 = Printf.sprintf -- "__rv.val[1] = (%s) __builtin_shuffle (__a, __b, (%s) { %s });" -- shuffle_res_str masktype_str mask2 in -- [Printf.sprintf "%s __rv;" (string_of_vectype ret);], -- [shuf1; shuf2; "return __rv;"] -- | _ -> -- let elems = mask_elems shuffle mshape elttype `lo in -- let mask = (String.concat ", " (List.map string_of_int elems)) in -- let shuf = Printf.sprintf -- "return (%s) __builtin_shuffle (__a, (%s) { %s });" shuffle_res_str masktype_str mask in -- [""], -- [shuf] -- end -- --let rec element_type ctype = -- match ctype with -- T_arrayof (_, v) -> element_type v -- | _ -> ctype -- --let params ps = -- let pdecls = ref [] in -- let ptype t p = -- match t with -- T_arrayof (num, elts) -> -- let uname = union_string num elts (p ^ "u") in -- let decl = Printf.sprintf "%s = { %s };" uname p in -- pdecls := decl :: !pdecls; -- p ^ "u.__o" -- | _ -> add_cast t p in -- let plist = match ps with -- Arity0 _ -> [] -- | Arity1 (_, t1) -> [ptype t1 "__a"] -- | Arity2 (_, t1, t2) -> [ptype t1 "__a"; ptype t2 "__b"] -- | Arity3 (_, t1, t2, t3) -> [ptype t1 "__a"; ptype t2 "__b"; ptype t3 "__c"] -- | Arity4 (_, t1, t2, t3, t4) -> -- [ptype t1 "__a"; ptype t2 "__b"; ptype t3 "__c"; ptype t4 "__d"] in -- !pdecls, plist -- --let modify_params features plist = -- let is_flipped = -- List.exists (function Flipped _ -> true | _ -> false) features in -- if is_flipped then -- match plist with -- [ a; b ] -> [ b; a ] -- | _ -> -- failwith ("Don't know how to flip args " ^ (String.concat ", " plist)) -- else -- plist -- --(* !!! Decide whether to add an extra information word based on the shape -- form. *) --let extra_word shape features paramlist bits = -- let use_word = -- match shape with -- All _ | Long | Long_noreg _ | Wide | Wide_noreg _ | Narrow -- | By_scalar _ | Wide_scalar | Wide_lane | Binary_imm _ | Long_imm -- | Narrow_imm -> true -- | _ -> List.mem InfoWord features -- in -- if use_word then -- paramlist @ [string_of_int bits] -- else -- paramlist -- --(* Bit 0 represents signed (1) vs unsigned (0), or float (1) vs poly (0). -- Bit 1 represents floats & polynomials (1), or ordinary integers (0). -- Bit 2 represents rounding (1) vs none (0). *) --let infoword_value elttype features = -- let bits01 = -- match elt_class elttype with -- Signed | ConvClass (Signed, _) | ConvClass (_, Signed) -> 0b001 -- | Poly -> 0b010 -- | Float -> 0b011 -- | _ -> 0b000 -- and rounding_bit = if List.mem Rounding features then 0b100 else 0b000 in -- bits01 lor rounding_bit -- --(* "Cast" type operations will throw an exception in mode_of_elt (actually in -- elt_width, called from there). Deal with that here, and generate a suffix -- with multiple modes (<to><from>). *) --let rec mode_suffix elttype shape = -- try -- let mode = mode_of_elt elttype shape in -- string_of_mode mode -- with MixedMode (dst, src) -> -- let dstmode = mode_of_elt ~argpos:0 dst shape -- and srcmode = mode_of_elt ~argpos:1 src shape in -- string_of_mode dstmode ^ string_of_mode srcmode -- --let get_shuffle features = -- try -- match List.find (function Use_shuffle _ -> true | _ -> false) features with -- Use_shuffle fn -> Some fn -- | _ -> None -- with Not_found -> None -- --let print_feature_test_start features = -- try -- match List.find (fun feature -> -- match feature with Requires_feature _ -> true -- | Requires_arch _ -> true -- | Requires_FP_bit _ -> true -- | _ -> false) -- features with -- Requires_feature feature -> -- Format.printf "#ifdef __ARM_FEATURE_%s@\n" feature -- | Requires_arch arch -> -- Format.printf "#if __ARM_ARCH >= %d@\n" arch -- | Requires_FP_bit bit -> -- Format.printf "#if ((__ARM_FP & 0x%X) != 0)@\n" -- (1 lsl bit) -- | _ -> assert false -- with Not_found -> assert true -- --let print_feature_test_end features = -- let feature = -- List.exists (function Requires_feature _ -> true -- | Requires_arch _ -> true -- | Requires_FP_bit _ -> true -- | _ -> false) features in -- if feature then Format.printf "#endif@\n" -- -- --let print_variant opcode features shape name (ctype, asmtype, elttype) = -- let bits = infoword_value elttype features in -- let modesuf = mode_suffix elttype shape in -- let pdecls, paramlist = params ctype in -- let rdecls, stmts = -- match get_shuffle features with -- Some shuffle -> shuffle_fn shuffle shape ctype elttype -- | None -> -- let paramlist' = modify_params features paramlist in -- let paramlist'' = extra_word shape features paramlist' bits in -- let parstr = String.concat ", " paramlist'' in -- let builtin = Printf.sprintf "__builtin_neon_%s%s (%s)" -- (builtin_name features name) modesuf parstr in -- return ctype builtin in -- let body = pdecls @ rdecls @ stmts -- and fnname = (intrinsic_name name) ^ "_" ^ (string_of_elt elttype) in -- begin -- print_feature_test_start features; -- print_function ctype fnname body; -- print_feature_test_end features; -- end -- --(* When this function processes the element types in the ops table, it rewrites -- them in a list of tuples (a,b,c): -- a : C type as an "arity", e.g. Arity1 (T_poly8x8, T_poly8x8) -- b : Asm type : a single, processed element type, e.g. P16. This is the -- type which should be attached to the asm opcode. -- c : Variant type : the unprocessed type for this variant (e.g. in add -- instructions which don't care about the sign, b might be i16 and c -- might be s16.) --*) -- --let print_op (opcode, features, shape, name, munge, types) = -- let sorted_types = List.sort compare types in -- let munged_types = List.map -- (fun elt -> let c, asm = munge shape elt in c, asm, elt) sorted_types in -- List.iter -- (fun variant -> print_variant opcode features shape name variant) -- munged_types -- --let print_ops ops = -- List.iter print_op ops -- --(* Output type definitions. Table entries are: -- cbase : "C" name for the type. -- abase : "ARM" base name for the type (i.e. int in int8x8_t). -- esize : element size. -- enum : element count. -- alevel: architecture level at which available. --*) -- --type fpulevel = CRYPTO | ALL -- --let deftypes () = -- let typeinfo = [ -- (* Doubleword vector types. *) -- "__builtin_neon_qi", "int", 8, 8, ALL; -- "__builtin_neon_hi", "int", 16, 4, ALL; -- "__builtin_neon_si", "int", 32, 2, ALL; -- "__builtin_neon_di", "int", 64, 1, ALL; -- "__builtin_neon_hf", "float", 16, 4, ALL; -- "__builtin_neon_sf", "float", 32, 2, ALL; -- "__builtin_neon_poly8", "poly", 8, 8, ALL; -- "__builtin_neon_poly16", "poly", 16, 4, ALL; -- "__builtin_neon_poly64", "poly", 64, 1, CRYPTO; -- "__builtin_neon_uqi", "uint", 8, 8, ALL; -- "__builtin_neon_uhi", "uint", 16, 4, ALL; -- "__builtin_neon_usi", "uint", 32, 2, ALL; -- "__builtin_neon_udi", "uint", 64, 1, ALL; -- -- (* Quadword vector types. *) -- "__builtin_neon_qi", "int", 8, 16, ALL; -- "__builtin_neon_hi", "int", 16, 8, ALL; -- "__builtin_neon_si", "int", 32, 4, ALL; -- "__builtin_neon_di", "int", 64, 2, ALL; -- "__builtin_neon_sf", "float", 32, 4, ALL; -- "__builtin_neon_poly8", "poly", 8, 16, ALL; -- "__builtin_neon_poly16", "poly", 16, 8, ALL; -- "__builtin_neon_poly64", "poly", 64, 2, CRYPTO; -- "__builtin_neon_uqi", "uint", 8, 16, ALL; -- "__builtin_neon_uhi", "uint", 16, 8, ALL; -- "__builtin_neon_usi", "uint", 32, 4, ALL; -- "__builtin_neon_udi", "uint", 64, 2, ALL -- ] in -- List.iter -- (fun (cbase, abase, esize, enum, fpulevel) -> -- let attr = -- match enum with -- 1 -> "" -- | _ -> Printf.sprintf "\t__attribute__ ((__vector_size__ (%d)))" -- (esize * enum / 8) in -- if fpulevel == CRYPTO then -- Format.printf "#ifdef __ARM_FEATURE_CRYPTO\n"; -- Format.printf "typedef %s %s%dx%d_t%s;@\n" cbase abase esize enum attr; -- if fpulevel == CRYPTO then -- Format.printf "#endif\n";) -- typeinfo; -- Format.print_newline (); -- (* Extra types not in <stdint.h>. *) -- Format.printf "typedef float float32_t;\n"; -- Format.printf "typedef __builtin_neon_poly8 poly8_t;\n"; -- Format.printf "typedef __builtin_neon_poly16 poly16_t;\n"; -- Format.printf "#ifdef __ARM_FEATURE_CRYPTO\n"; -- Format.printf "typedef __builtin_neon_poly64 poly64_t;\n"; -- Format.printf "typedef __builtin_neon_poly128 poly128_t;\n"; -- Format.printf "#endif\n" -- --(* Output structs containing arrays, for load & store instructions etc. -- poly128_t is deliberately not included here because it has no array types -- defined for it. *) -- --let arrtypes () = -- let typeinfo = [ -- "int", 8, ALL; "int", 16, ALL; -- "int", 32, ALL; "int", 64, ALL; -- "uint", 8, ALL; "uint", 16, ALL; -- "uint", 32, ALL; "uint", 64, ALL; -- "float", 32, ALL; "poly", 8, ALL; -- "poly", 16, ALL; "poly", 64, CRYPTO -- ] in -- let writestruct elname elsize regsize arrsize fpulevel = -- let elnum = regsize / elsize in -- let structname = -- Printf.sprintf "%s%dx%dx%d_t" elname elsize elnum arrsize in -- let sfmt = start_function () in -- Format.printf "%stypedef struct %s" -- (if fpulevel == CRYPTO then "#ifdef __ARM_FEATURE_CRYPTO\n" else "") structname; -- open_braceblock sfmt; -- Format.printf "%s%dx%d_t val[%d];" elname elsize elnum arrsize; -- close_braceblock sfmt; -- Format.printf " %s;%s" structname (if fpulevel == CRYPTO then "\n#endif\n" else ""); -- end_function sfmt; -- in -- for n = 2 to 4 do -- List.iter -- (fun (elname, elsize, alevel) -> -- writestruct elname elsize 64 n alevel; -- writestruct elname elsize 128 n alevel) -- typeinfo -- done -- --let print_lines = List.iter (fun s -> Format.printf "%s@\n" s) -- --(* Do it. *) -- --let _ = -- print_lines [ --"/* ARM NEON intrinsics include file. This file is generated automatically"; --" using neon-gen.ml. Please do not edit manually."; --""; --" Copyright (C) 2006-2014 Free Software Foundation, Inc."; --" Contributed by CodeSourcery."; --""; --" This file is part of GCC."; --""; --" GCC is free software; you can redistribute it and/or modify it"; --" under the terms of the GNU General Public License as published"; --" by the Free Software Foundation; either version 3, or (at your"; --" option) any later version."; --""; --" GCC is distributed in the hope that it will be useful, but WITHOUT"; --" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY"; --" or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public"; --" License for more details."; --""; --" Under Section 7 of GPL version 3, you are granted additional"; --" permissions described in the GCC Runtime Library Exception, version"; --" 3.1, as published by the Free Software Foundation."; --""; --" You should have received a copy of the GNU General Public License and"; --" a copy of the GCC Runtime Library Exception along with this program;"; --" see the files COPYING3 and COPYING.RUNTIME respectively. If not, see"; --" <http://www.gnu.org/licenses/>. */"; --""; --"#ifndef _GCC_ARM_NEON_H"; --"#define _GCC_ARM_NEON_H 1"; --""; --"#ifndef __ARM_NEON__"; --"#error You must enable NEON instructions (e.g. -mfloat-abi=softfp -mfpu=neon) to use arm_neon.h"; --"#else"; --""; --"#ifdef __cplusplus"; --"extern \"C\" {"; --"#endif"; --""; --"#include <stdint.h>"; --""]; -- deftypes (); -- arrtypes (); -- Format.print_newline (); -- print_ops ops; -- Format.print_newline (); -- print_ops reinterp; -- print_ops reinterpq; -- Format.printf "%s" crypto_intrinsics; -- print_lines [ --"#ifdef __cplusplus"; --"}"; --"#endif"; --"#endif"; --"#endif"] -Index: gcc/config/arm/uclinux-elf.h -=================================================================== ---- a/src/gcc/config/arm/uclinux-elf.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/arm/uclinux-elf.h (.../branches/gcc-4_9-branch) -@@ -14,8 +14,13 @@ - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - -- You should have received a copy of the GNU General Public License -- along with GCC; see the file COPYING3. If not see -+ Under Section 7 of GPL version 3, you are granted additional -+ permissions described in the GCC Runtime Library Exception, version -+ 3.1, as published by the Free Software Foundation. -+ -+ You should have received a copy of the GNU General Public License and -+ a copy of the GCC Runtime Library Exception along with this program; -+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see - <http://www.gnu.org/licenses/>. */ - - /* We don't want a PLT. */ -Index: gcc/config/arm/linux-elf.h -=================================================================== ---- a/src/gcc/config/arm/linux-elf.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/arm/linux-elf.h (.../branches/gcc-4_9-branch) -@@ -14,8 +14,13 @@ - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - -- You should have received a copy of the GNU General Public License -- along with GCC; see the file COPYING3. If not see -+ Under Section 7 of GPL version 3, you are granted additional -+ permissions described in the GCC Runtime Library Exception, version -+ 3.1, as published by the Free Software Foundation. -+ -+ You should have received a copy of the GNU General Public License and -+ a copy of the GCC Runtime Library Exception along with this program; -+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see - <http://www.gnu.org/licenses/>. */ - - /* elfos.h should have already been included. Now just override -Index: gcc/config/arm/elf.h -=================================================================== ---- a/src/gcc/config/arm/elf.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/arm/elf.h (.../branches/gcc-4_9-branch) -@@ -16,8 +16,13 @@ - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - -- You should have received a copy of the GNU General Public License -- along with GCC; see the file COPYING3. If not see -+ Under Section 7 of GPL version 3, you are granted additional -+ permissions described in the GCC Runtime Library Exception, version -+ 3.1, as published by the Free Software Foundation. -+ -+ You should have received a copy of the GNU General Public License and -+ a copy of the GCC Runtime Library Exception along with this program; -+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see - <http://www.gnu.org/licenses/>. */ - - #ifndef OBJECT_FORMAT_ELF -Index: gcc/config/arm/aout.h -=================================================================== ---- a/src/gcc/config/arm/aout.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/arm/aout.h (.../branches/gcc-4_9-branch) -@@ -14,8 +14,13 @@ - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - -- You should have received a copy of the GNU General Public License -- along with GCC; see the file COPYING3. If not see -+ Under Section 7 of GPL version 3, you are granted additional -+ permissions described in the GCC Runtime Library Exception, version -+ 3.1, as published by the Free Software Foundation. -+ -+ You should have received a copy of the GNU General Public License and -+ a copy of the GCC Runtime Library Exception along with this program; -+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see - <http://www.gnu.org/licenses/>. */ - - #ifndef ASM_APP_ON -Index: gcc/config/arm/arm.c -=================================================================== ---- a/src/gcc/config/arm/arm.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/arm/arm.c (.../branches/gcc-4_9-branch) -@@ -16716,11 +16716,12 @@ - rtx prev, insn = BB_END (bb); - bool insn_clobbered = false; - -- while (insn != BB_HEAD (bb) && DEBUG_INSN_P (insn)) -+ while (insn != BB_HEAD (bb) && !NONDEBUG_INSN_P (insn)) - insn = PREV_INSN (insn); - - /* Find the last cbranchsi4_insn in basic block BB. */ -- if (INSN_CODE (insn) != CODE_FOR_cbranchsi4_insn) -+ if (insn == BB_HEAD (bb) -+ || INSN_CODE (insn) != CODE_FOR_cbranchsi4_insn) - continue; - - /* Get the register with which we are comparing. */ -@@ -28183,9 +28184,13 @@ - fputs (":\n", file); - if (flag_pic) - { -- /* Output ".word .LTHUNKn-7-.LTHUNKPCn". */ -+ /* Output ".word .LTHUNKn-[3,7]-.LTHUNKPCn". */ - rtx tem = XEXP (DECL_RTL (function), 0); -- tem = plus_constant (GET_MODE (tem), tem, -7); -+ /* For TARGET_THUMB1_ONLY the thunk is in Thumb mode, so the PC -+ pipeline offset is four rather than eight. Adjust the offset -+ accordingly. */ -+ tem = plus_constant (GET_MODE (tem), tem, -+ TARGET_THUMB1_ONLY ? -3 : -7); - tem = gen_rtx_MINUS (GET_MODE (tem), - tem, - gen_rtx_SYMBOL_REF (Pmode, -Index: gcc/config/arm/arm.h -=================================================================== ---- a/src/gcc/config/arm/arm.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/arm/arm.h (.../branches/gcc-4_9-branch) -@@ -17,8 +17,13 @@ - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - -- You should have received a copy of the GNU General Public License -- along with GCC; see the file COPYING3. If not see -+ Under Section 7 of GPL version 3, you are granted additional -+ permissions described in the GCC Runtime Library Exception, version -+ 3.1, as published by the Free Software Foundation. -+ -+ You should have received a copy of the GNU General Public License and -+ a copy of the GCC Runtime Library Exception along with this program; -+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see - <http://www.gnu.org/licenses/>. */ - - #ifndef GCC_ARM_H -Index: gcc/config/arm/uclinux-eabi.h -=================================================================== ---- a/src/gcc/config/arm/uclinux-eabi.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/arm/uclinux-eabi.h (.../branches/gcc-4_9-branch) -@@ -14,8 +14,13 @@ - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - -- You should have received a copy of the GNU General Public License -- along with GCC; see the file COPYING3. If not see -+ Under Section 7 of GPL version 3, you are granted additional -+ permissions described in the GCC Runtime Library Exception, version -+ 3.1, as published by the Free Software Foundation. -+ -+ You should have received a copy of the GNU General Public License and -+ a copy of the GCC Runtime Library Exception along with this program; -+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see - <http://www.gnu.org/licenses/>. */ - - /* Override settings that are different to the uclinux-elf or -Index: gcc/config/arm/arm-cores.def -=================================================================== ---- a/src/gcc/config/arm/arm-cores.def (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/arm/arm-cores.def (.../branches/gcc-4_9-branch) -@@ -14,8 +14,13 @@ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - -- You should have received a copy of the GNU General Public License -- along with GCC; see the file COPYING3. If not see -+ Under Section 7 of GPL version 3, you are granted additional -+ permissions described in the GCC Runtime Library Exception, version -+ 3.1, as published by the Free Software Foundation. -+ -+ You should have received a copy of the GNU General Public License and -+ a copy of the GCC Runtime Library Exception along with this program; -+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see - <http://www.gnu.org/licenses/>. */ - - /* Before using #include to read this file, define a macro: -Index: gcc/config/arm/linux-gas.h -=================================================================== ---- a/src/gcc/config/arm/linux-gas.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/arm/linux-gas.h (.../branches/gcc-4_9-branch) -@@ -15,8 +15,13 @@ - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - -- You should have received a copy of the GNU General Public License -- along with GCC; see the file COPYING3. If not see -+ Under Section 7 of GPL version 3, you are granted additional -+ permissions described in the GCC Runtime Library Exception, version -+ 3.1, as published by the Free Software Foundation. -+ -+ You should have received a copy of the GNU General Public License and -+ a copy of the GCC Runtime Library Exception along with this program; -+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see - <http://www.gnu.org/licenses/>. */ - - /* This is how we tell the assembler that a symbol is weak. -Index: gcc/config/arm/arm_neon.h -=================================================================== ---- a/src/gcc/config/arm/arm_neon.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/arm/arm_neon.h (.../branches/gcc-4_9-branch) -@@ -1,5 +1,4 @@ --/* ARM NEON intrinsics include file. This file is generated automatically -- using neon-gen.ml. Please do not edit manually. -+/* ARM NEON intrinsics include file. - - Copyright (C) 2006-2014 Free Software Foundation, Inc. - Contributed by CodeSourcery. -@@ -7707,12 +7706,32 @@ - return (poly16x8_t)__builtin_neon_vbslv8hi ((int16x8_t) __a, (int16x8_t) __b, (int16x8_t) __c); - } - -+/* For big-endian, the shuffle masks for ZIP, UZP and TRN must be changed as -+ follows. (nelt = the number of elements within a vector.) -+ -+ Firstly, a value of N within a mask, becomes (N ^ (nelt - 1)), as gcc vector -+ extension's indexing scheme is reversed *within each vector* (relative to the -+ neon intrinsics view), but without changing which of the two vectors. -+ -+ Secondly, the elements within each mask are reversed, as the mask is itself a -+ vector, and will itself be loaded in reverse order (again, relative to the -+ neon intrinsics view, i.e. that would result from a "vld1" instruction). */ -+ - __extension__ static __inline int8x8x2_t __attribute__ ((__always_inline__)) - vtrn_s8 (int8x8_t __a, int8x8_t __b) - { - int8x8x2_t __rv; -- __rv.val[0] = (int8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 0, 8, 2, 10, 4, 12, 6, 14 }); -- __rv.val[1] = (int8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 1, 9, 3, 11, 5, 13, 7, 15 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 9, 1, 11, 3, 13, 5, 15, 7 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 8, 0, 10, 2, 12, 4, 14, 6 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 0, 8, 2, 10, 4, 12, 6, 14 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 1, 9, 3, 11, 5, 13, 7, 15 }); -+#endif - return __rv; - } - -@@ -7720,8 +7739,13 @@ - vtrn_s16 (int16x4_t __a, int16x4_t __b) - { - int16x4x2_t __rv; -- __rv.val[0] = (int16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 4, 2, 6 }); -- __rv.val[1] = (int16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 1, 5, 3, 7 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 5, 1, 7, 3 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 4, 0, 6, 2 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 4, 2, 6 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 1, 5, 3, 7 }); -+#endif - return __rv; - } - -@@ -7729,8 +7753,17 @@ - vtrn_u8 (uint8x8_t __a, uint8x8_t __b) - { - uint8x8x2_t __rv; -- __rv.val[0] = (uint8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 0, 8, 2, 10, 4, 12, 6, 14 }); -- __rv.val[1] = (uint8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 1, 9, 3, 11, 5, 13, 7, 15 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 9, 1, 11, 3, 13, 5, 15, 7 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 8, 0, 10, 2, 12, 4, 14, 6 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 0, 8, 2, 10, 4, 12, 6, 14 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 1, 9, 3, 11, 5, 13, 7, 15 }); -+#endif - return __rv; - } - -@@ -7738,8 +7771,13 @@ - vtrn_u16 (uint16x4_t __a, uint16x4_t __b) - { - uint16x4x2_t __rv; -- __rv.val[0] = (uint16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 4, 2, 6 }); -- __rv.val[1] = (uint16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 1, 5, 3, 7 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 5, 1, 7, 3 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 4, 0, 6, 2 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 4, 2, 6 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 1, 5, 3, 7 }); -+#endif - return __rv; - } - -@@ -7747,8 +7785,17 @@ - vtrn_p8 (poly8x8_t __a, poly8x8_t __b) - { - poly8x8x2_t __rv; -- __rv.val[0] = (poly8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 0, 8, 2, 10, 4, 12, 6, 14 }); -- __rv.val[1] = (poly8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 1, 9, 3, 11, 5, 13, 7, 15 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 9, 1, 11, 3, 13, 5, 15, 7 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 8, 0, 10, 2, 12, 4, 14, 6 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 0, 8, 2, 10, 4, 12, 6, 14 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 1, 9, 3, 11, 5, 13, 7, 15 }); -+#endif - return __rv; - } - -@@ -7756,8 +7803,13 @@ - vtrn_p16 (poly16x4_t __a, poly16x4_t __b) - { - poly16x4x2_t __rv; -- __rv.val[0] = (poly16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 4, 2, 6 }); -- __rv.val[1] = (poly16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 1, 5, 3, 7 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 5, 1, 7, 3 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 4, 0, 6, 2 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 4, 2, 6 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 1, 5, 3, 7 }); -+#endif - return __rv; - } - -@@ -7765,8 +7817,13 @@ - vtrn_s32 (int32x2_t __a, int32x2_t __b) - { - int32x2x2_t __rv; -- __rv.val[0] = (int32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 }); -- __rv.val[1] = (int32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 3, 1 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 2, 0 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 }); -+#endif - return __rv; - } - -@@ -7774,8 +7831,13 @@ - vtrn_f32 (float32x2_t __a, float32x2_t __b) - { - float32x2x2_t __rv; -- __rv.val[0] = (float32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 }); -- __rv.val[1] = (float32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 3, 1 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 2, 0 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 }); -+#endif - return __rv; - } - -@@ -7783,8 +7845,13 @@ - vtrn_u32 (uint32x2_t __a, uint32x2_t __b) - { - uint32x2x2_t __rv; -- __rv.val[0] = (uint32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 }); -- __rv.val[1] = (uint32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 3, 1 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 2, 0 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 }); -+#endif - return __rv; - } - -@@ -7792,8 +7859,17 @@ - vtrnq_s8 (int8x16_t __a, int8x16_t __b) - { - int8x16x2_t __rv; -- __rv.val[0] = (int8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 0, 16, 2, 18, 4, 20, 6, 22, 8, 24, 10, 26, 12, 28, 14, 30 }); -- __rv.val[1] = (int8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 1, 17, 3, 19, 5, 21, 7, 23, 9, 25, 11, 27, 13, 29, 15, 31 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 17, 1, 19, 3, 21, 5, 23, 7, 25, 9, 27, 11, 29, 13, 31, 15 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 16, 0, 18, 2, 20, 4, 22, 6, 24, 8, 26, 10, 28, 12, 30, 14 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 0, 16, 2, 18, 4, 20, 6, 22, 8, 24, 10, 26, 12, 28, 14, 30 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 1, 17, 3, 19, 5, 21, 7, 23, 9, 25, 11, 27, 13, 29, 15, 31 }); -+#endif - return __rv; - } - -@@ -7801,8 +7877,17 @@ - vtrnq_s16 (int16x8_t __a, int16x8_t __b) - { - int16x8x2_t __rv; -- __rv.val[0] = (int16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 0, 8, 2, 10, 4, 12, 6, 14 }); -- __rv.val[1] = (int16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 1, 9, 3, 11, 5, 13, 7, 15 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 9, 1, 11, 3, 13, 5, 15, 7 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 8, 0, 10, 2, 12, 4, 14, 6 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 0, 8, 2, 10, 4, 12, 6, 14 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 1, 9, 3, 11, 5, 13, 7, 15 }); -+#endif - return __rv; - } - -@@ -7810,8 +7895,13 @@ - vtrnq_s32 (int32x4_t __a, int32x4_t __b) - { - int32x4x2_t __rv; -- __rv.val[0] = (int32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 4, 2, 6 }); -- __rv.val[1] = (int32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 1, 5, 3, 7 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 5, 1, 7, 3 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 4, 0, 6, 2 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 4, 2, 6 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 1, 5, 3, 7 }); -+#endif - return __rv; - } - -@@ -7819,8 +7909,13 @@ - vtrnq_f32 (float32x4_t __a, float32x4_t __b) - { - float32x4x2_t __rv; -- __rv.val[0] = (float32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 4, 2, 6 }); -- __rv.val[1] = (float32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 1, 5, 3, 7 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 5, 1, 7, 3 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 4, 0, 6, 2 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 4, 2, 6 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 1, 5, 3, 7 }); -+#endif - return __rv; - } - -@@ -7828,8 +7923,17 @@ - vtrnq_u8 (uint8x16_t __a, uint8x16_t __b) - { - uint8x16x2_t __rv; -- __rv.val[0] = (uint8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 0, 16, 2, 18, 4, 20, 6, 22, 8, 24, 10, 26, 12, 28, 14, 30 }); -- __rv.val[1] = (uint8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 1, 17, 3, 19, 5, 21, 7, 23, 9, 25, 11, 27, 13, 29, 15, 31 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 17, 1, 19, 3, 21, 5, 23, 7, 25, 9, 27, 11, 29, 13, 31, 15 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 16, 0, 18, 2, 20, 4, 22, 6, 24, 8, 26, 10, 28, 12, 30, 14 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 0, 16, 2, 18, 4, 20, 6, 22, 8, 24, 10, 26, 12, 28, 14, 30 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 1, 17, 3, 19, 5, 21, 7, 23, 9, 25, 11, 27, 13, 29, 15, 31 }); -+#endif - return __rv; - } - -@@ -7837,8 +7941,17 @@ - vtrnq_u16 (uint16x8_t __a, uint16x8_t __b) - { - uint16x8x2_t __rv; -- __rv.val[0] = (uint16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 0, 8, 2, 10, 4, 12, 6, 14 }); -- __rv.val[1] = (uint16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 1, 9, 3, 11, 5, 13, 7, 15 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 9, 1, 11, 3, 13, 5, 15, 7 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 8, 0, 10, 2, 12, 4, 14, 6 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 0, 8, 2, 10, 4, 12, 6, 14 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 1, 9, 3, 11, 5, 13, 7, 15 }); -+#endif - return __rv; - } - -@@ -7846,8 +7959,13 @@ - vtrnq_u32 (uint32x4_t __a, uint32x4_t __b) - { - uint32x4x2_t __rv; -- __rv.val[0] = (uint32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 4, 2, 6 }); -- __rv.val[1] = (uint32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 1, 5, 3, 7 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 5, 1, 7, 3 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 4, 0, 6, 2 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 4, 2, 6 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 1, 5, 3, 7 }); -+#endif - return __rv; - } - -@@ -7855,8 +7973,17 @@ - vtrnq_p8 (poly8x16_t __a, poly8x16_t __b) - { - poly8x16x2_t __rv; -- __rv.val[0] = (poly8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 0, 16, 2, 18, 4, 20, 6, 22, 8, 24, 10, 26, 12, 28, 14, 30 }); -- __rv.val[1] = (poly8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 1, 17, 3, 19, 5, 21, 7, 23, 9, 25, 11, 27, 13, 29, 15, 31 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 17, 1, 19, 3, 21, 5, 23, 7, 25, 9, 27, 11, 29, 13, 31, 15 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 16, 0, 18, 2, 20, 4, 22, 6, 24, 8, 26, 10, 28, 12, 30, 14 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 0, 16, 2, 18, 4, 20, 6, 22, 8, 24, 10, 26, 12, 28, 14, 30 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 1, 17, 3, 19, 5, 21, 7, 23, 9, 25, 11, 27, 13, 29, 15, 31 }); -+#endif - return __rv; - } - -@@ -7864,8 +7991,17 @@ - vtrnq_p16 (poly16x8_t __a, poly16x8_t __b) - { - poly16x8x2_t __rv; -- __rv.val[0] = (poly16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 0, 8, 2, 10, 4, 12, 6, 14 }); -- __rv.val[1] = (poly16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 1, 9, 3, 11, 5, 13, 7, 15 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 9, 1, 11, 3, 13, 5, 15, 7 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 8, 0, 10, 2, 12, 4, 14, 6 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 0, 8, 2, 10, 4, 12, 6, 14 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 1, 9, 3, 11, 5, 13, 7, 15 }); -+#endif - return __rv; - } - -@@ -7873,8 +8009,17 @@ - vzip_s8 (int8x8_t __a, int8x8_t __b) - { - int8x8x2_t __rv; -- __rv.val[0] = (int8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 0, 8, 1, 9, 2, 10, 3, 11 }); -- __rv.val[1] = (int8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 4, 12, 5, 13, 6, 14, 7, 15 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 12, 4, 13, 5, 14, 6, 15, 7 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 8, 0, 9, 1, 10, 2, 11, 3 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 0, 8, 1, 9, 2, 10, 3, 11 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 4, 12, 5, 13, 6, 14, 7, 15 }); -+#endif - return __rv; - } - -@@ -7882,8 +8027,13 @@ - vzip_s16 (int16x4_t __a, int16x4_t __b) - { - int16x4x2_t __rv; -- __rv.val[0] = (int16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 4, 1, 5 }); -- __rv.val[1] = (int16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 2, 6, 3, 7 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 6, 2, 7, 3 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 4, 0, 5, 1 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 4, 1, 5 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 2, 6, 3, 7 }); -+#endif - return __rv; - } - -@@ -7891,8 +8041,17 @@ - vzip_u8 (uint8x8_t __a, uint8x8_t __b) - { - uint8x8x2_t __rv; -- __rv.val[0] = (uint8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 0, 8, 1, 9, 2, 10, 3, 11 }); -- __rv.val[1] = (uint8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 4, 12, 5, 13, 6, 14, 7, 15 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 12, 4, 13, 5, 14, 6, 15, 7 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 8, 0, 9, 1, 10, 2, 11, 3 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 0, 8, 1, 9, 2, 10, 3, 11 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 4, 12, 5, 13, 6, 14, 7, 15 }); -+#endif - return __rv; - } - -@@ -7900,8 +8059,13 @@ - vzip_u16 (uint16x4_t __a, uint16x4_t __b) - { - uint16x4x2_t __rv; -- __rv.val[0] = (uint16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 4, 1, 5 }); -- __rv.val[1] = (uint16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 2, 6, 3, 7 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 6, 2, 7, 3 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 4, 0, 5, 1 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 4, 1, 5 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 2, 6, 3, 7 }); -+#endif - return __rv; - } - -@@ -7909,8 +8073,17 @@ - vzip_p8 (poly8x8_t __a, poly8x8_t __b) - { - poly8x8x2_t __rv; -- __rv.val[0] = (poly8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 0, 8, 1, 9, 2, 10, 3, 11 }); -- __rv.val[1] = (poly8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 4, 12, 5, 13, 6, 14, 7, 15 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 12, 4, 13, 5, 14, 6, 15, 7 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 8, 0, 9, 1, 10, 2, 11, 3 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 0, 8, 1, 9, 2, 10, 3, 11 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 4, 12, 5, 13, 6, 14, 7, 15 }); -+#endif - return __rv; - } - -@@ -7918,8 +8091,13 @@ - vzip_p16 (poly16x4_t __a, poly16x4_t __b) - { - poly16x4x2_t __rv; -- __rv.val[0] = (poly16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 4, 1, 5 }); -- __rv.val[1] = (poly16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 2, 6, 3, 7 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 6, 2, 7, 3 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 4, 0, 5, 1 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 4, 1, 5 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 2, 6, 3, 7 }); -+#endif - return __rv; - } - -@@ -7927,8 +8105,13 @@ - vzip_s32 (int32x2_t __a, int32x2_t __b) - { - int32x2x2_t __rv; -- __rv.val[0] = (int32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 }); -- __rv.val[1] = (int32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 3, 1 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 2, 0 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 }); -+#endif - return __rv; - } - -@@ -7936,8 +8119,13 @@ - vzip_f32 (float32x2_t __a, float32x2_t __b) - { - float32x2x2_t __rv; -- __rv.val[0] = (float32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 }); -- __rv.val[1] = (float32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 3, 1 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 2, 0 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 }); -+#endif - return __rv; - } - -@@ -7945,8 +8133,13 @@ - vzip_u32 (uint32x2_t __a, uint32x2_t __b) - { - uint32x2x2_t __rv; -- __rv.val[0] = (uint32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 }); -- __rv.val[1] = (uint32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 3, 1 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 2, 0 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 }); -+#endif - return __rv; - } - -@@ -7954,8 +8147,17 @@ - vzipq_s8 (int8x16_t __a, int8x16_t __b) - { - int8x16x2_t __rv; -- __rv.val[0] = (int8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 }); -- __rv.val[1] = (int8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 24, 8, 25, 9, 26, 10, 27, 11, 28, 12, 29, 13, 30, 14, 31, 15 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 16, 0, 17, 1, 18, 2, 19, 3, 20, 4, 21, 5, 22, 6, 23, 7 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31 }); -+#endif - return __rv; - } - -@@ -7963,8 +8165,17 @@ - vzipq_s16 (int16x8_t __a, int16x8_t __b) - { - int16x8x2_t __rv; -- __rv.val[0] = (int16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 0, 8, 1, 9, 2, 10, 3, 11 }); -- __rv.val[1] = (int16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 4, 12, 5, 13, 6, 14, 7, 15 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 12, 4, 13, 5, 14, 6, 15, 7 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 8, 0, 9, 1, 10, 2, 11, 3 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 0, 8, 1, 9, 2, 10, 3, 11 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 4, 12, 5, 13, 6, 14, 7, 15 }); -+#endif - return __rv; - } - -@@ -7972,8 +8183,13 @@ - vzipq_s32 (int32x4_t __a, int32x4_t __b) - { - int32x4x2_t __rv; -- __rv.val[0] = (int32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 4, 1, 5 }); -- __rv.val[1] = (int32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 2, 6, 3, 7 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 6, 2, 7, 3 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 4, 0, 5, 1 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 4, 1, 5 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 2, 6, 3, 7 }); -+#endif - return __rv; - } - -@@ -7981,8 +8197,13 @@ - vzipq_f32 (float32x4_t __a, float32x4_t __b) - { - float32x4x2_t __rv; -- __rv.val[0] = (float32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 4, 1, 5 }); -- __rv.val[1] = (float32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 2, 6, 3, 7 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 6, 2, 7, 3 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 4, 0, 5, 1 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 4, 1, 5 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 2, 6, 3, 7 }); -+#endif - return __rv; - } - -@@ -7990,8 +8211,17 @@ - vzipq_u8 (uint8x16_t __a, uint8x16_t __b) - { - uint8x16x2_t __rv; -- __rv.val[0] = (uint8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 }); -- __rv.val[1] = (uint8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 24, 8, 25, 9, 26, 10, 27, 11, 28, 12, 29, 13, 30, 14, 31, 15 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 16, 0, 17, 1, 18, 2, 19, 3, 20, 4, 21, 5, 22, 6, 23, 7 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31 }); -+#endif - return __rv; - } - -@@ -7999,8 +8229,17 @@ - vzipq_u16 (uint16x8_t __a, uint16x8_t __b) - { - uint16x8x2_t __rv; -- __rv.val[0] = (uint16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 0, 8, 1, 9, 2, 10, 3, 11 }); -- __rv.val[1] = (uint16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 4, 12, 5, 13, 6, 14, 7, 15 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 12, 4, 13, 5, 14, 6, 15, 7 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 8, 0, 9, 1, 10, 2, 11, 3 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 0, 8, 1, 9, 2, 10, 3, 11 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 4, 12, 5, 13, 6, 14, 7, 15 }); -+#endif - return __rv; - } - -@@ -8008,8 +8247,13 @@ - vzipq_u32 (uint32x4_t __a, uint32x4_t __b) - { - uint32x4x2_t __rv; -- __rv.val[0] = (uint32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 4, 1, 5 }); -- __rv.val[1] = (uint32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 2, 6, 3, 7 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 6, 2, 7, 3 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 4, 0, 5, 1 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 4, 1, 5 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 2, 6, 3, 7 }); -+#endif - return __rv; - } - -@@ -8017,8 +8261,17 @@ - vzipq_p8 (poly8x16_t __a, poly8x16_t __b) - { - poly8x16x2_t __rv; -- __rv.val[0] = (poly8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 }); -- __rv.val[1] = (poly8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 24, 8, 25, 9, 26, 10, 27, 11, 28, 12, 29, 13, 30, 14, 31, 15 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 16, 0, 17, 1, 18, 2, 19, 3, 20, 4, 21, 5, 22, 6, 23, 7 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31 }); -+#endif - return __rv; - } - -@@ -8026,8 +8279,17 @@ - vzipq_p16 (poly16x8_t __a, poly16x8_t __b) - { - poly16x8x2_t __rv; -- __rv.val[0] = (poly16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 0, 8, 1, 9, 2, 10, 3, 11 }); -- __rv.val[1] = (poly16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 4, 12, 5, 13, 6, 14, 7, 15 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 12, 4, 13, 5, 14, 6, 15, 7 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 8, 0, 9, 1, 10, 2, 11, 3 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 0, 8, 1, 9, 2, 10, 3, 11 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 4, 12, 5, 13, 6, 14, 7, 15 }); -+#endif - return __rv; - } - -@@ -8035,8 +8297,17 @@ - vuzp_s8 (int8x8_t __a, int8x8_t __b) - { - int8x8x2_t __rv; -- __rv.val[0] = (int8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 0, 2, 4, 6, 8, 10, 12, 14 }); -- __rv.val[1] = (int8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 1, 3, 5, 7, 9, 11, 13, 15 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 9, 11, 13, 15, 1, 3, 5, 7 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 8, 10, 12, 14, 0, 2, 4, 6 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 0, 2, 4, 6, 8, 10, 12, 14 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 1, 3, 5, 7, 9, 11, 13, 15 }); -+#endif - return __rv; - } - -@@ -8044,8 +8315,13 @@ - vuzp_s16 (int16x4_t __a, int16x4_t __b) - { - int16x4x2_t __rv; -- __rv.val[0] = (int16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 2, 4, 6 }); -- __rv.val[1] = (int16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 1, 3, 5, 7 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 5, 7, 1, 3 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 4, 6, 0, 2 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 2, 4, 6 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 1, 3, 5, 7 }); -+#endif - return __rv; - } - -@@ -8053,8 +8329,13 @@ - vuzp_s32 (int32x2_t __a, int32x2_t __b) - { - int32x2x2_t __rv; -- __rv.val[0] = (int32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 }); -- __rv.val[1] = (int32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 3, 1 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 2, 0 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 }); -+#endif - return __rv; - } - -@@ -8062,8 +8343,13 @@ - vuzp_f32 (float32x2_t __a, float32x2_t __b) - { - float32x2x2_t __rv; -- __rv.val[0] = (float32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 }); -- __rv.val[1] = (float32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 3, 1 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 2, 0 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 }); -+#endif - return __rv; - } - -@@ -8071,8 +8357,17 @@ - vuzp_u8 (uint8x8_t __a, uint8x8_t __b) - { - uint8x8x2_t __rv; -- __rv.val[0] = (uint8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 0, 2, 4, 6, 8, 10, 12, 14 }); -- __rv.val[1] = (uint8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 1, 3, 5, 7, 9, 11, 13, 15 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 9, 11, 13, 15, 1, 3, 5, 7 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 8, 10, 12, 14, 0, 2, 4, 6 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 0, 2, 4, 6, 8, 10, 12, 14 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 1, 3, 5, 7, 9, 11, 13, 15 }); -+#endif - return __rv; - } - -@@ -8080,8 +8375,13 @@ - vuzp_u16 (uint16x4_t __a, uint16x4_t __b) - { - uint16x4x2_t __rv; -- __rv.val[0] = (uint16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 2, 4, 6 }); -- __rv.val[1] = (uint16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 1, 3, 5, 7 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 5, 7, 1, 3 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 4, 6, 0, 2 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 2, 4, 6 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 1, 3, 5, 7 }); -+#endif - return __rv; - } - -@@ -8089,8 +8389,13 @@ - vuzp_u32 (uint32x2_t __a, uint32x2_t __b) - { - uint32x2x2_t __rv; -- __rv.val[0] = (uint32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 }); -- __rv.val[1] = (uint32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 3, 1 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 2, 0 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 }); -+#endif - return __rv; - } - -@@ -8098,8 +8403,17 @@ - vuzp_p8 (poly8x8_t __a, poly8x8_t __b) - { - poly8x8x2_t __rv; -- __rv.val[0] = (poly8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 0, 2, 4, 6, 8, 10, 12, 14 }); -- __rv.val[1] = (poly8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 1, 3, 5, 7, 9, 11, 13, 15 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 9, 11, 13, 15, 1, 3, 5, 7 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 8, 10, 12, 14, 0, 2, 4, 6 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 0, 2, 4, 6, 8, 10, 12, 14 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t) -+ { 1, 3, 5, 7, 9, 11, 13, 15 }); -+#endif - return __rv; - } - -@@ -8107,8 +8421,13 @@ - vuzp_p16 (poly16x4_t __a, poly16x4_t __b) - { - poly16x4x2_t __rv; -- __rv.val[0] = (poly16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 2, 4, 6 }); -- __rv.val[1] = (poly16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 1, 3, 5, 7 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 5, 7, 1, 3 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 4, 6, 0, 2 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 2, 4, 6 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 1, 3, 5, 7 }); -+#endif - return __rv; - } - -@@ -8116,8 +8435,17 @@ - vuzpq_s8 (int8x16_t __a, int8x16_t __b) - { - int8x16x2_t __rv; -- __rv.val[0] = (int8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 }); -- __rv.val[1] = (int8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 17, 19, 21, 23, 25, 27, 29, 31, 1, 3, 5, 7, 9, 11, 13, 15 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 16, 18, 20, 22, 24, 26, 28, 30, 0, 2, 4, 6, 8, 10, 12, 14 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31 }); -+#endif - return __rv; - } - -@@ -8125,8 +8453,17 @@ - vuzpq_s16 (int16x8_t __a, int16x8_t __b) - { - int16x8x2_t __rv; -- __rv.val[0] = (int16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 0, 2, 4, 6, 8, 10, 12, 14 }); -- __rv.val[1] = (int16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 1, 3, 5, 7, 9, 11, 13, 15 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 9, 11, 13, 15, 1, 3, 5, 7 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 8, 10, 12, 14, 0, 2, 4, 6 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 0, 2, 4, 6, 8, 10, 12, 14 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 1, 3, 5, 7, 9, 11, 13, 15 }); -+#endif - return __rv; - } - -@@ -8134,8 +8471,13 @@ - vuzpq_s32 (int32x4_t __a, int32x4_t __b) - { - int32x4x2_t __rv; -- __rv.val[0] = (int32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 2, 4, 6 }); -- __rv.val[1] = (int32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 1, 3, 5, 7 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 5, 7, 1, 3 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 4, 6, 0, 2 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 2, 4, 6 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 1, 3, 5, 7 }); -+#endif - return __rv; - } - -@@ -8143,8 +8485,13 @@ - vuzpq_f32 (float32x4_t __a, float32x4_t __b) - { - float32x4x2_t __rv; -- __rv.val[0] = (float32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 2, 4, 6 }); -- __rv.val[1] = (float32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 1, 3, 5, 7 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 5, 7, 1, 3 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 4, 6, 0, 2 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 2, 4, 6 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 1, 3, 5, 7 }); -+#endif - return __rv; - } - -@@ -8152,8 +8499,17 @@ - vuzpq_u8 (uint8x16_t __a, uint8x16_t __b) - { - uint8x16x2_t __rv; -- __rv.val[0] = (uint8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 }); -- __rv.val[1] = (uint8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 17, 19, 21, 23, 25, 27, 29, 31, 1, 3, 5, 7, 9, 11, 13, 15 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 16, 18, 20, 22, 24, 26, 28, 30, 0, 2, 4, 6, 8, 10, 12, 14 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31 }); -+#endif - return __rv; - } - -@@ -8161,8 +8517,17 @@ - vuzpq_u16 (uint16x8_t __a, uint16x8_t __b) - { - uint16x8x2_t __rv; -- __rv.val[0] = (uint16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 0, 2, 4, 6, 8, 10, 12, 14 }); -- __rv.val[1] = (uint16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 1, 3, 5, 7, 9, 11, 13, 15 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 9, 11, 13, 15, 1, 3, 5, 7 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 8, 10, 12, 14, 0, 2, 4, 6 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 0, 2, 4, 6, 8, 10, 12, 14 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 1, 3, 5, 7, 9, 11, 13, 15 }); -+#endif - return __rv; - } - -@@ -8170,8 +8535,13 @@ - vuzpq_u32 (uint32x4_t __a, uint32x4_t __b) - { - uint32x4x2_t __rv; -- __rv.val[0] = (uint32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 2, 4, 6 }); -- __rv.val[1] = (uint32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 1, 3, 5, 7 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 5, 7, 1, 3 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 4, 6, 0, 2 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 2, 4, 6 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 1, 3, 5, 7 }); -+#endif - return __rv; - } - -@@ -8179,8 +8549,17 @@ - vuzpq_p8 (poly8x16_t __a, poly8x16_t __b) - { - poly8x16x2_t __rv; -- __rv.val[0] = (poly8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 }); -- __rv.val[1] = (poly8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 17, 19, 21, 23, 25, 27, 29, 31, 1, 3, 5, 7, 9, 11, 13, 15 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 16, 18, 20, 22, 24, 26, 28, 30, 0, 2, 4, 6, 8, 10, 12, 14 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t) -+ { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31 }); -+#endif - return __rv; - } - -@@ -8188,8 +8567,17 @@ - vuzpq_p16 (poly16x8_t __a, poly16x8_t __b) - { - poly16x8x2_t __rv; -- __rv.val[0] = (poly16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 0, 2, 4, 6, 8, 10, 12, 14 }); -- __rv.val[1] = (poly16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 1, 3, 5, 7, 9, 11, 13, 15 }); -+#ifdef __ARM_BIG_ENDIAN -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 9, 11, 13, 15, 1, 3, 5, 7 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 8, 10, 12, 14, 0, 2, 4, 6 }); -+#else -+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 0, 2, 4, 6, 8, 10, 12, 14 }); -+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t) -+ { 1, 3, 5, 7, 9, 11, 13, 15 }); -+#endif - return __rv; - } - -Index: gcc/config/arm/bpabi.h -=================================================================== ---- a/src/gcc/config/arm/bpabi.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/arm/bpabi.h (.../branches/gcc-4_9-branch) -@@ -14,8 +14,13 @@ - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - -- You should have received a copy of the GNU General Public License -- along with GCC; see the file COPYING3. If not see -+ Under Section 7 of GPL version 3, you are granted additional -+ permissions described in the GCC Runtime Library Exception, version -+ 3.1, as published by the Free Software Foundation. -+ -+ You should have received a copy of the GNU General Public License and -+ a copy of the GCC Runtime Library Exception along with this program; -+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see - <http://www.gnu.org/licenses/>. */ - - /* Use the AAPCS ABI by default. */ -Index: gcc/config/arm/arm.md -=================================================================== ---- a/src/gcc/config/arm/arm.md (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/arm/arm.md (.../branches/gcc-4_9-branch) -@@ -8349,8 +8349,8 @@ - - (define_insn_and_split "*arm_cmpdi_unsigned" - [(set (reg:CC_CZ CC_REGNUM) -- (compare:CC_CZ (match_operand:DI 0 "s_register_operand" "l,r,r") -- (match_operand:DI 1 "arm_di_operand" "Py,r,rDi")))] -+ (compare:CC_CZ (match_operand:DI 0 "s_register_operand" "l,r,r,r") -+ (match_operand:DI 1 "arm_di_operand" "Py,r,Di,rDi")))] - - "TARGET_32BIT" - "#" ; "cmp\\t%R0, %R1\;it eq\;cmpeq\\t%Q0, %Q1" -@@ -8370,9 +8370,9 @@ - operands[1] = gen_lowpart (SImode, operands[1]); - } - [(set_attr "conds" "set") -- (set_attr "enabled_for_depr_it" "yes,yes,no") -- (set_attr "arch" "t2,t2,*") -- (set_attr "length" "6,6,8") -+ (set_attr "enabled_for_depr_it" "yes,yes,no,*") -+ (set_attr "arch" "t2,t2,t2,a") -+ (set_attr "length" "6,6,10,8") - (set_attr "type" "multiple")] - ) - -@@ -9860,6 +9860,7 @@ - "TARGET_32BIT" - "%i1%?\\t%0, %2, %4%S3" - [(set_attr "predicable" "yes") -+ (set_attr "predicable_short_it" "no") - (set_attr "shift" "4") - (set_attr "arch" "a,t2,t2,a") - ;; Thumb2 doesn't allow the stack pointer to be used for -Index: gcc/config/arm/arm-opts.h -=================================================================== ---- a/src/gcc/config/arm/arm-opts.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/arm/arm-opts.h (.../branches/gcc-4_9-branch) -@@ -13,8 +13,13 @@ - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - -- You should have received a copy of the GNU General Public License -- along with GCC; see the file COPYING3. If not see -+ Under Section 7 of GPL version 3, you are granted additional -+ permissions described in the GCC Runtime Library Exception, version -+ 3.1, as published by the Free Software Foundation. -+ -+ You should have received a copy of the GNU General Public License and -+ a copy of the GCC Runtime Library Exception along with this program; -+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see - <http://www.gnu.org/licenses/>. */ - - #ifndef ARM_OPTS_H -Index: gcc/config/arm/netbsd-elf.h -=================================================================== ---- a/src/gcc/config/arm/netbsd-elf.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/arm/netbsd-elf.h (.../branches/gcc-4_9-branch) -@@ -14,8 +14,13 @@ - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - -- You should have received a copy of the GNU General Public License -- along with GCC; see the file COPYING3. If not see -+ Under Section 7 of GPL version 3, you are granted additional -+ permissions described in the GCC Runtime Library Exception, version -+ 3.1, as published by the Free Software Foundation. -+ -+ You should have received a copy of the GNU General Public License and -+ a copy of the GCC Runtime Library Exception along with this program; -+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see - <http://www.gnu.org/licenses/>. */ - - /* Run-time Target Specification. */ -Index: gcc/config/arm/vxworks.h -=================================================================== ---- a/src/gcc/config/arm/vxworks.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/arm/vxworks.h (.../branches/gcc-4_9-branch) -@@ -17,8 +17,13 @@ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - --You should have received a copy of the GNU General Public License --along with GCC; see the file COPYING3. If not see -+Under Section 7 of GPL version 3, you are granted additional -+permissions described in the GCC Runtime Library Exception, version -+3.1, as published by the Free Software Foundation. -+ -+You should have received a copy of the GNU General Public License and -+a copy of the GCC Runtime Library Exception along with this program; -+see the files COPYING3 and COPYING.RUNTIME respectively. If not, see - <http://www.gnu.org/licenses/>. */ - - -Index: gcc/config/msp430/msp430-opts.h -=================================================================== ---- a/src/gcc/config/msp430/msp430-opts.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/msp430/msp430-opts.h (.../branches/gcc-4_9-branch) -@@ -0,0 +1,32 @@ -+/* GCC option-handling definitions for the TI MSP430 -+ Copyright (C) 2014 Free Software Foundation, Inc. -+ -+ This file is part of GCC. -+ -+ GCC is free software; you can redistribute it and/or modify it -+ under the terms of the GNU General Public License as published -+ by the Free Software Foundation; either version 3, or (at your -+ option) any later version. -+ -+ GCC is distributed in the hope that it will be useful, but WITHOUT -+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public -+ License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with GCC; see the file COPYING3. If not see -+ <http://www.gnu.org/licenses/>. */ -+ -+#ifndef MSP430_OPTS_H -+#define MSP430_OPTS_H -+ -+enum msp430_hwmult_types -+{ -+ NONE, -+ AUTO, -+ SMALL, -+ LARGE, -+ F5SERIES -+}; -+ -+#endif -Index: gcc/config/msp430/msp430-protos.h -=================================================================== ---- a/src/gcc/config/msp430/msp430-protos.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/msp430/msp430-protos.h (.../branches/gcc-4_9-branch) -@@ -30,11 +30,9 @@ - void msp430_fixup_compare_operands (enum machine_mode, rtx *); - int msp430_hard_regno_mode_ok (int, enum machine_mode); - int msp430_hard_regno_nregs (int, enum machine_mode); --bool msp430_hwmult_enabled (void); - rtx msp430_incoming_return_addr_rtx (void); - void msp430_init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, tree, int); - int msp430_initial_elimination_offset (int, int); --bool msp430_is_f5_mcu (void); - bool msp430_is_interrupt_func (void); - const char * msp430x_logical_shift_right (rtx); - const char * msp430_mcu_name (void); -@@ -45,5 +43,6 @@ - void msp430_split_movsi (rtx *); - void msp430_start_function (FILE *, const char *, tree); - rtx msp430_subreg (enum machine_mode, rtx, enum machine_mode, int); -+bool msp430_use_f5_series_hwmult (void); - - #endif /* GCC_MSP430_PROTOS_H */ -Index: gcc/config/msp430/predicates.md -=================================================================== ---- a/src/gcc/config/msp430/predicates.md (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/msp430/predicates.md (.../branches/gcc-4_9-branch) -@@ -73,6 +73,10 @@ - (define_predicate "msp430_nonsubreg_operand" - (match_code "reg,mem")) - -+(define_predicate "msp430_nonsubreg_or_imm_operand" -+ (ior (match_operand 0 "msp430_nonsubreg_operand") -+ (match_operand 0 "immediate_operand"))) -+ - ; TRUE for constants which are bit positions for zero_extract - (define_predicate "msp430_bitpos" - (and (match_code "const_int") -Index: gcc/config/msp430/msp430.md -=================================================================== ---- a/src/gcc/config/msp430/msp430.md (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/msp430/msp430.md (.../branches/gcc-4_9-branch) -@@ -362,8 +362,8 @@ - ; halves. - (define_split - [(set (match_operand:SI 0 "msp430_nonsubreg_operand") -- (plus:SI (match_operand:SI 1 "nonimmediate_operand") -- (match_operand:SI 2 "general_operand"))) -+ (plus:SI (match_operand:SI 1 "msp430_nonsubreg_operand") -+ (match_operand:SI 2 "msp430_nonsubreg_or_imm_operand"))) - ] - "" - [(parallel [(set (match_operand:HI 3 "nonimmediate_operand" "=&rm") -@@ -609,9 +609,15 @@ - ; when the PSI value is negative.. - ; - ; Note: using PUSHM.A #1 is two bytes smaller than using PUSHX.A.... -+; -+; Note: We use a + constraint on operand 0 as otherwise GCC gets confused -+; about extending a single PSI mode register into a pair of SImode registers -+; with the same starting register. It thinks that the upper register of -+; the pair is unused and so it can clobber it. Try compiling 20050826-2.c -+; at -O2 to see this. - - (define_insn "zero_extendpsisi2" -- [(set (match_operand:SI 0 "register_operand" "=r") -+ [(set (match_operand:SI 0 "register_operand" "+r") - (zero_extend:SI (match_operand:PSI 1 "register_operand" "r")))] - "" - "* -@@ -1311,9 +1317,9 @@ - "" - "* - if (REGNO (operands[0]) != REGNO (operands[1])) -- return \"MOV.W\t%1, %0 { SUB.W\t#0, %0 { AND.W\t%2, %0\"; -+ return \"MOV.W\t%1, %0 { INV.W\t%0 { INC.W\t%0 { AND.W\t%2, %0\"; - else -- return \"SUB.W\t#0, %0 { AND.W\t%2, %0\"; -+ return \"INV.W\t%0 { INC.W\t%0 { AND.W\t%2, %0\"; - " - ) - -@@ -1321,12 +1327,12 @@ - [(set (match_operand:SI 0 "register_operand" "=r") - (mult:SI (sign_extend:SI (match_operand:HI 1 "register_operand" "%0")) - (sign_extend:SI (match_operand:HI 2 "register_operand" "r"))))] -- "optimize > 2 && msp430_hwmult_enabled ()" -+ "optimize > 2 && msp430_hwmult_type != NONE" - "* -- if (msp430_is_f5_mcu ()) -- return \"MOV.W %1, &0x04C2 { MOV.W %2, &0x04C8 { MOV.W &0x04CA, %L0 { MOV.W &0x04CC, %H0\"; -+ if (msp430_use_f5_series_hwmult ()) -+ return \"PUSH.W sr { DINT { NOP { MOV.W %1, &0x04C2 { MOV.W %2, &0x04C8 { MOV.W &0x04CA, %L0 { MOV.W &0x04CC, %H0 { POP.W sr\"; - else -- return \"MOV.W %1, &0x0132 { MOV.W %2, &0x0138 { MOV.W &0x013A, %L0 { MOV.W &0x013C, %H0\"; -+ return \"PUSH.W sr { DINT { NOP { MOV.W %1, &0x0132 { MOV.W %2, &0x0138 { MOV.W &0x013A, %L0 { MOV.W &0x013C, %H0 { POP.W sr\"; - " - ) - -@@ -1334,12 +1340,12 @@ - [(set (match_operand:SI 0 "register_operand" "=r") - (mult:SI (zero_extend:SI (match_operand:HI 1 "register_operand" "%0")) - (zero_extend:SI (match_operand:HI 2 "register_operand" "r"))))] -- "optimize > 2 && msp430_hwmult_enabled ()" -+ "optimize > 2 && msp430_hwmult_type != NONE" - "* -- if (msp430_is_f5_mcu ()) -- return \"MOV.W %1, &0x04C0 { MOV.W %2, &0x04C8 { MOV.W &0x04CA, %L0 { MOV.W &0x04CC, %H0\"; -+ if (msp430_use_f5_series_hwmult ()) -+ return \"PUSH.W sr { DINT { NOP { MOV.W %1, &0x04C0 { MOV.W %2, &0x04C8 { MOV.W &0x04CA, %L0 { MOV.W &0x04CC, %H0 { POP.W sr\"; - else -- return \"MOV.W %1, &0x0130 { MOV.W %2, &0x0138 { MOV.W &0x013A, %L0 { MOV.W &0x013C, %H0\"; -+ return \"PUSH.W sr { DINT { NOP { MOV.W %1, &0x0130 { MOV.W %2, &0x0138 { MOV.W &0x013A, %L0 { MOV.W &0x013C, %H0 { POP.W sr\"; - " - ) - -@@ -1347,12 +1353,12 @@ - [(set (match_operand:DI 0 "register_operand" "=r") - (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "%0")) - (sign_extend:DI (match_operand:SI 2 "register_operand" "r"))))] -- "optimize > 2 && msp430_hwmult_enabled ()" -+ "optimize > 2 && msp430_hwmult_type != NONE" - "* -- if (msp430_is_f5_mcu ()) -- return \"MOV.W %L1, &0x04D4 { MOV.W %H1, &0x04D6 { MOV.W %L2, &0x04E0 { MOV.W %H2, &0x04E2 { MOV.W &0x04E4, %A0 { MOV.W &0x04E6, %B0 { MOV.W &0x04E8, %C0 { MOV.W &0x04EA, %D0\"; -+ if (msp430_use_f5_series_hwmult ()) -+ return \"PUSH.W sr { DINT { NOP { MOV.W %L1, &0x04D4 { MOV.W %H1, &0x04D6 { MOV.W %L2, &0x04E0 { MOV.W %H2, &0x04E2 { MOV.W &0x04E4, %A0 { MOV.W &0x04E6, %B0 { MOV.W &0x04E8, %C0 { MOV.W &0x04EA, %D0 { POP.W sr\"; - else -- return \"MOV.W %L1, &0x0144 { MOV.W %H1, &0x0146 { MOV.W %L2, &0x0150 { MOV.W %H2, &0x0152 { MOV.W &0x0154, %A0 { MOV.W &0x0156, %B0 { MOV.W &0x0158, %C0 { MOV.W &0x015A, %D0\"; -+ return \"PUSH.W sr { DINT { NOP { MOV.W %L1, &0x0144 { MOV.W %H1, &0x0146 { MOV.W %L2, &0x0150 { MOV.W %H2, &0x0152 { MOV.W &0x0154, %A0 { MOV.W &0x0156, %B0 { MOV.W &0x0158, %C0 { MOV.W &0x015A, %D0 { POP.W sr\"; - " - ) - -@@ -1360,11 +1366,11 @@ - [(set (match_operand:DI 0 "register_operand" "=r") - (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "%0")) - (zero_extend:DI (match_operand:SI 2 "register_operand" "r"))))] -- "optimize > 2 && msp430_hwmult_enabled ()" -+ "optimize > 2 && msp430_hwmult_type != NONE" - "* -- if (msp430_is_f5_mcu ()) -- return \"MOV.W %L1, &0x04D0 { MOV.W %H1, &0x04D2 { MOV.W %L2, &0x04E0 { MOV.W %H2, &0x04E2 { MOV.W &0x04E4, %A0 { MOV.W &0x04E6, %B0 { MOV.W &0x04E8, %C0 { MOV.W &0x04EA, %D0\"; -+ if (msp430_use_f5_series_hwmult ()) -+ return \"PUSH.W sr { DINT { NOP { MOV.W %L1, &0x04D0 { MOV.W %H1, &0x04D2 { MOV.W %L2, &0x04E0 { MOV.W %H2, &0x04E2 { MOV.W &0x04E4, %A0 { MOV.W &0x04E6, %B0 { MOV.W &0x04E8, %C0 { MOV.W &0x04EA, %D0 { POP.W sr\"; - else -- return \"MOV.W %L1, &0x0140 { MOV.W %H1, &0x0141 { MOV.W %L2, &0x0150 { MOV.W %H2, &0x0152 { MOV.W &0x0154, %A0 { MOV.W &0x0156, %B0 { MOV.W &0x0158, %C0 { MOV.W &0x015A, %D0\"; -+ return \"PUSH.W sr { DINT { NOP { MOV.W %L1, &0x0140 { MOV.W %H1, &0x0142 { MOV.W %L2, &0x0150 { MOV.W %H2, &0x0152 { MOV.W &0x0154, %A0 { MOV.W &0x0156, %B0 { MOV.W &0x0158, %C0 { MOV.W &0x015A, %D0 { POP.W sr\"; - " - ) -Index: gcc/config/msp430/msp430.c -=================================================================== ---- a/src/gcc/config/msp430/msp430.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/msp430/msp430.c (.../branches/gcc-4_9-branch) -@@ -95,18 +95,6 @@ - return m; - } - --#undef TARGET_HANDLE_OPTION --#define TARGET_HANDLE_OPTION msp430_handle_option -- --bool --msp430_handle_option (struct gcc_options *opts ATTRIBUTE_UNUSED, -- struct gcc_options *opts_set ATTRIBUTE_UNUSED, -- const struct cl_decoded_option *decoded ATTRIBUTE_UNUSED, -- location_t loc ATTRIBUTE_UNUSED) --{ -- return true; --} -- - #undef TARGET_OPTION_OVERRIDE - #define TARGET_OPTION_OVERRIDE msp430_option_override - -@@ -196,19 +184,14 @@ - - if (target_cpu) - { -- if (strcasecmp (target_cpu, "msp430x") == 0 -- || strcasecmp (target_cpu, "msp430xv2") == 0 -- || strcasecmp (target_cpu, "430x") == 0 -- || strcasecmp (target_cpu, "430xv2") == 0) -+ if (strcasecmp (target_cpu, "msp430x") == 0) - msp430x = true; -- else if (strcasecmp (target_cpu, "msp430") == 0 -- || strcasecmp (target_cpu, "430") == 0) -+ else /* target_cpu == "msp430" - already handled by the front end. */ - msp430x = false; -- else -- error ("unrecognised argument of -mcpu: %s", target_cpu); - } -- -- if (target_mcu) -+ /* Note - the front end has already ensured at most -+ one of target_cpu and target_mcu will be set. */ -+ else if (target_mcu) - { - int i; - -@@ -217,25 +200,12 @@ - supports 430. */ - msp430x = true; - -- /* For backwards compatibility we recognise two generic MCU -- 430X names. However we want to be able to generate special C -- preprocessor defines for them, which is why we set target_mcu -- to NULL. */ -- if (strcasecmp (target_mcu, "msp430") == 0) -- { -- msp430x = false; -- target_mcu = NULL; -- } -- else if (strcasecmp (target_mcu, "msp430x") == 0 -- || strcasecmp (target_mcu, "msp430xv2") == 0) -- target_mcu = NULL; -- else -- for (i = ARRAY_SIZE (msp430_mcu_names); i--;) -- if (strcasecmp (msp430_mcu_names[i], target_mcu) == 0) -- { -- msp430x = false; -- break; -- } -+ for (i = ARRAY_SIZE (msp430_mcu_names); i--;) -+ if (strcasecmp (msp430_mcu_names[i], target_mcu) == 0) -+ { -+ msp430x = false; -+ break; -+ } - /* It is not an error if we do not match the MCU name. There are - hundreds of them. */ - } -@@ -760,6 +730,97 @@ - { - return Pmode; - } -+ -+#undef TARGET_GIMPLIFY_VA_ARG_EXPR -+#define TARGET_GIMPLIFY_VA_ARG_EXPR msp430_gimplify_va_arg_expr -+ -+#include "gimplify.h" -+#include "gimple-expr.h" -+ -+static tree -+msp430_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p, -+ gimple_seq *post_p) -+{ -+ tree addr, t, type_size, rounded_size, valist_tmp; -+ unsigned HOST_WIDE_INT align, boundary; -+ bool indirect; -+ -+ indirect = pass_by_reference (NULL, TYPE_MODE (type), type, false); -+ if (indirect) -+ type = build_pointer_type (type); -+ -+ align = PARM_BOUNDARY / BITS_PER_UNIT; -+ boundary = targetm.calls.function_arg_boundary (TYPE_MODE (type), type); -+ -+ /* When we align parameter on stack for caller, if the parameter -+ alignment is beyond MAX_SUPPORTED_STACK_ALIGNMENT, it will be -+ aligned at MAX_SUPPORTED_STACK_ALIGNMENT. We will match callee -+ here with caller. */ -+ if (boundary > MAX_SUPPORTED_STACK_ALIGNMENT) -+ boundary = MAX_SUPPORTED_STACK_ALIGNMENT; -+ -+ boundary /= BITS_PER_UNIT; -+ -+ /* Hoist the valist value into a temporary for the moment. */ -+ valist_tmp = get_initialized_tmp_var (valist, pre_p, NULL); -+ -+ /* va_list pointer is aligned to PARM_BOUNDARY. If argument actually -+ requires greater alignment, we must perform dynamic alignment. */ -+ if (boundary > align -+ && !integer_zerop (TYPE_SIZE (type))) -+ { -+ /* FIXME: This is where this function diverts from targhooks.c: -+ std_gimplify_va_arg_expr(). It works, but I do not know why... */ -+ if (! POINTER_TYPE_P (type)) -+ { -+ t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp, -+ fold_build_pointer_plus_hwi (valist_tmp, boundary - 1)); -+ gimplify_and_add (t, pre_p); -+ -+ t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp, -+ fold_build2 (BIT_AND_EXPR, TREE_TYPE (valist), -+ valist_tmp, -+ build_int_cst (TREE_TYPE (valist), -boundary))); -+ gimplify_and_add (t, pre_p); -+ } -+ } -+ else -+ boundary = align; -+ -+ /* If the actual alignment is less than the alignment of the type, -+ adjust the type accordingly so that we don't assume strict alignment -+ when dereferencing the pointer. */ -+ boundary *= BITS_PER_UNIT; -+ if (boundary < TYPE_ALIGN (type)) -+ { -+ type = build_variant_type_copy (type); -+ TYPE_ALIGN (type) = boundary; -+ } -+ -+ /* Compute the rounded size of the type. */ -+ type_size = size_in_bytes (type); -+ rounded_size = round_up (type_size, align); -+ -+ /* Reduce rounded_size so it's sharable with the postqueue. */ -+ gimplify_expr (&rounded_size, pre_p, post_p, is_gimple_val, fb_rvalue); -+ -+ /* Get AP. */ -+ addr = valist_tmp; -+ -+ /* Compute new value for AP. */ -+ t = fold_build_pointer_plus (valist_tmp, rounded_size); -+ t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t); -+ gimplify_and_add (t, pre_p); -+ -+ addr = fold_convert (build_pointer_type (type), addr); -+ -+ if (indirect) -+ addr = build_va_arg_indirect_ref (addr); -+ -+ addr = build_va_arg_indirect_ref (addr); -+ -+ return addr; -+} - - /* Addressing Modes */ - -@@ -1847,16 +1908,20 @@ - - /* Returns true if the current MCU is an F5xxx series. */ - bool --msp430_is_f5_mcu (void) -+msp430_use_f5_series_hwmult (void) - { -- if (target_mcu == NULL) -+ if (msp430_hwmult_type == F5SERIES) -+ return true; -+ -+ if (target_mcu == NULL || msp430_hwmult_type != AUTO) - return false; -+ - return strncasecmp (target_mcu, "msp430f5", 8) == 0; - } - - /* Returns true id the current MCU has a second generation 32-bit hardware multiplier. */ - static bool --has_32bit_hw_mult (void) -+use_32bit_hwmult (void) - { - static const char * known_32bit_mult_mcus [] = - { -@@ -1868,7 +1933,11 @@ - "msp430f47177", "msp430f47187", "msp430f47197" - }; - int i; -- if (target_mcu == NULL) -+ -+ if (msp430_hwmult_type == LARGE) -+ return true; -+ -+ if (target_mcu == NULL || msp430_hwmult_type != AUTO) - return false; - - for (i = ARRAY_SIZE (known_32bit_mult_mcus); i--;) -@@ -1878,25 +1947,6 @@ - return false; - } - --/* Returns true if hardware multiply is supported by the chosen MCU. */ --bool --msp430_hwmult_enabled (void) --{ -- if (target_mcu == NULL) -- return false; -- -- if (!ENABLE_HWMULT) -- return false; -- -- if (msp430_is_interrupt_func ()) -- return false; -- -- if (msp430_is_f5_mcu () || has_32bit_hw_mult ()) -- return true; -- -- return false; --} -- - /* This function does the same as the default, but it will replace GCC - function names with the MSPABI-specified ones. */ - void -@@ -1913,11 +1963,11 @@ - - /* If we have been given a specific MCU name then we may be - able to make use of its hardware multiply capabilities. */ -- if (msp430_hwmult_enabled ()) -+ if (msp430_hwmult_type != NONE) - { - if (strcmp ("__mspabi_mpyi", name) == 0) - { -- if (msp430_is_f5_mcu ()) -+ if (msp430_use_f5_series_hwmult ()) - name = "__mulhi2_f5"; - else - name = "__mulhi2"; -@@ -1924,9 +1974,9 @@ - } - else if (strcmp ("__mspabi_mpyl", name) == 0) - { -- if (msp430_is_f5_mcu ()) -+ if (msp430_use_f5_series_hwmult ()) - name = "__mulsi2_f5"; -- else if (has_32bit_hw_mult ()) -+ else if (use_32bit_hwmult ()) - name = "__mulsi2_hw32"; - else - name = "__mulsi2"; -@@ -2203,7 +2253,7 @@ - because builtins are expanded before the frame layout is determined. */ - fprintf (file, "%d", - msp430_initial_elimination_offset (ARG_POINTER_REGNUM, STACK_POINTER_REGNUM) -- - 2); -+ - (TARGET_LARGE ? 4 : 2)); - return; - - case 'J': -@@ -2226,8 +2276,32 @@ - msp430_print_operand_addr (file, addr); - break; - -+ case CONST: -+ if (GET_CODE (XEXP (op, 0)) == ZERO_EXTRACT) -+ { -+ op = XEXP (op, 0); -+ switch (INTVAL (XEXP (op, 2))) -+ { -+ case 0: -+ fprintf (file, "#lo ("); -+ msp430_print_operand_raw (file, XEXP (op, 0)); -+ fprintf (file, ")"); -+ break; -+ -+ case 16: -+ fprintf (file, "#hi ("); -+ msp430_print_operand_raw (file, XEXP (op, 0)); -+ fprintf (file, ")"); -+ break; -+ -+ default: -+ output_operand_lossage ("invalid zero extract"); -+ break; -+ } -+ break; -+ } -+ /* Fall through. */ - case CONST_INT: -- case CONST: - case SYMBOL_REF: - case LABEL_REF: - if (letter == 0) -Index: gcc/config/msp430/msp430.opt -=================================================================== ---- a/src/gcc/config/msp430/msp430.opt (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/msp430/msp430.opt (.../branches/gcc-4_9-branch) -@@ -7,19 +7,19 @@ - Force assembly output to always use hex constants - - mmcu= --Target ToLower Joined RejectNegative Var(target_mcu) -+Target Report ToLower Joined RejectNegative Var(target_mcu) - Specify the MCU to build for. - - mcpu= --Target Joined RejectNegative Var(target_cpu) -+Target Report Joined RejectNegative Var(target_cpu) - Specify the ISA to build for: msp430, mdsp430x, msp430xv2 - - mlarge --Target Mask(LARGE) RejectNegative -+Target Report Mask(LARGE) RejectNegative - Select large model - 20-bit addresses/pointers - - msmall --Target InverseMask(LARGE) RejectNegative -+Target Report InverseMask(LARGE) RejectNegative - Select small model - 16-bit addresses/pointers (default) - - mrelax -@@ -33,6 +33,27 @@ - Target Report Mask(MINRT) RejectNegative - Use a minimum runtime (no static initializers or ctors) for memory-constrained devices. - --mhwmult --Target Report Var(ENABLE_HWMULT, 1) Init(1) --Enable hardware multiply (except in interrupt routines) -+HeaderInclude -+config/msp430/msp430-opts.h -+ -+mhwmult= -+Target Joined RejectNegative Report ToLower Var(msp430_hwmult_type) Enum(msp430_hwmult_types) Init(AUTO) -+Specify the type of hardware multiply to support -+ -+Enum -+Name(msp430_hwmult_types) Type(enum msp430_hwmult_types) -+ -+EnumValue -+Enum(msp430_hwmult_types) String(none) Value(NONE) -+ -+EnumValue -+Enum(msp430_hwmult_types) String(auto) Value(AUTO) -+ -+EnumValue -+Enum(msp430_hwmult_types) String(16bit) Value(SMALL) -+ -+EnumValue -+Enum(msp430_hwmult_types) String(32bit) Value(LARGE) -+ -+EnumValue -+Enum(msp430_hwmult_types) String(f5series) Value(F5SERIES) -Index: gcc/config/msp430/msp430.h -=================================================================== ---- a/src/gcc/config/msp430/msp430.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/msp430/msp430.h (.../branches/gcc-4_9-branch) -@@ -55,8 +55,8 @@ - "%{mcpu=*:-mcpu=%*}%{!mcpu=*:%{mmcu=*:-mmcu=%*}} " /* Pass the CPU type on to the assembler. */ \ - "%{mrelax=-mQ} " /* Pass the relax option on to the assembler. */ \ - "%{mlarge:-ml} " /* Tell the assembler if we are building for the LARGE pointer model. */ \ -- "%{!msim:-md} %{msim:%{mlarge:-md}}" /* Copy data from ROM to RAM if necessary. */ \ -- "%{ffunction-sections:-gdwarf-sections}" /* If function sections are being created then create DWARF line number sections as well. */ -+ "%{!msim:-md} %{msim:%{mlarge:-md}} " /* Copy data from ROM to RAM if necessary. */ \ -+ "%{ffunction-sections:-gdwarf-sections} " /* If function sections are being created then create DWARF line number sections as well. */ - - /* Enable linker section garbage collection by default, unless we - are creating a relocatable binary (gc does not work) or debugging -Index: gcc/config/v850/rtems.h -=================================================================== ---- a/src/gcc/config/v850/rtems.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/v850/rtems.h (.../branches/gcc-4_9-branch) -@@ -13,8 +13,13 @@ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - -- You should have received a copy of the GNU General Public License -- along with GCC; see the file COPYING3. If not see -+ Under Section 7 of GPL version 3, you are granted additional -+ permissions described in the GCC Runtime Library Exception, version -+ 3.1, as published by the Free Software Foundation. -+ -+ You should have received a copy of the GNU General Public License and -+ a copy of the GCC Runtime Library Exception along with this program; -+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see - <http://www.gnu.org/licenses/>. */ - - /* Specify predefined symbols in preprocessor. */ -Index: gcc/config/v850/v850.h -=================================================================== ---- a/src/gcc/config/v850/v850.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/v850/v850.h (.../branches/gcc-4_9-branch) -@@ -14,8 +14,13 @@ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - -- You should have received a copy of the GNU General Public License -- along with GCC; see the file COPYING3. If not see -+ Under Section 7 of GPL version 3, you are granted additional -+ permissions described in the GCC Runtime Library Exception, version -+ 3.1, as published by the Free Software Foundation. -+ -+ You should have received a copy of the GNU General Public License and -+ a copy of the GCC Runtime Library Exception along with this program; -+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see - <http://www.gnu.org/licenses/>. */ - - #ifndef GCC_V850_H -Index: gcc/config/v850/v850-opts.h -=================================================================== ---- a/src/gcc/config/v850/v850-opts.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/config/v850/v850-opts.h (.../branches/gcc-4_9-branch) -@@ -13,8 +13,13 @@ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - -- You should have received a copy of the GNU General Public License -- along with GCC; see the file COPYING3. If not see -+ Under Section 7 of GPL version 3, you are granted additional -+ permissions described in the GCC Runtime Library Exception, version -+ 3.1, as published by the Free Software Foundation. -+ -+ You should have received a copy of the GNU General Public License and -+ a copy of the GCC Runtime Library Exception along with this program; -+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see - <http://www.gnu.org/licenses/>. */ - - #ifndef V850_OPTS_H -Index: gcc/tree-vect-slp.c -=================================================================== ---- a/src/gcc/tree-vect-slp.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/tree-vect-slp.c (.../branches/gcc-4_9-branch) -@@ -849,9 +849,10 @@ - unsigned int *max_nunits, - vec<slp_tree> *loads, - unsigned int vectorization_factor, -- bool *matches, unsigned *npermutes) -+ bool *matches, unsigned *npermutes, unsigned *tree_size, -+ unsigned max_tree_size) - { -- unsigned nops, i, this_npermutes = 0; -+ unsigned nops, i, this_npermutes = 0, this_tree_size = 0; - gimple stmt; - - if (!matches) -@@ -911,6 +912,12 @@ - if (oprnd_info->first_dt != vect_internal_def) - continue; - -+ if (++this_tree_size > max_tree_size) -+ { -+ vect_free_oprnd_info (oprnds_info); -+ return false; -+ } -+ - child = vect_create_new_slp_node (oprnd_info->def_stmts); - if (!child) - { -@@ -921,7 +928,8 @@ - bool *matches = XALLOCAVEC (bool, group_size); - if (vect_build_slp_tree (loop_vinfo, bb_vinfo, &child, - group_size, max_nunits, loads, -- vectorization_factor, matches, npermutes)) -+ vectorization_factor, matches, -+ npermutes, &this_tree_size, max_tree_size)) - { - oprnd_info->def_stmts = vNULL; - SLP_TREE_CHILDREN (*node).quick_push (child); -@@ -961,7 +969,8 @@ - if (vect_build_slp_tree (loop_vinfo, bb_vinfo, &child, - group_size, max_nunits, loads, - vectorization_factor, -- matches, npermutes)) -+ matches, npermutes, &this_tree_size, -+ max_tree_size)) - { - oprnd_info->def_stmts = vNULL; - SLP_TREE_CHILDREN (*node).quick_push (child); -@@ -977,6 +986,9 @@ - return false; - } - -+ if (tree_size) -+ *tree_size += this_tree_size; -+ - vect_free_oprnd_info (oprnds_info); - return true; - } -@@ -1436,7 +1448,7 @@ - - static bool - vect_analyze_slp_instance (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo, -- gimple stmt) -+ gimple stmt, unsigned max_tree_size) - { - slp_instance new_instance; - slp_tree node; -@@ -1536,7 +1548,8 @@ - /* Build the tree for the SLP instance. */ - if (vect_build_slp_tree (loop_vinfo, bb_vinfo, &node, group_size, - &max_nunits, &loads, -- vectorization_factor, NULL, NULL)) -+ vectorization_factor, NULL, NULL, NULL, -+ max_tree_size)) - { - /* Calculate the unrolling factor based on the smallest type. */ - if (max_nunits > nunits) -@@ -1641,7 +1654,8 @@ - trees of packed scalar stmts if SLP is possible. */ - - bool --vect_analyze_slp (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo) -+vect_analyze_slp (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo, -+ unsigned max_tree_size) - { - unsigned int i; - vec<gimple> grouped_stores; -@@ -1664,7 +1678,8 @@ - - /* Find SLP sequences starting from groups of grouped stores. */ - FOR_EACH_VEC_ELT (grouped_stores, i, first_element) -- if (vect_analyze_slp_instance (loop_vinfo, bb_vinfo, first_element)) -+ if (vect_analyze_slp_instance (loop_vinfo, bb_vinfo, first_element, -+ max_tree_size)) - ok = true; - - if (bb_vinfo && !ok) -@@ -1681,7 +1696,8 @@ - { - /* Find SLP sequences starting from reduction chains. */ - FOR_EACH_VEC_ELT (reduc_chains, i, first_element) -- if (vect_analyze_slp_instance (loop_vinfo, bb_vinfo, first_element)) -+ if (vect_analyze_slp_instance (loop_vinfo, bb_vinfo, first_element, -+ max_tree_size)) - ok = true; - else - return false; -@@ -1693,7 +1709,8 @@ - - /* Find SLP sequences starting from groups of reductions. */ - if (loop_vinfo && LOOP_VINFO_REDUCTIONS (loop_vinfo).length () > 1 -- && vect_analyze_slp_instance (loop_vinfo, bb_vinfo, reductions[0])) -+ && vect_analyze_slp_instance (loop_vinfo, bb_vinfo, reductions[0], -+ max_tree_size)) - ok = true; - - return true; -@@ -2071,12 +2088,13 @@ - slp_instance instance; - int i; - int min_vf = 2; -+ unsigned n_stmts = 0; - - bb_vinfo = new_bb_vec_info (bb); - if (!bb_vinfo) - return NULL; - -- if (!vect_analyze_data_refs (NULL, bb_vinfo, &min_vf)) -+ if (!vect_analyze_data_refs (NULL, bb_vinfo, &min_vf, &n_stmts)) - { - if (dump_enabled_p ()) - dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, -@@ -2124,7 +2142,7 @@ - - /* Check the SLP opportunities in the basic block, analyze and build SLP - trees. */ -- if (!vect_analyze_slp (NULL, bb_vinfo)) -+ if (!vect_analyze_slp (NULL, bb_vinfo, n_stmts)) - { - if (dump_enabled_p ()) - dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, -Index: gcc/varpool.c -=================================================================== ---- a/src/gcc/varpool.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/varpool.c (.../branches/gcc-4_9-branch) -@@ -166,7 +166,9 @@ - /* Because we remove references from external functions before final compilation, - we may end up removing useful constructors. - FIXME: We probably want to trace boundaries better. */ -- if ((init = ctor_for_folding (node->decl)) == error_mark_node) -+ if (cgraph_state == CGRAPH_LTO_STREAMING) -+ ; -+ else if ((init = ctor_for_folding (node->decl)) == error_mark_node) - varpool_remove_initializer (node); - else - DECL_INITIAL (node->decl) = init; -@@ -302,7 +304,16 @@ - if (DECL_VIRTUAL_P (real_decl)) - { - gcc_checking_assert (TREE_READONLY (real_decl)); -- return DECL_INITIAL (real_decl); -+ if (DECL_INITIAL (real_decl)) -+ return DECL_INITIAL (real_decl); -+ else -+ { -+ /* The C++ front end creates VAR_DECLs for vtables of typeinfo -+ classes not defined in the current TU so that it can refer -+ to them from typeinfo objects. Avoid returning NULL_TREE. */ -+ gcc_checking_assert (!COMPLETE_TYPE_P (DECL_CONTEXT (real_decl))); -+ return error_mark_node; -+ } - } - - /* If there is no constructor, we have nothing to do. */ -Index: gcc/tree-ssa-threadedge.c -=================================================================== ---- a/src/gcc/tree-ssa-threadedge.c (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/tree-ssa-threadedge.c (.../branches/gcc-4_9-branch) -@@ -199,9 +199,7 @@ - traversing back edges less painful. */ - - static bool --record_temporary_equivalences_from_phis (edge e, vec<tree> *stack, -- bool backedge_seen, -- bitmap src_map, bitmap dst_map) -+record_temporary_equivalences_from_phis (edge e, vec<tree> *stack) - { - gimple_stmt_iterator gsi; - -@@ -229,14 +227,6 @@ - stmt_count++; - - record_temporary_equivalence (dst, src, stack); -- -- /* If we have crossed a backedge, then start recording equivalences -- we might need to invalidate. */ -- if (backedge_seen && TREE_CODE (src) == SSA_NAME) -- { -- bitmap_set_bit (src_map, SSA_NAME_VERSION (src)); -- bitmap_set_bit (dst_map, SSA_NAME_VERSION (dst)); -- } - } - return true; - } -@@ -294,29 +284,15 @@ - /* A new value has been assigned to LHS. If necessary, invalidate any - equivalences that are no longer valid. */ - static void --invalidate_equivalences (tree lhs, vec<tree> *stack, -- bitmap src_map, bitmap dst_map) -+invalidate_equivalences (tree lhs, vec<tree> *stack) - { -- /* SRC_MAP contains the source SSA_NAMEs for equivalences created by PHI -- nodes. If an entry in SRC_MAP changes, there's some destination that -- has been recorded as equivalent to the source and that equivalency -- needs to be eliminated. */ -- if (bitmap_bit_p (src_map, SSA_NAME_VERSION (lhs))) -- { -- unsigned int i; -- bitmap_iterator bi; - -- /* We know that the LHS of STMT was used as the RHS in an equivalency -- created by a PHI. All the LHS of such PHIs were recorded into DST_MAP. -- So we can iterate over them to see if any have the LHS of STMT as -- an equivalence, and if so, remove the equivalence as it is no longer -- valid. */ -- EXECUTE_IF_SET_IN_BITMAP (dst_map, 0, i, bi) -- { -- if (SSA_NAME_VALUE (ssa_name (i)) == lhs) -- record_temporary_equivalence (ssa_name (i), NULL_TREE, stack); -- } -- } -+ for (unsigned int i = 1; i < num_ssa_names; i++) -+ if (ssa_name (i) && SSA_NAME_VALUE (ssa_name (i)) == lhs) -+ record_temporary_equivalence (ssa_name (i), NULL_TREE, stack); -+ -+ if (SSA_NAME_VALUE (lhs)) -+ record_temporary_equivalence (lhs, NULL_TREE, stack); - } - - /* Try to simplify each statement in E->dest, ultimately leading to -@@ -341,9 +317,7 @@ - vec<tree> *stack, - tree (*simplify) (gimple, - gimple), -- bool backedge_seen, -- bitmap src_map, -- bitmap dst_map) -+ bool backedge_seen) - { - gimple stmt = NULL; - gimple_stmt_iterator gsi; -@@ -387,8 +361,23 @@ - && (gimple_code (stmt) != GIMPLE_CALL - || gimple_call_lhs (stmt) == NULL_TREE - || TREE_CODE (gimple_call_lhs (stmt)) != SSA_NAME)) -- continue; -+ { -+ /* STMT might still have DEFS and we need to invalidate any known -+ equivalences for them. - -+ Consider if STMT is a GIMPLE_ASM with one or more outputs that -+ feeds a conditional inside a loop. We might derive an equivalence -+ due to the conditional. */ -+ tree op; -+ ssa_op_iter iter; -+ -+ if (backedge_seen) -+ FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_DEF) -+ invalidate_equivalences (op, stack); -+ -+ continue; -+ } -+ - /* The result of __builtin_object_size depends on all the arguments - of a phi node. Temporarily using only one edge produces invalid - results. For example -@@ -424,8 +413,7 @@ - if (backedge_seen) - { - tree lhs = gimple_get_lhs (stmt); -- record_temporary_equivalence (lhs, NULL_TREE, stack); -- invalidate_equivalences (lhs, stack, src_map, dst_map); -+ invalidate_equivalences (lhs, stack); - } - continue; - } -@@ -503,11 +491,7 @@ - || is_gimple_min_invariant (cached_lhs))) - record_temporary_equivalence (gimple_get_lhs (stmt), cached_lhs, stack); - else if (backedge_seen) -- record_temporary_equivalence (gimple_get_lhs (stmt), NULL_TREE, stack); -- -- if (backedge_seen) -- invalidate_equivalences (gimple_get_lhs (stmt), stack, -- src_map, dst_map); -+ invalidate_equivalences (gimple_get_lhs (stmt), stack); - } - return stmt; - } -@@ -939,9 +923,14 @@ - SIMPLIFY is a pass-specific function used to simplify statements. - - Our caller is responsible for restoring the state of the expression -- and const_and_copies stacks. */ -+ and const_and_copies stacks. - --static bool -+ Positive return value is success. Zero return value is failure, but -+ the block can still be duplicated as a joiner in a jump thread path, -+ negative indicates the block should not be duplicated and thus is not -+ suitable for a joiner in a jump threading path. */ -+ -+static int - thread_through_normal_block (edge e, - gimple dummy_cond, - bool handle_dominating_asserts, -@@ -949,9 +938,7 @@ - tree (*simplify) (gimple, gimple), - vec<jump_thread_edge *> *path, - bitmap visited, -- bool *backedge_seen_p, -- bitmap src_map, -- bitmap dst_map) -+ bool *backedge_seen_p) - { - /* If we have traversed a backedge, then we do not want to look - at certain expressions in the table that can not be relied upon. -@@ -960,19 +947,28 @@ - if (*backedge_seen_p) - simplify = dummy_simplify; - -- /* PHIs create temporary equivalences. */ -- if (!record_temporary_equivalences_from_phis (e, stack, *backedge_seen_p, -- src_map, dst_map)) -- return false; -+ /* PHIs create temporary equivalences. -+ Note that if we found a PHI that made the block non-threadable, then -+ we need to bubble that up to our caller in the same manner we do -+ when we prematurely stop processing statements below. */ -+ if (!record_temporary_equivalences_from_phis (e, stack)) -+ return -1; - - /* Now walk each statement recording any context sensitive - temporary equivalences we can detect. */ - gimple stmt - = record_temporary_equivalences_from_stmts_at_dest (e, stack, simplify, -- *backedge_seen_p, -- src_map, dst_map); -+ *backedge_seen_p); -+ -+ /* If we didn't look at all the statements, the most likely reason is -+ there were too many and thus duplicating this block is not profitable. -+ -+ Also note if we do not look at all the statements, then we may not -+ have invalidated equivalences that are no longer valid if we threaded -+ around a loop. Thus we must signal to our caller that this block -+ is not suitable for use as a joiner in a threading path. */ - if (!stmt) -- return false; -+ return -1; - - /* If we stopped at a COND_EXPR or SWITCH_EXPR, see if we know which arm - will be taken. */ -@@ -996,7 +992,7 @@ - if (dest == NULL - || dest == e->dest - || bitmap_bit_p (visited, dest->index)) -- return false; -+ return 0; - - /* Only push the EDGE_START_JUMP_THREAD marker if this is - first edge on the path. */ -@@ -1030,10 +1026,10 @@ - visited, - path, - backedge_seen_p); -- return true; -+ return 1; - } - } -- return false; -+ return 0; - } - - /* We are exiting E->src, see if E->dest ends with a conditional -@@ -1071,8 +1067,6 @@ - tree (*simplify) (gimple, gimple)) - { - bitmap visited = BITMAP_ALLOC (NULL); -- bitmap src_map = BITMAP_ALLOC (NULL); -- bitmap dst_map = BITMAP_ALLOC (NULL); - bool backedge_seen; - - stmt_count = 0; -@@ -1085,25 +1079,40 @@ - if (backedge_seen) - simplify = dummy_simplify; - -- if (thread_through_normal_block (e, dummy_cond, handle_dominating_asserts, -- stack, simplify, path, visited, -- &backedge_seen, src_map, dst_map)) -+ int threaded = thread_through_normal_block (e, dummy_cond, -+ handle_dominating_asserts, -+ stack, simplify, path, -+ visited, &backedge_seen); -+ if (threaded > 0) - { - propagate_threaded_block_debug_into (path->last ()->e->dest, - e->dest); - remove_temporary_equivalences (stack); - BITMAP_FREE (visited); -- BITMAP_FREE (src_map); -- BITMAP_FREE (dst_map); - register_jump_thread (path); - return; - } - else - { -- /* There should be no edges on the path, so no need to walk through -- the vector entries. */ -+ /* Negative and zero return values indicate no threading was possible, -+ thus there should be no edges on the thread path and no need to walk -+ through the vector entries. */ - gcc_assert (path->length () == 0); - path->release (); -+ -+ /* A negative status indicates the target block was deemed too big to -+ duplicate. Just quit now rather than trying to use the block as -+ a joiner in a jump threading path. -+ -+ This prevents unnecessary code growth, but more importantly if we -+ do not look at all the statements in the block, then we may have -+ missed some invalidations if we had traversed a backedge! */ -+ if (threaded < 0) -+ { -+ BITMAP_FREE (visited); -+ remove_temporary_equivalences (stack); -+ return; -+ } - } - - /* We were unable to determine what out edge from E->dest is taken. However, -@@ -1129,18 +1138,9 @@ - { - remove_temporary_equivalences (stack); - BITMAP_FREE (visited); -- BITMAP_FREE (src_map); -- BITMAP_FREE (dst_map); - return; - } - -- /* We need to restore the state of the maps to this point each loop -- iteration. */ -- bitmap src_map_copy = BITMAP_ALLOC (NULL); -- bitmap dst_map_copy = BITMAP_ALLOC (NULL); -- bitmap_copy (src_map_copy, src_map); -- bitmap_copy (dst_map_copy, dst_map); -- - /* Look at each successor of E->dest to see if we can thread through it. */ - FOR_EACH_EDGE (taken_edge, ei, e->dest->succs) - { -@@ -1147,8 +1147,6 @@ - /* Push a fresh marker so we can unwind the equivalences created - for each of E->dest's successors. */ - stack->safe_push (NULL_TREE); -- bitmap_copy (src_map, src_map_copy); -- bitmap_copy (dst_map, dst_map_copy); - - /* Avoid threading to any block we have already visited. */ - bitmap_clear (visited); -@@ -1184,8 +1182,7 @@ - found = thread_through_normal_block (path->last ()->e, dummy_cond, - handle_dominating_asserts, - stack, simplify, path, visited, -- &backedge_seen, -- src_map, dst_map); -+ &backedge_seen) > 0; - - /* If we were able to thread through a successor of E->dest, then - record the jump threading opportunity. */ -@@ -1204,10 +1201,6 @@ - remove_temporary_equivalences (stack); - } - BITMAP_FREE (visited); -- BITMAP_FREE (src_map); -- BITMAP_FREE (dst_map); -- BITMAP_FREE (src_map_copy); -- BITMAP_FREE (dst_map_copy); - } - - remove_temporary_equivalences (stack); -Index: gcc/langhooks-def.h -=================================================================== ---- a/src/gcc/langhooks-def.h (.../tags/gcc_4_9_0_release) -+++ b/src/gcc/langhooks-def.h (.../branches/gcc-4_9-branch) -@@ -74,6 +74,7 @@ - extern int lhd_gimplify_expr (tree *, gimple_seq *, gimple_seq *); - extern enum omp_clause_default_kind lhd_omp_predetermined_sharing (tree); - extern tree lhd_omp_assignment (tree, tree, tree); -+extern void lhd_omp_finish_clause (tree, gimple_seq *); - struct gimplify_omp_ctx; - extern void lhd_omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *, - tree); -@@ -211,8 +212,9 @@ - #define LANG_HOOKS_OMP_CLAUSE_DEFAULT_CTOR hook_tree_tree_tree_tree_null - #define LANG_HOOKS_OMP_CLAUSE_COPY_CTOR lhd_omp_assignment - #define LANG_HOOKS_OMP_CLAUSE_ASSIGN_OP lhd_omp_assignment -+#define LANG_HOOKS_OMP_CLAUSE_LINEAR_CTOR NULL - #define LANG_HOOKS_OMP_CLAUSE_DTOR hook_tree_tree_tree_null --#define LANG_HOOKS_OMP_FINISH_CLAUSE hook_void_tree -+#define LANG_HOOKS_OMP_FINISH_CLAUSE lhd_omp_finish_clause - - #define LANG_HOOKS_DECLS { \ - LANG_HOOKS_GLOBAL_BINDINGS_P, \ -@@ -234,6 +236,7 @@ - LANG_HOOKS_OMP_CLAUSE_DEFAULT_CTOR, \ - LANG_HOOKS_OMP_CLAUSE_COPY_CTOR, \ - LANG_HOOKS_OMP_CLAUSE_ASSIGN_OP, \ -+ LANG_HOOKS_OMP_CLAUSE_LINEAR_CTOR, \ - LANG_HOOKS_OMP_CLAUSE_DTOR, \ - LANG_HOOKS_OMP_FINISH_CLAUSE \ - } -Index: libgo/configure -=================================================================== ---- a/src/libgo/configure (.../tags/gcc_4_9_0_release) -+++ b/src/libgo/configure (.../branches/gcc-4_9-branch) -@@ -14627,7 +14627,7 @@ - ;; - esac - --for ac_header in sys/file.h sys/mman.h syscall.h sys/epoll.h sys/inotify.h sys/ptrace.h sys/syscall.h sys/user.h sys/utsname.h sys/select.h sys/socket.h net/if.h net/if_arp.h net/route.h netpacket/packet.h sys/prctl.h sys/mount.h sys/vfs.h sys/statfs.h sys/timex.h sys/sysinfo.h utime.h linux/ether.h linux/fs.h linux/reboot.h netinet/icmp6.h netinet/in_syst.h netinet/ip.h netinet/ip_mroute.h netinet/if_ether.h -+for ac_header in sched.h sys/file.h sys/mman.h syscall.h sys/epoll.h sys/inotify.h sys/ptrace.h sys/syscall.h sys/user.h sys/utsname.h sys/select.h sys/socket.h net/if.h net/if_arp.h net/route.h netpacket/packet.h sys/prctl.h sys/mount.h sys/vfs.h sys/statfs.h sys/timex.h sys/sysinfo.h utime.h linux/ether.h linux/fs.h linux/reboot.h netinet/icmp6.h netinet/in_syst.h netinet/ip.h netinet/ip_mroute.h netinet/if_ether.h - do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` - ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -Index: libgo/runtime/proc.c -=================================================================== ---- a/src/libgo/runtime/proc.c (.../tags/gcc_4_9_0_release) -+++ b/src/libgo/runtime/proc.c (.../branches/gcc-4_9-branch) -@@ -1117,7 +1117,8 @@ - if(runtime_needextram) { - // Can happen if C/C++ code calls Go from a global ctor. - // Can not throw, because scheduler is not initialized yet. -- runtime_write(2, "fatal error: cgo callback before cgo call\n", -+ int rv __attribute__((unused)); -+ rv = runtime_write(2, "fatal error: cgo callback before cgo call\n", - sizeof("fatal error: cgo callback before cgo call\n")-1); - runtime_exit(1); - } -Index: libgo/runtime/mheap.c -=================================================================== ---- a/src/libgo/runtime/mheap.c (.../tags/gcc_4_9_0_release) -+++ b/src/libgo/runtime/mheap.c (.../branches/gcc-4_9-branch) -@@ -387,7 +387,7 @@ - static uintptr - scavengelist(MSpan *list, uint64 now, uint64 limit) - { -- uintptr released, sumreleased; -+ uintptr released, sumreleased, start, end, pagesize; - MSpan *s; - - if(runtime_MSpanList_IsEmpty(list)) -@@ -400,7 +400,17 @@ - mstats.heap_released += released; - sumreleased += released; - s->npreleased = s->npages; -- runtime_SysUnused((void*)(s->start << PageShift), s->npages << PageShift); -+ -+ start = s->start << PageShift; -+ end = start + (s->npages << PageShift); -+ -+ // Round start up and end down to ensure we -+ // are acting on entire pages. -+ pagesize = getpagesize(); -+ start = ROUND(start, pagesize); -+ end &= ~(pagesize - 1); -+ if(end > start) -+ runtime_SysUnused((void*)start, end - start); - } - } - return sumreleased; -Index: libgo/mksysinfo.sh -=================================================================== ---- a/src/libgo/mksysinfo.sh (.../tags/gcc_4_9_0_release) -+++ b/src/libgo/mksysinfo.sh (.../branches/gcc-4_9-branch) -@@ -163,6 +163,9 @@ - #if defined(HAVE_NETINET_ICMP6_H) - #include <netinet/icmp6.h> - #endif -+#if defined(HAVE_SCHED_H) -+#include <sched.h> -+#endif - - /* Constants that may only be defined as expressions on some systems, - expressions too complex for -fdump-go-spec to handle. These are -@@ -177,6 +180,18 @@ - #ifdef TIOCSCTTY - TIOCSCTTY_val = TIOCSCTTY, - #endif -+#ifdef TIOCGPTN -+ TIOCGPTN_val = TIOCGPTN, -+#endif -+#ifdef TIOCSPTLCK -+ TIOCSPTLCK_val = TIOCSPTLCK, -+#endif -+#ifdef TIOCGDEV -+ TIOCGDEV_val = TIOCGDEV, -+#endif -+#ifdef TIOCSIG -+ TIOCSIG_val = TIOCSIG, -+#endif - }; - EOF - -@@ -775,6 +790,26 @@ - echo 'const TIOCSCTTY = _TIOCSCTTY_val' >> ${OUT} - fi - fi -+if ! grep '^const TIOCGPTN' ${OUT} >/dev/null 2>&1; then -+ if grep '^const _TIOCGPTN_val' ${OUT} >/dev/null 2>&1; then -+ echo 'const TIOCGPTN = _TIOCGPTN_val' >> ${OUT} -+ fi -+fi -+if ! grep '^const TIOCSPTLCK' ${OUT} >/dev/null 2>&1; then -+ if grep '^const _TIOCSPTLCK_val' ${OUT} >/dev/null 2>&1; then -+ echo 'const TIOCSPTLCK = _TIOCSPTLCK_val' >> ${OUT} -+ fi -+fi -+if ! grep '^const TIOCGDEV' ${OUT} >/dev/null 2>&1; then -+ if grep '^const _TIOCGDEV_val' ${OUT} >/dev/null 2>&1; then -+ echo 'const TIOCGDEV = _TIOCGDEV_val' >> ${OUT} -+ fi -+fi -+if ! grep '^const TIOCSIG' ${OUT} >/dev/null 2>&1; then -+ if grep '^const _TIOCSIG_val' ${OUT} >/dev/null 2>&1; then -+ echo 'const TIOCSIG = _TIOCSIG_val' >> ${OUT} -+ fi -+fi - - # The ioctl flags for terminal control - grep '^const _TC[GS]ET' gen-sysinfo.go | \ -@@ -1130,6 +1165,10 @@ - -e 's/\[0\]byte/[0]int8/' \ - >> ${OUT} - -+# The GNU/Linux CLONE flags. -+grep '^const _CLONE_' gen-sysinfo.go | \ -+ sed -e 's/^\(const \)_\(CLONE_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT} -+ - # The Solaris 11 Update 1 _zone_net_addr_t struct. - grep '^type _zone_net_addr_t ' gen-sysinfo.go | \ - sed -e 's/_in6_addr/[16]byte/' \ -Index: libgo/config.h.in -=================================================================== ---- a/src/libgo/config.h.in (.../tags/gcc_4_9_0_release) -+++ b/src/libgo/config.h.in (.../branches/gcc-4_9-branch) -@@ -192,6 +192,9 @@ - /* Define to 1 if you have the `renameat' function. */ - #undef HAVE_RENAMEAT - -+/* Define to 1 if you have the <sched.h> header file. */ -+#undef HAVE_SCHED_H -+ - /* Define to 1 if you have the `sem_timedwait' function. */ - #undef HAVE_SEM_TIMEDWAIT - -Index: libgo/configure.ac -=================================================================== ---- a/src/libgo/configure.ac (.../tags/gcc_4_9_0_release) -+++ b/src/libgo/configure.ac (.../branches/gcc-4_9-branch) -@@ -480,7 +480,7 @@ - ;; - esac - --AC_CHECK_HEADERS(sys/file.h sys/mman.h syscall.h sys/epoll.h sys/inotify.h sys/ptrace.h sys/syscall.h sys/user.h sys/utsname.h sys/select.h sys/socket.h net/if.h net/if_arp.h net/route.h netpacket/packet.h sys/prctl.h sys/mount.h sys/vfs.h sys/statfs.h sys/timex.h sys/sysinfo.h utime.h linux/ether.h linux/fs.h linux/reboot.h netinet/icmp6.h netinet/in_syst.h netinet/ip.h netinet/ip_mroute.h netinet/if_ether.h) -+AC_CHECK_HEADERS(sched.h sys/file.h sys/mman.h syscall.h sys/epoll.h sys/inotify.h sys/ptrace.h sys/syscall.h sys/user.h sys/utsname.h sys/select.h sys/socket.h net/if.h net/if_arp.h net/route.h netpacket/packet.h sys/prctl.h sys/mount.h sys/vfs.h sys/statfs.h sys/timex.h sys/sysinfo.h utime.h linux/ether.h linux/fs.h linux/reboot.h netinet/icmp6.h netinet/in_syst.h netinet/ip.h netinet/ip_mroute.h netinet/if_ether.h) - - AC_CHECK_HEADERS([linux/filter.h linux/if_addr.h linux/if_ether.h linux/if_tun.h linux/netlink.h linux/rtnetlink.h], [], [], - [#ifdef HAVE_SYS_SOCKET_H -Index: libgfortran/intrinsics/ctime.c -=================================================================== ---- a/src/libgfortran/intrinsics/ctime.c (.../tags/gcc_4_9_0_release) -+++ b/src/libgfortran/intrinsics/ctime.c (.../branches/gcc-4_9-branch) -@@ -31,31 +31,53 @@ - #include <string.h> - - --/* strftime-like function that fills a C string with %c format which -- is identical to ctime in the default locale. As ctime and ctime_r -- are poorly specified and their usage not recommended, the -- implementation instead uses strftime. */ -+/* Maximum space a ctime-like string might need. A "normal" ctime -+ string is 26 bytes, and in our case 24 bytes as we don't include -+ the trailing newline and null. However, the longest possible year -+ number is -2,147,481,748 (1900 - 2,147,483,648, since tm_year is a -+ 32-bit signed integer) so an extra 7 bytes are needed. */ -+#define CTIME_BUFSZ 31 - --static size_t --strctime (char *s, size_t max, const time_t *timep) -+ -+/* Thread-safe ctime-like function that fills a Fortran -+ string. ctime_r is a portability headache and marked as obsolescent -+ in POSIX 2008, which recommends strftime in its place. However, -+ strftime(..., "%c",...) doesn't produce ctime-like output on -+ MinGW, so do it manually with snprintf. */ -+ -+static int -+gf_ctime (char *s, size_t max, const time_t timev) - { - struct tm ltm; - int failed; -+ char buf[CTIME_BUFSZ + 1]; - /* Some targets provide a localtime_r based on a draft of the POSIX - standard where the return type is int rather than the - standardized struct tm*. */ -- __builtin_choose_expr (__builtin_classify_type (localtime_r (timep, <m)) -+ __builtin_choose_expr (__builtin_classify_type (localtime_r (&timev, <m)) - == 5, -- failed = localtime_r (timep, <m) == NULL, -- failed = localtime_r (timep, <m) != 0); -+ failed = localtime_r (&timev, <m) == NULL, -+ failed = localtime_r (&timev, <m) != 0); - if (failed) -- return 0; -- return strftime (s, max, "%c", <m); -+ goto blank; -+ int n = snprintf (buf, sizeof (buf), -+ "%3.3s %3.3s%3d %.2d:%.2d:%.2d %d", -+ "SunMonTueWedThuFriSat" + ltm.tm_wday * 3, -+ "JanFebMarAprMayJunJulAugSepOctNovDec" + ltm.tm_mon * 3, -+ ltm.tm_mday, ltm.tm_hour, ltm.tm_min, ltm.tm_sec, -+ 1900 + ltm.tm_year); -+ if (n < 0) -+ goto blank; -+ if ((size_t) n <= max) -+ { -+ cf_strcpy (s, max, buf); -+ return n; -+ } -+ blank: -+ memset (s, ' ', max); -+ return 0; - } - --/* In the default locale, the date and time representation fits in 26 -- bytes. However, other locales might need more space. */ --#define CSZ 100 - - extern void fdate (char **, gfc_charlen_type *); - export_proto(fdate); -@@ -64,8 +86,8 @@ - fdate (char ** date, gfc_charlen_type * date_len) - { - time_t now = time(NULL); -- *date = xmalloc (CSZ); -- *date_len = strctime (*date, CSZ, &now); -+ *date = xmalloc (CTIME_BUFSZ); -+ *date_len = gf_ctime (*date, CTIME_BUFSZ, now); - } - - -@@ -76,10 +98,7 @@ - fdate_sub (char * date, gfc_charlen_type date_len) - { - time_t now = time(NULL); -- char *s = xmalloc (date_len + 1); -- size_t n = strctime (s, date_len + 1, &now); -- fstrcpy (date, date_len, s, n); -- free (s); -+ gf_ctime (date, date_len, now); - } - - -@@ -91,8 +110,8 @@ - PREFIX(ctime) (char ** date, gfc_charlen_type * date_len, GFC_INTEGER_8 t) - { - time_t now = t; -- *date = xmalloc (CSZ); -- *date_len = strctime (*date, CSZ, &now); -+ *date = xmalloc (CTIME_BUFSZ); -+ *date_len = gf_ctime (*date, CTIME_BUFSZ, now); - } - - -@@ -103,8 +122,5 @@ - ctime_sub (GFC_INTEGER_8 * t, char * date, gfc_charlen_type date_len) - { - time_t now = *t; -- char *s = xmalloc (date_len + 1); -- size_t n = strctime (s, date_len + 1, &now); -- fstrcpy (date, date_len, s, n); -- free (s); -+ gf_ctime (date, date_len, now); - } -Index: libgfortran/ChangeLog -=================================================================== ---- a/src/libgfortran/ChangeLog (.../tags/gcc_4_9_0_release) -+++ b/src/libgfortran/ChangeLog (.../branches/gcc-4_9-branch) -@@ -1,3 +1,52 @@ -+2014-07-06 Jerry DeLisle <jvdelisle@gcc.gnu.org> -+ -+ Backport from trunk. -+ PR libgfortran/61640 -+ * io/list_read.c (next_char_internal): Adjust the read length to -+ a single wide character. (eat_spaces): Add missing paren. -+ * io/unix.c (mem_read4): Use the correct mem_alloc function for -+ wide character internal reads. -+ -+2014-06-27 Jerry DeLisle <jvdelisle@gcc.gnu.org> -+ -+ Backport from trunk. -+ PR libgfortran/61499 -+ * io/list_read.c (eat_spaces): Use a 'for' loop instead of -+ 'while' loop to skip the loop if there are no bytes left in the -+ string. Only seek if actual spaces can be skipped. -+ -+2014-06-07 Jerry DeLisle <jvdelisle@gcc.gnu> -+ -+ Backport from trunk. -+ PR libfortran/61173 -+ * io/list_read.c (eat_spaces): If the next character pointed to -+ is a space, don't seek, must be at the end. -+ -+2014-05-26 Janne Blomqvist <jb@gcc.gnu.org> -+ -+ Backport from mainline -+ PR libfortran/61310 -+ * intrinsics/ctime.c (strctime): Rename to gf_ctime, use snprintf -+ instead of strftime. -+ (fdate): Use gf_ctime. -+ (fdate_sub): Likewise. -+ (ctime): Likewise. -+ (ctime_sub): Likewise. -+ -+2014-05-16 Janne Blomqvist <jb@gcc.gnu.org> -+ -+ Backport from trunk: -+ PR libfortran/61187 -+ * io/unix.c (raw_close): Check if s->fd is -1. -+ (fd_to_stream): Check return value of fstat(), handle error. -+ -+2014-05-10 Jerry DeLisle <jvdelisle@gcc.gnu> -+ -+ Backport from Trunk. -+ PR libfortran/61049 -+ * io/list_read.c (list_formatted_read_scalar): Use eat_separator -+ and delete extraneous code. -+ - 2014-04-22 Release Manager - - * GCC 4.9.0 released. -Index: libgfortran/io/list_read.c -=================================================================== ---- a/src/libgfortran/io/list_read.c (.../tags/gcc_4_9_0_release) -+++ b/src/libgfortran/io/list_read.c (.../branches/gcc-4_9-branch) -@@ -200,7 +200,7 @@ - { - /* Check for kind=4 internal unit. */ - if (dtp->common.unit) -- length = sread (dtp->u.p.current_unit->s, &c, sizeof (gfc_char4_t)); -+ length = sread (dtp->u.p.current_unit->s, &c, 1); - else - { - char cc; -@@ -265,46 +265,39 @@ - int c; - - /* If internal character array IO, peak ahead and seek past spaces. -- This is an optimazation to eliminate numerous calls to -- next character unique to character arrays with large character -- lengths (PR38199). */ -- if (is_array_io (dtp)) -+ This is an optimization unique to character arrays with large -+ character lengths (PR38199). This code eliminates numerous calls -+ to next_character. */ -+ if (is_array_io (dtp) && (dtp->u.p.last_char == EOF - 1)) - { - gfc_offset offset = stell (dtp->u.p.current_unit->s); -- gfc_offset limit = dtp->u.p.current_unit->bytes_left; -+ gfc_offset i; - - if (dtp->common.unit) /* kind=4 */ - { -- gfc_char4_t cc; -- limit *= (sizeof (gfc_char4_t)); -- do -+ for (i = 0; i < dtp->u.p.current_unit->bytes_left; i++) - { -- cc = dtp->internal_unit[offset]; -- offset += (sizeof (gfc_char4_t)); -- dtp->u.p.current_unit->bytes_left--; -+ if (dtp->internal_unit[(offset + i) * sizeof (gfc_char4_t)] -+ != (gfc_char4_t)' ') -+ break; - } -- while (offset < limit && (cc == (gfc_char4_t)' ' -- || cc == (gfc_char4_t)'\t')); -- /* Back up, seek ahead, and fall through to complete the -- process so that END conditions are handled correctly. */ -- dtp->u.p.current_unit->bytes_left++; -- sseek (dtp->u.p.current_unit->s, -- offset-(sizeof (gfc_char4_t)), SEEK_SET); - } - else - { -- do -+ for (i = 0; i < dtp->u.p.current_unit->bytes_left; i++) - { -- c = dtp->internal_unit[offset++]; -- dtp->u.p.current_unit->bytes_left--; -+ if (dtp->internal_unit[offset + i] != ' ') -+ break; - } -- while (offset < limit && (c == ' ' || c == '\t')); -- /* Back up, seek ahead, and fall through to complete the -- process so that END conditions are handled correctly. */ -- dtp->u.p.current_unit->bytes_left++; -- sseek (dtp->u.p.current_unit->s, offset-1, SEEK_SET); - } -+ -+ if (i != 0) -+ { -+ sseek (dtp->u.p.current_unit->s, offset + i, SEEK_SET); -+ dtp->u.p.current_unit->bytes_left -= i; -+ } - } -+ - /* Now skip spaces, EOF and EOL are handled in next_char. */ - do - c = next_char (dtp); -@@ -1923,21 +1916,10 @@ - } - if (is_separator (c)) - { -- /* Found a null value. Do not use eat_separator here otherwise -- we will do an extra read from stdin. */ -+ /* Found a null value. */ - dtp->u.p.repeat_count = 0; -+ eat_separator (dtp); - -- /* Set comma_flag. */ -- if ((c == ';' -- && dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA) -- || -- (c == ',' -- && dtp->u.p.current_unit->decimal_status == DECIMAL_POINT)) -- { -- dtp->u.p.comma_flag = 1; -- goto cleanup; -- } -- - /* Set end-of-line flag. */ - if (c == '\n' || c == '\r') - { -@@ -1951,7 +1933,6 @@ - else - goto cleanup; - } -- - } - else - { -Index: libgfortran/io/unix.c -=================================================================== ---- a/src/libgfortran/io/unix.c (.../tags/gcc_4_9_0_release) -+++ b/src/libgfortran/io/unix.c (.../branches/gcc-4_9-branch) -@@ -412,7 +412,9 @@ - { - int retval; - -- if (s->fd != STDOUT_FILENO -+ if (s->fd == -1) -+ retval = -1; -+ else if (s->fd != STDOUT_FILENO - && s->fd != STDERR_FILENO - && s->fd != STDIN_FILENO) - retval = close (s->fd); -@@ -784,10 +786,10 @@ - void *p; - int nb = nbytes; - -- p = mem_alloc_r (s, &nb); -+ p = mem_alloc_r4 (s, &nb); - if (p) - { -- memcpy (buf, p, nb); -+ memcpy (buf, p, nb * 4); - return (ssize_t) nb; - } - else -@@ -1003,7 +1005,15 @@ - - /* Get the current length of the file. */ - -- fstat (fd, &statbuf); -+ if (fstat (fd, &statbuf) == -1) -+ { -+ s->st_dev = s->st_ino = -1; -+ s->file_length = 0; -+ if (errno == EBADF) -+ s->fd = -1; -+ raw_init (s); -+ return (stream *) s; -+ } - - s->st_dev = statbuf.st_dev; - s->st_ino = statbuf.st_ino; -Index: libcpp/ChangeLog -=================================================================== ---- a/src/libcpp/ChangeLog (.../tags/gcc_4_9_0_release) -+++ b/src/libcpp/ChangeLog (.../branches/gcc-4_9-branch) -@@ -1,3 +1,10 @@ -+2014-07-09 Edward Smith-Rowland <3dw4rd@verizon.net> -+ -+ PR c++/58155 - -Wliteral-suffix warns about tokens which are skipped -+ by preprocessor -+ * lex.c (lex_raw_string ()): Do not warn about invalid suffix -+ if skipping. (lex_string ()): Ditto. -+ - 2014-04-22 Release Manager - - * GCC 4.9.0 released. -Index: libcpp/lex.c -=================================================================== ---- a/src/libcpp/lex.c (.../tags/gcc_4_9_0_release) -+++ b/src/libcpp/lex.c (.../branches/gcc-4_9-branch) -@@ -1648,7 +1648,7 @@ - if (is_macro (pfile, cur)) - { - /* Raise a warning, but do not consume subsequent tokens. */ -- if (CPP_OPTION (pfile, warn_literal_suffix)) -+ if (CPP_OPTION (pfile, warn_literal_suffix) && !pfile->state.skipping) - cpp_warning_with_line (pfile, CPP_W_LITERAL_SUFFIX, - token->src_loc, 0, - "invalid suffix on literal; C++11 requires " -@@ -1777,7 +1777,7 @@ - if (is_macro (pfile, cur)) - { - /* Raise a warning, but do not consume subsequent tokens. */ -- if (CPP_OPTION (pfile, warn_literal_suffix)) -+ if (CPP_OPTION (pfile, warn_literal_suffix) && !pfile->state.skipping) - cpp_warning_with_line (pfile, CPP_W_LITERAL_SUFFIX, - token->src_loc, 0, - "invalid suffix on literal; C++11 requires " -Index: . -=================================================================== ---- a/src/. (.../tags/gcc_4_9_0_release) -+++ b/src/. (.../branches/gcc-4_9-branch) - -Property changes on: . -___________________________________________________________________ -Added: svn:mergeinfo - Merged /trunk:r210668,211733 diff --git a/debian/rules.d/binary-cxx.mk b/debian/rules.d/binary-cxx.mk index 8ce3e0a..8ebca2c 100644 --- a/debian/rules.d/binary-cxx.mk +++ b/debian/rules.d/binary-cxx.mk @@ -61,7 +61,8 @@ endif echo "TEST COMPARE BEGIN" ifeq ($(with_check),yes) # more than one libgo.sum, avoid it - cp -p $$(find $(builddir) -mindepth 3 -name '*.sum' ! -name libgo.sum) \ + cp -p $$(find $(builddir)/gcc -maxdepth 2 \( -name '*.sum' -o -name '*.log' \)) \ + $$(find $(buildlibdir)/*/testsuite -maxdepth 1 \( -name '*.sum' -o -name '*.log' \) ! -name 'libgo.*') \ $(d_cxx)/$(docdir)/$(p_xbase)/test-summaries/ ifeq ($(with_go),yes) cp -p $(buildlibdir)/libgo/libgo.sum \ diff --git a/debian/rules.patch b/debian/rules.patch index fb07604..99f4d8a 100644 --- a/debian/rules.patch +++ b/debian/rules.patch @@ -13,7 +13,6 @@ series_file ?= $(patchdir)/series # which patches should be applied? debian_patches = \ - svn-updates \ $(if $(with_linaro_branch),gcc-linaro) \ # svn-updates \ @@ -25,7 +24,6 @@ endif ifneq ($(GFDL_INVARIANT_FREE),yes) debian_patches += \ - svn-doc-updates \ rename-info-files \ # $(if $(with_linaro_branch),gcc-linaro-doc) \ |