diff options
author | mrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-10-20 23:47:35 +0000 |
---|---|---|
committer | mrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-10-20 23:47:35 +0000 |
commit | 6b40961666f073231ed8a76e6e33deeda063cde7 (patch) | |
tree | 8247eb4232e8be98b7f61bd68bab2fd1a9f06ca3 /gcc/testsuite | |
parent | e6b1b76450af5f98696ecedd4bd9a0ed18cdb2a6 (diff) | |
parent | fc1ce0cf396bf638746d546a557158d87f13849b (diff) | |
download | gcc-6b40961666f073231ed8a76e6e33deeda063cde7.tar.gz |
Merge in trunk.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/wide-int@203881 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/testsuite')
597 files changed, 21848 insertions, 3049 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2fc781a3e37..64d56a03446 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,714 @@ +2013-10-20 Richard Sandiford <rdsandiford@googlemail.com> + + * gcc.target/mips/mips-ps-5.c: Add alignment attributes. + * gcc.target/mips/mips-ps-7.c: Likewise. + +2013-10-20 Richard Sandiford <rdsandiford@googlemail.com> + + * gcc.target/mips/bswap-1.c, gcc.target/mips/bswap-2.c, + gcc.target/mips/bswap-3.c, gcc.target/mips/bswap-4.c, + gcc.target/mips/bswap-5.c, gcc.target/mips/bswap-6.c: New tests. + +2013-10-19 John David Anglin <danglin@gcc.gnu.org> + + * c-c++-common/opaque-vector.c: Skip long double test on hppa. + + PR testsuite/58645 + * gnat.dg/specs/linker_alias.ads: Skip on hppa*-*-hpux*. + +2013-10-19 Mike Stump <mikestump@comcast.net> + + * g++.dg/lto/lto.exp: Add support for C/C++ mix language testing. + + * gcc.dg/lto/pr54625-1_0.c: Move from here... + * g++.dg/lto/pr54625-1_0.c: ... to here. + * gcc.dg/lto/pr54625-1_1.C: Likewise. + * g++.dg/lto/pr54625-1_1.C: Likewise. + * gcc.dg/lto/pr54625-2_0.c: Likewise. + * g++.dg/lto/pr54625-2_0.c: Likewise. + * gcc.dg/lto/pr54625-2_1.C: Likewise. + * g++.dg/lto/pr54625-2_1.C: Likewise. + +2013-10-19 Oleg Endo <olegendo@gcc.gnu.org> + + * gcc.target/sh/pr54089-3.c: Fix test for load of constant 31. + +2013-10-18 Cong Hou <congh@google.com> + + * gcc.dg/vect/pr58508.c: New test. + +2013-10-18 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/58466 + * g++.dg/cpp0x/variadic145.C: New. + +2013-10-18 Andrew MacLeod <amacleod@redhat.com> + + * g++.dg/plugin/header_plugin.c: Don't include tree-flow.h. + +2013-10-18 Hans-Peter Nilsson <hp@axis.com> + + * gcc.dg/tree-ssa/gen-vect-11.c: Use dynamic vector cost model. + * gcc.dg/tree-ssa/gen-vect-11a.c: Likewise. + * gcc.dg/tree-ssa/gen-vect-2.c: Likewise. + * gcc.dg/tree-ssa/gen-vect-25.c: Likewise. + +2013-10-17 Charles Bayis <charles.baylis@linaro.org> + + * gcc.dg/builtin-apply2.c: Skip test on arm hardfloat ABI targets. + * gcc.dg/tls/pr42894.c: Remove dg-options for arm*-*-* targets. + * gcc.target/arm/thumb-ltu.c: Remove dg-skip-if and require + effective target arm_thumb1_ok. + * lib/target-supports.exp + (check_effective_target_arm_fp16_ok_nocache): Don't force + -mfloat-abi=soft when building for hardfloat target. + +2013-10-17 Michael Meissner <meissner@linux.vnet.ibm.com> + + PR target/58673 + * gcc.target/powerpc/pr58673-1.c: New file to test whether + -mquad-word + -mno-vsx-timode causes errors. + * gcc.target/powerpc/pr58673-2.c: Likewise. + +2013-10-17 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/58596 + * g++.dg/cpp0x/lambda/lambda-nsdmi5.C: New + +2013-10-17 Kyrylo Tkachov <kyrylo.tkachov@arm.com> + + * gcc.target/aarch64/c-output-template.c: New testcase. + * gcc.target/aarch64/c-output-template-2.c: Likewise. + * gcc.target/aarch64/c-output-template-3.c: Likewise. + +2013-10-17 Michael Hudson-Doyle <michael.hudson@linaro.org> + + * gcc/testsuite/lib/target-supports.exp + (check_effective_target_sync_long_long): AArch64 supports + atomic operations on "long long". + (check_effective_target_sync_long_long_runtime): AArch64 can + execute atomic operations on "long long". + +2013-10-17 Richard Biener <rguenther@suse.de> + + PR tree-optimization/58143 + * gcc.dg/torture/pr58143-1.c: New testcase. + * gcc.dg/torture/pr58143-2.c: Likewise. + * gcc.dg/torture/pr58143-3.c: Likewise. + +2013-10-17 Marek Polacek <polacek@redhat.com> + + PR c/58267 + * gcc.dg/c1x-align-5.c: New test. + +2013-10-16 Tobias Burnus <burnus@net-b.de> + + PR fortran/58652 + * gfortran.dg/unlimited_polymorphic_12.f90: New. + +2013-10-16 Thomas Schwinge <thomas@codesourcery.com> + + * c-c++-common/cpp/openmp-define-1.c: Move + dg-require-effective-target fopenmp after dg-do directive. + * c-c++-common/cpp/openmp-define-2.c: Likewise. + * gfortran.dg/openmp-define-1.f90: Likewise. + * gfortran.dg/openmp-define-2.f90: Likewise. + * gfortran.dg/openmp-define-3.f90: Likewise. + +2013-10-16 Paulo Matos <pmatos@broadcom.com> + + * gcc.dg/tree-prof/tree-prof.exp: Fix comment. + +2013-10-15 Sriraman Tallam <tmsriram@google.com> + + PR target/57756 + * gcc.target/i386/pr57756.c: New test. + * gcc.target/i386/pr57756_2.c: New test. + +2013-10-15 Richard Sandiford <rdsandiford@googlemail.com> + + * gcc.dg/torture/builtin-self.c: New file. + +2013-10-15 Zhenqiang Chen <zhenqiang.chen@arm.com> + + * gcc.dg/tree-ssa/reassoc-32.c: New test case. + * gcc.dg/tree-ssa/reassoc-33.c: New test case. + * gcc.dg/tree-ssa/reassoc-34.c: New test case. + * gcc.dg/tree-ssa/reassoc-35.c: New test case. + * gcc.dg/tree-ssa/reassoc-36.c: New test case. + +2013-10-15 Cong Hou <congh@google.com> + + * gcc.dg/vect/vect-reduc-pattern-3.c: New test. + +2013-10-15 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/58707 + * g++.dg/cpp0x/pr58707.C: New. + +2013-10-15 Kyrylo Tkachov <kyrylo.tkachov@arm.com> + + * c-c++-common/cpp/openmp-define-3.c: Move effective target check + after other directives. + +2013-10-15 Tobias Burnus <burnus@net-b.de> + + PR fortran/58652 + * gfortran.dg/unlimited_polymorphic_11.f90: New. + +2013-10-14 Ian Lance Taylor <iant@google.com> + + * go.test/go-test.exp (go-find-packages): New proc. + (go-gc-tests): Skip stress and safe tests. Skip *.dir + subdirectories. Do simple +build line matching. Handle run with + arguments. Handle errorcheckdir and rundircmpout. Use packages + for rundir. Remove special handling for bug191 and dwarf. + +2013-10-14 Tobias Burnus <burnus@net-b.de> + + PR fortran/58658 + * gfortran.dg/unlimited_polymorphic_10.f90: New. + +2013-10-14 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + * gcc.dg/torture/pr58670.c (ASM_STR) [__i386__ || __x86_64__]: Use + btsl. + +2013-10-14 Eric Botcazou <ebotcazou@adacore.com> + + * gnat.dg/specs/opt1.ads: New test. + +2013-10-14 Richard Biener <rguenther@suse.de> + + PR tree-optimization/58640 + * gcc.c-torture/execute/pr58640-2.c: New testcase. + +2013-10-13 Eric Botcazou <ebotcazou@adacore.com> + + * gnat.dg/uninit_array.ad[sn]: New test. + * gnat.dg/uninit_array_pkg.ads: New helper. + +2013-10-13 Richard Biener <rguenther@suse.de> + + * gcc.c-torture/execute/pr58662.c: New test. + +2013-10-12 Oleg Endo <olegendo@gcc.gnu.org> + + PR target/51244 + * gcc.dg/torture/p51244-21.c: New. + * gcc.target/sh/pr51244-20.c: New. + * gcc.target/sh/pr51244-20-sh2a.c: New. + +2013-10-12 Arnaud Charlet <charlet@adacore.com> + + * gnat.dg/specs/linker_section.ads: Update test. + +2013-10-12 H.J. Lu <hongjiu.lu@intel.com> + + PR target/58690 + * gcc.target/i386/pr58690.c: New test + +2013-10-12 Alexander Monakov <amonakov@ispras.ru> + + * gcc.target/i386/builtin-ucmp.c: New test. + +2013-10-11 Brooks Moses <bmoses@google.com> + + * g++.dg/ext/altivec-7.C: Check for standard vector-type name mangling. + +2013-10-11 Jeff Law <law@redhat.com> + + * gcc.c-torture/execute/pr58640.c: New test. + +2013-10-11 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/58633 + * g++.dg/cpp0x/decltype57.C: New. + +2013-10-11 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/31671 + * g++.dg/template/nontype26.C: New. + +2013-10-11 Thomas Schwinge <thomas@codesourcery.com> + + * c-c++-common/cpp/openmp-define-1.c: New file. + * c-c++-common/cpp/openmp-define-2.c: Likewise. + * c-c++-common/cpp/openmp-define-3.c: Likewise. + * gfortran.dg/openmp-define-1.f90: Likewise. + * gfortran.dg/openmp-define-2.f90: Likewise. + * gfortran.dg/openmp-define-3.f90: Likewise. + + * g++.dg/gomp/gomp.exp: Recurse into subdirectories when looking + for test source files. + * gcc.dg/gomp/gomp.exp: Likewise. + * gcc.dg/gomp/appendix-a/a.35.1.c: Expect error. + * gcc.dg/gomp/appendix-a/a.35.3.c: Likewise. + * gcc.dg/gomp/appendix-a/a.35.4.c: Likewise. + * gcc.dg/gomp/appendix-a/a.35.5.c: Likewise. + * gcc.dg/gomp/appendix-a/a.35.6.c: Likewise. + +2013-10-11 Jakub Jelinek <jakub@redhat.com> + + * c-c++-common/gomp/atomic-15.c: Adjust for C diagnostics. + Remove error test that is now valid in OpenMP 4.0. + * c-c++-common/gomp/atomic-16.c: New test. + * c-c++-common/gomp/cancel-1.c: New test. + * c-c++-common/gomp/depend-1.c: New test. + * c-c++-common/gomp/depend-2.c: New test. + * c-c++-common/gomp/map-1.c: New test. + * c-c++-common/gomp/pr58472.c: New test. + * c-c++-common/gomp/sections1.c: New test. + * c-c++-common/gomp/simd1.c: New test. + * c-c++-common/gomp/simd2.c: New test. + * c-c++-common/gomp/simd3.c: New test. + * c-c++-common/gomp/simd4.c: New test. + * c-c++-common/gomp/simd5.c: New test. + * c-c++-common/gomp/single1.c: New test. + * g++.dg/gomp/block-0.C: Adjust for stricter #pragma omp sections + parser. + * g++.dg/gomp/block-3.C: Likewise. + * g++.dg/gomp/clause-3.C: Adjust error messages. + * g++.dg/gomp/declare-simd-1.C: New test. + * g++.dg/gomp/declare-simd-2.C: New test. + * g++.dg/gomp/depend-1.C: New test. + * g++.dg/gomp/depend-2.C: New test. + * g++.dg/gomp/target-1.C: New test. + * g++.dg/gomp/target-2.C: New test. + * g++.dg/gomp/taskgroup-1.C: New test. + * g++.dg/gomp/teams-1.C: New test. + * g++.dg/gomp/udr-1.C: New test. + * g++.dg/gomp/udr-2.C: New test. + * g++.dg/gomp/udr-3.C: New test. + * g++.dg/gomp/udr-4.C: New test. + * g++.dg/gomp/udr-5.C: New test. + * g++.dg/gomp/udr-6.C: New test. + * gcc.dg/autopar/outer-1.c: Expect 4 instead of 5 loopfn matches. + * gcc.dg/autopar/outer-2.c: Likewise. + * gcc.dg/autopar/outer-3.c: Likewise. + * gcc.dg/autopar/outer-4.c: Likewise. + * gcc.dg/autopar/outer-5.c: Likewise. + * gcc.dg/autopar/outer-6.c: Likewise. + * gcc.dg/autopar/parallelization-1.c: Likewise. + * gcc.dg/gomp/block-3.c: Adjust for stricter #pragma omp sections + parser. + * gcc.dg/gomp/clause-1.c: Adjust error messages. + * gcc.dg/gomp/combined-1.c: Look for GOMP_parallel_loop_runtime + instead of GOMP_parallel_loop_runtime_start. + * gcc.dg/gomp/declare-simd-1.c: New test. + * gcc.dg/gomp/declare-simd-2.c: New test. + * gcc.dg/gomp/nesting-1.c: Adjust for stricter #pragma omp sections + parser. Add further #pragma omp sections nesting tests. + * gcc.dg/gomp/target-1.c: New test. + * gcc.dg/gomp/target-2.c: New test. + * gcc.dg/gomp/taskgroup-1.c: New test. + * gcc.dg/gomp/teams-1.c: New test. + * gcc.dg/gomp/udr-1.c: New test. + * gcc.dg/gomp/udr-2.c: New test. + * gcc.dg/gomp/udr-3.c: New test. + * gcc.dg/gomp/udr-4.c: New test. + * gfortran.dg/gomp/appendix-a/a.35.5.f90: Add dg-error. + +2013-10-10 Jan Hubicka <jh@suse.cz> + + * gcc.target/i386/avx256-unaligned-store-3.c: Update template for + tuning change. + * gcc.target/i386/avx256-unaligned-store-1.c: Likewise. + * gcc.target/i386/pr49168-1.c: Likewise. + * gcc.target/i386/pr49002-2.c: Likewise. + +2013-10-10 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/58670 + * gcc.dg/torture/pr58670.c: New test. + +2013-10-09 Zhenqiang Chen <zhenqiang.chen@arm.com> + + * gcc.dg/tree-ssa/phi-opt-11.c: New test. + +2013-10-09 Marek Polacek <polacek@redhat.com> + + PR c++/58635 + * g++.dg/tm/pr58635-1.C: New test. + * g++.dg/tm/pr58635-2.C: New test. + +2013-10-09 Jakub Jelinek <jakub@redhat.com> + + * gcc.dg/vect/bb-slp-31.c: Add cleanup-tree-dump. + +2013-10-09 Marc Glisse <marc.glisse@inria.fr> + + PR tree-optimization/20318 + * c-c++-common/pr20318.c: New file. + * gcc.dg/tree-ssa/pr20318.c: New file. + +2013-10-09 Eric Botcazou <ebotcazou@adacore.com> + + * gcc.c-torture/execute/pr58570.c: New test. + +2013-10-09 Alex Velenko <Alex.Velenko@arm.com> + + * gcc.target/aarch64/vclz.c: New testcase. + +2013-10-09 Alex Velenko <Alex.Velenko@arm.com> + + * gcc.target/aarch64/vadd_f64.c: New testcase. + * gcc.target/aarch64/vsub_f64.c: New testcase. + +2013-10-09 Alex Velenko <Alex.Velenko@arm.com> + + * gcc.target/aarch64/vdiv_f.c: New testcase. + +2013-10-09 Alex Velenko <Alex.Velenko@arm.com> + + * gcc.target/aarch64/vneg_f.c: New testcase. + * gcc.target/aarch64/vneg_s.c: New testcase. + +2013-10-08 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/58568 + * g++.dg/cpp0x/lambda/lambda-ice10.C: New. + * g++.old-deja/g++.mike/misc9.C: Adjust. + +2013-10-08 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/58665 + Revert: + 2013-10-04 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/58448 + * g++.dg/template/crash117.C: New. + +2013-10-08 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> + + * gcc.target/s390/htm-nofloat-2.c: Add -mzarch to asm options. + +2013-10-08 Marc Glisse <marc.glisse@inria.fr> + + PR tree-optimization/58480 + * gcc.dg/tree-ssa/pr58480.c: New file. + +2013-10-07 Bill Schmidt <wschmidt@linux.vnet.ibm.com> + + * gcc.target/powerpc/pr43154.c: Skip for ppc64 little endian. + * gcc.target/powerpc/fusion.c: Likewise. + +2013-10-07 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> + + * gcc.target/s390/htm-nofloat-2.c: New testcase. + +2013-10-07 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> + + * gcc.target/s390/htm-1.c: Add more tests to cover different + operand types. + +2013-10-06 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/58126 + * g++.dg/init/uninitialized1.C: New. + +2013-10-06 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/56060 + * g++.dg/cpp0x/variadic144.C: New. + +2013-10-04 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/58560 + * g++.dg/cpp0x/auto39.C: New. + +2013-10-04 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/58503 + * g++.dg/cpp0x/range-for26.C: New. + * g++.dg/cpp0x/range-for27.C: Likewise. + +2013-10-04 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/58448 + * g++.dg/template/crash117.C: New. + +2013-10-04 Marc Glisse <marc.glisse@inria.fr> + + PR c++/19476 + * g++.dg/tree-ssa/pr19476-5.C: New file. + * g++.dg/tree-ssa/pr19476-1.C: Mention pr19476-5.C. + +2013-10-04 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/58584 + * g++.dg/cpp0x/gen-attrs-55.C: New. + +2013-10-03 Easwaran Raman <eraman@google.com> + + PR c++/33911 + * g++.dg/ext/attribute47.C: New. + +2013-10-03 Rong Xu <xur@google.com> + + * gcc.target/i386/cold-attribute-2.c: Fix the test by using original + probability. + * gcc.dg/tree-ssa/ipa-split-5.c: Ditto. + * gcc.dg/tree-ssa/ipa-split-6.c: Ditto. + +2013-10-03 Marek Polacek <polacek@redhat.com> + + PR c++/58510 + * g++.dg/cpp0x/pr58510.C: New test. + +2013-10-03 Marc Glisse <marc.glisse@inria.fr> + + PR c++/19476 + * g++.dg/tree-ssa/pr19476-1.C: New file. + * g++.dg/tree-ssa/pr19476-2.C: Likewise. + * g++.dg/tree-ssa/pr19476-3.C: Likewise. + * g++.dg/tree-ssa/pr19476-4.C: Likewise. + +2013-10-03 Michael Meissner <meissner@linux.vnet.ibm.com> + + * gcc.target/powerpc/p8vector-fp.c: New test for floating point + scalar operations when using -mupper-regs-sf and -mupper-regs-df. + * gcc.target/powerpc/ppc-target-1.c: Update tests to allow either + VSX scalar operations or the traditional floating point form of + the instruction. + * gcc.target/powerpc/ppc-target-2.c: Likewise. + * gcc.target/powerpc/recip-3.c: Likewise. + * gcc.target/powerpc/recip-5.c: Likewise. + * gcc.target/powerpc/pr72747.c: Likewise. + * gcc.target/powerpc/vsx-builtin-3.c: Likewise. + +2013-10-03 Marcus Shawcroft <marcus.shawcroft@arm.com> + + PR target/58460 + * gcc.target/aarch64/pr58460.c: New file. + +2013-10-02 Tobias Burnus <burnus@net-b.de> + + PR fortran/58593 + * gfortran.dg/char_length_19.f90: New. + +2013-10-02 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/58535 + * g++.dg/parse/crash65.C: New. + * g++.dg/cpp1y/pr58535.C: Likewise. + +2013-10-02 Richard Biener <rguenther@suse.de> + + * gcc.dg/tree-ssa/ldist-11.c: Adjust. + * gcc.dg/tree-ssa/ldist-17.c: Likewise. + * gcc.dg/tree-ssa/ldist-23.c: Likewise. + * gcc.dg/tree-ssa/ldist-pr45948.c: Likewise. + * gfortran.dg/ldist-pr45199.f: Likewise. + +2013-10-02 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/58565 + * g++.dg/parse/crash64.C: New. + +2013-10-02 Yufeng Zhang <yufeng.zhang@arm.com> + + * gcc.dg/tree-ssa/slsr-40.c: New test. + +2013-10-01 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/58563 + * g++.dg/cpp0x/pr58563.C: New. + +2013-10-01 Vidya Praveen <vidyapraveen@arm.com> + + * gcc.target/aarch64/vect_saddl_1.c: New. + +2013-10-01 Jakub Jelinek <jakub@redhat.com> + + PR target/58574 + * gcc.c-torture/execute/pr58574.c: New testcase. + +2013-10-01 Kugan Vivekanandarajah <kuganv@linaro.org> + + PR Target/58578 + * gcc.target/arm/pr58578.c: New test. + +2013-10-01 Kyrylo Tkachov <kyrylo.tkachov@arm.com> + + PR tree-optimization/58556 + * gcc.dg/tree-ssa/gen-vect-26.c: Use dynamic vector cost model. + * gcc.dg/tree-ssa/gen-vect-28.c: Likewise. + +2013-10-01 Nick Clifton <nickc@redhat.com> + + * lib/target-supports.exp (check_effective_target_ptr32plus): Fail + for MSP430. + * gcc.c-torture/compile/20010327-1.c: Only run the test for + ptr32plus targets. + * gcc.c-torture/compile/pr41181.c: Likewise. + * gcc.c-torture/compile/calls.c: Likewise. + * gcc.c-torture/compile/990617-1.c: Likewise. + * gcc.c-torture/compile/pr55955.c: Only run the test for + int32plus targets. + * gcc.c-torture/compile/limits-externdecl.c: Likewise. + +2013-10-01 Richard Biener <rguenther@suse.de> + + PR tree-optimization/58553 + * gcc.dg/torture/pr58553.c: New testcase. + +2013-09-30 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/58564 + * gcc.c-torture/execute/pr58564.c: New test. + +2013-09-30 Teresa Johnson <tejohnson@google.com> + + * testsuite/gcc.dg/tree-ssa/ssa-dom-thread-3.c (expand_one_var): + Update for additional dump message. + +2013-09-30 Richard Biener <rguenther@suse.de> + + PR tree-optimization/58554 + * gcc.dg/torture/pr58554.c: New testcase. + +2013-09-30 Simon Cook <simon.cook@embecosm.com> + Joern Rennecke <joern.rennecke@embecosm.com> + + * gcc.target/arc/barrel-shifter-1.c: New test. + * gcc.target/arc/barrel-shifter-2.c: Likewise. + * gcc.target/arc/long-calls.c, gcc.target/arc/mA6.c: Likewise. + * gcc.target/arc/mA7.c, gcc.target/arc/mARC600.c: Likewise. + * gcc.target/arc/mARC601.c, gcc.target/arc/mARC700.c: Likewise. + * gcc.target/arc/mcpu-arc600.c, gcc.target/arc/mcpu-arc601.c: Likewise. + * gcc.target/arc/mcpu-arc700.c, gcc.target/arc/mcrc.c: Likewise. + * gcc.target/arc/mdpfp.c, gcc.target/arc/mdsp-packa.c: Likewise. + * gcc.target/arc/mdvbf.c, gcc.target/arc/mlock.c: Likewise. + * gcc.target/arc/mmac-24.c, gcc.target/arc/mmac-d16.c: Likewise. + * gcc.target/arc/mno-crc.c, gcc.target/arc/mno-dsp-packa.c: Likewise. + * gcc.target/arc/mno-dvbf.c, gcc.target/arc/mno-lock.c: Likewise. + * gcc.target/arc/mno-mac-24.c, gcc.target/arc/mno-mac-d16.c: Likewise. + * gcc.target/arc/mno-rtsc.c, gcc.target/arc/mno-swape.c: Likewise. + * gcc.target/arc/mno-xy.c, gcc.target/arc/mrtsc.c: Likewise. + * gcc.target/arc/mspfp.c, gcc.target/arc/mswape.c: Likewise. + * gcc.target/arc/mtune-ARC600.c: Likewise. + * gcc.target/arc/mtune-ARC601.c: Likewise. + * gcc.target/arc/mtune-ARC700-xmac: Likewise. + * gcc.target/arc/mtune-ARC700.c: Likewise. + * gcc.target/arc/mtune-ARC725D.c: Likewise. + * gcc.target/arc/mtune-ARC750D.c: Likewise. + * gcc.target/arc/mul64.c, gcc.target/arc/mxy.c: Likewise. + * gcc.target/arc/no-dpfp-lrsr.c: Likewise. + +2013-09-30 Richard Biener <rguenther@suse.de> + + PR middle-end/58532 + * g++.dg/torture/pr58552.C: New testcase. + +2013-09-27 Michael Meissner <meissner@linux.vnet.ibm.com> + + * gcc.target/powerpc/p8vector-ldst.c: New test for -mupper-regs-sf + and -mupper-regs-df. + +2013-09-27 Paulo Matos <pmatos@broadcom.com> + + PR middle-end/58463 + * gcc.dg/pr58463.c: New test. + +2013-09-27 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/58551 + * c-c++-common/gomp/pr58551.c: New test. + +2013-09-27 Richard Biener <rguenther@suse.de> + + PR tree-optimization/58459 + * gcc.dg/tree-ssa/ssa-pre-31.c: New testcase. + +2013-09-26 Bernd Edlinger <bernd.edlinger@hotmail.de> + + PR fortran/58113 + * gfortran.dg/round_4.f90: Check for rounding support. + +2013-09-26 James Greenhalgh <james.greenhalgh@arm.com> + + * g++.dg/vect/pr58513.cc (op): Make static. + +2013-09-26 Richard Biener <rguenther@suse.de> + + * gcc.dg/tree-ssa/coalesce-2.c: New testcase. + +2013-09-26 Richard Biener <rguenther@suse.de> + + PR tree-optimization/58539 + * gcc.dg/torture/pr58539.c: New testcase. + +2013-09-25 Jeff Law <law@redhat.com> + + * gcc.dg/tree-ssa/ssa-dom-thread-3.c: Update expected output. + +2013-09-25 Tobias Burnus <burnus@net-b.de> + + PR fortran/58436 + * gfortran.dg/finalize_21.f90: New. + +2013-09-25 Tobias Burnus <burnus@net-b.de> + + PR fortran/57697 + PR fortran/58469 + * gfortran.dg/defined_assignment_8.f90: New. + * gfortran.dg/defined_assignment_9.f90: New. + +2013-09-25 Marek Polacek <polacek@redhat.com> + + PR sanitizer/58413 + * c-c++-common/ubsan/shift-5.c: New test. + * c-c++-common/ubsan/shift-6.c: New test. + * c-c++-common/ubsan/div-by-zero-5.c: New test. + * gcc.dg/ubsan/c-shift-1.c: New test. + +2013-09-25 Marek Polacek <polacek@redhat.com> + + PR c++/58516 + * g++.dg/tm/pr58516.C: New test. + +2013-09-24 Kyrylo Tkachov <kyrylo.tkachov@arm.com> + + * lib/target-supports.exp (check_effective_target_arm_cond_exec): + New procedure. + * gcc.target/arm/minmax_minus.c: Check for cond_exec target. + +2013-09-24 Richard Biener <rguenther@suse.de> + + PR middle-end/58513 + * g++.dg/vect/pr58513.cc: New testcase. + +2013-09-24 Yvan Roux <yvan.roux@linaro.org> + + * gcc.target/arm/atomic-comp-swap-release-acquire.c: Adjust expected + output. + +2013-09-23 Adam Butcher <adam@jessamine.co.uk> + + PR c++/58500 + * g++.dg/cpp1y/pr58500.C: New testcase. + +2013-09-23 Eric Botcazou <ebotcazou@adacore.com> + + * gnat.dg/opt28.ad[sb]: New test. + * gnat.dg/opt28_pkg.ads: New helper. + +2013-09-23 Richard Biener <rguenther@suse.de> + + PR tree-optimization/58464 + * g++.dg/torture/pr58464.C: New testcase. + +2013-09-23 Christian Bruel <christian.bruel@st.com> + + PR target/58475 + * gcc.target/sh/torture/pr58475.c: New test. + +2013-09-23 Janus Weil <janus@gcc.gnu.org> + + PR fortran/58355 + * gfortran.dg/extends_15.f90: New. + 2013-09-20 Paolo Carlini <paolo.carlini@oracle.com> PR c++/58481 @@ -84,7 +795,7 @@ 2013-09-18 Eric Botcazou <ebotcazou@adacore.com> - * gnat.dg/array_bounds_test2.adb: New test. + * gnat.dg/array_bounds_test2.adb: New test. 2013-09-18 Kyrylo Tkachov <kyrylo.tkachov@arm.com> @@ -102,7 +813,7 @@ 2013-09-17 Cong Hou <congh@google.com> - * gcc.dg/vect/vect-reduc-dot-s16c.c: Add a test case with dot product + * gcc.dg/vect/vect-reduc-dot-s16c.c: Add a test case with dot product on two arrays with short and int types. This should not be recognized as a dot product pattern. @@ -129,8 +840,7 @@ 2013-09-17 Nick Clifton <nickc@redhat.com> * lib/target-supports.exp (check_effective_target_trampolines): - Add MSP430 to the list of targets that do not support - trampolines. + Add MSP430 to the list of targets that do not support trampolines. (check_profiling_available): Add MSP430 to the list of targets that do not support profiling. (check_effective_target_tls_runtime): Add MSP430 to the list of @@ -214,7 +924,7 @@ 2013-09-13 Kai Tietz <ktietz@redhat.com> - gcc.target/i386/pr57848.c: New file. + * gcc.target/i386/pr57848.c: New file. 2013-09-13 Christian Bruel <christian.bruel@st.com> @@ -232,8 +942,7 @@ 2013-09-12 Paolo Carlini <paolo.carlini@oracle.com> - * g++.dg/template/pseudodtor2.C: Add column number to dg-error - strings. + * g++.dg/template/pseudodtor2.C: Add column number to dg-error strings. * g++.dg/template/pseudodtor3.C: Likewise. 2013-09-12 Richard Biener <rguenther@suse.de> diff --git a/gcc/testsuite/c-c++-common/cpp/openmp-define-1.c b/gcc/testsuite/c-c++-common/cpp/openmp-define-1.c new file mode 100644 index 00000000000..c5379223c84 --- /dev/null +++ b/gcc/testsuite/c-c++-common/cpp/openmp-define-1.c @@ -0,0 +1,6 @@ +/* { dg-do preprocess } */ +/* { dg-require-effective-target fopenmp } */ + +#ifdef _OPENMP +# error _OPENMP defined +#endif diff --git a/gcc/testsuite/c-c++-common/cpp/openmp-define-2.c b/gcc/testsuite/c-c++-common/cpp/openmp-define-2.c new file mode 100644 index 00000000000..8823e291b8b --- /dev/null +++ b/gcc/testsuite/c-c++-common/cpp/openmp-define-2.c @@ -0,0 +1,7 @@ +/* { dg-options "-fno-openmp" } */ +/* { dg-do preprocess } */ +/* { dg-require-effective-target fopenmp } */ + +#ifdef _OPENMP +# error _OPENMP defined +#endif diff --git a/gcc/testsuite/c-c++-common/cpp/openmp-define-3.c b/gcc/testsuite/c-c++-common/cpp/openmp-define-3.c new file mode 100644 index 00000000000..6986c5507b9 --- /dev/null +++ b/gcc/testsuite/c-c++-common/cpp/openmp-define-3.c @@ -0,0 +1,11 @@ +/* { dg-options "-fopenmp" } */ +/* { dg-do preprocess } */ +/* { dg-require-effective-target fopenmp } */ + +#ifndef _OPENMP +# error _OPENMP not defined +#endif + +#if _OPENMP != 201307 +# error _OPENMP defined to wrong value +#endif diff --git a/gcc/testsuite/c-c++-common/gomp/atomic-15.c b/gcc/testsuite/c-c++-common/gomp/atomic-15.c index 13a9e0ce48a..5e669fa3543 100644 --- a/gcc/testsuite/c-c++-common/gomp/atomic-15.c +++ b/gcc/testsuite/c-c++-common/gomp/atomic-15.c @@ -8,39 +8,37 @@ main () { int v; #pragma omp atomic - x = x * 7 + 6; /* { dg-error "expected" } */ + x = x * 7 + 6; /* { dg-error "expected|invalid form of" } */ #pragma omp atomic - x = x * 7 ^ 6; /* { dg-error "expected" } */ + x = x * 7 ^ 6; /* { dg-error "expected|invalid form of" } */ #pragma omp atomic update - x = x - 8 + 6; /* { dg-error "expected" } */ + x = x - 8 + 6; /* { dg-error "expected|invalid form of" } */ #pragma omp atomic - x = x ^ 7 | 2; /* { dg-error "expected" } */ + x = x ^ 7 | 2; /* { dg-error "expected|invalid form of" } */ #pragma omp atomic - x = x / 7 * 2; /* { dg-error "expected" } */ + x = x / 7 * 2; /* { dg-error "expected|invalid form of" } */ #pragma omp atomic - x = x / 7 / 2; /* { dg-error "expected" } */ + x = x / 7 / 2; /* { dg-error "expected|invalid form of" } */ #pragma omp atomic capture - v = x = x | 6; /* { dg-error "invalid operator" } */ + { v = x; x = x * 7 + 6; } /* { dg-error "expected" "" { target c++ } } */ #pragma omp atomic capture - { v = x; x = x * 7 + 6; } /* { dg-error "expected" } */ + { v = x; x = x * 7 ^ 6; } /* { dg-error "expected" "" { target c++ } } */ #pragma omp atomic capture - { v = x; x = x * 7 ^ 6; } /* { dg-error "expected" } */ + { v = x; x = x - 8 + 6; } /* { dg-error "expected" "" { target c++ } } */ #pragma omp atomic capture - { v = x; x = x - 8 + 6; } /* { dg-error "expected" } */ + { v = x; x = x ^ 7 | 2; } /* { dg-error "expected" "" { target c++ } } */ #pragma omp atomic capture - { v = x; x = x ^ 7 | 2; } /* { dg-error "expected" } */ + { v = x; x = x / 7 * 2; } /* { dg-error "expected" "" { target c++ } } */ #pragma omp atomic capture - { v = x; x = x / 7 * 2; } /* { dg-error "expected" } */ + { v = x; x = x / 7 / 2; } /* { dg-error "expected" "" { target c++ } } */ #pragma omp atomic capture - { v = x; x = x / 7 / 2; } /* { dg-error "expected" } */ + { x = x * 7 + 6; v = x; } /* { dg-error "expected|uses two different expressions for memory" } */ #pragma omp atomic capture - { x = x * 7 + 6; v = x; } /* { dg-error "expected" } */ + { x = x * 7 ^ 6; v = x; } /* { dg-error "expected|uses two different expressions for memory" } */ #pragma omp atomic capture - { x = x * 7 ^ 6; v = x; } /* { dg-error "expected" } */ + { x = x - 8 + 6; v = x; } /* { dg-error "expected|uses two different expressions for memory" } */ #pragma omp atomic capture - { x = x - 8 + 6; v = x; } /* { dg-error "expected" } */ - #pragma omp atomic capture - { x = x ^ 7 | 2; v = x; } /* { dg-error "expected" } */ + { x = x ^ 7 | 2; v = x; } /* { dg-error "expected|uses two different expressions for memory" } */ (void) v; return 0; } diff --git a/gcc/testsuite/c-c++-common/gomp/atomic-16.c b/gcc/testsuite/c-c++-common/gomp/atomic-16.c new file mode 100644 index 00000000000..87fbaa23317 --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/atomic-16.c @@ -0,0 +1,34 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp" } */ + +int x = 6; + +void +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" } */ + x += v; + #pragma omp atomic seq_cst , update /* { dg-error "expected end of line" } */ + 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" } */ + x += v; + #pragma omp atomic capture, seq_cst /* { dg-error "expected end of line" } */ + v = x += 2; +} diff --git a/gcc/testsuite/c-c++-common/gomp/cancel-1.c b/gcc/testsuite/c-c++-common/gomp/cancel-1.c new file mode 100644 index 00000000000..d8f7bc1b8fa --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/cancel-1.c @@ -0,0 +1,396 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp" } */ + +void +f1 (void) +{ + #pragma omp cancel parallel /* { dg-error "orphaned" } */ + #pragma omp cancel for /* { dg-error "orphaned" } */ + #pragma omp cancel sections /* { dg-error "orphaned" } */ + #pragma omp cancel taskgroup /* { dg-error "orphaned" } */ + #pragma omp cancellation point parallel /* { dg-error "orphaned" } */ + #pragma omp cancellation point for /* { dg-error "orphaned" } */ + #pragma omp cancellation point sections /* { dg-error "orphaned" } */ + #pragma omp cancellation point taskgroup /* { dg-error "orphaned" } */ +} + +void +f2 (void) +{ + int i; + #pragma omp parallel + { + #pragma omp cancel parallel + #pragma omp cancel for /* { dg-error "not closely nested inside" } */ + #pragma omp cancel sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancel taskgroup /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point parallel + #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point taskgroup /* { dg-error "not closely nested inside" } */ + #pragma omp master + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for /* { dg-error "not closely nested inside" } */ + #pragma omp cancel sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancel taskgroup /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point taskgroup /* { dg-error "not closely nested inside" } */ + } + #pragma omp single + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for /* { dg-error "not closely nested inside" } */ + #pragma omp cancel sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancel taskgroup /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point taskgroup /* { dg-error "not closely nested inside" } */ + } + #pragma omp critical + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for /* { dg-error "not closely nested inside" } */ + #pragma omp cancel sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancel taskgroup /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point taskgroup /* { dg-error "not closely nested inside" } */ + } + #pragma omp taskgroup + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for /* { dg-error "not closely nested inside" } */ + #pragma omp cancel sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancel taskgroup /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point taskgroup /* { dg-error "not closely nested inside" } */ + } + #pragma omp task + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for /* { dg-error "not closely nested inside" } */ + #pragma omp cancel sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancel taskgroup + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point taskgroup + } + #pragma omp for + for (i = 0; i < 10; i++) + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for + #pragma omp cancel sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancel taskgroup /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for + #pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point taskgroup/* { dg-error "not closely nested inside" } */ + } + #pragma omp for ordered + for (i = 0; i < 10; i++) + #pragma omp ordered + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for /* { dg-error "not closely nested inside" } */ + #pragma omp cancel sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancel taskgroup /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point taskgroup/* { dg-error "not closely nested inside" } */ + } + #pragma omp sections + { + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for /* { dg-error "not closely nested inside" } */ + #pragma omp cancel sections + #pragma omp cancel taskgroup /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point sections + #pragma omp cancellation point taskgroup/* { dg-error "not closely nested inside" } */ + } + #pragma omp section + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for /* { dg-error "not closely nested inside" } */ + #pragma omp cancel sections + #pragma omp cancel taskgroup /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point sections + #pragma omp cancellation point taskgroup/* { dg-error "not closely nested inside" } */ + } + } + #pragma omp target data + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for /* { dg-error "not closely nested inside" } */ + #pragma omp cancel sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancel taskgroup /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point taskgroup /* { dg-error "not closely nested inside" } */ + } + #pragma omp target + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for /* { dg-error "not closely nested inside" } */ + #pragma omp cancel sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancel taskgroup /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point taskgroup /* { dg-error "not closely nested inside" } */ + } + } + #pragma omp target data + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for /* { dg-error "not closely nested inside" } */ + #pragma omp cancel sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancel taskgroup /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point taskgroup /* { dg-error "not closely nested inside" } */ + } + #pragma omp target + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for /* { dg-error "not closely nested inside" } */ + #pragma omp cancel sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancel taskgroup /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point taskgroup /* { dg-error "not closely nested inside" } */ + } + #pragma omp target teams + { + #pragma omp cancel parallel /* { dg-error "only distribute or parallel constructs are allowed to be closely nested" } */ + #pragma omp cancel for /* { dg-error "only distribute or parallel constructs are allowed to be closely nested" } */ + #pragma omp cancel sections /* { dg-error "only distribute or parallel constructs are allowed to be closely nested" } */ + #pragma omp cancel taskgroup /* { dg-error "only distribute or parallel constructs are allowed to be closely nested" } */ + #pragma omp cancellation point parallel /* { dg-error "only distribute or parallel constructs are allowed to be closely nested" } */ + #pragma omp cancellation point for /* { dg-error "only distribute or parallel constructs are allowed to be closely nested" } */ + #pragma omp cancellation point sections /* { dg-error "only distribute or parallel constructs are allowed to be closely nested" } */ + #pragma omp cancellation point taskgroup /* { dg-error "only distribute or parallel constructs are allowed to be closely nested" } */ + } + #pragma omp target teams distribute + for (i = 0; i < 10; i++) + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for /* { dg-error "not closely nested inside" } */ + #pragma omp cancel sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancel taskgroup /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point taskgroup /* { dg-error "not closely nested inside" } */ + } + #pragma omp for + for (i = 0; i < 10; i++) + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for + #pragma omp cancel sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancel taskgroup /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for + #pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point taskgroup /* { dg-error "not closely nested inside" } */ + } + #pragma omp for + for (i = 0; i < 10; i++) + #pragma omp target data + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for /* { dg-error "not closely nested inside" } */ + #pragma omp cancel sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancel taskgroup /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point taskgroup /* { dg-error "not closely nested inside" } */ + } + #pragma omp for + for (i = 0; i < 10; i++) + #pragma omp target + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for /* { dg-error "not closely nested inside" } */ + #pragma omp cancel sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancel taskgroup /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point taskgroup /* { dg-error "not closely nested inside" } */ + } + #pragma omp for ordered + for (i = 0; i < 10; i++) + #pragma omp ordered + #pragma omp target data + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for /* { dg-error "not closely nested inside" } */ + #pragma omp cancel sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancel taskgroup /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point taskgroup/* { dg-error "not closely nested inside" } */ + } + #pragma omp for ordered + for (i = 0; i < 10; i++) + #pragma omp ordered + #pragma omp target + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for /* { dg-error "not closely nested inside" } */ + #pragma omp cancel sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancel taskgroup /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point taskgroup/* { dg-error "not closely nested inside" } */ + } + #pragma omp sections + { + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for /* { dg-error "not closely nested inside" } */ + #pragma omp cancel sections + #pragma omp cancel taskgroup /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point sections + #pragma omp cancellation point taskgroup /* { dg-error "not closely nested inside" } */ + } + #pragma omp section + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for /* { dg-error "not closely nested inside" } */ + #pragma omp cancel sections + #pragma omp cancel taskgroup /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point sections + #pragma omp cancellation point taskgroup /* { dg-error "not closely nested inside" } */ + } + } + #pragma omp sections + { + #pragma omp target data + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for /* { dg-error "not closely nested inside" } */ + #pragma omp cancel sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancel taskgroup /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point taskgroup /* { dg-error "not closely nested inside" } */ + } + #pragma omp section + #pragma omp target data + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for /* { dg-error "not closely nested inside" } */ + #pragma omp cancel sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancel taskgroup /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point taskgroup /* { dg-error "not closely nested inside" } */ + } + } + #pragma omp sections + { + #pragma omp target + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for /* { dg-error "not closely nested inside" } */ + #pragma omp cancel sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancel taskgroup /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point taskgroup /* { dg-error "not closely nested inside" } */ + } + #pragma omp section + #pragma omp target + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for /* { dg-error "not closely nested inside" } */ + #pragma omp cancel sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancel taskgroup /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point taskgroup /* { dg-error "not closely nested inside" } */ + } + } + #pragma omp task + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for /* { dg-error "not closely nested inside" } */ + #pragma omp cancel sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancel taskgroup + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point taskgroup + #pragma omp taskgroup + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for /* { dg-error "not closely nested inside" } */ + #pragma omp cancel sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancel taskgroup /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point taskgroup /* { dg-error "not closely nested inside" } */ + } + } +} + +void +f3 (void) +{ + int i; + #pragma omp for nowait + for (i = 0; i < 10; i++) + { + #pragma omp cancel for /* { dg-warning "nowait" } */ + } + #pragma omp sections nowait + { + { + #pragma omp cancel sections /* { dg-warning "nowait" } */ + } + #pragma omp section + { + #pragma omp cancel sections /* { dg-warning "nowait" } */ + } + } + #pragma omp for ordered + for (i = 0; i < 10; i++) + { + #pragma omp cancel for /* { dg-warning "ordered" } */ + #pragma omp ordered + { + } + } +} diff --git a/gcc/testsuite/c-c++-common/gomp/depend-1.c b/gcc/testsuite/c-c++-common/gomp/depend-1.c new file mode 100644 index 00000000000..8a5850e45fe --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/depend-1.c @@ -0,0 +1,79 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp" } */ + +extern int a[][10], a2[][10]; +int b[10], c[10][2], d[10], e[10], f[10]; +int b2[10], c2[10][2], d2[10], e2[10], f2[10]; +int k[10], l[10], m[10], n[10], o; +int *p; +void bar (void); +int t[10]; +#pragma omp threadprivate (t) + +void +foo (int g[3][10], int h[4][8], int i[2][10], int j[][9], + int g2[3][10], int h2[4][8], int i2[2][10], int j2[][9]) +{ + #pragma omp task depend(in: bar[2:5]) /* { dg-error "is not a variable" } */ + ; + #pragma omp task depend(out: t[2:5]) + ; + #pragma omp task depend(inout: k[0.5:]) /* { dg-error "low bound \[^\n\r]* of array section does not have integral type" } */ + ; + #pragma omp task depend(in: l[:7.5f]) /* { dg-error "length \[^\n\r]* of array section does not have integral type" } */ + ; + #pragma omp task depend(out: m[p:]) /* { dg-error "low bound \[^\n\r]* of array section does not have integral type" } */ + ; + #pragma omp task depend(inout: n[:p]) /* { dg-error "length \[^\n\r]* of array section does not have integral type" } */ + ; + #pragma omp task depend(in: o[2:5]) /* { dg-error "does not have pointer or array type" } */ + ; + #pragma omp task depend(out: a[:][2:4]) /* { dg-error "array type length expression must be specified" } */ + ; + #pragma omp task depend(inout: b[-1:]) /* { dg-error "negative low bound in array section" } */ + ; + #pragma omp task depend(inout: c[:-3][1:1]) /* { dg-error "negative length in array section" } */ + ; + #pragma omp task depend(in: d[11:]) /* { dg-error "low bound \[^\n\r]* above array section size" } */ + ; + #pragma omp task depend(out: e[:11]) /* { dg-error "length \[^\n\r]* above array section size" } */ + ; + #pragma omp task depend(out: f[1:10]) /* { dg-error "high bound \[^\n\r]* above array section size" } */ + ; + #pragma omp task depend(in: g[:][2:4]) /* { dg-error "for pointer type length expression must be specified" } */ + ; + #pragma omp task depend(in: h[2:2][-1:]) /* { dg-error "negative low bound in array section" } */ + ; + #pragma omp task depend(inout: h[:1][:-3]) /* { dg-error "negative length in array section" } */ + ; + #pragma omp task depend(out: i[:1][11:]) /* { dg-error "low bound \[^\n\r]* above array section size" } */ + ; + #pragma omp task depend(in: j[3:4][:10]) /* { dg-error "length \[^\n\r]* above array section size" } */ + ; + #pragma omp task depend(out: j[30:10][5:5]) /* { dg-error "high bound \[^\n\r]* above array section size" } */ + ; + #pragma omp task depend(out: a2[:3][2:4]) + ; + #pragma omp task depend(inout: b2[0:]) + ; + #pragma omp task depend(inout: c2[:3][1:1]) + ; + #pragma omp task depend(in: d2[9:]) + ; + #pragma omp task depend(out: e2[:10]) + ; + #pragma omp task depend(out: f2[1:9]) + ; + #pragma omp task depend(in: g2[:2][2:4]) + ; + #pragma omp task depend(in: h2[2:2][0:]) + ; + #pragma omp task depend(inout: h2[:1][:3]) + ; + #pragma omp task depend(out: i2[:1][9:]) + ; + #pragma omp task depend(in: j2[3:4][:9]) + ; + #pragma omp task depend(out: j2[30:10][5:4]) + ; +} diff --git a/gcc/testsuite/c-c++-common/gomp/depend-2.c b/gcc/testsuite/c-c++-common/gomp/depend-2.c new file mode 100644 index 00000000000..99bf8ae1b83 --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/depend-2.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp" } */ + +void bar (int a[10][10][10]); +void +foo (int a[10][10][10], int **b) +{ + int c[10][10][10]; + #pragma omp task depend(out: a[2:4][3:][:7], b[1:7][2:8]) + bar (a); + int i = 1, j = 3, k = 2, l = 6; + #pragma omp task depend(in: a[++i:++j][++k:][:++l]) + bar (a); + #pragma omp task depend(out: a[7:2][:][:], c[5:2][:][:]) + { + bar (c); + bar (a); + } +} diff --git a/gcc/testsuite/c-c++-common/gomp/map-1.c b/gcc/testsuite/c-c++-common/gomp/map-1.c new file mode 100644 index 00000000000..694d88cc795 --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/map-1.c @@ -0,0 +1,103 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp" } */ + +extern int a[][10], a2[][10]; +int b[10], c[10][2], d[10], e[10], f[10]; +int b2[10], c2[10][2], d2[10], e2[10], f2[10]; +int k[10], l[10], m[10], n[10], o; +int *p; +int **q; +int r[4][4][4][4][4]; +int t[10]; +#pragma omp threadprivate (t) +#pragma omp declare target +void bar (int *); +#pragma omp end declare target + +void +foo (int g[3][10], int h[4][8], int i[2][10], int j[][9], + int g2[3][10], int h2[4][8], int i2[2][10], int j2[][9]) +{ + #pragma omp target map(to: bar[2:5]) /* { dg-error "is not a variable" } */ + ; + #pragma omp target map(from: t[2:5]) /* { dg-error "is threadprivate variable" } */ + ; + #pragma omp target map(tofrom: k[0.5:]) /* { dg-error "low bound \[^\n\r]* of array section does not have integral type" } */ + ; + #pragma omp target map(from: l[:7.5f]) /* { dg-error "length \[^\n\r]* of array section does not have integral type" } */ + ; + #pragma omp target map(to: m[p:]) /* { dg-error "low bound \[^\n\r]* of array section does not have integral type" } */ + ; + #pragma omp target map(tofrom: n[:p]) /* { dg-error "length \[^\n\r]* of array section does not have integral type" } */ + ; + #pragma omp target map(to: o[2:5]) /* { dg-error "does not have pointer or array type" } */ + ; + #pragma omp target map(to: a[:][:]) /* { dg-error "array type length expression must be specified" } */ + bar (&a[0][0]); /* { dg-error "referenced in target region does not have a mappable type" } */ + #pragma omp target map(tofrom: b[-1:]) /* { dg-error "negative low bound in array section" } */ + bar (b); + #pragma omp target map(tofrom: c[:-3][:]) /* { dg-error "negative length in array section" } */ + bar (&c[0][0]); + #pragma omp target map(from: d[11:]) /* { dg-error "low bound \[^\n\r]* above array section size" } */ + bar (d); + #pragma omp target map(to: e[:11]) /* { dg-error "length \[^\n\r]* above array section size" } */ + bar (e); + #pragma omp target map(to: f[1:10]) /* { dg-error "high bound \[^\n\r]* above array section size" } */ + bar (f); + #pragma omp target map(from: g[:][0:10]) /* { dg-error "for pointer type length expression must be specified" } */ + bar (&g[0][0]); + #pragma omp target map(from: h[2:1][-1:]) /* { dg-error "negative low bound in array section" } */ + bar (&h[0][0]); + #pragma omp target map(tofrom: h[:1][:-3]) /* { dg-error "negative length in array section" } */ + bar (&h[0][0]); + #pragma omp target map(i[:1][11:]) /* { dg-error "low bound \[^\n\r]* above array section size" } */ + bar (&i[0][0]); + #pragma omp target map(from: j[3:1][:10]) /* { dg-error "length \[^\n\r]* above array section size" } */ + bar (&j[0][0]); + #pragma omp target map(to: j[30:1][5:5]) /* { dg-error "high bound \[^\n\r]* above array section size" } */ + bar (&j[0][0]); + #pragma omp target map(to: a2[:1][2:4]) + bar (&a2[0][0]); + #pragma omp target map(a2[3:5][:]) + bar (&a2[0][0]); + #pragma omp target map(to: a2[3:5][:10]) + bar (&a2[0][0]); + #pragma omp target map(tofrom: b2[0:]) + bar (b2); + #pragma omp target map(tofrom: c2[:3][:]) + bar (&c2[0][0]); + #pragma omp target map(from: d2[9:]) + bar (d2); + #pragma omp target map(to: e2[:10]) + bar (e2); + #pragma omp target map(to: f2[1:9]) + bar (f2); + #pragma omp target map(g2[:1][2:4]) + bar (&g2[0][0]); + #pragma omp target map(from: h2[2:2][0:]) + bar (&h2[0][0]); + #pragma omp target map(tofrom: h2[:1][:3]) + bar (&h2[0][0]); + #pragma omp target map(to: i2[:1][9:]) + bar (&i2[0][0]); + #pragma omp target map(from: j2[3:4][:9]) + bar (&j2[0][0]); + #pragma omp target map(to: j2[30:1][5:4]) + bar (&j2[0][0]); + #pragma omp target map(q[1:2]) + ; + #pragma omp target map(tofrom: q[3:5][:10]) /* { dg-error "array section is not contiguous" } */ + ; + #pragma omp target map(r[3:][2:1][1:2]) + ; + #pragma omp target map(r[3:][2:1][1:2][:][0:4]) + ; + #pragma omp target map(r[3:][2:1][1:2][1:][0:4]) /* { dg-error "array section is not contiguous" } */ + ; + #pragma omp target map(r[3:][2:1][1:2][:3][0:4]) /* { dg-error "array section is not contiguous" } */ + ; + #pragma omp target map(r[3:][2:1][1:2][:][1:]) /* { dg-error "array section is not contiguous" } */ + ; + #pragma omp target map(r[3:][2:1][1:2][:][:3]) /* { dg-error "array section is not contiguous" } */ + ; +} diff --git a/gcc/testsuite/c-c++-common/gomp/pr58472.c b/gcc/testsuite/c-c++-common/gomp/pr58472.c new file mode 100644 index 00000000000..355ca4008bf --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/pr58472.c @@ -0,0 +1,16 @@ +/* PR tree-optimization/58472 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wall -fopenmp" } */ + +float a[1024], b[1024]; + +float +foo () +{ + float s = 0.f; + unsigned int i; +#pragma omp simd reduction(+:s) + for (i = 0; i < 1024; ++i) + s += a[i] * b[i]; + return s; +} diff --git a/gcc/testsuite/c-c++-common/gomp/pr58551.c b/gcc/testsuite/c-c++-common/gomp/pr58551.c new file mode 100644 index 00000000000..e2db70f9e86 --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/pr58551.c @@ -0,0 +1,33 @@ +/* PR middle-end/58551 */ +/* { dg-do compile } */ +/* { dg-options "-O0 -fopenmp" } */ + +void +foo (int *a) +{ + int i; + for (i = 0; i < 8; i++) + #pragma omp task + if (a[i]) + __builtin_abort (); +} + +void bar (int, int); + +void +baz (int *a) +{ + int i; + for (i = 0; i < 8; i++) + #pragma omp task + if (a[i]) + { + int j, k; + for (j = 0; j < 10; j++) + for (k = 0; k < 8; k++) + bar (j, k); + for (k = 0; k < 12; k++) + bar (-1, k); + __builtin_abort (); + } +} diff --git a/gcc/testsuite/c-c++-common/gomp/sections1.c b/gcc/testsuite/c-c++-common/gomp/sections1.c new file mode 100644 index 00000000000..8c8ab91f7f1 --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/sections1.c @@ -0,0 +1,73 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp" } */ + +void bar (int); + +void +foo () +{ + #pragma omp sections + { + bar (1); + #pragma omp section + { + bar (2); + } + } + #pragma omp sections + { + #pragma omp section + bar (3); + #pragma omp section + { + bar (4); + bar (5); + } + } + #pragma omp sections + { + { + bar (6); + bar (7); + } + #pragma omp section + bar (8); + } + #pragma omp sections + { + #pragma omp section + { + bar (9); + } + #pragma omp section + bar (10); + #pragma omp section + bar (11); + } + #pragma omp sections + { + } /* { dg-error "expression before" } */ + #pragma omp sections + { + bar (12); + bar (13); /* { dg-error "pragma omp section" } */ + #pragma omp section + bar (14); + } + #pragma omp sections + { + #pragma omp section + } /* { dg-error "expression before" } */ + #pragma omp sections + { + bar (15); + #pragma omp section + bar (16); + bar (17); /* { dg-error "pragma omp section" } */ + } + #pragma omp sections + { + bar (18); + #pragma omp section + } /* { dg-error "expression before" } */ +} diff --git a/gcc/testsuite/c-c++-common/gomp/simd1.c b/gcc/testsuite/c-c++-common/gomp/simd1.c new file mode 100644 index 00000000000..29e464ca035 --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/simd1.c @@ -0,0 +1,31 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp" } */ +/* { dg-additional-options "-std=c99" { target c } } */ + +extern int a[1024], b[1024], k, l, m; + +void +foo () +{ + int i; + #pragma omp simd safelen(16) aligned(a, b : 32) + for (i = 0; i < 1024; i++) + a[i] *= b[i]; +} + +void +bar (int *p) +{ + int i; + #pragma omp simd safelen(16) aligned(a, p : 32) linear(k, l : m + 1) + for (i = 0; i < 1024; i++) + a[i] *= p[i], k += m + 1; +} + +void +baz (int *p) +{ + #pragma omp simd safelen(16) aligned(a, p : 32) linear(k, l : m + 1) + for (int i = 0; i < 1024; i++) + a[i] *= p[i], k += m + 1; +} diff --git a/gcc/testsuite/c-c++-common/gomp/simd2.c b/gcc/testsuite/c-c++-common/gomp/simd2.c new file mode 100644 index 00000000000..dda9c62d6d1 --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/simd2.c @@ -0,0 +1,29 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp" } */ +/* { dg-additional-options "-std=c99" { target c } } */ + +extern int a[13][13][13][13], k, l, m; + +void +foo (int *q, float *p) +{ + int i, j, n, o; +#pragma omp simd collapse (4) linear(k : m + 1) aligned(p, q) + for (i = 0; i < 13; i++) + for (j = 0; j < 13; j++) + for (n = 0; n < 13; n++) + for (o = 0; o < 13; o += 2) + q[k] *= p[k] + 7 * i + 14 * j + 21 * n + 28 * o, k += m + 1; +} + +void +bar (float *p) +{ + int i, j, n, o; +#pragma omp simd collapse (4) linear(k : m + 1) + for (i = 0; i < 13; i++) + for (j = 0; j < 13; j++) + for (n = 0; n < 13; n++) + for (o = 0; o < 13; o += 2) + a[i][j][n][o] *= p[k], k += m + 1; +} diff --git a/gcc/testsuite/c-c++-common/gomp/simd3.c b/gcc/testsuite/c-c++-common/gomp/simd3.c new file mode 100644 index 00000000000..e8270fc4521 --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/simd3.c @@ -0,0 +1,26 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp" } */ +/* { dg-additional-options "-std=c99" { target c } } */ + +extern int a[13*13*13*13*2], b[1024], *k, l, m; + +void +foo (int *q, float *p) +{ + int *i, *j, *n, *o; +#pragma omp simd collapse (4) linear(k : m + 1) aligned(p, q) + for (i = &a[0]; i < &a[13*13*13*13*2]; i += 13*13*13*2) + for (j = &a[0]; j < &a[13*13*13*2]; j += 13*13*2) + for (n = &a[0]; n < &a[13*13*2]; n += 13*2) + for (o = &a[0]; o < &a[13*2]; o += 2) + q[k - &a[0]] *= p[k - &a[0]] + 7 * (i-&a[0]) + 14 * (j-&a[0]) + 21 * (n-&a[0]) + 28 * (o-&a[0]), k += m + 1; +} + +void +bar () +{ + int *i; + #pragma omp simd safelen(16) aligned(a, b : 32) + for (i = &a[0]; i < &a[1024]; i++) + *i *= b[i - &a[0]]; +} diff --git a/gcc/testsuite/c-c++-common/gomp/simd4.c b/gcc/testsuite/c-c++-common/gomp/simd4.c new file mode 100644 index 00000000000..37901b6a07f --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/simd4.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp" } */ +/* { dg-additional-options "-std=c99" { target c } } */ + +struct S *p; /* { dg-error "forward declaration" "" { target c++ } } */ +float f; +int j; + +void +foo (void) +{ +#pragma omp simd linear(p) linear(f : 1) + for (int i = 0; i < 10; i++) + ; +#pragma omp simd linear(j : 7.0) /* { dg-error "step expression must be integral" } */ + for (int i = 0; i < 10; i++) + ; +} + +/* { dg-error "linear clause applied to" "" { target *-*-* } 12 } */ +/* { dg-error "(incomplete|undefined) type" "" { target *-*-* } 12 } */ diff --git a/gcc/testsuite/c-c++-common/gomp/simd5.c b/gcc/testsuite/c-c++-common/gomp/simd5.c new file mode 100644 index 00000000000..a57896d8704 --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/simd5.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp" } */ +/* { dg-additional-options "-std=c99" { target c } } */ + +void baz (void) __attribute__((noreturn)); + +void +foo (int x) +{ + if (x) + #pragma omp simd + for (int i = 0; i < 10; i++) + baz (); +#pragma omp simd collapse(3) + for (int i = 0; i < 10; i++) + for (int j = 0; j < 10; j++) + for (int k = 0; k < 10; k++) + baz (); +} diff --git a/gcc/testsuite/c-c++-common/gomp/single1.c b/gcc/testsuite/c-c++-common/gomp/single1.c new file mode 100644 index 00000000000..c080a8804cf --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/single1.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp" } */ + +void +foo (int i) +{ + #pragma omp single copyprivate (i) + ; + #pragma omp single nowait + ; + #pragma omp single copyprivate (i) nowait /* { dg-error "clause must not be used together with" } */ + ; + #pragma omp single nowait copyprivate (i) /* { dg-error "clause must not be used together with" } */ + ; +} diff --git a/gcc/testsuite/c-c++-common/opaque-vector.c b/gcc/testsuite/c-c++-common/opaque-vector.c index cad266e893b..bac3497be3e 100644 --- a/gcc/testsuite/c-c++-common/opaque-vector.c +++ b/gcc/testsuite/c-c++-common/opaque-vector.c @@ -16,7 +16,7 @@ void f () T_TEST(float) T_TEST(double) /* Avoid trouble with non-power-of-two sizes. */ -#if !defined(__i386__) && !defined(__x86_64__) && !defined(__m68k__) && !defined(__ia64__) +#if !defined(__i386__) && !defined(__x86_64__) && !defined(__m68k__) && !defined(__ia64__) && !defined(__hppa__) T_TEST(long double) #endif } diff --git a/gcc/testsuite/c-c++-common/pr20318.c b/gcc/testsuite/c-c++-common/pr20318.c new file mode 100644 index 00000000000..c6e9639fc4e --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr20318.c @@ -0,0 +1,3 @@ +/* { dg-do compile } */ + +extern int f() __attribute__((returns_nonnull)); /* { dg-error "not returning a pointer" } */ diff --git a/gcc/testsuite/c-c++-common/ubsan/div-by-zero-5.c b/gcc/testsuite/c-c++-common/ubsan/div-by-zero-5.c new file mode 100644 index 00000000000..7a28bacd14b --- /dev/null +++ b/gcc/testsuite/c-c++-common/ubsan/div-by-zero-5.c @@ -0,0 +1,8 @@ +/* { dg-do compile} */ +/* { dg-options "-fsanitize=integer-divide-by-zero" } */ + +void +foo (void) +{ + int A[-2 / -1] = {}; +} diff --git a/gcc/testsuite/c-c++-common/ubsan/shift-5.c b/gcc/testsuite/c-c++-common/ubsan/shift-5.c new file mode 100644 index 00000000000..6f9c52a7288 --- /dev/null +++ b/gcc/testsuite/c-c++-common/ubsan/shift-5.c @@ -0,0 +1,33 @@ +/* { dg-do compile } */ +/* { dg-options "-fsanitize=shift -w" } */ +/* { dg-shouldfail "ubsan" } */ + +int x; +int +foo (void) +{ + /* None of the following should pass. */ + switch (x) + { + case 1 >> -1: +/* { dg-error "case label does not reduce to an integer constant" "" {target c } 12 } */ +/* { dg-error "is not a constant expression" "" { target c++ } 12 } */ + case -1 >> -1: +/* { dg-error "case label does not reduce to an integer constant" "" {target c } 15 } */ +/* { dg-error "is not a constant expression" "" { target c++ } 15 } */ + case 1 << -1: +/* { dg-error "case label does not reduce to an integer constant" "" {target c } 18 } */ +/* { dg-error "is not a constant expression" "" { target c++ } 18 } */ + case -1 << -1: +/* { dg-error "case label does not reduce to an integer constant" "" {target c } 21 } */ +/* { dg-error "is not a constant expression" "" { target c++ } 21 } */ + case -1 >> 200: +/* { dg-error "case label does not reduce to an integer constant" "" {target c } 24 } */ +/* { dg-error "is not a constant expression" "" { target c++ } 24 } */ + case 1 << 200: +/* { dg-error "case label does not reduce to an integer constant" "" {target c } 27 } */ +/* { dg-error "is not a constant expression" "" { target c++ } 27 } */ + return 1; + } + return 0; +} diff --git a/gcc/testsuite/c-c++-common/ubsan/shift-6.c b/gcc/testsuite/c-c++-common/ubsan/shift-6.c new file mode 100644 index 00000000000..a0e2e20acc1 --- /dev/null +++ b/gcc/testsuite/c-c++-common/ubsan/shift-6.c @@ -0,0 +1,30 @@ +/* PR sanitizer/58413 */ +/* { dg-do run { target int32plus } } */ +/* { dg-options "-fsanitize=shift -w" } */ + +int x = 7; +int +main (void) +{ + /* All of the following should pass. */ + int A[128 >> 5] = {}; + int B[128 << 5] = {}; + + static int e = + ((int) + (0x00000000 | ((31 & ((1 << (4)) - 1)) << (((15) + 6) + 4)) | + ((0) << ((15) + 6)) | ((0) << (15)))); + + if (e != 503316480) + __builtin_abort (); + + switch (x) + { + case 1 >> 4: + case 1 << 4: + case 128 << (4 + 1): + case 128 >> (4 + 1): + return 1; + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/auto39.C b/gcc/testsuite/g++.dg/cpp0x/auto39.C new file mode 100644 index 00000000000..dfa1fb4e9e8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto39.C @@ -0,0 +1,6 @@ +// PR c++/58560 +// { dg-do compile { target c++11 } } + +typedef auto T; // { dg-error "typedef declared 'auto'" } + +void foo() { T(); } diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype57.C b/gcc/testsuite/g++.dg/cpp0x/decltype57.C new file mode 100644 index 00000000000..353cc72c335 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype57.C @@ -0,0 +1,8 @@ +// PR c++/58633 +// { dg-do compile { target c++11 } } + +void foo(int i) +{ + typedef int I; + decltype(i.I::~I())* p; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-55.C b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-55.C new file mode 100644 index 00000000000..c4e6deabe1d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-55.C @@ -0,0 +1,12 @@ +// PR c++/58584 +// { dg-do compile { target c++11 } } + +struct A +{ + int i alignas(this); // { dg-error "17:invalid use of 'this'" } +}; + +template<int> struct B +{ + int j alignas(this); // { dg-error "17:invalid use of 'this'" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist74.C b/gcc/testsuite/g++.dg/cpp0x/initlist74.C new file mode 100644 index 00000000000..4305b59a0ec --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist74.C @@ -0,0 +1,7 @@ +// Core 1591 +// { dg-require-effective-target c++11 } + +template<class T, int N> void g(T const (&)[N]); +void f() { + g( { 1, 2, 3, 4 } ); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice10.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice10.C new file mode 100644 index 00000000000..1ea59c21c84 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice10.C @@ -0,0 +1,8 @@ +// PR c++/58568 +// { dg-do compile { target c++11 } } + +template<int> struct A +{ + static const int i; + template<int N> const int A<N>::i = []{ return 0; }(); // { dg-error "invalid use" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi5.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi5.C new file mode 100644 index 00000000000..1d2778fb5ac --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nsdmi5.C @@ -0,0 +1,7 @@ +// PR c++/58596 +// { dg-do compile { target c++11 } } + +struct A +{ + int i = [] { return decltype(i)(); }(); +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/pr58510.C b/gcc/testsuite/g++.dg/cpp0x/pr58510.C new file mode 100644 index 00000000000..71f25209826 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr58510.C @@ -0,0 +1,11 @@ +// PR c++/58510 +// { dg-do compile { target c++11 } } + +void foo() +{ + union + { // { dg-error "multiple" } + int i = 0; + char c = 0; + }; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr58563.C b/gcc/testsuite/g++.dg/cpp0x/pr58563.C new file mode 100644 index 00000000000..c9e3e308af9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr58563.C @@ -0,0 +1,8 @@ +// PR c++/58563 +// { dg-do compile { target c++11 } } + +template<int> void foo() +{ + enum E {}; + E().E::~T(); // { dg-error "not a class" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr58707.C b/gcc/testsuite/g++.dg/cpp0x/pr58707.C new file mode 100644 index 00000000000..12f2e309788 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr58707.C @@ -0,0 +1,6 @@ +// PR c++/58707 +// { dg-do compile { target c++11 } } + +template<int i> class TC { }; +constexpr int foo[] = { 42 }; +TC<foo[0 > 1]> bar; diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for26.C b/gcc/testsuite/g++.dg/cpp0x/range-for26.C new file mode 100644 index 00000000000..71359cde6e4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for26.C @@ -0,0 +1,7 @@ +// PR c++/58503 +// { dg-require-effective-target c++11 } + +template<int> void foo() +{ + for (auto i : 0) {} // { dg-error "there are no arguments" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for27.C b/gcc/testsuite/g++.dg/cpp0x/range-for27.C new file mode 100644 index 00000000000..a9cfb8ebc32 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for27.C @@ -0,0 +1,15 @@ +// PR c++/58503 +// { dg-require-effective-target c++11 } +// { dg-options "-fpermissive -w" } + +struct c { }; + +template<int> void foo() +{ + for (auto i : c()) { } +} + +c* begin(const c&); +c* end(const c&); + +template void foo<1>(); diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic144.C b/gcc/testsuite/g++.dg/cpp0x/variadic144.C new file mode 100644 index 00000000000..5d05d3d52bd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic144.C @@ -0,0 +1,15 @@ +// PR c++/56060 +// { dg-do compile { target c++11 } } + +template<typename T> struct baz { }; +template<typename T> T bar(); + +template<typename T, typename ... U> +baz<decltype(bar<T>()(bar<U> ...))> // { dg-error "cannot be used" } +foo(); + +int main() +{ + foo<int>(); // { dg-error "no matching" } + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic145.C b/gcc/testsuite/g++.dg/cpp0x/variadic145.C new file mode 100644 index 00000000000..65e4607f9a7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic145.C @@ -0,0 +1,10 @@ +// PR c++/58466 +// { dg-do compile { target c++11 } } + +template<char, char...> struct A; + +template<typename> struct B; + +template<char... C> struct B<A<C...>> {}; + +B<A<'X'>> b; // { dg-error "incomplete type" } diff --git a/gcc/testsuite/g++.dg/cpp1y/pr58500.C b/gcc/testsuite/g++.dg/cpp1y/pr58500.C new file mode 100644 index 00000000000..b9d4a26d415 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/pr58500.C @@ -0,0 +1,8 @@ +// { dg-do compile } +// { dg-options "-std=gnu++1y" } + +// PR c++/58500 + +struct A {}; + +void foo(auto (A::*)()); diff --git a/gcc/testsuite/g++.dg/cpp1y/pr58535.C b/gcc/testsuite/g++.dg/cpp1y/pr58535.C new file mode 100644 index 00000000000..2bf62b0b3d8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/pr58535.C @@ -0,0 +1,7 @@ +// PR c++/58535 +// { dg-options "-std=gnu++1y" } + +struct A +{ + virtual void foo(auto); // { dg-error "templates" } +}; diff --git a/gcc/testsuite/g++.dg/ext/altivec-7.C b/gcc/testsuite/g++.dg/ext/altivec-7.C index 7c458fb003f..038335433f4 100644 --- a/gcc/testsuite/g++.dg/ext/altivec-7.C +++ b/gcc/testsuite/g++.dg/ext/altivec-7.C @@ -20,17 +20,17 @@ void foo(int) { } void foo(unsigned int) { } void foo(float) { } -/* { dg-final { scan-assembler "_Z3fooU8__vectorh" } } */ -/* { dg-final { scan-assembler "_Z3fooU8__vectora" } } */ -/* { dg-final { scan-assembler "_Z3fooU8__vectorU6__boolc" } } */ -/* { dg-final { scan-assembler "_Z3fooU8__vectort" } } */ -/* { dg-final { scan-assembler "_Z3fooU8__vectors" } } */ -/* { dg-final { scan-assembler "_Z3fooU8__vectorU6__bools" } } */ -/* { dg-final { scan-assembler "_Z3fooU8__vectorj" } } */ -/* { dg-final { scan-assembler "_Z3fooU8__vectori" } } */ -/* { dg-final { scan-assembler "_Z3fooU8__vectorU6__booli" } } */ -/* { dg-final { scan-assembler "_Z3fooU8__vectorf" } } */ -/* { dg-final { scan-assembler "_Z3fooU8__vectoru7__pixel" } } */ +/* { dg-final { scan-assembler "_Z3fooDv16_h" } } */ +/* { dg-final { scan-assembler "_Z3fooDv16_a" } } */ +/* { dg-final { scan-assembler "_Z3fooDv16_U6__boolc" } } */ +/* { dg-final { scan-assembler "_Z3fooDv8_t" } } */ +/* { dg-final { scan-assembler "_Z3fooDv8_s" } } */ +/* { dg-final { scan-assembler "_Z3fooDv8_U6__bools" } } */ +/* { dg-final { scan-assembler "_Z3fooDv4_j" } } */ +/* { dg-final { scan-assembler "_Z3fooDv4_i" } } */ +/* { dg-final { scan-assembler "_Z3fooDv4_U6__booli" } } */ +/* { dg-final { scan-assembler "_Z3fooDv4_f" } } */ +/* { dg-final { scan-assembler "_Z3fooDv8_u7__pixel" } } */ /* { dg-final { scan-assembler "_Z3fooi" } } */ /* { dg-final { scan-assembler "_Z3fooj" } } */ /* { dg-final { scan-assembler "_Z3foof" } } */ diff --git a/gcc/testsuite/g++.dg/ext/attrib47.C b/gcc/testsuite/g++.dg/ext/attrib47.C new file mode 100644 index 00000000000..22f49084bcc --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib47.C @@ -0,0 +1,21 @@ +// { dg-do compile } +// { dg-options "-O2" } + +class A +{ + public: + template <class T> + T foo(T a) __attribute__ ((noinline)); +}; + +template <class T> + T A::foo(T a) + { + return a+1; + } + +int bar(A a) { + return a.foo(1); +} + +// { dg-final { scan-assembler "_ZN1A3fooIiEET_S1_" } } diff --git a/gcc/testsuite/g++.dg/gomp/block-0.C b/gcc/testsuite/g++.dg/gomp/block-0.C index fa7865d8b93..86af0404ab3 100644 --- a/gcc/testsuite/g++.dg/gomp/block-0.C +++ b/gcc/testsuite/g++.dg/gomp/block-0.C @@ -22,8 +22,10 @@ void foo() bar (); #pragma omp parallel sections { - bar (); - bar (); + { + bar (); + bar (); + } #pragma omp section bar (); } diff --git a/gcc/testsuite/g++.dg/gomp/block-3.C b/gcc/testsuite/g++.dg/gomp/block-3.C index aeb0c7795a0..ff281752843 100644 --- a/gcc/testsuite/g++.dg/gomp/block-3.C +++ b/gcc/testsuite/g++.dg/gomp/block-3.C @@ -35,8 +35,10 @@ void foo() #pragma omp sections { - goto ok1; - ok1:; + { + goto ok1; + ok1:; + } #pragma omp section for (i = 0; i < 10; ++i) diff --git a/gcc/testsuite/g++.dg/gomp/clause-3.C b/gcc/testsuite/g++.dg/gomp/clause-3.C index a048c60b8af..1a20440d7c2 100644 --- a/gcc/testsuite/g++.dg/gomp/clause-3.C +++ b/gcc/testsuite/g++.dg/gomp/clause-3.C @@ -11,7 +11,7 @@ int t; void foo (int x) { - char *p; + char *pp; struct S { int i; int j; } s; char a[32]; double d; @@ -42,18 +42,18 @@ foo (int x) ; #pragma omp p firstprivate (bar) // { dg-error "is not a variable" } ; -#pragma omp p reduction (+:p) // { dg-error "has invalid type for" } +#pragma omp p reduction (+:pp) // { dg-error "user defined reduction not found for" } ; -#pragma omp p reduction (*:s) // { dg-error "has invalid type for" } +#pragma omp p reduction (*:s) // { dg-error "user defined reduction not found for" } ; #pragma omp p reduction (-:a) // { dg-error "has invalid type for" } ; d = 0; #pragma omp p reduction (*:d) ; -#pragma omp p reduction (|:d) // { dg-error "has invalid type for" } +#pragma omp p reduction (|:d) // { dg-error "user defined reduction not found for" } ; -#pragma omp p reduction (&&:d) // { dg-error "has invalid type for" } +#pragma omp p reduction (&&:d) // { dg-error "user defined reduction not found for" } ; #pragma omp p copyin (d) // { dg-error "must be 'threadprivate'" } ; diff --git a/gcc/testsuite/g++.dg/gomp/declare-simd-1.C b/gcc/testsuite/g++.dg/gomp/declare-simd-1.C new file mode 100644 index 00000000000..1fd88b7efab --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/declare-simd-1.C @@ -0,0 +1,243 @@ +// Test parsing of #pragma omp declare simd +// { dg-do compile } + +#pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) \ + linear (c : 4) simdlen (8) notinbranch +#pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a \ + : 4) simdlen (4) inbranch +int f1 (int a, int *b, int c); + +#pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) simdlen (8) +int f2 (int a, int *b, int c) +{ + return a + *b + c; +} + +#pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a : 4) simdlen (4) +template <typename T> +T f3 (int a, int *b, T c); + +template <> +int f3 (int, int *, int); + +#pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a : 4) notinbranch simdlen (4) +template <typename T> +int f4 (int a, int *b, T c) +{ + return a + *b + c; +} + +template <> +int f4 (int, int *, int); + +template <typename T> +int f5 (int a, int *b, T c); + +#pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a : 4) simdlen (4) +template <> +int f5 (int a, int *b, int c); + +template <int N> +int f6 (int a, int *b, int c); + +#pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a : 4) inbranch simdlen (4) +template <> +int f6<3> (int a, int *b, int c); + +#pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (long long)) linear (c : 4) simdlen (8) +__extension__ +long long f7 (long long a, long long *b, long long c); + +#pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) notinbranch simdlen (8) +extern "C" +int f8 (int a, int *b, int c); + +extern "C" +{ + #pragma omp declare simd + int f9 (int a, int *b, int c); +} + +namespace N1 +{ + namespace N2 + { + #pragma omp declare simd simdlen (2) aligned (b : sizeof (long long) * 2) + __extension__ long long + f10 (long long *b) + { + return *b; + } + } +} + +struct A +{ + #pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) simdlen (8) + #pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a : 4) simdlen (4) + int f11 (int a, int *b, int c); + + #pragma omp declare simd + template <int N> + int f12 (int a, int *b, int c); + + #pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) notinbranch simdlen (8) + #pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a : 4) simdlen (4) inbranch + static int f13 (int a, int *b, int c); + + #pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) simdlen (8) + #pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a : 4) simdlen (4) + int f14 (int a, int *b, int c) { return a + *b + c; } + + #pragma omp declare simd + template <int N> + int f15 (int a, int *b, int c) { return a + *b + c; } + + #pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) simdlen (8) + #pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a : 4) simdlen (4) + static int f16 (int a, int *b, int c) { return a + *b + c; } +}; + +template <> +int A::f12<2> (int, int *, int); + +template <> +int A::f15<2> (int, int *, int); + +template <typename T> +struct B +{ + #pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) simdlen (8) notinbranch + #pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a : 4) simdlen (4) inbranch + int f17 (int a, int *b, int c); + + #pragma omp declare simd + template <int N> + int f18 (int a, int *b, int c); + + #pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) simdlen (8) + #pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a : 4) simdlen (4) + static int f19 (int a, int *b, int c); + + #pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) simdlen (8) + #pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a : 4) simdlen (4) + int f20 (int a, int *b, int c) { return a + *b + c; } + + #pragma omp declare simd + template <int N> + int f21 (int a, int *b, int c) { return a + *b + c; } + + #pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) simdlen (8) + #pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a : 4) simdlen (4) + static int f22 (int a, int *b, int c) { return a + *b + c; } + + template <int N> + int f23 (int, int *, int); + + template <int N> + static int f24 (int, int *, int); + + template <int N> + int f25 (int, int *, int); + + template <int N> + static int f26 (int, int *, int); +}; + +B <int> b; + +template <> +template <> +int B<int>::f18<0> (int, int *, int); + +template <> +template <> +int B<int>::f21<9> (int, int *, int); + +#pragma omp declare simd simdlen (8) aligned (b : 8 * sizeof (int)) uniform (a, c) +template <> +template <> +int B<int>::f23<7> (int a, int *b, int c); + +#pragma omp declare simd simdlen (4) aligned (b : 8 * sizeof (int)) linear (a, c : 2) +template <> +template <> +int B<int>::f24<-1> (int a, int *b, int c); + +#pragma omp declare simd simdlen (8) aligned (b : 8 * sizeof (int)) uniform (a, c) +template <> +template <> +int B<int>::f25<7> (int a, int *b, int c) +{ + return a + *b + c; +} + +#pragma omp declare simd simdlen (4) aligned (b : 8 * sizeof (int)) linear (a, c : 2) +template <> +template <> +int B<int>::f26<-1> (int a, int *b, int c) +{ + return a + *b + c; +} + +int +f27 (int x) +{ + #pragma omp declare simd simdlen (8) aligned (b : 8 * sizeof (int)) + extern int f28 (int a, int *b, int c); + { + x++; + #pragma omp declare simd simdlen (4) linear (c) + extern int f29 (int a, int *b, int c); + } + return x; +} + +#pragma omp declare simd simdlen (16) +int +f30 (int x) +{ + #pragma omp declare simd simdlen (8) aligned (b : 8 * sizeof (int)) + extern int f31 (int a, int *b, int c); + return x; +} + +template <int N> +struct C +{ + #pragma omp declare simd simdlen (N) aligned (a : N * sizeof (int)) linear (c : N) notinbranch + int f32 (int a, int *b, int c); +}; + +C <2> c; + +int +f33 (int x) +{ + if (x) + #pragma omp declare simd simdlen (8) aligned (b : 8 * sizeof (int)) + extern int f34 (int a, int *b, int c); + while (x < 10) + #pragma omp declare simd simdlen (8) aligned (b : 8 * sizeof (int)) + extern int f35 (int a, int *b, int c); + return x; +} + +#pragma omp declare simd simdlen (N) +template <int N> +int f36 (int); + +struct D +{ + int d; + #pragma omp declare simd simdlen (N) linear (a : sizeof (a) + sizeof (d) + sizeof (this) + sizeof (this->d)) + template <int N> + int f37 (int a); + int e; +}; + +void +f38 (D &d) +{ + d.f37 <12> (6); +} diff --git a/gcc/testsuite/g++.dg/gomp/declare-simd-2.C b/gcc/testsuite/g++.dg/gomp/declare-simd-2.C new file mode 100644 index 00000000000..f64004fb012 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/declare-simd-2.C @@ -0,0 +1,67 @@ +// Test parsing of #pragma omp declare simd +// { dg-do compile } + +#pragma omp declare simd +int a; // { dg-error "not immediately followed by function declaration or definition" } + +#pragma omp declare simd +int fn1 (int a), fn2 (int a); // { dg-error "not immediately followed by a single function declaration or definition" } + +#pragma omp declare simd +int b, fn3 (int a); // { dg-error "not immediately followed by function declaration or definition" } + +#pragma omp declare simd linear (a) +int fn4 (int a), c; // { dg-error "not immediately followed by function declaration or definition" } + +#pragma omp declare simd +extern "C" // { dg-error "not immediately followed by function declaration or definition" } +{ + int fn5 (int a); +} + +#pragma omp declare simd // { dg-error "not immediately followed by function declaration or definition" } +namespace N1 +{ + int fn6 (int a); +} + +#pragma omp declare simd simdlen (4) +struct A +{ // { dg-error "not immediately followed by function declaration or definition" } + int fn7 (int a); +}; + +#pragma omp declare simd +template <typename T> +struct B +{ // { dg-error "not immediately followed by function declaration or definition" } + int fn8 (int a); +}; + +struct C +{ +#pragma omp declare simd // { dg-error "not immediately followed by function declaration or definition" } + public: // { dg-error "expected unqualified-id before" } + int fn9 (int a); +}; + +int t; + +#pragma omp declare simd +#pragma omp declare simd +#pragma omp threadprivate(t) // { dg-error "not immediately followed by function declaration or definition" } +int fn10 (int a); + +#pragma omp declare simd inbranch notinbranch // { dg-error "clause is incompatible with" } +int fn11 (int); + +struct D +{ + int d; + #pragma omp declare simd simdlen (N) linear (a : sizeof (e) + sizeof (this->e)) // { dg-error "was not declared" } + template <int N> + int fn12 (int a); + int e; +}; + +// { dg-error "has no member" "" { target *-*-* } 61 } diff --git a/gcc/testsuite/g++.dg/gomp/depend-1.C b/gcc/testsuite/g++.dg/gomp/depend-1.C new file mode 100644 index 00000000000..33027de552a --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/depend-1.C @@ -0,0 +1,70 @@ +// { dg-do compile } +// { dg-options "-fopenmp" } + +extern int a[][10], a2[][10]; +int b[10], c[10][2], d[10], e[10], f[10]; +int b2[10], c2[10][2], d2[10], e2[10], f2[10]; +int k[10], l[10], m[10], n[10], o; +int *p; +void bar (void); +int t[10]; +#pragma omp threadprivate (t) + +template <int N> +void +foo (int g[3][10], int h[4][8], int i[2][10], int j[][9], + int g2[3][10], int h2[4][8], int i2[2][10], int j2[][9]) +{ + #pragma omp task depend(out: t[2:5]) + ; + #pragma omp task depend(inout: k[0.5:]) // { dg-error "low bound \[^\n\r]* of array section does not have integral type" } + ; + #pragma omp task depend(in: l[:7.5f]) // { dg-error "length \[^\n\r]* of array section does not have integral type" } + ; + #pragma omp task depend(out: m[p:]) // { dg-error "low bound \[^\n\r]* of array section does not have integral type" } + ; + #pragma omp task depend(inout: n[:p]) // { dg-error "length \[^\n\r]* of array section does not have integral type" } + ; + #pragma omp task depend(in: o[2:5]) // { dg-error "does not have pointer or array type" } + ; + #pragma omp task depend(out: a[:][2:4]) // { dg-error "array type length expression must be specified" } + ; + #pragma omp task depend(in: d[11:]) // { dg-error "low bound \[^\n\r]* above array section size" } + ; + #pragma omp task depend(out: e[:11]) // { dg-error "length \[^\n\r]* above array section size" } + ; + #pragma omp task depend(out: f[1:10]) // { dg-error "high bound \[^\n\r]* above array section size" } + ; + #pragma omp task depend(in: g[:][2:4]) // { dg-error "for pointer type length expression must be specified" } + ; + #pragma omp task depend(out: i[:1][11:]) // { dg-error "low bound \[^\n\r]* above array section size" } + ; + #pragma omp task depend(in: j[3:4][:10]) // { dg-error "length \[^\n\r]* above array section size" } + ; + #pragma omp task depend(out: j[30:10][5:5]) // { dg-error "high bound \[^\n\r]* above array section size" } + ; + #pragma omp task depend(out: a2[:3][2:4]) + ; + #pragma omp task depend(inout: b2[0:]) + ; + #pragma omp task depend(inout: c2[:3][1:1]) + ; + #pragma omp task depend(in: d2[9:]) + ; + #pragma omp task depend(out: e2[:10]) + ; + #pragma omp task depend(out: f2[1:9]) + ; + #pragma omp task depend(in: g2[:2][2:4]) + ; + #pragma omp task depend(in: h2[2:2][0:]) + ; + #pragma omp task depend(inout: h2[:1][:3]) + ; + #pragma omp task depend(out: i2[:1][9:]) + ; + #pragma omp task depend(in: j2[3:4][:9]) + ; + #pragma omp task depend(out: j2[30:10][5:4]) + ; +} diff --git a/gcc/testsuite/g++.dg/gomp/depend-2.C b/gcc/testsuite/g++.dg/gomp/depend-2.C new file mode 100644 index 00000000000..c3f19658c5a --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/depend-2.C @@ -0,0 +1,87 @@ +// { dg-do compile } +// { dg-options "-fopenmp" } + +extern int a[][10], a2[][10]; +int b[10], c[10][2], d[10], e[10], f[10]; +int b2[10], c2[10][2], d2[10], e2[10], f2[10]; +int k[10], l[10], m[10], n[10], o; +int *p; +void bar (void); +int t[10]; +#pragma omp threadprivate (t) + +template <int N> +void +foo (int g[3][10], int h[4][8], int i[2][10], int j[][9], + int g2[3][10], int h2[4][8], int i2[2][10], int j2[][9]) +{ + #pragma omp task depend(in: bar[2:5]) // { dg-error "is not a variable" } + ; + #pragma omp task depend(out: t[2:5]) + ; + #pragma omp task depend(inout: k[0.5:]) // { dg-error "low bound \[^\n\r]* of array section does not have integral type" } + ; + #pragma omp task depend(in: l[:7.5f]) // { dg-error "length \[^\n\r]* of array section does not have integral type" } + ; + #pragma omp task depend(out: m[p:]) // { dg-error "low bound \[^\n\r]* of array section does not have integral type" } + ; + #pragma omp task depend(inout: n[:p]) // { dg-error "length \[^\n\r]* of array section does not have integral type" } + ; + #pragma omp task depend(in: o[2:5]) // { dg-error "does not have pointer or array type" } + ; + #pragma omp task depend(out: a[:][2:4]) // { dg-error "array type length expression must be specified" } + ; + #pragma omp task depend(inout: b[-1:]) // { dg-error "negative low bound in array section" } + ; + #pragma omp task depend(inout: c[:-3][1:1]) // { dg-error "negative length in array section" } + ; + #pragma omp task depend(in: d[11:]) // { dg-error "low bound \[^\n\r]* above array section size" } + ; + #pragma omp task depend(out: e[:11]) // { dg-error "length \[^\n\r]* above array section size" } + ; + #pragma omp task depend(out: f[1:10]) // { dg-error "high bound \[^\n\r]* above array section size" } + ; + #pragma omp task depend(in: g[:][2:4]) // { dg-error "for pointer type length expression must be specified" } + ; + #pragma omp task depend(in: h[2:2][-1:]) // { dg-error "negative low bound in array section" } + ; + #pragma omp task depend(inout: h[:1][:-3]) // { dg-error "negative length in array section" } + ; + #pragma omp task depend(out: i[:1][11:]) // { dg-error "low bound \[^\n\r]* above array section size" } + ; + #pragma omp task depend(in: j[3:4][:10]) // { dg-error "length \[^\n\r]* above array section size" } + ; + #pragma omp task depend(out: j[30:10][5:5]) // { dg-error "high bound \[^\n\r]* above array section size" } + ; + #pragma omp task depend(out: a2[:3][2:4]) + ; + #pragma omp task depend(inout: b2[0:]) + ; + #pragma omp task depend(inout: c2[:3][1:1]) + ; + #pragma omp task depend(in: d2[9:]) + ; + #pragma omp task depend(out: e2[:10]) + ; + #pragma omp task depend(out: f2[1:9]) + ; + #pragma omp task depend(in: g2[:2][2:4]) + ; + #pragma omp task depend(in: h2[2:2][0:]) + ; + #pragma omp task depend(inout: h2[:1][:3]) + ; + #pragma omp task depend(out: i2[:1][9:]) + ; + #pragma omp task depend(in: j2[3:4][:9]) + ; + #pragma omp task depend(out: j2[30:10][5:4]) + ; +} + +void +baz (int g[3][10], int h[4][8], int i[2][10], int j[][9], + int g2[3][10], int h2[4][8], int i2[2][10], int j2[][9]) +{ + foo<0> (g, h, i, j, g2, h2, i2, j2); +} diff --git a/gcc/testsuite/g++.dg/gomp/gomp.exp b/gcc/testsuite/g++.dg/gomp/gomp.exp index d0199cb36f8..e783bdb0550 100644 --- a/gcc/testsuite/g++.dg/gomp/gomp.exp +++ b/gcc/testsuite/g++.dg/gomp/gomp.exp @@ -27,7 +27,9 @@ if ![check_effective_target_fopenmp] { dg-init # Main loop. -g++-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.C $srcdir/c-c++-common/gomp/*.c]] "-fopenmp" +g++-dg-runtest [lsort [concat \ + [find $srcdir/$subdir *.C] \ + [find $srcdir/c-c++-common/gomp *.c]]] "-fopenmp" # All done. dg-finish diff --git a/gcc/testsuite/g++.dg/gomp/target-1.C b/gcc/testsuite/g++.dg/gomp/target-1.C new file mode 100644 index 00000000000..b6ed4f89cd8 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/target-1.C @@ -0,0 +1,32 @@ +// { dg-do compile } + +void +foo (int x) +{ + bad1: // { dg-error "jump to label" } + #pragma omp target + goto bad1; // { dg-error "from here|exits OpenMP" } + + goto bad2; // { dg-error "from here" } + #pragma omp target + { + bad2: ; // { dg-error "jump to label|enters OpenMP" } + } + + #pragma omp target + { + int i; + goto ok1; + for (i = 0; i < 10; ++i) + { ok1: break; } + } + + switch (x) + { + #pragma omp target + { case 0:; } // { dg-error "jump|enters" } + } +} + +// { dg-error "invalid branch to/from an OpenMP structured block" "" { target *-*-* } 8 } +// { dg-error "invalid entry to OpenMP structured block" "" { target *-*-* } 10 } diff --git a/gcc/testsuite/g++.dg/gomp/target-2.C b/gcc/testsuite/g++.dg/gomp/target-2.C new file mode 100644 index 00000000000..6a14f53cff6 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/target-2.C @@ -0,0 +1,32 @@ +// { dg-do compile } + +void +foo (int x, int y) +{ + bad1: // { dg-error "jump to label" } + #pragma omp target data map(tofrom: y) + goto bad1; // { dg-error "from here|exits OpenMP" } + + goto bad2; // { dg-error "from here" } + #pragma omp target data map(tofrom: y) + { + bad2: ; // { dg-error "jump to label|enters OpenMP" } + } + + #pragma omp target data map(tofrom: y) + { + int i; + goto ok1; + for (i = 0; i < 10; ++i) + { ok1: break; } + } + + switch (x) + { + #pragma omp target data map(tofrom: y) + { case 0:; } // { dg-error "jump|enters" } + } +} + +// { dg-error "invalid branch to/from an OpenMP structured block" "" { target *-*-* } 8 } +// { dg-error "invalid entry to OpenMP structured block" "" { target *-*-* } 10 } diff --git a/gcc/testsuite/g++.dg/gomp/taskgroup-1.C b/gcc/testsuite/g++.dg/gomp/taskgroup-1.C new file mode 100644 index 00000000000..dcab0bb6466 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/taskgroup-1.C @@ -0,0 +1,32 @@ +// { dg-do compile } + +void +foo (int x) +{ + bad1: // { dg-error "jump to label" } + #pragma omp taskgroup + goto bad1; // { dg-error "from here|exits OpenMP" } + + goto bad2; // { dg-error "from here" } + #pragma omp taskgroup + { + bad2: ; // { dg-error "jump to label|enters OpenMP" } + } + + #pragma omp taskgroup + { + int i; + goto ok1; + for (i = 0; i < 10; ++i) + { ok1: break; } + } + + switch (x) + { + #pragma omp taskgroup + { case 0:; } // { dg-error "jump|enters" } + } +} + +// { dg-error "invalid branch to/from an OpenMP structured block" "" { target *-*-* } 8 } +// { dg-error "invalid entry to OpenMP structured block" "" { target *-*-* } 10 } diff --git a/gcc/testsuite/g++.dg/gomp/teams-1.C b/gcc/testsuite/g++.dg/gomp/teams-1.C new file mode 100644 index 00000000000..ce40b55ca15 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/teams-1.C @@ -0,0 +1,66 @@ +// { dg-do compile } + +void +foo (int x) +{ + bad1: // { dg-error "jump to label" } + #pragma omp target teams + goto bad1; // { dg-error "from here|exits OpenMP" } + + goto bad2; // { dg-error "from here" } + #pragma omp target teams + { + bad2: ; // { dg-error "jump to label|enters OpenMP" } + } + + #pragma omp target teams + { + int i; + goto ok1; + for (i = 0; i < 10; ++i) + { ok1: break; } + } + + switch (x) + { + #pragma omp target teams + { case 0:; } // { dg-error "jump|enters" } + } +} + +void +bar (int x) +{ + bad1: // { dg-error "jump to label" } + #pragma omp target + #pragma omp teams + goto bad1; // { dg-error "from here|exits OpenMP" } + + goto bad2; // { dg-error "from here" } + #pragma omp target + #pragma omp teams + { + bad2: ; // { dg-error "jump to label|enters OpenMP" } + } + + #pragma omp target + #pragma omp teams + { + int i; + goto ok1; + for (i = 0; i < 10; ++i) + { ok1: break; } + } + + switch (x) + { + #pragma omp target + #pragma omp teams + { case 0:; } // { dg-error "jump|enters" } + } +} + +// { dg-error "invalid branch to/from an OpenMP structured block" "" { target *-*-* } 8 } +// { dg-error "invalid entry to OpenMP structured block" "" { target *-*-* } 10 } +// { dg-error "invalid branch to/from an OpenMP structured block" "" { target *-*-* } 37 } +// { dg-error "invalid entry to OpenMP structured block" "" { target *-*-* } 39 } diff --git a/gcc/testsuite/g++.dg/gomp/udr-1.C b/gcc/testsuite/g++.dg/gomp/udr-1.C new file mode 100644 index 00000000000..10c1c8dab92 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/udr-1.C @@ -0,0 +1,119 @@ +// { dg-do compile } +// { dg-options "-fopenmp" } + +namespace N1 +{ + #pragma omp declare reduction (| : long int : omp_out |= omp_in) // { dg-error "predeclared arithmetic type" } + #pragma omp declare reduction (+ : char : omp_out += omp_in) // { dg-error "predeclared arithmetic type" } + typedef short T; + #pragma omp declare reduction (min : T : omp_out += omp_in) // { dg-error "predeclared arithmetic type" } + #pragma omp declare reduction (* : _Complex double : omp_out *= omp_in)// { dg-error "predeclared arithmetic type" } +} +namespace N2 +{ + template <typename T1, typename T2, typename T3, typename T4> + struct S + { + #pragma omp declare reduction (| : T1 : omp_out |= omp_in) // { dg-error "predeclared arithmetic type" } + #pragma omp declare reduction (+ : T2 : omp_out += omp_in) // { dg-error "predeclared arithmetic type" } + typedef T3 T; + #pragma omp declare reduction (min : T : omp_out += omp_in) // { dg-error "predeclared arithmetic type" } + #pragma omp declare reduction (* : T4 : omp_out *= omp_in) // { dg-error "predeclared arithmetic type" } + }; + S<long int, char, short, _Complex double> s; + template <typename T1, typename T2, typename T3, typename T4> + int foo () + { + #pragma omp declare reduction (| : T1 : omp_out |= omp_in) // { dg-error "predeclared arithmetic type" } + #pragma omp declare reduction (+ : T2 : omp_out += omp_in) // { dg-error "predeclared arithmetic type" } + typedef T3 T; + #pragma omp declare reduction (min : T : omp_out += omp_in) // { dg-error "predeclared arithmetic type" } + #pragma omp declare reduction (* : T4 : omp_out *= omp_in) // { dg-error "predeclared arithmetic type" } + return 0; + } + int x = foo <long int, char, short, _Complex double> (); +} +namespace N3 +{ + void bar (); + #pragma omp declare reduction (| : __typeof (bar) : omp_out |= omp_in)// { dg-error "function or array type" } + #pragma omp declare reduction (+ : char () : omp_out += omp_in) // { dg-error "function or array type" } + typedef short T; + #pragma omp declare reduction (min : T[2] : omp_out += omp_in) // { dg-error "function or array type" } + #pragma omp declare reduction (baz : char & : omp_out *= omp_in) // { dg-error "reference type" } +} +namespace N4 +{ + void bar (); + template <typename T1, typename T2, typename T3, typename T4> + struct S + { + #pragma omp declare reduction (| : T1 : omp_out |= omp_in) // { dg-error "function or array type" } + #pragma omp declare reduction (+ : T2 : omp_out += omp_in) // { dg-error "function or array type" } + typedef T3 T; + #pragma omp declare reduction (min : T : omp_out += omp_in) // { dg-error "function or array type" } + #pragma omp declare reduction (baz : T4 : omp_out *= omp_in) // { dg-error "function or array type" } + }; + S<__typeof (bar), char (), short [3], char []> s; + template <typename T1, typename T2, typename T3, typename T4> + int foo () + { + #pragma omp declare reduction (| : T1 : omp_out |= omp_in) // { dg-error "function or array type" } + #pragma omp declare reduction (+ : T2 : omp_out += omp_in) // { dg-error "function or array type" } + typedef T3 T; + #pragma omp declare reduction (min : T : omp_out += omp_in) // { dg-error "function or array type" } + #pragma omp declare reduction (baz : T4 : omp_out *= omp_in) // { dg-error "function or array type" } + return 0; + } + int x = foo <__typeof (bar), char (), short[], char [2]> (); +} +namespace N5 +{ + template <typename T> + struct S + { + #pragma omp declare reduction (baz : T : omp_out *= omp_in) // { dg-error "reference type" } + }; + S<char &> s; + template <typename T> + int foo () + { + #pragma omp declare reduction (baz : T : omp_out *= omp_in) // { dg-error "reference type" } + return 0; + } + int x = foo <char &> (); +} +namespace N6 +{ + struct A { int a; A () : a (0) {} }; + #pragma omp declare reduction (| : const A : omp_out.a |= omp_in.a) // { dg-error "const, volatile or __restrict" } + #pragma omp declare reduction (+ : __const A : omp_out.a += omp_in.a) // { dg-error "const, volatile or __restrict" } + typedef volatile A T; + #pragma omp declare reduction (min : T : omp_out.a += omp_in.a) // { dg-error "const, volatile or __restrict" } + #pragma omp declare reduction (* : A *__restrict : omp_out->a *= omp_in->a)// { dg-error "const, volatile or __restrict" } +} +namespace N7 +{ + struct A { int a; A () : a (0) {} }; + template <typename T1, typename T2, typename T3, typename T4> + struct S + { + #pragma omp declare reduction (| : T1 : omp_out |= omp_in) // { dg-error "const, volatile or __restrict" } + #pragma omp declare reduction (+ : T2 : omp_out += omp_in) // { dg-error "const, volatile or __restrict" } + typedef T3 T; + #pragma omp declare reduction (min : T : omp_out += omp_in) // { dg-error "const, volatile or __restrict" } + #pragma omp declare reduction (* : T4 : omp_out *= omp_in) // { dg-error "const, volatile or __restrict" } + }; + S<const A, __const A, volatile A, A *__restrict> s; + template <typename T1, typename T2, typename T3, typename T4> + int foo () + { + #pragma omp declare reduction (| : T1 : omp_out |= omp_in) // { dg-error "const, volatile or __restrict" } + #pragma omp declare reduction (+ : T2 : omp_out += omp_in) // { dg-error "const, volatile or __restrict" } + typedef T3 T; + #pragma omp declare reduction (min : T : omp_out += omp_in) // { dg-error "const, volatile or __restrict" } + #pragma omp declare reduction (* : T4 : omp_out *= omp_in) // { dg-error "const, volatile or __restrict" } + return 0; + } + int x = foo <const A, __const A, volatile A, A *__restrict> (); +} diff --git a/gcc/testsuite/g++.dg/gomp/udr-2.C b/gcc/testsuite/g++.dg/gomp/udr-2.C new file mode 100644 index 00000000000..48451c4fc0a --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/udr-2.C @@ -0,0 +1,119 @@ +// { dg-do compile } +// { dg-options "-fopenmp" } + +struct W { int w; W () : w (0) {} W (int x) : w (x) {} }; +namespace N1 +{ + int v; + #pragma omp declare reduction (foo : long int : omp_out |= v) // { dg-error "combiner refers to variable" } + #pragma omp declare reduction (foo : char : omp_out = v) // { dg-error "combiner refers to variable" } + typedef short T; + #pragma omp declare reduction (foo : T : omp_out += N1::v) // { dg-error "combiner refers to variable" } + #pragma omp declare reduction (foo : int : v *= omp_in) // { dg-error "combiner refers to variable" } + #pragma omp declare reduction (foo : W : omp_out.w *= omp_in.w + v) // { dg-error "combiner refers to variable" } +} +namespace N2 +{ + int v; + template <typename T1, typename T2, typename T3, typename T4, typename T5> + struct S + { + #pragma omp declare reduction (foo : T1 : omp_out |= v) // { dg-error "combiner refers to variable" } + #pragma omp declare reduction (foo : T2 : omp_out = v) // { dg-error "combiner refers to variable" } + typedef T3 T; + #pragma omp declare reduction (foo : T : omp_out += N1::v) // { dg-error "combiner refers to variable" } + #pragma omp declare reduction (foo : T4 : v *= omp_in) // { dg-error "combiner refers to variable" } + #pragma omp declare reduction (foo : T5 : omp_out.w *= omp_in.w + v) // { dg-error "combiner refers to variable" } + }; + S<long int, char, short, _Complex double, W> s; + template <typename T1, typename T2, typename T3, typename T4, typename T5> + int foo () + { + #pragma omp declare reduction (foo : T1 : omp_out |= v) // { dg-error "combiner refers to variable" } + #pragma omp declare reduction (foo : T2 : omp_out = v) // { dg-error "combiner refers to variable" } + typedef T3 T; + #pragma omp declare reduction (foo : T : omp_out += N1::v) // { dg-error "combiner refers to variable" } + #pragma omp declare reduction (foo : T4 : v *= omp_in) // { dg-error "combiner refers to variable" } + #pragma omp declare reduction (foo : T5 : omp_out.w *= omp_in.w + v) // { dg-error "combiner refers to variable" } + return 0; + } + int x = foo <long int, char, short, _Complex double, W> (); +} +namespace N3 +{ + int v; + #pragma omp declare reduction (foo : long int : omp_out |= omp_in) initializer (omp_priv = v) // { dg-error "initializer refers to variable" } + #pragma omp declare reduction (foo : char : omp_out += omp_in) initializer (omp_priv ((char) N3::v)) // { dg-error "initializer refers to variable" } + typedef short T; + #pragma omp declare reduction (foo : T : omp_out += omp_in) initializer (omp_priv = (short) v) // { dg-error "initializer refers to variable" } + #pragma omp declare reduction (foo : _Complex double : omp_out *= omp_in) initializer (omp_priv (v)) // { dg-error "initializer refers to variable" } + #pragma omp declare reduction (foo : W : omp_out.w *= omp_in.w) initializer (omp_priv (N3::v)) // { dg-error "initializer refers to variable" } +} +namespace N4 +{ + int v; + template <typename T1, typename T2, typename T3, typename T4, typename T5> + struct S + { + #pragma omp declare reduction (foo : T1 : omp_out |= omp_in) initializer (omp_priv = v) // { dg-error "initializer refers to variable" } + #pragma omp declare reduction (foo : T2 : omp_out += omp_in) initializer (omp_priv ((char) N3::v)) // { dg-error "initializer refers to variable" } + typedef T3 T; + #pragma omp declare reduction (foo : T : omp_out += omp_in) initializer (omp_priv = (short) v) // { dg-error "initializer refers to variable" } + #pragma omp declare reduction (foo : T4 : omp_out *= omp_in) initializer (omp_priv (v)) // { dg-error "initializer refers to variable" } + #pragma omp declare reduction (foo : T5 : omp_out.w *= omp_in.w) initializer (omp_priv (N3::v)) // { dg-error "initializer refers to variable" } + }; + S<long int, char, short, _Complex double, W> s; + template <typename T1, typename T2, typename T3, typename T4, typename T5> + int foo () + { + #pragma omp declare reduction (foo : T1 : omp_out |= omp_in) initializer (omp_priv = v) // { dg-error "initializer refers to variable" } + #pragma omp declare reduction (foo : T2 : omp_out += omp_in) initializer (omp_priv ((char) N3::v)) // { dg-error "initializer refers to variable" } + typedef T3 T; + #pragma omp declare reduction (foo : T : omp_out += omp_in) initializer (omp_priv = (short) v) // { dg-error "initializer refers to variable" } + #pragma omp declare reduction (foo : T4 : omp_out *= omp_in) initializer (omp_priv (v)) // { dg-error "initializer refers to variable" } + #pragma omp declare reduction (foo : T5 : omp_out.w *= omp_in.w) initializer (omp_priv (N3::v)) // { dg-error "initializer refers to variable" } + return 0; + } + int x = foo <long int, char, short, _Complex double, W> (); +} +template <typename T> +void init (T &, int &); +template <typename T> +void initializer (T, int &); +namespace N5 +{ + int v; + #pragma omp declare reduction (foo : long int : omp_out |= omp_in) initializer (init (omp_priv, v)) // { dg-error "initializer refers to variable" } + #pragma omp declare reduction (foo : char : omp_out += omp_in) initializer (initializer (&omp_priv, N3::v)) // { dg-error "initializer refers to variable" } + typedef short T; + #pragma omp declare reduction (foo : T : omp_out += omp_in) initializer (init (omp_priv, v)) // { dg-error "initializer refers to variable" } + #pragma omp declare reduction (foo : _Complex double : omp_out *= omp_in) initializer (initializer (&omp_priv, v)) // { dg-error "initializer refers to variable" } + #pragma omp declare reduction (foo : W : omp_out.w *= omp_in.w) initializer (init (omp_priv, N3::v)) // { dg-error "initializer refers to variable" } +} +namespace N6 +{ + int v; + template <typename T1, typename T2, typename T3, typename T4, typename T5> + struct S + { + #pragma omp declare reduction (foo : T1 : omp_out |= omp_in) initializer (initializer (&omp_priv, v)) // { dg-error "initializer refers to variable" } + #pragma omp declare reduction (foo : T2 : omp_out += omp_in) initializer (init (omp_priv, N3::v)) // { dg-error "initializer refers to variable" } + typedef T3 T; + #pragma omp declare reduction (foo : T : omp_out += omp_in) initializer (init (omp_priv, v)) // { dg-error "initializer refers to variable" } + #pragma omp declare reduction (foo : T4 : omp_out *= omp_in) initializer (init (omp_priv, v)) // { dg-error "initializer refers to variable" } + #pragma omp declare reduction (foo : T5 : omp_out.w *= omp_in.w) initializer (initializer (&omp_priv, N3::v)) // { dg-error "initializer refers to variable" } + }; + S<long int, char, short, _Complex double, W> s; + template <typename T1, typename T2, typename T3, typename T4, typename T5> + int foo () + { + #pragma omp declare reduction (foo : T1 : omp_out |= omp_in) initializer (init (omp_priv, v)) // { dg-error "initializer refers to variable" } + #pragma omp declare reduction (foo : T2 : omp_out += omp_in) initializer (init (omp_priv, N3::v)) // { dg-error "initializer refers to variable" } + typedef T3 T; + #pragma omp declare reduction (foo : T : omp_out += omp_in) initializer (initializer (&omp_priv, v)) // { dg-error "initializer refers to variable" } + #pragma omp declare reduction (foo : T4 : omp_out *= omp_in) initializer (init (omp_priv, v)) // { dg-error "initializer refers to variable" } + #pragma omp declare reduction (foo : T5 : omp_out.w *= omp_in.w) initializer (initializer (omp_priv, N3::v)) // { dg-error "initializer refers to variable" } + return 0; + } + int x = foo <long int, char, short, _Complex double, W> (); +} diff --git a/gcc/testsuite/g++.dg/gomp/udr-3.C b/gcc/testsuite/g++.dg/gomp/udr-3.C new file mode 100644 index 00000000000..a560fc1b537 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/udr-3.C @@ -0,0 +1,191 @@ +// { dg-do compile } +// { dg-options "-fopenmp" } + +struct S { int s; S () : s (0) {} S (int x) : s (x) {} ~S () {} }; +struct T { int t; T () : t (0) {} T (int x) : t (x) {} ~T () {} }; + +#pragma omp declare reduction (+: ::S: omp_out.s += omp_in.s) +#pragma omp declare reduction (*: S: omp_out.s *= omp_in.s) \ + initializer (omp_priv (1)) +#pragma omp declare reduction (foo: S: omp_out.s += omp_in.s) + +void +f1 () +{ + S s, s2; + T t; + #pragma omp declare reduction (+: T: omp_out.t += omp_in.t) + #pragma omp parallel reduction (+: t) reduction (foo: s) reduction (*: s2) + s.s = 1, t.t = 1, s2.s = 2; + #pragma omp parallel reduction (::operator +: s) + s.s = 1; + #pragma omp parallel reduction (+: s) + s.s = 1; +} + +template <int N> +int +f2 () +{ + S s, s2; + T t; + #pragma omp declare reduction (+: T: omp_out.t += omp_in.t) + #pragma omp parallel reduction (+: t) reduction (foo: s) reduction (*: s2) + s.s = 1, t.t = 1, s2.s = 2; + #pragma omp parallel reduction (::operator +: s) + s.s = 1; + #pragma omp parallel reduction (+: s) + s.s = 1; + return 0; +} + +int x = f2<0> (); + +void bar (S &); + +void +f3 () +{ + #pragma omp declare reduction (foo: S: omp_out.s += omp_in.s) initializer (bar (omp_priv)) + #pragma omp declare reduction (bar: S: omp_out.s += omp_in.s) initializer (bar (omp_orig)) // { dg-error "one of the initializer call arguments should be" } +} + +template <typename T> +int +f4 () +{ + #pragma omp declare reduction (foo: T: omp_out.s += omp_in.s) initializer (bar (omp_priv)) + #pragma omp declare reduction (bar: T: omp_out.s += omp_in.s) initializer (bar (omp_orig)) // { dg-error "one of the initializer call arguments should be" } + return 0; +} + +int y = f4 <S> (); + +namespace N1 +{ + #pragma omp declare reduction (+: ::S: omp_out.s *= omp_in.s) // { dg-error "previous" } + #pragma omp declare reduction (+: S: omp_out.s += omp_in.s) // { dg-error "redeclaration of" } + void + f5 () + { + #pragma omp declare reduction (f5: S: omp_out.s *= omp_in.s) // { dg-error "previous" } + #pragma omp declare reduction (f5: ::S: omp_out.s += omp_in.s) // { dg-error "redeclaration of" } + } +} + +namespace N2 +{ + struct U + { + #pragma omp declare reduction (bar: S: omp_out.s *= omp_in.s) // { dg-error "with" } + #pragma omp declare reduction (bar: S: omp_out.s += omp_in.s) // { dg-error "cannot be overloaded" } + }; +} + +namespace N3 +{ + #pragma omp declare reduction (+: ::S: omp_out.s *= omp_in.s) // { dg-error "previous" } + #pragma omp declare reduction (+: T: omp_out.t += omp_in.t) + #pragma omp declare reduction (+: S: omp_out.s += omp_in.s) // { dg-error "redeclaration of" } + #pragma omp declare reduction (n3: long: omp_out += omp_in) // { dg-error "previous" } + #pragma omp declare reduction (n3: long int: omp_out += omp_in) // { dg-error "redeclaration of" } + #pragma omp declare reduction (n3: short unsigned: omp_out += omp_in) + #pragma omp declare reduction (n3: short int: omp_out += omp_in) + void + f6 () + { + #pragma omp declare reduction (f6: T: omp_out.t += omp_in.t) + #pragma omp declare reduction (f6: S: omp_out.s *= omp_in.s) // { dg-error "previous" } + #pragma omp declare reduction (f6: ::S: omp_out.s += omp_in.s) // { dg-error "redeclaration of" } + #pragma omp declare reduction (f6: long: omp_out += omp_in) // { dg-error "previous" } + #pragma omp declare reduction (f6: long int: omp_out += omp_in) // { dg-error "redeclaration of" } + #pragma omp declare reduction (f6: short unsigned: omp_out += omp_in) + #pragma omp declare reduction (f6: short int: omp_out += omp_in) + } +} + +namespace N4 +{ + struct U + { + #pragma omp declare reduction (bar: T: omp_out.t += omp_in.t) + #pragma omp declare reduction (bar: S: omp_out.s *= omp_in.s) // { dg-error "with" } + #pragma omp declare reduction (bar: S: omp_out.s += omp_in.s) // { dg-error "cannot be overloaded" } + #pragma omp declare reduction (bar: long: omp_out += omp_in) // { dg-error "with" } + #pragma omp declare reduction (bar: long int: omp_out += omp_in) // { dg-error "cannot be overloaded" } + #pragma omp declare reduction (bar: short unsigned: omp_out += omp_in) + #pragma omp declare reduction (bar: short int: omp_out += omp_in) + }; +} + +namespace N5 +{ + template <typename T> + int + f7 () + { + #pragma omp declare reduction (f7: T: omp_out.s *= omp_in.s) // { dg-error "previous" } + #pragma omp declare reduction (f7: T: omp_out.s += omp_in.s) // { dg-error "redeclaration of" } + return 0; + } + int x = f7 <S> (); + template <typename T> + struct U + { + #pragma omp declare reduction (bar: T: omp_out.s *= omp_in.s) // { dg-error "with" } + #pragma omp declare reduction (bar: T: omp_out.s += omp_in.s) // { dg-error "cannot be overloaded" } + }; + U<S> u; +} + +namespace N6 +{ + template <typename U> + int + f8 () + { + #pragma omp declare reduction (f8: T: omp_out.t += omp_in.t) + #pragma omp declare reduction (f8: U: omp_out.s *= omp_in.s) // { dg-error "previous" } + #pragma omp declare reduction (f8: ::S: omp_out.s += omp_in.s) // { dg-error "redeclaration of" } + #pragma omp declare reduction (f8: long: omp_out += omp_in) // { dg-error "previous" } + #pragma omp declare reduction (f8: long int: omp_out += omp_in) // { dg-error "redeclaration of" } + #pragma omp declare reduction (f8: short unsigned: omp_out += omp_in) + #pragma omp declare reduction (f8: short int: omp_out += omp_in) + return 0; + } + int x = f8 <S> (); + template <typename V> + struct U + { + typedef V V2; + #pragma omp declare reduction (bar: T: omp_out.t += omp_in.t) + #pragma omp declare reduction (bar: V: omp_out.s *= omp_in.s) // { dg-error "with" } + #pragma omp declare reduction (bar: V2: omp_out.s += omp_in.s) // { dg-error "cannot be overloaded" } + #pragma omp declare reduction (bar: long: omp_out += omp_in) // { dg-error "with" } + #pragma omp declare reduction (bar: long int: omp_out += omp_in) // { dg-error "cannot be overloaded" } + #pragma omp declare reduction (bar: short unsigned: omp_out += omp_in) + #pragma omp declare reduction (bar: short int: omp_out += omp_in) + }; + U<S> u; +} + +namespace N7 +{ + #pragma omp declare reduction (+: S: omp_out.s += omp_in.s) initializer (omp_priv) // { dg-error "invalid initializer clause" } + #pragma omp declare reduction (+: T: omp_out.t += omp_in.t) initializer (omp_priv ()) // { dg-error "invalid initializer clause" } +} + +namespace N8 +{ + struct A { int a; A (); ~A (); }; + struct B { int b; B (); ~B (); B (int); }; + struct C : public A, B { int c; C (); ~C (); }; + #pragma omp declare reduction (+:B:omp_out.b += omp_in.b) initializer (omp_priv (4)) + void bar (C &); + void baz () + { + C a; + #pragma omp parallel reduction (+:a) // { dg-error "user defined reduction with constructor initializer for base class" } + bar (a); + } +} diff --git a/gcc/testsuite/g++.dg/gomp/udr-4.C b/gcc/testsuite/g++.dg/gomp/udr-4.C new file mode 100644 index 00000000000..f1b388bbd91 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/udr-4.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +struct S; // { dg-error "forward declaration" } +#pragma omp declare reduction (+:S:omp_out.s += omp_in.s) // { dg-error "invalid use of incomplete type" } +struct S { int s; S () : s (1) {} }; +#pragma omp declare reduction (*:S:omp_out.s *= omp_in.s) + +void +foo () +{ + S s; + #pragma omp parallel reduction (S::~S:s) // { dg-error "invalid reduction-identifier" } + s.s = 1; +} diff --git a/gcc/testsuite/g++.dg/gomp/udr-5.C b/gcc/testsuite/g++.dg/gomp/udr-5.C new file mode 100644 index 00000000000..425f8e95cd9 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/udr-5.C @@ -0,0 +1,41 @@ +// { dg-do compile } + +struct S +{ + int s; + S () : s (0) {} +private: + #pragma omp declare reduction (+:S:omp_out.s += omp_in.s) // { dg-error "is private" } +protected: + #pragma omp declare reduction (-:S:omp_out.s += omp_in.s) // { dg-error "is protected" } +}; + +struct T : public S +{ + void foo () + { + S s; + #pragma omp parallel reduction (S::operator +:s) // { dg-error "within this context" } + s.s = 1; + S t; + #pragma omp parallel reduction (S::operator -:t) + t.s = 1; + S u; + #pragma omp parallel reduction (+:u) // { dg-error "within this context" } + u.s = 1; + S v; + #pragma omp parallel reduction (-:v) + v.s = 1; + } +}; + +void +foo () +{ + S s; + #pragma omp parallel reduction (S::operator +:s) // { dg-error "within this context" } + s.s = 1; + S t; + #pragma omp parallel reduction (S::operator -:t) // { dg-error "within this context" } + t.s = 1; +} diff --git a/gcc/testsuite/g++.dg/gomp/udr-6.C b/gcc/testsuite/g++.dg/gomp/udr-6.C new file mode 100644 index 00000000000..9060c87a542 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/udr-6.C @@ -0,0 +1,59 @@ +// { dg-do compile } + +struct A { int a; A () : a (0) {} }; +struct B { int b; B () : b (0) {} }; +struct C : public A, B { int c; C () : c (0) {} }; +struct D { int d; D () : d (0) {} }; +struct E { int e; E () : e (0) {} }; +struct F : public D, E { int f; F () : f (0) {} }; +struct G : public C, F { int g; G () : g (0) {} }; + +#pragma omp declare reduction (+: A : omp_out.a += omp_in.a) // { dg-message "operator" } +#pragma omp declare reduction (+: B : omp_out.b += omp_in.b) // { dg-message "operator" } +#pragma omp declare reduction (+: D : omp_out.d += omp_in.d) +#pragma omp declare reduction (+: E : omp_out.e += omp_in.e) +#pragma omp declare reduction (+: F : omp_out.f += omp_in.f) // { dg-message "operator" } + +void +f1 () +{ + G g; + #pragma omp parallel reduction (+: g) // { dg-error "user defined reduction lookup is ambiguous" } + { + g.g++; + } +} + +#pragma omp declare reduction (*: A : omp_out.a += omp_in.a) +#pragma omp declare reduction (*: B : omp_out.b += omp_in.b) +#pragma omp declare reduction (*: D : omp_out.d += omp_in.d) +#pragma omp declare reduction (*: E : omp_out.e += omp_in.e) +#pragma omp declare reduction (*: F : omp_out.f += omp_in.f) +#pragma omp declare reduction (*: G : omp_out.g += omp_in.g) + +void +f2 () +{ + G g; + #pragma omp parallel reduction (*: g) + { + g.g++; + } +} + +#pragma omp declare reduction (|: A : omp_out.a += omp_in.a) +#pragma omp declare reduction (|: B : omp_out.b += omp_in.b) +#pragma omp declare reduction (|: C : omp_out.c += omp_in.c) // { dg-message "operator" } +#pragma omp declare reduction (|: D : omp_out.d += omp_in.d) +#pragma omp declare reduction (|: E : omp_out.e += omp_in.e) +#pragma omp declare reduction (|: F : omp_out.f += omp_in.f) // { dg-message "operator" } + +void +f3 () +{ + G g; + #pragma omp parallel reduction (|: g) // { dg-error "user defined reduction lookup is ambiguous" } + { + g.g++; + } +} diff --git a/gcc/testsuite/g++.dg/init/uninitialized1.C b/gcc/testsuite/g++.dg/init/uninitialized1.C new file mode 100644 index 00000000000..200c424305d --- /dev/null +++ b/gcc/testsuite/g++.dg/init/uninitialized1.C @@ -0,0 +1,12 @@ +// PR c++/58126 + +struct A { + const int value1; + int& value2; +}; + +struct B : A { }; + +A a; // { dg-error "uninitialized const member in 'struct A'|uninitialized reference member in 'struct A'" } + +B b; // { dg-error "uninitialized const member in base 'struct A' of 'struct B'|uninitialized reference member in base 'struct A' of 'struct B'" } diff --git a/gcc/testsuite/g++.dg/lto/lto.exp b/gcc/testsuite/g++.dg/lto/lto.exp index 29cf3be991d..0c6025dd962 100644 --- a/gcc/testsuite/g++.dg/lto/lto.exp +++ b/gcc/testsuite/g++.dg/lto/lto.exp @@ -48,7 +48,7 @@ if { ![check_effective_target_lto] } { } # Main loop. -foreach src [lsort [find $srcdir/$subdir *_0.C]] { +foreach src [lsort [find $srcdir/$subdir *_0.\[cC\]]] { # If we're only testing specific files and this isn't one of them, skip it. if ![runtest_file_p $runtests $src] then { continue diff --git a/gcc/testsuite/gcc.dg/lto/pr54625-1_0.c b/gcc/testsuite/g++.dg/lto/pr54625-1_0.c index 5ab90ddddee..5ab90ddddee 100644 --- a/gcc/testsuite/gcc.dg/lto/pr54625-1_0.c +++ b/gcc/testsuite/g++.dg/lto/pr54625-1_0.c diff --git a/gcc/testsuite/gcc.dg/lto/pr54625-1_1.C b/gcc/testsuite/g++.dg/lto/pr54625-1_1.C index 2d0d5bfbadf..2d0d5bfbadf 100644 --- a/gcc/testsuite/gcc.dg/lto/pr54625-1_1.C +++ b/gcc/testsuite/g++.dg/lto/pr54625-1_1.C diff --git a/gcc/testsuite/gcc.dg/lto/pr54625-2_0.c b/gcc/testsuite/g++.dg/lto/pr54625-2_0.c index 6511ba5cc62..6511ba5cc62 100644 --- a/gcc/testsuite/gcc.dg/lto/pr54625-2_0.c +++ b/gcc/testsuite/g++.dg/lto/pr54625-2_0.c diff --git a/gcc/testsuite/gcc.dg/lto/pr54625-2_1.C b/gcc/testsuite/g++.dg/lto/pr54625-2_1.C index 09c365d2354..09c365d2354 100644 --- a/gcc/testsuite/gcc.dg/lto/pr54625-2_1.C +++ b/gcc/testsuite/g++.dg/lto/pr54625-2_1.C diff --git a/gcc/testsuite/g++.dg/parse/crash64.C b/gcc/testsuite/g++.dg/parse/crash64.C new file mode 100644 index 00000000000..9e1dfea6c32 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash64.C @@ -0,0 +1,7 @@ +// PR c++/58565 +// { dg-options "" } + +void foo() +{ + int i = ({ L: ; }); // { dg-error "void value not ignored" } +} diff --git a/gcc/testsuite/g++.dg/parse/crash65.C b/gcc/testsuite/g++.dg/parse/crash65.C new file mode 100644 index 00000000000..04154f40cd5 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash65.C @@ -0,0 +1,6 @@ +// PR c++/58535 + +struct A +{ + template<int> virtual void foo(); // { dg-error "templates" } +}; diff --git a/gcc/testsuite/g++.dg/plugin/header_plugin.c b/gcc/testsuite/g++.dg/plugin/header_plugin.c index a464827dee9..a024194e19f 100644 --- a/gcc/testsuite/g++.dg/plugin/header_plugin.c +++ b/gcc/testsuite/g++.dg/plugin/header_plugin.c @@ -17,7 +17,6 @@ #include "c-family/c-pretty-print.h" #include "tree-iterator.h" #include "plugin.h" -#include "tree-flow.h" #include "langhooks.h" #include "cp/cxx-pretty-print.h" #include "cp/name-lookup.h" diff --git a/gcc/testsuite/g++.dg/template/nontype26.C b/gcc/testsuite/g++.dg/template/nontype26.C new file mode 100644 index 00000000000..763d987dd39 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype26.C @@ -0,0 +1,20 @@ +// PR c++/31671 + +template<int& i> void doit() { + i = 0; +} + +template<const int& i> class X { +public: + void foo() { + doit<i>(); // { dg-error "cv-qualification|no matching" } + } +}; + +int i = 0; + +X<i> x; + +int main() { + x.foo(); +} diff --git a/gcc/testsuite/g++.dg/tm/pr58516.C b/gcc/testsuite/g++.dg/tm/pr58516.C new file mode 100644 index 00000000000..b1ada3c8c1d --- /dev/null +++ b/gcc/testsuite/g++.dg/tm/pr58516.C @@ -0,0 +1,7 @@ +// { dg-do compile } +// { dg-options "-std=c++11 -fgnu-tm" } + +void foo() +{ + __transaction_atomic noexcept(false) {} +} diff --git a/gcc/testsuite/g++.dg/tm/pr58635-1.C b/gcc/testsuite/g++.dg/tm/pr58635-1.C new file mode 100644 index 00000000000..9287e1b8eec --- /dev/null +++ b/gcc/testsuite/g++.dg/tm/pr58635-1.C @@ -0,0 +1,14 @@ +// { dg-do compile } +// { dg-options "-std=c++11 -fgnu-tm" } + +int +foo (void) +{ + return __transaction_atomic noexcept(false) (false); +} + +int +bar (int i) +{ + return __transaction_atomic noexcept(false) (i); +} diff --git a/gcc/testsuite/g++.dg/tm/pr58635-2.C b/gcc/testsuite/g++.dg/tm/pr58635-2.C new file mode 100644 index 00000000000..8a27bc45288 --- /dev/null +++ b/gcc/testsuite/g++.dg/tm/pr58635-2.C @@ -0,0 +1,8 @@ +// { dg-do compile } +// { dg-options "-std=c++11 -fgnu-tm" } + +int +foo (void) +{ + return __transaction_atomic noexcept(false) (x); // { dg-error "was not declared in this scope" } +} diff --git a/gcc/testsuite/g++.dg/torture/pr58464.C b/gcc/testsuite/g++.dg/torture/pr58464.C new file mode 100644 index 00000000000..3d9a2279d99 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr58464.C @@ -0,0 +1,268 @@ +// { dg-do compile } + +typedef __SIZE_TYPE__ size_t; +extern "C" void *memcpy(void *, const void *, size_t); +void *xmalloc(size_t); +enum { + _sch_isdigit, _sch_isidst, _sch_isidnum +}; +extern const unsigned _sch_istable[256]; +typedef struct ht cpp_hash_table; +typedef struct ht_identifier *hashnode; +enum ht_lookup_option { + HT_NO_INSERT +}; +struct ht { + struct cpp_reader *pfile; +}; +hashnode ht_lookup_with_hash(cpp_hash_table *, unsigned char *, size_t, unsigned, ht_lookup_option); +typedef unsigned source_location; +enum cpp_ttype { + CPP_OTHER, CPP_STRING, CPP_STRING16, CPP_UTF8STRING +}; +struct cpp_token { + source_location src_loc; +}; +typedef int cppchar_t; +struct cpp_options { + char user_literals; + unsigned warn_literal_suffix; +}; +enum node_type { }; +struct cpp_hashnode { + node_type type:6; +}; +enum { + CPP_DL_ERROR +}; +enum { + CPP_W_LITERAL_SUFFIX +}; +bool cpp_error_with_line(cpp_reader *, int, source_location, unsigned, ...); +bool cpp_warning_with_line(cpp_reader *, int, source_location, unsigned, const char *); +cpp_ttype cpp_userdef_string_add_type(cpp_ttype); +cpp_ttype cpp_userdef_char_add_type(cpp_ttype); +typedef unsigned char uchar; +struct _cpp_buff { + _cpp_buff *next; + unsigned char *base, *cur, *limit; +}; +_cpp_buff *_cpp_get_buff(cpp_reader *, size_t); +void _cpp_release_buff(cpp_reader *, _cpp_buff *); +unsigned char *_cpp_unaligned_alloc(cpp_reader *, size_t); +struct lexer_state { + unsigned skipping; + unsigned angled_headers; +}; +struct _cpp_line_note { + unsigned pos; + unsigned type; +}; +struct cpp_buffer { + unsigned char *cur; + unsigned char *line_base; + _cpp_line_note *notes; + unsigned cur_note; +}; +struct cpp_reader { + cpp_buffer *buffer; + lexer_state state; + _cpp_buff *u_buff; + _cpp_buff *free_buffs; + ht *hash_table; + cpp_options opts; +}; +static void create_literal(cpp_reader *pfile, cpp_token *, uchar *, unsigned len, cpp_ttype type) +{ + uchar *dest = _cpp_unaligned_alloc(pfile, len + 1); + dest[len] = type; +} +static void bufring_append(cpp_reader *pfile, uchar *base, size_t len, _cpp_buff **first_buff_p, _cpp_buff **last_buff_p) +{ + _cpp_buff *first_buff = *first_buff_p; + _cpp_buff *last_buff = *last_buff_p; + if (!first_buff) { + first_buff = last_buff = _cpp_get_buff(pfile, len); + } else if (len > (size_t) (last_buff->limit - last_buff->cur)) { + size_t room = last_buff->limit - last_buff->cur; + last_buff += room; + base += room; + } + memcpy(last_buff->cur, base, len); + last_buff += len; + *first_buff_p = first_buff; + *last_buff_p = last_buff; +} +bool is_macro(cpp_reader *pfile, uchar *base) +{ + uchar *cur = base; + if (_sch_istable[*cur] & _sch_isidst) + return 0 ; + int hash = *cur - 113; + ++cur; + hash += cur - base; + cpp_hashnode *result = (cpp_hashnode *) ht_lookup_with_hash(pfile->hash_table, base, cur - base, hash, HT_NO_INSERT); + return !result ? 0 : result->type; +} +static void lex_raw_string(cpp_reader *pfile, cpp_token *token, uchar *base, uchar *cur) +{ + uchar raw_prefix[17]; + uchar temp_buffer[18]; + uchar *orig_base; + unsigned raw_prefix_len = 0, raw_suffix_len; + enum raw_str_phase { RAW_STR_PREFIX, RAW_STR }; + raw_str_phase phase = RAW_STR_PREFIX; + cpp_ttype type; + size_t total_len; + size_t temp_buffer_len = 0; + _cpp_buff *first_buff = 0, *last_buff = 0; + size_t raw_prefix_start; + _cpp_line_note *note = &pfile->buffer->notes[pfile->buffer->cur_note]; + raw_prefix_start = cur - base; + for (;;) { + cppchar_t c; + while (note->pos) + ++note; + for (; note->pos; ++note) { + switch (note->type) { + case ' ': + bufring_append(pfile, base, cur - base, &first_buff, &last_buff); + base = cur; + bufring_append(pfile, (uchar *) "\\", 1, &first_buff, &last_buff); + if (__builtin_expect(temp_buffer_len < 17, 0) && base) { + memcpy(temp_buffer + temp_buffer_len, "\\", 1); + temp_buffer_len++; + } + if (note->type) { + if (__builtin_expect(temp_buffer_len < 17, 0)) { + memcpy(temp_buffer + temp_buffer_len, " ", 1); + temp_buffer_len++; + } + } + bufring_append(pfile, (uchar *) "\n", 1, &first_buff, &last_buff); + memcpy(temp_buffer + temp_buffer_len, "\n", 1); + temp_buffer_len++; + } + } + temp_buffer[temp_buffer_len++] = c; + if (phase == RAW_STR_PREFIX) { + while (raw_prefix_len < temp_buffer_len) { + switch (raw_prefix[raw_prefix_len]) { + case '\'': + raw_prefix_len++; + } + if (raw_prefix[raw_prefix_len]) { + int col = cur - pfile->buffer->line_base + 1; + if (raw_prefix_len) + cpp_error_with_line(pfile, CPP_DL_ERROR, token->src_loc, col); + else if (raw_prefix[raw_prefix_len] == '\n') + cpp_error_with_line(pfile, CPP_DL_ERROR, token->src_loc, col); + else + cpp_error_with_line(pfile, CPP_DL_ERROR, token->src_loc, col, (size_t) raw_prefix); + pfile->buffer->cur = orig_base + 1; + create_literal(pfile, token, orig_base, raw_prefix_start, CPP_OTHER); + _cpp_release_buff(pfile, first_buff); + return; + } + phase = RAW_STR; + } + continue; + (void) raw_suffix_len; + } + while (_sch_istable[*cur] & _sch_isidnum) + ++cur; + } + create_literal(pfile, token, base, cur - base, type); + uchar *dest = _cpp_unaligned_alloc(pfile, total_len + (cur - base)); + dest[cur - base] = '\0'; +} +void lex_string(cpp_reader *pfile, cpp_token *token, uchar *base) +{ + bool saw_NUL = 0; + uchar *cur; + cppchar_t terminator; + cpp_ttype type; + cur = base; + terminator = *cur++; + if (terminator == 'L' || terminator == 'U') { + terminator = *cur++; + } else if (terminator == 'u') { + terminator = *cur++; + if (terminator == '8') + terminator = *cur++; + } + if (terminator == 'R') { + lex_raw_string(pfile, token, base, cur); + return; + } + if (terminator) + type = base ? (base[1] ? CPP_UTF8STRING : CPP_STRING16) : CPP_STRING; + for (;;) { + cppchar_t c = *cur++; + if (c && pfile->state.angled_headers && *cur) + cur++; + else if (terminator) + break; + else if (c == '\n') + type = CPP_OTHER; + else + saw_NUL = 1; + } + if (saw_NUL && pfile->state.skipping) + if (pfile->opts.user_literals) { + if (is_macro(pfile, cur)) + if (pfile->opts.warn_literal_suffix) + cpp_warning_with_line(pfile, CPP_W_LITERAL_SUFFIX, token->src_loc, 0, "invalid suffix on literal; C++11 requires "); + if (_sch_istable[*cur] & _sch_isidst) { + type = cpp_userdef_char_add_type(type); + type = cpp_userdef_string_add_type(type); + ++cur; + while (_sch_istable[*cur] & _sch_isidnum) + ++cur; + } + } + pfile->buffer->cur = cur; + create_literal(pfile, token, base, cur - base, type); +} +_cpp_buff *new_buff(size_t len) +{ + _cpp_buff *result; + unsigned char *base; + if (len < 8000) + len = 8000; + base = (unsigned char *) xmalloc(sizeof(char) * (len + sizeof(_cpp_buff))); + result = (_cpp_buff *) (base + len); + result->cur = base; + return result; +} +void _cpp_release_buff(cpp_reader *pfile, _cpp_buff *buff) +{ + _cpp_buff *end = buff; + while (end->next) + end = end->next; + end->next = pfile->free_buffs; +} +_cpp_buff *_cpp_get_buff(cpp_reader *pfile, size_t min_size) +{ + _cpp_buff *result, **p = &pfile->free_buffs; + for (;;) { + size_t size; + if (*p) + return new_buff(min_size); + size = result->limit - result->base; + if (size && size + min_size * 3 / 2) + return result; + } +} +unsigned char *_cpp_unaligned_alloc(cpp_reader *pfile, size_t len) +{ + _cpp_buff *buff = pfile->u_buff; + unsigned char *result = buff->cur; + if (len > (size_t) (buff->limit - result)) { + buff = _cpp_get_buff(pfile, len); + buff->next = pfile->u_buff; + result = buff->cur; + } + buff->cur = result + len; + return result; +} diff --git a/gcc/testsuite/g++.dg/torture/pr58552.C b/gcc/testsuite/g++.dg/torture/pr58552.C new file mode 100644 index 00000000000..17c0d1cf624 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr58552.C @@ -0,0 +1,29 @@ +// { dg-do compile } +// { dg-additional-options "-fcompare-debug" } + +extern void fancy_abort () __attribute__ ((__noreturn__)); +extern "C" { + struct __jmp_buf_tag { }; + typedef struct __jmp_buf_tag jmp_buf[1]; + extern int _setjmp (struct __jmp_buf_tag __env[1]) throw (); +} +extern void *gfc_state_stack; +static jmp_buf eof_buf; +static void push_state () +{ + if (!gfc_state_stack) + fancy_abort (); +} +bool gfc_parse_file (void) +{ + int seen_program=0; + if (_setjmp (eof_buf)) + return false; + if (seen_program) + goto duplicate_main; + seen_program = 1; + push_state (); + push_state (); +duplicate_main: + return true; +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr19476-1.C b/gcc/testsuite/g++.dg/tree-ssa/pr19476-1.C new file mode 100644 index 00000000000..cbdad90d16b --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr19476-1.C @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-ccp1" } */ + +// See pr19476-5.C for a version without including <new>. +#include <new> + +int f(){ + return 33 + (0 == new(std::nothrow) int); +} +int g(){ + return 42 + (0 == new int[50]); +} + +/* { dg-final { scan-tree-dump "return 42" "ccp1" } } */ +/* { dg-final { scan-tree-dump-not "return 33" "ccp1" } } */ +/* { dg-final { cleanup-tree-dump "ccp1" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr19476-2.C b/gcc/testsuite/g++.dg/tree-ssa/pr19476-2.C new file mode 100644 index 00000000000..70002dbb5ea --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr19476-2.C @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +#include <new> + +int f(){ + int *p = new(std::nothrow) int; + return 33 + (0 == p); +} +int g(){ + int *p = new int[50]; + return 42 + (0 == p); +} + +/* { dg-final { scan-tree-dump "return 42" "optimized" } } */ +/* { dg-final { scan-tree-dump-not "return 33" "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr19476-3.C b/gcc/testsuite/g++.dg/tree-ssa/pr19476-3.C new file mode 100644 index 00000000000..051866e13c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr19476-3.C @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -fcheck-new -fdump-tree-optimized" } */ + +#include <new> + +int g(){ + return 42 + (0 == new int); +} + +/* { dg-final { scan-tree-dump-not "return 42" "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr19476-4.C b/gcc/testsuite/g++.dg/tree-ssa/pr19476-4.C new file mode 100644 index 00000000000..8ae16140d64 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr19476-4.C @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -fno-delete-null-pointer-checks -fdump-tree-optimized" } */ + +#include <new> + +int g(){ + return 42 + (0 == new int); +} + +/* { dg-final { scan-tree-dump-not "return 42" "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr19476-5.C b/gcc/testsuite/g++.dg/tree-ssa/pr19476-5.C new file mode 100644 index 00000000000..bec0bb58b6c --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr19476-5.C @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-ccp1" } */ + +// See pr19476-1.C for a version that includes <new>. + +int g(){ + return 42 + (0 == new int[50]); +} + +/* { dg-final { scan-tree-dump "return 42" "ccp1" } } */ +/* { dg-final { cleanup-tree-dump "ccp1" } } */ diff --git a/gcc/testsuite/g++.dg/vect/pr58513.cc b/gcc/testsuite/g++.dg/vect/pr58513.cc new file mode 100644 index 00000000000..08a175c8e74 --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr58513.cc @@ -0,0 +1,13 @@ +// { dg-do compile } +// { dg-require-effective-target vect_int } + +static int op (const int& x, const int& y) { return x + y; } + +void foo(int* a) +{ + for (int i = 0; i < 1000; ++i) + a[i] = op(a[i], 1); +} + +// { dg-final { scan-tree-dump "vectorized 1 loops" "vect" } } +// { dg-final { cleanup-tree-dump "vect" } } diff --git a/gcc/testsuite/g++.old-deja/g++.mike/misc9.C b/gcc/testsuite/g++.old-deja/g++.mike/misc9.C index 3d8858cf64a..7b9a86cbf4a 100644 --- a/gcc/testsuite/g++.old-deja/g++.mike/misc9.C +++ b/gcc/testsuite/g++.old-deja/g++.mike/misc9.C @@ -8,6 +8,6 @@ class bee { class foo { public: - int bee::bar; // { dg-error "not derived" } you cannot do this + int bee::bar; // { dg-error "invalid use" } you cannot do this int me(); }; diff --git a/gcc/testsuite/gcc.c-torture/compile/20010327-1.c b/gcc/testsuite/gcc.c-torture/compile/20010327-1.c index ce68f78df1d..7e9c0c73a02 100644 --- a/gcc/testsuite/gcc.c-torture/compile/20010327-1.c +++ b/gcc/testsuite/gcc.c-torture/compile/20010327-1.c @@ -1,7 +1,4 @@ -/* { dg-skip-if "non-SI pointers" { m32c-*-* } { "*" } { "" } } */ -/* { dg-skip-if "HI mode pointer for avr" { "avr-*-*" } { "*" } { "" } } */ -/* { dg-skip-if "HI mode pointer for pdp11" { "pdp11-*-*" } { "*" } { "" } } */ -/* { dg-skip-if "non-SI pointers for w64" { "x86_64-*-mingw*" } { "*" } { "" } } */ +/* { dg-require-effective-target ptr32plus } */ /* This testcase tests whether GCC can produce static initialized data that references addresses of size 'unsigned long', even if that's not diff --git a/gcc/testsuite/gcc.c-torture/compile/20020604-1.c b/gcc/testsuite/gcc.c-torture/compile/20020604-1.c index 9486583e973..d2e186a7182 100644 --- a/gcc/testsuite/gcc.c-torture/compile/20020604-1.c +++ b/gcc/testsuite/gcc.c-torture/compile/20020604-1.c @@ -1,7 +1,6 @@ /* { dg-do assemble } */ -/* { dg-skip-if "The array is too big" { "avr-*-*" "pdp11-*-*" } { "*" } { "" } } */ +/* { dg-require-effective-target ptr32plus } */ /* { dg-xfail-if "The array too big" { "h8300-*-*" } { "-mno-h" "-mn" } { "" } } */ -/* { dg-skip-if "" { m32c-*-* } { } { } } */ /* PR c/6957 This testcase ICEd at -O2 on IA-32, because diff --git a/gcc/testsuite/gcc.c-torture/compile/20080625-1.c b/gcc/testsuite/gcc.c-torture/compile/20080625-1.c index 16def2c8a37..4b3b7c2c142 100644 --- a/gcc/testsuite/gcc.c-torture/compile/20080625-1.c +++ b/gcc/testsuite/gcc.c-torture/compile/20080625-1.c @@ -1,4 +1,5 @@ -/* { dg-skip-if "too much data" { "avr-*-*" "m32c-*-*" "pdp11-*-*" } { "*" } { "" } } */ +/* { dg-require-effective-target int32plus } */ + struct peakbufStruct { unsigned int lnum [5000]; int lscan [5000][4000]; diff --git a/gcc/testsuite/gcc.c-torture/compile/990617-1.c b/gcc/testsuite/gcc.c-torture/compile/990617-1.c index e9d3cf336fc..350b96a61c8 100644 --- a/gcc/testsuite/gcc.c-torture/compile/990617-1.c +++ b/gcc/testsuite/gcc.c-torture/compile/990617-1.c @@ -1,7 +1,5 @@ -/* 0x70000000 is too large a constant to become a pointer on - xstormy16. */ /* { dg-do assemble } */ -/* { dg-xfail-if "" { xstormy16-*-* } { "*" } { "" } } */ +/* { dg-require-effective-target ptr32plus } */ int main() { diff --git a/gcc/testsuite/gcc.c-torture/compile/calls.c b/gcc/testsuite/gcc.c-torture/compile/calls.c index 1582c0e92fa..1241058a073 100644 --- a/gcc/testsuite/gcc.c-torture/compile/calls.c +++ b/gcc/testsuite/gcc.c-torture/compile/calls.c @@ -1,3 +1,4 @@ +/* { dg-require-effective-target ptr32plus } */ typedef void *(*T)(void); f1 () { diff --git a/gcc/testsuite/gcc.c-torture/compile/limits-externdecl.c b/gcc/testsuite/gcc.c-torture/compile/limits-externdecl.c index 6899d4b097d..17afe730883 100644 --- a/gcc/testsuite/gcc.c-torture/compile/limits-externdecl.c +++ b/gcc/testsuite/gcc.c-torture/compile/limits-externdecl.c @@ -1,3 +1,4 @@ +/* { dg-require-effective-target int32plus } */ /* Inspired by the test case for PR middle-end/52640. */ typedef struct @@ -52,4 +53,4 @@ LIM5 (X); REFERENCE references[] = { LIM5 (X) 0 -}; /* { dg-error "size of array is too large" "" { target avr-*-* } } */ +}; diff --git a/gcc/testsuite/gcc.c-torture/compile/pr41181.c b/gcc/testsuite/gcc.c-torture/compile/pr41181.c index 5fafb020ea5..e1e48063a94 100644 --- a/gcc/testsuite/gcc.c-torture/compile/pr41181.c +++ b/gcc/testsuite/gcc.c-torture/compile/pr41181.c @@ -1,3 +1,4 @@ +/* { dg-require-effective-target ptr32plus } */ /* { dg-skip-if "The array is too big" { "avr-*-*" "pdp11-*-*" } { "*" } { "" } } */ char paths[1024]; static void x264_slicetype_path(char (*best_paths)[250], int n, int length) diff --git a/gcc/testsuite/gcc.c-torture/compile/pr55955.c b/gcc/testsuite/gcc.c-torture/compile/pr55955.c index 2656ffb94fb..cd96d56e8bb 100644 --- a/gcc/testsuite/gcc.c-torture/compile/pr55955.c +++ b/gcc/testsuite/gcc.c-torture/compile/pr55955.c @@ -1,3 +1,4 @@ +/* { dg-require-effective-target int32plus } */ /* PR tree-optimization/55955 */ int b; diff --git a/gcc/testsuite/gcc.c-torture/execute/pr58564.c b/gcc/testsuite/gcc.c-torture/execute/pr58564.c new file mode 100644 index 00000000000..967ee95d4ab --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr58564.c @@ -0,0 +1,14 @@ +/* PR middle-end/58564 */ + +extern void abort (void); +int a, b; +short *c, **d = &c; + +int +main () +{ + b = (0, 0 > ((&c == d) & (1 && (a ^ 1)))) | 0U; + if (b != 0) + abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.c-torture/execute/pr58570.c b/gcc/testsuite/gcc.c-torture/execute/pr58570.c new file mode 100644 index 00000000000..6d5116d9ea5 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr58570.c @@ -0,0 +1,22 @@ +#pragma pack(1) +struct S +{ + int f0:15; + int f1:29; +}; + +int e = 1, i; +static struct S d[6]; + +int +main (void) +{ + if (e) + { + d[i].f0 = 1; + d[i].f1 = 1; + } + if (d[0].f1 != 1) + __builtin_abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.c-torture/execute/pr58574.c b/gcc/testsuite/gcc.c-torture/execute/pr58574.c new file mode 100644 index 00000000000..44827eb7819 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr58574.c @@ -0,0 +1,219 @@ +/* PR target/58574 */ + +__attribute__((noinline, noclone)) double +foo (double x) +{ + double t; + switch ((int) x) + { + case 0: + t = 2 * x - 1; + return 0.70878e-3 + (0.71234e-3 + (0.35779e-5 + (0.17403e-7 + (0.81710e-10 + (0.36885e-12 + 0.15917e-14 * t) * t) * t) * t) * t) * t; + case 1: + t = 2 * x - 3; + return 0.21479e-2 + (0.72686e-3 + (0.36843e-5 + (0.18071e-7 + (0.85496e-10 + (0.38852e-12 + 0.16868e-14 * t) * t) * t) * t) * t) * t; + case 2: + t = 2 * x - 5; + return 0.36165e-2 + (0.74182e-3 + (0.37948e-5 + (0.18771e-7 + (0.89484e-10 + (0.40935e-12 + 0.17872e-14 * t) * t) * t) * t) * t) * t; + case 3: + t = 2 * x - 7; + return 0.51154e-2 + (0.75722e-3 + (0.39096e-5 + (0.19504e-7 + (0.93687e-10 + (0.43143e-12 + 0.18939e-14 * t) * t) * t) * t) * t) * t; + case 4: + t = 2 * x - 9; + return 0.66457e-2 + (0.77310e-3 + (0.40289e-5 + (0.20271e-7 + (0.98117e-10 + (0.45484e-12 + 0.20076e-14 * t) * t) * t) * t) * t) * t; + case 5: + t = 2 * x - 11; + return 0.82082e-2 + (0.78946e-3 + (0.41529e-5 + (0.21074e-7 + (0.10278e-9 + (0.47965e-12 + 0.21285e-14 * t) * t) * t) * t) * t) * t; + case 6: + t = 2 * x - 13; + return 0.98039e-2 + (0.80633e-3 + (0.42819e-5 + (0.21916e-7 + (0.10771e-9 + (0.50595e-12 + 0.22573e-14 * t) * t) * t) * t) * t) * t; + case 7: + t = 2 * x - 15; + return 0.11433e-1 + (0.82372e-3 + (0.44160e-5 + (0.22798e-7 + (0.11291e-9 + (0.53386e-12 + 0.23944e-14 * t) * t) * t) * t) * t) * t; + case 8: + t = 2 * x - 17; + return 0.13099e-1 + (0.84167e-3 + (0.45555e-5 + (0.23723e-7 + (0.11839e-9 + (0.56346e-12 + 0.25403e-14 * t) * t) * t) * t) * t) * t; + case 9: + t = 2 * x - 19; + return 0.14800e-1 + (0.86018e-3 + (0.47008e-5 + (0.24694e-7 + (0.12418e-9 + (0.59486e-12 + 0.26957e-14 * t) * t) * t) * t) * t) * t; + case 10: + t = 2 * x - 21; + return 0.16540e-1 + (0.87928e-3 + (0.48520e-5 + (0.25711e-7 + (0.13030e-9 + (0.62820e-12 + 0.28612e-14 * t) * t) * t) * t) * t) * t; + case 11: + t = 2 * x - 23; + return 0.18318e-1 + (0.89900e-3 + (0.50094e-5 + (0.26779e-7 + (0.13675e-9 + (0.66358e-12 + 0.30375e-14 * t) * t) * t) * t) * t) * t; + case 12: + t = 2 * x - 25; + return 0.20136e-1 + (0.91936e-3 + (0.51734e-5 + (0.27900e-7 + (0.14357e-9 + (0.70114e-12 + 0.32252e-14 * t) * t) * t) * t) * t) * t; + case 13: + t = 2 * x - 27; + return 0.21996e-1 + (0.94040e-3 + (0.53443e-5 + (0.29078e-7 + (0.15078e-9 + (0.74103e-12 + 0.34251e-14 * t) * t) * t) * t) * t) * t; + case 14: + t = 2 * x - 29; + return 0.23898e-1 + (0.96213e-3 + (0.55225e-5 + (0.30314e-7 + (0.15840e-9 + (0.78340e-12 + 0.36381e-14 * t) * t) * t) * t) * t) * t; + case 15: + t = 2 * x - 31; + return 0.25845e-1 + (0.98459e-3 + (0.57082e-5 + (0.31613e-7 + (0.16646e-9 + (0.82840e-12 + 0.38649e-14 * t) * t) * t) * t) * t) * t; + case 16: + t = 2 * x - 33; + return 0.27837e-1 + (0.10078e-2 + (0.59020e-5 + (0.32979e-7 + (0.17498e-9 + (0.87622e-12 + 0.41066e-14 * t) * t) * t) * t) * t) * t; + case 17: + t = 2 * x - 35; + return 0.29877e-1 + (0.10318e-2 + (0.61041e-5 + (0.34414e-7 + (0.18399e-9 + (0.92703e-12 + 0.43639e-14 * t) * t) * t) * t) * t) * t; + case 18: + t = 2 * x - 37; + return 0.31965e-1 + (0.10566e-2 + (0.63151e-5 + (0.35924e-7 + (0.19353e-9 + (0.98102e-12 + 0.46381e-14 * t) * t) * t) * t) * t) * t; + case 19: + t = 2 * x - 39; + return 0.34104e-1 + (0.10823e-2 + (0.65354e-5 + (0.37512e-7 + (0.20362e-9 + (0.10384e-11 + 0.49300e-14 * t) * t) * t) * t) * t) * t; + case 20: + t = 2 * x - 41; + return 0.36295e-1 + (0.11089e-2 + (0.67654e-5 + (0.39184e-7 + (0.21431e-9 + (0.10994e-11 + 0.52409e-14 * t) * t) * t) * t) * t) * t; + case 21: + t = 2 * x - 43; + return 0.38540e-1 + (0.11364e-2 + (0.70058e-5 + (0.40943e-7 + (0.22563e-9 + (0.11642e-11 + 0.55721e-14 * t) * t) * t) * t) * t) * t; + case 22: + t = 2 * x - 45; + return 0.40842e-1 + (0.11650e-2 + (0.72569e-5 + (0.42796e-7 + (0.23761e-9 + (0.12332e-11 + 0.59246e-14 * t) * t) * t) * t) * t) * t; + case 23: + t = 2 * x - 47; + return 0.43201e-1 + (0.11945e-2 + (0.75195e-5 + (0.44747e-7 + (0.25030e-9 + (0.13065e-11 + 0.63000e-14 * t) * t) * t) * t) * t) * t; + case 24: + t = 2 * x - 49; + return 0.45621e-1 + (0.12251e-2 + (0.77941e-5 + (0.46803e-7 + (0.26375e-9 + (0.13845e-11 + 0.66996e-14 * t) * t) * t) * t) * t) * t; + case 25: + t = 2 * x - 51; + return 0.48103e-1 + (0.12569e-2 + (0.80814e-5 + (0.48969e-7 + (0.27801e-9 + (0.14674e-11 + 0.71249e-14 * t) * t) * t) * t) * t) * t; + case 26: + t = 2 * x - 59; + return 0.58702e-1 + (0.13962e-2 + (0.93714e-5 + (0.58882e-7 + (0.34414e-9 + (0.18552e-11 + 0.91160e-14 * t) * t) * t) * t) * t) * t; + case 30: + t = 2 * x - 79; + return 0.90908e-1 + (0.18544e-2 + (0.13903e-4 + (0.95549e-7 + (0.59752e-9 + (0.33656e-11 + 0.16815e-13 * t) * t) * t) * t) * t) * t; + case 40: + t = 2 * x - 99; + return 0.13443e0 + (0.25474e-2 + (0.21385e-4 + (0.15996e-6 + (0.10585e-8 + (0.61258e-11 + 0.30412e-13 * t) * t) * t) * t) * t) * t; + case 50: + t = 2 * x - 119; + return 0.19540e0 + (0.36342e-2 + (0.34096e-4 + (0.27479e-6 + (0.18934e-8 + (0.11021e-10 + 0.52931e-13 * t) * t) * t) * t) * t) * t; + case 60: + t = 2 * x - 121; + return 0.20281e0 + (0.37739e-2 + (0.35791e-4 + (0.29038e-6 + (0.20068e-8 + (0.11673e-10 + 0.55790e-13 * t) * t) * t) * t) * t) * t; + case 61: + t = 2 * x - 123; + return 0.21050e0 + (0.39206e-2 + (0.37582e-4 + (0.30691e-6 + (0.21270e-8 + (0.12361e-10 + 0.58770e-13 * t) * t) * t) * t) * t) * t; + case 62: + t = 2 * x - 125; + return 0.21849e0 + (0.40747e-2 + (0.39476e-4 + (0.32443e-6 + (0.22542e-8 + (0.13084e-10 + 0.61873e-13 * t) * t) * t) * t) * t) * t; + case 63: + t = 2 * x - 127; + return 0.22680e0 + (0.42366e-2 + (0.41477e-4 + (0.34300e-6 + (0.23888e-8 + (0.13846e-10 + 0.65100e-13 * t) * t) * t) * t) * t) * t; + case 64: + t = 2 * x - 129; + return 0.23545e0 + (0.44067e-2 + (0.43594e-4 + (0.36268e-6 + (0.25312e-8 + (0.14647e-10 + 0.68453e-13 * t) * t) * t) * t) * t) * t; + case 65: + t = 2 * x - 131; + return 0.24444e0 + (0.45855e-2 + (0.45832e-4 + (0.38352e-6 + (0.26819e-8 + (0.15489e-10 + 0.71933e-13 * t) * t) * t) * t) * t) * t; + case 66: + t = 2 * x - 133; + return 0.25379e0 + (0.47735e-2 + (0.48199e-4 + (0.40561e-6 + (0.28411e-8 + (0.16374e-10 + 0.75541e-13 * t) * t) * t) * t) * t) * t; + case 67: + t = 2 * x - 135; + return 0.26354e0 + (0.49713e-2 + (0.50702e-4 + (0.42901e-6 + (0.30095e-8 + (0.17303e-10 + 0.79278e-13 * t) * t) * t) * t) * t) * t; + case 68: + t = 2 * x - 137; + return 0.27369e0 + (0.51793e-2 + (0.53350e-4 + (0.45379e-6 + (0.31874e-8 + (0.18277e-10 + 0.83144e-13 * t) * t) * t) * t) * t) * t; + case 69: + t = 2 * x - 139; + return 0.28426e0 + (0.53983e-2 + (0.56150e-4 + (0.48003e-6 + (0.33752e-8 + (0.19299e-10 + 0.87139e-13 * t) * t) * t) * t) * t) * t; + case 70: + t = 2 * x - 141; + return 0.29529e0 + (0.56288e-2 + (0.59113e-4 + (0.50782e-6 + (0.35735e-8 + (0.20369e-10 + 0.91262e-13 * t) * t) * t) * t) * t) * t; + case 71: + t = 2 * x - 143; + return 0.30679e0 + (0.58714e-2 + (0.62248e-4 + (0.53724e-6 + (0.37827e-8 + (0.21490e-10 + 0.95513e-13 * t) * t) * t) * t) * t) * t; + case 72: + t = 2 * x - 145; + return 0.31878e0 + (0.61270e-2 + (0.65564e-4 + (0.56837e-6 + (0.40035e-8 + (0.22662e-10 + 0.99891e-13 * t) * t) * t) * t) * t) * t; + case 73: + t = 2 * x - 147; + return 0.33130e0 + (0.63962e-2 + (0.69072e-4 + (0.60133e-6 + (0.42362e-8 + (0.23888e-10 + 0.10439e-12 * t) * t) * t) * t) * t) * t; + case 74: + t = 2 * x - 149; + return 0.34438e0 + (0.66798e-2 + (0.72783e-4 + (0.63619e-6 + (0.44814e-8 + (0.25168e-10 + 0.10901e-12 * t) * t) * t) * t) * t) * t; + case 75: + t = 2 * x - 151; + return 0.35803e0 + (0.69787e-2 + (0.76710e-4 + (0.67306e-6 + (0.47397e-8 + (0.26505e-10 + 0.11376e-12 * t) * t) * t) * t) * t) * t; + case 76: + t = 2 * x - 153; + return 0.37230e0 + (0.72938e-2 + (0.80864e-4 + (0.71206e-6 + (0.50117e-8 + (0.27899e-10 + 0.11862e-12 * t) * t) * t) * t) * t) * t; + case 77: + t = 2 * x - 155; + return 0.38722e0 + (0.76260e-2 + (0.85259e-4 + (0.75329e-6 + (0.52979e-8 + (0.29352e-10 + 0.12360e-12 * t) * t) * t) * t) * t) * t; + case 78: + t = 2 * x - 157; + return 0.40282e0 + (0.79762e-2 + (0.89909e-4 + (0.79687e-6 + (0.55989e-8 + (0.30866e-10 + 0.12868e-12 * t) * t) * t) * t) * t) * t; + case 79: + t = 2 * x - 159; + return 0.41914e0 + (0.83456e-2 + (0.94827e-4 + (0.84291e-6 + (0.59154e-8 + (0.32441e-10 + 0.13387e-12 * t) * t) * t) * t) * t) * t; + case 80: + t = 2 * x - 161; + return 0.43621e0 + (0.87352e-2 + (0.10002e-3 + (0.89156e-6 + (0.62480e-8 + (0.34079e-10 + 0.13917e-12 * t) * t) * t) * t) * t) * t; + case 81: + t = 2 * x - 163; + return 0.45409e0 + (0.91463e-2 + (0.10553e-3 + (0.94293e-6 + (0.65972e-8 + (0.35782e-10 + 0.14455e-12 * t) * t) * t) * t) * t) * t; + case 82: + t = 2 * x - 165; + return 0.47282e0 + (0.95799e-2 + (0.11135e-3 + (0.99716e-6 + (0.69638e-8 + (0.37549e-10 + 0.15003e-12 * t) * t) * t) * t) * t) * t; + case 83: + t = 2 * x - 167; + return 0.49243e0 + (0.10037e-1 + (0.11750e-3 + (0.10544e-5 + (0.73484e-8 + (0.39383e-10 + 0.15559e-12 * t) * t) * t) * t) * t) * t; + case 84: + t = 2 * x - 169; + return 0.51298e0 + (0.10520e-1 + (0.12400e-3 + (0.11147e-5 + (0.77517e-8 + (0.41283e-10 + 0.16122e-12 * t) * t) * t) * t) * t) * t; + case 85: + t = 2 * x - 171; + return 0.53453e0 + (0.11030e-1 + (0.13088e-3 + (0.11784e-5 + (0.81743e-8 + (0.43252e-10 + 0.16692e-12 * t) * t) * t) * t) * t) * t; + case 86: + t = 2 * x - 173; + return 0.55712e0 + (0.11568e-1 + (0.13815e-3 + (0.12456e-5 + (0.86169e-8 + (0.45290e-10 + 0.17268e-12 * t) * t) * t) * t) * t) * t; + case 87: + t = 2 * x - 175; + return 0.58082e0 + (0.12135e-1 + (0.14584e-3 + (0.13164e-5 + (0.90803e-8 + (0.47397e-10 + 0.17850e-12 * t) * t) * t) * t) * t) * t; + case 88: + t = 2 * x - 177; + return 0.60569e0 + (0.12735e-1 + (0.15396e-3 + (0.13909e-5 + (0.95651e-8 + (0.49574e-10 + 0.18435e-12 * t) * t) * t) * t) * t) * t; + case 89: + t = 2 * x - 179; + return 0.63178e0 + (0.13368e-1 + (0.16254e-3 + (0.14695e-5 + (0.10072e-7 + (0.51822e-10 + 0.19025e-12 * t) * t) * t) * t) * t) * t; + case 90: + t = 2 * x - 181; + return 0.65918e0 + (0.14036e-1 + (0.17160e-3 + (0.15521e-5 + (0.10601e-7 + (0.54140e-10 + 0.19616e-12 * t) * t) * t) * t) * t) * t; + case 91: + t = 2 * x - 183; + return 0.68795e0 + (0.14741e-1 + (0.18117e-3 + (0.16392e-5 + (0.11155e-7 + (0.56530e-10 + 0.20209e-12 * t) * t) * t) * t) * t) * t; + case 92: + t = 2 * x - 185; + return 0.71818e0 + (0.15486e-1 + (0.19128e-3 + (0.17307e-5 + (0.11732e-7 + (0.58991e-10 + 0.20803e-12 * t) * t) * t) * t) * t) * t; + case 93: + t = 2 * x - 187; + return 0.74993e0 + (0.16272e-1 + (0.20195e-3 + (0.18269e-5 + (0.12335e-7 + (0.61523e-10 + 0.21395e-12 * t) * t) * t) * t) * t) * t; + } + return 1.0; +} + +int +main () +{ +#ifdef __s390x__ + { + register unsigned long r5 __asm ("r5"); + r5 = 0xdeadbeefUL; + asm volatile ("":"+r" (r5)); + } +#endif + double d = foo (78.4); + if (d < 0.38 || d > 0.42) + __builtin_abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.c-torture/execute/pr58640-2.c b/gcc/testsuite/gcc.c-torture/execute/pr58640-2.c new file mode 100644 index 00000000000..3fc3a55ce27 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr58640-2.c @@ -0,0 +1,35 @@ +extern void abort (void); + +int a[20], b, c; + +int +fn1 () +{ + int d, e, f, g = 0; + + a[12] = 1; + for (e = 0; e < 3; e++) + for (d = 0; d < 2; d++) + { + for (f = 0; f < 2; f++) + { + g ^= a[12] > 1; + if (g) + return 0; + if (b) + break; + } + for (c = 0; c < 1; c++) + a[d] = a[e * 3 + 9]; + } + return 0; +} + +int +main () +{ + fn1 (); + if (a[0] != 0) + abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.c-torture/execute/pr58640.c b/gcc/testsuite/gcc.c-torture/execute/pr58640.c new file mode 100644 index 00000000000..7786b8d0c9f --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr58640.c @@ -0,0 +1,32 @@ +int a, b, c, d = 1, e; + +static signed char +foo () +{ + int f, g = a; + + for (f = 1; f < 3; f++) + for (; b < 1; b++) + { + if (d) + for (c = 0; c < 4; c++) + for (f = 0; f < 3; f++) + { + for (e = 0; e < 1; e++) + a = g; + if (f) + break; + } + else if (f) + continue; + return 0; + } + return 0; +} + +int +main () +{ + foo (); + exit (0); +} diff --git a/gcc/testsuite/gcc.c-torture/execute/pr58662.c b/gcc/testsuite/gcc.c-torture/execute/pr58662.c new file mode 100644 index 00000000000..dc0d5f02aca --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr58662.c @@ -0,0 +1,22 @@ +extern void abort (void); + +int a, c, d; +volatile int b; + +static int +foo (int p1, short p2) +{ + return p1 / p2; +} + +int +main () +{ + char e; + d = foo (a == 0, (0, 35536)); + e = d % 14; + b = e && c; + if (b != 0) + abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/autopar/outer-1.c b/gcc/testsuite/gcc.dg/autopar/outer-1.c index 913d390f684..a9d2185f0ce 100644 --- a/gcc/testsuite/gcc.dg/autopar/outer-1.c +++ b/gcc/testsuite/gcc.dg/autopar/outer-1.c @@ -28,6 +28,6 @@ int main(void) /* Check that outer loop is parallelized. */ /* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops" } } */ -/* { dg-final { scan-tree-dump-times "loopfn" 5 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "loopfn" 4 "optimized" } } */ /* { dg-final { cleanup-tree-dump "parloops" } } */ /* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/outer-2.c b/gcc/testsuite/gcc.dg/autopar/outer-2.c index b2e51598203..e0a142f0d11 100644 --- a/gcc/testsuite/gcc.dg/autopar/outer-2.c +++ b/gcc/testsuite/gcc.dg/autopar/outer-2.c @@ -28,6 +28,6 @@ int main(void) } /* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops" } } */ -/* { dg-final { scan-tree-dump-times "loopfn" 5 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "loopfn" 4 "optimized" } } */ /* { dg-final { cleanup-tree-dump "parloops" } } */ /* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/outer-3.c b/gcc/testsuite/gcc.dg/autopar/outer-3.c index 2f1033f9830..c6e0adbffdf 100644 --- a/gcc/testsuite/gcc.dg/autopar/outer-3.c +++ b/gcc/testsuite/gcc.dg/autopar/outer-3.c @@ -28,6 +28,6 @@ int main(void) /* Check that outer loop is parallelized. */ /* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops" } } */ -/* { dg-final { scan-tree-dump-times "loopfn" 5 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "loopfn" 4 "optimized" } } */ /* { dg-final { cleanup-tree-dump "parloops" } } */ /* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/outer-4.c b/gcc/testsuite/gcc.dg/autopar/outer-4.c index 56f6123385d..d60023f5d86 100644 --- a/gcc/testsuite/gcc.dg/autopar/outer-4.c +++ b/gcc/testsuite/gcc.dg/autopar/outer-4.c @@ -32,6 +32,6 @@ int main(void) /* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops" { xfail *-*-* } } } */ -/* { dg-final { scan-tree-dump-times "loopfn" 5 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "loopfn" 4 "optimized" } } */ /* { dg-final { cleanup-tree-dump "parloops" } } */ /* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/outer-5.c b/gcc/testsuite/gcc.dg/autopar/outer-5.c index 3a542988c26..fa80293263c 100644 --- a/gcc/testsuite/gcc.dg/autopar/outer-5.c +++ b/gcc/testsuite/gcc.dg/autopar/outer-5.c @@ -45,6 +45,6 @@ int main(void) } /* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops" { xfail *-*-* } } } */ -/* { dg-final { scan-tree-dump-times "loopfn" 5 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "loopfn" 4 "optimized" } } */ /* { dg-final { cleanup-tree-dump "parloops" } } */ /* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/outer-6.c b/gcc/testsuite/gcc.dg/autopar/outer-6.c index 6e027d2f69a..b16366932fe 100644 --- a/gcc/testsuite/gcc.dg/autopar/outer-6.c +++ b/gcc/testsuite/gcc.dg/autopar/outer-6.c @@ -46,6 +46,6 @@ int main(void) /* Check that outer loop is parallelized. */ /* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops" } } */ /* { dg-final { scan-tree-dump-times "parallelizing inner loop" 0 "parloops" } } */ -/* { dg-final { scan-tree-dump-times "loopfn" 5 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "loopfn" 4 "optimized" } } */ /* { dg-final { cleanup-tree-dump "parloops" } } */ /* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/parallelization-1.c b/gcc/testsuite/gcc.dg/autopar/parallelization-1.c index f53be8598db..de2a0f3cc71 100644 --- a/gcc/testsuite/gcc.dg/autopar/parallelization-1.c +++ b/gcc/testsuite/gcc.dg/autopar/parallelization-1.c @@ -28,6 +28,6 @@ int main(void) /* Check that the first loop in parloop got parallelized. */ /* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops" } } */ -/* { dg-final { scan-tree-dump-times "loopfn" 5 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "loopfn" 4 "optimized" } } */ /* { dg-final { cleanup-tree-dump "parloops" } } */ /* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/builtin-apply2.c b/gcc/testsuite/gcc.dg/builtin-apply2.c index daaef477894..869f337a9a5 100644 --- a/gcc/testsuite/gcc.dg/builtin-apply2.c +++ b/gcc/testsuite/gcc.dg/builtin-apply2.c @@ -1,6 +1,6 @@ /* { dg-do run } */ /* { dg-skip-if "Variadic funcs have all args on stack. Normal funcs have args in registers." { "aarch64*-*-* avr-*-* " } { "*" } { "" } } */ -/* { dg-skip-if "Variadic funcs use Base AAPCS. Normal funcs use VFP variant." { "arm*-*-*" } { "-mfloat-abi=hard" } { "" } } */ +/* { dg-skip-if "Variadic funcs use Base AAPCS. Normal funcs use VFP variant." { arm*-*-* && arm_hf_eabi } { "*" } { "" } } */ /* PR target/12503 */ /* Origin: <pierre.nguyen-tuong@asim.lip6.fr> */ diff --git a/gcc/testsuite/gcc.dg/c1x-align-5.c b/gcc/testsuite/gcc.dg/c1x-align-5.c new file mode 100644 index 00000000000..614edcf6f9b --- /dev/null +++ b/gcc/testsuite/gcc.dg/c1x-align-5.c @@ -0,0 +1,20 @@ +/* Test C1X alignment support. Test invalid code. */ +/* { dg-do compile } */ +/* { dg-options "-std=c1x -pedantic-errors" } */ + +void foo (int []); +void bar1 (int [_Alignas (double) 10]); /* { dg-error "expected expression before" } */ +void bar2 (int [static _Alignas (double) 10]); /* { dg-error "expected expression before" } */ +void bar3 (int [static const _Alignas (double) 10]); /* { dg-error "expected expression before" } */ +void bar4 (int [const _Alignas (double) 10]); /* { dg-error "expected expression before" } */ +void bar5 (int [_Alignas (0) *]); /* { dg-error "expected expression before" } */ + +void foo (int a[_Alignas (0) 10]) { } /* { dg-error "expected expression before" } */ + +void +test (void) +{ + int a[_Alignas (int) 10]; /* { dg-error "expected expression before" } */ + int b[10]; + foo (b); +} diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.1.c index 4196b2d1521..f2c4a672fe4 100644 --- a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.1.c +++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.1.c @@ -15,7 +15,7 @@ wrong1 (int n) for (i = 0; i < n; i++) { /* incorrect nesting of loop regions */ -#pragma omp for /* { dg-warning "may not be closely nested" } */ +#pragma omp for /* { dg-error "may not be closely nested" } */ for (j = 0; j < n; j++) work (i, j); } diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.3.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.3.c index 31b2ddf0367..64005b3074b 100644 --- a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.3.c +++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.3.c @@ -12,7 +12,7 @@ wrong3 (int n) for (i = 0; i < n; i++) { /* incorrect nesting of regions */ -#pragma omp single /* { dg-warning "may not be closely nested" } */ +#pragma omp single /* { dg-error "may not be closely nested" } */ work (i, 0); } } diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.4.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.4.c index d7579e6e735..5bb6b80b396 100644 --- a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.4.c +++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.4.c @@ -11,7 +11,7 @@ wrong4 (int n) { work (i, 0); /* incorrect nesting of barrier region in a loop region */ -#pragma omp barrier /* { dg-warning "may not be closely nested" } */ +#pragma omp barrier /* { dg-error "may not be closely nested" } */ work (i, 1); } } diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.5.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.5.c index 7b53015571e..7b4aee1c06b 100644 --- a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.5.c +++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.5.c @@ -9,7 +9,7 @@ wrong5 (int n) { work (n, 0); /* incorrect nesting of barrier region in a critical region */ -#pragma omp barrier +#pragma omp barrier /* { dg-error "may not be closely nested" } */ work (n, 1); } } diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.6.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.6.c index ac850e5410a..d18188b1752 100644 --- a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.6.c +++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.6.c @@ -9,7 +9,7 @@ wrong6 (int n) { work (n, 0); /* incorrect nesting of barrier region in a single region */ -#pragma omp barrier /* { dg-warning "may not be closely nested" } */ +#pragma omp barrier /* { dg-error "may not be closely nested" } */ work (n, 1); } } diff --git a/gcc/testsuite/gcc.dg/gomp/block-3.c b/gcc/testsuite/gcc.dg/gomp/block-3.c index c72b04c35d0..b4530e9d06c 100644 --- a/gcc/testsuite/gcc.dg/gomp/block-3.c +++ b/gcc/testsuite/gcc.dg/gomp/block-3.c @@ -35,9 +35,10 @@ void foo() #pragma omp sections { - goto ok1; - ok1:; - + { + goto ok1; + ok1:; + } #pragma omp section for (i = 0; i < 10; ++i) if (test(i)) diff --git a/gcc/testsuite/gcc.dg/gomp/clause-1.c b/gcc/testsuite/gcc.dg/gomp/clause-1.c index ba189896c62..fc7d72b7cd2 100644 --- a/gcc/testsuite/gcc.dg/gomp/clause-1.c +++ b/gcc/testsuite/gcc.dg/gomp/clause-1.c @@ -11,7 +11,7 @@ int t; void foo (int x) { - char *p; + char *pp; struct S { int i; int j; } s; char a[32]; double d; @@ -42,11 +42,11 @@ foo (int x) ; #pragma omp p firstprivate (bar) /* { dg-error "is not a variable" } */ ; -#pragma omp p reduction (+:p) /* { dg-error "has invalid type for" } */ +#pragma omp p reduction (+:pp) /* { dg-error "user defined reduction not found for" } */ ; -#pragma omp p reduction (*:s) /* { dg-error "has invalid type for" } */ +#pragma omp p reduction (*:s) /* { dg-error "user defined reduction not found for" } */ ; -#pragma omp p reduction (-:a) /* { dg-error "has invalid type for" } */ +#pragma omp p reduction (-:a) /* { dg-error "user defined reduction not found for" } */ ; d = 0; #pragma omp p reduction (*:d) diff --git a/gcc/testsuite/gcc.dg/gomp/combined-1.c b/gcc/testsuite/gcc.dg/gomp/combined-1.c index dfed647371f..7e23c3256cb 100644 --- a/gcc/testsuite/gcc.dg/gomp/combined-1.c +++ b/gcc/testsuite/gcc.dg/gomp/combined-1.c @@ -20,5 +20,5 @@ int foo (void) } } -/* { dg-final { scan-tree-dump-times "GOMP_parallel_loop_runtime_start" 3 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "GOMP_parallel_loop_runtime" 3 "optimized" } } */ /* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/gomp/declare-simd-1.c b/gcc/testsuite/gcc.dg/gomp/declare-simd-1.c new file mode 100644 index 00000000000..259e2c0ae92 --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/declare-simd-1.c @@ -0,0 +1,100 @@ +/* Test parsing of #pragma omp declare simd */ +/* { dg-do compile } */ + +#pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) \ + linear (c : 4) simdlen (8) notinbranch +#pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a \ + : 4) simdlen (4) inbranch +int f1 (int a, int *b, int c); + +#pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) simdlen (8) +int f2 (int a, int *b, int c) +{ + return a + *b + c; +} + +#pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (long long)) linear (c : 4) simdlen (8) +__extension__ +long long f3 (long long a, long long *b, long long c); + +int +f4 (int x) +{ + #pragma omp declare simd simdlen (8) aligned (b : 8 * sizeof (int)) + __extension__ __extension__ __extension__ + extern int f5 (int a, int *b, int c); + { + x++; + #pragma omp declare simd simdlen (4) linear (c) + extern int f6 (int a, int *b, int c); + } + return x; +} + +#pragma omp declare simd simdlen (16) +int +f7 (int x) +{ + #pragma omp declare simd simdlen (8) aligned (b : 8 * sizeof (int)) + extern int f8 (int a, int *b, int c); + return x; +} + +int +f9 (int x) +{ + if (x) + #pragma omp declare simd simdlen (8) aligned (b : 8 * sizeof (int)) + extern int f10 (int a, int *b, int c); + while (x < 10) + #pragma omp declare simd simdlen (8) aligned (b : 8 * sizeof (int)) + extern int f11 (int a, int *b, int c); + return x; +} + +#pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) simdlen (8) +int f12 (int c; int *b; int a; int a, int *b, int c); + +#pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) simdlen (8) +int +f13 (int c; int *b; int a; int a, int *b, int c) +{ + return a + *b + c; +} + +#pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) simdlen (8) +int +f14 (a, b, c) + int a, c; + int *b; +{ + return a + *b + c; +} + +#pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) simdlen (8) +int +f15 (int a, int *b, int c) +{ + return a + *b + c; +} + +#pragma omp declare simd uniform (d) aligned (e : 8 * sizeof (int)) linear (f : 4) simdlen (8) +int f15 (int d, int *e, int f); + +#pragma omp declare simd aligned (g : sizeof (*g)) linear (h : 2 * sizeof (g[0]) + sizeof (h)) simdlen (4) +int f16 (long *g, int h); + +#pragma omp declare simd aligned (h : sizeof (*h)) linear (g : 2 * sizeof (h[0]) + sizeof (g)) simdlen (4) +int f17 (int g, long *h) +{ + return g + h[0]; +} + +#pragma omp declare simd aligned (i : sizeof (*i)) linear (j : 2 * sizeof (i[0]) + sizeof (j)) simdlen (4) +int +f18 (j, i) + long *i; + int j; +{ + return j + i[0]; +} diff --git a/gcc/testsuite/gcc.dg/gomp/declare-simd-2.c b/gcc/testsuite/gcc.dg/gomp/declare-simd-2.c new file mode 100644 index 00000000000..118549be908 --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/declare-simd-2.c @@ -0,0 +1,24 @@ +/* Test parsing of #pragma omp declare simd */ +/* { dg-do compile } */ + +#pragma omp declare simd +int a; /* { dg-error "not immediately followed by a function declaration or definition" } */ + +#pragma omp declare simd +int fn1 (int a), fn2 (int a); /* { dg-error "not immediately followed by a single function declaration or definition" } */ + +#pragma omp declare simd +int b, fn3 (int a); /* { dg-error "not immediately followed by a function declaration or definition" } */ + +#pragma omp declare simd linear (a) +int fn4 (int a), c; /* { dg-error "not immediately followed by a function declaration or definition" } */ + +int t; + +#pragma omp declare simd +#pragma omp declare simd +#pragma omp threadprivate(t) /* { dg-error "must be followed by function declaration or definition or another" } */ +int fn5 (int a); + +#pragma omp declare simd inbranch notinbranch /* { dg-error "clause is incompatible with" } */ +int fn6 (int); diff --git a/gcc/testsuite/gcc.dg/gomp/gomp.exp b/gcc/testsuite/gcc.dg/gomp/gomp.exp index ca8aefd3c4e..cc2cd8ed089 100644 --- a/gcc/testsuite/gcc.dg/gomp/gomp.exp +++ b/gcc/testsuite/gcc.dg/gomp/gomp.exp @@ -29,7 +29,9 @@ if ![check_effective_target_fopenmp] { dg-init # Main loop. -dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.c $srcdir/c-c++-common/gomp/*.c]] "" "-fopenmp" +dg-runtest [lsort [concat \ + [find $srcdir/$subdir *.c] \ + [find $srcdir/c-c++-common/gomp *.c]]] "" "-fopenmp" # All done. dg-finish diff --git a/gcc/testsuite/gcc.dg/gomp/nesting-1.c b/gcc/testsuite/gcc.dg/gomp/nesting-1.c index df57ac845f7..52fcda741ea 100644 --- a/gcc/testsuite/gcc.dg/gomp/nesting-1.c +++ b/gcc/testsuite/gcc.dg/gomp/nesting-1.c @@ -28,17 +28,58 @@ f1 (void) #pragma omp for /* { dg-error "may not be closely nested" } */ for (j = 0; j < 3; j++) ; + } + #pragma omp sections + { #pragma omp sections /* { dg-error "may not be closely nested" } */ { ; #pragma omp section ; } + } + #pragma omp sections + { #pragma omp single /* { dg-error "may not be closely nested" } */ ; + } + #pragma omp sections + { #pragma omp master /* { dg-error "may not be closely nested" } */ ; + } + #pragma omp sections + { + #pragma omp section + ; + } + #pragma omp sections + { #pragma omp section + #pragma omp for /* { dg-error "may not be closely nested" } */ + for (j = 0; j < 3; j++) + ; + } + #pragma omp sections + { + #pragma omp section + #pragma omp sections /* { dg-error "may not be closely nested" } */ + { + ; + #pragma omp section + ; + } + } + #pragma omp sections + { + #pragma omp section + #pragma omp single /* { dg-error "may not be closely nested" } */ + ; + } + #pragma omp sections + { + #pragma omp section + #pragma omp master /* { dg-error "may not be closely nested" } */ ; } #pragma omp single diff --git a/gcc/testsuite/gcc.dg/gomp/target-1.c b/gcc/testsuite/gcc.dg/gomp/target-1.c new file mode 100644 index 00000000000..09e65bd3115 --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/target-1.c @@ -0,0 +1,29 @@ +/* { dg-do compile } */ + +void +foo (int x) +{ + bad1: + #pragma omp target + goto bad1; /* { dg-error "invalid branch" } */ + + goto bad2; /* { dg-error "invalid entry" } */ + #pragma omp target + { + bad2: ; + } + + #pragma omp target + { + int i; + goto ok1; + for (i = 0; i < 10; ++i) + { ok1: break; } + } + + switch (x) /* { dg-error "invalid entry" } */ + { + #pragma omp target + { case 0:; } + } +} diff --git a/gcc/testsuite/gcc.dg/gomp/target-2.c b/gcc/testsuite/gcc.dg/gomp/target-2.c new file mode 100644 index 00000000000..546a1d0c157 --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/target-2.c @@ -0,0 +1,29 @@ +/* { dg-do compile } */ + +void +foo (int x, int y) +{ + bad1: + #pragma omp target data map(tofrom: y) + goto bad1; /* { dg-error "invalid branch" } */ + + goto bad2; /* { dg-error "invalid entry" } */ + #pragma omp target data map(tofrom: y) + { + bad2: ; + } + + #pragma omp target data map(tofrom: y) + { + int i; + goto ok1; + for (i = 0; i < 10; ++i) + { ok1: break; } + } + + switch (x) /* { dg-error "invalid entry" } */ + { + #pragma omp target data map(tofrom: y) + { case 0:; } + } +} diff --git a/gcc/testsuite/gcc.dg/gomp/taskgroup-1.c b/gcc/testsuite/gcc.dg/gomp/taskgroup-1.c new file mode 100644 index 00000000000..e301efc19c4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/taskgroup-1.c @@ -0,0 +1,29 @@ +/* { dg-do compile } */ + +void +foo (int x) +{ + bad1: + #pragma omp taskgroup + goto bad1; /* { dg-error "invalid branch" } */ + + goto bad2; /* { dg-error "invalid entry" } */ + #pragma omp taskgroup + { + bad2: ; + } + + #pragma omp taskgroup + { + int i; + goto ok1; + for (i = 0; i < 10; ++i) + { ok1: break; } + } + + switch (x) /* { dg-error "invalid entry" } */ + { + #pragma omp taskgroup + { case 0:; } + } +} diff --git a/gcc/testsuite/gcc.dg/gomp/teams-1.c b/gcc/testsuite/gcc.dg/gomp/teams-1.c new file mode 100644 index 00000000000..73c00ded78b --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/teams-1.c @@ -0,0 +1,61 @@ +/* { dg-do compile } */ + +void +foo (int x) +{ + bad1: + #pragma omp target teams + goto bad1; /* { dg-error "invalid branch" } */ + + goto bad2; /* { dg-error "invalid entry" } */ + #pragma omp target teams + { + bad2: ; + } + + #pragma omp target teams + { + int i; + goto ok1; + for (i = 0; i < 10; ++i) + { ok1: break; } + } + + switch (x) /* { dg-error "invalid entry" } */ + { + #pragma omp target teams + { case 0:; } + } +} + +void +bar (int x) +{ + bad1: + #pragma omp target + #pragma omp teams + goto bad1; /* { dg-error "invalid branch" } */ + + goto bad2; /* { dg-error "invalid entry" } */ + #pragma omp target + #pragma omp teams + { + bad2: ; + } + + #pragma omp target + #pragma omp teams + { + int i; + goto ok1; + for (i = 0; i < 10; ++i) + { ok1: break; } + } + + switch (x) /* { dg-error "invalid entry" } */ + { + #pragma omp target + #pragma omp teams + { case 0:; } + } +} diff --git a/gcc/testsuite/gcc.dg/gomp/udr-1.c b/gcc/testsuite/gcc.dg/gomp/udr-1.c new file mode 100644 index 00000000000..4948a984f69 --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/udr-1.c @@ -0,0 +1,46 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp" } */ + +#pragma omp declare reduction (| : long int : omp_out |= omp_in) /* { dg-error "predeclared arithmetic type" } */ +#pragma omp declare reduction (+ : char : omp_out += omp_in) /* { dg-error "predeclared arithmetic type" } */ +typedef short T; +#pragma omp declare reduction (min : T : omp_out += omp_in) /* { dg-error "predeclared arithmetic type" } */ +#pragma omp declare reduction (* : _Complex double : omp_out *= omp_in) /* { dg-error "predeclared arithmetic type" } */ + +void +foo (void) +{ + #pragma omp declare reduction (| : long int : omp_out |= omp_in) /* { dg-error "predeclared arithmetic type" } */ + #pragma omp declare reduction (+ : char : omp_out += omp_in) /* { dg-error "predeclared arithmetic type" } */ + #pragma omp declare reduction (min : T : omp_out += omp_in) /* { dg-error "predeclared arithmetic type" } */ + #pragma omp declare reduction (* : _Complex double : omp_out *= omp_in) /* { dg-error "predeclared arithmetic type" } */ +} + +#pragma omp declare reduction (| : __typeof (foo) : omp_out |= omp_in) /* { dg-error "function or array" } */ +#pragma omp declare reduction (+ : char () : omp_out += omp_in) /* { dg-error "function or array" } */ +#pragma omp declare reduction (min : T[2] : omp_out += omp_in) /* { dg-error "function or array" } */ + +void +bar (void) +{ + #pragma omp declare reduction (| : __typeof (foo) : omp_out |= omp_in)/* { dg-error "function or array" } */ + #pragma omp declare reduction (+ : char () : omp_out += omp_in) /* { dg-error "function or array" } */ + #pragma omp declare reduction (min : T[2] : omp_out += omp_in) /* { dg-error "function or array" } */ +} + +struct A { int a; }; +#pragma omp declare reduction (| : const struct A : omp_out.a |= omp_in.a) /* { dg-error "const, volatile or restrict" } */ +#pragma omp declare reduction (+ : __const struct A : omp_out.a += omp_in.a) /* { dg-error "const, volatile or restrict" } */ +typedef volatile struct A T2; +#pragma omp declare reduction (min : T2 : omp_out.a += omp_in.a) /* { dg-error "const, volatile or restrict" } */ +#pragma omp declare reduction (* : struct A *__restrict : omp_out->a *= omp_in->a)/* { dg-error "const, volatile or restrict" } */ + +void +baz (void) +{ + #pragma omp declare reduction (| : const struct A : omp_out.a |= omp_in.a) /* { dg-error "const, volatile or restrict" } */ + #pragma omp declare reduction (+ : __const struct A : omp_out.a += omp_in.a) /* { dg-error "const, volatile or restrict" } */ + typedef volatile struct A T3; + #pragma omp declare reduction (min : T3 : omp_out.a += omp_in.a) /* { dg-error "const, volatile or restrict" } */ + #pragma omp declare reduction (* : struct A *__restrict : omp_out->a *= omp_in->a)/* { dg-error "const, volatile or restrict" } */ +} diff --git a/gcc/testsuite/gcc.dg/gomp/udr-2.c b/gcc/testsuite/gcc.dg/gomp/udr-2.c new file mode 100644 index 00000000000..87992d7c6ed --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/udr-2.c @@ -0,0 +1,42 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp" } */ + +struct W { int w; }; +void init (struct W *, int, int *); +int v; +#pragma omp declare reduction (foo : long int : omp_out |= v) /* { dg-error "combiner refers to variable" } */ +#pragma omp declare reduction (foo : char : omp_out = v) /* { dg-error "combiner refers to variable" } */ +typedef short T; +#pragma omp declare reduction (foo : T : omp_out += v) /* { dg-error "combiner refers to variable" } */ +#pragma omp declare reduction (foo : int : v *= omp_in) /* { dg-error "combiner refers to variable" } */ +#pragma omp declare reduction (foo : struct W : omp_out.w *= omp_in.w + v) /* { dg-error "combiner refers to variable" } */ + +void +foo (int v) +{ + #pragma omp declare reduction (foo : long int : omp_out |= v) /* { dg-error "combiner refers to variable" } */ + #pragma omp declare reduction (foo : char : omp_out = v) /* { dg-error "combiner refers to variable" } */ + #pragma omp declare reduction (foo : T : omp_out += v) /* { dg-error "combiner refers to variable" } */ + #pragma omp declare reduction (foo : int : v *= omp_in) /* { dg-error "combiner refers to variable" } */ + #pragma omp declare reduction (foo : struct W : omp_out.w *= omp_in.w + v) /* { dg-error "combiner refers to variable" } */ +} + +#pragma omp declare reduction (bar : long int : omp_out |= omp_in) initializer (omp_priv = v) /* { dg-error "initializer refers to variable" } */ +#pragma omp declare reduction (bar : char : omp_out += omp_in) initializer (omp_priv = ((char) v)) /* { dg-error "initializer refers to variable" } */ +#pragma omp declare reduction (bar : T : omp_out += omp_in) initializer (omp_priv = (short) v) /* { dg-error "initializer refers to variable" } */ +#pragma omp declare reduction (bar : _Complex double : omp_out *= omp_in) initializer (omp_priv = (v)) /* { dg-error "initializer refers to variable" } */ +#pragma omp declare reduction (bar : struct W : omp_out.w *= omp_in.w) initializer (omp_priv = { v } ) /* { dg-error "initializer refers to variable" } */ +#pragma omp declare reduction (bar2 : struct W : omp_out.w *= omp_in.w) initializer (init (&omp_priv, v, (int *) 0)) /* { dg-error "initializer refers to variable" } */ +#pragma omp declare reduction (bar3 : struct W : omp_out.w *= omp_in.w) initializer (init (&omp_priv, 0, &v)) /* { dg-error "initializer refers to variable" } */ + +void +bar (int v) +{ + #pragma omp declare reduction (bar : long int : omp_out |= omp_in) initializer (omp_priv = v) /* { dg-error "initializer refers to variable" } */ + #pragma omp declare reduction (bar : char : omp_out += omp_in) initializer (omp_priv = ((char) v)) /* { dg-error "initializer refers to variable" } */ + #pragma omp declare reduction (bar : T : omp_out += omp_in) initializer (omp_priv = (short) v) /* { dg-error "initializer refers to variable" } */ + #pragma omp declare reduction (bar : _Complex double : omp_out *= omp_in) initializer (omp_priv = (v)) /* { dg-error "initializer refers to variable" } */ + #pragma omp declare reduction (bar : struct W : omp_out.w *= omp_in.w) initializer (omp_priv = { v }) /* { dg-error "initializer refers to variable" } */ + #pragma omp declare reduction (bar2 : struct W : omp_out.w *= omp_in.w) initializer (init (&omp_priv, v, (int *) 0)) /* { dg-error "initializer refers to variable" } */ + #pragma omp declare reduction (bar3 : struct W : omp_out.w *= omp_in.w) initializer (init (&omp_priv, 0, &v)) /* { dg-error "initializer refers to variable" } */ +} diff --git a/gcc/testsuite/gcc.dg/gomp/udr-3.c b/gcc/testsuite/gcc.dg/gomp/udr-3.c new file mode 100644 index 00000000000..bdfcce1d0b6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/udr-3.c @@ -0,0 +1,77 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp" } */ + +struct S { int s; }; +struct T { int t; }; +struct U { int u; }; + +#pragma omp declare reduction (+: struct S: omp_out.s += omp_in.s) +#pragma omp declare reduction (*: struct S: omp_out.s *= omp_in.s) \ + initializer (omp_priv = {1}) +#pragma omp declare reduction (foo: struct S: omp_out.s += omp_in.s) + +void +f1 () +{ + struct S s, s2; + struct T t; + #pragma omp declare reduction (+: struct T: omp_out.t += omp_in.t) + #pragma omp parallel reduction (+: t) reduction (foo: s) reduction (*: s2) + s.s = 1, t.t = 1, s2.s = 2; + #pragma omp parallel reduction (+: s) + s.s = 1; +} + +void bar (struct S *); + +void +f2 () +{ + #pragma omp declare reduction (foo: struct S: omp_out.s += omp_in.s) initializer (bar (&omp_priv)) + #pragma omp declare reduction (bar: struct S: omp_out.s += omp_in.s) initializer (bar (&omp_orig)) /* { dg-error "one of the initializer call arguments should be" } */ +} + +#pragma omp declare reduction (+: struct U: omp_out.u *= omp_in.u) /* { dg-error "previous" } */ +#pragma omp declare reduction (+: struct U: omp_out.u += omp_in.u) /* { dg-error "redeclaration of" } */ + +void +f3 () +{ + #pragma omp declare reduction (f3: struct U: omp_out.u *= omp_in.u) /* { dg-error "previous" } */ + #pragma omp declare reduction (f3: struct U: omp_out.u += omp_in.u) /* { dg-error "redeclaration of" } */ +} + +struct V +{ + #pragma omp declare reduction (bar: struct S: omp_out.s *= omp_in.s) /* { dg-error "not at file or block scope" } */ + #pragma omp declare reduction (bar: struct S: omp_out.s += omp_in.s) /* { dg-error "not at file or block scope" } */ +}; + +#pragma omp declare reduction (n3: long: omp_out += omp_in) /* { dg-error "previous" } */ +#pragma omp declare reduction (n3: long int: omp_out += omp_in) /* { dg-error "redeclaration of" } */ +#pragma omp declare reduction (n3: short unsigned: omp_out += omp_in) +#pragma omp declare reduction (n3: short int: omp_out += omp_in) + +void +f4 (void) +{ + #pragma omp declare reduction (f4: long: omp_out += omp_in) /* { dg-error "previous" } */ + #pragma omp declare reduction (f4: long int: omp_out += omp_in) /* { dg-error "redeclaration of" } */ + #pragma omp declare reduction (f4: short unsigned: omp_out += omp_in) + #pragma omp declare reduction (f4: short int: omp_out += omp_in) +} + +void +f5 (void) +{ + #pragma omp declare reduction (+: struct S: omp_out.s += omp_in.s) initializer (omp_priv) /* { dg-error "expected" } */ + #pragma omp declare reduction (+: struct T: omp_out.t += omp_in.t) initializer (omp_priv ()) /* { dg-error "expected" } */ +} + +void +f6 (a, b) +#pragma omp declare reduction (bar: struct S: omp_out.s *= omp_in.s) /* { dg-error "expected declaration specifiers before" } */ + int a; + int b; +{ +} diff --git a/gcc/testsuite/gcc.dg/gomp/udr-4.c b/gcc/testsuite/gcc.dg/gomp/udr-4.c new file mode 100644 index 00000000000..3758f91e851 --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/udr-4.c @@ -0,0 +1,6 @@ +/* { dg-do compile } */ + +struct S; +#pragma omp declare reduction (+:struct S:omp_out.s += omp_in.s) /* { dg-error "invalid use of undefined type" } */ +struct S { int s; }; +#pragma omp declare reduction (*:struct S:omp_out.s *= omp_in.s) diff --git a/gcc/testsuite/gcc.dg/pr58463.c b/gcc/testsuite/gcc.dg/pr58463.c new file mode 100644 index 00000000000..e2b44119347 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr58463.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-fdump-tree-ealias-details -O2" } */ + +typedef struct +{ + int data16; +} +list_data; +void +fn1 (list_data * p1) +{ + p1->data16 = p1->data16 & 1 & p1->data16 >> 1; +} + +/* { dg-final { cleanup-tree-dump "ealias" } } */ diff --git a/gcc/testsuite/gcc.dg/tls/pr42894.c b/gcc/testsuite/gcc.dg/tls/pr42894.c index c3bd76c91c4..2875b494c05 100644 --- a/gcc/testsuite/gcc.dg/tls/pr42894.c +++ b/gcc/testsuite/gcc.dg/tls/pr42894.c @@ -1,6 +1,5 @@ /* PR target/42894 */ /* { dg-do compile } */ -/* { dg-options "-march=armv5te -mthumb" { target arm*-*-* } } */ /* { dg-require-effective-target tls } */ extern __thread int t; diff --git a/gcc/testsuite/gcc.dg/torture/builtin-self.c b/gcc/testsuite/gcc.dg/torture/builtin-self.c new file mode 100644 index 00000000000..6d1719f7517 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/builtin-self.c @@ -0,0 +1,10 @@ +/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ +/* Check that we can use this idiom to define out-of-line copies of built-in + functions. This is used by libgcc/sync.c, for example. */ +void __sync_synchronize (void) +{ + __sync_synchronize (); +} +/* { dg-final { scan-assembler "__sync_synchronize" } } */ +/* { dg-final { scan-assembler "\t(lock|mfence)" } } */ +/* { dg-final { scan-assembler-not "\tcall" } } */ diff --git a/gcc/testsuite/gcc.dg/torture/pr51244-21.c b/gcc/testsuite/gcc.dg/torture/pr51244-21.c new file mode 100644 index 00000000000..fbb02db28e0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr51244-21.c @@ -0,0 +1,75 @@ +/* { dg-do run } */ +#include <assert.h> + +static inline int +blk_oversized_queue (int* q) +{ + if (q[2]) + return q[1] != 0; + return q[0] == 0; +} + +int __attribute__ ((noinline)) +get_request (int* q, int rw) +{ + if (blk_oversized_queue (q)) + { + if ((rw == 1) || (rw == 0)) + return -33; + + return 0; + } + + return -100; +} + +int main (void) +{ + int x[3]; + int r; + + x[0] = 0; x[1] = 1; x[2] = 1; + r = get_request (x, 0); + assert (r == -33); + + r = get_request (x, 1); + assert (r == -33); + + r = get_request (x, 2); + assert (r == 0); + + + x[0] = 0; x[1] = 0; x[2] = 1; + r = get_request (x, 0); + assert (r == -100); + + r = get_request (x, 1); + assert (r == -100); + + r = get_request (x, 2); + assert (r == -100); + + + x[0] = 0; x[1] = 0; x[2] = 0; + r = get_request (x, 0); + assert (r == -33); + + r = get_request (x, 1); + assert (r == -33); + + r = get_request (x, 2); + assert (r == 0); + + + x[0] = 0; x[1] = 0; x[2] = 0; + r = get_request (x, 0); + assert (r == -33); + + r = get_request (x, 1); + assert (r == -33); + + r = get_request (x, 2); + assert (r == 0); + + return 0; +} diff --git a/gcc/testsuite/gcc.dg/torture/pr58143-1.c b/gcc/testsuite/gcc.dg/torture/pr58143-1.c new file mode 100644 index 00000000000..855515edb97 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr58143-1.c @@ -0,0 +1,51 @@ +/* { dg-do run } */ +/* { dg-additional-options "-fstrict-overflow" } */ + +extern void abort (void); + +int a, b, c, d, e, f, g, h = 1, i; + +int foo (int p) +{ + return p < 0 && a < - __INT_MAX__ - 1 - p ? 0 : 1; +} + +int *bar () +{ + int j; + i = h ? 0 : 1 % h; + for (j = 0; j < 1; j++) + for (d = 0; d; d++) + for (e = 1; e;) + return 0; + return 0; +} + +int baz () +{ + for (; b >= 0; b--) + for (c = 1; c >= 0; c--) + { + int *k = &c; + for (;;) + { + for (f = 0; f < 1; f++) + { + g = foo (*k); + bar (); + } + if (*k) + break; + return 0; + } + } + return 0; +} + +int main () +{ + baz (); + if (b != 0) + abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/torture/pr58143-2.c b/gcc/testsuite/gcc.dg/torture/pr58143-2.c new file mode 100644 index 00000000000..dd0dae1efe0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr58143-2.c @@ -0,0 +1,34 @@ +/* { dg-do run } */ +/* { dg-additional-options "-fstrict-overflow" } */ + +int a, b, d, e, f, *g, h, i; +volatile int c; + +char foo (unsigned char p) +{ + return p + 1; +} + +int bar () +{ + for (h = 0; h < 3; h = foo (h)) + { + c; + for (f = 0; f < 1; f++) + { + i = a && 0 < -__INT_MAX__ - h ? 0 : 1; + if (e) + for (; d;) + b = 0; + else + g = 0; + } + } + return 0; +} + +int main () +{ + bar (); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/torture/pr58143-3.c b/gcc/testsuite/gcc.dg/torture/pr58143-3.c new file mode 100644 index 00000000000..23ae9cd39ce --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr58143-3.c @@ -0,0 +1,18 @@ +/* { dg-do run } */ +/* { dg-additional-options "-fstrict-overflow" } */ + +int a, b, c, d, e; + +int +main () +{ + for (b = 4; b > -30; b--) + for (; c;) + for (;;) + { + e = a > __INT_MAX__ - b; + if (d) + break; + } + return 0; +} diff --git a/gcc/testsuite/gcc.dg/torture/pr58539.c b/gcc/testsuite/gcc.dg/torture/pr58539.c new file mode 100644 index 00000000000..a016150f18e --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr58539.c @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-g" } */ + +int a, b; + +extern void baz (int); + +int foo (int p) +{ + return p ? p : 1; +} + +void bar () +{ + int *c = &a, *d = &a; + for (b = 0; b < 12; b++) + *d |= 1; + foo (*c); + baz (*c && 1); +} diff --git a/gcc/testsuite/gcc.dg/torture/pr58553.c b/gcc/testsuite/gcc.dg/torture/pr58553.c new file mode 100644 index 00000000000..542bf3f1018 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr58553.c @@ -0,0 +1,28 @@ +/* { dg-do run } */ + +#define MAX_LENGTH 96 +#define SEQUENCE_LENGTH 31 + +static struct { + char buf[MAX_LENGTH + 1]; +} u1, u2; + +extern void abort (void); + +int main () +{ + int i; + char c; + + for (i = 0, c = 'A'; i < MAX_LENGTH; i++, c++) + { + u1.buf[i] = 'a'; + if (c >= 'A' + SEQUENCE_LENGTH) + c = 'A'; + u2.buf[i] = c; + } + if (u1.buf[MAX_LENGTH] != '\0') + abort (); + + return 0; +} diff --git a/gcc/testsuite/gcc.dg/torture/pr58554.c b/gcc/testsuite/gcc.dg/torture/pr58554.c new file mode 100644 index 00000000000..269171ae941 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr58554.c @@ -0,0 +1,20 @@ +/* { dg-do run } */ + +extern void abort (void); +void __attribute__((noinline,noclone)) +clear_board(unsigned char *board, int board_size) +{ + int k; + for (k = 0; k < 421; k++) + if (k < board_size ) + board[k] = 3; +} +int main() +{ + unsigned char board[421]; + board[420] = 1; + clear_board (board, 420); + if (board[420] != 1) + abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/torture/pr58670.c b/gcc/testsuite/gcc.dg/torture/pr58670.c new file mode 100644 index 00000000000..ba9fce71f9e --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr58670.c @@ -0,0 +1,47 @@ +/* PR middle-end/58670 */ +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ + +#if defined (__i386__) || defined (__x86_64__) +#define ASM_STR "btsl $1, %0; jc %l[lab]" +#endif + +__attribute__((noinline, noclone)) int +foo (int a, int b) +{ + if (a) + return -3; +#ifdef ASM_STR + asm volatile goto (ASM_STR : : "m" (b) : "memory" : lab); + return 0; +lab: +#endif + return 0; +} + +int +bar (int a, int b) +{ + if (a) + return -3; +#ifdef ASM_STR + asm volatile goto (ASM_STR : : "m" (b) : "memory" : lab); + return 0; +lab: +#endif + return 0; +} + +int +main () +{ + if (foo (1, 0) != -3 + || foo (0, 3) != 0 + || foo (1, 0) != -3 + || foo (0, 0) != 0 + || bar (1, 0) != -3 + || bar (0, 3) != 0 + || bar (1, 0) != -3 + || bar (0, 0) != 0) + __builtin_abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/tree-prof/tree-prof.exp b/gcc/testsuite/gcc.dg/tree-prof/tree-prof.exp index 1f50eb3221b..141959aae8a 100644 --- a/gcc/testsuite/gcc.dg/tree-prof/tree-prof.exp +++ b/gcc/testsuite/gcc.dg/tree-prof/tree-prof.exp @@ -15,7 +15,7 @@ # <http://www.gnu.org/licenses/>. # Test the functionality of programs compiled with profile-directed block -# ordering using -fprofile-generate followed by -fbranch-use. +# ordering using -fprofile-generate followed by -fprofile-use. load_lib target-supports.exp diff --git a/gcc/testsuite/gcc.dg/tree-ssa/coalesce-2.c b/gcc/testsuite/gcc.dg/tree-ssa/coalesce-2.c new file mode 100644 index 00000000000..56c5ccccc7f --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/coalesce-2.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-rtl-expand-details" } */ + +float total = 0.2; +void foo(int n) +{ + int i; + for (i = 0; i < n; i++) + total += i; +} + +/* Verify that out-of-ssa coalescing did its job by verifying there are not + any partition copies inserted. */ + +/* { dg-final { scan-rtl-dump-not "partition copy" "expand"} } */ +/* { dg-final { cleanup-rtl-dump "expand" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11.c b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11.c index be3a49dfaca..e5019c01259 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11.c @@ -1,6 +1,6 @@ /* { dg-do run { target vect_cmdline_needed } } */ -/* { dg-options "-O2 -ftree-vectorize -fwrapv -fdump-tree-vect-details" } */ -/* { dg-options "-O2 -ftree-vectorize -fwrapv -fdump-tree-vect-details -mno-sse" { target { i?86-*-* x86_64-*-* } } } */ +/* { dg-options "-O2 -ftree-vectorize -fwrapv -fdump-tree-vect-details -fvect-cost-model=dynamic" } */ +/* { dg-options "-O2 -ftree-vectorize -fwrapv -fdump-tree-vect-details -fvect-cost-model=dynamic -mno-sse" { target { i?86-*-* x86_64-*-* } } } */ #include <stdlib.h> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11a.c b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11a.c index 7af5fd07238..8344fdf59f3 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11a.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11a.c @@ -1,6 +1,6 @@ /* { dg-do run { target vect_cmdline_needed } } */ -/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details" } */ -/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details -mno-sse" { target { i?86-*-* x86_64-*-* } } } */ +/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details -fvect-cost-model=dynamic" } */ +/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details -fvect-cost-model=dynamic -mno-sse" { target { i?86-*-* x86_64-*-* } } } */ #include <stdlib.h> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-2.c b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-2.c index ad6f4b5af53..0888ecf59a3 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-2.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-2.c @@ -1,6 +1,6 @@ /* { dg-do run { target vect_cmdline_needed } } */ -/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details" } */ -/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details -mno-sse" { target { i?86-*-* x86_64-*-* } } } */ +/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details -fvect-cost-model=dynamic" } */ +/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details -fvect-cost-model=dynamic -mno-sse" { target { i?86-*-* x86_64-*-* } } } */ #include <stdlib.h> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-25.c b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-25.c index c96ee001e06..85bbc0b76f3 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-25.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-25.c @@ -1,6 +1,6 @@ /* { dg-do run { target vect_cmdline_needed } } */ -/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details" } */ -/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details -mno-sse" { target { i?86-*-* x86_64-*-* } } } */ +/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details -fvect-cost-model=dynamic" } */ +/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details -fvect-cost-model=dynamic -mno-sse" { target { i?86-*-* x86_64-*-* } } } */ #include <stdlib.h> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-26.c b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-26.c index f14bf837afa..dadeb073d3a 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-26.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-26.c @@ -1,6 +1,6 @@ /* { dg-do run { target vect_cmdline_needed } } */ -/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details" } */ -/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details -mno-sse" { target { i?86-*-* x86_64-*-* } } } */ +/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details -fvect-cost-model=dynamic" } */ +/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details -fvect-cost-model=dynamic -mno-sse" { target { i?86-*-* x86_64-*-* } } } */ #include <stdlib.h> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-28.c b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-28.c index d90520eff67..f314b28d3d4 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-28.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-28.c @@ -1,6 +1,6 @@ /* { dg-do run { target vect_cmdline_needed } } */ -/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details" } */ -/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details -mno-sse" { target { i?86-*-* x86_64-*-* } } } */ +/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details -fvect-cost-model=dynamic" } */ +/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details -fvect-cost-model=dynamic -mno-sse" { target { i?86-*-* x86_64-*-* } } } */ #include <stdlib.h> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-5.c b/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-5.c index abf1e07e2b8..8fc1244e1ad 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-5.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-5.c @@ -1,5 +1,5 @@ /* { dg-do compile { target nonpic } } */ -/* { dg-options "-O3 -fdump-tree-fnsplit -fdump-tree-optimized" } */ +/* { dg-options "-O3 -fdump-tree-fnsplit -fdump-tree-optimized --param=builtin-expect-probability=100" } */ struct a {int a,b;}; struct a make_me_big (int a); diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-6.c b/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-6.c index 12070fa3362..fcdf79d7027 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-6.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-6.c @@ -1,6 +1,6 @@ /* PR tree-optimization/52019 */ /* { dg-do compile } */ -/* { dg-options "-O3 -fno-tree-sra -fdump-tree-fnsplit -fdump-tree-optimized" } */ +/* { dg-options "-O3 -fno-tree-sra -fdump-tree-fnsplit -fdump-tree-optimized --param=builtin-expect-probability=100" } */ #include "ipa-split-5.c" diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ldist-11.c b/gcc/testsuite/gcc.dg/tree-ssa/ldist-11.c index e55a1b64ecc..902c25b1553 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ldist-11.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ldist-11.c @@ -28,6 +28,6 @@ void foo (int * __restrict__ ia, */ } -/* { dg-final { scan-tree-dump-times "distributed: split to 2 loops" 1 "ldist" } } */ +/* { dg-final { scan-tree-dump-times "distributed: split to 1 loops and 1 library calls" 1 "ldist" } } */ /* { dg-final { scan-tree-dump-times "generated memset zero" 1 "ldist" } } */ /* { dg-final { cleanup-tree-dump "ldist" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ldist-17.c b/gcc/testsuite/gcc.dg/tree-ssa/ldist-17.c index 5c280b3f0c4..bbf54db2be9 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ldist-17.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ldist-17.c @@ -45,6 +45,6 @@ mad_synth_mute (struct mad_synth *synth) return; } -/* { dg-final { scan-tree-dump "distributed: split to 4" "ldist" } } */ +/* { dg-final { scan-tree-dump "distributed: split to 0 loops and 4 library calls" "ldist" } } */ /* { dg-final { scan-tree-dump-times "generated memset zero" 4 "ldist" } } */ /* { dg-final { cleanup-tree-dump "ldist" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ldist-23.c b/gcc/testsuite/gcc.dg/tree-ssa/ldist-23.c index 22b82d9920d..0e7609bdb57 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ldist-23.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ldist-23.c @@ -29,6 +29,6 @@ int main() return 0; } -/* { dg-final { scan-tree-dump "split to 2 loops" "ldist" } } */ +/* { dg-final { scan-tree-dump "split to 1 loops and 1 library call" "ldist" } } */ /* { dg-final { scan-tree-dump "generated memcpy" "ldist" } } */ /* { dg-final { cleanup-tree-dump "ldist" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ldist-pr45948.c b/gcc/testsuite/gcc.dg/tree-ssa/ldist-pr45948.c index da3c7b626f9..f25a9106430 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ldist-pr45948.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ldist-pr45948.c @@ -18,6 +18,6 @@ foo (int i, int n) /* We should apply loop distribution and generate 2 memset (0). */ -/* { dg-final { scan-tree-dump "distributed: split to 2" "ldist" } } */ +/* { dg-final { scan-tree-dump "distributed: split to 0 loops and 2 library calls" "ldist" } } */ /* { dg-final { scan-tree-dump-times "generated memset zero" 2 "ldist" } } */ /* { dg-final { cleanup-tree-dump "ldist" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-11.c b/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-11.c new file mode 100644 index 00000000000..7c83007e7f1 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-11.c @@ -0,0 +1,25 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -fdump-tree-optimized" } */ + +int f(int a, int b, int c) +{ + if (a == 0 && b > c) + return 0; + return a; +} + +int g(int a, int b, int c) +{ + if (a == 42 && b > c) + return 42; + return a; +} + +int h(int a, int b, int c, int d) +{ + if (a == d && b > c) + return d; + return a; +} +/* { dg-final { scan-tree-dump-times "if" 0 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr20318.c b/gcc/testsuite/gcc.dg/tree-ssa/pr20318.c new file mode 100644 index 00000000000..1b302aedefa --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr20318.c @@ -0,0 +1,19 @@ +/* { dg-do compile { target { ! keeps_null_pointer_checks } } } */ +/* { dg-options "-O2 -fdump-tree-original -fdump-tree-vrp1" } */ + +extern int* f(int) __attribute__((returns_nonnull)); +extern void eliminate (); +void g () { + if (f (2) == 0) + eliminate (); +} +void h () { + int *p = f (2); + if (p == 0) + eliminate (); +} + +/* { dg-final { scan-tree-dump-times "== 0" 1 "original" } } */ +/* { dg-final { scan-tree-dump-times "Folding predicate\[^\\n\]*to 0" 1 "vrp1" } } */ +/* { dg-final { cleanup-tree-dump "original" } } */ +/* { dg-final { cleanup-tree-dump "vrp1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr58480.c b/gcc/testsuite/gcc.dg/tree-ssa/pr58480.c new file mode 100644 index 00000000000..a42edf973cb --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr58480.c @@ -0,0 +1,19 @@ +/* { dg-do compile { target { ! keeps_null_pointer_checks } } } */ +/* { dg-options "-O2 -fdump-tree-vrp1" } */ + +extern void eliminate (void); +extern void* f1 (void *a, void *b) __attribute__((nonnull)); +extern void* f2 (void *a, void *b) __attribute__((nonnull(2))); +void g1 (void*p, void*q){ + f1 (q, p); + if (p == 0) + eliminate (); +} +void g2 (void*p, void*q){ + f2 (q, p); + if (p == 0) + eliminate (); +} + +/* { dg-final { scan-tree-dump-times "Folding predicate\[^\\n\]*to 0" 2 "vrp1" } } */ +/* { dg-final { cleanup-tree-dump "vrp1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/reassoc-32.c b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-32.c new file mode 100644 index 00000000000..303b3f32bd9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-32.c @@ -0,0 +1,29 @@ +/* { dg-do run { target { ! "m68k*-*-* mmix*-*-* mep*-*-* bfin*-*-* v850*-*-* picochip*-*-* moxie*-*-* cris*-*-* m32c*-*-* fr30*-*-* mcore*-*-* powerpc*-*-* xtensa*-*-*"} } } */ + +/* { dg-options "-O2 -fno-inline -fdump-tree-reassoc1-details" } */ +/* { dg-additional-options "-mbranch-cost=2" { target avr-*-* } } */ + + +int test (int a, int b, int c) +{ + if ( a == 10 || a == 12 || a == 26) + return b; + else + return c; +} + +int main () +{ + if (test (10, 20, 30) != 20) + __builtin_abort (); + if (test (12, 20, 30) != 20) + __builtin_abort (); + if (test (26, 20, 30) != 20) + __builtin_abort (); + if (test (30, 20, 30) != 30) + __builtin_abort (); + return 0; +} + +/* { dg-final { scan-tree-dump-times "Optimizing range tests .* 26" 1 "reassoc1"} }*/ +/* { dg-final { cleanup-tree-dump "reassoc1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/reassoc-33.c b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-33.c new file mode 100644 index 00000000000..bb27daa8c14 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-33.c @@ -0,0 +1,27 @@ +/* { dg-do run { target { ! "m68k*-*-* mmix*-*-* mep*-*-* bfin*-*-* v850*-*-* picochip*-*-* moxie*-*-* cris*-*-* m32c*-*-* fr30*-*-* mcore*-*-* powerpc*-*-* xtensa*-*-*"} } } */ + +/* { dg-options "-O2 -fno-inline -fdump-tree-reassoc1-details" } */ +/* { dg-additional-options "-mbranch-cost=2" { target avr-*-* } } */ + +int test (int a, int b, int c) +{ + if (a == 43 || a == 75 || a == 44 || a == 78 + || a == 77 || a == 46 || a == 76 || a == 45) + return b; + else + return c; +} + +int +main () +{ + volatile int n43, n47, n75, n79; + n43 = 43; n47 = n43 + 4; n75 = 75; n79 = n75 + 4; + int i; + for (i = -10; i <= 100; i++) + if (test (i, 2, 3) != 3 - ((i >= n43 && i < n47) || (i >= n75 && i < n79))) + __builtin_abort (); + return 0; +} +/* { dg-final { scan-tree-dump-times "Optimizing range tests" 3 "reassoc1"} }*/ +/* { dg-final { cleanup-tree-dump "reassoc1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/reassoc-34.c b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-34.c new file mode 100644 index 00000000000..156e1824222 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-34.c @@ -0,0 +1,24 @@ +/* { dg-do run { target { ! "m68k*-*-* mmix*-*-* mep*-*-* bfin*-*-* v850*-*-* picochip*-*-* moxie*-*-* cris*-*-* m32c*-*-* fr30*-*-* mcore*-*-* powerpc*-*-* xtensa*-*-*"} } } */ + +/* { dg-options "-O2 -fno-inline -fdump-tree-reassoc1-details" } */ +/* { dg-additional-options "-mbranch-cost=2" { target avr-*-* } } */ + +int test (int a, int b, int c) +{ + if (a == 10 || a == 12) + return b; + else + return c; +} +int main () +{ + if (test (10, 20, 30) != 20) + __builtin_abort (); + if (test (12, 20, 30) != 20) + __builtin_abort (); + if (test (26, 20, 30) != 30) + __builtin_abort (); + return 0; +} +/* { dg-final { scan-tree-dump-times "Optimizing range tests" 1 "reassoc1"} }*/ +/* { dg-final { cleanup-tree-dump "reassoc1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/reassoc-35.c b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-35.c new file mode 100644 index 00000000000..c486b783dce --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-35.c @@ -0,0 +1,26 @@ +/* { dg-do run { target { ! "m68k*-*-* mmix*-*-* mep*-*-* bfin*-*-* v850*-*-* picochip*-*-* moxie*-*-* cris*-*-* m32c*-*-* fr30*-*-* mcore*-*-* powerpc*-*-* xtensa*-*-*"} } } */ + +/* { dg-options "-O2 -fno-inline -fdump-tree-reassoc1-details" } */ +/* { dg-additional-options "-mbranch-cost=2" { target avr-*-* } } */ + +int test (unsigned int a, int b, int c) +{ + if ((a - 43) <= 3 || (a - 75) <= 3) + return b; + else + return c; +} +int +main () +{ + volatile int n43, n47, n75, n79; + n43 = 43; n47 = n43 + 4; n75 = 75; n79 = n75 + 4; + int i; + for (i = -10; i <= 100; i++) + if (test (i, 2, 3) != 3 - ((i >= n43 && i < n47) || (i >= n75 && i < n79))) + __builtin_abort (); + return 0; +} + +/* { dg-final { scan-tree-dump-times "Optimizing range tests" 1 "reassoc1"} }*/ +/* { dg-final { cleanup-tree-dump "reassoc1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/reassoc-36.c b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-36.c new file mode 100644 index 00000000000..930dbe289fb --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-36.c @@ -0,0 +1,25 @@ +/* { dg-do run { target { ! "m68k*-*-* mmix*-*-* mep*-*-* bfin*-*-* v850*-*-* picochip*-*-* moxie*-*-* cris*-*-* m32c*-*-* fr30*-*-* mcore*-*-* powerpc*-*-* xtensa*-*-*"} } } */ + +/* { dg-options "-O2 -fno-inline -fdump-tree-reassoc1-details" } */ +/* { dg-additional-options "-mbranch-cost=2" { target avr-*-* } } */ + +int test (int a, int b, int c) +{ + if (a != 10 && a != 12) + return b; + else + return c; +} +int main () +{ + if (test (10, 20, 30) != 30) + __builtin_abort (); + if (test (12, 20, 30) != 30) + __builtin_abort (); + if (test (26, 20, 30) != 20) + __builtin_abort (); + return 0; +} + +/* { dg-final { scan-tree-dump-times "Optimizing range tests" 1 "reassoc1"} }*/ +/* { dg-final { cleanup-tree-dump "reassoc1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/slsr-40.c b/gcc/testsuite/gcc.dg/tree-ssa/slsr-40.c new file mode 100644 index 00000000000..72726a3aa3b --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/slsr-40.c @@ -0,0 +1,27 @@ +/* Verify straight-line strength reduction for array + subscripting. + + elems[n-1] is reduced to elems + n * 4 + 0xffffffff * 4, only when + pointers are of the same size as that of int (assuming 4 bytes). */ + +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +struct data +{ + unsigned long elms[1]; +} gData; + +void __attribute__((noinline)) +foo (struct data *dst, unsigned int n) +{ + dst->elms[n - 1] &= 1; +} + +int +main () +{ + foo (&gData, 1); + return 0; +} + diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-3.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-3.c index d2a1fbb436a..0d53f501d84 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-3.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-3.c @@ -42,8 +42,7 @@ expand_one_var (tree var, unsigned char toplevel, unsigned char really_expand) abort (); } /* We should thread the jump, through an intermediate block. */ -/* { dg-final { scan-tree-dump-times "Threaded" 1 "dom1"} } */ -/* { dg-final { scan-tree-dump-times "Registering jump thread .through joiner block.: \\(.*\\); \\(.*\\); \\(.*\\);" 1 "dom1"} } */ - +/* { dg-final { scan-tree-dump-times "Threaded" 2 "dom1"} } */ +/* { dg-final { scan-tree-dump-times "Registering jump thread: \\(.*\\) incoming edge; \\(.*\\) joiner; \\(.*\\) nocopy;" 1 "dom1"} } */ /* { dg-final { cleanup-tree-dump "dom1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-31.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-31.c new file mode 100644 index 00000000000..2094de4ca89 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-31.c @@ -0,0 +1,47 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-pre" } */ + +typedef struct { + unsigned int key; +} S; +typedef struct s1 { + unsigned int key; + unsigned int bits; + struct s1 *left, *right; +}S1; +extern S a[1024]; +static inline int bar( S* p, S1* n ) +{ + S1 *curr; + S1 *next; + + if ( n->left == n ) + return (int)(p->key == n->key); + + curr = n; + next = n->left; + + while (curr->bits > next->bits ) { + curr = next; + if (p->key & (1 << curr->bits)) + next = curr->right; + else + next = curr->left; + } + + return (int)(p->key == next->key); + +} + +int foo (S1 *root, int N) +{ + volatile int r; + int i,j; + for (i=0; i<N; i++) + for (j=0;j<1024; j++) + r = bar(&a[j], root); + return 0; +} + +/* { dg-final { scan-tree-dump-times "key" 4 "pre" } } */ +/* { dg-final { cleanup-tree-dump "pre" } } */ diff --git a/gcc/testsuite/gcc.dg/ubsan/c-shift-1.c b/gcc/testsuite/gcc.dg/ubsan/c-shift-1.c new file mode 100644 index 00000000000..61b90105364 --- /dev/null +++ b/gcc/testsuite/gcc.dg/ubsan/c-shift-1.c @@ -0,0 +1,18 @@ +/* { dg-do compile} */ +/* { dg-options "-fsanitize=shift -w" } */ +/* { dg-shouldfail "ubsan" } */ + +int x; +int +main (void) +{ + /* None of the following should pass. */ + int A[1 >> -1] = {}; /* { dg-error "variable-sized object may not be initialized" } */ + int B[-1 >> -1] = {}; /* { dg-error "variable-sized object may not be initialized" } */ + int D[1 << -1] = {}; /* { dg-error "variable-sized object may not be initialized" } */ + int E[-1 << -1] = {}; /* { dg-error "variable-sized object may not be initialized" } */ + int F[-1 >> 200] = {}; /* { dg-error "variable-sized object may not be initialized" } */ + int G[1 << 200] = {}; /* { dg-error "variable-sized object may not be initialized" } */ + + return 0; +} diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-31.c b/gcc/testsuite/gcc.dg/vect/bb-slp-31.c index bbddb0ac28c..7ea341216d6 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-31.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-31.c @@ -10,3 +10,4 @@ void f(){ } /* { dg-final { scan-tree-dump "basic block vectorized" "slp" } } */ +/* { dg-final { cleanup-tree-dump "slp" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/pr58508.c b/gcc/testsuite/gcc.dg/vect/pr58508.c new file mode 100644 index 00000000000..6484a65c8d9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr58508.c @@ -0,0 +1,70 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details" } */ + + +/* The GCC vectorizer generates loop versioning for the following loop + since there may exist aliasing between A and B. The predicate checks + if A may alias with B across all iterations. Then for the loop in + the true body, we can assert that *B is a loop invariant so that + we can hoist the load of *B before the loop body. */ + +void test1 (int* a, int* b) +{ + int i; + for (i = 0; i < 100000; ++i) + a[i] = *b + 1; +} + +/* A test case with nested loops. The load of b[j+1] in the inner + loop should be hoisted. */ + +void test2 (int* a, int* b) +{ + int i, j; + for (j = 0; j < 100000; ++j) + for (i = 0; i < 100000; ++i) + a[i] = b[j+1] + 1; +} + +/* A test case with ifcvt transformation. */ + +void test3 (int* a, int* b) +{ + int i, t; + for (i = 0; i < 10000; ++i) + { + if (*b > 0) + t = *b * 2; + else + t = *b / 2; + a[i] = t; + } +} + +/* A test case in which the store in the loop can be moved outside + in the versioned loop with alias checks. Note this loop won't + be vectorized. */ + +void test4 (int* a, int* b) +{ + int i; + for (i = 0; i < 100000; ++i) + *a += b[i]; +} + +/* A test case in which the load and store in the loop to b + can be moved outside in the versioned loop with alias checks. + Note this loop won't be vectorized. */ + +void test5 (int* a, int* b) +{ + int i; + for (i = 0; i < 100000; ++i) + { + *b += a[i]; + a[i] = *b; + } +} + +/* { dg-final { scan-tree-dump-times "hoist" 8 "vect" } } */ +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-3.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-3.c new file mode 100644 index 00000000000..06a94168cd0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-pattern-3.c @@ -0,0 +1,41 @@ +/* { dg-require-effective-target vect_int } */ + +#include <stdarg.h> +#include "tree-vect.h" + +#define N 10 +#define RES 1024 + +/* A reduction pattern in which there is no data ref in + the loop and one operand is defined outside of the loop. */ + +__attribute__ ((noinline)) int +foo (int v) +{ + int i; + int result = 1; + + ++v; + for (i = 0; i < N; i++) + result *= v; + + return result; +} + +int +main (void) +{ + int res; + + check_vect (); + + res = foo (1); + if (res != RES) + abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */ +/* { dg-final { cleanup-tree-dump "vect" } } */ + diff --git a/gcc/testsuite/gcc.target/aarch64/c-output-template-2.c b/gcc/testsuite/gcc.target/aarch64/c-output-template-2.c new file mode 100644 index 00000000000..16ff58d9e28 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/c-output-template-2.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ + +struct tracepoint { + int dummy; + int state; +}; +static struct tracepoint tp; + +void +test (void) +{ + __asm__ ("@ %c0" : : "i" (&tp)); +} + +/* { dg-final { scan-assembler "@ tp" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/c-output-template-3.c b/gcc/testsuite/gcc.target/aarch64/c-output-template-3.c new file mode 100644 index 00000000000..e332fe18fb9 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/c-output-template-3.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ + +struct tracepoint { + int dummy; + int state; +}; +static struct tracepoint tp; + +void +test (void) +{ + __asm__ ("@ %c0" : : "i" (&tp.state)); +} + +/* { dg-final { scan-assembler "@ tp\\+4" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/c-output-template.c b/gcc/testsuite/gcc.target/aarch64/c-output-template.c new file mode 100644 index 00000000000..1b67c9169e3 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/c-output-template.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ + +void +test (void) +{ + __asm__ ("@ %c0" : : "i" (42)); +} + +/* { dg-final { scan-assembler "@ 42" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/pr58460.c b/gcc/testsuite/gcc.target/aarch64/pr58460.c new file mode 100644 index 00000000000..a7e149a371c --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/pr58460.c @@ -0,0 +1,35 @@ +/* { dg-do run } */ +/* { dg-options "-O" } */ +extern unsigned long x1; + +char * +f (char *a, char *b) +{ + return a; +} + +int +g (char *a) +{ + return 2; +} + +void +h (char *p[]) +{ + char n[x1][512]; + char *l = f (p[1], " "); + if (g (p[0])) + n[0][0] = '\0'; + while (l && *l) + { + } +} + +unsigned long x1; + +int +main () +{ + return 0; +} diff --git a/gcc/testsuite/gcc.target/aarch64/vadd_f64.c b/gcc/testsuite/gcc.target/aarch64/vadd_f64.c new file mode 100644 index 00000000000..c3bf7349597 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/vadd_f64.c @@ -0,0 +1,114 @@ +/* Test vadd works correctly. */ +/* { dg-do run } */ +/* { dg-options "--save-temps" } */ + +#include <arm_neon.h> + +#define FLT_EPSILON __FLT_EPSILON__ +#define DBL_EPSILON __DBL_EPSILON__ + +#define TESTA0 0.33333 +#define TESTA1 -1.7777 +#define TESTA2 0 +#define TESTA3 1.23456 +/* 2^54, double has 53 significand bits + according to Double-precision floating-point format. */ +#define TESTA4 18014398509481984 +#define TESTA5 (1.0 / TESTA4) + +#define TESTB0 0.66667 +#define TESTB1 2 +#define TESTB2 0 +#define TESTB3 -2 +#define TESTB4 1.0 +#define TESTB5 2.0 + +#define ANSW0 1 +#define ANSW1 0.2223 +#define ANSW2 0 +#define ANSW3 -0.76544 +#define ANSW4 TESTA4 +#define ANSW5 2.0 + +extern void abort (void); + +#define EPSILON __DBL_EPSILON__ +#define ABS(a) __builtin_fabs (a) +#define ISNAN(a) __builtin_isnan (a) +#define FP_equals(a, b, epsilon) \ + ( \ + ((a) == (b)) \ + || (ISNAN (a) && ISNAN (b)) \ + || (ABS (a - b) < epsilon) \ + ) + +int +test_vadd_f64 () +{ + float64x1_t a; + float64x1_t b; + float64x1_t c; + + a = TESTA0; + b = TESTB0; + c = ANSW0; + + a = vadd_f64 (a, b); + if (!FP_equals (a, c, EPSILON)) + return 1; + + a = TESTA1; + b = TESTB1; + c = ANSW1; + + a = vadd_f64 (a, b); + if (!FP_equals (a, c, EPSILON)) + return 1; + + a = TESTA2; + b = TESTB2; + c = ANSW2; + + a = vadd_f64 (a, b); + if (!FP_equals (a, c, EPSILON)) + return 1; + + a = TESTA3; + b = TESTB3; + c = ANSW3; + + a = vadd_f64 (a, b); + if (!FP_equals (a, c, EPSILON)) + return 1; + + a = TESTA4; + b = TESTB4; + c = ANSW4; + + a = vadd_f64 (a, b); + if (!FP_equals (a, c, EPSILON)) + return 1; + + a = TESTA5; + b = TESTB5; + c = ANSW5; + + a = vadd_f64 (a, b); + if (!FP_equals (a, c, EPSILON)) + return 1; + + return 0; +} + +/* { dg-final { scan-assembler-times "fadd\\td\[0-9\]+, d\[0-9\]+, d\[0-9\]+" 6 } } */ + +int +main (int argc, char **argv) +{ + if (test_vadd_f64 ()) + abort (); + + return 0; +} + +/* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/vclz.c b/gcc/testsuite/gcc.target/aarch64/vclz.c new file mode 100644 index 00000000000..006f80d77b5 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/vclz.c @@ -0,0 +1,574 @@ +/* Test vclz works correctly. */ +/* { dg-do run } */ +/* { dg-options "-std=gnu99 -O3 -Wno-div-by-zero --save-temps" } */ +#include <arm_neon.h> + +extern void abort (void); + +/* Tests in binary should look like: + 0 + 1 + 10 + 101 + 1010 + 10101 + etc. */ + +#define TEST0 0 +#define TEST1 0x1 +#define TEST2 0x2 +#define TEST3 0x5 +#define TEST4 0xa +#define TEST5 0x15 +#define TEST6 0x2a +#define TEST7 0x55 +#define TEST8 0xaa +#define TEST9 0x155 +#define TEST10 0x2aa +#define TEST11 0x555 +#define TEST12 0xaaa +#define TEST13 0x1555 +#define TEST14 0x2aaa +#define TEST15 0x5555 +#define TEST16 0xaaaa +#define TEST17 0x15555 +#define TEST18 0x2aaaa +#define TEST19 0x55555 +#define TEST20 0xaaaaa +#define TEST21 0x155555 +#define TEST22 0x2aaaaa +#define TEST23 0x555555 +#define TEST24 0xaaaaaa +#define TEST25 0x1555555 +#define TEST26 0x2aaaaaa +#define TEST27 0x5555555 +#define TEST28 0xaaaaaaa +#define TEST29 0x15555555 +#define TEST30 0x2aaaaaaa +#define TEST31 0x55555555 +#define TEST32 0xaaaaaaaa + +#define INHIB_OPTIMIZATION asm volatile ("" : : : "memory") + +#define CONCAT(a, b) a##b +#define CONCAT1(a, b) CONCAT (a, b) +#define REG_INFEX64 _ +#define REG_INFEX128 q_ +#define SIGNED0 u +#define SIGNED1 s +#define SIGNED(x) SIGNED##x +#define REG_INFEX(reg_len) REG_INFEX##reg_len +#define POSTFIX(reg_len, data_len, is_signed) \ + CONCAT1 (REG_INFEX (reg_len), CONCAT1 (SIGNED (is_signed), data_len)) +#define DATA_TYPE(data_len) DATA_TYPE_##data_len +#define LOAD_INST(reg_len, data_len, is_signed) \ + CONCAT1 (vld1, POSTFIX (reg_len, data_len, is_signed)) +#define CLZ_INST(reg_len, data_len, is_signed) \ + CONCAT1 (vclz, POSTFIX (reg_len, data_len, is_signed)) + +#define RUN_TEST(test_set, answ_set, reg_len, data_len, is_signed, n) \ + a = LOAD_INST (reg_len, data_len, is_signed) (test_set); \ + b = LOAD_INST (reg_len, data_len, is_signed) (answ_set); \ + INHIB_OPTIMIZATION; \ + a = CLZ_INST (reg_len, data_len, is_signed) (a); \ + for (i = 0; i < n; i++) \ + { \ + INHIB_OPTIMIZATION; \ + if (a [i] != b [i]) \ + { \ + return 1; \ + } \ + } + +int +test_vclz_s8 () +{ + int i; + int8x8_t a; + int8x8_t b; + + int8_t test_set0[8] = { + TEST0, TEST1, TEST2, TEST3, + TEST4, TEST5, TEST6, TEST7 + }; + int8_t test_set1[8] = { + TEST8, TEST8, TEST8, TEST8, + TEST8, TEST8, TEST8, TEST8 + }; + int8_t answ_set0[8] = { + 8, 7, 6, 5, + 4, 3, 2, 1 + }; + int8_t answ_set1[8] = { + 0, 0, 0, 0, + 0, 0, 0, 0 + }; + RUN_TEST (test_set0, answ_set0, 64, 8, 1, 8); + RUN_TEST (test_set1, answ_set1, 64, 8, 1, 1); + + return 0; +} + +/* Double scan-assembler-times to take account of unsigned functions. */ +/* { dg-final { scan-assembler-times "clz\\tv\[0-9\]+\.8b, v\[0-9\]+\.8b" 4 } } */ + +int +test_vclz_s16 () +{ + int i; + int16x4_t a; + int16x4_t b; + + int16_t test_set0[4] = { TEST0, TEST1, TEST2, TEST3 }; + int16_t test_set1[4] = { TEST4, TEST5, TEST6, TEST7 }; + int16_t test_set2[4] = { TEST8, TEST9, TEST10, TEST11 }; + int16_t test_set3[4] = { TEST12, TEST13, TEST14, TEST15 }; + int16_t test_set4[4] = { TEST16, TEST16, TEST16, TEST16 }; + + int16_t answ_set0[4] = { 16, 15, 14, 13 }; + int16_t answ_set1[4] = { 12, 11, 10, 9 }; + int16_t answ_set2[4] = { 8, 7, 6, 5 }; + int16_t answ_set3[4] = { 4, 3, 2, 1 }; + int16_t answ_set4[4] = { 0, 0, 0, 0 }; + + RUN_TEST (test_set0, answ_set0, 64, 16, 1, 4); + RUN_TEST (test_set1, answ_set1, 64, 16, 1, 4); + RUN_TEST (test_set2, answ_set2, 64, 16, 1, 4); + RUN_TEST (test_set3, answ_set3, 64, 16, 1, 4); + RUN_TEST (test_set4, answ_set4, 64, 16, 1, 1); + + return 0; +} + +/* Double scan-assembler-times to take account of unsigned functions. */ +/* { dg-final { scan-assembler-times "clz\\tv\[0-9\]+\.4h, v\[0-9\]+\.4h" 10} } */ + +int +test_vclz_s32 () +{ + int i; + int32x2_t a; + int32x2_t b; + + int32_t test_set0[2] = { TEST0, TEST1 }; + int32_t test_set1[2] = { TEST2, TEST3 }; + int32_t test_set2[2] = { TEST4, TEST5 }; + int32_t test_set3[2] = { TEST6, TEST7 }; + int32_t test_set4[2] = { TEST8, TEST9 }; + int32_t test_set5[2] = { TEST10, TEST11 }; + int32_t test_set6[2] = { TEST12, TEST13 }; + int32_t test_set7[2] = { TEST14, TEST15 }; + int32_t test_set8[2] = { TEST16, TEST17 }; + int32_t test_set9[2] = { TEST18, TEST19 }; + int32_t test_set10[2] = { TEST20, TEST21 }; + int32_t test_set11[2] = { TEST22, TEST23 }; + int32_t test_set12[2] = { TEST24, TEST25 }; + int32_t test_set13[2] = { TEST26, TEST27 }; + int32_t test_set14[2] = { TEST28, TEST29 }; + int32_t test_set15[2] = { TEST30, TEST31 }; + int32_t test_set16[2] = { TEST32, TEST32 }; + + int32_t answ_set0[2] = { 32, 31 }; + int32_t answ_set1[2] = { 30, 29 }; + int32_t answ_set2[2] = { 28, 27 }; + int32_t answ_set3[2] = { 26, 25 }; + int32_t answ_set4[2] = { 24, 23 }; + int32_t answ_set5[2] = { 22, 21 }; + int32_t answ_set6[2] = { 20, 19 }; + int32_t answ_set7[2] = { 18, 17 }; + int32_t answ_set8[2] = { 16, 15 }; + int32_t answ_set9[2] = { 14, 13 }; + int32_t answ_set10[2] = { 12, 11 }; + int32_t answ_set11[2] = { 10, 9 }; + int32_t answ_set12[2] = { 8, 7 }; + int32_t answ_set13[2] = { 6, 5 }; + int32_t answ_set14[2] = { 4, 3 }; + int32_t answ_set15[2] = { 2, 1 }; + int32_t answ_set16[2] = { 0, 0 }; + + RUN_TEST (test_set0, answ_set0, 64, 32, 1, 2); + RUN_TEST (test_set1, answ_set1, 64, 32, 1, 2); + RUN_TEST (test_set2, answ_set2, 64, 32, 1, 2); + RUN_TEST (test_set3, answ_set3, 64, 32, 1, 2); + RUN_TEST (test_set4, answ_set4, 64, 32, 1, 2); + RUN_TEST (test_set5, answ_set5, 64, 32, 1, 2); + RUN_TEST (test_set6, answ_set6, 64, 32, 1, 2); + RUN_TEST (test_set7, answ_set7, 64, 32, 1, 2); + RUN_TEST (test_set8, answ_set8, 64, 32, 1, 2); + RUN_TEST (test_set9, answ_set9, 64, 32, 1, 2); + RUN_TEST (test_set10, answ_set10, 64, 32, 1, 2); + RUN_TEST (test_set11, answ_set11, 64, 32, 1, 2); + RUN_TEST (test_set12, answ_set12, 64, 32, 1, 2); + RUN_TEST (test_set13, answ_set13, 64, 32, 1, 2); + RUN_TEST (test_set14, answ_set14, 64, 32, 1, 2); + RUN_TEST (test_set15, answ_set15, 64, 32, 1, 2); + RUN_TEST (test_set16, answ_set16, 64, 32, 1, 1); + + return 0; +} + +/* Double scan-assembler-times to take account of unsigned functions. */ +/* { dg-final { scan-assembler-times "clz\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" 34 } } */ + +int +test_vclzq_s8 () +{ + int i; + int8x16_t a; + int8x16_t b; + + int8_t test_set0[16] = { + TEST0, TEST1, TEST2, TEST3, TEST4, TEST5, TEST6, TEST7, + TEST8, TEST8, TEST8, TEST8, TEST8, TEST8, TEST8, TEST8 + }; + int8_t answ_set0[16] = { + 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0 + }; + RUN_TEST (test_set0, answ_set0, 128, 8, 1, 9); + return 0; +} + +/* Double scan-assembler-times to take account of unsigned functions. */ +/* { dg-final { scan-assembler-times "clz\\tv\[0-9\]+\.16b, v\[0-9\]+\.16b" 2 } } */ + +int +test_vclzq_s16 () +{ + int i; + int16x8_t a; + int16x8_t b; + + int16_t test_set0[8] = { + TEST0, TEST1, TEST2, TEST3, TEST4, TEST5, TEST6, TEST7 + }; + int16_t test_set1[8] = { + TEST8, TEST9, TEST10, TEST11, TEST12, TEST13, TEST14, TEST15 + }; + int16_t test_set2[8] = { + TEST16, TEST16, TEST16, TEST16, TEST16, TEST16, TEST16, TEST16 + }; + + int16_t answ_set0[8] = { + 16, 15, 14, 13, 12, 11, 10, 9 + }; + int16_t answ_set1[8] = { + 8, 7, 6, 5, 4, 3, 2, 1 + }; + int16_t answ_set2[8] = { + 0, 0, 0, 0, 0, 0, 0, 0 + }; + RUN_TEST (test_set0, answ_set0, 128, 16, 1, 8); + RUN_TEST (test_set1, answ_set1, 128, 16, 1, 8); + RUN_TEST (test_set2, answ_set2, 128, 16, 1, 1); + + return 0; +} + +/* Double scan-assembler-times to take account of unsigned functions. */ +/* { dg-final { scan-assembler-times "clz\\tv\[0-9\]+\.8h, v\[0-9\]+\.8h" 6 } } */ + +int +test_vclzq_s32 () +{ + int i; + int32x4_t a; + int32x4_t b; + + int32_t test_set0[4] = { TEST0, TEST1, TEST2, TEST3 }; + int32_t test_set1[4] = { TEST4, TEST5, TEST6, TEST7 }; + int32_t test_set2[4] = { TEST8, TEST9, TEST10, TEST11 }; + int32_t test_set3[4] = { TEST12, TEST13, TEST14, TEST15 }; + int32_t test_set4[4] = { TEST16, TEST17, TEST18, TEST19 }; + int32_t test_set5[4] = { TEST20, TEST21, TEST22, TEST23 }; + int32_t test_set6[4] = { TEST24, TEST25, TEST26, TEST27 }; + int32_t test_set7[4] = { TEST28, TEST29, TEST30, TEST31 }; + int32_t test_set8[4] = { TEST32, TEST32, TEST32, TEST32 }; + + int32_t answ_set0[4] = { 32, 31, 30, 29 }; + int32_t answ_set1[4] = { 28, 27, 26, 25 }; + int32_t answ_set2[4] = { 24, 23, 22, 21 }; + int32_t answ_set3[4] = { 20, 19, 18, 17 }; + int32_t answ_set4[4] = { 16, 15, 14, 13 }; + int32_t answ_set5[4] = { 12, 11, 10, 9 }; + int32_t answ_set6[4] = { 8, 7, 6, 5 }; + int32_t answ_set7[4] = { 4, 3, 2, 1 }; + int32_t answ_set8[4] = { 0, 0, 0, 0 }; + + RUN_TEST (test_set0, answ_set0, 128, 32, 1, 4); + RUN_TEST (test_set1, answ_set1, 128, 32, 1, 4); + RUN_TEST (test_set2, answ_set2, 128, 32, 1, 4); + RUN_TEST (test_set3, answ_set3, 128, 32, 1, 4); + RUN_TEST (test_set4, answ_set4, 128, 32, 1, 1); + + return 0; +} + +/* Double scan-assembler-times to take account of unsigned functions. */ +/* { dg-final { scan-assembler-times "clz\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" 10 } } */ + +/* Unsigned versions. */ + +int +test_vclz_u8 () +{ + int i; + uint8x8_t a; + uint8x8_t b; + + uint8_t test_set0[8] = { + TEST0, TEST1, TEST2, TEST3, TEST4, TEST5, TEST6, TEST7 + }; + uint8_t test_set1[8] = { + TEST8, TEST8, TEST8, TEST8, TEST8, TEST8, TEST8, TEST8 + }; + uint8_t answ_set0[8] = { + 8, 7, 6, 5, 4, 3, 2, 1 + }; + uint8_t answ_set1[8] = { + 0, 0, 0, 0, 0, 0, 0, 0 + }; + + RUN_TEST (test_set0, answ_set0, 64, 8, 0, 8); + RUN_TEST (test_set1, answ_set1, 64, 8, 0, 1); + + return 0; +} + +/* ASM scan near test for signed version. */ + +int +test_vclz_u16 () +{ + int i; + uint16x4_t a; + uint16x4_t b; + + uint16_t test_set0[4] = { TEST0, TEST1, TEST2, TEST3 }; + uint16_t test_set1[4] = { TEST4, TEST5, TEST6, TEST7 }; + uint16_t test_set2[4] = { TEST8, TEST9, TEST10, TEST11 }; + uint16_t test_set3[4] = { TEST12, TEST13, TEST14, TEST15 }; + uint16_t test_set4[4] = { TEST16, TEST16, TEST16, TEST16 }; + + uint16_t answ_set0[4] = { 16, 15, 14, 13 }; + uint16_t answ_set1[4] = { 12, 11, 10, 9 }; + uint16_t answ_set2[4] = { 8, 7, 6, 5 }; + uint16_t answ_set3[4] = { 4, 3, 2, 1 }; + uint16_t answ_set4[4] = { 0, 0, 0, 0 }; + + RUN_TEST (test_set0, answ_set0, 64, 16, 0, 4); + RUN_TEST (test_set1, answ_set1, 64, 16, 0, 4); + RUN_TEST (test_set2, answ_set2, 64, 16, 0, 4); + RUN_TEST (test_set3, answ_set3, 64, 16, 0, 4); + RUN_TEST (test_set4, answ_set4, 64, 16, 0, 1); + + return 0; +} + +/* ASM scan near test for signed version. */ + +int +test_vclz_u32 () +{ + int i; + uint32x2_t a; + uint32x2_t b; + + uint32_t test_set0[2] = { TEST0, TEST1 }; + uint32_t test_set1[2] = { TEST2, TEST3 }; + uint32_t test_set2[2] = { TEST4, TEST5 }; + uint32_t test_set3[2] = { TEST6, TEST7 }; + uint32_t test_set4[2] = { TEST8, TEST9 }; + uint32_t test_set5[2] = { TEST10, TEST11 }; + uint32_t test_set6[2] = { TEST12, TEST13 }; + uint32_t test_set7[2] = { TEST14, TEST15 }; + uint32_t test_set8[2] = { TEST16, TEST17 }; + uint32_t test_set9[2] = { TEST18, TEST19 }; + uint32_t test_set10[2] = { TEST20, TEST21 }; + uint32_t test_set11[2] = { TEST22, TEST23 }; + uint32_t test_set12[2] = { TEST24, TEST25 }; + uint32_t test_set13[2] = { TEST26, TEST27 }; + uint32_t test_set14[2] = { TEST28, TEST29 }; + uint32_t test_set15[2] = { TEST30, TEST31 }; + uint32_t test_set16[2] = { TEST32, TEST32 }; + + uint32_t answ_set0[2] = { 32, 31 }; + uint32_t answ_set1[2] = { 30, 29 }; + uint32_t answ_set2[2] = { 28, 27 }; + uint32_t answ_set3[2] = { 26, 25 }; + uint32_t answ_set4[2] = { 24, 23 }; + uint32_t answ_set5[2] = { 22, 21 }; + uint32_t answ_set6[2] = { 20, 19 }; + uint32_t answ_set7[2] = { 18, 17 }; + uint32_t answ_set8[2] = { 16, 15 }; + uint32_t answ_set9[2] = { 14, 13 }; + uint32_t answ_set10[2] = { 12, 11 }; + uint32_t answ_set11[2] = { 10, 9 }; + uint32_t answ_set12[2] = { 8, 7 }; + uint32_t answ_set13[2] = { 6, 5 }; + uint32_t answ_set14[2] = { 4, 3 }; + uint32_t answ_set15[2] = { 2, 1 }; + uint32_t answ_set16[2] = { 0, 0 }; + + RUN_TEST (test_set0, answ_set0, 64, 32, 0, 2); + RUN_TEST (test_set1, answ_set1, 64, 32, 0, 2); + RUN_TEST (test_set2, answ_set2, 64, 32, 0, 2); + RUN_TEST (test_set3, answ_set3, 64, 32, 0, 2); + RUN_TEST (test_set4, answ_set4, 64, 32, 0, 2); + RUN_TEST (test_set5, answ_set5, 64, 32, 0, 2); + RUN_TEST (test_set6, answ_set6, 64, 32, 0, 2); + RUN_TEST (test_set7, answ_set7, 64, 32, 0, 2); + RUN_TEST (test_set8, answ_set8, 64, 32, 0, 2); + RUN_TEST (test_set9, answ_set9, 64, 32, 0, 2); + RUN_TEST (test_set10, answ_set10, 64, 32, 0, 2); + RUN_TEST (test_set11, answ_set11, 64, 32, 0, 2); + RUN_TEST (test_set12, answ_set12, 64, 32, 0, 2); + RUN_TEST (test_set13, answ_set13, 64, 32, 0, 2); + RUN_TEST (test_set14, answ_set14, 64, 32, 0, 2); + RUN_TEST (test_set15, answ_set15, 64, 32, 0, 2); + RUN_TEST (test_set16, answ_set16, 64, 32, 0, 1); + + return 0; +} + +/* ASM scan near test for signed version. */ + +int +test_vclzq_u8 () +{ + int i; + uint8x16_t a; + uint8x16_t b; + + uint8_t test_set0[16] = { + TEST0, TEST1, TEST2, TEST3, TEST4, TEST5, TEST6, TEST7, + TEST8, TEST8, TEST8, TEST8, TEST8, TEST8, TEST8, TEST8 + }; + uint8_t answ_set0[16] = { + 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0 + }; + RUN_TEST (test_set0, answ_set0, 128, 8, 0, 9); + + return 0; +} + +/* ASM scan near test for signed version. */ + +int +test_vclzq_u16 () +{ + int i; + uint16x8_t a; + uint16x8_t b; + + uint16_t test_set0[8] = { + TEST0, TEST1, TEST2, TEST3, TEST4, TEST5, TEST6, TEST7 + }; + uint16_t test_set1[8] = { + TEST8, TEST9, TEST10, TEST11, TEST12, TEST13, TEST14, TEST15 + }; + uint16_t test_set2[8] = { + TEST16, TEST16, TEST16, TEST16, TEST16, TEST16, TEST16, TEST16 + }; + + uint16_t answ_set0[8] = { + 16, 15, 14, 13, 12, 11, 10, 9 + }; + + uint16_t answ_set1[8] = { + 8, 7, 6, 5, 4, 3, 2, 1 + }; + uint16_t answ_set2[8] = { + 0, 0, 0, 0, 0, 0, 0, 0 + }; + + RUN_TEST (test_set0, answ_set0, 128, 16, 0, 8); + RUN_TEST (test_set1, answ_set1, 128, 16, 0, 8); + RUN_TEST (test_set2, answ_set2, 128, 16, 0, 1); + + return 0; +} + +/* ASM scan near test for signed version. */ + +int +test_vclzq_u32 () +{ + int i; + uint32x4_t a; + uint32x4_t b; + + uint32_t test_set0[4] = { TEST0, TEST1, TEST2, TEST3 }; + uint32_t test_set1[4] = { TEST4, TEST5, TEST6, TEST7 }; + uint32_t test_set2[4] = { TEST8, TEST9, TEST10, TEST11 }; + uint32_t test_set3[4] = { TEST12, TEST13, TEST14, TEST15 }; + uint32_t test_set4[4] = { TEST16, TEST17, TEST18, TEST19 }; + uint32_t test_set5[4] = { TEST20, TEST21, TEST22, TEST23 }; + uint32_t test_set6[4] = { TEST24, TEST25, TEST26, TEST27 }; + uint32_t test_set7[4] = { TEST28, TEST29, TEST30, TEST31 }; + uint32_t test_set8[4] = { TEST32, TEST32, TEST32, TEST32 }; + + uint32_t answ_set0[4] = { 32, 31, 30, 29 }; + uint32_t answ_set1[4] = { 28, 27, 26, 25 }; + uint32_t answ_set2[4] = { 24, 23, 22, 21 }; + uint32_t answ_set3[4] = { 20, 19, 18, 17 }; + uint32_t answ_set4[4] = { 16, 15, 14, 13 }; + uint32_t answ_set5[4] = { 12, 11, 10, 9 }; + uint32_t answ_set6[4] = { 8, 7, 6, 5 }; + uint32_t answ_set7[4] = { 4, 3, 2, 1 }; + uint32_t answ_set8[4] = { 0, 0, 0, 0 }; + + RUN_TEST (test_set0, answ_set0, 128, 32, 0, 4); + RUN_TEST (test_set1, answ_set1, 128, 32, 0, 4); + RUN_TEST (test_set2, answ_set2, 128, 32, 0, 4); + RUN_TEST (test_set3, answ_set3, 128, 32, 0, 4); + RUN_TEST (test_set4, answ_set4, 128, 32, 0, 1); + + return 0; +} + +/* ASM scan near test for signed version. */ + +int +main (int argc, char **argv) +{ + + if (test_vclz_s8 ()) + abort (); + + if (test_vclz_s16 ()) + abort (); + + if (test_vclz_s32 ()) + abort (); + + if (test_vclzq_s8 ()) + abort (); + + if (test_vclzq_s16 ()) + abort (); + + if (test_vclzq_s32 ()) + abort (); + + if (test_vclz_u8 ()) + abort (); + + if (test_vclz_u16 ()) + abort (); + + if (test_vclz_u32 ()) + abort (); + + if (test_vclzq_u8 ()) + abort (); + + if (test_vclzq_u16 ()) + abort (); + + if (test_vclzq_u32 ()) + abort (); + + return 0; +} + +/* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/vdiv_f.c b/gcc/testsuite/gcc.target/aarch64/vdiv_f.c new file mode 100644 index 00000000000..cc3a9570c0f --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/vdiv_f.c @@ -0,0 +1,361 @@ +/* Test vdiv works correctly. */ +/* { dg-do run } */ +/* { dg-options "-O3 --save-temps" } */ + +#include <arm_neon.h> + +#define FLT_INFINITY (__builtin_inff ()) +#define DBL_INFINITY (__builtin_inf ()) + +#define NAN (0.0 / 0.0) + +#define PI 3.141592653589793 +#define PI_4 0.7853981633974483 +#define SQRT2 1.4142135623730951 +#define SQRT1_2 0.7071067811865475 + +#define TESTA0 PI +#define TESTA1 -PI +#define TESTA2 PI +#define TESTA3 -PI +#define TESTA4 1.0 +#define TESTA5 -1.0 +#define TESTA6 1.0 +#define TESTA7 -1.0 +/* 2^25+1, float has 24 significand bits + according to Single-precision floating-point format. */ +#define TESTA8_FLT 33554433 +/* 2^54+1, double has 53 significand bits + according to Double-precision floating-point format. */ +#define TESTA8_DBL 18014398509481985 +#define TESTA9 -TESTA8 +#define TESTA10 TESTA8 +#define TESTA11 -TESTA8 +#define TESTA12 NAN +#define TESTA13 1.0 +#define TESTA14 INFINITY +#define TESTA15 -INFINITY +#define TESTA16 INFINITY +#define TESTA17 9.0 +#define TESTA18 11.0 +#define TESTA19 13.0 + +#define TESTB0 4.0 +#define TESTB1 4.0 +#define TESTB2 -4.0 +#define TESTB3 -4.0 +#define TESTB4 SQRT2 +#define TESTB5 SQRT2 +#define TESTB6 -SQRT2 +#define TESTB7 -SQRT2 +#define TESTB8 2.0 +#define TESTB9 2.0 +#define TESTB10 -2.0 +#define TESTB11 -2.0 +#define TESTB12 3.0 +#define TESTB13 NAN +#define TESTB14 5.0 +#define TESTB15 7.0 +#define TESTB16 INFINITY +#define TESTB17 INFINITY +#define TESTB18 -INFINITY +#define TESTB19 0 + +#define ANSW0 PI_4 +#define ANSW1 -PI_4 +#define ANSW2 -PI_4 +#define ANSW3 PI_4 +#define ANSW4 SQRT1_2 +#define ANSW5 -SQRT1_2 +#define ANSW6 -SQRT1_2 +#define ANSW7 SQRT1_2 +#define ANSW8_FLT 16777216 +#define ANSW8_DBL 9007199254740992 +#define ANSW9 -ANSW8 +#define ANSW10 -ANSW8 +#define ANSW11 ANSW8 +#define ANSW12 NAN +#define ANSW13 NAN +#define ANSW14 INFINITY +#define ANSW15 -INFINITY +#define ANSW16 NAN +#define ANSW17 0 +#define ANSW18 0 +#define ANSW19 INFINITY + +#define CONCAT(a, b) a##b +#define CONCAT1(a, b) CONCAT (a, b) +#define REG_INFEX64 _ +#define REG_INFEX128 q_ +#define REG_INFEX(reg_len) REG_INFEX##reg_len +#define POSTFIX(reg_len, data_len) \ + CONCAT1 (REG_INFEX (reg_len), f##data_len) + +#define DATA_TYPE_32 float +#define DATA_TYPE_64 double +#define DATA_TYPE(data_len) DATA_TYPE_##data_len + +#define EPSILON_32 __FLT_EPSILON__ +#define EPSILON_64 __DBL_EPSILON__ +#define EPSILON(data_len) EPSILON_##data_len + +#define INDEX64_32 [i] +#define INDEX64_64 +#define INDEX128_32 [i] +#define INDEX128_64 [i] +#define INDEX(reg_len, data_len) \ + CONCAT1 (INDEX, reg_len##_##data_len) + +#define LOAD_INST(reg_len, data_len) \ + CONCAT1 (vld1, POSTFIX (reg_len, data_len)) +#define DIV_INST(reg_len, data_len) \ + CONCAT1 (vdiv, POSTFIX (reg_len, data_len)) + +#define ABS(a) __builtin_fabs (a) +#define ISNAN(a) __builtin_isnan (a) +#define FP_equals(a, b, epsilon) \ + ( \ + ((a) == (b)) \ + || (ISNAN (a) && ISNAN (b)) \ + || (ABS (a - b) < epsilon) \ + ) + +#define INHIB_OPTIMIZATION asm volatile ("" : : : "memory") + +#define RUN_TEST(a, b, c, testseta, testsetb, answset, count, \ + reg_len, data_len, n) \ +{ \ + int i; \ + INHIB_OPTIMIZATION; \ + (a) = LOAD_INST (reg_len, data_len) (testseta[count]); \ + (b) = LOAD_INST (reg_len, data_len) (testsetb[count]); \ + (c) = LOAD_INST (reg_len, data_len) (answset[count]); \ + INHIB_OPTIMIZATION; \ + (a) = DIV_INST (reg_len, data_len) (a, b); \ + for (i = 0; i < n; i++) \ + { \ + INHIB_OPTIMIZATION; \ + if (!FP_equals ((a) INDEX (reg_len, data_len), \ + (c) INDEX (reg_len, data_len), \ + EPSILON (data_len))) \ + return 1; \ + } \ +} + +extern void abort (void); + +#define TESTA8 TESTA8_FLT +#define ANSW8 ANSW8_FLT +#define INFINITY FLT_INFINITY + +int +test_vdiv_f32 () +{ + int count; + float32x2_t a; + float32x2_t b; + float32x2_t c; + + float32_t testseta[10][2] = { + { TESTA0, TESTA1 }, { TESTA2, TESTA3 }, + { TESTA4, TESTA5 }, { TESTA6, TESTA7 }, + { TESTA8, TESTA9 }, { TESTA10, TESTA11 }, + { TESTA12, TESTA13 }, { TESTA14, TESTA15 }, + { TESTA16, TESTA17 }, { TESTA18, TESTA19 } + }; + + float32_t testsetb[10][2] = { + { TESTB0, TESTB1 }, { TESTB2, TESTB3 }, + { TESTB4, TESTB5 }, { TESTB6, TESTB7 }, + { TESTB8, TESTB9 }, { TESTB10, TESTB11 }, + { TESTB12, TESTB13 }, { TESTB14, TESTB15 }, + { TESTB16, TESTB17 }, { TESTB18, TESTB19 } + }; + + float32_t answset[10][2] = { + { ANSW0, ANSW1 }, { ANSW2, ANSW3 }, + { ANSW4, ANSW5 }, { ANSW6, ANSW7 }, + { ANSW8, ANSW9 }, { ANSW10, ANSW11 }, + { ANSW12, ANSW13 }, { ANSW14, ANSW15 }, + { ANSW16, ANSW17 }, { ANSW18, ANSW19 } + }; + + for (count = 0; count < 10; count++) + { + RUN_TEST (a, b, c, testseta, testsetb, answset, count, 64, 32, 2); + } + + return 0; +} + +/* { dg-final { scan-assembler-times "fdiv\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s, v\[0-9\]+\.2s" 1 } } */ + +#undef TESTA8 +#undef ANSW8 +#undef INFINITY + +#define TESTA8 TESTA8_DBL +#define ANSW8 ANSW8_DBL +#define INFINITY DBL_INFINITY + +int +test_vdiv_f64 () +{ + int count; + float64x1_t a; + float64x1_t b; + float64x1_t c; + + float64_t testseta[20][1] = { + { TESTA0 }, { TESTA1 }, { TESTA2 }, { TESTA3 }, + { TESTA4 }, { TESTA5 }, { TESTA6 }, { TESTA7 }, + { TESTA8 }, { TESTA9 }, { TESTA10 }, { TESTA11 }, + { TESTA12 }, { TESTA13 }, { TESTA14 }, { TESTA15 }, + { TESTA16 }, { TESTA17 }, { TESTA18 }, { TESTA19 } + }; + + float64_t testsetb[20][1] = { + { TESTB0 }, { TESTB1 }, { TESTB2 }, { TESTB3 }, + { TESTB4 }, { TESTB5 }, { TESTB6 }, { TESTB7 }, + { TESTB8 }, { TESTB9 }, { TESTB10 }, { TESTB11 }, + { TESTB12 }, { TESTB13 }, { TESTB14 }, { TESTB15 }, + { TESTB16 }, { TESTB17 }, { TESTB18 }, { TESTB19 } + }; + + float64_t answset[20][1] = { + { ANSW0 }, { ANSW1 }, { ANSW2 }, { ANSW3 }, + { ANSW4 }, { ANSW5 }, { ANSW6 }, { ANSW7 }, + { ANSW8 }, { ANSW9 }, { ANSW10 }, { ANSW11 }, + { ANSW12 }, { ANSW13 }, { ANSW14 }, { ANSW15 }, + { ANSW16 }, { ANSW17 }, { ANSW18 }, { ANSW19 } + }; + + for (count = 0; count < 20; count++) + { + RUN_TEST (a, b, c, testseta, testsetb, answset, count, 64, 64, 1); + } + return 0; +} + +/* The following assembly should match 2 more times, + in 64bit NAN generation. */ +/* { dg-final { scan-assembler-times "fdiv\\td\[0-9\]+, d\[0-9\]+, d\[0-9\]+" 3 } } */ + +#undef TESTA8 +#undef ANSW8 +#undef INFINITY + +#define TESTA8 TESTA8_FLT +#define ANSW8 ANSW8_FLT +#define INFINITY FLT_INFINITY + +int +test_vdivq_f32 () +{ + int count; + float32x4_t a; + float32x4_t b; + float32x4_t c; + + float32_t testseta[5][4] = { + { TESTA0, TESTA1, TESTA2, TESTA3 }, + { TESTA4, TESTA5, TESTA6, TESTA7 }, + { TESTA8, TESTA9, TESTA10, TESTA11 }, + { TESTA12, TESTA13, TESTA14, TESTA15 }, + { TESTA16, TESTA17, TESTA18, TESTA19 } + }; + + float32_t testsetb[5][4] = { + { TESTB0, TESTB1, TESTB2, TESTB3 }, + { TESTB4, TESTB5, TESTB6, TESTB7 }, + { TESTB8, TESTB9, TESTB10, TESTB11 }, + { TESTB12, TESTB13, TESTB14, TESTB15 }, + { TESTB16, TESTB17, TESTB18, TESTB19 } + }; + + float32_t answset[5][4] = { + { ANSW0, ANSW1, ANSW2, ANSW3 }, + { ANSW4, ANSW5, ANSW6, ANSW7 }, + { ANSW8, ANSW9, ANSW10, ANSW11 }, + { ANSW12, ANSW13, ANSW14, ANSW15 }, + { ANSW16, ANSW17, ANSW18, ANSW19 } + }; + + for (count = 0; count < 5; count++) + { + RUN_TEST (a, b, c, testseta, testsetb, answset, count, 128, 32, 4); + } + return 0; +} + +/* { dg-final { scan-assembler-times "fdiv\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s, v\[0-9\]+\.4s" 1 } } */ + +#undef TESTA8 +#undef ANSW8 +#undef INFINITY + +#define TESTA8 TESTA8_DBL +#define ANSW8 ANSW8_DBL +#define INFINITY DBL_INFINITY + +int +test_vdivq_f64 () +{ + int count; + float64x2_t a; + float64x2_t b; + float64x2_t c; + + float64_t testseta[10][2] = { + { TESTA0, TESTA1 }, { TESTA2, TESTA3 }, + { TESTA4, TESTA5 }, { TESTA6, TESTA7 }, + { TESTA8, TESTA9 }, { TESTA10, TESTA11 }, + { TESTA12, TESTA13 }, { TESTA14, TESTA15 }, + { TESTA16, TESTA17 }, { TESTA18, TESTA19 } + }; + + float64_t testsetb[10][2] = { + { TESTB0, TESTB1 }, { TESTB2, TESTB3 }, + { TESTB4, TESTB5 }, { TESTB6, TESTB7 }, + { TESTB8, TESTB9 }, { TESTB10, TESTB11 }, + { TESTB12, TESTB13 }, { TESTB14, TESTB15 }, + { TESTB16, TESTB17 }, { TESTB18, TESTB19 } + }; + + float64_t answset[10][2] = { + { ANSW0, ANSW1 }, { ANSW2, ANSW3 }, + { ANSW4, ANSW5 }, { ANSW6, ANSW7 }, + { ANSW8, ANSW9 }, { ANSW10, ANSW11 }, + { ANSW12, ANSW13 }, { ANSW14, ANSW15 }, + { ANSW16, ANSW17 }, { ANSW18, ANSW19 } + }; + + for (count = 0; count < 10; count++) + { + RUN_TEST (a, b, c, testseta, testsetb, answset, count, 128, 64, 2); + } + + return 0; +} + +/* { dg-final { scan-assembler-times "fdiv\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, v\[0-9\]+\.2d" 1 } } */ + +int +main (int argc, char **argv) +{ + if (test_vdiv_f32 ()) + abort (); + + if (test_vdiv_f64 ()) + abort (); + + if (test_vdivq_f32 ()) + abort (); + + if (test_vdivq_f64 ()) + abort (); + + return 0; +} + +/* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/vect_saddl_1.c b/gcc/testsuite/gcc.target/aarch64/vect_saddl_1.c new file mode 100644 index 00000000000..ecbd8a8af60 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/vect_saddl_1.c @@ -0,0 +1,315 @@ +/* { dg-do run } */ +/* { dg-options "-O3 -fno-inline -save-temps -fno-vect-cost-model" } */ + +typedef signed char S8_t; +typedef signed short S16_t; +typedef signed int S32_t; +typedef signed long long S64_t; + +typedef signed char *__restrict__ pS8_t; +typedef signed short *__restrict__ pS16_t; +typedef signed int *__restrict__ pS32_t; +typedef signed long long *__restrict__ pS64_t; + +typedef unsigned char U8_t; +typedef unsigned short U16_t; +typedef unsigned int U32_t; +typedef unsigned long long U64_t; + +typedef unsigned char *__restrict__ pU8_t; +typedef unsigned short *__restrict__ pU16_t; +typedef unsigned int *__restrict__ pU32_t; +typedef unsigned long long *__restrict__ pU64_t; + +extern void abort (); + +void +test_addl_S64_S32_4 (pS64_t a, pS32_t b, pS32_t c) +{ + int i; + for (i = 0; i < 4; i++) + a[i] = (S64_t) b[i] + (S64_t) c[i]; +} +/* "saddl\tv\[0-9\]+\.2d,\ v\[0-9\]+\.2s,\ v\[0-9\]+\.2s" */ +/* "saddl2\tv\[0-9\]+\.2d,\ v\[0-9\]+\.4s,\ v\[0-9\]+\.4s" */ + +/* a = -b + c => a = c - b */ +void +test_addl_S64_S32_4_neg0 (pS64_t a, pS32_t b, pS32_t c) +{ + int i; + for (i = 0; i < 4; i++) + a[i] = -(S64_t) b[i] + (S64_t) c[i]; +} +/* "ssubl\tv\[0-9\]+\.2d,\ v\[0-9\]+\.2s,\ v\[0-9\]+\.2s" */ +/* "ssubl2\tv\[0-9\]+\.2d,\ v\[0-9\]+\.4s,\ v\[0-9\]+\.4s" */ + +/* a = b + -c => a = b - c */ +void +test_addl_S64_S32_4_neg1 (pS64_t a, pS32_t b, pS32_t c) +{ + int i; + for (i = 0; i < 4; i++) + a[i] = (S64_t) b[i] + -(S64_t) c[i]; +} +/* "ssubl\tv\[0-9\]+\.2d,\ v\[0-9\]+\.2s,\ v\[0-9\]+\.2s" */ +/* "ssubl2\tv\[0-9\]+\.2d,\ v\[0-9\]+\.4s,\ v\[0-9\]+\.4s" */ + +void +test_addl_S32_S16_8 (pS32_t a, pS16_t b, pS16_t c) +{ + int i; + for (i = 0; i < 8; i++) + a[i] = (S32_t) b[i] + (S32_t) c[i]; +} +/* { dg-final { scan-assembler "saddl\tv\[0-9\]+\.4s,\ v\[0-9\]+\.4h,\ v\[0-9\]+\.4h" } } */ +/* { dg-final { scan-assembler "saddl2\tv\[0-9\]+\.4s,\ v\[0-9\]+\.8h,\ v\[0-9\]+\.8h" } } */ + +void +test_addl_S16_S8_16 (pS16_t a, pS8_t b, pS8_t c) +{ + int i; + for (i = 0; i < 16; i++) + a[i] = (S16_t) b[i] + (S16_t) c[i]; +} +/* { dg-final { scan-assembler "saddl\tv\[0-9\]+\.8h,\ v\[0-9\]+\.8b,\ v\[0-9\]+\.8b" } } */ +/* { dg-final { scan-assembler "saddl2\tv\[0-9\]+\.8h,\ v\[0-9\]+\.16b,\ v\[0-9\]+\.16b" } } */ + +void +test_addl_U64_U32_4 (pU64_t a, pU32_t b, pU32_t c) +{ + int i; + for (i = 0; i < 4; i++) + a[i] = (U64_t) b[i] + (U64_t) c[i]; +} +/* { dg-final { scan-assembler "uaddl\tv\[0-9\]+\.2d,\ v\[0-9\]+\.2s,\ v\[0-9\]+\.2s" } } */ +/* { dg-final { scan-assembler "uaddl2\tv\[0-9\]+\.2d,\ v\[0-9\]+\.4s,\ v\[0-9\]+\.4s" } } */ + +void +test_addl_U32_U16_8 (pU32_t a, pU16_t b, pU16_t c) +{ + int i; + for (i = 0; i < 8; i++) + a[i] = (U32_t) b[i] + (U32_t) c[i]; +} +/* { dg-final { scan-assembler "uaddl\tv\[0-9\]+\.4s,\ v\[0-9\]+\.4h,\ v\[0-9\]+\.4h" } } */ +/* { dg-final { scan-assembler "uaddl2\tv\[0-9\]+\.4s,\ v\[0-9\]+\.8h,\ v\[0-9\]+\.8h" } } */ + +void +test_addl_U16_U8_16 (pU16_t a, pU8_t b, pU8_t c) +{ + int i; + for (i = 0; i < 16; i++) + a[i] = (U16_t) b[i] + (U16_t) c[i]; +} +/* { dg-final { scan-assembler "uaddl\tv\[0-9\]+\.8h,\ v\[0-9\]+\.8b,\ v\[0-9\]+\.8b" } } */ +/* { dg-final { scan-assembler "uaddl2\tv\[0-9\]+\.8h,\ v\[0-9\]+\.16b,\ v\[0-9\]+\.16b" } } */ + +void +test_subl_S64_S32_4 (pS64_t a, pS32_t b, pS32_t c) +{ + int i; + for (i = 0; i < 4; i++) + a[i] = (S64_t) b[i] - (S64_t) c[i]; +} +/* "ssubl\tv\[0-9\]+\.2d,\ v\[0-9\]+\.2s,\ v\[0-9\]+\.2s" */ +/* "ssubl2\tv\[0-9\]+\.2d,\ v\[0-9\]+\.4s,\ v\[0-9\]+\.4s" */ + +/* a = b - -c => a = b + c */ +void +test_subl_S64_S32_4_neg0 (pS64_t a, pS32_t b, pS32_t c) +{ + int i; + for (i = 0; i < 4; i++) + a[i] = (S64_t) b[i] - -(S64_t) c[i]; +} +/* { dg-final { scan-assembler-times "saddl\tv\[0-9\]+\.2d,\ v\[0-9\]+\.2s,\ v\[0-9\]+\.2s" 2 } } */ +/* { dg-final { scan-assembler-times "saddl2\tv\[0-9\]+\.2d,\ v\[0-9\]+\.4s,\ v\[0-9\]+\.4s" 2 } } */ + +/* a = -b - -c => a = c - b */ +void +test_subl_S64_S32_4_neg1 (pS64_t a, pS32_t b, pS32_t c) +{ + int i; + for (i = 0; i < 4; i++) + a[i] = -(S64_t) b[i] - -(S64_t) c[i]; +} +/* "ssubl\tv\[0-9\]+\.2d,\ v\[0-9\]+\.2s,\ v\[0-9\]+\.2s" */ +/* "ssubl2\tv\[0-9\]+\.2d,\ v\[0-9\]+\.4s,\ v\[0-9\]+\.4s" */ + +/* a = -(b - c) => a = c - b */ +void +test_subl_S64_S32_4_neg2 (pS64_t a, pS32_t b, pS32_t c) +{ + int i; + for (i = 0; i < 4; i++) + a[i] = -((S64_t) b[i] - (S64_t) c[i]); +} +/* { dg-final { scan-assembler-times "ssubl\tv\[0-9\]+\.2d,\ v\[0-9\]+\.2s,\ v\[0-9\]+\.2s" 5 } } */ +/* { dg-final { scan-assembler-times "ssubl2\tv\[0-9\]+\.2d,\ v\[0-9\]+\.4s,\ v\[0-9\]+\.4s" 5 } } */ + +void +test_subl_S32_S16_8 (pS32_t a, pS16_t b, pS16_t c) +{ + int i; + for (i = 0; i < 8; i++) + a[i] = (S32_t) b[i] - (S32_t) c[i]; +} +/* { dg-final { scan-assembler "ssubl\tv\[0-9\]+\.4s,\ v\[0-9\]+\.4h,\ v\[0-9\]+\.4h" } } */ +/* { dg-final { scan-assembler "ssubl2\tv\[0-9\]+\.4s,\ v\[0-9\]+\.8h,\ v\[0-9\]+\.8h" } } */ + +void +test_subl_S16_S8_16 (pS16_t a, pS8_t b, pS8_t c) +{ + int i; + for (i = 0; i < 16; i++) + a[i] = (S16_t) b[i] - (S16_t) c[i]; +} +/* { dg-final { scan-assembler "ssubl\tv\[0-9\]+\.8h,\ v\[0-9\]+\.8b,\ v\[0-9\]+\.8b" } } */ +/* { dg-final { scan-assembler "ssubl2\tv\[0-9\]+\.8h,\ v\[0-9\]+\.16b,\ v\[0-9\]+\.16b" } } */ + +void +test_subl_U64_U32_4 (pU64_t a, pU32_t b, pU32_t c) +{ + int i; + for (i = 0; i < 4; i++) + a[i] = (U64_t) b[i] - (U64_t) c[i]; +} +/* { dg-final { scan-assembler "usubl\tv\[0-9\]+\.2d,\ v\[0-9\]+\.2s,\ v\[0-9\]+\.2s" } } */ +/* { dg-final { scan-assembler "usubl2\tv\[0-9\]+\.2d,\ v\[0-9\]+\.4s,\ v\[0-9\]+\.4s" } } */ + +void +test_subl_U32_U16_8 (pU32_t a, pU16_t b, pU16_t c) +{ + int i; + for (i = 0; i < 8; i++) + a[i] = (U32_t) b[i] - (U32_t) c[i]; +} +/* { dg-final { scan-assembler "usubl\tv\[0-9\]+\.4s,\ v\[0-9\]+\.4h,\ v\[0-9\]+\.4h" } } */ +/* { dg-final { scan-assembler "usubl2\tv\[0-9\]+\.4s,\ v\[0-9\]+\.8h,\ v\[0-9\]+\.8h" } } */ + +void +test_subl_U16_U8_16 (pU16_t a, pU8_t b, pU8_t c) +{ + int i; + for (i = 0; i < 16; i++) + a[i] = (U16_t) b[i] - (U16_t) c[i]; +} +/* { dg-final { scan-assembler "usubl\tv\[0-9\]+\.8h,\ v\[0-9\]+\.8b,\ v\[0-9\]+\.8b" } } */ +/* { dg-final { scan-assembler "usubl2\tv\[0-9\]+\.8h,\ v\[0-9\]+\.16b,\ v\[0-9\]+\.16b" } } */ + +/* input values */ + +S64_t S64_ta[4]; +S32_t S32_tb[4] = { 0, 1, 2, 3 }; +S32_t S32_tc[4] = { 2, 2, -2, -2 }; + +S32_t S32_ta[8]; +S16_t S16_tb[8] = { 0, 1, 2, 3, 4, 5, 6, 7 }; +S16_t S16_tc[8] = { 2, 2, -2, -2, 2, 2, -2, -2 }; + +S16_t S16_ta[16]; +S8_t S8_tb[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; +S8_t S8_tc[16] = { 2, 2, -2, -2, 2, 2, -2, -2, 2, 2, -2, -2, 2, 2, -2, -2 }; + +/* expected output */ + +S64_t addl_rS64[] = { 2, 3, 0, 1 }; +S64_t neg_r[] = { 2, 1, -4, -5 }; +S32_t addl_rS32[] = { 2, 3, 0, 1, 6, 7, 4, 5 }; +S16_t addl_rS16[] = { 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9, 14, 15, 12, 13 }; +S64_t subl_rS64[] = { -2, -1, 4, 5 }; +S32_t subl_rS32[] = { -2, -1, 4, 5, 2, 3, 8, 9 }; +S16_t subl_rS16[] = + { -2, -1, 4, 5, 2, 3, 8, 9, 6, 7, 12, 13, 10, 11, 16, 17 }; +U64_t addl_rU64[] = { 2, 3, 0x100000000, 0x100000001 }; +U32_t addl_rU32[] = { 2, 3, 0x10000, 0x10001, 6, 7, 0x10004, 0x10005 }; +U16_t addl_rU16[] = +{ + 0x0002, 0x0003, 0x0100, 0x0101, 0x0006, 0x0007, 0x0104, 0x0105, + 0x000a, 0x000b, 0x0108, 0x0109, 0x000e, 0x000f, 0x010c, 0x010d +}; +U64_t subl_rU64[] = +{ + 0xfffffffffffffffe, 0xffffffffffffffff, + 0xffffffff00000004, 0xffffffff00000005 +}; +U32_t subl_rU32[] = +{ + 0xfffffffe, 0xffffffff, 0xffff0004, 0xffff0005, + 0x00000002, 0x00000003, 0xffff0008, 0xffff0009 +}; +U16_t subl_rU16[] = +{ + 0xfffe, 0xffff, 0xff04, 0xff05, 0x0002, 0x0003, 0xff08, 0xff09, + 0x0006, 0x0007, 0xff0c, 0xff0d, 0x000a, 0x000b, 0xff10, 0xff11 +}; + +#define CHECK(T,N,AS,US) \ +do \ + { \ + for (i = 0; i < N; i++) \ + if ((US##T##_t)S##T##_ta[i] != AS##_##r##US##T[i]) \ + abort(); \ + } \ +while (0) + +#define NCHECK(RES) \ +do \ + { \ + for (i = 0; i < 4; i++) \ + if (S64_ta[i] != RES[i]) \ + abort (); \ + } \ +while (0) + +#define SCHECK(T,N,AS) CHECK(T,N,AS,S) +#define UCHECK(T,N,AS) CHECK(T,N,AS,U) + +int +main () +{ + int i; + + test_addl_S64_S32_4 (S64_ta, S32_tb, S32_tc); + SCHECK (64, 4, addl); + test_addl_S32_S16_8 (S32_ta, S16_tb, S16_tc); + SCHECK (32, 8, addl); + test_addl_S16_S8_16 (S16_ta, S8_tb, S8_tc); + SCHECK (16, 16, addl); + test_subl_S64_S32_4 (S64_ta, S32_tb, S32_tc); + SCHECK (64, 4, subl); + test_subl_S32_S16_8 (S32_ta, S16_tb, S16_tc); + SCHECK (32, 8, subl); + test_subl_S16_S8_16 (S16_ta, S8_tb, S8_tc); + SCHECK (16, 16, subl); + + test_addl_U64_U32_4 (S64_ta, S32_tb, S32_tc); + UCHECK (64, 4, addl); + test_addl_U32_U16_8 (S32_ta, S16_tb, S16_tc); + UCHECK (32, 8, addl); + test_addl_U16_U8_16 (S16_ta, S8_tb, S8_tc); + UCHECK (16, 16, addl); + test_subl_U64_U32_4 (S64_ta, S32_tb, S32_tc); + UCHECK (64, 4, subl); + test_subl_U32_U16_8 (S32_ta, S16_tb, S16_tc); + UCHECK (32, 8, subl); + test_subl_U16_U8_16 (S16_ta, S8_tb, S8_tc); + UCHECK (16, 16, subl); + + test_addl_S64_S32_4_neg0 (S64_ta, S32_tb, S32_tc); + NCHECK (neg_r); + test_addl_S64_S32_4_neg1 (S64_ta, S32_tb, S32_tc); + NCHECK (subl_rS64); + test_subl_S64_S32_4_neg0 (S64_ta, S32_tb, S32_tc); + NCHECK (addl_rS64); + test_subl_S64_S32_4_neg1 (S64_ta, S32_tb, S32_tc); + NCHECK (neg_r); + test_subl_S64_S32_4_neg2 (S64_ta, S32_tb, S32_tc); + NCHECK (neg_r); + + return 0; +} + +/* { dg-final { cleanup-saved-temps } } */ + diff --git a/gcc/testsuite/gcc.target/aarch64/vneg_f.c b/gcc/testsuite/gcc.target/aarch64/vneg_f.c new file mode 100644 index 00000000000..1eaf21d34eb --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/vneg_f.c @@ -0,0 +1,273 @@ +/* Test vneg works correctly. */ +/* { dg-do run } */ +/* { dg-options "--save-temps" } */ + +#include <arm_neon.h> + +#define FLT_EPSILON __FLT_EPSILON__ +#define DBL_EPSILON __DBL_EPSILON__ +#define FLT_MAX __FLT_MAX__ +#define FLT_MIN __FLT_MIN__ +#define DBL_MAX __DBL_MAX__ +#define DBL_MIN __DBL_MIN__ + +#define TEST0 0 +/* 6 digits of pi. */ +#define TEST1 3.14159 +/* 6 digits of -e. */ +#define TEST2 -2.71828 +/* 2^25, float has 24 significand bits + according to Single-precision floating-point format. */ +#define TEST3_FLT 33554432 +/* 2^54, double has 53 significand bits + according to Double-precision floating-point format. */ +#define TEST3_DBL 18014398509481984 + +extern void abort (void); + +#define FLT_INFINITY (__builtin_inff ()) +#define DBL_INFINITY (__builtin_inf ()) + +#ifndef NAN +#define NAN (0.0 / 0.0) +#endif + +#define CONCAT(a, b) a##b +#define CONCAT1(a, b) CONCAT (a, b) +#define REG_INFEX64 _ +#define REG_INFEX128 q_ +#define REG_INFEX(reg_len) REG_INFEX##reg_len +#define POSTFIX(reg_len, data_len) \ + CONCAT1 (REG_INFEX (reg_len), f##data_len) + +#define DATA_TYPE_32 float +#define DATA_TYPE_64 double +#define DATA_TYPE(data_len) DATA_TYPE_##data_len + +#define INDEX64_32 [i] +#define INDEX64_64 +#define INDEX128_32 [i] +#define INDEX128_64 [i] +#define INDEX(reg_len, data_len) \ + CONCAT1 (INDEX, reg_len##_##data_len) + +#define LOAD_INST(reg_len, data_len) \ + CONCAT1 (vld1, POSTFIX (reg_len, data_len)) +#define NEG_INST(reg_len, data_len) \ + CONCAT1 (vneg, POSTFIX (reg_len, data_len)) + +#define INHIB_OPTIMIZATION asm volatile ("" : : : "memory") + +#define RUN_TEST(test_set, reg_len, data_len, n, a, b) \ + { \ + int i; \ + (a) = LOAD_INST (reg_len, data_len) (test_set); \ + (b) = NEG_INST (reg_len, data_len) (a); \ + for (i = 0; i < n; i++) \ + { \ + DATA_TYPE (data_len) diff; \ + INHIB_OPTIMIZATION; \ + diff \ + = a INDEX (reg_len, data_len) \ + + b INDEX (reg_len, data_len); \ + if (diff > EPSILON) \ + return 1; \ + } \ + } + +#define TEST3 TEST3_FLT +#define EPSILON FLT_EPSILON +#define VAR_MIN FLT_MIN +#define VAR_MAX FLT_MAX +#define INFINITY FLT_INFINITY + +int +test_vneg_f32 () +{ + float test_set0[2] = { TEST0, TEST1 }; + float test_set1[2] = { TEST2, TEST3 }; + float test_set2[2] = { VAR_MAX, VAR_MIN }; + float test_set3[2] = { INFINITY, NAN }; + + float32x2_t a; + float32x2_t b; + + RUN_TEST (test_set0, 64, 32, 2, a, b); + RUN_TEST (test_set1, 64, 32, 2, a, b); + RUN_TEST (test_set2, 64, 32, 2, a, b); + RUN_TEST (test_set3, 64, 32, 0, a, b); + + /* Since last test cannot be checked in a uniform way by adding + negation result to original value, the number of lanes to be + checked in RUN_TEST is 0 (last argument). Instead, result + will be checked manually. */ + + if (b[0] != -INFINITY) + return 1; + + if (!__builtin_isnan (b[1])) + return 1; + + return 0; +} + +/* { dg-final { scan-assembler-times "fneg\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" 4 } } */ + +#undef TEST3 +#undef EPSILON +#undef VAR_MIN +#undef VAR_MAX +#undef INFINITY + +#define TEST3 TEST3_DBL +#define EPSILON DBL_EPSILON +#define VAR_MIN DBL_MIN +#define VAR_MAX DBL_MAX +#define INFINITY DBL_INFINITY + +int +test_vneg_f64 () +{ + float64x1_t a; + float64x1_t b; + + double test_set0[1] = { TEST0 }; + double test_set1[1] = { TEST1 }; + double test_set2[1] = { TEST2 }; + double test_set3[1] = { TEST3 }; + double test_set4[1] = { VAR_MAX }; + double test_set5[1] = { VAR_MIN }; + double test_set6[1] = { INFINITY }; + double test_set7[1] = { NAN }; + + RUN_TEST (test_set0, 64, 64, 1, a, b); + RUN_TEST (test_set1, 64, 64, 1, a, b); + RUN_TEST (test_set2, 64, 64, 1, a, b); + RUN_TEST (test_set3, 64, 64, 1, a, b); + RUN_TEST (test_set4, 64, 64, 1, a, b); + RUN_TEST (test_set5, 64, 64, 1, a, b); + RUN_TEST (test_set6, 64, 64, 0, a, b); + + /* Since last test cannot be checked in a uniform way by adding + negation result to original value, the number of lanes to be + checked in RUN_TEST is 0 (last argument). Instead, result + will be checked manually. */ + + if (b != -INFINITY) + return 1; + + /* Same as above. */ + + RUN_TEST (test_set7, 64, 64, 0, a, b); + + if (!__builtin_isnan (b)) + return 1; + + return 0; +} + +/* { dg-final { scan-assembler-times "fneg\\td\[0-9\]+, d\[0-9\]+" 8 } } */ + +#undef TEST3 +#undef EPSILON +#undef VAR_MIN +#undef VAR_MAX +#undef INFINITY + +#define TEST3 TEST3_FLT +#define EPSILON FLT_EPSILON +#define VAR_MIN FLT_MIN +#define VAR_MAX FLT_MAX +#define INFINITY FLT_INFINITY + +int +test_vnegq_f32 () +{ + float32x4_t a; + float32x4_t b; + + float test_set0[4] = { TEST0, TEST1, TEST2, TEST3 }; + float test_set1[4] = { FLT_MAX, FLT_MIN, INFINITY, NAN }; + + RUN_TEST (test_set0, 128, 32, 4, a, b); + RUN_TEST (test_set1, 128, 32, 2, a, b); + + /* Since last test cannot be fully checked in a uniform way by + adding negation result to original value, the number of lanes + to be checked in RUN_TEST is 0 (last argument). Instead, result + will be checked manually. */ + + if (b[2] != -INFINITY) + return 1; + + if (!__builtin_isnan (b[3])) + return 1; + + return 0; +} + +/* { dg-final { scan-assembler-times "fneg\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" 2 } } */ + +#undef TEST3 +#undef EPSILON +#undef VAR_MIN +#undef VAR_MAX +#undef INFINITY + +#define TEST3 TEST3_DBL +#define EPSILON DBL_EPSILON +#define VAR_MIN DBL_MIN +#define VAR_MAX DBL_MAX +#define INFINITY DBL_INFINITY + +int +test_vnegq_f64 () +{ + float64x2_t a; + float64x2_t b; + + double test_set0[2] = { TEST0, TEST1 }; + double test_set1[2] = { TEST2, TEST3 }; + double test_set2[2] = { FLT_MAX, FLT_MIN }; + double test_set3[2] = { INFINITY, NAN }; + + RUN_TEST (test_set0, 128, 64, 2, a, b); + RUN_TEST (test_set1, 128, 64, 2, a, b); + RUN_TEST (test_set2, 128, 64, 2, a, b); + RUN_TEST (test_set3, 128, 64, 0, a, b); + + /* Since last test cannot be checked in a uniform way by adding + negation result to original value, the number of lanes to be + checked in RUN_TEST is 0 (last argument). Instead, result + will be checked manually. */ + + if (b[0] != -INFINITY) + return 1; + + if (!__builtin_isnan (b[1])) + return 1; + + return 0; +} + +/* { dg-final { scan-assembler-times "fneg\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" 4 } } */ + +int +main (int argc, char **argv) +{ + if (test_vneg_f32 ()) + abort (); + + if (test_vneg_f64 ()) + abort (); + + if (test_vnegq_f32 ()) + abort (); + + if (test_vnegq_f64 ()) + abort (); + + return 0; +} + +/* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/vneg_s.c b/gcc/testsuite/gcc.target/aarch64/vneg_s.c new file mode 100644 index 00000000000..accbf14074b --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/vneg_s.c @@ -0,0 +1,309 @@ +/* Test vneg works correctly. */ +/* { dg-do run } */ +/* { dg-options "-std=gnu99 -O3 -Wno-div-by-zero --save-temps" } */ + +#include <arm_neon.h> +#include <limits.h> + +/* Used to force a variable to a SIMD register. */ +#define force_simd(V1) asm volatile ("mov %d0, %1.d[0]" \ + : "=w"(V1) \ + : "w"(V1) \ + : /* No clobbers */); +#define INHIB_OPTIMIZATION asm volatile ("" : : : "memory") + +#define TEST0 0 +#define TEST1 1 +#define TEST2 -1 +#define TEST3 10 +#define TEST4 -10 +#define TEST5 0 + +#define ANSW0 0 +#define ANSW1 -1 +#define ANSW2 1 +#define ANSW3 -10 +#define ANSW4 10 +#define ANSW5 0 + +extern void abort (void); + +#define CONCAT(a, b) a##b +#define CONCAT1(a, b) CONCAT (a, b) +#define REG_INFEX64 _ +#define REG_INFEX128 q_ +#define REG_INFEX(reg_len) REG_INFEX##reg_len +#define POSTFIX(reg_len, data_len) \ + CONCAT1 (REG_INFEX (reg_len), s##data_len) +#define DATA_TYPE_32 float +#define DATA_TYPE_64 double +#define DATA_TYPE(data_len) DATA_TYPE_##data_len +#define INDEX64_8 [i] +#define INDEX64_16 [i] +#define INDEX64_32 [i] +#define INDEX64_64 +#define INDEX128_8 [i] +#define INDEX128_16 [i] +#define INDEX128_32 [i] +#define INDEX128_64 [i] + +#define FORCE_SIMD_INST64_8(data) +#define FORCE_SIMD_INST64_16(data) +#define FORCE_SIMD_INST64_32(data) +#define FORCE_SIMD_INST64_64(data) force_simd (data) +#define FORCE_SIMD_INST128_8(data) +#define FORCE_SIMD_INST128_16(data) +#define FORCE_SIMD_INST128_32(data) +#define FORCE_SIMD_INST128_64(data) + +#define INDEX(reg_len, data_len) \ + CONCAT1 (INDEX, reg_len##_##data_len) +#define FORCE_SIMD_INST(reg_len, data_len, data) \ + CONCAT1 (FORCE_SIMD_INST, reg_len##_##data_len) (data) +#define LOAD_INST(reg_len, data_len) \ + CONCAT1 (vld1, POSTFIX (reg_len, data_len)) +#define NEG_INST(reg_len, data_len) \ + CONCAT1 (vneg, POSTFIX (reg_len, data_len)) + +#define RUN_TEST(test_set, answ_set, reg_len, data_len, n, a, b) \ + { \ + int i; \ + INHIB_OPTIMIZATION; \ + (a) = LOAD_INST (reg_len, data_len) (test_set); \ + (b) = LOAD_INST (reg_len, data_len) (answ_set); \ + FORCE_SIMD_INST (reg_len, data_len, a) \ + a = NEG_INST (reg_len, data_len) (a); \ + FORCE_SIMD_INST (reg_len, data_len, a) \ + for (i = 0; i < n; i++) \ + { \ + INHIB_OPTIMIZATION; \ + if (a INDEX (reg_len, data_len) \ + != b INDEX (reg_len, data_len)) \ + return 1; \ + } \ + } + +int +test_vneg_s8 () +{ + int8x8_t a; + int8x8_t b; + + int8_t test_set0[8] = { + TEST0, TEST1, TEST2, TEST3, TEST4, TEST5, SCHAR_MAX, SCHAR_MIN + }; + int8_t answ_set0[8] = { + ANSW0, ANSW1, ANSW2, ANSW3, ANSW4, ANSW5, SCHAR_MIN + 1, SCHAR_MIN + }; + + RUN_TEST (test_set0, answ_set0, 64, 8, 8, a, b); + + return 0; +} + +/* { dg-final { scan-assembler-times "neg\\tv\[0-9\]+\.8b, v\[0-9\]+\.8b" 1 } } */ + +int +test_vneg_s16 () +{ + int16x4_t a; + int16x4_t b; + + int16_t test_set0[4] = { TEST0, TEST1, TEST2, TEST3 }; + int16_t test_set1[4] = { TEST4, TEST5, SHRT_MAX, SHRT_MIN }; + + int16_t answ_set0[4] = { ANSW0, ANSW1, ANSW2, ANSW3 }; + int16_t answ_set1[4] = { ANSW4, ANSW5, SHRT_MIN + 1, SHRT_MIN }; + + RUN_TEST (test_set0, answ_set0, 64, 16, 4, a, b); + RUN_TEST (test_set1, answ_set1, 64, 16, 4, a, b); + + return 0; +} + +/* { dg-final { scan-assembler-times "neg\\tv\[0-9\]+\.4h, v\[0-9\]+\.4h" 2 } } */ + +int +test_vneg_s32 () +{ + int32x2_t a; + int32x2_t b; + + int32_t test_set0[2] = { TEST0, TEST1 }; + int32_t test_set1[2] = { TEST2, TEST3 }; + int32_t test_set2[2] = { TEST4, TEST5 }; + int32_t test_set3[2] = { INT_MAX, INT_MIN }; + + int32_t answ_set0[2] = { ANSW0, ANSW1 }; + int32_t answ_set1[2] = { ANSW2, ANSW3 }; + int32_t answ_set2[2] = { ANSW4, ANSW5 }; + int32_t answ_set3[2] = { INT_MIN + 1, INT_MIN }; + + RUN_TEST (test_set0, answ_set0, 64, 32, 2, a, b); + RUN_TEST (test_set1, answ_set1, 64, 32, 2, a, b); + RUN_TEST (test_set2, answ_set2, 64, 32, 2, a, b); + RUN_TEST (test_set3, answ_set3, 64, 32, 2, a, b); + + return 0; +} + +/* { dg-final { scan-assembler-times "neg\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" 4 } } */ + +int +test_vneg_s64 () +{ + int64x1_t a; + int64x1_t b; + + int64_t test_set0[1] = { TEST0 }; + int64_t test_set1[1] = { TEST1 }; + int64_t test_set2[1] = { TEST2 }; + int64_t test_set3[1] = { TEST3 }; + int64_t test_set4[1] = { TEST4 }; + int64_t test_set5[1] = { TEST5 }; + int64_t test_set6[1] = { LLONG_MAX }; + int64_t test_set7[1] = { LLONG_MIN }; + + int64_t answ_set0[1] = { ANSW0 }; + int64_t answ_set1[1] = { ANSW1 }; + int64_t answ_set2[1] = { ANSW2 }; + int64_t answ_set3[1] = { ANSW3 }; + int64_t answ_set4[1] = { ANSW4 }; + int64_t answ_set5[1] = { ANSW5 }; + int64_t answ_set6[1] = { LLONG_MIN + 1 }; + int64_t answ_set7[1] = { LLONG_MIN }; + + RUN_TEST (test_set0, answ_set0, 64, 64, 1, a, b); + RUN_TEST (test_set1, answ_set1, 64, 64, 1, a, b); + RUN_TEST (test_set2, answ_set2, 64, 64, 1, a, b); + RUN_TEST (test_set3, answ_set3, 64, 64, 1, a, b); + RUN_TEST (test_set4, answ_set4, 64, 64, 1, a, b); + RUN_TEST (test_set5, answ_set5, 64, 64, 1, a, b); + RUN_TEST (test_set6, answ_set6, 64, 64, 1, a, b); + RUN_TEST (test_set7, answ_set7, 64, 64, 1, a, b); + + return 0; +} + +/* { dg-final { scan-assembler-times "neg\\td\[0-9\]+, d\[0-9\]+" 8 } } */ + +int +test_vnegq_s8 () +{ + int8x16_t a; + int8x16_t b; + + int8_t test_set0[16] = { + TEST0, TEST1, TEST2, TEST3, TEST4, TEST5, SCHAR_MAX, SCHAR_MIN, + 4, 8, 15, 16, 23, 42, -1, -2 + }; + + int8_t answ_set0[16] = { + ANSW0, ANSW1, ANSW2, ANSW3, ANSW4, ANSW5, SCHAR_MIN + 1, SCHAR_MIN, + -4, -8, -15, -16, -23, -42, 1, 2 + }; + + RUN_TEST (test_set0, answ_set0, 128, 8, 8, a, b); + + return 0; +} + +/* { dg-final { scan-assembler-times "neg\\tv\[0-9\]+\.16b, v\[0-9\]+\.16b" 1 } } */ + +int +test_vnegq_s16 () +{ + int16x8_t a; + int16x8_t b; + + int16_t test_set0[8] = { + TEST0, TEST1, TEST2, TEST3, TEST4, TEST5, SHRT_MAX, SHRT_MIN + }; + int16_t answ_set0[8] = { + ANSW0, ANSW1, ANSW2, ANSW3, ANSW4, ANSW5, SHRT_MIN + 1, SHRT_MIN + }; + + RUN_TEST (test_set0, answ_set0, 128, 16, 8, a, b); + + return 0; +} + +/* { dg-final { scan-assembler-times "neg\\tv\[0-9\]+\.8h, v\[0-9\]+\.8h" 1 } } */ + +int +test_vnegq_s32 () +{ + int32x4_t a; + int32x4_t b; + + int32_t test_set0[4] = { TEST0, TEST1, TEST2, TEST3 }; + int32_t test_set1[4] = { TEST4, TEST5, INT_MAX, INT_MIN }; + + int32_t answ_set0[4] = { ANSW0, ANSW1, ANSW2, ANSW3 }; + int32_t answ_set1[4] = { ANSW4, ANSW5, INT_MIN + 1, INT_MIN }; + + RUN_TEST (test_set0, answ_set0, 128, 32, 4, a, b); + RUN_TEST (test_set1, answ_set1, 128, 32, 4, a, b); + + return 0; +} + +/* { dg-final { scan-assembler-times "neg\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" 2 } } */ + +int +test_vnegq_s64 () +{ + int64x2_t a; + int64x2_t b; + + int64_t test_set0[2] = { TEST0, TEST1 }; + int64_t test_set1[2] = { TEST2, TEST3 }; + int64_t test_set2[2] = { TEST4, TEST5 }; + int64_t test_set3[2] = { LLONG_MAX, LLONG_MIN }; + + int64_t answ_set0[2] = { ANSW0, ANSW1 }; + int64_t answ_set1[2] = { ANSW2, ANSW3 }; + int64_t answ_set2[2] = { ANSW4, ANSW5 }; + int64_t answ_set3[2] = { LLONG_MIN + 1, LLONG_MIN }; + + RUN_TEST (test_set0, answ_set0, 128, 64, 2, a, b); + RUN_TEST (test_set1, answ_set1, 128, 64, 2, a, b); + RUN_TEST (test_set2, answ_set2, 128, 64, 2, a, b); + RUN_TEST (test_set3, answ_set3, 128, 64, 2, a, b); + + return 0; +} + +/* { dg-final { scan-assembler-times "neg\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" 4 } } */ + +int +main (int argc, char **argv) +{ + if (test_vneg_s8 ()) + abort (); + + if (test_vneg_s16 ()) + abort (); + + if (test_vneg_s32 ()) + abort (); + + if (test_vneg_s64 ()) + abort (); + + if (test_vnegq_s8 ()) + abort (); + + if (test_vnegq_s16 ()) + abort (); + + if (test_vnegq_s32 ()) + abort (); + + if (test_vnegq_s64 ()) + abort (); + + return 0; +} + +/* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/vsub_f64.c b/gcc/testsuite/gcc.target/aarch64/vsub_f64.c new file mode 100644 index 00000000000..abf4fc42d49 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/vsub_f64.c @@ -0,0 +1,116 @@ +/* Test vsub works correctly. */ +/* { dg-do run } */ +/* { dg-options "--save-temps" } */ + +#include <arm_neon.h> + +#define FLT_EPSILON __FLT_EPSILON__ +#define DBL_EPSILON __DBL_EPSILON__ + +#define TESTA0 1 +#define TESTA1 0.2223 +#define TESTA2 0 +#define TESTA3 -0.76544 +/* 2^54, double has 53 significand bits + according to Double-precision floating-point format. */ +#define TESTA4 18014398509481984 +#define TESTA5 2.0 + +#define TESTB0 0.66667 +#define TESTB1 2 +#define TESTB2 0 +#define TESTB3 -2 +#define TESTB4 1.0 +#define TESTB5 (1.0 / TESTA4) + +#define ANSW0 0.33333 +#define ANSW1 -1.7777 +#define ANSW2 0 +#define ANSW3 1.23456 +#define ANSW4 TESTA4 +#define ANSW5 2.0 + +extern void abort (void); + +#define EPSILON __DBL_EPSILON__ +#define ISNAN(a) __builtin_isnan (a) +/* FP_equals is implemented like this to execute subtraction + exectly once during a single test run. */ +#define FP_equals(a, b, epsilon) \ +( \ + ((a) == (b)) \ + || (ISNAN (a) && ISNAN (b)) \ + || (((a > b) && (a < (b + epsilon))) \ + || ((b > a) && (b < (a + epsilon)))) \ +) + +int +test_vsub_f64 () +{ + float64x1_t a; + float64x1_t b; + float64x1_t c; + + a = TESTA0; + b = TESTB0; + c = ANSW0; + + a = vsub_f64 (a, b); + if (!FP_equals (a, c, EPSILON)) + return 1; + + a = TESTA1; + b = TESTB1; + c = ANSW1; + + a = vsub_f64 (a, b); + if (!FP_equals (a, c, EPSILON)) + return 1; + + a = TESTA2; + b = TESTB2; + c = ANSW2; + + a = vsub_f64 (a, b); + if (!FP_equals (a, c, EPSILON)) + return 1; + + a = TESTA3; + b = TESTB3; + c = ANSW3; + + a = vsub_f64 (a, b); + if (!FP_equals (a, c, EPSILON)) + return 1; + + a = TESTA4; + b = TESTB4; + c = ANSW4; + + a = vsub_f64 (a, b); + if (!FP_equals (a, c, EPSILON)) + return 1; + + a = TESTA5; + b = TESTB5; + c = ANSW5; + + a = vsub_f64 (a, b); + if (!FP_equals (a, c, EPSILON)) + return 1; + + return 0; +} + +/* { dg-final { scan-assembler-times "fsub\\td\[0-9\]+, d\[0-9\]+, d\[0-9\]+" 6 } } */ + +int +main (int argc, char **argv) +{ + if (test_vsub_f64 ()) + abort (); + + return 0; +} + +/* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/gcc.target/arc/barrel-shifter-1.c b/gcc/testsuite/gcc.target/arc/barrel-shifter-1.c new file mode 100644 index 00000000000..a0eb6d70c39 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/barrel-shifter-1.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -mcpu=ARC601 -mbarrel-shifter" } */ +int i; + +int f (void) +{ + i >>= 2; +} + +/* { dg-final { scan-assembler "asr_s" } } */ diff --git a/gcc/testsuite/gcc.target/arc/barrel-shifter-2.c b/gcc/testsuite/gcc.target/arc/barrel-shifter-2.c new file mode 100644 index 00000000000..97998fbf1a3 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/barrel-shifter-2.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +int i; + +int f (void) +{ + i >>= 2; +} + +/* { dg-final { scan-assembler "asr_s" } } */ diff --git a/gcc/testsuite/gcc.target/arc/long-calls.c b/gcc/testsuite/gcc.target/arc/long-calls.c new file mode 100644 index 00000000000..63fafbcc674 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/long-calls.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -mlong-calls" } */ + +int g (void); + +int f (void) +{ + g(); +} + +/* { dg-final { scan-assembler "j @g" } } */ diff --git a/gcc/testsuite/gcc.target/arc/mA6.c b/gcc/testsuite/gcc.target/arc/mA6.c new file mode 100644 index 00000000000..2e15a86f8a4 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mA6.c @@ -0,0 +1,4 @@ +/* { dg-do compile } */ +/* { dg-options "-mA6" } */ + +/* { dg-final { scan-assembler ".cpu ARC600" } } */ diff --git a/gcc/testsuite/gcc.target/arc/mA7.c b/gcc/testsuite/gcc.target/arc/mA7.c new file mode 100644 index 00000000000..c4430f43b41 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mA7.c @@ -0,0 +1,4 @@ +/* { dg-do compile } */ +/* { dg-options "-mA7" } */ + +/* { dg-final { scan-assembler ".cpu ARC700" } } */ diff --git a/gcc/testsuite/gcc.target/arc/mARC600.c b/gcc/testsuite/gcc.target/arc/mARC600.c new file mode 100644 index 00000000000..20e086aa754 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mARC600.c @@ -0,0 +1,4 @@ +/* { dg-do compile } */ +/* { dg-options "-mARC600" } */ + +/* { dg-final { scan-assembler ".cpu ARC600" } } */ diff --git a/gcc/testsuite/gcc.target/arc/mARC601.c b/gcc/testsuite/gcc.target/arc/mARC601.c new file mode 100644 index 00000000000..1d30da4cafb --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mARC601.c @@ -0,0 +1,4 @@ +/* { dg-do compile } */ +/* { dg-options "-mARC601" } */ + +/* { dg-final { scan-assembler ".cpu ARC601" } } */ diff --git a/gcc/testsuite/gcc.target/arc/mARC700.c b/gcc/testsuite/gcc.target/arc/mARC700.c new file mode 100644 index 00000000000..43e9baa3f30 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mARC700.c @@ -0,0 +1,4 @@ +/* { dg-do compile } */ +/* { dg-options "-mARC700" } */ + +/* { dg-final { scan-assembler ".cpu ARC700" } } */ diff --git a/gcc/testsuite/gcc.target/arc/mcpu-arc600.c b/gcc/testsuite/gcc.target/arc/mcpu-arc600.c new file mode 100644 index 00000000000..4c915fda0e3 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mcpu-arc600.c @@ -0,0 +1,4 @@ +/* { dg-do compile } */ +/* { dg-options "-mcpu=ARC600" } */ + +/* { dg-final { scan-assembler ".cpu ARC600" } } */ diff --git a/gcc/testsuite/gcc.target/arc/mcpu-arc601.c b/gcc/testsuite/gcc.target/arc/mcpu-arc601.c new file mode 100644 index 00000000000..7c93c9dc4ac --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mcpu-arc601.c @@ -0,0 +1,4 @@ +/* { dg-do compile } */ +/* { dg-options "-mcpu=ARC601" } */ + +/* { dg-final { scan-assembler ".cpu ARC601" } } */ diff --git a/gcc/testsuite/gcc.target/arc/mcpu-arc700.c b/gcc/testsuite/gcc.target/arc/mcpu-arc700.c new file mode 100644 index 00000000000..c805a5af76b --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mcpu-arc700.c @@ -0,0 +1,4 @@ +/* { dg-do compile } */ +/* { dg-options "-mcpu=ARC700" } */ + +/* { dg-final { scan-assembler ".cpu ARC700" } } */ diff --git a/gcc/testsuite/gcc.target/arc/mcrc.c b/gcc/testsuite/gcc.target/arc/mcrc.c new file mode 100644 index 00000000000..d3780bb00d6 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mcrc.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-mcrc" } */ +/* { dg-do assemble } */ + +int f (int i) +{ + __asm__("crc %1, %1, %1" : "=r"(i) : "r"(i)); + return i; +} diff --git a/gcc/testsuite/gcc.target/arc/mdpfp.c b/gcc/testsuite/gcc.target/arc/mdpfp.c new file mode 100644 index 00000000000..4bbc9057b85 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mdpfp.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -mdpfp" } */ + +double i; + +int f (void) +{ + i *= 2.0; +} + +/* { dg-final { scan-assembler "daddh" } } */ diff --git a/gcc/testsuite/gcc.target/arc/mdsp-packa.c b/gcc/testsuite/gcc.target/arc/mdsp-packa.c new file mode 100644 index 00000000000..f013a6dd1ea --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mdsp-packa.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-mdsp-packa" } */ +/* { dg-do assemble } */ + +int f (int i) +{ + __asm__("minidl %1, %1, %1" : "=r"(i) : "r"(i)); + return i; +} diff --git a/gcc/testsuite/gcc.target/arc/mdvbf.c b/gcc/testsuite/gcc.target/arc/mdvbf.c new file mode 100644 index 00000000000..e2e545e8bb3 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mdvbf.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-mdvbf" } */ +/* { dg-do assemble } */ + +int f (int i) +{ + __asm__("vbfdw %1, %1" : "=r"(i) : "r"(i)); + return i; +} diff --git a/gcc/testsuite/gcc.target/arc/mlock.c b/gcc/testsuite/gcc.target/arc/mlock.c new file mode 100644 index 00000000000..3a8b050c30e --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mlock.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-mlock" } */ +/* { dg-do assemble } */ + +int f (void *p) +{ + int i; + + __asm__("llock %0, [%1]\n\t" + "scond %0, [%1]" : "=&r"(i) : "r"(p)); + return i; +} diff --git a/gcc/testsuite/gcc.target/arc/mmac-24.c b/gcc/testsuite/gcc.target/arc/mmac-24.c new file mode 100644 index 00000000000..30cb6981a03 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mmac-24.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-mmac-24" } */ +/* { dg-do assemble } */ + +int f (int i) +{ + __asm__("mult %1, %1, %1" : "=r"(i) : "r"(i)); + return i; +} diff --git a/gcc/testsuite/gcc.target/arc/mmac-d16.c b/gcc/testsuite/gcc.target/arc/mmac-d16.c new file mode 100644 index 00000000000..0570011fd26 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mmac-d16.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-mmac-d16" } */ +/* { dg-do assemble } */ + +int f (int i) +{ + __asm__("muldw %1, %1, %1" : "=r"(i) : "r"(i)); + return i; +} diff --git a/gcc/testsuite/gcc.target/arc/mno-crc.c b/gcc/testsuite/gcc.target/arc/mno-crc.c new file mode 100644 index 00000000000..70ab9c11761 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mno-crc.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-mno-crc" } */ +/* Would also like to assemble and check that we get the expected + "Error: bad instruction" assembler messages, but at the moment our + testharness can't do that. */ + +int f (int i) +{ + __asm__("crc %1, %1, %1" : "=r"(i) : "r"(i)); + return i; +} diff --git a/gcc/testsuite/gcc.target/arc/mno-dsp-packa.c b/gcc/testsuite/gcc.target/arc/mno-dsp-packa.c new file mode 100644 index 00000000000..eb21522af06 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mno-dsp-packa.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-mno-dsp-packa" } */ +/* Would also like to assemble and check that we get the expected + "Error: bad instruction" assembler messages, but at the moment our + testharness can't do that. */ + +int f (int i) +{ + __asm__("minidl %1, %1, %1" : "=r"(i) : "r"(i)); + return i; +} diff --git a/gcc/testsuite/gcc.target/arc/mno-dvbf.c b/gcc/testsuite/gcc.target/arc/mno-dvbf.c new file mode 100644 index 00000000000..ea96d987c18 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mno-dvbf.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-mno-dvbf" } */ +/* Would also like to assemble and check that we get the expected + "Error: bad instruction" assembler messages, but at the moment our + testharness can't do that. */ + +int f (int i) +{ + __asm__("vbfdw %1, %1" : "=r"(i) : "r"(i)); + return i; +} diff --git a/gcc/testsuite/gcc.target/arc/mno-lock.c b/gcc/testsuite/gcc.target/arc/mno-lock.c new file mode 100644 index 00000000000..62ac885ba99 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mno-lock.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-mno-lock" } */ +/* Would also like to assemble and check that we get the expected + "Error: bad instruction" assembler messages, but at the moment our + testharness can't do that. */ + +int f (void *p) +{ + int i; + + __asm__("llock %0, [%1]\n\t" + "scond %0, [%1]" : "=&r"(i) : "r"(p)); + return i; +} diff --git a/gcc/testsuite/gcc.target/arc/mno-mac-24.c b/gcc/testsuite/gcc.target/arc/mno-mac-24.c new file mode 100644 index 00000000000..b4839579b12 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mno-mac-24.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-mno-mac-24" } */ +/* Would also like to assemble and check that we get the expected + "Error: bad instruction" assembler messages, but at the moment our + testharness can't do that. */ + +int f (int i) +{ + __asm__("mult %1, %1, %1" : "=r"(i) : "r"(i)); + return i; +} diff --git a/gcc/testsuite/gcc.target/arc/mno-mac-d16.c b/gcc/testsuite/gcc.target/arc/mno-mac-d16.c new file mode 100644 index 00000000000..68a20f4f55a --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mno-mac-d16.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-mno-mac-d16" } */ +/* Would also like to assemble and check that we get the expected + "Error: bad instruction" assembler messages, but at the moment our + testharness can't do that. */ + +int f (int i) +{ + __asm__("muldw %1, %1, %1" : "=r"(i) : "r"(i)); + return i; +} diff --git a/gcc/testsuite/gcc.target/arc/mno-rtsc.c b/gcc/testsuite/gcc.target/arc/mno-rtsc.c new file mode 100644 index 00000000000..d74a60e9351 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mno-rtsc.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-mno-rtsc" } */ +/* Would also like to assemble and check that we get the expected + "Error: bad instruction" assembler messages, but at the moment our + testharness can't do that. */ + +int f (int i) +{ + __asm__("rtsc %1, %1" : "=r"(i) : "r"(i)); + return i; +} diff --git a/gcc/testsuite/gcc.target/arc/mno-swape.c b/gcc/testsuite/gcc.target/arc/mno-swape.c new file mode 100644 index 00000000000..c853ab4bdcc --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mno-swape.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-mno-swape" } */ +/* Would also like to assemble and check that we get the expected + "Error: bad instruction" assembler messages, but at the moment our + testharness can't do that. */ + +int f (int i) +{ + __asm__("swape %1, %1" : "=r"(i) : "r"(i)); + return i; +} diff --git a/gcc/testsuite/gcc.target/arc/mno-xy.c b/gcc/testsuite/gcc.target/arc/mno-xy.c new file mode 100644 index 00000000000..e378b3fc9b6 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mno-xy.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-mno-xy" } */ +/* Would also like to assemble and check that we get the expected + "Error: bad instruction" assembler messages, but at the moment our + testharness can't do that. */ + +void f (int i) +{ + __asm__("add x0_u0, x0_u0, %0" : : "r" (i)); +} diff --git a/gcc/testsuite/gcc.target/arc/mrtsc.c b/gcc/testsuite/gcc.target/arc/mrtsc.c new file mode 100644 index 00000000000..31852a5e479 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mrtsc.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-mrtsc" } */ +/* { dg-do assemble } */ + +int f (int i) +{ + __asm__("rtsc %1, %1" : "=r"(i) : "r"(i)); + return i; +} diff --git a/gcc/testsuite/gcc.target/arc/mspfp.c b/gcc/testsuite/gcc.target/arc/mspfp.c new file mode 100644 index 00000000000..0e41ff89d35 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mspfp.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -mspfp" } */ + +float i; + +int f (void) +{ + i *= 2.0; +} + +/* { dg-final { scan-assembler "fadd" } } */ diff --git a/gcc/testsuite/gcc.target/arc/mswape.c b/gcc/testsuite/gcc.target/arc/mswape.c new file mode 100644 index 00000000000..692e6a2bb6e --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mswape.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-mswape" } */ +/* { dg-do assemble } */ + +int f (int i) +{ + __asm__("swape %1, %1" : "=r"(i) : "r"(i)); + return i; +} diff --git a/gcc/testsuite/gcc.target/arc/mtune-ARC600.c b/gcc/testsuite/gcc.target/arc/mtune-ARC600.c new file mode 100644 index 00000000000..a483d1435ca --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mtune-ARC600.c @@ -0,0 +1,4 @@ +/* { dg-do compile } */ +/* { dg-options "-mtune=ARC600" } */ + +/* { dg-final { scan-assembler ".cpu ARC700" } } */ diff --git a/gcc/testsuite/gcc.target/arc/mtune-ARC601.c b/gcc/testsuite/gcc.target/arc/mtune-ARC601.c new file mode 100644 index 00000000000..ed57bd7092d --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mtune-ARC601.c @@ -0,0 +1,4 @@ +/* { dg-do compile } */ +/* { dg-options "-mtune=ARC601" } */ + +/* { dg-final { scan-assembler ".cpu ARC700" } } */ diff --git a/gcc/testsuite/gcc.target/arc/mtune-ARC700-xmac b/gcc/testsuite/gcc.target/arc/mtune-ARC700-xmac new file mode 100644 index 00000000000..2f1e137be4d --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mtune-ARC700-xmac @@ -0,0 +1,4 @@ +/* { dg-do compile } */ +/* { dg-options "-mtune=ARC700-xmac" } */ + +/* { dg-final { scan-assembler ".cpu ARC700" } } */ diff --git a/gcc/testsuite/gcc.target/arc/mtune-ARC700.c b/gcc/testsuite/gcc.target/arc/mtune-ARC700.c new file mode 100644 index 00000000000..851ea7305e0 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mtune-ARC700.c @@ -0,0 +1,4 @@ +/* { dg-do compile } */ +/* { dg-options "-mtune=ARC700" } */ + +/* { dg-final { scan-assembler ".cpu ARC700" } } */ diff --git a/gcc/testsuite/gcc.target/arc/mtune-ARC725D.c b/gcc/testsuite/gcc.target/arc/mtune-ARC725D.c new file mode 100644 index 00000000000..e2aa4846291 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mtune-ARC725D.c @@ -0,0 +1,4 @@ +/* { dg-do compile } */ +/* { dg-options "-mtune=ARC725D" } */ + +/* { dg-final { scan-assembler ".cpu ARC700" } } */ diff --git a/gcc/testsuite/gcc.target/arc/mtune-ARC750D.c b/gcc/testsuite/gcc.target/arc/mtune-ARC750D.c new file mode 100644 index 00000000000..20923300ee1 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mtune-ARC750D.c @@ -0,0 +1,4 @@ +/* { dg-do compile } */ +/* { dg-options "-mtune=ARC750D" } */ + +/* { dg-final { scan-assembler ".cpu ARC700" } } */ diff --git a/gcc/testsuite/gcc.target/arc/mul64.c b/gcc/testsuite/gcc.target/arc/mul64.c new file mode 100644 index 00000000000..3678b2799d5 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mul64.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -mcpu=ARC600 -mmul64" } */ +#include <stdint.h> + +int64_t i; +int j, k; + +int f (void) +{ + i = j * k; +} + +/* { dg-final { scan-assembler "mul64" } } */ diff --git a/gcc/testsuite/gcc.target/arc/mxy.c b/gcc/testsuite/gcc.target/arc/mxy.c new file mode 100644 index 00000000000..1ecc34d2bdb --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/mxy.c @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-options "-mxy" } */ +/* { dg-do assemble } */ + +void f (int i) +{ + __asm__("add x0_u0, x0_u0, %0" : : "r" (i)); +} diff --git a/gcc/testsuite/gcc.target/arc/no-dpfp-lrsr.c b/gcc/testsuite/gcc.target/arc/no-dpfp-lrsr.c new file mode 100644 index 00000000000..e4e23e4a40f --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/no-dpfp-lrsr.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -mdpfp -mno-dpfp-lrsr" } */ + +double i; + +int f (void) +{ + i *= 2.0; +} + +/* { dg-final { scan-assembler-not "\tlr" } } */ diff --git a/gcc/testsuite/gcc.target/arm/atomic-comp-swap-release-acquire.c b/gcc/testsuite/gcc.target/arm/atomic-comp-swap-release-acquire.c index 1eabb26ef4d..ea6fdd96db1 100644 --- a/gcc/testsuite/gcc.target/arm/atomic-comp-swap-release-acquire.c +++ b/gcc/testsuite/gcc.target/arm/atomic-comp-swap-release-acquire.c @@ -5,6 +5,6 @@ #include "../aarch64/atomic-comp-swap-release-acquire.x" -/* { dg-final { scan-assembler-times "ldaex\tr\[0-9\]+, \\\[r\[0-9\]+\\\]" 4 } } */ +/* { dg-final { scan-assembler-times "ldaex" 4 } } */ /* { dg-final { scan-assembler-times "stlex" 4 } } */ /* { dg-final { scan-assembler-not "dmb" } } */ diff --git a/gcc/testsuite/gcc.target/arm/minmax_minus.c b/gcc/testsuite/gcc.target/arm/minmax_minus.c index 4c2dcdf8ec0..906342a87cf 100644 --- a/gcc/testsuite/gcc.target/arm/minmax_minus.c +++ b/gcc/testsuite/gcc.target/arm/minmax_minus.c @@ -1,4 +1,5 @@ /* { dg-do compile } */ +/* { dg-require-effective-target arm_cond_exec } */ /* { dg-options "-O2" } */ #define MAX(a, b) (a > b ? a : b) diff --git a/gcc/testsuite/gcc.target/arm/pr58578.c b/gcc/testsuite/gcc.target/arm/pr58578.c new file mode 100644 index 00000000000..2b474f544f2 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr58578.c @@ -0,0 +1,54 @@ + +/* PR target/58578 */ +/* { dg-do run } */ +/* { dg-options "-O1" } */ + +#include <stdlib.h> + +typedef struct { + long _prec; + int _flag; + long _exp; +} __my_st_t; + +typedef __my_st_t *__my_st_ptr; + +int +_test_fn (__my_st_ptr y, const __my_st_ptr xt) +{ + int inexact; + if (xt->_exp != -2147483647L) + { + (y->_flag = xt->_flag); + } + + do { + __my_st_ptr _y = y; + long _err1 = -2 * xt->_exp; + long _err2 = 2; + if (0 < _err1) + { + unsigned long _err = (unsigned long) _err1 + _err2; + if (__builtin_expect(!!(_err > _y->_prec + 1), 0)) + return 2; + return 3; + } + } while (0); + + return 0; +} + +int main () +{ + __my_st_t x, y; + long pz; + int inex; + + x._prec = 914; + y._exp = 18; + if (_test_fn (&x, &y)) + { + abort(); + } + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/thumb-ltu.c b/gcc/testsuite/gcc.target/arm/thumb-ltu.c index 24671213e5f..d057ea34d25 100644 --- a/gcc/testsuite/gcc.target/arm/thumb-ltu.c +++ b/gcc/testsuite/gcc.target/arm/thumb-ltu.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-skip-if "incompatible options" { arm*-*-* } { "-march=*" } { "-march=armv6" "-march=armv6j" "-march=armv6z" } } */ +/* { dg-require-effective-target arm_thumb1_ok } */ /* { dg-options "-mcpu=arm1136jf-s -mthumb -O2" } */ void f(unsigned a, unsigned b, unsigned c, unsigned d) diff --git a/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-2.c b/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-2.c index 977662beb34..48e2efa1382 100644 --- a/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-2.c +++ b/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-2.c @@ -24,5 +24,5 @@ avx_test (void) } /* { dg-final { scan-assembler-not "avx_storedqu256" } } */ -/* { dg-final { scan-assembler "vmovdqu.*\\*movv16qi_internal/3" } } */ +/* { dg-final { scan-assembler "vmovups.*\\*movv16qi_internal/3" } } */ /* { dg-final { scan-assembler "vextract.128" } } */ diff --git a/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-3.c b/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-3.c index e6744a892bc..6175d521764 100644 --- a/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-3.c +++ b/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-3.c @@ -18,5 +18,5 @@ avx_test (void) } /* { dg-final { scan-assembler-not "avx_storeupd256" } } */ -/* { dg-final { scan-assembler "vmovupd.*\\*movv2df_internal/3" } } */ +/* { dg-final { scan-assembler "vmovups.*\\*movv2df_internal/3" } } */ /* { dg-final { scan-assembler "vextractf128" } } */ diff --git a/gcc/testsuite/gcc.target/i386/builtin-ucmp.c b/gcc/testsuite/gcc.target/i386/builtin-ucmp.c new file mode 100644 index 00000000000..709804c35f6 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/builtin-ucmp.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -ffast-math -mfpmath=sse -msse2" } */ + +double foo(double a) +{ + return __builtin_round(a); +} + +/* { dg-final { scan-assembler-not "ucom" } } */ diff --git a/gcc/testsuite/gcc.target/i386/cold-attribute-2.c b/gcc/testsuite/gcc.target/i386/cold-attribute-2.c index 93ea906614f..4b61b9d56d8 100644 --- a/gcc/testsuite/gcc.target/i386/cold-attribute-2.c +++ b/gcc/testsuite/gcc.target/i386/cold-attribute-2.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2" } */ +/* { dg-options "-O2 --param=builtin-expect-probability=100" } */ #include <string.h> t(int c) { diff --git a/gcc/testsuite/gcc.target/i386/pr49002-2.c b/gcc/testsuite/gcc.target/i386/pr49002-2.c index b0e10091b5c..9f21a2d17d9 100644 --- a/gcc/testsuite/gcc.target/i386/pr49002-2.c +++ b/gcc/testsuite/gcc.target/i386/pr49002-2.c @@ -11,4 +11,5 @@ void foo(const __m128d from, __m256d *to) /* Ensure we store ymm, not xmm. */ /* { dg-final { scan-assembler-not "vmovapd\[\t \]*%xmm\[0-9\]\+,\[^,\]*" } } */ -/* { dg-final { scan-assembler "vmovapd\[\t \]*%ymm\[0-9\]\+,\[^,\]*" } } */ +/* { dg-final { scan-assembler-not "vmovaps\[\t \]*%xmm\[0-9\]\+,\[^,\]*" } } */ +/* { dg-final { scan-assembler "vmovaps\[\t \]*%ymm\[0-9\]\+,\[^,\]*" } } */ diff --git a/gcc/testsuite/gcc.target/i386/pr49168-1.c b/gcc/testsuite/gcc.target/i386/pr49168-1.c index 9676dc85a8e..4ca5e34d9cb 100644 --- a/gcc/testsuite/gcc.target/i386/pr49168-1.c +++ b/gcc/testsuite/gcc.target/i386/pr49168-1.c @@ -2,7 +2,8 @@ /* { dg-do compile } */ /* { dg-options "-O2 -msse2 -mtune=generic" } */ /* { dg-final { scan-assembler-not "movdqa\[\t \]*%xmm\[0-9\]\+,\[^,\]*" } } */ -/* { dg-final { scan-assembler "movdqu\[\t \]*%xmm\[0-9\]\+,\[^,\]*" } } */ +/* { dg-final { scan-assembler-not "movaps\[\t \]*%xmm\[0-9\]\+,\[^,\]*" } } */ +/* { dg-final { scan-assembler "movups\[\t \]*%xmm\[0-9\]\+,\[^,\]*" } } */ void flt128_va (void *mem, __float128 d) diff --git a/gcc/testsuite/gcc.target/i386/pr57756.c b/gcc/testsuite/gcc.target/i386/pr57756.c new file mode 100644 index 00000000000..81d53bfd565 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr57756.c @@ -0,0 +1,22 @@ +/* callee cannot be inlined into caller because it has a higher + target ISA. */ +/* { dg-do compile } */ + +__attribute__((always_inline,target("sse4.2"))) +__inline int callee () /* { dg-error "inlining failed in call to always_inline" } */ +{ + return 0; +} + +__attribute__((target("sse"))) +__inline int caller () +{ + return callee(); /* { dg-error "called from here" } */ +} + +int main () +{ + return caller(); +} +/* callee cannot be inlined into caller because it has a higher + target ISA. */ diff --git a/gcc/testsuite/gcc.target/i386/pr57756_2.c b/gcc/testsuite/gcc.target/i386/pr57756_2.c new file mode 100644 index 00000000000..0227d8ff402 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr57756_2.c @@ -0,0 +1,132 @@ +/* { dg-do run } */ +/* { dg-options "-mno-sse2 -mno-popcnt -mno-avx" } */ + + +__attribute__((always_inline,target("avx2"))) +__inline int c1 () +{ + return 0; +} + +__attribute__((always_inline,target("avx"))) +__inline int c2 () +{ + return 0; +} + +__attribute__((always_inline,target("popcnt"))) +__inline int c3 () +{ + return 0; +} + +__attribute__((always_inline,target("sse4.2"))) +__inline int c4 () +{ + return 0; +} + +__attribute__((always_inline,target("sse4.1"))) +__inline int c5 () +{ + return 0; +} + +__attribute__((always_inline,target("ssse3"))) +__inline int c6 () +{ + return 0; +} + +__attribute__((always_inline,target("sse3"))) +__inline int c7 () +{ + return 0; +} + +__attribute__((always_inline,target("sse2"))) +__inline int c8 () +{ + return 0; +} + +int nop () +{ + return 1; +} + +#pragma GCC push_options +#pragma GCC target("sse2") +int C8 () +{ + return c8 (); +} +#pragma GCC pop_options + + +#pragma GCC push_options +#pragma GCC target("sse3") +int C7 () +{ + return c7 (); +} +#pragma GCC pop_options + + +#pragma GCC push_options +#pragma GCC target("ssse3") +int C6 () +{ + return c6 (); +} +#pragma GCC pop_options + + +#pragma GCC push_options +#pragma GCC target("sse4.1") +int C5 () +{ + return c5 (); +} +#pragma GCC pop_options + + +#pragma GCC push_options +#pragma GCC target("sse4.2") +int C4 () +{ + return c4 (); +} +#pragma GCC pop_options + + +#pragma GCC push_options +#pragma GCC target("popcnt") +int C3 () +{ + return c3 (); +} +#pragma GCC pop_options + + +#pragma GCC push_options +#pragma GCC target("avx") +int C2 () +{ + return c2 (); +} +#pragma GCC pop_options + + +#pragma GCC push_options +#pragma GCC target("avx2") +int C1 () +{ + return c1 (); +} +#pragma GCC pop_options + +int main () +{ + return C1 () + C2 () + C3 () + C4 () + C5 () + C6 () + C7 () + C8 (); +} diff --git a/gcc/testsuite/gcc.target/i386/pr58690.c b/gcc/testsuite/gcc.target/i386/pr58690.c new file mode 100644 index 00000000000..87a87cc9c90 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr58690.c @@ -0,0 +1,14 @@ +/* { dg-do compile { target { ! { ia32 } } } } */ +/* { dg-require-effective-target maybe_x32 } */ +/* { dg-options "-O2 -mx32 -maddress-mode=short" } */ + +struct gomp_thread +{ + char foo[41]; +}; +extern __thread struct gomp_thread gomp_tls_data; +void +foo (void) +{ + __builtin_memset (&gomp_tls_data, '\0', sizeof (gomp_tls_data)); +} diff --git a/gcc/testsuite/gcc.target/mips/bswap-1.c b/gcc/testsuite/gcc.target/mips/bswap-1.c new file mode 100644 index 00000000000..24016f26931 --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/bswap-1.c @@ -0,0 +1,10 @@ +/* { dg-options "isa_rev>=2" } */ +/* { dg-skip-if "bswap recognition needs expensive optimizations" { *-*-* } { "-O0" "-O1" } { "" } } */ + +NOMIPS16 unsigned short +foo (unsigned short x) +{ + return ((x << 8) & 0xff00) | ((x >> 8) & 0xff); +} + +/* { dg-final { scan-assembler "\twsbh\t" } } */ diff --git a/gcc/testsuite/gcc.target/mips/bswap-2.c b/gcc/testsuite/gcc.target/mips/bswap-2.c new file mode 100644 index 00000000000..e0ca496b6d1 --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/bswap-2.c @@ -0,0 +1,9 @@ +/* { dg-options "isa_rev>=2" } */ + +NOMIPS16 unsigned short +foo (unsigned short x) +{ + return __builtin_bswap16 (x); +} + +/* { dg-final { scan-assembler "\twsbh\t" } } */ diff --git a/gcc/testsuite/gcc.target/mips/bswap-3.c b/gcc/testsuite/gcc.target/mips/bswap-3.c new file mode 100644 index 00000000000..5d2086fd324 --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/bswap-3.c @@ -0,0 +1,14 @@ +/* { dg-options "isa_rev>=2" } */ +/* { dg-skip-if "bswap recognition needs expensive optimizations" { *-*-* } { "-O0" "-O1" } { "" } } */ + +NOMIPS16 unsigned int +foo (unsigned int x) +{ + return (((x << 24) & 0xff000000) + | ((x << 8) & 0xff0000) + | ((x >> 8) & 0xff00) + | ((x >> 24) & 0xff)); +} + +/* { dg-final { scan-assembler "\twsbh\t" } } */ +/* { dg-final { scan-assembler "\tror\t" } } */ diff --git a/gcc/testsuite/gcc.target/mips/bswap-4.c b/gcc/testsuite/gcc.target/mips/bswap-4.c new file mode 100644 index 00000000000..ac37a011440 --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/bswap-4.c @@ -0,0 +1,10 @@ +/* { dg-options "isa_rev>=2" } */ + +NOMIPS16 unsigned int +foo (unsigned int x) +{ + return __builtin_bswap32 (x); +} + +/* { dg-final { scan-assembler "\twsbh\t" } } */ +/* { dg-final { scan-assembler "\tror\t" } } */ diff --git a/gcc/testsuite/gcc.target/mips/bswap-5.c b/gcc/testsuite/gcc.target/mips/bswap-5.c new file mode 100644 index 00000000000..45520e4ab85 --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/bswap-5.c @@ -0,0 +1,20 @@ +/* { dg-options "isa_rev>=2 -mgp64" } */ +/* { dg-skip-if "bswap recognition needs expensive optimizations" { *-*-* } { "-O0" "-O1" } { "" } } */ + +typedef unsigned long long uint64_t; + +NOMIPS16 uint64_t +foo (uint64_t x) +{ + return (((x << 56) & 0xff00000000000000ull) + | ((x << 40) & 0xff000000000000ull) + | ((x << 24) & 0xff0000000000ull) + | ((x << 8) & 0xff00000000ull) + | ((x >> 8) & 0xff000000) + | ((x >> 24) & 0xff0000) + | ((x >> 40) & 0xff00) + | ((x >> 56) & 0xff)); +} + +/* { dg-final { scan-assembler "\tdsbh\t" } } */ +/* { dg-final { scan-assembler "\tdshd\t" } } */ diff --git a/gcc/testsuite/gcc.target/mips/bswap-6.c b/gcc/testsuite/gcc.target/mips/bswap-6.c new file mode 100644 index 00000000000..1145357fef1 --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/bswap-6.c @@ -0,0 +1,12 @@ +/* { dg-options "isa_rev>=2 -mgp64" } */ + +typedef unsigned long long uint64_t; + +NOMIPS16 uint64_t +foo (uint64_t x) +{ + return __builtin_bswap64 (x); +} + +/* { dg-final { scan-assembler "\tdsbh\t" } } */ +/* { dg-final { scan-assembler "\tdshd\t" } } */ diff --git a/gcc/testsuite/gcc.target/mips/mips-ps-5.c b/gcc/testsuite/gcc.target/mips/mips-ps-5.c index 6bf908ee976..077076f4736 100644 --- a/gcc/testsuite/gcc.target/mips/mips-ps-5.c +++ b/gcc/testsuite/gcc.target/mips/mips-ps-5.c @@ -2,7 +2,9 @@ /* { dg-options "-mpaired-single -mgp64 -ftree-vectorize" } */ /* { dg-skip-if "requires vectorization" { *-*-* } { "-O0" "-Os" } { "" } } */ -extern float a[], b[], c[]; +extern float a[] __attribute__ ((aligned (8))); +extern float b[] __attribute__ ((aligned (8))); +extern float c[] __attribute__ ((aligned (8))); NOMIPS16 void foo (void) diff --git a/gcc/testsuite/gcc.target/mips/mips-ps-7.c b/gcc/testsuite/gcc.target/mips/mips-ps-7.c index 35d25fdc89c..3b4e5308598 100644 --- a/gcc/testsuite/gcc.target/mips/mips-ps-7.c +++ b/gcc/testsuite/gcc.target/mips/mips-ps-7.c @@ -3,7 +3,9 @@ /* { dg-options "-mgp32 -mpaired-single -ftree-vectorize" } */ /* { dg-skip-if "requires vectorization" { *-*-* } { "-O0" "-Os" } { "" } } */ -extern float a[], b[], c[]; +extern float a[] __attribute__ ((aligned (8))); +extern float b[] __attribute__ ((aligned (8))); +extern float c[] __attribute__ ((aligned (8))); NOMIPS16 void foo (void) diff --git a/gcc/testsuite/gcc.target/powerpc/fusion.c b/gcc/testsuite/gcc.target/powerpc/fusion.c index 3bea1c9f5a8..60e635972c4 100644 --- a/gcc/testsuite/gcc.target/powerpc/fusion.c +++ b/gcc/testsuite/gcc.target/powerpc/fusion.c @@ -1,5 +1,6 @@ /* { dg-do compile { target { powerpc*-*-* } } } */ /* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */ +/* { dg-skip-if "" { powerpc*le-*-* } { "*" } { "" } } */ /* { dg-require-effective-target powerpc_p8vector_ok } */ /* { dg-options "-mcpu=power7 -mtune=power8 -O3" } */ diff --git a/gcc/testsuite/gcc.target/powerpc/p8vector-fp.c b/gcc/testsuite/gcc.target/powerpc/p8vector-fp.c new file mode 100644 index 00000000000..3cfd8161dd6 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/p8vector-fp.c @@ -0,0 +1,139 @@ +/* { dg-do compile { target { powerpc*-*-* } } } */ +/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */ +/* { dg-require-effective-target powerpc_p8vector_ok } */ +/* { dg-options "-mcpu=power8 -O2 -mupper-regs-df -mupper-regs-sf -fno-math-errno" } */ + +float abs_sf (float *p) +{ + float f = *p; + __asm__ ("# reg %x0" : "+v" (f)); + return __builtin_fabsf (f); +} + +float nabs_sf (float *p) +{ + float f = *p; + __asm__ ("# reg %x0" : "+v" (f)); + return - __builtin_fabsf (f); +} + +float neg_sf (float *p) +{ + float f = *p; + __asm__ ("# reg %x0" : "+v" (f)); + return - f; +} + +float add_sf (float *p, float *q) +{ + float f1 = *p; + float f2 = *q; + __asm__ ("# reg %x0, %x1" : "+v" (f1), "+v" (f2)); + return f1 + f2; +} + +float sub_sf (float *p, float *q) +{ + float f1 = *p; + float f2 = *q; + __asm__ ("# reg %x0, %x1" : "+v" (f1), "+v" (f2)); + return f1 - f2; +} + +float mul_sf (float *p, float *q) +{ + float f1 = *p; + float f2 = *q; + __asm__ ("# reg %x0, %x1" : "+v" (f1), "+v" (f2)); + return f1 * f2; +} + +float div_sf (float *p, float *q) +{ + float f1 = *p; + float f2 = *q; + __asm__ ("# reg %x0, %x1" : "+v" (f1), "+v" (f2)); + return f1 / f2; +} + +float sqrt_sf (float *p) +{ + float f = *p; + __asm__ ("# reg %x0" : "+v" (f)); + return __builtin_sqrtf (f); +} + + +double abs_df (double *p) +{ + double d = *p; + __asm__ ("# reg %x0" : "+v" (d)); + return __builtin_fabs (d); +} + +double nabs_df (double *p) +{ + double d = *p; + __asm__ ("# reg %x0" : "+v" (d)); + return - __builtin_fabs (d); +} + +double neg_df (double *p) +{ + double d = *p; + __asm__ ("# reg %x0" : "+v" (d)); + return - d; +} + +double add_df (double *p, double *q) +{ + double d1 = *p; + double d2 = *q; + __asm__ ("# reg %x0, %x1" : "+v" (d1), "+v" (d2)); + return d1 + d2; +} + +double sub_df (double *p, double *q) +{ + double d1 = *p; + double d2 = *q; + __asm__ ("# reg %x0, %x1" : "+v" (d1), "+v" (d2)); + return d1 - d2; +} + +double mul_df (double *p, double *q) +{ + double d1 = *p; + double d2 = *q; + __asm__ ("# reg %x0, %x1" : "+v" (d1), "+v" (d2)); + return d1 * d2; +} + +double div_df (double *p, double *q) +{ + double d1 = *p; + double d2 = *q; + __asm__ ("# reg %x0, %x1" : "+v" (d1), "+v" (d2)); + return d1 / d2; +} + +double sqrt_df (float *p) +{ + double d = *p; + __asm__ ("# reg %x0" : "+v" (d)); + return __builtin_sqrt (d); +} + +/* { dg-final { scan-assembler "xsabsdp" } } */ +/* { dg-final { scan-assembler "xsadddp" } } */ +/* { dg-final { scan-assembler "xsaddsp" } } */ +/* { dg-final { scan-assembler "xsdivdp" } } */ +/* { dg-final { scan-assembler "xsdivsp" } } */ +/* { dg-final { scan-assembler "xsmuldp" } } */ +/* { dg-final { scan-assembler "xsmulsp" } } */ +/* { dg-final { scan-assembler "xsnabsdp" } } */ +/* { dg-final { scan-assembler "xsnegdp" } } */ +/* { dg-final { scan-assembler "xssqrtdp" } } */ +/* { dg-final { scan-assembler "xssqrtsp" } } */ +/* { dg-final { scan-assembler "xssubdp" } } */ +/* { dg-final { scan-assembler "xssubsp" } } */ diff --git a/gcc/testsuite/gcc.target/powerpc/p8vector-ldst.c b/gcc/testsuite/gcc.target/powerpc/p8vector-ldst.c new file mode 100644 index 00000000000..d0b3eb09ef7 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/p8vector-ldst.c @@ -0,0 +1,42 @@ +/* { dg-do compile { target { powerpc*-*-* } } } */ +/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */ +/* { dg-require-effective-target powerpc_p8vector_ok } */ +/* { dg-options "-mcpu=power8 -O2 -mupper-regs-df -mupper-regs-sf" } */ + +float load_sf (float *p) +{ + float f = *p; + __asm__ ("# reg %x0" : "+v" (f)); + return f; +} + +double load_df (double *p) +{ + double d = *p; + __asm__ ("# reg %x0" : "+v" (d)); + return d; +} + +double load_dfsf (float *p) +{ + double d = (double) *p; + __asm__ ("# reg %x0" : "+v" (d)); + return d; +} + +void store_sf (float *p, float f) +{ + __asm__ ("# reg %x0" : "+v" (f)); + *p = f; +} + +void store_df (double *p, double d) +{ + __asm__ ("# reg %x0" : "+v" (d)); + *p = d; +} + +/* { dg-final { scan-assembler-times "lxsspx" 2 } } */ +/* { dg-final { scan-assembler-times "lxsdx" 1 } } */ +/* { dg-final { scan-assembler-times "stxsspx" 1 } } */ +/* { dg-final { scan-assembler-times "stxsdx" 1 } } */ diff --git a/gcc/testsuite/gcc.target/powerpc/ppc-target-1.c b/gcc/testsuite/gcc.target/powerpc/ppc-target-1.c index c98666c47a0..b39fe4115bc 100644 --- a/gcc/testsuite/gcc.target/powerpc/ppc-target-1.c +++ b/gcc/testsuite/gcc.target/powerpc/ppc-target-1.c @@ -5,8 +5,7 @@ /* { dg-final { scan-assembler-times "fabs" 3 } } */ /* { dg-final { scan-assembler-times "fnabs" 3 } } */ /* { dg-final { scan-assembler-times "fsel" 3 } } */ -/* { dg-final { scan-assembler-times "fcpsgn" 3 } } */ -/* { dg-final { scan-assembler-times "xscpsgndp" 1 } } */ +/* { dg-final { scan-assembler-times "fcpsgn\|xscpsgndp" 4 } } */ double normal1 (double, double); double power5 (double, double) __attribute__((__target__("cpu=power5"))); diff --git a/gcc/testsuite/gcc.target/powerpc/ppc-target-2.c b/gcc/testsuite/gcc.target/powerpc/ppc-target-2.c index 8ef95b7a15b..e8a2de3636a 100644 --- a/gcc/testsuite/gcc.target/powerpc/ppc-target-2.c +++ b/gcc/testsuite/gcc.target/powerpc/ppc-target-2.c @@ -5,8 +5,7 @@ /* { dg-final { scan-assembler-times "fabs" 3 } } */ /* { dg-final { scan-assembler-times "fnabs" 3 } } */ /* { dg-final { scan-assembler-times "fsel" 3 } } */ -/* { dg-final { scan-assembler-times "fcpsgn" 3 } } */ -/* { dg-final { scan-assembler-times "xscpsgndp" 1 } } */ +/* { dg-final { scan-assembler-times "fcpsgn\|xscpsgndp" 4 } } */ /* fabs/fnabs/fsel */ double normal1 (double a, double b) { return __builtin_copysign (a, b); } diff --git a/gcc/testsuite/gcc.target/powerpc/pr42747.c b/gcc/testsuite/gcc.target/powerpc/pr42747.c index 9e7310e1767..41362db1774 100644 --- a/gcc/testsuite/gcc.target/powerpc/pr42747.c +++ b/gcc/testsuite/gcc.target/powerpc/pr42747.c @@ -5,4 +5,4 @@ double foo (double x) { return __builtin_sqrt (x); } -/* { dg-final { scan-assembler "xssqrtdp" } } */ +/* { dg-final { scan-assembler "xssqrtdp\|fsqrt" } } */ diff --git a/gcc/testsuite/gcc.target/powerpc/pr43154.c b/gcc/testsuite/gcc.target/powerpc/pr43154.c index d083e977b2f..eb1919743b5 100644 --- a/gcc/testsuite/gcc.target/powerpc/pr43154.c +++ b/gcc/testsuite/gcc.target/powerpc/pr43154.c @@ -1,5 +1,6 @@ /* { dg-do compile { target { powerpc*-*-* } } } */ /* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */ +/* { dg-skip-if "" { powerpc*le-*-* } { "*" } { "" } } */ /* { dg-require-effective-target powerpc_vsx_ok } */ /* { dg-options "-O2 -mcpu=power7" } */ diff --git a/gcc/testsuite/gcc.target/powerpc/pr58673-1.c b/gcc/testsuite/gcc.target/powerpc/pr58673-1.c new file mode 100644 index 00000000000..6f7838f8dde --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr58673-1.c @@ -0,0 +1,78 @@ +/* { dg-do compile { target { powerpc*-*-* && lp64 } } } */ +/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */ +/* { dg-require-effective-target powerpc_p8vector_ok } */ +/* { dg-options "-mcpu=power8 -m64 -O1" } */ + +enum typecode +{ + QIcode, QUcode, HIcode, HUcode, SIcode, SUcode, DIcode, DUcode, SFcode, + DFcode, XFcode, Pcode, Tcode, LAST_AND_UNUSED_TYPECODE +}; +enum bytecode_opcode +{ + neverneverland, drop, duplicate, over, setstackSI, adjstackSI, constQI, + constHI, constSI, constDI, constSF, constDF, constXF, constP, loadQI, + loadHI, loadSI, loadDI, loadSF, loadDF, loadXF, loadP, storeQI, storeHI, + storeSI, storeDI, storeSF, storeDF, storeXF, storeP, storeBLK, clearBLK, + addconstPSI, newlocalSI, localP, argP, convertQIHI, convertHISI, + convertSIDI, convertQISI, convertQUHU, convertHUSU, convertSUDU, + convertQUSU, convertSFDF, convertDFXF, convertHIQI, convertSIHI, + convertDISI, convertSIQI, convertSUQU, convertDFSF, convertXFDF, + convertSISF, convertSIDF, convertSIXF, convertSUSF, convertSUDF, + convertSUXF, convertDISF, convertDIDF, convertDIXF, convertDUSF, + convertDUDF, convertDUXF, convertSFSI, convertDFSI, convertXFSI, + convertSFSU, convertDFSU, convertXFSU, convertSFDI, convertDFDI, + convertXFDI, convertSFDU, convertDFDU, convertXFDU, convertPSI, + convertSIP, convertSIT, convertDIT, convertSFT, convertDFT, convertXFT, + convertPT, zxloadBI, sxloadBI, sstoreBI, addSI, addDI, addSF, addDF, + addXF, addPSI, subSI, subDI, subSF, subDF, subXF, subPP, mulSI, mulDI, + mulSU, mulDU, mulSF, mulDF, mulXF, divSI, divDI, divSU, divDU, divSF, + divDF, divXF, modSI, modDI, modSU, modDU, andSI, andDI, iorSI, iorDI, + xorSI, xorDI, lshiftSI, lshiftSU, lshiftDI, lshiftDU, rshiftSI, rshiftSU, + rshiftDI, rshiftDU, ltSI, ltSU, ltDI, ltDU, ltSF, ltDF, ltXF, ltP, leSI, + leSU, leDI, leDU, leSF, leDF, leXF, leP, geSI, geSU, geDI, geDU, geSF, + geDF, geXF, geP, gtSI, gtSU, gtDI, gtDU, gtSF, gtDF, gtXF, gtP, eqSI, + eqDI, eqSF, eqDF, eqXF, eqP, neSI, neDI, neSF, neDF, neXF, neP, negSI, + negDI, negSF, negDF, negXF, notSI, notDI, notT, predecQI, predecHI, + predecSI, predecDI, predecP, predecSF, predecDF, predecXF, predecBI, + preincQI, preincHI, preincSI, preincDI, preincP, preincSF, preincDF, + preincXF, preincBI, postdecQI, postdecHI, postdecSI, postdecDI, postdecP, + postdecSF, postdecDF, postdecXF, postdecBI, postincQI, postincHI, + postincSI, postincDI, postincP, postincSF, postincDF, postincXF, + postincBI, xjumpif, xjumpifnot, jump, jumpP, caseSI, caseSU, caseDI, + caseDU, call, returnP, ret, linenote, LAST_AND_UNUSED_OPCODE +}; +struct binary_operator +{ + enum bytecode_opcode opcode; + enum typecode arg0; +}; +static struct conversion_recipe +{ + unsigned char *opcodes; + int cost; +} +conversion_recipe[((int) LAST_AND_UNUSED_TYPECODE)][((int) + LAST_AND_UNUSED_TYPECODE)]; +static struct conversion_recipe +deduce_conversion (from, to) + enum typecode from, to; +{ + (conversion_recipe[(int) from][(int) to]. + opcodes ? 0 : (conversion_recipe[(int) from][(int) to] = + deduce_conversion (from, to), 0)); +} + +void +bc_expand_binary_operation (optab, resulttype, arg0, arg1) + struct binary_operator optab[]; +{ + int i, besti, cost, bestcost; + enum typecode resultcode, arg0code; + for (i = 0; optab[i].opcode != -1; ++i) + { + (conversion_recipe[(int) arg0code][(int) optab[i].arg0]. + opcodes ? 0 : (conversion_recipe[(int) arg0code][(int) optab[i].arg0] = + deduce_conversion (arg0code, optab[i].arg0), 0)); + } +} diff --git a/gcc/testsuite/gcc.target/powerpc/pr58673-2.c b/gcc/testsuite/gcc.target/powerpc/pr58673-2.c new file mode 100644 index 00000000000..b70d2eed88c --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr58673-2.c @@ -0,0 +1,217 @@ +/* { dg-do compile { target { powerpc*-*-* && lp64 } } } */ +/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */ +/* { dg-require-effective-target powerpc_p8vector_ok } */ +/* { dg-options "-mcpu=power8 -O3 -m64 -funroll-loops" } */ + +#include <stddef.h> +#include <stdlib.h> +#include <math.h> +#include <string.h> + +typedef long unsigned int size_t; +typedef struct _IO_FILE FILE; +typedef float real; +typedef real rvec[3]; +typedef real matrix[3][3]; +typedef real tensor[3][3]; +enum +{ + F_BONDS, F_G96BONDS, F_MORSE, F_CUBICBONDS, F_CONNBONDS, F_HARMONIC, + F_ANGLES, F_G96ANGLES, F_PDIHS, F_RBDIHS, F_IDIHS, F_LJ14, F_COUL14, F_LJ, + F_BHAM, F_LJLR, F_DISPCORR, F_SR, F_LR, F_WPOL, F_POSRES, F_DISRES, + F_DISRESVIOL, F_ORIRES, F_ORIRESDEV, F_ANGRES, F_ANGRESZ, F_SHAKE, + F_SHAKENC, F_SETTLE, F_DUMMY2, F_DUMMY3, F_DUMMY3FD, F_DUMMY3FAD, + F_DUMMY3OUT, F_DUMMY4FD, F_EQM, F_EPOT, F_EKIN, F_ETOT, F_TEMP, F_PRES, + F_DVDL, F_DVDLKIN, F_NRE +}; +typedef union +{ + struct + { + } + bham; + struct + { + real rA, krA, rB, krB; + } + harmonic; +} +t_iparams; +typedef struct +{ + t_iparams *iparams; +} +t_idef; +typedef struct +{ +} +t_inputrec; +typedef struct +{ +} +t_commrec; +typedef struct +{ +} +t_forcerec; +typedef struct +{ +} +t_mdatoms; +typedef struct +{ +} +t_filenm; +enum +{ + eoPres, eoEpot, eoVir, eoDist, eoMu, eoForce, eoFx, eoFy, eoFz, eoPx, eoPy, + eoPz, eoPolarizability, eoDipole, eoObsNR, eoMemory = + eoObsNR, eoInter, eoUseVirial, eoNR +}; +extern char *eoNames[eoNR]; +typedef struct +{ + int bPrint; +} +t_coupl_LJ; +typedef struct +{ + int eObs; + t_iparams xi; +} +t_coupl_iparams; +typedef struct +{ + real act_value[eoObsNR]; + real av_value[eoObsNR]; + real ref_value[eoObsNR]; + int bObsUsed[eoObsNR]; + int nLJ, nBU, nQ, nIP; + t_coupl_LJ *tcLJ; +} +t_coupl_rec; +static void +pr_ff (t_coupl_rec * tcr, real time, t_idef * idef, t_commrec * cr, int nfile, + t_filenm fnm[]) +{ + static FILE *prop; + static FILE **out = ((void *) 0); + static FILE **qq = ((void *) 0); + static FILE **ip = ((void *) 0); + char buf[256]; + char *leg[] = { + "C12", "C6" + }; + char **raleg; + int i, j, index; + if ((prop == ((void *) 0)) && (out == ((void *) 0)) && (qq == ((void *) 0)) + && (ip == ((void *) 0))) + { + for (i = j = 0; (i < eoObsNR); i++) + { + if (tcr->bObsUsed[i]) + { + raleg[j++] = + (__extension__ + (__builtin_constant_p (eoNames[i]) + && ((size_t) (const void *) ((eoNames[i]) + 1) - + (size_t) (const void *) (eoNames[i]) == + 1) ? (((const char *) (eoNames[i]))[0] == + '\0' ? (char *) calloc ((size_t) 1, + (size_t) 1) : ( + { + size_t + __len + = + strlen + (eoNames + [i]) + + + 1; + char + *__retval + = + (char + *) + malloc + (__len); + __retval;} + )): __strdup (eoNames[i]))); + raleg[j++] = + (__extension__ + (__builtin_constant_p (buf) + && ((size_t) (const void *) ((buf) + 1) - + (size_t) (const void *) (buf) == + 1) ? (((const char *) (buf))[0] == + '\0' ? (char *) calloc ((size_t) 1, + (size_t) 1) : ( + { + size_t + __len + = + strlen + (buf) + + + 1; + char + *__retval + = + (char + *) + malloc + (__len); + __retval;} + )): __strdup (buf))); + } + } + if (tcr->nLJ) + { + for (i = 0; (i < tcr->nLJ); i++) + { + if (tcr->tcLJ[i].bPrint) + { + xvgr_legend (out[i], (sizeof (leg) / sizeof ((leg)[0])), + leg); + } + } + } + } +} + +void +do_coupling (FILE * log, int nfile, t_filenm fnm[], t_coupl_rec * tcr, real t, + int step, real ener[], t_forcerec * fr, t_inputrec * ir, + int bMaster, t_mdatoms * md, t_idef * idef, real mu_aver, + int nmols, t_commrec * cr, matrix box, tensor virial, + tensor pres, rvec mu_tot, rvec x[], rvec f[], int bDoIt) +{ + int i, j, ati, atj, atnr2, type, ftype; + real deviation[eoObsNR], prdev[eoObsNR], epot0, dist, rmsf; + real ff6, ff12, ffa, ffb, ffc, ffq, factor, dt, mu_ind; + int bTest, bPrint; + t_coupl_iparams *tip; + if (bPrint) + { + pr_ff (tcr, t, idef, cr, nfile, fnm); + } + for (i = 0; (i < eoObsNR); i++) + { + deviation[i] = + calc_deviation (tcr->av_value[i], tcr->act_value[i], + tcr->ref_value[i]); + prdev[i] = tcr->ref_value[i] - tcr->act_value[i]; + } + if (bPrint) + pr_dev (tcr, t, prdev, cr, nfile, fnm); + for (i = 0; (i < atnr2); i++) + { + factor = dt * deviation[tip->eObs]; + switch (ftype) + { + case F_BONDS: + if (fabs (tip->xi.harmonic.krA) > 1.2e-38) + idef->iparams[type].harmonic.krA *= + (1 + factor / tip->xi.harmonic.krA); + } + } +} diff --git a/gcc/testsuite/gcc.target/powerpc/recip-3.c b/gcc/testsuite/gcc.target/powerpc/recip-3.c index 56ab371985b..1f8e30572b2 100644 --- a/gcc/testsuite/gcc.target/powerpc/recip-3.c +++ b/gcc/testsuite/gcc.target/powerpc/recip-3.c @@ -1,14 +1,14 @@ /* { dg-do compile { target { { powerpc*-*-* } && { ! powerpc*-apple-darwin* } } } } */ /* { dg-require-effective-target powerpc_fprs } */ /* { dg-options "-O2 -mrecip -ffast-math -mcpu=power7" } */ -/* { dg-final { scan-assembler-times "xsrsqrtedp" 1 } } */ +/* { dg-final { scan-assembler-times "xsrsqrtedp\|frsqrte\ " 1 } } */ /* { dg-final { scan-assembler-times "xsmsub.dp\|fmsub\ " 1 } } */ -/* { dg-final { scan-assembler-times "xsmuldp" 4 } } */ +/* { dg-final { scan-assembler-times "xsmuldp\|fmul\ " 4 } } */ /* { dg-final { scan-assembler-times "xsnmsub.dp\|fnmsub\ " 2 } } */ -/* { dg-final { scan-assembler-times "frsqrtes" 1 } } */ -/* { dg-final { scan-assembler-times "fmsubs" 1 } } */ -/* { dg-final { scan-assembler-times "fmuls" 2 } } */ -/* { dg-final { scan-assembler-times "fnmsubs" 1 } } */ +/* { dg-final { scan-assembler-times "xsrsqrtesp\|frsqrtes" 1 } } */ +/* { dg-final { scan-assembler-times "xsmsub.sp\|fmsubs" 1 } } */ +/* { dg-final { scan-assembler-times "xsmulsp\|fmuls" 2 } } */ +/* { dg-final { scan-assembler-times "xsnmsub.sp\|fnmsubs" 1 } } */ double rsqrt_d (double a) diff --git a/gcc/testsuite/gcc.target/powerpc/recip-5.c b/gcc/testsuite/gcc.target/powerpc/recip-5.c index 0e89075bbe9..11d125c110e 100644 --- a/gcc/testsuite/gcc.target/powerpc/recip-5.c +++ b/gcc/testsuite/gcc.target/powerpc/recip-5.c @@ -4,12 +4,12 @@ /* { dg-options "-O3 -ftree-vectorize -mrecip=all -ffast-math -mcpu=power7 -fno-unroll-loops" } */ /* { dg-final { scan-assembler-times "xvredp" 4 } } */ /* { dg-final { scan-assembler-times "xvresp" 5 } } */ -/* { dg-final { scan-assembler-times "xsredp" 2 } } */ -/* { dg-final { scan-assembler-times "fres" 2 } } */ -/* { dg-final { scan-assembler-times "fmuls" 2 } } */ -/* { dg-final { scan-assembler-times "fnmsubs" 2 } } */ -/* { dg-final { scan-assembler-times "xsmuldp" 2 } } */ -/* { dg-final { scan-assembler-times "xsnmsub.dp" 4 } } */ +/* { dg-final { scan-assembler-times "xsredp\|fre\ " 2 } } */ +/* { dg-final { scan-assembler-times "fres\|xsresp" 2 } } */ +/* { dg-final { scan-assembler-times "fmuls\|xsmulsp" 2 } } */ +/* { dg-final { scan-assembler-times "fnmsubs\|xsnmsub.sp" 2 } } */ +/* { dg-final { scan-assembler-times "xsmuldp\|fmul\ " 2 } } */ +/* { dg-final { scan-assembler-times "xsnmsub.dp\|fnmsub\ " 4 } } */ /* { dg-final { scan-assembler-times "xvmulsp" 7 } } */ /* { dg-final { scan-assembler-times "xvnmsub.sp" 5 } } */ /* { dg-final { scan-assembler-times "xvmuldp" 6 } } */ diff --git a/gcc/testsuite/gcc.target/powerpc/vsx-builtin-3.c b/gcc/testsuite/gcc.target/powerpc/vsx-builtin-3.c index 8450920ec0c..7aeba6cb563 100644 --- a/gcc/testsuite/gcc.target/powerpc/vsx-builtin-3.c +++ b/gcc/testsuite/gcc.target/powerpc/vsx-builtin-3.c @@ -16,9 +16,9 @@ /* { dg-final { scan-assembler "xvrspiz" } } */ /* { dg-final { scan-assembler "xsrdpi" } } */ /* { dg-final { scan-assembler "xsrdpic" } } */ -/* { dg-final { scan-assembler "xsrdpim" } } */ -/* { dg-final { scan-assembler "xsrdpip" } } */ -/* { dg-final { scan-assembler "xsrdpiz" } } */ +/* { dg-final { scan-assembler "xsrdpim\|frim" } } */ +/* { dg-final { scan-assembler "xsrdpip\|frip" } } */ +/* { dg-final { scan-assembler "xsrdpiz\|friz" } } */ /* { dg-final { scan-assembler "xsmaxdp" } } */ /* { dg-final { scan-assembler "xsmindp" } } */ /* { dg-final { scan-assembler "xxland" } } */ diff --git a/gcc/testsuite/gcc.target/s390/htm-1.c b/gcc/testsuite/gcc.target/s390/htm-1.c index e6321de071e..245ba2c7ef9 100644 --- a/gcc/testsuite/gcc.target/s390/htm-1.c +++ b/gcc/testsuite/gcc.target/s390/htm-1.c @@ -7,11 +7,12 @@ #include <stdint.h> #include <htmintrin.h> -int a = 0; +int global = 0; uint64_t g; +struct __htm_tdb global_tdb; int -foo (struct __htm_tdb* tdb) +foo (struct __htm_tdb* tdb, int reg, int *mem, uint64_t *mem64) { int cc; @@ -19,19 +20,54 @@ foo (struct __htm_tdb* tdb) cc = __builtin_tbegin (0); cc = __builtin_tbegin (tdb); + cc = __builtin_tbegin (&global_tdb); + cc = __builtin_tbegin_nofloat (0); - cc = __builtin_tbegin_nofloat (tdb); + cc = __builtin_tbegin_nofloat (&global_tdb); + cc = __builtin_tbegin_retry (0, 42); + cc = __builtin_tbegin_retry (0, reg); + cc = __builtin_tbegin_retry (0, *mem); + cc = __builtin_tbegin_retry (0, global); cc = __builtin_tbegin_retry (tdb, 42); + cc = __builtin_tbegin_retry (&global_tdb, 42); + cc = __builtin_tbegin_retry_nofloat (0, 42); - cc = __builtin_tbegin_retry_nofloat (tdb, 42); + cc = __builtin_tbegin_retry_nofloat (0, reg); + cc = __builtin_tbegin_retry_nofloat (0, *mem); + cc = __builtin_tbegin_retry_nofloat (0, global); + cc = __builtin_tbegin_retry_nofloat (&global_tdb, 42); + __builtin_tbeginc (); + n = __builtin_tx_nesting_depth(); - __builtin_non_tx_store(&g, n); + + __builtin_non_tx_store(&g, 23); + __builtin_non_tx_store(mem64, 23); + __builtin_non_tx_store(&g, reg); + __builtin_non_tx_store(&g, *mem); + __builtin_non_tx_store(&g, global); + __builtin_tabort (42 + 255); + __builtin_tabort (reg); + /* { dg-final { scan-assembler-times "tabort\t255" 1 } } */ + __builtin_tabort (reg + 255); + __builtin_tabort (*mem); + __builtin_tabort (global); + /* Here global + 255 gets reloaded into a reg. Better would be to + just reload global or *mem and get the +255 for free as address + arithmetic. */ + __builtin_tabort (*mem + 255); + __builtin_tabort (global + 255); + __builtin_tend(); + __builtin_tx_assist (23); + __builtin_tx_assist (reg); + __builtin_tx_assist (*mem); + __builtin_tx_assist (global); } + /* Make sure the tdb NULL argument ends up as immediate value in the instruction. */ -/* { dg-final { scan-assembler-times "tbegin\t0," 4 } } */ +/* { dg-final { scan-assembler-times "tbegin\t0," 10 } } */ diff --git a/gcc/testsuite/gcc.target/s390/htm-nofloat-2.c b/gcc/testsuite/gcc.target/s390/htm-nofloat-2.c new file mode 100644 index 00000000000..59621a4c19b --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/htm-nofloat-2.c @@ -0,0 +1,55 @@ +/* { dg-do run } */ +/* { dg-options "-O3 -mhtm -Wa,-march=zEC12,-mzarch --save-temps" } */ + +/* __builtin_tbegin has to emit clobbers for all FPRs since the tbegin + instruction does not automatically preserves them. If the + transaction body is fully contained in a function the backend tries + after reload to get rid of the FPR save/restore operations + triggered by the clobbers. This testcase failed since the backend + was able to get rid of all FPR saves/restores and since these were + the only stack operations also of the entire stack space. So even + the save/restore of the stack pointer was omitted in the end. + However, since the frame layout has been fixed before, the prologue + still generated the stack pointer decrement making foo return with + a modified stack pointer. */ + +void abort(void); + +void __attribute__((noinline)) +foo (int a) +{ + /* This is just to prevent the tbegin code from actually being + executed. That way the test may even run on machines prior to + zEC12. */ + if (a == 42) + return; + + if (__builtin_tbegin (0) == 0) + __builtin_tend (); +} + +#ifdef __s390x__ +#define GET_STACK_POINTER(SP) \ + asm volatile ("stg %%r15, %0" : "=QRST" (SP)); +#else +#define GET_STACK_POINTER(SP) \ + asm volatile ("st %%r15, %0" : "=QR" (SP)); +#endif + +int main(void) +{ + unsigned long new_sp, old_sp; + + GET_STACK_POINTER (old_sp); + foo(42); + GET_STACK_POINTER (new_sp); + + if (old_sp != new_sp) + abort (); + + return 0; +} + +/* Make sure no FPR saves/restores are emitted. */ +/* { dg-final { scan-assembler-not "\tstd\t" } } */ +/* { dg-final { scan-assembler-not "\tld\t" } } */ diff --git a/gcc/testsuite/gcc.target/sh/pr51244-20-sh2a.c b/gcc/testsuite/gcc.target/sh/pr51244-20-sh2a.c new file mode 100644 index 00000000000..6c8c76b78b0 --- /dev/null +++ b/gcc/testsuite/gcc.target/sh/pr51244-20-sh2a.c @@ -0,0 +1,14 @@ +/* Check that the SH specific sh_treg_combine RTL optimization pass works as + expected. */ +/* { dg-do compile { target "sh*-*-*" } } */ +/* { dg-options "-O2" } */ +/* { dg-skip-if "" { "sh*-*-*" } { "*" } { "-m2a*" } } */ +/* { dg-final { scan-assembler-times "tst" 5 } } */ +/* { dg-final { scan-assembler-times "movt" 0 } } */ +/* { dg-final { scan-assembler-times "nott" 1 } } */ +/* { dg-final { scan-assembler-times "cmp/eq" 2 } } */ +/* { dg-final { scan-assembler-times "cmp/hi" 4 } } */ +/* { dg-final { scan-assembler-times "cmp/gt" 3 } } */ +/* { dg-final { scan-assembler-times "not\t" 1 } } */ + +#include "pr51244-20.c" diff --git a/gcc/testsuite/gcc.target/sh/pr51244-20.c b/gcc/testsuite/gcc.target/sh/pr51244-20.c new file mode 100644 index 00000000000..57f8197d643 --- /dev/null +++ b/gcc/testsuite/gcc.target/sh/pr51244-20.c @@ -0,0 +1,103 @@ +/* Check that the SH specific sh_treg_combine RTL optimization pass works as + expected. On SH2A the expected insns are slightly different, see + pr51244-21.c. */ +/* { dg-do compile { target "sh*-*-*" } } */ +/* { dg-options "-O2" } */ +/* { dg-skip-if "" { "sh*-*-*" } { "-m5*" "-m2a*" } { "" } } */ +/* { dg-final { scan-assembler-times "tst" 6 } } */ +/* { dg-final { scan-assembler-times "movt" 1 } } */ +/* { dg-final { scan-assembler-times "cmp/eq" 2 } } */ +/* { dg-final { scan-assembler-times "cmp/hi" 4 } } */ +/* { dg-final { scan-assembler-times "cmp/gt" 2 } } */ +/* { dg-final { scan-assembler-times "not\t" 1 } } */ + + +/* non-SH2A: 2x tst, 1x movt, 2x cmp/eq, 1x cmp/hi + SH2A: 1x tst, 1x nott, 2x cmp/eq, 1x cmp/hi */ +static inline int +blk_oversized_queue_0 (int* q) +{ + if (q[2]) + return q[1] == 5; + return (q[0] != 5); +} + +int __attribute__ ((noinline)) +get_request_0 (int* q, int rw) +{ + if (blk_oversized_queue_0 (q)) + { + if ((rw == 1) || (rw == 0)) + return -33; + return 0; + } + return -100; +} + + +/* 1x tst, 1x cmp/gt, 1x cmp/hi + On SH2A mem loads/stores have a wrong length of 4 bytes and thus will + not be placed in a delay slot. This introduces an extra cmp/gt insn. */ +static inline int +blk_oversized_queue_1 (int* q) +{ + if (q[2]) + return q[1] > 5; + return (q[0] > 5); +} + +int __attribute__ ((noinline)) +get_request_1 (int* q, int rw) +{ + if (blk_oversized_queue_1 (q)) + { + if ((rw == 1) || (rw == 0)) + return -33; + return 0; + } + return -100; +} + + +/* 1x tst, 1x cmp/gt, 1x cmp/hi, 1x cmp/hi */ +static inline int +blk_oversized_queue_2 (int* q) +{ + if (q[2]) + return q[1] > 5; + return (q[0] < 5); +} + +int __attribute__ ((noinline)) +get_request_2 (int* q, int rw) +{ + if (blk_oversized_queue_2 (q)) + { + if ((rw == 1) || (rw == 0)) + return -33; + return 0; + } + return -100; +} + + +/* 2x tst, 1x cmp/hi, 1x not */ +static inline int +blk_oversized_queue_5 (int* q) +{ + if (q[2]) + return q[1] != 0; + return q[0] == 0; +} + +int __attribute__ ((noinline)) +get_request_5 (int* q, int rw) +{ + if (blk_oversized_queue_5 (q)) + { + if ((rw == 1) || (rw == 0)) + return -33; + return 0; + } + return -100; +} diff --git a/gcc/testsuite/gcc.target/sh/pr54089-3.c b/gcc/testsuite/gcc.target/sh/pr54089-3.c index ffb976ba11b..3fb0f7a9aea 100644 --- a/gcc/testsuite/gcc.target/sh/pr54089-3.c +++ b/gcc/testsuite/gcc.target/sh/pr54089-3.c @@ -5,7 +5,7 @@ /* { dg-options "-O1" } */ /* { dg-skip-if "" { "sh*-*-*" } { "*" } { "-m1*" "-m2" "-m2e*" } } */ /* { dg-final { scan-assembler-not "and" } } */ -/* { dg-final { scan-assembler-not "31" } } */ +/* { dg-final { scan-assembler-not "#31" } } */ int test00 (unsigned int a, int* b, int c, int* d, unsigned int e) diff --git a/gcc/testsuite/gcc.target/sh/torture/pr58475.c b/gcc/testsuite/gcc.target/sh/torture/pr58475.c new file mode 100644 index 00000000000..a1153da8ddb --- /dev/null +++ b/gcc/testsuite/gcc.target/sh/torture/pr58475.c @@ -0,0 +1,15 @@ +/* { dg-do compile { target "sh*-*-*" } } */ + +int +kerninfo(int __bsx, double tscale) +{ + return ( + (int)(__extension__ + ({ + ((((__bsx) & 0xff000000u) >> 24) + | (((__bsx) & 0x00ff0000) >> 8) + | (((__bsx) & 0x0000ff00) << 8) + | (((__bsx) & 0x000000ff) << 24) + ); })) + * tscale); +} diff --git a/gcc/testsuite/gfortran.dg/char_length_19.f90 b/gcc/testsuite/gfortran.dg/char_length_19.f90 new file mode 100644 index 00000000000..e52d018b7c3 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/char_length_19.f90 @@ -0,0 +1,44 @@ +! { dg-do compile } +! +! PR fortran/58579 +! +! Contributed by Joost VandeVondele +! +! Was ICEing before due to the patch for PR 58593 +! + subroutine test + CHARACTER(len=20) :: tmpStr + CHARACTER(len=20, kind=4) :: tmpStr4 + INTEGER :: output_unit=6 + WRITE (UNIT=output_unit,FMT="(T2,A,T61,A20)")& + "DFT| Self-interaction correction (SIC)",ADJUSTR(TRIM(tmpstr)) + WRITE (UNIT=output_unit,FMT="(T2,A,T61,A20)")& + 4_"DFT| Self-interaction correction (SIC)",ADJUSTR(TRIM(tmpstr4)) + END + +! +! PR fortran/58593 +! Contributed by Albert Bartok +! +! The PR was overallocating memory. I placed it here to check for a +! variant of the test case above, which takes a slightly differnt code +! patch. Thus, its purpose is just to ensure that it won't ICE. +! +program test_char + + implicit none + integer :: i + + read*, i + print*, trim(test(i)) + + contains + + function test(i) + integer, intent(in) :: i + character(len=i) :: test + + test(1:1) = "A" + endfunction test + +endprogram test_char diff --git a/gcc/testsuite/gfortran.dg/defined_assignment_8.f90 b/gcc/testsuite/gfortran.dg/defined_assignment_8.f90 new file mode 100644 index 00000000000..aab808583ad --- /dev/null +++ b/gcc/testsuite/gfortran.dg/defined_assignment_8.f90 @@ -0,0 +1,40 @@ +! { dg-do compile } +! +! PR fortran/58469 +! +! Related: PR fortran/57697 +! +! Was ICEing before +! +module m0 + implicit none + type :: component + integer :: i = 42 + contains + procedure :: assign0 + generic :: assignment(=) => assign0 + end type + type, extends(component) :: comp2 + real :: aa + end type comp2 + type parent + type(comp2) :: foo + end type +contains + elemental subroutine assign0(lhs,rhs) + class(component), intent(INout) :: lhs + class(component), intent(in) :: rhs + lhs%i = 20 + end subroutine +end module + +program main + use m0 + implicit none + type(parent), allocatable :: left + type(parent) :: right + print *, right%foo + left = right + print *, left%foo + if (left%foo%i /= 42) call abort() +end diff --git a/gcc/testsuite/gfortran.dg/defined_assignment_9.f90 b/gcc/testsuite/gfortran.dg/defined_assignment_9.f90 new file mode 100644 index 00000000000..50fa0070f18 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/defined_assignment_9.f90 @@ -0,0 +1,45 @@ +! { dg-do run } +! +! PR fortran/57697 +! +! Further test of typebound defined assignment +! +module m0 + implicit none + type component + integer :: i = 42 + contains + procedure :: assign0 + generic :: assignment(=) => assign0 + end type + type parent + type(component) :: foo + end type +contains + elemental subroutine assign0(lhs,rhs) + class(component), intent(INout) :: lhs + class(component), intent(in) :: rhs + lhs%i = 20 + end subroutine +end module + +program main + use m0 + implicit none + block + type(parent), allocatable :: left + type(parent) :: right +! print *, right%foo + left = right +! print *, left%foo + if (left%foo%i /= 20) call abort() + end block + block + type(parent), allocatable :: left(:) + type(parent) :: right(5) +! print *, right%foo + left = right +! print *, left%foo + if (any (left%foo%i /= 20)) call abort() + end block +end diff --git a/gcc/testsuite/gfortran.dg/extends_15.f90 b/gcc/testsuite/gfortran.dg/extends_15.f90 new file mode 100644 index 00000000000..06c31799a00 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/extends_15.f90 @@ -0,0 +1,16 @@ +! { dg-do compile } +! +! PR 58355: [4.7/4.8/4.9 Regression] [F03] ICE with TYPE, EXTENDS before parent TYPE defined +! +! Contributed by Andrew Benson <abensonca@gmail.com> + +module ct + public :: t1 + + type, extends(t1) :: t2 ! { dg-error "has not been previously defined" } + + type :: t1 + end type +end + +! { dg-final { cleanup-modules "ct" } } diff --git a/gcc/testsuite/gfortran.dg/finalize_21.f90 b/gcc/testsuite/gfortran.dg/finalize_21.f90 new file mode 100644 index 00000000000..6f6ede3e46a --- /dev/null +++ b/gcc/testsuite/gfortran.dg/finalize_21.f90 @@ -0,0 +1,12 @@ +! { dg-do compile } +! { dg-options "-fdump-tree-original" } +! +! PR fortran/58436 +! +! The following was ICEing and lacking _final=0 +! +class(*), allocatable :: var +end + +! { dg-final { scan-tree-dump "static struct __vtype__STAR __vtab__STAR = {._hash=0, ._size=., ._extends=0B, ._def_init=0B, ._copy=0B, ._final=0B};" "original" } } +! { dg-final { cleanup-tree-dump "original" } } diff --git a/gcc/testsuite/gfortran.dg/gomp/appendix-a/a.35.5.f90 b/gcc/testsuite/gfortran.dg/gomp/appendix-a/a.35.5.f90 index 083c0b3b723..a580a3baf66 100644 --- a/gcc/testsuite/gfortran.dg/gomp/appendix-a/a.35.5.f90 +++ b/gcc/testsuite/gfortran.dg/gomp/appendix-a/a.35.5.f90 @@ -6,7 +6,7 @@ !$OMP CRITICAL CALL WORK(N,1) ! incorrect nesting of barrier region in a critical region -!$OMP BARRIER +!$OMP BARRIER ! { dg-error "region may not be closely nested inside of" } CALL WORK(N,2) !$OMP END CRITICAL !$OMP END PARALLEL diff --git a/gcc/testsuite/gfortran.dg/ldist-pr45199.f b/gcc/testsuite/gfortran.dg/ldist-pr45199.f index 22b202e07e6..e01d32f2664 100644 --- a/gcc/testsuite/gfortran.dg/ldist-pr45199.f +++ b/gcc/testsuite/gfortran.dg/ldist-pr45199.f @@ -22,6 +22,6 @@ ! GCC should apply memset zero loop distribution and it should not ICE. -! { dg-final { scan-tree-dump "distributed: split to 9 loops" "ldist" } } +! { dg-final { scan-tree-dump "distributed: split to 0 loops and 9 library calls" "ldist" } } ! { dg-final { scan-tree-dump-times "generated memset zero" 9 "ldist" } } ! { dg-final { cleanup-tree-dump "ldist" } } diff --git a/gcc/testsuite/gfortran.dg/openmp-define-1.f90 b/gcc/testsuite/gfortran.dg/openmp-define-1.f90 new file mode 100644 index 00000000000..4e1c076f305 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/openmp-define-1.f90 @@ -0,0 +1,7 @@ +! { dg-options "-cpp" } +! { dg-do preprocess } +! { dg-require-effective-target fopenmp } + +#ifdef _OPENMP +# error _OPENMP defined +#endif diff --git a/gcc/testsuite/gfortran.dg/openmp-define-2.f90 b/gcc/testsuite/gfortran.dg/openmp-define-2.f90 new file mode 100644 index 00000000000..cd167eabd89 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/openmp-define-2.f90 @@ -0,0 +1,7 @@ +! { dg-options "-cpp -fno-openmp" } +! { dg-do preprocess } +! { dg-require-effective-target fopenmp } + +#ifdef _OPENMP +# error _OPENMP defined +#endif diff --git a/gcc/testsuite/gfortran.dg/openmp-define-3.f90 b/gcc/testsuite/gfortran.dg/openmp-define-3.f90 new file mode 100644 index 00000000000..3d559864faf --- /dev/null +++ b/gcc/testsuite/gfortran.dg/openmp-define-3.f90 @@ -0,0 +1,11 @@ +! { dg-options "-cpp -fopenmp" } +! { dg-do preprocess } +! { dg-require-effective-target fopenmp } + +#ifndef _OPENMP +# error _OPENMP not defined +#endif + +#if _OPENMP != 201107 +# error _OPENMP defined to wrong value +#endif diff --git a/gcc/testsuite/gfortran.dg/round_4.f90 b/gcc/testsuite/gfortran.dg/round_4.f90 index 8a7d95bb456..093d04ea796 100644 --- a/gcc/testsuite/gfortran.dg/round_4.f90 +++ b/gcc/testsuite/gfortran.dg/round_4.f90 @@ -6,12 +6,18 @@ ! Test whether I/O rounding works. Uses internally (libgfortran) strtod ! for the conversion - and sets the CPU rounding mode accordingly. ! +! Only few strtod implementations currently support rounding. Therefore +! we use a heuristic to determine if the rounding support is available. +! The assumption is that if strtod gives *different* results for up/down +! rounding, then it will give *correct* results for nearest/zero/up/down +! rounding too. And that is what is effectively checked. +! ! If it doesn't work on your system, please check whether strtod handles -! rounding and whether your system is supported in libgfortran/config/fpu*.c +! rounding correctly and whether your system is supported in +! libgfortran/config/fpu*.c ! ! Please only add ... run { target { ! { triplets } } } if it is unfixable -! on your target - and a note why (strtod doesn't handle it, no rounding -! support, etc.) +! on your target - and a note why (strtod has broken rounding support, etc.) ! program main use iso_fortran_env @@ -27,6 +33,17 @@ program main real(xp) :: r10p, r10m, ref10u, ref10d real(qp) :: r16p, r16m, ref16u, ref16d character(len=20) :: str, round + logical :: rnd4, rnd8, rnd10, rnd16 + + ! Test for which types glibc's strtod function supports rounding + str = '0.01 0.01 0.01 0.01' + read (str, *, round='up') r4p, r8p, r10p, r16p + read (str, *, round='down') r4m, r8m, r10m, r16m + rnd4 = r4p /= r4m + rnd8 = r8p /= r8m + rnd10 = r10p /= r10m + rnd16 = r16p /= r16m +! write (*, *) rnd4, rnd8, rnd10, rnd16 ref4u = 0.100000001_4 ref8u = 0.10000000000000001_8 @@ -55,40 +72,40 @@ program main round = 'up' call t() - if (r4p /= ref4u .or. r4m /= -ref4d) call abort() - if (r8p /= ref8u .or. r8m /= -ref8d) call abort() - if (r10p /= ref10u .or. r10m /= -ref10d) call abort() - if (r16p /= ref16u .or. r16m /= -ref16d) call abort() + if (rnd4 .and. (r4p /= ref4u .or. r4m /= -ref4d)) call abort() + if (rnd8 .and. (r8p /= ref8u .or. r8m /= -ref8d)) call abort() + if (rnd10 .and. (r10p /= ref10u .or. r10m /= -ref10d)) call abort() + if (rnd16 .and. (r16p /= ref16u .or. r16m /= -ref16d)) call abort() round = 'down' call t() - if (r4p /= ref4d .or. r4m /= -ref4u) call abort() - if (r8p /= ref8d .or. r8m /= -ref8u) call abort() - if (r10p /= ref10d .or. r10m /= -ref10u) call abort() - if (r16p /= ref16d .or. r16m /= -ref16u) call abort() + if (rnd4 .and. (r4p /= ref4d .or. r4m /= -ref4u)) call abort() + if (rnd8 .and. (r8p /= ref8d .or. r8m /= -ref8u)) call abort() + if (rnd10 .and. (r10p /= ref10d .or. r10m /= -ref10u)) call abort() + if (rnd16 .and. (r16p /= ref16d .or. r16m /= -ref16u)) call abort() round = 'zero' call t() - if (r4p /= ref4d .or. r4m /= -ref4d) call abort() - if (r8p /= ref8d .or. r8m /= -ref8d) call abort() - if (r10p /= ref10d .or. r10m /= -ref10d) call abort() - if (r16p /= ref16d .or. r16m /= -ref16d) call abort() + if (rnd4 .and. (r4p /= ref4d .or. r4m /= -ref4d)) call abort() + if (rnd8 .and. (r8p /= ref8d .or. r8m /= -ref8d)) call abort() + if (rnd10 .and. (r10p /= ref10d .or. r10m /= -ref10d)) call abort() + if (rnd16 .and. (r16p /= ref16d .or. r16m /= -ref16d)) call abort() round = 'nearest' call t() - if (r4p /= ref4u .or. r4m /= -ref4u) call abort() - if (r8p /= ref8u .or. r8m /= -ref8u) call abort() - if (r10p /= ref10u .or. r10m /= -ref10u) call abort() - if (r16p /= ref16u .or. r16m /= -ref16u) call abort() + if (rnd4 .and. (r4p /= ref4u .or. r4m /= -ref4u)) call abort() + if (rnd8 .and. (r8p /= ref8u .or. r8m /= -ref8u)) call abort() + if (rnd10 .and. (r10p /= ref10u .or. r10m /= -ref10u)) call abort() + if (rnd16 .and. (r16p /= ref16u .or. r16m /= -ref16u)) call abort() ! Same as nearest (but rounding towards zero if there is a tie ! [does not apply here]) round = 'compatible' call t() - if (r4p /= ref4u .or. r4m /= -ref4u) call abort() - if (r8p /= ref8u .or. r8m /= -ref8u) call abort() - if (r10p /= ref10u .or. r10m /= -ref10u) call abort() - if (r16p /= ref16u .or. r16m /= -ref16u) call abort() + if (rnd4 .and. (r4p /= ref4u .or. r4m /= -ref4u)) call abort() + if (rnd8 .and. (r8p /= ref8u .or. r8m /= -ref8u)) call abort() + if (rnd10 .and. (r10p /= ref10u .or. r10m /= -ref10u)) call abort() + if (rnd16 .and. (r16p /= ref16u .or. r16m /= -ref16u)) call abort() contains subroutine t() ! print *, round diff --git a/gcc/testsuite/gfortran.dg/unlimited_polymorphic_10.f90 b/gcc/testsuite/gfortran.dg/unlimited_polymorphic_10.f90 new file mode 100644 index 00000000000..04518d6c941 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/unlimited_polymorphic_10.f90 @@ -0,0 +1,10 @@ +! { dg-do compile } +! +! PR fortran/58658 +! +! Contributed by VladimÃÂr Fuka +! +subroutine sub(a) + class(*),allocatable :: a + a => null() ! { dg-error "Non-POINTER in pointer association context \\(pointer assignment\\)" } +end subroutine diff --git a/gcc/testsuite/gfortran.dg/unlimited_polymorphic_11.f90 b/gcc/testsuite/gfortran.dg/unlimited_polymorphic_11.f90 new file mode 100644 index 00000000000..5b73b3281d5 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/unlimited_polymorphic_11.f90 @@ -0,0 +1,14 @@ +! { dg-do compile } +! { dg-options "-fdump-tree-original" } +! +! PR fortran/58652 +! +! Contributed by Vladimir Fuka +! + class(*),allocatable :: a + class(*),allocatable :: c + call move_alloc(a,c) +end + +! { dg-final { scan-tree-dump "\\(struct __vtype__STAR \\*\\) c._vptr = \\(struct __vtype__STAR \\*\\) a._vptr;" "original" } } +! { dg-final { cleanup-tree-dump "original" } } diff --git a/gcc/testsuite/gfortran.dg/unlimited_polymorphic_12.f90 b/gcc/testsuite/gfortran.dg/unlimited_polymorphic_12.f90 new file mode 100644 index 00000000000..c583c6bbf5e --- /dev/null +++ b/gcc/testsuite/gfortran.dg/unlimited_polymorphic_12.f90 @@ -0,0 +1,44 @@ +! { dg-do compile } +! +! PR fortran/58652 +! +! Contributed by Vladimir Fuka +! +! The passing of a CLASS(*) to a CLASS(*) was reject before +! +module gen_lists + type list_node + class(*),allocatable :: item + contains + procedure :: move_alloc => list_move_alloc + end type + + contains + + subroutine list_move_alloc(self,item) + class(list_node),intent(inout) :: self + class(*),intent(inout),allocatable :: item + + call move_alloc(item, self%item) + end subroutine +end module + +module lists + use gen_lists, only: node => list_node +end module lists + + +module sexp + use lists +contains + subroutine parse(ast) + class(*), allocatable, intent(out) :: ast + class(*), allocatable :: expr + integer :: ierr + allocate(node::ast) + select type (ast) + type is (node) + call ast%move_alloc(expr) + end select + end subroutine +end module diff --git a/gcc/testsuite/gnat.dg/opt28.adb b/gcc/testsuite/gnat.dg/opt28.adb new file mode 100644 index 00000000000..74a4c5c3be9 --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt28.adb @@ -0,0 +1,31 @@ +with Opt28_Pkg; use Opt28_Pkg; + +package body Opt28 is + + function Full_Filename (Filename : String) return String is + Path : constant String := "PATH"; + Posix_Path : constant Posix_String := To_Posix (Path); + begin + + declare + M : constant Posix_String := Value_Of (Posix_Path); + N : constant Posix_String (1 .. M'Length) := M; + Var : constant String := To_String (Str => N); + Start_Pos : Natural := 1; + End_Pos : Natural := 1; + begin + while Start_Pos <= Var'Length loop + End_Pos := Position (Var (Start_Pos .. Var'Length)); + + if Is_File (To_Posix (Var (Start_Pos .. End_Pos - 1) & Filename)) then + return Var (Start_Pos .. End_Pos - 1) & Filename; + else + Start_Pos := End_Pos + 1; + end if; + end loop; + end; + + return ""; + end; + +end Opt28; diff --git a/gcc/testsuite/gnat.dg/opt28.ads b/gcc/testsuite/gnat.dg/opt28.ads new file mode 100644 index 00000000000..4887c214845 --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt28.ads @@ -0,0 +1,8 @@ +-- { dg-do compile } +-- { dg-options "-O2" } + +package Opt28 is + + function Full_Filename (Filename : String) return String; + +end Opt28; diff --git a/gcc/testsuite/gnat.dg/opt28_pkg.ads b/gcc/testsuite/gnat.dg/opt28_pkg.ads new file mode 100644 index 00000000000..c3c32fe1c34 --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt28_pkg.ads @@ -0,0 +1,11 @@ +package Opt28_Pkg is + + type Posix_String is array (Positive range <>) of aliased Character; + + function To_Posix (Str : String) return Posix_String; + function To_String (Str : Posix_String) return String; + function Is_File (Str : Posix_String) return Boolean; + function Value_Of (Name : Posix_String) return Posix_String; + function Position (In_Line : String) return Natural; + +end Opt28_Pkg; diff --git a/gcc/testsuite/gnat.dg/specs/linker_alias.ads b/gcc/testsuite/gnat.dg/specs/linker_alias.ads index 0f7980eb54f..a4867fd6955 100644 --- a/gcc/testsuite/gnat.dg/specs/linker_alias.ads +++ b/gcc/testsuite/gnat.dg/specs/linker_alias.ads @@ -1,5 +1,5 @@ -- { dg-do compile } --- { dg-skip-if "missing alias support" { *-*-darwin* } } +-- { dg-skip-if "missing alias support" { *-*-darwin* hppa*-*-hpux* } } package Linker_Alias is diff --git a/gcc/testsuite/gnat.dg/specs/linker_section.ads b/gcc/testsuite/gnat.dg/specs/linker_section.ads index 73e89aa48e1..376bd751a71 100644 --- a/gcc/testsuite/gnat.dg/specs/linker_section.ads +++ b/gcc/testsuite/gnat.dg/specs/linker_section.ads @@ -3,7 +3,7 @@ package Linker_Section is pragma Linker_Section (Entity => Data1, Section => ".eeprom"); type EEPROM_String is new String; - pragma Linker_Section (Entity => EEPROM_String, -- { dg-error "objects" } + pragma Linker_Section (Entity => EEPROM_String, Section => ".eeprom"); Data2 : constant EEPROM_String := "12345678901234567"; package Inner is end; diff --git a/gcc/testsuite/gnat.dg/specs/opt1.ads b/gcc/testsuite/gnat.dg/specs/opt1.ads new file mode 100644 index 00000000000..89a405c3457 --- /dev/null +++ b/gcc/testsuite/gnat.dg/specs/opt1.ads @@ -0,0 +1,28 @@ +-- { dg-do compile } +-- { dg-options "-O2" } + +with Ada.Strings.Unbounded; use Ada.Strings.Unbounded; + +package Opt1 is + + type Ptr is access all Integer; + + type R1 is record + I1 : Integer; + I2 : Integer := 0; + I3 : Integer; + end record; + + type R2 is record + P : Ptr; + F1 : R1; + end record; + + type R3 is record + S : Unbounded_String; + F1 : R2; + I : Integer := 0; + F2 : R2; + end record; + +end Opt1; diff --git a/gcc/testsuite/gnat.dg/uninit_array.adb b/gcc/testsuite/gnat.dg/uninit_array.adb new file mode 100644 index 00000000000..910bdaf431a --- /dev/null +++ b/gcc/testsuite/gnat.dg/uninit_array.adb @@ -0,0 +1,22 @@ +-- { dg-do compile }
+-- { dg-options "-gnatws" }
+
+with Uninit_Array_Pkg; use Uninit_Array_Pkg;
+
+package body Uninit_Array is
+
+ function F1 return Integer;
+ pragma Inline_Always (F1);
+
+ function F1 return Integer is
+ Var : Arr;
+ begin
+ return F (Var(Var'First(1)));
+ end;
+
+ function F2 return Integer is
+ begin
+ return F1;
+ end;
+
+end Uninit_Array;
diff --git a/gcc/testsuite/gnat.dg/uninit_array.ads b/gcc/testsuite/gnat.dg/uninit_array.ads new file mode 100644 index 00000000000..72452213e02 --- /dev/null +++ b/gcc/testsuite/gnat.dg/uninit_array.ads @@ -0,0 +1,5 @@ +package Uninit_Array is
+
+ function F2 return Integer;
+
+end Uninit_Array;
diff --git a/gcc/testsuite/gnat.dg/uninit_array_pkg.ads b/gcc/testsuite/gnat.dg/uninit_array_pkg.ads new file mode 100644 index 00000000000..566632a270d --- /dev/null +++ b/gcc/testsuite/gnat.dg/uninit_array_pkg.ads @@ -0,0 +1,11 @@ +package Uninit_Array_Pkg Is
+
+ type Rec is record
+ B1, B2, B3, B4: Boolean;
+ end record;
+
+ type Arr is array (Boolean) of Rec;
+
+ function F (R : Rec) return Integer;
+
+end Uninit_Array_Pkg;
diff --git a/gcc/testsuite/go.test/go-test.exp b/gcc/testsuite/go.test/go-test.exp index 6f397343e0f..284bc99e2c0 100644 --- a/gcc/testsuite/go.test/go-test.exp +++ b/gcc/testsuite/go.test/go-test.exp @@ -242,6 +242,42 @@ proc go-set-goarch { } { setenv GOARCH $goarch } +# Take a list of files and return a lists of lists, where each list is +# the set of files in the same package. +proc go-find-packages { test name files } { + set packages [list] + foreach f $files { + set fd [open $f r] + while 1 { + if { [gets $fd line] < 0 } { + close $fd + clone_output "$test: could not read $f" + unresolved $name + return [list] + } + + if { [regexp "^package (\\w+)" $line match package] } { + set len [llength $packages] + for { set i 0 } { $i < $len } { incr i } { + set p [lindex $packages $i] + if { [lindex $p 0] == $package } { + lappend p $f + lset packages $i $p + break + } + } + if { $i >= $len } { + lappend packages [list $package $f] + } + + close $fd + break + } + } + } + return $packages +} + proc go-gc-tests { } { global srcdir subdir global runtests @@ -286,12 +322,28 @@ proc go-gc-tests { } { continue } + # Skip the files in stress; they are not tests. + if [string match "*go.test/test/stress/*" $test] { + continue + } + + # Skip the files in safe; gccgo does not support safe mode. + if [string match "*go.test/test/safe/*" $test] { + continue + } + # Skip files in sub-subdirectories: they are components of # other tests. if [string match "*go.test/test/*/*/*" $test] { continue } + # Skip files in *.dir subdirectories: they are components of + # other tests. + if [string match "*go.test/test/*.dir/*" $test] { + continue + } + set name [dg-trim-dirname $srcdir $test] # Skip certain tests if target is RTEMS OS. @@ -379,6 +431,21 @@ proc go-gc-tests { } { continue } + if { [ string match "// +build *" $test_line ] } { + if { [ string match "*[getenv GOARCH]*" $test_line ] } { + continue + } + if { [ string match "*linux*" $test_line ] } { + continue + } + if { [ string match "*!windows*" $test_line ] } { + continue + } + close $fd + unsupported $name + set lines_ok 0 + } + break } @@ -407,7 +474,8 @@ proc go-gc-tests { } { set go_compile_args "" set go_execute_args "" - if { [regexp ".*\\\$A.out (\[^|&>2\].*)\$" $test_line match progargs] } { + if { [regexp "// run (\[^|&>2\].*)\$" $test_line match progargs] \ + && ! [string match "*.go*" "$progargs"] } { set go_execute_args $progargs verbose -log "$test: go_execute_args is $go_execute_args" set index [string last " $progargs" $test_line] @@ -515,6 +583,27 @@ proc go-gc-tests { } { go-execute-xfail $test } elseif { $test_line == "// errorcheck" } { errchk $test "" + } elseif { $test_line == "// errorcheckdir" } { + set hold_runtests $runtests + set runtests "go-test.exp" + set dir "[file rootname $test].dir" + set files [lsort [glob "$dir/*.go"]] + set packages [go-find-packages $test $name $files] + if { [llength $packages] > 0 } { + set dg-do-what-default "assemble" + set del [list] + set last [lindex $packages end] + set packages [lreplace $packages end end] + foreach p $packages { + dg-test -keep-output [lrange $p 1 end] "-O" "-w $DEFAULT_GOCFLAGS" + lappend del "[file rootname [file tail [lindex $p 1]]].o" + } + errchk [lindex $last 1] "[lrange $last 2 end]" + foreach f $del { + file delete $f + } + } + set runtests $hold_runtests } elseif { [string match "// errorcheckoutput*" $test_line] } { # Run the test to get a .go program to error check. set go_execute_args "" @@ -557,21 +646,62 @@ proc go-gc-tests { } { } elseif { $test_line == "// rundir" } { set hold_runtests $runtests set runtests "go-test.exp" - set dg-do-what-default "assemble" set dir "[file rootname $test].dir" - set del {} set files [lsort [glob "$dir/*.go"]] - set last [lindex $files end] - set files [lreplace $files end end] - foreach f $files { - dg-test -keep-output $f "-O" "-w $DEFAULT_GOCFLAGS" - lappend del "[file rootname [file tail $f]].o" + set packages [go-find-packages $test $name $files] + if { [llength $packages] > 0 } { + set dg-do-what-default "assemble" + set del [list] + set last [lindex $packages end] + set packages [lreplace $packages end end] + foreach p $packages { + dg-test -keep-output [lrange $p 1 end] "-O" "-w $DEFAULT_GOCFLAGS" + lappend del "[file rootname [file tail [lindex $p 1]]].o" + } + set dg-do-what-default "link" + set go_compile_args $del + go-torture-execute [lrange $last 1 end] + foreach f $del { + file delete $f + } } - set dg-do-what-default "link" - set go_compile_args $del - go-torture-execute $last - foreach f $del { - file delete $f + set runtests $hold_runtests + } elseif { $test_line == "// rundircmpout" } { + set hold_runtests $runtests + set runtests "go-test.exp" + set dir "[file rootname $test].dir" + set files [lsort [glob "$dir/*.go"]] + set packages [go-find-packages $test $name $files] + if { [llength $packages] > 0 } { + set dg-do-what-default "assemble" + set del [list] + set last [lindex $packages end] + set packages [lreplace $packages end end] + foreach p $packages { + dg-test -keep-output [lrange $p 1 end] "-O" "-w $DEFAULT_GOCFLAGS" + lappend del "[file rootname [file tail [lindex $p 1]]].o" + } + set dg-do-what-default "link" + dg-test -keep-output [lrange $last 1 end] "$del -O" "-w $DEFAULT_GOCFLAGS" + set base "[file rootname [file tail [lindex $last 1]]]" + set output_file "./$base.exe" + lappend del $output_file + if [isnative] { + verbose -log "$output_file >$base.p 2>&1" + if { [catch "exec $output_file 2>$base.p" catcherr] != 0 } { + verbose -log $catcherr + fail "$name execution" + untested "$name compare" + } else { + pass "$name execution" + regsub "\\.go$" "$test" ".out" expect + filecmp $expect $base.p "$name compare" + } + lappend del $base.p + } + foreach f $del { + file delete $f + } } set runtests $hold_runtests } elseif { "$test_line" == "" @@ -709,33 +839,6 @@ proc go-gc-tests { } { file delete $ofile1 $ofile2 $ofile3 $output_file set runtests $hold_runtests } elseif { [string match \ - "// \$G \$D/bug191.dir/a.go && \$G \$D/bug191.dir/b.go && \$G \$D/\$F.go && \$L \$F.\$A" \ - $test_line] } { - set hold_runtests $runtests - set runtests "go-test.exp" - set dg-do-what-default "assemble" - regsub "\\.go$" $test ".dir/a.go" file1 - dg-test -keep-output $file1 "-O" "-w $DEFAULT_GOCFLAGS" - set ofile1 "[file rootname [file tail $file1]].o" - regsub "\\.go$" $test ".dir/b.go" file2 - dg-test -keep-output $file2 "-O" "-w $DEFAULT_GOCFLAGS" - set ofile2 "[file rootname [file tail $file2]].o" - dg-test -keep-output "$test" "-O" "-w $DEFAULT_GOCFLAGS" - set ofile3 "[file rootname [file tail $test]].o" - set dg-do-what-default "link" - set output_file "./[file rootname [file tail $test]].exe" - set comp_output [go_target_compile "$ofile1 $ofile2 $ofile3" \ - $output_file "executable" "$options"] - set comp_output [go-dg-prune $target_triplet $comp_output] - if [string match "" $comp_output] { - pass $name - } else { - verbose -log $comp_output - fail $name - } - file delete $ofile1 $ofile2 $ofile3 $output_file - set runtests $hold_runtests - } elseif { [string match \ "// \$G \$D/embed0.go && \$G \$D/\$F.go && \$L \$F.\$A && ./\$A.out" \ $test_line ] } { set hold_runtests $runtests @@ -949,10 +1052,6 @@ proc go-gc-tests { } { regsub "\\.go$" $test ".dir/a.go" file1 regsub "\\.go$" $test ".dir/b.go" file2 errchk "$file1" "$file2" - } elseif { $test_line == "// \$G \$D/\$F.go \$D/z*.go && \$L \$F.\$A && ./\$A.out" } { - set dir [file dirname $test] - set go_compile_args [glob $dir/z*.go] - go-torture-execute $test } elseif { $test_line == "// \$G -N -o slow.\$A \$D/bug369.dir/pkg.go &&" \ && $test_line2 == "// \$G -o fast.\$A \$D/bug369.dir/pkg.go &&" \ && $test_line3 == "// run" } { diff --git a/gcc/testsuite/go.test/test/alias1.go b/gcc/testsuite/go.test/test/alias1.go index 4219af8cd58..42cf6934096 100644 --- a/gcc/testsuite/go.test/test/alias1.go +++ b/gcc/testsuite/go.test/test/alias1.go @@ -17,7 +17,7 @@ func main() { case uint8: // ok default: - println("byte != uint8") + panic("byte != uint8") } x = uint8(2) @@ -25,7 +25,7 @@ func main() { case byte: // ok default: - println("uint8 != byte") + panic("uint8 != byte") } rune32 := false @@ -37,7 +37,7 @@ func main() { // must be new code rune32 = true default: - println("rune != int and rune != int32") + panic("rune != int and rune != int32") } if rune32 { @@ -49,6 +49,6 @@ func main() { case rune: // ok default: - println("int (or int32) != rune") + panic("int (or int32) != rune") } } diff --git a/gcc/testsuite/go.test/test/args.go b/gcc/testsuite/go.test/test/args.go index 9cfddc338b0..0ffe8101e9d 100644 --- a/gcc/testsuite/go.test/test/args.go +++ b/gcc/testsuite/go.test/test/args.go @@ -1,7 +1,4 @@ -// $G $F.go && $L $F.$A && ./$A.out arg1 arg2 - -// NOTE: This test is not run by 'run.go' and so not run by all.bash. -// To run this test you must use the ./run shell script. +// run arg1 arg2 // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style diff --git a/gcc/testsuite/go.test/test/bench/garbage/parser.go b/gcc/testsuite/go.test/test/bench/garbage/parser.go index b91e0248f53..d85110b63d4 100644 --- a/gcc/testsuite/go.test/test/bench/garbage/parser.go +++ b/gcc/testsuite/go.test/test/bench/garbage/parser.go @@ -134,20 +134,31 @@ func main() { } } +// find . -type d -not -path "./exp" -not -path "./exp/*" -printf "\t\"%p\",\n" | sort | sed "s/\.\///" | grep -v testdata var packages = []string{ + "archive", "archive/tar", - "encoding/asn1", - "math/big", + "archive/zip", "bufio", + "builtin", "bytes", - "math/cmplx", + "compress", + "compress/bzip2", "compress/flate", "compress/gzip", + "compress/lzw", "compress/zlib", + "container", "container/heap", "container/list", "container/ring", + "crypto", "crypto/aes", + "crypto/cipher", + "crypto/des", + "crypto/dsa", + "crypto/ecdsa", + "crypto/elliptic", "crypto/hmac", "crypto/md5", "crypto/rand", @@ -159,64 +170,111 @@ var packages = []string{ "crypto/subtle", "crypto/tls", "crypto/x509", + "crypto/x509/pkix", + "database", + "database/sql", + "database/sql/driver", + "debug", "debug/dwarf", - "debug/macho", "debug/elf", "debug/gosym", - "exp/ebnf", + "debug/macho", + "debug/pe", + "encoding", "encoding/ascii85", + "encoding/asn1", + "encoding/base32", "encoding/base64", "encoding/binary", + "encoding/csv", + "encoding/gob", "encoding/hex", + "encoding/json", "encoding/pem", - "os/exec", + "encoding/xml", + "errors", + "expvar", "flag", "fmt", + "go", "go/ast", + "go/build", "go/doc", + "go/format", "go/parser", "go/printer", "go/scanner", "go/token", - "encoding/gob", "hash", "hash/adler32", "hash/crc32", "hash/crc64", - "net/http", + "hash/fnv", + "html", + "html/template", "image", + "image/color", + "image/draw", + "image/gif", "image/jpeg", "image/png", + "index", + "index/suffixarray", "io", "io/ioutil", - "encoding/json", "log", + "log/syslog", "math", + "math/big", + "math/cmplx", + "math/rand", "mime", + "mime/multipart", "net", + "net/http", + "net/http/cgi", + "net/http/cookiejar", + "net/http/fcgi", + "net/http/httptest", + "net/http/httputil", + "net/http/pprof", + "net/mail", + "net/rpc", + "net/rpc/jsonrpc", + "net/smtp", + "net/textproto", + "net/url", "os", + "os/exec", + "os/signal", + "os/user", "path", - "math/rand", + "path/filepath", "reflect", "regexp", - "net/rpc", + "regexp/syntax", "runtime", - "text/scanner", + "runtime/cgo", + "runtime/debug", + "runtime/pprof", + "runtime/race", "sort", - "net/smtp", "strconv", "strings", "sync", + "sync/atomic", "syscall", - "log/syslog", - "text/tabwriter", - "text/template", "testing", "testing/iotest", "testing/quick", + "text", + "text/scanner", + "text/tabwriter", + "text/template", + "text/template/parse", "time", "unicode", - "unicode/utf8", "unicode/utf16", - "encoding/xml", + "unicode/utf8", + "unsafe", } diff --git a/gcc/testsuite/go.test/test/bench/go1/fmt_test.go b/gcc/testsuite/go.test/test/bench/go1/fmt_test.go new file mode 100644 index 00000000000..d3c695669c0 --- /dev/null +++ b/gcc/testsuite/go.test/test/bench/go1/fmt_test.go @@ -0,0 +1,68 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package go1 + +// benchmark based on fmt/fmt_test.go + +import ( + "bytes" + "fmt" + "testing" +) + +func BenchmarkFmtFprintfEmpty(b *testing.B) { + var buf bytes.Buffer + for i := 0; i < b.N; i++ { + fmt.Fprintf(&buf, "") + } +} + +func BenchmarkFmtFprintfString(b *testing.B) { + var buf bytes.Buffer + for i := 0; i < b.N; i++ { + buf.Reset() + fmt.Fprintf(&buf, "%s", "hello") + } +} + +func BenchmarkFmtFprintfInt(b *testing.B) { + var buf bytes.Buffer + for i := 0; i < b.N; i++ { + buf.Reset() + fmt.Fprintf(&buf, "%d", 5) + } +} + +func BenchmarkFmtFprintfIntInt(b *testing.B) { + var buf bytes.Buffer + for i := 0; i < b.N; i++ { + buf.Reset() + fmt.Fprintf(&buf, "%d %d", 5, 6) + } +} + +func BenchmarkFmtFprintfPrefixedInt(b *testing.B) { + var buf bytes.Buffer + for i := 0; i < b.N; i++ { + buf.Reset() + fmt.Fprintf(&buf, "This is some meaningless prefix text that needs to be scanned %d", 6) + } +} + +func BenchmarkFmtFprintfFloat(b *testing.B) { + var buf bytes.Buffer + for i := 0; i < b.N; i++ { + buf.Reset() + fmt.Fprintf(&buf, "%g", 5.23184) + } +} + +func BenchmarkFmtManyArgs(b *testing.B) { + var buf bytes.Buffer + for i := 0; i < b.N; i++ { + buf.Reset() + fmt.Fprintf(&buf, "%2d/%2d/%2d %d:%d:%d %s %s\n", 3, 4, 5, 11, 12, 13, "hello", "world") + } +} diff --git a/gcc/testsuite/go.test/test/bench/go1/http_test.go b/gcc/testsuite/go.test/test/bench/go1/http_test.go new file mode 100644 index 00000000000..34e789f6658 --- /dev/null +++ b/gcc/testsuite/go.test/test/bench/go1/http_test.go @@ -0,0 +1,45 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package go1 + +import ( + "bytes" + "io/ioutil" + "net/http" + "net/http/httptest" + "testing" +) + +// BenchmarkHTTPClientServer benchmarks both the HTTP client and the HTTP server, +// on small requests. +func BenchmarkHTTPClientServer(b *testing.B) { + msg := []byte("Hello world.\n") + ts := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { + rw.Write(msg) + })) + defer ts.Close() + + tr := &http.Transport{} + defer tr.CloseIdleConnections() + cl := &http.Client{ + Transport: tr, + } + + b.ResetTimer() + + for i := 0; i < b.N; i++ { + res, err := cl.Get(ts.URL) + if err != nil { + b.Fatal("Get:", err) + } + all, err := ioutil.ReadAll(res.Body) + if err != nil { + b.Fatal("ReadAll:", err) + } + if !bytes.Equal(all, msg) { + b.Fatalf("Got body %q; want %q", all, msg) + } + } +} diff --git a/gcc/testsuite/go.test/test/bench/go1/json_test.go b/gcc/testsuite/go.test/test/bench/go1/json_test.go index 614e24a810c..1d42619bdeb 100644 --- a/gcc/testsuite/go.test/test/bench/go1/json_test.go +++ b/gcc/testsuite/go.test/test/bench/go1/json_test.go @@ -7,12 +7,12 @@ package go1 import ( + "bytes" "compress/bzip2" "encoding/base64" "encoding/json" "io" "io/ioutil" - "strings" "testing" ) @@ -23,7 +23,7 @@ var ( func makeJsonBytes() []byte { var r io.Reader - r = strings.NewReader(jsonbz2_base64) + r = bytes.NewReader(bytes.Replace(jsonbz2_base64, []byte{'\n'}, nil, -1)) r = base64.NewDecoder(base64.StdEncoding, r) r = bzip2.NewReader(r) b, err := ioutil.ReadAll(r) diff --git a/gcc/testsuite/go.test/test/bench/go1/jsondata_test.go b/gcc/testsuite/go.test/test/bench/go1/jsondata_test.go index 7d42c966579..cf0fac14806 100644 --- a/gcc/testsuite/go.test/test/bench/go1/jsondata_test.go +++ b/gcc/testsuite/go.test/test/bench/go1/jsondata_test.go @@ -13,1806 +13,1807 @@ package go1 -var jsonbz2_base64 = "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" + - "4Oy2vMLFphr2skmltbAj2yHto+/C1qRSHQI0oYJy4xPAK0hBhkBkzKGIDKfqR5fu" + - "9Rb6jriPwFfrT57/BORRUS2uxaWe/23vw/VDRJUNDKbcoql9hR1STaoUKFJAhAE0" + - "AZZLjCTR5qxIgYLhyUQktqwQ0LakMUoDZaYvf1dL7/UTZGZSt/h0bF8bOrkShINm" + - "UC5JVQoULQdWFmExZOwxx6b/nrJEIzcATXe9RX4uAjQuZbT7+8dvCcTe970nE51j" + - "cmac2WktrRIBr8KKqmFiShChQWsTPnID4M0CSyZe7rltE0/bIvrM+YcPthAH85JJ" + - "219mY5mjPQZhiZDYZA1DzBlAjUcjXvLL8BABMGVQh/A/vPwUfqX/5kl6UGGJn8FC" + - "P2GG+QceVRTNvxzts75paBK7NzM7TzVVUzlIqqif8NJKRImR08cg2cHrQWxKYcNh" + - "OjnHzz+YPyaL9PWNrPR37fFaHr23fpcy+YYGWlsuQf4q7bXFjzjZ66t5DEnZsqLU" + - "ixYlKiy0ibZsjalZamaizKs1laSpmk2ratltZbWSta0bazUrFJs0ttalazaQUhKg" + - "lSUAqyQoWSKtotVYtSmoyW220arUsoo1tpLaNtMsmtaaYsVTbS2UtJgram22rCkS" + - "qQSxISyQS0FSSyM1KaS2laa0lhNFGhYWigRULZFiyykqoCxFBKRFSItCrIUWLKak" + - "ppY2WbY2tps1pm2ymqbabbLNiZojaZkrFMKZrKzaWVptZtppijZNM2SzKmmxsRab" + - "LZs2K1NVqWqEzMlJtmqVRjVNZWllSVLM0LNNZpalZokSlltLasJRUqopUpZIElIE" + - "lkqrYjVi0aSNqWmLKpslJtFRBbSbbMy1KoplRspaNlNUrNUaaak2mpVFTZVGxk2a" + - "GTSWmzaCpKbNJW2WqWqKMmNk1GkKUtk2ysrLNs2WwyrMqKpqZmmmKxtmqayKZlUk" + - "qNltKlRSm2StUtbLWxTNUqlspo1ZtltNKRIqGm0tlRtNmmalNGZYybMozNNKkxpI" + - "2i2ULJqUrGyyxJslNGpZmtNSsrNWZY222yttmrVNTbWZZMms2lllbKstpmrNMUmp" + - "KqUtptKyaplKbRSbJbLNplZtqM1KKbabU1ZSUAmUaxpZjUkhUmyZmxbRSltNsrMq" + - "qVbNtslSptEzVrMqaazNpmkqZsxExpJSk1itlWqay1KppYopMUkkkmbLNlMymsxS" + - "0TKlNjKbA1TLLLU0lTWalTNMilKmys2ZY2mqViUVKSyksmapVNqSJRqxZSyylMlS" + - "yLFSWRUliWKLJPR487tzxPbvpf6y887/zT6h9UmfSx2PLPXLE2t67TNb+d8616jt" + - "tPkeNmjOnd2bULjnN/5x19I3dES+7KaAHB8sg9OaIHogcFmowcPkd56v4UKiqJhg" + - "oAU9AHxYiJSboAuO2tYkauzYowUsXVGVlc0nYOpihEKtGCELstXcQR40ZwxcKms+" + - "7pFjCoGnlWDFSsNDI2M37zbDfLv3avdlnZZ+BC52UzTjZKLth+XpejoaOcVlvLIp" + - "Bt0bICZGx12W3MemDI+BEABpXP87P4rJiq/on3ucmKl3H2qkVoDOXeBVIHThRlRW" + - "oIeneSsFb5P81QBgJOLBARAX3nH8/r/f8w3ilqIGYIs2ETpWjUrVBz3ap+abPKWH" + - "pLM3ltPx/+N/Wbt1NbzHN6yn49NkVXLjHsi0YsxWYxt0mpP5liJ0D/BK861JPxVJ" + - "KrrKd1DEsjkf2fd+E1sqc+0G02nKaZP3/wWYV/JKhVSKU/9f2kP+Es6z7k/gUksW" + - "JYe1an/921pBsrUdXyfSH+6h3N4k/jE5ItS1VTkajSXnZgf5UtgpKk2jaxZibyd4" + - "83LeR6x6+RPw/T0lWWVLOy4k54wllqVWtTTUvHd5G6VXZwcLVpZCyOySqT/VUqI2" + - "a3OjB+BJ/c5vJ17xaYezrA2WTu8JipWJ34en5WSThOGGFkqslgxWw1Riyit2TjUk" + - "4m2SJs+3WFSYNQcR9lN+j4j1noP93VyHCfI7cNMSZzH2ZNRThulseIk/yU5KdXt9" + - "v7zmbk+gjtO690cSQSoFfmmeBxfI+vqGsirzNH5C+xTw2WGGHE0X+u176U0uLoPT" + - "OEn+qsbDvaA4s+lX8EqpJzPrH0sloeXR1c9OiqmXer0zgSe5ZrT6ScTDZPxHCbPN" + - "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" + - "1YsdOxwxj98iTq3teHw5yT2NnV6Ms+s+NR8b24bKw/NWKKqqZhiqnM8QftpfQb+C" + - "Vs3lZLSSASqcfM7yVxGYledbnrN50XJBATYaCsBtFYJlZR2SKwb21+jqRiNFI0Sa" + - "rSjgiATZnWelW7O0mbziCfju7ylzo7WSqylsYp0JpjJU0qaMlJUUVhGilWTZudCx" + - "M+kc+l5uTSG84qLYv2ZJMli2qrILI2Tqln4cMqNhAj4gogAncslWOiwaV+BwnPnE" + - "jdp7E6UlqPtYJYV9Tg3WI95FkO6beZO8nlbeyYVc7od2tLylZPKLTp1I35t2iLsk" + - "ipSBQqtbUX19H2kWD8z2PyVPmh9rLUcrDSKQsTJIfukqY7Hl5DzdPLdUqq1+LJp5" + - "emzvHWPLN9YtWeh+2WzylkbFNlTCyVWKZpKyQ4YwqnWq3kKzCwje4lWdzTuDbTZx" + - "x4bJ8tzHGu7m3prWSakaVZncMwY02dcu7kznctvM5MknBXCmwVtKfU0xWphkowpi" + - "VsxiVW7I2rWqtRhwpcXDoaZN1MN6tYlKrh3GpWUlJLvXd43OuslSWQ0fVcxqeL+B" + - "Xv1rpQyBqdm7e1Ra8loulyubVzbXOGoNVpN1/mjcbxaAiUP6xnhT7z2IJaTCQVgt" + - "DpQcGFJgWSBTA5batqKV5l3ruu7XC3NyZRFeT486vWm68lRqMyRNpSzSpsi1KyzL" + - "GmTS2azSVMZqtq2bay1a0raVmmyq2yqikIVCwBSIqSpJJKsVBYgSKsBLSopRkS2t" + - "tKmrVKmA1rSpZU2JTWWSGtUtmsrMWKVLLVRCkSkEqQS0GpKlKZllNtK0WFGTNpZY" + - "2lmmZKZLbWbabW0ttZTSTFMklmzbbTaajUNZaVNKzWaipYqKmU2mMk2lilaVplhZ" + - "MykpmlSwamzZsrUtUJCNs2xE2zWbLJpmmmlSyzaYzNqWpssspZTaqtm1VbJlmm01" + - "kzUtDKks1LIK020pKUpNRlKTSlmUprKzRSmk1NTZZJrNhJIZMlSpNJDMktbNVDEs" + - "mpKFKVJtllm0ps2WzabGsbM2aQtmsJaMkNaVJmssNbZtbMprNYqWVKlaTUapJmGz" + - "RClCZhpmEmZpEympqWZmWbRs0SaY0lNTU2lqbLNtts1tsrNtKqSWmGWWW0tZrNiG" + - "Uy2ylLU2jJWUySmlNmpspWFKJrTVkE1lJmakWTZmUtpS0rKyqpVsilmsNrWWbLMq" + - "aVLFlNmazabZtNppoZJEkxlJIlplYbNUMaaVKhIUylmxaWkEslm2WoAZmYGmm02k" + - "mZ9vNcym/zYZ1m/E+UySfg39LUVVWb+0CAnu+IVnzkTYexs7ufDm0VjDZ7mmLPDC" + - "jvRkCK4NH4KYIPfTEsxAJVJTCY4MNNqKqTgrJkmjRkVkyN9MMuNskxW0mmjTSlSs" + - "RiUzxDKZmvWVXm9Y8a6VLqbbWXtSMLsZGTNoSqYkyYjI2VEskoLRRUbRRsbWkqSt" + - "Sau0WgopMsq6V0SZehQ82kyxbJsqq2k6xbaqqpy8chxElkKVybMPBqa1jIGLJqNa" + - "WSNnw5w5rJRVJ8pXQahwWUzyp0wnz/U0hIEiEYfzEVFZGtr8GqLFqNUUa0pVZVFV" + - "lLVsEy7VF1qILVeGEk2aS+WJki7F2pqD7InRyG/WjNbxTzY7E029eTdr/1ZJlhzx" + - "xZEk7TYxZI2Vk4yI8WLZEUcfOpyzjm2I50sicpFjzHRZKelYLMxipnrpolbK2wP3" + - "Gj5QrZ3mE7dW70dJN3aTWPvGzFnLOYscQkecNk/KdSbVattW/g8tatRJ9BbaVmTU" + - "cNkbE5NiRgCjqJjBFYYMQEpXT39BIxlLWwvLhFGpGWUqKViqxkcZkznhqQLSNrGQ" + - "hBUdGYxN2kbWNpAzdTVXSs46S3TNK5yd26mxXO7tXNdm0m6bRbSTJvK6rpKW2TFt" + - "vPLvJbNaSixoxKyEmNk0kWK0SdjZs2NohYnAsejhFowruXCQlUVFqVGpE0UGZIZE" + - "c3lktTo03a6N+EiflSdFScJJ0xKRxN5+ZDlCLZB9FWySZUtkhL9OWNS5Kx7HmGk3" + - "Zm+vn/kuSquatyCwYtGGhIxpQKVBh9sws7qnJ2thu+NtlbJbljpdXFmFp6I0cN3V" + - "hW7RqTNacWNJ80k/pbIVr82CR/iVzKp1fJPyjz7u0PGnOl53LbDvYakR0ZJD8qm5" + - "9mWLpEWRzhu+1n9OUKT1kn8VOh3p4lv5ZjCqf3P82pWjKmxUzVvxpOH8eDZPhDwf" + - "ii4JZZPcJ67Ts94+JJ8JN6n2RXJ/iPpDEN5uehqR3Yxju2bXbGDrRv6T0R5vdxJO" + - "R2mD+4dUjVjZFQf6RFZJ8rFskqu7VMy3EjDuzE2K5wH1nnG971lZjE1GMMpMLzVo" + - "tmMJoN2gv8yApnCpgihcVoiUFH+c9nnbz+momOTD2WTT5sRko0skZYttki1bLSVY" + - "mmMY0wqhWnGhdSllSSW9z4amEW8VfPq+6qyaeu2jZNvXtEl6ptryvUoxwqtXN1Fm" + - "Yqyc7Jqlsb2TXkulki/galjcAwqxIxJEkIZjxWvohjDLbjDg3VHCdKtlCUmTvHq1" + - "g1bKsb1nufaqpD0uQWNon9Cdrrb3LTMlSbUTSbK0ohajIvgjH+99Bt8p3n6qleSV" + - "ZE6o9h2eHZRzpwc3OYmK009E9R328jxMbJvFH6StQnM1NNmLDBWdD/DwdQc+bD7v" + - "Uoz8D4pQaY3jgmo4UpCiqrGzZpNbC5h/TXGpNqn1Vaok4ZPk4KphiwyWJy5ZHRwf" + - "oiZC34h6SrVlWif7FRHs1+Nuh+L5Hs6k7WWyNKyald2mpMaNp8+jr5z3H5HpDpU/" + - "yqPXPAk91O6UFo2PK2u5jy7lWy35Kw+iPIqfOySOpNDJ1k4nqsilXhkeZbW8c56z" + - "Rx1kbkR1nBpJ1VUPWotkR0rdsQsexSuL+5pk+Mk2l/i7Oi6XGwkvE5JyD6Ifc0l8" + - "iIBO6c0DixXt8Wk0H6+6WxFliWWWhO5P1UUsfx/o/JZJ9iprtPkmjEsfWdqnbtat" + - "q24OckqqqnQw+6k7EfBZHMentbUafUcOiqVVVYFUlFKKqejEY6Y+lfo+ubdLJdCu" + - "RFXLgVQwrGW3GIYJWGCYwwtWWlUskYxZ+emKaZHyQfWMWTUkP9FV7wTx+WRVUrZI" + - "0/KPlYWlUqaINRpIxmMlMfoeftr+7+JP2H69M/jD8xaKRKgSrdibLHI0VxjbdHGN" + - "jQd0aMDA0QIQWEpTRDGZrq3R00OH8GFjuAD9iwhU2MP6wiGD+jp0Ymd06Ksv5piO" + - "Uq1rMkwZkiw2SmZIUHD5pP5P1qcNmkgD9vum0hi+X4S/PJ3/mfi9rbspyye2Fk1Y" + - "tSqo+5O33q0nAeTHbg7lc2zBxS2K2xjL/dLmkWZGHQNxp9NkyrGxuvp9akHp3+A3" + - "ROSdXUb1air5yyvdI8km6PrIgEskaR1ceOmv5q4dpNp4dofKup3NzUTxsvxlZbZ/" + - "V7KshwsVcSqwxapT6487uYnOE9IdPT5DshyR8GTg8yZIxO7D2Xoe8wbPD2vkrki1" + - "J6oe6xXDYppjTbDezUkdjZXVjE75bVWXRUdldu05D4OvVbD8SxVZLZ009nJEkSTN" + - "7Y8kpPWH5pUvT49iIMA9AfIDJEZQpYI0oY5HlZOHxMMSe9WuihVMpamSnEH4RE9Z" + - "aWlkKsWrVSPdFT2zJGJOHBVlVUrpTJRywuMlV0T9myzARkClqiJX70kgpcYzsakR" + - "kiRXw/k/H9sfrouz/j/oVDN7/u1hxCRIRZULOfq+KvHsxm1M2jkhY7WeUc1j/ARD" + - "X9g55b0y0OAkCC5cP+IWkuBkJyInN3reK6uz5oJ3cmh5kk5SOROSWbV3cz6GtQbZ" + - "KFKWuNFtiyrDpfLMzGSYWFVpVVZYebEEsBqBXBsjMbarG2x/fZQ+jLYbHHqNwzdK" + - "EarMZjYxuuOPbI9sySN6HDIRKMbSRBlKUoJjSMbaV15eryvBqvJXDYi8l107GrKu" + - "rrePql/G999PfuvQQNubc1orFGJnz9/3e/n38NvhXHdrlX0hVyULe2vF4tSELMby" + - "nXaVdIyzVzptzbpG0kYyrYmUstRUilMV6qhiUaXUqU2t22sqVUgIrrtLQ1QdExSK" + - "lSKNIKNDYBCEhONtcvec081daISsVrnNwhsmVFh9UnkeSpU/Ucu0cHJG1Tws6MbG" + - "5/FVq2qhSlIpMbqkdPrfnJsRP5LJP3kl8j+YotqNDkj+2rYWxbJPER5OzzamSJYm" + - "ofxdXtOqPt84dU9J+/4gPBe8BUHiJMP6uXrNpwqwttVSaxGF+jEifCpFfxSkr9mc" + - "32c3S3Szbd2ZoiFIb5ZGYtnEkdJ+Try/CPL9Mi5mMdh+Ug/lZFsslk+ZJ6Es33Tm" + - "ZHKzR+qo+jHqk0bPR7vVXJrn+XaeaslpRZLB6fWTy0fm4NJO9fzVkjpKW2+cmMea" + - "KKivw3yNm0nsxo0qY/JPx9o926TeJg2Itr4mV3UibG6zyzGVVRZRZzUmJYrYjeJP" + - "tG57vdmClZ7rv1y8228aKmVl6+qvZfKRcLOG6ldOqd/Vu6vnzdTvHSaWdJCUkjhk" + - "kn7Gk+eiZHzRJjshqSwqyDyZ80X6SPqx722PQanWebyOhb9n7djstjZ4dY2OQxL8" + - "hdS7hgfQ+5CDkj7o7K4g5yNpyOpPqRywlpQRSDKSubGQjFYyaHIAwiqRam0sMSLC" + - "sJviL0yJ2OkeKEslhZYLLIdXuqTrJIqKaZP1acJCcH4eh1+kfB93b1WTnIpa+SDt" + - "JnSUSfEhNliaKTnK6bk2NUtOpwxwxVUbNmx5x8lIqppySP7fkeJPkfA/GZNlaB85" + - "U/xOGz7nG7VxLbFvOJRc267dY5TS32y82q967Sok5Aw3FStphVLMYoq5nJ05S7XG" + - "3bTWXLtislaIjwcKpUlVZ5bNl3MjhW/1ibOUVX6bGO9ltr3qNM4ZOuTmdlJHaTrd" + - "opbJmZI0WRqsr4Q/tfrZ3oi2RVBaIqi1MzEkmVJ0pnG2r43k6qGCL9Kkpczv4SeP" + - "sFeTIEBc3DtAZcH6XxGW7Yaw+DznoSqyrouIMcMHbjD/FBny/X179rvtjikQCcgQ" + - "E4HS222zVI+KD/aP1IS0pJSBYzn2USdPSTTu868arlGQodZ/tyxVyU5RrlBdEqjR" + - "+4KCHQDi6aQjlScf+T5kjee1Xoxo/SOOyTCd1xDlX+YN/MVvtOj2tXZXckMqqZHZ" + - "EKEQlkdnL7Jdydlgmev89uU78j5cSJ/l8dkmE7rhzD8qadHMH4jZj3nDGPdwajh7" + - "sMdnVu5ujXXl+T1/u4LOHgw0+z8FGBY2M89iIokYQvh0gpDsMgXC5N6MMVWqIDKF" + - "k7Bhi7LCa12ZnoYVi5gcGP9X5TyVn5jjpmK38e0H0yNy9sy6krJx2NyXEkufYjPY" + - "35HJdzHaIWeWpGch1C2GpaeIIyAyJiVK/Gotmvs6vH4XixysdNfO67ZuafPse3Xt" + - "czmeH1mHV6i2qvNHrsuyeFJj1OGjd4Zq4YLjGTExlUsVV/xcbG0nNuxlxTLllUUB" + - "hE0vYrX0AxuvoyLWYktLUDBX8H5cYsLkOfeXyz9A4QbZ7J00FTnG94VNve5NkYen" + - "LptnR61av5SHOPZVdEI2fk5/k3VxOX5PckzZv1ec8TchyRzOOqs5zOUkm0wWPJVW" + - "TC1sxMVVTWOfpWxnsx/JmyBRsFWNsiIqoVUFReZrK80s5jqpOqvOS43zEuyOx1cp" + - "0Y8OhOW7ME8lk6LCeFLjEsFSqpSyelXJhXAcdpsp0Y6/OqpWhUMVm2xjyTgU6nrw" + - "6yszFUttktLZVtnXi3kuDRtDz/sJ5OxXV22LVZKMYxihA2Q/Dq/NjZ+535t7PF0a" + - "3E6sM0t90PBzJHT5SRrz+MtSHquWXGSMc07ChTvJ7sjSm49U8JK0NlKrXIMbnnPC" + - "0qUqjU5Jxyt7ynN5e/kM7y2YxjGrVeTE5xqbVT8LiY6bpo+ZdRG82/fr1m22xZSB" + - "38PxIyNMShQiH6G9hXLOZK6w3N5+X72HFAxu5NSfRpW6afRXqo8VJGH9x5ObPuVJ" + - "QLAiFlH6/u/FbMJ3EnnDq7T0En449m8JHNPxcyzXSV7BCP9JENSIjTahAiKfMpQX" + - "fhvwg6xjTyfA09UakjGjZSMkcm0k69uDQkz5aTWCW2iz7hlcSciTjD3IoFZBYmNt" + - "odoFMMIkDWQjASGk0NA76DcIySAGLYwAZPQkVbS9raOCXx0N4NPJAcpTE24YEIYy" + - "g7CfLWmi2E1TDcjdkTMXE0qKsqvYI1Rc1zUWKjBt3dZMYLSc1V8teNrSwW867u67" + - "u3XWz3uiTDJ7uup6aktGEa9d1hTNubvV2q883d3IoqVnZHRyRZT547K2nlbs57pm" + - "7cLQoYwF2iZPBBH+5LQ7dYkkhI6u5sNK9nPxux2bnayrYrkTq+u7erJbBUNziMaP" + - "rppVcY3SxyySyySfFXkjZSuA61FVMKi5jFHB+UxNKWOqcRzfOSQki42nkQs97JyK" + - "5amm58SFk3LVSU0uj7SQfqwEfho1r92H6uG22K2lVz+Uf5sqP0dLN/GejmK0sxrP" + - "xz1m2/05yx4ONjCbJH9A+8QkhIqoJKiRIQWkkRKAK20HGfR9lFGh2vmzMyyCig/w" + - "mlAinByNccszHu826vNs08OjdXU3GzSpwG2/sZ6SHoyTSVw0slcGjSBnq4UMw08I" + - "tvw4uHqDA/w6OSCRnyIh/MH46rxmTFxdHacVc+uD3HvflqHvL7RI7e5edJqb4ZU4" + - "09uYztwe+W/IpAaOoyLcwQVPk3k69Fffn6zXZ3kION0cYOXDuS+3vzTOm/K7Mq6H" + - "OlZUd7Pxxdl9t69NorsK6eU6442+am88vu73UsgRoV5Z211tTDr33RPyM6/XfL5U" + - "EDhtlOMGIOhqVFDMLDExeDQGHON0fZdtpnTpZ6cD6JBkGJpUx0Y0WuppUjCvDGzH" + - "Jsmjd0VyNNnRZ1Y1MNHaMbOGzcp3VttssZwsk0gsTGWj6gLXG8FJpoGGjp6NmZZI" + - "mQYvcYoaIEFW2vkM2ui4SWaSMLtv6RnW2Q1A4FIHgMRpRK4eNjfwZ5oqGaaSMo5b" + - "dknhw4SbOELPGyXLyqGoGSSqSomY1HBBVkQqys9MCWL1YjTEvrT/lW/HvnSpG2HG" + - "W0YwPtoufZQEsPWkFdi4q6Bs3tkoppX5Eiaqo5JX1UtH2/gzrxnmXNzE5gfF8iGh" + - "wMagId9OeGfjPxGKTtKHVVJ7vT6eMIaVB+wH3n3+jxV4Svh6l0hS2vo/Hxp46W8T" + - "mStcsHMrio8lNypolKYqrT5AyFDChtZGHuINKBspBGKg7kJt6Bo8fNBswFHISJJt" + - "PcLdHk1+NWshZCgqnMZITrDX2VnDFGhCe+9um2kaWy3BLFDrBte5ISqMa3whRNX2" + - "hdsSnCgdmnJiwaaFmqxgEhoSkmS4W5nnc2pOkjMCi0Pn4WGjUumeTCfLJJ1jYrHx" + - "jaFRrCj5qXWxkTinm7fk9Hu2JvELPk8MMVKpWKtKq1iVVKKUxXlx31G9Tw/vO6Mb" + - "E80lYmSJp0FRrDJyLJ51U9ZI6GiLTUsTlnZqBqxHcOldSSip2iosJI2Ehx0kHxDZ" + - "/AZNzYUGDTXrMplachkVuS1tsiYIYyt2mzZDErJJWTTEalrQplZC7YM+li2SUoxV" + - "VZY0yZkycNIiDcCJMaGNe5kXBpN+8HIUgoKqYnY1JISR6tshCE6JhknVjg6cMhWn" + - "JNlbSdppsotV9zG202HYjiEnmTz+E7xXhSrLv5ZtdazVbW2hjEYNKDGEBkJ9/vy+" + - "vnrFURs1YvpvLuyE245w0VLL1kr7cOg/Ba/Qf0QM8JPxZLLOStL5KZ+faXr7LE9j" + - "17oH4+OiR8orIu4h/RAagtxGICYpOWtBCN8eXMu7rl485VKQmKi+aU6rwbyfLXpr" + - "161+qbettfqWN0pL88tJbgpKWur4a8ki2arIszGhZJVK03h6o84nieE+RSDA2EJn" + - "ygppzrRHjjDHHjQ3oAGNIa0QIJjBiGd8s3glSnsMZSEY1I4BqCBOrFtgXZ7YoGff" + - "5SOeYkWToVOR6a7/Dmyl7pPebOTUlLEYebR5Ikzr5O+azEJXRy731dGOXtcW5mTx" + - "HG7GnHVxIbSbnuyUslYdMltVhpO7tytjo3Cx2IyGZDKmmWOxCaYRisSq0VhSVpit" + - "JWkrS3VY0DcaigxKkRFVBNRkkg1UhOMurldw8knJjznZobpJOCnNMtmM9JI/gses" + - "Dl0es/T0c4b+aSO5yy8it57PtER7yQ49svq6K2KoqVhjFUqmm02P9rP+enbyTaJy" + - "k7zyB5VdEyRHyqE2jlT/N+4jPJHNVfOPajFtvo+bRIhxDIiAREIBEBHmAseJvCKp" + - "aWSr3OREAnaST8LJp9TClbcGN022eOxs0mObY5x+f0+u0ck5RKKUopJrgB87bebv" + - "yv5u7W3q/fvzQ+JGypskPUreRLIrmybatMsX0a/RksaxtIKIX8sn739qsebzOZiG" + - "by7s3vdaJR6Dj2macG0WSRT7SDN9KC4xmGSRgRYwaf7MbwGIOPrP6Rb8N/DY1I1H" + - "JIkrMaQbxJHdIbifDkh15l2d27BHRHVPKch+6RBzeUnBMtctc4pKUyuu2upJrlrq" + - "667pW6+1t+6Vk20JkkpYV59A5unxbofu3vn21Ey/s+HYx9zasPu1JNm5an1x85Hp" + - "GG1LFk0RAJ1kfSK+E9UPntJMsjrKWnc/YuFg5pe8Oyx5qIpZEbwKh7e7yTBhymws" + - "JtGzb8PDzkfvPfLZJ5yR/o9pH2H9KqdtVVX7VbbWI2Nmr22lllliKehVTXVI09Cd" + - "Z/Ou/e1aKs8lfvPiSD3/Bks8PeYcuVmGgTKW2WyVY/isZRxJN2T4vyfP0vRyfZZK" + - "rbaZNZsTidKX8ofEcnunxzNEJWu9xbuQ3w1er3T4Y3g7/gteJ4WVbTtmn85O7lJ/" + - "VEnkTJ9atqsYYYeujDUxIwoxR56sknNj7SbuGneRs8nq4fJO2cpuiWKioslVKlRS" + - "pJZ/ULtdlKi0b+Z81+yixKtJIPDdvJ+LvDu0SyY/h7/w/FiNs+mias1cSpOznIPK" + - "yrHt1CY942YTzH+yrZIoqhOEiZIT845d3T6Pps/6Ofl4bEm9vIZB/UJBbEtgRgyB" + - "QrgTP96/o80lj8FrpZ3WuiX6brraSSqxRuxjTFUbWarrGGKMDbBcSioFSqf3ZLaC" + - "XBlKqfB9CZLWcmutdlVXXxEzqHZVo2a5uZjrbE5X5CvSKi2WpbDaOR0OqaV2Vjxq" + - "myEND13YGGgTBqRBqAkgipVktsk1bJm28lu2ll5dkUpklpVLKkqjThs7SaJqeWRG" + - "VasWSxZLZu4aIgE5GtmzUkyWRexTG+WO1qi40I7X+GXLi6g1d5IU5Kydn5ZoeE4k" + - "iNK7HJJHZ32hk/RzVTRzKwrOelrcXxZCb6V8ambb6i+3z7g8vV7o2qRK3bNfx+d9" + - "az5ZypWyvNOJkq2zTDGW3I2kxsrRVg0qaU6NmxvJVssZPf5Ch3jJZiNskkJC5thW" + - "jziKca5yYTlK0RAJy2l5f1mHrY2Dc6OkI2TTTy2TGVsRATPxGssjZRlnpIg3iSRi" + - "xI5OR2SOZJPl5/ncvR8vln1Y/uaaeTGFSl5VO11Z1vnvja5W9Kw09ahkgtDDYyAY" + - "Qw/WRKMp5aFVusKrZpjSKdZ3v58tazxmJb6NXQlD2AabBtG1MLD6P6xKQChW0XsB" + - "77Y5z/JBkkMXpKgXiWquYcP3Pv6+I4oBI7HediIrxI/Ei95EsFOQPxkk78pP8rbI" + - "tJ+v+lu6eiHk6+Kqz+L5PSR4npITj7fgsgl+q1VWGLPweJJjUnC/Grtc/J2G01ZT" + - "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" + - "GRBBBBBEkFZVQUUkTHdrccRvm2/fthj1pS2KWAbKGFox0dOmXvOlr51nWKGJum43" + - "BBBIJBq/KsYn0ippp9W01W5ZRjbTSfDNkM7isVOp5Wk82WrJNLTsbRZZzsMYDiQS" + - "QQGRB573Pe988yZmZmaB0HgHcz7ZHJKFgkEgyIkiSS9eHnk2SvPDryK1aqqqmtW4" + - "PSycD/w8sflE+v8v83/dyIplqpb1llszKa0Kl8tWXbMGzMy8XWnF0X937o/wO4fq" + - "0+r7tk9qe2FJ6z3CkozLYqzEKiqUFDKGP7kqsHaWq1aDYcCQokp/eU+vt7uZp4fD" + - "vw29FcKUSuratW2rX7I00/UcnqCIfPyP4ftqCVUyNaqZi2P7Lo2/nvtw1Ntxu2Ov" + - "M1cLOMOjTdl/Jw/jqwjhrHX7ljvTS0Ng9YWklWliFUpZUiCjOKclNiKmjWdFMjuo" + - "dSAo96JmslmGgyCeUmmjEtITqi4DqWXTg4318osVuX2Vfa63aYJNvvZpHIUVXXbr" + - "pPMYqxKrXRvoXCGuFnXhSb4SVZtAm6ojtvuIBkdOcqdgEZ6lcZZFN1kPKhJJhRBr" + - "WEQyIWkl1hnFU3uys63k4eJJlSIMlKqoErDI6G4EEUnpZfaOrlixLp9DvOUpB4Ta" + - "n2/ZW/q+fvPhH07t9H4MT16XESiARMKUE/rVVU3KNwDooJ7dlAzgnD7EhScMIYxZ" + - "/mOidHDestpVUIAEgC0t7/m9fLzzvPVb1fK+s+Y+f0Pon6xzJ9vzOD8R9GeLf1T5" + - "3aq222kVRIqwftW1VyfHRO+89MPe5zaktbKQr49+/jZmajwxNu3Zk7fVWkSWG+K2" + - "a1xZlKFOw5BlJpDTgyzEORiGVhmzt4tctufPV1DsnIxdsV3SbUdlXBrTgwnt41HJ" + - "0263X9faPss1y+iNSMUfp/X6ff7/6/TW98cccp1bYjhzq/3uXPJj5bT8/7W+nhNo" + - "/69v1+jGyfY/aaf9UV6T6SQPl1Bq30rH6H4yV69J/bdqqKoSHon4AEpmUtPAez+t" + - "92Y5lOj2CJ7CYdkZxf0D3R/XfsuFMS/C43Nv5T9sfMZV4L/G9pvd03/3mq9yzlm2" + - "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" + - "YS1EJA9jWfE+/5tRUV1ipCoof2zsjgKQ8vpHUIwQU4hNNSOW4tYulfaqfz6P4wYH" + - "GDM4DID3+NqN1ONUA/PfuPMRXS88tk7zKq/wt5RmaVy9WAxsjPw3pHVUomq01Y27" + - "q1V1m7Yd2KfWl+O5Zq7729d9zZ0l0p3fEcrJ5YgfbvWje7O3f3xZrowIWRkq4O+T" + - "FRyxJpiWo4lFPH3WrGdl4cvrRgQWOs7e+Rm7Fg5SGPs7K8wII3++tGhUMYuglST7" + - "5KtdoyntNOHVVlYkvFyJtG6k2rcPNYnRazDvM0jtv9e0GxHtPw9lbsVHo999iMnW" + - "ySQyREBBJkSLp6BsnvG/p9faVUKlPzdQ/ZVIRVFqLwVZA3bCzzChJo/VG3vBX5SF" + - "rWK1RZmzbONI5WDQJSoSvFrWQPYWLVWpk4wJi851alamk1f8QZvBepyqUITCUW1M" + - "PO3E+bYpbGJWorqrG+spHFPy6ovW+piPxPDpvMK9cLBMXT02D897907tO7q6Tqpw" + - "mu19VLVj5w68m9aLxrh5pRd60Z1Y7OPlnWyT67h8VWsGO4nUUKiC8Pu5yxhCT898" + - "xuvPfY+fhoRK5T5qvf5+ore9q8fDLTyk2u/mia2vXGhbTXwjpwro94vOKUYpdrNK" + - "/ilIKJN59XedxQPPGvYqUmlTpq88kgneW7DHmiG23HMo7Zsh04+H7xMdo7xOJJtY" + - "eizcYZdt7XbKVK6OL4vQLe/M+3jq86SgU5889oFKfPVuxF3wlFrkIun9efjz79d+" + - "wYeN/C+u3m1rd0jFGq9X89KmLLXN2C5Po/veZd64ndf3MKIxsceKwWTeL7MD3i1L" + - "FVj6xz2pzr8QKCFNCFKpIp+xTH6JnyBsNsPitQloYgqd1l5g4jhq6cPDUvHlmwrI" + - "oOhRQkOJcJfIaDs0KhNWaJJhi4g5WXdYcDKbkpiy7o20IRRpRFyOFooQ42GI3+Su" + - "oMuUwozR5RSK47UcIoQsIwhhRiAXHRoVM/c+S9/l9R47JC+j+m/Feaff6jz8TUQc" + - "fBu36cbfXyrsgqiUIyVfLNwCKvgnlBRwKKm+brfbFcOClV8LfTPJElZDw+Yw7n3R" + - "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" + - "9Ie3XnPlekWLviZo7sWzm9WT4r4vmvd4+Mn1zI9eadvv8/FYv0fllb9OdHfmF98c" + - "xiihhSVRBRSemqq32pgz4bzMD6OjNYamHHHp0WsLbYyKxZ3mLD52kY91zW6fPB9d" + - "GObcd2fPPjX0d4du7bA4tvfmSzb6t9NouC2GU+LHHGJNXK4s3xiY6MfbxT4Z83cZ" + - "UuZDLGk0mY/Z/iHrRxSY3S1SG9mvzS+bvxc44Th6JqNHLLC4ZR+p+NfpU+sMTeHg" + - "a67ZI7LO0gsjRa278NqHpyOH+PRsdMcqF5x65vjp0KeJjqR4dknzo+Zsle+oZmSN" + - "f8ttztuTWnh+4V2fpXP02u7ttibExiUsNhbdfPzh1+rQ09U+enFtXS5qQkjjxMd8" + - "MkkY56cYwqZcb6vi222vU9cyYersXMh7cOOI2Y7Viz6BNspac/J9fjp3RQw/gqpU" + - "1kIPpx1mbn6DEJI5wLjKElOj3z3XAvFr+HD+fSn8rhs166dJp1CBw82PeVw26dIv" + - "7MUi/KQbLXXHt4nPh0fSOYs35zI1WtZGrbfqaOvlNp6VywnitCl7G/RjngwTGOXw" + - "v3ThnnFFDb8PHJ2lL1vMzxiXS7Hci9P169PULTtp8MorSZB25VNA4Pw6X609+3Vz" + - "WTVcyRy2dbt8H177mEWSRvh8M+vSerjnx/SZfuZ0beIXSUuzna/Om+czLbbbVfTz" + - "54naAdd+pE26qa+jh4iOkG3g+U1FmjxmGX6Gj40+jLEntyrIn7/D+T8fy1+Pjjup" + - "Bc3CtbNuXO2tRdulIu21ItGsL9ccDt6aEtrxfwXjqcDx58HqqhesQkkFR5Hw5s+Y" + - "95rjxZ49Zxzzzs55zny5Y/Trf42ninShp2tC5MykPXPDq/HSuOcy/Hrg+uXOZjhw" + - "qpi7evQ+G3aueLbIW2pPLBOXPB2k0qeWcvH8dPX3537NGVVjFVhhjKxliVkqkjay" + - "ptqZq2S1WktJVZNtVJa0VtCm2mzbZsiNNZVVSy2ti1tS2Sq3md9hy4638z5PHNMz" + - "Ix3IfMkD8jgU/hevg0z6O9vrhfx2u0pdXi4ooddn1WwLTt3u0dtfx13/DwegMQYQ" + - "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" + - "Lj5me++lriwkeI4ck6bca2nHauuzfPTyrxRXIm23TPacNjajfNUa97T754q3c0rP" + - "IE5Nere/DaZzyBPTHL667M6YMUiwUw84c4W+5rlfVR6zxCzaeKly9x9x6DhaooPI" + - "1CNpPHVtq129Z3bpzpOM14nhw8c8mvgVGdYiu3n1jtni6FPTxEt8uOLVAnqxzGvU" + - "4XXlc09EDkrS68VHEuLovfh0kKjn16nx2624KnuSnHXYVkIprh8uKrXkxp5Z3aqc" + - "aeE59GkSJ0a8drt6aX+06Y9W1WYqdPi+di9Pw6evm8zGnrTzvvv+GSuG79/XDiov" + - "H0qepaxPYPTbhXBj1xR4w6Tg6NcOybV4+Om+3X41ItLvfGlU341TWO2R7tSuZO+O" + - "3asyajzIENvnh5J4Xw8OuDlfBN8GUCx4420ZVU52z250coXTppy6fELl7Rjpy+nP" + - "x28cG3ng7sNCRkisEe3Ltzt62dtbszTgXpLw27ePvRw+vlFcKR0ekbTaMSHDJB5e" + - "nZ8vLbTt78dG25fCwkJ//etW1scxPdFsVVsi0tFqS177RsuXJMklSkhrEjSwORa5" + - "3WlxTnZfjFJJ8qqYtJkGIYaQX+CRXd/3dKH8uAJ8Y9cu+OcSSPAL6Gs336Z468Zz" + - "vNxQRIyXt3dm7s0SAwKIJ5wEk8AwcCHFznBwg8o1kzNO72t3vAPY+sfngZ9dFb0o" + - "+X4H6XmWneYezTTiKIZ4CUUD4QEQCdPGmwTwkyTaXmJ2d+i8PAPAvDjERepd2Z2U" + - "tFeZqfopOh7VAjAeQ8BPpenxxACAkEQhEExObQ9XlR+e37Iw1mN+ICD34z4TEzKK" + - "dyQ5oUQnsRgHH1l1ker09IZ4KIqyrFUOLmqZbKLYUGaGAgOcGgdbwVvRho1lbYNU" + - "cdPj1zU4ogY7l1TxfNNPT+zP92ta1Xu6TpY6QeISM9/hrny59kjOErh+Ht2BPj57" + - "6L5BzgoCDQAx6HNqd9+Dyvbt27Lq3osAuFDt/Zv5zu78vxMXPz5rDDqp1z+Pi2nh" + - "zxuQkFAnqvWm2HD09db9dvJvpZ775mY/Nd5n5du34vVU6F+N+jTb5SesToqJfaen" + - "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" + - "faqcvPWZmV6OkmSyxFrWcJrWi1kksrvvgqr6xW9zj1ymeq4dcNajmbSDkR2mTlry" + - "5AnE7fgk9Tk978Fs2pXhPvjltkl3AXoF93yfjrr84+98655556eaKe/TcvX8+tDp" + - "+Pi1RQ8fdUu2pvFdMbdPAQGNN8ivU7S9Ryc166k8yJc5IdVFdb88+uu+/zeZveuG" + - "j1wuL35UllCnrTCt7IYcNxThFFbQtqjNZgXr60baY2hffWp4+ubvM/NIWzW5Uj1D" + - "p8eU+ZTg3naukLoZzl+a1n3vGta8samSFp7nvlKVuVxKevXTjTg2duJ3SfNK066b" + - "lwcPF5xw2+0cZJzrx68c3veNZrGOHXbTSSRwPSDE242fCWz4vTsVKYqOF4bx775p" + - "0xeOddrOpVXqcPaqqOW22WtV88c4xmZY7dL6ei956V67bbVtWu+nzM5fLQ6pS9sJ" + - "RXrzSp0cNSpHqF1oswXg7xoeipTO2OO3gSMFkwqyWwWmzzmd5mSrkIb9W0R4V052" + - "4SQ8m/L07yCFN+NEinDh32PHfHDzfDTYp2pF9vXXneZ84x6vcPRzRtDb1rS9KNoj" + - "G3tt8trVSm4nKzy3R6xxhOMVR5krVhMyjGXOrVEkqjaow3ghlCSpZNWBcVaxL3Fc" + - "Y9ZJpkrnJzlzh3m8wze+XP8uV2KlNuHovYPm99afPmu8VUqUJ47l3jmZl5eHCqbb" + - "HO7xlEBFcBA5Jb3t32Zl9tPvd2smGycKE9uyfDQQPDS8Ltb4qBF9a8qnudmpDwX4" + - "+wdtdWPrzp5ZJ51IafAcnZAsPkypcqpRFBAcxIYWs3vTR50fEtvnqdcUo/dUXwei" + - "bTydGiJ4PFIOWjex8NM77ddunuIT3rfm5Wc23BHly1Kmmj152czh1j2qUpWYqJEq" + - "vL10rcCedpLOreZEjlnPpzu3bt2Pe9pIbbhG5VdskX49R4c9PrbZr3tVMdOn17de" + - "nw+aNedrTuVI+Pjo67O359n1jijiSSJ9jstJAwAWh6D6ObOekTEOeh3nAr2g7ynr" + - "8xXTOMYFcwj5xiIpx8cwczh8LfyjzhSPBt74x6zvdzHlySLo8nCSRsk0eS6TRbxm" + - "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" +var jsonbz2_base64 = []byte(` +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 +5dVzU58rFtJ4e3yv9l6buQsjiD1R2Np9hTyeTt6+038W47SRy6PY06E+P3JOgWaQ +hHAkkR/Xh/2ncXif2afyf4Svf5NvY3/UP3JXCqfaxkZRL/J3CPDzFxNGAzKcQTnd +cHPayzzbvLxDd1UnVvMbTw9BywcPDfsc2zm/nyMfDmf932T7p87KrxgyeFftQ+tf +Cfh7HZyeE2aj8Ld3bXw43xb83/u3I6WSftIeD/xbZE/8bwT5H1OjB9vDc2fr8Q+u +397X9Gf+PSdnVOzpP8PP+c7z52c3SP5Gtkn9kn/w7H1cp+5o+HrPZPv7uTykTn4t +qMW5ktlnN5X7r3/GJDMMmGVMJN7siu/yfnqffmvSXMu6ft6bOJlTaKqp/L3k/g2n +c/7fv5SH4e7wSNdHTnGSe7brKd9m2+rfs+75c1sWpbaXqOkkpTo6LvZVDoKaaPJd +rf6/wabfy//P+Ses/dNe1Wv4P05eaf0Xg/vluP7Okm/5eu4+LJMnvJ6vyfdiuNK0 +Wbn2ZOW7k/O5dVV1S0twqcn6SMKzp/2y3c5D8U7EssiWcxtqybtlfi2p2J1xcn7G +nI/NwcrP+tfj8/scv7QZ8v3tjkfXsw7Hk28PhyNkcPY3e7To4dLZXs52SnOcp+0v +BzIaa0rMZV/r4j+X7dHd5OqeK/l2Ng6ZCf3R4MsiMaozClqv621/Cfwfp/G2c4GO +dLV9XSfLMq1YzWaxrDFXxLOJ3YfCa+Wpzeb8XWTm+JzP+IICf93/kNaqLaNrWSqi +ttajRqjbapmqtpS2qxVk1bUlWpNqLRWpZqtJNKo1U0ttRsy20zVJqrG2wBY1sVoL +FUWJs1ikLFTK0am2RVFYUrYNFpNtTCoNYjWpaFbG0TKLTDY1RrJSWwCVU1K0mkrG +yUpUbZDVikMW0bZkYotZMmZGLRsY0KIViLGjRsUWxtRUzFiTQaisJEzIaWTNYIjU +RhTZsyUWxsUUlY2oyRsm1G1k1MhLM2Q2gWRRMpDGE0zA0ktFBaZGyBETCCMgSEaj +EWjaJKU2NqZFooxiokSIyMMUIWEaiMhQoIiiqQmIYEkRhFpEhYqSGCLFCKEMEEGT +9mvzf2fuM6SFZC4Qd9fugRia8BBCIvlh/UPmUoYBieRgSMiPA/zM5kG80OwWXxVB +kDKCgX+vVRm/7UQIDInnOZ/vuDq/4D8+p51Kq1Jw/kWTzvI4d9a7SyLfWstuvCsR +8vO+Ve9WpNJv7s7+fuL8JV+dboUuDPzER7chJZ58smGb6bfHJ+/wytuIdr6d7a47 +bq+tvU9ubKTxSujpWpbkOGArKSYHFiSSfHgG2RPcG5lSlkRGbrdlTVFVeA1pC41W +V8XE0QYWbMrorO7DWTBoBRpgyaqKdSFItuzQ+QpmRRpSUkgkAkgVhutQk5vCYVVC +2pCBtTYcnZA1HRmQ5KEKUJCjE441UykKrp04rW12EaksMjEqCmiOKKAiIoVAjHHG +4Oy2vMLFphr2skmltbAj2yHto+/C1qRSHQI0oYJy4xPAK0hBhkBkzKGIDKfqR5fu +9Rb6jriPwFfrT57/BORRUS2uxaWe/23vw/VDRJUNDKbcoql9hR1STaoUKFJAhAE0 +AZZLjCTR5qxIgYLhyUQktqwQ0LakMUoDZaYvf1dL7/UTZGZSt/h0bF8bOrkShINm +UC5JVQoULQdWFmExZOwxx6b/nrJEIzcATXe9RX4uAjQuZbT7+8dvCcTe970nE51j +cmac2WktrRIBr8KKqmFiShChQWsTPnID4M0CSyZe7rltE0/bIvrM+YcPthAH85JJ +219mY5mjPQZhiZDYZA1DzBlAjUcjXvLL8BABMGVQh/A/vPwUfqX/5kl6UGGJn8FC +P2GG+QceVRTNvxzts75paBK7NzM7TzVVUzlIqqif8NJKRImR08cg2cHrQWxKYcNh +OjnHzz+YPyaL9PWNrPR37fFaHr23fpcy+YYGWlsuQf4q7bXFjzjZ66t5DEnZsqLU +ixYlKiy0ibZsjalZamaizKs1laSpmk2ratltZbWSta0bazUrFJs0ttalazaQUhKg +lSUAqyQoWSKtotVYtSmoyW220arUsoo1tpLaNtMsmtaaYsVTbS2UtJgram22rCkS +qQSxISyQS0FSSyM1KaS2laa0lhNFGhYWigRULZFiyykqoCxFBKRFSItCrIUWLKak +ppY2WbY2tps1pm2ymqbabbLNiZojaZkrFMKZrKzaWVptZtppijZNM2SzKmmxsRab +LZs2K1NVqWqEzMlJtmqVRjVNZWllSVLM0LNNZpalZokSlltLasJRUqopUpZIElIE +lkqrYjVi0aSNqWmLKpslJtFRBbSbbMy1KoplRspaNlNUrNUaaak2mpVFTZVGxk2a +GTSWmzaCpKbNJW2WqWqKMmNk1GkKUtk2ysrLNs2WwyrMqKpqZmmmKxtmqayKZlUk +qNltKlRSm2StUtbLWxTNUqlspo1ZtltNKRIqGm0tlRtNmmalNGZYybMozNNKkxpI +2i2ULJqUrGyyxJslNGpZmtNSsrNWZY222yttmrVNTbWZZMms2lllbKstpmrNMUmp +KqUtptKyaplKbRSbJbLNplZtqM1KKbabU1ZSUAmUaxpZjUkhUmyZmxbRSltNsrMq +qVbNtslSptEzVrMqaazNpmkqZsxExpJSk1itlWqay1KppYopMUkkkmbLNlMymsxS +0TKlNjKbA1TLLLU0lTWalTNMilKmys2ZY2mqViUVKSyksmapVNqSJRqxZSyylMlS +yLFSWRUliWKLJPR487tzxPbvpf6y887/zT6h9UmfSx2PLPXLE2t67TNb+d8616jt +tPkeNmjOnd2bULjnN/5x19I3dES+7KaAHB8sg9OaIHogcFmowcPkd56v4UKiqJhg +oAU9AHxYiJSboAuO2tYkauzYowUsXVGVlc0nYOpihEKtGCELstXcQR40ZwxcKms+ +7pFjCoGnlWDFSsNDI2M37zbDfLv3avdlnZZ+BC52UzTjZKLth+XpejoaOcVlvLIp +Bt0bICZGx12W3MemDI+BEABpXP87P4rJiq/on3ucmKl3H2qkVoDOXeBVIHThRlRW +oIeneSsFb5P81QBgJOLBARAX3nH8/r/f8w3ilqIGYIs2ETpWjUrVBz3ap+abPKWH +pLM3ltPx/+N/Wbt1NbzHN6yn49NkVXLjHsi0YsxWYxt0mpP5liJ0D/BK861JPxVJ +KrrKd1DEsjkf2fd+E1sqc+0G02nKaZP3/wWYV/JKhVSKU/9f2kP+Es6z7k/gUksW +JYe1an/921pBsrUdXyfSH+6h3N4k/jE5ItS1VTkajSXnZgf5UtgpKk2jaxZibyd4 +83LeR6x6+RPw/T0lWWVLOy4k54wllqVWtTTUvHd5G6VXZwcLVpZCyOySqT/VUqI2 +a3OjB+BJ/c5vJ17xaYezrA2WTu8JipWJ34en5WSThOGGFkqslgxWw1Riyit2TjUk +4m2SJs+3WFSYNQcR9lN+j4j1noP93VyHCfI7cNMSZzH2ZNRThulseIk/yU5KdXt9 +v7zmbk+gjtO690cSQSoFfmmeBxfI+vqGsirzNH5C+xTw2WGGHE0X+u176U0uLoPT +OEn+qsbDvaA4s+lX8EqpJzPrH0sloeXR1c9OiqmXer0zgSe5ZrT6ScTDZPxHCbPN +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 +am6yrFq3COr+Gv1fkE1ZskzBUlfkrr8b8hzk8yxE2fNMfNrmi187J8z+Bmx2Wzuo +upumHT834f0K/hL3SkSzQ2U85TkrZYbKMVKVsprfbMMsmUWyWP1W3DVjWss1MNMa +H1WP6OTaGllrnZoiAS6ssfNp5sy3o6d+z1Phfsunc9WPbpmXPm3eqbeJ3nCllcoS +R9y0sQeiKPWxdMHSL5yAm6DOmnZx9/de80IwLgMAwP8AgoIErJWSGzBhMaRbyCyG +/KI3YnIr+zatN5zJm9iJx5FlEPllZszjniMMODP1NDhIdNGSUoDpyr2MFiNFAp7m +dhmsM3rn7xcKDPsQKdNOmEcqRWE10Vn0f5jdKeQdD+sX9BD/gPSY95PtG5r5T0HY +ruV86045uEMRVSihTsyZa8MesmkTJVlLKqkjBRhG+JG9NNZ4h9alqTnNfxllQNGA +0GINwKMDY0ZDqh5V+GFsqw2G6lfuxMZjyPPPVzVO+/y341ul3m+NvxltY2IqNsRY +1tTEiANRtZmKiypqJVJKtpSltTk/sPm7/O/dRNKm7YOQYxq6uWOcR7KE3fYnBOUc +rZ8tbxGpQnw+T1h+E9UnrJ+6E4e77/fdEqziI7b4QxqWvgPVY2JuUihvCTzqWzax +J8k0/ueZNn2cHv/723l7vkvl321HbIYegUM+f6eVz7iFR6+P17uMwF+AHuHwfOrG +7J7tnlJLoqxiJZp7OkanzOMm8/JPR9k3N9px0iV2kiN/2MZWOp+Dmehw93hD9FiR +9EvPnH5sfKX5VzOWREnZyUU+va6YuauVpl1jSzGGKqpqKIOVA2BEIIMpS3xoVbiJ +DZ+4+ep9reEaqbrqJ9X9jOrrvJSr+/C3LCqZIomMTTGl5droWwvUnqT7fVasJ7Q3 +Vdshbp9jH8pBJ6bD2U+Cd/hZbX9ay6kU8KxTu8ttbZlm1Zpptjy1hjMVabYxkKUR +gyjKMrbFpVVpilVWFxd4lsXb8MOW7fVipDJxhwVyRmzTVLLxkzco2dz5NnmsjnxG +SQ0xLOUGItVGqYkjaPOd1ixXJ8pvAbHrxPhNAgJ168Kvepi5THZi1Orm5ld4ad8r +162e8Lnx2rLKuWUXYSACKn+0Q+UPkiWkUT/jy4+mbc//nw1tlzru26a16nw/ipmj +oukAwgMmggdSKdGbGU/Iprgvjn77Ct2WhTTOcy5KZMORZMZRWwQ6QquGZW1JTVlg +QmM8osKKGDGMJIGMIBsiwhShSkqxMPy+3NPLDrbgVBbDqzyCBgWZKJrEQiRzR54q +wia4gUepCJo2SzrcVXl3bH+sTOvr0qFHlmMYpGEQaiFZjEgQmdarIu7T2kdmRlAF +SkKsnConJTZVYwmzOAdnDjWUlQbpLqEmzOttyWq429ehDBlMRRpyaUji5o2uW/LZ +8wQgAFSMYB0Wdnuk9X8nH0naSH9JI+g9o2Gzu5nUVw9VrujeRN048OjNoP8LOjhS +uG/rTtFPk8g307qhpyc48W4wop6dLpbpG62VarE1XE8iOyVK9ztXvOYw0JoSwJZJ +Ftfft+V8JibSreNomUqaifeYC3fJ5fCnZQIMR8DDQUIxtbZGzGjKKNDyRspoqZqZ +ossZ6UUDMFZKUgwYwsMaaYqaYrCr66wtypjY2abpVSX/mXeSNkaJPqgQhw2mmMjH +EHymdzJLzYsvmuuvVbsqy6m7aYqyZnGoerqj3UePiyIVZIoqKthYOZ6vGFsYpWJz +5ns4SY/yi4BSSyktv0dXbf1b1fl9fp9+36YjGvdRRMDFkx6Pp9wzFt1H2f0Y5CMb +VjGyUszErxN3k9ks0S1Zk8IeitT1VrI3R37ye53Th502X+9254a+co8o7nMnWdCi +wosHYmvktSVSyC6P4FSTb4evj8e+aNQ/gr3by2tmlU3bI5CjjaesCuuOTInFMxR6 +BGGiWW1NjQqsYxKUlU0qtak2QF9FdGkKOPTjiqoqd6H0PuA+KaOAwX65yfbt0Uu2 +t+9+OvxwswtdK+Z6T46z9ur6JavYqrVySsYUxinbay2mTZRVK1bWMy8Hm/TRaetZ +W+L6HJ1GI7KbTEnokj3nzVNViyloqqryY4aU20msYtW5mTfBtWDH/fMFA6MUxGMR +NFAuSNrZk1GrtLMg2RpFCqVUaUsYRZMiN2Nim9bnyPI1L5d7amo7nk142ZMm73SJ +/eoPU902bpY5T5yQ6ffJkrLbKvs844reynK6fNsroOIGSOqTdhDZO0IlkpYiq6Oz +Fkc0U/fPTYvU9bxWXZeLi5F902sZZU2ysGSmlVu0qcXTGyX5KS21VKrYw87pVnOc +iN204sTwOM8R5cJLXpE8sT3gdCaTqejSJPFnanubqkqvQ5+EkEjrFki/syRPSKqx +ixHNf1x69+Xp6t6l5LGF8d0xI7umlRgxkIYgsKQGahBGMdwkbbIclCjg2oW00iZA +hDSVAoDGhqhIDTC4UGjDNVSwINaWT7/c+6B936RGV91beaH+tFpClUqVar6a57xS +1YsdOxwxj98iTq3teHw5yT2NnV6Ms+s+NR8b24bKw/NWKKqqZhiqnM8QftpfQb+C +Vs3lZLSSASqcfM7yVxGYledbnrN50XJBATYaCsBtFYJlZR2SKwb21+jqRiNFI0Sa +rSjgiATZnWelW7O0mbziCfju7ylzo7WSqylsYp0JpjJU0qaMlJUUVhGilWTZudCx +M+kc+l5uTSG84qLYv2ZJMli2qrILI2Tqln4cMqNhAj4gogAncslWOiwaV+BwnPnE +jdp7E6UlqPtYJYV9Tg3WI95FkO6beZO8nlbeyYVc7od2tLylZPKLTp1I35t2iLsk +ipSBQqtbUX19H2kWD8z2PyVPmh9rLUcrDSKQsTJIfukqY7Hl5DzdPLdUqq1+LJp5 +emzvHWPLN9YtWeh+2WzylkbFNlTCyVWKZpKyQ4YwqnWq3kKzCwje4lWdzTuDbTZx +x4bJ8tzHGu7m3prWSakaVZncMwY02dcu7kznctvM5MknBXCmwVtKfU0xWphkowpi +VsxiVW7I2rWqtRhwpcXDoaZN1MN6tYlKrh3GpWUlJLvXd43OuslSWQ0fVcxqeL+B +Xv1rpQyBqdm7e1Ra8loulyubVzbXOGoNVpN1/mjcbxaAiUP6xnhT7z2IJaTCQVgt +DpQcGFJgWSBTA5batqKV5l3ruu7XC3NyZRFeT486vWm68lRqMyRNpSzSpsi1KyzL +GmTS2azSVMZqtq2bay1a0raVmmyq2yqikIVCwBSIqSpJJKsVBYgSKsBLSopRkS2t +tKmrVKmA1rSpZU2JTWWSGtUtmsrMWKVLLVRCkSkEqQS0GpKlKZllNtK0WFGTNpZY +2lmmZKZLbWbabW0ttZTSTFMklmzbbTaajUNZaVNKzWaipYqKmU2mMk2lilaVplhZ +MykpmlSwamzZsrUtUJCNs2xE2zWbLJpmmmlSyzaYzNqWpssspZTaqtm1VbJlmm01 +kzUtDKks1LIK020pKUpNRlKTSlmUprKzRSmk1NTZZJrNhJIZMlSpNJDMktbNVDEs +mpKFKVJtllm0ps2WzabGsbM2aQtmsJaMkNaVJmssNbZtbMprNYqWVKlaTUapJmGz +RClCZhpmEmZpEympqWZmWbRs0SaY0lNTU2lqbLNtts1tsrNtKqSWmGWWW0tZrNiG +Uy2ylLU2jJWUySmlNmpspWFKJrTVkE1lJmakWTZmUtpS0rKyqpVsilmsNrWWbLMq +aVLFlNmazabZtNppoZJEkxlJIlplYbNUMaaVKhIUylmxaWkEslm2WoAZmYGmm02k +mZ9vNcym/zYZ1m/E+UySfg39LUVVWb+0CAnu+IVnzkTYexs7ufDm0VjDZ7mmLPDC +jvRkCK4NH4KYIPfTEsxAJVJTCY4MNNqKqTgrJkmjRkVkyN9MMuNskxW0mmjTSlSs +RiUzxDKZmvWVXm9Y8a6VLqbbWXtSMLsZGTNoSqYkyYjI2VEskoLRRUbRRsbWkqSt +Sau0WgopMsq6V0SZehQ82kyxbJsqq2k6xbaqqpy8chxElkKVybMPBqa1jIGLJqNa +WSNnw5w5rJRVJ8pXQahwWUzyp0wnz/U0hIEiEYfzEVFZGtr8GqLFqNUUa0pVZVFV +lLVsEy7VF1qILVeGEk2aS+WJki7F2pqD7InRyG/WjNbxTzY7E029eTdr/1ZJlhzx +xZEk7TYxZI2Vk4yI8WLZEUcfOpyzjm2I50sicpFjzHRZKelYLMxipnrpolbK2wP3 +Gj5QrZ3mE7dW70dJN3aTWPvGzFnLOYscQkecNk/KdSbVattW/g8tatRJ9BbaVmTU +cNkbE5NiRgCjqJjBFYYMQEpXT39BIxlLWwvLhFGpGWUqKViqxkcZkznhqQLSNrGQ +hBUdGYxN2kbWNpAzdTVXSs46S3TNK5yd26mxXO7tXNdm0m6bRbSTJvK6rpKW2TFt +vPLvJbNaSixoxKyEmNk0kWK0SdjZs2NohYnAsejhFowruXCQlUVFqVGpE0UGZIZE +c3lktTo03a6N+EiflSdFScJJ0xKRxN5+ZDlCLZB9FWySZUtkhL9OWNS5Kx7HmGk3 +Zm+vn/kuSquatyCwYtGGhIxpQKVBh9sws7qnJ2thu+NtlbJbljpdXFmFp6I0cN3V +hW7RqTNacWNJ80k/pbIVr82CR/iVzKp1fJPyjz7u0PGnOl53LbDvYakR0ZJD8qm5 +9mWLpEWRzhu+1n9OUKT1kn8VOh3p4lv5ZjCqf3P82pWjKmxUzVvxpOH8eDZPhDwf +ii4JZZPcJ67Ts94+JJ8JN6n2RXJ/iPpDEN5uehqR3Yxju2bXbGDrRv6T0R5vdxJO +R2mD+4dUjVjZFQf6RFZJ8rFskqu7VMy3EjDuzE2K5wH1nnG971lZjE1GMMpMLzVo +tmMJoN2gv8yApnCpgihcVoiUFH+c9nnbz+momOTD2WTT5sRko0skZYttki1bLSVY +mmMY0wqhWnGhdSllSSW9z4amEW8VfPq+6qyaeu2jZNvXtEl6ptryvUoxwqtXN1Fm +Yqyc7Jqlsb2TXkulki/galjcAwqxIxJEkIZjxWvohjDLbjDg3VHCdKtlCUmTvHq1 +g1bKsb1nufaqpD0uQWNon9Cdrrb3LTMlSbUTSbK0ohajIvgjH+99Bt8p3n6qleSV +ZE6o9h2eHZRzpwc3OYmK009E9R328jxMbJvFH6StQnM1NNmLDBWdD/DwdQc+bD7v +Uoz8D4pQaY3jgmo4UpCiqrGzZpNbC5h/TXGpNqn1Vaok4ZPk4KphiwyWJy5ZHRwf +oiZC34h6SrVlWif7FRHs1+Nuh+L5Hs6k7WWyNKyald2mpMaNp8+jr5z3H5HpDpU/ +yqPXPAk91O6UFo2PK2u5jy7lWy35Kw+iPIqfOySOpNDJ1k4nqsilXhkeZbW8c56z +Rx1kbkR1nBpJ1VUPWotkR0rdsQsexSuL+5pk+Mk2l/i7Oi6XGwkvE5JyD6Ifc0l8 +iIBO6c0DixXt8Wk0H6+6WxFliWWWhO5P1UUsfx/o/JZJ9iprtPkmjEsfWdqnbtat +q24OckqqqnQw+6k7EfBZHMentbUafUcOiqVVVYFUlFKKqejEY6Y+lfo+ubdLJdCu +RFXLgVQwrGW3GIYJWGCYwwtWWlUskYxZ+emKaZHyQfWMWTUkP9FV7wTx+WRVUrZI +0/KPlYWlUqaINRpIxmMlMfoeftr+7+JP2H69M/jD8xaKRKgSrdibLHI0VxjbdHGN +jQd0aMDA0QIQWEpTRDGZrq3R00OH8GFjuAD9iwhU2MP6wiGD+jp0Ymd06Ksv5piO +Uq1rMkwZkiw2SmZIUHD5pP5P1qcNmkgD9vum0hi+X4S/PJ3/mfi9rbspyye2Fk1Y +tSqo+5O33q0nAeTHbg7lc2zBxS2K2xjL/dLmkWZGHQNxp9NkyrGxuvp9akHp3+A3 +ROSdXUb1air5yyvdI8km6PrIgEskaR1ceOmv5q4dpNp4dofKup3NzUTxsvxlZbZ/ +V7KshwsVcSqwxapT6487uYnOE9IdPT5DshyR8GTg8yZIxO7D2Xoe8wbPD2vkrki1 +J6oe6xXDYppjTbDezUkdjZXVjE75bVWXRUdldu05D4OvVbD8SxVZLZ009nJEkSTN +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 +mStcsHMrio8lNypolKYqrT5AyFDChtZGHuINKBspBGKg7kJt6Bo8fNBswFHISJJt +PcLdHk1+NWshZCgqnMZITrDX2VnDFGhCe+9um2kaWy3BLFDrBte5ISqMa3whRNX2 +hdsSnCgdmnJiwaaFmqxgEhoSkmS4W5nnc2pOkjMCi0Pn4WGjUumeTCfLJJ1jYrHx +jaFRrCj5qXWxkTinm7fk9Hu2JvELPk8MMVKpWKtKq1iVVKKUxXlx31G9Tw/vO6Mb +E80lYmSJp0FRrDJyLJ51U9ZI6GiLTUsTlnZqBqxHcOldSSip2iosJI2Ehx0kHxDZ +/AZNzYUGDTXrMplachkVuS1tsiYIYyt2mzZDErJJWTTEalrQplZC7YM+li2SUoxV +VZY0yZkycNIiDcCJMaGNe5kXBpN+8HIUgoKqYnY1JISR6tshCE6JhknVjg6cMhWn +JNlbSdppsotV9zG202HYjiEnmTz+E7xXhSrLv5ZtdazVbW2hjEYNKDGEBkJ9/vy+ +vnrFURs1YvpvLuyE245w0VLL1kr7cOg/Ba/Qf0QM8JPxZLLOStL5KZ+faXr7LE9j +17oH4+OiR8orIu4h/RAagtxGICYpOWtBCN8eXMu7rl485VKQmKi+aU6rwbyfLXpr +161+qbettfqWN0pL88tJbgpKWur4a8ki2arIszGhZJVK03h6o84nieE+RSDA2EJn +ygppzrRHjjDHHjQ3oAGNIa0QIJjBiGd8s3glSnsMZSEY1I4BqCBOrFtgXZ7YoGff +5SOeYkWToVOR6a7/Dmyl7pPebOTUlLEYebR5Ikzr5O+azEJXRy731dGOXtcW5mTx +HG7GnHVxIbSbnuyUslYdMltVhpO7tytjo3Cx2IyGZDKmmWOxCaYRisSq0VhSVpit +JWkrS3VY0DcaigxKkRFVBNRkkg1UhOMurldw8knJjznZobpJOCnNMtmM9JI/gses +Dl0es/T0c4b+aSO5yy8it57PtER7yQ49svq6K2KoqVhjFUqmm02P9rP+enbyTaJy +k7zyB5VdEyRHyqE2jlT/N+4jPJHNVfOPajFtvo+bRIhxDIiAREIBEBHmAseJvCKp +aWSr3OREAnaST8LJp9TClbcGN022eOxs0mObY5x+f0+u0ck5RKKUopJrgB87bebv +yv5u7W3q/fvzQ+JGypskPUreRLIrmybatMsX0a/RksaxtIKIX8sn739qsebzOZiG +by7s3vdaJR6Dj2macG0WSRT7SDN9KC4xmGSRgRYwaf7MbwGIOPrP6Rb8N/DY1I1H +JIkrMaQbxJHdIbifDkh15l2d27BHRHVPKch+6RBzeUnBMtctc4pKUyuu2upJrlrq +667pW6+1t+6Vk20JkkpYV59A5unxbofu3vn21Ey/s+HYx9zasPu1JNm5an1x85Hp +GG1LFk0RAJ1kfSK+E9UPntJMsjrKWnc/YuFg5pe8Oyx5qIpZEbwKh7e7yTBhymws +JtGzb8PDzkfvPfLZJ5yR/o9pH2H9KqdtVVX7VbbWI2Nmr22lllliKehVTXVI09Cd +Z/Ou/e1aKs8lfvPiSD3/Bks8PeYcuVmGgTKW2WyVY/isZRxJN2T4vyfP0vRyfZZK +rbaZNZsTidKX8ofEcnunxzNEJWu9xbuQ3w1er3T4Y3g7/gteJ4WVbTtmn85O7lJ/ +VEnkTJ9atqsYYYeujDUxIwoxR56sknNj7SbuGneRs8nq4fJO2cpuiWKioslVKlRS +pJZ/ULtdlKi0b+Z81+yixKtJIPDdvJ+LvDu0SyY/h7/w/FiNs+mias1cSpOznIPK +yrHt1CY942YTzH+yrZIoqhOEiZIT845d3T6Pps/6Ofl4bEm9vIZB/UJBbEtgRgyB +QrgTP96/o80lj8FrpZ3WuiX6brraSSqxRuxjTFUbWarrGGKMDbBcSioFSqf3ZLaC +XBlKqfB9CZLWcmutdlVXXxEzqHZVo2a5uZjrbE5X5CvSKi2WpbDaOR0OqaV2Vjxq +myEND13YGGgTBqRBqAkgipVktsk1bJm28lu2ll5dkUpklpVLKkqjThs7SaJqeWRG +VasWSxZLZu4aIgE5GtmzUkyWRexTG+WO1qi40I7X+GXLi6g1d5IU5Kydn5ZoeE4k +iNK7HJJHZ32hk/RzVTRzKwrOelrcXxZCb6V8ambb6i+3z7g8vV7o2qRK3bNfx+d9 +az5ZypWyvNOJkq2zTDGW3I2kxsrRVg0qaU6NmxvJVssZPf5Ch3jJZiNskkJC5thW +jziKca5yYTlK0RAJy2l5f1mHrY2Dc6OkI2TTTy2TGVsRATPxGssjZRlnpIg3iSRi +xI5OR2SOZJPl5/ncvR8vln1Y/uaaeTGFSl5VO11Z1vnvja5W9Kw09ahkgtDDYyAY +Qw/WRKMp5aFVusKrZpjSKdZ3v58tazxmJb6NXQlD2AabBtG1MLD6P6xKQChW0XsB +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 +Zs2RDWNrUlQ/P8x6SH7v7Pz/8fq/1tn9U3lWuTf1JnUUMBZ0zXwlfGtzjVdDGdNw +/Wb/TcYvZhOV0yvddt9942XK1inv3hKPY1yG22ftVJYGIHecMa1WHrVRdWNFu82a +cxAgPKsqap3SvCX1k9lfXPem9N6bX0uaUbPfM+K4StqpjulMkJsnYV74vTdMY1Ed +oFSIZ4/h6sOvXBROO5iA46Ydg4cPQkTnMmYnMTmTOZL0JQOVaKsWLsGxYqhdCCQM +UGxBBBEJ7+U3578j0euaooSZ6QPtSOwWKBXnFoZlecqTfq1/RtQ4OItiMpbHqNXS +LBpu9xQ9UiKIOt8lmoPPrrV81xoI5KWxvXhM3vY8pR7qqK4YLstYwxOVYstg0KRO +i1fLX6rgTrxlmqlbrkE9LEGeIed9k26rGnWed6Nh06p11O87aBEwmLoD3HcEEAkE +GRBBBBBEkFZVQUUkTHdrccRvm2/fthj1pS2KWAbKGFox0dOmXvOlr51nWKGJum43 +BBBIJBq/KsYn0ippp9W01W5ZRjbTSfDNkM7isVOp5Wk82WrJNLTsbRZZzsMYDiQS +QQGRB573Pe988yZmZmaB0HgHcz7ZHJKFgkEgyIkiSS9eHnk2SvPDryK1aqqqmtW4 +PSycD/w8sflE+v8v83/dyIplqpb1llszKa0Kl8tWXbMGzMy8XWnF0X937o/wO4fq +0+r7tk9qe2FJ6z3CkozLYqzEKiqUFDKGP7kqsHaWq1aDYcCQokp/eU+vt7uZp4fD +vw29FcKUSuratW2rX7I00/UcnqCIfPyP4ftqCVUyNaqZi2P7Lo2/nvtw1Ntxu2Ov +M1cLOMOjTdl/Jw/jqwjhrHX7ljvTS0Ng9YWklWliFUpZUiCjOKclNiKmjWdFMjuo +dSAo96JmslmGgyCeUmmjEtITqi4DqWXTg4318osVuX2Vfa63aYJNvvZpHIUVXXbr +pPMYqxKrXRvoXCGuFnXhSb4SVZtAm6ojtvuIBkdOcqdgEZ6lcZZFN1kPKhJJhRBr +WEQyIWkl1hnFU3uys63k4eJJlSIMlKqoErDI6G4EEUnpZfaOrlixLp9DvOUpB4Ta +n2/ZW/q+fvPhH07t9H4MT16XESiARMKUE/rVVU3KNwDooJ7dlAzgnD7EhScMIYxZ +/mOidHDestpVUIAEgC0t7/m9fLzzvPVb1fK+s+Y+f0Pon6xzJ9vzOD8R9GeLf1T5 +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 +KIZUKGEwHCFgyKwJcqXSyY9+KkWLMIVwWZW84+AK/Bz5wnaLI44LmU90x/EkyBYo +YS1EJA9jWfE+/5tRUV1ipCoof2zsjgKQ8vpHUIwQU4hNNSOW4tYulfaqfz6P4wYH +GDM4DID3+NqN1ONUA/PfuPMRXS88tk7zKq/wt5RmaVy9WAxsjPw3pHVUomq01Y27 +q1V1m7Yd2KfWl+O5Zq7729d9zZ0l0p3fEcrJ5YgfbvWje7O3f3xZrowIWRkq4O+T +FRyxJpiWo4lFPH3WrGdl4cvrRgQWOs7e+Rm7Fg5SGPs7K8wII3++tGhUMYuglST7 +5KtdoyntNOHVVlYkvFyJtG6k2rcPNYnRazDvM0jtv9e0GxHtPw9lbsVHo999iMnW +ySQyREBBJkSLp6BsnvG/p9faVUKlPzdQ/ZVIRVFqLwVZA3bCzzChJo/VG3vBX5SF +rWK1RZmzbONI5WDQJSoSvFrWQPYWLVWpk4wJi851alamk1f8QZvBepyqUITCUW1M +PO3E+bYpbGJWorqrG+spHFPy6ovW+piPxPDpvMK9cLBMXT02D897907tO7q6Tqpw +mu19VLVj5w68m9aLxrh5pRd60Z1Y7OPlnWyT67h8VWsGO4nUUKiC8Pu5yxhCT898 +xuvPfY+fhoRK5T5qvf5+ore9q8fDLTyk2u/mia2vXGhbTXwjpwro94vOKUYpdrNK +/ilIKJN59XedxQPPGvYqUmlTpq88kgneW7DHmiG23HMo7Zsh04+H7xMdo7xOJJtY +eizcYZdt7XbKVK6OL4vQLe/M+3jq86SgU5889oFKfPVuxF3wlFrkIun9efjz79d+ +wYeN/C+u3m1rd0jFGq9X89KmLLXN2C5Po/veZd64ndf3MKIxsceKwWTeL7MD3i1L +FVj6xz2pzr8QKCFNCFKpIp+xTH6JnyBsNsPitQloYgqd1l5g4jhq6cPDUvHlmwrI +oOhRQkOJcJfIaDs0KhNWaJJhi4g5WXdYcDKbkpiy7o20IRRpRFyOFooQ42GI3+Su +oMuUwozR5RSK47UcIoQsIwhhRiAXHRoVM/c+S9/l9R47JC+j+m/Feaff6jz8TUQc +fBu36cbfXyrsgqiUIyVfLNwCKvgnlBRwKKm+brfbFcOClV8LfTPJElZDw+Yw7n3R +/39I96pWacn74akmCfZk9N7Hnbmfnm+G9N9IIVf233Vjv2K+dmOqXTgm/cpSxjx5 +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 +qNO9m2ni+V9vD2uz1tpoxtt5t1PjrlVPhy7WwKnZHuC3ruTKRLY2yUlqGlKqWkiW +y9iHnhPZO0rN94N2brW8hut0yR51BrPKXs7JGxb5AnRiZTl2Xq1hpiXy8iczq1p0 +4OUvW9g8WPrtcenxbXL58ic8LgbnL1I0m4MeNSM4zVJrWW9uI3DW3tqHzluUwxR9 ++s0Vc0hpweORY4VOtNXbALUCyXLqNFcCR7xxw8jTkStO873DPfY017vHfEhE5xAu +lh+U9Pt+W9++O/u05zeb4c7pzjRaWurtlU91y/Pj38bnSo+8PfvF8I5SNJ62aL20 +QZtJUXrrTO3rYPXw+NeuFWmevi1C41Gt1m2DMqHmySGsXd4XEMFkBpCUlZSTWAUm +a5gWmZLEQcLCwtjR0rZplkWrZuMqsNpWrMyvBJ5/Gff5lT3FTnKql0x9H4PU/DTX +OxAXime7qULq7DqoaFW7tVaVWymOAghDdEltpIwwyIooHivfPjSHoqKy0NCBIRpB +IGQK8fXhPBpMTMhc4OCJWMuxlIYammJ2sgEEXEs8oDopthFpLOUlVTJVAqKGFoiu +fFmCKtsq1oM33uOW59vV16cDSvt7p7+u80IySXnVy5lF3Mz5ZLDu9ZrDzoUPrekc +9Ie3XnPlekWLviZo7sWzm9WT4r4vmvd4+Mn1zI9eadvv8/FYv0fllb9OdHfmF98c +xiihhSVRBRSemqq32pgz4bzMD6OjNYamHHHp0WsLbYyKxZ3mLD52kY91zW6fPB9d +GObcd2fPPjX0d4du7bA4tvfmSzb6t9NouC2GU+LHHGJNXK4s3xiY6MfbxT4Z83cZ +UuZDLGk0mY/Z/iHrRxSY3S1SG9mvzS+bvxc44Th6JqNHLLC4ZR+p+NfpU+sMTeHg +a67ZI7LO0gsjRa278NqHpyOH+PRsdMcqF5x65vjp0KeJjqR4dknzo+Zsle+oZmSN +f8ttztuTWnh+4V2fpXP02u7ttibExiUsNhbdfPzh1+rQ09U+enFtXS5qQkjjxMd8 +MkkY56cYwqZcb6vi222vU9cyYersXMh7cOOI2Y7Viz6BNspac/J9fjp3RQw/gqpU +1kIPpx1mbn6DEJI5wLjKElOj3z3XAvFr+HD+fSn8rhs166dJp1CBw82PeVw26dIv +7MUi/KQbLXXHt4nPh0fSOYs35zI1WtZGrbfqaOvlNp6VywnitCl7G/RjngwTGOXw +v3ThnnFFDb8PHJ2lL1vMzxiXS7Hci9P169PULTtp8MorSZB25VNA4Pw6X609+3Vz +WTVcyRy2dbt8H177mEWSRvh8M+vSerjnx/SZfuZ0beIXSUuzna/Om+czLbbbVfTz +54naAdd+pE26qa+jh4iOkG3g+U1FmjxmGX6Gj40+jLEntyrIn7/D+T8fy1+Pjjup +Bc3CtbNuXO2tRdulIu21ItGsL9ccDt6aEtrxfwXjqcDx58HqqhesQkkFR5Hw5s+Y +95rjxZ49Zxzzzs55zny5Y/Trf42ninShp2tC5MykPXPDq/HSuOcy/Hrg+uXOZjhw +qpi7evQ+G3aueLbIW2pPLBOXPB2k0qeWcvH8dPX3537NGVVjFVhhjKxliVkqkjay +ptqZq2S1WktJVZNtVJa0VtCm2mzbZsiNNZVVSy2ti1tS2Sq3md9hy4638z5PHNMz +Ix3IfMkD8jgU/hevg0z6O9vrhfx2u0pdXi4ooddn1WwLTt3u0dtfx13/DwegMQYQ +wdp85zgwAfA3hJq69eh7Lu7zLGHl5V6eivCu1elHunTwnjRy61p714uThUcOOcz8 +O1cqxabWOunLt5Rw9iSJHt3F3y3WWZdtujHhx50iRPHtKachw2vnz8eK369x98Ov +hw2vztQt4JRlnK9QFCycOHEpchMB0Ym5SeIlIUMnPFcafA3klDSwWSTX9VVFP3k/ +KQ0+nzF4rj5wtvArh604+dqCN3Qjz0VcqypVmrlXVlSVcqyiSeckRld1JlJlRlJB +zmlk1LS0RqoTfWN3vzzprfXjY+ZUWT9c+ednqsvvSSJCkAXphQSFpCgXIwRJFQeP +HfxpU2Op7pg4ZhX80D8P0HcE+tvtafe0PslS2h6bEUphB+Trt9zcMySlFfrXx8s6 +aKGUneDdfjQ99/yYfX7l9meCDI/bvJDJAQgdu6SzNW3eZlBQykZoKrwo37d0TaW2 +0DnfHOPJfg278PvnXg+re/l0U+vfj83QmJIyIhDN53JH5Px9XhPr2/DXcY+NzGJO +6t1p8J77+GH2+xfbwXyN7S7ySU8e36ZcY2cmX9ZqJVTbyyJ9LNd2Hy9pFJjOJx48 +YJh9fxDDVU7nuPtjdzVxq4025elJxy5kTGLIXu3JDla90qnLmi/u/hOXSqnQu+mf +lpHZt8sRqH7saHSSEQXU251XwY4dOFRt18lS6cUnTgWreu+m18JO/RkmYWb9Oofm +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 +6L5BzgoCDQAx6HNqd9+Dyvbt27Lq3osAuFDt/Zv5zu78vxMXPz5rDDqp1z+Pi2nh +zxuQkFAnqvWm2HD09db9dvJvpZ775mY/Nd5n5du34vVU6F+N+jTb5SesToqJfaen +DXwdO+bu81I8knny2dLk+lPtFD493Hx70x8+ZnD/LrkygIFr4AcZGrTDQcMwVWSB +UIKC4cStoBZZEzt+9tptwYhbUixKXVLSo3XvhOmipnoTQ+XBJCdfHJ8r47yZmPlN +tp88W+HnzreZnj2dX2cPfT3zCQm3ifI8tvCeDfBNnl0nnzDynndrPNObjUhIM70k ++Phvzu5niebfbE8NY1HHuJBzqbt41px6TjT2wnuOfnskTlZwenlVTqj+HnLFtEu3 +oQOnRi96VHqH1D1c+g/IZ9nQp1cZlfv1606UPjEUVw/C6dh+Pz4Dro+bIdOl2OTP +vLTZ5+7/XSX29Bv0PSCdHY28GJ5eY3ddXvTet3d8H187Yn31vrt8fNKu1D4+cOuX +InT13p65ql8fJv74217Pm/vXbqk3NtnkqrqnTkK7wpfdhA+r975xmcNIp7Twznji +evTlp74w9peduGxXiNdczaymNYnPSSSSFdH57db5cA+GzcQeEkOBjPVentzlrtHQ +fBtWJ18UIb3yjguww+BUcg8J5eHbljZU09Ja1euOjrmjp59ooZ2hzKN2Qay4mLA1 +pTOLMipVkiB0k7w4rISoDm5vGxYTTI8ymFxmtm+OGuNY5ZPbcqyxJP8qLkqcrsuN +XvVCjgr1Q3zy6o5T0ZznGJlVeY1Td52qu2m5V2aq1GXbu10ddY3rOrpy0u3G0gaI +oCqoGaZwMADnKp1up7vrdzvSOe91CCUrW9pWJcngyfSVtIngw8zxCUFzpAJs+tb5 +Zsn1j4Dp7628zYe6Rgm2wa9FYc1vkPNMB5NQ8Ic3l160dXv1c6zek8W9yRs1O1TS +z1rN1EhwklOMD2NGX6ryTXTqgq+B6Y+TGD0AgzsO3XvudNp0bcBy7fASeOUcunRo +167Ew2GNnFZG/O7eEsenI5SHrvvWZ2addPjD+TtfXdODuwvq5huPLaODCtE0ntOn +L4e8t7dJ5M07bNC1FSRtpsdzzppPfI7dxw1640x8bjJekxsa5Y8VNtjEcBtCWwcl +ZTbCJcD8HrfbHN5KHTo4Fp819fe92ONY4erddMSl2w76PG6tcHtZwrlPXKVGjFac +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 +0xeOddrOpVXqcPaqqOW22WtV88c4xmZY7dL6ei956V67bbVtWu+nzM5fLQ6pS9sJ +RXrzSp0cNSpHqF1oswXg7xoeipTO2OO3gSMFkwqyWwWmzzmd5mSrkIb9W0R4V052 +4SQ8m/L07yCFN+NEinDh32PHfHDzfDTYp2pF9vXXneZ84x6vcPRzRtDb1rS9KNoj +G3tt8trVSm4nKzy3R6xxhOMVR5krVhMyjGXOrVEkqjaow3ghlCSpZNWBcVaxL3Fc +Y9ZJpkrnJzlzh3m8wze+XP8uV2KlNuHovYPm99afPmu8VUqUJ47l3jmZl5eHCqbb +HO7xlEBFcBA5Jb3t32Zl9tPvd2smGycKE9uyfDQQPDS8Ltb4qBF9a8qnudmpDwX4 ++wdtdWPrzp5ZJ51IafAcnZAsPkypcqpRFBAcxIYWs3vTR50fEtvnqdcUo/dUXwei +bTydGiJ4PFIOWjex8NM77ddunuIT3rfm5Wc23BHly1Kmmj152czh1j2qUpWYqJEq +vL10rcCedpLOreZEjlnPpzu3bt2Pe9pIbbhG5VdskX49R4c9PrbZr3tVMdOn17de +nw+aNedrTuVI+Pjo67O359n1jijiSSJ9jstJAwAWh6D6ObOekTEOeh3nAr2g7ynr +8xXTOMYFcwj5xiIpx8cwczh8LfyjzhSPBt74x6zvdzHlySLo8nCSRsk0eS6TRbxm +Z3wnmxmnHMkNhygxjtJKwkU83mOviqqNjty5d4e44KmUaw855t7i6cPI8nbp5Sqj +jbpFk2djdy3yk88pG+mJSHbOXfhw58IK24kkSC+DzcXXnNW612O4HXcPOwd+O0Fl +8PvuZjsCx5376uzwIG+WIPHLtDGueXTEg7dMzfR0JnnGHYm9idAqLLCyKsqxZVXx +lbdLKpppSUky2SmfGld42pFyh9d+861rCugePr6r6xOggdtdPr4hx457uTlQ/lju +vcrnltjnbtqu9rUk6cL7e+9cX1mt71d5mJrs2PD2zySR16d72kTx67dPB2rKOy76 +78XpyWhUp8dXq0t/AX04768zWa18ejz5cuUnls27TZy4O2rxRtxcg11S6cfNoYO+ ++madlcs6drb67VY8K3zSk4YqtLvupO/Da6JNXUsg3mJLapKtWFixTMIxiMYqYxW1 +DMkpmVKMqXrbSzMt9/sqIqP+t/93+I/0n5Sn7T+QT8zf0X7f+TD+B4CttqUP4hlE +RRRTARIfupD+YUw/Q0KfxO/YVFVv5cOFw/8J24f+hMf6Mf+DF/3MXL//P7Nv+9/D +R8PD7NE/L5Y0/73/Q5TalV9v/fbLbfTY6Wd/hbKsn7vhvhcttfh9p/Rx9F7ThpoO +zo/of+imn7jnrLbavsef4r/UcA+RPuf3Q+f9UqkU/8ap/+MFIjMqlZkqslsVZsrV +JUlRZLa2yy2qaRaWWqRTKzaZooGCAwg+x/nV+FYg+fi2+gz8s/Z89W73ufUfZfMZ +rG5jSeX2+tXiLy5tM25ZFqjVUHVXHVO7t3Rjfk7WWV5Xd3zfCC7d74/Bsvzb8BBp +uu3U3zvXOnzxjyszB3F1Lpzy88Auvjt8OJfX88hg8tvPa23zrze8IBCEkACBACSe +svoy46IiKqqiKiKrmbpczNUAkJJCTVerLbqur773rXpy1c6c7tea+Z7XygAnXQEQ +RJmCo+i1VHsgGMnt6oTG4h52C6u8SvLrMP/waB4Bwc2A8sBaDwhBB/o7aeobMefe +uPi73vZt7rVet2rb0T0fQ/9rykNCbO/hd3LcnNv0nxbJpOOM9dbX3aauDKzP4RVk +8gGChiP3tin+2Ko0zGvv8rm997r3xV1pt67QJwiEFqEG2tbkdFH93DBwDjIPBfPi +1V5aFeIAHWiKoxX7fYcN7XsJzs2YByCqCB9JkFUVQVTA6PRvzz5effmf8/OC9PMp +C+ZtzACFV1K3GMDvG5p00Ri2rRwdRGfGJGZluZmRrhVWSvlPXhbVm0jUeerZfHWX +OyPb4dvG7fq7d2YuV64ePXrvx6mb41zvjnrfDiqrwFcQ9VbJCMKmIWYsyFKsKZAp +mGYZYsykKYZSrJYGZBVZVDChZKsAxJMKFRiFQZVKxBZKLJJhJTbbapSlmzRec3cV +XShD4BDzmq1wkRIYPpUFVy20DjqcYA1wAOHwq+O9r3vWre0sCbAG9xdKyeSrfivb +QO34ZArRrbCmGhJ6LPbla+t+POc5nw7qzbdSzdq7p0eJSUbVXZtq6NOrQouWy7TR +Es2HZNRu1Stu7Ysi26gMq7VS751zzvXPF5506HQJCRi6HLltz9uN8Xm7zDLmXMwz +p7a33LluY0zKuVZCe1T/O/Vl8LrrrqrrpOIUG2dJip/z1f+mv/K98HqwOlWunXPV +64nVSTpZbdoyVil8PHTcq/c4iSP+Kkth+WA/sxSm2JD/tMfEf8rSNT+n1kfxMmZY +y5UmMVMVJ8ZbwcyYSf/ThUxkMMoOz+R2qaP6HTarlv9RaiqxhI8PDkHT+8nW3ZOm +t1jbpR/acHDtXbA6Tww1EzKi2KTySO7N2ZTCkq7jYh702RpxAodJwef/IaXmsXK/ +lMbLbeD/FpyuGQfEv6LSrGVZhmSxSSgoikttRbLU9uW0NrwxmKrwfsj9zZ07ekki +Ej2irVcqtMxjTEjVXdf6P9p/KOcsyr/syrMkfUEhI+3yT4fG7atVVren4qxU6V/T +taOFf5Mj/xYPqwPYq8bLlYHT7x9X86t2frOsP+5UnmbJUjANvKTCvZwkj4T2/Xbt +J9f3uJLlxpGGJJwQ+9LUNxUfu/pLKj7vl9RwfBGH822fqJ8ukk8mkR2V7eCdNCih +4rqR/FLZ4nb6xyNCn1IfeRyyRO0OnsT1CDQ+jZX2q4iaXcThcJadGG5K+NMY2w4X +V16pdJLb4bb6ykpDJjVVSiyDx2/Ppatf7fHfqTzbxrUmrdbU+rGg1FD5mI/V8tSf +V8o1D9E2nlH/Sfrsr/yHD/OP4SeoUU/V+sYwlSp/5mPQ/3D64aVkKRGlSewWP9VC +GFgUGZCQwsROn6CqH9BPpvLYlK20kmjUqRVZgh9aaGzdo/4oxbVDFP9/xGOTxP+x +g6H8uhV0ykMME8OXjcocLSqeqxYyhl2P6/5Hp5nNLf8IonRUqUNjY/DbO5llxWJF +SKUSsy3EiYhPJ+cGHd98MzE64M+DAkD4YiKRisRkTDMpmR+sxk9icopWw4WnC1/0 +5aVMf79WMpaf9tje5Pm9MTeot7xUVJUoSR1ibG8TG+mE9pDBpFKsllWe3HKtI8x6 +SfEmFttpJpEsCWDSlS/NdtwJ44ls8MVRi1bmLU08xzI4bQf8lyf3o/X58cfuZXke +jA9K/Wkv/oCpOX8AoptO3imxpWsWZVKaPlFYOn5ekY1bMWGWYopWjCWGKaLTIGkP +wFSZp1BRTc+o1ds/D/mY0uThaKlVSilOHlj2XFcG5JxLZUjayIhAAACEhJTX703r +bKxG0kYoRihhijZMYwxZWGEbWSBqVDlZMpZTZStskllbfWleql5taVJKGgnkxRrC +VSqptInylG2SrIwx+wwoppFCiU2sGh/NQbbQhTFWSmMltqpy9NIxK+lX6Y+UYTIb +ZDzMDN6G/c8HjdYsVEVWSZxbtU0dN3q1u3bFRfC4kqOpVSPLo0pZSIiQOFnZ0d4q +sQkz4Qqa1DlekfEJApicdLA4a9OMxhyvFegkCmuM2yHU5NScI25iY4U24jHLltts +7StNCk4frJzwu0Y6VjDDFk5RppNKqlRASOcpVq3MyVYiVt25mTCT+oTRDRPR2CKq +KWrVqlUrlqaNSrjDopxKbp6upXldb1PU9s4hJGJA1VbLTiRJ7eok2sM+UHLbthMQ +UFfLLbZVqqyVK+p1Equ3tpthzYl7KWLEMTEq4Ll3YoV5stLbid+m7alklmvcxMyY +aGFGVGL1wYwx7R6xjFy7cn0pouDotHyZkzo/hptTZOkPyO1emWMxhjZLl04IdDYK +mkh1kK4y2TMxcjHDmvtbZMWE+zDHXCnuD8yQLIjg4UlcKxjHr9gopzYxfuda1rEs +eHCK6OCQ6xT4Pju3n5/X9kkiEj6cN+/vl+uaZ5gYN/g5JlAUHSDiUhoOAhwMFMVB +c3DDHMN3DFulS0xrgWmW4W5cMuZhWta1rW21tbbRzrJVtBe+ulvYM/s8dPjcuY66 +qqqisgnSPat2gVwbVEysKVgXdk1QJsk8RJCBD2v8tenlrnM3edFeqa8Zu7mq1raU +mEZP6xTGt6zMkdvq9uZwdp7PTR2nSvKidMcnTDZCbRQfLpsjVtrN222z1LI9jbbS +Yde7dtk6DgycBMmW9OTcaTFMfB8NtuYiTvVscobNGKRo6Wb4zDniY3e2mSmsjJQJ +4EQ2vqQkRVGM8qYh3v0q2rPteqmFz2k1KQNMUOrLk2hBsGYs7NRoFGZ5rKHrKVFW +Up3oJ4GS+bM2pvedTh2+z59qcemFaIM+lnMKY/XLM2leOJtTiZEVfbeon1+vwZOB +hQgviaCMyAjYhRqyLmywXa6sJtAjY0ekbBVdHErI5ucHJgQ4jsRIimS+VhHvLz2P +o9PoKp4fLy9uDHljDyKyG7cVtjlTlwPJ2wD56Xk02ttipijbGTs6TRK6R26babRK +3K25I5U6OTolR0fLt24J9HaeVeHM4svhpuNNlYp5eDRNLKaWrGQiqmZbs0Tlo8Bp +tppto4ThGn0cT6OnAeX+R8K25e3KOzaUpVttKUnlUhZWFTasOmERzfpmb6O47lt3 +Whna6EmiB7nAKT0eA/sERTa2uhyCini85zJ/DpU/B/+m3fJ/wH9Y9AkiPcclOX2Y +n/g2elK/4y2ikYKwUzMZcuJVFe362bbaGluwykCmE8ysyzLFrmryuvj1Xz/S9/AA +AF15cn4TbNPgsRs7cOFV/dG3g0p+7T5dL60/tdkgpyzk/3v8imkP80cFiv6KUxX9 +LGz9Vfy9n0NI+HBMGjFPGRfU20/oK/wT+7+V6CiR4ktktkvJP6O5j9KtpUGP1T4k +kf+7GZWMJ/d/NKP8Ksq/q7hRyh+q/vOT/iN1f/NGJt/f9yWf5H9z+wKWITjGZjP2 +GmInSyTkRo2qVStSThT8HxX8MximI2dIqo04dIbQvxbWO2MVGkVTxHSI0R/h0eev +LpWSyT2p9GP8P1y2m2c1q8325VIvE485eDI9AlOHKGBw4JhDiv5HUmnSO00Q40Je +rcSSy5GXLGVUp2n0eDpFE6T4Y/r+er5YqJai+n4MphhmLSwD8QKQoGSRJ/o+6YvW +aSVmfLS2qpnMM9WmHTRzMJxy0qHVaVETOYZ1ScEwOJ9g0NPAmjGk0rStNtsbQ5MG +2BivKYNI9Fvbiqv8b+qqdv6PL9GI+O0lco7fpI4cEi8XLlw2kn5YnpWFTwgTabky +liH7Ax+fy+323r5BIEhez17ddXMxVVQFUOdlCkEiQJigNAR9MV9a+Xx16vk7dzgH +lDoGcCQ74xnfnz3rzzvXO4dlaYNK5NOUkh4fqSweoaJidvSK2eXFtkPPEfCh9Gkm +XRyk9PzmZVzMqjDGleXlHlJE5ZMZSrZt/Vu5MHK/2HZNP2ivmSPQ/6qw/Hu3mR+n +CmQgJH8fUlH/NlVMZjKHCWNsfyX3+p/53h/1MZA1UFrEx/2ManCu/BiYs5NIwfyV +9hsjSn/V9nhY5PhjI7Ullm1JVllLfJtZNrGVSVH0hBWtW0eniUKWCpQplb1tteSG +W0qTK02llaKdJIwk+rhGI29xHeDU7WszdtKrDKsoRP1Geg1MyhiYmBApJgHZ+sFf +yDkcXDK/ydg+VJSP5sSdLVsKtSHjkwmzZhbIuvbvTXnHN1BiMYylZk7k/LKCYDYH +X13JBDq8YZURZWoixpkaIyJuN7+dTwztXv57+nThHDDHBkYhVKpPSK0UGMMYTbsK +VqDzx4I8qh0+G90AAla9VKVWaW0s7IZmGGCsGJhhSnC6DSPacu07EkRI5jWcLUjw +/d2+p5LbfLw/ft4tspaVjDMYWjCpQqLBUhDSjgT+k9T8hNA7KVTkkn2GnDBRs4gq +HgJXCnB8vaJ5e0/l/WLbZbFLFUpVRJECIT7iSv69sHJkTAi1mJkzExpMsxUqaYaU +miWTRpNtI5UcttEXFPVdQaiwV/wNOFTaFSaL45y+41lrMYcvR0CijhslcNI/0x5X +Yo0kXy7cq/RMSNtOU8qn+U1IPp+mXMmZbhJ0PZ5BISOpVSySG3jR/pLeKmXKxwbv +w08D+N6WzGTJkSeyhTax4Km0mkp+2qVI0rFU2n8SvhDnkx7T+ba3mQuaiT5PhZj/ +BPIPTKvh1If7V05H+Z/nVSKcn+SK/2dX9F/Uvj+tYktW6Y9SJs9U8H2+uGZNORKn +w6+2/Cqtq2vpfTblsuXEmsGzllqypVLFYDCVIQ9J3NuEfwGnxGlfyMeYjQf6WRG+ +x+JPz9kl/QyP6sMY0xZf5xV/I/U5f+p6o7h0sRjp934eHA9K9T3ZcSNLGkno0CQk +YVp8JT0vFuFfq7kInwp9TyTE+k95/GX6qj9zhqP1y390T8OTsAJxZv0pBjS09ndu +/queeVeI9GunPNTJtIrybqni5552x0a9g4GMHRBAAhHYgg4OGOTGIx0md24x2cp1 +ws56tnBhyqW7W22GlI2+w+z4NJHpLENNvsSMmLVcLMVj9GSBNLTXNtfwxi4U4bKw +MhtuWyY+2mWYp5ttKqpA6paj8vKRxEawvhY0NIfgfiH9z+yajt60n97P+eZ9rS0x +W0+VV/0sP8sevxzxZkupTbH8sPl/D6tcrSqnhp05PlHCOok2cFqHB+kTvuQ+xWMY +xjkg4SNqTWUt19K/fat9iuFW5XN8JyNMVvGVP7r82PqvjL7jtfwP8yYr+QqSfsJ/ +jvt2zClUVYzM/e1n9tRN7Zd5buwMVVKqRKoVR2YxVWrU0/hHBU0sekk5eWPDSfeZ +dQOaqRT0r4rFtLHeZaEkiKs8vN+vcjw/CGRlxRVkq1SPDFexPt0FOvhPFuY6Tbab +lve6MycQ4l0tzYO2m5eZhoWcZUOk7NTTLtwdLblt25Jy6YaTDpixoPYKKYtMSx4V +/I+Nn+ZdTDBNJM+LfQOkttkfVOk7faSBw+y2ei5ZhaxgYP9nmnNi2FstI8cfri5j +4bHPFumZbbbybHMpMg5WROgw+Q29S8lhiiGULhSjSdtjNpsyIlsyhYqxbcJrYw+o +k8CH6HRjSvDSMVFQqqko0xiIclqrGrAw0hpi/ouV/i2foVy/oK1INsn/LKzEnZt0 +0/TfY/WWsZMkwqJFKpVKpSGE5kJD5cnT5T6BPRj2k+rIH3fSdvy2kEdD9W0T4tsh ++40PbR+xRPpJN8azaR9OJJrfGcJHGHBw2OTGMmHPduPz+ryTH3/TGTMY0bTThPa/ +xbhjyxUTFkr8JJwYmivf1xmZJq2ySlSoJPBIfK/rASBSF+cM/nZk213bMmBX5laT +Tg0VqrbakxFiRzCeLg1rQx4xf2Vq/pUjo01d0k/Vy7frMy3JIUqSKj8lG44ZP1xk +y5bcTEsHL9YMZLGF+0n1bjZ+MHj6OXau8pg6GVof9Cv/Y9BbWvn632UMYJoMElJr +W1JQhbfu5MliIQxxyxlFWYJJSo/lsdkj/9Utg244/f72xHsUqlRVMGPuJWipOBhj +qEkxqGNgop68j+4/mhRTtlWMEwwuUKKdDCxGGldP8X8NFUz85NW01rD7NpifMq2W +o7dpQsUxivU9S0/zYuHDin8gytmwSEj4WYqVwrKqFn2kfvYWyx06X1X93T+Vj5iv +X+C0fH6nAMNqMKFVXg8nuEYKKk2Rtat7V7zXsSJCUSSRT1tPuvGtNOFnGGB1Pnt/ +MW1VDT4EQ56UUWLFFBZqjHB69cXANNLJbE0k2zdlNHR0OU056txtowmLOO1WSsa6 +mpA1B7TlxdF+0uvItZVay3b0whrGdccXinUpEidgaTHSdubVUqqtqqabViKw14Em +JmDeVXXLyvKySljtLGMq1t/wTEMgWhujLDJRJgxkJlQy5UMlB40srBFeLlq7bpq9 +ptq0rbSxohSrCmSRMyzLLLMSFMMqVksswFVkqTKplkqwklGCsCyqplQsWLGMZZmT +JwN3COMLWLVtt2fFUij5Hs/SR03sfZ5nglZWZjJSqn822RTBpyxvWHlVKjTbGVtS +KqskrbRpKaRWKlUqSk4VwY4cYMNTGkW1bk5Mk2jbg0RUmojT0wxxKQVYhbbLZbFB +oqok2slvxSlrqul/g7aXHwxix/68Toof7qkpOaD4wC2yq1EwXZiapV6/hsyJvBiy +EnDHppUrseSqqll+rGDc5R6WrvWH+G9by3kboLdJKq9H7sVW0OfMc6vWl01qZLMZ +GXXa6QEItcit7KxXTeedbF5N5WV5LJkt1ZLKLEMplYlj+iTA1EdNMJwtIUTETRhJ +/Shi7iTFIxhiMSWYFgxhilFclagZLPw+zk+h+o0bMSmKxOFfTOrm2TbWXbWV6uG2 +zX+jEamLH9lX+6Yr/YLxH1w5c28qRqX++P6v9czJ/Bpq0wP7uyQ7eB+Vf7n/N/A4 +I+n6Oyqaf8ybStl8Wgvg5aMWKcsqRmLCpH+JHY7+o/ZUcf8bQ0syoa0yWdpVOGka +ZNpjvIUVJ+ZH6qhX3fZFanSyHdkYpGWGxtjGKcNMNKwlSpDgp8KdD2cj9bMv9zY2 +4SHDkmkf2xkDCf6LKQfCpoFaOJ9BoH5TDi2/9rCRhPqSKlR9EcmpFLro0rH4U5fo +dOMs3lzLMZaKYNommiU6RuIh0nD/kT7lH58Cz8XLMuKhGo2V06T/Rhf9p9apP5P0 +/xq2rWqv1erT/PLMqx/K0O2Dg/csyqf8VH92myX+Z8BRTxbZHaYmgsP/J9QmCR+7 +y/0+qv0fCnyiPJSHCaH4SEiYfT7Hsxa06QsXGmMqTClIxIpRFUn8jGqv7oxG3iH0 +WUiCZpN8b6/n1+1fkq7ffeV5XQXGJARn3MyZKRCosJhcTJSYUEP9MYaSlQxKRSo4 +T/usWhVI0Ps/HwzGMyRhR1q2WLastVljMZmYxjw3K6VX+qMduROGGFymqf4nekcJ +jClisYLIPl8mk0rZwHtB+viyyk+VPL1HuRApl/cZMDw+MZfZt7Tx7LCpLZS/LK6S +W2SkqS0scvTSTnLcGk28PRKVpMSUr4PizlmNNE8YGrZq/51JSfi7Ts2T+5Tuf5cL +UaX6LUnQaR5PlE+ZyTiUqVaOZTHx9XDIqqOjpwldJmO7TbfS5VtUwninQ/6Jhf1N +p/3sSnS7Y/q9Btj4/60tF5xmT9MwRXPy8PM4fiKUOh/FVVREYiiQhAhEa3qu3nv2 +d7+q9S8O8rb0Bs06WlE0arExG4ZViJk4YG2Gl1NmRsyoMpaZV7PclFEkhkSN7T1+ +jx5uV62pGsk5ajBRIogIzWpucxals3vLLZmGWmKYUqcpZRpGE2OC4rasjHDE4E3a +VkxkzLZJSckySoFD8JNDSmOGxNtM2uJgwFUYSjFFUqlFGExq2zQorAowoxy2rlV/ +wdJPWk8RjHBV2lsFjhYX+gysyZkxh0f3RhVg/4UcJ6TuScH1VPy29yH5DloLCqpU +qInySSwxRKrl+50K0qqo24TykjydiqiUngn5KlPjr2zMmZmZlXDMt/QmnwPDD7q8 +JHcLH4WjVHYxiwsKx8JjVH90Yz02rRwptHkY4fT6Ksmn8HZHweLk7kPRGKpyh/eq +bPRt8Jw9H0f9riJN29Ik05PjeYzM7a+qenD4QbH4OfJwfZMB9ytJtyhXEiMJiVNH +cUPwV4H6o7H3fBXSflFn+Sn3kdp9U/HhSqjtSP/YlJJT9D1KWFG1D7Gn2HR9iD60 +4ZhiiTUjaPujNmxMUhRQMUxVYpiKFSJkVJXJrRuOpD+nmZJ/LmR07HlWk3VZMyK/ +m/D6vP7Ztqy2BISPUCQkdu9bzXnqeuj9E79X9hjUSttuMzBuJcLcpmDmXFzLmW0a +Nra22stGjRo3xd71/j7CrbuqNuCV+Pn7RiTiM9JJIEgAeHxJdEfM80MFtPnBMxsr +AgcxJUHBQgNneHDhd46b0pvHTJccMlKYUIk+5RcOXp7Ryfl0Nnc0n5iTGzpiTkxo +FCf/H09mHBodkFJS2Z2cs427TqZEjg2XKgms0uWP9EwnyRTKCH4BWvY2oHETm/gw +zIiIJE4SQGl2Ck88xdoqynSIaAsnIZAHItqcqEkc5usa5371h9/ghm6wvaD++Ev8 +O9O1aUzFPwkL4FbXvIfOvp571rp7GmKUGlYdK/70n+m237Stjy2V0w2w6YfZFPh9 +Hg06PAx0ppwTTGGySp/LydK8/p8z7d2Zmabu+zmXHZJtVDh9axBEEQczHKc39VaV +T4x8bLS/TE/iYRwjwdM0rY+rUH8HTgw/pHI4Jporpt5nzbKmLJH82WyJNK5mnJ4D +eABtlKSyi0srSV+jHaGkaf0oL5Xqr49f2cO3KPHdVlOlxT2Lbotv5H7Pq5pfnuZz +/dmMfvq7Hqnxosaf5U5j9bbH6/WKPbcO7bK+EPh5IfmR4cj2lOqW0RIh+qOFlpQ4 +QPJP14ba1ay0a5WMszhMV5f9J609T6PlI9nB/Z+ltJpZfELlyFYfUpiTUrTJy1Ra +mlkyy1arGFKjH1SmRptiNFKlHlOxTypVNuJAVJ4ErlpVbYWdnGukOx25SUDvhmkJ +SKvuGWZYZZExglQqFSfb9gSRHe26lLJVfZjBJ/oiPHr3rq/pJEQkegQkCw6m6pxf +vmXePsQvn9xLQI6KSRQIAG3bEGfh7NUKcK53UPq8OHUkcacJyvTMdOk6aVZtbeXD +JrDQwQRBjBWHXQ31cy5mBlRZ6IYlcEmEU04Y4cGEw43ZacPubU5VthDlicPuw5tq +27YxgrGOOrbLbUDHk2YqK5Y+iuHLp5DT4+JNH2/Z8HtbEa9pifS5hRZbRbRJLmJk +tJK4MBO+IfGu7xq/hYNWnTpGnT2zPJAB7pIdsgDnjwae+mHsZcy3KXSR8U8MMHx3 +67L6cwtaVLbW0oONWeD2UwAhlkYAd9PyGVl2b951gXi5PVcb8QkPLMTq0gBWTz4K +b75X2bmGXKOkz4+PNebXzvhX0lvnW92FLBBb7Y5NtIVito4Viq+U3q3G5KxpPY05 +fL8uNtqqVHwkaYHg7TTw5Y28GPVWo6bO3c2dGOmk5G3CG38p48S6HjlsNF2N5UG3 +rhMMNpgtTb7iCOst5UUraeXaRgqdGFNmIlmjFNDbT2JT0+HDbb6fWUsvKq43XF85 +mSaaDRzytq8wj6ofRCj5SpbawpLGJ941qyZFjLKFSaYxiaJLLaQhJJAkhvLrtqoC +ttttq21FiQaI9vwrDxA5e0qy21HycDgaRwSPs8Q8LbbbaEEqJAA+29r5V87e9va2 +19Eb4CSiIivrXz3xYwYxlsMdqma+mXMuMrKWCsMVUFYvUsRaVppRgxw1JXOMb3mL +yozTBtdtNjDDApBMAoSHCRowphkwjDBucNtDaRKMMYKomhyNY0ck0nxv7WzTGIgK +aWfqbVi/VMlGxYTH9BkkfLWrfruDbbbdSUqaY2JUcG9pYR+O0/p+5jB/JZUMKxWI +qpUVIKVEVQxZMcum5tZISSZskAD4W+H59LNJklKlfGlrqabJQptdXKqVKsqlUqOA +aRSiVP6PeBAlSQJCTLBC22236NPq6ejHcSd2rZE7YfVPKyfUT4b7fr8WyefXfb6N +MyWzwG2mEp4bur6pan33d8BXGubpOl5ed4jcsltUaNEoRiM8GkA0MS2li5l+V2vw +4XIm74fHps8HR/jS/q+HQ8pSv0K84J8+flIn1SJ6+UsU+C0c9Aop1HStKsYGMDKx +VVbVX8PI4Q6YTdhxS2Nirbpbf9Rt6er8OQx00quK/pxvKLQgCMAPno3LmmAsuG5c +3ARCCJ9nkfLTE07UWQ+xE4dfZtP3VPs7YjtMjphyP+UhGz0R9z8FYVLWVdq/Htqr +8qLbe2t9wr6vumCB9f/1f4sdo/2GBgKKf9A+qrofyy5yaOmGMYh/zf7gpXixGz8L ++5/xfK/0YL8tv7GR+gqTsvxJ9Ht9VkkLIxYsKqMPDNH2Sv8q0SrVcBPlIf3fwNJ/ +tUtJJygp7lJ+qPdeOJP8PnGm0/cbR/Cu1iq/DodIqyKlElfh9ROO50qsVPQ/KWck +mmleZE/KwjD935YnpOIH6pJJkrJ2Ojg/KkmBVi22RUNKkxWowxU7iMnlaqlgNpJ8 +pj7iYnkVUWTvh03PCvJ5UwWAO+/U+8rwtQ/m/pYcu7dSLkkqlUIKb4AdxPxWQX6d +K8cR/srlNn5QkJHSlU6YlWNKsqyjRa1ZMrLLMYBj6NRJ0TlhNqV6ntwbHC0tcGIM +SikWx6q/J86IAjICaXDPuClJRcO8kmItQriaGCUlFzXDGSLiFQTqmfrNOzl03Ole +IMWrYKKbCrtOGYDoM00bf+1W6hV/xyoRH9H1kIxEKqEqwhOh0fbf3XzNt1ZIaQ/Z +Tcp8CVPCpx/rV4xb9LJRO2FfAhRPU75RFAhEnDwrLCvgVkHFpWj6sNJo0rweXtOp +yT+x5Tl0wTwqLD3pVXSJ+5+RtPl5TqEhVD+w7piTk2lwGKf1bfq5W39Vr75V8q/9 +/wWTBGo2g0WqS2itFWqKtY1WosWrRVYrUaxWiqxasa220FtqxFVbQaNUaotGxFsb +axtbSaLbG2tYrRrVGoitRVEa2iitFFbRqi2xWxVtitrFaqNrRbGrVFWsVtrFqoBZ +kqzAMyJmCrMpSsxarGraooi2o1WxaqxYkirFkFgSQP+X9/8v5ZP6G0/tc4bk13k3 +JrvDkTm8Quc3Qw/xo2mMqVokQel047gDu6KK9vXSItvS8kwSVIXbC5SCkWVJiFZg +hUtoVKxalLbdMKjlWErKlStSeOmTUeNgu7o2dzriub3bxvGBNRCbu64Y4kT37cPB +IVhFJFkUhs5l65OBc/xyiJn9pvMTp04GA55Yats2p3krH/20yE1IIqJ4GE72HU7u +YYM8Ubq87w0emUBOg4KzHejc5vnlBVjwWj2JDp78uxUmIZjGSSXv2+C+Vk2buCu5 +waLzxxtCqTeYuYkzGRiwWkxWMbuiWxbDiVZW3Hey4sc9aW7DLDfXXvBO8UcMOrE6 +ZHKIJJkSMuZM51ZhDeUpVpMillJZpvURzSaUu8TxmWyQ4sN1HLGJuVCyo1rGYzbr +G6nipyrXO7Z7vS43pcWFeb5bU4saY8yVux4640jFLmIWjVTaVtUu6xHFmprC7jGK +0oY3kblGmTI1k3ubEQo4klMaSc87iGrnc67p0dLLSaMM8WbgykoqxHuhUIiSVgcN +s4ReusZ2W9pwcOl7l6OFfAh11ZNRZnWh576MW2q1bFKxVnLe+3xhp5sO/llybe2u +6vZwQiJ63JuaKKNCGBLFFoua715rvMY1dJZyLBbrOZ5XV5qeIKQWC7JDCltJRnjc +MWVKILJ3QpiLVSjwUMweGw6NEzJrF1i1Fr4tLGZjFiWmbSyagjBTJHzlDjD4ecQ6 +82snBkEBIfIt4B0kgWTyUekmpzCiQ5yh1wM4G8SeOG+NNwKdjDrIdZ3nnxc5azJS +gWIWMigBFTrbdrcC3d1FulyStyYtcJGJReZlFmTVNTS4yPGPG6m4mU4UpUnHfhrr +wWZWNdRvxxpo63XA16Gk8d9EE0Xhw0MmKiDFJNWV25mGqnfPHiSZDmy0tLVotC9m +E3s7B8efHiO2NasFiqCyLUrMVTLjOkidBUijvl11NMuFdid4Pnq556pj0CZeWiKi +RE4EFhe7nIB0MWSoVFVEKlEgdTKChKRIxmMBSnnMiG9dA90RI90p4oXnQyoVOzwO +XmFFm7kU1EJfOeLl7pwCnXR2AkONIgVXEixG8HO3zk2uUXZ4KDRPGOMQcFigu6MB +AynwUr5tMSp4Zm3S97lkYwrKbmYdS7N0thbaW8cMcuPGm2iNlkxeVSsrDdwwNvjm +OMsQWV0bYCzEe/EuduWNOYe4t4neTnLWQ7yaysyt7Nq5jW3w84tro7rFbxrm3ROc +yItTKia31oMVVVzMmKibuKkZYOb3Z3UnBYN1JxUtiasqwcnVw0qRd45sTvWJOrIZ +cp3W8pbyud6rMm8TWW/KOlHvrjW2vNJMEmW6wk8+aSBDqHZe3wLGK4+WYxQYao+a +FMLu3Zia4DJiYsHLW8vWVSaquNQVVUQ7dSGGWs7cgmMXdseVDzwzwgEvmRsCB5fB +QVQXq0Zj5wJrB6UFaTgUTjAXmHe6AjIdsFIpFIYZ5zPJpMFN97axjrOebjescSIe +OlxIjJYuYzMCWWMVihKxiTtW+9a1edTMrhldTnO8F0E1nhOr4yVONeDjTro3vk4e +VFXbfM/6MUFZJlNZZ+RMiADvEl+AAvwQB3/wP//fyr////pgQg94DwHe94+e89AU +H2NBDuwvr6eX3b72JJyiefd58+Vd8GQIqkiC6wJSbBm5uQAAAKq7u5JKoSaaqQKQ +l21VBRUlVJEKkqkqklKlVSiCooVFg+BcYAA+7T5I+gBL4hzdzp5AMgOtGq4ADa13 +bYpbuB97AXvu0OR1329gffKPus6EiQIGhBMJE8hNE02U9Q0NDQGhp+qYgkgCIklT +0IaaZADQAAAAAAaeiIiUn6JqJgaI2hNGAA0Bk9QAmgk9VJJEyZJ6npNlNNBoZoTC +NDaTRkD1BiBEiAiKRKekw0mIBpo0aMTQZMjI00YIkiARpomQhkE1EfqnqNA02oAA +Bo53OJuRwkNrkuMUJOhNQiCKMocWFChEEQrUGVTGgg0sMW2bqgkJBgahUxttdb03 +1poJEQAhSSeqS4RwucrgpgGDRopQUVIkNExkDQSGATIZGCmTCKIkUjZJZESZSaMx +BmaRQQFlNGJKRIQihnBz6Pqb1dXa7ucrjgmcuCGgbYNpgK8AKEFIr8o4gKQFwMGj +vveHmstx7CuEmmgYnRQhB3iu/mzlcrWdLQASIoDpmY0D1WpCxNppg6VoTStS8btY +ssBpPUaC7k8vu+aXzwycRqJj4XNyCaEL8W6PxaWpQ2NtCG2kMTE6TpoDCHUaLpoa +W1Dm0upHlZaDritXaTgmhQQNtsojjagMpMIthjtQ0xZUttPCv+T0I+nD/mkZQ8ZD +zjB4ZdHI+/AJQaEvDFvWEt9eecKhyJv73XRVYff5934ryHcPuxRvk/OTX8AQBAXI +YIooDEBEg2yTSZqtrWliJNFtWstQg22mzaljNU2WpmzNipNtVbdVtq9Gq1bKqplA +FijAQQWAEEEFi/vVAFgAq0IILEWRBPH+qAgv4VAEvYexHwNTvPzKQKnq9pQt7ith +SFQE3KoT92BcQS5rF1INoi0BQOEBIieUUBAgVIw0feYQlJIxilA5IyloT2iIDEdI +qoG946hlU0gdFhujgx6GOFTZJSSpDwQuVTcllZOqH4ZyZC0BlmkC4cCwsYRI2uGk +ouXauJiysgW2UY5iFJOlmzOCGH4iZGZYXJxDLdJ5I+okgLjdFcGyxGcTuXzC2QNL +MmgZDlHJwpxaWwzw0jjTdXZYSK7Qr5tMVE1KLGpqexpkXBFICAcNsKQUZzMFIgVm +knN2YKiGSuBbRzatIQgm+KaQZAS8uDHTnWrudlkM5iRrvStxKFwKKVWkrxS0Gc5b +46jB4beDQDNZhiAYwuRpE1mlIxJctXj6hyy5cxgiVA40kzeEpxsaUJjkvd5gjFhh +XMuSAhJw0YIxgxczl8mAJ0klHCWrkkchWY7a9j4Nu7SQ0sThJQxDvI40wEU4mYE8 +5vWPNKDdBTZq8WAka53apCRSSNpCqgUBIEqkKIRCCLDdFlqlxAohLqDOd5oy51ju +LwUEYBLpqiqzTi6CEFgheJY6jhnYUa1qiwwzdN4qAkZJTTMxtG2YbaURoLQYUs8E +LNMt81O4S4MhIrqC8Y2RJqiBikskgX1Ls0fwJ4OCaGBlINkgmKE6hXECwCkyUOuw +dQqIBJJNGXYw2m6AgaYHhuJJJCxy4jkmrBKJZbYWNXa3ElQyVBKsZAmKeWFLmqL/ +aqWV6VDzrw/jTfYq6/bw8pT5+4NHZ5DpJIDo3mpeN6SJGMka7izeeoko43C2Epfp +g4TpoXY3puxOTFNpHLlJkTMJ/cig8exbJ4wXM1wqI/cnSPX4zRN3hNeGDNBlDPCc +RjKdSlEXMcLYVo5zrESzdhn5oQgF7Vy7d/xXre3+0a929Re2659oOIpGmnWprpit +uWOpOh/bvzdU3UXeNVH5d/XiT9umGfzpTP5/9FU8nQ2l+WGPykDtzW8+x9V9eEZL +xXZrntkuw70ekWyrvMhHrucZm9KfynpN9pZTE+0MTHTPffeZ6Ne/Z488WceGj41e +xPJ4/IOaZmtZu7us13BA3KgkZGgZhXkEnmKKSCdMrtunVFC2hCzVzNmb4pa9MrfR +5L368R+A5cTbzcuFIBItqqa9ZJWrv440HQdtONRRNMqQLRvCoXjJsHsNjp3oqjTU +nuUk+tSSqY06SBeONJjOPZlitBWP2Y/a4myrWhja8Y48ITl3w70cPAUvOLu3N73x +oNCWxRXKJMZBOcsIiYNsbb6IqgA1MYWCyzFLX46tyDIsrZmBdV11KBpmbcG2jSmW +klZqbJwQmXHcfS+kqBbvzhoFYwQVevOaUWDtMkiQ4OL3wfiGhdLDJF2oWKWCGRKi +hQlR9vBWB8QPr7h+/XlnwgBkZ6IHoruquvYHPb3d2c9Vu1qFs4DoTfPOZy5eaTfG +EbeW2TVkZWcjbLyy5fXm3YKb4ufb/wb81JfR8qaTCaWBkN5OAgOisFhTR2+eXXkc +3pGtx5da9R7O60uzr4vD1ctQeFni4kxCBF61C2yR4amYWm6emxGhMsrBSNygglLJ +ju41nhlzS1oTvHIJ3iKAtp6aslyLp2Xz4u2mDjOOFZxL3c45xPx8u1djCMsttzHL +vlwW7OA48Dxvhzz0vTvl3lSnfgXC1bTvQOQPN9u0GMqUZDiUu+0SqNTncw4JrOJd +C5ae2h229JhHJcsamPYtGY2nqSYKK7ZkCWcOaeo6wnA5uE6UmOicOKSlx01thtO2 +U5RWOvTw6+Fysmd8Kd83F6zpjTvnstmbnM78jhR6FmzlfenLa9NuMaGgsxrWUpGv +xczOq5bXKtNQPDHEHk5QkHLA7Ei3HDC6vuGTk25mxRUpKKkrlGpasCNz44/k+3tD +wDe5wjgdDHrPy8gsg2W5zWGfiMkjEJmgQcnm7BcPMOgmPy6pIvZOyXeDh5m5rpxh +u2O72A7GexroWfc4Pg/Hs7+FoQ8r9jIQtaxoXODg+TR8z0PRzeAOoeeRuMi7hdOS +81h4GqNyguIRmNhQKnFMJWaZLQzV+urXgFRWKiY8ZIxJo6GynpoUkgAnNj57hPkk +CiIEgKoYhUZF/EFX75QYsoLiXAfylQHsFzFbiMlVTCoUCVRu0SOlVOuaqN2WvP1c +77nObXJxriiMINSQogBTFkqqmEoC2VXvQXneIkUdJiMdJihT4fO2rWLdy1y9kXJW +wjNZBRy2pfGS/8Lwdy9Cmq8fh9iYjz/X4mvTlzXpX65f5J38LH6DNGfi2efIIvIZ +10n5NE1kN59vlWXnOfKiq7ER8fWpiWWAkhS+t+LrfbL2atTnX7FlB6UvlXavrdWX +HX4WKTvtWbyZlXdbue7pYypbJ5UnERU0llbaJ5ZvPfC98s8bTLO12ZXNItLa866P +2611pp3tR1vrwgjnvvzhWTmUw9oSQv1dZnBnZnRGfK8QzR5ObplZCCc5ujfT9R6v +JL1s8iD5lDfnIokmLJsX6RI1PafLCcKs/Tg4AkOMBDBIQit/raxnAKMUBAZBr9yq +s1/QXIbVpWgIAgmEILgYvh0yWOUmv3jAUfKBfkdBqK0fOeYVyHCSZHQ6VMFk2HIr +sD0RNdD7WUaPgRyIZcjoUkiB+YRfCWIeIcpVQPm6Q1BfgQaJofhQUEMgZOGDeJA9 +IPcCCRV4AUgAYPdw6IdQASI4FnXKQHmcg2w6ALxIMpE3ZaAxxeCoTJ0HTJEbxQOz +vOl4O5xZ05zeiMkPQD3Jg7lQsvJS7KCkLTfpQmQlEPQs76EiGVGr9s8U7Q7yKUh6 +XQJAgcEPOW6rmfKxk0kYB6NnWeroUq8BmBHowHKGqH4gESifAlozD0+eQ0j4kT02 +LZ4WaPDW2w+IYtHZeImTcCWCRQLWBxyHfijRhjIpsF6jmAN08BB4SheIvMCQv3O9 +IBxhPz0SkvgHt3FCKbZGAMBDgJArIhI9BSIY8gc5jHmj+E+p9S/UAPryP36WOYnx +34Ii7m5qkMm9mPRFNHfnTkYoj0GQr4OOeHrNeCzAYlhhc5B9Dx8dhsYr6Q8qgkWn +ZzILYoTDz4BIKReoEWCYEF+GtaVpIuJ9O+zUiaxtJE68pepgbqZg0bMuPgcmlPnY +g6RPUYjuCge0Uj8+CFpsWlfLghvvAgHOAUAaHOuBCwTEJ1iNdj0An37bTZlzLF7r +i8nzHeJWS8Y6zJjrLCcqH4JHhRMidIZSkw8EIub4C6LDowDzJO0NYq0kILgV0Xug +kCCZveXnig8iigRgdCLAPCpCoaA8AMX+M94icjIEiHwoKCEQhEX3HtmPnzHMo4T8 +NPcs2WZJYUlDwPX7E5AKIDuKSJ5wxZlKKsPwLwU8KDrAPQyZ+Jla9ISK/IHBC8hL +AJi8KMiPQXfpqpK+sINQSQJGgioXVwYxvvIhV0sJEIsZpIely4rWA1B7CQPyZJLQ +OahcYOxhvMPiDui49WezMfDbrdT686aJ+EQ2kJErap94yg2ISh+eqqB0QQPpBERM +BBR+wkAAH2CA+KJEV+wAFcxBkBfIpkCZ2gULsgCIciHoB1hJQ9gIEguUgoVulKgg +ntUcGAJr0oJHR6UMgdYB4JHEEfADtXgvEGyLL8+ama2oQMkPuYKfH8tziwAEEz7M +qXYXsAoQHsjwQYik4/RunvQcfeEFs6nFYUjPo+WPguYCD9BY7j7j/PYGCWLpEvWu +7/IZokD080Zk5wSD1AVqPRbsHEFBSr0sXtjlDoV5UI6IgNFeEvHffv4n0LiGvfQ5 +KFaH4Gqpz0Mxh9UDG/SNxy6H6DRQBcV+sBle8GiGx3QAXgqTMlrqSTAkr2SSQEFV +9QEYOxHymNgdkGXw8Y+fRsHrgXw0GR09kMpCq5MlDiZDzgGOLxJuHDgRqQOet5Kp +ezggkS1jSF0MO0JZ2yqQKSLF7UIgkEZK5OM/HYXOHJeOW9vBr8HHbkuWPxox6fms +GumVzMqBnqecSQsuBDogwNRVQM9eBnKY0b2gZRHesEG2rOE4hkmdWB6V5y1KgqA1 +BGhikPMUQmrL7akye+mkvllmGuOkpMekkiTCSRACmrhLIlulAF9N5rthlpQ/XQkp +01zssYOxeeIYRSTWbG2KBe2SOKBXQ5DU55aOtIvBbCk+zYig+CBkc6wH3bQOiaPv +iscLEZjILNSSmX9OdgQXgna+HtgT0K4DwhmvgWOYSV0NSQuh8OHmg/ExtAoX4Pob +q+dVHoXJ7hVNiGlVA2bGEGEH1bRIRBDhCQDs2oQtWIbppQHsVDJEQ2qoEALIiIJh +iA5Ibr489zs18KLdIk2wVcpFRBx6+tiaCCj5EMxEzMCxQyTxJ8gAo5ZcS4gmZqKG +0IlJiAbs+AEAgERPIieEQN50HzB2KnFiLFTJR7Q0qNQ4QXyCtKqBvJY82LSiEDtD +SMDyDTVAlMx1KR0pMIRUiJ7YF7xSGDGU8MEIMgEjhWgojVGuXwHA5gtwUckHgZqo +ezI2FDLsfUAQ3ZjoWaTPcjarhqjpVVrhZIQ6SsgnCohVS0itMJYhS0GK7o0K+ky5 +Y7gH3tCGO3xVQLLkMHlUMsfgQTLECRQxOLscliplNO4omhGOIJICZNgKF+kPDnyh +3ErwNoatDOLWiFE0bhwyOBJEYDfGHjaG8xFtMBoWYA6HNgFycuim5Q7p2qoGrMrZ +iV9I6DYoCVwCNjaBmh9VIACEQL8wi1kyAWKD09rwynBSL7BDbiUwABZHykpFUzkw +tIaZSwCn04GkNoQOlasfSOXAYa64AHCJyMVG81eg8guTY5JtM+Empxh2Tu34PTsv +KYzszJQ7oZY4pJ7Ci6JrOjEozq8F0gbgliwihrt8mJA2tda3aqkAfanxBmq2ZHU5 +0MvBycGZje43sNn5CYiGYNwJBIRNj/EqmR34YYffKj41OKr74Ihj1OnAC82B5rJS +xuPCk5SnOICrQbAWFCMDZEMllsNkyUZkhMzrWJAiQm+4YC0K62MK0mlrmIc8DWIE +FjI4sXzhL8vpkYEZwSigrGArDcBGj0gGFAr4FqGFQ1SOjTvH0TulJ1XWHAIDBQFU +2BL7SBXa+99dSAvxCgIPnOIVhPMmTqqgYRFDUUEsUuxDfjmwMpaAek0+O9i+KyRp +AG8DGE3qEdlsT9H5BPmUugch5YLMiAwTAkdnj7Y3zvRe4V3q41uohGNQNXT1Czcw +ZOHoCYis+EOsTzziYOV5ZAwqoHrl2ATKFHnpRssDzmLdSlJDg7CCwocglqhuE+Eo +jpsHOFogASPtXBwKZ802h3flM1s1tZA8sM4cPDnAT6uS6umbSt9nww6rDoI6wdYP +ABwCkD4MpyWUDjtRIBzdU79HbBiX3vcZZGYTeQOlZsLH/hj78oFxFCAR3XQLAaGA +dDiPltBD5eyxp0sa6DUCQ9yB3omnTqYzNOQ7dGkZocqlwqH9pIRCGyUGWBqQyCxy +ehq7n/X63fbu3lvZivHbt2xc3MNMke2l6Uc4OiBRsMViTMcmSUZzTiouB0cMzMDc +MhAn5DyXqlkdoH6TOX/ia/RnX2fHg6KQTF18xSwHCgLERnIs7MqnDBCuu5uA3wgA +RixX8J05hR8PDApxlQIJmGtpRVjPTQ4WhDIBRyoZ5o1kdEjBho15A6uhLHeFCwXL ++9soCWWtfZsFJSQSLh/i4cADpq1VAz4GFTiJjhUbKosgl7B751ekmAW8qEBkjrpJ +Tsj2D0AkIBD0X4qoEMX0AA0zQzao5o5TTzd5LNDKrnPfRfO1p44OgI4xIzjnvqR2 +Kz5Gwg+DJUL4dAjsyge+pYSePvEmKovgUXXilLjBfO4fT3oTYGwHVC0J2gKaO2qo +GfZ3ymu7AqTWofKKHc998pr01xD2hKFgCFCO1eIWDjYeGgvGgWPaFTjzJlNzf2GX +XyGuBywpbCI9aM6UO+tOtaQSqpWu2BesY5kXgwTFHTUPCg+y8oeXVwQ7yjsYrMak +XS4XXDAJlUBAhUGk7oKAYdKTLFPcGom1CBxTjSRRsoYbfcOs9iE2BKVx8w4aN9z7 +7xds1BTpEnKyEY4TEIk3XeTS9hcaRANIX4k22qCDj84dwRJjo5YkxitJJAO9xXTk +OFA/MS7JYZDxNviHhoYrl0bDxFvhTQwSQimhAnQFiYoaaHrMgkYrCOGBtDa5Bmne +OFKwdG8DmOpCyvhqGYNRcB69KAlJSFA5hCUHKDE4GFcRwyRmEbfPPpveJJIDaQgw +rWJ/P78yCMO9svE7GZpvnPSWaCtoEgL2jLabbxBVKIsbSY3YtJJ+NjNh8b8AilDw +UPusGoZAu82EYImSRSk5GnwVIKWpSvFeBQnOAdAMuTV9DgEQgQgvrro7JHSHZZfM +JCKmTtQFOCceAYcT265PCAg2SE+XhMkKlPgHB9+HTOoLI8s4BJuk9F7wqDCjRw6y +D8yVeukRZ7qrFZYrAMMmhmgFDKEdZztkqFY4HuEkfuhz9pTsXzFtqqB5Tv5gsZ8h +mh8x8wAfZSHNyDX0vZDTySL94fOjqfD0KHsVflvrWX5ow8Q0QhFVMbcpmX80Ezgf +HYjMuA8wLy42E7Sz3rziuCIB2DsghxkkRy0Bzp6FVAA8MKcFvSjqknlxdHAT0wDn +07kBQcd9oLK7tKmnZYnZZrh6DrhvciJ0ss6vdzXdwMQKJMWT7tXSHPByoD9hWNqM +OwE85ypXmQLQwbXSkJWY6qxCwo6HFcFLCAk6bCVHFyYQc5H6Ezm+mNHD03wkk6j7 +m480R07W+QkhCKSnJVvGUvBBlRzDZDeeaNvGwHd0PT2wTy2HnkWtuMhkklgK66LZ +BC6hKMJnOxOpo4YaB5V7rgiiWQXGCiJrYk4Y59qslhcA8/XJNJQLb+5tUzHJCBgj +Qx3GrzzHn6xmZ9A0PtV9dbezpCHExoEDwlrH8dllA4YEY1mhsA0dIPPsj4Mi73vz +nrsvJLs5YqABDfroHBg+ShQ0IgOs44NI4F8CIIsVXHQ6z3KS4MOhdxigYOImz2UG +gJAuBhpsgLrldXnhNQ4jLCUyTxyhrIrwuyYrqo6MJzQ2Wl3AdDzKOb3Cydryz5Do +pHBHMKBNdAOAdXJhYMgMb2s9Fp70MSClw9KpTbdzhHAuMGAtobHQJ2SURvgbbhyt +BecsuXl+2jKigzt7goBTjmpC8RowanZdxJOhWjwhwrm99FSiJ2OgLLnm8pnjT1Fc +CXCc0JaZijcmjpDACeVTrZneXxGRA+184I985kcHQIQIEFMgWfO635rg0SZSO/at +HtcUKa3TZ8OJoImYsgRoKAhiZKIBUsG7yTOFlDFncMU9EG4CMLUKMxbiCaMDYdhs +JSKdyLFJCQmviCCLgGuUz81ptojXx2oe4d2iHnAkVSdhzcfH2K2UnIQ9u0F30MHB +OBY0UHMYYjgCQTAWMbwXTZQXaOgnfjckJ+BO475Zyfo8/R0NlEMBq8c94sZJiNrn +yJ8OoMIDQPjt9uJK8Rk5aFDYbJfWSynwRhgIbQoB0+IsZPFGy4yADzZLYokaBywD +CRmTeH5tmhDzPmA2rD32gaqneqHMNqA3FgsMePDM9KB69ebN4HOAhc26eoGFI1QJ +m898wsO5qZxBxcWUgvtw5Q8AMEOOJJ8HEEk6B45ZyIoFaB5KW8FLb/M4KYSZIP/T +y/DoMk5Ami3wPAH8EyWhTaUsFlQ+g6AEFdgHlJWNLpOCvdk3q+hWdqbTJWRS1dey +wOAQwQUmsxpFozUQbFTRcPzhmHw0BxsEHFHdI2kUHjDkRPSGAp3SUo8BEdPPPTw4 +44KbQ4SZsIKdYe3WCo1EtM7zKTu1VAoZ7hPFDfU88SlCY2aHVSnVAOBA5wzuGlcH +Rs8STcvGCu0xIzUFjkwcvlheRAzgRbJkzf/N0YjQwJYrJ16VzC1gueMTW4Rt5rYT +IRNwYQYtHOtSD6ShBHOQzP37jm+TT/gvnq0DgyDuezyZv7FGKF8j4kpFLwakHPsy +LSDphCyxQLl7xgnr+Pl8wbTsF8dx04kwB75wFRLdNRIBmhw2pH3UCbB9EgE9z5eI +BPN3vYxzTZ4nEgVR4qoGQtM+BuGwlgV1WoHG4EaoNASMhGBgXYFRVYIXlASg6LSg +GqeHmiyAsDilBBOqQsS4Og5rap1miKqAdUA6AdYTWmgTRQWeULDLBzlSEcEEDJbB +4nTaBTC2glnEXi2haNhLoJcdgCNAkhcqbCc44gFrBrre1RE7eydRrtb9wdNITgOo +j4QWulZiLl9z7V6DbnFmgcimAjOFhQs7UI75C551aKdXmUEHKSvEOCldH1YzE3wo +E42BxwHl9Xk7YSa0g1vV9CriIWOztgqD6DgKN3AvOkS3ODdnTdtll+abk1SRIIGv +fALBUOBR7ZFBZ4BUpBnSQ4hFHFEZ473Y3P+zY7O60Rs1LaWqHHIcwa8txlB4jJJE +w5YZFHWAZUEtKyoIGdMwDYlA+A9mFgSZbOw4M6OOSmPkMl1OYzvpRASmvvXmUjTp +8joGG1lR1cQpEEugzJBUyZnlygzInkeR9IZ+wHyATZQgPmd1ZmIUecB8pAzd6P0t +AUK45zvDzCusNxdKPDohseJeeAI6ZvadwEcFQCRCgsXNcDfG6wqIm732cGQgwkIA +SKEgydIjIZQ4a2thurU6wysrTQQglytZnEFtKoQOjdqfOmiDah274ym7EDxm9s9L +CegGgMopkIt4LQ1Xtb9yBS7B2LUpK7hUpgHQVCXmwmbMOQqGHhGVvfpgEjVDoew6 +qNbwaB5vajnexW8pSBC73poOsSDMENqjGDoVUvvCS9M4jdfRrEmuQYwM5KDSHMK3 +B64lqG9DhQ0JoNQHlDlAPccRKnfODi2TDOoYNSZAcBzrUAVglyHGRUI0bMziEWOU +JYnAOUMt6Rku3X2Za5l+nJIHiJXNq4xzccGdzaqu4qJJiDRBAN2TBKurol+bv9SB +CSAX8+8Hl/r7sZnxy9PYe6Z7cvs98YtZ/SwPrgMD9OXynBh/XzxwXwdWFeXp/iVD +kMgNriWpJDP1n5azCg6/xxxEvwpxkfhIP9s+2nQ/fn4vF9+jJ+ngfdWL4CPb5czf +UQwvVtZEuz7Om9iWrwP/ePX0KAP0+V9inRoSgybccCP6dPd+K+f24YnQ9YpYUGst +TKKFMYQdT2HL0fr+fbVW3qvv1NLVbRWSUrVJUxgSVjWktRaoqKNrFWmUUVMjUUmp +li0zKazDabQ0YKDYxZMGg1BpRpYUwpQCMhoC8nsJe4+Dy3Xr8S8ifkOz/vaP7ETx +FiYoqdkOeLbBtH+bHadmz2QGsccbGX7OU2D+LhZDxGPjMsOyV+DZO9PSeDPkEcZO +SS8UzBJ+ecnUZhlZ9ZyM/ad22YYrjBcAz/3V2B8/JiuT7ED9kw+rGGSGmqTbJiMm +LSysmTaS0aks2bSzWlZtg1EpSSYlNkqItCalNFstNttqaprSmpS0pqU1LNFgKpZV +srWWrM0lJM1bEW0qbEmiLVtRGZUbSprWbNaLUqaks021KtbS2RlllbMsywtspLGj +SaVEzMYk2NmzWptlrJWmSoRZSsptlZZLRGTaNKm2LJmmyUmSWRk0WpqlUZJJiWlp +tkjGjUy01TaUkrKzSlLTMzAbNg2KlpJMl63e7/d+ENF1fgGLHuf56NGdqOvg7hSN +iHHED5NKzQnm2yaAQJTIxieFJM3ij3X3qh5AHBhk2riuNRvBd1dJNK/o55W5e1NX +ks/nngBUDz7INtUfFdK0JrgNgbjAdgkJGRczQCngL6Zh4BT2UW6xEWOCC4FzQuaj +OxoBErUsV1z6K8cAICwJGRj6fB5iCC6h8QhiZB9qLr5NFyCenPzIPnc0WwotMInx +4sAoHfMU5HgU6hhRBkppj/FgHNLt0ubr4APQXPI06DXqSSyDZid8zuPuLwXKN4cj +jq/w8zETQQQXn+w0DiEJEiKh7fzQ5LMfgQXmXrdtA+sBzTIigGxVCwsOYhmJycnC +CGplhE8/sdAhQXcsIRJFJISEJE8flHQO6cgR0ZCoE/TcCd+BBP7orIml5zlZgw9K +QKKpGkiwgESxpnXK9pYwUAa89ij5sPoUYZjQ0lyAcxQc/xtRzIOJISJHL7Ny0JDw +BwZa4MDUFR8D5CCCwzTyVsZejnQapAVGYICC5dDXtXOsmZXMO7mFWN7P56mEGIAc +JHHBsharUAUcAp9UrviBIAxJ08i+RBO3Ah2QAgiK4kThwo8sDCf0aftxqENQKMTv +TZBCNMVoDJwdi4fVhYNQyMy4KjH6SlEAvexZaMCmxViqK0e1JpDA33Zg0xuGQl9E +hiQvQ2FHNA6XqGDe6CB3obIHAhBD+L/2H7JweCnNu3h8F/bQAgQghowH1UAW3ICg +LRMWh9MD3nL6B5zvW/rtbABAW7j9J/ubhTjE1Dh6fjPlrh4F1mHx9l6oKaKdL9MC +Czogscg9WEHR1P1lXLtPyv2av6+Uc38L73W4ynzSHQzT7n4a9fw9G0pHvHQQT3Ww +CpsYtnkcGJdhEoMqdwTQQQWf8H7l+Sm0erEmuPTqAC3f/RC5LqgrQdfyPN+J3eTy +V4GlQVzdO0KeqEArm/KUORmgILgIYcAUkDE9WuptiUObqmYfnmExHY8cNvsWx4o2 +QtFrwFybGSaII/YzOu4hsM00VwmYOAJQ3KQY+rag56UiZKVHIpnxryUn41uF8d2K +fszLbyzAkMTuQc1BJQQHPuhBBej0s+yiFTpnRcrVGp26/SPoGgGLAjmBAhpnAPYi +hGHgg8hN+hAh0NObgHp2R/M6Jo+S9Uw80pUFedRU1bYFRVog6sTPEHADwMAG0oUe +ZTzCfk4pmd1M7BJIMNGsaaugBm+bdBpLDSNwIBiBVKx5dQgre1pCrhP2FD5vX9bb +a28/PP14155vN5a8GIiRRgLCSaKIJMBu9u1u/IdZNWhKp6tcoZGbueNNIlSQLYOV +guF/I1QEFvm6liJuQ/g648tjVjId/WMg6iEQnkcuhltYdGxoELryIDySIMiK9wD4 +MbBiPihigLkeo0OhARBcol9jMSNhf2ITsgILYNseps5hodZnnUYfDxJFi4UQzXNx +EsQsWIsPUhf4XvqFHwQ+WPfTBIHct1LIZYv2+juqALF8D9dhxOkM18bdDBT3QEFx +IIWRNxv+UV8R+J/0R2XJbrEIOYHU+pkgRzsDEdIZEebTO4gQJeqofJbdkqra4esL +roGjHL6Gsy4rZI+PElgZlHIH1++YJmDEhF6psaR1U3IWVmpF3VwE9oiTMpi8Nzz+ +aHRDUDwW+WIdt3zPNOewJzPCB9E6jmCYHFX8LoITudMz7/N1SyV8kTcL0XLh4A7N +JzfBgyjFkYbKgC8xPTQ2NEVHr3NX3I8oB8QLJn4JCrIRrrR5SSiELOBCqIlECSOq +AgtNF/5UYIUAbvmgBgPL1xIT9UkTRqqrX53ixpCNGKHEwP1PwJh+ma3ptrBwODbq +SORcDEiR6PVwOxokOUEsjBbkzcaucQzU4IBkiIQDSXJdCotjbIzzDs8lfNscXA3I +EjvBoCBmX1Xq+IE6m5+HREB7xUkefMhRTIUUVEoGUY2sxAvjsdB3GZnYoMTuuOZk +0IILqZh+sKgLQ1ULBUF4SYf1u+nDkki7SjNoBQWIGv3PuY3TIDM1QtuJ3SNep/DE +5GEdQMHhYWdISJCEh+RRD7S+bd8OK+sbha0qU3NES7e5JJCEsxa4lA5ucJdrboo7 +v42uXj7XKXZXimppWTWQJDU2Uks0imZSWU2bLZWUpEzCgmWQzZKmlstNa2pqlKaa +aU0pppMDbLLVlqzSSa2lTEtKzZJmtWpNSkylFpqsptkZrNNSzS1S2bNoqllIpMmS +lmYDKLKzVm1LKVNkglKVKmyy0EstNixZmkjEiWms2xGFpVEWVNNKkSaWUpmMKLNQ +l1leHUD7BQQf0nxooh+rfDYdYFRbCkgUOlBI6EukdLgodLEh6iosAIZUDGcFIBnT +5PfxeXIybIEK3a2JhwXN4a5XZyCUN1QHKuKm53cudZGkYw+CUhgAg4jiFUxQcoWX +ZiDnC1kcAxisjx4FhBuB1RLpkW/L1JdQMQyPlqBhAGDxWuoWKaLLctSBSGSu4x/U ++UGMFxxCH7+CQBDUTBsMAfQX99QooSAcCZEiD6vqNtZoMtphkjx94b82mEcdDU6C +GIfhpBNHRGdiSEhKQ5wXmRP0FuHscjHIQQXE+/JA9QIe5u/rPZ7iGp3RjqDlESQZ +JCQm/LYfclj52MSyQjrCotj6Nhs9YNtpjG0eYiFHs4e+RkLZGv6lQVs25H8UcydI +dBwSSJWZ2GkMV5JBvs3IEHqRvh5VCbiosL1RQbNSevAFkgodQSGXyDwMAKI48pbY +nKYY5o3AkxfgcNu/2TS8/z4OpVwpwYLoslFDS0dpbVLklyLktcy0qrt1rkkVDQKa +U5mIfn7qbHUwB+pUzzDYgdOwHNMsQqIeAQgWJ7CdQLne/Uch/L74GbnkIeSHVY7B +6HzdzDBZDLh9FDDd7l51/E5mJCBgdFYeAu3YglszcA0yVJwA+V7zU+xXQdNIJq0w +kfMItgm3gj2uGRgGUX4BpO2ZVeDftfXE9vP1ve16wzwEEF4VAF3VrV67Ndd89m7O +GA6EokveXN9MfaQsQ3ZZKcK50mcwJlSsZTgk98c5KYw84IzEZbkvNTsNqzPLKyHo +Px0sFlfMO5q7Gy/RLjgGa3WwaF0oI5J5CEBrzAuFdT9Mc82Cdw1XLYdAocXnucxw +MDq4Gb5ImDg/Y1aNUuciSSLGs30w7o64wiPJkCOJGESEZEDZGBLmOHlrwGGQG1zj +MtuCoxq7RpQlgtQ/YQ5xHKBJJHiia0FHVsRLGQe6Aj+2KgIUQACACiJEFxCraZaP +BqeGpHqJ2lIlZ0RymyqrLMZVKEz6wYDwNnVwEvXcGMYxgkEpwJK03QsQ0IAGhJqy +CBkmqpjC2e6t4I+Zf0JUTC8cgiBBIMOpm5aNIYWCqlcG2GZjNkLK8i6B/LSEtoDR +RIJtyOGwPFu5CEb0Y2d1QVrHSAerk2mlwOR0esAyQ5waYkWyRMAgkNlX1WA43hGO +YdDY3OWXJQzDIuXC51atcCh9k/jjTxk4r31uGHUMNV7DyEEFu9aoidiNHFzHFW3k +pl23DYUqswRQLrmUK++C6OIeCEEGO4Oxqcy5rvYfEQIEszhUi+UBMa/NHV+bZCGB +BmDsfjN+oGAKjwgfAOjBz3eAT0JSBhgZHiXA7HejAOj31UJ0cC5soXLOxcOBUy41 +LJM6Q8Jwpx4F2KjgcPvn3BRaXEe2Z4vPu2/yeP+aH5JvaiC4fKQAcndicHNDcD9b +ShgrZAQXSGTpCSlPzKD5gwnhsz+p8ujoewiFBY3pKLSeXXMDRxzJq44NJzlzG7rV +oWrj1/nLbhdUFc+SIUCENGZwNenyhKIbAqfWTOCRY+YUj3gzmpUR68AgUjUPy+0G +2hIxUaJCNpMRpoFYjY0WIzNmFoMaNFtEYklpFixGtGxg0UUVJoKiwYNaTRqTKQRU +G1Bo221i1VFhYBqNjRFIKqgpJIRS7/L9Xk8v315svJO9OR4u/ONn5FGPE3fMqdtS +xkZBu7kta5NbuU8MxyZMYMgmsNmMhnKfGmtyIG2LzBpqWYIbdmCYi0lYLJxwCFFa +zJE6zEudHD27ZzbOeSgpk/HnkQbT7twqaaJXNvUzMuUt1hyhU7ceZcph42+VTlXU +cZ9UZZJyYojLjaeJHfJU1UZUEmBfLumu8yW5skuyE9uh2BmVxJZi6KxaXBNwSolw +BqBcQLj3ucNZIYZLYtirLu3brW6UYgZgZJiDIGiwpsgg7g1AITkgM6FHITxDDnGt +4SDHzZbL5s8fec5PCq5DOzDRdWS+0h5Y2INZak1D29cpVyb2aVrV3Wlt7rQhLa3e +m3ZwPNcXywE2Qesk1XN24HvZ2Xa6nlm8Pf/xdyRThQkO1NjuAA== `) diff --git a/gcc/testsuite/go.test/test/bench/go1/parser_test.go b/gcc/testsuite/go.test/test/bench/go1/parser_test.go index 26580b88725..7848cadd228 100644 --- a/gcc/testsuite/go.test/test/bench/go1/parser_test.go +++ b/gcc/testsuite/go.test/test/bench/go1/parser_test.go @@ -33,7 +33,7 @@ func makeParserBytes() []byte { return b } -func BenchmarkParse(b *testing.B) { +func BenchmarkGoParse(b *testing.B) { b.SetBytes(int64(len(parserbytes))) for i := 0; i < b.N; i++ { if _, err := parser.ParseFile(token.NewFileSet(), "", parserbytes, parser.ParseComments); err != nil { diff --git a/gcc/testsuite/go.test/test/bench/go1/regexp_test.go b/gcc/testsuite/go.test/test/bench/go1/regexp_test.go new file mode 100644 index 00000000000..3ce9f3a2c67 --- /dev/null +++ b/gcc/testsuite/go.test/test/bench/go1/regexp_test.go @@ -0,0 +1,59 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package go1 + +import ( + "math/rand" + "regexp" + "testing" +) + +// benchmark based on regexp/exec_test.go + +var regexpText []byte + +func makeRegexpText(n int) []byte { + rand.Seed(0) // For reproducibility. + if len(regexpText) >= n { + return regexpText[:n] + } + regexpText = make([]byte, n) + for i := range regexpText { + if rand.Intn(30) == 0 { + regexpText[i] = '\n' + } else { + regexpText[i] = byte(rand.Intn(0x7E+1-0x20) + 0x20) + } + } + return regexpText +} + +func benchmark(b *testing.B, re string, n int) { + r := regexp.MustCompile(re) + t := makeRegexpText(n) + b.ResetTimer() + b.SetBytes(int64(n)) + for i := 0; i < b.N; i++ { + if r.Match(t) { + b.Fatal("match!") + } + } +} + +const ( + easy0 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ$" + easy1 = "A[AB]B[BC]C[CD]D[DE]E[EF]F[FG]G[GH]H[HI]I[IJ]J$" + medium = "[XYZ]ABCDEFGHIJKLMNOPQRSTUVWXYZ$" + hard = "[ -~]*ABCDEFGHIJKLMNOPQRSTUVWXYZ$" +) + +func BenchmarkRegexpMatchEasy0_32(b *testing.B) { benchmark(b, easy0, 32<<0) } +func BenchmarkRegexpMatchEasy0_1K(b *testing.B) { benchmark(b, easy0, 1<<10) } +func BenchmarkRegexpMatchEasy1_32(b *testing.B) { benchmark(b, easy1, 32<<0) } +func BenchmarkRegexpMatchEasy1_1K(b *testing.B) { benchmark(b, easy1, 1<<10) } +func BenchmarkRegexpMatchMedium_32(b *testing.B) { benchmark(b, medium, 1<<0) } +func BenchmarkRegexpMatchMedium_1K(b *testing.B) { benchmark(b, medium, 1<<10) } +func BenchmarkRegexpMatchHard_32(b *testing.B) { benchmark(b, hard, 32<<0) } +func BenchmarkRegexpMatchHard_1K(b *testing.B) { benchmark(b, hard, 1<<10) } diff --git a/gcc/testsuite/go.test/test/bench/go1/time_test.go b/gcc/testsuite/go.test/test/bench/go1/time_test.go new file mode 100644 index 00000000000..4687de31c13 --- /dev/null +++ b/gcc/testsuite/go.test/test/bench/go1/time_test.go @@ -0,0 +1,25 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package go1 + +// benchmark based on time/time_test.go + +import ( + "testing" + "time" +) + +func BenchmarkTimeParse(b *testing.B) { + for i := 0; i < b.N; i++ { + time.Parse(time.ANSIC, "Mon Jan 2 15:04:05 2006") + } +} + +func BenchmarkTimeFormat(b *testing.B) { + t := time.Unix(1265346057, 0) + for i := 0; i < b.N; i++ { + t.Format("Mon Jan 2 15:04:05 2006") + } +} diff --git a/gcc/testsuite/go.test/test/bench/shootout/timing.sh b/gcc/testsuite/go.test/test/bench/shootout/timing.sh index d269b875680..2db895c2630 100755 --- a/gcc/testsuite/go.test/test/bench/shootout/timing.sh +++ b/gcc/testsuite/go.test/test/bench/shootout/timing.sh @@ -10,6 +10,14 @@ O=$GOCHAR GC="go tool ${O}g" LD="go tool ${O}l" +gccm="" +case "$O" in +8) + gccm=-m32;; +6) + gccm=-m64;; +esac + PATH=.:$PATH havegccgo=false @@ -78,7 +86,7 @@ run() { fasta() { runonly echo 'fasta -n 25000000' - run 'gcc -O2 fasta.c' a.out 25000000 + run "gcc $gccm -O2 fasta.c" a.out 25000000 run 'gccgo -O2 fasta.go' a.out -n 25000000 #commented out until WriteString is in bufio run 'gc fasta' $O.out -n 25000000 run 'gc_B fasta' $O.out -n 25000000 @@ -88,7 +96,7 @@ revcomp() { runonly gcc -O2 fasta.c runonly a.out 25000000 > x runonly echo 'reverse-complement < output-of-fasta-25000000' - run 'gcc -O2 reverse-complement.c' a.out < x + run "gcc $gccm -O2 reverse-complement.c" a.out < x run 'gccgo -O2 reverse-complement.go' a.out < x run 'gc reverse-complement' $O.out < x run 'gc_B reverse-complement' $O.out < x @@ -97,7 +105,7 @@ revcomp() { nbody() { runonly echo 'nbody -n 50000000' - run 'gcc -O2 nbody.c -lm' a.out 50000000 + run "gcc $gccm -O2 nbody.c -lm" a.out 50000000 run 'gccgo -O2 nbody.go' a.out -n 50000000 run 'gc nbody' $O.out -n 50000000 run 'gc_B nbody' $O.out -n 50000000 @@ -105,7 +113,7 @@ nbody() { binarytree() { runonly echo 'binary-tree 15 # too slow to use 20' - run 'gcc -O2 binary-tree.c -lm' a.out 15 + run "gcc $gccm -O2 binary-tree.c -lm" a.out 15 run 'gccgo -O2 binary-tree.go' a.out -n 15 run 'gccgo -O2 binary-tree-freelist.go' a.out -n 15 run 'gc binary-tree' $O.out -n 15 @@ -114,7 +122,7 @@ binarytree() { fannkuch() { runonly echo 'fannkuch 12' - run 'gcc -O2 fannkuch.c' a.out 12 + run "gcc $gccm -O2 fannkuch.c" a.out 12 run 'gccgo -O2 fannkuch.go' a.out -n 12 run 'gccgo -O2 fannkuch-parallel.go' a.out -n 12 run 'gc fannkuch' $O.out -n 12 @@ -126,7 +134,7 @@ regexdna() { runonly gcc -O2 fasta.c runonly a.out 100000 > x runonly echo 'regex-dna 100000' - run 'gcc -O2 regex-dna.c -lpcre' a.out <x + run "gcc $gccm -O2 regex-dna.c -lpcre" a.out <x run 'gccgo -O2 regex-dna.go' a.out <x run 'gccgo -O2 regex-dna-parallel.go' a.out <x run 'gc regex-dna' $O.out <x @@ -137,7 +145,7 @@ regexdna() { spectralnorm() { runonly echo 'spectral-norm 5500' - run 'gcc -O2 spectral-norm.c -lm' a.out 5500 + run "gcc $gccm -O2 spectral-norm.c -lm" a.out 5500 run 'gccgo -O2 spectral-norm.go' a.out -n 5500 run 'gc spectral-norm' $O.out -n 5500 run 'gc_B spectral-norm' $O.out -n 5500 @@ -160,7 +168,7 @@ knucleotide() { mandelbrot() { runonly echo 'mandelbrot 16000' - run 'gcc -O2 mandelbrot.c' a.out 16000 + run "gcc $gccm -O2 mandelbrot.c" a.out 16000 run 'gccgo -O2 mandelbrot.go' a.out -n 16000 run 'gc mandelbrot' $O.out -n 16000 run 'gc_B mandelbrot' $O.out -n 16000 @@ -168,7 +176,7 @@ mandelbrot() { meteor() { runonly echo 'meteor 2098' - run 'gcc -O2 meteor-contest.c' a.out 2098 + run "gcc $gccm -O2 meteor-contest.c" a.out 2098 run 'gccgo -O2 meteor-contest.go' a.out -n 2098 run 'gc meteor-contest' $O.out -n 2098 run 'gc_B meteor-contest' $O.out -n 2098 @@ -176,7 +184,7 @@ meteor() { pidigits() { runonly echo 'pidigits 10000' - run 'gcc -O2 pidigits.c -lgmp' a.out 10000 + run "gcc $gccm -O2 pidigits.c -lgmp" a.out 10000 run 'gccgo -O2 pidigits.go' a.out -n 10000 run 'gc pidigits' $O.out -n 10000 run 'gc_B pidigits' $O.out -n 10000 @@ -184,14 +192,14 @@ pidigits() { threadring() { runonly echo 'threadring 50000000' - run 'gcc -O2 threadring.c -lpthread' a.out 50000000 + run "gcc $gccm -O2 threadring.c -lpthread" a.out 50000000 run 'gccgo -O2 threadring.go' a.out -n 50000000 run 'gc threadring' $O.out -n 50000000 } chameneos() { runonly echo 'chameneos 6000000' - run 'gcc -O2 chameneosredux.c -lpthread' a.out 6000000 + run "gcc $gccm -O2 chameneosredux.c -lpthread" a.out 6000000 run 'gccgo -O2 chameneosredux.go' a.out 6000000 run 'gc chameneosredux' $O.out 6000000 } diff --git a/gcc/testsuite/go.test/test/bigalg.go b/gcc/testsuite/go.test/test/bigalg.go index 55a15c30abe..60e822942e2 100644 --- a/gcc/testsuite/go.test/test/bigalg.go +++ b/gcc/testsuite/go.test/test/bigalg.go @@ -15,18 +15,21 @@ type T struct { d byte } -var a = []int{ 1, 2, 3 } +var a = []int{1, 2, 3} var NIL []int func arraycmptest() { if NIL != nil { println("fail1:", NIL, "!= nil") + panic("bigalg") } if nil != NIL { println("fail2: nil !=", NIL) + panic("bigalg") } if a == nil || nil == a { println("fail3:", a, "== nil") + panic("bigalg") } } @@ -49,12 +52,14 @@ func maptest() { t1 := mt[0] if t1.a != t.a || t1.b != t.b || t1.c != t.c || t1.d != t.d { println("fail: map val struct", t1.a, t1.b, t1.c, t1.d) + panic("bigalg") } ma[1] = a a1 := ma[1] if !SameArray(a, a1) { println("fail: map val array", a, a1) + panic("bigalg") } } @@ -72,15 +77,18 @@ func chantest() { t1 := <-ct if t1.a != t.a || t1.b != t.b || t1.c != t.c || t1.d != t.d { println("fail: map val struct", t1.a, t1.b, t1.c, t1.d) + panic("bigalg") } a1 := <-ca if !SameArray(a, a1) { println("fail: map val array", a, a1) + panic("bigalg") } } -type E struct { } +type E struct{} + var e E func interfacetest() { @@ -90,6 +98,7 @@ func interfacetest() { a1 := i.([]int) if !SameArray(a, a1) { println("interface <-> []int", a, a1) + panic("bigalg") } pa := new([]int) *pa = a @@ -97,12 +106,14 @@ func interfacetest() { a1 = *i.(*[]int) if !SameArray(a, a1) { println("interface <-> *[]int", a, a1) + panic("bigalg") } i = t t1 := i.(T) if t1.a != t.a || t1.b != t.b || t1.c != t.c || t1.d != t.d { println("interface <-> struct", t1.a, t1.b, t1.c, t1.d) + panic("bigalg") } i = e diff --git a/gcc/testsuite/go.test/test/blank.go b/gcc/testsuite/go.test/test/blank.go index ee618b14858..7f7d9f6f7fb 100644 --- a/gcc/testsuite/go.test/test/blank.go +++ b/gcc/testsuite/go.test/test/blank.go @@ -8,6 +8,11 @@ package main +import ( + "os" + "unsafe" +) + import _ "fmt" var call string @@ -102,8 +107,19 @@ func main() { panic(sum) } + // exp/ssa/interp doesn't yet skip blank fields in struct + // equivalence. It also cannot support unsafe.Pointer. + if os.Getenv("GOSSAINTERP") == "" { + type T1 struct{ x, y, z int } + t1 := *(*T)(unsafe.Pointer(&T1{1, 2, 3})) + t2 := *(*T)(unsafe.Pointer(&T1{4, 5, 6})) + if t1 != t2 { + panic("T{} != T{}") + } + } + h(a, b) - + m() } @@ -133,14 +149,13 @@ func fp1(x, y int) { } } - func m() { var i I - + i = TI{} i.M(1, 1) i.M(2, 2) - + fp(1, 1) fp(2, 2) } @@ -162,4 +177,3 @@ func _() { func ff() { var _ int = 1 } - diff --git a/gcc/testsuite/go.test/test/blank1.go b/gcc/testsuite/go.test/test/blank1.go index c6e038a0d92..f7e98b44168 100644 --- a/gcc/testsuite/go.test/test/blank1.go +++ b/gcc/testsuite/go.test/test/blank1.go @@ -9,8 +9,13 @@ package _ // ERROR "invalid package name _" +var t struct { + _ int +} + func main() { _() // ERROR "cannot use _ as value" x := _+1 // ERROR "cannot use _ as value" _ = x + _ = t._ // ERROR "cannot refer to blank field|invalid use of" } diff --git a/gcc/testsuite/go.test/test/bugs/bug434.go b/gcc/testsuite/go.test/test/bugs/bug434.go deleted file mode 100644 index 5eec7a577e7..00000000000 --- a/gcc/testsuite/go.test/test/bugs/bug434.go +++ /dev/null @@ -1,10 +0,0 @@ -// $G $D/$F.dir/one.go && $G $D/$F.dir/two.go || echo BUG:bug434 - -// NOTE: This test is not run by 'run.go' and so not run by all.bash. -// To run this test you must use the ./run shell script. - -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ignored diff --git a/gcc/testsuite/go.test/test/chan/select2.go b/gcc/testsuite/go.test/test/chan/select2.go index 40bc357b5d7..4a081391261 100644 --- a/gcc/testsuite/go.test/test/chan/select2.go +++ b/gcc/testsuite/go.test/test/chan/select2.go @@ -47,7 +47,7 @@ func main() { runtime.GC() runtime.ReadMemStats(memstats) - if memstats.Alloc-alloc > 1e5 { + if memstats.Alloc-alloc > 1.1e5 { println("BUG: too much memory for 100,000 selects:", memstats.Alloc-alloc) } } diff --git a/gcc/testsuite/go.test/test/cmp.go b/gcc/testsuite/go.test/test/cmp.go index a56ca6eaddd..5be64561d59 100644 --- a/gcc/testsuite/go.test/test/cmp.go +++ b/gcc/testsuite/go.test/test/cmp.go @@ -8,9 +8,13 @@ package main -import "unsafe" +import ( + "os" + "unsafe" +) var global bool + func use(b bool) { global = b } func stringptr(s string) uintptr { return *(*uintptr)(unsafe.Pointer(&s)) } @@ -38,8 +42,12 @@ func main() { var c string = "hello" var d string = "hel" // try to get different pointer d = d + "lo" - if stringptr(c) == stringptr(d) { - panic("compiler too smart -- got same string") + + // exp/ssa/interp can't handle unsafe.Pointer. + if os.Getenv("GOSSAINTERP") != "" { + if stringptr(c) == stringptr(d) { + panic("compiler too smart -- got same string") + } } var e = make(chan int) @@ -283,7 +291,7 @@ func main() { isfalse(ix != z) isfalse(iz != x) } - + // structs with _ fields { var x = struct { @@ -296,7 +304,7 @@ func main() { x: 1, y: 2, z: 3, } var ix interface{} = x - + istrue(x == x) istrue(x == ix) istrue(ix == x) diff --git a/gcc/testsuite/go.test/test/cmplx.go b/gcc/testsuite/go.test/test/cmplx.go index 248672e7dd5..2d8a6229d62 100644 --- a/gcc/testsuite/go.test/test/cmplx.go +++ b/gcc/testsuite/go.test/test/cmplx.go @@ -9,12 +9,23 @@ package main +type ( + Float32 float32 + Float64 float64 + Complex64 complex64 + Complex128 complex128 +) + var ( f32 float32 f64 float64 + F32 Float32 + F64 Float64 c64 complex64 c128 complex128 + C64 Complex64 + C128 Complex128 ) func main() { @@ -25,4 +36,19 @@ func main() { _ = complex128(0) // ok _ = complex(f32, f64) // ERROR "complex" _ = complex(f64, f32) // ERROR "complex" + _ = complex(f32, F32) // ERROR "complex" + _ = complex(F32, f32) // ERROR "complex" + _ = complex(f64, F64) // ERROR "complex" + _ = complex(F64, f64) // ERROR "complex" + + c128 = complex(f32, f32) // ERROR "cannot use" + c64 = complex(f64, f64) // ERROR "cannot use" + + c64 = complex(1.0, 2.0) // ok, constant is untyped + c128 = complex(1.0, 2.0) + C64 = complex(1.0, 2.0) + C128 = complex(1.0, 2.0) + + C64 = complex(f32, f32) // ERROR "cannot use" + C128 = complex(f64, f64) // ERROR "cannot use" } diff --git a/gcc/testsuite/go.test/test/cmplxdivide.go b/gcc/testsuite/go.test/test/cmplxdivide.go index 92a98356d0a..40c84486da0 100644 --- a/gcc/testsuite/go.test/test/cmplxdivide.go +++ b/gcc/testsuite/go.test/test/cmplxdivide.go @@ -45,4 +45,7 @@ func main() { fmt.Printf("%v/%v: expected %v error; got %v\n", t.f, t.g, t.out, x) } } + if bad { + panic("cmplxdivide failed.") + } } diff --git a/gcc/testsuite/go.test/test/const.go b/gcc/testsuite/go.test/test/const.go index 80fbfaf3ea0..d583659c6c3 100644 --- a/gcc/testsuite/go.test/test/const.go +++ b/gcc/testsuite/go.test/test/const.go @@ -8,27 +8,29 @@ package main +import "os" + const ( - c0 = 0 - cm1 = -1 - chuge = 1 << 100 + c0 = 0 + cm1 = -1 + chuge = 1 << 100 chuge_1 = chuge - 1 - c1 = chuge >> 100 - c3div2 = 3/2 - c1e3 = 1e3 + c1 = chuge >> 100 + c3div2 = 3 / 2 + c1e3 = 1e3 - ctrue = true + ctrue = true cfalse = !ctrue ) const ( - f0 = 0.0 - fm1 = -1. - fhuge float64 = 1 << 100 + f0 = 0.0 + fm1 = -1. + fhuge float64 = 1 << 100 fhuge_1 float64 = chuge - 1 - f1 float64 = chuge >> 100 - f3div2 = 3./2. - f1e3 float64 = 1e3 + f1 float64 = chuge >> 100 + f3div2 = 3. / 2. + f1e3 float64 = 1e3 ) func assert(t bool, s string) { @@ -41,8 +43,8 @@ func ints() { assert(c0 == 0, "c0") assert(c1 == 1, "c1") assert(chuge > chuge_1, "chuge") - assert(chuge_1 + 1 == chuge, "chuge 1") - assert(chuge + cm1 +1 == chuge, "cm1") + assert(chuge_1+1 == chuge, "chuge 1") + assert(chuge+cm1+1 == chuge, "cm1") assert(c3div2 == 1, "3/2") assert(c1e3 == 1000, "c1e3 int") assert(c1e3 == 1e3, "c1e3 float") @@ -81,9 +83,12 @@ func ints() { func floats() { assert(f0 == c0, "f0") assert(f1 == c1, "f1") - assert(fhuge == fhuge_1, "fhuge") // float64 can't distinguish fhuge, fhuge_1. - assert(fhuge_1 + 1 == fhuge, "fhuge 1") - assert(fhuge + fm1 +1 == fhuge, "fm1") + // TODO(gri): exp/ssa/interp constant folding is incorrect. + if os.Getenv("GOSSAINTERP") == "" { + assert(fhuge == fhuge_1, "fhuge") // float64 can't distinguish fhuge, fhuge_1. + } + assert(fhuge_1+1 == fhuge, "fhuge 1") + assert(fhuge+fm1+1 == fhuge, "fm1") assert(f3div2 == 1.5, "3./2.") assert(f1e3 == 1000, "f1e3 int") assert(f1e3 == 1.e3, "f1e3 float") diff --git a/gcc/testsuite/go.test/test/const1.go b/gcc/testsuite/go.test/test/const1.go index 1580b76c683..58bddee7e07 100644 --- a/gcc/testsuite/go.test/test/const1.go +++ b/gcc/testsuite/go.test/test/const1.go @@ -9,6 +9,8 @@ package main +import "unsafe" + type I interface{} const ( @@ -86,3 +88,7 @@ func main() { } const ptr = nil // ERROR "const.*nil" +const _ = string([]byte(nil)) // ERROR "is not a? ?constant" +const _ = uintptr(unsafe.Pointer((*int)(nil))) // ERROR "is not a? ?constant" +const _ = unsafe.Pointer((*int)(nil)) // ERROR "cannot be nil|invalid constant type" +const _ = (*int)(nil) // ERROR "cannot be nil|invalid constant type" diff --git a/gcc/testsuite/go.test/test/const4.go b/gcc/testsuite/go.test/test/const4.go index 677fcefa750..2fb2d0664e8 100644 --- a/gcc/testsuite/go.test/test/const4.go +++ b/gcc/testsuite/go.test/test/const4.go @@ -9,7 +9,7 @@ package main var b struct { - a[10]int + a [10]int } var m map[string][20]int @@ -61,17 +61,22 @@ var c1 = func() chan *[70]int { func main() { if n1 != 10 || n2 != 20 || n3 != 30 || n4 != 40 || n5 != 50 || n6 != 60 || n7 != 70 { println("BUG:", n1, n2, n3, n4, n5, n6, n7) + panic("fail") } if !calledF { println("BUG: did not call f") + panic("fail") } if <-c == nil { println("BUG: did not receive from c") + panic("fail") } if !calledG { println("BUG: did not call g") + panic("fail") } if <-c1 == nil { println("BUG: did not receive from c1") + panic("fail") } } diff --git a/gcc/testsuite/go.test/test/const5.go b/gcc/testsuite/go.test/test/const5.go index d0eed137d1a..87fe33a3855 100644 --- a/gcc/testsuite/go.test/test/const5.go +++ b/gcc/testsuite/go.test/test/const5.go @@ -24,10 +24,10 @@ const ( n2 = len(m[""]) n3 = len(s[10]) - n4 = len(f()) // ERROR "must be constant|is not constant" - n5 = len(<-c) // ERROR "must be constant|is not constant" + n4 = len(f()) // ERROR "is not a constant|is not constant" + n5 = len(<-c) // ERROR "is not a constant|is not constant" - n6 = cap(f()) // ERROR "must be constant|is not constant" - n7 = cap(<-c) // ERROR "must be constant|is not constant" + n6 = cap(f()) // ERROR "is not a constant|is not constant" + n7 = cap(<-c) // ERROR "is not a constant|is not constant" ) diff --git a/gcc/testsuite/go.test/test/const6.go b/gcc/testsuite/go.test/test/const6.go new file mode 100644 index 00000000000..c005ac3696d --- /dev/null +++ b/gcc/testsuite/go.test/test/const6.go @@ -0,0 +1,30 @@ +// errorcheck + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Ideal vs non-ideal bool. See issue 3915, 3923. + +package p + +type mybool bool +type mybool1 bool + +var ( + x, y int = 1, 2 + c1 bool = x < y + c2 mybool = x < y + c3 mybool = c2 == (x < y) + c4 mybool = c2 == (1 < 2) + c5 mybool = 1 < 2 + c6 mybool1 = x < y + c7 = c1 == c2 // ERROR "mismatched types|incompatible types" + c8 = c2 == c6 // ERROR "mismatched types|incompatible types" + c9 = c1 == c6 // ERROR "mismatched types|incompatible types" + _ = c2 && (x < y) + _ = c2 && (1 < 2) + _ = c1 && c2 // ERROR "mismatched types|incompatible types" + _ = c2 && c6 // ERROR "mismatched types|incompatible types" + _ = c1 && c6 // ERROR "mismatched types|incompatible types" +) diff --git a/gcc/testsuite/go.test/test/copy.go b/gcc/testsuite/go.test/test/copy.go index 65ffb6ff8f5..e6108d905d1 100644 --- a/gcc/testsuite/go.test/test/copy.go +++ b/gcc/testsuite/go.test/test/copy.go @@ -132,6 +132,7 @@ func verify8(length, in, out, m int) { n := ncopied(length, in, out) if m != n { fmt.Printf("count bad(%d %d %d): %d not %d\n", length, in, out, m, n) + os.Exit(1) return } // before @@ -172,6 +173,7 @@ func verifyS(length, in, out, m int) { n := ncopied(length, in, out) if m != n { fmt.Printf("count bad(%d %d %d): %d not %d\n", length, in, out, m, n) + os.Exit(1) return } // before @@ -212,6 +214,7 @@ func verify16(length, in, out, m int) { n := ncopied(length, in, out) if m != n { fmt.Printf("count bad(%d %d %d): %d not %d\n", length, in, out, m, n) + os.Exit(1) return } // before @@ -252,6 +255,7 @@ func verify32(length, in, out, m int) { n := ncopied(length, in, out) if m != n { fmt.Printf("count bad(%d %d %d): %d not %d\n", length, in, out, m, n) + os.Exit(1) return } // before @@ -292,6 +296,7 @@ func verify64(length, in, out, m int) { n := ncopied(length, in, out) if m != n { fmt.Printf("count bad(%d %d %d): %d not %d\n", length, in, out, m, n) + os.Exit(1) return } // before diff --git a/gcc/testsuite/go.test/test/ddd2.dir/ddd2.go b/gcc/testsuite/go.test/test/ddd2.dir/ddd2.go new file mode 100644 index 00000000000..c9a26759260 --- /dev/null +++ b/gcc/testsuite/go.test/test/ddd2.dir/ddd2.go @@ -0,0 +1,16 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file is compiled and then imported by ddd3.go. + +package ddd + +func Sum(args ...int) int { + s := 0 + for _, v := range args { + s += v + } + return s +} + diff --git a/gcc/testsuite/go.test/test/ddd3.go b/gcc/testsuite/go.test/test/ddd2.dir/ddd3.go index d8de0a77e90..5486fe8a049 100644 --- a/gcc/testsuite/go.test/test/ddd3.go +++ b/gcc/testsuite/go.test/test/ddd2.dir/ddd3.go @@ -1,8 +1,3 @@ -// $G $D/ddd2.go && $G $D/$F.go && $L $F.$A && ./$A.out - -// NOTE: This test is not run by 'run.go' and so not run by all.bash. -// To run this test you must use the ./run shell script. - // Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. diff --git a/gcc/testsuite/go.test/test/ddd2.go b/gcc/testsuite/go.test/test/ddd2.go index a141a39c766..0d9f634ab60 100644 --- a/gcc/testsuite/go.test/test/ddd2.go +++ b/gcc/testsuite/go.test/test/ddd2.go @@ -1,18 +1,9 @@ -// skip +// rundir // Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// This file is compiled and then imported by ddd3.go. - -package ddd - -func Sum(args ...int) int { - s := 0 - for _, v := range args { - s += v - } - return s -} +// Test that variadic functions work across package boundaries. +package ignored diff --git a/gcc/testsuite/go.test/test/decl.go b/gcc/testsuite/go.test/test/decl.go index 6f84245f152..e2f126adb21 100644 --- a/gcc/testsuite/go.test/test/decl.go +++ b/gcc/testsuite/go.test/test/decl.go @@ -33,8 +33,9 @@ func main() { m, h, s := f3() _, _, _, _, _, _, _, _, _ = i, f, s, j, k, m, g, s, h } - if x() != "3" { - println("x() failed") + if y := x(); y != "3" { + println("x() failed", y) + panic("fail") } _, _, _, _, _, _, _, _, _ = i, f, s, j, k, m, g, s, h } diff --git a/gcc/testsuite/go.test/test/declbad.go b/gcc/testsuite/go.test/test/declbad.go index ff53ab0d7c5..728eceb7f1e 100644 --- a/gcc/testsuite/go.test/test/declbad.go +++ b/gcc/testsuite/go.test/test/declbad.go @@ -41,7 +41,8 @@ func main() { { // multiline no new variables i := f1 - i := func() { // ERROR "redeclared|no new|incompatible" + i := func() int { // ERROR "redeclared|no new|incompatible" + return 0 } _ = i } diff --git a/gcc/testsuite/go.test/test/defer.go b/gcc/testsuite/go.test/test/defer.go index 2f67d356091..6731ab7ee8b 100644 --- a/gcc/testsuite/go.test/test/defer.go +++ b/gcc/testsuite/go.test/test/defer.go @@ -25,6 +25,7 @@ func test1() { test1helper() if result != "9876543210" { fmt.Printf("test1: bad defer result (should be 9876543210): %q\n", result) + panic("defer") } } @@ -41,6 +42,7 @@ func test2() { test2helper() if result != "9876543210" { fmt.Printf("test2: bad defer result (should be 9876543210): %q\n", result) + panic("defer") } } diff --git a/gcc/testsuite/go.test/test/divide.go b/gcc/testsuite/go.test/test/divide.go index c91a33e9db2..b20f1062f62 100644 --- a/gcc/testsuite/go.test/test/divide.go +++ b/gcc/testsuite/go.test/test/divide.go @@ -13,36 +13,44 @@ import "fmt" func f8(x, y, q, r int8) { if t := x / y; t != q { fmt.Printf("%d/%d = %d, want %d\n", x, y, t, q) + panic("divide") } if t := x % y; t != r { fmt.Printf("%d%%%d = %d, want %d\n", x, y, t, r) + panic("divide") } } func f16(x, y, q, r int16) { if t := x / y; t != q { fmt.Printf("%d/%d = %d, want %d\n", x, y, t, q) + panic("divide") } if t := x % y; t != r { fmt.Printf("%d%%%d = %d, want %d\n", x, y, t, r) + panic("divide") } } func f32(x, y, q, r int32) { if t := x / y; t != q { fmt.Printf("%d/%d = %d, want %d\n", x, y, t, q) + panic("divide") } if t := x % y; t != r { fmt.Printf("%d%%%d = %d, want %d\n", x, y, t, r) + panic("divide") } } func f64(x, y, q, r int64) { if t := x / y; t != q { fmt.Printf("%d/%d = %d, want %d\n", x, y, t, q) + panic("divide") } if t := x % y; t != r { fmt.Printf("%d%%%d = %d, want %d\n", x, y, t, r) + panic("divide") } } diff --git a/gcc/testsuite/go.test/test/dwarf/main.go b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/main.go index 175a09c7799..175a09c7799 100644 --- a/gcc/testsuite/go.test/test/dwarf/main.go +++ b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/main.go diff --git a/gcc/testsuite/go.test/test/dwarf/z1.go b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z1.go index 7f163e9a1d9..7f163e9a1d9 100644 --- a/gcc/testsuite/go.test/test/dwarf/z1.go +++ b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z1.go diff --git a/gcc/testsuite/go.test/test/dwarf/z10.go b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z10.go index 19c70020e0c..19c70020e0c 100644 --- a/gcc/testsuite/go.test/test/dwarf/z10.go +++ b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z10.go diff --git a/gcc/testsuite/go.test/test/dwarf/z11.go b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z11.go index c1d2f9180f1..c1d2f9180f1 100644 --- a/gcc/testsuite/go.test/test/dwarf/z11.go +++ b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z11.go diff --git a/gcc/testsuite/go.test/test/dwarf/z12.go b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z12.go index 7455f189468..7455f189468 100644 --- a/gcc/testsuite/go.test/test/dwarf/z12.go +++ b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z12.go diff --git a/gcc/testsuite/go.test/test/dwarf/z13.go b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z13.go index ecb3c4c8c71..ecb3c4c8c71 100644 --- a/gcc/testsuite/go.test/test/dwarf/z13.go +++ b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z13.go diff --git a/gcc/testsuite/go.test/test/dwarf/z14.go b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z14.go index 134b39b64e2..134b39b64e2 100644 --- a/gcc/testsuite/go.test/test/dwarf/z14.go +++ b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z14.go diff --git a/gcc/testsuite/go.test/test/dwarf/z15.go b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z15.go index d73819b443b..d73819b443b 100644 --- a/gcc/testsuite/go.test/test/dwarf/z15.go +++ b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z15.go diff --git a/gcc/testsuite/go.test/test/dwarf/z16.go b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z16.go index 6c31651baa8..6c31651baa8 100644 --- a/gcc/testsuite/go.test/test/dwarf/z16.go +++ b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z16.go diff --git a/gcc/testsuite/go.test/test/dwarf/z17.go b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z17.go index b742d167260..b742d167260 100644 --- a/gcc/testsuite/go.test/test/dwarf/z17.go +++ b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z17.go diff --git a/gcc/testsuite/go.test/test/dwarf/z18.go b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z18.go index 84150ff0a35..84150ff0a35 100644 --- a/gcc/testsuite/go.test/test/dwarf/z18.go +++ b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z18.go diff --git a/gcc/testsuite/go.test/test/dwarf/z19.go b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z19.go index bb2e2968417..bb2e2968417 100644 --- a/gcc/testsuite/go.test/test/dwarf/z19.go +++ b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z19.go diff --git a/gcc/testsuite/go.test/test/dwarf/z2.go b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z2.go index 68bd58257d9..68bd58257d9 100644 --- a/gcc/testsuite/go.test/test/dwarf/z2.go +++ b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z2.go diff --git a/gcc/testsuite/go.test/test/dwarf/z20.go b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z20.go index 03111e18452..03111e18452 100644 --- a/gcc/testsuite/go.test/test/dwarf/z20.go +++ b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z20.go diff --git a/gcc/testsuite/go.test/test/dwarf/z3.go b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z3.go index 5e4ad3ae257..5e4ad3ae257 100644 --- a/gcc/testsuite/go.test/test/dwarf/z3.go +++ b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z3.go diff --git a/gcc/testsuite/go.test/test/dwarf/z4.go b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z4.go index 1f28465c577..1f28465c577 100644 --- a/gcc/testsuite/go.test/test/dwarf/z4.go +++ b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z4.go diff --git a/gcc/testsuite/go.test/test/dwarf/z5.go b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z5.go index 7f4eeb419a3..7f4eeb419a3 100644 --- a/gcc/testsuite/go.test/test/dwarf/z5.go +++ b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z5.go diff --git a/gcc/testsuite/go.test/test/dwarf/z6.go b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z6.go index 241791dff2b..241791dff2b 100644 --- a/gcc/testsuite/go.test/test/dwarf/z6.go +++ b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z6.go diff --git a/gcc/testsuite/go.test/test/dwarf/z7.go b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z7.go index 68c1ad0c243..68c1ad0c243 100644 --- a/gcc/testsuite/go.test/test/dwarf/z7.go +++ b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z7.go diff --git a/gcc/testsuite/go.test/test/dwarf/z8.go b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z8.go index 16eed32a28d..16eed32a28d 100644 --- a/gcc/testsuite/go.test/test/dwarf/z8.go +++ b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z8.go diff --git a/gcc/testsuite/go.test/test/dwarf/z9.go b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z9.go index cbb94b4d2be..cbb94b4d2be 100644 --- a/gcc/testsuite/go.test/test/dwarf/z9.go +++ b/gcc/testsuite/go.test/test/dwarf/dwarf.dir/z9.go diff --git a/gcc/testsuite/go.test/test/dwarf/dwarf.go b/gcc/testsuite/go.test/test/dwarf/dwarf.go new file mode 100644 index 00000000000..32dd7d3d576 --- /dev/null +++ b/gcc/testsuite/go.test/test/dwarf/dwarf.go @@ -0,0 +1,10 @@ +// rundir + +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// See issue 2241 and issue 1878: dwarf include stack size +// issues in linker. + +package ignored diff --git a/gcc/testsuite/go.test/test/errchk b/gcc/testsuite/go.test/test/errchk index 6b00570bdec..b8b312a9237 100755 --- a/gcc/testsuite/go.test/test/errchk +++ b/gcc/testsuite/go.test/test/errchk @@ -31,7 +31,7 @@ if(@ARGV < 1) { # Grab SOURCEFILES foreach(reverse 0 .. @ARGV-1) { - unless($ARGV[$_] =~ /\.go$/) { + unless($ARGV[$_] =~ /\.(go|s)$/) { @file = @ARGV[$_+1 .. @ARGV-1]; last; } diff --git a/gcc/testsuite/go.test/test/escape.go b/gcc/testsuite/go.test/test/escape.go index e8ede52760a..252a1e59cc8 100644 --- a/gcc/testsuite/go.test/test/escape.go +++ b/gcc/testsuite/go.test/test/escape.go @@ -52,9 +52,11 @@ func chk(p, q *int, v int, s string) { func chkalias(p, q *int, v int, s string) { if p != q { println("want aliased pointers but got different after", s) + bad = true } if *q != v+1 { println("wrong value want", v+1, "got", *q, "after", s) + bad = true } } diff --git a/gcc/testsuite/go.test/test/escape2.go b/gcc/testsuite/go.test/test/escape2.go index 8db12d99131..511b74a1cca 100644 --- a/gcc/testsuite/go.test/test/escape2.go +++ b/gcc/testsuite/go.test/test/escape2.go @@ -80,7 +80,9 @@ func foo12(yyy **int) { // ERROR "leaking param: yyy" xxx = yyy } -func foo13(yyy **int) { // ERROR "yyy does not escape" +// Must treat yyy as leaking because *yyy leaks, and the escape analysis +// summaries in exported metadata do not distinguish these two cases. +func foo13(yyy **int) { // ERROR "leaking param: yyy" *xxx = *yyy } @@ -142,13 +144,13 @@ func (b Bar) AlsoLeak() *int { // ERROR "leaking param: b" } func (b Bar) LeaksToo() *int { // ERROR "leaking param: b" - v := 0 // ERROR "moved to heap: v" + v := 0 // ERROR "moved to heap: v" b.ii = &v // ERROR "&v escapes" return b.ii } func (b *Bar) LeaksABit() *int { // ERROR "b does not escape" - v := 0 // ERROR "moved to heap: v" + v := 0 // ERROR "moved to heap: v" b.ii = &v // ERROR "&v escapes" return b.ii } @@ -299,7 +301,8 @@ func (f *Foo) foo45() { // ERROR "f does not escape" F.x = f.x } -func (f *Foo) foo46() { // ERROR "f does not escape" +// See foo13 above for explanation of why f leaks. +func (f *Foo) foo46() { // ERROR "leaking param: f" F.xx = f.xx } @@ -561,12 +564,21 @@ func myprint1(y *int, x ...interface{}) *interface{} { // ERROR "y does not esca return &x[0] // ERROR "&x.0. escapes to heap" } -func foo75(z *int) { // ERROR "leaking param: z" +func foo75(z *int) { // ERROR "z does not escape" myprint(z, 1, 2, 3) // ERROR "[.][.][.] argument does not escape" } func foo75a(z *int) { // ERROR "z does not escape" - myprint1(z, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap" + myprint1(z, 1, 2, 3) // ERROR "[.][.][.] argument does not escape" +} + +func foo75esc(z *int) { // ERROR "leaking param: z" + gxx = myprint(z, 1, 2, 3) // ERROR "[.][.][.] argument does not escape" +} + +func foo75aesc(z *int) { // ERROR "z does not escape" + var ppi **interface{} // assignments to pointer dereferences lose track + *ppi = myprint1(z, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap" } func foo76(z *int) { // ERROR "leaking param: z" @@ -574,7 +586,7 @@ func foo76(z *int) { // ERROR "leaking param: z" } func foo76a(z *int) { // ERROR "leaking param: z" - myprint1(nil, z) // ERROR "[.][.][.] argument escapes to heap" + myprint1(nil, z) // ERROR "[.][.][.] argument does not escape" } func foo76b() { @@ -582,7 +594,7 @@ func foo76b() { } func foo76c() { - myprint1(nil, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap" + myprint1(nil, 1, 2, 3) // ERROR "[.][.][.] argument does not escape" } func foo76d() { @@ -590,7 +602,7 @@ func foo76d() { } func foo76e() { - defer myprint1(nil, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap" + defer myprint1(nil, 1, 2, 3) // ERROR "[.][.][.] argument does not escape" } func foo76f() { @@ -610,10 +622,15 @@ func foo77(z []interface{}) { // ERROR "z does not escape" myprint(nil, z...) // z does not escape } -func foo77a(z []interface{}) { // ERROR "leaking param: z" +func foo77a(z []interface{}) { // ERROR "z does not escape" myprint1(nil, z...) } +func foo77b(z []interface{}) { // ERROR "leaking param: z" + var ppi **interface{} + *ppi = myprint1(nil, z...) +} + func foo78(z int) *int { // ERROR "moved to heap: z" return &z // ERROR "&z escapes to heap" } @@ -646,6 +663,21 @@ func foo81() *int { return nil } +func tee(p *int) (x, y *int) { return p, p } // ERROR "leaking param" + +func noop(x, y *int) {} // ERROR "does not escape" + +func foo82() { + var x, y, z int // ERROR "moved to heap" + go noop(tee(&z)) // ERROR "&z escapes to heap" + go noop(&x, &y) // ERROR "escapes to heap" + for { + var u, v, w int // ERROR "moved to heap" + defer noop(tee(&u)) // ERROR "&u escapes to heap" + defer noop(&v, &w) // ERROR "escapes to heap" + } +} + type Fooer interface { Foo() } @@ -1079,29 +1111,29 @@ L1: _ = i } -func foo124(x **int) { // ERROR "x does not escape" - var i int // ERROR "moved to heap: i" - p := &i // ERROR "&i escapes" - func() { // ERROR "func literal does not escape" - *x = p // ERROR "leaking closure reference p" +func foo124(x **int) { // ERROR "x does not escape" + var i int // ERROR "moved to heap: i" + p := &i // ERROR "&i escapes" + func() { // ERROR "func literal does not escape" + *x = p // ERROR "leaking closure reference p" }() } -func foo125(ch chan *int) { // ERROR "does not escape" - var i int // ERROR "moved to heap" - p := &i // ERROR "&i escapes to heap" - func() { // ERROR "func literal does not escape" - ch <- p // ERROR "leaking closure reference p" +func foo125(ch chan *int) { // ERROR "does not escape" + var i int // ERROR "moved to heap" + p := &i // ERROR "&i escapes to heap" + func() { // ERROR "func literal does not escape" + ch <- p // ERROR "leaking closure reference p" }() } func foo126() { - var px *int // loopdepth 0 + var px *int // loopdepth 0 for { // loopdepth 1 - var i int // ERROR "moved to heap" + var i int // ERROR "moved to heap" func() { // ERROR "func literal does not escape" - px = &i // ERROR "&i escapes" + px = &i // ERROR "&i escapes" }() } } @@ -1109,8 +1141,8 @@ func foo126() { var px *int func foo127() { - var i int // ERROR "moved to heap: i" - p := &i // ERROR "&i escapes to heap" + var i int // ERROR "moved to heap: i" + p := &i // ERROR "&i escapes to heap" q := p px = q } @@ -1123,12 +1155,12 @@ func foo128() { } func foo129() { - var i int // ERROR "moved to heap: i" - p := &i // ERROR "&i escapes to heap" + var i int // ERROR "moved to heap: i" + p := &i // ERROR "&i escapes to heap" func() { // ERROR "func literal does not escape" - q := p // ERROR "leaking closure reference p" - func() { // ERROR "func literal does not escape" - r := q // ERROR "leaking closure reference q" + q := p // ERROR "leaking closure reference p" + func() { // ERROR "func literal does not escape" + r := q // ERROR "leaking closure reference q" px = r }() }() @@ -1136,40 +1168,40 @@ func foo129() { func foo130() { for { - var i int // ERROR "moved to heap" + var i int // ERROR "moved to heap" func() { // ERROR "func literal does not escape" - px = &i // ERROR "&i escapes" "leaking closure reference i" + px = &i // ERROR "&i escapes" "leaking closure reference i" }() } } func foo131() { - var i int // ERROR "moved to heap" + var i int // ERROR "moved to heap" func() { // ERROR "func literal does not escape" - px = &i // ERROR "&i escapes" "leaking closure reference i" + px = &i // ERROR "&i escapes" "leaking closure reference i" }() } func foo132() { - var i int // ERROR "moved to heap" - go func() { // ERROR "func literal escapes to heap" - px = &i // ERROR "&i escapes" "leaking closure reference i" + var i int // ERROR "moved to heap" + go func() { // ERROR "func literal escapes to heap" + px = &i // ERROR "&i escapes" "leaking closure reference i" }() } func foo133() { - var i int // ERROR "moved to heap" - defer func() { // ERROR "func literal does not escape" - px = &i // ERROR "&i escapes" "leaking closure reference i" + var i int // ERROR "moved to heap" + defer func() { // ERROR "func literal does not escape" + px = &i // ERROR "&i escapes" "leaking closure reference i" }() } func foo134() { var i int p := &i // ERROR "&i does not escape" - func() { // ERROR "func literal does not escape" + func() { // ERROR "func literal does not escape" q := p - func() { // ERROR "func literal does not escape" + func() { // ERROR "func literal does not escape" r := q _ = r }() @@ -1177,11 +1209,11 @@ func foo134() { } func foo135() { - var i int // ERROR "moved to heap: i" - p := &i // ERROR "&i escapes to heap" "moved to heap: p" - go func() { // ERROR "func literal escapes to heap" - q := p // ERROR "&p escapes to heap" - func() { // ERROR "func literal does not escape" + var i int // ERROR "moved to heap: i" + p := &i // ERROR "&i escapes to heap" "moved to heap: p" + go func() { // ERROR "func literal escapes to heap" + q := p // ERROR "&p escapes to heap" + func() { // ERROR "func literal does not escape" r := q _ = r }() @@ -1189,11 +1221,11 @@ func foo135() { } func foo136() { - var i int // ERROR "moved to heap: i" - p := &i // ERROR "&i escapes to heap" "moved to heap: p" - go func() { // ERROR "func literal escapes to heap" - q := p // ERROR "&p escapes to heap" "leaking closure reference p" - func() { // ERROR "func literal does not escape" + var i int // ERROR "moved to heap: i" + p := &i // ERROR "&i escapes to heap" "moved to heap: p" + go func() { // ERROR "func literal escapes to heap" + q := p // ERROR "&p escapes to heap" "leaking closure reference p" + func() { // ERROR "func literal does not escape" r := q // ERROR "leaking closure reference q" px = r }() @@ -1201,12 +1233,12 @@ func foo136() { } func foo137() { - var i int // ERROR "moved to heap: i" - p := &i // ERROR "&i escapes to heap" + var i int // ERROR "moved to heap: i" + p := &i // ERROR "&i escapes to heap" func() { // ERROR "func literal does not escape" - q := p // ERROR "leaking closure reference p" "moved to heap: q" + q := p // ERROR "leaking closure reference p" "moved to heap: q" go func() { // ERROR "func literal escapes to heap" - r := q // ERROR "&q escapes to heap" + r := q // ERROR "&q escapes to heap" _ = r }() }() @@ -1216,7 +1248,7 @@ func foo138() *byte { type T struct { x [1]byte } - t := new(T) // ERROR "new.T. escapes to heap" + t := new(T) // ERROR "new.T. escapes to heap" return &t.x[0] // ERROR "&t.x.0. escapes to heap" } @@ -1226,6 +1258,70 @@ func foo139() *byte { y byte } } - t := new(T) // ERROR "new.T. escapes to heap" + t := new(T) // ERROR "new.T. escapes to heap" return &t.x.y // ERROR "&t.x.y escapes to heap" } + +// issue 4751 +func foo140() interface{} { + type T struct { + X string + } + type U struct { + X string + T *T + } + t := &T{} // ERROR "&T literal escapes to heap" + return U{ + X: t.X, + T: t, + } +} + +//go:noescape + +func F1([]byte) + +func F2([]byte) + +//go:noescape + +func F3(x []byte) // ERROR "F3 x does not escape" + +func F4(x []byte) + +func G() { + var buf1 [10]byte + F1(buf1[:]) // ERROR "buf1 does not escape" + + var buf2 [10]byte // ERROR "moved to heap: buf2" + F2(buf2[:]) // ERROR "buf2 escapes to heap" + + var buf3 [10]byte + F3(buf3[:]) // ERROR "buf3 does not escape" + + var buf4 [10]byte // ERROR "moved to heap: buf4" + F4(buf4[:]) // ERROR "buf4 escapes to heap" +} + +type Tm struct { + x int +} + +func (t *Tm) M() { // ERROR "t does not escape" +} + +func foo141() { + var f func() + + t := new(Tm) // ERROR "escapes to heap" + f = t.M // ERROR "t.M does not escape" + _ = f +} + +var gf func() + +func foo142() { + t := new(Tm) // ERROR "escapes to heap" + gf = t.M // ERROR "t.M escapes to heap" +} diff --git a/gcc/testsuite/go.test/test/escape5.go b/gcc/testsuite/go.test/test/escape5.go new file mode 100644 index 00000000000..6b327fe9e31 --- /dev/null +++ b/gcc/testsuite/go.test/test/escape5.go @@ -0,0 +1,144 @@ +// errorcheck -0 -m -l + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Test, using compiler diagnostic flags, that the escape analysis is working. +// Compiles but does not run. Inlining is disabled. + +package foo + +func noleak(p *int) int { // ERROR "p does not escape" + return *p +} + +func leaktoret(p *int) *int { // ERROR "leaking param: p to result" + return p +} + +func leaktoret2(p *int) (*int, *int) { // ERROR "leaking param: p to result .anon1" "leaking param: p to result .anon2" + return p, p +} + +func leaktoret22(p, q *int) (*int, *int) { // ERROR "leaking param: p to result .anon2" "leaking param: q to result .anon3" + return p, q +} + +func leaktoret22b(p, q *int) (*int, *int) { // ERROR "leaking param: p to result .anon3" "leaking param: q to result .anon2" + return leaktoret22(q, p) +} + +func leaktoret22c(p, q *int) (*int, *int) { // ERROR "leaking param: p to result .anon3" "leaking param: q to result .anon2" + r, s := leaktoret22(q, p) + return r, s +} + +func leaktoret22d(p, q *int) (r, s *int) { // ERROR "leaking param: p to result s" "leaking param: q to result r" + r, s = leaktoret22(q, p) + return +} + +func leaktoret22e(p, q *int) (r, s *int) { // ERROR "leaking param: p to result s" "leaking param: q to result r" + r, s = leaktoret22(q, p) + return r, s +} + +func leaktoret22f(p, q *int) (r, s *int) { // ERROR "leaking param: p to result s" "leaking param: q to result r" + rr, ss := leaktoret22(q, p) + return rr, ss +} + +var gp *int + +func leaktosink(p *int) *int { // ERROR "leaking param: p" + gp = p + return p +} + +func f1() { + var x int + p := noleak(&x) // ERROR "&x does not escape" + _ = p +} + +func f2() { + var x int + p := leaktoret(&x) // ERROR "&x does not escape" + _ = p +} + +func f3() { + var x int // ERROR "moved to heap: x" + p := leaktoret(&x) // ERROR "&x escapes to heap" + gp = p +} + +func f4() { + var x int // ERROR "moved to heap: x" + p, q := leaktoret2(&x) // ERROR "&x escapes to heap" + gp = p + gp = q +} + +func f5() { + var x int + leaktoret22(leaktoret2(&x)) // ERROR "&x does not escape" +} + +func f6() { + var x int // ERROR "moved to heap: x" + px1, px2 := leaktoret22(leaktoret2(&x)) // ERROR "&x escapes to heap" + gp = px1 + _ = px2 +} + +type T struct{ x int } + +func (t *T) Foo(u int) (*T, bool) { // ERROR "leaking param: t to result" + t.x += u + return t, true +} + +func f7() *T { + r, _ := new(T).Foo(42) // ERROR "new.T. escapes to heap" + return r +} + +func leakrecursive1(p, q *int) (*int, *int) { // ERROR "leaking param: p" "leaking param: q" + return leakrecursive2(q, p) +} + +func leakrecursive2(p, q *int) (*int, *int) { // ERROR "leaking param: p" "leaking param: q" + if *p > *q { + return leakrecursive1(q, p) + } + // without this, leakrecursive? are safe for p and q, b/c in fact their graph does not have leaking edges. + return p, q +} + + +var global interface{} + +type T1 struct { + X *int +} + +type T2 struct { + Y *T1 +} + +func f8(p *T1) (k T2) { // ERROR "leaking param: p to result k" "leaking param: p" + if p == nil { + k = T2{} + return + } + + global = p // should make p leak always + return T2{p} +} + +func f9() { + var j T1 // ERROR "moved to heap: j" + f8(&j) // ERROR "&j escapes to heap" +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug040.go b/gcc/testsuite/go.test/test/fixedbugs/bug040.go index 007f47f9f56..d2cf88afcb2 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug040.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug040.go @@ -7,5 +7,5 @@ package main func f (x, // GCCGO_ERROR "previous" - x int) { // ERROR "redeclared|redefinition" "duplicate" + x int) { // ERROR "duplicate argument|redefinition" } diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug083.go b/gcc/testsuite/go.test/test/fixedbugs/bug083.go index 8bdecaadb51..54a17423a08 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug083.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug083.go @@ -1,10 +1,7 @@ -// $G $D/$F.dir/bug0.go && errchk $G $D/$F.dir/bug1.go - -// NOTE: This test is not run by 'run.go' and so not run by all.bash. -// To run this test you must use the ./run shell script. +// errorcheckdir // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -ignored +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug085.go b/gcc/testsuite/go.test/test/fixedbugs/bug085.go index 93ae7e0a496..dae83f8a498 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug085.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug085.go @@ -20,7 +20,7 @@ Bus error /* expected scope hierarchy (outermost to innermost) -universe scope (contains predeclared identifiers int, float, int32, len, etc.) +universe scope (contains predeclared identifiers int, float32, int32, len, etc.) "solar" scope (just holds the package name P so it can be found but doesn't conflict) global scope (the package global scope) local scopes (function scopes) diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug133.go b/gcc/testsuite/go.test/test/fixedbugs/bug133.go index a6baac26ca3..54a17423a08 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug133.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug133.go @@ -1,10 +1,7 @@ -// $G $D/$F.dir/bug0.go && $G $D/$F.dir/bug1.go && errchk $G $D/$F.dir/bug2.go - -// NOTE: This test is not run by 'run.go' and so not run by all.bash. -// To run this test you must use the ./run shell script. +// errorcheckdir // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -ignored +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug160.go b/gcc/testsuite/go.test/test/fixedbugs/bug160.go index c5e166a0cf9..fde797bfcd2 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug160.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug160.go @@ -1,10 +1,7 @@ -// $G $D/bug160.dir/x.go && $G $D/bug160.dir/y.go && $L y.$A && ./$A.out - -// NOTE: This test is not run by 'run.go' and so not run by all.bash. -// To run this test you must use the ./run shell script. +// rundir // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -nothing to see here +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug191.dir/main.go b/gcc/testsuite/go.test/test/fixedbugs/bug191.dir/main.go new file mode 100644 index 00000000000..995134ccfcb --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug191.dir/main.go @@ -0,0 +1,14 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import . "./a" +import . "./b" + +var _ T +var _ V + +func main() { +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug191.go b/gcc/testsuite/go.test/test/fixedbugs/bug191.go index 11a6e58e516..248e23edfc6 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug191.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug191.go @@ -1,19 +1,9 @@ -// $G $D/bug191.dir/a.go && $G $D/bug191.dir/b.go && $G $D/$F.go && $L $F.$A - -// NOTE: This test is not run by 'run.go' and so not run by all.bash. -// To run this test you must use the ./run shell script. +// rundir // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package main - -import . "./a" -import . "./b" - -var _ T -var _ V +// Tests bug with dot imports. -func main() { -} +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug205.go b/gcc/testsuite/go.test/test/fixedbugs/bug205.go index de17cb69841..1e0d9d1f34d 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug205.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug205.go @@ -11,8 +11,8 @@ var s string; var m map[string]int; func main() { - println(t["hi"]); // ERROR "integer" - println(s["hi"]); // ERROR "integer" "to type uint" - println(m[0]); // ERROR "map index" + println(t["hi"]); // ERROR "non-integer slice index|must be integer" + println(s["hi"]); // ERROR "non-integer string index|must be integer" + println(m[0]); // ERROR "cannot use.*as type string" } diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug228.go b/gcc/testsuite/go.test/test/fixedbugs/bug228.go index f2dd54556bf..3fccd172888 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug228.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug228.go @@ -12,7 +12,7 @@ func g(x int, y float32) (...) // ERROR "[.][.][.]" "final argument" func h(x, y ...int) // ERROR "[.][.][.]" -func i(x int, y ...int, z float) // ERROR "[.][.][.]" +func i(x int, y ...int, z float32) // ERROR "[.][.][.]" var x ...int; // ERROR "[.][.][.]|syntax|type" diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug255.go b/gcc/testsuite/go.test/test/fixedbugs/bug255.go index dbd41cc6ab3..acf4f23910d 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug255.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug255.go @@ -12,4 +12,4 @@ var c [1.5]int // ERROR "truncated" var d ["abc"]int // ERROR "invalid array bound|not numeric" var e [nil]int // ERROR "invalid array bound|not numeric" var f [e]int // ERROR "invalid array bound|not constant" -var g [1<<65]int // ERROR "overflows" +var g [1<<65]int // ERROR "array bound is too large|overflows" diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug297.go b/gcc/testsuite/go.test/test/fixedbugs/bug297.go index b5dfa8d878e..ee2ff92437d 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug297.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug297.go @@ -11,5 +11,5 @@ package main type ByteSize float64 const ( _ = iota; // ignore first value by assigning to blank identifier - KB ByteSize = 1<<(10*X) // ERROR "undefined" "as type ByteSize" + KB ByteSize = 1<<(10*X) // ERROR "undefined" "is not a constant|as type ByteSize" ) diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug313.go b/gcc/testsuite/go.test/test/fixedbugs/bug313.go index 9009c5e8ffc..a7c1d3627bf 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug313.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug313.go @@ -1,7 +1,4 @@ -// errchk $G -e $D/$F.dir/[ab].go - -// NOTE: This test is not run by 'run.go' and so not run by all.bash. -// To run this test you must use the ./run shell script. +// errorcheckdir // Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug322.go b/gcc/testsuite/go.test/test/fixedbugs/bug322.go index 401a8600a9e..21efbb55935 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug322.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug322.go @@ -1,11 +1,8 @@ -// $G $D/$F.dir/lib.go && $G $D/$F.dir/main.go && $L main.$A && ./$A.out || echo BUG: fails incorrectly - -// NOTE: This test is not run by 'run.go' and so not run by all.bash. -// To run this test you must use the ./run shell script. +// rundir // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Test case for issue 1402. -ignored +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug324.dir/main.go b/gcc/testsuite/go.test/test/fixedbugs/bug324.dir/prog.go index 3ab61f3eb5e..3ab61f3eb5e 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug324.dir/main.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug324.dir/prog.go diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug324.go b/gcc/testsuite/go.test/test/fixedbugs/bug324.go index ee090ae42f4..36b8b56d123 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug324.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug324.go @@ -1,11 +1,10 @@ -// $G $D/$F.dir/p.go && $G $D/$F.dir/main.go && $L main.$A && ./$A.out - -// NOTE: This test is not run by 'run.go' and so not run by all.bash. -// To run this test you must use the ./run shell script. +// rundir // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Test case for issue 1550 -ignored +// Test case for issue 1550: a type cannot implement an interface +// from another package with a private method, and type assertions +// should fail. +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug342.go b/gcc/testsuite/go.test/test/fixedbugs/bug342.go index 5f1efbdfe1e..ffcb6681160 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug342.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug342.go @@ -9,11 +9,7 @@ package p type a interface { - foo(x int) (x int) // ERROR "redeclared|redefinition" -} - -var b interface { - bar(y int) (y int) // ERROR "redeclared|redefinition" + foo(x int) (x int) // ERROR "duplicate argument|redefinition" } /* diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug357.go b/gcc/testsuite/go.test/test/fixedbugs/bug357.go index 2ac64a80b64..ceb2009be51 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug357.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug357.go @@ -15,7 +15,7 @@ func bla1() bool { func bla5() bool { _ = 1 - false // ERROR "false not used|value computed is not used" + false // ERROR "false evaluated but not used|value computed is not used" _ = 2 return false } diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug367.dir/main.go b/gcc/testsuite/go.test/test/fixedbugs/bug367.dir/prog.go index c278e4dd95f..c278e4dd95f 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug367.dir/main.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug367.dir/prog.go diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug367.go b/gcc/testsuite/go.test/test/fixedbugs/bug367.go index bf8edcd1b85..05252cd9a6d 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug367.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug367.go @@ -1,10 +1,10 @@ -// $G $D/$F.dir/p.go && $G $D/$F.dir/main.go && $L main.$A && ./$A.out || echo BUG: should not fail - -// NOTE: This test is not run by 'run.go' and so not run by all.bash. -// To run this test you must use the ./run shell script. +// rundir // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +// Issue 1536: bug when handling imported interfaces with +// private methods. + package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug379.go b/gcc/testsuite/go.test/test/fixedbugs/bug379.go index 81e9c266ee4..14abe469bec 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug379.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug379.go @@ -14,5 +14,5 @@ package main func main() { - 1 + 2 // ERROR "1 \+ 2 not used|value computed is not used" + 1 + 2 // ERROR "1 \+ 2 evaluated but not used|value computed is not used" } diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug382.dir/prog.go b/gcc/testsuite/go.test/test/fixedbugs/bug382.dir/prog.go new file mode 100644 index 00000000000..b74a82d8241 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug382.dir/prog.go @@ -0,0 +1,13 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file + +// Issue 2529 + +package main + +import "./pkg" + +var x = pkg.E + +var fo = struct{ F pkg.T }{F: x} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug382.go b/gcc/testsuite/go.test/test/fixedbugs/bug382.go index 10c71d46624..6039939eeb8 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug382.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug382.go @@ -1,17 +1,9 @@ -// $G $D/$F.dir/pkg.go && $G $D/$F.go || echo "Bug 382" - -// NOTE: This test is not run by 'run.go' and so not run by all.bash. -// To run this test you must use the ./run shell script. +// compiledir // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file -// Issue 2529 - -package main -import "./pkg" - -var x = pkg.E +// Issue 2529. -var fo = struct {F pkg.T}{F: x} +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug385_32.go b/gcc/testsuite/go.test/test/fixedbugs/bug385_32.go index 5ac4136e7dc..4c3cad7798e 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug385_32.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug385_32.go @@ -1,7 +1,5 @@ -// [ $A == 6 ] || errchk $G -e $D/$F.go - -// NOTE: This test is not run by 'run.go' and so not run by all.bash. -// To run this test you must use the ./run shell script. +// +build 386 arm +// errorcheck // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style @@ -11,7 +9,7 @@ package main func main() { - var arr [1000200030]int // ERROR "type .* too large" + var arr [1000200030]int // GC_ERROR "type .* too large" arr_bkup := arr _ = arr_bkup -}
\ No newline at end of file +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug385_64.go b/gcc/testsuite/go.test/test/fixedbugs/bug385_64.go index 8c7b9d52081..b593cd53cf1 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug385_64.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug385_64.go @@ -1,18 +1,22 @@ -// [ $A != 6 ] || errchk $G -e $D/$F.go - -// NOTE: This test is not run by 'run.go' and so not run by all.bash. -// To run this test you must use the ./run shell script. +// +build amd64 +// errorcheck // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Issue 2444 +// Issue 4666: issue with arrays of exactly 4GB. package main -func main() { // ERROR "stack frame too large" + +func main() { // GC_ERROR "stack frame too large" var arr [1000200030]int32 arr_bkup := arr _ = arr_bkup } +func F() { // GC_ERROR "stack frame too large" + var arr [1 << 30]int32 + _ = arr[42] +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug412.go b/gcc/testsuite/go.test/test/fixedbugs/bug412.go index 8dd0a5fcc15..c7ddc0cac83 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug412.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug412.go @@ -7,8 +7,8 @@ package p type t struct { - x int // ERROR "duplicate field x|duplicate field name .x." - x int + x int // GCCGO_ERROR "duplicate field name .x." + x int // GC_ERROR "duplicate field x" } func f(t *t) int { diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug414.dir/main.go b/gcc/testsuite/go.test/test/fixedbugs/bug414.dir/main.go deleted file mode 100644 index 52001233c62..00000000000 --- a/gcc/testsuite/go.test/test/fixedbugs/bug414.dir/main.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - - package main - - import "./p1" - - type MyObject struct { - p1.Fer - } - - func main() { - var b p1.Fer = &p1.Object{} - p1.PrintFer(b) - var c p1.Fer = &MyObject{b} - p1.PrintFer(c) - } diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug414.dir/p1.go b/gcc/testsuite/go.test/test/fixedbugs/bug414.dir/p1.go index 7768818bf9f..24638348433 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug414.dir/p1.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug414.dir/p1.go @@ -2,20 +2,20 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. - package p1 - - import "fmt" - - type Fer interface { - f() string - } - - type Object struct {} - - func (this *Object) f() string { - return "Object.f" - } - - func PrintFer(fer Fer) { - fmt.Sprintln(fer.f()) - } +package p1 + +import "fmt" + +type Fer interface { + f() string +} + +type Object struct{} + +func (this *Object) f() string { + return "Object.f" +} + +func PrintFer(fer Fer) { + fmt.Sprintln(fer.f()) +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug414.dir/prog.go b/gcc/testsuite/go.test/test/fixedbugs/bug414.dir/prog.go new file mode 100644 index 00000000000..f55d9469689 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug414.dir/prog.go @@ -0,0 +1,18 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import "./p1" + +type MyObject struct { + p1.Fer +} + +func main() { + var b p1.Fer = &p1.Object{} + p1.PrintFer(b) + var c p1.Fer = &MyObject{b} + p1.PrintFer(c) +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug414.go b/gcc/testsuite/go.test/test/fixedbugs/bug414.go index 5612fd5c233..35e19be38e2 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug414.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug414.go @@ -1,10 +1,9 @@ -// $G $D/$F.dir/p1.go && $G $D/$F.dir/main.go && $L main.$A && ./$A.out - -// NOTE: This test is not run by 'run.go' and so not run by all.bash. -// To run this test you must use the ./run shell script. +// rundir // Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +// Issue 1743: test embedding of imported types with private methods. + package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug424.dir/main.go b/gcc/testsuite/go.test/test/fixedbugs/bug424.dir/main.go new file mode 100644 index 00000000000..c2fe1463cd6 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug424.dir/main.go @@ -0,0 +1,97 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Tests that method calls through an interface always +// call the locally defined method localT.m independent +// at which embedding level it is and in which order +// embedding is done. + +package main + +import "./lib" +import "reflect" +import "fmt" + +type localI interface { + m() string +} + +type localT struct{} + +func (t *localT) m() string { + return "main.localT.m" +} + +type myT1 struct { + localT +} + +type myT2 struct { + localT + lib.T +} + +type myT3 struct { + lib.T + localT +} + +func main() { + var i localI + + i = new(localT) + if i.m() != "main.localT.m" { + println("BUG: localT:", i.m(), "called") + } + + i = new(myT1) + if i.m() != "main.localT.m" { + println("BUG: myT1:", i.m(), "called") + } + + i = new(myT2) + if i.m() != "main.localT.m" { + println("BUG: myT2:", i.m(), "called") + } + + t3 := new(myT3) + if t3.m() != "main.localT.m" { + println("BUG: t3:", t3.m(), "called") + } + + i = new(myT3) + if i.m() != "main.localT.m" { + t := reflect.TypeOf(i) + n := t.NumMethod() + for j := 0; j < n; j++ { + m := t.Method(j) + fmt.Printf("#%d: %s.%s %s\n", j, m.PkgPath, m.Name, m.Type) + } + println("BUG: myT3:", i.m(), "called") + } + + var t4 struct { + localT + lib.T + } + if t4.m() != "main.localT.m" { + println("BUG: t4:", t4.m(), "called") + } + i = &t4 + if i.m() != "main.localT.m" { + println("BUG: myT4:", i.m(), "called") + } + + var t5 struct { + lib.T + localT + } + if t5.m() != "main.localT.m" { + println("BUG: t5:", t5.m(), "called") + } + i = &t5 + if i.m() != "main.localT.m" { + println("BUG: myT5:", i.m(), "called") + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug424.go b/gcc/testsuite/go.test/test/fixedbugs/bug424.go index 41524543a84..59c2cd35c4c 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug424.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug424.go @@ -1,7 +1,4 @@ -// $G $D/$F.dir/lib.go && $G $D/$F.go && $L $F.$A && ./$A.out - -// NOTE: This test is not run by 'run.go' and so not run by all.bash. -// To run this test you must use the ./run shell script. +// rundir // Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style @@ -12,91 +9,5 @@ // at which embedding level it is and in which order // embedding is done. -package main - -import "./lib" -import "reflect" -import "fmt" - -type localI interface { - m() string -} - -type localT struct{} - -func (t *localT) m() string { - return "main.localT.m" -} - -type myT1 struct { - localT -} - -type myT2 struct { - localT - lib.T -} - -type myT3 struct { - lib.T - localT -} - -func main() { - var i localI - - i = new(localT) - if i.m() != "main.localT.m" { - println("BUG: localT:", i.m(), "called") - } - - i = new(myT1) - if i.m() != "main.localT.m" { - println("BUG: myT1:", i.m(), "called") - } - - i = new(myT2) - if i.m() != "main.localT.m" { - println("BUG: myT2:", i.m(), "called") - } +package ignored - t3 := new(myT3) - if t3.m() != "main.localT.m" { - println("BUG: t3:", t3.m(), "called") - } - - i = new(myT3) - if i.m() != "main.localT.m" { - t := reflect.TypeOf(i) - n := t.NumMethod() - for j := 0; j < n; j++ { - m := t.Method(j) - fmt.Printf("#%d: %s.%s %s\n", j, m.PkgPath, m.Name, m.Type) - } - println("BUG: myT3:", i.m(), "called") - } - - var t4 struct { - localT - lib.T - } - if t4.m() != "main.localT.m" { - println("BUG: t4:", t4.m(), "called") - } - i = &t4 - if i.m() != "main.localT.m" { - println("BUG: myT4:", i.m(), "called") - } - - var t5 struct { - lib.T - localT - } - if t5.m() != "main.localT.m" { - println("BUG: t5:", t5.m(), "called") - } - i = &t5 - if i.m() != "main.localT.m" { - println("BUG: myT5:", i.m(), "called") - } -} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug437.dir/x.go b/gcc/testsuite/go.test/test/fixedbugs/bug437.dir/x.go new file mode 100644 index 00000000000..364d017afa7 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug437.dir/x.go @@ -0,0 +1,25 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Test converting a type defined in a different package to an +// interface defined in a third package, where the interface has a +// hidden method. This used to cause a link error with gccgo. + +package main + +import ( + "./one" + "./two" +) + +func F(i1 one.I1) { + switch v := i1.(type) { + case two.S2: + one.F1(v) + } +} + +func main() { + F(nil) +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug437.go b/gcc/testsuite/go.test/test/fixedbugs/bug437.go index b1e76a6a744..5c4a2ad0dcf 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/bug437.go +++ b/gcc/testsuite/go.test/test/fixedbugs/bug437.go @@ -1,7 +1,4 @@ -// $G $D/$F.dir/one.go && $G $D/$F.dir/two.go && $G $D/$F.go && $L $F.$A && ./$A.out - -// NOTE: This test is not run by 'run.go' and so not run by all.bash. -// To run this test you must use the ./run shell script. +// rundir // Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style @@ -11,20 +8,4 @@ // interface defined in a third package, where the interface has a // hidden method. This used to cause a link error with gccgo. -package main - -import ( - "./one" - "./two" -) - -func F(i1 one.I1) { - switch v := i1.(type) { - case two.S2: - one.F1(v) - } -} - -func main() { - F(nil) -} +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug453.go b/gcc/testsuite/go.test/test/fixedbugs/bug453.go new file mode 100644 index 00000000000..136abefb7d2 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug453.go @@ -0,0 +1,39 @@ +// run + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4138: bug in floating-point registers numbering. +// Makes 6g unable to use more than 11 registers. + +package main + +func formula() float32 { + mA := [1]float32{1.0} + det1 := mA[0] + det2 := mA[0] + det3 := mA[0] + det4 := mA[0] + det5 := mA[0] + det6 := mA[0] + det7 := mA[0] + det8 := mA[0] + det9 := mA[0] + det10 := mA[0] + det11 := mA[0] + det12 := mA[0] + + return det1 + det2*det3 + + det4*det5 + det6*det7 + + det8*det9 + det10*det11 + + det12 +} + +func main() { + x := formula() + if x != 7.0 { + println(x, 7.0) + panic("x != 7.0") + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug454.go b/gcc/testsuite/go.test/test/fixedbugs/bug454.go new file mode 100644 index 00000000000..a10abba8b28 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug454.go @@ -0,0 +1,21 @@ +// run + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4173 + +package main + +func main() { + var arr *[10]int + s := 0 + for i, _ := range arr { + // used to panic trying to access arr[i] + s += i + } + if s != 45 { + println("BUG") + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug455.go b/gcc/testsuite/go.test/test/fixedbugs/bug455.go new file mode 100644 index 00000000000..8e3c7701be0 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug455.go @@ -0,0 +1,54 @@ +// run + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4156: out of fixed registers when chaining method calls. +// Used to happen with 6g. + +package main + +type test_i interface { + Test() test_i + Result() bool +} + +type test_t struct { +} + +func newTest() *test_t { + return &test_t{} +} + +type testFn func(string) testFn + +func main() { + test := newTest() + + switch { + case test. + Test(). + Test(). + Test(). + Test(). + Test(). + Test(). + Test(). + Test(). + Test(). + Test(). + Result(): + // case worked + default: + panic("Result returned false unexpectedly") + } +} + +func (t *test_t) Test() test_i { + return t +} + +func (t *test_t) Result() bool { + return true +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug456.go b/gcc/testsuite/go.test/test/fixedbugs/bug456.go new file mode 100644 index 00000000000..064e1aa0281 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug456.go @@ -0,0 +1,26 @@ +// run + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 3907: out of fixed registers in nested byte multiply. +// Used to happen with both 6g and 8g. + +package main + +func F(a, b, c, d uint8) uint8 { + return a * (b * (c * (d * + (a * (b * (c * (d * + (a * (b * (c * (d * + a * (b * (c * d))))))))))))) +} + +func main() { + var a, b, c, d uint8 = 1, 1, 1, 1 + x := F(a, b, c, d) + if x != 1 { + println(x) + panic("x != 1") + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug457.go b/gcc/testsuite/go.test/test/fixedbugs/bug457.go new file mode 100644 index 00000000000..ee7048972af --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug457.go @@ -0,0 +1,15 @@ +// run + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4197: growing a slice of zero-width elements +// panics on a division by zero. + +package main + +func main() { + var x []struct{} + x = append(x, struct{}{}) +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug458.go b/gcc/testsuite/go.test/test/fixedbugs/bug458.go new file mode 100644 index 00000000000..ddc97bdb0cc --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug458.go @@ -0,0 +1,22 @@ +// compile + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4200: 6g crashes when a type is larger than 4GB. + +package main + +import "unsafe" + +// N=16 on 32-bit arches, 256 on 64-bit arches. +// On 32-bit arches we don't want to test types +// that are over 4GB large. +const N = 1 << unsafe.Sizeof(uintptr(0)) + +type T [N][10][10][10][10][3]byte + +func F(t *T) byte { + return t[0][0][0][0][0][0] +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug459.go b/gcc/testsuite/go.test/test/fixedbugs/bug459.go new file mode 100644 index 00000000000..014f2ef01f7 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug459.go @@ -0,0 +1,35 @@ +// errorcheck + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 3890: missing detection of init loop involving +// method calls in function bodies. + +package flag + +var commandLine = NewFlagSet() // ERROR "loop|depends upon itself" + +type FlagSet struct { +} + +func (f *FlagSet) failf(format string, a ...interface{}) { + f.usage() +} + +func (f *FlagSet) usage() { + if f == commandLine { + panic(3) + } +} + +func NewFlagSet() *FlagSet { + f := &FlagSet{} + f.setErrorHandling(true) + return f +} + +func (f *FlagSet) setErrorHandling(b bool) { + f.failf("DIE") +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug460.dir/a.go b/gcc/testsuite/go.test/test/fixedbugs/bug460.dir/a.go new file mode 100644 index 00000000000..02a287b3177 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug460.dir/a.go @@ -0,0 +1,9 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package a + +type Foo struct { + int +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug460.dir/b.go b/gcc/testsuite/go.test/test/fixedbugs/bug460.dir/b.go new file mode 100644 index 00000000000..1868afe073e --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug460.dir/b.go @@ -0,0 +1,14 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package b + +import "./a" + +var x a.Foo + +func main() { + x.int = 20 // ERROR "unexported field" +} + diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug460.go b/gcc/testsuite/go.test/test/fixedbugs/bug460.go new file mode 100644 index 00000000000..79234a3b963 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug460.go @@ -0,0 +1,10 @@ +// errorcheckdir + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// part one of issue 4124. Make sure that the compiler rejects access attempts. + +package ignored + diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug461.go b/gcc/testsuite/go.test/test/fixedbugs/bug461.go new file mode 100644 index 00000000000..f0f7b0e69b6 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug461.go @@ -0,0 +1,23 @@ +// run + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// part two of issue 4124. Make sure reflect doesn't mark the field as exported. + +package main + +import "reflect" + +var T struct { + int +} + +func main() { + v := reflect.ValueOf(&T) + v = v.Elem().Field(0) + if v.CanSet() { + panic("int should be unexported") + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug462.go b/gcc/testsuite/go.test/test/fixedbugs/bug462.go new file mode 100644 index 00000000000..1a23ad064dc --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug462.go @@ -0,0 +1,19 @@ +// errorcheck + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import "os" + +type T struct { + File int +} + +func main() { + _ = T { + os.File: 1, // ERROR "unknown T? ?field" + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug463.go b/gcc/testsuite/go.test/test/fixedbugs/bug463.go new file mode 100644 index 00000000000..3e7a1848270 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug463.go @@ -0,0 +1,22 @@ +// errorcheck + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 3757: unhelpful typechecking loop message +// for constants that refer to themselves. + +package main + +const a = a // ERROR "refers to itself|definition loop" + +const ( + X = A + A = B // ERROR "refers to itself|definition loop" + B = D + C, D = 1, A +) + +func main() { +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug464.go b/gcc/testsuite/go.test/test/fixedbugs/bug464.go new file mode 100644 index 00000000000..582193997a1 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug464.go @@ -0,0 +1,12 @@ +// errorcheck + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 3937: unhelpful typechecking loop message +// for identifiers wrongly used as types. + +package main + +func foo(x foo) {} // ERROR "expected type|not a type" diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug465.dir/a.go b/gcc/testsuite/go.test/test/fixedbugs/bug465.dir/a.go new file mode 100644 index 00000000000..a9a8614bb33 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug465.dir/a.go @@ -0,0 +1,76 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package a + +type T struct{ A, B int } + +type A []int + +type M map[int]int + +func F1() int { + if (T{1, 2}) == (T{3, 4}) { + return 1 + } + return 0 +} + +func F2() int { + if (M{1: 2}) == nil { + return 1 + } + return 0 +} + +func F3() int { + if nil == (A{}) { + return 1 + } + return 0 +} + +func F4() int { + if a := (A{}); a == nil { + return 1 + } + return 0 +} + +func F5() int { + for k, v := range (M{1: 2}) { + return v - k + } + return 0 +} + +func F6() int { + switch a := (T{1, 1}); a == (T{1, 2}) { + default: + return 1 + } + return 0 +} + +func F7() int { + for m := (M{}); len(m) < (T{1, 2}).A; m[1] = (A{1})[0] { + return 1 + } + return 0 +} + +func F8() int { + if a := (&T{1, 1}); a != nil { + return 1 + } + return 0 +} + +func F9() int { + var a *T + if a = (&T{1, 1}); a != nil { + return 1 + } + return 0 +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug465.dir/b.go b/gcc/testsuite/go.test/test/fixedbugs/bug465.dir/b.go new file mode 100644 index 00000000000..c84c6836d62 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug465.dir/b.go @@ -0,0 +1,17 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import "./a" + +func main() { + for _, f := range []func() int{ + a.F1, a.F2, a.F3, a.F4, + a.F5, a.F6, a.F7, a.F8, a.F9} { + if f() > 1 { + panic("f() > 1") + } + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug465.go b/gcc/testsuite/go.test/test/fixedbugs/bug465.go new file mode 100644 index 00000000000..a6ef5876ab6 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug465.go @@ -0,0 +1,10 @@ +// rundir + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4230: inlining bug for composite literal in +// if, for, switch statements. + +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug466.dir/a.go b/gcc/testsuite/go.test/test/fixedbugs/bug466.dir/a.go new file mode 100644 index 00000000000..b9de63edabe --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug466.dir/a.go @@ -0,0 +1,15 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package a + +const N = 2+3i + +func Func() []complex128 { + return []complex128{1, complex(2, 3), complex(4, 5)} +} + +func Mul(z complex128) complex128 { + return z * (3 + 4i) +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug466.dir/b.go b/gcc/testsuite/go.test/test/fixedbugs/bug466.dir/b.go new file mode 100644 index 00000000000..82d66eacef9 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug466.dir/b.go @@ -0,0 +1,30 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import "./a" + +func main() { + s := a.Func() + if s[0] != 1 { + println(s[0]) + panic("s[0] != 1") + } + if s[1] != 2+3i { + println(s[1]) + panic("s[1] != 2+3i") + } + if s[2] != 4+5i { + println(s[2]) + panic("s[2] != 4+5i") + } + + x := 1 + 2i + y := a.Mul(x) + if y != (1+2i)*(3+4i) { + println(y) + panic("y != (1+2i)*(3+4i)") + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug466.go b/gcc/testsuite/go.test/test/fixedbugs/bug466.go new file mode 100644 index 00000000000..6b65b33b0a8 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug466.go @@ -0,0 +1,11 @@ +// rundir + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4159: exported inlinable functions squash +// complex literals "a+bi" to "a+b". + +package ignored + diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug467.dir/p1.go b/gcc/testsuite/go.test/test/fixedbugs/bug467.dir/p1.go new file mode 100644 index 00000000000..538b554f8e3 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug467.dir/p1.go @@ -0,0 +1,5 @@ +package p1 + +type SockaddrUnix int + +func (s SockaddrUnix) Error() string { return "blah" } diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug467.dir/p2.go b/gcc/testsuite/go.test/test/fixedbugs/bug467.dir/p2.go new file mode 100644 index 00000000000..d80d3a30b18 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug467.dir/p2.go @@ -0,0 +1,5 @@ +package p2 + +import "./p1" + +func SockUnix() error { var s *p1.SockaddrUnix; return s } diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug467.dir/p3.go b/gcc/testsuite/go.test/test/fixedbugs/bug467.dir/p3.go new file mode 100644 index 00000000000..c795646472f --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug467.dir/p3.go @@ -0,0 +1,7 @@ +package main + +import "./p2" + +func main() { + _ = p2.SockUnix() +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug467.go b/gcc/testsuite/go.test/test/fixedbugs/bug467.go new file mode 100644 index 00000000000..d73adbadffc --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug467.go @@ -0,0 +1,10 @@ +// compiledir + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Exported data for inlining could forget types of +// local variables declared in inlinable bodies. + +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug468.dir/p1.go b/gcc/testsuite/go.test/test/fixedbugs/bug468.dir/p1.go new file mode 100644 index 00000000000..ca175770fc1 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug468.dir/p1.go @@ -0,0 +1,7 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package p1 + +type S struct { X, Y int } diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug468.dir/p2.go b/gcc/testsuite/go.test/test/fixedbugs/bug468.dir/p2.go new file mode 100644 index 00000000000..1793c0e534e --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug468.dir/p2.go @@ -0,0 +1,25 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "reflect" + + "./p1" +) + +func main() { + var v1 = p1.S{1, 2} + var v2 = struct { X, Y int }{1, 2} + v1 = v2 + t1 := reflect.TypeOf(v1) + t2 := reflect.TypeOf(v2) + if !t1.AssignableTo(t2) { + panic(0) + } + if !t2.AssignableTo(t1) { + panic(1) + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug468.go b/gcc/testsuite/go.test/test/fixedbugs/bug468.go new file mode 100644 index 00000000000..12e4997d36b --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug468.go @@ -0,0 +1,10 @@ +// rundir + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// The reflect package was not correctly checking field names +// when checking for struct assignability. + +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug470.go b/gcc/testsuite/go.test/test/fixedbugs/bug470.go new file mode 100644 index 00000000000..0a359184c60 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug470.go @@ -0,0 +1,26 @@ +// run + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Converting constants between types must introduce rounding. + +package main + +import "fmt" + +const ( + F32 = 0.00999999977648258209228515625 + F64 = 0.01000000000000000020816681711721685132943093776702880859375 +) + +var F = float64(float32(0.01)) + +func main() { + // 0.01 rounded to float32 then to float64 is F32. + // 0.01 represented directly in float64 is F64. + if F != F32 { + panic(fmt.Sprintf("F=%.1000g, want %.1000g", F, F32)) + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug471.go b/gcc/testsuite/go.test/test/fixedbugs/bug471.go new file mode 100644 index 00000000000..e4542596e9a --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug471.go @@ -0,0 +1,18 @@ +// compile + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Caused an internal compiler error in gccgo. + +package p + +type C chan struct{} + +func (c C) F() { + select { + case c <- struct{}{}: + default: + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug472.dir/p1.go b/gcc/testsuite/go.test/test/fixedbugs/bug472.dir/p1.go new file mode 100644 index 00000000000..9d47fd84a72 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug472.dir/p1.go @@ -0,0 +1,17 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package p1 + +import "runtime" + +func E() func() int { return runtime.NumCPU } + +func F() func() { return runtime.Gosched } + +func G() func() string { return runtime.GOROOT } + +func H() func() { return runtime.GC } + +func I() func() string { return runtime.Version } diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug472.dir/p2.go b/gcc/testsuite/go.test/test/fixedbugs/bug472.dir/p2.go new file mode 100644 index 00000000000..34a3f0487a4 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug472.dir/p2.go @@ -0,0 +1,17 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package p2 + +import "runtime" + +func E() func() int { return runtime.NumCPU } + +func F() func() { return runtime.GC } + +func G() func() string { return runtime.GOROOT } + +func H() func() { return runtime.Gosched } + +func I() func() string { return runtime.Version } diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug472.dir/z.go b/gcc/testsuite/go.test/test/fixedbugs/bug472.dir/z.go new file mode 100644 index 00000000000..6c29dd08c61 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug472.dir/z.go @@ -0,0 +1,13 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + _ "./p1" + _ "./p2" +) + +func main() { +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug472.go b/gcc/testsuite/go.test/test/fixedbugs/bug472.go new file mode 100644 index 00000000000..c79c64ca1ff --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug472.go @@ -0,0 +1,10 @@ +// rundir + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Linker would incorrectly parse export data and think +// definitions are inconsistent. + +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug473.go b/gcc/testsuite/go.test/test/fixedbugs/bug473.go new file mode 100644 index 00000000000..49ce7d73791 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug473.go @@ -0,0 +1,69 @@ +// run + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Used to be miscompiled by gccgo, due to a bug in handling +// initialization ordering. + +package main + +func F(a ...interface{}) interface{} { + s := 0 + for _, v := range a { + s += v.(int) + } + return s +} + +var V1 = F(V10, V4, V3, V11) + +var V2 = F(V1) + +var V3 = F(1) + +var V4 = F(2) + +var V5 = F(3) + +var V6 = F(4) + +var V7 = F(5) + +var V8 = F(V14, V7, V3, V6, V5) + +var V9 = F(V4, F(V12)) + +var V10 = F(V4, V9) + +var V11 = F(6) + +var V12 = F(V5, V3, V8) + +var V13 = F(7) + +var V14 = F(8) + +func expect(name string, a interface{}, b int) { + if a.(int) != b { + panic(name) + } +} + +func main() { + expect("V1", V1, 38) + expect("V2", V2, 38) + expect("V3", V3, 1) + expect("V4", V4, 2) + expect("V5", V5, 3) + expect("V6", V6, 4) + expect("V7", V7, 5) + expect("V8", V8, 21) + expect("V9", V9, 27) + expect("V10", V10, 29) + expect("V11", V11, 6) + expect("V12", V12, 25) + expect("V13", V13, 7) + expect("V14", V14, 8) +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug474.go b/gcc/testsuite/go.test/test/fixedbugs/bug474.go new file mode 100644 index 00000000000..b8264872a98 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/bug474.go @@ -0,0 +1,29 @@ +// run + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Bug in method values: escape analysis was off. + +package main + +import "sync" + +var called = false + +type T struct { + once sync.Once +} + +func (t *T) M() { + called = true +} + +func main() { + var t T + t.once.Do(t.M) + if !called { + panic("not called") + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue2615.go b/gcc/testsuite/go.test/test/fixedbugs/issue2615.go new file mode 100644 index 00000000000..686e1e1ada3 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue2615.go @@ -0,0 +1,547 @@ +// run + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 2615: a long chain of else if's causes an overflow +// in the parser stack. + +package main + +// test returns the index of the lowest set bit in a 256-bit vector. +func test(x [4]uint64) int { + if x[0]&(1<<0) != 0 { + return 0 + } else if x[0]&(1<<1) != 0 { + return 1 + } else if x[0]&(1<<2) != 0 { + return 2 + } else if x[0]&(1<<3) != 0 { + return 3 + } else if x[0]&(1<<4) != 0 { + return 4 + } else if x[0]&(1<<5) != 0 { + return 5 + } else if x[0]&(1<<6) != 0 { + return 6 + } else if x[0]&(1<<7) != 0 { + return 7 + } else if x[0]&(1<<8) != 0 { + return 8 + } else if x[0]&(1<<9) != 0 { + return 9 + } else if x[0]&(1<<10) != 0 { + return 10 + } else if x[0]&(1<<11) != 0 { + return 11 + } else if x[0]&(1<<12) != 0 { + return 12 + } else if x[0]&(1<<13) != 0 { + return 13 + } else if x[0]&(1<<14) != 0 { + return 14 + } else if x[0]&(1<<15) != 0 { + return 15 + } else if x[0]&(1<<16) != 0 { + return 16 + } else if x[0]&(1<<17) != 0 { + return 17 + } else if x[0]&(1<<18) != 0 { + return 18 + } else if x[0]&(1<<19) != 0 { + return 19 + } else if x[0]&(1<<20) != 0 { + return 20 + } else if x[0]&(1<<21) != 0 { + return 21 + } else if x[0]&(1<<22) != 0 { + return 22 + } else if x[0]&(1<<23) != 0 { + return 23 + } else if x[0]&(1<<24) != 0 { + return 24 + } else if x[0]&(1<<25) != 0 { + return 25 + } else if x[0]&(1<<26) != 0 { + return 26 + } else if x[0]&(1<<27) != 0 { + return 27 + } else if x[0]&(1<<28) != 0 { + return 28 + } else if x[0]&(1<<29) != 0 { + return 29 + } else if x[0]&(1<<30) != 0 { + return 30 + } else if x[0]&(1<<31) != 0 { + return 31 + } else if x[0]&(1<<32) != 0 { + return 32 + } else if x[0]&(1<<33) != 0 { + return 33 + } else if x[0]&(1<<34) != 0 { + return 34 + } else if x[0]&(1<<35) != 0 { + return 35 + } else if x[0]&(1<<36) != 0 { + return 36 + } else if x[0]&(1<<37) != 0 { + return 37 + } else if x[0]&(1<<38) != 0 { + return 38 + } else if x[0]&(1<<39) != 0 { + return 39 + } else if x[0]&(1<<40) != 0 { + return 40 + } else if x[0]&(1<<41) != 0 { + return 41 + } else if x[0]&(1<<42) != 0 { + return 42 + } else if x[0]&(1<<43) != 0 { + return 43 + } else if x[0]&(1<<44) != 0 { + return 44 + } else if x[0]&(1<<45) != 0 { + return 45 + } else if x[0]&(1<<46) != 0 { + return 46 + } else if x[0]&(1<<47) != 0 { + return 47 + } else if x[0]&(1<<48) != 0 { + return 48 + } else if x[0]&(1<<49) != 0 { + return 49 + } else if x[0]&(1<<50) != 0 { + return 50 + } else if x[0]&(1<<51) != 0 { + return 51 + } else if x[0]&(1<<52) != 0 { + return 52 + } else if x[0]&(1<<53) != 0 { + return 53 + } else if x[0]&(1<<54) != 0 { + return 54 + } else if x[0]&(1<<55) != 0 { + return 55 + } else if x[0]&(1<<56) != 0 { + return 56 + } else if x[0]&(1<<57) != 0 { + return 57 + } else if x[0]&(1<<58) != 0 { + return 58 + } else if x[0]&(1<<59) != 0 { + return 59 + } else if x[0]&(1<<60) != 0 { + return 60 + } else if x[0]&(1<<61) != 0 { + return 61 + } else if x[0]&(1<<62) != 0 { + return 62 + } else if x[0]&(1<<63) != 0 { + return 63 + } else if x[1]&(1<<0) != 0 { + return 64 + } else if x[1]&(1<<1) != 0 { + return 65 + } else if x[1]&(1<<2) != 0 { + return 66 + } else if x[1]&(1<<3) != 0 { + return 67 + } else if x[1]&(1<<4) != 0 { + return 68 + } else if x[1]&(1<<5) != 0 { + return 69 + } else if x[1]&(1<<6) != 0 { + return 70 + } else if x[1]&(1<<7) != 0 { + return 71 + } else if x[1]&(1<<8) != 0 { + return 72 + } else if x[1]&(1<<9) != 0 { + return 73 + } else if x[1]&(1<<10) != 0 { + return 74 + } else if x[1]&(1<<11) != 0 { + return 75 + } else if x[1]&(1<<12) != 0 { + return 76 + } else if x[1]&(1<<13) != 0 { + return 77 + } else if x[1]&(1<<14) != 0 { + return 78 + } else if x[1]&(1<<15) != 0 { + return 79 + } else if x[1]&(1<<16) != 0 { + return 80 + } else if x[1]&(1<<17) != 0 { + return 81 + } else if x[1]&(1<<18) != 0 { + return 82 + } else if x[1]&(1<<19) != 0 { + return 83 + } else if x[1]&(1<<20) != 0 { + return 84 + } else if x[1]&(1<<21) != 0 { + return 85 + } else if x[1]&(1<<22) != 0 { + return 86 + } else if x[1]&(1<<23) != 0 { + return 87 + } else if x[1]&(1<<24) != 0 { + return 88 + } else if x[1]&(1<<25) != 0 { + return 89 + } else if x[1]&(1<<26) != 0 { + return 90 + } else if x[1]&(1<<27) != 0 { + return 91 + } else if x[1]&(1<<28) != 0 { + return 92 + } else if x[1]&(1<<29) != 0 { + return 93 + } else if x[1]&(1<<30) != 0 { + return 94 + } else if x[1]&(1<<31) != 0 { + return 95 + } else if x[1]&(1<<32) != 0 { + return 96 + } else if x[1]&(1<<33) != 0 { + return 97 + } else if x[1]&(1<<34) != 0 { + return 98 + } else if x[1]&(1<<35) != 0 { + return 99 + } else if x[1]&(1<<36) != 0 { + return 100 + } else if x[1]&(1<<37) != 0 { + return 101 + } else if x[1]&(1<<38) != 0 { + return 102 + } else if x[1]&(1<<39) != 0 { + return 103 + } else if x[1]&(1<<40) != 0 { + return 104 + } else if x[1]&(1<<41) != 0 { + return 105 + } else if x[1]&(1<<42) != 0 { + return 106 + } else if x[1]&(1<<43) != 0 { + return 107 + } else if x[1]&(1<<44) != 0 { + return 108 + } else if x[1]&(1<<45) != 0 { + return 109 + } else if x[1]&(1<<46) != 0 { + return 110 + } else if x[1]&(1<<47) != 0 { + return 111 + } else if x[1]&(1<<48) != 0 { + return 112 + } else if x[1]&(1<<49) != 0 { + return 113 + } else if x[1]&(1<<50) != 0 { + return 114 + } else if x[1]&(1<<51) != 0 { + return 115 + } else if x[1]&(1<<52) != 0 { + return 116 + } else if x[1]&(1<<53) != 0 { + return 117 + } else if x[1]&(1<<54) != 0 { + return 118 + } else if x[1]&(1<<55) != 0 { + return 119 + } else if x[1]&(1<<56) != 0 { + return 120 + } else if x[1]&(1<<57) != 0 { + return 121 + } else if x[1]&(1<<58) != 0 { + return 122 + } else if x[1]&(1<<59) != 0 { + return 123 + } else if x[1]&(1<<60) != 0 { + return 124 + } else if x[1]&(1<<61) != 0 { + return 125 + } else if x[1]&(1<<62) != 0 { + return 126 + } else if x[1]&(1<<63) != 0 { + return 127 + } else if x[2]&(1<<0) != 0 { + return 128 + } else if x[2]&(1<<1) != 0 { + return 129 + } else if x[2]&(1<<2) != 0 { + return 130 + } else if x[2]&(1<<3) != 0 { + return 131 + } else if x[2]&(1<<4) != 0 { + return 132 + } else if x[2]&(1<<5) != 0 { + return 133 + } else if x[2]&(1<<6) != 0 { + return 134 + } else if x[2]&(1<<7) != 0 { + return 135 + } else if x[2]&(1<<8) != 0 { + return 136 + } else if x[2]&(1<<9) != 0 { + return 137 + } else if x[2]&(1<<10) != 0 { + return 138 + } else if x[2]&(1<<11) != 0 { + return 139 + } else if x[2]&(1<<12) != 0 { + return 140 + } else if x[2]&(1<<13) != 0 { + return 141 + } else if x[2]&(1<<14) != 0 { + return 142 + } else if x[2]&(1<<15) != 0 { + return 143 + } else if x[2]&(1<<16) != 0 { + return 144 + } else if x[2]&(1<<17) != 0 { + return 145 + } else if x[2]&(1<<18) != 0 { + return 146 + } else if x[2]&(1<<19) != 0 { + return 147 + } else if x[2]&(1<<20) != 0 { + return 148 + } else if x[2]&(1<<21) != 0 { + return 149 + } else if x[2]&(1<<22) != 0 { + return 150 + } else if x[2]&(1<<23) != 0 { + return 151 + } else if x[2]&(1<<24) != 0 { + return 152 + } else if x[2]&(1<<25) != 0 { + return 153 + } else if x[2]&(1<<26) != 0 { + return 154 + } else if x[2]&(1<<27) != 0 { + return 155 + } else if x[2]&(1<<28) != 0 { + return 156 + } else if x[2]&(1<<29) != 0 { + return 157 + } else if x[2]&(1<<30) != 0 { + return 158 + } else if x[2]&(1<<31) != 0 { + return 159 + } else if x[2]&(1<<32) != 0 { + return 160 + } else if x[2]&(1<<33) != 0 { + return 161 + } else if x[2]&(1<<34) != 0 { + return 162 + } else if x[2]&(1<<35) != 0 { + return 163 + } else if x[2]&(1<<36) != 0 { + return 164 + } else if x[2]&(1<<37) != 0 { + return 165 + } else if x[2]&(1<<38) != 0 { + return 166 + } else if x[2]&(1<<39) != 0 { + return 167 + } else if x[2]&(1<<40) != 0 { + return 168 + } else if x[2]&(1<<41) != 0 { + return 169 + } else if x[2]&(1<<42) != 0 { + return 170 + } else if x[2]&(1<<43) != 0 { + return 171 + } else if x[2]&(1<<44) != 0 { + return 172 + } else if x[2]&(1<<45) != 0 { + return 173 + } else if x[2]&(1<<46) != 0 { + return 174 + } else if x[2]&(1<<47) != 0 { + return 175 + } else if x[2]&(1<<48) != 0 { + return 176 + } else if x[2]&(1<<49) != 0 { + return 177 + } else if x[2]&(1<<50) != 0 { + return 178 + } else if x[2]&(1<<51) != 0 { + return 179 + } else if x[2]&(1<<52) != 0 { + return 180 + } else if x[2]&(1<<53) != 0 { + return 181 + } else if x[2]&(1<<54) != 0 { + return 182 + } else if x[2]&(1<<55) != 0 { + return 183 + } else if x[2]&(1<<56) != 0 { + return 184 + } else if x[2]&(1<<57) != 0 { + return 185 + } else if x[2]&(1<<58) != 0 { + return 186 + } else if x[2]&(1<<59) != 0 { + return 187 + } else if x[2]&(1<<60) != 0 { + return 188 + } else if x[2]&(1<<61) != 0 { + return 189 + } else if x[2]&(1<<62) != 0 { + return 190 + } else if x[2]&(1<<63) != 0 { + return 191 + } else if x[3]&(1<<0) != 0 { + return 192 + } else if x[3]&(1<<1) != 0 { + return 193 + } else if x[3]&(1<<2) != 0 { + return 194 + } else if x[3]&(1<<3) != 0 { + return 195 + } else if x[3]&(1<<4) != 0 { + return 196 + } else if x[3]&(1<<5) != 0 { + return 197 + } else if x[3]&(1<<6) != 0 { + return 198 + } else if x[3]&(1<<7) != 0 { + return 199 + } else if x[3]&(1<<8) != 0 { + return 200 + } else if x[3]&(1<<9) != 0 { + return 201 + } else if x[3]&(1<<10) != 0 { + return 202 + } else if x[3]&(1<<11) != 0 { + return 203 + } else if x[3]&(1<<12) != 0 { + return 204 + } else if x[3]&(1<<13) != 0 { + return 205 + } else if x[3]&(1<<14) != 0 { + return 206 + } else if x[3]&(1<<15) != 0 { + return 207 + } else if x[3]&(1<<16) != 0 { + return 208 + } else if x[3]&(1<<17) != 0 { + return 209 + } else if x[3]&(1<<18) != 0 { + return 210 + } else if x[3]&(1<<19) != 0 { + return 211 + } else if x[3]&(1<<20) != 0 { + return 212 + } else if x[3]&(1<<21) != 0 { + return 213 + } else if x[3]&(1<<22) != 0 { + return 214 + } else if x[3]&(1<<23) != 0 { + return 215 + } else if x[3]&(1<<24) != 0 { + return 216 + } else if x[3]&(1<<25) != 0 { + return 217 + } else if x[3]&(1<<26) != 0 { + return 218 + } else if x[3]&(1<<27) != 0 { + return 219 + } else if x[3]&(1<<28) != 0 { + return 220 + } else if x[3]&(1<<29) != 0 { + return 221 + } else if x[3]&(1<<30) != 0 { + return 222 + } else if x[3]&(1<<31) != 0 { + return 223 + } else if x[3]&(1<<32) != 0 { + return 224 + } else if x[3]&(1<<33) != 0 { + return 225 + } else if x[3]&(1<<34) != 0 { + return 226 + } else if x[3]&(1<<35) != 0 { + return 227 + } else if x[3]&(1<<36) != 0 { + return 228 + } else if x[3]&(1<<37) != 0 { + return 229 + } else if x[3]&(1<<38) != 0 { + return 230 + } else if x[3]&(1<<39) != 0 { + return 231 + } else if x[3]&(1<<40) != 0 { + return 232 + } else if x[3]&(1<<41) != 0 { + return 233 + } else if x[3]&(1<<42) != 0 { + return 234 + } else if x[3]&(1<<43) != 0 { + return 235 + } else if x[3]&(1<<44) != 0 { + return 236 + } else if x[3]&(1<<45) != 0 { + return 237 + } else if x[3]&(1<<46) != 0 { + return 238 + } else if x[3]&(1<<47) != 0 { + return 239 + } else if x[3]&(1<<48) != 0 { + return 240 + } else if x[3]&(1<<49) != 0 { + return 241 + } else if x[3]&(1<<50) != 0 { + return 242 + } else if x[3]&(1<<51) != 0 { + return 243 + } else if x[3]&(1<<52) != 0 { + return 244 + } else if x[3]&(1<<53) != 0 { + return 245 + } else if x[3]&(1<<54) != 0 { + return 246 + } else if x[3]&(1<<55) != 0 { + return 247 + } else if x[3]&(1<<56) != 0 { + return 248 + } else if x[3]&(1<<57) != 0 { + return 249 + } else if x[3]&(1<<58) != 0 { + return 250 + } else if x[3]&(1<<59) != 0 { + return 251 + } else if x[3]&(1<<60) != 0 { + return 252 + } else if x[3]&(1<<61) != 0 { + return 253 + } else if x[3]&(1<<62) != 0 { + return 254 + } else if x[3]&(1<<63) != 0 { + return 255 + } + return -1 +} + +func main() { + const ones = ^uint64(0) + for i := 0; i < 256; i++ { + bits := [4]uint64{ones, ones, ones, ones} + + // clear bottom i bits + bits[i/64] ^= 1<<(uint(i)&63) - 1 + for j := i/64 - 1; j >= 0; j-- { + bits[j] = 0 + } + + k := test(bits) + if k != i { + print("test(bits)=", k, " want ", i, "\n") + panic("failed") + } + } +} diff --git a/gcc/testsuite/go.test/test/bugs/bug434.dir/one.go b/gcc/testsuite/go.test/test/fixedbugs/issue3552.dir/one.go index 491ada1d9c4..491ada1d9c4 100644 --- a/gcc/testsuite/go.test/test/bugs/bug434.dir/one.go +++ b/gcc/testsuite/go.test/test/fixedbugs/issue3552.dir/one.go diff --git a/gcc/testsuite/go.test/test/bugs/bug434.dir/two.go b/gcc/testsuite/go.test/test/fixedbugs/issue3552.dir/two.go index 1366d244d3e..1366d244d3e 100644 --- a/gcc/testsuite/go.test/test/bugs/bug434.dir/two.go +++ b/gcc/testsuite/go.test/test/fixedbugs/issue3552.dir/two.go diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue3552.go b/gcc/testsuite/go.test/test/fixedbugs/issue3552.go new file mode 100644 index 00000000000..a198dbe971f --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue3552.go @@ -0,0 +1,10 @@ +// compiledir + +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 3552: cross-package inlining misbehaves when +// referencing embedded builtins. + +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue3705.go b/gcc/testsuite/go.test/test/fixedbugs/issue3705.go new file mode 100644 index 00000000000..64ef38b10d5 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue3705.go @@ -0,0 +1,9 @@ +// errorcheck + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package p + +func init() // ERROR "missing function body|cannot declare init" diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue3783.go b/gcc/testsuite/go.test/test/fixedbugs/issue3783.go new file mode 100644 index 00000000000..d7a4a2e8f3c --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue3783.go @@ -0,0 +1,12 @@ +// errorcheck + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package foo + +var i int + +func (*i) bar() // ERROR "not a type|expected type" + diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue3924.go b/gcc/testsuite/go.test/test/fixedbugs/issue3924.go new file mode 100644 index 00000000000..d4739b21c90 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue3924.go @@ -0,0 +1,13 @@ +// errorcheck + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package foo + +type mybool bool + +var x, y = 1, 2 +var _ mybool = x < y && x < y // ERROR "cannot use" +var _ mybool = x < y || x < y // ERROR "cannot use" diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue3925.go b/gcc/testsuite/go.test/test/fixedbugs/issue3925.go new file mode 100644 index 00000000000..a62d4392e6f --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue3925.go @@ -0,0 +1,23 @@ +// errorcheck + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 3925: wrong line number for error message "missing key in map literal" + +// also a test for correct line number in other malformed composite literals. + +package foo + +var _ = map[string]string{ + "1": "2", + "3", "4", // ERROR "missing key|must have keys" +} + +var _ = []string{ + "foo", + "bar", + 20, // ERROR "cannot use|incompatible type" +} + diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4066.go b/gcc/testsuite/go.test/test/fixedbugs/issue4066.go new file mode 100644 index 00000000000..19cfe6651a7 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4066.go @@ -0,0 +1,37 @@ +// run + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// issue 4066: return values not being spilled eagerly enough + +package main + +func main() { + n := foo() + if n != 2 { + println(n) + panic("wrong return value") + } +} + +type terr struct{} + +func foo() (val int) { + val = 0 + defer func() { + if x := recover(); x != nil { + _ = x.(terr) + } + }() + for { + val = 2 + foo1() + } + panic("unreachable") +} + +func foo1() { + panic(terr{}) +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4085a.go b/gcc/testsuite/go.test/test/fixedbugs/issue4085a.go new file mode 100644 index 00000000000..1d8e57cb7c7 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4085a.go @@ -0,0 +1,18 @@ +// errorcheck + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +type T []int + +func main() { + _ = make(T, -1) // ERROR "negative" + _ = make(T, 0.5) // ERROR "constant 0.5 truncated to integer|non-integer" + _ = make(T, 1.0) // ok + _ = make(T, 1<<63) // ERROR "len argument too large" + _ = make(T, 0, -1) // ERROR "negative cap" + _ = make(T, 10, 0) // ERROR "len larger than cap" +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4085b.go b/gcc/testsuite/go.test/test/fixedbugs/issue4085b.go new file mode 100644 index 00000000000..63aca2378ee --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4085b.go @@ -0,0 +1,49 @@ +// run + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "strings" + "unsafe" +) + +type T []int + +func main() { + n := -1 + shouldPanic("len out of range", func() {_ = make(T, n)}) + shouldPanic("cap out of range", func() {_ = make(T, 0, n)}) + var t *byte + if unsafe.Sizeof(t) == 8 { + n = 1<<20 + n <<= 20 + shouldPanic("len out of range", func() {_ = make(T, n)}) + shouldPanic("cap out of range", func() {_ = make(T, 0, n)}) + n <<= 20 + shouldPanic("len out of range", func() {_ = make(T, n)}) + shouldPanic("cap out of range", func() {_ = make(T, 0, n)}) + } else { + n = 1<<31 - 1 + shouldPanic("len out of range", func() {_ = make(T, n)}) + shouldPanic("cap out of range", func() {_ = make(T, 0, n)}) + } +} + +func shouldPanic(str string, f func()) { + defer func() { + err := recover() + if err == nil { + panic("did not panic") + } + s := err.(error).Error() + if !strings.Contains(s, str) { + panic("got panic " + s + ", want " + str) + } + }() + + f() +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4097.go b/gcc/testsuite/go.test/test/fixedbugs/issue4097.go new file mode 100644 index 00000000000..c2b7d9b4fbf --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4097.go @@ -0,0 +1,11 @@ +// errorcheck + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package foo + +var s [][10]int +const m = len(s[len(s)-1]) // ERROR "is not a constant|is not constant" + diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4099.go b/gcc/testsuite/go.test/test/fixedbugs/issue4099.go new file mode 100644 index 00000000000..89392bfff1d --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4099.go @@ -0,0 +1,26 @@ +// errorcheck -0 -m + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Check go:noescape annotations. + +package p + +// The noescape comment only applies to the next func, +// which must not have a body. + +//go:noescape + +func F1([]byte) + +func F2([]byte) + +func G() { + var buf1 [10]byte + F1(buf1[:]) // ERROR "buf1 does not escape" + + var buf2 [10]byte // ERROR "moved to heap: buf2" + F2(buf2[:]) // ERROR "buf2 escapes to heap" +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4162.go b/gcc/testsuite/go.test/test/fixedbugs/issue4162.go new file mode 100644 index 00000000000..c2a8338c705 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4162.go @@ -0,0 +1,17 @@ +// compile + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4162. Trailing commas now allowed in conversions. + +package p + +// All these are valid now. +var ( + _ = int(1.0,) // comma was always permitted (like function call) + _ = []byte("foo",) // was syntax error: unexpected comma + _ = chan int(nil,) // was syntax error: unexpected comma + _ = (func())(nil,) // was syntax error: unexpected comma +) diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4167.go b/gcc/testsuite/go.test/test/fixedbugs/issue4167.go new file mode 100644 index 00000000000..4e353312b87 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4167.go @@ -0,0 +1,50 @@ +// run + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4167: inlining of a (*T).Method expression taking +// its arguments from a multiple return breaks the compiler. + +package main + +type pa []int + +type p int + +func (this *pa) func1() (v *p, c int) { + for _ = range *this { + c++ + } + v = (*p)(&c) + return +} + +func (this *pa) func2() p { + return (*p).func3(this.func1()) +} + +func (this *p) func3(f int) p { + return *this +} + +func (this *pa) func2dots() p { + return (*p).func3(this.func1()) +} + +func (this *p) func3dots(f ...int) p { + return *this +} + +func main() { + arr := make(pa, 13) + length := arr.func2() + if int(length) != len(arr) { + panic("length != len(arr)") + } + length = arr.func2dots() + if int(length) != len(arr) { + panic("length != len(arr)") + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4232.go b/gcc/testsuite/go.test/test/fixedbugs/issue4232.go new file mode 100644 index 00000000000..e5daa656235 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4232.go @@ -0,0 +1,33 @@ +// errorcheck + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package p + +func f() { + var a [10]int + _ = a[-1] // ERROR "invalid array index -1|index out of bounds" + _ = a[-1:] // ERROR "invalid slice index -1|index out of bounds" + _ = a[:-1] // ERROR "invalid slice index -1|index out of bounds" + _ = a[10] // ERROR "invalid array index 10|index out of bounds" + + var s []int + _ = s[-1] // ERROR "invalid slice index -1|index out of bounds" + _ = s[-1:] // ERROR "invalid slice index -1|index out of bounds" + _ = s[:-1] // ERROR "invalid slice index -1|index out of bounds" + _ = s[10] + + const c = "foo" + _ = c[-1] // ERROR "invalid string index -1|index out of bounds" + _ = c[-1:] // ERROR "invalid slice index -1|index out of bounds" + _ = c[:-1] // ERROR "invalid slice index -1|index out of bounds" + _ = c[3] // ERROR "invalid string index 3|index out of bounds" + + var t string + _ = t[-1] // ERROR "invalid string index -1|index out of bounds" + _ = t[-1:] // ERROR "invalid slice index -1|index out of bounds" + _ = t[:-1] // ERROR "invalid slice index -1|index out of bounds" + _ = t[3] +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4251.go b/gcc/testsuite/go.test/test/fixedbugs/issue4251.go new file mode 100644 index 00000000000..a14e0896a47 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4251.go @@ -0,0 +1,21 @@ +// errorcheck + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4251: slice with inverted range is an error. + +package p + +func F1(s []byte) []byte { + return s[2:1] // ERROR "inverted" +} + +func F2(a [10]byte) []byte { + return a[2:1] // ERROR "inverted" +} + +func F3(s string) string { + return s[2:1] // ERROR "inverted" +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4252.dir/a.go b/gcc/testsuite/go.test/test/fixedbugs/issue4252.dir/a.go new file mode 100644 index 00000000000..089b6f20f42 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4252.dir/a.go @@ -0,0 +1,35 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// A package that redeclares common builtin names. +package a + +var true = 0 == 1 +var false = 0 == 0 +var nil = 1 + +const append = 42 + +type error bool +type int interface{} + +func len(interface{}) int32 { return 42 } + +func Test() { + var array [append]int + if true { + panic("unexpected builtin true instead of redeclared one") + } + if !false { + panic("unexpected builtin false instead of redeclared one") + } + if len(array) != 42 { + println(len(array)) + panic("unexpected call of builtin len") + } +} + +func InlinedFakeTrue() error { return error(true) } +func InlinedFakeFalse() error { return error(false) } +func InlinedFakeNil() int { return nil } diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4252.dir/main.go b/gcc/testsuite/go.test/test/fixedbugs/issue4252.dir/main.go new file mode 100644 index 00000000000..28e43422478 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4252.dir/main.go @@ -0,0 +1,20 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import "./a" + +func main() { + if a.InlinedFakeTrue() { + panic("returned true was the real one") + } + if !a.InlinedFakeFalse() { + panic("returned false was the real one") + } + if a.InlinedFakeNil() == nil { + panic("returned nil was the real one") + } + a.Test() +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4252.go b/gcc/testsuite/go.test/test/fixedbugs/issue4252.go new file mode 100644 index 00000000000..1b0e5b20289 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4252.go @@ -0,0 +1,11 @@ +// rundir + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4252: tests that fixing the issue still allow +// builtins to be redeclared and are not corrupted +// in export data. + +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4264.go b/gcc/testsuite/go.test/test/fixedbugs/issue4264.go new file mode 100644 index 00000000000..627393211ee --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4264.go @@ -0,0 +1,19 @@ +// errorcheck + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// issue 4264: reject int division by const 0 + +package main + +func main() { + var x int + var y float64 + var z complex128 + + println(x/0) // ERROR "division by zero" + println(y/0) + println(z/0) +}
\ No newline at end of file diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4283.go b/gcc/testsuite/go.test/test/fixedbugs/issue4283.go new file mode 100644 index 00000000000..128c87231ab --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4283.go @@ -0,0 +1,17 @@ +// errorcheck + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4283: nil == nil can't be done as the type is unknown. + +package p + +func F1() bool { + return nil == nil // ERROR "invalid" +} + +func F2() bool { + return nil != nil // ERROR "invalid" +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4313.go b/gcc/testsuite/go.test/test/fixedbugs/issue4313.go new file mode 100644 index 00000000000..b2f69dbfa41 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4313.go @@ -0,0 +1,28 @@ +// run + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Order of operations in select. + +package main + +func main() { + c := make(chan int, 1) + x := 0 + select { + case c <- x: // should see x = 0, not x = 42 (after makec) + case <-makec(&x): // should be evaluated only after c and x on previous line + } + y := <-c + if y != 0 { + panic(y) + } +} + +func makec(px *int) chan bool { + if false { for {} } + *px = 42 + return make(chan bool, 0) +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4316.go b/gcc/testsuite/go.test/test/fixedbugs/issue4316.go new file mode 100644 index 00000000000..bb18a089624 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4316.go @@ -0,0 +1,64 @@ +// run + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4316: the stack overflow check in the linker +// is confused when it encounters a split-stack function +// that needs 0 bytes of stack space. + +package main + +type Peano *Peano + +func makePeano(n int) *Peano { + if n == 0 { + return nil + } + p := Peano(makePeano(n - 1)) + return &p +} + +var countArg Peano +var countResult int + +func countPeano() { + if countArg == nil { + countResult = 0 + return + } + countArg = *countArg + countPeano() + countResult++ +} + +var s = "(())" +var pT = 0 + +func p() { + if pT >= len(s) { + return + } + if s[pT] == '(' { + pT += 1 + p() + if pT < len(s) && s[pT] == ')' { + pT += 1 + } else { + return + } + p() + } +} + +func main() { + countArg = makePeano(4096) + countPeano() + if countResult != 4096 { + println("countResult =", countResult) + panic("countResult != 4096") + } + + p() +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4323.go b/gcc/testsuite/go.test/test/fixedbugs/issue4323.go new file mode 100644 index 00000000000..6bb78f43cf8 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4323.go @@ -0,0 +1,31 @@ +// compile + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4323: inlining of functions with local variables +// forgets to typecheck the declarations in the inlined copy. + +package main + +type reader struct { + C chan T +} + +type T struct{ C chan []byte } + +var r = newReader() + +func newReader() *reader { return new(reader) } + +func (r *reader) Read(n int) ([]byte, error) { + req := T{C: make(chan []byte)} + r.C <- req + return <-req.C, nil +} + +func main() { + s, err := r.Read(1) + _, _ = s, err +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4326.dir/p1.go b/gcc/testsuite/go.test/test/fixedbugs/issue4326.dir/p1.go new file mode 100644 index 00000000000..ab214befb4b --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4326.dir/p1.go @@ -0,0 +1,12 @@ +package p1 + +type O map[string]map[string]string + +func (opts O) RemoveOption(sect, opt string) bool { + if _, ok := opts[sect]; !ok { + return false + } + _, ok := opts[sect][opt] + delete(opts[sect], opt) + return ok +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4326.dir/p2.go b/gcc/testsuite/go.test/test/fixedbugs/issue4326.dir/p2.go new file mode 100644 index 00000000000..8e86266dd8d --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4326.dir/p2.go @@ -0,0 +1,5 @@ +package p2 + +import "./p1" + +func NewO() p1.O { return nil } diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4326.dir/q1.go b/gcc/testsuite/go.test/test/fixedbugs/issue4326.dir/q1.go new file mode 100644 index 00000000000..f118eb09252 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4326.dir/q1.go @@ -0,0 +1,8 @@ +package q1 + +func Deref(typ interface{}) interface{} { + if typ, ok := typ.(*int); ok { + return *typ + } + return typ +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4326.dir/q2.go b/gcc/testsuite/go.test/test/fixedbugs/issue4326.dir/q2.go new file mode 100644 index 00000000000..075e2b21e7a --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4326.dir/q2.go @@ -0,0 +1,11 @@ +package main + +import "./q1" + +func main() { + x := 1 + y := q1.Deref(&x) + if y != 1 { + panic("y != 1") + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4326.dir/z.go b/gcc/testsuite/go.test/test/fixedbugs/issue4326.dir/z.go new file mode 100644 index 00000000000..9b222e8b402 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4326.dir/z.go @@ -0,0 +1,7 @@ +package z + +import "./p2" + +func main() { + p2.NewO().RemoveOption("hello", "world") +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4326.go b/gcc/testsuite/go.test/test/fixedbugs/issue4326.go new file mode 100644 index 00000000000..5ce2eea2661 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4326.go @@ -0,0 +1,9 @@ +// compiledir + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Printing local variables in inliner shadows global names. + +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4348.go b/gcc/testsuite/go.test/test/fixedbugs/issue4348.go new file mode 100644 index 00000000000..3dac8f7685c --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4348.go @@ -0,0 +1,29 @@ +// compile + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4348. After switch to 64-bit ints the compiler generates +// illegal instructions when using large array bounds or indexes. + +package main + +// 1<<32 on a 64-bit machine, 1 otherwise. +const LARGE = ^uint(0)>>32 + 1 + +func A() int { + var a []int + return a[LARGE] +} + +var b [LARGE]int + +func B(i int) int { + return b[i] +} + +func main() { + n := A() + B(n) +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4353.go b/gcc/testsuite/go.test/test/fixedbugs/issue4353.go new file mode 100644 index 00000000000..defe7c324c2 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4353.go @@ -0,0 +1,19 @@ +// run + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4353. An optimizer bug in 8g triggers a runtime fault +// instead of an out of bounds panic. + +package main + +var aib [100000]int +var paib *[100000]int = &aib +var i64 int64 = 100023 + +func main() { + defer func() { recover() }() + _ = paib[i64] +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4359.go b/gcc/testsuite/go.test/test/fixedbugs/issue4359.go new file mode 100644 index 00000000000..b5adb4010b8 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4359.go @@ -0,0 +1,19 @@ +// errorcheck + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4359: wrong handling of broken struct fields +// causes "internal compiler error: lookdot badwidth". + +package main + +type T struct { + x T1 // ERROR "undefined" +} + +func f() { + var t *T + _ = t.x +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4370.dir/p1.go b/gcc/testsuite/go.test/test/fixedbugs/issue4370.dir/p1.go new file mode 100644 index 00000000000..d732c8b363e --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4370.dir/p1.go @@ -0,0 +1,20 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package p1 + +type Magic int + +type T struct { + x interface{} +} + +func (t *T) M() bool { + _, ok := t.x.(Magic) + return ok +} + +func F(t *T) { + println(t) +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4370.dir/p2.go b/gcc/testsuite/go.test/test/fixedbugs/issue4370.dir/p2.go new file mode 100644 index 00000000000..33370d07a4e --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4370.dir/p2.go @@ -0,0 +1,16 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package p2 + +import "./p1" + +type T struct { + p1.T +} + +func F() { + var t T + p1.F(&t.T) +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4370.dir/p3.go b/gcc/testsuite/go.test/test/fixedbugs/issue4370.dir/p3.go new file mode 100644 index 00000000000..13c996bc229 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4370.dir/p3.go @@ -0,0 +1,13 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package p3 + +import "./p2" + +func F() { + p2.F() + var t p2.T + println(t.T.M()) +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4370.go b/gcc/testsuite/go.test/test/fixedbugs/issue4370.go new file mode 100644 index 00000000000..76b47e1a6d5 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4370.go @@ -0,0 +1,9 @@ +// compiledir + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Re-exporting inlined function bodies missed types in x, ok := v.(Type) + +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4396a.go b/gcc/testsuite/go.test/test/fixedbugs/issue4396a.go new file mode 100644 index 00000000000..11ae1f7c6c6 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4396a.go @@ -0,0 +1,27 @@ +// run + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4396. Arrays of bytes are not required to be +// word aligned. 5g should use MOVB to load the address +// of s.g[0] for its nil check. +// +// This test _may_ fail on arm, but requires the host to +// trap unaligned loads. This is generally done with +// +// echo "4" > /proc/cpu/alignment + +package main + +var s = struct { + // based on lzw.decoder + a, b, c, d, e uint16 + f [4096]uint8 + g [4096]uint8 +}{} + +func main() { + s.g[0] = 1 +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4396b.go b/gcc/testsuite/go.test/test/fixedbugs/issue4396b.go new file mode 100644 index 00000000000..d0bf28fac28 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4396b.go @@ -0,0 +1,29 @@ +// run + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This test _may_ fail on arm, but requires the host to +// trap unaligned loads. This is generally done with +// +// echo "4" > /proc/cpu/alignment + +package main + +type T struct { + U uint16 + V T2 +} + +type T2 struct { + pad [4096]byte + A, B byte +} + +var s, t = new(T), new(T) + +func main() { + var u, v *T2 = &s.V, &t.V + u.B = v.B +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4399.go b/gcc/testsuite/go.test/test/fixedbugs/issue4399.go new file mode 100644 index 00000000000..6674db9ec30 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4399.go @@ -0,0 +1,15 @@ +// compile + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4399: 8g would print "gins LEAQ nil *A". + +package main + +type A struct{ a int } + +func main() { + println(((*A)(nil)).a) +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4405.go b/gcc/testsuite/go.test/test/fixedbugs/issue4405.go new file mode 100644 index 00000000000..b8458d77647 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4405.go @@ -0,0 +1,15 @@ +// errorcheck + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package p + +const ( + _ = iota + _ // ERROR "illegal character|invalid character" + _ // ERROR "illegal character|invalid character" + _ // ERROR "illegal character|invalid character" + _ // ERROR "illegal character|invalid character" +) diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4429.go b/gcc/testsuite/go.test/test/fixedbugs/issue4429.go new file mode 100644 index 00000000000..6822760ef8c --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4429.go @@ -0,0 +1,16 @@ +// errorcheck + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package p + +type a struct { + a int +} + +func main() { + av := a{}; + _ = *a(av); // ERROR "invalid indirect|expected pointer" +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4448.go b/gcc/testsuite/go.test/test/fixedbugs/issue4448.go new file mode 100644 index 00000000000..fa1d9fe49d3 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4448.go @@ -0,0 +1,37 @@ +// run + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4448: 64-bit indices that are statically known +// to be bounded make 5g and 8g generate a dangling branch. + +package main + +const b26 uint64 = 0x022fdd63cc95386d + +var bitPos [64]int + +func init() { + for p := uint(0); p < 64; p++ { + bitPos[b26<<p>>58] = int(p) + } +} + +func MinPos(w uint64) int { + if w == 0 { + panic("bit: MinPos(0) undefined") + } + return bitPos[((w&-w)*b26)>>58] +} + +func main() { + const one = uint64(1) + for i := 0; i < 64; i++ { + if MinPos(1<<uint(i)) != i { + println("i =", i) + panic("MinPos(1<<uint(i)) != i") + } + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4452.go b/gcc/testsuite/go.test/test/fixedbugs/issue4452.go new file mode 100644 index 00000000000..54dd214d69f --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4452.go @@ -0,0 +1,13 @@ +// errorcheck + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4452. Used to print many errors, now just one. + +package main + +func main() { + _ = [...]int(4) // ERROR "\[\.\.\.\].*outside of array literal" +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4458.go b/gcc/testsuite/go.test/test/fixedbugs/issue4458.go new file mode 100644 index 00000000000..820f18cb8d7 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4458.go @@ -0,0 +1,20 @@ +// errorcheck + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4458: gc accepts invalid method expressions +// like (**T).Method. + +package main + +type T struct{} + +func (T) foo() {} + +func main() { + av := T{} + pav := &av + (**T).foo(&pav) // ERROR "no method foo|requires named type or pointer to named" +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4463.go b/gcc/testsuite/go.test/test/fixedbugs/issue4463.go new file mode 100644 index 00000000000..70977ceb782 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4463.go @@ -0,0 +1,87 @@ +// errorcheck + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4463: test builtin functions in statement context and in +// go/defer functions. + +package p + +import "unsafe" + +func F() { + var a []int + var c chan int + var m map[int]int + var s struct{ f int } + + append(a, 0) // ERROR "not used" + cap(a) // ERROR "not used" + complex(1, 2) // ERROR "not used" + imag(1i) // ERROR "not used" + len(a) // ERROR "not used" + make([]int, 10) // ERROR "not used" + new(int) // ERROR "not used" + real(1i) // ERROR "not used" + unsafe.Alignof(a) // ERROR "not used" + unsafe.Offsetof(s.f) // ERROR "not used" + unsafe.Sizeof(a) // ERROR "not used" + + close(c) + copy(a, a) + delete(m, 0) + panic(0) + print("foo") + println("bar") + recover() + + (close(c)) + (copy(a, a)) + (delete(m, 0)) + (panic(0)) + (print("foo")) + (println("bar")) + (recover()) + + go append(a, 0) // ERROR "not used|discards result" + go cap(a) // ERROR "not used|discards result" + go complex(1, 2) // ERROR "not used|discards result" + go imag(1i) // ERROR "not used|discards result" + go len(a) // ERROR "not used|discards result" + go make([]int, 10) // ERROR "not used|discards result" + go new(int) // ERROR "not used|discards result" + go real(1i) // ERROR "not used|discards result" + go unsafe.Alignof(a) // ERROR "not used|discards result" + go unsafe.Offsetof(s.f) // ERROR "not used|discards result" + go unsafe.Sizeof(a) // ERROR "not used|discards result" + + go close(c) + go copy(a, a) + go delete(m, 0) + go panic(0) + go print("foo") + go println("bar") + go recover() + + defer append(a, 0) // ERROR "not used|discards result" + defer cap(a) // ERROR "not used|discards result" + defer complex(1, 2) // ERROR "not used|discards result" + defer imag(1i) // ERROR "not used|discards result" + defer len(a) // ERROR "not used|discards result" + defer make([]int, 10) // ERROR "not used|discards result" + defer new(int) // ERROR "not used|discards result" + defer real(1i) // ERROR "not used|discards result" + defer unsafe.Alignof(a) // ERROR "not used|discards result" + defer unsafe.Offsetof(s.f) // ERROR "not used|discards result" + defer unsafe.Sizeof(a) // ERROR "not used|discards result" + + defer close(c) + defer copy(a, a) + defer delete(m, 0) + defer panic(0) + defer print("foo") + defer println("bar") + defer recover() +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4468.go b/gcc/testsuite/go.test/test/fixedbugs/issue4468.go new file mode 100644 index 00000000000..ef0b46bcf68 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4468.go @@ -0,0 +1,28 @@ +// errorcheck + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4468: go/defer calls may not be parenthesized. + +package p + +type T int + +func (t *T) F() T { + return *t +} + +type S struct { + t T +} + +func F() { + go (F()) // ERROR "must be function call" + defer (F()) // ERROR "must be function call" + var s S + (&s.t).F() + go (&s.t).F() + defer (&s.t).F() +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4470.go b/gcc/testsuite/go.test/test/fixedbugs/issue4470.go new file mode 100644 index 00000000000..5ed09ca554b --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4470.go @@ -0,0 +1,16 @@ +// errorcheck + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4470: parens are not allowed around .(type) "expressions" + +package main + +func main() { + var i interface{} + switch (i.(type)) { // ERROR "outside type switch" + default: + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4495.go b/gcc/testsuite/go.test/test/fixedbugs/issue4495.go new file mode 100644 index 00000000000..7ec1134d7b6 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4495.go @@ -0,0 +1,29 @@ +// run + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +type I interface { + m() int +} + +type T struct{} + +func (T) m() int { + return 3 +} + +var t T + +var ret = I.m(t) + +func main() { + if ret != 3 { + println("ret = ", ret) + panic("ret != 3") + } +} + diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4510.dir/f1.go b/gcc/testsuite/go.test/test/fixedbugs/issue4510.dir/f1.go new file mode 100644 index 00000000000..7e2cffa5dd8 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4510.dir/f1.go @@ -0,0 +1,9 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package p + +import "fmt" // ERROR "fmt redeclared|imported" + +var _ = fmt.Printf diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4510.dir/f2.go b/gcc/testsuite/go.test/test/fixedbugs/issue4510.dir/f2.go new file mode 100644 index 00000000000..895fc342ba1 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4510.dir/f2.go @@ -0,0 +1,7 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package p + +func fmt() {} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4510.go b/gcc/testsuite/go.test/test/fixedbugs/issue4510.go new file mode 100644 index 00000000000..003f9e8e163 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4510.go @@ -0,0 +1,7 @@ +// errorcheckdir + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4517a.go b/gcc/testsuite/go.test/test/fixedbugs/issue4517a.go new file mode 100644 index 00000000000..a1b6b57e974 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4517a.go @@ -0,0 +1,9 @@ +// errorcheck + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package p + +var init = 1 // ERROR "cannot declare init - must be func" diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4517b.go b/gcc/testsuite/go.test/test/fixedbugs/issue4517b.go new file mode 100644 index 00000000000..f04103ff5b2 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4517b.go @@ -0,0 +1,9 @@ +// errorcheck + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package p + +const init = 1 // ERROR "cannot declare init - must be func" diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4517c.go b/gcc/testsuite/go.test/test/fixedbugs/issue4517c.go new file mode 100644 index 00000000000..47b21cf4084 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4517c.go @@ -0,0 +1,9 @@ +// errorcheck + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package p + +type init byte // ERROR "cannot declare init - must be func" diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4518.go b/gcc/testsuite/go.test/test/fixedbugs/issue4518.go new file mode 100644 index 00000000000..e64b069bb99 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4518.go @@ -0,0 +1,67 @@ +// run + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4518. In some circumstances "return F(...)" +// where F has multiple returns is miscompiled by 6g due to +// bold assumptions in componentgen. + +package main + +func DontInline() {} + +func F(e interface{}) (int, int) { + DontInline() + return 3, 7 +} + +func G() (int, int) { + DontInline() + return 3, 7 +} + +func bogus1(d interface{}) (int, int) { + switch { + default: + return F(d) + } + return 0, 0 +} + +func bogus2() (int, int) { + switch { + default: + return F(3) + } + return 0, 0 +} + +func bogus3(d interface{}) (int, int) { + switch { + default: + return G() + } + return 0, 0 +} + +func bogus4() (int, int) { + switch { + default: + return G() + } + return 0, 0 +} + +func check(a, b int) { + if a != 3 || b != 7 { + println(a, b) + panic("a != 3 || b != 7") + } +} + +func main() { + check(bogus1(42)) + check(bogus2()) +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4529.go b/gcc/testsuite/go.test/test/fixedbugs/issue4529.go new file mode 100644 index 00000000000..4f37e7c36b6 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4529.go @@ -0,0 +1,33 @@ +// compile + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4529: escape analysis crashes on "go f(g())" +// when g has multiple returns. + +package main + +type M interface{} + +type A struct { + a string + b chan M +} + +func (a *A) I() (b <-chan M, c chan<- M) { + a.b, c = make(chan M), make(chan M) + b = a.b + + return +} + +func Init(a string, b *A, c interface { + I() (<-chan M, chan<- M) +}) { + b.a = a + go b.c(c.I()) +} + +func (a *A) c(b <-chan M, _ chan<- M) {} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4545.go b/gcc/testsuite/go.test/test/fixedbugs/issue4545.go new file mode 100644 index 00000000000..c37ccef7cbf --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4545.go @@ -0,0 +1,19 @@ +// errorcheck + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4545: untyped constants are incorrectly coerced +// to concrete types when used in interface{} context. + +package main + +import "fmt" + +func main() { + var s uint + fmt.Println(1.0 + 1<<s) // ERROR "invalid operation|non-integer type|incompatible type" + x := 1.0 + 1<<s // ERROR "invalid operation|non-integer type" + _ = x +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4562.go b/gcc/testsuite/go.test/test/fixedbugs/issue4562.go new file mode 100644 index 00000000000..29d98b0283d --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4562.go @@ -0,0 +1,49 @@ +// run + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "fmt" + "runtime" + "strings" +) + +type T struct { + val int +} + +func main() { + defer expectError(22) + var pT *T + switch pT.val { // error should be here - line 22 + case 0: + fmt.Println("0") + case 1: // used to show up here instead + fmt.Println("1") + case 2: + fmt.Println("2") + } + fmt.Println("finished") +} + +func expectError(expectLine int) { + if recover() == nil { + panic("did not crash") + } + for i := 1;; i++ { + _, file, line, ok := runtime.Caller(i) + if !ok { + panic("cannot find issue4562.go on stack") + } + if strings.HasSuffix(file, "issue4562.go") { + if line != expectLine { + panic(fmt.Sprintf("crashed at line %d, wanted line %d", line, expectLine)) + } + break + } + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4585.go b/gcc/testsuite/go.test/test/fixedbugs/issue4585.go new file mode 100644 index 00000000000..ad1242d1e5f --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4585.go @@ -0,0 +1,151 @@ +// run + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4585: comparisons and hashes process blank +// fields and padding in structs. + +package main + +import "unsafe" + +// T is a structure with padding. +type T struct { + A int16 + B int64 + C int16 + D int64 + Dummy [64]byte +} + +// U is a structure with a blank field +type U struct { + A, _, B int + Dummy [64]byte +} + +// USmall is like U but the frontend will inline comparison +// instead of calling the generated eq function. +type USmall struct { + A, _, B int32 +} + +// V has padding but not on the first field. +type V struct { + A1, A2, A3 int32 + B int16 + C int32 +} + +// W has padding at the end. +type W struct { + A1, A2, A3 int32 + B int32 + C int8 +} + +func test1() { + var a, b U + m := make(map[U]int) + copy((*[16]byte)(unsafe.Pointer(&a))[:], "hello world!") + a.A, a.B = 1, 2 + b.A, b.B = 1, 2 + if a != b { + panic("broken equality: a != b") + } + + m[a] = 1 + m[b] = 2 + if len(m) == 2 { + panic("broken hash: len(m) == 2") + } + if m[a] != 2 { + panic("m[a] != 2") + } +} + +func test2() { + var a, b T + m := make(map[T]int) + + copy((*[16]byte)(unsafe.Pointer(&a))[:], "hello world!") + a.A, a.B, a.C, a.D = 1, 2, 3, 4 + b.A, b.B, b.C, b.D = 1, 2, 3, 4 + + if a != b { + panic("broken equality: a != b") + } + + m[a] = 1 + m[b] = 2 + if len(m) == 2 { + panic("broken hash: len(m) == 2") + } + if m[a] != 2 { + panic("m[a] != 2") + } +} + +func test3() { + var a, b USmall + copy((*[12]byte)(unsafe.Pointer(&a))[:], "hello world!") + a.A, a.B = 1, 2 + b.A, b.B = 1, 2 + if a != b { + panic("broken equality: a != b") + } +} + +func test4() { + var a, b V + m := make(map[V]int) + + copy((*[20]byte)(unsafe.Pointer(&a))[:], "Hello World, Gopher!") + a.A1, a.A2, a.A3, a.B, a.C = 1, 2, 3, 4, 5 + b.A1, b.A2, b.A3, b.B, b.C = 1, 2, 3, 4, 5 + + if a != b { + panic("broken equality: a != b") + } + + m[a] = 1 + m[b] = 2 + if len(m) == 2 { + panic("broken hash: len(m) == 2") + } + if m[a] != 2 { + panic("m[a] != 2") + } +} + +func test5() { + var a, b W + m := make(map[W]int) + + copy((*[20]byte)(unsafe.Pointer(&a))[:], "Hello World, Gopher!") + a.A1, a.A2, a.A3, a.B, a.C = 1, 2, 3, 4, 5 + b.A1, b.A2, b.A3, b.B, b.C = 1, 2, 3, 4, 5 + + if a != b { + panic("broken equality: a != b") + } + + m[a] = 1 + m[b] = 2 + if len(m) == 2 { + panic("broken hash: len(m) == 2") + } + if m[a] != 2 { + panic("m[a] != 2") + } +} + +func main() { + test1() + test2() + test3() + test4() + test5() +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4590.dir/pkg1.go b/gcc/testsuite/go.test/test/fixedbugs/issue4590.dir/pkg1.go new file mode 100644 index 00000000000..c447371c1ab --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4590.dir/pkg1.go @@ -0,0 +1,26 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package pkg1 + +type A interface { + Write() error +} + +type B interface { + Hello() + world() +} + +type C struct{} + +func (c C) Write() error { return nil } + +var T = struct{ A }{nil} +var U = struct{ B }{nil} +var V A = struct{ *C }{nil} +var W = interface { + Write() error + Hello() +}(nil) diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4590.dir/pkg2.go b/gcc/testsuite/go.test/test/fixedbugs/issue4590.dir/pkg2.go new file mode 100644 index 00000000000..61c01d7aec2 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4590.dir/pkg2.go @@ -0,0 +1,15 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package pkg2 + +import "./pkg1" + +var T = struct{ pkg1.A }{nil} +var U = struct{ pkg1.B }{nil} +var V pkg1.A = struct{ *pkg1.C }{nil} +var W = interface { + Write() error + Hello() +}(nil) diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4590.dir/prog.go b/gcc/testsuite/go.test/test/fixedbugs/issue4590.dir/prog.go new file mode 100644 index 00000000000..3220e85d3a6 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4590.dir/prog.go @@ -0,0 +1,25 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "./pkg1" + "./pkg2" +) + +func main() { + if pkg1.T != pkg2.T { + panic("pkg1.T != pkg2.T") + } + if pkg1.U != pkg2.U { + panic("pkg1.U != pkg2.U") + } + if pkg1.V != pkg2.V { + panic("pkg1.V != pkg2.V") + } + if pkg1.W != pkg2.W { + panic("pkg1.W != pkg2.W") + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4590.go b/gcc/testsuite/go.test/test/fixedbugs/issue4590.go new file mode 100644 index 00000000000..faeb1adef23 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4590.go @@ -0,0 +1,10 @@ +// rundir + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4590: linker fails on multiple imports of +// an anonymous struct with methods. + +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4610.go b/gcc/testsuite/go.test/test/fixedbugs/issue4610.go new file mode 100644 index 00000000000..d56c6d3e8cd --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4610.go @@ -0,0 +1,17 @@ +// errorcheck + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +type bar struct { + x int +} + +func main() { + var foo bar + _ = &foo{} // ERROR "is not a type|expected .;." +} // GCCGO_ERROR "expected declaration" + diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4614.go b/gcc/testsuite/go.test/test/fixedbugs/issue4614.go new file mode 100644 index 00000000000..1aa318c2b23 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4614.go @@ -0,0 +1,20 @@ +// compile + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4614: slicing of nil slices confuses the compiler +// with a uintptr(nil) node. + +package p + +import "unsafe" + +var n int + +var _ = []int(nil)[1:] +var _ = []int(nil)[n:] + +var _ = uintptr(unsafe.Pointer(nil)) +var _ = unsafe.Pointer(uintptr(0)) diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4618.go b/gcc/testsuite/go.test/test/fixedbugs/issue4618.go new file mode 100644 index 00000000000..ff91ae70673 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4618.go @@ -0,0 +1,41 @@ +// run + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "fmt" + "os" + "runtime" + "testing" +) + +type T struct { int } + +var globl *T + +func F() { + t := &T{} + globl = t +} + +func G() { + t := &T{} + _ = t +} + +func main() { + nf := testing.AllocsPerRun(100, F) + ng := testing.AllocsPerRun(100, G) + if int(nf) != 1 { + fmt.Printf("AllocsPerRun(100, F) = %v, want 1\n", nf) + os.Exit(1) + } + if int(ng) != 0 && (runtime.Compiler != "gccgo" || int(ng) != 1) { + fmt.Printf("AllocsPerRun(100, G) = %v, want 0\n", ng) + os.Exit(1) + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4620.go b/gcc/testsuite/go.test/test/fixedbugs/issue4620.go new file mode 100644 index 00000000000..7b4ebf944d6 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4620.go @@ -0,0 +1,21 @@ +// run + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4620: map indexes are not evaluated before assignment of other elements + +package main + +import "fmt" + +func main() { + m := map[int]int{0:1} + i := 0 + i, m[i] = 1, 2 + if m[0] != 2 { + fmt.Println(m) + panic("m[i] != 2") + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4654.go b/gcc/testsuite/go.test/test/fixedbugs/issue4654.go new file mode 100644 index 00000000000..d3f582b20c6 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4654.go @@ -0,0 +1,71 @@ +// errorcheck + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4654. +// Check error for conversion and 'not used' in defer/go. + +package p + +import "unsafe" + +func f() { + defer int(0) // ERROR "defer requires function call, not conversion|is not used" + go string([]byte("abc")) // ERROR "go requires function call, not conversion|is not used" + + var c complex128 + var f float64 + var t struct {X int} + + var x []int + defer append(x, 1) // ERROR "defer discards result of append|is not used" + defer cap(x) // ERROR "defer discards result of cap|is not used" + defer complex(1, 2) // ERROR "defer discards result of complex|is not used" + defer complex(f, 1) // ERROR "defer discards result of complex|is not used" + defer imag(1i) // ERROR "defer discards result of imag|is not used" + defer imag(c) // ERROR "defer discards result of imag|is not used" + defer len(x) // ERROR "defer discards result of len|is not used" + defer make([]int, 1) // ERROR "defer discards result of make|is not used" + defer make(chan bool) // ERROR "defer discards result of make|is not used" + defer make(map[string]int) // ERROR "defer discards result of make|is not used" + defer new(int) // ERROR "defer discards result of new|is not used" + defer real(1i) // ERROR "defer discards result of real|is not used" + defer real(c) // ERROR "defer discards result of real|is not used" + defer append(x, 1) // ERROR "defer discards result of append|is not used" + defer append(x, 1) // ERROR "defer discards result of append|is not used" + defer unsafe.Alignof(t.X) // ERROR "defer discards result of unsafe.Alignof|is not used" + defer unsafe.Offsetof(t.X) // ERROR "defer discards result of unsafe.Offsetof|is not used" + defer unsafe.Sizeof(t) // ERROR "defer discards result of unsafe.Sizeof|is not used" + + defer copy(x, x) // ok + m := make(map[int]int) + defer delete(m, 1) // ok + defer panic(1) // ok + defer print(1) // ok + defer println(1) // ok + defer recover() // ok + + int(0) // ERROR "int\(0\) evaluated but not used|is not used" + string([]byte("abc")) // ERROR "string\(.*\) evaluated but not used|is not used" + + append(x, 1) // ERROR "not used" + cap(x) // ERROR "not used" + complex(1, 2) // ERROR "not used" + complex(f, 1) // ERROR "not used" + imag(1i) // ERROR "not used" + imag(c) // ERROR "not used" + len(x) // ERROR "not used" + make([]int, 1) // ERROR "not used" + make(chan bool) // ERROR "not used" + make(map[string]int) // ERROR "not used" + new(int) // ERROR "not used" + real(1i) // ERROR "not used" + real(c) // ERROR "not used" + append(x, 1) // ERROR "not used" + append(x, 1) // ERROR "not used" + unsafe.Alignof(t.X) // ERROR "not used" + unsafe.Offsetof(t.X) // ERROR "not used" + unsafe.Sizeof(t) // ERROR "not used" +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4663.go b/gcc/testsuite/go.test/test/fixedbugs/issue4663.go new file mode 100644 index 00000000000..edaee93c5b7 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4663.go @@ -0,0 +1,15 @@ +// errorcheck + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4663. +// Make sure 'not used' message is placed correctly. + +package main + +func a(b int) int64 { + b // ERROR "not used" + return 0 +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4667.go b/gcc/testsuite/go.test/test/fixedbugs/issue4667.go new file mode 100644 index 00000000000..3a00a31952c --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4667.go @@ -0,0 +1,37 @@ +// run + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "fmt" + "os" + "testing" +) + +var globl *int + +func G() { + F() +} + +func F() { + var x int + globl = &x +} + +func main() { + nf := testing.AllocsPerRun(100, F) + ng := testing.AllocsPerRun(100, G) + if int(nf) != 1 { + fmt.Printf("AllocsPerRun(100, F) = %v, want 1\n", nf) + os.Exit(1) + } + if int(ng) != 1 { + fmt.Printf("AllocsPerRun(100, G) = %v, want 1\n", ng) + os.Exit(1) + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4734.go b/gcc/testsuite/go.test/test/fixedbugs/issue4734.go new file mode 100644 index 00000000000..69f66f2129f --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4734.go @@ -0,0 +1,21 @@ +// compile + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Caused gccgo to emit multiple definitions of the same symbol. + +package p + +type S1 struct{} + +func (s *S1) M() {} + +type S2 struct { + F struct{ *S1 } +} + +func F() { + _ = struct{ *S1 }{} +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4748.go b/gcc/testsuite/go.test/test/fixedbugs/issue4748.go new file mode 100644 index 00000000000..73c75393cf4 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4748.go @@ -0,0 +1,20 @@ +// run + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4748. +// This program used to complain because inlining created two exit labels. + +package main + +func jump() { + goto exit +exit: + return +} +func main() { + jump() + jump() +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4752.go b/gcc/testsuite/go.test/test/fixedbugs/issue4752.go new file mode 100644 index 00000000000..d6781e39a22 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4752.go @@ -0,0 +1,26 @@ +// run + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +func F(xi, yi interface{}) uint64 { + x, y := xi.(uint64), yi.(uint64) + return x &^ y +} + +func G(xi, yi interface{}) uint64 { + return xi.(uint64) &^ yi.(uint64) // generates incorrect code +} + +func main() { + var x, y uint64 = 0, 1 << 63 + f := F(x, y) + g := G(x, y) + if f != 0 || g != 0 { + println("F", f, "G", g) + panic("bad") + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4785.go b/gcc/testsuite/go.test/test/fixedbugs/issue4785.go new file mode 100644 index 00000000000..c3dd6297d85 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4785.go @@ -0,0 +1,20 @@ +// run + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// issue 4785: used to fail to compile + +package main + +func t(x, y interface{}) interface{} { + return x.(float64) > y.(float64) +} + +func main() { + v := t(1.0, 2.0) + if v != false { + panic("bad comparison") + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4813.go b/gcc/testsuite/go.test/test/fixedbugs/issue4813.go new file mode 100644 index 00000000000..f560b2fac98 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4813.go @@ -0,0 +1,52 @@ +// errorcheck + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4813: use of constant floats as indices. + +package main + +var A [3]int +var S []int +var T string + +const ( + i = 1 + f = 2.0 + f2 = 2.1 + c = complex(2, 0) + c2 = complex(2, 1) +) + +var ( + vf = f + vc = c +) + +var ( + a1 = A[i] + a2 = A[f] + a3 = A[f2] // ERROR "truncated|must be integer" + a4 = A[c] + a5 = A[c2] // ERROR "truncated|must be integer" + a6 = A[vf] // ERROR "non-integer|must be integer" + a7 = A[vc] // ERROR "non-integer|must be integer" + + s1 = S[i] + s2 = S[f] + s3 = S[f2] // ERROR "truncated|must be integer" + s4 = S[c] + s5 = S[c2] // ERROR "truncated|must be integer" + s6 = S[vf] // ERROR "non-integer|must be integer" + s7 = S[vc] // ERROR "non-integer|must be integer" + + t1 = T[i] + t2 = T[f] + t3 = T[f2] // ERROR "truncated|must be integer" + t4 = T[c] + t5 = T[c2] // ERROR "truncated|must be integer" + t6 = T[vf] // ERROR "non-integer|must be integer" + t7 = T[vc] // ERROR "non-integer|must be integer" +) diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4879.dir/a.go b/gcc/testsuite/go.test/test/fixedbugs/issue4879.dir/a.go new file mode 100644 index 00000000000..7ee7c486047 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4879.dir/a.go @@ -0,0 +1,33 @@ +package a + +import ( + "unsafe" +) + +type Collection struct { + root unsafe.Pointer +} + +type nodeLoc struct{} + +type slice []int + +type maptype map[int]int + +func MakePrivateCollection() *Collection { + return &Collection{ + root: unsafe.Pointer(&nodeLoc{}), + } +} + +func MakePrivateCollection2() *Collection { + return &Collection{ + root: unsafe.Pointer(&slice{}), + } +} +func MakePrivateCollection3() *Collection { + return &Collection{ + root: unsafe.Pointer(&maptype{}), + } +} + diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4879.dir/b.go b/gcc/testsuite/go.test/test/fixedbugs/issue4879.dir/b.go new file mode 100644 index 00000000000..d8fb5693db9 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4879.dir/b.go @@ -0,0 +1,9 @@ +package b + +import "./a" + +func F() { + a.MakePrivateCollection() + a.MakePrivateCollection2() + a.MakePrivateCollection3() +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4879.go b/gcc/testsuite/go.test/test/fixedbugs/issue4879.go new file mode 100644 index 00000000000..842c8117ff1 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4879.go @@ -0,0 +1,10 @@ +// compiledir + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4879: export data misses the '&' for some +// composite literals in inlined bodies. + +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4909a.go b/gcc/testsuite/go.test/test/fixedbugs/issue4909a.go new file mode 100644 index 00000000000..aefe2d64557 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4909a.go @@ -0,0 +1,35 @@ +// errorcheck + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4909: compiler incorrectly accepts unsafe.Offsetof(t.x) +// where x is a field of an embedded pointer field. + +package p + +import ( + "unsafe" +) + +type T struct { + A int + *B +} + +func (t T) Method() {} + +type B struct { + X, Y int +} + +var t T +var p *T + +const N1 = unsafe.Offsetof(t.X) // ERROR "indirection" +const N2 = unsafe.Offsetof(p.X) // ERROR "indirection" +const N3 = unsafe.Offsetof(t.B.X) // valid +const N4 = unsafe.Offsetof(p.B.X) // valid +const N5 = unsafe.Offsetof(t.Method) // ERROR "method value" +const N6 = unsafe.Offsetof(p.Method) // ERROR "method value" diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4909b.go b/gcc/testsuite/go.test/test/fixedbugs/issue4909b.go new file mode 100644 index 00000000000..0f594e3db67 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4909b.go @@ -0,0 +1,80 @@ +// errorcheckoutput + +package main + +import "fmt" + +// We are going to define 256 types T(n), +// such that T(n) embeds T(2n) and *T(2n+1). + +func main() { + fmt.Printf("// errorcheck\n\n") + fmt.Printf("package p\n\n") + fmt.Println(`import "unsafe"`) + + // Dump types. + for n := 1; n < 256; n++ { + writeStruct(n) + } + // Dump leaves + for n := 256; n < 512; n++ { + fmt.Printf("type T%d int\n", n) + } + + fmt.Printf("var t T1\n") + fmt.Printf("var p *T1\n") + + // Simple selectors + for n := 2; n < 256; n++ { + writeDot(n) + } + + // Double selectors + for n := 128; n < 256; n++ { + writeDot(n/16, n) + } + + // Triple selectors + for n := 128; n < 256; n++ { + writeDot(n/64, n/8, n) + } +} + +const structTpl = ` +type T%d struct { + A%d int + T%d + *T%d +} +` + +func writeStruct(n int) { + fmt.Printf(structTpl, n, n, 2*n, 2*n+1) +} + +func writeDot(ns ...int) { + for _, root := range []string{"t", "p"} { + fmt.Printf("const _ = unsafe.Offsetof(%s", root) + for _, n := range ns { + fmt.Printf(".T%d", n) + } + // Does it involve an indirection? + nlast := ns[len(ns)-1] + nprev := 1 + if len(ns) > 1 { + nprev = ns[len(ns)-2] + } + isIndirect := false + for n := nlast / 2; n > nprev; n /= 2 { + if n%2 == 1 { + isIndirect = true + break + } + } + fmt.Print(")") + if isIndirect { + fmt.Print(` // ERROR "indirection"`) + } + fmt.Print("\n") + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4932.dir/foo.go b/gcc/testsuite/go.test/test/fixedbugs/issue4932.dir/foo.go new file mode 100644 index 00000000000..19b73a0e038 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4932.dir/foo.go @@ -0,0 +1,7 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package foo + +type Op struct{} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4932.dir/state.go b/gcc/testsuite/go.test/test/fixedbugs/issue4932.dir/state.go new file mode 100644 index 00000000000..c017b9649d4 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4932.dir/state.go @@ -0,0 +1,28 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package state + +import "./foo" + +func Public() { + var s Settings + s.op() +} + +type State struct{} + +func (s *State) x(*Settings) {} + +type Settings struct{} + +func (c *Settings) x() { + run([]foo.Op{{}}) +} + +func run([]foo.Op) {} + +func (s *Settings) op() foo.Op { + return foo.Op{} +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4932.dir/state2.go b/gcc/testsuite/go.test/test/fixedbugs/issue4932.dir/state2.go new file mode 100644 index 00000000000..50f75db2cea --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4932.dir/state2.go @@ -0,0 +1,9 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package state2 + +import "./state" + +type Foo *state.State diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4932.go b/gcc/testsuite/go.test/test/fixedbugs/issue4932.go new file mode 100644 index 00000000000..2a6bc699f0f --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4932.go @@ -0,0 +1,9 @@ +// compiledir + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4932: regression in export of composite literals. + +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4964.dir/a.go b/gcc/testsuite/go.test/test/fixedbugs/issue4964.dir/a.go new file mode 100644 index 00000000000..2b9e44e351a --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4964.dir/a.go @@ -0,0 +1,27 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package a + +var global, global2 *int + +type T struct { + Pointer *int +} + +func dontinline() {} + +func Store(t *T) { + global = t.Pointer + dontinline() +} + +func Store2(t *T) { + global2 = t.Pointer + dontinline() +} + +func Get() *int { + return global +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4964.dir/b.go b/gcc/testsuite/go.test/test/fixedbugs/issue4964.dir/b.go new file mode 100644 index 00000000000..42a6f1d761a --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4964.dir/b.go @@ -0,0 +1,34 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import "./a" + +func F() { + // store 1 in a.global + x, y := 1, 2 + t := a.T{Pointer: &x} + a.Store(&t) + _ = y +} + +func G() { + // store 4 in a.global2 + x, y := 3, 4 + t := a.T{Pointer: &y} + a.Store2(&t) + _ = x +} + +func main() { + F() + G() + p := a.Get() + n := *p + if n != 1 { + println(n, "!= 1") + panic("n != 1") + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4964.go b/gcc/testsuite/go.test/test/fixedbugs/issue4964.go new file mode 100644 index 00000000000..8291d1bb97d --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4964.go @@ -0,0 +1,10 @@ +// rundir + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 4964: exported escape analysis result is not enough +// for cross package analysis. + +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5002.go b/gcc/testsuite/go.test/test/fixedbugs/issue5002.go new file mode 100644 index 00000000000..1e74fa1a1f6 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5002.go @@ -0,0 +1,16 @@ +// build + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 5002: 8g produces invalid CMPL $0, $0. +// Used to fail at link time. + +package main + +func main() { + var y int64 + if y%1 == 0 { + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5056.go b/gcc/testsuite/go.test/test/fixedbugs/issue5056.go new file mode 100644 index 00000000000..a2cde2a501e --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5056.go @@ -0,0 +1,34 @@ +// run + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// issue 5056: escape analysis not applied to wrapper functions + +package main + +type Foo int16 + +func (f Foo) Esc() *int{ + x := int(f) + return &x +} + +type iface interface { + Esc() *int +} + +var bar, foobar *int + +func main() { + var quux iface + var x Foo + + quux = x + bar = quux.Esc() + foobar = quux.Esc() + if bar == foobar { + panic("bar == foobar") + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5089.go b/gcc/testsuite/go.test/test/fixedbugs/issue5089.go new file mode 100644 index 00000000000..81b9f0521f9 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5089.go @@ -0,0 +1,15 @@ +// errorcheck + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// issue 5089: gc allows methods on non-locals if symbol already exists + +package p + +import "bufio" // GCCGO_ERROR "previous" + +func (b *bufio.Reader) Buffered() int { // ERROR "non-local|redefinition" + return -1 +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5105.dir/a.go b/gcc/testsuite/go.test/test/fixedbugs/issue5105.dir/a.go new file mode 100644 index 00000000000..f20abb98bfa --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5105.dir/a.go @@ -0,0 +1,7 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package a + +var A = [2]string{"hello", "world"} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5105.dir/b.go b/gcc/testsuite/go.test/test/fixedbugs/issue5105.dir/b.go new file mode 100644 index 00000000000..b12e739e33a --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5105.dir/b.go @@ -0,0 +1,15 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import "./a" + +var B = [2]string{"world", "hello"} + +func main() { + if a.A[0] != B[1] { + panic("bad hello") + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5105.go b/gcc/testsuite/go.test/test/fixedbugs/issue5105.go new file mode 100644 index 00000000000..e3e5e5caa46 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5105.go @@ -0,0 +1,10 @@ +// rundir + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 5105: linker segfaults on duplicate definition +// of a type..hash.* function. + +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5125.dir/bug.go b/gcc/testsuite/go.test/test/fixedbugs/issue5125.dir/bug.go new file mode 100644 index 00000000000..2fdf0f9bb8b --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5125.dir/bug.go @@ -0,0 +1,17 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package bug + +type Node interface { + Eval(s *Scene) +} + +type plug struct { + node Node +} + +type Scene struct { + changed map[plug]bool +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5125.dir/main.go b/gcc/testsuite/go.test/test/fixedbugs/issue5125.dir/main.go new file mode 100644 index 00000000000..47acdeba8a9 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5125.dir/main.go @@ -0,0 +1,10 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import _ "./bug" + +func main() { +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5125.go b/gcc/testsuite/go.test/test/fixedbugs/issue5125.go new file mode 100644 index 00000000000..c049df3e2f7 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5125.go @@ -0,0 +1,10 @@ +// compiledir + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 5125: cyclic dependencies between types confuse +// the hashability test during import. + +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5162.go b/gcc/testsuite/go.test/test/fixedbugs/issue5162.go new file mode 100644 index 00000000000..b14eae7863d --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5162.go @@ -0,0 +1,88 @@ +// runoutput + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// issue 5162: bad array equality when multiple comparisons +// happen in the same expression. + +package main + +import ( + "fmt" + "strings" +) + +const template = ` +func CheckEqNNN_TTT() { + onesA := [NNN]ttt{ONES} + onesB := [NNN]ttt{ONES} + twos := [NNN]ttt{TWOS} + if onesA != onesB { + println("onesA != onesB in CheckEqNNN_TTT") + } + if onesA == twos { + println("onesA == twos in CheckEqNNN_TTT") + } + if onesB == twos { + println("onesB == twos in CheckEqNNN_TTT") + } + if s := fmt.Sprint(onesA == onesB, onesA != twos, onesB != twos); s != "true true true" { + println("fail in CheckEqNNN_TTT:", s) + } +} + +func CheckEqNNN_TTTExtraVar() { + onesA := [NNN]ttt{ONES} + onesB := [NNN]ttt{ONES} + twos := [NNN]ttt{TWOS} + onesX := onesA + if onesA != onesB { + println("onesA != onesB in CheckEqNNN_TTTExtraVar") + } + if onesA == twos { + println("onesA == twos in CheckEqNNN_TTTExtraVar") + } + if onesB == twos { + println("onesB == twos in CheckEqNNN_TTTExtraVar") + } + if s := fmt.Sprint(onesA == onesB, onesA != twos, onesB != twos); s != "true true true" { + println("fail in CheckEqNNN_TTTExtraVar:", s) + } + if s := fmt.Sprint(onesB == onesX); s != "true" { + println("extra var fail in CheckEqNNN_TTTExtraVar") + } +} +` + +func main() { + fmt.Print("// run\n\n") + fmt.Print("// THIS FILE IS AUTO-GENERATED\n\n") + fmt.Print("package main\n\n") + fmt.Println(`import "fmt"`) + + types := []string{ + "int", "int8", "int16", "int32", "int64", + "uint", "uint8", "uint16", "uint32", "uint64", + "float32", "float64"} + tocall := make([]string, 0, 32*len(types)) + for i := 1; i <= 32; i++ { + for _, typ := range types { + src := template + src = strings.Replace(src, "NNN", fmt.Sprint(i), -1) + src = strings.Replace(src, "TTT", strings.Title(typ), -1) + src = strings.Replace(src, "ttt", typ, -1) + src = strings.Replace(src, "ONES", "1"+strings.Repeat(", 1", i-1), -1) + src = strings.Replace(src, "TWOS", "2"+strings.Repeat(", 2", i-1), -1) + fmt.Print(src) + tocall = append(tocall, fmt.Sprintf("CheckEq%d_%s", i, strings.Title(typ))) + } + } + fmt.Println("func main() {") + for _, fun := range tocall { + fmt.Printf("\t%s()\n", fun) + fmt.Printf("\t%sExtraVar()\n", fun) + } + fmt.Println("}") +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5231.go b/gcc/testsuite/go.test/test/fixedbugs/issue5231.go new file mode 100644 index 00000000000..4039913dc90 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5231.go @@ -0,0 +1,45 @@ +// compile + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 5231: method values lose their variadic property. + +package p + +type T int + +func (t T) NotVariadic(s []int) int { + return int(t) + s[0] +} + +func (t T) Variadic(s ...int) int { + return int(t) + s[0] +} + +type I interface { + NotVariadic(s []int) int + Variadic(s ...int) int +} + +func F() { + var t T + var p *T = &t + var i I = p + + nv := t.NotVariadic + nv = p.NotVariadic + nv = i.NotVariadic + var s int = nv([]int{1, 2, 3}) + + v := t.Variadic + v = p.Variadic + v = i.Variadic + s = v(1, 2, 3) + + var f1 func([]int) int = nv + var f2 func(...int) int = v + + _, _, _ = f1, f2, s +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5244.go b/gcc/testsuite/go.test/test/fixedbugs/issue5244.go new file mode 100644 index 00000000000..e26c7b8c45e --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5244.go @@ -0,0 +1,18 @@ +// run + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 5244: the init order computation uses the wrong +// order for top-level blank identifier assignments. +// The example used to panic because it tries calling a +// nil function instead of assigning to f before. + +package main + +var f = func() int { return 1 } +var _ = f() + g() +var g = func() int { return 2 } + +func main() {} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5259.dir/bug.go b/gcc/testsuite/go.test/test/fixedbugs/issue5259.dir/bug.go new file mode 100644 index 00000000000..8512461686b --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5259.dir/bug.go @@ -0,0 +1,17 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package bug + +type S struct { + F func() +} + +type X interface { + Bar() +} + +func Foo(x X) *S { + return &S{F: x.Bar} +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5259.dir/main.go b/gcc/testsuite/go.test/test/fixedbugs/issue5259.dir/main.go new file mode 100644 index 00000000000..ad1da78f5fc --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5259.dir/main.go @@ -0,0 +1,16 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import "./bug" + +type foo int + +func (f *foo) Bar() { +} + +func main() { + bug.Foo(new(foo)) +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5259.go b/gcc/testsuite/go.test/test/fixedbugs/issue5259.go new file mode 100644 index 00000000000..00fe19ff947 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5259.go @@ -0,0 +1,9 @@ +// compiledir + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 5259: Inlining of method value causes internal compiler error + +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5260.dir/a.go b/gcc/testsuite/go.test/test/fixedbugs/issue5260.dir/a.go new file mode 100644 index 00000000000..5a2c99f65c7 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5260.dir/a.go @@ -0,0 +1,7 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package a + +const BOM = "\uFEFF" diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5260.dir/b.go b/gcc/testsuite/go.test/test/fixedbugs/issue5260.dir/b.go new file mode 100644 index 00000000000..299b75e4a7c --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5260.dir/b.go @@ -0,0 +1,11 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import "./a" + +func main() { + _ = a.BOM +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5260.go b/gcc/testsuite/go.test/test/fixedbugs/issue5260.go new file mode 100644 index 00000000000..11fd5d04815 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5260.go @@ -0,0 +1,10 @@ +// rundir + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 5260: Unicode BOM in exported string constant +// cannot be read back during package import. + +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5291.dir/pkg1.go b/gcc/testsuite/go.test/test/fixedbugs/issue5291.dir/pkg1.go new file mode 100644 index 00000000000..b1c893ac83e --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5291.dir/pkg1.go @@ -0,0 +1,34 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package pkg1 + +import ( + "runtime" +) + +type T2 *[]string + +type Data struct { + T1 *[]T2 +} + +func CrashCall() (err error) { + var d Data + + for count := 0; count < 10; count++ { + runtime.GC() + + len := 2 // crash when >=2 + x := make([]T2, len) + + d = Data{T1: &x} + + for j := 0; j < len; j++ { + y := make([]string, 1) + (*d.T1)[j] = &y + } + } + return nil +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5291.dir/prog.go b/gcc/testsuite/go.test/test/fixedbugs/issue5291.dir/prog.go new file mode 100644 index 00000000000..8301091bd88 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5291.dir/prog.go @@ -0,0 +1,17 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "./pkg1" +) + +type message struct { // Presence of this creates a crash + data pkg1.Data +} + +func main() { + pkg1.CrashCall() +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5291.go b/gcc/testsuite/go.test/test/fixedbugs/issue5291.go new file mode 100644 index 00000000000..00d2ada4cc8 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5291.go @@ -0,0 +1,9 @@ +// rundir + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 5291: GC crash + +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5470.dir/a.go b/gcc/testsuite/go.test/test/fixedbugs/issue5470.dir/a.go new file mode 100644 index 00000000000..302822d2387 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5470.dir/a.go @@ -0,0 +1,27 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package a + +type Foo interface { + Hi() string +} + +func Test1() Foo { return make(tst1) } + +type tst1 map[string]bool + +func (r tst1) Hi() string { return "Hi!" } + +func Test2() Foo { return make(tst2, 0) } + +type tst2 []string + +func (r tst2) Hi() string { return "Hi!" } + +func Test3() Foo { return make(tst3) } + +type tst3 chan string + +func (r tst3) Hi() string { return "Hi!" } diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5470.dir/b.go b/gcc/testsuite/go.test/test/fixedbugs/issue5470.dir/b.go new file mode 100644 index 00000000000..0801c149cfe --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5470.dir/b.go @@ -0,0 +1,13 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package b + +import "./a" + +func main() { + a.Test1() + a.Test2() + a.Test3() +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5470.go b/gcc/testsuite/go.test/test/fixedbugs/issue5470.go new file mode 100644 index 00000000000..6123c0983a8 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5470.go @@ -0,0 +1,10 @@ +// compiledir + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 5470: exported data for inlining may miss +// the type argument of make. + +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5493.go b/gcc/testsuite/go.test/test/fixedbugs/issue5493.go new file mode 100644 index 00000000000..bbc62ffac0a --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5493.go @@ -0,0 +1,59 @@ +// run + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "runtime" + "sync" + "sync/atomic" + "time" +) + +const N = 10 +var count int64 + +func run() error { + f1 := func() {} + f2 := func() { + func() { + f1() + }() + } + runtime.SetFinalizer(&f1, func(f *func()) { + atomic.AddInt64(&count, -1) + }) + go f2() + return nil +} + +func main() { + // Does not work on 32-bits, or with gccgo, due to partially + // conservative GC. + // Try to enable when we have fully precise GC. + if runtime.GOARCH != "amd64" || runtime.Compiler == "gccgo" { + return + } + count = N + var wg sync.WaitGroup + wg.Add(N) + for i := 0; i < N; i++ { + go func() { + run() + wg.Done() + }() + } + wg.Wait() + for i := 0; i < 2*N; i++ { + time.Sleep(10 * time.Millisecond) + runtime.GC() + } + if count != 0 { + println(count, "out of", N, "finalizer are called") + panic("not all finalizers are called") + } +} + diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5515.go b/gcc/testsuite/go.test/test/fixedbugs/issue5515.go new file mode 100644 index 00000000000..053abf6f7cf --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5515.go @@ -0,0 +1,34 @@ +// run + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// issue 5515: miscompilation doing inlining in generated method wrapper + +package main + +type T uint32 + +func main() { + b := make([]T, 8) + b[0] = 0xdeadbeef + rs := Slice(b) + sort(rs) +} + +type Slice []T + +func (s Slice) Swap(i, j int) { + tmp := s[i] + s[i] = s[j] + s[j] = tmp +} + +type Interface interface { + Swap(i, j int) +} + +func sort(data Interface) { + data.Swap(0, 4) +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5607.go b/gcc/testsuite/go.test/test/fixedbugs/issue5607.go new file mode 100644 index 00000000000..785be7a2c76 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5607.go @@ -0,0 +1,36 @@ +// run + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 5607: generation of init() function incorrectly +// uses initializers of blank variables inside closures. + +package main + +var Test = func() { + var mymap = map[string]string{"a": "b"} + + var innerTest = func() { + // Used to crash trying to compile this line as + // part of init() (funcdepth mismatch). + var _, x = mymap["a"] + println(x) + } + innerTest() +} + +var Test2 = func() { + // The following initializer should not be part of init() + // The compiler used to generate a call to Panic() in init(). + var _, x = Panic() + _ = x +} + +func Panic() (int, int) { + panic("omg") + return 1, 2 +} + +func main() {} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5614.dir/rethinkgo.go b/gcc/testsuite/go.test/test/fixedbugs/issue5614.dir/rethinkgo.go new file mode 100644 index 00000000000..4ae66d679ea --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5614.dir/rethinkgo.go @@ -0,0 +1,16 @@ +package rethinkgo + +type Session struct { +} + +func (s *Session) Run(query Exp) *int { return nil } + +type List []interface{} + +type Exp struct { + args []interface{} +} + +func (e Exp) UseOutdated(useOutdated bool) Exp { + return Exp{args: List{e, useOutdated}} +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5614.dir/x.go b/gcc/testsuite/go.test/test/fixedbugs/issue5614.dir/x.go new file mode 100644 index 00000000000..7e4f3a7e6b9 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5614.dir/x.go @@ -0,0 +1,7 @@ +package x + +import "./rethinkgo" + +var S *rethinkgo.Session + + diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5614.dir/y.go b/gcc/testsuite/go.test/test/fixedbugs/issue5614.dir/y.go new file mode 100644 index 00000000000..97cc93a79d5 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5614.dir/y.go @@ -0,0 +1,5 @@ +package y + +import "./x" + +var T = x.S diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5614.go b/gcc/testsuite/go.test/test/fixedbugs/issue5614.go new file mode 100644 index 00000000000..f2518d2a0c1 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5614.go @@ -0,0 +1,11 @@ +// compiledir + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 5614: exported data for inlining may miss +// named types when used in implicit conversion to +// their underlying type. + +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5753.go b/gcc/testsuite/go.test/test/fixedbugs/issue5753.go new file mode 100644 index 00000000000..230a1e8c3bd --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5753.go @@ -0,0 +1,29 @@ +// run + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// issue 5753: bad typecheck info causes escape analysis to +// not run on method thunks. + +package main + +type Thing struct{} + +func (t *Thing) broken(s string) []string { + foo := [1]string{s} + return foo[:] +} + +func main() { + t := &Thing{} + + f := t.broken + s := f("foo") + _ = f("bar") + if s[0] != "foo" { + panic(`s[0] != "foo"`) + } + +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5755.dir/a.go b/gcc/testsuite/go.test/test/fixedbugs/issue5755.dir/a.go new file mode 100644 index 00000000000..aa398e82b25 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5755.dir/a.go @@ -0,0 +1,60 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package a + +type I interface { + F() +} + +type foo1 []byte +type foo2 []rune +type foo3 []uint8 +type foo4 []int32 +type foo5 string +type foo6 string +type foo7 string +type foo8 string +type foo9 string + +func (f foo1) F() { return } +func (f foo2) F() { return } +func (f foo3) F() { return } +func (f foo4) F() { return } +func (f foo5) F() { return } +func (f foo6) F() { return } +func (f foo7) F() { return } +func (f foo8) F() { return } +func (f foo9) F() { return } + +func Test1(s string) I { return foo1(s) } +func Test2(s string) I { return foo2(s) } +func Test3(s string) I { return foo3(s) } +func Test4(s string) I { return foo4(s) } +func Test5(s []byte) I { return foo5(s) } +func Test6(s []rune) I { return foo6(s) } +func Test7(s []uint8) I { return foo7(s) } +func Test8(s []int32) I { return foo8(s) } +func Test9(s int) I { return foo9(s) } + +type bar map[int]int + +func (b bar) F() { return } + +func TestBar() I { return bar{1: 2} } + +type baz int + +func IsBaz(x interface{}) bool { _, ok := x.(baz); return ok } + +type baz2 int + +func IsBaz2(x interface{}) bool { + switch x.(type) { + case baz2: + return true + default: + return false + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5755.dir/main.go b/gcc/testsuite/go.test/test/fixedbugs/issue5755.dir/main.go new file mode 100644 index 00000000000..6d515f26a63 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5755.dir/main.go @@ -0,0 +1,23 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import "./a" + +func main() { + a.Test1("frumious") + a.Test2("frumious") + a.Test3("frumious") + a.Test4("frumious") + + a.Test5(nil) + a.Test6(nil) + a.Test7(nil) + a.Test8(nil) + a.Test9(0) + + a.TestBar() + a.IsBaz(nil) +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5755.go b/gcc/testsuite/go.test/test/fixedbugs/issue5755.go new file mode 100644 index 00000000000..fa7ea4d204c --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5755.go @@ -0,0 +1,10 @@ +// compiledir + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 5755: exported data for inlining may miss +// named types when used in string conversions. + +package ignored diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5809.go b/gcc/testsuite/go.test/test/fixedbugs/issue5809.go new file mode 100644 index 00000000000..ca060b55de6 --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5809.go @@ -0,0 +1,27 @@ +// run + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// issue 5809: 6g and 8g attempted to constant propagate indexed LEA + +package main + +import "fmt" + +func main() { + const d16 = "0123456789ABCDEF" + k := 0x1234 + var x [4]byte + + x[0] = d16[k>>12&0xf] + x[1] = d16[k>>8&0xf] + x[2] = d16[k>>4&0xf] + x[3] = d16[k&0xf] + + if x != [4]byte{'1','2','3','4'} { + fmt.Println(x) + panic("x != [4]byte{'1','2','3','4'}") + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5820.go b/gcc/testsuite/go.test/test/fixedbugs/issue5820.go new file mode 100644 index 00000000000..94de06d57db --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5820.go @@ -0,0 +1,18 @@ +// run + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// issue 5820: register clobber when clearfat and 64 bit arithmetic is interleaved. + +package main + +func main() { + array := make([][]int, 2) + index := uint64(1) + array[index] = nil + if array[1] != nil { + panic("array[1] != nil") + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue5841.go b/gcc/testsuite/go.test/test/fixedbugs/issue5841.go new file mode 100644 index 00000000000..cfc4a504c5a --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue5841.go @@ -0,0 +1,16 @@ +// build + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 5841: 8g produces invalid CMPL $0, $0. +// Similar to issue 5002, used to fail at link time. + +package main + +func main() { + var y int + if y%1 == 0 { + } +} diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue887.go b/gcc/testsuite/go.test/test/fixedbugs/issue887.go new file mode 100644 index 00000000000..5bc193bf96f --- /dev/null +++ b/gcc/testsuite/go.test/test/fixedbugs/issue887.go @@ -0,0 +1,36 @@ +// compile + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Used to leak registers on 8g. + +package p + +func f(x byte, y uint64) { + var r byte + switch y { + case 1: + r = x << y // '>>' triggers it too + case 2: + r = x << y + case 3: + r = x << y + case 4: + r = x << y + case 5: + r = x << y + case 6: + r = x << y + case 7: + r = x << y + case 8: + r = x << y + case 9: + r = x << y + case 10: + r = x << y + } + _ = r +} diff --git a/gcc/testsuite/go.test/test/float_lit.go b/gcc/testsuite/go.test/test/float_lit.go index 2912c3749c2..4efae2362da 100644 --- a/gcc/testsuite/go.test/test/float_lit.go +++ b/gcc/testsuite/go.test/test/float_lit.go @@ -196,4 +196,8 @@ func main() { if !close(-210.012e19, -210012, 1000, 19) { print("-210.012e19 is ", -210.012e19, "\n") } + + if bad { + panic("float_lit") + } } diff --git a/gcc/testsuite/go.test/test/floatcmp.go b/gcc/testsuite/go.test/test/floatcmp.go index f9f59a937f2..6c424ccd909 100644 --- a/gcc/testsuite/go.test/test/floatcmp.go +++ b/gcc/testsuite/go.test/test/floatcmp.go @@ -87,4 +87,7 @@ func main() { println(t.name, "=", t.expr, "want", t.want) } } + if bad { + panic("floatcmp failed") + } } diff --git a/gcc/testsuite/go.test/test/func1.go b/gcc/testsuite/go.test/test/func1.go index c89f7ff2eae..fb6f56184fa 100644 --- a/gcc/testsuite/go.test/test/func1.go +++ b/gcc/testsuite/go.test/test/func1.go @@ -14,6 +14,6 @@ func f1(a int) (int, float32) { } -func f2(a int) (a int, b float32) { // ERROR "redeclared|definition" +func f2(a int) (a int, b float32) { // ERROR "duplicate argument a|definition" return 8, 8.0 } diff --git a/gcc/testsuite/go.test/test/func7.go b/gcc/testsuite/go.test/test/func7.go index 6f6766f29f6..2d646b67860 100644 --- a/gcc/testsuite/go.test/test/func7.go +++ b/gcc/testsuite/go.test/test/func7.go @@ -17,7 +17,7 @@ func f() int { func g() int { if !calledf { - println("BUG: func7 - called g before f") + panic("BUG: func7 - called g before f") } return 0 } @@ -28,4 +28,3 @@ func main() { panic("wrong answer") } } - diff --git a/gcc/testsuite/go.test/test/func8.go b/gcc/testsuite/go.test/test/func8.go index 7defe265b58..13051802ecd 100644 --- a/gcc/testsuite/go.test/test/func8.go +++ b/gcc/testsuite/go.test/test/func8.go @@ -37,13 +37,13 @@ func y() string { func main() { if f() == g() { - println("wrong f,g order") + panic("wrong f,g order") } if x() == (y() == "abc") { panic("wrong compare") } if xy != "xy" { - println("wrong x,y order") + panic("wrong x,y order") } } diff --git a/gcc/testsuite/go.test/test/funcdup.go b/gcc/testsuite/go.test/test/funcdup.go new file mode 100644 index 00000000000..d15d685792f --- /dev/null +++ b/gcc/testsuite/go.test/test/funcdup.go @@ -0,0 +1,27 @@ +// errorcheck + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package p + +type T interface { + F1(i int) (i int) // ERROR "duplicate argument i|redefinition|previous" + F2(i, i int) // ERROR "duplicate argument i|redefinition|previous" + F3() (i, i int) // ERROR "duplicate argument i|redefinition|previous" +} + +type T1 func(i, i int) // ERROR "duplicate argument i|redefinition|previous" +type T2 func(i int) (i int) // ERROR "duplicate argument i|redefinition|previous" +type T3 func() (i, i int) // ERROR "duplicate argument i|redefinition|previous" + +type R struct{} + +func (i *R) F1(i int) {} // ERROR "duplicate argument i|redefinition|previous" +func (i *R) F2() (i int) {return 0} // ERROR "duplicate argument i|redefinition|previous" +func (i *R) F3(j int) (j int) {return 0} // ERROR "duplicate argument j|redefinition|previous" + +func F1(i, i int) {} // ERROR "duplicate argument i|redefinition|previous" +func F2(i int) (i int) {return 0} // ERROR "duplicate argument i|redefinition|previous" +func F3() (i, i int) {return 0, 0} // ERROR "duplicate argument i|redefinition|previous" diff --git a/gcc/testsuite/go.test/test/funcdup2.go b/gcc/testsuite/go.test/test/funcdup2.go new file mode 100644 index 00000000000..1db1a396b2e --- /dev/null +++ b/gcc/testsuite/go.test/test/funcdup2.go @@ -0,0 +1,17 @@ +// errorcheck + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package p + +var T interface { + F1(i int) (i int) // ERROR "duplicate argument i|redefinition|previous" + F2(i, i int) // ERROR "duplicate argument i|redefinition|previous" + F3() (i, i int) // ERROR "duplicate argument i|redefinition|previous" +} + +var T1 func(i, i int) // ERROR "duplicate argument i|redefinition|previous" +var T2 func(i int) (i int) // ERROR "duplicate argument i|redefinition|previous" +var T3 func() (i, i int) // ERROR "duplicate argument i|redefinition|previous" diff --git a/gcc/testsuite/go.test/test/golden.out b/gcc/testsuite/go.test/test/golden.out index 3e44e04c6aa..742a5d3f634 100644 --- a/gcc/testsuite/go.test/test/golden.out +++ b/gcc/testsuite/go.test/test/golden.out @@ -16,13 +16,9 @@ == fixedbugs/ =========== fixedbugs/bug429.go -throw: all goroutines are asleep - deadlock! +fatal error: all goroutines are asleep - deadlock! == bugs/ =========== bugs/bug395.go bug395 is broken - -=========== bugs/bug434.go -bugs/bug434.dir/two.go:10: one.t.int undefined (cannot refer to unexported field or method one.int) -BUG:bug434 diff --git a/gcc/testsuite/go.test/test/goprint.go b/gcc/testsuite/go.test/test/goprint.go index 2f0d3c3904d..cdaccf4f796 100644 --- a/gcc/testsuite/go.test/test/goprint.go +++ b/gcc/testsuite/go.test/test/goprint.go @@ -12,5 +12,5 @@ import "time" func main() { go println(42, true, false, true, 1.5, "world", (chan int)(nil), []int(nil), (map[string]int)(nil), (func())(nil), byte(255)) - time.Sleep(1e6) + time.Sleep(100*time.Millisecond) } diff --git a/gcc/testsuite/go.test/test/import2.dir/import2.go b/gcc/testsuite/go.test/test/import2.dir/import2.go new file mode 100644 index 00000000000..8bb1eb91913 --- /dev/null +++ b/gcc/testsuite/go.test/test/import2.dir/import2.go @@ -0,0 +1,42 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Various declarations of exported variables and functions. + +package p + +var C1 chan <- chan int = (chan<- (chan int))(nil) +var C2 chan (<- chan int) = (chan (<-chan int))(nil) +var C3 <- chan chan int = (<-chan (chan int))(nil) +var C4 chan chan <- int = (chan (chan<- int))(nil) + +var C5 <- chan <- chan int = (<-chan (<-chan int))(nil) +var C6 chan <- <- chan int = (chan<- (<-chan int))(nil) +var C7 chan <- chan <- int = (chan<- (chan<- int))(nil) + +var C8 <- chan <- chan chan int = (<-chan (<-chan (chan int)))(nil) +var C9 <- chan chan <- chan int = (<-chan (chan<- (chan int)))(nil) +var C10 chan <- <- chan chan int = (chan<- (<-chan (chan int)))(nil) +var C11 chan <- chan <- chan int = (chan<- (chan<- (chan int)))(nil) +var C12 chan chan <- <- chan int = (chan (chan<- (<-chan int)))(nil) +var C13 chan chan <- chan <- int = (chan (chan<- (chan<- int)))(nil) + +var R1 chan<- (chan int) = (chan <- chan int)(nil) +var R3 <-chan (chan int) = (<- chan chan int)(nil) +var R4 chan (chan<- int) = (chan chan <- int)(nil) + +var R5 <-chan (<-chan int) = (<- chan <- chan int)(nil) +var R6 chan<- (<-chan int) = (chan <- <- chan int)(nil) +var R7 chan<- (chan<- int) = (chan <- chan <- int)(nil) + +var R8 <-chan (<-chan (chan int)) = (<- chan <- chan chan int)(nil) +var R9 <-chan (chan<- (chan int)) = (<- chan chan <- chan int)(nil) +var R10 chan<- (<-chan (chan int)) = (chan <- <- chan chan int)(nil) +var R11 chan<- (chan<- (chan int)) = (chan <- chan <- chan int)(nil) +var R12 chan (chan<- (<-chan int)) = (chan chan <- <- chan int)(nil) +var R13 chan (chan<- (chan<- int)) = (chan chan <- chan <- int)(nil) + +var F1 func() func() int +func F2() func() func() int +func F3(func() func() int) diff --git a/gcc/testsuite/go.test/test/import3.go b/gcc/testsuite/go.test/test/import2.dir/import3.go index 0a5ba1d01ac..d7fe37b1996 100644 --- a/gcc/testsuite/go.test/test/import3.go +++ b/gcc/testsuite/go.test/test/import2.dir/import3.go @@ -1,8 +1,3 @@ -// $G $D/import2.go && $G $D/$F.go - -// NOTE: This test is not run by 'run.go' and so not run by all.bash. -// To run this test you must use the ./run shell script. - // Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. diff --git a/gcc/testsuite/go.test/test/import2.go b/gcc/testsuite/go.test/test/import2.go index 5c275f34b36..f8d0b0a0fd9 100644 --- a/gcc/testsuite/go.test/test/import2.go +++ b/gcc/testsuite/go.test/test/import2.go @@ -1,45 +1,8 @@ -// skip # used by import3 +// compiledir // Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Various declarations of exported variables and functions. -// Imported by import3.go. - -package p - -var C1 chan <- chan int = (chan<- (chan int))(nil) -var C2 chan (<- chan int) = (chan (<-chan int))(nil) -var C3 <- chan chan int = (<-chan (chan int))(nil) -var C4 chan chan <- int = (chan (chan<- int))(nil) - -var C5 <- chan <- chan int = (<-chan (<-chan int))(nil) -var C6 chan <- <- chan int = (chan<- (<-chan int))(nil) -var C7 chan <- chan <- int = (chan<- (chan<- int))(nil) - -var C8 <- chan <- chan chan int = (<-chan (<-chan (chan int)))(nil) -var C9 <- chan chan <- chan int = (<-chan (chan<- (chan int)))(nil) -var C10 chan <- <- chan chan int = (chan<- (<-chan (chan int)))(nil) -var C11 chan <- chan <- chan int = (chan<- (chan<- (chan int)))(nil) -var C12 chan chan <- <- chan int = (chan (chan<- (<-chan int)))(nil) -var C13 chan chan <- chan <- int = (chan (chan<- (chan<- int)))(nil) - -var R1 chan<- (chan int) = (chan <- chan int)(nil) -var R3 <-chan (chan int) = (<- chan chan int)(nil) -var R4 chan (chan<- int) = (chan chan <- int)(nil) - -var R5 <-chan (<-chan int) = (<- chan <- chan int)(nil) -var R6 chan<- (<-chan int) = (chan <- <- chan int)(nil) -var R7 chan<- (chan<- int) = (chan <- chan <- int)(nil) - -var R8 <-chan (<-chan (chan int)) = (<- chan <- chan chan int)(nil) -var R9 <-chan (chan<- (chan int)) = (<- chan chan <- chan int)(nil) -var R10 chan<- (<-chan (chan int)) = (chan <- <- chan chan int)(nil) -var R11 chan<- (chan<- (chan int)) = (chan <- chan <- chan int)(nil) -var R12 chan (chan<- (<-chan int)) = (chan chan <- <- chan int)(nil) -var R13 chan (chan<- (chan<- int)) = (chan chan <- chan <- int)(nil) - -var F1 func() func() int -func F2() func() func() int -func F3(func() func() int) +// Tests that export data does not corrupt type syntax. +package ignored diff --git a/gcc/testsuite/go.test/test/import4.dir/empty.go b/gcc/testsuite/go.test/test/import4.dir/empty.go new file mode 100644 index 00000000000..1dffa170dfc --- /dev/null +++ b/gcc/testsuite/go.test/test/import4.dir/empty.go @@ -0,0 +1,10 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package empty + +import ( ) +const ( ) +var ( ) +type ( ) diff --git a/gcc/testsuite/go.test/test/import4.dir/import4.go b/gcc/testsuite/go.test/test/import4.dir/import4.go new file mode 100644 index 00000000000..f92c663d04b --- /dev/null +++ b/gcc/testsuite/go.test/test/import4.dir/import4.go @@ -0,0 +1,24 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Verify that various kinds of "imported and not used" +// errors are caught by the compiler. +// Does not compile. + +package main + +// standard +import "fmt" // ERROR "imported and not used.*fmt" + +// renamed +import X "math" // ERROR "imported and not used.*math" + +// import dot +import . "bufio" // ERROR "imported and not used.*bufio" + +// again, package without anything in it +import "./empty" // GC_ERROR "imported and not used.*empty" +import Z "./empty" // GC_ERROR "imported and not used.*empty" +import . "./empty" // ERROR "imported and not used.*empty" + diff --git a/gcc/testsuite/go.test/test/import4.go b/gcc/testsuite/go.test/test/import4.go index f35f5678184..875bf894302 100644 --- a/gcc/testsuite/go.test/test/import4.go +++ b/gcc/testsuite/go.test/test/import4.go @@ -1,7 +1,4 @@ -// $G $D/empty.go && errchk $G $D/$F.go - -// NOTE: This test is not run by 'run.go' and so not run by all.bash. -// To run this test you must use the ./run shell script. +// errorcheckdir // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style @@ -11,19 +8,4 @@ // errors are caught by the compiler. // Does not compile. -package main - -// standard -import "fmt" // ERROR "imported and not used.*fmt" - -// renamed -import X "math" // ERROR "imported and not used.*math" - -// import dot -import . "bufio" // ERROR "imported and not used.*bufio" - -// again, package without anything in it -import "./empty" // ERROR "imported and not used.*empty" -import Z "./empty" // ERROR "imported and not used.*empty" -import . "./empty" // ERROR "imported and not used.*empty" - +package ignored diff --git a/gcc/testsuite/go.test/test/index.go b/gcc/testsuite/go.test/test/index.go index daab45f7a17..a8c471bb3bf 100644 --- a/gcc/testsuite/go.test/test/index.go +++ b/gcc/testsuite/go.test/test/index.go @@ -36,6 +36,8 @@ const ( ci64big int64 = 1<<31 ci64bigger int64 = 1<<32 chuge = 1<<100 + cfgood = 2.0 + cfbad = 2.1 cnj = -2 cni int = -3 @@ -46,6 +48,8 @@ const ( cni64big int64 = -1<<31 cni64bigger int64 = -1<<32 cnhuge = -1<<100 + cnfgood = -2.0 + cnfbad = -2.1 ) var j int = 100020 @@ -57,6 +61,8 @@ var i64 int64 = 100023 var i64big int64 = 1<<31 var i64bigger int64 = 1<<32 var huge uint64 = 1<<64 - 1 +var fgood float64 = 2.0 +var fbad float64 = 2.1 var nj int = -10 var ni int = -11 @@ -67,6 +73,8 @@ var ni64 int64 = -13 var ni64big int64 = -1<<31 var ni64bigger int64 = -1<<32 var nhuge int64 = -1<<63 +var nfgood float64 = -2.0 +var nfbad float64 = -2.1 var si []int = make([]int, 10) var ai [10]int @@ -156,7 +164,7 @@ func testExpr(b *bufio.Writer, expr string) { if pass == 0 { fmt.Fprintf(b, "\ttest(func(){use(%s)}, %q)\n", expr, expr) } else { - fmt.Fprintf(b, "\tuse(%s) // ERROR \"index|overflow\"\n", expr) + fmt.Fprintf(b, "\tuse(%s) // ERROR \"index|overflow|truncated|must be integer\"\n", expr) } } @@ -169,15 +177,15 @@ func main() { fmt.Fprint(b, "// errorcheck\n\n") } fmt.Fprint(b, prolog) - + var choices = [][]string{ // Direct value, fetch from struct, fetch from struct pointer. // The last two cases get us to oindex_const_sudo in gsubr.c. []string{"", "t.", "pt."}, - + // Array, pointer to array, slice. []string{"a", "pa", "s"}, - + // Element is int, element is quad (struct). // This controls whether we end up in gsubr.c (i) or cgen.c (q). []string{"i", "q"}, @@ -192,9 +200,9 @@ func main() { []string{"", "n"}, // Size of index. - []string{"j", "i", "i8", "i16", "i32", "i64", "i64big", "i64bigger", "huge"}, + []string{"j", "i", "i8", "i16", "i32", "i64", "i64big", "i64bigger", "huge", "fgood", "fbad"}, } - + forall(choices, func(x []string) { p, a, e, big, c, n, i := x[0], x[1], x[2], x[3], x[4], x[5], x[6] @@ -206,7 +214,7 @@ func main() { // negative constant // large constant thisPass := 0 - if c == "c" && (a == "a" || a == "pa" || n == "n" || i == "i64big" || i == "i64bigger" || i == "huge") { + if c == "c" && (a == "a" || a == "pa" || n == "n" || i == "i64big" || i == "i64bigger" || i == "huge" || i == "fbad") { if i == "huge" { // Due to a detail of 6g's internals, // the huge constant errors happen in an @@ -223,27 +231,50 @@ func main() { thisPass = 2 } } - + + pae := p + a + e + big + cni := c + n + i + // If we're using the big-len data, positive int8 and int16 cannot overflow. if big == "b" && n == "" && (i == "i8" || i == "i16") { + if pass == 0 { + fmt.Fprintf(b, "\tuse(%s[%s])\n", pae, cni) + fmt.Fprintf(b, "\tuse(%s[0:%s])\n", pae, cni) + fmt.Fprintf(b, "\tuse(%s[1:%s])\n", pae, cni) + fmt.Fprintf(b, "\tuse(%s[%s:])\n", pae, cni) + fmt.Fprintf(b, "\tuse(%s[%s:%s])\n", pae, cni, cni) + } + return + } + + // Float variables cannot be used as indices. + if c == "" && (i == "fgood" || i == "fbad") { + return + } + // Integral float constat is ok. + if c == "c" && n == "" && i == "fgood" { + if pass == 0 { + fmt.Fprintf(b, "\tuse(%s[%s])\n", pae, cni) + fmt.Fprintf(b, "\tuse(%s[0:%s])\n", pae, cni) + fmt.Fprintf(b, "\tuse(%s[1:%s])\n", pae, cni) + fmt.Fprintf(b, "\tuse(%s[%s:])\n", pae, cni) + fmt.Fprintf(b, "\tuse(%s[%s:%s])\n", pae, cni, cni) + } return } // Only print the test case if it is appropriate for this pass. if thisPass == pass { - pae := p+a+e+big - cni := c+n+i - // Index operation - testExpr(b, pae + "[" + cni + "]") - + testExpr(b, pae+"["+cni+"]") + // Slice operation. // Low index 0 is a special case in ggen.c // so test both 0 and 1. - testExpr(b, pae + "[0:" + cni + "]") - testExpr(b, pae + "[1:" + cni + "]") - testExpr(b, pae + "[" + cni + ":]") - testExpr(b, pae + "[" + cni + ":" + cni + "]") + testExpr(b, pae+"[0:"+cni+"]") + testExpr(b, pae+"[1:"+cni+"]") + testExpr(b, pae+"["+cni+":]") + testExpr(b, pae+"["+cni+":"+cni+"]") } }) @@ -253,7 +284,7 @@ func main() { func forall(choices [][]string, f func([]string)) { x := make([]string, len(choices)) - + var recurse func(d int) recurse = func(d int) { if d >= len(choices) { @@ -261,7 +292,7 @@ func forall(choices [][]string, f func([]string)) { return } for _, x[d] = range choices[d] { - recurse(d+1) + recurse(d + 1) } } recurse(0) diff --git a/gcc/testsuite/go.test/test/init1.go b/gcc/testsuite/go.test/test/init1.go index a888ad7440c..f6eda6edfea 100644 --- a/gcc/testsuite/go.test/test/init1.go +++ b/gcc/testsuite/go.test/test/init1.go @@ -33,6 +33,7 @@ func init() { sys1 := memstats.Sys if sys1-sys > chunk*50 { println("allocated 1000 chunks of", chunk, "and used ", sys1-sys, "memory") + panic("init1") } } diff --git a/gcc/testsuite/go.test/test/initializerr.go b/gcc/testsuite/go.test/test/initializerr.go index 48908c34786..ca05414554d 100644 --- a/gcc/testsuite/go.test/test/initializerr.go +++ b/gcc/testsuite/go.test/test/initializerr.go @@ -26,3 +26,15 @@ var a5 = []byte { x: 2 } // ERROR "index" var ok1 = S { } // should be ok var ok2 = T { S: ok1 } // should be ok + +// These keys can be computed at compile time but they are +// not constants as defined by the spec, so they do not trigger +// compile-time errors about duplicate key values. +// See issue 4555. + +type Key struct {X, Y int} + +var _ = map[Key]string{ + Key{1,2}: "hello", + Key{1,2}: "world", +} diff --git a/gcc/testsuite/go.test/test/interface/embed0.go b/gcc/testsuite/go.test/test/interface/embed1.dir/embed0.go index e2ee20adeba..728bec74e87 100644 --- a/gcc/testsuite/go.test/test/interface/embed0.go +++ b/gcc/testsuite/go.test/test/interface/embed1.dir/embed0.go @@ -1,5 +1,3 @@ -// skip # used by embed1.go - // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. diff --git a/gcc/testsuite/go.test/test/interface/embed1.dir/embed1.go b/gcc/testsuite/go.test/test/interface/embed1.dir/embed1.go new file mode 100644 index 00000000000..7dfb1dbc0ad --- /dev/null +++ b/gcc/testsuite/go.test/test/interface/embed1.dir/embed1.go @@ -0,0 +1,43 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Test that embedded interface types can have local methods. + +package main + +import "./embed0" + +type T int +func (t T) m() {} + +type I interface { m() } +type J interface { I } + +type PI interface { p.I } +type PJ interface { p.J } + +func main() { + var i I + var j J + var t T + i = t + j = t + _ = i + _ = j + i = j + _ = i + j = i + _ = j + var pi PI + var pj PJ + var pt p.T + pi = pt + pj = pt + _ = pi + _ = pj + pi = pj + _ = pi + pj = pi + _ = pj +} diff --git a/gcc/testsuite/go.test/test/interface/embed1.go b/gcc/testsuite/go.test/test/interface/embed1.go index 07b873a633b..784b82bb072 100644 --- a/gcc/testsuite/go.test/test/interface/embed1.go +++ b/gcc/testsuite/go.test/test/interface/embed1.go @@ -1,7 +1,4 @@ -// $G $D/embed0.go && $G $D/$F.go && $L $F.$A && ./$A.out - -// NOTE: This test is not run by 'run.go' and so not run by all.bash. -// To run this test you must use the ./run shell script. +// rundir // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style @@ -9,40 +6,4 @@ // Test that embedded interface types can have local methods. -package main - -import "./embed0" - -type T int -func (t T) m() {} - -type I interface { m() } -type J interface { I } - -type PI interface { p.I } -type PJ interface { p.J } - -func main() { - var i I - var j J - var t T - i = t - j = t - _ = i - _ = j - i = j - _ = i - j = i - _ = j - var pi PI - var pj PJ - var pt p.T - pi = pt - pj = pt - _ = pi - _ = pj - pi = pj - _ = pi - pj = pi - _ = pj -} +package ignored diff --git a/gcc/testsuite/go.test/test/interface/private1.go b/gcc/testsuite/go.test/test/interface/private.dir/private1.go index 3281c38be60..75eee51f5a0 100644 --- a/gcc/testsuite/go.test/test/interface/private1.go +++ b/gcc/testsuite/go.test/test/interface/private.dir/private1.go @@ -1,5 +1,3 @@ -// skip # used by private.go - // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. diff --git a/gcc/testsuite/go.test/test/interface/private.dir/prog.go b/gcc/testsuite/go.test/test/interface/private.dir/prog.go new file mode 100644 index 00000000000..abea7d625c7 --- /dev/null +++ b/gcc/testsuite/go.test/test/interface/private.dir/prog.go @@ -0,0 +1,33 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Test that unexported methods are not visible outside the package. +// Does not compile. + +package main + +import "./private1" + +type Exported interface { + private() +} + +type Implementation struct{} + +func (p *Implementation) private() {} + +func main() { + var x Exported + x = new(Implementation) + x.private() + + var px p.Exported + px = p.X + + px.private() // ERROR "private" + + px = new(Implementation) // ERROR "private" + + x = px // ERROR "private" +} diff --git a/gcc/testsuite/go.test/test/interface/private.go b/gcc/testsuite/go.test/test/interface/private.go index 0a42385ea7b..a0da249c92c 100644 --- a/gcc/testsuite/go.test/test/interface/private.go +++ b/gcc/testsuite/go.test/test/interface/private.go @@ -1,7 +1,4 @@ -// $G $D/${F}1.go && errchk $G $D/$F.go - -// NOTE: This test is not run by 'run.go' and so not run by all.bash. -// To run this test you must use the ./run shell script. +// errorcheckdir // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style @@ -10,29 +7,4 @@ // Test that unexported methods are not visible outside the package. // Does not compile. -package main - -import "./private1" - -type Exported interface { - private() -} - -type Implementation struct{} - -func (p *Implementation) private() {} - -func main() { - var x Exported - x = new(Implementation) - x.private() - - var px p.Exported - px = p.X - - px.private() // ERROR "private" - - px = new(Implementation) // ERROR "private" - - x = px // ERROR "private" -} +package ignored diff --git a/gcc/testsuite/go.test/test/interface/recursive1.dir/recursive1.go b/gcc/testsuite/go.test/test/interface/recursive1.dir/recursive1.go new file mode 100644 index 00000000000..441f0ecaa5a --- /dev/null +++ b/gcc/testsuite/go.test/test/interface/recursive1.dir/recursive1.go @@ -0,0 +1,15 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Mutually recursive type definitions imported and used by recursive1.go. + +package p + +type I1 interface { + F() I2 +} + +type I2 interface { + I1 +} diff --git a/gcc/testsuite/go.test/test/interface/recursive2.go b/gcc/testsuite/go.test/test/interface/recursive1.dir/recursive2.go index 3a1059960cf..e8048c672b2 100644 --- a/gcc/testsuite/go.test/test/interface/recursive2.go +++ b/gcc/testsuite/go.test/test/interface/recursive1.dir/recursive2.go @@ -1,8 +1,3 @@ -// $G $D/recursive1.go && $G $D/$F.go - -// NOTE: This test is not run by 'run.go' and so not run by all.bash. -// To run this test you must use the ./run shell script. - // Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. diff --git a/gcc/testsuite/go.test/test/interface/recursive1.go b/gcc/testsuite/go.test/test/interface/recursive1.go index cc3cdc37f1a..62f61088441 100644 --- a/gcc/testsuite/go.test/test/interface/recursive1.go +++ b/gcc/testsuite/go.test/test/interface/recursive1.go @@ -1,4 +1,4 @@ -// skip # used by recursive2 +// compiledir // Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style @@ -6,12 +6,4 @@ // Mutually recursive type definitions imported and used by recursive1.go. -package p - -type I1 interface { - F() I2 -} - -type I2 interface { - I1 -} +package ignored diff --git a/gcc/testsuite/go.test/test/literal.go b/gcc/testsuite/go.test/test/literal.go index ba185fc9ace..c3d6bc123a6 100644 --- a/gcc/testsuite/go.test/test/literal.go +++ b/gcc/testsuite/go.test/test/literal.go @@ -24,7 +24,6 @@ func equal(a, b float32) bool { return a == b } - func main() { // bool var t bool = true @@ -225,6 +224,6 @@ func main() { assert(sj0 == sj3, "sj3") if nbad > 0 { - println() + panic("literal failed") } } diff --git a/gcc/testsuite/go.test/test/map.go b/gcc/testsuite/go.test/test/map.go index 6dec0dfd719..485e743fe46 100644 --- a/gcc/testsuite/go.test/test/map.go +++ b/gcc/testsuite/go.test/test/map.go @@ -5,6 +5,7 @@ // license that can be found in the LICENSE file. // Test maps, almost exhaustively. +// NaN complexity test is in mapnan.go. package main @@ -12,7 +13,6 @@ import ( "fmt" "math" "strconv" - "time" ) const count = 100 @@ -41,7 +41,7 @@ func testbasic() { for i := 0; i < len(mlit); i++ { s := string([]byte{byte(i) + '0'}) if mlit[s] != i { - fmt.Printf("mlit[%s] = %d\n", s, mlit[s]) + panic(fmt.Sprintf("mlit[%s] = %d\n", s, mlit[s])) } } @@ -102,46 +102,46 @@ func testbasic() { // test len if len(mib) != count { - fmt.Printf("len(mib) = %d\n", len(mib)) + panic(fmt.Sprintf("len(mib) = %d\n", len(mib))) } if len(mii) != count { - fmt.Printf("len(mii) = %d\n", len(mii)) + panic(fmt.Sprintf("len(mii) = %d\n", len(mii))) } if len(mfi) != count { - fmt.Printf("len(mfi) = %d\n", len(mfi)) + panic(fmt.Sprintf("len(mfi) = %d\n", len(mfi))) } if len(mif) != count { - fmt.Printf("len(mif) = %d\n", len(mif)) + panic(fmt.Sprintf("len(mif) = %d\n", len(mif))) } if len(msi) != count { - fmt.Printf("len(msi) = %d\n", len(msi)) + panic(fmt.Sprintf("len(msi) = %d\n", len(msi))) } if len(mis) != count { - fmt.Printf("len(mis) = %d\n", len(mis)) + panic(fmt.Sprintf("len(mis) = %d\n", len(mis))) } if len(mss) != count { - fmt.Printf("len(mss) = %d\n", len(mss)) + panic(fmt.Sprintf("len(mss) = %d\n", len(mss))) } if len(mspa) != count { - fmt.Printf("len(mspa) = %d\n", len(mspa)) + panic(fmt.Sprintf("len(mspa) = %d\n", len(mspa))) } if len(mipT) != count { - fmt.Printf("len(mipT) = %d\n", len(mipT)) + panic(fmt.Sprintf("len(mipT) = %d\n", len(mipT))) } if len(mpTi) != count { - fmt.Printf("len(mpTi) = %d\n", len(mpTi)) + panic(fmt.Sprintf("len(mpTi) = %d\n", len(mpTi))) } // if len(mti) != count { - // fmt.Printf("len(mti) = %d\n", len(mti)) + // panic(fmt.Sprintf("len(mti) = %d\n", len(mti))) // } if len(mipM) != count { - fmt.Printf("len(mipM) = %d\n", len(mipM)) + panic(fmt.Sprintf("len(mipM) = %d\n", len(mipM))) } // if len(mti) != count { - // fmt.Printf("len(mti) = %d\n", len(mti)) + // panic(fmt.Sprintf("len(mti) = %d\n", len(mti))) // } if len(mit) != count { - fmt.Printf("len(mit) = %d\n", len(mit)) + panic(fmt.Sprintf("len(mit) = %d\n", len(mit))) } // test construction directly @@ -151,48 +151,48 @@ func testbasic() { f := float32(i) // BUG m := M(i, i+1) if mib[i] != (i != 0) { - fmt.Printf("mib[%d] = %t\n", i, mib[i]) + panic(fmt.Sprintf("mib[%d] = %t\n", i, mib[i])) } if mii[i] != 10*i { - fmt.Printf("mii[%d] = %d\n", i, mii[i]) + panic(fmt.Sprintf("mii[%d] = %d\n", i, mii[i])) } if mfi[f] != 10*i { - fmt.Printf("mfi[%d] = %d\n", i, mfi[f]) + panic(fmt.Sprintf("mfi[%d] = %d\n", i, mfi[f])) } if mif[i] != 10.0*f { - fmt.Printf("mif[%d] = %g\n", i, mif[i]) + panic(fmt.Sprintf("mif[%d] = %g\n", i, mif[i])) } if mis[i] != s { - fmt.Printf("mis[%d] = %s\n", i, mis[i]) + panic(fmt.Sprintf("mis[%d] = %s\n", i, mis[i])) } if msi[s] != i { - fmt.Printf("msi[%s] = %d\n", s, msi[s]) + panic(fmt.Sprintf("msi[%s] = %d\n", s, msi[s])) } if mss[s] != s10 { - fmt.Printf("mss[%s] = %g\n", s, mss[s]) + panic(fmt.Sprintf("mss[%s] = %g\n", s, mss[s])) } for j := 0; j < len(mspa[s]); j++ { if mspa[s][j] != s10 { - fmt.Printf("mspa[%s][%d] = %s\n", s, j, mspa[s][j]) + panic(fmt.Sprintf("mspa[%s][%d] = %s\n", s, j, mspa[s][j])) } } if mipT[i].i != int64(i) || mipT[i].f != f { - fmt.Printf("mipT[%d] = %v\n", i, mipT[i]) + panic(fmt.Sprintf("mipT[%d] = %v\n", i, mipT[i])) } if mpTi[apT[i]] != i { - fmt.Printf("mpTi[apT[%d]] = %d\n", i, mpTi[apT[i]]) + panic(fmt.Sprintf("mpTi[apT[%d]] = %d\n", i, mpTi[apT[i]])) } // if(mti[t] != i) { - // fmt.Printf("mti[%s] = %s\n", s, mti[t]) + // panic(fmt.Sprintf("mti[%s] = %s\n", s, mti[t])) // } if mipM[i][i] != i+1 { - fmt.Printf("mipM[%d][%d] = %d\n", i, i, mipM[i][i]) + panic(fmt.Sprintf("mipM[%d][%d] = %d\n", i, i, mipM[i][i])) } // if(mti[t] != i) { - // fmt.Printf("mti[%v] = %d\n", t, mti[t]) + // panic(fmt.Sprintf("mti[%v] = %d\n", t, mti[t])) // } if mit[i].i != int64(i) || mit[i].f != f { - fmt.Printf("mit[%d] = {%d %g}\n", i, mit[i].i, mit[i].f) + panic(fmt.Sprintf("mit[%d] = {%d %g}\n", i, mit[i].i, mit[i].f)) } } @@ -204,131 +204,131 @@ func testbasic() { { _, b := mib[i] if !b { - fmt.Printf("tuple existence decl: mib[%d]\n", i) + panic(fmt.Sprintf("tuple existence decl: mib[%d]\n", i)) } _, b = mib[i] if !b { - fmt.Printf("tuple existence assign: mib[%d]\n", i) + panic(fmt.Sprintf("tuple existence assign: mib[%d]\n", i)) } } { _, b := mii[i] if !b { - fmt.Printf("tuple existence decl: mii[%d]\n", i) + panic(fmt.Sprintf("tuple existence decl: mii[%d]\n", i)) } _, b = mii[i] if !b { - fmt.Printf("tuple existence assign: mii[%d]\n", i) + panic(fmt.Sprintf("tuple existence assign: mii[%d]\n", i)) } } { _, b := mfi[f] if !b { - fmt.Printf("tuple existence decl: mfi[%d]\n", i) + panic(fmt.Sprintf("tuple existence decl: mfi[%d]\n", i)) } _, b = mfi[f] if !b { - fmt.Printf("tuple existence assign: mfi[%d]\n", i) + panic(fmt.Sprintf("tuple existence assign: mfi[%d]\n", i)) } } { _, b := mif[i] if !b { - fmt.Printf("tuple existence decl: mif[%d]\n", i) + panic(fmt.Sprintf("tuple existence decl: mif[%d]\n", i)) } _, b = mif[i] if !b { - fmt.Printf("tuple existence assign: mif[%d]\n", i) + panic(fmt.Sprintf("tuple existence assign: mif[%d]\n", i)) } } { _, b := mis[i] if !b { - fmt.Printf("tuple existence decl: mis[%d]\n", i) + panic(fmt.Sprintf("tuple existence decl: mis[%d]\n", i)) } _, b = mis[i] if !b { - fmt.Printf("tuple existence assign: mis[%d]\n", i) + panic(fmt.Sprintf("tuple existence assign: mis[%d]\n", i)) } } { _, b := msi[s] if !b { - fmt.Printf("tuple existence decl: msi[%d]\n", i) + panic(fmt.Sprintf("tuple existence decl: msi[%d]\n", i)) } _, b = msi[s] if !b { - fmt.Printf("tuple existence assign: msi[%d]\n", i) + panic(fmt.Sprintf("tuple existence assign: msi[%d]\n", i)) } } { _, b := mss[s] if !b { - fmt.Printf("tuple existence decl: mss[%d]\n", i) + panic(fmt.Sprintf("tuple existence decl: mss[%d]\n", i)) } _, b = mss[s] if !b { - fmt.Printf("tuple existence assign: mss[%d]\n", i) + panic(fmt.Sprintf("tuple existence assign: mss[%d]\n", i)) } } { _, b := mspa[s] if !b { - fmt.Printf("tuple existence decl: mspa[%d]\n", i) + panic(fmt.Sprintf("tuple existence decl: mspa[%d]\n", i)) } _, b = mspa[s] if !b { - fmt.Printf("tuple existence assign: mspa[%d]\n", i) + panic(fmt.Sprintf("tuple existence assign: mspa[%d]\n", i)) } } { _, b := mipT[i] if !b { - fmt.Printf("tuple existence decl: mipT[%d]\n", i) + panic(fmt.Sprintf("tuple existence decl: mipT[%d]\n", i)) } _, b = mipT[i] if !b { - fmt.Printf("tuple existence assign: mipT[%d]\n", i) + panic(fmt.Sprintf("tuple existence assign: mipT[%d]\n", i)) } } { _, b := mpTi[apT[i]] if !b { - fmt.Printf("tuple existence decl: mpTi[apT[%d]]\n", i) + panic(fmt.Sprintf("tuple existence decl: mpTi[apT[%d]]\n", i)) } _, b = mpTi[apT[i]] if !b { - fmt.Printf("tuple existence assign: mpTi[apT[%d]]\n", i) + panic(fmt.Sprintf("tuple existence assign: mpTi[apT[%d]]\n", i)) } } { _, b := mipM[i] if !b { - fmt.Printf("tuple existence decl: mipM[%d]\n", i) + panic(fmt.Sprintf("tuple existence decl: mipM[%d]\n", i)) } _, b = mipM[i] if !b { - fmt.Printf("tuple existence assign: mipM[%d]\n", i) + panic(fmt.Sprintf("tuple existence assign: mipM[%d]\n", i)) } } { _, b := mit[i] if !b { - fmt.Printf("tuple existence decl: mit[%d]\n", i) + panic(fmt.Sprintf("tuple existence decl: mit[%d]\n", i)) } _, b = mit[i] if !b { - fmt.Printf("tuple existence assign: mit[%d]\n", i) + panic(fmt.Sprintf("tuple existence assign: mit[%d]\n", i)) } } // { // _, b := mti[t] // if !b { - // fmt.Printf("tuple existence decl: mti[%d]\n", i) + // panic(fmt.Sprintf("tuple existence decl: mti[%d]\n", i)) // } // _, b = mti[t] // if !b { - // fmt.Printf("tuple existence assign: mti[%d]\n", i) + // panic(fmt.Sprintf("tuple existence assign: mti[%d]\n", i)) // } // } } @@ -341,131 +341,131 @@ func testbasic() { { _, b := mib[i] if b { - fmt.Printf("tuple nonexistence decl: mib[%d]", i) + panic(fmt.Sprintf("tuple nonexistence decl: mib[%d]", i)) } _, b = mib[i] if b { - fmt.Printf("tuple nonexistence assign: mib[%d]", i) + panic(fmt.Sprintf("tuple nonexistence assign: mib[%d]", i)) } } { _, b := mii[i] if b { - fmt.Printf("tuple nonexistence decl: mii[%d]", i) + panic(fmt.Sprintf("tuple nonexistence decl: mii[%d]", i)) } _, b = mii[i] if b { - fmt.Printf("tuple nonexistence assign: mii[%d]", i) + panic(fmt.Sprintf("tuple nonexistence assign: mii[%d]", i)) } } { _, b := mfi[f] if b { - fmt.Printf("tuple nonexistence decl: mfi[%d]", i) + panic(fmt.Sprintf("tuple nonexistence decl: mfi[%d]", i)) } _, b = mfi[f] if b { - fmt.Printf("tuple nonexistence assign: mfi[%d]", i) + panic(fmt.Sprintf("tuple nonexistence assign: mfi[%d]", i)) } } { _, b := mif[i] if b { - fmt.Printf("tuple nonexistence decl: mif[%d]", i) + panic(fmt.Sprintf("tuple nonexistence decl: mif[%d]", i)) } _, b = mif[i] if b { - fmt.Printf("tuple nonexistence assign: mif[%d]", i) + panic(fmt.Sprintf("tuple nonexistence assign: mif[%d]", i)) } } { _, b := mis[i] if b { - fmt.Printf("tuple nonexistence decl: mis[%d]", i) + panic(fmt.Sprintf("tuple nonexistence decl: mis[%d]", i)) } _, b = mis[i] if b { - fmt.Printf("tuple nonexistence assign: mis[%d]", i) + panic(fmt.Sprintf("tuple nonexistence assign: mis[%d]", i)) } } { _, b := msi[s] if b { - fmt.Printf("tuple nonexistence decl: msi[%d]", i) + panic(fmt.Sprintf("tuple nonexistence decl: msi[%d]", i)) } _, b = msi[s] if b { - fmt.Printf("tuple nonexistence assign: msi[%d]", i) + panic(fmt.Sprintf("tuple nonexistence assign: msi[%d]", i)) } } { _, b := mss[s] if b { - fmt.Printf("tuple nonexistence decl: mss[%d]", i) + panic(fmt.Sprintf("tuple nonexistence decl: mss[%d]", i)) } _, b = mss[s] if b { - fmt.Printf("tuple nonexistence assign: mss[%d]", i) + panic(fmt.Sprintf("tuple nonexistence assign: mss[%d]", i)) } } { _, b := mspa[s] if b { - fmt.Printf("tuple nonexistence decl: mspa[%d]", i) + panic(fmt.Sprintf("tuple nonexistence decl: mspa[%d]", i)) } _, b = mspa[s] if b { - fmt.Printf("tuple nonexistence assign: mspa[%d]", i) + panic(fmt.Sprintf("tuple nonexistence assign: mspa[%d]", i)) } } { _, b := mipT[i] if b { - fmt.Printf("tuple nonexistence decl: mipT[%d]", i) + panic(fmt.Sprintf("tuple nonexistence decl: mipT[%d]", i)) } _, b = mipT[i] if b { - fmt.Printf("tuple nonexistence assign: mipT[%d]", i) + panic(fmt.Sprintf("tuple nonexistence assign: mipT[%d]", i)) } } { _, b := mpTi[apT[i]] if b { - fmt.Printf("tuple nonexistence decl: mpTi[apt[%d]]", i) + panic(fmt.Sprintf("tuple nonexistence decl: mpTi[apt[%d]]", i)) } _, b = mpTi[apT[i]] if b { - fmt.Printf("tuple nonexistence assign: mpTi[apT[%d]]", i) + panic(fmt.Sprintf("tuple nonexistence assign: mpTi[apT[%d]]", i)) } } { _, b := mipM[i] if b { - fmt.Printf("tuple nonexistence decl: mipM[%d]", i) + panic(fmt.Sprintf("tuple nonexistence decl: mipM[%d]", i)) } _, b = mipM[i] if b { - fmt.Printf("tuple nonexistence assign: mipM[%d]", i) + panic(fmt.Sprintf("tuple nonexistence assign: mipM[%d]", i)) } } // { // _, b := mti[t] // if b { - // fmt.Printf("tuple nonexistence decl: mti[%d]", i) + // panic(fmt.Sprintf("tuple nonexistence decl: mti[%d]", i)) // } // _, b = mti[t] // if b { - // fmt.Printf("tuple nonexistence assign: mti[%d]", i) + // panic(fmt.Sprintf("tuple nonexistence assign: mti[%d]", i)) // } // } { _, b := mit[i] if b { - fmt.Printf("tuple nonexistence decl: mit[%d]", i) + panic(fmt.Sprintf("tuple nonexistence decl: mit[%d]", i)) } _, b = mit[i] if b { - fmt.Printf("tuple nonexistence assign: mit[%d]", i) + panic(fmt.Sprintf("tuple nonexistence assign: mit[%d]", i)) } } } @@ -475,21 +475,25 @@ func testbasic() { s := strconv.Itoa(i) mspa[s][i%2] = "deleted" if mspa[s][i%2] != "deleted" { - fmt.Printf("update mspa[%s][%d] = %s\n", s, i%2, mspa[s][i%2]) + panic(fmt.Sprintf("update mspa[%s][%d] = %s\n", s, i%2, mspa[s][i%2])) + } mipT[i].i += 1 if mipT[i].i != int64(i)+1 { - fmt.Printf("update mipT[%d].i = %d\n", i, mipT[i].i) + panic(fmt.Sprintf("update mipT[%d].i = %d\n", i, mipT[i].i)) + } mipT[i].f = float32(i + 1) if mipT[i].f != float32(i+1) { - fmt.Printf("update mipT[%d].f = %g\n", i, mipT[i].f) + panic(fmt.Sprintf("update mipT[%d].f = %g\n", i, mipT[i].f)) + } mipM[i][i]++ if mipM[i][i] != (i+1)+1 { - fmt.Printf("update mipM[%d][%d] = %d\n", i, i, mipM[i][i]) + panic(fmt.Sprintf("update mipM[%d][%d] = %d\n", i, i, mipM[i][i])) + } } @@ -519,29 +523,29 @@ func testfloat() { nanb: "NaN", } if m[pz] != "+0" { - fmt.Println("float32 map cannot read back m[+0]:", m[pz]) + panic(fmt.Sprintln("float32 map cannot read back m[+0]:", m[pz])) } if m[nz] != "+0" { - fmt.Println("float32 map does not treat", pz, "and", nz, "as equal for read") - fmt.Println("float32 map does not treat -0 and +0 as equal for read") + fmt.Sprintln("float32 map does not treat", pz, "and", nz, "as equal for read") + panic(fmt.Sprintln("float32 map does not treat -0 and +0 as equal for read")) } m[nz] = "-0" if m[pz] != "-0" { - fmt.Println("float32 map does not treat -0 and +0 as equal for write") + panic(fmt.Sprintln("float32 map does not treat -0 and +0 as equal for write")) } if _, ok := m[nana]; ok { - fmt.Println("float32 map allows NaN lookup (a)") + panic(fmt.Sprintln("float32 map allows NaN lookup (a)")) } if _, ok := m[nanb]; ok { - fmt.Println("float32 map allows NaN lookup (b)") + panic(fmt.Sprintln("float32 map allows NaN lookup (b)")) } if len(m) != 3 { - fmt.Println("float32 map should have 3 entries:", m) + panic(fmt.Sprintln("float32 map should have 3 entries:", m)) } m[nana] = "NaN" m[nanb] = "NaN" if len(m) != 5 { - fmt.Println("float32 map should have 5 entries:", m) + panic(fmt.Sprintln("float32 map should have 5 entries:", m)) } } @@ -559,25 +563,25 @@ func testfloat() { nanb: "NaN", } if m[nz] != "+0" { - fmt.Println("float64 map does not treat -0 and +0 as equal for read") + panic(fmt.Sprintln("float64 map does not treat -0 and +0 as equal for read")) } m[nz] = "-0" if m[pz] != "-0" { - fmt.Println("float64 map does not treat -0 and +0 as equal for write") + panic(fmt.Sprintln("float64 map does not treat -0 and +0 as equal for write")) } if _, ok := m[nana]; ok { - fmt.Println("float64 map allows NaN lookup (a)") + panic(fmt.Sprintln("float64 map allows NaN lookup (a)")) } if _, ok := m[nanb]; ok { - fmt.Println("float64 map allows NaN lookup (b)") + panic(fmt.Sprintln("float64 map allows NaN lookup (b)")) } if len(m) != 3 { - fmt.Println("float64 map should have 3 entries:", m) + panic(fmt.Sprintln("float64 map should have 3 entries:", m)) } m[nana] = "NaN" m[nanb] = "NaN" if len(m) != 5 { - fmt.Println("float64 map should have 5 entries:", m) + panic(fmt.Sprintln("float64 map should have 5 entries:", m)) } } @@ -595,25 +599,25 @@ func testfloat() { nanb: "NaN", } if m[nz] != "+0" { - fmt.Println("complex64 map does not treat -0 and +0 as equal for read") + panic(fmt.Sprintln("complex64 map does not treat -0 and +0 as equal for read")) } m[nz] = "-0" if m[pz] != "-0" { - fmt.Println("complex64 map does not treat -0 and +0 as equal for write") + panic(fmt.Sprintln("complex64 map does not treat -0 and +0 as equal for write")) } if _, ok := m[nana]; ok { - fmt.Println("complex64 map allows NaN lookup (a)") + panic(fmt.Sprintln("complex64 map allows NaN lookup (a)")) } if _, ok := m[nanb]; ok { - fmt.Println("complex64 map allows NaN lookup (b)") + panic(fmt.Sprintln("complex64 map allows NaN lookup (b)")) } if len(m) != 3 { - fmt.Println("complex64 map should have 3 entries:", m) + panic(fmt.Sprintln("complex64 map should have 3 entries:", m)) } m[nana] = "NaN" m[nanb] = "NaN" if len(m) != 5 { - fmt.Println("complex64 map should have 5 entries:", m) + panic(fmt.Sprintln("complex64 map should have 5 entries:", m)) } } @@ -631,63 +635,50 @@ func testfloat() { nanb: "NaN", } if m[nz] != "+0" { - fmt.Println("complex128 map does not treat -0 and +0 as equal for read") + panic(fmt.Sprintln("complex128 map does not treat -0 and +0 as equal for read")) } m[nz] = "-0" if m[pz] != "-0" { - fmt.Println("complex128 map does not treat -0 and +0 as equal for write") + panic(fmt.Sprintln("complex128 map does not treat -0 and +0 as equal for write")) } if _, ok := m[nana]; ok { - fmt.Println("complex128 map allows NaN lookup (a)") + panic(fmt.Sprintln("complex128 map allows NaN lookup (a)")) } if _, ok := m[nanb]; ok { - fmt.Println("complex128 map allows NaN lookup (b)") + panic(fmt.Sprintln("complex128 map allows NaN lookup (b)")) } if len(m) != 3 { - fmt.Println("complex128 map should have 3 entries:", m) + panic(fmt.Sprintln("complex128 map should have 3 entries:", m)) } m[nana] = "NaN" m[nanb] = "NaN" if len(m) != 5 { - fmt.Println("complex128 map should have 5 entries:", m) + panic(fmt.Sprintln("complex128 map should have 5 entries:", m)) } } } func testnan() { - // Test that NaNs in maps don't go quadratic. - t := func(n int) time.Duration { - t0 := time.Now() - m := map[float64]int{} - nan := math.NaN() - for i := 0; i < n; i++ { - m[nan] = 1 - } - if len(m) != n { - panic("wrong size map after nan insertion") - } - return time.Since(t0) + n := 500 + m := map[float64]int{} + nan := math.NaN() + for i := 0; i < n; i++ { + m[nan] = 1 } - - // Depending on the machine and OS, this test might be too fast - // to measure with accurate enough granularity. On failure, - // make it run longer, hoping that the timing granularity - // is eventually sufficient. - - n := 30000 // 0.02 seconds on a MacBook Air - fails := 0 - for { - t1 := t(n) - t2 := t(2 * n) - // should be 2x (linear); allow up to 3x - if t2 < 3*t1 { - return - } - fails++ - if fails == 4 { - fmt.Printf("too slow: %d inserts: %v; %d inserts: %v\n", n, t1, 2*n, t2) - return - } - n *= 2 + if len(m) != n { + panic("wrong size map after nan insertion") + } + iters := 0 + for k, v := range m { + iters++ + if !math.IsNaN(k) { + panic("not NaN") + } + if v != 1 { + panic("wrong value") + } + } + if iters != n { + panic("wrong number of nan range iters") } } diff --git a/gcc/testsuite/go.test/test/mapnan.go b/gcc/testsuite/go.test/test/mapnan.go new file mode 100644 index 00000000000..60b35fbeaf4 --- /dev/null +++ b/gcc/testsuite/go.test/test/mapnan.go @@ -0,0 +1,64 @@ +// +build darwin linux +// run + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Test that NaNs in maps don't go quadratic. + +package main + +import ( + "fmt" + "math" + "time" + "syscall" +) + +func main() { + + // Test that NaNs in maps don't go quadratic. + t := func(n int) time.Duration { + var u0 syscall.Rusage + if err := syscall.Getrusage(0, &u0); err != nil { + panic(err) + } + m := map[float64]int{} + nan := math.NaN() + for i := 0; i < n; i++ { + m[nan] = 1 + } + if len(m) != n { + panic("wrong size map after nan insertion") + } + var u1 syscall.Rusage + if err := syscall.Getrusage(0, &u1); err != nil { + panic(err) + } + return time.Duration(u1.Utime.Nano() - u0.Utime.Nano()) + } + + // Depending on the machine and OS, this test might be too fast + // to measure with accurate enough granularity. On failure, + // make it run longer, hoping that the timing granularity + // is eventually sufficient. + + n := 30000 // ~8ms user time on a Mid 2011 MacBook Air (1.8 GHz Core i7) + fails := 0 + for { + t1 := t(n) + t2 := t(2 * n) + // should be 2x (linear); allow up to 3x + if t2 < 3*t1 { + return + } + fails++ + if fails == 6 { + panic(fmt.Sprintf("too slow: %d inserts: %v; %d inserts: %v\n", n, t1, 2*n, t2)) + } + if fails < 4 { + n *= 2 + } + } +} diff --git a/gcc/testsuite/go.test/test/method.go b/gcc/testsuite/go.test/test/method.go index 0c239afbd19..d97bc4a7d09 100644 --- a/gcc/testsuite/go.test/test/method.go +++ b/gcc/testsuite/go.test/test/method.go @@ -128,13 +128,13 @@ func main() { panic("fail") } - var zs struct { S } - var zps struct { *S1 } - var zi struct { I } - var zpi struct { *I1 } - var zpt struct { *T1 } - var zt struct { T } - var zv struct { Val } + var zs struct{ S } + var zps struct{ *S1 } + var zi struct{ I } + var zpi struct{ *I1 } + var zpt struct{ *T1 } + var zt struct{ T } + var zv struct{ Val } if zs.val() != 1 { println("zs.val:", zs.val()) @@ -247,4 +247,61 @@ func main() { println("zv.val():", zv.val()) panic("fail") } + + promotion() +} + +type A struct{ B } +type B struct { + C + *D +} +type C int + +func (C) f() {} // value receiver, direct field of A +func (*C) g() {} // pointer receiver + +type D int + +func (D) h() {} // value receiver, indirect field of A +func (*D) i() {} // pointer receiver + +func expectPanic() { + if r := recover(); r == nil { + panic("expected nil dereference") + } +} + +func promotion() { + var a A + // Addressable value receiver. + a.f() + a.g() + func() { + defer expectPanic() + a.h() // dynamic error: nil dereference in a.B.D->f() + }() + a.i() + + // Non-addressable value receiver. + A(a).f() + // A(a).g() // static error: cannot call pointer method on A literal.B.C + func() { + defer expectPanic() + A(a).h() // dynamic error: nil dereference in A().B.D->f() + }() + A(a).i() + + // Pointer receiver. + (&a).f() + (&a).g() + func() { + defer expectPanic() + (&a).h() // dynamic error: nil deref: nil dereference in (&a).B.D->f() + }() + (&a).i() + + c := new(C) + c.f() // makes a copy + c.g() } diff --git a/gcc/testsuite/go.test/test/method4a.go b/gcc/testsuite/go.test/test/method4.dir/method4a.go index d23039bfaaa..a7df04cec36 100644 --- a/gcc/testsuite/go.test/test/method4a.go +++ b/gcc/testsuite/go.test/test/method4.dir/method4a.go @@ -1,11 +1,8 @@ -// skip - // Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Test method expressions with arguments. -// This file is not tested by itself; it is imported by method4.go. package method4a diff --git a/gcc/testsuite/go.test/test/method4.dir/prog.go b/gcc/testsuite/go.test/test/method4.dir/prog.go new file mode 100644 index 00000000000..77d580cffc5 --- /dev/null +++ b/gcc/testsuite/go.test/test/method4.dir/prog.go @@ -0,0 +1,104 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Test method expressions with arguments. + +package main + +import "./method4a" + +type T1 int + +type T2 struct { + f int +} + +type I1 interface { + Sum([]int, int) int +} + +type I2 interface { + Sum(a []int, b int) int +} + +func (i T1) Sum(a []int, b int) int { + r := int(i) + b + for _, v := range a { + r += v + } + return r +} + +func (p *T2) Sum(a []int, b int) int { + r := p.f + b + for _, v := range a { + r += v + } + return r +} + +func eq(v1, v2 int) { + if v1 != v2 { + panic(0) + } +} + +func main() { + a := []int{1, 2, 3} + t1 := T1(4) + t2 := &T2{4} + + eq(t1.Sum(a, 5), 15) + eq(t2.Sum(a, 6), 16) + + eq(T1.Sum(t1, a, 7), 17) + eq((*T2).Sum(t2, a, 8), 18) + + f1 := T1.Sum + eq(f1(t1, a, 9), 19) + f2 := (*T2).Sum + eq(f2(t2, a, 10), 20) + + eq(I1.Sum(t1, a, 11), 21) + eq(I1.Sum(t2, a, 12), 22) + + f3 := I1.Sum + eq(f3(t1, a, 13), 23) + eq(f3(t2, a, 14), 24) + + eq(I2.Sum(t1, a, 15), 25) + eq(I2.Sum(t2, a, 16), 26) + + f4 := I2.Sum + eq(f4(t1, a, 17), 27) + eq(f4(t2, a, 18), 28) + + mt1 := method4a.T1(4) + mt2 := &method4a.T2{4} + + eq(mt1.Sum(a, 30), 40) + eq(mt2.Sum(a, 31), 41) + + eq(method4a.T1.Sum(mt1, a, 32), 42) + eq((*method4a.T2).Sum(mt2, a, 33), 43) + + g1 := method4a.T1.Sum + eq(g1(mt1, a, 34), 44) + g2 := (*method4a.T2).Sum + eq(g2(mt2, a, 35), 45) + + eq(method4a.I1.Sum(mt1, a, 36), 46) + eq(method4a.I1.Sum(mt2, a, 37), 47) + + g3 := method4a.I1.Sum + eq(g3(mt1, a, 38), 48) + eq(g3(mt2, a, 39), 49) + + eq(method4a.I2.Sum(mt1, a, 40), 50) + eq(method4a.I2.Sum(mt2, a, 41), 51) + + g4 := method4a.I2.Sum + eq(g4(mt1, a, 42), 52) + eq(g4(mt2, a, 43), 53) +} diff --git a/gcc/testsuite/go.test/test/method4.go b/gcc/testsuite/go.test/test/method4.go index 7e7b1ff3b96..813892bc830 100644 --- a/gcc/testsuite/go.test/test/method4.go +++ b/gcc/testsuite/go.test/test/method4.go @@ -1,109 +1,8 @@ -// $G $D/method4a.go && $G $D/$F.go && $L $F.$A && ./$A.out - -// NOTE: This test is not run by 'run.go' and so not run by all.bash. -// To run this test you must use the ./run shell script. +// rundir // Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Test method expressions with arguments. - -package main - -import "./method4a" - -type T1 int - -type T2 struct { - f int -} - -type I1 interface { - Sum([]int, int) int -} - -type I2 interface { - Sum(a []int, b int) int -} - -func (i T1) Sum(a []int, b int) int { - r := int(i) + b - for _, v := range a { - r += v - } - return r -} - -func (p *T2) Sum(a []int, b int) int { - r := p.f + b - for _, v := range a { - r += v - } - return r -} - -func eq(v1, v2 int) { - if v1 != v2 { - panic(0) - } -} - -func main() { - a := []int{1, 2, 3} - t1 := T1(4) - t2 := &T2{4} - - eq(t1.Sum(a, 5), 15) - eq(t2.Sum(a, 6), 16) - - eq(T1.Sum(t1, a, 7), 17) - eq((*T2).Sum(t2, a, 8), 18) - - f1 := T1.Sum - eq(f1(t1, a, 9), 19) - f2 := (*T2).Sum - eq(f2(t2, a, 10), 20) - - eq(I1.Sum(t1, a, 11), 21) - eq(I1.Sum(t2, a, 12), 22) - - f3 := I1.Sum - eq(f3(t1, a, 13), 23) - eq(f3(t2, a, 14), 24) - - eq(I2.Sum(t1, a, 15), 25) - eq(I2.Sum(t2, a, 16), 26) - - f4 := I2.Sum - eq(f4(t1, a, 17), 27) - eq(f4(t2, a, 18), 28) - - mt1 := method4a.T1(4) - mt2 := &method4a.T2{4} - - eq(mt1.Sum(a, 30), 40) - eq(mt2.Sum(a, 31), 41) - - eq(method4a.T1.Sum(mt1, a, 32), 42) - eq((*method4a.T2).Sum(mt2, a, 33), 43) - - g1 := method4a.T1.Sum - eq(g1(mt1, a, 34), 44) - g2 := (*method4a.T2).Sum - eq(g2(mt2, a, 35), 45) - - eq(method4a.I1.Sum(mt1, a, 36), 46) - eq(method4a.I1.Sum(mt2, a, 37), 47) - - g3 := method4a.I1.Sum - eq(g3(mt1, a, 38), 48) - eq(g3(mt2, a, 39), 49) - - eq(method4a.I2.Sum(mt1, a, 40), 50) - eq(method4a.I2.Sum(mt2, a, 41), 51) - - g4 := method4a.I2.Sum - eq(g4(mt1, a, 42), 52) - eq(g4(mt2, a, 43), 53) -} +package ignored diff --git a/gcc/testsuite/go.test/test/method5.go b/gcc/testsuite/go.test/test/method5.go new file mode 100644 index 00000000000..36508f2e76f --- /dev/null +++ b/gcc/testsuite/go.test/test/method5.go @@ -0,0 +1,297 @@ +// run + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +// Concrete types implementing M method. +// Smaller than a word, word-sized, larger than a word. +// Value and pointer receivers. + +type Tinter interface { + M(int, byte) (byte, int) +} + +type Tsmallv byte + +func (v Tsmallv) M(x int, b byte) (byte, int) { return b, x+int(v) } + +type Tsmallp byte + +func (p *Tsmallp) M(x int, b byte) (byte, int) { return b, x+int(*p) } + +type Twordv uintptr + +func (v Twordv) M(x int, b byte) (byte, int) { return b, x+int(v) } + +type Twordp uintptr + +func (p *Twordp) M(x int, b byte) (byte, int) { return b, x+int(*p) } + +type Tbigv [2]uintptr + +func (v Tbigv) M(x int, b byte) (byte, int) { return b, x+int(v[0])+int(v[1]) } + +type Tbigp [2]uintptr + +func (p *Tbigp) M(x int, b byte) (byte, int) { return b, x+int(p[0])+int(p[1]) } + +// Again, with an unexported method. + +type tsmallv byte + +func (v tsmallv) m(x int, b byte) (byte, int) { return b, x+int(v) } + +type tsmallp byte + +func (p *tsmallp) m(x int, b byte) (byte, int) { return b, x+int(*p) } + +type twordv uintptr + +func (v twordv) m(x int, b byte) (byte, int) { return b, x+int(v) } + +type twordp uintptr + +func (p *twordp) m(x int, b byte) (byte, int) { return b, x+int(*p) } + +type tbigv [2]uintptr + +func (v tbigv) m(x int, b byte) (byte, int) { return b, x+int(v[0])+int(v[1]) } + +type tbigp [2]uintptr + +func (p *tbigp) m(x int, b byte) (byte, int) { return b, x+int(p[0])+int(p[1]) } + +type tinter interface { + m(int, byte) (byte, int) +} + +// Embedding via pointer. + +type T1 struct { + T2 +} + +type T2 struct { + *T3 +} + +type T3 struct { + *T4 +} + +type T4 struct { +} + +func (t4 T4) M(x int, b byte) (byte, int) { return b, x+40 } + +var failed = false + +func CheckI(name string, i Tinter, inc int) { + b, x := i.M(1000, 99) + if b != 99 || x != 1000+inc { + failed = true + print(name, ".M(1000, 99) = ", b, ", ", x, " want 99, ", 1000+inc, "\n") + } + + CheckF("(i="+name+")", i.M, inc) +} + +func CheckF(name string, f func(int, byte) (byte, int), inc int) { + b, x := f(1000, 99) + if b != 99 || x != 1000+inc { + failed = true + print(name, "(1000, 99) = ", b, ", ", x, " want 99, ", 1000+inc, "\n") + } +} + +func checkI(name string, i tinter, inc int) { + b, x := i.m(1000, 99) + if b != 99 || x != 1000+inc { + failed = true + print(name, ".m(1000, 99) = ", b, ", ", x, " want 99, ", 1000+inc, "\n") + } + + checkF("(i="+name+")", i.m, inc) +} + +func checkF(name string, f func(int, byte) (byte, int), inc int) { + b, x := f(1000, 99) + if b != 99 || x != 1000+inc { + failed = true + print(name, "(1000, 99) = ", b, ", ", x, " want 99, ", 1000+inc, "\n") + } +} + +func shouldPanic(f func()) { + defer func() { + if recover() == nil { + panic("not panicking") + } + }() + f() +} + +func shouldNotPanic(f func()) { + f() +} + +func main() { + sv := Tsmallv(1) + CheckI("sv", sv, 1) + CheckF("sv.M", sv.M, 1) + CheckF("(&sv).M", (&sv).M, 1) + psv := &sv + CheckI("psv", psv, 1) + CheckF("psv.M", psv.M, 1) + CheckF("(*psv).M", (*psv).M, 1) + + sp := Tsmallp(2) + CheckI("&sp", &sp, 2) + CheckF("sp.M", sp.M, 2) + CheckF("(&sp).M", (&sp).M, 2) + psp := &sp + CheckI("psp", psp, 2) + CheckF("psp.M", psp.M, 2) + CheckF("(*psp).M", (*psp).M, 2) + + wv := Twordv(3) + CheckI("wv", wv, 3) + CheckF("wv.M", wv.M, 3) + CheckF("(&wv).M", (&wv).M, 3) + pwv := &wv + CheckI("pwv", pwv, 3) + CheckF("pwv.M", pwv.M, 3) + CheckF("(*pwv).M", (*pwv).M, 3) + + wp := Twordp(4) + CheckI("&wp", &wp, 4) + CheckF("wp.M", wp.M, 4) + CheckF("(&wp).M", (&wp).M, 4) + pwp := &wp + CheckI("pwp", pwp, 4) + CheckF("pwp.M", pwp.M, 4) + CheckF("(*pwp).M", (*pwp).M, 4) + + bv := Tbigv([2]uintptr{5, 6}) + pbv := &bv + CheckI("bv", bv, 11) + CheckF("bv.M", bv.M, 11) + CheckF("(&bv).M", (&bv).M, 11) + CheckI("pbv", pbv, 11) + CheckF("pbv.M", pbv.M, 11) + CheckF("(*pbv).M", (*pbv).M, 11) + + bp := Tbigp([2]uintptr{7,8}) + CheckI("&bp", &bp, 15) + CheckF("bp.M", bp.M, 15) + CheckF("(&bp).M", (&bp).M, 15) + pbp := &bp + CheckI("pbp", pbp, 15) + CheckF("pbp.M", pbp.M, 15) + CheckF("(*pbp).M", (*pbp).M, 15) + + _sv := tsmallv(1) + checkI("_sv", _sv, 1) + checkF("_sv.m", _sv.m, 1) + checkF("(&_sv).m", (&_sv).m, 1) + _psv := &_sv + checkI("_psv", _psv, 1) + checkF("_psv.m", _psv.m, 1) + checkF("(*_psv).m", (*_psv).m, 1) + + _sp := tsmallp(2) + checkI("&_sp", &_sp, 2) + checkF("_sp.m", _sp.m, 2) + checkF("(&_sp).m", (&_sp).m, 2) + _psp := &_sp + checkI("_psp", _psp, 2) + checkF("_psp.m", _psp.m, 2) + checkF("(*_psp).m", (*_psp).m, 2) + + _wv := twordv(3) + checkI("_wv", _wv, 3) + checkF("_wv.m", _wv.m, 3) + checkF("(&_wv).m", (&_wv).m, 3) + _pwv := &_wv + checkI("_pwv", _pwv, 3) + checkF("_pwv.m", _pwv.m, 3) + checkF("(*_pwv).m", (*_pwv).m, 3) + + _wp := twordp(4) + checkI("&_wp", &_wp, 4) + checkF("_wp.m", _wp.m, 4) + checkF("(&_wp).m", (&_wp).m, 4) + _pwp := &_wp + checkI("_pwp", _pwp, 4) + checkF("_pwp.m", _pwp.m, 4) + checkF("(*_pwp).m", (*_pwp).m, 4) + + _bv := tbigv([2]uintptr{5, 6}) + _pbv := &_bv + checkI("_bv", _bv, 11) + checkF("_bv.m", _bv.m, 11) + checkF("(&_bv).m", (&_bv).m, 11) + checkI("_pbv", _pbv, 11) + checkF("_pbv.m", _pbv.m, 11) + checkF("(*_pbv).m", (*_pbv).m, 11) + + _bp := tbigp([2]uintptr{7,8}) + checkI("&_bp", &_bp, 15) + checkF("_bp.m", _bp.m, 15) + checkF("(&_bp).m", (&_bp).m, 15) + _pbp := &_bp + checkI("_pbp", _pbp, 15) + checkF("_pbp.m", _pbp.m, 15) + checkF("(*_pbp).m", (*_pbp).m, 15) + + t4 := T4{} + t3 := T3{&t4} + t2 := T2{&t3} + t1 := T1{t2} + CheckI("t4", t4, 40) + CheckI("&t4", &t4, 40) + CheckI("t3", t3, 40) + CheckI("&t3", &t3, 40) + CheckI("t2", t2, 40) + CheckI("&t2", &t2, 40) + CheckI("t1", t1, 40) + CheckI("&t1", &t1, 40) + + // x.M panics if x is an interface type and is nil, + // or if x.M expands to (*x).M where x is nil, + // or if x.M expands to x.y.z.w.M where something + // along the evaluation of x.y.z.w is nil. + var f func(int, byte) (byte, int) + shouldPanic(func() { psv = nil; f = psv.M }) + shouldPanic(func() { pwv = nil; f = pwv.M }) + shouldPanic(func() { pbv = nil; f = pbv.M }) + shouldPanic(func() { var i Tinter; f = i.M }) + shouldPanic(func() { _psv = nil; f = _psv.m }) + shouldPanic(func() { _pwv = nil; f = _pwv.m }) + shouldPanic(func() { _pbv = nil; f = _pbv.m }) + shouldPanic(func() { var _i tinter; f = _i.m }) + shouldPanic(func() { var t1 T1; f = t1.M }) + shouldPanic(func() { var t2 T2; f = t2.M }) + shouldPanic(func() { var t3 *T3; f = t3.M }) + shouldPanic(func() { var t3 T3; f = t3.M }) + + if f != nil { + panic("something set f") + } + + // x.M does not panic if x is a nil pointer and + // M is a method with a pointer receiver. + shouldNotPanic(func() { psp = nil; f = psp.M }) + shouldNotPanic(func() { pwp = nil; f = pwp.M }) + shouldNotPanic(func() { pbp = nil; f = pbp.M }) + shouldNotPanic(func() { _psp = nil; f = _psp.m }) + shouldNotPanic(func() { _pwp = nil; f = _pwp.m }) + shouldNotPanic(func() { _pbp = nil; f = _pbp.m }) + shouldNotPanic(func() { var t4 T4; f = t4.M }) + if f == nil { + panic("nothing set f") + } +} diff --git a/gcc/testsuite/go.test/test/nil.go b/gcc/testsuite/go.test/test/nil.go index aa558fa3f49..f8300bf56af 100644 --- a/gcc/testsuite/go.test/test/nil.go +++ b/gcc/testsuite/go.test/test/nil.go @@ -115,7 +115,7 @@ func chantest() { }) shouldBlock(func() { x, ok := <-ch - println(x, ok) + println(x, ok) // unreachable }) if len(ch) != 0 { @@ -147,12 +147,13 @@ func maptest() { panic(v) } + // can delete (non-existent) entries + delete(m, 2) + // but cannot be written to shouldPanic(func() { m[2] = 3 }) - // can delete (non-existent) entries - delete(m, 2) } // nil slice diff --git a/gcc/testsuite/go.test/test/nilptr.go b/gcc/testsuite/go.test/test/nilptr.go index b784914e590..793e9967368 100644 --- a/gcc/testsuite/go.test/test/nilptr.go +++ b/gcc/testsuite/go.test/test/nilptr.go @@ -38,6 +38,8 @@ func main() { shouldPanic(p8) shouldPanic(p9) shouldPanic(p10) + shouldPanic(p11) + shouldPanic(p12) } func shouldPanic(f func()) { @@ -130,3 +132,23 @@ func p10() { var t *T println(t.i) // should crash } + +type T1 struct { + T +} + +type T2 struct { + *T1 +} + +func p11() { + t := &T2{} + p := &t.i + println(*p) +} + +// ADDR(DOT(IND(p))) needs a check also +func p12() { + var p *T = nil + println(*(&((*p).i))) +} diff --git a/gcc/testsuite/go.test/test/nul1.go b/gcc/testsuite/go.test/test/nul1.go index 968c9529513..20426b4fa08 100644 --- a/gcc/testsuite/go.test/test/nul1.go +++ b/gcc/testsuite/go.test/test/nul1.go @@ -1,10 +1,4 @@ -// [ "$GORUN" == "" ] || exit 0 # Android runner gets confused by the NUL output -// $G $D/$F.go && $L $F.$A && ./$A.out >tmp.go && -// errchk $G -e tmp.go -// rm -f tmp.go - -// NOTE: This test is not run by 'run.go' and so not run by all.bash. -// To run this test you must use the ./run shell script. +// errorcheckoutput // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style diff --git a/gcc/testsuite/go.test/test/range.go b/gcc/testsuite/go.test/test/range.go index 68b0c9a2f33..8effbe9c53a 100644 --- a/gcc/testsuite/go.test/test/range.go +++ b/gcc/testsuite/go.test/test/range.go @@ -55,10 +55,10 @@ func testslice() { panic("fail") } if s != 15 { - println("wrong sum ranging over makeslice") + println("wrong sum ranging over makeslice", s) panic("fail") } - + x := []int{10, 20} y := []int{99} i := 1 @@ -82,7 +82,7 @@ func testslice1() { panic("fail") } if s != 10 { - println("wrong sum ranging over makeslice") + println("wrong sum ranging over makeslice", s) panic("fail") } } @@ -106,7 +106,7 @@ func testarray() { panic("fail") } if s != 15 { - println("wrong sum ranging over makearray") + println("wrong sum ranging over makearray", s) panic("fail") } } @@ -122,7 +122,7 @@ func testarray1() { panic("fail") } if s != 10 { - println("wrong sum ranging over makearray") + println("wrong sum ranging over makearray", s) panic("fail") } } @@ -155,7 +155,7 @@ func testarrayptr() { panic("fail") } if s != 15 { - println("wrong sum ranging over makearrayptr") + println("wrong sum ranging over makearrayptr", s) panic("fail") } } @@ -171,7 +171,7 @@ func testarrayptr1() { panic("fail") } if s != 10 { - println("wrong sum ranging over makearrayptr") + println("wrong sum ranging over makearrayptr", s) panic("fail") } } @@ -195,7 +195,7 @@ func teststring() { panic("fail") } if s != 'a'+'b'+'c'+'d'+'☺' { - println("wrong sum ranging over makestring") + println("wrong sum ranging over makestring", s) panic("fail") } } @@ -211,7 +211,7 @@ func teststring1() { panic("fail") } if s != 10 { - println("wrong sum ranging over makestring") + println("wrong sum ranging over makestring", s) panic("fail") } } @@ -235,7 +235,7 @@ func testmap() { panic("fail") } if s != 'a'+'b'+'c'+'d'+'☺' { - println("wrong sum ranging over makemap") + println("wrong sum ranging over makemap", s) panic("fail") } } @@ -251,7 +251,7 @@ func testmap1() { panic("fail") } if s != 10 { - println("wrong sum ranging over makemap") + println("wrong sum ranging over makemap", s) panic("fail") } } diff --git a/gcc/testsuite/go.test/test/recover.go b/gcc/testsuite/go.test/test/recover.go index eea655ec578..7c27d7c4d63 100644 --- a/gcc/testsuite/go.test/test/recover.go +++ b/gcc/testsuite/go.test/test/recover.go @@ -8,15 +8,21 @@ package main -import "runtime" +import ( + "os" + "runtime" +) func main() { test1() test1WithClosures() test2() test3() - test4() - test5() + // exp/ssa/interp still has some bugs in recover(). + if os.Getenv("GOSSAINTERP") == "" { + test4() + test5() + } test6() test6WithClosures() test7() diff --git a/gcc/testsuite/go.test/test/recover3.go b/gcc/testsuite/go.test/test/recover3.go index 98700231ef5..ebfa0a30757 100644 --- a/gcc/testsuite/go.test/test/recover3.go +++ b/gcc/testsuite/go.test/test/recover3.go @@ -71,6 +71,10 @@ func main() { inter = 1 check("type-concrete", func() { println(inter.(string)) }, "int, not string") check("type-interface", func() { println(inter.(m)) }, "missing method m") + + if didbug { + panic("recover3") + } } type m interface { diff --git a/gcc/testsuite/go.test/test/rename.go b/gcc/testsuite/go.test/test/rename.go index e5442745538..dc4341718dc 100644 --- a/gcc/testsuite/go.test/test/rename.go +++ b/gcc/testsuite/go.test/test/rename.go @@ -8,7 +8,10 @@ package main -import "fmt" +import ( + "fmt" + "runtime" +) func main() { n := @@ -52,6 +55,7 @@ func main() { iota if n != NUM*(NUM-1)/2 { fmt.Println("BUG: wrong n", n, NUM*(NUM-1)/2) + runtime.Breakpoint() // panic is inaccessible } } diff --git a/gcc/testsuite/go.test/test/reorder.go b/gcc/testsuite/go.test/test/reorder.go index 0cdeebd0f31..8fd623c1c70 100644 --- a/gcc/testsuite/go.test/test/reorder.go +++ b/gcc/testsuite/go.test/test/reorder.go @@ -19,7 +19,6 @@ func main() { p6() p7() p8() - p9() } var gx []int @@ -43,7 +42,7 @@ func check3(x, y, z, xx, yy, zz int) { } func p1() { - x := []int{1,2,3} + x := []int{1, 2, 3} i := 0 i, x[i] = 1, 100 _ = i @@ -51,7 +50,7 @@ func p1() { } func p2() { - x := []int{1,2,3} + x := []int{1, 2, 3} i := 0 x[i], i = 100, 1 _ = i @@ -59,7 +58,7 @@ func p2() { } func p3() { - x := []int{1,2,3} + x := []int{1, 2, 3} y := x gx = x x[1], y[0] = f(0), f(1) @@ -67,7 +66,7 @@ func p3() { } func p4() { - x := []int{1,2,3} + x := []int{1, 2, 3} y := x gx = x x[1], y[0] = gx[0], gx[1] @@ -75,7 +74,7 @@ func p4() { } func p5() { - x := []int{1,2,3} + x := []int{1, 2, 3} y := x p := &x[0] q := &x[1] @@ -90,7 +89,7 @@ func p6() { px := &x py := &y *px, *py = y, x - check3(x, y, z, 2, 1, 3) + check3(x, y, z, 2, 1, 3) } func f1(x, y, z int) (xx, yy, zz int) { @@ -107,21 +106,6 @@ func p7() { } func p8() { - x := []int{1,2,3} - - defer func() { - err := recover() - if err == nil { - panic("not panicking") - } - check(x, 100, 2, 3) - }() - - i := 0 - i, x[i], x[5] = 1, 100, 500 -} - -func p9() { m := make(map[int]int) m[0] = len(m) if m[0] != 0 { diff --git a/gcc/testsuite/go.test/test/return.go b/gcc/testsuite/go.test/test/return.go new file mode 100644 index 00000000000..482f22bd5f4 --- /dev/null +++ b/gcc/testsuite/go.test/test/return.go @@ -0,0 +1,2821 @@ +// errorcheck + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Test compiler diagnosis of function missing return statements. +// See issue 65 and golang.org/s/go11return. + +package p + +type T int + +var x interface{} +var c chan int + +func external() int // ok + +func _() int { +} // ERROR "missing return" + +func _() int { + print(1) +} // ERROR "missing return" + +// return is okay +func _() int { + print(1) + return 2 +} + +// goto is okay +func _() int { +L: + print(1) + goto L +} + +// panic is okay +func _() int { + print(1) + panic(2) +} + +// but only builtin panic +func _() int { + var panic = func(int) {} + print(1) + panic(2) +} // ERROR "missing return" + +// block ending in terminating statement is okay +func _() int { + { + print(1) + return 2 + } +} + +// block ending in terminating statement is okay +func _() int { +L: + { + print(1) + goto L + } +} + +// block ending in terminating statement is okay +func _() int { + print(1) + { + panic(2) + } +} + +// adding more code - even though it is dead - now requires a return + +func _() int { + print(1) + return 2 + print(3) +} // ERROR "missing return" + +func _() int { +L: + print(1) + goto L + print(3) +} // ERROR "missing return" + +func _() int { + print(1) + panic(2) + print(3) +} // ERROR "missing return" + +func _() int { + { + print(1) + return 2 + print(3) + } +} // ERROR "missing return" + +func _() int { +L: + { + print(1) + goto L + print(3) + } +} // ERROR "missing return" + +func _() int { + print(1) + { + panic(2) + print(3) + } +} // ERROR "missing return" + +func _() int { + { + print(1) + return 2 + } + print(3) +} // ERROR "missing return" + +func _() int { +L: + { + print(1) + goto L + } + print(3) +} // ERROR "missing return" + +func _() int { + print(1) + { + panic(2) + } + print(3) +} // ERROR "missing return" + +// even an empty dead block triggers the message, because it +// becomes the final statement. + +func _() int { + print(1) + return 2 + {} +} // ERROR "missing return" + +func _() int { +L: + print(1) + goto L + {} +} // ERROR "missing return" + +func _() int { + print(1) + panic(2) + {} +} // ERROR "missing return" + +func _() int { + { + print(1) + return 2 + {} + } +} // ERROR "missing return" + +func _() int { +L: + { + print(1) + goto L + {} + } +} // ERROR "missing return" + +func _() int { + print(1) + { + panic(2) + {} + } +} // ERROR "missing return" + +func _() int { + { + print(1) + return 2 + } + {} +} // ERROR "missing return" + +func _() int { +L: + { + print(1) + goto L + } + {} +} // ERROR "missing return" + +func _() int { + print(1) + { + panic(2) + } + {} +} // ERROR "missing return" + +// if-else chain with final else and all terminating is okay + +func _() int { + print(1) + if x == nil { + panic(2) + } else { + panic(3) + } +} + +func _() int { +L: + print(1) + if x == nil { + panic(2) + } else { + goto L + } +} + +func _() int { +L: + print(1) + if x == nil { + panic(2) + } else if x == 1 { + return 0 + } else if x != 2 { + panic(3) + } else { + goto L + } +} + +// if-else chain missing final else is not okay, even if the +// conditions cover every possible case. + +func _() int { + print(1) + if x == nil { + panic(2) + } else if x != nil { + panic(3) + } +} // ERROR "missing return" + +func _() int { + print(1) + if x == nil { + panic(2) + } +} // ERROR "missing return" + +func _() int { + print(1) + if x == nil { + panic(2) + } else if x == 1 { + return 0 + } else if x != 1 { + panic(3) + } +} // ERROR "missing return" + + +// for { loops that never break are okay. + +func _() int { + print(1) + for {} +} + +func _() int { + for { + for { + break + } + } +} + +func _() int { + for { + L: + for { + break L + } + } +} + +// for { loops that break are not okay. + +func _() int { + print(1) + for { break } +} // ERROR "missing return" + +func _() int { + for { + for { + } + break + } +} // ERROR "missing return" + +func _() int { +L: + for { + for { + break L + } + } +} // ERROR "missing return" + +// if there's a condition - even "true" - the loops are no longer syntactically terminating + +func _() int { + print(1) + for x == nil {} +} // ERROR "missing return" + +func _() int { + for x == nil { + for { + break + } + } +} // ERROR "missing return" + +func _() int { + for x == nil { + L: + for { + break L + } + } +} // ERROR "missing return" + +func _() int { + print(1) + for true {} +} // ERROR "missing return" + +func _() int { + for true { + for { + break + } + } +} // ERROR "missing return" + +func _() int { + for true { + L: + for { + break L + } + } +} // ERROR "missing return" + +// select in which all cases terminate and none break are okay. + +func _() int { + print(1) + select{} +} + +func _() int { + print(1) + select { + case <-c: + print(2) + panic("abc") + } +} + +func _() int { + print(1) + select { + case <-c: + print(2) + for{} + } +} + +func _() int { +L: + print(1) + select { + case <-c: + print(2) + panic("abc") + case c <- 1: + print(2) + goto L + } +} + +func _() int { + print(1) + select { + case <-c: + print(2) + panic("abc") + default: + select{} + } +} + +// if any cases don't terminate, the select isn't okay anymore + +func _() int { + print(1) + select { + case <-c: + print(2) + } +} // ERROR "missing return" + +func _() int { +L: + print(1) + select { + case <-c: + print(2) + panic("abc") + goto L + case c <- 1: + print(2) + } +} // ERROR "missing return" + + +func _() int { + print(1) + select { + case <-c: + print(2) + panic("abc") + default: + print(2) + } +} // ERROR "missing return" + + +// if any breaks refer to the select, the select isn't okay anymore, even if they're dead + +func _() int { + print(1) + select{ default: break } +} // ERROR "missing return" + +func _() int { + print(1) + select { + case <-c: + print(2) + panic("abc") + break + } +} // ERROR "missing return" + +func _() int { + print(1) +L: + select { + case <-c: + print(2) + for{ break L } + } +} // ERROR "missing return" + +func _() int { + print(1) +L: + select { + case <-c: + print(2) + panic("abc") + case c <- 1: + print(2) + break L + } +} // ERROR "missing return" + +func _() int { + print(1) + select { + case <-c: + print(1) + panic("abc") + default: + select{} + break + } +} // ERROR "missing return" + +// switch with default in which all cases terminate is okay + +func _() int { + print(1) + switch x { + case 1: + print(2) + panic(3) + default: + return 4 + } +} + +func _() int { + print(1) + switch x { + default: + return 4 + case 1: + print(2) + panic(3) + } +} + +func _() int { + print(1) + switch x { + case 1: + print(2) + fallthrough + default: + return 4 + } +} + +// if no default or some case doesn't terminate, switch is no longer okay + +func _() int { + print(1) + switch { + } +} // ERROR "missing return" + + +func _() int { + print(1) + switch x { + case 1: + print(2) + panic(3) + case 2: + return 4 + } +} // ERROR "missing return" + +func _() int { + print(1) + switch x { + case 2: + return 4 + case 1: + print(2) + panic(3) + } +} // ERROR "missing return" + +func _() int { + print(1) + switch x { + case 1: + print(2) + fallthrough + case 2: + return 4 + } +} // ERROR "missing return" + +func _() int { + print(1) + switch x { + case 1: + print(2) + panic(3) + } +} // ERROR "missing return" + +// if any breaks refer to the switch, switch is no longer okay + +func _() int { + print(1) +L: + switch x { + case 1: + print(2) + panic(3) + break L + default: + return 4 + } +} // ERROR "missing return" + +func _() int { + print(1) + switch x { + default: + return 4 + break + case 1: + print(2) + panic(3) + } +} // ERROR "missing return" + +func _() int { + print(1) +L: + switch x { + case 1: + print(2) + for { + break L + } + default: + return 4 + } +} // ERROR "missing return" + +// type switch with default in which all cases terminate is okay + +func _() int { + print(1) + switch x.(type) { + case int: + print(2) + panic(3) + default: + return 4 + } +} + +func _() int { + print(1) + switch x.(type) { + default: + return 4 + case int: + print(2) + panic(3) + } +} + +// if no default or some case doesn't terminate, switch is no longer okay + +func _() int { + print(1) + switch { + } +} // ERROR "missing return" + + +func _() int { + print(1) + switch x.(type) { + case int: + print(2) + panic(3) + case float64: + return 4 + } +} // ERROR "missing return" + +func _() int { + print(1) + switch x.(type) { + case float64: + return 4 + case int: + print(2) + panic(3) + } +} // ERROR "missing return" + +func _() int { + print(1) + switch x.(type) { + case int: + print(2) + panic(3) + } +} // ERROR "missing return" + +// if any breaks refer to the switch, switch is no longer okay + +func _() int { + print(1) +L: + switch x.(type) { + case int: + print(2) + panic(3) + break L + default: + return 4 + } +} // ERROR "missing return" + +func _() int { + print(1) + switch x.(type) { + default: + return 4 + break + case int: + print(2) + panic(3) + } +} // ERROR "missing return" + +func _() int { + print(1) +L: + switch x.(type) { + case int: + print(2) + for { + break L + } + default: + return 4 + } +} // ERROR "missing return" + +// again, but without the leading print(1). +// testing that everything works when the terminating statement is first. + +func _() int { +} // ERROR "missing return" + +// return is okay +func _() int { + return 2 +} + +// goto is okay +func _() int { +L: + goto L +} + +// panic is okay +func _() int { + panic(2) +} + +// but only builtin panic +func _() int { + var panic = func(int) {} + panic(2) +} // ERROR "missing return" + +// block ending in terminating statement is okay +func _() int { + { + return 2 + } +} + +// block ending in terminating statement is okay +func _() int { +L: + { + goto L + } +} + +// block ending in terminating statement is okay +func _() int { + { + panic(2) + } +} + +// adding more code - even though it is dead - now requires a return + +func _() int { + return 2 + print(3) +} // ERROR "missing return" + +func _() int { +L: + goto L + print(3) +} // ERROR "missing return" + +func _() int { + panic(2) + print(3) +} // ERROR "missing return" + +func _() int { + { + return 2 + print(3) + } +} // ERROR "missing return" + +func _() int { +L: + { + goto L + print(3) + } +} // ERROR "missing return" + +func _() int { + { + panic(2) + print(3) + } +} // ERROR "missing return" + +func _() int { + { + return 2 + } + print(3) +} // ERROR "missing return" + +func _() int { +L: + { + goto L + } + print(3) +} // ERROR "missing return" + +func _() int { + { + panic(2) + } + print(3) +} // ERROR "missing return" + +// even an empty dead block triggers the message, because it +// becomes the final statement. + +func _() int { + return 2 + {} +} // ERROR "missing return" + +func _() int { +L: + goto L + {} +} // ERROR "missing return" + +func _() int { + panic(2) + {} +} // ERROR "missing return" + +func _() int { + { + return 2 + {} + } +} // ERROR "missing return" + +func _() int { +L: + { + goto L + {} + } +} // ERROR "missing return" + +func _() int { + { + panic(2) + {} + } +} // ERROR "missing return" + +func _() int { + { + return 2 + } + {} +} // ERROR "missing return" + +func _() int { +L: + { + goto L + } + {} +} // ERROR "missing return" + +func _() int { + { + panic(2) + } + {} +} // ERROR "missing return" + +// if-else chain with final else and all terminating is okay + +func _() int { + if x == nil { + panic(2) + } else { + panic(3) + } +} + +func _() int { +L: + if x == nil { + panic(2) + } else { + goto L + } +} + +func _() int { +L: + if x == nil { + panic(2) + } else if x == 1 { + return 0 + } else if x != 2 { + panic(3) + } else { + goto L + } +} + +// if-else chain missing final else is not okay, even if the +// conditions cover every possible case. + +func _() int { + if x == nil { + panic(2) + } else if x != nil { + panic(3) + } +} // ERROR "missing return" + +func _() int { + if x == nil { + panic(2) + } +} // ERROR "missing return" + +func _() int { + if x == nil { + panic(2) + } else if x == 1 { + return 0 + } else if x != 1 { + panic(3) + } +} // ERROR "missing return" + + +// for { loops that never break are okay. + +func _() int { + for {} +} + +func _() int { + for { + for { + break + } + } +} + +func _() int { + for { + L: + for { + break L + } + } +} + +// for { loops that break are not okay. + +func _() int { + for { break } +} // ERROR "missing return" + +func _() int { + for { + for { + } + break + } +} // ERROR "missing return" + +func _() int { +L: + for { + for { + break L + } + } +} // ERROR "missing return" + +// if there's a condition - even "true" - the loops are no longer syntactically terminating + +func _() int { + for x == nil {} +} // ERROR "missing return" + +func _() int { + for x == nil { + for { + break + } + } +} // ERROR "missing return" + +func _() int { + for x == nil { + L: + for { + break L + } + } +} // ERROR "missing return" + +func _() int { + for true {} +} // ERROR "missing return" + +func _() int { + for true { + for { + break + } + } +} // ERROR "missing return" + +func _() int { + for true { + L: + for { + break L + } + } +} // ERROR "missing return" + +// select in which all cases terminate and none break are okay. + +func _() int { + select{} +} + +func _() int { + select { + case <-c: + print(2) + panic("abc") + } +} + +func _() int { + select { + case <-c: + print(2) + for{} + } +} + +func _() int { +L: + select { + case <-c: + print(2) + panic("abc") + case c <- 1: + print(2) + goto L + } +} + +func _() int { + select { + case <-c: + print(2) + panic("abc") + default: + select{} + } +} + +// if any cases don't terminate, the select isn't okay anymore + +func _() int { + select { + case <-c: + print(2) + } +} // ERROR "missing return" + +func _() int { +L: + select { + case <-c: + print(2) + panic("abc") + goto L + case c <- 1: + print(2) + } +} // ERROR "missing return" + + +func _() int { + select { + case <-c: + print(2) + panic("abc") + default: + print(2) + } +} // ERROR "missing return" + + +// if any breaks refer to the select, the select isn't okay anymore, even if they're dead + +func _() int { + select{ default: break } +} // ERROR "missing return" + +func _() int { + select { + case <-c: + print(2) + panic("abc") + break + } +} // ERROR "missing return" + +func _() int { +L: + select { + case <-c: + print(2) + for{ break L } + } +} // ERROR "missing return" + +func _() int { +L: + select { + case <-c: + print(2) + panic("abc") + case c <- 1: + print(2) + break L + } +} // ERROR "missing return" + +func _() int { + select { + case <-c: + panic("abc") + default: + select{} + break + } +} // ERROR "missing return" + +// switch with default in which all cases terminate is okay + +func _() int { + switch x { + case 1: + print(2) + panic(3) + default: + return 4 + } +} + +func _() int { + switch x { + default: + return 4 + case 1: + print(2) + panic(3) + } +} + +func _() int { + switch x { + case 1: + print(2) + fallthrough + default: + return 4 + } +} + +// if no default or some case doesn't terminate, switch is no longer okay + +func _() int { + switch { + } +} // ERROR "missing return" + + +func _() int { + switch x { + case 1: + print(2) + panic(3) + case 2: + return 4 + } +} // ERROR "missing return" + +func _() int { + switch x { + case 2: + return 4 + case 1: + print(2) + panic(3) + } +} // ERROR "missing return" + +func _() int { + switch x { + case 1: + print(2) + fallthrough + case 2: + return 4 + } +} // ERROR "missing return" + +func _() int { + switch x { + case 1: + print(2) + panic(3) + } +} // ERROR "missing return" + +// if any breaks refer to the switch, switch is no longer okay + +func _() int { +L: + switch x { + case 1: + print(2) + panic(3) + break L + default: + return 4 + } +} // ERROR "missing return" + +func _() int { + switch x { + default: + return 4 + break + case 1: + print(2) + panic(3) + } +} // ERROR "missing return" + +func _() int { +L: + switch x { + case 1: + print(2) + for { + break L + } + default: + return 4 + } +} // ERROR "missing return" + +// type switch with default in which all cases terminate is okay + +func _() int { + switch x.(type) { + case int: + print(2) + panic(3) + default: + return 4 + } +} + +func _() int { + switch x.(type) { + default: + return 4 + case int: + print(2) + panic(3) + } +} + +// if no default or some case doesn't terminate, switch is no longer okay + +func _() int { + switch { + } +} // ERROR "missing return" + + +func _() int { + switch x.(type) { + case int: + print(2) + panic(3) + case float64: + return 4 + } +} // ERROR "missing return" + +func _() int { + switch x.(type) { + case float64: + return 4 + case int: + print(2) + panic(3) + } +} // ERROR "missing return" + +func _() int { + switch x.(type) { + case int: + print(2) + panic(3) + } +} // ERROR "missing return" + +// if any breaks refer to the switch, switch is no longer okay + +func _() int { +L: + switch x.(type) { + case int: + print(2) + panic(3) + break L + default: + return 4 + } +} // ERROR "missing return" + +func _() int { + switch x.(type) { + default: + return 4 + break + case int: + print(2) + panic(3) + } +} // ERROR "missing return" + +func _() int { +L: + switch x.(type) { + case int: + print(2) + for { + break L + } + default: + return 4 + } +} // ERROR "missing return" + +func _() int { + switch x.(type) { + default: + return 4 + case int, float64: + print(2) + panic(3) + } +} + +// again, with func literals + +var _ = func() int { +} // ERROR "missing return" + +var _ = func() int { + print(1) +} // ERROR "missing return" + +// return is okay +var _ = func() int { + print(1) + return 2 +} + +// goto is okay +var _ = func() int { +L: + print(1) + goto L +} + +// panic is okay +var _ = func() int { + print(1) + panic(2) +} + +// but only builtin panic +var _ = func() int { + var panic = func(int) {} + print(1) + panic(2) +} // ERROR "missing return" + +// block ending in terminating statement is okay +var _ = func() int { + { + print(1) + return 2 + } +} + +// block ending in terminating statement is okay +var _ = func() int { +L: + { + print(1) + goto L + } +} + +// block ending in terminating statement is okay +var _ = func() int { + print(1) + { + panic(2) + } +} + +// adding more code - even though it is dead - now requires a return + +var _ = func() int { + print(1) + return 2 + print(3) +} // ERROR "missing return" + +var _ = func() int { +L: + print(1) + goto L + print(3) +} // ERROR "missing return" + +var _ = func() int { + print(1) + panic(2) + print(3) +} // ERROR "missing return" + +var _ = func() int { + { + print(1) + return 2 + print(3) + } +} // ERROR "missing return" + +var _ = func() int { +L: + { + print(1) + goto L + print(3) + } +} // ERROR "missing return" + +var _ = func() int { + print(1) + { + panic(2) + print(3) + } +} // ERROR "missing return" + +var _ = func() int { + { + print(1) + return 2 + } + print(3) +} // ERROR "missing return" + +var _ = func() int { +L: + { + print(1) + goto L + } + print(3) +} // ERROR "missing return" + +var _ = func() int { + print(1) + { + panic(2) + } + print(3) +} // ERROR "missing return" + +// even an empty dead block triggers the message, because it +// becomes the final statement. + +var _ = func() int { + print(1) + return 2 + {} +} // ERROR "missing return" + +var _ = func() int { +L: + print(1) + goto L + {} +} // ERROR "missing return" + +var _ = func() int { + print(1) + panic(2) + {} +} // ERROR "missing return" + +var _ = func() int { + { + print(1) + return 2 + {} + } +} // ERROR "missing return" + +var _ = func() int { +L: + { + print(1) + goto L + {} + } +} // ERROR "missing return" + +var _ = func() int { + print(1) + { + panic(2) + {} + } +} // ERROR "missing return" + +var _ = func() int { + { + print(1) + return 2 + } + {} +} // ERROR "missing return" + +var _ = func() int { +L: + { + print(1) + goto L + } + {} +} // ERROR "missing return" + +var _ = func() int { + print(1) + { + panic(2) + } + {} +} // ERROR "missing return" + +// if-else chain with final else and all terminating is okay + +var _ = func() int { + print(1) + if x == nil { + panic(2) + } else { + panic(3) + } +} + +var _ = func() int { +L: + print(1) + if x == nil { + panic(2) + } else { + goto L + } +} + +var _ = func() int { +L: + print(1) + if x == nil { + panic(2) + } else if x == 1 { + return 0 + } else if x != 2 { + panic(3) + } else { + goto L + } +} + +// if-else chain missing final else is not okay, even if the +// conditions cover every possible case. + +var _ = func() int { + print(1) + if x == nil { + panic(2) + } else if x != nil { + panic(3) + } +} // ERROR "missing return" + +var _ = func() int { + print(1) + if x == nil { + panic(2) + } +} // ERROR "missing return" + +var _ = func() int { + print(1) + if x == nil { + panic(2) + } else if x == 1 { + return 0 + } else if x != 1 { + panic(3) + } +} // ERROR "missing return" + + +// for { loops that never break are okay. + +var _ = func() int { + print(1) + for {} +} + +var _ = func() int { + for { + for { + break + } + } +} + +var _ = func() int { + for { + L: + for { + break L + } + } +} + +// for { loops that break are not okay. + +var _ = func() int { + print(1) + for { break } +} // ERROR "missing return" + +var _ = func() int { + for { + for { + } + break + } +} // ERROR "missing return" + +var _ = func() int { +L: + for { + for { + break L + } + } +} // ERROR "missing return" + +// if there's a condition - even "true" - the loops are no longer syntactically terminating + +var _ = func() int { + print(1) + for x == nil {} +} // ERROR "missing return" + +var _ = func() int { + for x == nil { + for { + break + } + } +} // ERROR "missing return" + +var _ = func() int { + for x == nil { + L: + for { + break L + } + } +} // ERROR "missing return" + +var _ = func() int { + print(1) + for true {} +} // ERROR "missing return" + +var _ = func() int { + for true { + for { + break + } + } +} // ERROR "missing return" + +var _ = func() int { + for true { + L: + for { + break L + } + } +} // ERROR "missing return" + +// select in which all cases terminate and none break are okay. + +var _ = func() int { + print(1) + select{} +} + +var _ = func() int { + print(1) + select { + case <-c: + print(2) + panic("abc") + } +} + +var _ = func() int { + print(1) + select { + case <-c: + print(2) + for{} + } +} + +var _ = func() int { +L: + print(1) + select { + case <-c: + print(2) + panic("abc") + case c <- 1: + print(2) + goto L + } +} + +var _ = func() int { + print(1) + select { + case <-c: + print(2) + panic("abc") + default: + select{} + } +} + +// if any cases don't terminate, the select isn't okay anymore + +var _ = func() int { + print(1) + select { + case <-c: + print(2) + } +} // ERROR "missing return" + +var _ = func() int { +L: + print(1) + select { + case <-c: + print(2) + panic("abc") + goto L + case c <- 1: + print(2) + } +} // ERROR "missing return" + + +var _ = func() int { + print(1) + select { + case <-c: + print(2) + panic("abc") + default: + print(2) + } +} // ERROR "missing return" + + +// if any breaks refer to the select, the select isn't okay anymore, even if they're dead + +var _ = func() int { + print(1) + select{ default: break } +} // ERROR "missing return" + +var _ = func() int { + print(1) + select { + case <-c: + print(2) + panic("abc") + break + } +} // ERROR "missing return" + +var _ = func() int { + print(1) +L: + select { + case <-c: + print(2) + for{ break L } + } +} // ERROR "missing return" + +var _ = func() int { + print(1) +L: + select { + case <-c: + print(2) + panic("abc") + case c <- 1: + print(2) + break L + } +} // ERROR "missing return" + +var _ = func() int { + print(1) + select { + case <-c: + print(1) + panic("abc") + default: + select{} + break + } +} // ERROR "missing return" + +// switch with default in which all cases terminate is okay + +var _ = func() int { + print(1) + switch x { + case 1: + print(2) + panic(3) + default: + return 4 + } +} + +var _ = func() int { + print(1) + switch x { + default: + return 4 + case 1: + print(2) + panic(3) + } +} + +var _ = func() int { + print(1) + switch x { + case 1: + print(2) + fallthrough + default: + return 4 + } +} + +// if no default or some case doesn't terminate, switch is no longer okay + +var _ = func() int { + print(1) + switch { + } +} // ERROR "missing return" + + +var _ = func() int { + print(1) + switch x { + case 1: + print(2) + panic(3) + case 2: + return 4 + } +} // ERROR "missing return" + +var _ = func() int { + print(1) + switch x { + case 2: + return 4 + case 1: + print(2) + panic(3) + } +} // ERROR "missing return" + +var _ = func() int { + print(1) + switch x { + case 1: + print(2) + fallthrough + case 2: + return 4 + } +} // ERROR "missing return" + +var _ = func() int { + print(1) + switch x { + case 1: + print(2) + panic(3) + } +} // ERROR "missing return" + +// if any breaks refer to the switch, switch is no longer okay + +var _ = func() int { + print(1) +L: + switch x { + case 1: + print(2) + panic(3) + break L + default: + return 4 + } +} // ERROR "missing return" + +var _ = func() int { + print(1) + switch x { + default: + return 4 + break + case 1: + print(2) + panic(3) + } +} // ERROR "missing return" + +var _ = func() int { + print(1) +L: + switch x { + case 1: + print(2) + for { + break L + } + default: + return 4 + } +} // ERROR "missing return" + +// type switch with default in which all cases terminate is okay + +var _ = func() int { + print(1) + switch x.(type) { + case int: + print(2) + panic(3) + default: + return 4 + } +} + +var _ = func() int { + print(1) + switch x.(type) { + default: + return 4 + case int: + print(2) + panic(3) + } +} + +// if no default or some case doesn't terminate, switch is no longer okay + +var _ = func() int { + print(1) + switch { + } +} // ERROR "missing return" + + +var _ = func() int { + print(1) + switch x.(type) { + case int: + print(2) + panic(3) + case float64: + return 4 + } +} // ERROR "missing return" + +var _ = func() int { + print(1) + switch x.(type) { + case float64: + return 4 + case int: + print(2) + panic(3) + } +} // ERROR "missing return" + +var _ = func() int { + print(1) + switch x.(type) { + case int: + print(2) + panic(3) + } +} // ERROR "missing return" + +// if any breaks refer to the switch, switch is no longer okay + +var _ = func() int { + print(1) +L: + switch x.(type) { + case int: + print(2) + panic(3) + break L + default: + return 4 + } +} // ERROR "missing return" + +var _ = func() int { + print(1) + switch x.(type) { + default: + return 4 + break + case int: + print(2) + panic(3) + } +} // ERROR "missing return" + +var _ = func() int { + print(1) +L: + switch x.(type) { + case int: + print(2) + for { + break L + } + default: + return 4 + } +} // ERROR "missing return" + +// again, but without the leading print(1). +// testing that everything works when the terminating statement is first. + +var _ = func() int { +} // ERROR "missing return" + +// return is okay +var _ = func() int { + return 2 +} + +// goto is okay +var _ = func() int { +L: + goto L +} + +// panic is okay +var _ = func() int { + panic(2) +} + +// but only builtin panic +var _ = func() int { + var panic = func(int) {} + panic(2) +} // ERROR "missing return" + +// block ending in terminating statement is okay +var _ = func() int { + { + return 2 + } +} + +// block ending in terminating statement is okay +var _ = func() int { +L: + { + goto L + } +} + +// block ending in terminating statement is okay +var _ = func() int { + { + panic(2) + } +} + +// adding more code - even though it is dead - now requires a return + +var _ = func() int { + return 2 + print(3) +} // ERROR "missing return" + +var _ = func() int { +L: + goto L + print(3) +} // ERROR "missing return" + +var _ = func() int { + panic(2) + print(3) +} // ERROR "missing return" + +var _ = func() int { + { + return 2 + print(3) + } +} // ERROR "missing return" + +var _ = func() int { +L: + { + goto L + print(3) + } +} // ERROR "missing return" + +var _ = func() int { + { + panic(2) + print(3) + } +} // ERROR "missing return" + +var _ = func() int { + { + return 2 + } + print(3) +} // ERROR "missing return" + +var _ = func() int { +L: + { + goto L + } + print(3) +} // ERROR "missing return" + +var _ = func() int { + { + panic(2) + } + print(3) +} // ERROR "missing return" + +// even an empty dead block triggers the message, because it +// becomes the final statement. + +var _ = func() int { + return 2 + {} +} // ERROR "missing return" + +var _ = func() int { +L: + goto L + {} +} // ERROR "missing return" + +var _ = func() int { + panic(2) + {} +} // ERROR "missing return" + +var _ = func() int { + { + return 2 + {} + } +} // ERROR "missing return" + +var _ = func() int { +L: + { + goto L + {} + } +} // ERROR "missing return" + +var _ = func() int { + { + panic(2) + {} + } +} // ERROR "missing return" + +var _ = func() int { + { + return 2 + } + {} +} // ERROR "missing return" + +var _ = func() int { +L: + { + goto L + } + {} +} // ERROR "missing return" + +var _ = func() int { + { + panic(2) + } + {} +} // ERROR "missing return" + +// if-else chain with final else and all terminating is okay + +var _ = func() int { + if x == nil { + panic(2) + } else { + panic(3) + } +} + +var _ = func() int { +L: + if x == nil { + panic(2) + } else { + goto L + } +} + +var _ = func() int { +L: + if x == nil { + panic(2) + } else if x == 1 { + return 0 + } else if x != 2 { + panic(3) + } else { + goto L + } +} + +// if-else chain missing final else is not okay, even if the +// conditions cover every possible case. + +var _ = func() int { + if x == nil { + panic(2) + } else if x != nil { + panic(3) + } +} // ERROR "missing return" + +var _ = func() int { + if x == nil { + panic(2) + } +} // ERROR "missing return" + +var _ = func() int { + if x == nil { + panic(2) + } else if x == 1 { + return 0 + } else if x != 1 { + panic(3) + } +} // ERROR "missing return" + + +// for { loops that never break are okay. + +var _ = func() int { + for {} +} + +var _ = func() int { + for { + for { + break + } + } +} + +var _ = func() int { + for { + L: + for { + break L + } + } +} + +// for { loops that break are not okay. + +var _ = func() int { + for { break } +} // ERROR "missing return" + +var _ = func() int { + for { + for { + } + break + } +} // ERROR "missing return" + +var _ = func() int { +L: + for { + for { + break L + } + } +} // ERROR "missing return" + +// if there's a condition - even "true" - the loops are no longer syntactically terminating + +var _ = func() int { + for x == nil {} +} // ERROR "missing return" + +var _ = func() int { + for x == nil { + for { + break + } + } +} // ERROR "missing return" + +var _ = func() int { + for x == nil { + L: + for { + break L + } + } +} // ERROR "missing return" + +var _ = func() int { + for true {} +} // ERROR "missing return" + +var _ = func() int { + for true { + for { + break + } + } +} // ERROR "missing return" + +var _ = func() int { + for true { + L: + for { + break L + } + } +} // ERROR "missing return" + +// select in which all cases terminate and none break are okay. + +var _ = func() int { + select{} +} + +var _ = func() int { + select { + case <-c: + print(2) + panic("abc") + } +} + +var _ = func() int { + select { + case <-c: + print(2) + for{} + } +} + +var _ = func() int { +L: + select { + case <-c: + print(2) + panic("abc") + case c <- 1: + print(2) + goto L + } +} + +var _ = func() int { + select { + case <-c: + print(2) + panic("abc") + default: + select{} + } +} + +// if any cases don't terminate, the select isn't okay anymore + +var _ = func() int { + select { + case <-c: + print(2) + } +} // ERROR "missing return" + +var _ = func() int { +L: + select { + case <-c: + print(2) + panic("abc") + goto L + case c <- 1: + print(2) + } +} // ERROR "missing return" + + +var _ = func() int { + select { + case <-c: + print(2) + panic("abc") + default: + print(2) + } +} // ERROR "missing return" + + +// if any breaks refer to the select, the select isn't okay anymore, even if they're dead + +var _ = func() int { + select{ default: break } +} // ERROR "missing return" + +var _ = func() int { + select { + case <-c: + print(2) + panic("abc") + break + } +} // ERROR "missing return" + +var _ = func() int { +L: + select { + case <-c: + print(2) + for{ break L } + } +} // ERROR "missing return" + +var _ = func() int { +L: + select { + case <-c: + print(2) + panic("abc") + case c <- 1: + print(2) + break L + } +} // ERROR "missing return" + +var _ = func() int { + select { + case <-c: + panic("abc") + default: + select{} + break + } +} // ERROR "missing return" + +// switch with default in which all cases terminate is okay + +var _ = func() int { + switch x { + case 1: + print(2) + panic(3) + default: + return 4 + } +} + +var _ = func() int { + switch x { + default: + return 4 + case 1: + print(2) + panic(3) + } +} + +var _ = func() int { + switch x { + case 1: + print(2) + fallthrough + default: + return 4 + } +} + +// if no default or some case doesn't terminate, switch is no longer okay + +var _ = func() int { + switch { + } +} // ERROR "missing return" + + +var _ = func() int { + switch x { + case 1: + print(2) + panic(3) + case 2: + return 4 + } +} // ERROR "missing return" + +var _ = func() int { + switch x { + case 2: + return 4 + case 1: + print(2) + panic(3) + } +} // ERROR "missing return" + +var _ = func() int { + switch x { + case 1: + print(2) + fallthrough + case 2: + return 4 + } +} // ERROR "missing return" + +var _ = func() int { + switch x { + case 1: + print(2) + panic(3) + } +} // ERROR "missing return" + +// if any breaks refer to the switch, switch is no longer okay + +var _ = func() int { +L: + switch x { + case 1: + print(2) + panic(3) + break L + default: + return 4 + } +} // ERROR "missing return" + +var _ = func() int { + switch x { + default: + return 4 + break + case 1: + print(2) + panic(3) + } +} // ERROR "missing return" + +var _ = func() int { +L: + switch x { + case 1: + print(2) + for { + break L + } + default: + return 4 + } +} // ERROR "missing return" + +// type switch with default in which all cases terminate is okay + +var _ = func() int { + switch x.(type) { + case int: + print(2) + panic(3) + default: + return 4 + } +} + +var _ = func() int { + switch x.(type) { + default: + return 4 + case int: + print(2) + panic(3) + } +} + +// if no default or some case doesn't terminate, switch is no longer okay + +var _ = func() int { + switch { + } +} // ERROR "missing return" + + +var _ = func() int { + switch x.(type) { + case int: + print(2) + panic(3) + case float64: + return 4 + } +} // ERROR "missing return" + +var _ = func() int { + switch x.(type) { + case float64: + return 4 + case int: + print(2) + panic(3) + } +} // ERROR "missing return" + +var _ = func() int { + switch x.(type) { + case int: + print(2) + panic(3) + } +} // ERROR "missing return" + +// if any breaks refer to the switch, switch is no longer okay + +var _ = func() int { +L: + switch x.(type) { + case int: + print(2) + panic(3) + break L + default: + return 4 + } +} // ERROR "missing return" + +var _ = func() int { + switch x.(type) { + default: + return 4 + break + case int: + print(2) + panic(3) + } +} // ERROR "missing return" + +var _ = func() int { +L: + switch x.(type) { + case int: + print(2) + for { + break L + } + default: + return 4 + } +} // ERROR "missing return" + +var _ = func() int { + switch x.(type) { + default: + return 4 + case int, float64: + print(2) + panic(3) + } +} + +/**/ diff --git a/gcc/testsuite/go.test/test/rotate.go b/gcc/testsuite/go.test/test/rotate.go index aa334b4218c..1d7149702a8 100644 --- a/gcc/testsuite/go.test/test/rotate.go +++ b/gcc/testsuite/go.test/test/rotate.go @@ -1,9 +1,6 @@ -// $G $D/$F.go && $L $F.$A && -// ./$A.out >tmp.go && $G tmp.go && $L -o $A.out1 tmp.$A && ./$A.out1 -// rm -f tmp.go $A.out1 +// skip -// NOTE: This test is not run by 'run.go' and so not run by all.bash. -// To run this test you must use the ./run shell script. +// NOTE: the actual tests to run are rotate[0123].go // Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style @@ -12,8 +9,8 @@ // Generate test of shift and rotate by constants. // The output is compiled and run. // -// The output takes around a gigabyte of memory to compile, link, and run -// but it is only done during ./run, not in normal builds using run.go. +// The integer type depends on the value of mode (rotate direction, +// signedness). package main @@ -37,9 +34,7 @@ func main() { typ := fmt.Sprintf("int%d", 1<<logBits) fmt.Fprint(b, strings.Replace(checkFunc, "XXX", typ, -1)) fmt.Fprint(b, strings.Replace(checkFunc, "XXX", "u"+typ, -1)) - for mode := 0; mode < 1<<2; mode++ { - gentest(b, 1<<logBits, mode&1 != 0, mode&2 != 0) - } + gentest(b, 1<<logBits, mode&1 != 0, mode&2 != 0) } } diff --git a/gcc/testsuite/go.test/test/rotate0.go b/gcc/testsuite/go.test/test/rotate0.go new file mode 100644 index 00000000000..400b225cf7b --- /dev/null +++ b/gcc/testsuite/go.test/test/rotate0.go @@ -0,0 +1,12 @@ +// runoutput ./rotate.go + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Generate test of bit rotations. +// The output is compiled and run. + +package main + +const mode = 0 diff --git a/gcc/testsuite/go.test/test/rotate1.go b/gcc/testsuite/go.test/test/rotate1.go new file mode 100644 index 00000000000..98b0b1c849e --- /dev/null +++ b/gcc/testsuite/go.test/test/rotate1.go @@ -0,0 +1,12 @@ +// runoutput ./rotate.go + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Generate test of bit rotations. +// The output is compiled and run. + +package main + +const mode = 1 diff --git a/gcc/testsuite/go.test/test/rotate2.go b/gcc/testsuite/go.test/test/rotate2.go new file mode 100644 index 00000000000..c50f8ce73bd --- /dev/null +++ b/gcc/testsuite/go.test/test/rotate2.go @@ -0,0 +1,12 @@ +// runoutput ./rotate.go + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Generate test of bit rotations. +// The output is compiled and run. + +package main + +const mode = 2 diff --git a/gcc/testsuite/go.test/test/rotate3.go b/gcc/testsuite/go.test/test/rotate3.go new file mode 100644 index 00000000000..73d47d8524c --- /dev/null +++ b/gcc/testsuite/go.test/test/rotate3.go @@ -0,0 +1,12 @@ +// runoutput ./rotate.go + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Generate test of bit rotations. +// The output is compiled and run. + +package main + +const mode = 3 diff --git a/gcc/testsuite/go.test/test/run.go b/gcc/testsuite/go.test/test/run.go index 10dbceff5d4..5e167d6b0cc 100644 --- a/gcc/testsuite/go.test/test/run.go +++ b/gcc/testsuite/go.test/test/run.go @@ -5,7 +5,7 @@ // license that can be found in the LICENSE file. // Run runs tests in the test directory. -// +// // TODO(bradfitz): docs of some sort, once we figure out how we're changing // headers of files package main @@ -30,10 +30,11 @@ import ( ) var ( - verbose = flag.Bool("v", false, "verbose. if set, parallelism is set to 1.") - numParallel = flag.Int("n", runtime.NumCPU(), "number of parallel tests to run") - summary = flag.Bool("summary", false, "show summary of results") - showSkips = flag.Bool("show_skips", false, "show skipped tests") + verbose = flag.Bool("v", false, "verbose. if set, parallelism is set to 1.") + numParallel = flag.Int("n", runtime.NumCPU(), "number of parallel tests to run") + summary = flag.Bool("summary", false, "show summary of results") + showSkips = flag.Bool("show_skips", false, "show skipped tests") + runoutputLimit = flag.Int("l", defaultRunOutputLimit(), "number of parallel runoutput tests to run") ) var ( @@ -53,6 +54,10 @@ var ( // toRun is the channel of tests to run. // It is nil until the first test is started. toRun chan *test + + // rungatec controls the max number of runoutput tests + // executed in parallel as they can each consume a lot of memory. + rungatec chan bool ) // maxTests is an upper bound on the total number of tests. @@ -68,6 +73,7 @@ func main() { } ratec = make(chan bool, *numParallel) + rungatec = make(chan bool, *runoutputLimit) var err error letter, err = build.ArchChar(build.Default.GOARCH) check(err) @@ -128,7 +134,7 @@ func main() { if !*verbose && test.err == nil { continue } - fmt.Printf("%-10s %-20s: %s\n", test.action, test.goFileName(), errStr) + fmt.Printf("%-20s %-20s: %s\n", test.action, test.goFileName(), errStr) } if *summary { @@ -165,6 +171,26 @@ func goFiles(dir string) []string { return names } +type runCmd func(...string) ([]byte, error) + +func compileFile(runcmd runCmd, longname string) (out []byte, err error) { + return runcmd("go", "tool", gc, "-e", longname) +} + +func compileInDir(runcmd runCmd, dir string, names ...string) (out []byte, err error) { + cmd := []string{"go", "tool", gc, "-e", "-D", ".", "-I", "."} + for _, name := range names { + cmd = append(cmd, filepath.Join(dir, name)) + } + return runcmd(cmd...) +} + +func linkFile(runcmd runCmd, goname string) (err error) { + pfile := strings.Replace(goname, ".go", "."+letter, -1) + _, err = runcmd("go", "tool", ld, "-o", "a.exe", "-L", ".", pfile) + return +} + // skipError describes why a test was skipped. type skipError string @@ -182,13 +208,13 @@ type test struct { donec chan bool // closed when done src string - action string // "compile", "build", "run", "errorcheck", "skip", "runoutput", "compiledir" + action string // "compile", "build", etc. tempDir string err error } -// startTest +// startTest func startTest(dir, gofile string) *test { t := &test{ dir: dir, @@ -230,6 +256,93 @@ func (t *test) goDirName() string { return filepath.Join(t.dir, strings.Replace(t.gofile, ".go", ".dir", -1)) } +func goDirFiles(longdir string) (filter []os.FileInfo, err error) { + files, dirErr := ioutil.ReadDir(longdir) + if dirErr != nil { + return nil, dirErr + } + for _, gofile := range files { + if filepath.Ext(gofile.Name()) == ".go" { + filter = append(filter, gofile) + } + } + return +} + +var packageRE = regexp.MustCompile(`(?m)^package (\w+)`) + +func goDirPackages(longdir string) ([][]string, error) { + files, err := goDirFiles(longdir) + if err != nil { + return nil, err + } + var pkgs [][]string + m := make(map[string]int) + for _, file := range files { + name := file.Name() + data, err := ioutil.ReadFile(filepath.Join(longdir, name)) + if err != nil { + return nil, err + } + pkgname := packageRE.FindStringSubmatch(string(data)) + if pkgname == nil { + return nil, fmt.Errorf("cannot find package name in %s", name) + } + i, ok := m[pkgname[1]] + if !ok { + i = len(pkgs) + pkgs = append(pkgs, nil) + m[pkgname[1]] = i + } + pkgs[i] = append(pkgs[i], name) + } + return pkgs, nil +} + +// shouldTest looks for build tags in a source file and returns +// whether the file should be used according to the tags. +func shouldTest(src string, goos, goarch string) (ok bool, whyNot string) { + if idx := strings.Index(src, "\npackage"); idx >= 0 { + src = src[:idx] + } + notgoos := "!" + goos + notgoarch := "!" + goarch + for _, line := range strings.Split(src, "\n") { + line = strings.TrimSpace(line) + if strings.HasPrefix(line, "//") { + line = line[2:] + } else { + continue + } + line = strings.TrimSpace(line) + if len(line) == 0 || line[0] != '+' { + continue + } + words := strings.Fields(line) + if words[0] == "+build" { + for _, word := range words { + switch word { + case goos, goarch: + return true, "" + case notgoos, notgoarch: + continue + default: + if word[0] == '!' { + // NOT something-else + return true, "" + } + } + } + // no matching tag found. + return false, line + } + } + // no build tags. + return true, "" +} + +func init() { checkShouldTest() } + // run runs a test. func (t *test) run() { defer close(t.donec) @@ -249,7 +362,18 @@ func (t *test) run() { t.err = errors.New("double newline not found") return } + if ok, why := shouldTest(t.src, runtime.GOOS, runtime.GOARCH); !ok { + t.action = "skip" + if *showSkips { + fmt.Printf("%-20s %-20s: %s\n", t.action, t.goFileName(), why) + } + return + } action := t.src[:pos] + if nl := strings.Index(action, "\n"); nl >= 0 && strings.Contains(action[:nl], "+build") { + // skip first line + action = action[nl+1:] + } if strings.HasPrefix(action, "//") { action = action[2:] } @@ -263,12 +387,15 @@ func (t *test) run() { } switch action { + case "rundircmpout": + action = "rundir" + t.action = "rundir" case "cmpout": action = "run" // the run case already looks for <dir>/<test>.out files fallthrough - case "compile", "compiledir", "build", "run", "runoutput": + case "compile", "compiledir", "build", "run", "runoutput", "rundir": t.action = action - case "errorcheck": + case "errorcheck", "errorcheckdir", "errorcheckoutput": t.action = action wantError = true for len(args) > 0 && strings.HasPrefix(args[0], "-") { @@ -306,8 +433,12 @@ func (t *test) run() { cmd.Stderr = &buf if useTmp { cmd.Dir = t.tempDir + cmd.Env = envForDir(cmd.Dir) } err := cmd.Run() + if err != nil { + err = fmt.Errorf("%s\n%s", err, buf.Bytes()) + } return buf.Bytes(), err } @@ -328,7 +459,7 @@ func (t *test) run() { } } else { if err != nil { - t.err = fmt.Errorf("%s\n%s", err, out) + t.err = err return } } @@ -336,66 +467,156 @@ func (t *test) run() { return case "compile": - out, err := runcmd("go", "tool", gc, "-e", "-o", "a."+letter, long) - if err != nil { - t.err = fmt.Errorf("%s\n%s", err, out) - } + _, t.err = compileFile(runcmd, long) case "compiledir": // Compile all files in the directory in lexicographic order. longdir := filepath.Join(cwd, t.goDirName()) - files, dirErr := ioutil.ReadDir(longdir) - if dirErr != nil { - t.err = dirErr + pkgs, err := goDirPackages(longdir) + if err != nil { + t.err = err return } - for _, gofile := range files { - if filepath.Ext(gofile.Name()) != ".go" { - continue + for _, gofiles := range pkgs { + _, t.err = compileInDir(runcmd, longdir, gofiles...) + if t.err != nil { + return } - afile := strings.Replace(gofile.Name(), ".go", "."+letter, -1) - out, err := runcmd("go", "tool", gc, "-e", "-D.", "-I.", "-o", afile, filepath.Join(longdir, gofile.Name())) - if err != nil { - t.err = fmt.Errorf("%s\n%s", err, out) + } + + case "errorcheckdir": + // errorcheck all files in lexicographic order + // useful for finding importing errors + longdir := filepath.Join(cwd, t.goDirName()) + pkgs, err := goDirPackages(longdir) + if err != nil { + t.err = err + return + } + for i, gofiles := range pkgs { + out, err := compileInDir(runcmd, longdir, gofiles...) + if i == len(pkgs)-1 { + if wantError && err == nil { + t.err = fmt.Errorf("compilation succeeded unexpectedly\n%s", out) + return + } else if !wantError && err != nil { + t.err = err + return + } + } else if err != nil { + t.err = err + return + } + var fullshort []string + for _, name := range gofiles { + fullshort = append(fullshort, filepath.Join(longdir, name), name) + } + t.err = t.errorCheck(string(out), fullshort...) + if t.err != nil { break } } + case "rundir": + // Compile all files in the directory in lexicographic order. + // then link as if the last file is the main package and run it + longdir := filepath.Join(cwd, t.goDirName()) + pkgs, err := goDirPackages(longdir) + if err != nil { + t.err = err + return + } + for i, gofiles := range pkgs { + _, err := compileInDir(runcmd, longdir, gofiles...) + if err != nil { + t.err = err + return + } + if i == len(pkgs)-1 { + err = linkFile(runcmd, gofiles[0]) + if err != nil { + t.err = err + return + } + out, err := runcmd(append([]string{filepath.Join(t.tempDir, "a.exe")}, args...)...) + if err != nil { + t.err = err + return + } + if strings.Replace(string(out), "\r\n", "\n", -1) != t.expectedOutput() { + t.err = fmt.Errorf("incorrect output\n%s", out) + } + } + } + case "build": - out, err := runcmd("go", "build", "-o", "a.exe", long) + _, err := runcmd("go", "build", "-o", "a.exe", long) if err != nil { - t.err = fmt.Errorf("%s\n%s", err, out) + t.err = err } case "run": useTmp = false out, err := runcmd(append([]string{"go", "run", t.goFileName()}, args...)...) if err != nil { - t.err = fmt.Errorf("%s\n%s", err, out) + t.err = err } if strings.Replace(string(out), "\r\n", "\n", -1) != t.expectedOutput() { t.err = fmt.Errorf("incorrect output\n%s", out) } case "runoutput": + rungatec <- true + defer func() { + <-rungatec + }() useTmp = false - out, err := runcmd("go", "run", t.goFileName()) + out, err := runcmd(append([]string{"go", "run", t.goFileName()}, args...)...) if err != nil { - t.err = fmt.Errorf("%s\n%s", err, out) + t.err = err } tfile := filepath.Join(t.tempDir, "tmp__.go") - err = ioutil.WriteFile(tfile, out, 0666) - if err != nil { + if err := ioutil.WriteFile(tfile, out, 0666); err != nil { t.err = fmt.Errorf("write tempfile:%s", err) return } out, err = runcmd("go", "run", tfile) if err != nil { - t.err = fmt.Errorf("%s\n%s", err, out) + t.err = err } if string(out) != t.expectedOutput() { t.err = fmt.Errorf("incorrect output\n%s", out) } + + case "errorcheckoutput": + useTmp = false + out, err := runcmd(append([]string{"go", "run", t.goFileName()}, args...)...) + if err != nil { + t.err = err + } + tfile := filepath.Join(t.tempDir, "tmp__.go") + err = ioutil.WriteFile(tfile, out, 0666) + if err != nil { + t.err = fmt.Errorf("write tempfile:%s", err) + return + } + cmdline := []string{"go", "tool", gc, "-e", "-o", "a." + letter} + cmdline = append(cmdline, flags...) + cmdline = append(cmdline, tfile) + out, err = runcmd(cmdline...) + if wantError { + if err == nil { + t.err = fmt.Errorf("compilation succeeded unexpectedly\n%s", out) + return + } + } else { + if err != nil { + t.err = err + return + } + } + t.err = t.errorCheck(string(out), tfile, "tmp__.go") + return } } @@ -417,7 +638,7 @@ func (t *test) expectedOutput() string { return string(b) } -func (t *test) errorCheck(outStr string, full, short string) (err error) { +func (t *test) errorCheck(outStr string, fullshort ...string) (err error) { defer func() { if *verbose && err != nil { log.Printf("%s gc output:\n%s", t, outStr) @@ -434,17 +655,28 @@ func (t *test) errorCheck(outStr string, full, short string) (err error) { } if strings.HasPrefix(line, "\t") { out[len(out)-1] += "\n" + line - } else { + } else if strings.HasPrefix(line, "go tool") { + continue + } else if strings.TrimSpace(line) != "" { out = append(out, line) } } // Cut directory name. for i := range out { - out[i] = strings.Replace(out[i], full, short, -1) + for j := 0; j < len(fullshort); j += 2 { + full, short := fullshort[j], fullshort[j+1] + out[i] = strings.Replace(out[i], full, short, -1) + } } - for _, we := range t.wantedErrors() { + var want []wantedError + for j := 0; j < len(fullshort); j += 2 { + full, short := fullshort[j], fullshort[j+1] + want = append(want, t.wantedErrors(full, short)...) + } + + for _, we := range want { var errmsgs []string errmsgs, out = partitionStrings(we.filterRe, out) if len(errmsgs) == 0 { @@ -452,6 +684,7 @@ func (t *test) errorCheck(outStr string, full, short string) (err error) { continue } matched := false + n := len(out) for _, errmsg := range errmsgs { if we.re.MatchString(errmsg) { matched = true @@ -460,11 +693,18 @@ func (t *test) errorCheck(outStr string, full, short string) (err error) { } } if !matched { - errs = append(errs, fmt.Errorf("%s:%d: no match for %q in%s", we.file, we.lineNum, we.reStr, strings.Join(out, "\n"))) + errs = append(errs, fmt.Errorf("%s:%d: no match for %#q in:\n\t%s", we.file, we.lineNum, we.reStr, strings.Join(out[n:], "\n\t"))) continue } } + if len(out) > 0 { + errs = append(errs, fmt.Errorf("Unmatched Errors:")) + for _, errLine := range out { + errs = append(errs, fmt.Errorf("%s", errLine)) + } + } + if len(errs) == 0 { return nil } @@ -505,8 +745,9 @@ var ( lineRx = regexp.MustCompile(`LINE(([+-])([0-9]+))?`) ) -func (t *test) wantedErrors() (errs []wantedError) { - for i, line := range strings.Split(t.src, "\n") { +func (t *test) wantedErrors(file, short string) (errs []wantedError) { + src, _ := ioutil.ReadFile(file) + for i, line := range strings.Split(string(src), "\n") { lineNum := i + 1 if strings.Contains(line, "////") { // double comment disables ERROR @@ -519,7 +760,7 @@ func (t *test) wantedErrors() (errs []wantedError) { all := m[1] mm := errQuotesRx.FindAllStringSubmatch(all, -1) if mm == nil { - log.Fatalf("invalid errchk line in %s: %s", t.goFileName(), line) + log.Fatalf("%s:%d: invalid errchk line: %s", t.goFileName(), lineNum, line) } for _, m := range mm { rx := lineRx.ReplaceAllStringFunc(m[1], func(m string) string { @@ -531,15 +772,19 @@ func (t *test) wantedErrors() (errs []wantedError) { delta, _ := strconv.Atoi(m[5:]) n -= delta } - return fmt.Sprintf("%s:%d", t.gofile, n) + return fmt.Sprintf("%s:%d", short, n) }) - filterPattern := fmt.Sprintf(`^(\w+/)?%s:%d[:[]`, t.gofile, lineNum) + re, err := regexp.Compile(rx) + if err != nil { + log.Fatalf("%s:%d: invalid regexp in ERROR line: %v", t.goFileName(), lineNum, err) + } + filterPattern := fmt.Sprintf(`^(\w+/)?%s:%d[:[]`, regexp.QuoteMeta(short), lineNum) errs = append(errs, wantedError{ reStr: rx, - re: regexp.MustCompile(rx), + re: re, filterRe: regexp.MustCompile(filterPattern), lineNum: lineNum, - file: t.gofile, + file: short, }) } } @@ -548,60 +793,56 @@ func (t *test) wantedErrors() (errs []wantedError) { } var skipOkay = map[string]bool{ - "args.go": true, - "ddd3.go": true, - "import3.go": true, - "import4.go": true, - "index.go": true, - "linkx.go": true, - "method4.go": true, - "nul1.go": true, - "rotate.go": true, - "sigchld.go": true, - "sinit.go": true, - "interface/embed1.go": true, - "interface/private.go": true, - "interface/recursive2.go": true, - "dwarf/main.go": true, - "dwarf/z1.go": true, - "dwarf/z10.go": true, - "dwarf/z11.go": true, - "dwarf/z12.go": true, - "dwarf/z13.go": true, - "dwarf/z14.go": true, - "dwarf/z15.go": true, - "dwarf/z16.go": true, - "dwarf/z17.go": true, - "dwarf/z18.go": true, - "dwarf/z19.go": true, - "dwarf/z2.go": true, - "dwarf/z20.go": true, - "dwarf/z3.go": true, - "dwarf/z4.go": true, - "dwarf/z5.go": true, - "dwarf/z6.go": true, - "dwarf/z7.go": true, - "dwarf/z8.go": true, - "dwarf/z9.go": true, - "fixedbugs/bug083.go": true, - "fixedbugs/bug133.go": true, - "fixedbugs/bug160.go": true, - "fixedbugs/bug191.go": true, - "fixedbugs/bug248.go": true, - "fixedbugs/bug302.go": true, - "fixedbugs/bug313.go": true, - "fixedbugs/bug322.go": true, - "fixedbugs/bug324.go": true, - "fixedbugs/bug345.go": true, - "fixedbugs/bug367.go": true, - "fixedbugs/bug369.go": true, - "fixedbugs/bug382.go": true, - "fixedbugs/bug385_32.go": true, - "fixedbugs/bug385_64.go": true, - "fixedbugs/bug414.go": true, - "fixedbugs/bug424.go": true, - "fixedbugs/bug429.go": true, - "fixedbugs/bug437.go": true, - "bugs/bug395.go": true, - "bugs/bug434.go": true, + "linkx.go": true, // like "run" but wants linker flags + "sinit.go": true, + "fixedbugs/bug248.go": true, // combines errorcheckdir and rundir in the same dir. + "fixedbugs/bug302.go": true, // tests both .$O and .a imports. + "fixedbugs/bug345.go": true, // needs the appropriate flags in gc invocation. + "fixedbugs/bug369.go": true, // needs compiler flags. + "fixedbugs/bug429.go": true, // like "run" but program should fail + "bugs/bug395.go": true, +} + +// defaultRunOutputLimit returns the number of runoutput tests that +// can be executed in parallel. +func defaultRunOutputLimit() int { + const maxArmCPU = 2 + + cpu := runtime.NumCPU() + if runtime.GOARCH == "arm" && cpu > maxArmCPU { + cpu = maxArmCPU + } + return cpu +} + +// checkShouldTest runs canity checks on the shouldTest function. +func checkShouldTest() { + assert := func(ok bool, _ string) { + if !ok { + panic("fail") + } + } + assertNot := func(ok bool, _ string) { assert(!ok, "") } + assert(shouldTest("// +build linux", "linux", "arm")) + assert(shouldTest("// +build !windows", "linux", "arm")) + assertNot(shouldTest("// +build !windows", "windows", "amd64")) + assertNot(shouldTest("// +build arm 386", "linux", "amd64")) + assert(shouldTest("// This is a test.", "os", "arch")) +} + +// envForDir returns a copy of the environment +// suitable for running in the given directory. +// The environment is the current process's environment +// but with an updated $PWD, so that an os.Getwd in the +// child will be faster. +func envForDir(dir string) []string { + env := os.Environ() + for i, kv := range env { + if strings.HasPrefix(kv, "PWD=") { + env[i] = "PWD=" + dir + return env + } + } + env = append(env, "PWD="+dir) + return env } diff --git a/gcc/testsuite/go.test/test/safe/nousesafe.go b/gcc/testsuite/go.test/test/safe/nousesafe.go index f61e7fe4f09..fcd25af3154 100644 --- a/gcc/testsuite/go.test/test/safe/nousesafe.go +++ b/gcc/testsuite/go.test/test/safe/nousesafe.go @@ -1,4 +1,4 @@ -// $G $D/pkg.go && pack grc pkg.a pkg.$A 2> /dev/null && rm pkg.$A && errchk $G -I. -u $D/main.go +// $G $D/pkg.go && pack grc pkg.a pkg.$A 2> /dev/null && rm pkg.$A && errchk $G -I . -u $D/main.go // rm -f pkg.a // Copyright 2012 The Go Authors. All rights reserved. diff --git a/gcc/testsuite/go.test/test/safe/usesafe.go b/gcc/testsuite/go.test/test/safe/usesafe.go index 07c13c1c3a1..5d0829e290b 100644 --- a/gcc/testsuite/go.test/test/safe/usesafe.go +++ b/gcc/testsuite/go.test/test/safe/usesafe.go @@ -1,4 +1,4 @@ -// $G $D/pkg.go && pack grcS pkg.a pkg.$A 2> /dev/null && rm pkg.$A && $G -I. -u $D/main.go +// $G $D/pkg.go && pack grcS pkg.a pkg.$A 2> /dev/null && rm pkg.$A && $G -I . -u $D/main.go // rm -f pkg.a // Copyright 2012 The Go Authors. All rights reserved. diff --git a/gcc/testsuite/go.test/test/sigchld.go b/gcc/testsuite/go.test/test/sigchld.go index c1cfc2a8d0c..a60d28deaab 100644 --- a/gcc/testsuite/go.test/test/sigchld.go +++ b/gcc/testsuite/go.test/test/sigchld.go @@ -1,8 +1,5 @@ -// [ "$GOOS" == windows ] || -// ($G $D/$F.go && $L $F.$A && ./$A.out 2>&1 | cmp - $D/$F.out) - -// NOTE: This test is not run by 'run.go' and so not run by all.bash. -// To run this test you must use the ./run shell script. +// +build !windows +// cmpout // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style diff --git a/gcc/testsuite/go.test/test/sinit.go b/gcc/testsuite/go.test/test/sinit.go index ffb8ef75110..5e50e1100a8 100644 --- a/gcc/testsuite/go.test/test/sinit.go +++ b/gcc/testsuite/go.test/test/sinit.go @@ -259,3 +259,13 @@ var copy_pt0a = pt0a var copy_pt0b = pt0b var copy_pt1 = pt1 var copy_pt1a = pt1a + +var _ interface{} = 1 + +type T1 int + +func (t *T1) M() {} + +type Mer interface { M() } + +var _ Mer = (*T1)(nil) diff --git a/gcc/testsuite/go.test/test/sizeof.go b/gcc/testsuite/go.test/test/sizeof.go index a6abdd5c657..9aa95677d47 100644 --- a/gcc/testsuite/go.test/test/sizeof.go +++ b/gcc/testsuite/go.test/test/sizeof.go @@ -4,8 +4,6 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Test unsafe.Sizeof, unsafe.Alignof, and unsafe.Offsetof all return uintptr. - package main import "unsafe" @@ -18,8 +16,143 @@ var t T func isUintptr(uintptr) {} +type T2 struct { + A int32 + U2 +} + +type U2 struct { + B int32 + C int32 +} + +var t2 T2 +var p2 *T2 + func main() { + // Test unsafe.Sizeof, unsafe.Alignof, and unsafe.Offsetof all return uintptr. isUintptr(unsafe.Sizeof(t)) isUintptr(unsafe.Alignof(t)) isUintptr(unsafe.Offsetof(t.X)) + + // Test correctness of Offsetof with respect to embedded fields (issue 4909). + if unsafe.Offsetof(t2.C) != 8 { + println(unsafe.Offsetof(t2.C), "!= 8") + panic("unsafe.Offsetof(t2.C) != 8") + } + if unsafe.Offsetof(p2.C) != 8 { + println(unsafe.Offsetof(p2.C), "!= 8") + panic("unsafe.Offsetof(p2.C) != 8") + } + if unsafe.Offsetof(t2.U2.C) != 4 { + println(unsafe.Offsetof(t2.U2.C), "!= 4") + panic("unsafe.Offsetof(t2.U2.C) != 4") + } + if unsafe.Offsetof(p2.U2.C) != 4 { + println(unsafe.Offsetof(p2.U2.C), "!= 4") + panic("unsafe.Offsetof(p2.U2.C) != 4") + } + testDeep() + testNotEmbedded() +} + +type ( + S1 struct { + A int32 + S2 + } + S2 struct { + B int32 + S3 + } + S3 struct { + C int32 + S4 + } + S4 struct { + D int32 + S5 + } + S5 struct { + E int32 + S6 + } + S6 struct { + F int32 + S7 + } + S7 struct { + G int32 + S8 + } + S8 struct { + H int32 + *S1 + } +) + +func testDeep() { + var s1 S1 + switch { + case unsafe.Offsetof(s1.A) != 0: + panic("unsafe.Offsetof(s1.A) != 0") + case unsafe.Offsetof(s1.B) != 4: + panic("unsafe.Offsetof(s1.B) != 4") + case unsafe.Offsetof(s1.C) != 8: + panic("unsafe.Offsetof(s1.C) != 8") + case unsafe.Offsetof(s1.D) != 12: + panic("unsafe.Offsetof(s1.D) != 12") + case unsafe.Offsetof(s1.E) != 16: + panic("unsafe.Offsetof(s1.E) != 16") + case unsafe.Offsetof(s1.F) != 20: + panic("unsafe.Offsetof(s1.F) != 20") + case unsafe.Offsetof(s1.G) != 24: + panic("unsafe.Offsetof(s1.G) != 24") + case unsafe.Offsetof(s1.H) != 28: + panic("unsafe.Offsetof(s1.H) != 28") + case unsafe.Offsetof(s1.S1) != 32: + panic("unsafe.Offsetof(s1.S1) != 32") + case unsafe.Offsetof(s1.S1.S2.S3.S4.S5.S6.S7.S8.S1.S2) != 4: + panic("unsafe.Offsetof(s1.S1.S2.S3.S4.S5.S6.S7.S8.S1.S2) != 4") + } +} + +func testNotEmbedded() { + type T2 struct { + B int32 + C int32 + } + type T1 struct { + A int32 + T2 + } + type T struct { + Dummy int32 + F T1 + P *T1 + } + + var t T + var p *T + switch { + case unsafe.Offsetof(t.F.B) != 4: + panic("unsafe.Offsetof(t.F.B) != 4") + case unsafe.Offsetof(t.F.C) != 8: + panic("unsafe.Offsetof(t.F.C) != 8") + + case unsafe.Offsetof(t.P.B) != 4: + panic("unsafe.Offsetof(t.P.B) != 4") + case unsafe.Offsetof(t.P.C) != 8: + panic("unsafe.Offsetof(t.P.C) != 8") + + case unsafe.Offsetof(p.F.B) != 4: + panic("unsafe.Offsetof(p.F.B) != 4") + case unsafe.Offsetof(p.F.C) != 8: + panic("unsafe.Offsetof(p.F.C) != 8") + + case unsafe.Offsetof(p.P.B) != 4: + panic("unsafe.Offsetof(p.P.B) != 4") + case unsafe.Offsetof(p.P.C) != 8: + panic("unsafe.Offsetof(p.P.C) != 8") + } } diff --git a/gcc/testsuite/go.test/test/stress/maps.go b/gcc/testsuite/go.test/test/stress/maps.go new file mode 100644 index 00000000000..d022e19ade0 --- /dev/null +++ b/gcc/testsuite/go.test/test/stress/maps.go @@ -0,0 +1,111 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "math/rand" + "runtime" + "sync" +) + +func mapTypes() []MapType { + // TODO(bradfitz): bunch more map types of all different key and value types. + // Use reflect.MapOf and a program to generate lots of types & struct types. + // For now, just one: + return []MapType{intMapType{}} +} + +type MapType interface { + NewMap() Map +} + +type Map interface { + AddItem() + DelItem() + Len() int + GetItem() + RangeAll() +} + +func stressMapType(mt MapType, done func()) { + defer done() + m := mt.NewMap() + for m.Len() < 10000 { + Println("map at ", m.Len()) + if m.Len()%100 == 0 { + runtime.Gosched() + } + m.AddItem() + m.AddItem() + m.DelItem() + var wg sync.WaitGroup + const numGets = 10 + wg.Add(numGets) + for i := 0; i < numGets; i++ { + go func(i int) { + if i&1 == 0 { + m.GetItem() + } else { + m.RangeAll() + } + wg.Done() + }(i) + } + wg.Wait() + } + for m.Len() > 0 { + m.DelItem() + } +} + +type intMapType struct{} + +func (intMapType) NewMap() Map { + return make(intMap) +} + +var deadcafe = []byte("\xDE\xAD\xCA\xFE") + +type intMap map[int][]byte + +func (m intMap) AddItem() { + s0 := len(m) + for len(m) == s0 { + key := rand.Intn(s0 + 1) + m[key] = make([]byte, rand.Intn(64<<10)) + } +} + +func (m intMap) DelItem() { + for k := range m { + delete(m, k) + return + } +} + +func (m intMap) GetItem() { + key := rand.Intn(len(m)) + if s, ok := m[key]; ok { + copy(s, deadcafe) + } +} + +func (m intMap) Len() int { return len(m) } + +func (m intMap) RangeAll() { + for _ = range m { + } +} + +func stressMaps() { + for { + var wg sync.WaitGroup + for _, mt := range mapTypes() { + wg.Add(1) + go stressMapType(mt, wg.Done) + } + wg.Wait() + } +} diff --git a/gcc/testsuite/go.test/test/stress/parsego.go b/gcc/testsuite/go.test/test/stress/parsego.go new file mode 100644 index 00000000000..a781f19937b --- /dev/null +++ b/gcc/testsuite/go.test/test/stress/parsego.go @@ -0,0 +1,220 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "go/ast" + "go/parser" + "go/token" + "os" + "path" + "runtime" + "strings" +) + +func isGoFile(dir os.FileInfo) bool { + return !dir.IsDir() && + !strings.HasPrefix(dir.Name(), ".") && // ignore .files + path.Ext(dir.Name()) == ".go" +} + +func isPkgFile(dir os.FileInfo) bool { + return isGoFile(dir) && + !strings.HasSuffix(dir.Name(), "_test.go") // ignore test files +} + +func pkgName(filename string) string { + file, err := parser.ParseFile(token.NewFileSet(), filename, nil, parser.PackageClauseOnly) + if err != nil || file == nil { + return "" + } + return file.Name.Name +} + +func parseDir(dirpath string) map[string]*ast.Package { + // the package name is the directory name within its parent. + // (use dirname instead of path because dirname is clean; it + // has no trailing '/') + _, pkgname := path.Split(dirpath) + + // filter function to select the desired .go files + filter := func(d os.FileInfo) bool { + if isPkgFile(d) { + // Some directories contain main packages: Only accept + // files that belong to the expected package so that + // parser.ParsePackage doesn't return "multiple packages + // found" errors. + // Additionally, accept the special package name + // fakePkgName if we are looking at cmd documentation. + name := pkgName(dirpath + "/" + d.Name()) + return name == pkgname + } + return false + } + + // get package AST + pkgs, err := parser.ParseDir(token.NewFileSet(), dirpath, filter, parser.ParseComments) + if err != nil { + println("parse", dirpath, err.Error()) + panic("go ParseDir fail: " + err.Error()) + } + return pkgs +} + +func stressParseGo() { + pkgroot := runtime.GOROOT() + "/src/pkg/" + for { + m := make(map[string]map[string]*ast.Package) + for _, pkg := range packages { + m[pkg] = parseDir(pkgroot + pkg) + Println("parsed go package", pkg) + } + } +} + +// find . -type d -not -path "./exp" -not -path "./exp/*" -printf "\t\"%p\",\n" | sort | sed "s/\.\///" | grep -v testdata +var packages = []string{ + "archive", + "archive/tar", + "archive/zip", + "bufio", + "builtin", + "bytes", + "compress", + "compress/bzip2", + "compress/flate", + "compress/gzip", + "compress/lzw", + "compress/zlib", + "container", + "container/heap", + "container/list", + "container/ring", + "crypto", + "crypto/aes", + "crypto/cipher", + "crypto/des", + "crypto/dsa", + "crypto/ecdsa", + "crypto/elliptic", + "crypto/hmac", + "crypto/md5", + "crypto/rand", + "crypto/rc4", + "crypto/rsa", + "crypto/sha1", + "crypto/sha256", + "crypto/sha512", + "crypto/subtle", + "crypto/tls", + "crypto/x509", + "crypto/x509/pkix", + "database", + "database/sql", + "database/sql/driver", + "debug", + "debug/dwarf", + "debug/elf", + "debug/gosym", + "debug/macho", + "debug/pe", + "encoding", + "encoding/ascii85", + "encoding/asn1", + "encoding/base32", + "encoding/base64", + "encoding/binary", + "encoding/csv", + "encoding/gob", + "encoding/hex", + "encoding/json", + "encoding/pem", + "encoding/xml", + "errors", + "expvar", + "flag", + "fmt", + "go", + "go/ast", + "go/build", + "go/doc", + "go/format", + "go/parser", + "go/printer", + "go/scanner", + "go/token", + "hash", + "hash/adler32", + "hash/crc32", + "hash/crc64", + "hash/fnv", + "html", + "html/template", + "image", + "image/color", + "image/draw", + "image/gif", + "image/jpeg", + "image/png", + "index", + "index/suffixarray", + "io", + "io/ioutil", + "log", + "log/syslog", + "math", + "math/big", + "math/cmplx", + "math/rand", + "mime", + "mime/multipart", + "net", + "net/http", + "net/http/cgi", + "net/http/cookiejar", + "net/http/fcgi", + "net/http/httptest", + "net/http/httputil", + "net/http/pprof", + "net/mail", + "net/rpc", + "net/rpc/jsonrpc", + "net/smtp", + "net/textproto", + "net/url", + "os", + "os/exec", + "os/signal", + "os/user", + "path", + "path/filepath", + "reflect", + "regexp", + "regexp/syntax", + "runtime", + "runtime/cgo", + "runtime/debug", + "runtime/pprof", + "runtime/race", + "sort", + "strconv", + "strings", + "sync", + "sync/atomic", + "syscall", + "testing", + "testing/iotest", + "testing/quick", + "text", + "text/scanner", + "text/tabwriter", + "text/template", + "text/template/parse", + "time", + "unicode", + "unicode/utf16", + "unicode/utf8", + "unsafe", +} diff --git a/gcc/testsuite/go.test/test/stress/runstress.go b/gcc/testsuite/go.test/test/stress/runstress.go new file mode 100644 index 00000000000..b5adf6a4a56 --- /dev/null +++ b/gcc/testsuite/go.test/test/stress/runstress.go @@ -0,0 +1,164 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// The runstress tool stresses the runtime. +// +// It runs forever and should never fail. It tries to stress the garbage collector, +// maps, channels, the network, and everything else provided by the runtime. +package main + +import ( + "flag" + "fmt" + "io" + "io/ioutil" + "log" + "math/rand" + "net" + "net/http" + "net/http/httptest" + "os/exec" + "strconv" + "time" +) + +var ( + v = flag.Bool("v", false, "verbose") + doMaps = flag.Bool("maps", true, "stress maps") + doExec = flag.Bool("exec", true, "stress exec") + doChan = flag.Bool("chan", true, "stress channels") + doNet = flag.Bool("net", true, "stress networking") + doParseGo = flag.Bool("parsego", true, "stress parsing Go (generates garbage)") +) + +func Println(a ...interface{}) { + if *v { + log.Println(a...) + } +} + +func dialStress(a net.Addr) { + for { + d := net.Dialer{Timeout: time.Duration(rand.Intn(1e9))} + c, err := d.Dial("tcp", a.String()) + if err == nil { + Println("did dial") + go func() { + time.Sleep(time.Duration(rand.Intn(500)) * time.Millisecond) + c.Close() + Println("closed dial") + }() + } + // Don't run out of ephermeral ports too quickly: + time.Sleep(250 * time.Millisecond) + } +} + +func stressNet() { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + size, _ := strconv.Atoi(r.FormValue("size")) + w.Write(make([]byte, size)) + })) + go dialStress(ts.Listener.Addr()) + for { + size := rand.Intn(128 << 10) + res, err := http.Get(fmt.Sprintf("%s/?size=%d", ts.URL, size)) + if err != nil { + log.Fatalf("stressNet: http Get error: %v", err) + } + if res.StatusCode != 200 { + log.Fatalf("stressNet: Status code = %d", res.StatusCode) + } + n, err := io.Copy(ioutil.Discard, res.Body) + if err != nil { + log.Fatalf("stressNet: io.Copy: %v", err) + } + if n != int64(size) { + log.Fatalf("stressNet: copied = %d; want %d", n, size) + } + res.Body.Close() + Println("did http", size) + } +} + +func doAnExec() { + exit := rand.Intn(2) + wantOutput := fmt.Sprintf("output-%d", rand.Intn(1e9)) + cmd := exec.Command("/bin/sh", "-c", fmt.Sprintf("echo %s; exit %d", wantOutput, exit)) + out, err := cmd.CombinedOutput() + if exit == 1 { + if err == nil { + log.Fatal("stressExec: unexpected exec success") + } + return + } + if err != nil { + log.Fatalf("stressExec: exec failure: %v: %s", err, out) + } + wantOutput += "\n" + if string(out) != wantOutput { + log.Fatalf("stressExec: exec output = %q; want %q", out, wantOutput) + } + Println("did exec") +} + +func stressExec() { + gate := make(chan bool, 10) // max execs at once + for { + gate <- true + go func() { + doAnExec() + <-gate + }() + } +} + +func ringf(in <-chan int, out chan<- int, donec chan<- bool) { + for { + n := <-in + if n == 0 { + donec <- true + return + } + out <- n - 1 + } +} + +func threadRing(bufsize int) { + const N = 100 + donec := make(chan bool) + one := make(chan int, bufsize) // will be input to thread 1 + var in, out chan int = nil, one + for i := 1; i <= N-1; i++ { + in, out = out, make(chan int, bufsize) + go ringf(in, out, donec) + } + go ringf(out, one, donec) + one <- N + <-donec + Println("did threadring of", bufsize) +} + +func stressChannels() { + for { + threadRing(0) + threadRing(1) + } +} + +func main() { + flag.Parse() + for want, f := range map[*bool]func(){ + doMaps: stressMaps, + doNet: stressNet, + doExec: stressExec, + doChan: stressChannels, + doParseGo: stressParseGo, + } { + if *want { + go f() + } + } + select {} +} diff --git a/gcc/testsuite/go.test/test/string_lit.go b/gcc/testsuite/go.test/test/string_lit.go index 457faaa88cd..fea6f553d10 100644 --- a/gcc/testsuite/go.test/test/string_lit.go +++ b/gcc/testsuite/go.test/test/string_lit.go @@ -33,6 +33,7 @@ func assert(a, b, c string) { print("\ta[", i, "] = ", ac, "; b[", i, "] =", bc, "\n") } } + panic("string_lit") } } @@ -110,7 +111,7 @@ func main() { r = -1 s = string(r) assert(s, "\xef\xbf\xbd", "negative rune") - + // the large rune tests again, this time using constants instead of a variable. // these conversions will be done at compile time. s = string(0x10ffff) // largest rune value diff --git a/gcc/testsuite/go.test/test/switch.go b/gcc/testsuite/go.test/test/switch.go index fd8748b9bce..5e1d85bb687 100644 --- a/gcc/testsuite/go.test/test/switch.go +++ b/gcc/testsuite/go.test/test/switch.go @@ -305,11 +305,40 @@ func main() { assert(false, "i should be true") } + // switch on interface with constant cases differing by type. + // was rejected by compiler: see issue 4781 + type T int + type B bool + type F float64 + type S string + switch i := interface{}(float64(1.0)); i { + case nil: + assert(false, "i should be float64(1.0)") + case (*int)(nil): + assert(false, "i should be float64(1.0)") + case 1: + assert(false, "i should be float64(1.0)") + case T(1): + assert(false, "i should be float64(1.0)") + case F(1.0): + assert(false, "i should be float64(1.0)") + case 1.0: + assert(true, "true") + case "hello": + assert(false, "i should be float64(1.0)") + case S("hello"): + assert(false, "i should be float64(1.0)") + case true, B(false): + assert(false, "i should be float64(1.0)") + case false, B(true): + assert(false, "i should be float64(1.0)") + } + // switch on array. switch ar := [3]int{1, 2, 3}; ar { - case [3]int{1,2,3}: + case [3]int{1, 2, 3}: assert(true, "[1 2 3]") - case [3]int{4,5,6}: + case [3]int{4, 5, 6}: assert(false, "ar should be [1 2 3]") default: assert(false, "ar should be [1 2 3]") @@ -327,12 +356,48 @@ func main() { assert(false, "c1 did not match itself") } + // empty switch + switch { + } + + // empty switch with default case. + fired = false + switch { + default: + fired = true + } + assert(fired, "fail") + + // Default and fallthrough. + count = 0 + switch { + default: + count++ + fallthrough + case false: + count++ + } + assert(count == 2, "fail") + + // fallthrough to default, which is not at end. + count = 0 + switch i5 { + case 5: + count++ + fallthrough + default: + count++ + case 6: + count++ + } + assert(count == 2, "fail") + i := 0 switch x := 5; { - case i < x: - os.Exit(0) - case i == x: - case i > x: - os.Exit(1) + case i < x: + os.Exit(0) + case i == x: + case i > x: + os.Exit(1) } } diff --git a/gcc/testsuite/go.test/test/switch4.go b/gcc/testsuite/go.test/test/switch4.go new file mode 100644 index 00000000000..f38efe68c6e --- /dev/null +++ b/gcc/testsuite/go.test/test/switch4.go @@ -0,0 +1,36 @@ +// errorcheck + +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Verify that erroneous switch statements are detected by the compiler. +// Does not compile. + +package main + +type I interface { + M() +} + +func bad() { + + i5 := 5 + switch i5 { + case 5: + fallthrough // ERROR "cannot fallthrough final case in switch" + } +} + +func good() { + var i interface{} + var s string + + switch i { + case s: + } + + switch s { + case i: + } +} diff --git a/gcc/testsuite/go.test/test/testlib b/gcc/testsuite/go.test/test/testlib index 29de7672ce1..de138b1d19d 100644 --- a/gcc/testsuite/go.test/test/testlib +++ b/gcc/testsuite/go.test/test/testlib @@ -5,23 +5,101 @@ # These function names are also known to # (and are the plan for transitioning to) run.go. +# helper (not known to run.go) +# group file list by packages and return list of packages +# each package is a comma-separated list of go files. +pkgs() { + pkglist=$(grep -h '^package ' $* | awk '{print $2}' | sort -u) + for p in $pkglist + do + echo $(grep -l "^package $p\$" $*) | tr ' ' , + done | sort +} + +# +build aborts execution if the supplied tags don't match, +# i.e. none of the tags (x or !x) matches GOARCH or GOOS. ++build() { + if (( $# == 0 )); then + return + fi + for tag; do + case $tag in + $GOARCH|$GOOS) + #echo >&2 "match $tag in $1" + return # don't exclude. + ;; + '!'$GOARCH|'!'$GOOS) + ;; + '!'*) + # not x where x is neither GOOS nor GOARCH. + #echo >&2 "match $tag in $1" + return # don't exclude + ;; + esac + done + # no match. + exit 0 +} + compile() { $G $D/$F.go } compiledir() { - for gofile in $D/$F.dir/*.go + for pkg in $(pkgs $D/$F.dir/*.go) + do + $G -I . $(echo $pkg | tr , ' ') || return 1 + done +} + +errorcheckdir() { + lastzero="" + if [ "$1" = "-0" ]; then + lastzero="-0" + fi + pkgs=$(pkgs $D/$F.dir/*.go) + for pkg in $pkgs.last do - $G -I. "$gofile" || return 1 + zero="-0" + case $pkg in + *.last) + pkg=$(echo $pkg |sed 's/\.last$//') + zero=$lastzero + esac + errchk $zero $G -D . -I . -e $(echo $pkg | tr , ' ') done } +rundir() { + lastfile="" + for pkg in $(pkgs $D/$F.dir/*.go) + do + name=$(echo $pkg | sed 's/\.go.*//; s/.*\///') + $G -D . -I . -e $(echo $pkg | tr , ' ') || return 1 + lastfile=$name + done + $L -o $A.out -L . $lastfile.$A + ./$A.out +} + +rundircmpout() { + lastfile="" + for pkg in $(pkgs $D/$F.dir/*.go) + do + name=$(echo $pkg | sed 's/\.go.*//; s/.*\///') + $G -D . -I . -e $(echo $pkg | tr , ' ') || return 1 + lastfile=$name + done + $L -o $A.out -L . $lastfile.$A + ./$A.out 2>&1 | cmp - $D/$F.out +} + build() { $G $D/$F.go && $L $F.$A } runoutput() { - go run "$D/$F.go" > tmp.go + go run "$D/$F.go" "$@" > tmp.go go run tmp.go } @@ -56,6 +134,16 @@ errorcheck() { errchk $zero $G -e $* $D/$F.go } +errorcheckoutput() { + zero="" + if [ "$1" = "-0" ]; then + zero="-0" + shift + fi + go run "$D/$F.go" "$@" > tmp.go + errchk $zero $G -e tmp.go +} + skip() { true } diff --git a/gcc/testsuite/go.test/test/torture.go b/gcc/testsuite/go.test/test/torture.go new file mode 100644 index 00000000000..bbf6d347d99 --- /dev/null +++ b/gcc/testsuite/go.test/test/torture.go @@ -0,0 +1,339 @@ +// compile + +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Various tests for expressions with high complexity. + +package main + +// Concatenate 16 4-bit integers into a 64-bit number. +func concat(s *[16]byte) uint64 { + r := (((((((((((((((uint64(s[0])<<4| + uint64(s[1]))<<4| + uint64(s[2]))<<4| + uint64(s[3]))<<4| + uint64(s[4]))<<4| + uint64(s[5]))<<4| + uint64(s[6]))<<4| + uint64(s[7]))<<4| + uint64(s[8]))<<4| + uint64(s[9]))<<4| + uint64(s[10]))<<4| + uint64(s[11]))<<4| + uint64(s[12]))<<4| + uint64(s[13]))<<4| + uint64(s[14]))<<4 | + uint64(s[15])) + return r +} + +// Compute the determinant of a 4x4-matrix by the sum +// over all index permutations. +func determinant(m [4][4]float64) float64 { + return m[0][0]*m[1][1]*m[2][2]*m[3][3] - + m[0][0]*m[1][1]*m[2][3]*m[3][2] - + m[0][0]*m[1][2]*m[2][1]*m[3][3] + + m[0][0]*m[1][2]*m[2][3]*m[3][1] + + m[0][0]*m[1][3]*m[2][1]*m[3][2] - + m[0][0]*m[1][3]*m[2][2]*m[3][1] - + m[0][1]*m[1][0]*m[2][2]*m[3][3] + + m[0][1]*m[1][0]*m[2][3]*m[3][2] + + m[0][1]*m[1][2]*m[2][0]*m[3][3] - + m[0][1]*m[1][2]*m[2][3]*m[3][0] - + m[0][1]*m[1][3]*m[2][0]*m[3][2] + + m[0][1]*m[1][3]*m[2][2]*m[3][0] + + m[0][2]*m[1][0]*m[2][1]*m[3][3] - + m[0][2]*m[1][0]*m[2][3]*m[3][1] - + m[0][2]*m[1][1]*m[2][0]*m[3][3] + + m[0][2]*m[1][1]*m[2][3]*m[3][0] + + m[0][2]*m[1][3]*m[2][0]*m[3][1] - + m[0][2]*m[1][3]*m[2][1]*m[3][0] - + m[0][3]*m[1][0]*m[2][1]*m[3][2] + + m[0][3]*m[1][0]*m[2][2]*m[3][1] + + m[0][3]*m[1][1]*m[2][0]*m[3][2] - + m[0][3]*m[1][1]*m[2][2]*m[3][0] - + m[0][3]*m[1][2]*m[2][0]*m[3][1] + + m[0][3]*m[1][2]*m[2][1]*m[3][0] +} + +// Compute the determinant of a 4x4-matrix by the sum +// over all index permutations. +func determinantInt(m [4][4]int) int { + return m[0][0]*m[1][1]*m[2][2]*m[3][3] - + m[0][0]*m[1][1]*m[2][3]*m[3][2] - + m[0][0]*m[1][2]*m[2][1]*m[3][3] + + m[0][0]*m[1][2]*m[2][3]*m[3][1] + + m[0][0]*m[1][3]*m[2][1]*m[3][2] - + m[0][0]*m[1][3]*m[2][2]*m[3][1] - + m[0][1]*m[1][0]*m[2][2]*m[3][3] + + m[0][1]*m[1][0]*m[2][3]*m[3][2] + + m[0][1]*m[1][2]*m[2][0]*m[3][3] - + m[0][1]*m[1][2]*m[2][3]*m[3][0] - + m[0][1]*m[1][3]*m[2][0]*m[3][2] + + m[0][1]*m[1][3]*m[2][2]*m[3][0] + + m[0][2]*m[1][0]*m[2][1]*m[3][3] - + m[0][2]*m[1][0]*m[2][3]*m[3][1] - + m[0][2]*m[1][1]*m[2][0]*m[3][3] + + m[0][2]*m[1][1]*m[2][3]*m[3][0] + + m[0][2]*m[1][3]*m[2][0]*m[3][1] - + m[0][2]*m[1][3]*m[2][1]*m[3][0] - + m[0][3]*m[1][0]*m[2][1]*m[3][2] + + m[0][3]*m[1][0]*m[2][2]*m[3][1] + + m[0][3]*m[1][1]*m[2][0]*m[3][2] - + m[0][3]*m[1][1]*m[2][2]*m[3][0] - + m[0][3]*m[1][2]*m[2][0]*m[3][1] + + m[0][3]*m[1][2]*m[2][1]*m[3][0] +} + +// Compute the determinant of a 4x4-matrix by the sum +// over all index permutations. +func determinantByte(m [4][4]byte) byte { + return m[0][0]*m[1][1]*m[2][2]*m[3][3] - + m[0][0]*m[1][1]*m[2][3]*m[3][2] - + m[0][0]*m[1][2]*m[2][1]*m[3][3] + + m[0][0]*m[1][2]*m[2][3]*m[3][1] + + m[0][0]*m[1][3]*m[2][1]*m[3][2] - + m[0][0]*m[1][3]*m[2][2]*m[3][1] - + m[0][1]*m[1][0]*m[2][2]*m[3][3] + + m[0][1]*m[1][0]*m[2][3]*m[3][2] + + m[0][1]*m[1][2]*m[2][0]*m[3][3] - + m[0][1]*m[1][2]*m[2][3]*m[3][0] - + m[0][1]*m[1][3]*m[2][0]*m[3][2] + + m[0][1]*m[1][3]*m[2][2]*m[3][0] + + m[0][2]*m[1][0]*m[2][1]*m[3][3] - + m[0][2]*m[1][0]*m[2][3]*m[3][1] - + m[0][2]*m[1][1]*m[2][0]*m[3][3] + + m[0][2]*m[1][1]*m[2][3]*m[3][0] + + m[0][2]*m[1][3]*m[2][0]*m[3][1] - + m[0][2]*m[1][3]*m[2][1]*m[3][0] - + m[0][3]*m[1][0]*m[2][1]*m[3][2] + + m[0][3]*m[1][0]*m[2][2]*m[3][1] + + m[0][3]*m[1][1]*m[2][0]*m[3][2] - + m[0][3]*m[1][1]*m[2][2]*m[3][0] - + m[0][3]*m[1][2]*m[2][0]*m[3][1] + + m[0][3]*m[1][2]*m[2][1]*m[3][0] +} + +type A []A + +// A sequence of constant indexings. +func IndexChain1(s A) A { + return s[0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0] +} + +// A sequence of non-constant indexings. +func IndexChain2(s A, i int) A { + return s[i][i][i][i][i][i][i][i][i][i][i][i][i][i][i][i] +} + +// Another sequence of indexings. +func IndexChain3(s []int) int { + return s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[s[0]]]]]]]]]]]]]]]]]]]]] +} + +// A right-leaning tree of byte multiplications. +func righttree(a, b, c, d uint8) uint8 { + return a * (b * (c * (d * + (a * (b * (c * (d * + (a * (b * (c * (d * + (a * (b * (c * (d * + (a * (b * (c * (d * + a * (b * (c * d))))))))))))))))))))) + +} + +// A left-leaning tree of byte multiplications. +func lefttree(a, b, c, d uint8) uint8 { + return ((((((((((((((((((a * b) * c) * d * + a) * b) * c) * d * + a) * b) * c) * d * + a) * b) * c) * d * + a) * b) * c) * d * + a) * b) * c) * d) +} + +type T struct { + Next I +} + +type I interface{} + +// A chains of type assertions. +func ChainT(t *T) *T { + return t. + Next.(*T). + Next.(*T). + Next.(*T). + Next.(*T). + Next.(*T). + Next.(*T). + Next.(*T). + Next.(*T). + Next.(*T). + Next.(*T). + Next.(*T). + Next.(*T). + Next.(*T). + Next.(*T). + Next.(*T). + Next.(*T). + Next.(*T). + Next.(*T). + Next.(*T). + Next.(*T) +} + +type U struct { + Children []J +} + +func (u *U) Child(n int) J { return u.Children[n] } + +type J interface { + Child(n int) J +} + +func ChainUAssert(u *U) *U { + return u.Child(0).(*U). + Child(0).(*U). + Child(0).(*U). + Child(0).(*U). + Child(0).(*U). + Child(0).(*U). + Child(0).(*U). + Child(0).(*U). + Child(0).(*U). + Child(0).(*U). + Child(0).(*U). + Child(0).(*U). + Child(0).(*U). + Child(0).(*U). + Child(0).(*U). + Child(0).(*U). + Child(0).(*U). + Child(0).(*U). + Child(0).(*U). + Child(0).(*U). + Child(0).(*U). + Child(0).(*U) +} + +func ChainUNoAssert(u *U) *U { + return u.Child(0). + Child(0). + Child(0). + Child(0). + Child(0). + Child(0). + Child(0). + Child(0). + Child(0). + Child(0). + Child(0). + Child(0). + Child(0). + Child(0). + Child(0). + Child(0). + Child(0). + Child(0). + Child(0). + Child(0). + Child(0). + Child(0).(*U) +} + +// Type assertions and slice indexing. See issue 4207. +func ChainAssertIndex(u *U) J { + return u. + Children[0].(*U). + Children[0].(*U). + Children[0].(*U). + Children[0].(*U). + Children[0].(*U). + Children[0].(*U). + Children[0].(*U). + Children[0].(*U). + Children[0].(*U). + Children[0].(*U). + Children[0].(*U). + Children[0].(*U). + Children[0].(*U). + Children[0] +} + +type UArr struct { + Children [2]J +} + +func (u *UArr) Child(n int) J { return u.Children[n] } + +func ChainAssertArrayIndex(u *UArr) J { + return u. + Children[0].(*UArr). + Children[0].(*UArr). + Children[0].(*UArr). + Children[0].(*UArr). + Children[0].(*UArr). + Children[0].(*UArr). + Children[0].(*UArr). + Children[0].(*UArr). + Children[0].(*UArr). + Children[0].(*UArr). + Children[0].(*UArr). + Children[0].(*UArr). + Children[0].(*UArr). + Children[0] +} + +type UArrPtr struct { + Children *[2]J +} + +func (u *UArrPtr) Child(n int) J { return u.Children[n] } + +func ChainAssertArrayptrIndex(u *UArrPtr) J { + return u. + Children[0].(*UArrPtr). + Children[0].(*UArrPtr). + Children[0].(*UArrPtr). + Children[0].(*UArrPtr). + Children[0].(*UArrPtr). + Children[0].(*UArrPtr). + Children[0].(*UArrPtr). + Children[0].(*UArrPtr). + Children[0].(*UArrPtr). + Children[0].(*UArrPtr). + Children[0].(*UArrPtr). + Children[0].(*UArrPtr). + Children[0].(*UArrPtr). + Children[0] +} + +// Chains of divisions. See issue 4201. + +func ChainDiv(a, b int) int { + return a / b / a / b / a / b / a / b / + a / b / a / b / a / b / a / b / + a / b / a / b / a / b / a / b +} + +func ChainDivRight(a, b int) int { + return a / (b / (a / (b / + (a / (b / (a / (b / + (a / (b / (a / (b / + (a / (b / (a / (b / + (a / (b / (a / b)))))))))))))))))) +} + +func ChainDivConst(a int) int { + return a / 17 / 17 / 17 / + 17 / 17 / 17 / 17 / + 17 / 17 / 17 / 17 +} + +func ChainMulBytes(a, b, c byte) byte { + return a*(a*(a*(a*(a*(a*(a*(a*(a*b+c)+c)+c)+c)+c)+c)+c)+c) + c +} diff --git a/gcc/testsuite/go.test/test/typecheck.go b/gcc/testsuite/go.test/test/typecheck.go new file mode 100644 index 00000000000..a2ad91ff4c3 --- /dev/null +++ b/gcc/testsuite/go.test/test/typecheck.go @@ -0,0 +1,18 @@ +// errorcheck + +// Verify that the Go compiler will not +// die after running into an undefined +// type in the argument list for a +// function. +// Does not compile. + +package main + +func mine(int b) int { // ERROR "undefined.*b" + return b + 2 // ERROR "undefined.*b" +} + +func main() { + mine() // GCCGO_ERROR "not enough arguments" + c = mine() // ERROR "undefined.*c|not enough arguments" "cannot assign to c" +} diff --git a/gcc/testsuite/go.test/test/zerodivide.go b/gcc/testsuite/go.test/test/zerodivide.go index 673d1d18d81..9ab27135359 100644 --- a/gcc/testsuite/go.test/test/zerodivide.go +++ b/gcc/testsuite/go.test/test/zerodivide.go @@ -237,4 +237,7 @@ func main() { fmt.Printf("%v/%v: expected %g error; got %g\n", t.f, t.g, t.out, x) } } + if bad { + panic("zerodivide") + } } diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp index e6e9d7795f0..8701cf6c21d 100644 --- a/gcc/testsuite/lib/target-supports.exp +++ b/gcc/testsuite/lib/target-supports.exp @@ -494,13 +494,6 @@ proc check_profiling_available { test_what } { return 0 } - # We don't yet support profiling for AArch64. - if { [istarget aarch64*-*-*] - && ([lindex $test_what 1] == "-p" - || [lindex $test_what 1] == "-pg") } { - return 0 - } - # cygwin does not support -p. if { [istarget *-*-cygwin*] && $test_what == "-p" } { return 0 @@ -1758,6 +1751,13 @@ proc check_effective_target_int32plus { } { # options, 0 otherwise. proc check_effective_target_ptr32plus { } { + # The msp430 has 16-bit or 20-bit pointers. The 20-bit pointer is stored + # in a 32-bit slot when in memory, so sizeof(void *) returns 4, but it + # cannot really hold a 32-bit address, so we always return false here. + if { [istarget msp430-*-*] } { + return 0 + } + return [check_no_compiler_messages ptr32plus object { int dummy[sizeof (void *) >= 4 ? 1 : -1]; }] @@ -2467,6 +2467,11 @@ proc check_effective_target_arm_fp16_ok_nocache { } { # Must generate floating-point instructions. return 0 } + if [check_effective_target_arm_hf_eabi] { + # Use existing float-abi and force an fpu which supports fp16 + set et_arm_fp16_flags "-mfpu=vfpv4" + return 1; + } if [check-flags [list "" { *-*-* } { "-mfpu=*" } { "" } ]] { # The existing -mfpu value is OK; use it, but add softfp. set et_arm_fp16_flags "-mfloat-abi=softfp" @@ -2599,6 +2604,17 @@ proc check_effective_target_arm_thumb2 { } { } ""] } +# Return 1 if this is an ARM target where conditional execution is available. + +proc check_effective_target_arm_cond_exec { } { + return [check_no_compiler_messages arm_cond_exec assembly { + #if defined(__arm__) && defined(__thumb__) && !defined(__thumb2__) + #error FOO + #endif + int i; + } ""] +} + # Return 1 if this is an ARM cortex-M profile cpu proc check_effective_target_arm_cortex_m { } { @@ -4497,6 +4513,7 @@ proc check_effective_target_sync_int_128_runtime { } { proc check_effective_target_sync_long_long { } { if { [istarget x86_64-*-*] || [istarget i?86-*-*]) + || [istarget aarch64*-*-*] || [istarget arm*-*-*] || [istarget alpha*-*-*] || ([istarget sparc*-*-*] && [check_effective_target_lp64]) } { @@ -4526,6 +4543,8 @@ proc check_effective_target_sync_long_long_runtime { } { } } "" }] + } elseif { [istarget aarch64*-*-*] } { + return 1 } elseif { [istarget arm*-*-linux-*] } { return [check_runtime sync_longlong_runtime { #include <stdlib.h> |