aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog203
-rw-r--r--gcc/DATESTAMP2
-rw-r--r--gcc/ada/ChangeLog9
-rw-r--r--gcc/ada/gcc-interface/utils.cc17
-rw-r--r--gcc/ada/gcc-interface/utils2.cc11
-rw-r--r--gcc/c-family/ChangeLog10
-rw-r--r--gcc/c-family/c.opt3
-rw-r--r--gcc/c-family/c.opt.urls3
-rw-r--r--gcc/c/ChangeLog9
-rw-r--r--gcc/c/c-decl.cc5
-rw-r--r--gcc/c/c-tree.h1
-rw-r--r--gcc/c/c-typeck.cc38
-rw-r--r--gcc/cobol/ChangeLog56
-rw-r--r--gcc/cobol/Make-lang.in20
-rw-r--r--gcc/cobol/cobol1.cc4
-rw-r--r--gcc/cobol/gcobolspec.cc131
-rw-r--r--gcc/cobol/genapi.cc31
-rw-r--r--gcc/cobol/gengen.cc5
-rw-r--r--gcc/cobol/parse.y6
-rw-r--r--gcc/cobol/symbols.cc6
-rw-r--r--gcc/combine.cc60
-rw-r--r--gcc/common.opt1
-rw-r--r--gcc/config/aarch64/aarch64-cores.def16
-rw-r--r--gcc/config/aarch64/aarch64-sve-builtins.cc37
-rw-r--r--gcc/config/aarch64/aarch64-tune.md2
-rw-r--r--gcc/config/i386/i386.h10
-rw-r--r--gcc/config/nvptx/nvptx.cc2
-rw-r--r--gcc/config/nvptx/nvptx.opt10
-rw-r--r--gcc/config/riscv/freebsd.h2
-rw-r--r--gcc/config/riscv/vector.md6
-rw-r--r--gcc/cp/ChangeLog36
-rw-r--r--gcc/cp/constexpr.cc20
-rw-r--r--gcc/cp/pt.cc47
-rw-r--r--gcc/cse.cc15
-rw-r--r--gcc/d/ChangeLog8
-rw-r--r--gcc/d/dmd/MERGE2
-rw-r--r--gcc/d/dmd/expressionsem.d30
-rw-r--r--gcc/d/lang.opt.urls3
-rw-r--r--gcc/doc/extend.texi8
-rw-r--r--gcc/doc/invoke.texi123
-rw-r--r--gcc/fold-const.cc7
-rw-r--r--gcc/gimplify.cc92
-rw-r--r--gcc/lto-opts.cc2
-rw-r--r--gcc/omp-low.cc2
-rw-r--r--gcc/params.opt4
-rw-r--r--gcc/po/ChangeLog4
-rw-r--r--gcc/po/sv.po794
-rw-r--r--gcc/poly-int.h19
-rw-r--r--gcc/rust/ChangeLog319
-rw-r--r--gcc/rust/ast/rust-ast-builder.cc8
-rw-r--r--gcc/rust/ast/rust-ast-collector.cc4
-rw-r--r--gcc/rust/ast/rust-ast-visitor.cc16
-rw-r--r--gcc/rust/ast/rust-ast.cc23
-rw-r--r--gcc/rust/ast/rust-ast.h20
-rw-r--r--gcc/rust/ast/rust-desugar-for-loops.cc4
-rw-r--r--gcc/rust/ast/rust-expr.h60
-rw-r--r--gcc/rust/ast/rust-item.h23
-rw-r--r--gcc/rust/ast/rust-type.h10
-rw-r--r--gcc/rust/backend/rust-compile-base.cc22
-rw-r--r--gcc/rust/backend/rust-compile-base.h6
-rw-r--r--gcc/rust/backend/rust-compile-expr.cc3
-rw-r--r--gcc/rust/backend/rust-compile-extern.h6
-rw-r--r--gcc/rust/backend/rust-compile-implitem.cc2
-rw-r--r--gcc/rust/backend/rust-compile-implitem.h6
-rw-r--r--gcc/rust/backend/rust-compile-item.cc6
-rw-r--r--gcc/rust/backend/rust-compile-item.h4
-rw-r--r--gcc/rust/backend/rust-compile-resolve-path.cc15
-rw-r--r--gcc/rust/backend/rust-compile.cc2
-rw-r--r--gcc/rust/checks/errors/rust-feature-gate.cc7
-rw-r--r--gcc/rust/checks/errors/rust-feature.cc4
-rw-r--r--gcc/rust/checks/errors/rust-feature.h1
-rw-r--r--gcc/rust/expand/rust-derive-clone.cc5
-rw-r--r--gcc/rust/expand/rust-derive-debug.cc3
-rw-r--r--gcc/rust/expand/rust-derive-default.cc3
-rw-r--r--gcc/rust/expand/rust-derive-eq.cc3
-rw-r--r--gcc/rust/hir/rust-ast-lower-base.cc8
-rw-r--r--gcc/rust/hir/rust-ast-lower-block.h4
-rw-r--r--gcc/rust/hir/rust-ast-lower-expr.cc21
-rw-r--r--gcc/rust/hir/rust-ast-lower-implitem.cc29
-rw-r--r--gcc/rust/hir/rust-ast-lower-item.cc5
-rw-r--r--gcc/rust/hir/rust-ast-lower.cc11
-rw-r--r--gcc/rust/hir/rust-hir-dump.cc6
-rw-r--r--gcc/rust/hir/tree/rust-hir-bound.h12
-rw-r--r--gcc/rust/hir/tree/rust-hir-expr.cc24
-rw-r--r--gcc/rust/hir/tree/rust-hir-expr.h51
-rw-r--r--gcc/rust/hir/tree/rust-hir-generic-param.h3
-rw-r--r--gcc/rust/hir/tree/rust-hir-item.cc28
-rw-r--r--gcc/rust/hir/tree/rust-hir-item.h61
-rw-r--r--gcc/rust/hir/tree/rust-hir-type.cc2
-rw-r--r--gcc/rust/hir/tree/rust-hir-type.h9
-rw-r--r--gcc/rust/hir/tree/rust-hir.cc106
-rw-r--r--gcc/rust/parse/rust-parse-impl.h189
-rw-r--r--gcc/rust/parse/rust-parse.h45
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-base.h5
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-expr.cc14
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-implitem.h19
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-stmt.cc2
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-stmt.h20
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-toplevel.h32
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-type.cc2
-rw-r--r--gcc/rust/resolve/rust-forever-stack.h7
-rw-r--r--gcc/rust/resolve/rust-forever-stack.hxx79
-rw-r--r--gcc/rust/resolve/rust-late-name-resolver-2.0.cc53
-rw-r--r--gcc/rust/resolve/rust-late-name-resolver-2.0.h4
-rw-r--r--gcc/rust/resolve/rust-name-resolution-context.h41
-rw-r--r--gcc/rust/rust-gcc.cc6
-rw-r--r--gcc/rust/typecheck/rust-hir-trait-resolve.cc12
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-base.cc44
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-base.h8
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-expr.cc9
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-implitem.cc205
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-path.cc2
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-pattern.cc21
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-type.cc44
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-type.h11
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check.cc35
-rw-r--r--gcc/rust/typecheck/rust-substitution-mapper.cc27
-rw-r--r--gcc/rust/typecheck/rust-substitution-mapper.h2
-rw-r--r--gcc/rust/typecheck/rust-type-util.cc37
-rw-r--r--gcc/rust/typecheck/rust-typecheck-context.cc11
-rw-r--r--gcc/rust/typecheck/rust-tyty-subst.cc8
-rw-r--r--gcc/rust/typecheck/rust-tyty-subst.h6
-rw-r--r--gcc/rust/typecheck/rust-tyty-variance-analysis.cc2
-rw-r--r--gcc/rust/util/expected.h4
-rw-r--r--gcc/simplify-rtx.cc19
-rw-r--r--gcc/target.h37
-rw-r--r--gcc/testsuite/ChangeLog218
-rw-r--r--gcc/testsuite/c-c++-common/gomp/append-args-interop.c4
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-ref14.C21
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-reinterpret2.C4
-rw-r--r--gcc/testsuite/g++.dg/cpp23/constexpr-nonlit12.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/class-deduction-alias25.C19
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/class-deduction-alias25a.C19
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/constinit20.C18
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/lambda-uneval27.C10
-rw-r--r--gcc/testsuite/g++.dg/gomp/append-args-8.C8
-rw-r--r--gcc/testsuite/g++.dg/opt/pr119613.C2
-rw-r--r--gcc/testsuite/g++.dg/opt/pr119614.C30
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/pr118924.C29
-rw-r--r--gcc/testsuite/gcc.dg/gnu23-tag-6.c27
-rw-r--r--gcc/testsuite/gcc.dg/guality/pr36728-3.c2
-rw-r--r--gcc/testsuite/gcc.dg/guality/pr41353-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/guality/pr54693-2.c2
-rw-r--r--gcc/testsuite/gcc.dg/guality/pr68860-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/guality/pr68860-2.c2
-rw-r--r--gcc/testsuite/gcc.dg/guality/sra-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/guality/vla-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/pr119594.c32
-rw-r--r--gcc/testsuite/gcc.dg/pr119612.c9
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr119640.c17
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr99102.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/popcnt-le-1.c4
-rw-r--r--gcc/testsuite/gcc.target/aarch64/popcnt-le-3.c4
-rw-r--r--gcc/testsuite/gcc.target/aarch64/pr100056.c4
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/gomp/gomp.exp46
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/gomp/target-device.c201
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/gomp/target-link.c57
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/gomp/target.c2049
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/pred-not-gen-1.c4
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/pred-not-gen-4.c4
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/var_stride_2.c3
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/var_stride_4.c3
-rw-r--r--gcc/testsuite/gcc.target/arm/short-vfp-1.c46
-rw-r--r--gcc/testsuite/gcc.target/nvptx/alloca-2-O0_-mfake-ptx-alloca.c7
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/vsext.c24
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/vzext.c24
-rw-r--r--gcc/testsuite/gdc.test/compilable/test21153.d8
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/append-args-interop.f904
-rw-r--r--gcc/testsuite/lib/cobol.exp20
-rw-r--r--gcc/testsuite/rust/compile/enum_discriminant1.rs7
-rw-r--r--gcc/testsuite/rust/compile/feature.rs2
-rw-r--r--gcc/testsuite/rust/compile/invalid_label_name.rs4
-rw-r--r--gcc/testsuite/rust/compile/issue-2812.rs4
-rw-r--r--gcc/testsuite/rust/compile/issue-3625.rs2
-rw-r--r--gcc/testsuite/rust/compile/issue-3643.rs4
-rw-r--r--gcc/testsuite/rust/compile/issue-3646.rs7
-rw-r--r--gcc/testsuite/rust/compile/issue-3647.rs7
-rw-r--r--gcc/testsuite/rust/compile/issue-3648.rs8
-rw-r--r--gcc/testsuite/rust/compile/issue-3654.rs3
-rw-r--r--gcc/testsuite/rust/compile/issue-3656.rs10
-rw-r--r--gcc/testsuite/rust/compile/issue-3657.rs8
-rw-r--r--gcc/testsuite/rust/compile/issue-3663.rs6
-rw-r--r--gcc/testsuite/rust/compile/issue-3665.rs6
-rw-r--r--gcc/testsuite/rust/compile/issue-3667.rs24
-rw-r--r--gcc/testsuite/rust/compile/issue-3671.rs2
-rw-r--r--gcc/testsuite/rust/compile/macros/mbe/macro6.rs2
-rw-r--r--gcc/testsuite/rust/compile/min_specialization1.rs15
-rw-r--r--gcc/testsuite/rust/compile/nr2/compile.exp32
-rw-r--r--gcc/testsuite/rust/compile/nr2/exclude12
-rw-r--r--gcc/testsuite/rust/compile/undeclared_label.rs4
-rw-r--r--gcc/tree-sra.cc19
-rw-r--r--gcc/tree-ssa-alias-compare.h2
-rw-r--r--gcc/tree-ssa-alias.cc13
-rw-r--r--gcc/tree-tailcall.cc47
-rw-r--r--gcc/tree-vect-stmts.cc11
-rw-r--r--gcc/tree.h11
-rw-r--r--libbacktrace/ChangeLog4
-rw-r--r--libbacktrace/atomic.c2
-rw-r--r--libgcc/ChangeLog41
-rw-r--r--libgcc/config/avr/lib1funcs-fixed.S66
-rw-r--r--libgcc/config/avr/lib1funcs.S45
-rw-r--r--libgcc/config/avr/t-avr32
-rw-r--r--libgcc/config/gcn/unwind-gcn.c21
-rw-r--r--libgcc/config/nvptx/alloca.c38
-rw-r--r--libgcc/config/nvptx/t-nvptx3
-rw-r--r--libgcc/config/nvptx/unwind-nvptx.c21
-rw-r--r--libgcobol/ChangeLog18
-rw-r--r--libgcobol/Makefile.am38
-rw-r--r--libgcobol/Makefile.in335
-rw-r--r--libgcobol/aclocal.m420
-rw-r--r--libgcobol/config.h.in6
-rwxr-xr-xlibgcobol/configure5979
-rw-r--r--libgcobol/configure.ac277
-rw-r--r--libgcobol/libgcobol.spec.in8
-rw-r--r--libgfortran/ChangeLog7
-rw-r--r--libgfortran/acinclude.m44
-rwxr-xr-xlibgfortran/configure8
-rw-r--r--libgomp/ChangeLog30
-rw-r--r--libgomp/Makefile.am2
-rw-r--r--libgomp/Makefile.in2
-rw-r--r--libgomp/libgomp.texi19
-rw-r--r--libgomp/testsuite/libgomp.c-target/aarch64/aarch64.exp57
-rw-r--r--libgomp/testsuite/libgomp.c-target/aarch64/firstprivate.c127
-rw-r--r--libgomp/testsuite/libgomp.c-target/aarch64/lastprivate.c169
-rw-r--r--libgomp/testsuite/libgomp.c-target/aarch64/private.c105
-rw-r--r--libgomp/testsuite/libgomp.c-target/aarch64/shared.c264
-rw-r--r--libgomp/testsuite/libgomp.c-target/aarch64/simd-aligned.c49
-rw-r--r--libgomp/testsuite/libgomp.c-target/aarch64/simd-nontemporal.c49
-rw-r--r--libgomp/testsuite/libgomp.c-target/aarch64/threadprivate.c45
-rw-r--r--libgomp/testsuite/libgomp.c-target/aarch64/udr-sve.c98
-rw-r--r--libgomp/testsuite/libgomp.c/append-args-fr-1.c232
-rw-r--r--libgomp/testsuite/libgomp.c/append-args-fr.h305
-rw-r--r--libphobos/ChangeLog7
-rw-r--r--libphobos/src/MERGE2
-rw-r--r--libphobos/src/Makefile.am17
-rw-r--r--libphobos/src/Makefile.in19
-rw-r--r--libphobos/src/std/file.d4
-rw-r--r--libphobos/src/std/internal/windows/bcrypt.d65
-rw-r--r--libphobos/src/std/random.d18
-rw-r--r--libquadmath/ChangeLog9
-rwxr-xr-xlibquadmath/configure8
-rw-r--r--libquadmath/configure.ac4
-rw-r--r--libstdc++-v3/ChangeLog32
-rw-r--r--libstdc++-v3/acinclude.m47
-rwxr-xr-xlibstdc++-v3/configure11
-rw-r--r--libstdc++-v3/configure.host11
-rw-r--r--libstdc++-v3/doc/doxygen/user.cfg.in5
-rw-r--r--libstdc++-v3/include/bits/formatfwd.h1
-rw-r--r--libstdc++-v3/include/precompiled/stdc++.h6
-rw-r--r--libstdc++-v3/include/std/format6
-rw-r--r--libstdc++-v3/testsuite/std/format/functions/format.cc12
-rw-r--r--maintainer-scripts/ChangeLog7
-rwxr-xr-xmaintainer-scripts/update_web_docs_git11
253 files changed, 10137 insertions, 5881 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f2bb985..a3e0333 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,206 @@
+2025-04-08 Sandra Loosemore <sloosemore@baylibre.com>
+
+ PR c++/90468
+ * doc/invoke.texi (Warning Options): Clean up text describing
+ -Wno-xxx.
+
+2025-04-08 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/119672
+ * simplify-rtx.cc (simplify_context::simplify_relational_operation_1):
+ For POPCOUNT == 0 or != 0 optimizations use
+ CONST0_RTX (GET_MODE (XEXP (op0, 0))) rather than const0_rtx.
+
+2025-04-08 Tobias Burnus <tburnus@baylibre.com>
+
+ PR middle-end/119662
+ * gimplify.cc (modify_call_for_omp_dispatch): Fix GOMP_interop
+ arg passing; add location info to function calls.
+
+2025-04-08 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/119678
+ * config/riscv/freebsd.h (LINK_SPEC): Use FBSD_LINK_PG_NOTE rather
+ than non-existing FBSD_LINK_PG_NOTES.
+
+2025-04-08 Thomas Schwinge <tschwinge@baylibre.com>
+
+ * config/nvptx/nvptx.cc (nvptx_asm_output_def_from_decls)
+ [!ACCEL_COMPILER]: Don't define label 'emit_ptx_alias'.
+
+2025-04-08 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/119594
+ * cse.cc (count_reg_usage): Count even x == dest regs if they have
+ non-zero counts already and incr is positive.
+
+2025-04-08 Jakub Jelinek <jakub@redhat.com>
+
+ PR lto/119625
+ * lto-opts.cc (lto_write_options): Mask of CF_SET from
+ global_options.x_flag_cf_protection.
+
+2025-04-08 Tejas Belagod <tejas.belagod@arm.com>
+ Andrea Corallo <andrea.corallo@arm.com>
+
+ * target.h (type_context_kind): Add new context kinds for target clauses.
+ (omp_type_context): Query if the context is of OMP kind.
+ * config/aarch64/aarch64-sve-builtins.cc (verify_type_context): Diagnose
+ SVE types for a given OpenMP context.
+ (omp_type_context): New.
+ * gimplify.cc (omp_notice_variable): Diagnose implicitly-mapped SVE
+ objects in OpenMP regions.
+ (gimplify_scan_omp_clauses): Diagnose SVE types for various target
+ clauses.
+
+2025-04-08 Tejas Belagod <tejas.belagod@arm.com>
+
+ * tree.h (strip_pointer_types): New.
+
+2025-04-08 Richard Sandiford <richard.sandiford@arm.com>
+ Tejas Belagod <tejas.belagod@arm.com>
+
+ PR middle-end/101018
+ * poly-int.h (can_and_p): New function.
+ * fold-const.cc (poly_int_binop): Use it to optimize BIT_AND_EXPRs
+ involving POLY_INT_CSTs.
+ * gimplify.cc (omp_notice_variable): Use poly_int_tree_p instead
+ of INTEGER_CST when checking for constant-sized omp data.
+ (gimplify_adjust_omp_clauses_1): Likewise.
+ (gimplify_adjust_omp_clauses): Likewise.
+ * omp-low.cc (scan_sharing_clauses): Likewise.
+
+2025-04-08 Haochen Jiang <haochen.jiang@intel.com>
+
+ * config/i386/i386.h (PTA_DIAMONDRAPIDS): Add PTA_AVX10_1_256.
+
+2025-04-08 Jin Ma <jinma@linux.alibaba.com>
+
+ * config/riscv/vector.md: Disable vsext/vzext for XTheadVector.
+
+2025-04-07 Iain Sandoe <iain@sandoe.co.uk>
+
+ PR target/113257
+ * config/aarch64/aarch64-cores.def (AARCH64_CORE): Add Apple-a12,
+ Apple-M1, Apple-M2, Apple-M3 with expanded names to allow for the
+ LITTLE.big versions.
+ * config/aarch64/aarch64-tune.md: Regenerate.
+ * doc/invoke.texi: Add apple-m1,2 and 3 cores to the ones listed
+ for arch and tune selections.
+
+2025-04-07 Thomas Schwinge <tschwinge@baylibre.com>
+
+ * config/nvptx/nvptx.opt (-mfake-ptx-alloca): Update.
+
+2025-04-07 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/118924
+ * tree-sra.cc (create_total_scalarization_access): Set
+ grp_same_access_path flag to zero.
+
+2025-04-07 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/118924
+ * tree-ssa-alias-compare.h (types_equal_for_same_type_for_tbaa_p):
+ Declare.
+ * tree-ssa-alias.cc: Include ipa-utils.h.
+ (types_equal_for_same_type_for_tbaa_p): New public overloaded variant.
+ * tree-sra.cc: Include tree-ssa-alias-compare.h.
+ (create_access): Initialzie grp_same_access_path to true.
+ (build_accesses_from_assign): Detect tbaa hazards and clear
+ grp_same_access_path fields of involved accesses when they occur.
+ (sort_and_splice_var_accesses): Take previous values of
+ grp_same_access_path into account.
+
+2025-04-07 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/119640
+ * tree-vect-stmts.cc (vectorizable_shift): Always insert code
+ for one of our SLP operands before the code for the vector
+ shift itself.
+
+2025-04-07 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/119614
+ * tree-tailcall.cc (find_tail_calls): Remember edges which have been
+ walked through if !ass_var. Perform IPA-VRP workaround even when
+ ret_var is not TREE_CONSTANT, in that case check in a loop if it is
+ a PHI result and in that case look at the PHI argument from
+ corresponding edge in the edge vector.
+
+2025-04-07 Richard Sandiford <richard.sandiford@arm.com>
+
+ PR testsuite/116398
+ * params.opt (-param=max-combine-search-insns=): New param.
+ * doc/invoke.texi: Document it.
+ * combine.cc (insn_link::insn_count): New field.
+ (alloc_insn_link): Initialize it.
+ (distribute_links): Add a limit parameter.
+ (try_combine): Use the new param to limit distribute_links
+ when only i3 has changed.
+
+2025-04-07 Richard Sandiford <richard.sandiford@arm.com>
+
+ PR testsuite/116398
+ * combine.cc (distribute_links): Take an optional start point.
+ (try_combine): If only i3 has changed, only distribute i3's links,
+ not i2's. Start the search for the new use from i3 rather than
+ from the definition instruction. Likewise start the search for
+ the new use from i2 when distributing i2's links.
+
+2025-04-07 Richard Sandiford <richard.sandiford@arm.com>
+
+ PR testsuite/116398
+ * combine.cc (try_combine): Shortcut the split_i2i3 handling if
+ i2 is unchanged.
+
+2025-04-07 Richard Sandiford <richard.sandiford@arm.com>
+ Richard Biener <rguenther@suse.de>
+
+ PR testsuite/116398
+ * combine.cc (try_combine): Reallow 2->2 combinations. Detect when
+ only i3 has changed and restart from i3 in that case.
+
+2025-04-07 Richard Sandiford <richard.sandiford@arm.com>
+
+ * simplify-rtx.cc (simplify_const_relational_operation): Generalize
+ the constant checks in the fold-via-minus path to match the
+ INTEGRAL_MODE_P condition.
+
+2025-04-06 Sandra Loosemore <sloosemore@baylibre.com>
+
+ * doc/extend.texi (Boolean Type): Further clarify support for
+ _Bool in C23 and C++.
+
+2025-04-06 Sandra Loosemore <sloosemore@baylibre.com>
+
+ PR middle-end/78874
+ * doc/invoke.texi (Warning Options): Fix description of
+ -Wno-aggressive-loop-optimizations to reflect that this turns
+ off the warning, and the default is for it to be enabled.
+
+2025-04-06 Sandra Loosemore <sloosemore@baylibre.com>
+
+ PR c/81831
+ * doc/invoke.texi (Option Summary): Add -Wno-psabi.
+ (Warning Options): Document -Wpsabi separately from -Wabi.
+ Note it's enabled by default, not just implied by -Wabi.
+ Replace the detailed example for a GCC 4.4 change for x86
+ (which is unlikely to be very interesting nowadays) with
+ just a list of all targets that presently diagnose these
+ warnings.
+ (RS/6000 and PowerPC Options): Add cross-references for
+ -Wno-psabi.
+
+2025-04-05 Sandra Loosemore <sloosemore@baylibre.com>
+
+ PR middle-end/112589
+ * common.opt (-fcf-protection): Add documentation string.
+ * doc/invoke.texi (Option Summary): Add entry for -fcf-protection
+ without argument.
+ (Instrumentation Options): Tidy the -fcf-protection entry and
+ and add documention for the form without an argument.
+
2025-04-04 Jakub Jelinek <jakub@redhat.com>
PR lto/119625
diff --git a/gcc/DATESTAMP b/gcc/DATESTAMP
index d5996ab4..cb38c2c 100644
--- a/gcc/DATESTAMP
+++ b/gcc/DATESTAMP
@@ -1 +1 @@
-20250405
+20250409
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 1ce4588..f7a9025 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,12 @@
+2025-04-07 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc-interface/utils.cc (convert) <POINTER_TYPE>: Use fold_convert
+ to convert between thin pointers. If the source is a thin pointer
+ with zero offset from the base and the target is a pointer to its
+ array, displace the pointer after converting it.
+ * gcc-interface/utils2.cc (build_unary_op) <ATTR_ADDR_EXPR>: Use
+ fold_convert to convert the address before displacing it.
+
2025-04-04 Eric Botcazou <ebotcazou@adacore.com>
* libgnat/a-ngcoar.adb (Eigensystem): Adjust notation and fix the
diff --git a/gcc/ada/gcc-interface/utils.cc b/gcc/ada/gcc-interface/utils.cc
index 1448716..9212827 100644
--- a/gcc/ada/gcc-interface/utils.cc
+++ b/gcc/ada/gcc-interface/utils.cc
@@ -5259,7 +5259,7 @@ convert (tree type, tree expr)
: size_zero_node;
tree byte_diff = size_diffop (type_pos, etype_pos);
- expr = build1 (NOP_EXPR, type, expr);
+ expr = fold_convert (type, expr);
if (integer_zerop (byte_diff))
return expr;
@@ -5267,6 +5267,21 @@ convert (tree type, tree expr)
fold_convert (sizetype, byte_diff));
}
+ /* If converting from a thin pointer with zero offset from the base to
+ a pointer to the array, add the offset of the array field. */
+ if (TYPE_IS_THIN_POINTER_P (etype)
+ && !TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (etype)))
+ {
+ tree arr_field = DECL_CHAIN (TYPE_FIELDS (TREE_TYPE (etype)));
+
+ if (TREE_TYPE (type) == TREE_TYPE (arr_field))
+ {
+ expr = fold_convert (type, expr);
+ return build_binary_op (POINTER_PLUS_EXPR, type, expr,
+ byte_position (arr_field));
+ }
+ }
+
/* If converting fat pointer to normal or thin pointer, get the pointer
to the array and then convert it. */
if (TYPE_IS_FAT_POINTER_P (etype))
diff --git a/gcc/ada/gcc-interface/utils2.cc b/gcc/ada/gcc-interface/utils2.cc
index 99e5927..58418ea 100644
--- a/gcc/ada/gcc-interface/utils2.cc
+++ b/gcc/ada/gcc-interface/utils2.cc
@@ -1628,11 +1628,12 @@ build_unary_op (enum tree_code op_code, tree result_type, tree operand)
= size_binop (PLUS_EXPR, offset,
size_int (bits_to_bytes_round_down (bitpos)));
- /* Take the address of INNER, convert it to a pointer to our type
- and add the offset. */
- inner = build_unary_op (ADDR_EXPR,
- build_pointer_type (TREE_TYPE (operand)),
- inner);
+ /* Take the address of INNER, formally convert it to a pointer
+ to the operand type, and finally add the offset. */
+ inner = build_unary_op (ADDR_EXPR, NULL_TREE, inner);
+ inner
+ = fold_convert (build_pointer_type (TREE_TYPE (operand)),
+ inner);
result = build_binary_op (POINTER_PLUS_EXPR, TREE_TYPE (inner),
inner, offset);
break;
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index 5e7bff8..2d8ef50 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,3 +1,13 @@
+2025-04-06 Sandra Loosemore <sloosemore@baylibre.com>
+
+ * c.opt.urls: Regenerate.
+
+2025-04-06 Sandra Loosemore <sloosemore@baylibre.com>
+
+ PR c/81831
+ * c.opt (Wpsabi): Remove "Undocumented" modifier and add a
+ documentation string.
+
2025-04-03 Jakub Jelinek <jakub@redhat.com>
* c.opt.urls: Regenerate.
diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt
index ad21698..75b6531 100644
--- a/gcc/c-family/c.opt
+++ b/gcc/c-family/c.opt
@@ -303,7 +303,8 @@ C++ ObjC++ Var(warn_abi_tag) Warning
Warn if a subobject has an abi_tag attribute that the complete object type does not have.
Wpsabi
-C ObjC C++ ObjC++ LTO Var(warn_psabi) Init(1) Warning Undocumented LangEnabledBy(C ObjC C++ ObjC++,Wabi)
+C ObjC C++ ObjC++ LTO Var(warn_psabi) Init(1) Warning LangEnabledBy(C ObjC C++ ObjC++,Wabi)
+Warn about code affected by incompatible psABI changes.
Wabsolute-value
C ObjC Var(warn_absolute_value) Warning EnabledBy(Wextra)
diff --git a/gcc/c-family/c.opt.urls b/gcc/c-family/c.opt.urls
index 8027296..ad6d8a0 100644
--- a/gcc/c-family/c.opt.urls
+++ b/gcc/c-family/c.opt.urls
@@ -82,6 +82,9 @@ UrlSuffix(gcc/Warning-Options.html#index-Wabi)
Wabi-tag
UrlSuffix(gcc/C_002b_002b-Dialect-Options.html#index-Wabi-tag)
+Wpsabi
+UrlSuffix(gcc/Warning-Options.html#index-Wno-psabi)
+
Wabsolute-value
UrlSuffix(gcc/Warning-Options.html#index-Wabsolute-value)
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index 7be4f54..dec9f16 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -1,3 +1,12 @@
+2025-04-08 Martin Uecker <uecker@tugraz.at>
+
+ PR c/119612
+ * c-tree.h (c_type_tag): Add prototype.
+ * c-typeck.cc (c_type_tag): New function.
+ (tagged_types_tu_compatible_p, composite_type_internal): Use
+ c_type_tag.
+ * c-decl.cc (c_struct_hasher::hash, previous_tag): Use c_type_tag.
+
2025-04-02 Jakub Jelinek <jakub@redhat.com>
PR c/119582
diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc
index c778c7f..8c420f2 100644
--- a/gcc/c/c-decl.cc
+++ b/gcc/c/c-decl.cc
@@ -659,7 +659,8 @@ c_struct_hasher::hash (tree type)
inchash::hash hstate;
hstate.add_int (TREE_CODE (type));
- hstate.add_object (TYPE_NAME (type));
+ tree tag = c_type_tag (type);
+ hstate.add_object (tag);
return hstate.end ();
}
@@ -2073,7 +2074,7 @@ static tree
previous_tag (tree type)
{
struct c_binding *b = NULL;
- tree name = TYPE_NAME (type);
+ tree name = c_type_tag (type);
if (name)
b = I_TAG_BINDING (name);
diff --git a/gcc/c/c-tree.h b/gcc/c/c-tree.h
index 743ec5c..2098120 100644
--- a/gcc/c/c-tree.h
+++ b/gcc/c/c-tree.h
@@ -795,6 +795,7 @@ c_type_unspecified_p (tree t)
}
extern bool char_type_p (tree);
+extern tree c_type_tag (const_tree t);
extern tree c_objc_common_truthvalue_conversion (location_t, tree,
tree = integer_type_node);
extern tree require_complete_type (location_t, tree);
diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc
index 19e79b5..3870e8a 100644
--- a/gcc/c/c-typeck.cc
+++ b/gcc/c/c-typeck.cc
@@ -577,7 +577,7 @@ c_build_functype_attribute_variant (tree ntype, tree otype, tree attrs)
}
/* Given a type which could be a typedef name, make sure to return the
- original type. */
+ original type. See set_underlying_type. */
static const_tree
c_type_original (const_tree t)
{
@@ -591,6 +591,26 @@ c_type_original (const_tree t)
return t;
}
+/* Return the tag for a tagged type. */
+tree
+c_type_tag (const_tree t)
+{
+ gcc_assert (RECORD_OR_UNION_TYPE_P (t) || TREE_CODE (t) == ENUMERAL_TYPE);
+ const_tree orig = c_type_original (t);
+ tree name = TYPE_NAME (orig);
+ if (!name)
+ return NULL_TREE;
+ if (TREE_CODE (name) == TYPE_DECL)
+ {
+ /* A TYPE_DECL added by add_decl_expr. */
+ gcc_checking_assert (!DECL_NAME (name));
+ return NULL_TREE;
+ }
+ gcc_checking_assert (TREE_CODE (name) == IDENTIFIER_NODE);
+ return name;
+}
+
+
/* Return the composite type of two compatible types.
@@ -744,7 +764,7 @@ composite_type_internal (tree t1, tree t2, struct composite_cache* cache)
if (flag_isoc23 && !comptypes_same_p (t1, t2))
{
/* Go to the original type to get the right tag. */
- tree tag = TYPE_NAME (c_type_original (const_cast<tree> (t1)));
+ tree tag = c_type_tag (t1);
gcc_checking_assert (COMPLETE_TYPE_P (t1) && COMPLETE_TYPE_P (t2));
gcc_checking_assert (!tag || comptypes (t1, t2));
@@ -1807,17 +1827,7 @@ tagged_types_tu_compatible_p (const_tree t1, const_tree t2,
{
tree s1, s2;
- /* We have to verify that the tags of the types are the same. This
- is harder than it looks because this may be a typedef, so we have
- to go look at the original type. */
- t1 = c_type_original (t1);
- t2 = c_type_original (t2);
- gcc_checking_assert (!TYPE_NAME (t1)
- || TREE_CODE (TYPE_NAME (t1)) == IDENTIFIER_NODE);
- gcc_checking_assert (!TYPE_NAME (t2)
- || TREE_CODE (TYPE_NAME (t2)) == IDENTIFIER_NODE);
-
- if (TYPE_NAME (t1) != TYPE_NAME (t2))
+ if (c_type_tag (t1) != c_type_tag (t2))
return false;
/* When forming equivalence classes for TYPE_CANONICAL in C23, we treat
@@ -1828,7 +1838,7 @@ tagged_types_tu_compatible_p (const_tree t1, const_tree t2,
/* Different types without tag are incompatible except as an anonymous
field or when forming equivalence classes for TYPE_CANONICAL. */
- if (!data->anon_field && !data->equiv && NULL_TREE == TYPE_NAME (t1))
+ if (!data->anon_field && !data->equiv && NULL_TREE == c_type_tag (t1))
return false;
if (!data->anon_field && TYPE_STUB_DECL (t1) != TYPE_STUB_DECL (t2))
diff --git a/gcc/cobol/ChangeLog b/gcc/cobol/ChangeLog
index 9f16500..e386591 100644
--- a/gcc/cobol/ChangeLog
+++ b/gcc/cobol/ChangeLog
@@ -1,3 +1,59 @@
+2025-04-08 Jakub Jelinek <jakub@redhat.com>
+
+ PR cobol/119364
+ * genapi.cc (function_handle_from_name): Use sizeof_pointer.
+ (parser_file_add): Use int_size_in_bytes(VOID_P) and
+ int_size_in_bytes(int).
+ (inspect_tally): Use int_size_in_bytes(VOID_P).
+ (inspect_replacing): Likewise.
+ (gg_array_of_field_pointers): Likewise.
+ (gg_array_of_file_pointers): Likewise.
+ (parser_set_pointers): Use sizeof_pointer.
+ * cobol1.cc (create_our_type_nodes_init): Use
+ int_size_in_bytes(SIZE_T) and int_size_in_bytes(VOID_P).
+ * gengen.cc (gg_array_of_size_t): Use int_size_in_bytes(SIZE_T).
+ (gg_array_of_bytes): Just use N, don't multiply it by
+ sizeof(unsigned char).
+ * parse.y: Include tree.h. Use int_size_in_bytes(ptr_type_node).
+
+2025-04-07 Iain Sandoe <iain@sandoe.co.uk>
+
+ * symbols.cc : Remove trailing // on standard_internal.
+ (cbl_field_t::internalize): Print a warning if we fail to
+ initialise iconv.
+
+2025-04-07 Jakub Jelinek <jakub@redhat.com>
+
+ * Make-lang.in (cobol/charmaps.cc, cobol/valconv.cc): Use a BRE
+ only sed regex.
+
+2025-04-07 Jakub Jelinek <jakub@redhat.com>
+
+ PR web/119227
+ * Make-lang.in (GCOBOL_HTML_FILES): New variable.
+ (cobol.install-html, cobol.html, cobol.srchtml): Use
+ $(GCOBOL_HTML_FILES) instead of gcobol.html gcobol-io.html.
+ (gcobol.html): Rename goal to ...
+ ($(build_htmldir)/gcobol/gcobol.html): ... this. Run mkinstalldirs.
+ (gcobol-io.html): Rename goal to ...
+ ($(build_htmldir)/gcobol/gcobol-io.html): ... this. Run mkinstalldirs.
+
+2025-04-06 Iain Sandoe <iain@sandoe.co.uk>
+
+ PR cobol/119414
+ * gcobolspec.cc (append_rdynamic,
+ append_allow_multiple_definition, append_fpic): Remove.
+ (lang_specific_driver): Remove platform-specific command
+ line option handling.
+
+2025-04-05 Iain Sandoe <iain@sandoe.co.uk>
+
+ * gcobolspec.cc (SPEC_FILE): New.
+ (lang_specific_driver): Make the 'need libgcobol' flag global
+ so that the prelink callback can use it. Libm use is now handled
+ via the library spec.
+ (lang_specific_pre_link): Include libgcobol.spec where needed.
+
2025-04-04 Bob Dubner <rdubner@symas.com>
* cobol1.cc: Eliminate cobol_langhook_post_options.
diff --git a/gcc/cobol/Make-lang.in b/gcc/cobol/Make-lang.in
index 990d51a..422ebe2 100644
--- a/gcc/cobol/Make-lang.in
+++ b/gcc/cobol/Make-lang.in
@@ -40,6 +40,8 @@ GCOBOL_TARGET_INSTALL_NAME := $(target_noncanonical)-$(shell echo gcobol|sed '$(
GCOBC_INSTALL_NAME := $(shell echo gcobc|sed '$(program_transform_name)')
GCOBC_TARGET_INSTALL_NAME := $(target_noncanonical)-$(shell echo gcobc|sed '$(program_transform_name)')
+GCOBOL_HTML_FILES = $(addprefix $(build_htmldir)/gcobol/,gcobol.html gcobol-io.html)
+
cobol: cobol1$(exeext)
cobol.serial = cobol1$(exeext)
.PHONY: cobol
@@ -88,9 +90,7 @@ cobol1_OBJS = \
# so that the .h files can be found.
cobol/charmaps.cc cobol/valconv.cc: cobol/%.cc: $(LIB_SOURCE)/%.cc
- -l='ec\|common-defs\|io\|gcobolio\|gfileio\|charmaps'; \
- l=$$l'\|valconv\|exceptl'; \
- sed -e '/^#include/s,"\('$$l'\)\.h","../../libgcobol/\1.h",' $^ > $@
+ sed -e '/^#include/s,"\([^"]*[^g"].h\)","../../libgcobol/\1",' $^ > $@
LIB_SOURCE_H=$(wildcard $(LIB_SOURCE)/*.h)
@@ -303,8 +303,8 @@ cobol.install-pdf: installdirs gcobol.pdf gcobol-io.pdf
cobol.install-plugin:
-cobol.install-html: installdirs gcobol.html gcobol-io.html
- $(INSTALL_DATA) gcobol.html gcobol-io.html $(DESTDIR)$(htmldir)/
+cobol.install-html: installdirs $(GCOBOL_HTML_FILES)
+ $(INSTALL_DATA) $(GCOBOL_HTML_FILES) $(DESTDIR)$(htmldir)/
cobol.info:
cobol.srcinfo:
@@ -323,14 +323,16 @@ gcobol-io.pdf: $(srcdir)/cobol/gcobol.3
groff -mdoc -T pdf $^ > $@~
@mv $@~ $@
-cobol.html: gcobol.html gcobol-io.html
-cobol.srchtml: gcobol.html gcobol-io.html
+cobol.html: $(GCOBOL_HTML_FILES)
+cobol.srchtml: $(GCOBOL_HTML_FILES)
ln $^ $(srcdir)/cobol/
-gcobol.html: $(srcdir)/cobol/gcobol.1
+$(build_htmldir)/gcobol/gcobol.html: $(srcdir)/cobol/gcobol.1
+ $(mkinstalldirs) $(build_htmldir)/gcobol
mandoc -T html $^ > $@~
@mv $@~ $@
-gcobol-io.html: $(srcdir)/cobol/gcobol.3
+$(build_htmldir)/gcobol/gcobol-io.html: $(srcdir)/cobol/gcobol.3
+ $(mkinstalldirs) $(build_htmldir)/gcobol
mandoc -T html $^ > $@~
@mv $@~ $@
diff --git a/gcc/cobol/cobol1.cc b/gcc/cobol/cobol1.cc
index 0d07c46..1e690ff 100644
--- a/gcc/cobol/cobol1.cc
+++ b/gcc/cobol/cobol1.cc
@@ -166,8 +166,8 @@ create_our_type_nodes_init()
long_double_ten_node = build_real_from_int_cst(
LONGDOUBLE,
build_int_cst_type(INT,10));
- sizeof_size_t = build_int_cst_type(SIZE_T, sizeof(size_t));
- sizeof_pointer = build_int_cst_type(SIZE_T, sizeof(void *));
+ sizeof_size_t = build_int_cst_type(SIZE_T, int_size_in_bytes(SIZE_T));
+ sizeof_pointer = build_int_cst_type(SIZE_T, int_size_in_bytes(VOID_P));
bool_true_node = build2(EQ_EXPR,
integer_type_node,
diff --git a/gcc/cobol/gcobolspec.cc b/gcc/cobol/gcobolspec.cc
index 63f48aa..4df9f8d 100644
--- a/gcc/cobol/gcobolspec.cc
+++ b/gcc/cobol/gcobolspec.cc
@@ -57,10 +57,6 @@ along with GCC; see the file COPYING3. If not see
int lang_specific_extra_outfiles = 0;
-#ifndef MATH_LIBRARY
-#define MATH_LIBRARY "m"
-#endif
-
#ifndef DL_LIBRARY
#define DL_LIBRARY "dl"
#endif
@@ -73,12 +69,16 @@ int lang_specific_extra_outfiles = 0;
#define COBOL_LIBRARY "gcobol"
#endif
+#define SPEC_FILE "libgcobol.spec"
+
/* The original argument list and related info is copied here. */
static const struct cl_decoded_option *original_options;
/* The new argument list will be built here. */
static std::vector<cl_decoded_option>new_opt;
+static bool need_libgcobol = true;
+
// #define NOISY 1
static void
@@ -126,41 +126,6 @@ add_arg_lib(const char *library, bool force_static ATTRIBUTE_UNUSED)
#endif
}
-static void
-append_rdynamic()
- {
- // This is a bit ham-handed, but I was in a hurry.
- struct cl_decoded_option decoded = {};
- decoded.opt_index = OPT_rdynamic;
- decoded.orig_option_with_args_text = "-rdynamic";
- decoded.canonical_option[0] = "-rdynamic";
- decoded.canonical_option_num_elements = 1;
- decoded.value = 1;
- append_arg(decoded);
- return;
- }
-
-static void
-append_allow_multiple_definition()
- {
- append_option (OPT_Wl_, "--allow-multiple-definition", 1);
- return;
- }
-
-static void
-append_fpic()
- {
- // This is a bit ham-handed, but I was in a hurry.
- struct cl_decoded_option decoded = {};
- decoded.opt_index = OPT_rdynamic;
- decoded.orig_option_with_args_text = "-fPIC";
- decoded.canonical_option[0] = "-fPIC";
- decoded.canonical_option_num_elements = 1;
- decoded.value = 1;
- append_arg(decoded);
- return;
- }
-
void
lang_specific_driver (struct cl_decoded_option **in_decoded_options,
unsigned int *in_decoded_options_count,
@@ -188,20 +153,13 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
bool saw_OPT_c = false;
bool saw_OPT_shared = false;
- bool saw_OPT_pic = false;
- bool saw_OPT_PIC = false;
bool verbose = false;
// These flags indicate whether we need various libraries
- bool need_libgcobol = true;
- bool need_libmath = (MATH_LIBRARY[0] != '\0');
bool need_libdl = (DL_LIBRARY[0] != '\0');
bool need_libstdc = (STDCPP_LIBRARY[0] != '\0');
- // bool need_libquadmath = (QUADMATH_LIBRARY[0] != '\0');
- bool need_rdynamic = true;
- bool need_allow_multiple_definition = true;
// Separate flags for a couple of static libraries
bool static_libgcobol = false;
@@ -292,37 +250,10 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
saw_OPT_shared = true;
break;
- case OPT_fpic:
- saw_OPT_pic = true;
- break;
-
- case OPT_fPIC:
- saw_OPT_PIC = true;
- break;
-
- case OPT_c:
- // With this option, no libraries need be loaded
+ case OPT_c:
+ // Note -c specially.
saw_OPT_c = true;
- need_libgcobol = false;
- need_libmath = false;
- need_libdl = false;
- need_libstdc = false;
- // need_libquadmath = false;
- need_rdynamic = false;
- break;
-
- case OPT_rdynamic:
- need_rdynamic = false;
- break;
-
- case OPT_Wl_:
- if( strstr(decoded_options[i].orig_option_with_args_text,
- "--allow-multiple-definitions") )
- {
- need_allow_multiple_definition = false;
- }
- break;
-
+ // FALLTHROUGH
case OPT_nostdlib:
case OPT_nodefaultlibs:
case OPT_r:
@@ -331,11 +262,8 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
case OPT_E:
// With these options, no libraries need be loaded
need_libgcobol = false;
- need_libmath = false;
need_libdl = false;
need_libstdc = false;
- // need_libquadmath = false;
- need_rdynamic = false;
break;
case OPT_static_libgcobol:
@@ -345,11 +273,7 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
case OPT_l:
n_infiles += 1;
- if(strcmp(decoded_options[i].arg, MATH_LIBRARY) == 0)
- {
- need_libmath = false;
- }
- else if(strcmp(decoded_options[i].arg, DL_LIBRARY) == 0)
+ if(strcmp(decoded_options[i].arg, DL_LIBRARY) == 0)
{
need_libdl = false;
}
@@ -455,10 +379,8 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
if( n_infiles == 0 )
{
need_libgcobol = false;
- need_libmath = false;
need_libdl = false;
need_libstdc = false;
- // need_libquadmath = false;
}
/* Second pass through arglist, transforming arguments as appropriate. */
@@ -588,11 +510,7 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
{
add_arg_lib(COBOL_LIBRARY, static_libgcobol);
}
- if( need_libmath)
- {
- add_arg_lib(MATH_LIBRARY, static_in_general);
- }
- if( need_libdl )
+ if( need_libdl )
{
add_arg_lib(DL_LIBRARY, static_in_general);
}
@@ -601,21 +519,6 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
add_arg_lib(STDCPP_LIBRARY, static_in_general);
}
- if( saw_OPT_shared && !saw_OPT_pic && !saw_OPT_PIC )
- {
- append_fpic();
- }
-
- if( need_rdynamic )
- {
- append_rdynamic();
- }
-
- if( need_allow_multiple_definition && (n_infiles || n_outfiles) )
- {
- append_allow_multiple_definition();
- }
-
if( prior_main )
{
char ach[] = "\"-main\" without a source file";
@@ -654,14 +557,12 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
*in_decoded_options = new_options;
}
-/*
- * Called before linking.
- * Returns 0 on success and -1 on failure.
- * Unused.
- */
+/* Called before linking. Returns 0 on success and -1 on failure. */
int
-lang_specific_pre_link( void )
- {
- return 0;
- }
+lang_specific_pre_link (void)
+{
+ if (need_libgcobol)
+ do_spec ("%:include(libgcobol.spec)");
+ return 0;
+}
diff --git a/gcc/cobol/genapi.cc b/gcc/cobol/genapi.cc
index fbe0bbc..c91237b 100644
--- a/gcc/cobol/genapi.cc
+++ b/gcc/cobol/genapi.cc
@@ -787,13 +787,13 @@ function_handle_from_name(cbl_refer_t &name,
{
gg_memcpy(gg_get_address_of(function_handle),
member(name.field->var_decl_node, "data"),
- build_int_cst_type(SIZE_T, sizeof(void *)));
+ sizeof_pointer);
}
else
{
gg_memcpy(gg_get_address_of(function_handle),
qualified_data_source(name),
- build_int_cst_type(SIZE_T, sizeof(void *)));
+ sizeof_pointer);
}
return function_handle;
}
@@ -8917,8 +8917,8 @@ parser_file_add(struct cbl_file_t *file)
gg_assign(array_of_keys,
gg_cast(build_pointer_type(cblc_field_p_type_node),
gg_malloc(build_int_cst_type(SIZE_T,
- (number_of_key_fields+1)
- *sizeof(void *)))));
+ (number_of_key_fields+1)
+ *int_size_in_bytes(VOID_P)))));
strcpy(achName, "_");
strcat(achName, file->name);
@@ -8929,8 +8929,8 @@ parser_file_add(struct cbl_file_t *file)
gg_assign(key_numbers,
gg_cast(build_pointer_type(INT),
gg_malloc(build_int_cst_type(SIZE_T,
- (number_of_key_fields+1)
- *sizeof(int)))));
+ (number_of_key_fields+1)
+ *int_size_in_bytes(INT)))));
strcpy(achName, "_");
strcat(achName, file->name);
@@ -8942,7 +8942,7 @@ parser_file_add(struct cbl_file_t *file)
gg_cast(build_pointer_type(INT),
gg_malloc(build_int_cst_type(SIZE_T,
(number_of_key_fields+1)
- *sizeof(int)))));
+ *int_size_in_bytes(INT)))));
size_t index = 0;
for( size_t i=0; i<file->nkey; i++ )
@@ -9686,7 +9686,9 @@ inspect_tally(bool backward,
gg_assign(int_size, build_int_cst_type(INT, n_integers));
gg_assign(integers,
gg_cast(SIZE_T_P,
- gg_realloc(integers, n_integers * sizeof(void *))));
+ gg_realloc(integers,
+ n_integers
+ * int_size_in_bytes(VOID_P))));
}
ELSE
{
@@ -9837,7 +9839,9 @@ inspect_replacing(int backward,
gg_assign(int_size, build_int_cst_type(INT, n_integers));
gg_assign(integers,
gg_cast(SIZE_T_P,
- gg_realloc(integers, n_integers * sizeof(void *))));
+ gg_realloc(integers,
+ n_integers
+ * int_size_in_bytes(VOID_P))));
}
ELSE
{
@@ -11074,7 +11078,9 @@ gg_array_of_field_pointers( size_t N,
cbl_field_t **fields )
{
tree retval = gg_define_variable(build_pointer_type(cblc_field_p_type_node));
- gg_assign(retval, gg_cast(build_pointer_type(cblc_field_p_type_node), gg_malloc( build_int_cst_type(SIZE_T, N * sizeof(void *)))));
+ gg_assign(retval, gg_cast(build_pointer_type(cblc_field_p_type_node),
+ gg_malloc(build_int_cst_type(SIZE_T,
+ N * int_size_in_bytes(VOID_P)))));
for(size_t i=0; i<N; i++)
{
gg_assign(gg_array_value(retval, i), gg_get_address_of(fields[i]->var_decl_node));
@@ -11566,7 +11572,8 @@ gg_array_of_file_pointers( size_t N,
{
tree retval = gg_define_variable(build_pointer_type(cblc_file_p_type_node));
gg_assign(retval, gg_cast( build_pointer_type(cblc_file_p_type_node),
- gg_malloc( build_int_cst_type(SIZE_T, N * sizeof(void *)))));
+ gg_malloc( build_int_cst_type(SIZE_T,
+ N * int_size_in_bytes(VOID_P)))));
for(size_t i=0; i<N; i++)
{
gg_assign(gg_array_value(retval, i), gg_get_address_of(files[i]->var_decl_node));
@@ -12853,7 +12860,7 @@ parser_set_pointers( size_t ntgt, cbl_refer_t *tgts, cbl_refer_t source )
COBOL_FUNCTION_RETURN_TYPE);
gg_memcpy(qualified_data_dest(tgts[i]),
gg_get_address_of(function_handle),
- build_int_cst_type(SIZE_T, sizeof(void *)));
+ sizeof_pointer);
}
else
{
diff --git a/gcc/cobol/gengen.cc b/gcc/cobol/gengen.cc
index e7a4e3c..f182f7f 100644
--- a/gcc/cobol/gengen.cc
+++ b/gcc/cobol/gengen.cc
@@ -3355,7 +3355,8 @@ tree
gg_array_of_size_t( size_t N, size_t *values)
{
tree retval = gg_define_variable(build_pointer_type(SIZE_T));
- gg_assign(retval, gg_cast(build_pointer_type(SIZE_T), gg_malloc( build_int_cst_type(SIZE_T, N * sizeof(size_t)))));
+ tree sz = build_int_cst_type(SIZE_T, N * int_size_in_bytes(SIZE_T));
+ gg_assign(retval, gg_cast(build_pointer_type(SIZE_T), gg_malloc(sz)));
for(size_t i=0; i<N; i++)
{
gg_assign(gg_array_value(retval, i), build_int_cst_type(SIZE_T, values[i]));
@@ -3367,7 +3368,7 @@ tree
gg_array_of_bytes( size_t N, unsigned char *values)
{
tree retval = gg_define_variable(UCHAR_P);
- gg_assign(retval, gg_cast(UCHAR_P, gg_malloc( build_int_cst_type(SIZE_T, N * sizeof(unsigned char)))));
+ gg_assign(retval, gg_cast(UCHAR_P, gg_malloc( build_int_cst_type(SIZE_T, N))));
for(size_t i=0; i<N; i++)
{
gg_assign(gg_array_value(retval, i), build_int_cst_type(UCHAR, values[i]));
diff --git a/gcc/cobol/parse.y b/gcc/cobol/parse.y
index 3f28201..61ffa7c 100644
--- a/gcc/cobol/parse.y
+++ b/gcc/cobol/parse.y
@@ -33,6 +33,7 @@
#include "coretypes.h"
#include "../../libgcobol/io.h"
#include "../../libgcobol/ec.h"
+ #include "tree.h"
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
@@ -3822,7 +3823,8 @@ data_clauses: data_clause
if( yydebug ) {
yywarn("expanding %s size from %u bytes to %zu "
"because it redefines %s with USAGE POINTER",
- field->name, field->size(), sizeof(void*),
+ field->name, field->size(),
+ (size_t)int_size_in_bytes(ptr_type_node),
redefined->name);
}
field->embiggen();
@@ -4282,7 +4284,7 @@ usage_clause1: usage COMPUTATIONAL[comp] native
if( gcobol_feature_embiggen() && redefined &&
is_numeric(redefined->type) && redefined->size() == 4) {
// For now, we allow POINTER to expand a 32-bit item to 64 bits.
- field->data.capacity = sizeof(void *);
+ field->data.capacity = int_size_in_bytes(ptr_type_node);
dbgmsg("%s: expanding #%zu %s capacity %u => %u", __func__,
field_index(redefined), redefined->name,
redefined->data.capacity, field->data.capacity);
diff --git a/gcc/cobol/symbols.cc b/gcc/cobol/symbols.cc
index 5043125..4067459 100644
--- a/gcc/cobol/symbols.cc
+++ b/gcc/cobol/symbols.cc
@@ -3567,7 +3567,7 @@ cbl_field_t::is_ascii() const {
* compilation, if it moves off the default, it adjusts only once, and
* never reverts.
*/
-static const char standard_internal[] = "CP1252//";
+static const char standard_internal[] = "CP1252";
extern os_locale_t os_locale;
static const char *
@@ -3595,6 +3595,10 @@ cbl_field_t::internalize() {
static iconv_t cd = iconv_open(tocode, fromcode);
static const size_t noconv = size_t(-1);
+ if (cd == (iconv_t)-1) {
+ yywarn("failed iconv_open tocode = '%s' fromcode = %s", tocode, fromcode);
+ }
+
// Sat Mar 16 11:45:08 2024: require temporary environment for testing
if( getenv( "INTERNALIZE_NO") ) return data.initial;
diff --git a/gcc/combine.cc b/gcc/combine.cc
index 1b6c4e3..5f08518 100644
--- a/gcc/combine.cc
+++ b/gcc/combine.cc
@@ -309,6 +309,7 @@ static int *uid_insn_cost;
struct insn_link {
rtx_insn *insn;
unsigned int regno;
+ int insn_count;
struct insn_link *next;
};
@@ -342,6 +343,7 @@ alloc_insn_link (rtx_insn *insn, unsigned int regno, struct insn_link *next)
sizeof (struct insn_link));
l->insn = insn;
l->regno = regno;
+ l->insn_count = 0;
l->next = next;
return l;
}
@@ -472,7 +474,8 @@ static void move_deaths (rtx, rtx, int, rtx_insn *, rtx *);
static bool reg_bitfield_target_p (rtx, rtx);
static void distribute_notes (rtx, rtx_insn *, rtx_insn *, rtx_insn *,
rtx, rtx, rtx);
-static void distribute_links (struct insn_link *);
+static void distribute_links (struct insn_link *, rtx_insn * = nullptr,
+ int limit = INT_MAX);
static void mark_used_regs_combine (rtx);
static void record_promoted_value (rtx_insn *, rtx);
static bool unmentioned_reg_p (rtx, rtx);
@@ -4210,16 +4213,13 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0,
adjust_for_new_dest (i3);
}
- /* If I2 didn't change, this is not a combination (but a simplification or
- canonicalisation with context), which should not be done here. Doing
- it here explodes the algorithm. Don't. */
- if (rtx_equal_p (newi2pat, PATTERN (i2)))
- {
- if (dump_file)
- fprintf (dump_file, "i2 didn't change, not doing this\n");
- undo_all ();
- return 0;
- }
+ bool only_i3_changed = !i0 && !i1 && rtx_equal_p (newi2pat, PATTERN (i2));
+
+ /* If only i3 has changed, any split of the combined instruction just
+ restored i2 to its original state. No destinations moved from i3
+ to i2. */
+ if (only_i3_changed)
+ split_i2i3 = false;
/* We now know that we can do this combination. Merge the insns and
update the status of registers and LOG_LINKS. */
@@ -4595,10 +4595,15 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0,
NULL_RTX, NULL_RTX, NULL_RTX);
}
- distribute_links (i3links);
- distribute_links (i2links);
- distribute_links (i1links);
- distribute_links (i0links);
+ if (only_i3_changed)
+ distribute_links (i3links, i3, param_max_combine_search_insns);
+ else
+ {
+ distribute_links (i3links);
+ distribute_links (i2links, i2);
+ distribute_links (i1links);
+ distribute_links (i0links);
+ }
if (REG_P (i2dest))
{
@@ -4787,6 +4792,9 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0,
combine_successes++;
undo_commit ();
+ if (only_i3_changed)
+ return i3;
+
rtx_insn *ret = newi2pat ? i2 : i3;
if (added_links_insn && DF_INSN_LUID (added_links_insn) < DF_INSN_LUID (ret))
ret = added_links_insn;
@@ -14986,10 +14994,15 @@ distribute_notes (rtx notes, rtx_insn *from_insn, rtx_insn *i3, rtx_insn *i2,
/* Similarly to above, distribute the LOG_LINKS that used to be present on
I3, I2, and I1 to new locations. This is also called to add a link
- pointing at I3 when I3's destination is changed. */
+ pointing at I3 when I3's destination is changed.
+
+ If START is nonnull and an insn, we know that the next location for each
+ link is no earlier than START. LIMIT is the maximum number of nondebug
+ instructions that can be scanned when looking for the next use of a
+ definition. */
static void
-distribute_links (struct insn_link *links)
+distribute_links (struct insn_link *links, rtx_insn *start, int limit)
{
struct insn_link *link, *next_link;
@@ -15055,7 +15068,13 @@ distribute_links (struct insn_link *links)
I3 to I2. Also note that not much searching is typically done here
since most links don't point very far away. */
- for (insn = NEXT_INSN (link->insn);
+ int count = 0;
+ insn = start;
+ if (!insn || NOTE_P (insn))
+ insn = NEXT_INSN (link->insn);
+ else
+ count = link->insn_count;
+ for (;
(insn && (this_basic_block->next_bb == EXIT_BLOCK_PTR_FOR_FN (cfun)
|| BB_HEAD (this_basic_block->next_bb) != insn));
insn = NEXT_INSN (insn))
@@ -15075,6 +15094,11 @@ distribute_links (struct insn_link *links)
}
else if (INSN_P (insn) && reg_set_p (reg, insn))
break;
+ else if (count >= limit)
+ break;
+ else
+ count += 1;
+ link->insn_count = count;
/* If we found a place to put the link, place it there unless there
is already a link to the same insn as LINK at that point. */
diff --git a/gcc/common.opt b/gcc/common.opt
index b9e74cd..2c8fdde 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -2055,6 +2055,7 @@ Enum(ilsop_fn) String(memset) Value(ILSOP_MEMSET) Set(4)
fcf-protection
Common RejectNegative Alias(fcf-protection=,full)
+Equivalent to -fcf-protection=full.
fcf-protection=
Common Joined RejectNegative Enum(cf_protection_level) EnumSet Var(flag_cf_protection) Init(CF_NONE)
diff --git a/gcc/config/aarch64/aarch64-cores.def b/gcc/config/aarch64/aarch64-cores.def
index 0e22d72..7f204fd 100644
--- a/gcc/config/aarch64/aarch64-cores.def
+++ b/gcc/config/aarch64/aarch64-cores.def
@@ -173,6 +173,22 @@ AARCH64_CORE("cortex-a76.cortex-a55", cortexa76cortexa55, cortexa53, V8_2A, (F
AARCH64_CORE("cortex-r82", cortexr82, cortexa53, V8R, (), cortexa53, 0x41, 0xd15, -1)
AARCH64_CORE("cortex-r82ae", cortexr82ae, cortexa53, V8R, (), cortexa53, 0x41, 0xd14, -1)
+/* Apple (A12 and M) cores.
+ Known part numbers as listed in other public sources.
+ Placeholders for schedulers, generic_armv8_a for costs.
+ A12 seems mostly 8.3, M1 is 8.5 without BTI, M2 and M3 are 8.6
+ From measurements made so far the odd-number core IDs are performance. */
+AARCH64_CORE("apple-a12", applea12, cortexa53, V8_3A, (), generic_armv8_a, 0x61, 0x12, -1)
+AARCH64_CORE("apple-m1", applem1_0, cortexa57, V8_5A, (), generic_armv8_a, 0x61, AARCH64_BIG_LITTLE (0x21, 0x20), -1)
+AARCH64_CORE("apple-m1", applem1_1, cortexa57, V8_5A, (), generic_armv8_a, 0x61, AARCH64_BIG_LITTLE (0x23, 0x22), -1)
+AARCH64_CORE("apple-m1", applem1_2, cortexa57, V8_5A, (), generic_armv8_a, 0x61, AARCH64_BIG_LITTLE (0x25, 0x24), -1)
+AARCH64_CORE("apple-m1", applem1_3, cortexa57, V8_5A, (), generic_armv8_a, 0x61, AARCH64_BIG_LITTLE (0x29, 0x28), -1)
+AARCH64_CORE("apple-m2", applem2_0, cortexa57, V8_6A, (), generic_armv8_a, 0x61, AARCH64_BIG_LITTLE (0x31, 0x30), -1)
+AARCH64_CORE("apple-m2", applem2_1, cortexa57, V8_6A, (), generic_armv8_a, 0x61, AARCH64_BIG_LITTLE (0x33, 0x32), -1)
+AARCH64_CORE("apple-m2", applem2_2, cortexa57, V8_6A, (), generic_armv8_a, 0x61, AARCH64_BIG_LITTLE (0x35, 0x34), -1)
+AARCH64_CORE("apple-m2", applem2_3, cortexa57, V8_6A, (), generic_armv8_a, 0x61, AARCH64_BIG_LITTLE (0x39, 0x38), -1)
+AARCH64_CORE("apple-m3", applem3_0, cortexa57, V8_6A, (), generic_armv8_a, 0x61, AARCH64_BIG_LITTLE (0x49, 0x48), -1)
+
/* Armv9.0-A Architecture Processors. */
/* Arm ('A') cores. */
diff --git a/gcc/config/aarch64/aarch64-sve-builtins.cc b/gcc/config/aarch64/aarch64-sve-builtins.cc
index 44e4807..3651926 100644
--- a/gcc/config/aarch64/aarch64-sve-builtins.cc
+++ b/gcc/config/aarch64/aarch64-sve-builtins.cc
@@ -5174,7 +5174,11 @@ bool
verify_type_context (location_t loc, type_context_kind context,
const_tree type, bool silent_p)
{
- if (!sizeless_type_p (type))
+ const_tree tmp = type;
+ if (omp_type_context (context) && POINTER_TYPE_P (type))
+ tmp = strip_pointer_types (tmp);
+
+ if (!sizeless_type_p (tmp))
return true;
switch (context)
@@ -5234,6 +5238,37 @@ verify_type_context (location_t loc, type_context_kind context,
if (!silent_p)
error_at (loc, "capture by copy of SVE type %qT", type);
return false;
+
+ case TCTX_OMP_MAP:
+ if (!silent_p)
+ error_at (loc, "SVE type %qT not allowed in %<map%> clause", type);
+ return false;
+
+ case TCTX_OMP_MAP_IMP_REF:
+ if (!silent_p)
+ error ("cannot reference %qT object types in %<target%> region", type);
+ return false;
+
+ case TCTX_OMP_PRIVATE:
+ if (!silent_p)
+ error_at (loc, "SVE type %qT not allowed in"
+ " %<target%> %<private%> clause", type);
+ return false;
+
+ case TCTX_OMP_FIRSTPRIVATE:
+ if (!silent_p)
+ error_at (loc, "SVE type %qT not allowed in"
+ " %<target%> %<firstprivate%> clause", type);
+ return false;
+
+ case TCTX_OMP_DEVICE_ADDR:
+ if (!silent_p)
+ error_at (loc, "SVE type %qT not allowed in"
+ " %<target%> device clauses", type);
+ return false;
+
+ default:
+ break;
}
gcc_unreachable ();
}
diff --git a/gcc/config/aarch64/aarch64-tune.md b/gcc/config/aarch64/aarch64-tune.md
index 56a914f..982074c 100644
--- a/gcc/config/aarch64/aarch64-tune.md
+++ b/gcc/config/aarch64/aarch64-tune.md
@@ -1,5 +1,5 @@
;; -*- buffer-read-only: t -*-
;; Generated automatically by gentune.sh from aarch64-cores.def
(define_attr "tune"
- "cortexa34,cortexa35,cortexa53,cortexa57,cortexa72,cortexa73,thunderx,thunderxt88,thunderxt88p1,octeontx,octeontxt81,octeontxt83,thunderxt81,thunderxt83,ampere1,ampere1a,ampere1b,emag,xgene1,falkor,qdf24xx,exynosm1,phecda,thunderx2t99p1,vulcan,thunderx2t99,cortexa55,cortexa75,cortexa76,cortexa76ae,cortexa77,cortexa78,cortexa78ae,cortexa78c,cortexa65,cortexa65ae,cortexx1,cortexx1c,neoversen1,ares,neoversee1,octeontx2,octeontx2t98,octeontx2t96,octeontx2t93,octeontx2f95,octeontx2f95n,octeontx2f95mm,a64fx,fujitsu_monaka,tsv110,thunderx3t110,neoversev1,zeus,neoverse512tvb,saphira,oryon1,cortexa57cortexa53,cortexa72cortexa53,cortexa73cortexa35,cortexa73cortexa53,cortexa75cortexa55,cortexa76cortexa55,cortexr82,cortexr82ae,cortexa510,cortexa520,cortexa520ae,cortexa710,cortexa715,cortexa720,cortexa720ae,cortexa725,cortexx2,cortexx3,cortexx4,cortexx925,neoversen2,cobalt100,neoversen3,neoversev2,grace,neoversev3,neoversev3ae,demeter,olympus,generic,generic_armv8_a,generic_armv9_a"
+ "cortexa34,cortexa35,cortexa53,cortexa57,cortexa72,cortexa73,thunderx,thunderxt88,thunderxt88p1,octeontx,octeontxt81,octeontxt83,thunderxt81,thunderxt83,ampere1,ampere1a,ampere1b,emag,xgene1,falkor,qdf24xx,exynosm1,phecda,thunderx2t99p1,vulcan,thunderx2t99,cortexa55,cortexa75,cortexa76,cortexa76ae,cortexa77,cortexa78,cortexa78ae,cortexa78c,cortexa65,cortexa65ae,cortexx1,cortexx1c,neoversen1,ares,neoversee1,octeontx2,octeontx2t98,octeontx2t96,octeontx2t93,octeontx2f95,octeontx2f95n,octeontx2f95mm,a64fx,fujitsu_monaka,tsv110,thunderx3t110,neoversev1,zeus,neoverse512tvb,saphira,oryon1,cortexa57cortexa53,cortexa72cortexa53,cortexa73cortexa35,cortexa73cortexa53,cortexa75cortexa55,cortexa76cortexa55,cortexr82,cortexr82ae,applea12,applem1_0,applem1_1,applem1_2,applem1_3,applem2_0,applem2_1,applem2_2,applem2_3,applem3_0,cortexa510,cortexa520,cortexa520ae,cortexa710,cortexa715,cortexa720,cortexa720ae,cortexa725,cortexx2,cortexx3,cortexx4,cortexx925,neoversen2,cobalt100,neoversen3,neoversev2,grace,neoversev3,neoversev3ae,demeter,olympus,generic,generic_armv8_a,generic_armv9_a"
(const (symbol_ref "((enum attr_tune) aarch64_tune)")))
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index 13da3d8..8507243 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -2449,11 +2449,11 @@ constexpr wide_int_bitmask PTA_DIAMONDRAPIDS = PTA_SKYLAKE | PTA_PKU | PTA_SHA
| PTA_WBNOINVD | PTA_CLWB | PTA_MOVDIRI | PTA_MOVDIR64B | PTA_ENQCMD
| PTA_CLDEMOTE | PTA_PTWRITE | PTA_WAITPKG | PTA_SERIALIZE | PTA_TSXLDTRK
| PTA_AMX_TILE | PTA_AMX_INT8 | PTA_AMX_BF16 | PTA_UINTR | PTA_AVXVNNI
- | PTA_AMX_FP16 | PTA_PREFETCHI | PTA_AMX_COMPLEX | PTA_AVX10_1
- | PTA_AVXIFMA | PTA_AVXNECONVERT | PTA_AVXVNNIINT16 | PTA_AVXVNNIINT8
- | PTA_CMPCCXADD | PTA_SHA512 | PTA_SM3 | PTA_SM4 | PTA_AVX10_2
- | PTA_APX_F | PTA_AMX_AVX512 | PTA_AMX_FP8 | PTA_AMX_TF32 | PTA_AMX_TRANSPOSE
- | PTA_MOVRS | PTA_AMX_MOVRS | PTA_USER_MSR;
+ | PTA_AMX_FP16 | PTA_PREFETCHI | PTA_AMX_COMPLEX | PTA_AVX10_1_256
+ | PTA_AVX10_1 | PTA_AVXIFMA | PTA_AVXNECONVERT | PTA_AVXVNNIINT16
+ | PTA_AVXVNNIINT8 | PTA_CMPCCXADD | PTA_SHA512 | PTA_SM3 | PTA_SM4
+ | PTA_AVX10_2 | PTA_APX_F | PTA_AMX_AVX512 | PTA_AMX_FP8 | PTA_AMX_TF32
+ | PTA_AMX_TRANSPOSE | PTA_MOVRS | PTA_AMX_MOVRS | PTA_USER_MSR;
constexpr wide_int_bitmask PTA_BDVER1 = PTA_64BIT | PTA_MMX | PTA_SSE
| PTA_SSE2 | PTA_SSE3 | PTA_SSE4A | PTA_CX16 | PTA_ABM | PTA_SSSE3
diff --git a/gcc/config/nvptx/nvptx.cc b/gcc/config/nvptx/nvptx.cc
index de0ce5d..87364bf 100644
--- a/gcc/config/nvptx/nvptx.cc
+++ b/gcc/config/nvptx/nvptx.cc
@@ -7766,7 +7766,9 @@ nvptx_asm_output_def_from_decls (FILE *stream, tree name,
return;
}
+#ifdef ACCEL_COMPILER
emit_ptx_alias:
+#endif
cgraph_node *cnode = cgraph_node::get (name);
if (!cnode->referred_to_p ())
diff --git a/gcc/config/nvptx/nvptx.opt b/gcc/config/nvptx/nvptx.opt
index 02d36b3..9be81ae 100644
--- a/gcc/config/nvptx/nvptx.opt
+++ b/gcc/config/nvptx/nvptx.opt
@@ -173,12 +173,12 @@ Target Var(nvptx_fake_ptx_alloca) Init(0) Undocumented
; With '-mfake-ptx-alloca' enabled, the user-visible behavior changes only
; for configurations where PTX 'alloca' is not available. Rather than a
; compile-time 'sorry, unimplemented: dynamic stack allocation not supported'
-; in presence of dynamic stack allocation, compilation and assembly then
-; succeeds. However, attempting to link in such '*.o' files then fails due
-; to unresolved symbol '__GCC_nvptx__PTX_alloca_not_supported'.
+; in presence of dynamic stack allocation, with '-mfake-ptx-alloca' enabled,
+; compilation, assembly, and linking succeeds, as does execution, in case that
+; 'alloca' is not attempted (if only used in error code paths, for example),
+; and a run-time failure only in case that 'alloca' is actually attempted.
;
; This is meant to be used in scenarios where large volumes of code are
; compiled, a small fraction of which runs into dynamic stack allocation, but
; these parts are not important for specific use cases, and we'd thus like the
-; build to succeed, and error out just upon actual, very rare use of the
-; offending '*.o' files.
+; build to succeed, and error out just upon actual, very rare use of 'alloca'.
diff --git a/gcc/config/riscv/freebsd.h b/gcc/config/riscv/freebsd.h
index 2dc7055..217e0ac 100644
--- a/gcc/config/riscv/freebsd.h
+++ b/gcc/config/riscv/freebsd.h
@@ -42,7 +42,7 @@ along with GCC; see the file COPYING3. If not see
#define LINK_SPEC " \
-melf" XLEN_SPEC DEFAULT_ENDIAN_SPEC "riscv \
%{p:%nconsider using `-pg' instead of `-p' with gprof (1)} \
- " FBSD_LINK_PG_NOTES " \
+ " FBSD_LINK_PG_NOTE " \
%{v:-V} \
%{assert*} %{R*} %{rpath*} %{defsym*} \
-X \
diff --git a/gcc/config/riscv/vector.md b/gcc/config/riscv/vector.md
index 8ee43cf..51eb64f 100644
--- a/gcc/config/riscv/vector.md
+++ b/gcc/config/riscv/vector.md
@@ -3939,7 +3939,7 @@
(any_extend:VWEXTI
(match_operand:<V_DOUBLE_TRUNC> 3 "register_operand" " vr, vr"))
(match_operand:VWEXTI 2 "vector_merge_operand" " vu, 0")))]
- "TARGET_VECTOR"
+ "TARGET_VECTOR && !TARGET_XTHEADVECTOR"
"v<sz>ext.vf2\t%0,%3%p1"
[(set_attr "type" "vext")
(set_attr "mode" "<MODE>")])
@@ -3959,7 +3959,7 @@
(any_extend:VQEXTI
(match_operand:<V_QUAD_TRUNC> 3 "register_operand" " vr, vr"))
(match_operand:VQEXTI 2 "vector_merge_operand" " vu, 0")))]
- "TARGET_VECTOR"
+ "TARGET_VECTOR && !TARGET_XTHEADVECTOR"
"v<sz>ext.vf4\t%0,%3%p1"
[(set_attr "type" "vext")
(set_attr "mode" "<MODE>")])
@@ -3979,7 +3979,7 @@
(any_extend:VOEXTI
(match_operand:<V_OCT_TRUNC> 3 "register_operand" " vr, vr"))
(match_operand:VOEXTI 2 "vector_merge_operand" " vu, 0")))]
- "TARGET_VECTOR"
+ "TARGET_VECTOR && !TARGET_XTHEADVECTOR"
"v<sz>ext.vf8\t%0,%3%p1"
[(set_attr "type" "vext")
(set_attr "mode" "<MODE>")])
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 91ea35d..d266ef9 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,39 @@
+2025-04-08 Jason Merrill <jason@redhat.com>
+
+ PR c++/117530
+ * pt.cc (instantiate_template): Check retrieve_specialization after
+ tsubst.
+
+2025-04-07 Jason Merrill <jason@redhat.com>
+
+ PR c++/119652
+ * constexpr.cc (cxx_eval_outermost_constant_expr): Also don't add a
+ TARGET_EXPR around AGGR_INIT_EXPR.
+
+2025-04-06 Patrick Palka <ppalka@redhat.com>
+
+ PR c++/118626
+ * pt.cc (maybe_dependent_member_ref): Restrict TYPENAME_TYPE
+ shortcut to non-typedef TYPE_DECL.
+
+2025-04-06 Patrick Palka <ppalka@redhat.com>
+
+ PR c++/118626
+ * pt.cc (maybe_dependent_member_ref): Substitute and return the
+ stripped type if we decided to not rewrite it directly.
+
+2025-04-05 Patrick Palka <ppalka@redhat.com>
+
+ PR c++/118249
+ * constexpr.cc (potential_constant_expression_1)
+ <case INDIRECT_REF>: Remove obsolete *this handling.
+
+2025-04-05 Jason Merrill <jason@redhat.com>
+
+ PR c++/118629
+ * name-lookup.cc (pushdecl_outermost_localscope): Look for an
+ sk_block.
+
2025-04-04 Nathaniel Shead <nathanieloshead@gmail.com>
PR c++/119564
diff --git a/gcc/cp/constexpr.cc b/gcc/cp/constexpr.cc
index 9a57f48..497f64f 100644
--- a/gcc/cp/constexpr.cc
+++ b/gcc/cp/constexpr.cc
@@ -9316,7 +9316,8 @@ cxx_eval_outermost_constant_expr (tree t, bool allow_non_constant,
if (TREE_CODE (t) == TARGET_EXPR
&& TARGET_EXPR_INITIAL (t) == r)
return t;
- else if (TREE_CODE (t) == CONSTRUCTOR || TREE_CODE (t) == CALL_EXPR)
+ else if (TREE_CODE (t) == CONSTRUCTOR || TREE_CODE (t) == CALL_EXPR
+ || TREE_CODE (t) == AGGR_INIT_EXPR)
/* Don't add a TARGET_EXPR if our argument didn't have one. */;
else if (TREE_CODE (t) == TARGET_EXPR && TARGET_EXPR_CLEANUP (t))
r = get_target_expr (r);
@@ -10279,22 +10280,7 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now,
return true;
case INDIRECT_REF:
- {
- tree x = TREE_OPERAND (t, 0);
- STRIP_NOPS (x);
- if (is_this_parameter (x) && !is_capture_proxy (x))
- {
- if (now || !var_in_maybe_constexpr_fn (x))
- {
- if (flags & tf_error)
- constexpr_error (loc, fundef_p, "use of %<this%> in a "
- "constant expression");
- return false;
- }
- return true;
- }
- return RECUR (x, rval);
- }
+ return RECUR (TREE_OPERAND (t, 0), rval);
case STATEMENT_LIST:
for (tree stmt : tsi_range (t))
diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index f7c56a1..8f35fa7 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -17741,13 +17741,37 @@ maybe_dependent_member_ref (tree t, tree args, tsubst_flags_t complain,
if (TYPE_P (t))
{
+ bool stripped = false;
if (typedef_variant_p (t))
- t = strip_typedefs (t);
- tree decl = TYPE_NAME (t);
+ {
+ /* Since this transformation may undesirably turn a deduced context
+ into a non-deduced one, we'd rather strip typedefs than perform
+ the transformation. */
+ tree u = strip_typedefs (t);
+ if (u != t)
+ {
+ stripped = true;
+ t = u;
+ }
+ }
+ decl = TYPE_NAME (t);
if (decl)
decl = maybe_dependent_member_ref (decl, args, complain, in_decl);
if (!decl)
- return NULL_TREE;
+ {
+ if (stripped)
+ /* The original type was an alias from the current instantiation
+ which we stripped to something outside it. At this point we
+ need to commit to using the stripped type rather than deferring
+ to the caller (which would use the original type), to ensure
+ eligible bits of the stripped type get transformed. */
+ return tsubst (t, args, complain, in_decl);
+ else
+ /* The original type wasn't a typedef, and we decided it doesn't
+ need rewriting, so just let the caller (tsubst) substitute it
+ normally. */
+ return NULL_TREE;
+ }
return cp_build_qualified_type (TREE_TYPE (decl), cp_type_quals (t),
complain);
}
@@ -17765,7 +17789,8 @@ maybe_dependent_member_ref (tree t, tree args, tsubst_flags_t complain,
if (TREE_CODE (t) == TYPE_DECL)
{
- if (TREE_CODE (TREE_TYPE (t)) == TYPENAME_TYPE
+ if (!is_typedef_decl (t)
+ && TREE_CODE (TREE_TYPE (t)) == TYPENAME_TYPE
&& TYPE_NAME (TREE_TYPE (t)) == t)
/* The TYPE_DECL for a typename has DECL_CONTEXT of the typename
scope, but it doesn't need to be rewritten again. */
@@ -22650,7 +22675,7 @@ instantiate_template (tree tmpl, tree orig_args, tsubst_flags_t complain)
FUNCTION_DECL which is the desired context for access checking
is not built yet. We solve this chicken-and-egg problem by
deferring all checks until we have the FUNCTION_DECL. */
- push_deferring_access_checks (dk_deferred);
+ deferring_access_check_sentinel dacs (dk_deferred);
/* Instantiation of the function happens in the context of the function
template, not the context of the overload resolution we're doing. */
@@ -22708,10 +22733,13 @@ instantiate_template (tree tmpl, tree orig_args, tsubst_flags_t complain)
pop_from_top_level ();
if (fndecl == error_mark_node)
- {
- pop_deferring_access_checks ();
- return error_mark_node;
- }
+ return error_mark_node;
+
+ /* Substituting the type might have recursively instantiated this
+ same alias (c++/117530). */
+ if (DECL_ALIAS_TEMPLATE_P (gen_tmpl)
+ && (spec = retrieve_specialization (gen_tmpl, targ_ptr, hash)))
+ return spec;
/* The DECL_TI_TEMPLATE should always be the immediate parent
template, not the most general template. */
@@ -22746,7 +22774,6 @@ instantiate_template (tree tmpl, tree orig_args, tsubst_flags_t complain)
access_ok = false;
pop_access_scope (fndecl);
}
- pop_deferring_access_checks ();
/* If we've just instantiated the main entry point for a function,
instantiate all the alternate entry points as well. We do this
diff --git a/gcc/cse.cc b/gcc/cse.cc
index 70d5caa..7bdd3b0 100644
--- a/gcc/cse.cc
+++ b/gcc/cse.cc
@@ -6762,7 +6762,18 @@ cse_main (rtx_insn *f ATTRIBUTE_UNUSED, int nregs)
modify the liveness of DEST.
DEST is set to pc_rtx for a trapping insn, or for an insn with side effects.
We must then count uses of a SET_DEST regardless, because the insn can't be
- deleted here. */
+ deleted here.
+ Also count uses of a SET_DEST if it has been used by an earlier insn,
+ but in that case only when incrementing and not when decrementing, effectively
+ making setters of such a pseudo non-eliminable. This is for cases like
+ (set (reg x) (expr))
+ ...
+ (set (reg y) (expr (reg (x))))
+ ...
+ (set (reg x) (expr (reg (x))))
+ where we can't eliminate the last insn because x is is still used, if y
+ is unused we can eliminate the middle insn and when considering the first insn
+ we used to eliminate it despite it being used in the last insn. */
static void
count_reg_usage (rtx x, int *counts, rtx dest, int incr)
@@ -6778,7 +6789,7 @@ count_reg_usage (rtx x, int *counts, rtx dest, int incr)
switch (code = GET_CODE (x))
{
case REG:
- if (x != dest)
+ if (x != dest || (incr > 0 && counts[REGNO (x)]))
counts[REGNO (x)] += incr;
return;
diff --git a/gcc/d/ChangeLog b/gcc/d/ChangeLog
index 1ea467e..23b8a81 100644
--- a/gcc/d/ChangeLog
+++ b/gcc/d/ChangeLog
@@ -1,3 +1,11 @@
+2025-04-08 Iain Buclaw <ibuclaw@gdcproject.org>
+
+ * dmd/MERGE: Merge upstream dmd 51816cd01d.
+
+2025-04-06 Sandra Loosemore <sloosemore@baylibre.com>
+
+ * lang.opt.urls: Regenerate.
+
2025-04-02 Iain Buclaw <ibuclaw@gdcproject.org>
* dmd/MERGE: Merge upstream dmd ed17b3e95d.
diff --git a/gcc/d/dmd/MERGE b/gcc/d/dmd/MERGE
index bd297b6..a05a50e 100644
--- a/gcc/d/dmd/MERGE
+++ b/gcc/d/dmd/MERGE
@@ -1,4 +1,4 @@
-ed17b3e95dc3fc3264a4c91843da824f5541f3e1
+51816cd01deee5cc1d7d2c6e1e24788ec655b73e
The first line of this file holds the git revision number of the last
merge done from the dlang/dmd repository.
diff --git a/gcc/d/dmd/expressionsem.d b/gcc/d/dmd/expressionsem.d
index b0278cb..19111e3 100644
--- a/gcc/d/dmd/expressionsem.d
+++ b/gcc/d/dmd/expressionsem.d
@@ -641,21 +641,25 @@ TupleDeclaration isAliasThisTuple(Expression e)
Type t = e.type.toBasetype();
while (true)
{
- Dsymbol s = t.toDsymbol(null);
- if (!s)
- return null;
- auto ad = s.isAggregateDeclaration();
- if (!ad)
- return null;
- s = ad.aliasthis ? ad.aliasthis.sym : null;
- if (s && s.isVarDeclaration())
+ if (Dsymbol s = t.toDsymbol(null))
{
- TupleDeclaration td = s.isVarDeclaration().toAlias().isTupleDeclaration();
- if (td && td.isexp)
- return td;
+ if (auto ad = s.isAggregateDeclaration())
+ {
+ s = ad.aliasthis ? ad.aliasthis.sym : null;
+ if (s && s.isVarDeclaration())
+ {
+ TupleDeclaration td = s.isVarDeclaration().toAlias().isTupleDeclaration();
+ if (td && td.isexp)
+ return td;
+ }
+ if (Type att = t.aliasthisOf())
+ {
+ t = att;
+ continue;
+ }
+ }
}
- if (Type att = t.aliasthisOf())
- t = att;
+ return null;
}
}
diff --git a/gcc/d/lang.opt.urls b/gcc/d/lang.opt.urls
index 40bbca7..fa311d4 100644
--- a/gcc/d/lang.opt.urls
+++ b/gcc/d/lang.opt.urls
@@ -75,6 +75,9 @@ UrlSuffix(gcc/Warning-Options.html#index-Wextra) LangUrlSuffix_D(gdc/Warnings.ht
Wmismatched-special-enum
LangUrlSuffix_D(gdc/Warnings.html#index-Wmismatched-special-enum)
+Wpsabi
+UrlSuffix(gcc/Warning-Options.html#index-Wno-psabi)
+
Wspeculative
LangUrlSuffix_D(gdc/Warnings.html#index-Wno-speculative)
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index 16ad83f..ae3357f 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -13814,7 +13814,13 @@ The C99 standard added @code{_Bool} as a C language keyword naming the
boolean type. As an extension, GNU C also recognizes @code{_Bool} in
C90 mode as well as with @option{-std=c99} and later.
-GNU C++ does not support the @code{_Bool} keyword.
+C23 added @code{bool} as the preferred name of the boolean type, but
+@code{_Bool} also remains a standard keyword in the language and is
+supported as such by GCC with @option{-std=c23}.
+
+GNU C++ does not support @code{_Bool} as a keyword, but including
+@code{<stdbool.h>} defines it as a macro in terms of standard C++'s
+@code{bool} type.
@node Variadic Macros
@subsection Macros with a Variable Number of Arguments.
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 4c9af42..a040d65 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -406,7 +406,9 @@ Objective-C and Objective-C++ Dialects}.
-Wparentheses -Wno-pedantic-ms-format
-Wpointer-arith -Wno-pointer-compare -Wno-pointer-to-int-cast
-Wno-pragmas -Wno-pragma-once-outside-header -Wno-prio-ctor-dtor
--Wredundant-decls -Wrestrict -Wno-return-local-addr -Wreturn-type
+-Wno-psabi
+-Wredundant-decls -Wrestrict
+-Wno-return-local-addr -Wreturn-type
-Wno-scalar-storage-order -Wsequence-point
-Wshadow -Wshadow=global -Wshadow=local -Wshadow=compatible-local
-Wno-shadow-ivar
@@ -673,7 +675,7 @@ Objective-C and Objective-C++ Dialects}.
-fsanitize=@var{style} -fsanitize-recover -fsanitize-recover=@var{style}
-fsanitize-trap -fsanitize-trap=@var{style}
-fasan-shadow-offset=@var{number} -fsanitize-sections=@var{s1},@var{s2},...
--fsanitize-undefined-trap-on-error -fbounds-check
+-fsanitize-undefined-trap-on-error -fbounds-check -fcf-protection
-fcf-protection=@r{[}full@r{|}branch@r{|}return@r{|}none@r{|}check@r{]}
-fharden-compares -fharden-conditional-branches -fhardened
-fharden-control-flow-redundancy -fhardcfr-skip-leaf
@@ -6178,10 +6180,11 @@ messages.
@end table
You can request many specific warnings with options beginning with
-@samp{-W}, for example @option{-Wimplicit} to request warnings on
-implicit declarations. Each of these specific warning options also
-has a negative form beginning @samp{-Wno-} to turn off warnings; for
-example, @option{-Wno-implicit}. This manual lists only one of the
+@samp{-W}, for example @option{-Wunused-variable} to request warnings on
+declarations of variables that are never used.
+Each of these specific warning options also
+has a negative form beginning with @samp{-Wno-} to turn off warnings; for
+example, @option{-Wno-unused-variable}. This manual lists only one of the
two forms, whichever is not the default. For further
language-specific options also refer to @ref{C++ Dialect Options} and
@ref{Objective-C and Objective-C++ Dialect Options}.
@@ -6190,15 +6193,15 @@ Additional warnings can be produced by enabling the static analyzer;
Some options, such as @option{-Wall} and @option{-Wextra}, turn on other
options, such as @option{-Wunused}, which may turn on further options,
-such as @option{-Wunused-value}. The combined effect of positive and
+such as @option{-Wunused-variable}. The combined effect of positive and
negative forms is that more specific options have priority over less
-specific ones, independently of their position in the command-line. For
+specific ones, independently of their position in the command line. For
options of the same specificity, the last one takes effect. Options
enabled or disabled via pragmas (@pxref{Diagnostic Pragmas}) take effect
-as if they appeared at the end of the command-line.
+as if they appeared at the end of the command line.
When an unrecognized warning option is requested (e.g.,
-@option{-Wunknown-warning}), GCC emits a diagnostic stating
+@option{-Wunknown-warning}), GCC gives an error stating
that the option is not recognized. However, if the @option{-Wno-} form
is used, the behavior is slightly different: no diagnostic is
produced for @option{-Wno-unknown-warning} unless other diagnostics
@@ -6207,11 +6210,11 @@ with old compilers, but if something goes wrong, the compiler
warns that an unrecognized option is present.
The effectiveness of some warnings depends on optimizations also being
-enabled. For example @option{-Wsuggest-final-types} is more effective
-with link-time optimization and some instances of other warnings may
+enabled. For example, @option{-Wsuggest-final-types} is more effective
+with link-time optimization. Some other warnings may
not be issued at all unless optimization is enabled. While optimization
-in general improves the efficacy of control and data flow sensitive
-warnings, in some cases it may also cause false positives.
+in general improves the efficacy of warnings about control and data-flow
+problems, in some cases it may also cause false positives.
@table @gcctabopt
@opindex pedantic
@@ -6497,7 +6500,8 @@ of a derived class.
Warn about code affected by ABI changes. This includes code that may
not be compatible with the vendor-neutral C++ ABI as well as the psABI
-for the particular target.
+for the particular target. The latter warnings are also controlled
+separately by @option{-Wpsabi}, which is implied by @option{-Wabi}.
Since G++ now defaults to updating the ABI with each major release,
normally @option{-Wabi} warns only about C++ ABI compatibility
@@ -6600,27 +6604,21 @@ This was fixed in @option{-fabi-version=10}, the default for GCC 6.1.
@end itemize
-This option also enables warnings about psABI-related changes.
-The known psABI changes at this point include:
+@opindex Wpsabi
+@opindex Wno-psabi
+@item -Wpsabi @r{(C, Objective-C, C++ and Objective-C++ only)}
-@itemize @bullet
-
-@item
-For SysV/x86-64, unions with @code{long double} members are
-passed in memory as specified in psABI. Prior to GCC 4.4, this was not
-the case. For example:
-
-@smallexample
-union U @{
- long double ld;
- int i;
-@};
-@end smallexample
+@option{-Wpsabi} enables warnings about processor-specific ABI
+changes, such as changes in alignment requirements or how function
+arguments are passed. On several targets, including AArch64, ARM,
+x86, MIPS, RS6000/PowerPC, and S/390, these details have changed
+between different versions of GCC and/or different versions of the C
+or C++ language standards in ways that affect binary compatibility of
+compiled code. With @option{-Wpsabi}, GCC can detect potentially
+incompatible usages and warn you about them.
-@noindent
-@code{union U} is now always passed in memory.
-
-@end itemize
+@option{-Wpsabi} is enabled by default, and is also implied by
+@option{-Wabi}.
@opindex Wchanges-meaning
@opindex Wno-changes-meaning
@@ -10112,8 +10110,9 @@ a warning.)
@opindex Wno-aggressive-loop-optimizations
@opindex Waggressive-loop-optimizations
@item -Wno-aggressive-loop-optimizations
-Warn if in a loop with constant number of iterations the compiler detects
-undefined behavior in some statement during one or more of the iterations.
+Do not warn if the compiler detects undefined behavior in a loop with
+a constant number of iterations. @option{-Waggressive-loop-optimizations}
+is enabled by default.
@opindex Wno-attributes
@opindex Wattributes
@@ -16518,6 +16517,15 @@ in combiner for a pseudo register as last known value of that register.
@item max-combine-insns
The maximum number of instructions the RTL combiner tries to combine.
+@item max-combine-search-insns
+The maximum number of instructions that the RTL combiner searches in order
+to find the next use of a given register definition. If this limit is reached
+without finding such a use, the combiner will stop trying to optimize the
+definition.
+
+Currently this limit only applies after certain successful combination
+attempts, but it could be extended to other cases in future.
+
@item integer-share-limit
Small integer constants can use a shared data structure, reducing the
compiler's memory usage and increasing its speed. This sets the maximum
@@ -18373,7 +18381,8 @@ operand constant, @code{__sanitizer_cov_trace_cmpf} or
@opindex fcf-protection
@item -fcf-protection=@r{[}full@r{|}branch@r{|}return@r{|}none@r{|}check@r{]}
-Enable code instrumentation of control-flow transfers to increase
+@itemx -fcf-protection
+Enable code instrumentation to increase
program security by checking that target addresses of control-flow
transfer instructions (such as indirect function call, function return,
indirect jump) are valid. This prevents diverting the flow of control
@@ -18381,22 +18390,30 @@ to an unexpected target. This is intended to protect against such
threats as Return-oriented Programming (ROP), and similarly
call/jmp-oriented programming (COP/JOP).
+The @option{-fcf-protection=} keywords are interpreted as follows.
+
The value @code{branch} tells the compiler to implement checking of
validity of control-flow transfer at the point of indirect branch
-instructions, i.e.@: call/jmp instructions. The value @code{return}
-implements checking of validity at the point of returning from a
-function. The value @code{full} is an alias for specifying both
-@code{branch} and @code{return}. The value @code{none} turns off
-instrumentation.
+instructions, i.e.@: call/jmp instructions.
-To override @option{-fcf-protection}, @option{-fcf-protection=none}
-needs to be added and then with @option{-fcf-protection=xxx}.
+The value @code{return} implements checking of validity at the point of
+returning from a function.
+
+The value @code{full} is an alias for specifying both
+@code{branch} and @code{return}.
The value @code{check} is used for the final link with link-time
optimization (LTO). An error is issued if LTO object files are
compiled with different @option{-fcf-protection} values. The
value @code{check} is ignored at the compile time.
+The value @code{none} turns off instrumentation.
+
+@option{-fcf-protection} is an alias for @option{-fcf-protection=full}.
+To override a previous @option{-fcf-protection} option on the command
+line, add @option{-fcf-protection=none} and then
+@option{-fcf-protection=@var{kind}}.
+
The macro @code{__CET__} is defined when @option{-fcf-protection} is
used. The first bit of @code{__CET__} is set to 1 for the value
@code{branch} and the second bit of @code{__CET__} is set to 1 for
@@ -21852,11 +21869,13 @@ performance of the code. Permissible values for this option are:
@samp{cortex-x2}, @samp{cortex-x3}, @samp{cortex-x4}, @samp{cortex-a510},
@samp{cortex-a520}, @samp{cortex-a520ae}, @samp{cortex-a710}, @samp{cortex-a715},
@samp{cortex-a720}, @samp{cortex-a720ae}, @samp{ampere1}, @samp{ampere1a},
-@samp{ampere1b}, @samp{cobalt-100} and @samp{native}.
+@samp{ampere1b}, @samp{cobalt-100}, @samp{apple-m1}, @samp{apple-m2},
+@samp{apple-m3} and @samp{native}.
The values @samp{cortex-a57.cortex-a53}, @samp{cortex-a72.cortex-a53},
@samp{cortex-a73.cortex-a35}, @samp{cortex-a73.cortex-a53},
-@samp{cortex-a75.cortex-a55}, @samp{cortex-a76.cortex-a55} specify that GCC
+@samp{cortex-a75.cortex-a55}, @samp{cortex-a76.cortex-a55},
+@samp{apple-m1}, @samp{apple-m2}, @samp{apple-m3} specify that GCC
should tune for a big.LITTLE system.
The value @samp{neoverse-512tvb} specifies that GCC should tune
@@ -32443,18 +32462,18 @@ and for AIX: @samp{vec-extabi}, @samp{vec-default}@.
Change the current ABI to use IBM extended-precision long double.
This is not likely to work if your system defaults to using IEEE
extended-precision long double. If you change the long double type
-from IEEE extended-precision, the compiler will issue a warning unless
-you use the @option{-Wno-psabi} option. Requires @option{-mlong-double-128}
-to be enabled.
+from IEEE extended-precision, the compiler issues a warning unless
+you use the @option{-Wno-psabi} option (@pxref{Warning Options}).
+Requires @option{-mlong-double-128} to be enabled.
@opindex mabi=ieeelongdouble
@item -mabi=ieeelongdouble
Change the current ABI to use IEEE extended-precision long double.
This is not likely to work if your system defaults to using IBM
extended-precision long double. If you change the long double type
-from IBM extended-precision, the compiler will issue a warning unless
-you use the @option{-Wno-psabi} option. Requires @option{-mlong-double-128}
-to be enabled.
+from IBM extended-precision, the compiler issues a warning unless
+you use the @option{-Wno-psabi} option (@pxref{Warning Options}).
+Requires @option{-mlong-double-128} to be enabled.
@opindex mabi=elfv1
@item -mabi=elfv1
diff --git a/gcc/fold-const.cc b/gcc/fold-const.cc
index 3e20538..1275ef7 100644
--- a/gcc/fold-const.cc
+++ b/gcc/fold-const.cc
@@ -1284,6 +1284,13 @@ poly_int_binop (poly_wide_int &res, enum tree_code code,
return false;
break;
+ case BIT_AND_EXPR:
+ if (TREE_CODE (arg2) != INTEGER_CST
+ || !can_and_p (wi::to_poly_wide (arg1), wi::to_wide (arg2),
+ &res))
+ return false;
+ break;
+
case BIT_IOR_EXPR:
if (TREE_CODE (arg2) != INTEGER_CST
|| !can_ior_p (wi::to_poly_wide (arg1), wi::to_wide (arg2),
diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc
index e90220c..4f385b1 100644
--- a/gcc/gimplify.cc
+++ b/gcc/gimplify.cc
@@ -3887,6 +3887,7 @@ static tree
modify_call_for_omp_dispatch (tree expr, tree dispatch_clauses,
bool want_value, bool pointerize)
{
+ location_t loc = EXPR_LOCATION (expr);
tree fndecl = get_callee_fndecl (expr);
/* Skip processing if we don't get the expected call form. */
@@ -4081,14 +4082,17 @@ modify_call_for_omp_dispatch (tree expr, tree dispatch_clauses,
}
}
+ objs = build_fold_addr_expr (objs);
+ target_tgtsync = build_fold_addr_expr (target_tgtsync);
+ prefer_type = prefer_type ? build_fold_addr_expr (prefer_type)
+ : null_pointer_node;
tree fn = builtin_decl_explicit (BUILT_IN_GOMP_INTEROP);
tree create
- = build_call_expr (fn, 11, dispatch_device_num,
- nobjs, objs, target_tgtsync,
- prefer_type ? prefer_type : null_pointer_node,
- integer_zero_node, null_pointer_node,
- integer_zero_node, null_pointer_node,
- integer_zero_node, null_pointer_node);
+ = build_call_expr_loc (loc, fn, 11, dispatch_device_num,
+ nobjs, objs, target_tgtsync, prefer_type,
+ integer_zero_node, null_pointer_node,
+ integer_zero_node, null_pointer_node,
+ integer_zero_node, null_pointer_node);
if (init_code)
init_code = build2 (COMPOUND_EXPR, TREE_TYPE (create),
init_code, create);
@@ -4096,12 +4100,12 @@ modify_call_for_omp_dispatch (tree expr, tree dispatch_clauses,
init_code = create;
cleanup
- = build_call_expr (fn, 11, dispatch_device_num,
- integer_zero_node, null_pointer_node,
- null_pointer_node, null_pointer_node,
- integer_zero_node, null_pointer_node,
- nobjs, objs,
- integer_zero_node, null_pointer_node);
+ = build_call_expr_loc (loc, fn, 11, dispatch_device_num,
+ integer_zero_node, null_pointer_node,
+ null_pointer_node, null_pointer_node,
+ integer_zero_node, null_pointer_node,
+ nobjs, objs,
+ integer_zero_node, null_pointer_node);
if (clobbers)
cleanup = build2 (COMPOUND_EXPR, TREE_TYPE (clobbers),
cleanup, clobbers);
@@ -4282,8 +4286,8 @@ modify_call_for_omp_dispatch (tree expr, tree dispatch_clauses,
actual_ptr);
}
tree fn = builtin_decl_explicit (BUILT_IN_OMP_GET_MAPPED_PTR);
- tree mapped_arg = build_call_expr (fn, 2, actual_ptr,
- dispatch_device_num);
+ tree mapped_arg = build_call_expr_loc (loc, fn, 2, actual_ptr,
+ dispatch_device_num);
if (TREE_CODE (*arg_p) == ADDR_EXPR
|| (TREE_CODE (TREE_TYPE (actual_ptr)) == REFERENCE_TYPE))
@@ -9222,11 +9226,18 @@ omp_notice_variable (struct gimplify_omp_ctx *ctx, tree decl, bool in_code)
| GOVD_MAP_ALLOC_ONLY)) == flags)
{
tree type = TREE_TYPE (decl);
+ location_t loc = DECL_SOURCE_LOCATION (decl);
if (gimplify_omp_ctxp->target_firstprivatize_array_bases
&& omp_privatize_by_reference (decl))
type = TREE_TYPE (type);
- if (!omp_mappable_type (type))
+
+ if (!verify_type_context (loc, TCTX_OMP_MAP_IMP_REF, type))
+ /* Check if TYPE can appear in a target region.
+ verify_type_context has already issued an error if it
+ can't. */
+ nflags |= GOVD_MAP | GOVD_EXPLICIT;
+ else if (!omp_mappable_type (type))
{
error ("%qD referenced in target region does not have "
"a mappable type", decl);
@@ -9301,7 +9312,8 @@ omp_notice_variable (struct gimplify_omp_ctx *ctx, tree decl, bool in_code)
&& (flags & (GOVD_SEEN | GOVD_LOCAL)) == GOVD_SEEN
&& DECL_SIZE (decl))
{
- if (TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
+ tree size;
+ if (!poly_int_tree_p (DECL_SIZE (decl)))
{
splay_tree_node n2;
tree t = DECL_VALUE_EXPR (decl);
@@ -9312,16 +9324,14 @@ omp_notice_variable (struct gimplify_omp_ctx *ctx, tree decl, bool in_code)
n2->value |= GOVD_SEEN;
}
else if (omp_privatize_by_reference (decl)
- && TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (decl)))
- && (TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (decl))))
- != INTEGER_CST))
+ && (size = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (decl))))
+ && !poly_int_tree_p (size))
{
splay_tree_node n2;
- tree t = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (decl)));
- gcc_assert (DECL_P (t));
- n2 = splay_tree_lookup (ctx->variables, (splay_tree_key) t);
+ gcc_assert (DECL_P (size));
+ n2 = splay_tree_lookup (ctx->variables, (splay_tree_key) size);
if (n2)
- omp_notice_variable (ctx, t, true);
+ omp_notice_variable (ctx, size, true);
}
}
@@ -12957,6 +12967,8 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p,
unsigned int flags;
tree decl;
auto_vec<omp_addr_token *, 10> addr_tokens;
+ tree op = NULL_TREE;
+ location_t loc = OMP_CLAUSE_LOCATION (c);
if (grp_end && c == OMP_CLAUSE_CHAIN (grp_end))
{
@@ -12964,6 +12976,36 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p,
grp_end = NULL_TREE;
}
+ if (code == OMP_TARGET
+ || code == OMP_TARGET_DATA
+ || code == OMP_TARGET_ENTER_DATA
+ || code == OMP_TARGET_EXIT_DATA)
+ /* Do some target-specific type checks for map operands. */
+ switch (OMP_CLAUSE_CODE (c))
+ {
+ case OMP_CLAUSE_MAP:
+ op = OMP_CLAUSE_OPERAND (c, 0);
+ verify_type_context (loc, TCTX_OMP_MAP, TREE_TYPE (op));
+ break;
+ case OMP_CLAUSE_PRIVATE:
+ op = OMP_CLAUSE_OPERAND (c, 0);
+ verify_type_context (loc, TCTX_OMP_PRIVATE, TREE_TYPE (op));
+ break;
+ case OMP_CLAUSE_FIRSTPRIVATE:
+ op = OMP_CLAUSE_OPERAND (c, 0);
+ verify_type_context (loc, TCTX_OMP_FIRSTPRIVATE, TREE_TYPE (op));
+ break;
+ case OMP_CLAUSE_IS_DEVICE_PTR:
+ case OMP_CLAUSE_USE_DEVICE_ADDR:
+ case OMP_CLAUSE_USE_DEVICE_PTR:
+ case OMP_CLAUSE_HAS_DEVICE_ADDR:
+ op = OMP_CLAUSE_OPERAND (c, 0);
+ verify_type_context (loc, TCTX_OMP_DEVICE_ADDR, TREE_TYPE (op));
+ break;
+ default:
+ break;
+ }
+
switch (OMP_CLAUSE_CODE (c))
{
case OMP_CLAUSE_PRIVATE:
@@ -14581,7 +14623,7 @@ gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
if ((gimplify_omp_ctxp->region_type & ORT_ACC) == 0)
OMP_CLAUSE_MAP_RUNTIME_IMPLICIT_P (clause) = 1;
if (DECL_SIZE (decl)
- && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
+ && !poly_int_tree_p (DECL_SIZE (decl)))
{
tree decl2 = DECL_VALUE_EXPR (decl);
gcc_assert (INDIRECT_REF_P (decl2));
@@ -15322,7 +15364,7 @@ gimplify_adjust_omp_clauses (gimple_seq *pre_p, gimple_seq body, tree *list_p,
if (!DECL_P (decl))
break;
if (DECL_SIZE (decl)
- && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
+ && !poly_int_tree_p (DECL_SIZE (decl)))
{
tree decl2 = DECL_VALUE_EXPR (decl);
gcc_assert (INDIRECT_REF_P (decl2));
diff --git a/gcc/lto-opts.cc b/gcc/lto-opts.cc
index 3959598..62a3fb2 100644
--- a/gcc/lto-opts.cc
+++ b/gcc/lto-opts.cc
@@ -97,7 +97,7 @@ lto_write_options (void)
if (!OPTION_SET_P (flag_cf_protection))
{
const char *cf_protection = NULL;
- switch (global_options.x_flag_cf_protection)
+ switch (global_options.x_flag_cf_protection & ~CF_SET)
{
case CF_NONE: cf_protection = "-fcf-protection=none"; break;
case CF_FULL: cf_protection = "-fcf-protection=full"; break;
diff --git a/gcc/omp-low.cc b/gcc/omp-low.cc
index e369df6..e1036ad 100644
--- a/gcc/omp-low.cc
+++ b/gcc/omp-low.cc
@@ -1461,7 +1461,7 @@ scan_sharing_clauses (tree clauses, omp_context *ctx)
else
install_var_field (decl, false, 11, ctx);
if (DECL_SIZE (decl)
- && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
+ && !poly_int_tree_p (DECL_SIZE (decl)))
{
tree decl2 = DECL_VALUE_EXPR (decl);
gcc_assert (INDIRECT_REF_P (decl2));
diff --git a/gcc/params.opt b/gcc/params.opt
index 4f4eb4d..422d082 100644
--- a/gcc/params.opt
+++ b/gcc/params.opt
@@ -477,6 +477,10 @@ The maximum number of instructions to consider to unroll in a loop on average.
Common Joined UInteger Var(param_max_combine_insns) Init(4) IntegerRange(2, 4) Param Optimization
The maximum number of insns combine tries to combine.
+-param=max-combine-search-insns=
+Common Joined UInteger Var(param_max_combine_search_insns) Init(3000) Param Optimization
+The maximum number of instructions that combine searches in order to find the next use of a particular register.
+
-param=max-completely-peel-loop-nest-depth=
Common Joined UInteger Var(param_max_unroll_iterations) Init(8) Param Optimization
The maximum depth of a loop nest we completely peel.
diff --git a/gcc/po/ChangeLog b/gcc/po/ChangeLog
index 4d0cd22..a3ea29f 100644
--- a/gcc/po/ChangeLog
+++ b/gcc/po/ChangeLog
@@ -1,3 +1,7 @@
+2025-04-07 Joseph Myers <josmyers@redhat.com>
+
+ * sv.po: Update.
+
2025-04-04 Joseph Myers <josmyers@redhat.com>
* gcc.pot: Regenerate.
diff --git a/gcc/po/sv.po b/gcc/po/sv.po
index a807813..af153f7 100644
--- a/gcc/po/sv.po
+++ b/gcc/po/sv.po
@@ -32,7 +32,7 @@ msgstr ""
"Project-Id-Version: gcc 15.1-b20250316\n"
"Report-Msgid-Bugs-To: https://gcc.gnu.org/bugs/\n"
"POT-Creation-Date: 2025-03-14 22:06+0000\n"
-"PO-Revision-Date: 2025-03-30 15:46+0200\n"
+"PO-Revision-Date: 2025-04-06 09:20+0200\n"
"Last-Translator: Göran Uddeborg <goeran@uddeborg.se>\n"
"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
"Language: sv\n"
@@ -50585,10 +50585,8 @@ msgid "array initialized from parenthesized string constant"
msgstr "vektor initierad från strängkonstant inom parentes"
#: c/c-typeck.cc:7617
-#, fuzzy
-#| msgid "expected %qT but argument is of type %qT"
msgid "expected %e but argument is of type %e"
-msgstr "%qT förväntades men argumentet har typ %qT"
+msgstr "%e förväntades men argumentet är av typen %e"
#: c/c-typeck.cc:7651
#, gcc-internal-format
@@ -50606,10 +50604,8 @@ msgid "built-in %qD declared here"
msgstr "den inbyggda %qD är deklarerad här"
#: c/c-typeck.cc:7716 c/c-typeck.cc:8624
-#, fuzzy
-#| msgid " declared here"
msgid "%e declared here"
-msgstr " deklarerad här"
+msgstr "%e deklarerad här"
#: c/c-typeck.cc:7909
#, gcc-internal-format
@@ -50799,40 +50795,28 @@ msgid "passing argument %d of %qE from incompatible pointer type"
msgstr "skickar argument %d till %qE från inkompatibel pekartyp"
#: c/c-typeck.cc:8566
-#, fuzzy
-#| msgid "assignment to %qT from pointer to %qD with incompatible type %qT"
msgid "assignment to %e from pointer to %qD with incompatible type %e"
-msgstr "tilldelning till %qT från pekare till %qD med inkompatibel typ %qT"
+msgstr "tilldelning till %e från pekare till %qD med inkompatibel typ %e"
#: c/c-typeck.cc:8572
-#, fuzzy
-#| msgid "assignment to %qT from incompatible pointer type %qT"
msgid "assignment to %e from incompatible pointer type %e"
-msgstr "tilldelning till %qT från inkompatibel pekartyp %qT"
+msgstr "tilldelning till %e från inkompatibel pekartyp %e"
#: c/c-typeck.cc:8581
-#, fuzzy
-#| msgid "initialization of %qT from pointer to %qD with incompatible type %qT"
msgid "initialization of %e from pointer to %qD with incompatible type %e"
-msgstr "initiering av %qT från pekare till %qD med inkompatibel typ %qT"
+msgstr "initiering av %e från pekare till %qD med inkompatibel typ %e"
#: c/c-typeck.cc:8587
-#, fuzzy
-#| msgid "initialization of %qT from incompatible pointer type %qT"
msgid "initialization of %e from incompatible pointer type %e"
-msgstr "initiering av %qT från inkompatibel pekartyp %qT"
+msgstr "initiering av %e från inkompatibel pekartyp %e"
#: c/c-typeck.cc:8595
-#, fuzzy
-#| msgid "returning pointer to %qD of type %qT from a function with incompatible type %qT"
msgid "returning pointer to %qD of type %e from a function with incompatible type %e"
-msgstr "returnerar pekare till %qD av typen %qT från en funktion med inkompatibel typ %qT"
+msgstr "returnerar pekare till %qD av typen %e från en funktion med inkompatibel typ %e"
#: c/c-typeck.cc:8601
-#, fuzzy
-#| msgid "returning %qT from a function with incompatible return type %qT"
msgid "returning %e from a function with incompatible return type %e"
-msgstr "returnerar %qT från en funktion med inkompatibel returtyp %qT"
+msgstr "returnerar %e från en funktion med inkompatibel returtyp %e"
#: c/c-typeck.cc:8677
#, gcc-internal-format
@@ -50940,16 +50924,14 @@ msgid "cannot initialize array of %qT from a string literal with type array of %
msgstr "det går inte att initiera vektorn av %qT från en stränglitteral med typvektor %qT"
#: c/c-typeck.cc:9380
-#, fuzzy, gcc-internal-format
-#| msgid "initializer-string for %qT is too long"
+#, gcc-internal-format
msgid "initializer-string for array of %qT is too long (%wu chars into %wu available)"
-msgstr "initierarsträng för %qT är för lång"
+msgstr "initierarsträng för en vektor av %qT är för lång (%wu tecken in i %wu tillgängliga)"
#: c/c-typeck.cc:9385
-#, fuzzy, gcc-internal-format
-#| msgid "initializer-string for %qT is too long"
+#, gcc-internal-format
msgid "initializer-string for array of %qT is too long for C++ (%wu chars into %wu available)"
-msgstr "initierarsträng för %qT är för lång"
+msgstr "initierarsträng för vektor av %qT är för lång för C++ (%wu tecken in i %wu tillgängliga)"
#: c/c-typeck.cc:9392
#, gcc-internal-format
@@ -50988,10 +50970,9 @@ msgid "initializer element is not a constant expression"
msgstr "initierarelement är inte ett konstant uttryck"
#: c/c-typeck.cc:9560 cp/typeck2.cc:1340
-#, fuzzy, gcc-internal-format
-#| msgid "conversion from %qT to %qT changes value from %qE to %qE"
+#, gcc-internal-format
msgid "conversion from %qT to %qT changes value from %qd to %qd"
-msgstr "konvertering från %qT till %qT ändrar värdet från %qE till %qE"
+msgstr "konvertering från %qT till %qT ändrar värdet från %qd till %qd"
#: c/c-typeck.cc:9602 c/c-typeck.cc:11447
#, gcc-internal-format
@@ -51138,29 +51119,25 @@ msgstr "överflödiga element i skalärinitierare"
#: c/c-typeck.cc:12521 c/c-typeck.cc:12597 cp/semantics.cc:2346
#: cp/semantics.cc:2455
-#, fuzzy, gcc-internal-format
-#| msgid "ISO C does not allow extra %<;%> outside of a function"
+#, gcc-internal-format
msgid "constraint allows registers outside of a function"
-msgstr "ISO C tillåter inte extra %<;%> utanför funktioner"
+msgstr "begränsningen tillåter register utanför en funktion"
#: c/c-typeck.cc:12533 cp/semantics.cc:2358
-#, fuzzy, gcc-internal-format
-#| msgid "ISO C does not allow extra %<;%> outside of a function"
+#, gcc-internal-format
msgid "side-effects in output operand outside of a function"
-msgstr "ISO C tillåter inte extra %<;%> utanför funktioner"
+msgstr "sidoeffekter i utdataoperanden utanför en funktion"
#: c/c-typeck.cc:12544 cp/semantics.cc:2374
-#, fuzzy, gcc-internal-format
-#| msgid "output operand %d must use %<&%> constraint"
+#, gcc-internal-format
msgid "output operand outside of a function is not constant"
-msgstr "utdataoperand %d måste använda %<&%>-begränsning"
+msgstr "utdataoperand utanför en funktion som inte är konstant"
#: c/c-typeck.cc:12552 c/c-typeck.cc:12642 cp/semantics.cc:2385
#: cp/semantics.cc:2518
-#, fuzzy, gcc-internal-format
-#| msgid "%<asm%> qualifier outside of function body"
+#, gcc-internal-format
msgid "%<-%> modifier used inside of a function"
-msgstr "%<asm%>-kvalificerare utanför funktionskropp"
+msgstr "modifieraren %<-%> använd inuti en funktion"
#: c/c-typeck.cc:12610 cp/semantics.cc:2468
#, gcc-internal-format
@@ -51168,16 +51145,14 @@ msgid "%<:%> constraint operand is not address of a function or non-automatic va
msgstr "%<:%>-begränsningsoperanden är inte adressen till en funktion eller icka-automatisk variabel"
#: c/c-typeck.cc:12623 cp/semantics.cc:2481
-#, fuzzy, gcc-internal-format
-#| msgid "ISO C does not allow extra %<;%> outside of a function"
+#, gcc-internal-format
msgid "side-effects in input operand outside of a function"
-msgstr "ISO C tillåter inte extra %<;%> utanför funktioner"
+msgstr "sidoeffekter i indataoperanden utanför en funktion"
#: c/c-typeck.cc:12634 cp/semantics.cc:2496 cp/semantics.cc:2510
-#, fuzzy, gcc-internal-format
-#| msgid "%qD is not defined outside of function scope"
+#, gcc-internal-format
msgid "input operand outside of a function is not constant"
-msgstr "%qD är inte definierad utanför funktionsnivå"
+msgstr "indataoperand utanför en funktion som inte är konstant"
#: c/c-typeck.cc:12686
#, gcc-internal-format
@@ -51589,10 +51564,9 @@ msgid "variable length element type in array %<reduction%> clause"
msgstr "elementtyp med variabel längd i vektor-%<reduction%>-klausul"
#: c/c-typeck.cc:16335 c/c-typeck.cc:17249 cp/semantics.cc:9941
-#, fuzzy, gcc-internal-format
-#| msgid "%<nowait%> clause must not be used together with %<copyprivate%>"
+#, gcc-internal-format
msgid "%<nowait%> clause must not be used together with %<copyprivate%> clause"
-msgstr "en %<nowait%>-klausul får inte användas tillsammans med %<copyprivate%>"
+msgstr "en klausul %<nowait%> får inte användas tillsammans med en klausul %<copyprivate%>"
#: c/c-typeck.cc:16347 cp/semantics.cc:10009
#, gcc-internal-format
@@ -51792,10 +51766,9 @@ msgid "%qs variable is neither a pointer nor an array"
msgstr "%qs-variabeln är varken en pekare eller en vektor"
#: c/c-typeck.cc:17262 c/c-typeck.cc:17367 cp/semantics.cc:9892
-#, fuzzy, gcc-internal-format
-#| msgid "%<order%> clause must not be used together with %<ordered%>"
+#, gcc-internal-format
msgid "%<order%> clause must not be used together with %<ordered%> clause"
-msgstr "en %<order%>-klausul får inte användas tillsammans med %<ordered%>"
+msgstr "en klausul %<order%> får inte användas tillsammans med en klausul %<ordered%>"
#: c/c-typeck.cc:17282 cp/semantics.cc:8815
#, gcc-internal-format
@@ -51808,22 +51781,19 @@ msgid "%<inbranch%> clause is incompatible with %<notinbranch%>"
msgstr "en %<inbranch%>-klausul är inkompatibel med %<notinbranch%>"
#: c/c-typeck.cc:17438 cp/semantics.cc:9704
-#, fuzzy, gcc-internal-format
-#| msgid "%qD appears more than once in motion clauses"
+#, gcc-internal-format
msgid "%qD appears more than once in action clauses"
-msgstr "%qD förekommer mer än en gång i rörelseklausuler"
+msgstr "%qD förekommer mer än en gång i åtgärdsklausuler"
#: c/c-typeck.cc:17449 cp/semantics.cc:9718
-#, fuzzy, gcc-internal-format
-#| msgid "defaulted %qD must be %<const%>"
+#, gcc-internal-format
msgid "%qD must be of %<omp_interop_t%>"
-msgstr "standarddefinierad %qD måste vara %<const%>"
+msgstr "%qD måste vara av %<omp_interop_t%>"
#: c/c-typeck.cc:17458 cp/semantics.cc:9727
-#, fuzzy, gcc-internal-format
-#| msgid "%q#D is not const"
+#, gcc-internal-format
msgid "%qD shall not be const"
-msgstr "%q#D är inte const"
+msgstr "%qD skall inte vara const"
#: c/c-typeck.cc:17507 cp/semantics.cc:10080
#, gcc-internal-format
@@ -51862,16 +51832,14 @@ msgid "%<nogroup%> clause must not be used together with %<reduction%> clause"
msgstr "en %<nogroup%>-klausul får inte användas tillsammans med en %<reduction%>-klausul"
#: c/c-typeck.cc:17686 cp/semantics.cc:9874
-#, fuzzy, gcc-internal-format
-#| msgid "%<nogroup%> clause must not be used together with %<reduction%> clause"
+#, gcc-internal-format
msgid "%<grainsize%> clause must not be used together with %<num_tasks%> clause"
-msgstr "en %<nogroup%>-klausul får inte användas tillsammans med en %<reduction%>-klausul"
+msgstr "en klausul %<grainsize%> får inte användas tillsammans med en klausul %<num_tasks%>"
#: c/c-typeck.cc:17694 cp/semantics.cc:9930
-#, fuzzy, gcc-internal-format
-#| msgid "%<nogroup%> clause must not be used together with %<reduction%> clause"
+#, gcc-internal-format
msgid "%<full%> clause must not be used together with %<partial%> clause"
-msgstr "en %<nogroup%>-klausul får inte användas tillsammans med en %<reduction%>-klausul"
+msgstr "en klausul %<full%> får inte användas tillsammans med en klausul %<partial%>"
#: c/c-typeck.cc:17704 cp/semantics.cc:9903
#, gcc-internal-format
@@ -51889,10 +51857,9 @@ msgid "%<depend%> clause requires action clauses with %<targetsync%> interop-typ
msgstr "klausulen %<depend%> kräver åtgärdsklausuler med interop-typen %<targetsync%>"
#: c/c-typeck.cc:17744 cp/semantics.cc:10180
-#, fuzzy, gcc-internal-format
-#| msgid "too many %<if%> clauses with %qs modifier"
+#, gcc-internal-format
msgid "%<init%> clause lacks the %<targetsync%> modifier"
-msgstr "för många %<if%>-klausuler med %qs-modifierare"
+msgstr "klausulen %<init%> saknar modifieraren %<targetsync%>"
#: c/c-typeck.cc:17916
#, gcc-internal-format
@@ -52135,22 +52102,19 @@ msgid "COBOL requires a 64-bit configuration"
msgstr "COBOL kräver en 64-bitarskonfiguration"
#: cobol/cobol1.cc:327
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Creating '%s'\n"
+#, gcc-internal-format, gfc-internal-format
msgid "exception '%s'"
-msgstr "Skapar ”%s”\n"
+msgstr "undantaget ”%s”"
#: cobol/cobol1.cc:413
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "could not close response file %s"
+#, gcc-internal-format, gfc-internal-format
msgid "could not execute preprocessor %s"
-msgstr "det gick inte att stänga svarsfilen %s"
+msgstr "kunde inte köra preprocessorn %s"
#: cobol/cobol1.cc:418
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "could not find specs file %s\n"
+#, gcc-internal-format, gfc-internal-format
msgid "could not include %s"
-msgstr "kunde inte hitta specs-filen %s\n"
+msgstr "kunde inte inkludera %s"
#. This isn't right. All OPT_main should be replaced
#: cobol/cobol1.cc:424
@@ -52173,10 +52137,9 @@ msgid "Nice try, but you can't fire me. I quit!"
msgstr "Bra försök, men du kan inte avskeda mig. Jag slutar!"
#: cobol/genapi.cc:1484
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "%qE does not have a mappable type in %qs clause"
+#, gcc-internal-format, gfc-internal-format
msgid "%s(): Knows not the variable type %s for %s"
-msgstr "%qE har inte en avbildbar typ i %qs-klausul"
+msgstr "%s(): Känner inte till variabeltypen %s för %s"
#: cobol/genapi.cc:2171
#, gcc-internal-format, gfc-internal-format
@@ -52189,10 +52152,9 @@ msgid "%s(): field->type %s must be literal or alphanumeric"
msgstr "%s(): fält->typ %s måste vara literal eller alfanumerisk"
#: cobol/genapi.cc:5773
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "invalid receiver type %qs"
+#, gcc-internal-format, gfc-internal-format
msgid "%s(): Invalid field type %s:"
-msgstr "ogiltig mottagartyp %qs"
+msgstr "%s(): Ogiltig fälttyp %s:"
#: cobol/genapi.cc:6987 cobol/genapi.cc:6993 cobol/genapi.cc:6999
#, gcc-internal-format, gfc-internal-format
@@ -52407,10 +52369,9 @@ msgid "The given type is not a DECL or a TYPE"
msgstr "Den givna typen är inte en DECL eller en TYPE"
#: cobol/gengen.cc:412
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "unknown lam type %qs"
+#, gcc-internal-format, gfc-internal-format
msgid "Unknown type %d"
-msgstr "okänd lam-typ %qs"
+msgstr "Okänd typ %d"
#: cobol/gengen.cc:2931
#, gcc-internal-format
@@ -52423,32 +52384,28 @@ msgid "parser_op() doesn't know how to evaluate \"%s = %s %c %s\"\n"
msgstr "parser_op() vet inte hur den skall evaluera ”%s = %s %c %s”\n"
#: cobol/genutil.cc:324 cobol/genutil.cc:603
-#, fuzzy, gcc-internal-format
-#| msgid "too many input files"
+#, gcc-internal-format
msgid "Too many subscripts"
-msgstr "för många indatafiler"
+msgstr "För många index"
#: cobol/lexio.cc:1485
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "%s signal terminated program %s"
+#, gcc-internal-format, gfc-internal-format
msgid "%s pid %d terminated by %s"
-msgstr "%s-signal avslutade programmet %s"
+msgstr "%s pid %d avslutade med %s"
#: cobol/lexio.cc:1490
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "%s returned %d exit status"
+#, gcc-internal-format, gfc-internal-format
msgid "%s exited with status %d"
-msgstr "%s returnerade avslutningsstatus %d"
+msgstr "%s avslutade med status %d"
#: cobol/symbols.cc:530
msgid "%s:%d: LblNone '%s' has parent #%zu"
msgstr "%s:%d: LblNone '%s' har föräldern #%zu"
#: cobol/symbols.cc:2040
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "%qs value must be positive"
+#, gcc-internal-format, gfc-internal-format
msgid "%s: key must be field"
-msgstr "%qs-värdet måste vara positivt"
+msgstr "%s: nyckeln måste vara ett fält"
#: cobol/symbols.cc:3837 cobol/symbols.cc:3960 cobol/symbols.cc:3997
#, gcc-internal-format, gfc-internal-format
@@ -52461,10 +52418,9 @@ msgid "logic error: MOVE %s %s invalid type:"
msgstr "logikfel: MOVE %s %s felaktig typ:"
#: cobol/util.cc:1695
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "%s: %s: %s"
+#, gcc-internal-format, gfc-internal-format
msgid "%s: regcomp: %s"
-msgstr "%s: %s: %s"
+msgstr "%s: regcomp: %s"
#: cobol/util.cc:1805
#, gcc-internal-format, gfc-internal-format
@@ -52473,10 +52429,9 @@ msgstr "logikfel: saknad inod för %s"
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104709
#: cobol/util.cc:2143
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "failed %s mapper %qs"
+#, gcc-internal-format, gfc-internal-format
msgid "failed compiling %s"
-msgstr "misslyckades med att %s avbildaren %qs"
+msgstr "misslyckades med att kompilera %s"
#: cp/call.cc:2106
#, gcc-internal-format
@@ -52490,47 +52445,36 @@ msgid "passing %qT as %<this%> argument discards qualifiers"
msgstr "att skicka %qT som %<this%>-argument kastar kvalificerare"
#: cp/call.cc:3961
-#, fuzzy
-#| msgid " no known conversion for implicit %<this%> parameter from %qH to %qI"
msgid "no known conversion for implicit %<this%> parameter from %qH to %qI"
-msgstr " ingen känd konvertering för implicit %<this%>-parameter från %qH till %qI"
+msgstr "ingen känd konvertering för implicit %<this%>-parameter från %qH till %qI"
#: cp/call.cc:3968
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid " conversion of argument %d would be ill-formed:"
+#, gcc-internal-format, gfc-internal-format
msgid "conversion of argument %d would be ill-formed:"
-msgstr " konvertering av argument %d vore felformaterat:"
+msgstr "konvertering av argument %d vore felformaterat:"
#. Conversion of conversion function return value failed.
#: cp/call.cc:3976
-#, fuzzy
-#| msgid " no known conversion from %qH to %qI"
msgid "no known conversion from %qH to %qI"
-msgstr " ingen känd konvertering från %qH till %qI"
+msgstr "ingen känd konvertering från %qH till %qI"
#: cp/call.cc:3982
-#, fuzzy
-#| msgid " no known conversion for argument %d from %qH to %qI"
msgid "no known conversion for argument %d from %qH to %qI"
-msgstr " ingen känd konvertering för argument %d från %qH till %qI"
+msgstr "ingen känd konvertering för argument %d från %qH till %qI"
#: cp/call.cc:3996
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid " candidate expects at least %d argument, %d provided"
-#| msgid_plural " candidate expects at least %d arguments, %d provided"
+#, gcc-internal-format, gfc-internal-format
msgid "candidate expects at least %d argument, %d provided"
msgid_plural "candidate expects at least %d arguments, %d provided"
-msgstr[0] " kandidaten förväntade sig åtminstone %d argument, %d fanns"
-msgstr[1] " kandidaten förväntade sig åtminstone %d argument, %d fanns"
+msgstr[0] "kandidaten förväntar sig åtminstone %d argument, %d fanns"
+msgstr[1] "kandidaten förväntar sig åtminstone %d argument, %d fanns"
#: cp/call.cc:4001
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid " candidate expects %d argument, %d provided"
-#| msgid_plural " candidate expects %d arguments, %d provided"
+#, gcc-internal-format, gfc-internal-format
msgid "candidate expects %d argument, %d provided"
msgid_plural "candidate expects %d arguments, %d provided"
-msgstr[0] " kandidaten förväntade sig %d argument, %d fanns"
-msgstr[1] " kandidaten förväntade sig %d argument, %d fanns"
+msgstr[0] "kandidaten förväntar sig %d argument, %d fanns"
+msgstr[1] "kandidaten förväntar sig %d argument, %d fanns"
#: cp/call.cc:4029
#, gcc-internal-format
@@ -52583,47 +52527,40 @@ msgid "%s%#qD"
msgstr "%s%#qD"
#: cp/call.cc:4058
-#, fuzzy, gcc-internal-format
-#| msgid " inherited here"
+#, gcc-internal-format
msgid "inherited here"
-msgstr " ärvd här"
+msgstr "ärvd här"
#: cp/call.cc:4080
-#, fuzzy, gcc-internal-format
-#| msgid " return type %qT of explicit conversion function cannot be converted to %qT with a qualification conversion"
+#, gcc-internal-format
msgid "return type %qT of explicit conversion function cannot be converted to %qT with a qualification conversion"
-msgstr " returtypen %qT för en explicit konverteringsfunktion kan inte konverteras till %qT utan en kvalificerarkonvertering"
+msgstr "returtypen %qT för en explicit konverteringsfunktion kan inte konverteras till %qT utan en kvalificerarkonvertering"
#: cp/call.cc:4086
-#, fuzzy, gcc-internal-format
-#| msgid " conversion from return type %qT of template conversion function specialization to %qT is not an exact match"
+#, gcc-internal-format
msgid "conversion from return type %qT of template conversion function specialization to %qT is not an exact match"
-msgstr " konvertering från returtypen %qT för specialiseringen av mallkonverteringsfunktionen till %qT är inte en exakt matchning"
+msgstr "konvertering från returtypen %qT för specialiseringen av mallkonverteringsfunktionen till %qT är inte en exakt matchning"
#: cp/call.cc:4097
-#, fuzzy, gcc-internal-format
-#| msgid " substitution of deduced template arguments resulted in errors seen above"
+#, gcc-internal-format
msgid "substitution of deduced template arguments resulted in errors seen above"
-msgstr " substituering av härledda mallargument resulterade i felen som visas ovan"
+msgstr "substituering av härledda mallargument resulterade i felen som visas ovan"
#. Re-run template unification with diagnostics.
#: cp/call.cc:4102
-#, fuzzy, gcc-internal-format
-#| msgid " template argument deduction/substitution failed:"
+#, gcc-internal-format
msgid "template argument deduction/substitution failed:"
-msgstr " mallargumentshärledning/-substitution misslyckades:"
+msgstr "mallargumentshärledning/-substitution misslyckades:"
#: cp/call.cc:4119
-#, fuzzy, gcc-internal-format
-#| msgid " a constructor taking a single argument of its own class type is invalid"
+#, gcc-internal-format
msgid "a constructor taking a single argument of its own class type is invalid"
-msgstr " en konstruerare som tar ett ensamt argument av sin egen klasstyp är felaktig"
+msgstr "en konstruerare som tar ett ensamt argument av sin egen klasstyp är felaktig"
#: cp/call.cc:4129
-#, fuzzy, gcc-internal-format
-#| msgid " an inherited constructor is not a candidate for initialization from an expression of the same or derived type"
+#, gcc-internal-format
msgid "an inherited constructor is not a candidate for initialization from an expression of the same or derived type"
-msgstr " en ärvd konstruerare är inte en kandidat för initiering från ett uttryck av samma eller en härledd typ"
+msgstr "en ärvd konstruerare är inte en kandidat för initiering från ett uttryck av samma eller en härledd typ"
#: cp/call.cc:4209
#, gcc-internal-format, gfc-internal-format
@@ -52711,10 +52648,8 @@ msgid " (operand type is %qT)"
msgstr " (operandtyp är %qT)"
#: cp/call.cc:5606
-#, fuzzy
-#| msgid " (operand types are %qT and %qT)"
msgid " (operand types are %e and %e)"
-msgstr " (operandtyper är %qT och %qT)"
+msgstr " (operandtyper är %e och %e)"
#: cp/call.cc:5621
#, gcc-internal-format
@@ -52970,10 +52905,9 @@ msgid "converting %<false%> to pointer type %qT"
msgstr "konverterar %<false%> till pekartyp %qT"
#: cp/call.cc:8547
-#, fuzzy, gcc-internal-format
-#| msgid " initializing argument %P of %qD"
+#, gcc-internal-format
msgid "initializing argument %P of %qD"
-msgstr " initierar argument %P till %qD"
+msgstr "initierar argument %P till %qD"
#: cp/call.cc:8569
#, gcc-internal-format
@@ -53016,10 +52950,8 @@ msgid "in C++11 and above a default constructor can be explicit"
msgstr "i C++11 och senare kan en standardkonstruerare vara explicit"
#: cp/call.cc:8953
-#, fuzzy
-#| msgid "narrowing conversion of %qE from %qH to %qI"
msgid "narrowing conversion of %qd from %qH to %qI"
-msgstr "avsmalnande konvertering av %qE från %qH till %qI"
+msgstr "avsmalnande konvertering av %qd från %qH till %qI"
#: cp/call.cc:9104
#, gcc-internal-format
@@ -53394,10 +53326,9 @@ msgid "possibly dangling reference to a temporary"
msgstr "möjlig hängande referens till en temporär"
#: cp/call.cc:14722
-#, fuzzy, gcc-internal-format
-#| msgid "unnamed temporary defined here"
+#, gcc-internal-format
msgid "%qT temporary created here"
-msgstr "den namnlösa temporären är definierad här"
+msgstr "en %qT-temporär skapad här"
#: cp/call.cc:15101
#, gcc-internal-format
@@ -53857,10 +53788,9 @@ msgid "flexible array member %qD not at end of %q#T"
msgstr "flexibel vektormedlem %qD inte vid slutet av %q#T"
#: cp/class.cc:7704
-#, fuzzy, gcc-internal-format
-#| msgid "flexible array member %qD in an otherwise empty %q#T"
+#, gcc-internal-format
msgid "flexible array member %qD in an otherwise empty %q#T is a GCC extension"
-msgstr "flexibel vektor medlem %qD i en i övrigt tom %q#T"
+msgstr "flexibel vektor medlem %qD i en i övrigt tom %q#T är en GCC-utvidgning"
#: cp/class.cc:7727
#, gcc-internal-format
@@ -53973,10 +53903,9 @@ msgid "the type %qT of %<constexpr%> variable %qD is not literal"
msgstr "typen %qT för %<constexpr%>-variabeln %qD är inte en litteral"
#: cp/constexpr.cc:123
-#, fuzzy, gcc-internal-format
-#| msgid "variable %qD of non-literal type %qT in %<constexpr%> function only available with %<-std=c++2b%> or %<-std=gnu++2b%>"
+#, gcc-internal-format
msgid "variable %qD of non-literal type %qT in %<constexpr%> function only available with %<-std=c++23%> or %<-std=gnu++23%>"
-msgstr "variabeln %qD av den icke litterala typen %qT i en %<constexpr%>-funktion är endast tillgängligt med %<-std=c++2b%> eller %<-std=gnu++2b%>"
+msgstr "variabeln %qD av den icke litterala typen %qT i en %<constexpr%>-funktion är endast tillgängligt med %<-std=c++23%> eller %<-std=gnu++23%>"
#: cp/constexpr.cc:136
#, gcc-internal-format
@@ -54150,10 +54079,9 @@ msgid "expression %qE does not designate a %<constexpr%> function"
msgstr "uttrycket %qE anger inte en %<constexpr%>-funktion"
#: cp/constexpr.cc:2940
-#, fuzzy, gcc-internal-format
-#| msgid "'o' operand is not constant"
+#, gcc-internal-format
msgid "cannot allocate array: size not constant"
-msgstr "”o”-operand är ej konstant"
+msgstr "kan inte allokera vektorn: storleken är inte konstant"
#: cp/constexpr.cc:2981
#, gcc-internal-format
@@ -54642,10 +54570,9 @@ msgid "constant evaluation returns address of immediate function %qD"
msgstr "konstantevaluering returnerar adressen till en omedelbar funktion %qD"
#: cp/constexpr.cc:9289
-#, fuzzy, gcc-internal-format
-#| msgid "%qs is not a constant expression because %qT contains a pointer type"
+#, gcc-internal-format
msgid "%qE is not a constant expression because it initializes a %qT rather than %qT"
-msgstr "%qs är inte ett konstant uttryck eftersom %qT innehåller en pekartyp"
+msgstr "%qE är inte ett konstant uttryck eftersom det initierar en %qT istället för %qT"
#: cp/constexpr.cc:9910 rust/backend/rust-constexpr.cc:5667
#, gcc-internal-format
@@ -54733,10 +54660,9 @@ msgid "non-constant array initialization"
msgstr "ickekonstant vektorinitierare"
#: cp/constexpr.cc:10965
-#, fuzzy, gcc-internal-format
-#| msgid "label definition in %<constexpr%> function only available with %<-std=c++2b%> or %<-std=gnu++2b%>"
+#, gcc-internal-format
msgid "label definition in %<constexpr%> function only available with %<-std=c++23%> or %<-std=gnu++23%>"
-msgstr "en etikettdefinition i en %<constexpr%>-funktion är endast tillgängligt med %<-std=c++2b%> eller %<-std=gnu++2b%>"
+msgstr "en etikettdefinition i en %<constexpr%>-funktion är endast tillgängligt med %<-std=c++23%> eller %<-std=gnu++23%>"
# ast = abstract syntax tree
#: cp/constexpr.cc:11001 rust/backend/rust-constexpr.cc:6438
@@ -54942,10 +54868,9 @@ msgid " %qT is not a class"
msgstr " %qT är inte en klass"
#: cp/constraint.cc:3090
-#, fuzzy, gcc-internal-format
-#| msgid " %qT is not an object type"
+#, gcc-internal-format
msgid " %qT is not a const type"
-msgstr " %qT är inte en objekttyp"
+msgstr " %qT är inte en const-typ"
#: cp/constraint.cc:3094
#, gcc-internal-format
@@ -54983,16 +54908,14 @@ msgid " %qT is not a function"
msgstr " %qT är inte en funktion"
#: cp/constraint.cc:3115
-#, fuzzy, gcc-internal-format
-#| msgid " %qT is not trivially copyable"
+#, gcc-internal-format
msgid " %qT is not invocable"
-msgstr " %qT är inte trivialt kopierbar"
+msgstr " %qT är inte anropbar"
#: cp/constraint.cc:3117
-#, fuzzy, gcc-internal-format
-#| msgid " %qT is not assignable from %qT"
+#, gcc-internal-format
msgid " %qT is not invocable by %qE"
-msgstr " %qT är inte tilldelningsbar från %qT"
+msgstr " %qT är inte anropbar av %qE"
#: cp/constraint.cc:3120
#, gcc-internal-format
@@ -55035,16 +54958,14 @@ msgid " %qT is not nothrow convertible from %qE"
msgstr " %qT är inte nothrow-konvertibel från %qE"
#: cp/constraint.cc:3148
-#, fuzzy, gcc-internal-format
-#| msgid " %qT is not nothrow copy assignable"
+#, gcc-internal-format
msgid " %qT is not nothrow invocable"
-msgstr " %qT är inte nothrow-kopieringstilldelningsbar"
+msgstr " %qT är inte nothrow-anropbar"
#: cp/constraint.cc:3150
-#, fuzzy, gcc-internal-format
-#| msgid " %qT is not nothrow assignable from %qT"
+#, gcc-internal-format
msgid " %qT is not nothrow invocable by %qE"
-msgstr " %qT är inte nothrow-tilldelningsbar från %qT"
+msgstr " %qT är inte nothrow-anropbar av %qE"
#: cp/constraint.cc:3153
#, gcc-internal-format
@@ -55062,10 +54983,9 @@ msgid " %qT is not a POD type"
msgstr " %qT är inte en POD-typ"
#: cp/constraint.cc:3163
-#, fuzzy, gcc-internal-format
-#| msgid " %qT is not a member pointer"
+#, gcc-internal-format
msgid " %qT is not a pointer"
-msgstr " %qT är inte en medlemspekare"
+msgstr " %qT är inte en pekare"
#: cp/constraint.cc:3166
#, gcc-internal-format
@@ -55113,10 +55033,9 @@ msgid " %qT is not trivially copyable"
msgstr " %qT är inte trivialt kopierbar"
#: cp/constraint.cc:3196
-#, fuzzy, gcc-internal-format
-#| msgid " %qT is not a bounded array"
+#, gcc-internal-format
msgid " %qT is not an unbounded array"
-msgstr " %qT är inte en begränsad vektor"
+msgstr " %qT är inte en obegränsad vektor"
#: cp/constraint.cc:3199
#, gcc-internal-format
@@ -55124,22 +55043,19 @@ msgid " %qT is not a union"
msgstr " %qT är inte en union"
#: cp/constraint.cc:3202
-#, fuzzy, gcc-internal-format
-#| msgid " %qT is not a base of %qT"
+#, gcc-internal-format
msgid " %qT is not a virtual base of %qT"
-msgstr " %qT är inte en bas till %qT"
+msgstr " %qT är inte en virtuell bas till %qT"
#: cp/constraint.cc:3205
-#, fuzzy, gcc-internal-format
-#| msgid " %qT is not a literal type"
+#, gcc-internal-format
msgid " %qT is not a volatile type"
-msgstr " %qT är inte en literal typ"
+msgstr " %qT är inte en volatile-typ"
#: cp/constraint.cc:3208
-#, fuzzy, gcc-internal-format
-#| msgid " %qT is not an array"
+#, gcc-internal-format
msgid " %qT cannot yield a rank"
-msgstr " %qT är inte en vektor"
+msgstr " %qT kan inte ge en ordning"
#: cp/constraint.cc:3211
#, gcc-internal-format
@@ -55358,34 +55274,29 @@ msgid "coroutines require a handle class template; cannot find %<%E::%E%>"
msgstr "korutiner kräver en handtagsklassmall; kan inte hitta %<%E::%E%>"
#: cp/coroutines.cc:534
-#, fuzzy, gcc-internal-format
-#| msgid "%qD must be a non-member function"
+#, gcc-internal-format
msgid "%qE must be a non-overloaded method"
-msgstr "%qD måste vara en icke-medlems-funktion"
+msgstr "%qE måste vara en ej överlagrad metod"
#: cp/coroutines.cc:547
-#, fuzzy, gcc-internal-format
-#| msgid "%qD must have no arguments"
+#, gcc-internal-format
msgid "%qE must take no arguments"
-msgstr "%qD får inte ha några argument"
+msgstr "%qE får inte ta några argument"
#: cp/coroutines.cc:554 cp/coroutines.cc:599
-#, fuzzy, gcc-internal-format
-#| msgid "%qE is predetermined %qs for %qs"
+#, gcc-internal-format
msgid "%qE must return %qT, not %qT"
-msgstr "%qE är förutbestämd som %qs för %qs"
+msgstr "%qE måste returnera %qT, inte %qT"
#: cp/coroutines.cc:581
-#, fuzzy, gcc-internal-format
-#| msgid "%qD must be a non-static member function"
+#, gcc-internal-format
msgid "%qE must be a non-overloaded static function"
-msgstr "%qD måste vara en icke-statisk medlemsfunktion"
+msgstr "%qE måste vara en ej överlagrad statisk funktion"
#: cp/coroutines.cc:592
-#, fuzzy, gcc-internal-format
-#| msgid "%qT is not a base of %qT"
+#, gcc-internal-format
msgid "%qE must take a single %qT"
-msgstr "%qT är inte en basklass till %qT"
+msgstr "%qE måste ta ett ensamt %qT"
#: cp/coroutines.cc:621
#, gcc-internal-format
@@ -55536,10 +55447,9 @@ msgid "%qE is provided by %qT but %<std::nothrow%> cannot be found"
msgstr "%qE tillhandahålls av %qT men %<std::nothrow%> finns inte"
#: cp/coroutines.cc:4840
-#, fuzzy, gcc-internal-format
-#| msgid "%qE is provided by %qT but is not usable with the function signature %qD"
+#, gcc-internal-format
msgid "%qE is provided by %qT but is not usable with the function %qD"
-msgstr "%qE tillhandahålls av %qT men är inte användbart med funktionssignaturen %qD"
+msgstr "%qE tillhandahålls av %qT men är inte användbart med funktionen %qD"
#: cp/coroutines.cc:5146
#, gcc-internal-format
@@ -55702,10 +55612,9 @@ msgid "conversion from %qH to non-scalar type %qI requested"
msgstr "konvertering från %qH till icke-skalär typ %qI begärd"
#: cp/cvt.cc:1089
-#, fuzzy, gcc-internal-format
-#| msgid "ignoring return value of %qD, declared with attribute %<nodiscard%>: %E"
+#, gcc-internal-format
msgid "ignoring return value of %qD, declared with attribute %<nodiscard%>: %qs"
-msgstr "ignorerar returvärdet av %qD, deklarerad med attributet %<nodiscard%>: %E"
+msgstr "ignorerar returvärdet av %qD, deklarerad med attributet %<nodiscard%>: %qs"
#: cp/cvt.cc:1091
#, gcc-internal-format
@@ -55713,10 +55622,9 @@ msgid "ignoring return value of %qD, declared with attribute %<nodiscard%>%s"
msgstr "ignorerar returvärdet av %qD, deklarerad med attributet %<nodiscard%>%s"
#: cp/cvt.cc:1108
-#, fuzzy, gcc-internal-format
-#| msgid "ignoring returned value of type %qT, declared with attribute %<nodiscard%>%s"
+#, gcc-internal-format
msgid "ignoring returned value of type %qT, declared with attribute %<nodiscard%>: %qs"
-msgstr "ignorerar returnerat värde av typen %qT, deklarerat med attributet %<nodiscard%>%s"
+msgstr "ignorerar returnerat värde av typen %qT, deklarerat med attributet %<nodiscard%>: %qs"
#: cp/cvt.cc:1110
#, gcc-internal-format
@@ -56004,10 +55912,9 @@ msgid "with"
msgstr "med"
#: cp/decl.cc:733
-#, fuzzy, gcc-internal-format
-#| msgid "existing declaration %#qD"
+#, gcc-internal-format
msgid "unused using-declaration %qD"
-msgstr "befintlig deklaration %#qD"
+msgstr "oanvänd using-deklaration %qD"
#: cp/decl.cc:737
#, gcc-internal-format
@@ -56743,16 +56650,14 @@ msgid "block-scope extern declaration %q#D must not be attached to a named modul
msgstr "extern-deklaration %q#D med blockräckvidd får inte kopplas till en namngiven modul"
#: cp/decl.cc:6205
-#, fuzzy, gcc-internal-format
-#| msgid "%qD defined %<thread_local%> in %qs function only available with %<-std=c++2b%> or %<-std=gnu++2b%>"
+#, gcc-internal-format
msgid "%qD defined %<thread_local%> in %qs function only available with %<-std=c++23%> or %<-std=gnu++23%>"
-msgstr "%qD definierad %<thread_local%> i en %qs-funktion är endast tillgängligt med %<-std=c++2b%> eller %<-std=gnu++2b%>"
+msgstr "%qD definierad %<thread_local%> i en %qs-funktion är endast tillgängligt med %<-std=c++23%> eller %<-std=gnu++23%>"
#: cp/decl.cc:6211
-#, fuzzy, gcc-internal-format
-#| msgid "%qD defined %<static%> in %qs function only available with %<-std=c++2b%> or %<-std=gnu++2b%>"
+#, gcc-internal-format
msgid "%qD defined %<static%> in %qs function only available with %<-std=c++23%> or %<-std=gnu++23%>"
-msgstr "%qD definierad %<static%> i en %qs-funktion är endast tillgängligt med %<-std=c++2b%> eller %<-std=gnu++2b%>"
+msgstr "%qD definierad %<static%> i en %qs-funktion är endast tillgängligt med %<-std=c++23%> eller %<-std=gnu++23%>"
#: cp/decl.cc:6277
#, gcc-internal-format
@@ -56986,10 +56891,9 @@ msgid "reference %qD is initialized with itself"
msgstr "referensen %qD initieras med sig själv"
#: cp/decl.cc:8495
-#, fuzzy, gcc-internal-format
-#| msgid "argument %d of %qE must be a pointer type"
+#, gcc-internal-format
msgid "argument %d of %qE must be of %<omp_interop_t%>"
-msgstr "argument %d till %qE måste vara en pekartyp"
+msgstr "argument %d till %qE måste vara av %<omp_interop_t%>"
#: cp/decl.cc:8663
#, gcc-internal-format
@@ -57054,10 +56958,9 @@ msgstr "härledd typ %qT för %qD är ofullständig"
#. [basic.start.main]/3: A program that defines main as deleted
#. is ill-formed.
#: cp/decl.cc:8941
-#, fuzzy, gcc-internal-format
-#| msgid "%qD cannot be defaulted"
+#, gcc-internal-format
msgid "%<::main%> cannot be deleted"
-msgstr "%qD kan inte standarddefinieras"
+msgstr "%<::main%> kan inte raderas"
#: cp/decl.cc:9095
#, gcc-internal-format
@@ -57080,10 +56983,9 @@ msgid "cannot decompose lambda closure type %qT"
msgstr "det går inte att dekomponera lambdahöljestypen %qT"
#: cp/decl.cc:9579
-#, fuzzy, gcc-internal-format
-#| msgid " declared here"
+#, gcc-internal-format
msgid "lambda declared here"
-msgstr " deklarerad här"
+msgstr "lambda deklarerat här"
#: cp/decl.cc:9595
#, gcc-internal-format
@@ -57101,10 +57003,9 @@ msgid "cannot decompose inaccessible member %qD of %qT"
msgstr "det går inte att dekomponera en oåtkomlig medlem %qD av %qT"
#: cp/decl.cc:9629
-#, fuzzy, gcc-internal-format
-#| msgid "%qT is not a nested class of %qT"
+#, gcc-internal-format
msgid "in base class of %qT"
-msgstr "%qT är inte en nästad klass i %qT"
+msgstr "i basklass till %qT"
#: cp/decl.cc:9636
#, gcc-internal-format
@@ -57122,10 +57023,9 @@ msgid "structured binding refers to incomplete type %qT"
msgstr "strukturerad bindning refererar till ofullständig typ %qT"
#: cp/decl.cc:9899
-#, fuzzy, gcc-internal-format
-#| msgid "invalid initializer for structured binding declaration"
+#, gcc-internal-format
msgid "array initializer for structured binding declaration in condition"
-msgstr "ogiltig initierare för deklaration av strukturerad bindning"
+msgstr "vektorinitierare för deklaration av strukturerad bindning i villkor"
#: cp/decl.cc:9905
#, gcc-internal-format
@@ -57314,10 +57214,9 @@ msgid "static member function %q#D declared with type qualifiers"
msgstr "statisk medlemsfunktion %q#D deklarerad med typkvalificerare"
#: cp/decl.cc:11070
-#, fuzzy, gcc-internal-format
-#| msgid "named return values are no longer supported"
+#, gcc-internal-format
msgid "function concepts are no longer supported"
-msgstr "namngivna returvärden stödjs inte längre"
+msgstr "funktionskoncept stödjs inte längre"
#: cp/decl.cc:11108
#, gcc-internal-format
@@ -57381,16 +57280,14 @@ msgid "cannot declare %<::main%> to be static"
msgstr "det går inte att deklarera %<::main%> som static"
#: cp/decl.cc:11293
-#, fuzzy, gcc-internal-format
-#| msgid "cannot declare %<::main%> to be static"
+#, gcc-internal-format
msgid "cannot declare %<::main%> with a linkage specification"
-msgstr "det går inte att deklarera %<::main%> som static"
+msgstr "det går inte att deklarera %<::main%> med en länkningsspecifikation"
#: cp/decl.cc:11296
-#, fuzzy, gcc-internal-format
-#| msgid "cannot declare %<::main%> to be a template"
+#, gcc-internal-format
msgid "cannot attach %<::main%> to a named module"
-msgstr "det går inte att deklarera %<::main%> som en mall"
+msgstr "det går inte att koppla %<::main%> till en namngiven modul"
#: cp/decl.cc:11355
#, gcc-internal-format
@@ -57523,10 +57420,9 @@ msgid "concept must be defined at namespace scope"
msgstr "koncept måste definieras med namnrymdsräckvidd"
#: cp/decl.cc:11815
-#, fuzzy, gcc-internal-format
-#| msgid "named return values are no longer supported"
+#, gcc-internal-format
msgid "variable concepts are no longer supported"
-msgstr "namngivna returvärden stödjs inte längre"
+msgstr "variabelkoncept stödjs inte längre"
#: cp/decl.cc:11936
#, gcc-internal-format
@@ -57759,10 +57655,8 @@ msgid "%<decltype(auto)%> cannot be cv-qualified"
msgstr "%<decltype(auto)%> får inte vara cv-kvalificerad"
#: cp/decl.cc:12678
-#, fuzzy
-#| msgid "%<signed%> and %<unsigned%> specified together"
msgid "%e and %e specified together"
-msgstr "%<signed%> och %<unsigned%> givna tillsammans"
+msgstr "%e och %e givna tillsammans"
#: cp/decl.cc:12890
#, gcc-internal-format
@@ -58076,16 +57970,14 @@ msgid "invalid use of %<decltype(auto)%>"
msgstr "ogiltig användning av %<decltype(auto)%>"
#: cp/decl.cc:14044
-#, fuzzy, gcc-internal-format
-#| msgid "%qs function with trailing return type has %qT as its type rather than plain %<auto%>"
+#, gcc-internal-format
msgid "%qs function with trailing return type has constrained %<auto%> type specifier rather than plain %<auto%>"
-msgstr "funktionen %qs med avslutande returtyp har %qT som sin typ istället för bara %<auto%>"
+msgstr "funktionen %qs med avslutande returtyp har typspecificeraren begränsad %<auto%> istället för bara %<auto%>"
#: cp/decl.cc:14050
-#, fuzzy, gcc-internal-format
-#| msgid "invalid use of constructor as a template"
+#, gcc-internal-format
msgid "invalid use of constrained %<auto%> type"
-msgstr "ogiltig användning av konstruerare som en mall"
+msgstr "ogiltig användning av begränsad typ %<auto%>"
#: cp/decl.cc:14062
#, gcc-internal-format
@@ -59476,10 +59368,9 @@ msgid "converting lambda that uses %<...%> to function pointer"
msgstr "konverterar lambda som använder %<...%> till funktionspekare"
#: cp/decl2.cc:6317
-#, fuzzy, gcc-internal-format
-#| msgid "use of deleted function %qD"
+#, gcc-internal-format
msgid "use of deleted function %qD: %s"
-msgstr "användning av borttagen funktion %qD"
+msgstr "användning av borttagen funktion %qD: %s"
#: cp/decl2.cc:6321
#, gcc-internal-format
@@ -60119,10 +60010,9 @@ msgid "new cannot be applied to a function type"
msgstr "new kan inte användas på en funktionstyp"
#: cp/init.cc:4159
-#, fuzzy, gcc-internal-format
-#| msgid "parameter %u has incomplete type"
+#, gcc-internal-format
msgid "operator %<delete []%> used on incomplete type"
-msgstr "parameter %u har ofullständig typ"
+msgstr "operatorn %<delete []%> använd på ofullständig typ"
#: cp/init.cc:4174
#, gcc-internal-format
@@ -60145,10 +60035,9 @@ msgid "unknown array size in delete"
msgstr "okänd vektorstorlek i delete"
#: cp/init.cc:5263
-#, fuzzy, gcc-internal-format
-#| msgid "return type is an incomplete type"
+#, gcc-internal-format
msgid "operator %<delete%> used on incomplete type"
-msgstr "returtypen är en ofullständig typ"
+msgstr "operatorn %<delete%> anvånd på en ofullständig typ"
#: cp/init.cc:5278
#, gcc-internal-format
@@ -60201,10 +60090,9 @@ msgid "capture by copy of incomplete type %qT"
msgstr "fångst av kopia av ofullständig typ %qT"
#: cp/lambda.cc:632
-#, fuzzy, gcc-internal-format
-#| msgid "unused structured binding declaration"
+#, gcc-internal-format
msgid "captured structured bindings are a C++20 extension"
-msgstr "oanvänd deklaration av strukturerad bindning"
+msgstr "fångad strukturerad bindning är en C++20-utvidgning"
#: cp/lambda.cc:699
#, gcc-internal-format
@@ -60227,16 +60115,14 @@ msgid "%<this%> was not captured for this lambda function"
msgstr "%<this%> fångades inte för denna lambdafunktion"
#: cp/lambda.cc:1575
-#, fuzzy, gcc-internal-format
-#| msgid "the calling convention for %qT changes in %<-fabi-version=13%> (GCC 8.2)"
+#, gcc-internal-format
msgid "the mangled name of %qT changed in %<-fabi-version=20%> (GCC 15.1)"
-msgstr "anropskonventionen för %qT ändras i %<-fabi-version=13%> (GCC 8.2)"
+msgstr "det manglade namnet för %qT ändrad i %<-fabi-version=20%> (GCC 15.1)"
#: cp/lambda.cc:1579
-#, fuzzy, gcc-internal-format
-#| msgid "the calling convention for %qT changes in %<-fabi-version=13%> (GCC 8.2)"
+#, gcc-internal-format
msgid "the mangled name of %qT changes in %<-fabi-version=20%> (GCC 15.1)"
-msgstr "anropskonventionen för %qT ändras i %<-fabi-version=13%> (GCC 8.2)"
+msgstr "det manglade namnet för %qT ändras i %<-fabi-version=20%> (GCC 15.1)"
#: cp/lex.cc:643
#, gcc-internal-format
@@ -60479,22 +60365,19 @@ msgid "synthesized method %qD first required here"
msgstr "syntetiserad metod %qD krävs första gången här"
#: cp/method.cc:1989
-#, fuzzy, gcc-internal-format
-#| msgid "(a pointer to member can only be formed with %<&%E%>)"
+#, gcc-internal-format
msgid "pointer to data member type %qT can only be invoked with one argument"
-msgstr "(en pekare på medlem kan bara skapas med %<&%E%>)"
+msgstr "pekare på datamedlemstypen %qT kan endast anropas med ett argument"
#: cp/method.cc:1996
-#, fuzzy, gcc-internal-format
-#| msgid " member function type %qT is not a valid template argument"
+#, gcc-internal-format
msgid "pointer to member function type %qT must be invoked with at least one argument"
-msgstr " medlemsfunktionstypen %qT är inte ett giltigt mallargument"
+msgstr "pekare på medlemsfunktionstypen %qT måste anropas med åtminstone ett argument"
#: cp/method.cc:2016
-#, fuzzy, gcc-internal-format
-#| msgid "the type of a pointer to explicit object member function is a regular pointer to function type"
+#, gcc-internal-format
msgid "first argument type %qT of a pointer to member must be a class type or a pointer to a class type"
-msgstr "typen på en pekare till en explicit objektmedlemsfunktion är en vanlig pekare på en funktionstyp"
+msgstr "första argumenttypen %qT för en pekare på en medlem måste vara en klasstyp eller en pekare på en klasstyp"
#: cp/method.cc:2524
#, gcc-internal-format
@@ -60567,16 +60450,14 @@ msgid "%q#F is implicitly deleted because its exception-specification does not m
msgstr "%q#F tas implicit bort för att dess undantagsspecifikation stämmer inte med den implicita undantagsspecifikationen %qX"
#: cp/method.cc:3573
-#, fuzzy, gcc-internal-format
-#| msgid "%q#F is implicitly deleted because its exception-specification does not match the implicit exception-specification %qX"
+#, gcc-internal-format
msgid "explicitly defaulted copy constructor is implicitly deleted because its declared type does not match the type of an implicit copy constructor"
-msgstr "%q#F tas implicit bort för att dess undantagsspecifikation stämmer inte med den implicita undantagsspecifikationen %qX"
+msgstr "explicit standarddefinierad kopieringskonstruerare raderas implicit för att dess deklarerade typ inte stämmer inte med typen på en implicita kopieringskonstruerare"
#: cp/method.cc:3578
-#, fuzzy, gcc-internal-format
-#| msgid "%q#F is implicitly deleted because its exception-specification does not match the implicit exception-specification %qX"
+#, gcc-internal-format
msgid "explicitly defaulted move constructor is implicitly deleted because its declared type does not match the type of an implicit move constructor"
-msgstr "%q#F tas implicit bort för att dess undantagsspecifikation stämmer inte med den implicita undantagsspecifikationen %qX"
+msgstr "explicit standarddefinierad flyttkonstruerare raderas implicit för att dess deklarerade typ inte stämmer inte med typen på en implicita flyttkonstruerare"
#: cp/method.cc:3583
#, gcc-internal-format
@@ -60656,22 +60537,19 @@ msgid "existing declaration %#qD"
msgstr "befintlig deklaration %#qD"
#: cp/module.cc:12186
-#, fuzzy, gcc-internal-format
-#| msgid "no default argument for %qD"
+#, gcc-internal-format
msgid "conflicting default argument for %#qD"
-msgstr "inget standardargument för %qD"
+msgstr "standardargument i konflikt för %#qD"
#: cp/module.cc:12188 cp/module.cc:12215
-#, fuzzy, gcc-internal-format
-#| msgid "built-in %qD declared here"
+#, gcc-internal-format
msgid "existing default declared here"
-msgstr "den inbyggda %qD är deklarerad här"
+msgstr "befintligt standardvärde är deklarerat här"
#: cp/module.cc:12212
-#, fuzzy, gcc-internal-format
-#| msgid "default argument missing for parameter %P of %q#D"
+#, gcc-internal-format
msgid "conflicting default argument for parameter %P of %#qD"
-msgstr "standardargumentet saknas för parameter %P till %q#D"
+msgstr "standardargument står i konflikt för parameter %P till %q#D"
#: cp/module.cc:13265
#, gcc-internal-format
@@ -60704,40 +60582,34 @@ msgid "enumeration range differs"
msgstr "uppräkningsintervallen skiljer"
#: cp/module.cc:13504
-#, fuzzy, gcc-internal-format
-#| msgid "specialization of alias template %qD"
+#, gcc-internal-format
msgid "%qD is an alias of TU-local type %qT"
-msgstr "specialisering av aliasmall %qD"
+msgstr "%qD är ett alias för den TU-lokala typen %qT"
#: cp/module.cc:13522
-#, fuzzy, gcc-internal-format
-#| msgid "specialization of alias template %qD"
+#, gcc-internal-format
msgid "%qD is a specialization of TU-local template %qD"
-msgstr "specialisering av aliasmall %qD"
+msgstr "%qD är en specialisering av den TU-lokala mallen %qD"
#: cp/module.cc:13546
-#, fuzzy, gcc-internal-format
-#| msgid "%q#D declared here with internal linkage"
+#, gcc-internal-format
msgid "%qD declared with internal linkage"
-msgstr "%q#D är deklarerad här med intern länkning"
+msgstr "%qD är deklarerad med intern länkning"
#: cp/module.cc:13564
-#, fuzzy, gcc-internal-format
-#| msgid "%qD may not be declared within a namespace"
+#, gcc-internal-format
msgid "%qD has no linkage and is declared in an anonymous namespace"
-msgstr "%qD är kanske inte deklarerad i en namnrymd"
+msgstr "%qD har ingen länkning och är deklarerad i en anonym namnrymd"
#: cp/module.cc:13576
-#, fuzzy, gcc-internal-format
-#| msgid "%qD has not been declared within %qD"
+#, gcc-internal-format
msgid "%qD has no linkage and is declared within TU-local entity %qT"
-msgstr "%qD har inte deklarerats inom %qD"
+msgstr "%qD har ingen länkning och är deklarerad inom en TU-lokal enhet %qT"
#: cp/module.cc:13587
-#, fuzzy, gcc-internal-format
-#| msgid "%qD has not been declared within %qD"
+#, gcc-internal-format
msgid "%qD has no linkage and is declared within TU-local entity %qD"
-msgstr "%qD har inte deklarerats inom %qD"
+msgstr "%qD har ingen länkning och är deklarerad inom en TU-lokal enhet %qD"
#: cp/module.cc:13619
#, gcc-internal-format
@@ -60750,28 +60622,24 @@ msgid "%qT has no name and is not defined within a class, function, or initializ
msgstr "%qT har inget namn och är inte definierad inute in klass, funktion eller initierare"
#: cp/module.cc:13664
-#, fuzzy, gcc-internal-format
-#| msgid "%qD used without template arguments"
+#, gcc-internal-format
msgid "%qD has TU-local template argument %qD"
-msgstr "%qD använd utan mallargument"
+msgstr "%qD har ett TU-lokalt mallargument %qD"
#: cp/module.cc:13676
-#, fuzzy, gcc-internal-format
-#| msgid "%qE is not a valid template argument for type %qT"
+#, gcc-internal-format
msgid "%qD has TU-local template argument %qT"
-msgstr "%qE är inte ett giltigt mallargument för typen %qT"
+msgstr "%qD har ett lokalt mallargument %qT"
#: cp/module.cc:13728
-#, fuzzy, gcc-internal-format
-#| msgid "%qD called on unallocated object %qD"
+#, gcc-internal-format
msgid "%qD refers to TU-local object %qD"
-msgstr "%qD anropat på ett oallokerat objekt %qD"
+msgstr "%qD refererar till ett TU-lokalt objekt %qD"
#: cp/module.cc:13730
-#, fuzzy, gcc-internal-format
-#| msgid "%qD does not refer to a function"
+#, gcc-internal-format
msgid "%qD refers to TU-local function %qD"
-msgstr "%qD refererar inte till en funktion"
+msgstr "%qD refererar till en TU-lokal funktion %qD"
#: cp/module.cc:14852
#, gcc-internal-format
@@ -60889,16 +60757,14 @@ msgid "module contains OpenMP, use %<-fopenmp%> to enable"
msgstr "modulen innehåller OpenMP, använd %<-fopenmp%> för att aktivera"
#: cp/module.cc:19375
-#, fuzzy, gcc-internal-format
-#| msgid "module contains OpenMP, use %<-fopenmp%> to enable"
+#, gcc-internal-format
msgid "module contains OpenMP, use %<-fopenmp%> or %<-fopenmp-simd%> to enable"
-msgstr "modulen innehåller OpenMP, använd %<-fopenmp%> för att aktivera"
+msgstr "modulen innehåller OpenMP, använd %<-fopenmp%> eller %<-fopenmp-simd%> för att aktivera"
#: cp/module.cc:19378
-#, fuzzy, gcc-internal-format
-#| msgid "module contains OpenMP, use %<-fopenmp%> to enable"
+#, gcc-internal-format
msgid "module contains OpenACC, use %<-fopenacc%> to enable"
-msgstr "modulen innehåller OpenMP, använd %<-fopenmp%> för att aktivera"
+msgstr "modulen innehåller OpenACC, använd %<-fopenacc%> för att aktivera"
#: cp/module.cc:19396
#, gcc-internal-format
@@ -60936,10 +60802,9 @@ msgid "returning to the gate for a mechanical issue"
msgstr "återvänder till grinden för ett mekaniskt problem"
#: cp/module.cc:20418
-#, fuzzy, gcc-internal-format
-#| msgid "redeclaring %qD in module %qs conflicts with import"
+#, gcc-internal-format
msgid "declaring %qD in module %qs conflicts with builtin in global module"
-msgstr "omdeklaration av %qD i modulen %qs står i konflikt med import"
+msgstr "deklaration av %qD i modulen %qs står i konflikt med inbyggd i den globala modulen"
#: cp/module.cc:20421
#, gcc-internal-format
@@ -60992,16 +60857,14 @@ msgid "external linkage definition of %qD in header module must be declared %<in
msgstr "definition av extern länkning av %qD i en huvudmodul måste deklareras %<inline%>"
#: cp/module.cc:20611
-#, fuzzy, gcc-internal-format
-#| msgid "redeclaration of %q+D with no linkage"
+#, gcc-internal-format
msgid "exporting declaration %qD declared in unnamed namespace"
-msgstr "omdeklaration av %q+D utan länkklass"
+msgstr "en exporterande deklaration %qD deklarerad i en namnlös namnrymd"
#: cp/module.cc:20618
-#, fuzzy, gcc-internal-format
-#| msgid "redeclaration of %q+D with no linkage"
+#, gcc-internal-format
msgid "exporting declaration %qD with internal linkage"
-msgstr "omdeklaration av %q+D utan länkklass"
+msgstr "en exporterande deklaration %qD med intern länkklass"
#: cp/module.cc:20771
#, gcc-internal-format
@@ -61066,14 +60929,12 @@ msgid "module %qs imported here"
msgstr "modulen %qs importerades här"
#: cp/module.cc:21287
-#, fuzzy, gcc-internal-format
-#| msgid "unknown Compiled Module Interface: %s"
+#, gcc-internal-format
msgid "mismatching compiled module interface: had %qs, got %qs"
-msgstr "okänt kompilerat modulgränssnitt: %s"
+msgstr "kompilerat modulgränssnitt som inte stämmer: hade %qs, fick %qs"
#: cp/module.cc:21293
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "unknown Compiled Module Interface: %s"
+#, gcc-internal-format, gfc-internal-format
msgid "unknown compiled module interface: %s"
msgstr "okänt kompilerat modulgränssnitt: %s"
@@ -61123,10 +60984,9 @@ msgid "writing CMI %qs"
msgstr "skriver CMI %qs"
#: cp/module.cc:22046
-#, fuzzy, gcc-internal-format
-#| msgid "not writing module %qs due to errors"
+#, gcc-internal-format
msgid "not writing module %qs due to errors in template bodies"
-msgstr "skriver inte modulen %qs på grund av fel"
+msgstr "skriver inte modulen %qs på grund av fel i mallkroppar"
#: cp/module.cc:22049
#, gcc-internal-format
@@ -61134,10 +60994,9 @@ msgid "enable %<-Wtemplate-body%> for more details"
msgstr "aktivera %<-Wtemplate-body%> för fler detaljer"
#: cp/module.cc:22051
-#, fuzzy, gcc-internal-format
-#| msgid "routine %qD declared here"
+#, gcc-internal-format
msgid "first error in %qD appeared here"
-msgstr "rutinen %qD är deklarerad här"
+msgstr "första felet i %qD uppstod här"
#: cp/module.cc:22115
#, gcc-internal-format, gfc-internal-format
@@ -61408,22 +61267,19 @@ msgid "namespace alias %qD not allowed here, assuming %qD"
msgstr "namnrymdsalias %qD inte tillåtet här, antar %qD"
#: cp/name-lookup.cc:9284
-#, fuzzy, gcc-internal-format
-#| msgid "exporting %q#D that does not have external linkage"
+#, gcc-internal-format
msgid "exporting namespace %qD with internal linkage"
-msgstr "exporterar %q#D som inte har extern länkning"
+msgstr "en exporterande namnrymd %qD med intern länkning"
#: cp/name-lookup.cc:9286
-#, fuzzy, gcc-internal-format
-#| msgid "%qD may not be declared within a namespace"
+#, gcc-internal-format
msgid "%qD has internal linkage because it was declared in an unnamed namespace"
-msgstr "%qD är kanske inte deklarerad i en namnrymd"
+msgstr "%qD har intern länkning för att den deklarerades i en namnlös namnrymd"
#: cp/name-lookup.cc:9290
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<namespace%>"
+#, gcc-internal-format
msgid "exporting unnamed namespace"
-msgstr "%<namespace%> förväntades"
+msgstr "exporterar namnlös namnrymd"
#: cp/name-lookup.cc:9300
#, gcc-internal-format
@@ -61491,22 +61347,19 @@ msgid "%<#pragma%> is not allowed here"
msgstr "%<#pragma%> är inte tillåtet här"
#: cp/parser.cc:3356
-#, fuzzy, gcc-internal-format
-#| msgid "expected directive name"
+#, gcc-internal-format
msgid "unexpected module directive"
-msgstr "ett direktivnamn förväntades"
+msgstr "oväntat moduldirektiv"
#: cp/parser.cc:3358
-#, fuzzy, gcc-internal-format
-#| msgid "perhaps insert a line break, or other disambiguation, to prevent this being considered a module control-line"
+#, gcc-internal-format
msgid "perhaps insert a line break after %qs, or other disambiguation, to prevent this being considered a module control-line"
-msgstr "kanske infoga en radbrytning, eller annat sätt att särskilja, för att förhindra att detta betraktas om en modul-styr-rad"
+msgstr "kanske infoga en radbrytning efter %qs, eller annat sätt att särskilja, för att förhindra att detta betraktas om en modul-styr-rad"
#: cp/parser.cc:3501
-#, fuzzy, gcc-internal-format
-#| msgid "%<::%D%> has not been declared; did you mean %qs?"
+#, gcc-internal-format
msgid "%<%E::%E%> has not been declared; did you mean %<%E::%s%>?"
-msgstr "%<::%D%> har inte deklarerats; menade du %qs?"
+msgstr "%<%E::%E%> har inte deklarerats; menade du %<%E::%s%>?"
#: cp/parser.cc:3507
#, gcc-internal-format
@@ -61529,10 +61382,9 @@ msgid "%<%T::%E%> has not been declared"
msgstr "%<%T::%E%> har inte deklarerats"
#: cp/parser.cc:3529
-#, fuzzy, gcc-internal-format
-#| msgid "%<::%D%> has not been declared; did you mean %qs?"
+#, gcc-internal-format
msgid "%qE has not been declared; did you mean %qs?"
-msgstr "%<::%D%> har inte deklarerats; menade du %qs?"
+msgstr "%qE har inte deklarerats; menade du %qs?"
#: cp/parser.cc:3541
#, gcc-internal-format
@@ -61901,10 +61753,9 @@ msgid "mismatched operator in fold-expression"
msgstr "operator som inte stämmer i vikningsuttryck"
#: cp/parser.cc:5918
-#, fuzzy, gcc-internal-format
-#| msgid "pack init-capture only available with %<-std=c++20%> or %<-std=gnu++20%>"
+#, gcc-internal-format
msgid "pack indexing only available with %<-std=c++2c%> or %<-std=gnu++2c%>"
-msgstr "pack init-fångst är endast tillgängliga med %<-std=c++20%> eller %<-std=gnu++20%>"
+msgstr "paketindexering är endast tillgängliga med %<-std=c++2c%> eller %<-std=gnu++2c%>"
#: cp/parser.cc:5928
#, gcc-internal-format
@@ -62078,16 +61929,14 @@ msgid "call to %<__builtin_operator_new%> does not select replaceable global all
msgstr "anrop av %<__builtin_operator_new%> väljer inte en ersättningsbar global allokeringsfunktion"
#: cp/parser.cc:8073 cp/pt.cc:21578
-#, fuzzy, gcc-internal-format
-#| msgid "destroying %<operator delete%> must be a usual deallocation function"
+#, gcc-internal-format
msgid "call to %<__builtin_operator_delete%> does not select replaceable global deallocation function"
-msgstr "en förstörande %<operator delete%> måste vara en vanlig avallokeringsfunktion"
+msgstr "anrop av %<__builtin_operator_delete%> väljer inte en ersättningsbar global avallokeringsfunktion"
#: cp/parser.cc:8078 cp/pt.cc:21583
-#, fuzzy, gcc-internal-format
-#| msgid "deallocation function declared here"
+#, gcc-internal-format
msgid "selected function declared here"
-msgstr "avallokeringsfunktionen deklarerad här"
+msgstr "den valda funktionen deklarerad här"
#: cp/parser.cc:8211
#, gcc-internal-format
@@ -62135,10 +61984,9 @@ msgid "types may not be defined in %<noexcept%> expressions"
msgstr "typer får inte definieras i %<noexcept%>-uttryck"
#: cp/parser.cc:9566
-#, fuzzy, gcc-internal-format
-#| msgid "%qD cannot have default arguments"
+#, gcc-internal-format
msgid "%<co_await%> cannot be used in default arguments"
-msgstr "%qD kan inte ha standardargument"
+msgstr "%<co_await%> kan inte användas i standardargument"
#: cp/parser.cc:9791 cp/parser.cc:34796
#, gcc-internal-format
@@ -62181,10 +62029,9 @@ msgid "types may not be defined in a new-type-id"
msgstr "typer får inte definieras i en new-type-id"
#: cp/parser.cc:10117
-#, fuzzy, gcc-internal-format
-#| msgid "attributes ignored on template instantiation"
+#, gcc-internal-format
msgid "attributes ignored on outermost array type in new expression"
-msgstr "attribut ignoreras vid mallinstansiering"
+msgstr "attribut ignoreras på yttersta vektortypen i new-uttryck"
#: cp/parser.cc:10213
#, gcc-internal-format
@@ -62333,10 +62180,9 @@ msgid "default argument specified for lambda parameter"
msgstr "standardargumentet angivet för lambdaparameter"
#: cp/parser.cc:12282
-#, fuzzy, gcc-internal-format
-#| msgid "parameter declaration before lambda declaration specifiers only optional with %<-std=c++2b%> or %<-std=gnu++2b%>"
+#, gcc-internal-format
msgid "parameter declaration before lambda declaration specifiers only optional with %<-std=c++23%> or %<-std=gnu++23%>"
-msgstr "en parameterdeklaration före lambdadeklarationsspecificerare är endast valfritt med %<-std=c++2b%> eller %<-std=gnu++2b%>"
+msgstr "en parameterdeklaration före lambdadeklarationsspecificerare är endast valfritt med %<-std=c++23%> eller %<-std=gnu++23%>"
#: cp/parser.cc:12312 cp/pt.cc:14954
#, gcc-internal-format
@@ -62374,22 +62220,19 @@ msgid "%<static%> lambda specifier with lambda capture"
msgstr "lambdaspecificeraren %<static%> med lambdafångst"
#: cp/parser.cc:12379
-#, fuzzy, gcc-internal-format
-#| msgid "parameter declaration before lambda transaction qualifier only optional with %<-std=c++2b%> or %<-std=gnu++2b%>"
+#, gcc-internal-format
msgid "parameter declaration before lambda transaction qualifier only optional with %<-std=c++23%> or %<-std=gnu++23%>"
-msgstr "en parameterdeklaration före lambdatransaktionskvalificerare är endast valfritt med %<-std=c++2b%> eller %<-std=gnu++2b%>"
+msgstr "en parameterdeklaration före lambdatransaktionskvalificerare är endast valfritt med %<-std=c++23%> eller %<-std=gnu++23%>"
#: cp/parser.cc:12392
-#, fuzzy, gcc-internal-format
-#| msgid "parameter declaration before lambda exception specification only optional with %<-std=c++2b%> or %<-std=gnu++2b%>"
+#, gcc-internal-format
msgid "parameter declaration before lambda exception specification only optional with %<-std=c++23%> or %<-std=gnu++23%>"
-msgstr "en parameterdeklaration före en lambdaundantagsspecifikation är endast valfritt med %<-std=c++2b%> eller %<-std=gnu++2b%>"
+msgstr "en parameterdeklaration före en lambdaundantagsspecifikation är endast valfritt med %<-std=c++23%> eller %<-std=gnu++23%>"
#: cp/parser.cc:12410
-#, fuzzy, gcc-internal-format
-#| msgid "parameter declaration before lambda trailing return type only optional with %<-std=c++2b%> or %<-std=gnu++2b%>"
+#, gcc-internal-format
msgid "parameter declaration before lambda trailing return type only optional with %<-std=c++23%> or %<-std=gnu++23%>"
-msgstr "en parameterdeklaration före lambdas efterföljande returtyp är endast valfritt med %<-std=c++2b%> eller %<-std=gnu++2b%>"
+msgstr "en parameterdeklaration före lambdas efterföljande returtyp är endast valfritt med %<-std=c++23%> eller %<-std=gnu++23%>"
#: cp/parser.cc:12452
#, gcc-internal-format
@@ -62412,10 +62255,9 @@ msgid "assertions must be followed by %<;%>"
msgstr "försäkranden måste följas av %<;%>"
#: cp/parser.cc:13186
-#, fuzzy, gcc-internal-format
-#| msgid "label at end of compound statement only available with %<-std=c++2b%> or %<-std=gnu++2b%>"
+#, gcc-internal-format
msgid "label at end of compound statement only available with %<-std=c++23%> or %<-std=gnu++23%>"
-msgstr "en etikett vid slutet av en sammansatt sats är endast tillgängligt med %<-std=c++2b%> eller %<-std=gnu++2b%>"
+msgstr "en etikett vid slutet av en sammansatt sats är endast tillgängligt med %<-std=c++23%> eller %<-std=gnu++23%>"
#: cp/parser.cc:13366 cp/parser.cc:13611
#, gcc-internal-format
@@ -62439,10 +62281,9 @@ msgstr "%<typename%> behövs före %qE för att %qT är en beroende räckvidd"
#. A::A a;
#: cp/parser.cc:13625
-#, fuzzy, gcc-internal-format
-#| msgid "%<%T::%E%> names the constructor, not the type"
+#, gcc-internal-format
msgid "%qE names the constructor, not the type"
-msgstr "%<%T::%E%> namnger konstrueraren, inte typen"
+msgstr "%qE namnger konstrueraren, inte typen"
#: cp/parser.cc:13683
#, gcc-internal-format
@@ -62450,10 +62291,9 @@ msgid "compound-statement in %<constexpr%> function"
msgstr "sammansatt sats i en %<constexpr%>-funktion"
#: cp/parser.cc:13747
-#, fuzzy, gcc-internal-format
-#| msgid "inner loops must be perfectly nested with %<ordered%> clause"
+#, gcc-internal-format
msgid "inner loops must be perfectly nested with %<tile%> directive"
-msgstr "inre slingor måste vara perfekt nästade med en %<ordered%>-klausul"
+msgstr "inre slingor måste vara perfekt nästade med direktivet %<tile%>"
#: cp/parser.cc:13952
#, gcc-internal-format
@@ -62461,10 +62301,9 @@ msgid "%<if constexpr%> only available with %<-std=c++17%> or %<-std=gnu++17%>"
msgstr "%<if constexpr%> är endast tillgängligt med %<-std=c++17%> eller %<-std=gnu++17%>"
#: cp/parser.cc:13974
-#, fuzzy, gcc-internal-format
-#| msgid "%<if consteval%> only available with %<-std=c++2b%> or %<-std=gnu++2b%>"
+#, gcc-internal-format
msgid "%<if consteval%> only available with %<-std=c++23%> or %<-std=gnu++23%>"
-msgstr "%<if consteval%> är endast tillgängligt med %<-std=c++2b%> eller %<-std=gnu++2b%>"
+msgstr "%<if consteval%> är endast tillgängligt med %<-std=c++23%> eller %<-std=gnu++23%>"
#: cp/parser.cc:13999 cp/parser.cc:14034
#, gcc-internal-format
@@ -62554,10 +62393,9 @@ msgid "range-based %<for%> loops only available with %<-std=c++11%> or %<-std=gn
msgstr "intervallbaserad %<for%>-slinga är endast tillgänglig med %<-std=c++11%> eller %<-std=gnu++11%>"
#: cp/parser.cc:15374
-#, fuzzy, gcc-internal-format
-#| msgid "%<goto%> in %<constexpr%> function only available with %<-std=c++2b%> or %<-std=gnu++2b%>"
+#, gcc-internal-format
msgid "%<goto%> in %<constexpr%> function only available with %<-std=c++23%> or %<-std=gnu++23%>"
-msgstr "%<goto%> i %<constexpr%>-funktioner är endast tillgängligt med %<-std=c++2b%> eller %<-std=gnu++2b%>"
+msgstr "%<goto%> i %<constexpr%>-funktioner är endast tillgängligt med %<-std=c++23%> eller %<-std=gnu++23%>"
#. Issue a warning about this use of a GNU extension.
#: cp/parser.cc:15383
@@ -62583,19 +62421,17 @@ msgstr "modulnamn förväntades"
#: cp/parser.cc:15621
#, gcc-internal-format
msgid "module-declaration not permitted in header-unit"
-msgstr "en moduldeklaration är inte tillåtet i en huvudenhet"
+msgstr "en moduldeklaration är inte tillåten i en huvudenhet"
#: cp/parser.cc:15627
-#, fuzzy, gcc-internal-format
-#| msgid "import-declaration must be at global scope"
+#, gcc-internal-format
msgid "module-declaration must be at global scope"
-msgstr "import-deklaration måste vara på global räckvidd"
+msgstr "en moduldeklaration måste vara på global räckvidd"
#: cp/parser.cc:15628
-#, fuzzy, gcc-internal-format
-#| msgid "concept defined here"
+#, gcc-internal-format
msgid "scope opened here"
-msgstr "konceptet är definierat här"
+msgstr "räckvidden öppnad här"
#: cp/parser.cc:15654
#, gcc-internal-format
@@ -62619,10 +62455,9 @@ msgid "post-module-declaration imports must be contiguous"
msgstr "post-modul-deklarations-importer måste vara sammanhängande"
#: cp/parser.cc:15707 cp/parser.cc:15716
-#, fuzzy, gcc-internal-format
-#| msgid "perhaps insert a line break, or other disambiguation, to prevent this being considered a module control-line"
+#, gcc-internal-format
msgid "perhaps insert a line break after %<import%>, or other disambiguation, to prevent this being considered a module control-line"
-msgstr "kanske infoga en radbrytning, eller annat sätt att särskilja, för att förhindra att detta betraktas om en modul-styr-rad"
+msgstr "kanske infoga en radbrytning efter %<import%>, eller annat sätt att särskilja, för att förhindra att detta betraktas om en modul-styr-rad"
#: cp/parser.cc:15715
#, gcc-internal-format
@@ -62660,16 +62495,14 @@ msgid "%<export%> not part of following module-directive"
msgstr "%<export%> är inte del av ett följande moduldirektiv"
#: cp/parser.cc:15852
-#, fuzzy, gcc-internal-format
-#| msgid "ISO C does not allow extra %<;%> outside of a function"
+#, gcc-internal-format
msgid "extra %<;%> outside of a function only allowed in C++11"
-msgstr "ISO C tillåter inte extra %<;%> utanför funktioner"
+msgstr "extra %<;%> utanför funktioner är endast tillåtet i C++11"
#: cp/parser.cc:15855
-#, fuzzy, gcc-internal-format
-#| msgid "ISO C does not allow extra %<;%> outside of a function"
+#, gcc-internal-format
msgid "extra %<;%> outside of a function"
-msgstr "ISO C tillåter inte extra %<;%> utanför funktioner"
+msgstr "extra %<;%> utanför en funktion"
#: cp/parser.cc:15864
#, gcc-internal-format
@@ -62697,10 +62530,9 @@ msgid "attributes may be inserted here"
msgstr "attribut får infogas här"
#: cp/parser.cc:16088
-#, fuzzy, gcc-internal-format
-#| msgid "explicit specialization of non-template %qT"
+#, gcc-internal-format
msgid "explicit specializations are not permitted here"
-msgstr "explicit specialisering av icke-mall %qT"
+msgstr "explicita specialiseringar tillåts inte här"
#: cp/parser.cc:16090 cp/parser.cc:28230
#, gcc-internal-format
@@ -62708,16 +62540,14 @@ msgid "a specialization is always exported alongside its primary template"
msgstr "en specialisering exporteras alltid tillsammans med sin primära mall"
#: cp/parser.cc:16103
-#, fuzzy, gcc-internal-format
-#| msgid "explicit instantiation of non-template %q#D"
+#, gcc-internal-format
msgid "explicit instantiations are not permitted here"
-msgstr "explicit instansiering av icke-mall %q#D"
+msgstr "explicita instansieringar tillåts inte här"
#: cp/parser.cc:16119
-#, fuzzy, gcc-internal-format
-#| msgid "module-declaration not permitted in header-unit"
+#, gcc-internal-format
msgid "export-declarations are not permitted here"
-msgstr "en moduldeklaration är inte tillåtet i en huvudenhet"
+msgstr "exportdeklarationer tillåts inte här"
#: cp/parser.cc:16290
#, gcc-internal-format
@@ -62755,16 +62585,14 @@ msgid "multiple declarations in range-based %<for%> loop"
msgstr "flera deklarationer i intervallbaserad %<for%>-slinga"
#: cp/parser.cc:16701
-#, fuzzy, gcc-internal-format
-#| msgid "structured bindings only available with %<-std=c++17%> or %<-std=gnu++17%>"
+#, gcc-internal-format
msgid "structured bindings with attributed identifiers only available with %<-std=c++2c%> or %<-std=gnu++2c%>"
-msgstr "strukturerade bindningar är endast tillgängliga med %<-std=c++17%> eller %<-std=gnu++17%>"
+msgstr "strukturerade bindningar med identifierare med attribut är endast tillgängliga med %<-std=c++2c%> eller %<-std=gnu++2c%>"
#: cp/parser.cc:16738
-#, fuzzy, gcc-internal-format
-#| msgid "structured bindings only available with %<-std=c++17%> or %<-std=gnu++17%>"
+#, gcc-internal-format
msgid "structured bindings in conditions only available with %<-std=c++2c%> or %<-std=gnu++2c%>"
-msgstr "strukturerade bindningar är endast tillgängliga med %<-std=c++17%> eller %<-std=gnu++17%>"
+msgstr "strukturerade bindningar i villkor är endast tillgängliga med %<-std=c++2c%> eller %<-std=gnu++2c%>"
#: cp/parser.cc:16742
#, gcc-internal-format
@@ -62932,10 +62760,9 @@ msgid "keyword %<typename%> not allowed in this context (a qualified member init
msgstr "nyckelordet %<typename%> är inte tillåtet i detta sammanhang (en kvalificerad medlemsinitierare är implicit en typ)"
#: cp/parser.cc:18728
-#, fuzzy, gcc-internal-format
-#| msgid "comparison between two arrays is deprecated in C++20"
+#, gcc-internal-format
msgid "space between quotes and suffix is deprecated in C++23"
-msgstr "jämförelse mellan två vektorer bör undvikas enligt C++20"
+msgstr "mellanrum mellan citationstecken och suffix bör undvikas enligt C++23"
#: cp/parser.cc:18734
#, gcc-internal-format
@@ -63104,10 +62931,9 @@ msgid "use of %<auto%> in lambda parameter declaration only available with %<-st
msgstr "användning av %<auto%> i lambdaparameterdeklarationer är endast tillgängligt med %<-std=c++14%> eller %<-std=gnu++14%>"
#: cp/parser.cc:20936
-#, fuzzy, gcc-internal-format
-#| msgid "invalid use of %<auto%> in template argument"
+#, gcc-internal-format
msgid "use of %<auto%> in template argument"
-msgstr "felaktig användning av %<auto%> i mallargument"
+msgstr "användning av %<auto%> i mallargument"
#: cp/parser.cc:20939
#, gcc-internal-format
@@ -63140,10 +62966,9 @@ msgid "concept defined here"
msgstr "konceptet är definierat här"
#: cp/parser.cc:21354
-#, fuzzy, gcc-internal-format
-#| msgid "invalid use of %qD"
+#, gcc-internal-format
msgid "invalid use of concept-name %qD"
-msgstr "ogiltig användning av %qD"
+msgstr "ogiltig användning av konceptnamnet %qD"
#: cp/parser.cc:21370
#, gcc-internal-format
@@ -86351,11 +86176,6 @@ msgstr "försöker du göra sönder %s? hur vågar du?"
#~ msgid "STAT= attribute in %C misplaced"
#~ msgstr "attributet STAT= i %C är felplacerat"
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#~| msgid "Expected argument list at %C"
-#~ msgid "expected argument list at %C"
-#~ msgstr "Argumentlista förväntades vid %C"
-
#, gcc-internal-format, gfc-internal-format
#~ msgid "Sorry, not yet able to call a non-pure/non-elemental function %s in a coarray reference; use a temporary for the function's result instead"
#~ msgstr "Ledsen, kan inte ännu anropa en icke-ren/icke-elementär funktion %s i en co-vektor-referens; använd en temporär till funktionsresultatet istället"
diff --git a/gcc/poly-int.h b/gcc/poly-int.h
index 7c8901a..77f7875 100644
--- a/gcc/poly-int.h
+++ b/gcc/poly-int.h
@@ -1906,6 +1906,25 @@ known_alignment (const poly_int<N, Ca> &a)
return r & -r;
}
+/* Return true if we can compute A & B at compile time, storing the
+ result in RES if so. */
+
+template<unsigned int N, typename Ca, typename Cb, typename Cr>
+inline typename if_nonpoly<Cb, bool>::type
+can_and_p (const poly_int<N, Ca> &a, Cb b, Cr *result)
+{
+ /* Coefficients 1 and above must be a multiple of something greater
+ than ~B. */
+ typedef POLY_INT_TYPE (Ca) int_type;
+ if (N >= 2)
+ for (unsigned int i = 1; i < N; i++)
+ if ((-(a.coeffs[i] & -a.coeffs[i]) & ~b) != int_type (0))
+ return false;
+ *result = a;
+ result->coeffs[0] &= b;
+ return true;
+}
+
/* Return true if we can compute A | B at compile time, storing the
result in RES if so. */
diff --git a/gcc/rust/ChangeLog b/gcc/rust/ChangeLog
index 31c731b..64053d4 100644
--- a/gcc/rust/ChangeLog
+++ b/gcc/rust/ChangeLog
@@ -1,3 +1,322 @@
+2025-04-08 Matty Kuhn <matty.kuhn.1@gmail.com>
+
+ * ast/rust-ast.h: (AST::Attribute): add empty_input function
+ * checks/errors/rust-feature-gate.cc: (FeatureGate::visit): check for empty feature gate
+
+2025-04-08 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * ast/rust-ast-collector.cc (TokenCollector::visit): Update label
+ getter call.
+ * ast/rust-ast-visitor.cc (DefaultASTVisitor::visit): Likewise.
+ * ast/rust-ast.cc (BreakExpr::as_string): Likewise.
+ * hir/rust-ast-lower-expr.cc (ASTLoweringExpr::visit): Likewise.
+ * resolve/rust-ast-resolve-expr.cc (ResolveExpr::visit): Likewise.
+ * resolve/rust-late-name-resolver-2.0.cc (Late::visit): Likewise.
+ * ast/rust-expr.h: Add optional getter and rename label getter to
+ get_label_unchecked.
+
+2025-04-08 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * ast/rust-ast-collector.cc (TokenCollector::visit):
+ Call unchecked getter.
+ * ast/rust-ast-visitor.cc (DefaultASTVisitor::visit):
+ Likewise.
+ * ast/rust-ast.cc (ContinueExpr::as_string): Likewise.
+ * hir/rust-ast-lower-expr.cc (ASTLoweringExpr::visit): Likewise.
+ * resolve/rust-ast-resolve-expr.cc (ResolveExpr::visit): Likewise.
+ * resolve/rust-late-name-resolver-2.0.cc (Late::visit): Likewise.
+ * ast/rust-expr.h: Add new getter for the optional and rename getter
+ to get_label_unchecked.
+
+2025-04-08 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * parse/rust-parse-impl.h (Parser::parse_loop_label): Change function
+ return type to expected.
+ (Parser::parse_labelled_loop_expr): Adapt call location to new return
+ type.
+ * parse/rust-parse.h (enum class): Update function prototype.
+
+2025-04-08 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * resolve/rust-late-name-resolver-2.0.cc (Late::visit): Add call
+ to label resolution if there is one label.
+ (Late::resolve_label): Look for labels and emit an error message on
+ failure.
+ * resolve/rust-late-name-resolver-2.0.h: Add function prototypes.
+
+2025-04-08 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * resolve/rust-ast-resolve-expr.cc (ResolveExpr::visit):
+ Change error message to match rustc.
+
+2025-04-08 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * ast/rust-ast-builder.cc (Builder::self_ref_param): Remove error state
+ and use optional.
+ * ast/rust-ast-visitor.cc (DefaultASTVisitor::visit): Check label
+ before visiting.
+ * ast/rust-ast.cc (ContinueExpr::as_string): Retrieve label value.
+ (Lifetime::as_string): Retrieve lifetime value.
+ (ReferenceType::as_string): Likewise.
+ (SelfParam::as_string): Likewise.
+ * ast/rust-ast.h: Remove lifetime and LifetimeParam error state.
+ * ast/rust-desugar-for-loops.cc (DesugarForLoops::DesugarCtx::make_break_arm):
+ Use optional instead of error state.
+ * ast/rust-expr.h (class ContinueExpr): Make label optional.
+ * ast/rust-item.h (class SelfParam): Make lifetime optional.
+ * ast/rust-type.h (class ReferenceType): Likewise.
+ * backend/rust-compile-base.cc: Use optional for self param instead
+ of error state.
+ * backend/rust-compile-base.h: Update function prototype.
+ * expand/rust-derive-clone.cc (DeriveClone::clone_fn): Use optional.
+ * hir/rust-ast-lower-base.cc (ASTLoweringBase::lower_self): Lower
+ lifetime only if it exists.
+ * hir/rust-ast-lower-block.h: Lower loop label only if it exists.
+ * hir/rust-ast-lower-expr.cc (ASTLoweringExpr::visit): Likewise.
+ * hir/rust-ast-lower-implitem.cc (ASTLowerImplItem::visit): Remove
+ references to error state.
+ (ASTLowerTraitItem::visit): Lower self param only if it exists.
+ * hir/rust-ast-lower-item.cc (ASTLoweringItem::visit): Use nullopt
+ for default value instead of SelfParam error state.
+ * hir/rust-ast-lower.cc (ASTLoweringExprWithBlock::visit): Lower label
+ only if it exists.
+ * hir/rust-hir-dump.cc (Dump::do_traitfunctiondecl): Print self only if
+ it exists.
+ (Dump::visit): Liewise.
+ * hir/tree/rust-hir-bound.h: Remove error state.
+ * hir/tree/rust-hir-expr.cc (ContinueExpr::ContinueExpr): Use optional
+ in constructor for loop label.
+ (BreakExpr::BreakExpr): Likewise.
+ * hir/tree/rust-hir-expr.h (class ContinueExpr): Remove error state
+ implementation.
+ (class BreakExpr): Likewise.
+ * hir/tree/rust-hir-generic-param.h: Likewise.
+ * hir/tree/rust-hir-item.cc (SelfParam::SelfParam): Make lifetime
+ optional.
+ (Function::Function): Make self param optional.
+ * hir/tree/rust-hir-item.h (class Function): Likewise.
+ * hir/tree/rust-hir-type.cc (ReferenceType::ReferenceType): Make
+ lifetime optional.
+ * hir/tree/rust-hir-type.h (class ReferenceType): Likewise.
+ * hir/tree/rust-hir.cc (ContinueExpr::as_string): Use new getter.
+ (BreakExpr::as_string): Likewise.
+ (Lifetime::as_string): Likewise.
+ (ReferenceType::as_string): Likewise.
+ (TraitFunctionDecl::as_string): Likewise.
+ (SelfParam::as_string): Remove error state checking.
+ * parse/rust-parse-impl.h (Parser::parse_generic_param): Adapt to
+ optional.
+ (Parser::parse_lifetime_params): Likewise.
+ (Parser::parse_lifetime_params_objs): Likewise.
+ (Parser::parse_lifetime_param): Likewise.
+ (Parser::parse_lifetime_where_clause_item): Likewise.
+ (Parser::parse_type_param_bound): Likewise.
+ (Parser::parse_lifetime_bounds): Likewise.
+ (Parser::parse_path_generic_args): Likewise.
+ (Parser::parse_self_param): Likewise.
+ (Parser::parse_break_expr): Likewise.
+ (Parser::parse_continue_expr): Likewise.
+ (Parser::parse_reference_type_inner): Likewise.
+ * parse/rust-parse.h (class ParseLifetimeParamError): Add new class for
+ lifetime param parsing errors.
+ (class ParseLifetimeError): Add new class for lifetime parsing errors.
+ (enum ParseSelfError): Add new class for self param parsing errors.
+ * typecheck/rust-hir-type-check-implitem.cc (TypeCheckImplItem::visit):
+ Use unchecked getter in checked context. And make anonymous region.
+ * typecheck/rust-hir-type-check.cc (TraitItemReference::get_type_from_fn):
+ Likewise.
+
+2025-04-08 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * ast/rust-ast-visitor.cc (DefaultASTVisitor::visit): Add
+ check for loop label before visiting it.
+
+2025-04-08 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * ast/rust-expr.h: Remove error getter and constructor.
+
+2025-04-08 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * ast/rust-ast-builder.cc (Builder::block): Call with a nullopt instead
+ of an error loop label.
+ (WhileLetLoopExpr::as_string): Use getter function and adapt to
+ newtype.
+ * ast/rust-ast.cc (WhileLoopExpr::as_string): Likewise.
+ (LoopExpr::as_string): Likewise.
+ (BreakExpr::as_string): Likewise.
+ (ForLoopExpr::as_string): Likewise.
+ * ast/rust-expr.h (class BlockExpr): Make loop label optional.
+ (class BreakExpr): Likewise.
+ * expand/rust-derive-clone.cc (DeriveClone::clone_fn): Use nullopt.
+ * expand/rust-derive-debug.cc (DeriveDebug::stub_debug_fn): Likewise.
+ * expand/rust-derive-default.cc (DeriveDefault::default_fn): Likewise.
+ * expand/rust-derive-eq.cc: Likewise.
+ * parse/rust-parse-impl.h (Parser::parse_block_expr): Use optional
+ for arguments.
+ (Parser::parse_loop_expr): Likewise.
+ (Parser::parse_while_loop_expr): Likewise.
+ (Parser::parse_while_let_loop_expr): Likewise.
+ (Parser::parse_for_loop_expr): Likewise.
+ (Parser::parse_labelled_loop_expr): Likewise.
+ (Parser::parse_loop_label): Return an optional.
+ * parse/rust-parse.h: Update function prototype and use nullopt for
+ default values.
+
+2025-04-08 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * ast/rust-ast-visitor.cc (DefaultASTVisitor::visit): Change default
+ visit order.
+
+2025-04-08 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * ast/rust-ast-visitor.cc (DefaultASTVisitor::visit): Visit loop label
+ only if it exists.
+
+2025-04-08 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * hir/rust-ast-lower.cc (ASTLoweringBlock::visit): Lower label only if
+ it exists.
+ * hir/tree/rust-hir-expr.cc (BlockExpr::BlockExpr): Make loop label
+ optional.
+ (BaseLoopExpr::BaseLoopExpr): Likewise.
+ (LoopExpr::LoopExpr): Likewise.
+ (WhileLoopExpr::WhileLoopExpr): Likewise.
+ * hir/tree/rust-hir-expr.h: Use optional for lifetime and labels.
+ * hir/tree/rust-hir.cc (WhileLoopExpr::as_string): Use getter.
+ (WhileLetLoopExpr::as_string): Likewise.
+ (LoopExpr::as_string): Likewise.
+ * resolve/rust-late-name-resolver-2.0.cc (Late::visit): Resolve labels.
+ * resolve/rust-late-name-resolver-2.0.h: Add visit function prototype
+ for loop labels.
+
+2025-04-08 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * util/expected.h: Use gcc_unreachable within gcc context.
+
+2025-04-08 Sri Ganesh Thota <sriganeshthota12345@gmail.com>
+
+ * resolve/rust-ast-resolve-base.h (redefined_error): created a function for
+ rust_error_at for redefined at multiple times.
+ * resolve/rust-ast-resolve-implitem.h: changed rust_error_at to redefined_error.
+ * resolve/rust-ast-resolve-stmt.cc (ResolveStmt::visit): changed rust_error_at to
+ redefined_error.
+ * resolve/rust-ast-resolve-stmt.h: changed rust_error_at to redefined_error.
+ * resolve/rust-ast-resolve-toplevel.h: changed rust_error_at to redefined_error.
+
+2025-04-08 Owen Avery <powerboat9.gamer@gmail.com>
+
+ * ast/rust-ast-visitor.cc
+ (DefaultASTVisitor::visit): Remove explicit visitation of a
+ function's self parameter, as if it exists it'll be visited as
+ one of the function parameters.
+
+2025-04-08 Philip Herron <herron.philip@googlemail.com>
+
+ * typecheck/rust-typecheck-context.cc (TypeCheckContext::lookup_lifetime): emit error
+
+2025-04-08 Arthur Cohen <arthur.cohen@embecosm.com>
+
+ * ast/rust-ast.cc (Function::Function): Rename is_default -> has_default.
+ (Function::operator=): Likewise.
+ * ast/rust-item.h (class Function): Add `is_default` method.
+ * hir/rust-ast-lower-implitem.cc (ASTLowerImplItem::visit): Lower default qualifier.
+ * hir/rust-ast-lower-item.cc (ASTLoweringItem::visit): Likewise.
+ * hir/tree/rust-hir-item.cc (Function::Function): Add `is_default` member.
+ (Function::operator=): Likewise.
+ * hir/tree/rust-hir-item.h (enum class Defaultness): New enum.
+ (class Function): Use it.
+
+2025-04-08 Arthur Cohen <arthur.cohen@embecosm.com>
+
+ * checks/errors/rust-feature.cc (Feature::create): Handle `#![feature(min_specialization)]`.
+ * checks/errors/rust-feature.h: Likewise.
+
+2025-04-08 Philip Herron <herron.philip@googlemail.com>
+
+ * resolve/rust-ast-resolve-type.cc (ResolveRelativeTypePath::go): fix error msg
+ * typecheck/rust-substitution-mapper.cc (SubstMapper::Resolve): add validation
+ (SubstMapper::valid_type): new check
+ (SubstMapper::visit): check if can resolve
+ * typecheck/rust-substitution-mapper.h: new prototype
+
+2025-04-08 Philip Herron <herron.philip@googlemail.com>
+
+ * backend/rust-compile-base.cc (HIRCompileBase::address_expression): allow optional type
+ * backend/rust-compile-base.h: update prototype
+ * backend/rust-compile-expr.cc (CompileExpr::visit): update borrow expr
+ * backend/rust-compile-extern.h: remove unused debug
+ * backend/rust-compile-resolve-path.cc (HIRCompileBase::query_compile): update usage
+ * hir/rust-ast-lower-expr.cc (ASTLoweringExpr::visit): lower raw ref
+ * hir/tree/rust-hir-expr.cc (BorrowExpr::BorrowExpr): add flag for raw ref
+ * hir/tree/rust-hir-expr.h (class BorrowExpr): add new raw ref field
+ * typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): add handle for raw ref
+
+2025-04-08 Philip Herron <herron.philip@googlemail.com>
+
+ * typecheck/rust-hir-type-check-pattern.cc (TypeCheckPattern::visit): emit error
+
+2025-04-08 Philip Herron <herron.philip@googlemail.com>
+
+ * typecheck/rust-hir-trait-resolve.cc (TraitResolver::resolve_trait): new argument
+ * typecheck/rust-hir-type-check-base.cc (TypeCheckBase::TypeCheckBase): new helper
+ * typecheck/rust-hir-type-check-base.h: new helper prototype
+ * typecheck/rust-hir-type-check-implitem.cc (TypeCheckTopLevelExternItem::visit):
+ remove comment out code
+ * typecheck/rust-hir-type-check-path.cc (TypeCheckExpr::resolve_root_path): check for null
+ * typecheck/rust-hir-type-check-type.cc (TypeCheckType::resolve_root_path): likewise
+ (TypeResolveGenericParam::Resolve): new args
+ (TypeResolveGenericParam::ApplyAnyTraitBounds): new helper
+ (TypeResolveGenericParam::apply_trait_bounds): new field
+ (TypeResolveGenericParam::visit): update
+ * typecheck/rust-hir-type-check-type.h: new args
+ * typecheck/rust-hir-type-check.cc (TraitItemReference::get_type_from_fn): reuse helper
+ * typecheck/rust-type-util.cc (query_type): check for recursive query
+ * typecheck/rust-tyty-subst.cc (SubstitutionParamMapping::SubstitutionParamMapping):
+ remove const
+ (SubstitutionParamMapping::get_generic_param): likewise
+ * typecheck/rust-tyty-subst.h: likewise
+ * typecheck/rust-tyty-variance-analysis.cc (GenericTyVisitorCtx::process_type): likewise
+
+2025-04-08 Philip Herron <herron.philip@googlemail.com>
+
+ * backend/rust-compile-base.cc: new flag is_root_item
+ * backend/rust-compile-base.h: update prototype
+ * backend/rust-compile-implitem.cc (CompileTraitItem::visit): update call
+ * backend/rust-compile-implitem.h: remove old debug internal error
+ * backend/rust-compile-item.cc (CompileItem::visit): update call
+ * backend/rust-compile-item.h: remove old debug
+ * backend/rust-compile-resolve-path.cc (HIRCompileBase::query_compile): update calls
+ * backend/rust-compile.cc: likewise
+ * typecheck/rust-hir-trait-resolve.cc (TraitResolver::resolve_path_to_trait):
+ remove assertion and error
+
+2025-04-08 Philip Herron <herron.philip@googlemail.com>
+
+ * typecheck/rust-hir-type-check-base.cc: remove assertion
+
+2025-04-08 Philip Herron <herron.philip@googlemail.com>
+
+ * rust-gcc.cc (arithmetic_or_logical_expression): unwrap const decls
+
+2025-04-08 Owen Avery <powerboat9.gamer@gmail.com>
+
+ * resolve/rust-forever-stack.h
+ (ForeverStack::ForeverStack): Initialize extern_prelude.
+ (ForeverStack::resolve_path): Add parameter
+ has_opening_scope_resolution.
+ (ForeverStack::extern_prelude): Add field.
+ * resolve/rust-forever-stack.hxx: Include rust-edition.h.
+ (ForeverStacl::resolve_path): Handle global paths (paths with an
+ opening scope resolution operator).
+ * resolve/rust-late-name-resolver-2.0.cc
+ (Late::visit): Handle global paths.
+ * resolve/rust-name-resolution-context.h
+ (NameResolutionContext::resolve_path): Handle global paths.
+
+2025-04-08 Ryutaro Okada <1015ryu88@gmail.com>
+
+ * backend/rust-compile-resolve-path.cc: Evaluate the enum's discriminant in a const context
+
2025-03-31 Philip Herron <herron.philip@googlemail.com>
* typecheck/rust-hir-type-check-type.cc (TypeCheckType::resolve_root_path):
diff --git a/gcc/rust/ast/rust-ast-builder.cc b/gcc/rust/ast/rust-ast-builder.cc
index cdc6eec..08c52b1 100644
--- a/gcc/rust/ast/rust-ast-builder.cc
+++ b/gcc/rust/ast/rust-ast-builder.cc
@@ -137,7 +137,7 @@ Builder::tuple (std::vector<std::unique_ptr<Expr>> &&values) const
std::unique_ptr<Param>
Builder::self_ref_param (bool mutability) const
{
- return std::make_unique<SelfParam> (Lifetime::error (), mutability, loc);
+ return std::make_unique<SelfParam> (tl::nullopt, mutability, loc);
}
std::unique_ptr<Param>
@@ -335,9 +335,9 @@ std::unique_ptr<BlockExpr>
Builder::block (std::vector<std::unique_ptr<Stmt>> &&stmts,
std::unique_ptr<Expr> &&tail_expr) const
{
- return std::unique_ptr<BlockExpr> (
- new BlockExpr (std::move (stmts), std::move (tail_expr), {}, {},
- LoopLabel::error (), loc, loc));
+ return std::unique_ptr<BlockExpr> (new BlockExpr (std::move (stmts),
+ std::move (tail_expr), {},
+ {}, tl::nullopt, loc, loc));
}
std::unique_ptr<Expr>
diff --git a/gcc/rust/ast/rust-ast-collector.cc b/gcc/rust/ast/rust-ast-collector.cc
index 3297407..8ee6375 100644
--- a/gcc/rust/ast/rust-ast-collector.cc
+++ b/gcc/rust/ast/rust-ast-collector.cc
@@ -1279,7 +1279,7 @@ TokenCollector::visit (ContinueExpr &expr)
{
push (Rust::Token::make (CONTINUE, expr.get_locus ()));
if (expr.has_label ())
- visit (expr.get_label ());
+ visit (expr.get_label_unchecked ());
}
void
@@ -1287,7 +1287,7 @@ TokenCollector::visit (BreakExpr &expr)
{
push (Rust::Token::make (BREAK, expr.get_locus ()));
if (expr.has_label ())
- visit (expr.get_label ());
+ visit (expr.get_label_unchecked ());
if (expr.has_break_expr ())
visit (expr.get_break_expr ());
}
diff --git a/gcc/rust/ast/rust-ast-visitor.cc b/gcc/rust/ast/rust-ast-visitor.cc
index ba5f87b..9d524c3 100644
--- a/gcc/rust/ast/rust-ast-visitor.cc
+++ b/gcc/rust/ast/rust-ast-visitor.cc
@@ -477,7 +477,8 @@ void
DefaultASTVisitor::visit (AST::ContinueExpr &expr)
{
visit_outer_attrs (expr);
- visit (expr.get_label ());
+ if (expr.has_label ())
+ visit (expr.get_label_unchecked ());
}
void
@@ -485,7 +486,7 @@ DefaultASTVisitor::visit (AST::BreakExpr &expr)
{
visit_outer_attrs (expr);
if (expr.has_label ())
- visit (expr.get_label ());
+ visit (expr.get_label_unchecked ());
if (expr.has_break_expr ())
visit (expr.get_break_expr ());
@@ -559,7 +560,8 @@ void
DefaultASTVisitor::visit (AST::LoopExpr &expr)
{
visit_outer_attrs (expr);
- visit (expr.get_loop_label ());
+ if (expr.has_loop_label ())
+ visit (expr.get_loop_label ());
visit (expr.get_loop_block ());
}
@@ -567,8 +569,9 @@ void
DefaultASTVisitor::visit (AST::WhileLoopExpr &expr)
{
visit_outer_attrs (expr);
+ if (expr.has_loop_label ())
+ visit (expr.get_loop_label ());
visit (expr.get_predicate_expr ());
- visit (expr.get_loop_label ());
visit (expr.get_loop_block ());
}
@@ -589,7 +592,8 @@ DefaultASTVisitor::visit (AST::ForLoopExpr &expr)
visit_outer_attrs (expr);
visit (expr.get_pattern ());
visit (expr.get_iterator_expr ());
- visit (expr.get_loop_label ());
+ if (expr.has_loop_label ())
+ visit (expr.get_loop_label ());
visit (expr.get_loop_block ());
}
@@ -824,8 +828,6 @@ DefaultASTVisitor::visit (AST::Function &function)
visit (function.get_qualifiers ());
for (auto &generic : function.get_generic_params ())
visit (generic);
- if (function.has_self_param ())
- visit (function.get_self_param ());
for (auto &param : function.get_function_params ())
visit (param);
if (function.has_return_type ())
diff --git a/gcc/rust/ast/rust-ast.cc b/gcc/rust/ast/rust-ast.cc
index ab82303..06e0e7b 100644
--- a/gcc/rust/ast/rust-ast.cc
+++ b/gcc/rust/ast/rust-ast.cc
@@ -1068,7 +1068,7 @@ Function::Function (Function const &other)
: VisItem (other), ExternalItem (other.get_node_id ()),
qualifiers (other.qualifiers), function_name (other.function_name),
where_clause (other.where_clause), locus (other.locus),
- is_default (other.is_default),
+ has_default (other.has_default),
is_external_function (other.is_external_function)
{
// guard to prevent null dereference (always required)
@@ -1100,7 +1100,7 @@ Function::operator= (Function const &other)
// visibility = other.visibility->clone_visibility();
// outer_attrs = other.outer_attrs;
locus = other.locus;
- is_default = other.is_default;
+ has_default = other.has_default;
is_external_function = other.is_external_function;
// guard to prevent null dereference (always required)
@@ -1631,7 +1631,7 @@ ContinueExpr::as_string () const
std::string str ("continue ");
if (has_label ())
- str += label.as_string ();
+ str += get_label_unchecked ().as_string ();
return str;
}
@@ -2095,7 +2095,7 @@ WhileLoopExpr::as_string () const
if (!has_loop_label ())
str += "none";
else
- str += loop_label.as_string ();
+ str += get_loop_label ().as_string ();
str += "\n Conditional expr: " + condition->as_string ();
@@ -2115,7 +2115,7 @@ WhileLetLoopExpr::as_string () const
if (!has_loop_label ())
str += "none";
else
- str += loop_label.as_string ();
+ str += get_loop_label ().as_string ();
str += "\n Match arm patterns: ";
if (match_arm_patterns.empty ())
@@ -2146,7 +2146,7 @@ LoopExpr::as_string () const
if (!has_loop_label ())
str += "none";
else
- str += loop_label.as_string ();
+ str += get_loop_label ().as_string ();
str += "\n Loop block: " + loop_block->as_string ();
@@ -2183,7 +2183,7 @@ BreakExpr::as_string () const
std::string str ("break ");
if (has_label ())
- str += label.as_string () + " ";
+ str += get_label_unchecked ().as_string () + " ";
if (has_break_expr ())
str += break_expr->as_string ();
@@ -2485,9 +2485,6 @@ MacroMatchRepetition::as_string () const
std::string
Lifetime::as_string () const
{
- if (is_error ())
- return "error lifetime";
-
switch (lifetime_type)
{
case NAMED:
@@ -2545,7 +2542,7 @@ ForLoopExpr::as_string () const
if (!has_loop_label ())
str += "none";
else
- str += loop_label.as_string ();
+ str += get_loop_label ().as_string ();
str += "\n Pattern: " + pattern->as_string ();
@@ -2612,7 +2609,7 @@ ReferenceType::as_string () const
std::string str ("&");
if (has_lifetime ())
- str += lifetime.as_string () + " ";
+ str += get_lifetime ().as_string () + " ";
if (has_mut)
str += "mut ";
@@ -3070,7 +3067,7 @@ SelfParam::as_string () const
else if (has_lifetime ())
{
// ref and lifetime
- std::string str = "&" + lifetime.as_string () + " ";
+ std::string str = "&" + get_lifetime ().as_string () + " ";
if (is_mut)
str += "mut ";
diff --git a/gcc/rust/ast/rust-ast.h b/gcc/rust/ast/rust-ast.h
index 4d7d23d..09e0fce 100644
--- a/gcc/rust/ast/rust-ast.h
+++ b/gcc/rust/ast/rust-ast.h
@@ -657,6 +657,9 @@ public:
// Returns whether the attribute is considered an "empty" attribute.
bool is_empty () const { return attr_input == nullptr && path.is_empty (); }
+ // Returns whether the attribute has no input
+ bool empty_input () const { return !attr_input; }
+
location_t get_locus () const { return locus; }
AttrInput &get_attr_input () const { return *attr_input; }
@@ -1587,17 +1590,9 @@ public:
lifetime_name (std::move (name)), locus (locus)
{}
- // Creates an "error" lifetime.
- static Lifetime error () { return Lifetime (NAMED, ""); }
-
static Lifetime elided () { return Lifetime (WILDCARD, ""); }
// Returns true if the lifetime is in an error state.
- bool is_error () const
- {
- return lifetime_type == NAMED && lifetime_name.empty ();
- }
-
std::string as_string () const override;
void accept_vis (ASTVisitor &vis) override;
@@ -1688,15 +1683,6 @@ public:
// Returns whether the lifetime param has an outer attribute.
bool has_outer_attribute () const { return !outer_attrs.empty (); }
- // Creates an error state lifetime param.
- static LifetimeParam create_error ()
- {
- return LifetimeParam (Lifetime::error (), {}, {}, UNDEF_LOCATION);
- }
-
- // Returns whether the lifetime param is in an error state.
- bool is_error () const { return lifetime.is_error (); }
-
// Constructor
LifetimeParam (Lifetime lifetime, std::vector<Lifetime> lifetime_bounds,
AST::AttrVec outer_attrs, location_t locus)
diff --git a/gcc/rust/ast/rust-desugar-for-loops.cc b/gcc/rust/ast/rust-desugar-for-loops.cc
index 5e5cbbc..ffc3470 100644
--- a/gcc/rust/ast/rust-desugar-for-loops.cc
+++ b/gcc/rust/ast/rust-desugar-for-loops.cc
@@ -59,8 +59,8 @@ DesugarForLoops::DesugarCtx::make_break_arm ()
auto arm = make_match_arm (std::unique_ptr<Pattern> (new PathInExpression (
builder.path_in_expression (LangItem::Kind::OPTION_NONE))));
- auto break_expr = std::unique_ptr<Expr> (
- new BreakExpr (Lifetime::error (), nullptr, {}, loc));
+ auto break_expr
+ = std::unique_ptr<Expr> (new BreakExpr (tl::nullopt, nullptr, {}, loc));
return MatchCase (std::move (arm), std::move (break_expr));
}
diff --git a/gcc/rust/ast/rust-expr.h b/gcc/rust/ast/rust-expr.h
index cff09fe..84cdfdb 100644
--- a/gcc/rust/ast/rust-expr.h
+++ b/gcc/rust/ast/rust-expr.h
@@ -31,11 +31,6 @@ public:
{}
// Returns whether the LoopLabel is in an error state.
- bool is_error () const { return label.is_error (); }
-
- // Creates an error state LoopLabel.
- static LoopLabel error () { return LoopLabel (Lifetime::error ()); }
-
location_t get_locus () const { return locus; }
Lifetime &get_lifetime () { return label; }
@@ -2590,7 +2585,7 @@ class BlockExpr : public ExprWithBlock
std::vector<Attribute> inner_attrs;
std::vector<std::unique_ptr<Stmt> > statements;
std::unique_ptr<Expr> expr;
- LoopLabel label;
+ tl::optional<LoopLabel> label;
location_t start_locus;
location_t end_locus;
bool marked_for_strip = false;
@@ -2607,8 +2602,9 @@ public:
BlockExpr (std::vector<std::unique_ptr<Stmt> > block_statements,
std::unique_ptr<Expr> block_expr,
std::vector<Attribute> inner_attribs,
- std::vector<Attribute> outer_attribs, LoopLabel label,
- location_t start_locus, location_t end_locus)
+ std::vector<Attribute> outer_attribs,
+ tl::optional<LoopLabel> label, location_t start_locus,
+ location_t end_locus)
: outer_attrs (std::move (outer_attribs)),
inner_attrs (std::move (inner_attribs)),
statements (std::move (block_statements)), expr (std::move (block_expr)),
@@ -2727,8 +2723,8 @@ public:
outer_attrs = std::move (new_attrs);
}
- bool has_label () { return !label.is_error (); }
- LoopLabel &get_label () { return label; }
+ bool has_label () { return label.has_value (); }
+ LoopLabel &get_label () { return label.value (); }
Expr::Kind get_expr_kind () const override { return Expr::Kind::Block; }
@@ -2848,7 +2844,7 @@ protected:
class ContinueExpr : public ExprWithoutBlock
{
std::vector<Attribute> outer_attrs;
- Lifetime label;
+ tl::optional<Lifetime> label;
location_t locus;
// TODO: find another way to store this to save memory?
@@ -2858,11 +2854,11 @@ public:
std::string as_string () const override;
// Returns true if the continue expr has a label.
- bool has_label () const { return !label.is_error (); }
+ bool has_label () const { return label.has_value (); }
// Constructor for a ContinueExpr with a label.
- ContinueExpr (Lifetime label, std::vector<Attribute> outer_attribs,
- location_t locus)
+ ContinueExpr (tl::optional<Lifetime> label,
+ std::vector<Attribute> outer_attribs, location_t locus)
: outer_attrs (std::move (outer_attribs)), label (std::move (label)),
locus (locus)
{}
@@ -2883,7 +2879,11 @@ public:
outer_attrs = std::move (new_attrs);
}
- Lifetime &get_label () { return label; }
+ Lifetime &get_label_unchecked () { return label.value (); }
+ const Lifetime &get_label_unchecked () const { return label.value (); }
+
+ tl::optional<Lifetime> &get_label () { return label; }
+ const tl::optional<Lifetime> &get_label () const { return label; }
Expr::Kind get_expr_kind () const override { return Expr::Kind::Continue; }
@@ -2901,7 +2901,7 @@ protected:
class BreakExpr : public ExprWithoutBlock
{
std::vector<Attribute> outer_attrs;
- LoopLabel label;
+ tl::optional<LoopLabel> label;
std::unique_ptr<Expr> break_expr;
location_t locus;
@@ -2912,14 +2912,15 @@ public:
std::string as_string () const override;
// Returns whether the break expression has a label or not.
- bool has_label () const { return !label.is_error (); }
+ bool has_label () const { return label.has_value (); }
/* Returns whether the break expression has an expression used in the break or
* not. */
bool has_break_expr () const { return break_expr != nullptr; }
// Constructor for a break expression
- BreakExpr (LoopLabel break_label, std::unique_ptr<Expr> expr_in_break,
+ BreakExpr (tl::optional<LoopLabel> break_label,
+ std::unique_ptr<Expr> expr_in_break,
std::vector<Attribute> outer_attribs, location_t locus)
: outer_attrs (std::move (outer_attribs)), label (std::move (break_label)),
break_expr (std::move (expr_in_break)), locus (locus)
@@ -2981,7 +2982,11 @@ public:
outer_attrs = std::move (new_attrs);
}
- LoopLabel &get_label () { return label; }
+ LoopLabel &get_label_unchecked () { return label.value (); }
+ const LoopLabel &get_label_unchecked () const { return label.value (); }
+
+ tl::optional<LoopLabel> &get_label () { return label; }
+ const tl::optional<LoopLabel> &get_label () const { return label; }
Expr::Kind get_expr_kind () const override { return Expr::Kind::Break; }
@@ -3657,7 +3662,7 @@ class BaseLoopExpr : public ExprWithBlock
protected:
// protected to allow subclasses better use of them
std::vector<Attribute> outer_attrs;
- LoopLabel loop_label;
+ tl::optional<LoopLabel> loop_label;
std::unique_ptr<BlockExpr> loop_block;
private:
@@ -3666,7 +3671,7 @@ private:
protected:
// Constructor for BaseLoopExpr
BaseLoopExpr (std::unique_ptr<BlockExpr> loop_block, location_t locus,
- LoopLabel loop_label = LoopLabel::error (),
+ tl::optional<LoopLabel> loop_label = tl::nullopt,
std::vector<Attribute> outer_attribs
= std::vector<Attribute> ())
: outer_attrs (std::move (outer_attribs)),
@@ -3706,9 +3711,10 @@ protected:
BaseLoopExpr &operator= (BaseLoopExpr &&other) = default;
public:
- bool has_loop_label () const { return !loop_label.is_error (); }
+ bool has_loop_label () const { return loop_label.has_value (); }
- LoopLabel &get_loop_label () { return loop_label; }
+ LoopLabel &get_loop_label () { return loop_label.value (); }
+ const LoopLabel &get_loop_label () const { return loop_label.value (); }
location_t get_locus () const override final { return locus; }
@@ -3752,7 +3758,7 @@ public:
// Constructor for LoopExpr
LoopExpr (std::unique_ptr<BlockExpr> loop_block, location_t locus,
- LoopLabel loop_label = LoopLabel::error (),
+ tl::optional<LoopLabel> loop_label = tl::nullopt,
std::vector<Attribute> outer_attribs = std::vector<Attribute> ())
: BaseLoopExpr (std::move (loop_block), locus, std::move (loop_label),
std::move (outer_attribs))
@@ -3785,7 +3791,7 @@ public:
// Constructor for while loop with loop label
WhileLoopExpr (std::unique_ptr<Expr> loop_condition,
std::unique_ptr<BlockExpr> loop_block, location_t locus,
- LoopLabel loop_label = LoopLabel::error (),
+ tl::optional<LoopLabel> loop_label = tl::nullopt,
std::vector<Attribute> outer_attribs
= std::vector<Attribute> ())
: BaseLoopExpr (std::move (loop_block), locus, std::move (loop_label),
@@ -3851,7 +3857,7 @@ public:
WhileLetLoopExpr (std::vector<std::unique_ptr<Pattern> > match_arm_patterns,
std::unique_ptr<Expr> scrutinee,
std::unique_ptr<BlockExpr> loop_block, location_t locus,
- LoopLabel loop_label = LoopLabel::error (),
+ tl::optional<LoopLabel> loop_label = tl::nullopt,
std::vector<Attribute> outer_attribs
= std::vector<Attribute> ())
: BaseLoopExpr (std::move (loop_block), locus, std::move (loop_label),
@@ -3938,7 +3944,7 @@ public:
ForLoopExpr (std::unique_ptr<Pattern> loop_pattern,
std::unique_ptr<Expr> iterator_expr,
std::unique_ptr<BlockExpr> loop_body, location_t locus,
- LoopLabel loop_label = LoopLabel::error (),
+ tl::optional<LoopLabel> loop_label = tl::nullopt,
std::vector<Attribute> outer_attribs = std::vector<Attribute> ())
: BaseLoopExpr (std::move (loop_body), locus, std::move (loop_label),
std::move (outer_attribs)),
diff --git a/gcc/rust/ast/rust-item.h b/gcc/rust/ast/rust-item.h
index 8eb0cc5..062f85d 100644
--- a/gcc/rust/ast/rust-item.h
+++ b/gcc/rust/ast/rust-item.h
@@ -434,13 +434,14 @@ class SelfParam : public Param
bool has_ref;
bool is_mut;
// bool has_lifetime; // only possible if also ref
- Lifetime lifetime;
+ tl::optional<Lifetime> lifetime;
// bool has_type; // only possible if not ref
std::unique_ptr<Type> type;
// Unrestricted constructor used for error state
- SelfParam (Lifetime lifetime, bool has_ref, bool is_mut, Type *type)
+ SelfParam (tl::optional<Lifetime> lifetime, bool has_ref, bool is_mut,
+ Type *type)
: Param ({}, UNDEF_LOCATION), has_ref (has_ref), is_mut (is_mut),
lifetime (std::move (lifetime)), type (type)
{}
@@ -453,7 +454,7 @@ public:
bool has_type () const { return type != nullptr; }
// Returns whether the self-param has a valid lifetime.
- bool has_lifetime () const { return !lifetime.is_error (); }
+ bool has_lifetime () const { return lifetime.has_value (); }
// Returns whether the self-param is in an error state.
bool is_error () const
@@ -472,11 +473,11 @@ public:
// Type-based self parameter (not ref, no lifetime)
SelfParam (std::unique_ptr<Type> type, bool is_mut, location_t locus)
: Param ({}, locus), has_ref (false), is_mut (is_mut),
- lifetime (Lifetime::error ()), type (std::move (type))
+ lifetime (tl::nullopt), type (std::move (type))
{}
// Lifetime-based self parameter (is ref, no type)
- SelfParam (Lifetime lifetime, bool is_mut, location_t locus)
+ SelfParam (tl::optional<Lifetime> lifetime, bool is_mut, location_t locus)
: Param ({}, locus), has_ref (true), is_mut (is_mut),
lifetime (std::move (lifetime))
{}
@@ -522,8 +523,8 @@ public:
bool get_has_ref () const { return has_ref; };
bool get_is_mut () const { return is_mut; }
- Lifetime get_lifetime () const { return lifetime; }
- Lifetime &get_lifetime () { return lifetime; }
+ Lifetime get_lifetime () const { return lifetime.value (); }
+ Lifetime &get_lifetime () { return lifetime.value (); }
NodeId get_node_id () const { return node_id; }
@@ -1330,7 +1331,7 @@ class Function : public VisItem, public AssociatedItem, public ExternalItem
WhereClause where_clause;
tl::optional<std::unique_ptr<BlockExpr>> function_body;
location_t locus;
- bool is_default;
+ bool has_default;
bool is_external_function;
public:
@@ -1355,6 +1356,8 @@ public:
bool has_body () const { return function_body.has_value (); }
+ bool is_default () const { return has_default; }
+
// Mega-constructor with all possible fields
Function (Identifier function_name, FunctionQualifiers qualifiers,
std::vector<std::unique_ptr<GenericParam>> generic_params,
@@ -1362,7 +1365,7 @@ public:
std::unique_ptr<Type> return_type, WhereClause where_clause,
tl::optional<std::unique_ptr<BlockExpr>> function_body,
Visibility vis, std::vector<Attribute> outer_attrs,
- location_t locus, bool is_default = false,
+ location_t locus, bool has_default = false,
bool is_external_function = false)
: VisItem (std::move (vis), std::move (outer_attrs)),
ExternalItem (Stmt::node_id), qualifiers (std::move (qualifiers)),
@@ -1372,7 +1375,7 @@ public:
return_type (std::move (return_type)),
where_clause (std::move (where_clause)),
function_body (std::move (function_body)), locus (locus),
- is_default (is_default), is_external_function (is_external_function)
+ has_default (has_default), is_external_function (is_external_function)
{}
// TODO: add constructor with less fields
diff --git a/gcc/rust/ast/rust-type.h b/gcc/rust/ast/rust-type.h
index 20e0232..1bb521d 100644
--- a/gcc/rust/ast/rust-type.h
+++ b/gcc/rust/ast/rust-type.h
@@ -542,7 +542,7 @@ protected:
class ReferenceType : public TypeNoBounds
{
// bool has_lifetime; // TODO: handle in lifetime or something?
- Lifetime lifetime;
+ tl::optional<Lifetime> lifetime;
bool has_mut;
std::unique_ptr<TypeNoBounds> type;
@@ -553,11 +553,12 @@ public:
bool is_mut () const { return has_mut; }
// Returns whether the reference has a lifetime.
- bool has_lifetime () const { return !lifetime.is_error (); }
+ bool has_lifetime () const { return lifetime.has_value (); }
// Constructor
ReferenceType (bool is_mut, std::unique_ptr<TypeNoBounds> type_no_bounds,
- location_t locus, Lifetime lifetime = Lifetime::elided ())
+ location_t locus,
+ tl::optional<Lifetime> lifetime = Lifetime::elided ())
: lifetime (std::move (lifetime)), has_mut (is_mut),
type (std::move (type_no_bounds)), locus (locus)
{}
@@ -598,7 +599,8 @@ public:
bool get_has_mut () const { return has_mut; }
- Lifetime &get_lifetime () { return lifetime; }
+ Lifetime &get_lifetime () { return lifetime.value (); }
+ const Lifetime &get_lifetime () const { return lifetime.value (); }
TypeNoBounds &get_base_type () { return *type; }
diff --git a/gcc/rust/backend/rust-compile-base.cc b/gcc/rust/backend/rust-compile-base.cc
index fdbca7f..12b9561 100644
--- a/gcc/rust/backend/rust-compile-base.cc
+++ b/gcc/rust/backend/rust-compile-base.cc
@@ -549,7 +549,7 @@ HIRCompileBase::mark_addressable (tree exp, location_t locus)
}
tree
-HIRCompileBase::address_expression (tree expr, location_t location)
+HIRCompileBase::address_expression (tree expr, location_t location, tree ptrty)
{
if (expr == error_mark_node)
return error_mark_node;
@@ -557,7 +557,10 @@ HIRCompileBase::address_expression (tree expr, location_t location)
if (!mark_addressable (expr, location))
return error_mark_node;
- return build_fold_addr_expr_loc (location, expr);
+ if (ptrty == NULL || ptrty == error_mark_node)
+ ptrty = build_pointer_type (TREE_TYPE (expr));
+
+ return build_fold_addr_expr_with_type_loc (location, expr, ptrty);
}
tree
@@ -663,7 +666,8 @@ get_abi (const AST::AttrVec &outer_attrs,
tree
HIRCompileBase::compile_function (
- const std::string &fn_name, HIR::SelfParam &self_param,
+ bool is_root_item, const std::string &fn_name,
+ tl::optional<HIR::SelfParam> &self_param,
std::vector<HIR::FunctionParam> &function_params,
const HIR::FunctionQualifiers &qualifiers, HIR::Visibility &visibility,
AST::AttrVec &outer_attrs, location_t locus, HIR::BlockExpr *function_body,
@@ -674,7 +678,7 @@ HIRCompileBase::compile_function (
= canonical_path.get () + fntype->subst_as_string ();
// we don't mangle the main fn since we haven't implemented the main shim
- bool is_main_fn = fn_name.compare ("main") == 0;
+ bool is_main_fn = fn_name.compare ("main") == 0 && is_root_item;
if (is_main_fn)
{
rust_assert (!main_identifier_node);
@@ -710,24 +714,24 @@ HIRCompileBase::compile_function (
// setup the params
TyTy::BaseType *tyret = fntype->get_return_type ();
std::vector<Bvariable *> param_vars;
- if (!self_param.is_error ())
+ if (self_param)
{
rust_assert (fntype->is_method ());
TyTy::BaseType *self_tyty_lookup = fntype->get_self_type ();
tree self_type = TyTyResolveCompile::compile (ctx, self_tyty_lookup);
Bvariable *compiled_self_param
- = CompileSelfParam::compile (ctx, fndecl, self_param, self_type,
- self_param.get_locus ());
+ = CompileSelfParam::compile (ctx, fndecl, self_param.value (),
+ self_type, self_param->get_locus ());
param_vars.push_back (compiled_self_param);
- ctx->insert_var_decl (self_param.get_mappings ().get_hirid (),
+ ctx->insert_var_decl (self_param->get_mappings ().get_hirid (),
compiled_self_param);
}
// offset from + 1 for the TyTy::FnType being used when this is a method to
// skip over Self on the FnType
- bool is_method = !self_param.is_error ();
+ bool is_method = self_param.has_value ();
size_t i = is_method ? 1 : 0;
for (auto &referenced_param : function_params)
{
diff --git a/gcc/rust/backend/rust-compile-base.h b/gcc/rust/backend/rust-compile-base.h
index 4b4f8b0..6814abc 100644
--- a/gcc/rust/backend/rust-compile-base.h
+++ b/gcc/rust/backend/rust-compile-base.h
@@ -29,7 +29,8 @@ class HIRCompileBase
public:
virtual ~HIRCompileBase () {}
- static tree address_expression (tree expr, location_t locus);
+ static tree address_expression (tree expr, location_t locus,
+ tree ptrty = NULL_TREE);
static tree compile_constant_expr (
Context *ctx, HirId coercion_id, TyTy::BaseType *resolved_type,
@@ -102,7 +103,8 @@ protected:
HIR::Expr &const_value_expr, location_t locus,
location_t expr_locus);
- tree compile_function (const std::string &fn_name, HIR::SelfParam &self_param,
+ tree compile_function (bool is_root_item, const std::string &fn_name,
+ tl::optional<HIR::SelfParam> &self_param,
std::vector<HIR::FunctionParam> &function_params,
const HIR::FunctionQualifiers &qualifiers,
HIR::Visibility &visibility, AST::AttrVec &outer_attrs,
diff --git a/gcc/rust/backend/rust-compile-expr.cc b/gcc/rust/backend/rust-compile-expr.cc
index e4ab9f0..37856a7 100644
--- a/gcc/rust/backend/rust-compile-expr.cc
+++ b/gcc/rust/backend/rust-compile-expr.cc
@@ -905,7 +905,8 @@ CompileExpr::visit (HIR::BorrowExpr &expr)
&tyty))
return;
- translated = address_expression (main_expr, expr.get_locus ());
+ tree expected_type = TyTyResolveCompile::compile (ctx, tyty);
+ translated = address_expression (main_expr, expr.get_locus (), expected_type);
}
void
diff --git a/gcc/rust/backend/rust-compile-extern.h b/gcc/rust/backend/rust-compile-extern.h
index bacd1c0..d6aa589 100644
--- a/gcc/rust/backend/rust-compile-extern.h
+++ b/gcc/rust/backend/rust-compile-extern.h
@@ -34,16 +34,10 @@ class CompileExternItem : public HIRCompileBase,
public:
static tree compile (HIR::ExternalItem *item, Context *ctx,
TyTy::BaseType *concrete = nullptr,
- bool is_query_mode = false,
location_t ref_locus = UNDEF_LOCATION)
{
CompileExternItem compiler (ctx, concrete, ref_locus);
item->accept_vis (compiler);
-
- if (is_query_mode && compiler.reference == error_mark_node)
- rust_internal_error_at (ref_locus, "failed to compile extern item: %s",
- item->as_string ().c_str ());
-
return compiler.reference;
}
diff --git a/gcc/rust/backend/rust-compile-implitem.cc b/gcc/rust/backend/rust-compile-implitem.cc
index 71b3e8d..1230c85 100644
--- a/gcc/rust/backend/rust-compile-implitem.cc
+++ b/gcc/rust/backend/rust-compile-implitem.cc
@@ -117,7 +117,7 @@ CompileTraitItem::visit (HIR::TraitItemFunc &func)
auto vis = HIR::Visibility (HIR::Visibility::VisType::PUBLIC);
HIR::TraitFunctionDecl &function = func.get_decl ();
tree fndecl
- = compile_function (function.get_function_name ().as_string (),
+ = compile_function (false, function.get_function_name ().as_string (),
function.get_self (), function.get_function_params (),
function.get_qualifiers (), vis,
func.get_outer_attrs (), func.get_locus (),
diff --git a/gcc/rust/backend/rust-compile-implitem.h b/gcc/rust/backend/rust-compile-implitem.h
index d2ef989..2d18dbf 100644
--- a/gcc/rust/backend/rust-compile-implitem.h
+++ b/gcc/rust/backend/rust-compile-implitem.h
@@ -30,16 +30,10 @@ class CompileInherentImplItem : public CompileItem
public:
static tree Compile (HIR::ImplItem *item, Context *ctx,
TyTy::BaseType *concrete = nullptr,
- bool is_query_mode = false,
location_t ref_locus = UNDEF_LOCATION)
{
CompileInherentImplItem compiler (ctx, concrete, ref_locus);
item->accept_vis (compiler);
-
- if (is_query_mode && compiler.reference == error_mark_node)
- rust_internal_error_at (ref_locus, "failed to compile impl item: %s",
- item->as_string ().c_str ());
-
return compiler.reference;
}
diff --git a/gcc/rust/backend/rust-compile-item.cc b/gcc/rust/backend/rust-compile-item.cc
index 7ce9848..9666990 100644
--- a/gcc/rust/backend/rust-compile-item.cc
+++ b/gcc/rust/backend/rust-compile-item.cc
@@ -252,8 +252,12 @@ CompileItem::visit (HIR::Function &function)
if (function.get_qualifiers ().is_const ())
ctx->push_const_context ();
+ auto lookup_root_item = ctx->get_mappings ().lookup_hir_item (
+ function.get_mappings ().get_hirid ());
+ bool is_root_item = lookup_root_item.has_value ();
tree fndecl
- = compile_function (function.get_function_name ().as_string (),
+ = compile_function (is_root_item,
+ function.get_function_name ().as_string (),
function.get_self_param (),
function.get_function_params (),
function.get_qualifiers (), function.get_visibility (),
diff --git a/gcc/rust/backend/rust-compile-item.h b/gcc/rust/backend/rust-compile-item.h
index eccb040..d9d946d 100644
--- a/gcc/rust/backend/rust-compile-item.h
+++ b/gcc/rust/backend/rust-compile-item.h
@@ -35,10 +35,6 @@ public:
{
CompileItem compiler (ctx, concrete, ref_locus);
item->accept_vis (compiler);
-
- if (compiler.reference == error_mark_node)
- rust_debug ("failed to compile item: %s", item->as_string ().c_str ());
-
return compiler.reference;
}
diff --git a/gcc/rust/backend/rust-compile-resolve-path.cc b/gcc/rust/backend/rust-compile-resolve-path.cc
index 115dd04..81d2dbb 100644
--- a/gcc/rust/backend/rust-compile-resolve-path.cc
+++ b/gcc/rust/backend/rust-compile-resolve-path.cc
@@ -105,7 +105,9 @@ ResolvePathRef::attempt_constructor_expression_lookup (
// make the ctor for the union
HIR::Expr &discrim_expr = variant->get_discriminant ();
+ ctx->push_const_context ();
tree discrim_expr_node = CompileExpr::Compile (discrim_expr, ctx);
+ ctx->pop_const_context ();
tree folded_discrim_expr = fold_expr (discrim_expr_node);
tree qualifier = folded_discrim_expr;
@@ -259,10 +261,10 @@ HIRCompileBase::query_compile (HirId ref, TyTy::BaseType *lookup,
HIR::ExternalItem *resolved_extern_item = hir_extern_item->first;
if (!lookup->has_substitutions_defined ())
return CompileExternItem::compile (resolved_extern_item, ctx, nullptr,
- true, expr_locus);
+ expr_locus);
else
return CompileExternItem::compile (resolved_extern_item, ctx, lookup,
- true, expr_locus);
+ expr_locus);
}
else
{
@@ -284,10 +286,10 @@ HIRCompileBase::query_compile (HirId ref, TyTy::BaseType *lookup,
{
if (!lookup->has_substitutions_defined ())
return CompileInherentImplItem::Compile (resolved_item->first, ctx,
- nullptr, true, expr_locus);
+ nullptr, expr_locus);
else
return CompileInherentImplItem::Compile (resolved_item->first, ctx,
- lookup, true, expr_locus);
+ lookup, expr_locus);
}
else if (auto trait_item
= ctx->get_mappings ().lookup_hir_trait_item (ref))
@@ -370,11 +372,10 @@ HIRCompileBase::query_compile (HirId ref, TyTy::BaseType *lookup,
if (!lookup->has_substitutions_defined ())
return CompileInherentImplItem::Compile (impl_item, ctx,
- nullptr, true,
- expr_locus);
+ nullptr, expr_locus);
else
return CompileInherentImplItem::Compile (impl_item, ctx, lookup,
- true, expr_locus);
+ expr_locus);
}
}
}
diff --git a/gcc/rust/backend/rust-compile.cc b/gcc/rust/backend/rust-compile.cc
index 7b00066..dbd8515 100644
--- a/gcc/rust/backend/rust-compile.cc
+++ b/gcc/rust/backend/rust-compile.cc
@@ -338,7 +338,7 @@ HIRCompileBase::compute_address_for_trait_item (
}
return CompileInherentImplItem::Compile (associated_function, ctx,
- lookup_fntype, true, locus);
+ lookup_fntype, locus);
}
// we can only compile trait-items with a body
diff --git a/gcc/rust/checks/errors/rust-feature-gate.cc b/gcc/rust/checks/errors/rust-feature-gate.cc
index f3daa61..44007f9 100644
--- a/gcc/rust/checks/errors/rust-feature-gate.cc
+++ b/gcc/rust/checks/errors/rust-feature-gate.cc
@@ -40,6 +40,13 @@ FeatureGate::visit (AST::Crate &crate)
{
if (attr.get_path ().as_string () == "feature")
{
+ // check for empty feature, such as `#![feature], this is an error
+ if (attr.empty_input ())
+ {
+ rust_error_at (attr.get_locus (), ErrorCode::E0556,
+ "malformed %<feature%> attribute input");
+ continue;
+ }
const auto &attr_input = attr.get_attr_input ();
auto type = attr_input.get_attr_input_type ();
if (type == AST::AttrInput::AttrInputType::TOKEN_TREE)
diff --git a/gcc/rust/checks/errors/rust-feature.cc b/gcc/rust/checks/errors/rust-feature.cc
index 25af46c..441a1b2 100644
--- a/gcc/rust/checks/errors/rust-feature.cc
+++ b/gcc/rust/checks/errors/rust-feature.cc
@@ -55,6 +55,9 @@ Feature::create (Feature::Name f)
"1.11.0", 37854);
case Feature::Name::PRELUDE_IMPORT:
return Feature (f, Feature::State::ACTIVE, "prelude_import", "1.0.0");
+ case Feature::Name::MIN_SPECIALIZATION:
+ return Feature (f, Feature::State::ACTIVE, "min_specialization",
+ "1.0.0" /* FIXME: What version here? */, 31844);
case Feature::Name::AUTO_TRAITS:
return Feature (f, Feature::State::ACTIVE, "optin_builtin_traits",
"1.0.0", 13231);
@@ -80,6 +83,7 @@ const std::map<std::string, Feature::Name> Feature::name_hash_map = {
{"raw_ref_op", Feature::Name::RAW_REF_OP},
{"exclusive_range_pattern", Feature::Name::EXCLUSIVE_RANGE_PATTERN},
{"prelude_import", Feature::Name::PRELUDE_IMPORT},
+ {"min_specialization", Feature::Name::MIN_SPECIALIZATION},
}; // namespace Rust
tl::optional<Feature::Name>
diff --git a/gcc/rust/checks/errors/rust-feature.h b/gcc/rust/checks/errors/rust-feature.h
index 9edae6d..e7cb0af 100644
--- a/gcc/rust/checks/errors/rust-feature.h
+++ b/gcc/rust/checks/errors/rust-feature.h
@@ -51,6 +51,7 @@ public:
RAW_REF_OP,
EXCLUSIVE_RANGE_PATTERN,
PRELUDE_IMPORT,
+ MIN_SPECIALIZATION,
};
const std::string &as_string () { return m_name_str; }
diff --git a/gcc/rust/expand/rust-derive-clone.cc b/gcc/rust/expand/rust-derive-clone.cc
index 074ea01..a955b58 100644
--- a/gcc/rust/expand/rust-derive-clone.cc
+++ b/gcc/rust/expand/rust-derive-clone.cc
@@ -61,11 +61,10 @@ std::unique_ptr<AssociatedItem>
DeriveClone::clone_fn (std::unique_ptr<Expr> &&clone_expr)
{
auto block = std::unique_ptr<BlockExpr> (
- new BlockExpr ({}, std::move (clone_expr), {}, {}, AST::LoopLabel::error (),
- loc, loc));
+ new BlockExpr ({}, std::move (clone_expr), {}, {}, tl::nullopt, loc, loc));
auto big_self_type = builder.single_type_path ("Self");
- std::unique_ptr<SelfParam> self (new SelfParam (Lifetime::error (),
+ std::unique_ptr<SelfParam> self (new SelfParam (tl::nullopt,
/* is_mut */ false, loc));
std::vector<std::unique_ptr<Param>> params;
diff --git a/gcc/rust/expand/rust-derive-debug.cc b/gcc/rust/expand/rust-derive-debug.cc
index 7ad3908..a0bf9d8 100644
--- a/gcc/rust/expand/rust-derive-debug.cc
+++ b/gcc/rust/expand/rust-derive-debug.cc
@@ -50,8 +50,7 @@ DeriveDebug::stub_debug_fn ()
// we can't use builder.block() here as it returns a unique_ptr<Expr> and
// Function's constructor expects a unique_ptr<BlockExpr>
auto block = std::unique_ptr<BlockExpr> (
- new BlockExpr ({}, std::move (stub_return), {}, {},
- AST::LoopLabel::error (), loc, loc));
+ new BlockExpr ({}, std::move (stub_return), {}, {}, tl::nullopt, loc, loc));
auto self = builder.self_ref_param ();
diff --git a/gcc/rust/expand/rust-derive-default.cc b/gcc/rust/expand/rust-derive-default.cc
index c54f8c3..2e8b456 100644
--- a/gcc/rust/expand/rust-derive-default.cc
+++ b/gcc/rust/expand/rust-derive-default.cc
@@ -58,8 +58,7 @@ DeriveDefault::default_fn (std::unique_ptr<Expr> &&return_expr)
= std::unique_ptr<Type> (new TypePath (builder.type_path ("Self")));
auto block = std::unique_ptr<BlockExpr> (
- new BlockExpr ({}, std::move (return_expr), {}, {},
- AST::LoopLabel::error (), loc, loc));
+ new BlockExpr ({}, std::move (return_expr), {}, {}, tl::nullopt, loc, loc));
return builder.function ("default", {}, std::move (self_ty),
std::move (block));
diff --git a/gcc/rust/expand/rust-derive-eq.cc b/gcc/rust/expand/rust-derive-eq.cc
index dc173de..5e7a894 100644
--- a/gcc/rust/expand/rust-derive-eq.cc
+++ b/gcc/rust/expand/rust-derive-eq.cc
@@ -49,8 +49,7 @@ DeriveEq::assert_receiver_is_total_eq_fn (
stmts.emplace_back (assert_type_is_eq (std::move (type)));
auto block = std::unique_ptr<BlockExpr> (
- new BlockExpr (std::move (stmts), nullptr, {}, {}, AST::LoopLabel::error (),
- loc, loc));
+ new BlockExpr (std::move (stmts), nullptr, {}, {}, tl::nullopt, loc, loc));
auto self = builder.self_ref_param ();
diff --git a/gcc/rust/hir/rust-ast-lower-base.cc b/gcc/rust/hir/rust-ast-lower-base.cc
index b0d347e..5039798 100644
--- a/gcc/rust/hir/rust-ast-lower-base.cc
+++ b/gcc/rust/hir/rust-ast-lower-base.cc
@@ -690,8 +690,12 @@ ASTLoweringBase::lower_self (AST::Param &param)
self.get_is_mut (), self.get_locus ());
}
- AST::Lifetime l = self.get_lifetime ();
- return HIR::SelfParam (mapping, lower_lifetime (l), self.get_is_mut (),
+ tl::optional<HIR::Lifetime> lifetime = tl::nullopt;
+
+ if (self.has_lifetime ())
+ lifetime = lower_lifetime (self.get_lifetime ());
+
+ return HIR::SelfParam (mapping, lifetime, self.get_is_mut (),
self.get_locus ());
}
diff --git a/gcc/rust/hir/rust-ast-lower-block.h b/gcc/rust/hir/rust-ast-lower-block.h
index a39c010..93cd443 100644
--- a/gcc/rust/hir/rust-ast-lower-block.h
+++ b/gcc/rust/hir/rust-ast-lower-block.h
@@ -195,7 +195,9 @@ public:
HIR::BlockExpr *loop_block
= ASTLoweringBlock::translate (expr.get_loop_block (), &terminated);
- HIR::LoopLabel loop_label = lower_loop_label (expr.get_loop_label ());
+ tl::optional<HIR::LoopLabel> loop_label = tl::nullopt;
+ if (expr.has_loop_label ())
+ loop_label = lower_loop_label (expr.get_loop_label ());
auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
diff --git a/gcc/rust/hir/rust-ast-lower-expr.cc b/gcc/rust/hir/rust-ast-lower-expr.cc
index 9f363c0..3784e74 100644
--- a/gcc/rust/hir/rust-ast-lower-expr.cc
+++ b/gcc/rust/hir/rust-ast-lower-expr.cc
@@ -597,8 +597,10 @@ ASTLoweringExpr::visit (AST::ForLoopExpr &expr)
void
ASTLoweringExpr::visit (AST::BreakExpr &expr)
{
- HIR::Lifetime break_label
- = lower_lifetime (expr.get_label ().get_lifetime ());
+ tl::optional<HIR::Lifetime> break_label = tl::nullopt;
+ if (expr.has_label ())
+ break_label = lower_lifetime (expr.get_label_unchecked ().get_lifetime ());
+
HIR::Expr *break_expr
= expr.has_break_expr ()
? ASTLoweringExpr::translate (expr.get_break_expr ())
@@ -618,7 +620,9 @@ ASTLoweringExpr::visit (AST::BreakExpr &expr)
void
ASTLoweringExpr::visit (AST::ContinueExpr &expr)
{
- HIR::Lifetime break_label = lower_lifetime (expr.get_label ());
+ tl::optional<HIR::Lifetime> break_label;
+ if (expr.has_label ())
+ break_label = lower_lifetime (expr.get_label_unchecked ());
auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
@@ -633,9 +637,6 @@ ASTLoweringExpr::visit (AST::ContinueExpr &expr)
void
ASTLoweringExpr::visit (AST::BorrowExpr &expr)
{
- if (expr.is_raw_borrow ())
- rust_unreachable ();
-
HIR::Expr *borrow_lvalue
= ASTLoweringExpr::translate (expr.get_borrowed_expr ());
@@ -646,8 +647,8 @@ ASTLoweringExpr::visit (AST::BorrowExpr &expr)
auto *borrow_expr
= new HIR::BorrowExpr (mapping, std::unique_ptr<HIR::Expr> (borrow_lvalue),
- expr.get_mutability (), expr.get_outer_attrs (),
- expr.get_locus ());
+ expr.get_mutability (), expr.is_raw_borrow (),
+ expr.get_outer_attrs (), expr.get_locus ());
if (expr.get_is_double_borrow ())
{
@@ -659,8 +660,8 @@ ASTLoweringExpr::visit (AST::BorrowExpr &expr)
borrow_expr
= new HIR::BorrowExpr (mapping,
std::unique_ptr<HIR::Expr> (borrow_expr),
- expr.get_mutability (), expr.get_outer_attrs (),
- expr.get_locus ());
+ expr.get_mutability (), expr.is_raw_borrow (),
+ expr.get_outer_attrs (), expr.get_locus ());
}
translated = borrow_expr;
diff --git a/gcc/rust/hir/rust-ast-lower-implitem.cc b/gcc/rust/hir/rust-ast-lower-implitem.cc
index 5380d25..d815a71 100644
--- a/gcc/rust/hir/rust-ast-lower-implitem.cc
+++ b/gcc/rust/hir/rust-ast-lower-implitem.cc
@@ -22,6 +22,7 @@
#include "rust-ast-lower-expr.h"
#include "rust-ast-lower-pattern.h"
#include "rust-ast-lower-block.h"
+#include "rust-hir-item.h"
#include "rust-item.h"
namespace Rust {
@@ -131,7 +132,7 @@ ASTLowerImplItem::visit (AST::Function &function)
Identifier function_name = function.get_function_name ();
location_t locus = function.get_locus ();
- HIR::SelfParam self_param = HIR::SelfParam::error ();
+ tl::optional<HIR::SelfParam> self_param = tl::nullopt;
if (function.has_self_param ())
self_param = lower_self (function.get_self_param ());
@@ -140,6 +141,9 @@ ASTLowerImplItem::visit (AST::Function &function)
ASTLoweringType::translate (function.get_return_type ()))
: nullptr;
+ Defaultness defaultness
+ = function.is_default () ? Defaultness::Default : Defaultness::Final;
+
std::vector<HIR::FunctionParam> function_params;
for (auto &p : function.get_function_params ())
{
@@ -183,15 +187,15 @@ ASTLowerImplItem::visit (AST::Function &function)
std::move (function_params), std::move (return_type),
std::move (where_clause), std::move (function_body),
std::move (vis), function.get_outer_attrs (),
- std::move (self_param), locus);
+ std::move (self_param), defaultness, locus);
- if (!fn->get_self_param ().is_error ())
+ if (fn->is_method ())
{
// insert mappings for self
- mappings.insert_hir_self_param (&fn->get_self_param ());
+ mappings.insert_hir_self_param (&fn->get_self_param_unchecked ());
mappings.insert_location (
- fn->get_self_param ().get_mappings ().get_hirid (),
- fn->get_self_param ().get_locus ());
+ fn->get_self_param_unchecked ().get_mappings ().get_hirid (),
+ fn->get_self_param_unchecked ().get_locus ());
}
// add the mappings for the function params at the end
@@ -245,9 +249,9 @@ ASTLowerTraitItem::visit (AST::Function &func)
// set self parameter to error if this is a method
// else lower to hir
- HIR::SelfParam self_param = func.has_self_param ()
- ? lower_self (func.get_self_param ())
- : HIR::SelfParam::error ();
+ tl::optional<HIR::SelfParam> self_param = tl::nullopt;
+ if (func.has_self_param ())
+ self_param = lower_self (func.get_self_param ());
std::vector<HIR::FunctionParam> function_params;
for (auto &p : func.get_function_params ())
@@ -299,9 +303,10 @@ ASTLowerTraitItem::visit (AST::Function &func)
if (func.has_self_param ())
{
// insert mappings for self
- mappings.insert_hir_self_param (&self_param);
- mappings.insert_location (self_param.get_mappings ().get_hirid (),
- self_param.get_locus ());
+ // TODO: Is this correct ? Looks fishy
+ mappings.insert_hir_self_param (&*self_param);
+ mappings.insert_location (self_param->get_mappings ().get_hirid (),
+ self_param->get_locus ());
}
// add the mappings for the function params at the end
diff --git a/gcc/rust/hir/rust-ast-lower-item.cc b/gcc/rust/hir/rust-ast-lower-item.cc
index 5dbcad5..f4396b5 100644
--- a/gcc/rust/hir/rust-ast-lower-item.cc
+++ b/gcc/rust/hir/rust-ast-lower-item.cc
@@ -451,13 +451,16 @@ ASTLoweringItem::visit (AST::Function &function)
mappings.insert_location (function_body->get_mappings ().get_hirid (),
function.get_locus ());
+ Defaultness defaultness
+ = function.is_default () ? Defaultness::Default : Defaultness::Final;
+
auto fn
= new HIR::Function (mapping, std::move (function_name),
std::move (qualifiers), std::move (generic_params),
std::move (function_params), std::move (return_type),
std::move (where_clause), std::move (function_body),
std::move (vis), function.get_outer_attrs (),
- HIR::SelfParam::error (), locus);
+ tl::nullopt, defaultness, locus);
// add the mappings for the function params at the end
for (auto &param : fn->get_function_params ())
diff --git a/gcc/rust/hir/rust-ast-lower.cc b/gcc/rust/hir/rust-ast-lower.cc
index ebdf981..76bd135 100644
--- a/gcc/rust/hir/rust-ast-lower.cc
+++ b/gcc/rust/hir/rust-ast-lower.cc
@@ -97,7 +97,11 @@ ASTLowering::go ()
void
ASTLoweringBlock::visit (AST::BlockExpr &expr)
{
- auto label = lower_loop_label (expr.get_label ());
+ tl::optional<HIR::LoopLabel> label;
+ if (expr.has_label ())
+ label = lower_loop_label (expr.get_label ());
+ else
+ label = tl::nullopt;
std::vector<std::unique_ptr<HIR::Stmt>> block_stmts;
bool block_did_terminate = false;
@@ -398,7 +402,10 @@ ASTLoweringExprWithBlock::visit (AST::WhileLoopExpr &expr)
HIR::BlockExpr *loop_block
= ASTLoweringBlock::translate (expr.get_loop_block (), &terminated);
- HIR::LoopLabel loop_label = lower_loop_label (expr.get_loop_label ());
+ tl::optional<HIR::LoopLabel> loop_label;
+ if (expr.has_loop_label ())
+ loop_label = lower_loop_label (expr.get_loop_label ());
+
HIR::Expr *loop_condition
= ASTLoweringExpr::translate (expr.get_predicate_expr (), &terminated);
diff --git a/gcc/rust/hir/rust-hir-dump.cc b/gcc/rust/hir/rust-hir-dump.cc
index 89fcc3d..dafa823 100644
--- a/gcc/rust/hir/rust-hir-dump.cc
+++ b/gcc/rust/hir/rust-hir-dump.cc
@@ -546,7 +546,8 @@ Dump::do_traitfunctiondecl (TraitFunctionDecl &e)
else
put_field ("where_clause", "none");
- put_field ("self", e.get_self ().as_string ());
+ if (e.is_method ())
+ put_field ("self", e.get_self_unchecked ().as_string ());
end ("TraitFunctionDecl");
}
@@ -1693,7 +1694,8 @@ Dump::visit (Function &e)
put_field ("where clause", e.get_where_clause ().as_string ());
visit_field ("function_body", e.get_definition ());
- put_field ("self", e.get_self_param ().as_string ());
+ if (e.is_method ())
+ put_field ("self", e.get_self_param_unchecked ().as_string ());
end ("Function");
}
diff --git a/gcc/rust/hir/tree/rust-hir-bound.h b/gcc/rust/hir/tree/rust-hir-bound.h
index 78bb133..8fa6a22 100644
--- a/gcc/rust/hir/tree/rust-hir-bound.h
+++ b/gcc/rust/hir/tree/rust-hir-bound.h
@@ -44,18 +44,6 @@ public:
{}
// Returns true if the lifetime is in an error state.
- bool is_error () const
- {
- return lifetime_type == AST::Lifetime::LifetimeType::NAMED
- && lifetime_name.empty ();
- }
-
- static Lifetime error ()
- {
- return Lifetime (Analysis::NodeMapping::get_error (),
- AST::Lifetime::LifetimeType::NAMED, "", UNDEF_LOCATION);
- }
-
std::string as_string () const override;
void accept_vis (HIRFullVisitor &vis) override;
diff --git a/gcc/rust/hir/tree/rust-hir-expr.cc b/gcc/rust/hir/tree/rust-hir-expr.cc
index 2ded789..266c79c 100644
--- a/gcc/rust/hir/tree/rust-hir-expr.cc
+++ b/gcc/rust/hir/tree/rust-hir-expr.cc
@@ -81,10 +81,10 @@ OperatorExpr::operator= (OperatorExpr const &other)
BorrowExpr::BorrowExpr (Analysis::NodeMapping mappings,
std::unique_ptr<Expr> borrow_lvalue, Mutability mut,
- AST::AttrVec outer_attribs, location_t locus)
+ bool raw, AST::AttrVec outer_attribs, location_t locus)
: OperatorExpr (std::move (mappings), std::move (borrow_lvalue),
std::move (outer_attribs), locus),
- mut (mut)
+ mut (mut), raw (raw)
{}
DereferenceExpr::DereferenceExpr (Analysis::NodeMapping mappings,
@@ -749,7 +749,7 @@ BlockExpr::BlockExpr (Analysis::NodeMapping mappings,
std::vector<std::unique_ptr<Stmt>> block_statements,
std::unique_ptr<Expr> block_expr, bool tail_reachable,
AST::AttrVec inner_attribs, AST::AttrVec outer_attribs,
- LoopLabel label, location_t start_locus,
+ tl::optional<LoopLabel> label, location_t start_locus,
location_t end_locus)
: ExprWithBlock (std::move (mappings), std::move (outer_attribs)),
WithInnerAttrs (std::move (inner_attribs)),
@@ -791,13 +791,15 @@ BlockExpr::operator= (BlockExpr const &other)
}
ContinueExpr::ContinueExpr (Analysis::NodeMapping mappings, location_t locus,
- Lifetime label, AST::AttrVec outer_attribs)
+ tl::optional<Lifetime> label,
+ AST::AttrVec outer_attribs)
: ExprWithoutBlock (std::move (mappings), std::move (outer_attribs)),
label (std::move (label)), locus (locus)
{}
BreakExpr::BreakExpr (Analysis::NodeMapping mappings, location_t locus,
- Lifetime break_label, std::unique_ptr<Expr> expr_in_break,
+ tl::optional<Lifetime> break_label,
+ std::unique_ptr<Expr> expr_in_break,
AST::AttrVec outer_attribs)
: ExprWithoutBlock (std::move (mappings), std::move (outer_attribs)),
label (std::move (break_label)), break_expr (std::move (expr_in_break)),
@@ -985,7 +987,8 @@ UnsafeBlockExpr::operator= (UnsafeBlockExpr const &other)
BaseLoopExpr::BaseLoopExpr (Analysis::NodeMapping mappings,
std::unique_ptr<BlockExpr> loop_block,
- location_t locus, LoopLabel loop_label,
+ location_t locus,
+ tl::optional<LoopLabel> loop_label,
AST::AttrVec outer_attribs)
: ExprWithBlock (std::move (mappings), std::move (outer_attribs)),
loop_label (std::move (loop_label)), loop_block (std::move (loop_block)),
@@ -1011,7 +1014,8 @@ BaseLoopExpr::operator= (BaseLoopExpr const &other)
LoopExpr::LoopExpr (Analysis::NodeMapping mappings,
std::unique_ptr<BlockExpr> loop_block, location_t locus,
- LoopLabel loop_label, AST::AttrVec outer_attribs)
+ tl::optional<LoopLabel> loop_label,
+ AST::AttrVec outer_attribs)
: BaseLoopExpr (std::move (mappings), std::move (loop_block), locus,
std::move (loop_label), std::move (outer_attribs))
{}
@@ -1019,7 +1023,8 @@ LoopExpr::LoopExpr (Analysis::NodeMapping mappings,
WhileLoopExpr::WhileLoopExpr (Analysis::NodeMapping mappings,
std::unique_ptr<Expr> loop_condition,
std::unique_ptr<BlockExpr> loop_block,
- location_t locus, LoopLabel loop_label,
+ location_t locus,
+ tl::optional<LoopLabel> loop_label,
AST::AttrVec outer_attribs)
: BaseLoopExpr (std::move (mappings), std::move (loop_block), locus,
std::move (loop_label), std::move (outer_attribs)),
@@ -1046,7 +1051,8 @@ WhileLetLoopExpr::WhileLetLoopExpr (
Analysis::NodeMapping mappings,
std::vector<std::unique_ptr<Pattern>> match_arm_patterns,
std::unique_ptr<Expr> condition, std::unique_ptr<BlockExpr> loop_block,
- location_t locus, LoopLabel loop_label, AST::AttrVec outer_attribs)
+ location_t locus, tl::optional<LoopLabel> loop_label,
+ AST::AttrVec outer_attribs)
: BaseLoopExpr (std::move (mappings), std::move (loop_block), locus,
std::move (loop_label), std::move (outer_attribs)),
match_arm_patterns (std::move (match_arm_patterns)),
diff --git a/gcc/rust/hir/tree/rust-hir-expr.h b/gcc/rust/hir/tree/rust-hir-expr.h
index f8f2128..96f0cf6 100644
--- a/gcc/rust/hir/tree/rust-hir-expr.h
+++ b/gcc/rust/hir/tree/rust-hir-expr.h
@@ -45,9 +45,6 @@ public:
LoopLabel (Analysis::NodeMapping mapping, Lifetime loop_label,
location_t locus);
- // Returns whether the LoopLabel is in an error state.
- bool is_error () const { return label.is_error (); }
-
location_t get_locus () const { return locus; }
Analysis::NodeMapping &get_mappings () { return mappings; }
@@ -199,12 +196,13 @@ public:
class BorrowExpr : public OperatorExpr
{
Mutability mut;
+ bool raw;
public:
std::string as_string () const override;
BorrowExpr (Analysis::NodeMapping mappings,
- std::unique_ptr<Expr> borrow_lvalue, Mutability mut,
+ std::unique_ptr<Expr> borrow_lvalue, Mutability mut, bool raw,
AST::AttrVec outer_attribs, location_t locus);
void accept_vis (HIRFullVisitor &vis) override;
@@ -212,6 +210,7 @@ public:
Mutability get_mut () const { return mut; }
bool is_mut () const { return mut == Mutability::Mut; }
+ bool is_raw_borrow () const { return raw; }
protected:
/* Use covariance to implement clone function as returning this object rather
@@ -1715,7 +1714,7 @@ public:
std::vector<std::unique_ptr<Stmt>> statements;
std::unique_ptr<Expr> expr;
bool tail_reachable;
- LoopLabel label;
+ tl::optional<LoopLabel> label;
location_t start_locus;
location_t end_locus;
@@ -1735,7 +1734,8 @@ public:
std::vector<std::unique_ptr<Stmt>> block_statements,
std::unique_ptr<Expr> block_expr, bool tail_reachable,
AST::AttrVec inner_attribs, AST::AttrVec outer_attribs,
- LoopLabel label, location_t start_locus, location_t end_locus);
+ tl::optional<LoopLabel> label, location_t start_locus,
+ location_t end_locus);
// Copy constructor with clone
BlockExpr (BlockExpr const &other);
@@ -1774,8 +1774,8 @@ public:
return ExprType::Block;
}
- bool has_label () const { return !label.is_error (); }
- LoopLabel &get_label () { return label; }
+ bool has_label () const { return label.has_value (); }
+ LoopLabel &get_label () { return label.value (); }
protected:
/* Use covariance to implement clone function as returning this object rather
@@ -1803,25 +1803,27 @@ protected:
// HIR node representing continue expression within loops
class ContinueExpr : public ExprWithoutBlock
{
- Lifetime label;
+ tl::optional<Lifetime> label;
location_t locus;
public:
std::string as_string () const override;
// Returns true if the continue expr has a label.
- bool has_label () const { return !label.is_error (); }
+ bool has_label () const { return label.has_value (); }
// Constructor for a ContinueExpr with a label.
ContinueExpr (Analysis::NodeMapping mappings, location_t locus,
- Lifetime label, AST::AttrVec outer_attribs = AST::AttrVec ());
+ tl::optional<Lifetime> label,
+ AST::AttrVec outer_attribs = AST::AttrVec ());
location_t get_locus () const override final { return locus; }
void accept_vis (HIRFullVisitor &vis) override;
void accept_vis (HIRExpressionVisitor &vis) override;
- Lifetime &get_label () { return label; }
+ Lifetime &get_label () { return label.value (); }
+ const Lifetime &get_label () const { return label.value (); }
ExprType get_expression_type () const final override
{
@@ -1848,7 +1850,7 @@ protected:
class BreakExpr : public ExprWithoutBlock
{
// bool has_label;
- Lifetime label;
+ tl::optional<Lifetime> label;
// bool has_break_expr;
std::unique_ptr<Expr> break_expr;
@@ -1859,7 +1861,7 @@ public:
std::string as_string () const override;
// Returns whether the break expression has a label or not.
- bool has_label () const { return !label.is_error (); }
+ bool has_label () const { return label.has_value (); }
/* Returns whether the break expression has an expression used in the break or
* not. */
@@ -1867,7 +1869,7 @@ public:
// Constructor for a break expression
BreakExpr (Analysis::NodeMapping mappings, location_t locus,
- Lifetime break_label,
+ tl::optional<Lifetime> break_label,
std::unique_ptr<Expr> expr_in_break = nullptr,
AST::AttrVec outer_attribs = AST::AttrVec ());
@@ -1886,7 +1888,8 @@ public:
void accept_vis (HIRFullVisitor &vis) override;
void accept_vis (HIRExpressionVisitor &vis) override;
- Lifetime &get_label () { return label; }
+ Lifetime &get_label () { return label.value (); }
+ const Lifetime &get_label () const { return label.value (); }
Expr &get_expr () { return *break_expr; }
@@ -2293,7 +2296,7 @@ protected:
class BaseLoopExpr : public ExprWithBlock
{
protected:
- LoopLabel loop_label;
+ tl::optional<LoopLabel> loop_label;
std::unique_ptr<BlockExpr> loop_block;
private:
@@ -2303,7 +2306,7 @@ protected:
// Constructor for BaseLoopExpr
BaseLoopExpr (Analysis::NodeMapping mappings,
std::unique_ptr<BlockExpr> loop_block, location_t locus,
- LoopLabel loop_label,
+ tl::optional<LoopLabel> loop_label,
AST::AttrVec outer_attribs = AST::AttrVec ());
// Copy constructor for BaseLoopExpr with clone
@@ -2322,13 +2325,14 @@ protected:
}
public:
- bool has_loop_label () const { return !loop_label.is_error (); }
+ bool has_loop_label () const { return loop_label.has_value (); }
location_t get_locus () const override final { return locus; }
HIR::BlockExpr &get_loop_block () { return *loop_block; };
- LoopLabel &get_loop_label () { return loop_label; }
+ LoopLabel &get_loop_label () { return loop_label.value (); }
+ const LoopLabel &get_loop_label () const { return loop_label.value (); }
};
// 'Loop' expression (i.e. the infinite loop) HIR node
@@ -2340,7 +2344,8 @@ public:
// Constructor for LoopExpr
LoopExpr (Analysis::NodeMapping mappings,
std::unique_ptr<BlockExpr> loop_block, location_t locus,
- LoopLabel loop_label, AST::AttrVec outer_attribs = AST::AttrVec ());
+ tl::optional<LoopLabel> loop_label,
+ AST::AttrVec outer_attribs = AST::AttrVec ());
void accept_vis (HIRFullVisitor &vis) override;
void accept_vis (HIRExpressionVisitor &vis) override;
@@ -2370,7 +2375,7 @@ public:
WhileLoopExpr (Analysis::NodeMapping mappings,
std::unique_ptr<Expr> loop_condition,
std::unique_ptr<BlockExpr> loop_block, location_t locus,
- LoopLabel loop_label,
+ tl::optional<LoopLabel> loop_label,
AST::AttrVec outer_attribs = AST::AttrVec ());
// Copy constructor with clone
@@ -2419,7 +2424,7 @@ public:
std::vector<std::unique_ptr<Pattern>> match_arm_patterns,
std::unique_ptr<Expr> condition,
std::unique_ptr<BlockExpr> loop_block, location_t locus,
- LoopLabel loop_label,
+ tl::optional<LoopLabel> loop_label,
AST::AttrVec outer_attribs = AST::AttrVec ());
// Copy constructor with clone
diff --git a/gcc/rust/hir/tree/rust-hir-generic-param.h b/gcc/rust/hir/tree/rust-hir-generic-param.h
index a1c59bf..960de56 100644
--- a/gcc/rust/hir/tree/rust-hir-generic-param.h
+++ b/gcc/rust/hir/tree/rust-hir-generic-param.h
@@ -97,9 +97,6 @@ public:
AST::AttrVec &get_outer_attrs () override { return outer_attrs; }
- // Returns whether the lifetime param is in an error state.
- bool is_error () const { return lifetime.is_error (); }
-
// Constructor
LifetimeParam (Analysis::NodeMapping mappings, Lifetime lifetime,
location_t locus = UNDEF_LOCATION,
diff --git a/gcc/rust/hir/tree/rust-hir-item.cc b/gcc/rust/hir/tree/rust-hir-item.cc
index cff06d3..160f710 100644
--- a/gcc/rust/hir/tree/rust-hir-item.cc
+++ b/gcc/rust/hir/tree/rust-hir-item.cc
@@ -123,7 +123,8 @@ TypeBoundWhereClauseItem::get_type_param_bounds ()
}
SelfParam::SelfParam (Analysis::NodeMapping mappings,
- ImplicitSelfKind self_kind, Lifetime lifetime, Type *type)
+ ImplicitSelfKind self_kind,
+ tl::optional<Lifetime> lifetime, Type *type)
: self_kind (self_kind), lifetime (std::move (lifetime)), type (type),
mappings (mappings)
{}
@@ -131,13 +132,13 @@ SelfParam::SelfParam (Analysis::NodeMapping mappings,
SelfParam::SelfParam (Analysis::NodeMapping mappings,
std::unique_ptr<Type> type, bool is_mut, location_t locus)
: self_kind (is_mut ? ImplicitSelfKind::MUT : ImplicitSelfKind::IMM),
- lifetime (
- Lifetime (mappings, AST::Lifetime::LifetimeType::NAMED, "", locus)),
- type (std::move (type)), locus (locus), mappings (mappings)
+ lifetime (tl::nullopt), type (std::move (type)), locus (locus),
+ mappings (mappings)
{}
-SelfParam::SelfParam (Analysis::NodeMapping mappings, Lifetime lifetime,
- bool is_mut, location_t locus)
+SelfParam::SelfParam (Analysis::NodeMapping mappings,
+ tl::optional<Lifetime> lifetime, bool is_mut,
+ location_t locus)
: self_kind (is_mut ? ImplicitSelfKind::MUT_REF : ImplicitSelfKind::IMM_REF),
lifetime (std::move (lifetime)), locus (locus), mappings (mappings)
{}
@@ -263,7 +264,8 @@ Function::Function (Analysis::NodeMapping mappings, Identifier function_name,
std::vector<FunctionParam> function_params,
std::unique_ptr<Type> return_type, WhereClause where_clause,
std::unique_ptr<BlockExpr> function_body, Visibility vis,
- AST::AttrVec outer_attrs, SelfParam self, location_t locus)
+ AST::AttrVec outer_attrs, tl::optional<SelfParam> self,
+ Defaultness defaultness, location_t locus)
: VisItem (std::move (mappings), std::move (vis), std::move (outer_attrs)),
qualifiers (std::move (qualifiers)),
function_name (std::move (function_name)),
@@ -272,7 +274,7 @@ Function::Function (Analysis::NodeMapping mappings, Identifier function_name,
return_type (std::move (return_type)),
where_clause (std::move (where_clause)),
function_body (std::move (function_body)), self (std::move (self)),
- locus (locus)
+ locus (locus), defaultness (defaultness)
{}
Function::Function (Function const &other)
@@ -280,7 +282,7 @@ Function::Function (Function const &other)
function_name (other.function_name),
function_params (other.function_params), where_clause (other.where_clause),
function_body (other.function_body->clone_block_expr ()), self (other.self),
- locus (other.locus)
+ locus (other.locus), defaultness (other.defaultness)
{
// guard to prevent null dereference (always required)
if (other.return_type != nullptr)
@@ -312,6 +314,8 @@ Function::operator= (Function const &other)
locus = other.locus;
self = other.self;
+ defaultness = other.defaultness;
+
generic_params.reserve (other.generic_params.size ());
for (const auto &e : other.generic_params)
generic_params.push_back (e->clone_generic_param ());
@@ -609,9 +613,9 @@ StaticItem::operator= (StaticItem const &other)
TraitFunctionDecl::TraitFunctionDecl (
Identifier function_name, FunctionQualifiers qualifiers,
- std::vector<std::unique_ptr<GenericParam>> generic_params, SelfParam self,
- std::vector<FunctionParam> function_params, std::unique_ptr<Type> return_type,
- WhereClause where_clause)
+ std::vector<std::unique_ptr<GenericParam>> generic_params,
+ tl::optional<SelfParam> self, std::vector<FunctionParam> function_params,
+ std::unique_ptr<Type> return_type, WhereClause where_clause)
: qualifiers (std::move (qualifiers)),
function_name (std::move (function_name)),
generic_params (std::move (generic_params)),
diff --git a/gcc/rust/hir/tree/rust-hir-item.h b/gcc/rust/hir/tree/rust-hir-item.h
index 4744717..b9b105b 100644
--- a/gcc/rust/hir/tree/rust-hir-item.h
+++ b/gcc/rust/hir/tree/rust-hir-item.h
@@ -371,13 +371,13 @@ public:
private:
ImplicitSelfKind self_kind;
- Lifetime lifetime;
+ tl::optional<Lifetime> lifetime;
std::unique_ptr<Type> type;
location_t locus;
Analysis::NodeMapping mappings;
SelfParam (Analysis::NodeMapping mappings, ImplicitSelfKind self_kind,
- Lifetime lifetime, Type *type);
+ tl::optional<Lifetime> lifetime, Type *type);
public:
// Type-based self parameter (not ref, no lifetime)
@@ -385,8 +385,8 @@ public:
bool is_mut, location_t locus);
// Lifetime-based self parameter (is ref, no type)
- SelfParam (Analysis::NodeMapping mappings, Lifetime lifetime, bool is_mut,
- location_t locus);
+ SelfParam (Analysis::NodeMapping mappings, tl::optional<Lifetime> lifetime,
+ bool is_mut, location_t locus);
// Copy constructor requires clone
SelfParam (SelfParam const &other);
@@ -398,22 +398,13 @@ public:
SelfParam (SelfParam &&other) = default;
SelfParam &operator= (SelfParam &&other) = default;
- static SelfParam error ()
- {
- return SelfParam (Analysis::NodeMapping::get_error (),
- ImplicitSelfKind::NONE, Lifetime::error (), nullptr);
- }
-
// Returns whether the self-param has a type field.
bool has_type () const { return type != nullptr; }
// Returns whether the self-param has a valid lifetime.
- bool has_lifetime () const { return !lifetime.is_error (); }
-
- const Lifetime &get_lifetime () const { return lifetime; }
+ bool has_lifetime () const { return lifetime.has_value (); }
- // Returns whether the self-param is in an error state.
- bool is_error () const { return self_kind == ImplicitSelfKind::NONE; }
+ const Lifetime &get_lifetime () const { return lifetime.value (); }
std::string as_string () const;
@@ -945,6 +936,12 @@ protected:
class LetStmt;
+enum class Defaultness
+{
+ Default,
+ Final,
+};
+
// Rust function declaration HIR node
class Function : public VisItem, public ImplItem
{
@@ -955,9 +952,14 @@ class Function : public VisItem, public ImplItem
std::unique_ptr<Type> return_type;
WhereClause where_clause;
std::unique_ptr<BlockExpr> function_body;
- SelfParam self;
+ tl::optional<SelfParam> self;
location_t locus;
+ // NOTE: This should be moved to the trait item base class once we start
+ // implementing specialization for real, instead of just stubbing out the
+ // feature
+ Defaultness defaultness;
+
public:
std::string as_string () const override;
@@ -973,6 +975,9 @@ public:
// Returns whether function has a where clause.
bool has_where_clause () const { return !where_clause.is_empty (); }
+ // Returns whether function has a default qualifier
+ bool is_default () const { return defaultness == Defaultness::Default; }
+
ImplItemType get_impl_item_type () const override final
{
return ImplItem::ImplItemType::FUNCTION;
@@ -987,7 +992,8 @@ public:
std::vector<FunctionParam> function_params,
std::unique_ptr<Type> return_type, WhereClause where_clause,
std::unique_ptr<BlockExpr> function_body, Visibility vis,
- AST::AttrVec outer_attrs, SelfParam self, location_t locus);
+ AST::AttrVec outer_attrs, tl::optional<SelfParam> self,
+ Defaultness defaultness, location_t locus);
// Copy constructor with clone
Function (Function const &other);
@@ -1041,9 +1047,13 @@ public:
// TODO: is this better? Or is a "vis_block" better?
Type &get_return_type () { return *return_type; }
- bool is_method () const { return !self.is_error (); }
+ bool is_method () const { return self.has_value (); }
+
+ tl::optional<SelfParam> &get_self_param () { return self; }
+ const tl::optional<SelfParam> &get_self_param () const { return self; }
- SelfParam &get_self_param () { return self; }
+ SelfParam &get_self_param_unchecked () { return self.value (); }
+ const SelfParam &get_self_param_unchecked () const { return self.value (); }
std::string get_impl_item_name () const override final
{
@@ -1898,13 +1908,14 @@ private:
std::vector<FunctionParam> function_params;
std::unique_ptr<Type> return_type;
WhereClause where_clause;
- SelfParam self;
+ tl::optional<SelfParam> self;
public:
// Mega-constructor
TraitFunctionDecl (Identifier function_name, FunctionQualifiers qualifiers,
std::vector<std::unique_ptr<GenericParam>> generic_params,
- SelfParam self, std::vector<FunctionParam> function_params,
+ tl::optional<SelfParam> self,
+ std::vector<FunctionParam> function_params,
std::unique_ptr<Type> return_type,
WhereClause where_clause);
@@ -1936,9 +1947,13 @@ public:
WhereClause &get_where_clause () { return where_clause; }
- bool is_method () const { return !self.is_error (); }
+ bool is_method () const { return self.has_value (); }
+
+ SelfParam &get_self_unchecked () { return self.value (); }
+ const SelfParam &get_self_unchecked () const { return self.value (); }
- SelfParam &get_self () { return self; }
+ tl::optional<SelfParam> &get_self () { return self; }
+ const tl::optional<SelfParam> &get_self () const { return self; }
Identifier get_function_name () const { return function_name; }
diff --git a/gcc/rust/hir/tree/rust-hir-type.cc b/gcc/rust/hir/tree/rust-hir-type.cc
index 6a6c319..ec48425 100644
--- a/gcc/rust/hir/tree/rust-hir-type.cc
+++ b/gcc/rust/hir/tree/rust-hir-type.cc
@@ -162,7 +162,7 @@ RawPointerType::operator= (RawPointerType const &other)
ReferenceType::ReferenceType (Analysis::NodeMapping mappings, Mutability mut,
std::unique_ptr<Type> type_no_bounds,
- location_t locus, Lifetime lifetime)
+ location_t locus, tl::optional<Lifetime> lifetime)
: TypeNoBounds (mappings, locus), lifetime (std::move (lifetime)), mut (mut),
type (std::move (type_no_bounds))
{}
diff --git a/gcc/rust/hir/tree/rust-hir-type.h b/gcc/rust/hir/tree/rust-hir-type.h
index bd0f2b6..cbc20ff 100644
--- a/gcc/rust/hir/tree/rust-hir-type.h
+++ b/gcc/rust/hir/tree/rust-hir-type.h
@@ -291,7 +291,7 @@ protected:
class ReferenceType : public TypeNoBounds
{
// bool has_lifetime; // TODO: handle in lifetime or something?
- Lifetime lifetime;
+ tl::optional<Lifetime> lifetime;
Mutability mut;
std::unique_ptr<Type> type;
@@ -301,12 +301,12 @@ public:
bool is_mut () const { return mut == Mutability::Mut; }
// Returns whether the reference has a lifetime.
- bool has_lifetime () const { return !lifetime.is_error (); }
+ bool has_lifetime () const { return lifetime.has_value (); }
// Constructor
ReferenceType (Analysis::NodeMapping mappings, Mutability mut,
std::unique_ptr<Type> type_no_bounds, location_t locus,
- Lifetime lifetime);
+ tl::optional<Lifetime> lifetime);
// Copy constructor with custom clone method
ReferenceType (ReferenceType const &other);
@@ -323,7 +323,8 @@ public:
void accept_vis (HIRFullVisitor &vis) override;
void accept_vis (HIRTypeVisitor &vis) override;
- Lifetime &get_lifetime () { return lifetime; }
+ Lifetime &get_lifetime () { return lifetime.value (); }
+ const Lifetime &get_lifetime () const { return lifetime.value (); }
Mutability get_mut () const { return mut; }
diff --git a/gcc/rust/hir/tree/rust-hir.cc b/gcc/rust/hir/tree/rust-hir.cc
index 822eaff..c8bf9da 100644
--- a/gcc/rust/hir/tree/rust-hir.cc
+++ b/gcc/rust/hir/tree/rust-hir.cc
@@ -1314,7 +1314,7 @@ ContinueExpr::as_string () const
if (has_label ())
{
- str += label.as_string ();
+ str += get_label ().as_string ();
}
return str;
@@ -1704,7 +1704,7 @@ WhileLoopExpr::as_string () const
}
else
{
- str += loop_label.as_string ();
+ str += get_loop_label ().as_string ();
}
str += "\n Conditional expr: " + condition->as_string ();
@@ -1726,7 +1726,7 @@ WhileLetLoopExpr::as_string () const
}
else
{
- str += loop_label.as_string ();
+ str += get_loop_label ().as_string ();
}
str += "\n Match arm patterns: ";
@@ -1761,7 +1761,7 @@ LoopExpr::as_string () const
}
else
{
- str += loop_label.as_string ();
+ str += get_loop_label ().as_string ();
}
str += "\n Loop block: " + loop_block->as_string ();
@@ -1816,7 +1816,7 @@ BreakExpr::as_string () const
if (has_label ())
{
- str += label.as_string () + " ";
+ str += get_label ().as_string () + " ";
}
if (has_break_expr ())
@@ -2101,11 +2101,6 @@ QualifiedPathInType::as_string () const
std::string
Lifetime::as_string () const
{
- if (is_error ())
- {
- return "error lifetime";
- }
-
switch (lifetime_type)
{
case AST::Lifetime::LifetimeType::NAMED:
@@ -2760,7 +2755,7 @@ ReferenceType::as_string () const
if (has_lifetime ())
{
- str += lifetime.as_string () + " ";
+ str += get_lifetime ().as_string () + " ";
}
if (is_mut ())
@@ -3411,7 +3406,7 @@ TraitFunctionDecl::as_string () const
str += "\n Function params: ";
if (is_method ())
{
- str += self.as_string () + (has_params () ? ", " : "");
+ str += get_self_unchecked ().as_string () + (has_params () ? ", " : "");
}
if (has_params ())
@@ -3525,70 +3520,63 @@ TraitItemType::as_string () const
std::string
SelfParam::as_string () const
{
- if (is_error ())
- {
- return "error";
- }
- else
+ if (has_type ())
{
- if (has_type ())
+ // type (i.e. not ref, no lifetime)
+ std::string str;
+
+ if (is_mut ())
{
- // type (i.e. not ref, no lifetime)
- std::string str;
+ str += "mut ";
+ }
- if (is_mut ())
- {
- str += "mut ";
- }
+ str += "self : ";
- str += "self : ";
+ str += type->as_string ();
- str += type->as_string ();
+ return str;
+ }
+ else if (has_lifetime ())
+ {
+ // ref and lifetime
+ std::string str = "&" + get_lifetime ().as_string () + " ";
- return str;
- }
- else if (has_lifetime ())
+ if (is_mut ())
{
- // ref and lifetime
- std::string str = "&" + lifetime.as_string () + " ";
+ str += "mut ";
+ }
- if (is_mut ())
- {
- str += "mut ";
- }
+ str += "self";
- str += "self";
+ return str;
+ }
+ else if (is_ref ())
+ {
+ // ref with no lifetime
+ std::string str = "&";
- return str;
- }
- else if (is_ref ())
+ if (is_mut ())
{
- // ref with no lifetime
- std::string str = "&";
+ str += " mut ";
+ }
- if (is_mut ())
- {
- str += " mut ";
- }
+ str += "self";
- str += "self";
+ return str;
+ }
+ else
+ {
+ // no ref, no type
+ std::string str;
- return str;
- }
- else
+ if (is_mut ())
{
- // no ref, no type
- std::string str;
-
- if (is_mut ())
- {
- str += "mut ";
- }
+ str += "mut ";
+ }
- str += "self";
+ str += "self";
- return str;
- }
+ return str;
}
}
diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h
index 71d7250..3bb758e 100644
--- a/gcc/rust/parse/rust-parse-impl.h
+++ b/gcc/rust/parse/rust-parse-impl.h
@@ -3102,7 +3102,7 @@ Parser<ManagedTokenSource>::parse_generic_param (EndTokenPred is_end_token)
{
case LIFETIME: {
auto lifetime = parse_lifetime (false);
- if (lifetime.is_error ())
+ if (!lifetime)
{
rust_error_at (
token->get_locus (),
@@ -3122,7 +3122,7 @@ Parser<ManagedTokenSource>::parse_generic_param (EndTokenPred is_end_token)
}
param = std::unique_ptr<AST::LifetimeParam> (new AST::LifetimeParam (
- std::move (lifetime), std::move (lifetime_bounds),
+ std::move (lifetime.value ()), std::move (lifetime_bounds),
std::move (outer_attrs), token->get_locus ()));
break;
}
@@ -3276,16 +3276,16 @@ Parser<ManagedTokenSource>::parse_lifetime_params ()
while (lexer.peek_token ()->get_id () != END_OF_FILE)
{
- AST::LifetimeParam lifetime_param = parse_lifetime_param ();
+ auto lifetime_param = parse_lifetime_param ();
- if (lifetime_param.is_error ())
+ if (!lifetime_param)
{
// can't treat as error as only way to get out with trailing comma
break;
}
lifetime_params.push_back (std::unique_ptr<AST::LifetimeParam> (
- new AST::LifetimeParam (std::move (lifetime_param))));
+ new AST::LifetimeParam (std::move (lifetime_param.value ()))));
if (lexer.peek_token ()->get_id () != COMMA)
break;
@@ -3311,9 +3311,9 @@ Parser<ManagedTokenSource>::parse_lifetime_params (EndTokenPred is_end_token)
// if end_token is not specified, it defaults to EOF, so should work fine
while (!is_end_token (lexer.peek_token ()->get_id ()))
{
- AST::LifetimeParam lifetime_param = parse_lifetime_param ();
+ auto lifetime_param = parse_lifetime_param ();
- if (lifetime_param.is_error ())
+ if (!lifetime_param)
{
/* TODO: is it worth throwing away all lifetime params just because
* one failed? */
@@ -3351,9 +3351,9 @@ Parser<ManagedTokenSource>::parse_lifetime_params_objs ()
// bad control structure as end token cannot be guaranteed
while (true)
{
- AST::LifetimeParam lifetime_param = parse_lifetime_param ();
+ auto lifetime_param = parse_lifetime_param ();
- if (lifetime_param.is_error ())
+ if (!lifetime_param)
{
// not an error as only way to exit if trailing comma
break;
@@ -3386,9 +3386,9 @@ Parser<ManagedTokenSource>::parse_lifetime_params_objs (
while (!is_end_token (lexer.peek_token ()->get_id ()))
{
- AST::LifetimeParam lifetime_param = parse_lifetime_param ();
+ auto lifetime_param = parse_lifetime_param ();
- if (lifetime_param.is_error ())
+ if (!lifetime_param)
{
/* TODO: is it worth throwing away all lifetime params just because
* one failed? */
@@ -3399,7 +3399,7 @@ Parser<ManagedTokenSource>::parse_lifetime_params_objs (
return {};
}
- lifetime_params.push_back (std::move (lifetime_param));
+ lifetime_params.push_back (std::move (lifetime_param.value ()));
if (lexer.peek_token ()->get_id () != COMMA)
break;
@@ -3458,7 +3458,7 @@ Parser<ManagedTokenSource>::parse_non_ptr_sequence (
/* Parses a single lifetime generic parameter (not including comma). */
template <typename ManagedTokenSource>
-AST::LifetimeParam
+tl::expected<AST::LifetimeParam, ParseLifetimeParamError>
Parser<ManagedTokenSource>::parse_lifetime_param ()
{
// parse outer attributes, which are optional and may not exist
@@ -3468,8 +3468,8 @@ Parser<ManagedTokenSource>::parse_lifetime_param ()
const_TokenPtr lifetime_tok = lexer.peek_token ();
if (lifetime_tok->get_id () != LIFETIME)
{
- // if lifetime is missing, must not be a lifetime param, so return null
- return AST::LifetimeParam::create_error ();
+ // if lifetime is missing, must not be a lifetime param, so return error
+ return tl::make_unexpected<ParseLifetimeParamError> ({});
}
lexer.skip_token ();
AST::Lifetime lifetime (AST::Lifetime::NAMED, lifetime_tok->get_str (),
@@ -3815,12 +3815,13 @@ template <typename ManagedTokenSource>
std::unique_ptr<AST::LifetimeWhereClauseItem>
Parser<ManagedTokenSource>::parse_lifetime_where_clause_item ()
{
- AST::Lifetime lifetime = parse_lifetime (false);
- if (lifetime.is_error ())
+ auto parsed_lifetime = parse_lifetime (false);
+ if (!parsed_lifetime)
{
// TODO: error here?
return nullptr;
}
+ auto lifetime = parsed_lifetime.value ();
if (!skip_token (COLON))
{
@@ -4013,7 +4014,7 @@ Parser<ManagedTokenSource>::parse_type_param_bound ()
{
case LIFETIME:
return std::unique_ptr<AST::Lifetime> (
- new AST::Lifetime (parse_lifetime (false)));
+ new AST::Lifetime (parse_lifetime (false).value ()));
case LEFT_PAREN:
case QUESTION_MARK:
case FOR:
@@ -4086,13 +4087,13 @@ Parser<ManagedTokenSource>::parse_lifetime_bounds ()
while (true)
{
- AST::Lifetime lifetime = parse_lifetime (false);
+ auto lifetime = parse_lifetime (false);
// quick exit for parsing failure
- if (lifetime.is_error ())
+ if (!lifetime)
break;
- lifetime_bounds.push_back (std::move (lifetime));
+ lifetime_bounds.push_back (std::move (lifetime.value ()));
/* plus is maybe not allowed at end - spec defines it weirdly, so
* assuming allowed at end */
@@ -4116,9 +4117,9 @@ Parser<ManagedTokenSource>::parse_lifetime_bounds (EndTokenPred is_end_token)
while (!is_end_token (lexer.peek_token ()->get_id ()))
{
- AST::Lifetime lifetime = parse_lifetime (false);
+ auto lifetime = parse_lifetime (false);
- if (lifetime.is_error ())
+ if (!lifetime)
{
/* TODO: is it worth throwing away all lifetime bound info just
* because one failed? */
@@ -4129,7 +4130,7 @@ Parser<ManagedTokenSource>::parse_lifetime_bounds (EndTokenPred is_end_token)
return {};
}
- lifetime_bounds.push_back (std::move (lifetime));
+ lifetime_bounds.push_back (std::move (lifetime.value ()));
/* plus is maybe not allowed at end - spec defines it weirdly, so
* assuming allowed at end */
@@ -4146,14 +4147,20 @@ Parser<ManagedTokenSource>::parse_lifetime_bounds (EndTokenPred is_end_token)
/* Parses a lifetime token (named, 'static, or '_). Also handles lifetime not
* existing. */
template <typename ManagedTokenSource>
-AST::Lifetime
+tl::expected<AST::Lifetime, ParseLifetimeError>
Parser<ManagedTokenSource>::parse_lifetime (bool allow_elided)
{
const_TokenPtr lifetime_tok = lexer.peek_token ();
if (lifetime_tok->get_id () != LIFETIME)
{
- return (allow_elided) ? AST::Lifetime::elided ()
- : AST::Lifetime::error ();
+ if (allow_elided)
+ {
+ return AST::Lifetime::elided ();
+ }
+ else
+ {
+ return tl::make_unexpected<ParseLifetimeError> ({});
+ }
}
lexer.skip_token ();
@@ -6340,14 +6347,14 @@ Parser<ManagedTokenSource>::parse_path_generic_args ()
location_t locus = t->get_locus ();
while (!is_right_angle_tok (t->get_id ()))
{
- AST::Lifetime lifetime = parse_lifetime (false);
- if (lifetime.is_error ())
+ auto lifetime = parse_lifetime (false);
+ if (!lifetime)
{
// not necessarily an error
break;
}
- lifetime_args.push_back (std::move (lifetime));
+ lifetime_args.push_back (std::move (lifetime.value ()));
// if next token isn't comma, then it must be end of list
if (lexer.peek_token ()->get_id () != COMMA)
@@ -6961,10 +6968,12 @@ Parser<ManagedTokenSource>::parse_self_param ()
// now test whether it has a lifetime
if (lexer.peek_token ()->get_id () == LIFETIME)
{
- lifetime = parse_lifetime (true);
-
// something went wrong somehow
- if (lifetime.is_error ())
+ if (auto parsed_lifetime = parse_lifetime (true))
+ {
+ lifetime = parsed_lifetime.value ();
+ }
+ else
{
Error error (lexer.peek_token ()->get_locus (),
"failed to parse lifetime in self param");
@@ -7153,9 +7162,9 @@ Parser<ManagedTokenSource>::parse_expr_stmt (AST::AttrVec outer_attrs,
// Parses a block expression, including the curly braces at start and end.
template <typename ManagedTokenSource>
std::unique_ptr<AST::BlockExpr>
-Parser<ManagedTokenSource>::parse_block_expr (AST::AttrVec outer_attrs,
- AST::LoopLabel label,
- location_t pratt_parsed_loc)
+Parser<ManagedTokenSource>::parse_block_expr (
+ AST::AttrVec outer_attrs, tl::optional<AST::LoopLabel> label,
+ location_t pratt_parsed_loc)
{
location_t locus = pratt_parsed_loc;
if (locus == UNKNOWN_LOCATION)
@@ -7519,12 +7528,10 @@ Parser<ManagedTokenSource>::parse_break_expr (AST::AttrVec outer_attrs,
skip_token (BREAK);
}
- // parse label (lifetime) if it exists - create dummy first
- AST::Lifetime label = AST::Lifetime::error ();
- if (lexer.peek_token ()->get_id () == LIFETIME)
- {
- label = parse_lifetime (false);
- }
+ auto parsed_label = parse_lifetime (false);
+ auto label = (parsed_label)
+ ? tl::optional<AST::Lifetime> (parsed_label.value ())
+ : tl::nullopt;
// parse break return expression if it exists
ParseRestrictions restrictions;
@@ -7550,12 +7557,10 @@ Parser<ManagedTokenSource>::parse_continue_expr (AST::AttrVec outer_attrs,
skip_token (CONTINUE);
}
- // parse label (lifetime) if it exists - create dummy first
- AST::Lifetime label = AST::Lifetime::error ();
- if (lexer.peek_token ()->get_id () == LIFETIME)
- {
- label = parse_lifetime (false);
- }
+ auto parsed_label = parse_lifetime (false);
+ auto label = (parsed_label)
+ ? tl::optional<AST::Lifetime> (parsed_label.value ())
+ : tl::nullopt;
return std::unique_ptr<AST::ContinueExpr> (
new AST::ContinueExpr (std::move (label), std::move (outer_attrs), locus));
@@ -7563,14 +7568,15 @@ Parser<ManagedTokenSource>::parse_continue_expr (AST::AttrVec outer_attrs,
// Parses a loop label used in loop expressions.
template <typename ManagedTokenSource>
-AST::LoopLabel
+tl::expected<AST::LoopLabel, ParseLoopLabelError>
Parser<ManagedTokenSource>::parse_loop_label (const_TokenPtr tok)
{
// parse lifetime - if doesn't exist, assume no label
if (tok->get_id () != LIFETIME)
{
// not necessarily an error
- return AST::LoopLabel::error ();
+ return tl::unexpected<ParseLoopLabelError> (
+ ParseLoopLabelError::NOT_LOOP_LABEL);
}
/* FIXME: check for named lifetime requirement here? or check in semantic
* analysis phase? */
@@ -7579,10 +7585,12 @@ Parser<ManagedTokenSource>::parse_loop_label (const_TokenPtr tok)
if (!skip_token (COLON))
{
// skip somewhere?
- return AST::LoopLabel::error ();
+ return tl::unexpected<ParseLoopLabelError> (
+ ParseLoopLabelError::MISSING_COLON);
}
- return AST::LoopLabel (std::move (label), tok->get_locus ());
+ return tl::expected<AST::LoopLabel, ParseLoopLabelError> (
+ AST::LoopLabel (std::move (label), tok->get_locus ()));
}
/* Parses an if expression of any kind, including with else, else if, else if
@@ -7935,16 +7943,16 @@ Parser<ManagedTokenSource>::parse_if_let_expr (AST::AttrVec outer_attrs,
template <typename ManagedTokenSource>
std::unique_ptr<AST::LoopExpr>
Parser<ManagedTokenSource>::parse_loop_expr (AST::AttrVec outer_attrs,
- AST::LoopLabel label,
+ tl::optional<AST::LoopLabel> label,
location_t pratt_parsed_loc)
{
location_t locus = pratt_parsed_loc;
if (locus == UNKNOWN_LOCATION)
{
- if (label.is_error ())
- locus = lexer.peek_token ()->get_locus ();
+ if (label)
+ locus = label->get_locus ();
else
- locus = label.get_locus ();
+ locus = lexer.peek_token ()->get_locus ();
if (!skip_token (LOOP))
{
@@ -7954,8 +7962,8 @@ Parser<ManagedTokenSource>::parse_loop_expr (AST::AttrVec outer_attrs,
}
else
{
- if (!label.is_error ())
- locus = label.get_locus ();
+ if (label)
+ locus = label->get_locus ();
}
// parse loop body, which is required
@@ -7978,17 +7986,17 @@ Parser<ManagedTokenSource>::parse_loop_expr (AST::AttrVec outer_attrs,
* via parse_labelled_loop_expr, which would call this. */
template <typename ManagedTokenSource>
std::unique_ptr<AST::WhileLoopExpr>
-Parser<ManagedTokenSource>::parse_while_loop_expr (AST::AttrVec outer_attrs,
- AST::LoopLabel label,
- location_t pratt_parsed_loc)
+Parser<ManagedTokenSource>::parse_while_loop_expr (
+ AST::AttrVec outer_attrs, tl::optional<AST::LoopLabel> label,
+ location_t pratt_parsed_loc)
{
location_t locus = pratt_parsed_loc;
if (locus == UNKNOWN_LOCATION)
{
- if (label.is_error ())
- locus = lexer.peek_token ()->get_locus ();
+ if (label)
+ locus = label->get_locus ();
else
- locus = label.get_locus ();
+ locus = lexer.peek_token ()->get_locus ();
if (!skip_token (WHILE))
{
@@ -7998,8 +8006,8 @@ Parser<ManagedTokenSource>::parse_while_loop_expr (AST::AttrVec outer_attrs,
}
else
{
- if (!label.is_error ())
- locus = label.get_locus ();
+ if (label)
+ locus = label->get_locus ();
}
// ensure it isn't a while let loop
@@ -8051,14 +8059,14 @@ Parser<ManagedTokenSource>::parse_while_loop_expr (AST::AttrVec outer_attrs,
* parsed via parse_labelled_loop_expr, which would call this. */
template <typename ManagedTokenSource>
std::unique_ptr<AST::WhileLetLoopExpr>
-Parser<ManagedTokenSource>::parse_while_let_loop_expr (AST::AttrVec outer_attrs,
- AST::LoopLabel label)
+Parser<ManagedTokenSource>::parse_while_let_loop_expr (
+ AST::AttrVec outer_attrs, tl::optional<AST::LoopLabel> label)
{
location_t locus = UNKNOWN_LOCATION;
- if (label.is_error ())
- locus = lexer.peek_token ()->get_locus ();
+ if (label)
+ locus = label->get_locus ();
else
- locus = label.get_locus ();
+ locus = lexer.peek_token ()->get_locus ();
maybe_skip_token (WHILE);
/* check for possible accidental recognition of a while loop as a while let
@@ -8125,14 +8133,14 @@ Parser<ManagedTokenSource>::parse_while_let_loop_expr (AST::AttrVec outer_attrs,
* parse_labelled_loop_expr, which would call this. */
template <typename ManagedTokenSource>
std::unique_ptr<AST::ForLoopExpr>
-Parser<ManagedTokenSource>::parse_for_loop_expr (AST::AttrVec outer_attrs,
- AST::LoopLabel label)
+Parser<ManagedTokenSource>::parse_for_loop_expr (
+ AST::AttrVec outer_attrs, tl::optional<AST::LoopLabel> label)
{
location_t locus = UNKNOWN_LOCATION;
- if (label.is_error ())
- locus = lexer.peek_token ()->get_locus ();
+ if (label)
+ locus = label->get_locus ();
else
- locus = label.get_locus ();
+ locus = lexer.peek_token ()->get_locus ();
maybe_skip_token (FOR);
// parse pattern, which is required
@@ -8210,8 +8218,9 @@ Parser<ManagedTokenSource>::parse_labelled_loop_expr (const_TokenPtr tok,
}
// parse loop label (required)
- AST::LoopLabel label = parse_loop_label (tok);
- if (label.is_error ())
+ // TODO: Convert this return type to tl::expected instead of tl::optional
+ auto parsed_label = parse_loop_label (tok);
+ if (!parsed_label)
{
Error error (lexer.peek_token ()->get_locus (),
"failed to parse loop label in labelled loop expr");
@@ -8221,6 +8230,10 @@ Parser<ManagedTokenSource>::parse_labelled_loop_expr (const_TokenPtr tok,
return nullptr;
}
+ auto label = parsed_label
+ ? tl::optional<AST::LoopLabel> (parsed_label.value ())
+ : tl::nullopt;
+
// branch on next token
const_TokenPtr t = lexer.peek_token ();
switch (t->get_id ())
@@ -9598,8 +9611,12 @@ Parser<ManagedTokenSource>::parse_reference_type_inner (location_t locus)
AST::Lifetime lifetime = AST::Lifetime::elided ();
if (lexer.peek_token ()->get_id () == LIFETIME)
{
- lifetime = parse_lifetime (true);
- if (lifetime.is_error ())
+ auto parsed_lifetime = parse_lifetime (true);
+ if (parsed_lifetime)
+ {
+ lifetime = parsed_lifetime.value ();
+ }
+ else
{
Error error (lexer.peek_token ()->get_locus (),
"failed to parse lifetime in reference type");
@@ -12400,8 +12417,8 @@ Parser<ManagedTokenSource>::null_denotation_not_path (
return parse_continue_expr (std::move (outer_attrs), tok->get_locus ());
case LEFT_CURLY:
// ok - this is an expression with block for once.
- return parse_block_expr (std::move (outer_attrs),
- AST::LoopLabel::error (), tok->get_locus ());
+ return parse_block_expr (std::move (outer_attrs), tl::nullopt,
+ tok->get_locus ());
case IF:
// if or if let, so more lookahead to find out
if (lexer.peek_token ()->get_id () == LET)
@@ -12417,7 +12434,7 @@ Parser<ManagedTokenSource>::null_denotation_not_path (
case LIFETIME:
return parse_labelled_loop_expr (tok, std::move (outer_attrs));
case LOOP:
- return parse_loop_expr (std::move (outer_attrs), AST::LoopLabel::error (),
+ return parse_loop_expr (std::move (outer_attrs), tl::nullopt,
tok->get_locus ());
case WHILE:
if (lexer.peek_token ()->get_id () == LET)
@@ -12426,13 +12443,11 @@ Parser<ManagedTokenSource>::null_denotation_not_path (
}
else
{
- return parse_while_loop_expr (std::move (outer_attrs),
- AST::LoopLabel::error (),
+ return parse_while_loop_expr (std::move (outer_attrs), tl::nullopt,
tok->get_locus ());
}
case FOR:
- return parse_for_loop_expr (std::move (outer_attrs),
- AST::LoopLabel::error ());
+ return parse_for_loop_expr (std::move (outer_attrs), tl::nullopt);
case MATCH_KW:
// also an expression with block
return parse_match_expr (std::move (outer_attrs), tok->get_locus ());
diff --git a/gcc/rust/parse/rust-parse.h b/gcc/rust/parse/rust-parse.h
index 6c50ba9..ff79879 100644
--- a/gcc/rust/parse/rust-parse.h
+++ b/gcc/rust/parse/rust-parse.h
@@ -25,6 +25,26 @@ along with GCC; see the file COPYING3. If not see
#include "expected.h"
namespace Rust {
+
+class ParseLifetimeParamError
+{
+};
+
+class ParseLifetimeError
+{
+};
+enum class ParseLoopLabelError
+{
+ NOT_LOOP_LABEL,
+ MISSING_COLON,
+};
+enum ParseSelfError
+{
+ SELF_PTR,
+ PARSING,
+ NOT_SELF,
+};
+
/* HACK: used to resolve the expression-or-statement problem at the end of a
* block by allowing either to be returned (technically). Tagged union would
* probably take up the same amount of space. */
@@ -95,12 +115,6 @@ struct ParseRestrictions
bool allow_close_after_expr_stmt = false;
};
-enum ParseSelfError
-{
- SELF_PTR,
- PARSING,
- NOT_SELF,
-};
// Parser implementation for gccrs.
// TODO: if updated to C++20, ManagedTokenSource would be useful as a concept
template <typename ManagedTokenSource> class Parser
@@ -148,7 +162,7 @@ public:
std::unique_ptr<AST::BlockExpr>
parse_block_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
- AST::LoopLabel label = AST::LoopLabel::error (),
+ tl::optional<AST::LoopLabel> = tl::nullopt,
location_t pratt_parsed_loc = UNKNOWN_LOCATION);
bool is_macro_rules_def (const_TokenPtr t);
@@ -277,7 +291,8 @@ private:
ParseFunction parsing_function, EndTokenPred is_end_token,
std::string error_msg = "failed to parse generic param in generic params")
-> std::vector<decltype (parsing_function ())>;
- AST::LifetimeParam parse_lifetime_param ();
+ tl::expected<AST::LifetimeParam, ParseLifetimeParamError>
+ parse_lifetime_param ();
std::vector<std::unique_ptr<AST::TypeParam>> parse_type_params ();
template <typename EndTokenPred>
std::vector<std::unique_ptr<AST::TypeParam>>
@@ -306,7 +321,8 @@ private:
std::vector<AST::Lifetime> parse_lifetime_bounds ();
template <typename EndTokenPred>
std::vector<AST::Lifetime> parse_lifetime_bounds (EndTokenPred is_end_token);
- AST::Lifetime parse_lifetime (bool allow_elided);
+ tl::expected<AST::Lifetime, ParseLifetimeError>
+ parse_lifetime (bool allow_elided);
AST::Lifetime lifetime_from_token (const_TokenPtr tok);
std::unique_ptr<AST::ExternalTypeItem>
parse_external_type_item (AST::Visibility vis, AST::AttrVec outer_attrs);
@@ -588,18 +604,18 @@ private:
location_t pratt_parsed_loc = UNKNOWN_LOCATION);
std::unique_ptr<AST::LoopExpr>
parse_loop_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
- AST::LoopLabel label = AST::LoopLabel::error (),
+ tl::optional<AST::LoopLabel> label = tl::nullopt,
location_t pratt_parsed_loc = UNKNOWN_LOCATION);
std::unique_ptr<AST::WhileLoopExpr>
parse_while_loop_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
- AST::LoopLabel label = AST::LoopLabel::error (),
+ tl::optional<AST::LoopLabel> label = tl::nullopt,
location_t pratt_parsed_loc = UNKNOWN_LOCATION);
std::unique_ptr<AST::WhileLetLoopExpr>
parse_while_let_loop_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
- AST::LoopLabel label = AST::LoopLabel::error ());
+ tl::optional<AST::LoopLabel> label = tl::nullopt);
std::unique_ptr<AST::ForLoopExpr>
parse_for_loop_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
- AST::LoopLabel label = AST::LoopLabel::error ());
+ tl::optional<AST::LoopLabel> label = tl::nullopt);
std::unique_ptr<AST::MatchExpr>
parse_match_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
location_t pratt_parsed_loc = UNKNOWN_LOCATION);
@@ -609,7 +625,8 @@ private:
std::unique_ptr<AST::Expr> parse_labelled_loop_expr (const_TokenPtr tok,
AST::AttrVec outer_attrs
= AST::AttrVec ());
- AST::LoopLabel parse_loop_label (const_TokenPtr tok);
+ tl::expected<AST::LoopLabel, ParseLoopLabelError>
+ parse_loop_label (const_TokenPtr tok);
std::unique_ptr<AST::AsyncBlockExpr>
parse_async_block_expr (AST::AttrVec outer_attrs = AST::AttrVec ());
std::unique_ptr<AST::GroupedExpr> parse_grouped_expr (AST::AttrVec outer_attrs
diff --git a/gcc/rust/resolve/rust-ast-resolve-base.h b/gcc/rust/resolve/rust-ast-resolve-base.h
index 0d497f8..ab74e84 100644
--- a/gcc/rust/resolve/rust-ast-resolve-base.h
+++ b/gcc/rust/resolve/rust-ast-resolve-base.h
@@ -27,6 +27,11 @@
namespace Rust {
namespace Resolver {
+inline void
+redefined_error (const rich_location &loc)
+{
+ rust_error_at (loc, "redefined multiple times");
+}
class ResolverBase : public AST::ASTVisitor
{
diff --git a/gcc/rust/resolve/rust-ast-resolve-expr.cc b/gcc/rust/resolve/rust-ast-resolve-expr.cc
index dc7f76d..8070fc1 100644
--- a/gcc/rust/resolve/rust-ast-resolve-expr.cc
+++ b/gcc/rust/resolve/rust-ast-resolve-expr.cc
@@ -471,7 +471,7 @@ ResolveExpr::visit (AST::BreakExpr &expr)
{
if (expr.has_label ())
{
- auto label = expr.get_label ().get_lifetime ();
+ auto label = expr.get_label_unchecked ().get_lifetime ();
if (label.get_lifetime_type () != AST::Lifetime::LifetimeType::NAMED)
{
rust_error_at (label.get_locus (),
@@ -486,8 +486,8 @@ ResolveExpr::visit (AST::BreakExpr &expr)
&resolved_node))
{
rust_error_at (label.get_locus (), ErrorCode::E0426,
- "use of undeclared label %qs in %<break%>",
- label.get_lifetime_name ().c_str ());
+ "use of undeclared label %qs",
+ label.as_string ().c_str ());
return;
}
resolver->insert_resolved_label (label.get_node_id (), resolved_node);
@@ -594,7 +594,7 @@ ResolveExpr::visit (AST::ContinueExpr &expr)
{
if (expr.has_label ())
{
- auto label = expr.get_label ();
+ auto label = expr.get_label_unchecked ();
if (label.get_lifetime_type () != AST::Lifetime::LifetimeType::NAMED)
{
rust_error_at (label.get_locus (),
@@ -608,9 +608,9 @@ ResolveExpr::visit (AST::ContinueExpr &expr)
label.get_lifetime_name ()),
&resolved_node))
{
- rust_error_at (expr.get_label ().get_locus (), ErrorCode::E0426,
- "use of undeclared label %qs in %<continue%>",
- label.get_lifetime_name ().c_str ());
+ rust_error_at (expr.get_label_unchecked ().get_locus (),
+ ErrorCode::E0426, "use of undeclared label %qs",
+ label.as_string ().c_str ());
return;
}
resolver->insert_resolved_label (label.get_node_id (), resolved_node);
diff --git a/gcc/rust/resolve/rust-ast-resolve-implitem.h b/gcc/rust/resolve/rust-ast-resolve-implitem.h
index 971bf8f..2081697 100644
--- a/gcc/rust/resolve/rust-ast-resolve-implitem.h
+++ b/gcc/rust/resolve/rust-ast-resolve-implitem.h
@@ -51,7 +51,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, type.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
}
@@ -67,7 +67,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, constant.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
}
@@ -84,7 +84,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, function.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
}
@@ -124,7 +124,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, function.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
mappings.insert_canonical_path (function.get_node_id (), cpath);
@@ -144,7 +144,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, constant.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
mappings.insert_canonical_path (constant.get_node_id (), cpath);
@@ -162,7 +162,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, type.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
mappings.insert_canonical_path (type.get_node_id (), cpath);
@@ -202,7 +202,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, function.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
NodeId current_module = resolver->peek_current_module_scope ();
@@ -221,7 +221,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, item.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
NodeId current_module = resolver->peek_current_module_scope ();
@@ -239,8 +239,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, type.get_locus ());
r.add_range (locus);
-
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
NodeId current_module = resolver->peek_current_module_scope ();
diff --git a/gcc/rust/resolve/rust-ast-resolve-stmt.cc b/gcc/rust/resolve/rust-ast-resolve-stmt.cc
index fefb522..bfba302 100644
--- a/gcc/rust/resolve/rust-ast-resolve-stmt.cc
+++ b/gcc/rust/resolve/rust-ast-resolve-stmt.cc
@@ -70,7 +70,7 @@ ResolveStmt::visit (AST::StaticItem &var)
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, var.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
ResolveType::go (var.get_type ());
diff --git a/gcc/rust/resolve/rust-ast-resolve-stmt.h b/gcc/rust/resolve/rust-ast-resolve-stmt.h
index 6c99d6a..d413a7c 100644
--- a/gcc/rust/resolve/rust-ast-resolve-stmt.h
+++ b/gcc/rust/resolve/rust-ast-resolve-stmt.h
@@ -63,7 +63,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, constant.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
ResolveType::go (constant.get_type ());
@@ -98,7 +98,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, struct_decl.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
NodeId scope_node_id = struct_decl.get_node_id ();
@@ -129,7 +129,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, enum_decl.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
NodeId scope_node_id = enum_decl.get_node_id ();
@@ -159,7 +159,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, item.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
// Done, no fields.
@@ -179,7 +179,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, item.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
for (auto &field : item.get_tuple_fields ())
@@ -205,7 +205,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, item.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
for (auto &field : item.get_struct_fields ())
@@ -231,7 +231,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, item.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
// Done, no fields.
@@ -252,7 +252,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, struct_decl.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
NodeId scope_node_id = struct_decl.get_node_id ();
@@ -288,7 +288,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, union_decl.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
NodeId scope_node_id = union_decl.get_node_id ();
@@ -324,7 +324,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, function.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
NodeId scope_node_id = function.get_node_id ();
diff --git a/gcc/rust/resolve/rust-ast-resolve-toplevel.h b/gcc/rust/resolve/rust-ast-resolve-toplevel.h
index 379ccab..f52fb8a 100644
--- a/gcc/rust/resolve/rust-ast-resolve-toplevel.h
+++ b/gcc/rust/resolve/rust-ast-resolve-toplevel.h
@@ -58,7 +58,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, module.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
NodeId current_module = resolver->peek_current_module_scope ();
@@ -88,7 +88,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, alias.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
NodeId current_module = resolver->peek_current_module_scope ();
@@ -110,7 +110,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, struct_decl.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
NodeId current_module = resolver->peek_current_module_scope ();
@@ -132,7 +132,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, enum_decl.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
resolver->push_new_module_scope (enum_decl.get_node_id ());
@@ -158,7 +158,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, item.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
mappings.insert_canonical_path (item.get_node_id (), cpath);
@@ -180,7 +180,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, item.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
mappings.insert_canonical_path (item.get_node_id (), cpath);
@@ -202,7 +202,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, item.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
mappings.insert_canonical_path (item.get_node_id (), cpath);
@@ -224,7 +224,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, item.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
mappings.insert_canonical_path (item.get_node_id (), cpath);
@@ -246,7 +246,7 @@ public:
= [&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, struct_decl.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
};
resolver->get_type_scope ().insert (path, struct_decl.get_node_id (),
@@ -277,7 +277,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, union_decl.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
NodeId current_module = resolver->peek_current_module_scope ();
@@ -297,7 +297,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, var.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
NodeId current_module = resolver->peek_current_module_scope ();
@@ -318,7 +318,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, constant.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
NodeId current_module = resolver->peek_current_module_scope ();
@@ -340,7 +340,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, function.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
NodeId current_module = resolver->peek_current_module_scope ();
@@ -388,7 +388,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, impl_block.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
for (auto &impl_item : impl_block.get_impl_items ())
@@ -408,7 +408,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, trait.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
for (auto &item : trait.get_trait_items ())
@@ -480,7 +480,7 @@ public:
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
rich_location r (line_table, extern_crate.get_locus ());
r.add_range (locus);
- rust_error_at (r, "defined multiple times");
+ redefined_error (r);
});
}
diff --git a/gcc/rust/resolve/rust-ast-resolve-type.cc b/gcc/rust/resolve/rust-ast-resolve-type.cc
index 5ab0c44..606141c 100644
--- a/gcc/rust/resolve/rust-ast-resolve-type.cc
+++ b/gcc/rust/resolve/rust-ast-resolve-type.cc
@@ -357,7 +357,7 @@ ResolveRelativeTypePath::go (AST::TypePath &path, NodeId &resolved_node_id)
{
rust_error_at (segment->get_locus (), ErrorCode::E0412,
"could not resolve type path %qs",
- segment->as_string ().c_str ());
+ segment->get_ident_segment ().as_string ().c_str ());
return false;
}
}
diff --git a/gcc/rust/resolve/rust-forever-stack.h b/gcc/rust/resolve/rust-forever-stack.h
index f390e38..cf02651 100644
--- a/gcc/rust/resolve/rust-forever-stack.h
+++ b/gcc/rust/resolve/rust-forever-stack.h
@@ -549,6 +549,7 @@ public:
ForeverStack ()
: root (Node (Rib (Rib::Kind::Normal), UNKNOWN_NODEID)),
lang_prelude (Node (Rib (Rib::Kind::Prelude), UNKNOWN_NODEID, root)),
+ extern_prelude (Node (Rib (Rib::Kind::Prelude), UNKNOWN_NODEID)),
cursor_reference (root)
{
rust_assert (root.is_root ());
@@ -671,7 +672,7 @@ public:
*/
template <typename S>
tl::optional<Rib::Definition> resolve_path (
- const std::vector<S> &segments,
+ const std::vector<S> &segments, bool has_opening_scope_resolution,
std::function<void (const S &, NodeId)> insert_segment_resolution);
// FIXME: Documentation
@@ -768,6 +769,10 @@ private:
* resolution
*/
Node lang_prelude;
+ /*
+ * The extern prelude, used for resolving external crates
+ */
+ Node extern_prelude;
std::reference_wrapper<Node> cursor_reference;
diff --git a/gcc/rust/resolve/rust-forever-stack.hxx b/gcc/rust/resolve/rust-forever-stack.hxx
index 885f282..993e2d4 100644
--- a/gcc/rust/resolve/rust-forever-stack.hxx
+++ b/gcc/rust/resolve/rust-forever-stack.hxx
@@ -20,6 +20,7 @@
#include "rust-ast.h"
#include "rust-diagnostics.h"
#include "rust-forever-stack.h"
+#include "rust-edition.h"
#include "rust-rib.h"
#include "rust-unwrap-segment.h"
#include "optional.h"
@@ -618,11 +619,24 @@ template <Namespace N>
template <typename S>
tl::optional<Rib::Definition>
ForeverStack<N>::resolve_path (
- const std::vector<S> &segments,
+ const std::vector<S> &segments, bool has_opening_scope_resolution,
std::function<void (const S &, NodeId)> insert_segment_resolution)
{
// TODO: What to do if segments.empty() ?
+ // handle paths with opening scopes
+ std::function<void (void)> cleanup_current = [] () {};
+ if (has_opening_scope_resolution)
+ {
+ Node *last_current = &cursor_reference.get ();
+ if (get_rust_edition () == Edition::E2015)
+ cursor_reference = root;
+ else
+ cursor_reference = extern_prelude;
+ cleanup_current
+ = [this, last_current] () { cursor_reference = *last_current; };
+ }
+
// if there's only one segment, we just use `get`
if (segments.size () == 1)
{
@@ -633,6 +647,7 @@ ForeverStack<N>::resolve_path (
lang_item.value ());
insert_segment_resolution (seg, seg_id);
+ cleanup_current ();
// TODO: does NonShadowable matter?
return Rib::Definition::NonShadowable (seg_id);
}
@@ -646,40 +661,44 @@ ForeverStack<N>::resolve_path (
if (res && !res->is_ambiguous ())
insert_segment_resolution (segments.back (), res->get_node_id ());
+ cleanup_current ();
return res;
}
std::reference_wrapper<Node> starting_point = cursor ();
- return find_starting_point (segments, starting_point,
- insert_segment_resolution)
- .and_then ([this, &segments, &starting_point, &insert_segment_resolution] (
- typename std::vector<S>::const_iterator iterator) {
- return resolve_segments (starting_point.get (), segments, iterator,
- insert_segment_resolution);
- })
- .and_then ([this, &segments, &insert_segment_resolution] (
- Node final_node) -> tl::optional<Rib::Definition> {
- // leave resolution within impl blocks to type checker
- if (final_node.rib.kind == Rib::Kind::TraitOrImpl)
- return tl::nullopt;
-
- auto &seg = unwrap_type_segment (segments.back ());
- std::string seg_name = seg.as_string ();
-
- // assuming this can't be a lang item segment
- tl::optional<Rib::Definition> res
- = resolve_final_segment (final_node, seg_name,
- seg.is_lower_self_seg ());
- // Ok we didn't find it in the rib, Lets try the prelude...
- if (!res)
- res = get_lang_prelude (seg_name);
-
- if (res && !res->is_ambiguous ())
- insert_segment_resolution (segments.back (), res->get_node_id ());
-
- return res;
- });
+ auto res
+ = find_starting_point (segments, starting_point, insert_segment_resolution)
+ .and_then (
+ [this, &segments, &starting_point, &insert_segment_resolution] (
+ typename std::vector<S>::const_iterator iterator) {
+ return resolve_segments (starting_point.get (), segments, iterator,
+ insert_segment_resolution);
+ })
+ .and_then ([this, &segments, &insert_segment_resolution] (
+ Node final_node) -> tl::optional<Rib::Definition> {
+ // leave resolution within impl blocks to type checker
+ if (final_node.rib.kind == Rib::Kind::TraitOrImpl)
+ return tl::nullopt;
+
+ auto &seg = unwrap_type_segment (segments.back ());
+ std::string seg_name = seg.as_string ();
+
+ // assuming this can't be a lang item segment
+ tl::optional<Rib::Definition> res
+ = resolve_final_segment (final_node, seg_name,
+ seg.is_lower_self_seg ());
+ // Ok we didn't find it in the rib, Lets try the prelude...
+ if (!res)
+ res = get_lang_prelude (seg_name);
+
+ if (res && !res->is_ambiguous ())
+ insert_segment_resolution (segments.back (), res->get_node_id ());
+
+ return res;
+ });
+ cleanup_current ();
+ return res;
}
template <Namespace N>
diff --git a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
index 7d32374..f743e1e 100644
--- a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
+++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
@@ -187,6 +187,9 @@ Late::visit (AST::SelfParam &param)
void
Late::visit (AST::BreakExpr &expr)
{
+ if (expr.has_label ())
+ resolve_label (expr.get_label_unchecked ().get_lifetime ());
+
if (expr.has_break_expr ())
{
auto &break_expr = expr.get_break_expr ();
@@ -213,6 +216,38 @@ Late::visit (AST::BreakExpr &expr)
}
void
+Late::visit (AST::LoopLabel &label)
+{
+ auto &lifetime = label.get_lifetime ();
+ ctx.labels.insert (Identifier (lifetime.as_string (), lifetime.get_locus ()),
+ lifetime.get_node_id ());
+}
+
+void
+Late::resolve_label (AST::Lifetime &lifetime)
+{
+ if (auto resolved = ctx.labels.get (lifetime.as_string ()))
+ {
+ if (resolved->get_node_id () != lifetime.get_node_id ())
+ ctx.map_usage (Usage (lifetime.get_node_id ()),
+ Definition (resolved->get_node_id ()));
+ }
+ else
+ rust_error_at (lifetime.get_locus (), ErrorCode::E0426,
+ "use of undeclared label %qs",
+ lifetime.as_string ().c_str ());
+}
+
+void
+Late::visit (AST::ContinueExpr &expr)
+{
+ if (expr.has_label ())
+ resolve_label (expr.get_label_unchecked ());
+
+ DefaultResolver::visit (expr);
+}
+
+void
Late::visit (AST::IdentifierExpr &expr)
{
// TODO: same thing as visit(PathInExpression) here?
@@ -307,8 +342,7 @@ Late::visit (AST::PathInExpression &expr)
return;
}
- auto resolved = ctx.resolve_path (expr.get_segments (), Namespace::Values,
- Namespace::Types);
+ auto resolved = ctx.resolve_path (expr, Namespace::Values, Namespace::Types);
if (!resolved)
{
@@ -340,13 +374,9 @@ Late::visit (AST::TypePath &type)
DefaultResolver::visit (type);
- // take care of only simple cases
- // TODO: remove this?
- rust_assert (!type.has_opening_scope_resolution_op ());
-
// this *should* mostly work
// TODO: make sure typepath-like path resolution (?) is working
- auto resolved = ctx.resolve_path (type.get_segments (), Namespace::Types);
+ auto resolved = ctx.resolve_path (type, Namespace::Types);
if (!resolved.has_value ())
{
@@ -394,8 +424,7 @@ Late::visit (AST::StructExprStruct &s)
visit_inner_attrs (s);
DefaultResolver::visit (s.get_struct_name ());
- auto resolved
- = ctx.resolve_path (s.get_struct_name ().get_segments (), Namespace::Types);
+ auto resolved = ctx.resolve_path (s.get_struct_name (), Namespace::Types);
ctx.map_usage (Usage (s.get_struct_name ().get_node_id ()),
Definition (resolved->get_node_id ()));
@@ -409,8 +438,7 @@ Late::visit (AST::StructExprStructBase &s)
DefaultResolver::visit (s.get_struct_name ());
visit (s.get_struct_base ());
- auto resolved
- = ctx.resolve_path (s.get_struct_name ().get_segments (), Namespace::Types);
+ auto resolved = ctx.resolve_path (s.get_struct_name (), Namespace::Types);
ctx.map_usage (Usage (s.get_struct_name ().get_node_id ()),
Definition (resolved->get_node_id ()));
@@ -427,8 +455,7 @@ Late::visit (AST::StructExprStructFields &s)
for (auto &field : s.get_fields ())
visit (field);
- auto resolved
- = ctx.resolve_path (s.get_struct_name ().get_segments (), Namespace::Types);
+ auto resolved = ctx.resolve_path (s.get_struct_name (), Namespace::Types);
ctx.map_usage (Usage (s.get_struct_name ().get_node_id ()),
Definition (resolved->get_node_id ()));
diff --git a/gcc/rust/resolve/rust-late-name-resolver-2.0.h b/gcc/rust/resolve/rust-late-name-resolver-2.0.h
index ac376b5..5703b15 100644
--- a/gcc/rust/resolve/rust-late-name-resolver-2.0.h
+++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.h
@@ -48,6 +48,8 @@ public:
void visit (AST::IdentifierExpr &) override;
void visit (AST::StructExprFieldIdentifier &) override;
void visit (AST::BreakExpr &) override;
+ void visit (AST::ContinueExpr &) override;
+ void visit (AST::LoopLabel &) override;
void visit (AST::PathInExpression &) override;
void visit (AST::TypePath &) override;
void visit (AST::Trait &) override;
@@ -61,6 +63,8 @@ public:
void visit (AST::ClosureExprInnerTyped &) override;
private:
+ void resolve_label (AST::Lifetime &lifetime);
+
/* Setup Rust's builtin types (u8, i32, !...) in the resolver */
void setup_builtin_types ();
diff --git a/gcc/rust/resolve/rust-name-resolution-context.h b/gcc/rust/resolve/rust-name-resolution-context.h
index ea81bde..84c0800 100644
--- a/gcc/rust/resolve/rust-name-resolution-context.h
+++ b/gcc/rust/resolve/rust-name-resolution-context.h
@@ -221,6 +221,7 @@ public:
template <typename S>
tl::optional<Rib::Definition> resolve_path (const std::vector<S> &segments,
+ bool has_opening_scope_resolution,
Namespace ns)
{
std::function<void (const S &, NodeId)> insert_segment_resolution
@@ -232,13 +233,17 @@ public:
switch (ns)
{
case Namespace::Values:
- return values.resolve_path (segments, insert_segment_resolution);
+ return values.resolve_path (segments, has_opening_scope_resolution,
+ insert_segment_resolution);
case Namespace::Types:
- return types.resolve_path (segments, insert_segment_resolution);
+ return types.resolve_path (segments, has_opening_scope_resolution,
+ insert_segment_resolution);
case Namespace::Macros:
- return macros.resolve_path (segments, insert_segment_resolution);
+ return macros.resolve_path (segments, has_opening_scope_resolution,
+ insert_segment_resolution);
case Namespace::Labels:
- return labels.resolve_path (segments, insert_segment_resolution);
+ return labels.resolve_path (segments, has_opening_scope_resolution,
+ insert_segment_resolution);
default:
rust_unreachable ();
}
@@ -246,19 +251,45 @@ public:
template <typename S, typename... Args>
tl::optional<Rib::Definition> resolve_path (const std::vector<S> &segments,
+ bool has_opening_scope_resolution,
Args... ns_args)
{
std::initializer_list<Namespace> namespaces = {ns_args...};
for (auto ns : namespaces)
{
- if (auto ret = resolve_path (segments, ns))
+ if (auto ret
+ = resolve_path (segments, has_opening_scope_resolution, ns))
return ret;
}
return tl::nullopt;
}
+ template <typename... Args>
+ tl::optional<Rib::Definition> resolve_path (const AST::SimplePath &path,
+ Args... ns_args)
+ {
+ return resolve_path (path.get_segments (),
+ path.has_opening_scope_resolution (), ns_args...);
+ }
+
+ template <typename... Args>
+ tl::optional<Rib::Definition> resolve_path (const AST::PathInExpression &path,
+ Args... ns_args)
+ {
+ return resolve_path (path.get_segments (), path.opening_scope_resolution (),
+ ns_args...);
+ }
+
+ template <typename... Args>
+ tl::optional<Rib::Definition> resolve_path (const AST::TypePath &path,
+ Args... ns_args)
+ {
+ return resolve_path (path.get_segments (),
+ path.has_opening_scope_resolution_op (), ns_args...);
+ }
+
private:
/* Map of "usage" nodes which have been resolved to a "definition" node */
std::map<Usage, Definition> resolved_nodes;
diff --git a/gcc/rust/rust-gcc.cc b/gcc/rust/rust-gcc.cc
index a6e8ea9..72aef08 100644
--- a/gcc/rust/rust-gcc.cc
+++ b/gcc/rust/rust-gcc.cc
@@ -1074,6 +1074,12 @@ arithmetic_or_logical_expression (ArithmeticOrLogicalOperator op, tree left,
if (left == error_mark_node || right == error_mark_node)
return error_mark_node;
+ // unwrap the const decls if set
+ if (TREE_CODE (left) == CONST_DECL)
+ left = DECL_INITIAL (left);
+ if (TREE_CODE (right) == CONST_DECL)
+ right = DECL_INITIAL (right);
+
/* We need to determine if we're doing floating point arithmetics of integer
arithmetics. */
bool floating_point = is_floating_point (left);
diff --git a/gcc/rust/typecheck/rust-hir-trait-resolve.cc b/gcc/rust/typecheck/rust-hir-trait-resolve.cc
index e4a61bd..e78c192 100644
--- a/gcc/rust/typecheck/rust-hir-trait-resolve.cc
+++ b/gcc/rust/typecheck/rust-hir-trait-resolve.cc
@@ -157,7 +157,13 @@ TraitResolver::resolve_path_to_trait (const HIR::TypePath &path,
}
auto resolved_item = mappings.lookup_hir_item (hid.value ());
- rust_assert (resolved_item.has_value ());
+ if (!resolved_item.has_value ())
+ {
+ rust_error_at (path.get_locus (),
+ "Failed to resolve trait by looking up hir node");
+ return false;
+ }
+
if (resolved_item.value ()->get_item_kind () != HIR::Item::ItemKind::Trait)
{
rich_location r (line_table, path.get_locus ());
@@ -228,7 +234,9 @@ TraitResolver::resolve_trait (HIR::Trait *trait_reference)
// The one exception is the implicit Self type of a trait
bool apply_sized = !is_self;
auto param_type
- = TypeResolveGenericParam::Resolve (*generic_param, apply_sized);
+ = TypeResolveGenericParam::Resolve (*generic_param, true,
+ apply_sized);
+
context->insert_type (generic_param->get_mappings (), param_type);
substitutions.push_back (
TyTy::SubstitutionParamMapping (typaram, param_type));
diff --git a/gcc/rust/typecheck/rust-hir-type-check-base.cc b/gcc/rust/typecheck/rust-hir-type-check-base.cc
index 34a726c..beee91e 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-base.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-base.cc
@@ -31,6 +31,16 @@ TypeCheckBase::TypeCheckBase ()
context (TypeCheckContext::get ())
{}
+void
+TypeCheckBase::ResolveGenericParams (
+ const std::vector<std::unique_ptr<HIR::GenericParam>> &generic_params,
+ std::vector<TyTy::SubstitutionParamMapping> &substitutions, bool is_foreign,
+ ABI abi)
+{
+ TypeCheckBase ctx;
+ ctx.resolve_generic_params (generic_params, substitutions, is_foreign, abi);
+}
+
static void
walk_types_to_constrain (std::set<HirId> &constrained_symbols,
const TyTy::SubstitutionArgumentMappings &constraints)
@@ -387,7 +397,8 @@ TypeCheckBase::parse_repr_options (const AST::AttrVec &attrs, location_t locus)
void
TypeCheckBase::resolve_generic_params (
const std::vector<std::unique_ptr<HIR::GenericParam>> &generic_params,
- std::vector<TyTy::SubstitutionParamMapping> &substitutions)
+ std::vector<TyTy::SubstitutionParamMapping> &substitutions, bool is_foreign,
+ ABI abi)
{
for (auto &generic_param : generic_params)
{
@@ -397,15 +408,18 @@ TypeCheckBase::resolve_generic_params (
auto lifetime_param
= static_cast<HIR::LifetimeParam &> (*generic_param);
auto lifetime = lifetime_param.get_lifetime ();
- rust_assert (lifetime.get_lifetime_type ()
- == AST::Lifetime::LifetimeType::NAMED);
context->get_lifetime_resolver ().insert_mapping (
context->intern_lifetime (lifetime));
}
-
break;
case HIR::GenericParam::GenericKind::CONST: {
+ if (is_foreign && abi != Rust::ABI::INTRINSIC)
+ {
+ rust_error_at (generic_param->get_locus (), ErrorCode::E0044,
+ "foreign items may not have const parameters");
+ }
+
auto &param
= static_cast<HIR::ConstGenericParam &> (*generic_param);
auto specified_type = TypeCheckType::Resolve (param.get_type ());
@@ -429,15 +443,31 @@ TypeCheckBase::resolve_generic_params (
break;
case HIR::GenericParam::GenericKind::TYPE: {
- auto param_type = TypeResolveGenericParam::Resolve (*generic_param);
+ if (is_foreign && abi != Rust::ABI::INTRINSIC)
+ {
+ rust_error_at (generic_param->get_locus (), ErrorCode::E0044,
+ "foreign items may not have type parameters");
+ }
+
+ auto param_type = TypeResolveGenericParam::Resolve (
+ *generic_param, false /*resolve_trait_bounds*/);
context->insert_type (generic_param->get_mappings (), param_type);
- substitutions.push_back (TyTy::SubstitutionParamMapping (
- static_cast<HIR::TypeParam &> (*generic_param), param_type));
+ auto &param = static_cast<HIR::TypeParam &> (*generic_param);
+ TyTy::SubstitutionParamMapping p (param, param_type);
+ substitutions.push_back (p);
}
break;
}
}
+
+ // now walk them to setup any specified type param bounds
+ for (auto &subst : substitutions)
+ {
+ auto pty = subst.get_param_ty ();
+ TypeResolveGenericParam::ApplyAnyTraitBounds (subst.get_generic_param (),
+ pty);
+ }
}
TyTy::TypeBoundPredicate
diff --git a/gcc/rust/typecheck/rust-hir-type-check-base.h b/gcc/rust/typecheck/rust-hir-type-check-base.h
index 8a1bf6f..580082a 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-base.h
+++ b/gcc/rust/typecheck/rust-hir-type-check-base.h
@@ -32,6 +32,11 @@ class TypeCheckBase
public:
virtual ~TypeCheckBase () {}
+ static void ResolveGenericParams (
+ const std::vector<std::unique_ptr<HIR::GenericParam>> &generic_params,
+ std::vector<TyTy::SubstitutionParamMapping> &substitutions, bool is_foreign,
+ ABI abi);
+
protected:
TypeCheckBase ();
@@ -57,7 +62,8 @@ protected:
void resolve_generic_params (
const std::vector<std::unique_ptr<HIR::GenericParam>> &generic_params,
- std::vector<TyTy::SubstitutionParamMapping> &substitutions);
+ std::vector<TyTy::SubstitutionParamMapping> &substitutions,
+ bool is_foreign = false, ABI abi = ABI::RUST);
TyTy::TypeBoundPredicate get_marker_predicate (LangItem::Kind item_type,
location_t locus);
diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.cc b/gcc/rust/typecheck/rust-hir-type-check-expr.cc
index b7fdc13..791795f 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-expr.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-expr.cc
@@ -1463,6 +1463,15 @@ TypeCheckExpr::visit (HIR::BorrowExpr &expr)
}
}
+ if (expr.is_raw_borrow ())
+ {
+ infered = new TyTy::PointerType (expr.get_mappings ().get_hirid (),
+ TyTy::TyVar (resolved_base->get_ref ()),
+ expr.get_mut ());
+
+ return;
+ }
+
infered = new TyTy::ReferenceType (expr.get_mappings ().get_hirid (),
TyTy::TyVar (resolved_base->get_ref ()),
expr.get_mut ());
diff --git a/gcc/rust/typecheck/rust-hir-type-check-implitem.cc b/gcc/rust/typecheck/rust-hir-type-check-implitem.cc
index a5ae54b..bc7f6dc 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-implitem.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-implitem.cc
@@ -73,44 +73,8 @@ TypeCheckTopLevelExternItem::visit (HIR::ExternalFunctionItem &function)
std::vector<TyTy::SubstitutionParamMapping> substitutions;
if (function.has_generics ())
{
- for (auto &generic_param : function.get_generic_params ())
- {
- switch (generic_param.get ()->get_kind ())
- {
- case HIR::GenericParam::GenericKind::LIFETIME:
- context->intern_and_insert_lifetime (
- static_cast<HIR::LifetimeParam &> (*generic_param)
- .get_lifetime ());
- // TODO: handle bounds
- break;
- case HIR::GenericParam::GenericKind::CONST:
- // FIXME: Skipping Lifetime and Const completely until better
- // handling.
- if (parent.get_abi () != Rust::ABI::INTRINSIC)
- {
- rust_error_at (function.get_locus (), ErrorCode::E0044,
- "foreign items may not have const parameters");
- }
- break;
-
- case HIR::GenericParam::GenericKind::TYPE: {
- if (parent.get_abi () != Rust::ABI::INTRINSIC)
- {
- rust_error_at (
- function.get_locus (), ErrorCode::E0044,
- "foreign items may not have type parameters");
- }
- auto param_type
- = TypeResolveGenericParam::Resolve (*generic_param);
- context->insert_type (generic_param->get_mappings (),
- param_type);
-
- substitutions.push_back (TyTy::SubstitutionParamMapping (
- static_cast<HIR::TypeParam &> (*generic_param), param_type));
- }
- break;
- }
- }
+ resolve_generic_params (function.get_generic_params (), substitutions,
+ true /*is_foreign*/, parent.get_abi ());
}
TyTy::RegionConstraints region_constraints;
@@ -200,128 +164,7 @@ void
TypeCheckTopLevelExternItem::visit (HIR::ExternalTypeItem &type)
{
rust_sorry_at (type.get_locus (), "extern types are not supported yet");
- // auto binder_pin = context->push_clean_lifetime_resolver ();
-
- // std::vector<TyTy::SubstitutionParamMapping> substitutions;
- // if (function.has_generics ())
- // {
- // for (auto &generic_param : function.get_generic_params ())
- // {
- // switch (generic_param.get ()->get_kind ())
- // {
- // case HIR::GenericParam::GenericKind::LIFETIME:
- // context->intern_and_insert_lifetime (
- // static_cast<HIR::LifetimeParam &> (*generic_param)
- // .get_lifetime ());
- // // TODO: handle bounds
- // break;
- // case HIR::GenericParam::GenericKind::CONST:
- // // FIXME: Skipping Lifetime and Const completely until better
- // // handling.
- // break;
-
- // case HIR::GenericParam::GenericKind::TYPE: {
- // auto param_type
- // = TypeResolveGenericParam::Resolve (generic_param.get ());
- // context->insert_type (generic_param->get_mappings (),
- // param_type);
-
- // substitutions.push_back (TyTy::SubstitutionParamMapping (
- // static_cast<HIR::TypeParam &> (*generic_param), param_type));
- // }
- // break;
- // }
- // }
- // }
-
- // TyTy::RegionConstraints region_constraints;
- // if (function.has_where_clause ())
- // {
- // for (auto &where_clause_item : function.get_where_clause ().get_items
- // ())
- // {
- // ResolveWhereClauseItem::Resolve (*where_clause_item.get (),
- // region_constraints);
- // }
- // }
-
- // TyTy::BaseType *ret_type = nullptr;
- // if (!function.has_return_type ())
- // ret_type
- // = TyTy::TupleType::get_unit_type (function.get_mappings ().get_hirid
- // ());
- // else
- // {
- // auto resolved
- // = TypeCheckType::Resolve (function.get_return_type ().get ());
- // if (resolved == nullptr)
- // {
- // rust_error_at (function.get_locus (),
- // "failed to resolve return type");
- // return;
- // }
-
- // ret_type = resolved->clone ();
- // ret_type->set_ref (
- // function.get_return_type ()->get_mappings ().get_hirid ());
- // }
-
- // std::vector<std::pair<HIR::Pattern *, TyTy::BaseType *> > params;
- // for (auto &param : function.get_function_params ())
- // {
- // // get the name as well required for later on
- // auto param_tyty = TypeCheckType::Resolve (param.get_type ().get ());
-
- // // these are implicit mappings and not used
- // auto crate_num = mappings->get_current_crate ();
- // Analysis::NodeMapping mapping (crate_num, mappings->get_next_node_id
- // (),
- // mappings->get_next_hir_id (crate_num),
- // UNKNOWN_LOCAL_DEFID);
-
- // HIR::IdentifierPattern *param_pattern
- // = new HIR::IdentifierPattern (mapping, param.get_param_name (),
- // UNDEF_LOCATION, false, Mutability::Imm,
- // std::unique_ptr<HIR::Pattern> (nullptr));
-
- // params.push_back (
- // std::pair<HIR::Pattern *, TyTy::BaseType *> (param_pattern,
- // param_tyty));
-
- // context->insert_type (param.get_mappings (), param_tyty);
-
- // // FIXME do we need error checking for patterns here?
- // // see https://github.com/Rust-GCC/gccrs/issues/995
- // }
-
- // uint8_t flags = TyTy::FnType::FNTYPE_IS_EXTERN_FLAG;
- // if (function.is_variadic ())
- // {
- // flags |= TyTy::FnType::FNTYPE_IS_VARADIC_FLAG;
- // if (parent.get_abi () != Rust::ABI::C)
- // {
- // rust_error_at (
- // function.get_locus (), ErrorCode::E0045,
- // "C-variadic function must have C or cdecl calling convention");
- // }
- // }
-
- // RustIdent ident{
- // CanonicalPath::new_seg (function.get_mappings ().get_nodeid (),
- // function.get_item_name ().as_string ()),
- // function.get_locus ()};
-
- // auto fnType = new TyTy::FnType (
- // function.get_mappings ().get_hirid (),
- // function.get_mappings ().get_defid (),
- // function.get_item_name ().as_string (), ident, flags, parent.get_abi (),
- // std::move (params), ret_type, std::move (substitutions),
- // TyTy::SubstitutionArgumentMappings::empty (
- // context->get_lifetime_resolver ().get_num_bound_regions ()),
- // region_constraints);
-
- // context->insert_type (function.get_mappings (), fnType);
- // resolved = fnType;
+ // TODO
}
TypeCheckImplItem::TypeCheckImplItem (
@@ -399,7 +242,7 @@ TypeCheckImplItem::visit (HIR::Function &function)
// add the synthetic self param at the front, this is a placeholder for
// compilation to know parameter names. The types are ignored but we
// reuse the HIR identifier pattern which requires it
- HIR::SelfParam &self_param = function.get_self_param ();
+ HIR::SelfParam &self_param = function.get_self_param_unchecked ();
// FIXME: which location should be used for Rust::Identifier for `self`?
std::unique_ptr<HIR::Pattern> self_pattern
= std::make_unique<HIR::IdentifierPattern> (
@@ -424,13 +267,21 @@ TypeCheckImplItem::visit (HIR::Function &function)
break;
case HIR::SelfParam::IMM_REF: {
- auto region = context->lookup_and_resolve_lifetime (
- self_param.get_lifetime ());
- if (!region.has_value ())
+ tl::optional<TyTy::Region> region;
+ if (self_param.has_lifetime ())
{
- rust_inform (self_param.get_locus (),
- "failed to resolve lifetime");
- region = TyTy::Region::make_anonymous (); // FIXME
+ region = context->lookup_and_resolve_lifetime (
+ self_param.get_lifetime ());
+ if (!region.has_value ())
+ {
+ rust_inform (self_param.get_locus (),
+ "failed to resolve lifetime");
+ return;
+ }
+ }
+ else
+ {
+ region = TyTy::Region::make_anonymous ();
}
self_type = new TyTy::ReferenceType (
self_param.get_mappings ().get_hirid (),
@@ -440,13 +291,21 @@ TypeCheckImplItem::visit (HIR::Function &function)
break;
case HIR::SelfParam::MUT_REF: {
- auto region = context->lookup_and_resolve_lifetime (
- self_param.get_lifetime ());
- if (!region.has_value ())
+ tl::optional<TyTy::Region> region;
+ if (self_param.has_lifetime ())
+ {
+ region = context->lookup_and_resolve_lifetime (
+ self_param.get_lifetime ());
+ if (!region.has_value ())
+ {
+ rust_error_at (self_param.get_locus (),
+ "failed to resolve lifetime");
+ return;
+ }
+ }
+ else
{
- rust_error_at (self_param.get_locus (),
- "failed to resolve lifetime");
- return;
+ region = TyTy::Region::make_anonymous ();
}
self_type = new TyTy::ReferenceType (
self_param.get_mappings ().get_hirid (),
diff --git a/gcc/rust/typecheck/rust-hir-type-check-path.cc b/gcc/rust/typecheck/rust-hir-type-check-path.cc
index 1fe39aae..5662da5 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-path.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-path.cc
@@ -336,7 +336,7 @@ TypeCheckExpr::resolve_root_path (HIR::PathInExpression &expr, size_t *offset,
TyTy::BaseType *lookup = nullptr;
if (!query_type (ref, &lookup))
{
- if (is_root)
+ if (is_root || root_tyty == nullptr)
{
rust_error_at (expr.get_locus (), ErrorCode::E0425,
"cannot find value %qs in this scope",
diff --git a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
index 3f9557a..bd13f7a 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
@@ -277,7 +277,15 @@ TypeCheckPattern::visit (HIR::StructPattern &pattern)
infered = pattern_ty;
TyTy::ADTType *adt = static_cast<TyTy::ADTType *> (infered);
- rust_assert (adt->number_of_variants () > 0);
+ if (adt->number_of_variants () == 0)
+ {
+ HIR::PathInExpression &path = pattern.get_path ();
+ const AST::SimplePath &sp = path.as_simple_path ();
+ rust_error_at (pattern.get_locus (), ErrorCode::E0574,
+ "expected struct, variant or union type, found enum %qs",
+ sp.as_string ().c_str ());
+ return;
+ }
TyTy::VariantDef *variant = adt->get_variants ().at (0);
if (adt->is_enum ())
@@ -285,7 +293,16 @@ TypeCheckPattern::visit (HIR::StructPattern &pattern)
HirId variant_id = UNKNOWN_HIRID;
bool ok = context->lookup_variant_definition (
pattern.get_path ().get_mappings ().get_hirid (), &variant_id);
- rust_assert (ok);
+ if (!ok)
+ {
+ HIR::PathInExpression &path = pattern.get_path ();
+ const AST::SimplePath &sp = path.as_simple_path ();
+ rust_error_at (
+ pattern.get_locus (), ErrorCode::E0574,
+ "expected struct, variant or union type, found enum %qs",
+ sp.as_string ().c_str ());
+ return;
+ }
ok = adt->lookup_variant_by_id (variant_id, &variant);
rust_assert (ok);
diff --git a/gcc/rust/typecheck/rust-hir-type-check-type.cc b/gcc/rust/typecheck/rust-hir-type-check-type.cc
index 54f50ec..6919093 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-type.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-type.cc
@@ -417,8 +417,13 @@ TypeCheckType::resolve_root_path (HIR::TypePath &path, size_t *offset,
TyTy::BaseType *lookup = nullptr;
if (!query_type (ref, &lookup))
{
- if (is_root)
- return new TyTy::ErrorType (path.get_mappings ().get_hirid ());
+ if (is_root || root_tyty == nullptr)
+ {
+ rust_error_at (seg->get_locus (),
+ "failed to resolve type path segment: %qs",
+ seg->as_string ().c_str ());
+ return new TyTy::ErrorType (path.get_mappings ().get_hirid ());
+ }
return root_tyty;
}
@@ -573,6 +578,7 @@ TypeCheckType::resolve_segments (
ignore_mandatory_trait_items);
if (candidates.size () == 0)
{
+ prev_segment->debug ();
rust_error_at (
seg->get_locus (),
"failed to resolve path segment using an impl Probe");
@@ -797,9 +803,10 @@ TypeCheckType::visit (HIR::ImplTraitType &type)
}
TyTy::ParamType *
-TypeResolveGenericParam::Resolve (HIR::GenericParam &param, bool apply_sized)
+TypeResolveGenericParam::Resolve (HIR::GenericParam &param,
+ bool resolve_trait_bounds, bool apply_sized)
{
- TypeResolveGenericParam resolver (apply_sized);
+ TypeResolveGenericParam resolver (apply_sized, resolve_trait_bounds);
switch (param.get_kind ())
{
case HIR::GenericParam::GenericKind::TYPE:
@@ -818,6 +825,14 @@ TypeResolveGenericParam::Resolve (HIR::GenericParam &param, bool apply_sized)
}
void
+TypeResolveGenericParam::ApplyAnyTraitBounds (HIR::TypeParam &param,
+ TyTy::ParamType *pty)
+{
+ TypeResolveGenericParam resolver (true, true);
+ resolver.apply_trait_bounds (param, pty);
+}
+
+void
TypeResolveGenericParam::visit (HIR::LifetimeParam &param)
{
// nothing to do
@@ -835,6 +850,19 @@ TypeResolveGenericParam::visit (HIR::TypeParam &param)
if (param.has_type ())
TypeCheckType::Resolve (param.get_type ());
+ resolved
+ = new TyTy::ParamType (param.get_type_representation ().as_string (),
+ param.get_locus (),
+ param.get_mappings ().get_hirid (), param, {});
+
+ if (resolve_trait_bounds)
+ apply_trait_bounds (param, resolved);
+}
+
+void
+TypeResolveGenericParam::apply_trait_bounds (HIR::TypeParam &param,
+ TyTy::ParamType *pty)
+{
std::unique_ptr<HIR::Type> implicit_self_bound = nullptr;
if (param.has_type_param_bounds ())
{
@@ -865,8 +893,6 @@ TypeResolveGenericParam::visit (HIR::TypeParam &param)
//
// We can only do this when we are not resolving the implicit Self for Sized
// itself
- rust_debug_loc (param.get_locus (), "apply_sized: %s",
- apply_sized ? "true" : "false");
if (apply_sized)
{
TyTy::TypeBoundPredicate sized_predicate
@@ -941,10 +967,8 @@ TypeResolveGenericParam::visit (HIR::TypeParam &param)
}
}
- resolved = new TyTy::ParamType (param.get_type_representation ().as_string (),
- param.get_locus (),
- param.get_mappings ().get_hirid (), param,
- specified_bounds);
+ // inherit them
+ pty->inherit_bounds (specified_bounds);
}
void
diff --git a/gcc/rust/typecheck/rust-hir-type-check-type.h b/gcc/rust/typecheck/rust-hir-type-check-type.h
index fc272e6..cc991b6 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-type.h
+++ b/gcc/rust/typecheck/rust-hir-type-check-type.h
@@ -91,20 +91,27 @@ class TypeResolveGenericParam : public TypeCheckBase
{
public:
static TyTy::ParamType *Resolve (HIR::GenericParam &param,
+ bool resolve_trait_bounds = true,
bool apply_sized = true);
+ static void ApplyAnyTraitBounds (HIR::TypeParam &param, TyTy::ParamType *pty);
+
protected:
void visit (HIR::TypeParam &param);
void visit (HIR::LifetimeParam &param);
void visit (HIR::ConstGenericParam &param);
+ void apply_trait_bounds (HIR::TypeParam &param, TyTy::ParamType *pty);
+
private:
- TypeResolveGenericParam (bool apply_sized)
- : TypeCheckBase (), resolved (nullptr), apply_sized (apply_sized)
+ TypeResolveGenericParam (bool apply_sized, bool resolve_trait_bounds)
+ : TypeCheckBase (), resolved (nullptr), apply_sized (apply_sized),
+ resolve_trait_bounds (resolve_trait_bounds)
{}
TyTy::ParamType *resolved;
bool apply_sized;
+ bool resolve_trait_bounds;
};
class ResolveWhereClauseItem : public TypeCheckBase
diff --git a/gcc/rust/typecheck/rust-hir-type-check.cc b/gcc/rust/typecheck/rust-hir-type-check.cc
index a198ad3..fbaf323 100644
--- a/gcc/rust/typecheck/rust-hir-type-check.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check.cc
@@ -165,36 +165,9 @@ TraitItemReference::get_type_from_fn (/*const*/ HIR::TraitItemFunc &fn) const
HIR::TraitFunctionDecl &function = fn.get_decl ();
if (function.has_generics ())
{
- for (auto &generic_param : function.get_generic_params ())
- {
- switch (generic_param.get ()->get_kind ())
- {
- case HIR::GenericParam::GenericKind::LIFETIME: {
- auto lifetime_param
- = static_cast<HIR::LifetimeParam &> (*generic_param);
-
- context->intern_and_insert_lifetime (
- lifetime_param.get_lifetime ());
- // TODO: Handle lifetime bounds
- }
- break;
- case HIR::GenericParam::GenericKind::CONST:
- // FIXME: Skipping Lifetime and Const completely until better
- // handling.
- break;
-
- case HIR::GenericParam::GenericKind::TYPE: {
- auto param_type
- = TypeResolveGenericParam::Resolve (*generic_param);
- context->insert_type (generic_param->get_mappings (),
- param_type);
-
- substitutions.push_back (TyTy::SubstitutionParamMapping (
- static_cast<HIR::TypeParam &> (*generic_param), param_type));
- }
- break;
- }
- }
+ TypeCheckBase::ResolveGenericParams (function.get_generic_params (),
+ substitutions, false /*is_foreign*/,
+ ABI::RUST);
}
if (function.has_where_clause ())
@@ -235,7 +208,7 @@ TraitItemReference::get_type_from_fn (/*const*/ HIR::TraitItemFunc &fn) const
// add the synthetic self param at the front, this is a placeholder
// for compilation to know parameter names. The types are ignored
// but we reuse the HIR identifier pattern which requires it
- HIR::SelfParam &self_param = function.get_self ();
+ HIR::SelfParam &self_param = function.get_self_unchecked ();
std::unique_ptr<HIR::Pattern> self_pattern
= std::make_unique<HIR::IdentifierPattern> (HIR::IdentifierPattern (
mapping, {"self"}, self_param.get_locus (), self_param.is_ref (),
diff --git a/gcc/rust/typecheck/rust-substitution-mapper.cc b/gcc/rust/typecheck/rust-substitution-mapper.cc
index 212ab3f..f0bd1f8 100644
--- a/gcc/rust/typecheck/rust-substitution-mapper.cc
+++ b/gcc/rust/typecheck/rust-substitution-mapper.cc
@@ -34,6 +34,15 @@ SubstMapper::Resolve (TyTy::BaseType *base, location_t locus,
HIR::GenericArgs *generics,
const std::vector<TyTy::Region> &regions)
{
+ if (!valid_type (base))
+ {
+ rich_location r (line_table, locus);
+ r.add_fixit_remove (generics->get_locus ());
+ rust_error_at (r, ErrorCode::E0109,
+ "generic arguments are not allowed for this type");
+ return base;
+ }
+
SubstMapper mapper (base->get_ref (), generics, regions, locus);
base->accept_vis (mapper);
rust_assert (mapper.resolved != nullptr);
@@ -47,6 +56,17 @@ SubstMapper::InferSubst (TyTy::BaseType *base, location_t locus)
}
bool
+SubstMapper::valid_type (TyTy::BaseType *base)
+{
+ bool is_fn = base->is<TyTy::FnType> ();
+ bool is_adt = base->is<TyTy::ADTType> ();
+ bool is_placeholder = base->is<TyTy::PlaceholderType> ();
+ bool is_projection = base->is<TyTy::ProjectionType> ();
+
+ return is_fn || is_adt || is_placeholder || is_projection;
+}
+
+bool
SubstMapper::have_generic_args () const
{
return generics != nullptr;
@@ -103,7 +123,12 @@ SubstMapper::visit (TyTy::ADTType &type)
void
SubstMapper::visit (TyTy::PlaceholderType &type)
{
- rust_assert (type.can_resolve ());
+ if (!type.can_resolve ())
+ {
+ resolved = &type;
+ return;
+ }
+
resolved = SubstMapper::Resolve (type.resolve (), locus, generics, regions);
}
diff --git a/gcc/rust/typecheck/rust-substitution-mapper.h b/gcc/rust/typecheck/rust-substitution-mapper.h
index bc54f56..32ab71c 100644
--- a/gcc/rust/typecheck/rust-substitution-mapper.h
+++ b/gcc/rust/typecheck/rust-substitution-mapper.h
@@ -37,6 +37,8 @@ public:
bool have_generic_args () const;
+ static bool valid_type (TyTy::BaseType *base);
+
void visit (TyTy::FnType &type) override;
void visit (TyTy::ADTType &type) override;
void visit (TyTy::PlaceholderType &type) override;
diff --git a/gcc/rust/typecheck/rust-type-util.cc b/gcc/rust/typecheck/rust-type-util.cc
index 4abfbae..c6c5b4b 100644
--- a/gcc/rust/typecheck/rust-type-util.cc
+++ b/gcc/rust/typecheck/rust-type-util.cc
@@ -22,10 +22,13 @@
#include "rust-hir-type-check-implitem.h"
#include "rust-hir-type-check-item.h"
#include "rust-hir-type-check.h"
+#include "rust-hir-type-check-type.h"
#include "rust-casts.h"
#include "rust-unify.h"
#include "rust-coercion.h"
#include "rust-hir-type-bounds.h"
+#include "rust-immutable-name-resolution-context.h"
+#include "options.h"
namespace Rust {
namespace Resolver {
@@ -34,6 +37,7 @@ bool
query_type (HirId reference, TyTy::BaseType **result)
{
auto &mappings = Analysis::Mappings::get ();
+ auto &resolver = *Resolver::get ();
TypeCheckContext *context = TypeCheckContext::get ();
if (context->query_in_progress (reference))
@@ -91,6 +95,39 @@ query_type (HirId reference, TyTy::BaseType **result)
HIR::ImplBlock *impl = impl_block_by_type.value ();
rust_debug_loc (impl->get_locus (), "resolved impl block type {%u} to",
reference);
+
+ // this could be recursive to the root type
+ if (impl->has_type ())
+ {
+ HIR::Type &ty = impl->get_type ();
+ NodeId ref_node_id = UNKNOWN_NODEID;
+ NodeId ast_node_id = ty.get_mappings ().get_nodeid ();
+
+ if (flag_name_resolution_2_0)
+ {
+ auto &nr_ctx = Resolver2_0::ImmutableNameResolutionContext::get ()
+ .resolver ();
+
+ // assign the ref_node_id if we've found something
+ nr_ctx.lookup (ast_node_id)
+ .map (
+ [&ref_node_id] (NodeId resolved) { ref_node_id = resolved; });
+ }
+ else if (!resolver.lookup_resolved_name (ast_node_id, &ref_node_id))
+ resolver.lookup_resolved_type (ast_node_id, &ref_node_id);
+
+ if (ref_node_id != UNKNOWN_NODEID)
+ {
+ tl::optional<HirId> hid
+ = mappings.lookup_node_to_hir (ref_node_id);
+ if (hid.has_value () && context->query_in_progress (hid.value ()))
+ {
+ context->query_completed (reference);
+ return false;
+ }
+ }
+ }
+
*result = TypeCheckItem::ResolveImplBlockSelf (*impl);
context->query_completed (reference);
return true;
diff --git a/gcc/rust/typecheck/rust-typecheck-context.cc b/gcc/rust/typecheck/rust-typecheck-context.cc
index f02e484..9112b99 100644
--- a/gcc/rust/typecheck/rust-typecheck-context.cc
+++ b/gcc/rust/typecheck/rust-typecheck-context.cc
@@ -514,7 +514,16 @@ TypeCheckContext::lookup_lifetime (const HIR::Lifetime &lifetime) const
{
if (lifetime.get_lifetime_type () == AST::Lifetime::NAMED)
{
- rust_assert (lifetime.get_name () != "static");
+ if (lifetime.get_name () == "static")
+ {
+ rich_location r (line_table, lifetime.get_locus ());
+ r.add_fixit_insert_after (lifetime.get_locus (),
+ "static is a reserved lifetime name");
+ rust_error_at (r, ErrorCode::E0262,
+ "invalid lifetime parameter name: %qs",
+ lifetime.get_name ().c_str ());
+ return tl::nullopt;
+ }
const auto name = lifetime.get_name ();
auto it = lifetime_name_interner.find (name);
if (it == lifetime_name_interner.end ())
diff --git a/gcc/rust/typecheck/rust-tyty-subst.cc b/gcc/rust/typecheck/rust-tyty-subst.cc
index 95f18b9..bdb6474 100644
--- a/gcc/rust/typecheck/rust-tyty-subst.cc
+++ b/gcc/rust/typecheck/rust-tyty-subst.cc
@@ -28,8 +28,8 @@
namespace Rust {
namespace TyTy {
-SubstitutionParamMapping::SubstitutionParamMapping (
- const HIR::TypeParam &generic, ParamType *param)
+SubstitutionParamMapping::SubstitutionParamMapping (HIR::TypeParam &generic,
+ ParamType *param)
: generic (generic), param (param)
{}
@@ -66,8 +66,8 @@ SubstitutionParamMapping::get_param_ty () const
return param;
}
-const HIR::TypeParam &
-SubstitutionParamMapping::get_generic_param () const
+HIR::TypeParam &
+SubstitutionParamMapping::get_generic_param ()
{
return generic;
}
diff --git a/gcc/rust/typecheck/rust-tyty-subst.h b/gcc/rust/typecheck/rust-tyty-subst.h
index 3f0b912..e6ed1fc 100644
--- a/gcc/rust/typecheck/rust-tyty-subst.h
+++ b/gcc/rust/typecheck/rust-tyty-subst.h
@@ -44,7 +44,7 @@ class SubstitutionArgumentMappings;
class SubstitutionParamMapping
{
public:
- SubstitutionParamMapping (const HIR::TypeParam &generic, ParamType *param);
+ SubstitutionParamMapping (HIR::TypeParam &generic, ParamType *param);
SubstitutionParamMapping (const SubstitutionParamMapping &other);
@@ -59,7 +59,7 @@ public:
const ParamType *get_param_ty () const;
- const HIR::TypeParam &get_generic_param () const;
+ HIR::TypeParam &get_generic_param ();
// this is used for the backend to override the HirId ref of the param to
// what the concrete type is for the rest of the context
@@ -76,7 +76,7 @@ public:
bool need_substitution () const;
private:
- const HIR::TypeParam &generic;
+ HIR::TypeParam &generic;
ParamType *param;
};
diff --git a/gcc/rust/typecheck/rust-tyty-variance-analysis.cc b/gcc/rust/typecheck/rust-tyty-variance-analysis.cc
index 1aba576..38f9d52 100644
--- a/gcc/rust/typecheck/rust-tyty-variance-analysis.cc
+++ b/gcc/rust/typecheck/rust-tyty-variance-analysis.cc
@@ -238,7 +238,7 @@ GenericTyVisitorCtx::process_type (ADTType &ty)
first_lifetime = lookup_or_add_type (ty.get_orig_ref ());
first_type = first_lifetime + ty.get_used_arguments ().get_regions ().size ();
- for (const auto &param : ty.get_substs ())
+ for (auto &param : ty.get_substs ())
param_names.push_back (
param.get_generic_param ().get_type_representation ().as_string ());
diff --git a/gcc/rust/util/expected.h b/gcc/rust/util/expected.h
index a9e3bc2..07ba877 100644
--- a/gcc/rust/util/expected.h
+++ b/gcc/rust/util/expected.h
@@ -212,10 +212,8 @@ template <typename E>
throw std::forward<E>(e);
#else
(void)e;
-#ifdef _MSC_VER
gcc_unreachable();
#endif
-#endif
}
#ifndef TL_TRAITS_MUTEX
@@ -2437,4 +2435,4 @@ void swap(expected<T, E> &lhs,
}
} // namespace tl
-#endif \ No newline at end of file
+#endif
diff --git a/gcc/simplify-rtx.cc b/gcc/simplify-rtx.cc
index fe007bc..88d31a7 100644
--- a/gcc/simplify-rtx.cc
+++ b/gcc/simplify-rtx.cc
@@ -6465,14 +6465,16 @@ simplify_context::simplify_relational_operation_1 (rtx_code code,
case LEU:
/* (eq (popcount x) (const_int 0)) -> (eq x (const_int 0)). */
return simplify_gen_relational (EQ, mode, GET_MODE (XEXP (op0, 0)),
- XEXP (op0, 0), const0_rtx);
+ XEXP (op0, 0),
+ CONST0_RTX (GET_MODE (XEXP (op0, 0))));
case NE:
case GT:
case GTU:
/* (ne (popcount x) (const_int 0)) -> (ne x (const_int 0)). */
return simplify_gen_relational (NE, mode, GET_MODE (XEXP (op0, 0)),
- XEXP (op0, 0), const0_rtx);
+ XEXP (op0, 0),
+ CONST0_RTX (GET_MODE (XEXP (op0, 0))));
default:
break;
@@ -6657,15 +6659,20 @@ simplify_const_relational_operation (enum rtx_code code,
we do not know the signedness of the operation on either the left or
the right hand side of the comparison. */
- if (INTEGRAL_MODE_P (mode) && trueop1 != const0_rtx
+ if (INTEGRAL_MODE_P (mode)
+ && trueop1 != CONST0_RTX (mode)
&& (code == EQ || code == NE)
- && ! ((REG_P (op0) || CONST_INT_P (trueop0))
- && (REG_P (op1) || CONST_INT_P (trueop1)))
+ && ! ((REG_P (op0)
+ || CONST_SCALAR_INT_P (trueop0)
+ || CONST_VECTOR_P (trueop0))
+ && (REG_P (op1)
+ || CONST_SCALAR_INT_P (trueop1)
+ || CONST_VECTOR_P (trueop1)))
&& (tem = simplify_binary_operation (MINUS, mode, op0, op1)) != 0
/* We cannot do this if tem is a nonzero address. */
&& ! nonzero_address_p (tem))
return simplify_const_relational_operation (signed_condition (code),
- mode, tem, const0_rtx);
+ mode, tem, CONST0_RTX (mode));
if (! HONOR_NANS (mode) && code == ORDERED)
return const_true_rtx;
diff --git a/gcc/target.h b/gcc/target.h
index 2bf35e2..c9c7b52 100644
--- a/gcc/target.h
+++ b/gcc/target.h
@@ -274,7 +274,24 @@ enum type_context_kind {
TCTX_EXCEPTIONS,
/* Capturing objects of type T by value in a closure. */
- TCTX_CAPTURE_BY_COPY
+ TCTX_CAPTURE_BY_COPY,
+
+ /* Objects of type T appearing in OpenMP map clause. */
+ TCTX_OMP_MAP,
+
+ /* Objects of type T appearing in OpenMP target region
+ without explicit map. */
+ TCTX_OMP_MAP_IMP_REF,
+
+ /* Objects of type T appearing in OpenMP private clause. */
+ TCTX_OMP_PRIVATE,
+
+ /* Objects of type T appearing in OpenMP firstprivate clause. */
+ TCTX_OMP_FIRSTPRIVATE,
+
+ /* Objects of type T appearing in OpenMP device clauses. */
+ TCTX_OMP_DEVICE_ADDR
+
};
enum poly_value_estimate_kind
@@ -343,6 +360,24 @@ mode_can_transfer_bits (machine_mode mode)
return true;
}
+/* Return true if OpenMP context types. */
+
+inline bool
+omp_type_context (type_context_kind context)
+{
+ switch (context)
+ {
+ case TCTX_OMP_MAP:
+ case TCTX_OMP_MAP_IMP_REF:
+ case TCTX_OMP_PRIVATE:
+ case TCTX_OMP_FIRSTPRIVATE:
+ case TCTX_OMP_DEVICE_ADDR:
+ return true;
+ default:
+ return false;
+ }
+}
+
#ifdef GCC_TM_H
#ifndef CUMULATIVE_ARGS_MAGIC
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 25aca79..c99e6df 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,221 @@
+2025-04-08 Richard Sandiford <richard.sandiford@arm.com>
+
+ * gcc.dg/guality/pr36728-3.c: Update XFAILs for aarch64.
+ * gcc.dg/guality/pr41353-1.c: Likewise.
+ * gcc.dg/guality/pr54693-2.c: Likewise.
+ * gcc.dg/guality/pr68860-1.c: Likewise.
+ * gcc.dg/guality/pr68860-2.c: Likewise.
+ * gcc.dg/guality/sra-1.c: Likewise.
+ * gcc.dg/guality/vla-1.c: Likewise.
+
+2025-04-08 Richard Sandiford <richard.sandiford@arm.com>
+
+ * gcc.dg/vect/pr99102.c: Force SVE when forcing the vector length.
+
+2025-04-08 Martin Uecker <uecker@tugraz.at>
+
+ PR c/119612
+ * gcc.dg/gnu23-tag-6.c: New test.
+ * gcc.dg/pr119612.c: New test.
+
+2025-04-08 Tobias Burnus <tburnus@baylibre.com>
+
+ PR middle-end/119662
+ * c-c++-common/gomp/append-args-interop.c: Update for fixed
+ GOMP_interop call.
+ * g++.dg/gomp/append-args-8.C: Likewise.
+ * gfortran.dg/gomp/append-args-interop.f90: Likewise.
+
+2025-04-08 Jason Merrill <jason@redhat.com>
+
+ PR c++/117530
+ * g++.dg/cpp2a/lambda-uneval27.C: New test.
+
+2025-04-08 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/119594
+ * gcc.dg/pr119594.c: New test.
+
+2025-04-08 Owen Avery <powerboat9.gamer@gmail.com>
+
+ * rust/compile/macros/mbe/macro6.rs: Remove call of undefined
+ function.
+ * rust/compile/nr2/exclude: Remove macros/mbe/macro6.rs.
+
+2025-04-08 Owen Avery <powerboat9.gamer@gmail.com>
+
+ * rust/compile/issue-2812.rs: Avoid multiple definition error.
+ * rust/compile/nr2/exclude: Remove issue-2812.rs.
+
+2025-04-08 Matty Kuhn <matty.kuhn.1@gmail.com>
+
+ * rust/compile/feature.rs: add an invalid empty feature to produce an error
+
+2025-04-08 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * rust/compile/invalid_label_name.rs: Adapt test to nr2.
+
+2025-04-08 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * rust/compile/nr2/exclude: Remove test.
+
+2025-04-08 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * rust/compile/undeclared_label.rs: Change test
+ expected string.
+
+2025-04-08 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * rust/compile/nr2/exclude: Remove test from exclusion list.
+
+2025-04-08 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * rust/compile/nr2/exclude: Remove passing test.
+
+2025-04-08 Owen Avery <powerboat9.gamer@gmail.com>
+
+ * rust/compile/nr2/compile.exp: Avoid absolute paths in output,
+ adjust phrasing of output, and avoid false XPASS output when
+ tests are run in parallel.
+
+2025-04-08 Owen Avery <powerboat9.gamer@gmail.com>
+
+ * rust/compile/nr2/exclude: Remove entry.
+
+2025-04-08 Philip Herron <herron.philip@googlemail.com>
+
+ * rust/compile/issue-3647.rs: New test.
+
+2025-04-08 Arthur Cohen <arthur.cohen@embecosm.com>
+
+ * rust/compile/min_specialization1.rs: New test.
+
+2025-04-08 Philip Herron <herron.philip@googlemail.com>
+
+ * rust/compile/nr2/exclude: nr2 is missing type path error
+ * rust/compile/issue-3643.rs: New test.
+ * rust/compile/issue-3646.rs: New test.
+ * rust/compile/issue-3654.rs: New test.
+ * rust/compile/issue-3663.rs: New test.
+ * rust/compile/issue-3671.rs: New test.
+
+2025-04-08 Philip Herron <herron.philip@googlemail.com>
+
+ * rust/compile/issue-3667.rs: New test.
+
+2025-04-08 Philip Herron <herron.philip@googlemail.com>
+
+ * rust/compile/issue-3656.rs: New test.
+
+2025-04-08 Philip Herron <herron.philip@googlemail.com>
+
+ * rust/compile/issue-3625.rs: New test.
+
+2025-04-08 Philip Herron <herron.philip@googlemail.com>
+
+ * rust/compile/issue-3648.rs: New test.
+
+2025-04-08 Philip Herron <herron.philip@googlemail.com>
+
+ * rust/compile/issue-3657.rs: New test.
+
+2025-04-08 Philip Herron <herron.philip@googlemail.com>
+
+ * rust/compile/issue-3665.rs: New test.
+
+2025-04-08 Owen Avery <powerboat9.gamer@gmail.com>
+
+ * rust/compile/nr2/exclude: Remove entries.
+
+2025-04-08 Ryutaro Okada <1015ryu88@gmail.com>
+
+ * rust/compile/enum_discriminant1.rs: New test.
+
+2025-04-08 Tejas Belagod <tejas.belagod@arm.com>
+
+ * gcc.target/aarch64/sve/gomp/gomp.exp: Test driver.
+ * gcc.target/aarch64/sve/gomp/target-device.c: New test.
+ * gcc.target/aarch64/sve/gomp/target-link.c: Likewise.
+ * gcc.target/aarch64/sve/gomp/target.c: Likewise.
+
+2025-04-08 Jin Ma <jinma@linux.alibaba.com>
+
+ * gcc.target/riscv/rvv/xtheadvector/vsext.c: New test.
+ * gcc.target/riscv/rvv/xtheadvector/vzext.c: New test.
+
+2025-04-07 Jason Merrill <jason@redhat.com>
+
+ PR c++/119652
+ * g++.dg/cpp2a/constinit20.C: New test.
+
+2025-04-07 Thomas Schwinge <tschwinge@baylibre.com>
+
+ * gcc.target/nvptx/alloca-2-O0_-mfake-ptx-alloca.c: Adjust.
+
+2025-04-07 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/118924
+ * g++.dg/tree-ssa/pr118924.C: New test.
+
+2025-04-07 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/119640
+ * gcc.dg/vect/pr119640.c: New testcase.
+
+2025-04-07 Christophe Lyon <christophe.lyon@linaro.org>
+
+ PR target/119556
+ * gcc.target/arm/short-vfp-1.c: Improve dg directives.
+
+2025-04-07 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/119614
+ * g++.dg/opt/pr119613.C: Change { c || c++11 } in obviously C++ only
+ test to just c++11.
+ * g++.dg/opt/pr119614.C: New test.
+
+2025-04-07 Richard Sandiford <richard.sandiford@arm.com>
+ Richard Biener <rguenther@suse.de>
+
+ * gcc.target/aarch64/popcnt-le-1.c: Account for commutativity of TST.
+ * gcc.target/aarch64/popcnt-le-3.c: Likewise AND.
+ * gcc.target/aarch64/pr100056.c: Revert previous patch.
+ * gcc.target/aarch64/sve/pred-not-gen-1.c: Likewise.
+ * gcc.target/aarch64/sve/pred-not-gen-4.c: Likewise.
+ * gcc.target/aarch64/sve/var_stride_2.c: Likewise.
+ * gcc.target/aarch64/sve/var_stride_4.c: Likewise.
+
+2025-04-06 Iain Sandoe <iain@sandoe.co.uk>
+
+ * lib/cobol.exp: Simplify the setting of COBOL_UNDER_TEST.
+
+2025-04-06 Patrick Palka <ppalka@redhat.com>
+
+ PR c++/118626
+ * g++.dg/cpp2a/class-deduction-alias25a.C: New test.
+
+2025-04-06 Patrick Palka <ppalka@redhat.com>
+
+ PR c++/118626
+ * g++.dg/cpp2a/class-deduction-alias25.C: New test.
+
+2025-04-05 Patrick Palka <ppalka@redhat.com>
+
+ PR c++/118249
+ * g++.dg/cpp0x/constexpr-reinterpret2.C: Expect error at
+ call site of the non-constexpr functions.
+ * g++.dg/cpp23/constexpr-nonlit12.C: Likewise.
+ * g++.dg/cpp0x/constexpr-ref14.C: New test.
+
+2025-04-05 Iain Sandoe <iain@sandoe.co.uk>
+
+ * lib/cobol.exp: Conditionally add a path for libgcobol.spec.
+
+2025-04-05 Jason Merrill <jason@redhat.com>
+
+ PR c++/118629
+ * g++.dg/cpp0x/lambda/lambda-__func__3.C: New test.
+
2025-04-04 Nathaniel Shead <nathanieloshead@gmail.com>
PR c++/119564
diff --git a/gcc/testsuite/c-c++-common/gomp/append-args-interop.c b/gcc/testsuite/c-c++-common/gomp/append-args-interop.c
index 1211450..e9b1ed4 100644
--- a/gcc/testsuite/c-c++-common/gomp/append-args-interop.c
+++ b/gcc/testsuite/c-c++-common/gomp/append-args-interop.c
@@ -39,6 +39,6 @@ test (int *a, int *b)
return x;
}
-/* { dg-final { scan-tree-dump "__builtin_GOMP_interop \\(D\.\[0-9\]+, 2, interopobjs\.\[0-9\]+, tgt_tgtsync\.\[0-9\]+," "gimple" } } */
-/* { dg-final { scan-tree-dump "__builtin_GOMP_interop \\(D\.\[0-9\]+, 0, 0B, 0B, 0B, 0, 0B, 2, interopobjs\.\[0-9\]+," "gimple" } } */
+/* { dg-final { scan-tree-dump "__builtin_GOMP_interop \\(D\.\[0-9\]+, 2, &interopobjs\.\[0-9\]+, &tgt_tgtsync\.\[0-9\]+," "gimple" } } */
+/* { dg-final { scan-tree-dump "__builtin_GOMP_interop \\(D\.\[0-9\]+, 0, 0B, 0B, 0B, 0, 0B, 2, &interopobjs\.\[0-9\]+," "gimple" } } */
/* { dg-final { scan-tree-dump "repl1 \\(obj1, interop\.\[0-9\]+, interop\.\[0-9\]+\\)" "gimple" } } */
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ref14.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ref14.C
new file mode 100644
index 0000000..f201afb
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ref14.C
@@ -0,0 +1,21 @@
+// PR c++/118249
+// { dg-do compile { target c++11 } }
+
+template <int I>
+void f() { }
+
+template <int N>
+struct array {
+ constexpr int size() const { return N; }
+};
+
+extern array<10>& outer;
+
+struct C {
+ array<10> inner;
+
+ void g() {
+ f<outer.size()>(); // OK
+ f<inner.size()>(); // was error: use of 'this' in a constant expression
+ }
+};
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-reinterpret2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-reinterpret2.C
index 1bc2a8f..52328bc 100644
--- a/gcc/testsuite/g++.dg/cpp0x/constexpr-reinterpret2.C
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-reinterpret2.C
@@ -17,5 +17,5 @@ bar ()
return ((void **) &s)[0]; // { dg-error "reinterpret_cast" }
}
-constexpr auto x = foo ();
-constexpr auto y = bar ();
+constexpr auto x = foo (); // { dg-error "called in a constant expression" }
+constexpr auto y = bar (); // { dg-error "called in a constant expression" }
diff --git a/gcc/testsuite/g++.dg/cpp23/constexpr-nonlit12.C b/gcc/testsuite/g++.dg/cpp23/constexpr-nonlit12.C
index 8f003b8..b104b16 100644
--- a/gcc/testsuite/g++.dg/cpp23/constexpr-nonlit12.C
+++ b/gcc/testsuite/g++.dg/cpp23/constexpr-nonlit12.C
@@ -19,6 +19,6 @@ void
g ()
{
constexpr int i = 42;
- constexpr auto a1 = fn0 (&i);
+ constexpr auto a1 = fn0 (&i); // { dg-error "called in a constant expression" }
constexpr auto a2 = fn1 (i); // { dg-error "called in a constant expression" }
}
diff --git a/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias25.C b/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias25.C
new file mode 100644
index 0000000..37ab932
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias25.C
@@ -0,0 +1,19 @@
+// PR c++/118626
+// { dg-do compile { target c++20 } }
+
+template<long> struct _Nth_type;
+
+template<class _Up>
+struct variant {
+ template<class _Tp> static constexpr long __accepted_index = 0;
+ template<long _Np> using __to_type = _Nth_type<_Np>;
+ template<class _Tp> using __accepted_type = __to_type<__accepted_index<_Tp>>;
+ template<class = __accepted_type<_Up>> variant(_Up);
+};
+
+template<class _Tp>
+struct Node { Node(_Tp); };
+
+template<class R> using Tree = variant<Node<R>>;
+using type = decltype(Tree{Node{42}});
+using type = Tree<int>;
diff --git a/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias25a.C b/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias25a.C
new file mode 100644
index 0000000..74ef1e4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias25a.C
@@ -0,0 +1,19 @@
+// PR c++/118626
+// { dg-do compile { target c++20 } }
+
+template<long> struct _Nth_type { using type = _Nth_type; };
+
+template<class _Up>
+struct variant {
+ template<class _Tp> static constexpr long __accepted_index = 0;
+ template<long _Np> using __to_type = typename _Nth_type<_Np>::type;
+ template<class _Tp, int = sizeof(_Tp)> using __accepted_type = __to_type<__accepted_index<_Tp>>;
+ template<class = __accepted_type<_Up>> variant(_Up);
+};
+
+template<class _Tp>
+struct Node { Node(_Tp); };
+
+template<class R> using Tree = variant<Node<R>>;
+using type = decltype(Tree{Node{42}});
+using type = Tree<int>;
diff --git a/gcc/testsuite/g++.dg/cpp2a/constinit20.C b/gcc/testsuite/g++.dg/cpp2a/constinit20.C
new file mode 100644
index 0000000..9b04391
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/constinit20.C
@@ -0,0 +1,18 @@
+// PR c++/119652
+// { dg-do compile { target c++20 } }
+
+struct __shared_count {
+ constexpr __shared_count() {}
+ ~__shared_count();
+ int _M_pi = 0;
+};
+struct shared_ptr {
+ __shared_count _M_refcount;
+};
+struct A {
+ A() = default;
+ shared_ptr m;
+};
+constinit A a;
+constinit A b {};
+constinit A c = {};
diff --git a/gcc/testsuite/g++.dg/cpp2a/lambda-uneval27.C b/gcc/testsuite/g++.dg/cpp2a/lambda-uneval27.C
new file mode 100644
index 0000000..941fe63
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/lambda-uneval27.C
@@ -0,0 +1,10 @@
+// PR c++/117530
+// { dg-do compile { target c++20 } }
+
+template <class> struct A;
+template <class T> using B = decltype([]() -> A<T>::X { return 0; });
+template <class T> struct A {
+ typedef int X;
+ typedef B<T> U;
+};
+B<short> b;
diff --git a/gcc/testsuite/g++.dg/gomp/append-args-8.C b/gcc/testsuite/g++.dg/gomp/append-args-8.C
index 379c767..3052c5b 100644
--- a/gcc/testsuite/g++.dg/gomp/append-args-8.C
+++ b/gcc/testsuite/g++.dg/gomp/append-args-8.C
@@ -82,11 +82,11 @@ test (int *a, int *b)
/* { dg-final { scan-tree-dump-times "__builtin_omp_set_default_device \\(D\.\[0-9\]+\\);" 2 "gimple" } } */
/* { dg-final { scan-tree-dump-times "D\.\[0-9\]+ = __builtin_omp_get_mapped_ptr \\(a, D\.\[0-9\]+\\);" 1 "gimple" } } */
-/* { dg-final { scan-tree-dump-times "__builtin_GOMP_interop \\(D\.\[0-9\]+, 1, interopobjs\.\[0-9\], tgt_tgtsync\.\[0-9\]+, pref_type.2, 0, 0B, 0, 0B, 0, 0B\\);" 1 "gimple" } } */
+/* { dg-final { scan-tree-dump-times "__builtin_GOMP_interop \\(D\.\[0-9\]+, 1, &interopobjs\.\[0-9\], &tgt_tgtsync\.\[0-9\]+, &pref_type.2, 0, 0B, 0, 0B, 0, 0B\\);" 1 "gimple" } } */
/* { dg-final { scan-tree-dump-times "repl2<int\\*, int\\*, omp_interop_t> \\(b, D\.\[0-9\]+, obj1, interop\.\[0-9\]+\\);" 1 "gimple" } } */
-/* { dg-final { scan-tree-dump-times "__builtin_GOMP_interop \\(D\.\[0-9\]+, 0, 0B, 0B, 0B, 0, 0B, 1, interopobjs\.\[0-9\]+, 0, 0B\\);" 1 "gimple" } } */
+/* { dg-final { scan-tree-dump-times "__builtin_GOMP_interop \\(D\.\[0-9\]+, 0, 0B, 0B, 0B, 0, 0B, 1, &interopobjs\.\[0-9\]+, 0, 0B\\);" 1 "gimple" } } */
-/* { dg-final { scan-tree-dump-times "__builtin_GOMP_interop \\(-5, 0, 0B, 0B, 0B, 0, 0B, 3, interopobjs\.\[0-9\]+, 0, 0B\\);" 1 "gimple" } } */
+/* { dg-final { scan-tree-dump-times "__builtin_GOMP_interop \\(-5, 0, 0B, 0B, 0B, 0, 0B, 3, &interopobjs\.\[0-9\]+, 0, 0B\\);" 1 "gimple" } } */
/* { dg-final { scan-tree-dump-times "repl3<int\\*, omp_interop_t> \\(a, interop\.\[0-9\]+, interop\.\[0-9\]+, interop\.\[0-9\]+, 1, 2, \"abc\"\\);" 1 "gimple" } } */
-/* { dg-final { scan-tree-dump-times "__builtin_GOMP_interop \\(-5, 3, interopobjs\.\[0-9\]+, tgt_tgtsync\.\[0-9\]+, pref_type\.\[0-9\]+, 0, 0B, 0, 0B, 0, 0B\\);" 1 "gimple" } } */
+/* { dg-final { scan-tree-dump-times "__builtin_GOMP_interop \\(-5, 3, &interopobjs\.\[0-9\]+, &tgt_tgtsync\.\[0-9\]+, &pref_type\.\[0-9\]+, 0, 0B, 0, 0B, 0, 0B\\);" 1 "gimple" } } */
diff --git a/gcc/testsuite/g++.dg/opt/pr119613.C b/gcc/testsuite/g++.dg/opt/pr119613.C
index 432a30c..2ced2e8 100644
--- a/gcc/testsuite/g++.dg/opt/pr119613.C
+++ b/gcc/testsuite/g++.dg/opt/pr119613.C
@@ -1,5 +1,5 @@
// PR middle-end/119613
-// { dg-do compile { target { musttail && { c || c++11 } } } }
+// { dg-do compile { target { musttail && c++11 } } }
// { dg-options "-O0" }
struct S { S () {} };
diff --git a/gcc/testsuite/g++.dg/opt/pr119614.C b/gcc/testsuite/g++.dg/opt/pr119614.C
new file mode 100644
index 0000000..cb73fc3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/pr119614.C
@@ -0,0 +1,30 @@
+// PR tree-optimization/119614
+// { dg-do compile { target musttail } }
+// { dg-options "-O2" }
+
+struct S {} b;
+char *foo ();
+int e, g;
+void bar ();
+void corge (S);
+
+[[gnu::noinline]] char *
+baz ()
+{
+ bar ();
+ return 0;
+}
+
+const char *
+qux ()
+{
+ if (e)
+ {
+ S a = b;
+ corge (a);
+ if (g)
+ return 0;
+ [[gnu::musttail]] return baz ();
+ }
+ return foo ();
+}
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr118924.C b/gcc/testsuite/g++.dg/tree-ssa/pr118924.C
new file mode 100644
index 0000000..c95eaca
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tree-ssa/pr118924.C
@@ -0,0 +1,29 @@
+/* { dg-do run } */
+/* { dg-options "-std=c++17 -O2" } */
+
+template <int Size> struct Vector {
+ int m_data[Size];
+ Vector(int, int, int) {}
+};
+enum class E { POINTS, LINES, TRIANGLES };
+
+__attribute__((noipa))
+void getName(E type) {
+ static E check = E::POINTS;
+ if (type == check)
+ check = (E)((int)check + 1);
+ else
+ __builtin_abort ();
+}
+
+int main() {
+ int arr[]{0, 1, 2};
+ for (auto dim : arr) {
+ Vector<3> localInvs(1, 1, 1);
+ localInvs.m_data[dim] = 8;
+ }
+ E types[] = {E::POINTS, E::LINES, E::TRIANGLES};
+ for (auto primType : types)
+ getName(primType);
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/gnu23-tag-6.c b/gcc/testsuite/gcc.dg/gnu23-tag-6.c
new file mode 100644
index 0000000..b28c7b3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gnu23-tag-6.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-std=gnu23" } */
+
+int f(int n)
+{
+ struct foo { struct { char (*x)[n]; }; } a;
+ {
+ struct foo { struct { char (*x)[n]; }; } b = a;
+ }
+}
+
+int g(int n)
+{
+ struct foo { struct { char (*x)[n]; }; } a;
+ {
+ struct foo { struct { char (*x)[n]; }; } *b = &a;
+ }
+}
+
+int h(int n)
+{
+ struct foo { struct { struct bar { char (*x)[n]; }* p; }; } a;
+ {
+ struct foo { struct { struct bar { char (*x)[n]; }* p; }; } *b = &a;
+ }
+}
+
diff --git a/gcc/testsuite/gcc.dg/guality/pr36728-3.c b/gcc/testsuite/gcc.dg/guality/pr36728-3.c
index 4700d50..589009b 100644
--- a/gcc/testsuite/gcc.dg/guality/pr36728-3.c
+++ b/gcc/testsuite/gcc.dg/guality/pr36728-3.c
@@ -30,7 +30,7 @@ foo (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7)
/* { dg-final { gdb-test 14 "arg5" "5" } } */
/* { dg-final { gdb-test 14 "arg6" "6" } } */
/* { dg-final { gdb-test 14 "arg7" "30" } } */
-/* { dg-final { gdb-test 14 "y" "2" } } */
+/* { dg-final { gdb-test 14 "y" "2" { xfail { aarch64*-*-* && { any-opts "-O3" } } } } } */
/* { dg-final { gdb-test 16 "arg1" "1" { target { ! "s390*-*-*" } } } } */
/* { dg-final { gdb-test 16 "arg2" "2" { target { ! "s390*-*-*" } } } } */
/* { dg-final { gdb-test 16 "arg3" "3" } } */
diff --git a/gcc/testsuite/gcc.dg/guality/pr41353-1.c b/gcc/testsuite/gcc.dg/guality/pr41353-1.c
index 6639a52..ead9d89 100644
--- a/gcc/testsuite/gcc.dg/guality/pr41353-1.c
+++ b/gcc/testsuite/gcc.dg/guality/pr41353-1.c
@@ -22,7 +22,7 @@ f2 (int i, int j)
{
j += i;
/* { dg-final { gdb-test .+4 "i" "37" } } */
- /* { dg-final { gdb-test .+3 "j" "28 + 37" { xfail { no-opts "-O0" } } } } */
+ /* { dg-final { gdb-test .+3 "j" "28 + 37" { xfail { { ! aarch64-*-* } && { no-opts "-O0" } } } } } */
int i1 = 2 * i; /* { dg-final { gdb-test .+2 "i1" "2 * 37" } } */
int i2 = 3 * i; /* { dg-final { gdb-test .+1 "i2" "3 * 37" } } */
return j;
diff --git a/gcc/testsuite/gcc.dg/guality/pr54693-2.c b/gcc/testsuite/gcc.dg/guality/pr54693-2.c
index 7a0ae73..229ef0e 100644
--- a/gcc/testsuite/gcc.dg/guality/pr54693-2.c
+++ b/gcc/testsuite/gcc.dg/guality/pr54693-2.c
@@ -18,7 +18,7 @@ foo (int x, int y, int z)
while (x > 3 && y > 3 && z > 3)
{ /* { dg-final { gdb-test .+2 "i" "v + 1" } } */
/* { dg-final { gdb-test .+1 "x" "10 - i" { xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" } } } } } */
- bar (i); /* { dg-final { gdb-test . "y" "20 - 2 * i" { xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" } } } } } */
+ bar (i); /* { dg-final { gdb-test . "y" "20 - 2 * i" { xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" "-Os" } } } } } */
/* { dg-final { gdb-test .-1 "z" "30 - 3 * i" { xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" "-Os" } } } } } */
i++, x--, y -= 2, z -= 3;
}
diff --git a/gcc/testsuite/gcc.dg/guality/pr68860-1.c b/gcc/testsuite/gcc.dg/guality/pr68860-1.c
index 8c8d835..96d3b43 100644
--- a/gcc/testsuite/gcc.dg/guality/pr68860-1.c
+++ b/gcc/testsuite/gcc.dg/guality/pr68860-1.c
@@ -31,7 +31,7 @@ foo (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7, int a
/* { dg-final { gdb-test 14 "arg6" "6" } } */
/* { dg-final { gdb-test 14 "arg7" "30" } } */
/* { dg-final { gdb-test 14 "arg8" "7" } } */
-/* { dg-final { gdb-test 14 "y" "2" } } */
+/* { dg-final { gdb-test 14 "y" "2" { xfail { aarch64*-*-* && { any-opts "-O3" } } } } } */
/* { dg-final { gdb-test 16 "arg1" "1" { target { ! "s390*-*-*" } } } } */
/* { dg-final { gdb-test 16 "arg2" "2" { target { ! "s390*-*-*" } } } } */
/* { dg-final { gdb-test 16 "arg3" "3" } } */
diff --git a/gcc/testsuite/gcc.dg/guality/pr68860-2.c b/gcc/testsuite/gcc.dg/guality/pr68860-2.c
index 070efbc..a18a04e 100644
--- a/gcc/testsuite/gcc.dg/guality/pr68860-2.c
+++ b/gcc/testsuite/gcc.dg/guality/pr68860-2.c
@@ -31,7 +31,7 @@ foo (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7, int a
/* { dg-final { gdb-test 14 "arg6" "6" } } */
/* { dg-final { gdb-test 14 "arg7" "30" } } */
/* { dg-final { gdb-test 14 "arg8" "7" } } */
-/* { dg-final { gdb-test 14 "y" "2" } } */
+/* { dg-final { gdb-test 14 "y" "2" { xfail { aarch64*-*-* && { any-opts "-O3" } } } } } */
/* { dg-final { gdb-test 16 "arg1" "1" { target { ! "s390*-*-*" } } } } */
/* { dg-final { gdb-test 16 "arg2" "2" { target { ! "s390*-*-*" } } } } */
/* { dg-final { gdb-test 16 "arg3" "3" } } */
diff --git a/gcc/testsuite/gcc.dg/guality/sra-1.c b/gcc/testsuite/gcc.dg/guality/sra-1.c
index c0d1cf6..9d4cafbf 100644
--- a/gcc/testsuite/gcc.dg/guality/sra-1.c
+++ b/gcc/testsuite/gcc.dg/guality/sra-1.c
@@ -39,7 +39,7 @@ f3 (int k)
struct B a = { 4, k + 6 };
asm ("" : "+r" (a.i));
a.j++;
- bar (a.i); /* { dg-final { gdb-test .+1 "a.i" "4" { xfail { aarch64*-*-* && { { any-opts "-Og" "-O2" "-O3" } && { ! { any-opts "-fno-fat-lto-objects" } } } } } } } */
+ bar (a.i); /* { dg-final { gdb-test .+1 "a.i" "4" { xfail { aarch64*-*-* && { any-opts "-Og" "-fno-fat-lto-objects" } } } } } */
bar (a.j); /* { dg-final { gdb-test . "a.j" "14" { xfail { aarch64*-*-* && { any-opts "-Og" "-fno-fat-lto-objects" } } } } } */
return a.i + a.j;
}
diff --git a/gcc/testsuite/gcc.dg/guality/vla-1.c b/gcc/testsuite/gcc.dg/guality/vla-1.c
index 264b9f3..f44474e 100644
--- a/gcc/testsuite/gcc.dg/guality/vla-1.c
+++ b/gcc/testsuite/gcc.dg/guality/vla-1.c
@@ -20,8 +20,8 @@ f1 (int i)
int __attribute__((noinline))
f2 (int i)
{
- short a[i * 2 + 7]; /* { dg-final { gdb-test .+1 "i" "5" } } */
- bar (a); /* { dg-final { gdb-test . "sizeof (a)" "17 * sizeof (short)" } } */
+ short a[i * 2 + 7]; /* { dg-final { gdb-test .+1 "i" "5" { xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" } } } } } */
+ bar (a); /* { dg-final { gdb-test . "sizeof (a)" "17 * sizeof (short)" { xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" } } } } } */
return a[i + 4];
}
diff --git a/gcc/testsuite/gcc.dg/pr119594.c b/gcc/testsuite/gcc.dg/pr119594.c
new file mode 100644
index 0000000..5d1cb37
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr119594.c
@@ -0,0 +1,32 @@
+/* PR rtl-optimization/119594 */
+/* { dg-do run } */
+/* { dg-options "-Os -fno-dce -fno-tree-dce -fno-tree-dse" } */
+
+int a, b;
+static unsigned c = -1;
+
+void
+foo (int e)
+{
+ a = a ^ e;
+}
+
+void
+bar (long e)
+{
+ foo (e >> 1);
+}
+
+int
+main ()
+{
+ int g[2];
+ for (int h = 0; h < 2; h++)
+ g[h] = -1;
+ for (; b; b++)
+ ;
+ g[1] = 0;
+ bar (c);
+ if (!a)
+ __builtin_abort ();
+}
diff --git a/gcc/testsuite/gcc.dg/pr119612.c b/gcc/testsuite/gcc.dg/pr119612.c
new file mode 100644
index 0000000..82bc5d9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr119612.c
@@ -0,0 +1,9 @@
+/* PR c/119612
+ * { dg-do compile }
+ * { dg-options "-std=gnu23" }
+ * */
+
+int n = 3;
+void a(struct { char (*p)[n]; } *); /* { dg-warning "anonymous struct" } */
+void b(struct { char (*p)[n]; } *); /* { dg-warning "anonymous struct" } */
+
diff --git a/gcc/testsuite/gcc.dg/vect/pr119640.c b/gcc/testsuite/gcc.dg/vect/pr119640.c
new file mode 100644
index 0000000..8872817
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr119640.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-funswitch-loops" } */
+
+int save, mask_nbits;
+
+void execute(long imm)
+{
+ long shift = 0;
+ int destReg[4];
+ for (unsigned i = 0; i < 4; i++)
+ {
+ if (imm)
+ shift = 1ULL << mask_nbits;
+ destReg[i] = shift;
+ save = destReg[0];
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/vect/pr99102.c b/gcc/testsuite/gcc.dg/vect/pr99102.c
index 071741f..fcbf036 100644
--- a/gcc/testsuite/gcc.dg/vect/pr99102.c
+++ b/gcc/testsuite/gcc.dg/vect/pr99102.c
@@ -1,5 +1,5 @@
/* { dg-additional-options "-O2 -ftree-vectorize -fno-vect-cost-model -fdump-tree-vect-details" } */
-/* { dg-additional-options "-msve-vector-bits=256" { target aarch64_sve256_hw } } */
+/* { dg-additional-options "-march=armv8-a+sve -msve-vector-bits=256" { target aarch64_sve256_hw } } */
long a[44];
short d, e = -7;
__attribute__((noipa)) void b(char f, short j, short k, unsigned l) {
diff --git a/gcc/testsuite/gcc.target/aarch64/popcnt-le-1.c b/gcc/testsuite/gcc.target/aarch64/popcnt-le-1.c
index b4141da..843fdac 100644
--- a/gcc/testsuite/gcc.target/aarch64/popcnt-le-1.c
+++ b/gcc/testsuite/gcc.target/aarch64/popcnt-le-1.c
@@ -8,7 +8,7 @@
/*
** le32:
** sub w([0-9]+), w0, #1
-** tst w0, w\1
+** tst (?:w0, w\1|w\1, w0)
** cset w0, eq
** ret
*/
@@ -20,7 +20,7 @@ unsigned le32 (const unsigned int a) {
/*
** gt32:
** sub w([0-9]+), w0, #1
-** tst w0, w\1
+** tst (?:w0, w\1|w\1, w0)
** cset w0, ne
** ret
*/
diff --git a/gcc/testsuite/gcc.target/aarch64/popcnt-le-3.c b/gcc/testsuite/gcc.target/aarch64/popcnt-le-3.c
index b811e6f..3b558e9 100644
--- a/gcc/testsuite/gcc.target/aarch64/popcnt-le-3.c
+++ b/gcc/testsuite/gcc.target/aarch64/popcnt-le-3.c
@@ -8,7 +8,7 @@
/*
** le16:
** sub w([0-9]+), w0, #1
-** and w([0-9]+), w0, w\1
+** and w([0-9]+), (?:w0, w\1|w\1, w0)
** tst w\2, 65535
** cset w0, eq
** ret
@@ -21,7 +21,7 @@ unsigned le16 (const unsigned short a) {
/*
** gt16:
** sub w([0-9]+), w0, #1
-** and w([0-9]+), w0, w\1
+** and w([0-9]+), (?:w0, w\1|w\1, w0)
** tst w\2, 65535
** cset w0, ne
** ret
diff --git a/gcc/testsuite/gcc.target/aarch64/pr100056.c b/gcc/testsuite/gcc.target/aarch64/pr100056.c
index 0b77824..70499772 100644
--- a/gcc/testsuite/gcc.target/aarch64/pr100056.c
+++ b/gcc/testsuite/gcc.target/aarch64/pr100056.c
@@ -1,7 +1,9 @@
/* PR target/100056 */
/* { dg-do compile } */
/* { dg-options "-O2" } */
-/* { dg-final { scan-assembler-not {\t[us]bfiz\tw[0-9]+, w[0-9]+, 11} } } */
+/* { dg-final { scan-assembler-not {\t[us]bfiz\tw[0-9]+, w[0-9]+, 11} { xfail *-*-* } } } */
+/* { dg-final { scan-assembler-times {\t[us]bfiz\tw[0-9]+, w[0-9]+, 11} 2 } } */
+/* { dg-final { scan-assembler-times {\tadd\tw[0-9]+, w[0-9]+, w[0-9]+, uxtb\n} 2 } } */
int
or_shift_u8 (unsigned char i)
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/gomp/gomp.exp b/gcc/testsuite/gcc.target/aarch64/sve/gomp/gomp.exp
new file mode 100644
index 0000000..376985d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sve/gomp/gomp.exp
@@ -0,0 +1,46 @@
+# Copyright (C) 2006-2025 Free Software Foundation, Inc.
+#
+# This file is part of GCC.
+#
+# GCC is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GCC is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# GCC testsuite that uses the `dg.exp' driver.
+
+# Exit immediately if this isn't an AArch64 target.
+if {![istarget aarch64*-*-*] } then {
+ return
+}
+
+# Load support procs.
+load_lib gcc-dg.exp
+
+# Initialize `dg'.
+dg-init
+
+if ![check_effective_target_fopenmp] {
+ return
+}
+
+if { [check_effective_target_aarch64_sve] } {
+ set sve_flags ""
+} else {
+ set sve_flags "-march=armv8.2-a+sve"
+}
+
+# Main loop.
+dg-runtest [lsort [find $srcdir/$subdir *.c]] "$sve_flags -fopenmp" ""
+
+# All done.
+dg-finish
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/gomp/target-device.c b/gcc/testsuite/gcc.target/aarch64/sve/gomp/target-device.c
new file mode 100644
index 0000000..75dd39b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sve/gomp/target-device.c
@@ -0,0 +1,201 @@
+/* { dg-do compile } */
+/* { dg-options "-msve-vector-bits=256 -fopenmp -O2" } */
+
+#include <arm_sve.h>
+
+#define N __ARM_FEATURE_SVE_BITS
+
+int64_t __attribute__ ((noipa))
+target_device_ptr_vla (svbool_t vp, svint32_t *vptr)
+{
+
+ int a[N], b[N], c[N];
+ svint32_t va, vb, vc;
+ int64_t res;
+ int i;
+
+#pragma omp parallel for
+ for (i = 0; i < N; i++)
+ {
+ b[i] = i;
+ c[i] = i + 1;
+ }
+/* { dg-error {SVE type 'svint32_t \*' not allowed in 'target' device clauses} "" { target *-*-* } .+1 } */
+#pragma omp target data use_device_ptr (vptr) map (to: b, c)
+/* { dg-error {SVE type 'svint32_t \*' not allowed in 'target' device clauses} "" { target *-*-* } .+1 } */
+#pragma omp target is_device_ptr (vptr) map (to: b, c) map (from: res)
+ for (i = 0; i < 8; i++)
+ {
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ vb = *vptr;
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+2 } */
+ /* { dg-error "cannot reference 'svbool_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ vc = svld1_s32 (vp, c);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ va = svadd_s32_z (vp, vb, vc);
+ res = svaddv_s32 (svptrue_b32 (), va);
+ }
+
+ return res;
+}
+
+int64_t __attribute__ ((noipa))
+target_device_addr_vla (svbool_t vp, svint32_t *vptr)
+{
+
+ int a[N], b[N], c[N];
+ svint32_t va, vb, vc;
+ int64_t res;
+ int i;
+
+#pragma omp parallel for
+ for (i = 0; i < N; i++)
+ {
+ b[i] = i;
+ c[i] = i + 1;
+ }
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'target' device clauses" "" { target *-*-* } .+1 } */
+#pragma omp target data use_device_addr (vb) map (to: b, c)
+/* { dg-error {SVE type 'svint32_t \*' not allowed in 'target' device clauses} "" { target *-*-* } .+1 } */
+#pragma omp target is_device_ptr (vptr) map (to: b, c) map (from: res)
+ for (i = 0; i < 8; i++)
+ {
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ vb = *vptr;
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+2 } */
+ /* { dg-error "cannot reference 'svbool_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ vc = svld1_s32 (vp, c);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ va = svadd_s32_z (vp, vb, vc);
+ res = svaddv_s32 (svptrue_b32 (), va);
+ }
+
+ return res;
+}
+
+int64_t __attribute__ ((noipa))
+target_has_device_addr_vla (svbool_t vp, svint32_t *vptr)
+{
+
+ int a[N], b[N], c[N];
+ svint32_t va, vb, vc;
+ int64_t res;
+ int i;
+
+#pragma omp parallel for
+ for (i = 0; i < N; i++)
+ {
+ b[i] = i;
+ c[i] = i + 1;
+ }
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'target' device clauses" "" { target *-*-* } .+1 } */
+#pragma omp target data use_device_addr (vb) map (to: b, c)
+/* { dg-error "SVE type 'svint32_t' not allowed in 'target' device clauses" "" { target *-*-* } .+1 } */
+#pragma omp target has_device_addr (vb) map (to: b, c) map (from: res)
+ for (i = 0; i < 8; i++)
+ {
+ /* { dg-error "cannot reference 'svbool_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ vb = svld1_s32 (vp, b);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ vc = svld1_s32 (vp, c);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ va = svadd_s32_z (vp, vb, vc);
+ res = svaddv_s32 (svptrue_b32 (), va);
+ }
+
+ return res;
+}
+
+#define FIXED_ATTR __attribute__ ((arm_sve_vector_bits (N)))
+
+typedef __SVInt32_t v8si FIXED_ATTR;
+typedef svbool_t v8bi FIXED_ATTR;
+
+int64_t __attribute__ ((noipa))
+target_device_ptr_vls (v8bi vp, v8si *vptr)
+{
+
+ int a[N], b[N], c[N];
+ v8si va, vb, vc;
+ int64_t res;
+ int i;
+
+#pragma omp parallel for
+ for (i = 0; i < N; i++)
+ {
+ b[i] = i;
+ c[i] = i + 1;
+ }
+
+#pragma omp target data use_device_ptr (vptr) map (to: b, c)
+#pragma omp target is_device_ptr (vptr) map (to: b, c) map (from: res)
+ for (i = 0; i < 8; i++)
+ {
+ vb = *vptr;
+ vc = svld1_s32 (vp, c);
+ va = svadd_s32_z (vp, vb, vc);
+ res = svaddv_s32 (svptrue_b32 (), va);
+ }
+
+ return res;
+}
+
+int64_t __attribute__ ((noipa))
+target_device_addr_vls (v8bi vp, v8si *vptr)
+{
+
+ int a[N], b[N], c[N];
+ v8si va, vb, vc;
+ int64_t res;
+ int i;
+
+#pragma omp parallel for
+ for (i = 0; i < N; i++)
+ {
+ b[i] = i;
+ c[i] = i + 1;
+ }
+
+#pragma omp target data use_device_addr (vb) map (to: b, c)
+#pragma omp target is_device_ptr (vptr) map (to: b, c) map (from: res)
+ for (i = 0; i < 8; i++)
+ {
+ vb = *vptr;
+ vc = svld1_s32 (vp, c);
+ va = svadd_s32_z (vp, vb, vc);
+ res = svaddv_s32 (svptrue_b32 (), va);
+ }
+
+ return res;
+}
+
+int64_t __attribute__ ((noipa))
+target_has_device_addr_vls (v8bi vp, v8si *vptr)
+{
+
+ int a[N], b[N], c[N];
+ v8si va, vb, vc;
+ int64_t res;
+ int i;
+
+#pragma omp parallel for
+ for (i = 0; i < N; i++)
+ {
+ b[i] = i;
+ c[i] = i + 1;
+ }
+
+#pragma omp target data use_device_addr (vb) map (to: b, c)
+#pragma omp target has_device_addr (vb) map (to: b, c) map (from: res)
+ for (i = 0; i < 8; i++)
+ {
+ vb = svld1_s32 (vp, b);
+ vc = svld1_s32 (vp, c);
+ va = svadd_s32_z (vp, vb, vc);
+ res = svaddv_s32 (svptrue_b32 (), va);
+ }
+
+ return res;
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/gomp/target-link.c b/gcc/testsuite/gcc.target/aarch64/sve/gomp/target-link.c
new file mode 100644
index 0000000..2f6184b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sve/gomp/target-link.c
@@ -0,0 +1,57 @@
+/* { dg-do compile } */
+/* { dg-options "-msve-vector-bits=256 -fopenmp -O2" } */
+
+#include <arm_sve.h>
+
+#define N __ARM_FEATURE_SVE_BITS
+#define FIXED_ATTR __attribute__((arm_sve_vector_bits (N)))
+
+typedef __SVInt32_t v8si FIXED_ATTR;
+
+static v8si local_vec;
+#pragma omp declare target link(local_vec)
+
+v8si global_vec;
+#pragma omp declare target link(global_vec)
+
+/* { dg-error {SVE type 'svint32_t' does not have a fixed size} "" { target *-*-* } .+1 } */
+static svint32_t slocal_vec;
+
+/* { dg-error {'slocal_vec' does not have a mappable type in 'link' clause} "" { target *-*-* } .+1 } */
+#pragma omp declare target link(slocal_vec)
+
+void
+one_get_inc2_local_vec_vls ()
+{
+ v8si res, res2, tmp;
+
+#pragma omp target map(from: res, res2)
+ {
+ res = local_vec;
+ local_vec = svadd_s32_z (svptrue_b32 (), local_vec, local_vec);
+ res2 = local_vec;
+ }
+
+ tmp = svadd_s32_z (svptrue_b32 (), res, res);
+ svbool_t p = svcmpne_s32 (svptrue_b32 (), tmp, res2);
+ if (svptest_any (svptrue_b32 (), p))
+ __builtin_abort ();
+}
+
+void
+one_get_inc3_global_vec_vls ()
+{
+ v8si res, res2, tmp;
+
+#pragma omp target map(from: res, res2)
+ {
+ res = global_vec;
+ global_vec = svadd_s32_z (svptrue_b32 (), global_vec, global_vec);
+ res2 = global_vec;
+ }
+
+ tmp = svadd_s32_z (svptrue_b32 (), res, res);
+ svbool_t p = svcmpne_s32 (svptrue_b32 (), tmp, res2);
+ if (svptest_any (svptrue_b32 (), p))
+ __builtin_abort ();
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/gomp/target.c b/gcc/testsuite/gcc.target/aarch64/sve/gomp/target.c
new file mode 100644
index 0000000..812183d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sve/gomp/target.c
@@ -0,0 +1,2049 @@
+/* { dg-do compile } */
+/* { dg-options "-msve-vector-bits=256 -fopenmp -O2" } */
+
+#include <arm_sve.h>
+
+#define N __ARM_FEATURE_SVE_BITS
+#define FIXED_ATTR __attribute__((arm_sve_vector_bits (N)))
+
+typedef svint32_t v8si FIXED_ATTR;
+typedef svbool_t v8bi FIXED_ATTR;
+
+void
+target_vla1 (svint32_t vb, svint32_t vc, int *a, int *b, int *c)
+{
+ int i;
+
+#pragma omp target
+ for (i = 0; i < 8; i++)
+ {
+ svint32_t va;
+
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ }
+}
+
+svint32_t
+target_data_map_1_vla1 (svint32_t vb, svint32_t vc, int *b, int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+ return va;
+}
+
+svint32_t
+target_data_map_2_vla1 (svint32_t vb, svint32_t vc, int *a, int *b,
+ int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+svint32_t
+target_map_data_enter_exit_vla1 (svint32_t vb, svint32_t vc, int *a,
+ int *b, int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target enter data map(to: b, c, vb, vc)
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target map(to: va) map(to: a)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target exit data map(from: va)
+
+ return va;
+}
+
+svint32_t
+target_map_data_alloc_update_vla1 (svint32_t vb, svint32_t vc, int *a,
+ int *b, int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target data map(to: b, c, vb, vc) map(alloc: va)
+
+#pragma omp target
+ for (i = 0; i < 8; i++)
+ {
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target update from(va)
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+void
+target_vls1 (v8si vb, v8si vc, int *a, int *b, int *c)
+{
+ int i;
+
+#pragma omp target
+ for (i = 0; i < 8; i++)
+ {
+ v8si va;
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ }
+}
+
+v8si
+target_data_map_1_vls1 (v8si vb, v8si vc, int *b, int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+ return va;
+}
+
+v8si
+target_data_map_2_vls1 (v8si vb, v8si vc, int *a, int *b, int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+v8si
+target_map_data_enter_exit_vls1 (v8si vb, v8si vc, int *a, int *b, int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target enter data map(to: b, c, vb, vc)
+
+#pragma omp target map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target map(to: va) map(to: a)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+
+#pragma omp target exit data map(from: va)
+
+ return va;
+}
+
+v8si
+target_map_data_alloc_update_vls1 (v8si vb, v8si vc, int *a, int *b,
+ int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target data map(to: b, c, vb, vc) map(alloc: va)
+
+#pragma omp target
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target update from(va)
+
+#pragma omp target map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+void
+target_vla2 (svint32_t vb, svint32_t vc, int *a, int *b, int *c)
+{
+ int i;
+
+#pragma omp target parallel
+ for (i = 0; i < 8; i++)
+ {
+ svint32_t va;
+
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ }
+}
+
+svint32_t
+target_data_map_1_vla2 (svint32_t vb, svint32_t vc, int *b, int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target parallel map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+ return va;
+}
+
+svint32_t
+target_data_map_2_vla2 (svint32_t vb, svint32_t vc, int *a, int *b,
+ int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target parallel map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target parallel map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+svint32_t
+target_map_data_enter_exit_vla2 (svint32_t vb, svint32_t vc, int *a,
+ int *b, int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target enter data map(to: b, c, vb, vc)
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target parallel map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target parallel map(to: va) map(to: a)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target exit data map(from: va)
+
+ return va;
+}
+
+svint32_t
+target_map_data_alloc_update_vla2 (svint32_t vb, svint32_t vc, int *a,
+ int *b, int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target data map(to: b, c, vb, vc) map(alloc: va)
+
+#pragma omp target parallel
+ for (i = 0; i < 8; i++)
+ {
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target update from(va)
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target parallel map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+void
+target_vls2 (v8si vb, v8si vc, int *a, int *b, int *c)
+{
+ int i;
+
+#pragma omp target parallel
+ for (i = 0; i < 8; i++)
+ {
+ v8si va;
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ }
+}
+
+v8si
+target_data_map_1_vls2 (v8si vb, v8si vc, int *b, int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target parallel map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+ return va;
+}
+
+v8si
+target_data_map_2_vls2 (v8si vb, v8si vc, int *a, int *b, int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target parallel map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target parallel map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+v8si
+target_map_data_enter_exit_vls2 (v8si vb, v8si vc, int *a, int *b, int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target enter data map(to: b, c, vb, vc)
+
+#pragma omp target parallel map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target parallel map(to: va) map(to: a)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+
+#pragma omp target exit data map(from: va)
+
+ return va;
+}
+
+v8si
+target_map_data_alloc_update_vls2 (v8si vb, v8si vc, int *a, int *b,
+ int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target data map(to: b, c, vb, vc) map(alloc: va)
+
+#pragma omp target parallel
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target update from(va)
+
+#pragma omp target parallel map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+void
+target_vla3 (svint32_t vb, svint32_t vc, int *a, int *b, int *c)
+{
+ int i;
+
+#pragma omp target parallel loop
+ for (i = 0; i < 8; i++)
+ {
+ svint32_t va;
+
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ }
+}
+
+svint32_t
+target_data_map_1_vla3 (svint32_t vb, svint32_t vc, int *b, int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target parallel loop map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+ return va;
+}
+
+svint32_t
+target_data_map_2_vla3 (svint32_t vb, svint32_t vc, int *a, int *b,
+ int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target parallel loop map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target parallel map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+svint32_t
+target_map_data_enter_exit_vla3 (svint32_t vb, svint32_t vc, int *a,
+ int *b, int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target enter data map(to: b, c, vb, vc)
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target parallel loop map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target parallel loop map(to: va) map(to: a)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target exit data map(from: va)
+
+ return va;
+}
+
+svint32_t
+target_map_data_alloc_update_vla3 (svint32_t vb, svint32_t vc, int *a,
+ int *b, int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target data map(to: b, c, vb, vc) map(alloc: va)
+
+#pragma omp target parallel loop
+ for (i = 0; i < 8; i++)
+ {
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target update from(va)
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target parallel loop map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+void
+target_vls3 (v8si vb, v8si vc, int *a, int *b, int *c)
+{
+ int i;
+
+#pragma omp target parallel loop
+ for (i = 0; i < 8; i++)
+ {
+ v8si va;
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ }
+}
+
+v8si
+target_data_map_1_vls3 (v8si vb, v8si vc, int *b, int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target parallel loop map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+ return va;
+}
+
+v8si
+target_data_map_2_vls3 (v8si vb, v8si vc, int *a, int *b, int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target parallel loop map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target parallel map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+v8si
+target_map_data_enter_exit_vls3 (v8si vb, v8si vc, int *a, int *b, int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target enter data map(to: b, c, vb, vc)
+
+#pragma omp target parallel loop map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target parallel loop map(to: va) map(to: a)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+
+#pragma omp target exit data map(from: va)
+
+ return va;
+}
+
+v8si
+target_map_data_alloc_update_vls3 (v8si vb, v8si vc, int *a, int *b,
+ int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target data map(to: b, c, vb, vc) map(alloc: va)
+
+#pragma omp target parallel loop
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target update from(va)
+
+#pragma omp target parallel loop map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+void
+target_vla4 (svint32_t vb, svint32_t vc, int *a, int *b, int *c)
+{
+ int i;
+
+#pragma omp target simd
+ for (i = 0; i < 8; i++)
+ {
+ svint32_t va;
+
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ }
+}
+
+svint32_t
+target_data_map_1_vla4 (svint32_t vb, svint32_t vc, int *b, int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target simd map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+ return va;
+}
+
+svint32_t
+target_data_map_2_vla4 (svint32_t vb, svint32_t vc, int *a, int *b,
+ int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target simd map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target simd map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+svint32_t
+target_map_data_enter_exit_vla4 (svint32_t vb, svint32_t vc, int *a,
+ int *b, int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target enter data map(to: b, c, vb, vc)
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target simd map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target simd map(to: va) map(to: a)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target exit data map(from: va)
+
+ return va;
+}
+
+svint32_t
+target_map_data_alloc_update_vla4 (svint32_t vb, svint32_t vc, int *a,
+ int *b, int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target data map(to: b, c, vb, vc) map(alloc: va)
+
+#pragma omp target simd
+ for (i = 0; i < 8; i++)
+ {
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target update from(va)
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target simd map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+void
+target_vls4 (v8si vb, v8si vc, int *a, int *b, int *c)
+{
+ int i;
+
+#pragma omp target simd
+ for (i = 0; i < 8; i++)
+ {
+ v8si va;
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ }
+}
+
+v8si
+target_data_map_1_vls4 (v8si vb, v8si vc, int *b, int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target simd map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+ return va;
+}
+
+v8si
+target_data_map_2_vls4 (v8si vb, v8si vc, int *a, int *b, int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target simd map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target simd map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+v8si
+target_map_data_enter_exit_vls4 (v8si vb, v8si vc, int *a, int *b, int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target enter data map(to: b, c, vb, vc)
+
+#pragma omp target simd map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target simd map(to: va) map(to: a)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+
+#pragma omp target exit data map(from: va)
+
+ return va;
+}
+
+v8si
+target_map_data_alloc_update_vls4 (v8si vb, v8si vc, int *a, int *b,
+ int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target data map(to: b, c, vb, vc) map(alloc: va)
+
+#pragma omp target simd
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target update from(va)
+
+#pragma omp target simd map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+void
+target_vla5 (svint32_t vb, svint32_t vc, int *a, int *b, int *c)
+{
+ int i;
+
+#pragma omp target teams
+ for (i = 0; i < 8; i++)
+ {
+ svint32_t va;
+
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ }
+}
+
+svint32_t
+target_data_map_1_vla5 (svint32_t vb, svint32_t vc, int *b, int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target teams map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+ return va;
+}
+
+svint32_t
+target_data_map_2_vla5 (svint32_t vb, svint32_t vc, int *a, int *b,
+ int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target teams map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target teams map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+svint32_t
+target_map_data_enter_exit_vla5 (svint32_t vb, svint32_t vc, int *a,
+ int *b, int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target enter data map(to: b, c, vb, vc)
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target teams map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target teams map(to: va) map(to: a)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target exit data map(from: va)
+
+ return va;
+}
+
+svint32_t
+target_map_data_alloc_update_vla5 (svint32_t vb, svint32_t vc, int *a,
+ int *b, int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target data map(to: b, c, vb, vc) map(alloc: va)
+
+#pragma omp target teams
+ for (i = 0; i < 8; i++)
+ {
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target update from(va)
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target teams map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+void
+target_vls5 (v8si vb, v8si vc, int *a, int *b, int *c)
+{
+ int i;
+
+#pragma omp target teams
+ for (i = 0; i < 8; i++)
+ {
+ v8si va;
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ }
+}
+
+v8si
+target_data_map_1_vls5 (v8si vb, v8si vc, int *b, int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target teams map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+ return va;
+}
+
+v8si
+target_data_map_2_vls5 (v8si vb, v8si vc, int *a, int *b, int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target teams map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target teams map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+v8si
+target_map_data_enter_exit_vls5 (v8si vb, v8si vc, int *a, int *b, int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target enter data map(to: b, c, vb, vc)
+
+#pragma omp target teams map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target teams map(to: va) map(to: a)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+
+#pragma omp target exit data map(from: va)
+
+ return va;
+}
+
+v8si
+target_map_data_alloc_update_vls5 (v8si vb, v8si vc, int *a, int *b,
+ int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target data map(to: b, c, vb, vc) map(alloc: va)
+
+#pragma omp target teams
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target update from(va)
+
+#pragma omp target teams map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+void
+target_vla6 (svint32_t vb, svint32_t vc, int *a, int *b, int *c)
+{
+ int i;
+
+#pragma omp target teams loop
+ for (i = 0; i < 8; i++)
+ {
+ svint32_t va;
+
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ }
+}
+
+svint32_t
+target_data_map_1_vla6 (svint32_t vb, svint32_t vc, int *b, int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target teams loop map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+ return va;
+}
+
+svint32_t
+target_data_map_2_vla6 (svint32_t vb, svint32_t vc, int *a, int *b,
+ int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target teams loop map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target teams map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+svint32_t
+target_map_data_enter_exit_vla6 (svint32_t vb, svint32_t vc, int *a,
+ int *b, int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target enter data map(to: b, c, vb, vc)
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target teams loop map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target teams loop map(to: va) map(to: a)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target exit data map(from: va)
+
+ return va;
+}
+
+svint32_t
+target_map_data_alloc_update_vla6 (svint32_t vb, svint32_t vc, int *a,
+ int *b, int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target data map(to: b, c, vb, vc) map(alloc: va)
+
+#pragma omp target teams loop
+ for (i = 0; i < 8; i++)
+ {
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target update from(va)
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target teams loop map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+void
+target_vls6 (v8si vb, v8si vc, int *a, int *b, int *c)
+{
+ int i;
+
+#pragma omp target teams loop
+ for (i = 0; i < 8; i++)
+ {
+ v8si va;
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ }
+}
+
+v8si
+target_data_map_1_vls6 (v8si vb, v8si vc, int *b, int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target teams loop map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+ return va;
+}
+
+v8si
+target_data_map_2_vls6 (v8si vb, v8si vc, int *a, int *b, int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target teams loop map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target teams map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+v8si
+target_map_data_enter_exit_vls6 (v8si vb, v8si vc, int *a, int *b, int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target enter data map(to: b, c, vb, vc)
+
+#pragma omp target teams loop map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target teams loop map(to: va) map(to: a)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+
+#pragma omp target exit data map(from: va)
+
+ return va;
+}
+
+v8si
+target_map_data_alloc_update_vls6 (v8si vb, v8si vc, int *a, int *b,
+ int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target data map(to: b, c, vb, vc) map(alloc: va)
+
+#pragma omp target teams loop
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target update from(va)
+
+#pragma omp target teams loop map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+void
+target_vla7 (svint32_t vb, svint32_t vc, int *a, int *b, int *c)
+{
+ int i;
+
+#pragma omp target teams distribute
+ for (i = 0; i < 8; i++)
+ {
+ svint32_t va;
+
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ }
+}
+
+svint32_t
+target_data_map_1_vla7 (svint32_t vb, svint32_t vc, int *b, int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target teams distribute map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+ return va;
+}
+
+svint32_t
+target_data_map_2_vla7 (svint32_t vb, svint32_t vc, int *a, int *b,
+ int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target teams distribute map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target teams map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+svint32_t
+target_map_data_enter_exit_vla7 (svint32_t vb, svint32_t vc, int *a,
+ int *b, int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target enter data map(to: b, c, vb, vc)
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target teams distribute map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target teams distribute map(to: va) map(to: a)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target exit data map(from: va)
+
+ return va;
+}
+
+svint32_t
+target_map_data_alloc_update_vla7 (svint32_t vb, svint32_t vc, int *a,
+ int *b, int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target data map(to: b, c, vb, vc) map(alloc: va)
+
+#pragma omp target teams distribute
+ for (i = 0; i < 8; i++)
+ {
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target update from(va)
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target teams distribute map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+void
+target_vls7 (v8si vb, v8si vc, int *a, int *b, int *c)
+{
+ int i;
+
+#pragma omp target teams distribute
+ for (i = 0; i < 8; i++)
+ {
+ v8si va;
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ }
+}
+
+v8si
+target_data_map_1_vls7 (v8si vb, v8si vc, int *b, int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target teams distribute map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+ return va;
+}
+
+v8si
+target_data_map_2_vls7 (v8si vb, v8si vc, int *a, int *b, int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target teams distribute map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target teams map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+v8si
+target_map_data_enter_exit_vls7 (v8si vb, v8si vc, int *a, int *b, int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target enter data map(to: b, c, vb, vc)
+
+#pragma omp target teams distribute map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target teams distribute map(to: va) map(to: a)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+
+#pragma omp target exit data map(from: va)
+
+ return va;
+}
+
+v8si
+target_map_data_alloc_update_vls7 (v8si vb, v8si vc, int *a, int *b,
+ int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target data map(to: b, c, vb, vc) map(alloc: va)
+
+#pragma omp target teams distribute
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target update from(va)
+
+#pragma omp target teams distribute map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+void
+target_vla8 (svint32_t vb, svint32_t vc, int *a, int *b, int *c)
+{
+ int i;
+
+#pragma omp target teams distribute simd
+ for (i = 0; i < 8; i++)
+ {
+ svint32_t va;
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ }
+}
+
+svint32_t
+target_data_map_1_vla8 (svint32_t vb, svint32_t vc, int *b, int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target teams distribute simd map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+ return va;
+}
+
+svint32_t
+target_data_map_2_vla8 (svint32_t vb, svint32_t vc, int *a, int *b,
+ int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target teams distribute simd map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target teams map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+svint32_t
+target_map_data_enter_exit_vla8 (svint32_t vb, svint32_t vc, int *a,
+ int *b, int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target enter data map(to: b, c, vb, vc)
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target teams distribute simd map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target teams distribute simd map(to: va) map(to: a)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target exit data map(from: va)
+
+ return va;
+}
+
+svint32_t
+target_map_data_alloc_update_vla8 (svint32_t vb, svint32_t vc, int *a,
+ int *b, int *c)
+{
+ svint32_t va;
+ int i;
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target data map(to: b, c, vb, vc) map(alloc: va)
+
+#pragma omp target teams distribute simd
+ for (i = 0; i < 8; i++)
+ {
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ /* { dg-error "cannot reference 'svint32_t' object types in 'target' region" "" { target *-*-* } .+1 } */
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target update from(va)
+
+/* { dg-error "SVE type 'svint32_t' not allowed in 'map' clause" "" { target *-*-* } .+1 } */
+#pragma omp target teams distribute simd map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+void
+target_vls8 (v8si vb, v8si vc, int *a, int *b, int *c)
+{
+ int i;
+
+#pragma omp target teams distribute simd
+ for (i = 0; i < 8; i++)
+ {
+ v8si va;
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ }
+}
+
+v8si
+target_data_map_1_vls8 (v8si vb, v8si vc, int *b, int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target teams distribute simd map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+ return va;
+}
+
+v8si
+target_data_map_2_vls8 (v8si vb, v8si vc, int *a, int *b, int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target teams distribute simd map(to: b, c, vb, vc) map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target teams map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
+
+v8si
+target_map_data_enter_exit_vls8 (v8si vb, v8si vc, int *a, int *b, int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target enter data map(to: b, c, vb, vc)
+
+#pragma omp target teams distribute simd map(from: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target teams distribute simd map(to: va) map(to: a)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+
+#pragma omp target exit data map(from: va)
+
+ return va;
+}
+
+v8si
+target_map_data_alloc_update_vls8 (v8si vb, v8si vc, int *a, int *b,
+ int *c)
+{
+ v8si va;
+ int i;
+
+#pragma omp target data map(to: b, c, vb, vc) map(alloc: va)
+
+#pragma omp target teams distribute simd
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), b + i * 8, vb);
+ svst1_s32 (svptrue_b32 (), c + i * 8, vc);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ }
+
+#pragma omp target update from(va)
+
+#pragma omp target teams distribute simd map(to: a) map(tofrom: va)
+ for (i = 0; i < 8; i++)
+ {
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ if (i == 7)
+ va = svadd_s32_z (svptrue_b32 (), va, svindex_s32 (1, 1));
+ }
+ return va;
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pred-not-gen-1.c b/gcc/testsuite/gcc.target/aarch64/sve/pred-not-gen-1.c
index a7d2795..c9a8b82 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/pred-not-gen-1.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/pred-not-gen-1.c
@@ -19,6 +19,6 @@ void f10(double * restrict z, double * restrict w, double * restrict x, double *
}
}
-/* { dg-final { scan-assembler-not {\tbic\t} { xfail *-*-* } } } */
-/* { dg-final { scan-assembler-times {\tnot\tp[0-9]+\.b, p[0-9]+/z, p[0-9]+\.b\n} 1 { xfail *-*-* } } } */
+/* { dg-final { scan-assembler-not {\tbic\t} } } */
+/* { dg-final { scan-assembler-times {\tnot\tp[0-9]+\.b, p[0-9]+/z, p[0-9]+\.b\n} 1 } } */
/* { dg-final { scan-assembler-times {\tfcmgt\tp[0-9]+\.d, p[0-9]+/z, z[0-9]+\.d, #0} 1 } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pred-not-gen-4.c b/gcc/testsuite/gcc.target/aarch64/sve/pred-not-gen-4.c
index 20cbd75..1845bd3 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/pred-not-gen-4.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/pred-not-gen-4.c
@@ -8,6 +8,6 @@ void f13(double * restrict z, double * restrict w, double * restrict x, double *
}
}
-/* { dg-final { scan-assembler-not {\tbic\t} { xfail *-*-* } } } */
-/* { dg-final { scan-assembler-times {\tnot\tp[0-9]+\.b, p[0-9]+/z, p[0-9]+\.b\n} 1 { xfail *-*-* } } } */
+/* { dg-final { scan-assembler-not {\tbic\t} } } */
+/* { dg-final { scan-assembler-times {\tnot\tp[0-9]+\.b, p[0-9]+/z, p[0-9]+\.b\n} 1 } } */
/* { dg-final { scan-assembler-times {\tfcmuo\tp[0-9]+\.d, p[0-9]+/z, z[0-9]+\.d, z[0-9]+\.d} 1 } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/var_stride_2.c b/gcc/testsuite/gcc.target/aarch64/sve/var_stride_2.c
index 33b9f0f..b8afea7 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/var_stride_2.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/var_stride_2.c
@@ -16,7 +16,8 @@ f (TYPE *x, TYPE *y, unsigned short n, unsigned short m)
/* { dg-final { scan-assembler {\tldr\tw[0-9]+} } } */
/* { dg-final { scan-assembler {\tstr\tw[0-9]+} } } */
/* Should multiply by (257-1)*4 rather than (VF-1)*4 or (VF-2)*4. */
-/* { dg-final { scan-assembler-times {\tadd\tx[0-9]+, x[0-9]+, x[0-9]+, lsl 10\n} 2 } } */
+/* { dg-final { scan-assembler-times {\tubfiz\tx[0-9]+, x2, 10, 16\n} 1 } } */
+/* { dg-final { scan-assembler-times {\tubfiz\tx[0-9]+, x3, 10, 16\n} 1 } } */
/* { dg-final { scan-assembler-not {\tcmp\tx[0-9]+, 0} } } */
/* { dg-final { scan-assembler-not {\tcmp\tw[0-9]+, 0} } } */
/* { dg-final { scan-assembler-not {\tcsel\tx[0-9]+} } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/var_stride_4.c b/gcc/testsuite/gcc.target/aarch64/sve/var_stride_4.c
index 71b826a..d2e74f9 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/var_stride_4.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/var_stride_4.c
@@ -16,7 +16,8 @@ f (TYPE *x, TYPE *y, int n, int m)
/* { dg-final { scan-assembler {\tldr\tw[0-9]+} } } */
/* { dg-final { scan-assembler {\tstr\tw[0-9]+} } } */
/* Should multiply by (257-1)*4 rather than (VF-1)*4. */
-/* { dg-final { scan-assembler-times {\t(?:lsl\tx[0-9]+, x[0-9]+, 10|sbfiz\tx[0-9]+, x[0-9]+, 10, 32)\n} 2 } } */
+/* { dg-final { scan-assembler-times {\tsbfiz\tx[0-9]+, x2, 10, 32\n} 1 } } */
+/* { dg-final { scan-assembler-times {\tsbfiz\tx[0-9]+, x3, 10, 32\n} 1 } } */
/* { dg-final { scan-assembler {\tcmp\tw2, 0} } } */
/* { dg-final { scan-assembler {\tcmp\tw3, 0} } } */
/* { dg-final { scan-assembler-times {\tcsel\tx[0-9]+} 4 } } */
diff --git a/gcc/testsuite/gcc.target/arm/short-vfp-1.c b/gcc/testsuite/gcc.target/arm/short-vfp-1.c
index f6866c4..418fc27 100644
--- a/gcc/testsuite/gcc.target/arm/short-vfp-1.c
+++ b/gcc/testsuite/gcc.target/arm/short-vfp-1.c
@@ -1,45 +1,75 @@
/* { dg-do compile } */
-/* { dg-require-effective-target arm_vfp_ok } */
-/* { dg-add-options arm_vfp } */
+/* { dg-require-effective-target arm_arch_v7a_fp_hard_ok } */
+/* { dg-options "-O2" } */
+/* { dg-add-options arm_arch_v7a_fp_hard } */
+/* { dg-final { check-function-bodies "**" "" } } */
+/*
+** test_sisf:
+** vcvt.s32.f32 (s[0-9]+), s0
+** vmov r0, \1 @ int
+** bx lr
+*/
int
test_sisf (float x)
{
return (int)x;
}
+/*
+** test_hisf:
+** vcvt.s32.f32 (s[0-9]+), s0
+** vmov (r[0-9]+), \1 @ int
+** sxth r0, \2
+** bx lr
+*/
short
test_hisf (float x)
{
return (short)x;
}
+/*
+** test_sfsi:
+** vmov (s[0-9]+), r0 @ int
+** vcvt.f32.s32 s0, \1
+** bx lr
+*/
float
test_sfsi (int x)
{
return (float)x;
}
+/*
+** test_sfhi:
+** vmov (s[0-9]+), r0 @ int
+** vcvt.f32.s32 s0, \1
+** bx lr
+*/
float
test_sfhi (short x)
{
return (float)x;
}
+/*
+** test_hisi:
+** sxth r0, r0
+** bx lr
+*/
short
test_hisi (int x)
{
return (short)x;
}
+/*
+** test_sihi:
+** bx lr
+*/
int
test_sihi (short x)
{
return (int)x;
}
-
-/* { dg-final { scan-assembler-times {vcvt\.s32\.f32\ts[0-9]+, s[0-9]+} 2 } } */
-/* { dg-final { scan-assembler-times {vcvt\.f32\.s32\ts[0-9]+, s[0-9]+} 2 } } */
-/* { dg-final { scan-assembler-times {vmov\tr[0-9]+, s[0-9]+} 2 } } */
-/* { dg-final { scan-assembler-times {vmov\ts[0-9]+, r[0-9]+} 2 } } */
-/* { dg-final { scan-assembler-times {sxth\tr[0-9]+, r[0-9]+} 2 } } */
diff --git a/gcc/testsuite/gcc.target/nvptx/alloca-2-O0_-mfake-ptx-alloca.c b/gcc/testsuite/gcc.target/nvptx/alloca-2-O0_-mfake-ptx-alloca.c
index 4cc4d0c..92562cd 100644
--- a/gcc/testsuite/gcc.target/nvptx/alloca-2-O0_-mfake-ptx-alloca.c
+++ b/gcc/testsuite/gcc.target/nvptx/alloca-2-O0_-mfake-ptx-alloca.c
@@ -1,4 +1,4 @@
-/* { dg-do link } */
+/* { dg-do run } */
/* { dg-options {-O0 -mno-soft-stack} } */
/* { dg-additional-options -march=sm_30 } */
/* { dg-additional-options -mfake-ptx-alloca } */
@@ -13,6 +13,7 @@ main(void)
/* { dg-final { scan-assembler-times {(?n)^\.extern \.func \(\.param\.u64 %value_out\) __GCC_nvptx__PTX_alloca_not_supported \(\.param\.u64 %in_ar0\);$} 1 } } */
-/* { dg-message __GCC_nvptx__PTX_alloca_not_supported {unresolved symbol} { target *-*-* } 0 } */
+/* { dg-bogus __GCC_nvptx__PTX_alloca_not_supported {unresolved symbol} { target *-*-* } 0 } */
-/* { dg-final output-exists-not } */
+/* { dg-output {GCC/nvptx: sorry, unimplemented: dynamic stack allocation not supported[\r\n]+} }
+ { dg-shouldfail __GCC_nvptx__PTX_alloca_not_supported } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/vsext.c b/gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/vsext.c
new file mode 100644
index 0000000..55db283
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/vsext.c
@@ -0,0 +1,24 @@
+/* { dg-do compile { target { rv64 } } } */
+/* { dg-options "-march=rv64gc_xtheadvector -mabi=lp64d -O3" } */
+
+#include <riscv_vector.h>
+
+struct a
+{
+ int b[];
+} c (vint32m4_t), d;
+
+char e;
+char *f;
+
+void g ()
+{
+ int h;
+ vint32m4_t i;
+ vint8m1_t j = __riscv_vlse8_v_i8m1 (&e, d.b[3], h);
+ vint16m2_t k = __riscv_vwadd_vx_i16m2 (j, 0, h);
+ i = __riscv_vwmacc_vx_i32m4 (i, f[0], k, h);
+ c (i);
+}
+
+/* { dg-final { scan-assembler-not {th\.vsext\.vf2} } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/vzext.c b/gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/vzext.c
new file mode 100644
index 0000000..fcb5659
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/vzext.c
@@ -0,0 +1,24 @@
+/* { dg-do compile { target { rv64 } } } */
+/* { dg-options "-march=rv64gc_xtheadvector -mabi=lp64d -O3" } */
+
+#include <riscv_vector.h>
+
+struct a
+{
+ int b[];
+} c (vuint32m4_t), d;
+
+char e;
+char *f;
+
+void g ()
+{
+ int h;
+ vuint32m4_t i;
+ vuint8m1_t j = __riscv_vlse8_v_u8m1 (&e, d.b[3], h);
+ vuint16m2_t k = __riscv_vwaddu_vx_u16m2 (j, 0, h);
+ i = __riscv_vwmaccu_vx_u32m4 (i, f[0], k, h);
+ c (i);
+}
+
+/* { dg-final { scan-assembler-not {th\.vzext\.vf2} } } */
diff --git a/gcc/testsuite/gdc.test/compilable/test21153.d b/gcc/testsuite/gdc.test/compilable/test21153.d
new file mode 100644
index 0000000..cd92a31
--- /dev/null
+++ b/gcc/testsuite/gdc.test/compilable/test21153.d
@@ -0,0 +1,8 @@
+// https://github.com/dlang/dmd/issues/21153
+alias AliasSeq(TList...) = TList;
+class DataClass;
+void reduce(DataClass[] r)
+{
+ alias Args = AliasSeq!(DataClass);
+ Args result = r[0];
+}
diff --git a/gcc/testsuite/gfortran.dg/gomp/append-args-interop.f90 b/gcc/testsuite/gfortran.dg/gomp/append-args-interop.f90
index f2c4d97..540079a 100644
--- a/gcc/testsuite/gfortran.dg/gomp/append-args-interop.f90
+++ b/gcc/testsuite/gfortran.dg/gomp/append-args-interop.f90
@@ -23,6 +23,6 @@ use m
call f()
end
-! { dg-final { scan-tree-dump "__builtin_GOMP_interop \\(99, 3, interopobjs\.\[0-9\]+, tgt_tgtsync\.\[0-9\]+, pref_type\.\[0-9\]+, " "gimple" } }
-! { dg-final { scan-tree-dump "__builtin_GOMP_interop \\(99, 0, 0B, 0B, 0B, 0, 0B, 3, interopobjs\.\[0-9\]+," "gimple" } }
+! { dg-final { scan-tree-dump "__builtin_GOMP_interop \\(99, 3, &interopobjs\.\[0-9\]+, &tgt_tgtsync\.\[0-9\]+, &pref_type\.\[0-9\]+, " "gimple" } }
+! { dg-final { scan-tree-dump "__builtin_GOMP_interop \\(99, 0, 0B, 0B, 0B, 0, 0B, 3, &interopobjs\.\[0-9\]+," "gimple" } }
! { dg-final { scan-tree-dump "g \\(&interop\.\[0-9\]+, interop\.\[0-9\]+, &interop\.\[0-9\]+\\)" "gimple" } }
diff --git a/gcc/testsuite/lib/cobol.exp b/gcc/testsuite/lib/cobol.exp
index cd88bcb..8ea91e3 100644
--- a/gcc/testsuite/lib/cobol.exp
+++ b/gcc/testsuite/lib/cobol.exp
@@ -107,8 +107,11 @@ proc cobol_link_flags { paths } {
}
if { $gccpath != "" } {
+ if [file exists "${gccpath}/libgcobol/libgcobol.spec"] {
+ append flags "-B${gccpath}/libgcobol "
+ }
if [file exists "${gccpath}/libgcobol/libgcobol.a"] {
- append flags "-L${gccpath}/libgcobol"
+ append flags "-L${gccpath}/libgcobol "
}
if { [file exists "${gccpath}/libgcobol/.libs/libgcobol.a"] ||
[file exists "${gccpath}/libgobol/.libs/libgcobol.${shlib_ext}"] } {
@@ -160,7 +163,6 @@ proc cobol_init { args } {
global gcc_warning_prefix
global gcc_error_prefix
global TEST_ALWAYS_FLAGS
- global cobol_init_set_COBOL_UNDER_TEST
# We set LC_ALL and LANG to C so that we get the same error messages as expected.
setenv LC_ALL C
@@ -176,24 +178,14 @@ proc cobol_init { args } {
setenv LANG C.ASCII
}
- # COBOL_UNDER_TEST as set below contains $specpath, which depends on
- # the used multilib config. Thus, its value may need to be reset;
- # that's tracked via gfortran_init_set_COBOL_UNDER_TEST.
- if { ![info exists COBOL_UNDER_TEST]
- || [info exists cobol_init_set_COBOL_UNDER_TEST] } then {
+ if ![info exists COBOL_UNDER_TEST] then {
if [info exists TOOL_EXECUTABLE] {
set COBOL_UNDER_TEST $TOOL_EXECUTABLE
} else {
if { [is_remote host] || ! [info exists TESTING_IN_BUILD_TREE] } {
set COBOL_UNDER_TEST [transform gcobol]
} else {
- if [info exists TOOL_OPTIONS] {
- set specpath [get_multilibs ${TOOL_OPTIONS}]
- } else {
- set specpath [get_multilibs]
- }
- set cobol_init_set_COBOL_UNDER_TEST 1
- set COBOL_UNDER_TEST [findfile $base_dir/../../gcobol "$base_dir/../../gcobol -B$base_dir/../../ -B$specpath/libgcobol/.libs" [findfile $base_dir/gcobol "$base_dir/gcobol -B$base_dir/" [transform gcobol]]]
+ set COBOL_UNDER_TEST [findfile $base_dir/../../gcobol "$base_dir/../../gcobol -B$base_dir/../../" [findfile $base_dir/gcobol "$base_dir/gcobol -B$base_dir/" [transform gcobol]]]
}
}
}
diff --git a/gcc/testsuite/rust/compile/enum_discriminant1.rs b/gcc/testsuite/rust/compile/enum_discriminant1.rs
new file mode 100644
index 0000000..32092b2
--- /dev/null
+++ b/gcc/testsuite/rust/compile/enum_discriminant1.rs
@@ -0,0 +1,7 @@
+enum Foo {
+ Bar = 3 + 12,
+}
+
+fn test() -> Foo { // { dg-warning "function is never used" }
+ return Foo::Bar;
+} \ No newline at end of file
diff --git a/gcc/testsuite/rust/compile/feature.rs b/gcc/testsuite/rust/compile/feature.rs
index f743f92..6f428f0 100644
--- a/gcc/testsuite/rust/compile/feature.rs
+++ b/gcc/testsuite/rust/compile/feature.rs
@@ -2,5 +2,7 @@
#![feature(AA)] //{ dg-error "unknown feature .AA." }
#![feature(iamcrabby)] // { dg-error "unknown feature .iamcrabby." }
#![feature(nonexistent_gccrs_feature)] // { dg-error "unknown feature .nonexistent_gccrs_feature." }
+// ErrorCode - E0556
+#![feature] // { dg-error "malformed .feature. attribute input" }
fn main() {}
diff --git a/gcc/testsuite/rust/compile/invalid_label_name.rs b/gcc/testsuite/rust/compile/invalid_label_name.rs
index 5c850da..66e40a6 100644
--- a/gcc/testsuite/rust/compile/invalid_label_name.rs
+++ b/gcc/testsuite/rust/compile/invalid_label_name.rs
@@ -1,20 +1,24 @@
+// { dg-additional-options "-frust-name-resolution-2.0" }
pub fn function() {
'continue: loop {
// { dg-error "invalid label name .'continue." "" { target *-*-* } .-1 }
break 'extern;
// { dg-error "invalid label name .'extern." "" { target *-*-* } .-1 }
+ // { dg-error "use of undeclared label .'extern." "" { target *-*-* } .-2 }
}
'break: loop {
// { dg-error "invalid label name .'break." "" { target *-*-* } .-1 }
break 'for;
// { dg-error "invalid label name .'for." "" { target *-*-* } .-1 }
+ // { dg-error "use of undeclared label .'for." "" { target *-*-* } .-2 }
}
'crate: loop {
// { dg-error "invalid label name .'crate." "" { target *-*-* } .-1 }
break 'loop;
// { dg-error "invalid label name .'loop." "" { target *-*-* } .-1 }
+ // { dg-error "use of undeclared label .'loop." "" { target *-*-* } .-2 }
}
'a: loop {
diff --git a/gcc/testsuite/rust/compile/issue-2812.rs b/gcc/testsuite/rust/compile/issue-2812.rs
index 173259b..0de1738 100644
--- a/gcc/testsuite/rust/compile/issue-2812.rs
+++ b/gcc/testsuite/rust/compile/issue-2812.rs
@@ -1,4 +1,4 @@
// { dg-additional-options "-frust-compile-until=astvalidation" }
fn foo_1(&self);
-fn foo_1(&mut self);
-fn foo_1(self);
+fn foo_2(&mut self);
+fn foo_3(self);
diff --git a/gcc/testsuite/rust/compile/issue-3625.rs b/gcc/testsuite/rust/compile/issue-3625.rs
new file mode 100644
index 0000000..91e0dc9
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3625.rs
@@ -0,0 +1,2 @@
+type A = crate::A;
+// { dg-error "failed to resolve type path segment: .A." "" { target *-*-* } .-2 }
diff --git a/gcc/testsuite/rust/compile/issue-3643.rs b/gcc/testsuite/rust/compile/issue-3643.rs
new file mode 100644
index 0000000..bed9ffc
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3643.rs
@@ -0,0 +1,4 @@
+fn foo() {
+ let x: usize<foo>;
+ // { dg-error "generic arguments are not allowed for this type .E0109." "" { target *-*-* } .-1 }
+}
diff --git a/gcc/testsuite/rust/compile/issue-3646.rs b/gcc/testsuite/rust/compile/issue-3646.rs
new file mode 100644
index 0000000..80693cb
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3646.rs
@@ -0,0 +1,7 @@
+trait Foo {
+ type T;
+ fn foo() -> Foo<main>;
+ // { dg-error "generic arguments are not allowed for this type .E0109." "" { target *-*-* } .-1 }
+}
+
+fn main() {}
diff --git a/gcc/testsuite/rust/compile/issue-3647.rs b/gcc/testsuite/rust/compile/issue-3647.rs
new file mode 100644
index 0000000..51d9478d
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3647.rs
@@ -0,0 +1,7 @@
+#![allow(dead_code)]
+type A = fn();
+
+type B = for<'static> fn();
+// { dg-error "invalid lifetime parameter name: .static. .E0262." "" { target *-*-* } .-1 }
+
+pub fn main() {}
diff --git a/gcc/testsuite/rust/compile/issue-3648.rs b/gcc/testsuite/rust/compile/issue-3648.rs
new file mode 100644
index 0000000..52ecbbf
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3648.rs
@@ -0,0 +1,8 @@
+struct B; // { dg-warning "struct is never constructed" }
+
+impl B {
+ fn main() {}
+ // { dg-warning "associated function is never used" "" { target *-*-* } .-1 }
+}
+
+fn main() {}
diff --git a/gcc/testsuite/rust/compile/issue-3654.rs b/gcc/testsuite/rust/compile/issue-3654.rs
new file mode 100644
index 0000000..923488e
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3654.rs
@@ -0,0 +1,3 @@
+type Meeshka = Mow<!>;
+// { dg-error "generic arguments are not allowed for this type .E0109." "" { target *-*-* } .-1 }
+type Mow = &'static fn(!) -> !;
diff --git a/gcc/testsuite/rust/compile/issue-3656.rs b/gcc/testsuite/rust/compile/issue-3656.rs
new file mode 100644
index 0000000..e0bec2f
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3656.rs
@@ -0,0 +1,10 @@
+enum Foo {
+ Bar(isize),
+}
+
+fn main() {
+ match Foo::Bar(205) {
+ Foo { i } => (),
+ // { dg-error "expected struct, variant or union type, found enum .Foo. .E0574." "" { target *-*-* } .-1 }
+ }
+}
diff --git a/gcc/testsuite/rust/compile/issue-3657.rs b/gcc/testsuite/rust/compile/issue-3657.rs
new file mode 100644
index 0000000..978f3ce
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3657.rs
@@ -0,0 +1,8 @@
+struct Foo<'_>(&'_ u8);
+
+impl Foo<'a> {
+ // { dg-error "unresolved lifetime" "" { target *-*-* } .-1 }
+ fn x() {}
+}
+
+fn x() {}
diff --git a/gcc/testsuite/rust/compile/issue-3663.rs b/gcc/testsuite/rust/compile/issue-3663.rs
new file mode 100644
index 0000000..0f0559c
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3663.rs
@@ -0,0 +1,6 @@
+pub trait TypeFn {}
+
+impl TypeFn for Output<{ 42 }> {
+ // { dg-error "could not resolve type path .Output. .E0412." "" { target *-*-* } .-1 }
+ type Output = ();
+}
diff --git a/gcc/testsuite/rust/compile/issue-3665.rs b/gcc/testsuite/rust/compile/issue-3665.rs
new file mode 100644
index 0000000..d66a81f
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3665.rs
@@ -0,0 +1,6 @@
+pub const uint_val: usize = 1;
+pub const uint_expr: usize = 1 << uint_val;
+
+pub fn test() -> usize {
+ uint_expr
+}
diff --git a/gcc/testsuite/rust/compile/issue-3667.rs b/gcc/testsuite/rust/compile/issue-3667.rs
new file mode 100644
index 0000000..e72069c
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3667.rs
@@ -0,0 +1,24 @@
+// { dg-options "-w" }
+#![feature(raw_ref_op)]
+
+const pq1: () = {
+ let mut x = 2;
+ &raw mut x;
+}; //~ mutable reference
+
+static B: () = {
+ let mut x = 2;
+ &raw mut x;
+}; //~ mutable reference
+
+static mut C: () = {
+ let mut x = 2;
+ &raw mut x;
+}; //~ mutable reference
+
+const fn foo() {
+ let mut x = 0;
+ let y = &raw mut x; //~ mutable reference
+}
+
+fn main() {}
diff --git a/gcc/testsuite/rust/compile/issue-3671.rs b/gcc/testsuite/rust/compile/issue-3671.rs
new file mode 100644
index 0000000..e800d53
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3671.rs
@@ -0,0 +1,2 @@
+impl Self<0> {}
+// { dg-error "could not resolve type path" "" { target *-*-* } .-1 }
diff --git a/gcc/testsuite/rust/compile/macros/mbe/macro6.rs b/gcc/testsuite/rust/compile/macros/mbe/macro6.rs
index 9c54a67..bbaaa25 100644
--- a/gcc/testsuite/rust/compile/macros/mbe/macro6.rs
+++ b/gcc/testsuite/rust/compile/macros/mbe/macro6.rs
@@ -1,6 +1,6 @@
macro_rules! zero_or_one {
($($a:literal)?) => {
- f();
+ 1 + 2;
}
}
diff --git a/gcc/testsuite/rust/compile/min_specialization1.rs b/gcc/testsuite/rust/compile/min_specialization1.rs
new file mode 100644
index 0000000..d38167e
--- /dev/null
+++ b/gcc/testsuite/rust/compile/min_specialization1.rs
@@ -0,0 +1,15 @@
+#![feature(min_specialization)]
+
+pub trait Foo {
+ fn foo(&self) -> bool {
+ false
+ }
+}
+
+pub struct Bar;
+
+impl Foo for Bar {
+ default fn foo(&self) -> bool { // { dg-warning "unused" }
+ true
+ }
+}
diff --git a/gcc/testsuite/rust/compile/nr2/compile.exp b/gcc/testsuite/rust/compile/nr2/compile.exp
index 35637f1..4d91dd0 100644
--- a/gcc/testsuite/rust/compile/nr2/compile.exp
+++ b/gcc/testsuite/rust/compile/nr2/compile.exp
@@ -47,18 +47,22 @@ namespace eval rust-nr2-ns {
set tests_expect_ok ""
set tests_expect_err ""
+ set compile_dir [list {*}[file split $srcdir] {*}[file split $subdir]]
+ set compile_dir [lreplace $compile_dir end end]
+
foreach test_dir $test_dirs {
- set directory [list {*}[file split $srcdir] {*}[file split $subdir]]
- set directory [lreplace $directory end end]
- set directory [list {*}$directory {*}$test_dir]
- foreach test [lsort [glob -nocomplain -tails -directory [file join {*}$directory] *.rs]] {
+ foreach test [lsort [glob -nocomplain -tails -directory [file join {*}$compile_dir {*}$test_dir] *.rs]] {
# use '/' as the path seperator for entries in the exclude file
set test_lbl [join [list {*}$test_dir $test] "/"]
set idx [lsearch -exact -sorted $exclude $test_lbl]
if {$idx == -1} {
- lappend tests_expect_ok [file join {*}$directory $test]
+ if {[runtest_file_p $runtests [file join {*}$compile_dir {*}$test_dir $test]]} {
+ lappend tests_expect_ok [list {*}$test_dir $test]
+ }
} else {
- lappend tests_expect_err [file join {*}$directory $test]
+ if {[runtest_file_p $runtests [file join {*}$compile_dir {*}$test_dir $test]]} {
+ lappend tests_expect_err [list {*}$test_dir $test]
+ }
set exclude [lreplace $exclude $idx $idx]
}
}
@@ -83,10 +87,10 @@ namespace eval rust-nr2-ns {
variable record_test_out
switch $type {
FAIL {
- lappend record_test_out "$type: $msg"
+ lappend record_test_out [list $type $msg]
}
XPASS {
- lappend record_test_out "$type: $msg"
+ lappend record_test_out [list $type $msg]
}
}
}
@@ -109,23 +113,23 @@ namespace eval rust-nr2-ns {
# check for unexpected failures
foreach test $tests_expect_ok {
- set fails [try_test $test]
+ set fails [try_test [file join {*}$compile_dir {*}$test]]
if {[llength $fails] != 0} {
foreach ent $fails {
- record_test FAIL "$test: nr2 failure: $ent"
+ record_test [lindex $ent 0] "on nr2: [lindex $ent 1]"
}
} else {
- record_test PASS "$test: nr2 success"
+ record_test PASS "[file join {*}$test] on nr2"
}
}
#check for unexpected successes
foreach test $tests_expect_err {
- set fails [try_test $test]
+ set fails [try_test [file join {*}$compile_dir {*}$test]]
if {[llength $fails] == 0} {
- record_test XPASS "$test: nr2 unexpectedly passed"
+ record_test XPASS "[file join {*}$test] on nr2"
} else {
- record_test XFAIL "$test: nr2 was rightfully excluded"
+ record_test XFAIL "[file join {*}$test] on nr2 was rightfully excluded"
}
}
}
diff --git a/gcc/testsuite/rust/compile/nr2/exclude b/gcc/testsuite/rust/compile/nr2/exclude
index 19bf6f8..4772517 100644
--- a/gcc/testsuite/rust/compile/nr2/exclude
+++ b/gcc/testsuite/rust/compile/nr2/exclude
@@ -1,11 +1,8 @@
canonical_paths1.rs
cfg1.rs
generics9.rs
-issue-2043.rs
-issue-2812.rs
issue-3315-2.rs
lookup_err1.rs
-macros/mbe/macro6.rs
multiple_bindings1.rs
multiple_bindings2.rs
privacy5.rs
@@ -13,21 +10,16 @@ privacy8.rs
pub_restricted_1.rs
pub_restricted_2.rs
pub_restricted_3.rs
-undeclared_label.rs
use_1.rs
-while_break_expr.rs
issue-2905-2.rs
-issue-266.rs
derive_clone_enum3.rs
derive-debug1.rs
derive-default1.rs
-issue-3402-1.rs
-issue-3403.rs
derive-eq-invalid.rs
derive-hash1.rs
torture/alt_patterns1.rs
-torture/loop4.rs
-torture/loop8.rs
torture/name_resolve1.rs
issue-3568.rs
+issue-3663.rs
+issue-3671.rs
# please don't delete the trailing newline
diff --git a/gcc/testsuite/rust/compile/undeclared_label.rs b/gcc/testsuite/rust/compile/undeclared_label.rs
index 6efa2d9..9aa0553 100644
--- a/gcc/testsuite/rust/compile/undeclared_label.rs
+++ b/gcc/testsuite/rust/compile/undeclared_label.rs
@@ -2,12 +2,12 @@
#![allow(unused)]
fn resolve_label_continue() -> () {
loop {
- continue 'a; // { dg-error "use of undeclared label .a. in .continue." }
+ continue 'a; // { dg-error "use of undeclared label .'a." }
}
}
fn resolve_label_break() -> () {
loop {
- break 'crabby; // { dg-error "use of undeclared label .crabby. in .break." }
+ break 'crabby; // { dg-error "use of undeclared label .'crabby." }
}
}
fn main() {
diff --git a/gcc/tree-sra.cc b/gcc/tree-sra.cc
index c26559e..302b73e 100644
--- a/gcc/tree-sra.cc
+++ b/gcc/tree-sra.cc
@@ -100,6 +100,7 @@ along with GCC; see the file COPYING3. If not see
#include "builtins.h"
#include "tree-sra.h"
#include "opts.h"
+#include "tree-ssa-alias-compare.h"
/* Enumeration of all aggregate reductions we can do. */
enum sra_mode { SRA_MODE_EARLY_IPA, /* early call regularization */
@@ -979,6 +980,7 @@ create_access (tree expr, gimple *stmt, bool write)
access->type = TREE_TYPE (expr);
access->write = write;
access->grp_unscalarizable_region = unscalarizable_region;
+ access->grp_same_access_path = true;
access->stmt = stmt;
access->reverse = reverse;
@@ -1522,6 +1524,9 @@ build_accesses_from_assign (gimple *stmt)
racc = build_access_from_expr_1 (rhs, stmt, false);
lacc = build_access_from_expr_1 (lhs, stmt, true);
+ bool tbaa_hazard
+ = !types_equal_for_same_type_for_tbaa_p (TREE_TYPE (lhs), TREE_TYPE (rhs));
+
if (lacc)
{
lacc->grp_assignment_write = 1;
@@ -1536,6 +1541,8 @@ build_accesses_from_assign (gimple *stmt)
bitmap_set_bit (cannot_scalarize_away_bitmap,
DECL_UID (lacc->base));
}
+ if (tbaa_hazard)
+ lacc->grp_same_access_path = false;
}
if (racc)
@@ -1555,6 +1562,8 @@ build_accesses_from_assign (gimple *stmt)
}
if (storage_order_barrier_p (lhs))
racc->grp_unscalarizable_region = 1;
+ if (tbaa_hazard)
+ racc->grp_same_access_path = false;
}
if (lacc && racc
@@ -2396,7 +2405,7 @@ sort_and_splice_var_accesses (tree var)
bool grp_partial_lhs = access->grp_partial_lhs;
bool first_scalar = is_gimple_reg_type (access->type);
bool unscalarizable_region = access->grp_unscalarizable_region;
- bool grp_same_access_path = true;
+ bool grp_same_access_path = access->grp_same_access_path;
bool bf_non_full_precision
= (INTEGRAL_TYPE_P (access->type)
&& TYPE_PRECISION (access->type) != access->size
@@ -2432,7 +2441,8 @@ sort_and_splice_var_accesses (tree var)
return NULL;
}
- grp_same_access_path = path_comparable_for_same_access (access->expr);
+ if (grp_same_access_path)
+ grp_same_access_path = path_comparable_for_same_access (access->expr);
j = i + 1;
while (j < access_count)
@@ -2496,7 +2506,8 @@ sort_and_splice_var_accesses (tree var)
}
if (grp_same_access_path
- && !same_access_path_p (access->expr, ac2->expr))
+ && (!ac2->grp_same_access_path
+ || !same_access_path_p (access->expr, ac2->expr)))
grp_same_access_path = false;
ac2->group_representative = access;
@@ -3451,7 +3462,7 @@ create_total_scalarization_access (struct access *parent, HOST_WIDE_INT pos,
access->grp_write = parent->grp_write;
access->grp_total_scalarization = 1;
access->grp_hint = 1;
- access->grp_same_access_path = path_comparable_for_same_access (expr);
+ access->grp_same_access_path = 0;
access->reverse = reverse_storage_order_for_component_p (expr);
access->next_sibling = next_sibling;
diff --git a/gcc/tree-ssa-alias-compare.h b/gcc/tree-ssa-alias-compare.h
index 4c4856c..fb37337 100644
--- a/gcc/tree-ssa-alias-compare.h
+++ b/gcc/tree-ssa-alias-compare.h
@@ -40,4 +40,6 @@ class ao_compare : public operand_compare
inchash::hash &hstate);
};
+bool types_equal_for_same_type_for_tbaa_p (tree type1, tree type2);
+
#endif
diff --git a/gcc/tree-ssa-alias.cc b/gcc/tree-ssa-alias.cc
index e93d518..9dd1780 100644
--- a/gcc/tree-ssa-alias.cc
+++ b/gcc/tree-ssa-alias.cc
@@ -48,6 +48,7 @@ along with GCC; see the file COPYING3. If not see
#include "tree-ssa-alias-compare.h"
#include "builtins.h"
#include "internal-fn.h"
+#include "ipa-utils.h"
/* Broad overview of how alias analysis on gimple works:
@@ -4165,7 +4166,7 @@ attr_fnspec::verify ()
}
/* Return ture if TYPE1 and TYPE2 will always give the same answer
- when compared wit hother types using same_type_for_tbaa_p. */
+ when compared with other types using same_type_for_tbaa. */
static bool
types_equal_for_same_type_for_tbaa_p (tree type1, tree type2,
@@ -4188,6 +4189,16 @@ types_equal_for_same_type_for_tbaa_p (tree type1, tree type2,
return TYPE_CANONICAL (type1) == TYPE_CANONICAL (type2);
}
+/* Return ture if TYPE1 and TYPE2 will always give the same answer
+ when compared with other types using same_type_for_tbaa. */
+
+bool
+types_equal_for_same_type_for_tbaa_p (tree type1, tree type2)
+{
+ return types_equal_for_same_type_for_tbaa_p (type1, type2,
+ lto_streaming_expected_p ());
+}
+
/* Compare REF1 and REF2 and return flags specifying their differences.
If LTO_STREAMING_SAFE is true do not use alias sets and canonical
types that are going to be recomputed.
diff --git a/gcc/tree-tailcall.cc b/gcc/tree-tailcall.cc
index c8740f9..f51bb97 100644
--- a/gcc/tree-tailcall.cc
+++ b/gcc/tree-tailcall.cc
@@ -920,6 +920,7 @@ find_tail_calls (basic_block bb, struct tailcall **ret, bool only_musttail,
auto_bitmap to_move_defs;
auto_vec<gimple *> to_move_stmts;
bool is_noreturn = gimple_call_noreturn_p (call);
+ auto_vec<edge> edges;
abb = bb;
agsi = gsi;
@@ -933,6 +934,8 @@ find_tail_calls (basic_block bb, struct tailcall **ret, bool only_musttail,
{
edge e = single_non_eh_succ_edge (abb);
ass_var = propagate_through_phis (ass_var, e);
+ if (!ass_var)
+ edges.safe_push (e);
abb = e->dest;
agsi = gsi_start_bb (abb);
}
@@ -1040,9 +1043,7 @@ find_tail_calls (basic_block bb, struct tailcall **ret, bool only_musttail,
/* If IPA-VRP proves called function always returns a singleton range,
the return value is replaced by the only value in that range.
For tail call purposes, pretend such replacement didn't happen. */
- if (ass_var == NULL_TREE
- && !tail_recursion
- && TREE_CONSTANT (ret_var))
+ if (ass_var == NULL_TREE && !tail_recursion)
if (tree type = gimple_range_type (call))
if (tree callee = gimple_call_fndecl (call))
if ((INTEGRAL_TYPE_P (type)
@@ -1052,9 +1053,43 @@ find_tail_calls (basic_block bb, struct tailcall **ret, bool only_musttail,
type)
&& useless_type_conversion_p (TREE_TYPE (ret_var), type)
&& ipa_return_value_range (val, callee)
- && val.singleton_p (&valr)
- && operand_equal_p (ret_var, valr, 0))
- ok = true;
+ && val.singleton_p (&valr))
+ {
+ tree rv = ret_var;
+ unsigned int i = edges.length ();
+ /* If ret_var is equal to valr, we can tail optimize. */
+ if (operand_equal_p (ret_var, valr, 0))
+ ok = true;
+ else
+ /* Otherwise, if ret_var is a PHI result, try to find out
+ if valr isn't propagated through PHIs on the path from
+ call's bb to SSA_NAME_DEF_STMT (ret_var)'s bb. */
+ while (TREE_CODE (rv) == SSA_NAME
+ && gimple_code (SSA_NAME_DEF_STMT (rv)) == GIMPLE_PHI)
+ {
+ tree nrv = NULL_TREE;
+ gimple *g = SSA_NAME_DEF_STMT (rv);
+ for (; i; --i)
+ {
+ if (edges[i - 1]->dest == gimple_bb (g))
+ {
+ nrv
+ = gimple_phi_arg_def_from_edge (g,
+ edges[i - 1]);
+ --i;
+ break;
+ }
+ }
+ if (nrv == NULL_TREE)
+ break;
+ if (operand_equal_p (nrv, valr, 0))
+ {
+ ok = true;
+ break;
+ }
+ rv = nrv;
+ }
+ }
if (!ok)
{
maybe_error_musttail (call,
diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index 3005ae6..7f87435 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -6750,13 +6750,16 @@ vectorizable_shift (vec_info *vinfo,
{
if (was_scalar_shift_arg)
{
- /* If the argument was the same in all lanes create
- the correctly typed vector shift amount directly. */
+ /* If the argument was the same in all lanes create the
+ correctly typed vector shift amount directly. Note
+ we made SLP scheduling think we use the original scalars,
+ so place the compensation code next to the shift which
+ is conservative. See PR119640 where it otherwise breaks. */
op1 = fold_convert (TREE_TYPE (vectype), op1);
op1 = vect_init_vector (vinfo, stmt_info, op1, TREE_TYPE (vectype),
- !loop_vinfo ? gsi : NULL);
+ gsi);
vec_oprnd1 = vect_init_vector (vinfo, stmt_info, op1, vectype,
- !loop_vinfo ? gsi : NULL);
+ gsi);
vec_oprnds1.create (slp_node->vec_stmts_size);
for (k = 0; k < slp_node->vec_stmts_size; k++)
vec_oprnds1.quick_push (vec_oprnd1);
diff --git a/gcc/tree.h b/gcc/tree.h
index 55f97f9..99f2617 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -5053,6 +5053,17 @@ strip_array_types (tree type)
return type;
}
+/* Recursively traverse down pointer type layers to pointee type. */
+
+inline const_tree
+strip_pointer_types (const_tree type)
+{
+ while (POINTER_TYPE_P (type))
+ type = TREE_TYPE (type);
+
+ return type;
+}
+
/* Desription of the reason why the argument of valid_constant_size_p
is not a valid size. */
enum cst_size_error {
diff --git a/libbacktrace/ChangeLog b/libbacktrace/ChangeLog
index 36618b6..7761573 100644
--- a/libbacktrace/ChangeLog
+++ b/libbacktrace/ChangeLog
@@ -1,3 +1,7 @@
+2025-04-07 Jonathan Wakely <jwakely@redhat.com>
+
+ * atomic.c (backtrace_atomic_store_int): Use int for old value.
+
2025-02-10 Ian Lance Taylor <iant@golang.org>
* elf.c (elf_uncompress_lzma_block): Add casts to avoid
diff --git a/libbacktrace/atomic.c b/libbacktrace/atomic.c
index abf0d8d..43bb88d 100644
--- a/libbacktrace/atomic.c
+++ b/libbacktrace/atomic.c
@@ -103,7 +103,7 @@ backtrace_atomic_store_size_t (size_t *p, size_t v)
void
backtrace_atomic_store_int (int *p, int v)
{
- size_t old;
+ int old;
old = *p;
while (!__sync_bool_compare_and_swap (p, old, v))
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
index 7151f31..9df44ba 100644
--- a/libgcc/ChangeLog
+++ b/libgcc/ChangeLog
@@ -1,3 +1,44 @@
+2025-04-08 Thomas Schwinge <tschwinge@baylibre.com>
+
+ * config/gcn/unwind-gcn.c (_Unwind_RaiseException)
+ (_Unwind_Resume_or_Rethrow): New.
+ * config/nvptx/unwind-nvptx.c (_Unwind_RaiseException)
+ (_Unwind_Resume_or_Rethrow): Likewise.
+
+2025-04-08 Thomas Schwinge <tschwinge@baylibre.com>
+
+ * config/gcn/unwind-gcn.c (_Unwind_DeleteException): New.
+ * config/nvptx/unwind-nvptx.c (_Unwind_DeleteException): Likewise.
+
+2025-04-07 Thomas Schwinge <tschwinge@baylibre.com>
+
+ * config/nvptx/alloca.c: New.
+ * config/nvptx/t-nvptx (LIB2ADD): Add it.
+
+2025-04-07 Georg-Johann Lay <avr@gjlay.de>
+
+ * config/avr/lib1funcs.S (__mulhisi3, __umulhisi3): Use
+ __mulhisi3_helper for better performance on AVRrc.
+
+2025-04-06 Georg-Johann Lay <avr@gjlay.de>
+
+ * config/avr/t-avr (LIB1ASMFUNCS): Add (and remove from
+ FUNCS_notiny): _mulhisi3, _umulhisi3, _mulqq3, _mulhq3, _muluhq3,
+ _mulha3, _muluha3 _muluha3_round, _usmuluha3, _ssmulha3,
+ _divqq3, _udivuqq3, _divqq_helper, _divhq3, _udivuhq3.
+ _divha3 _udivuha3, _ssneg_2, _ssabs_1, _ssabs_2,
+ _mask1, _ret, _roundqq3 _rounduqq3,
+ _round_s2, _round_u2, _round_2_const, _addmask_2.
+ * config/avr/lib1funcs.S (__umulhisi3, __mulhisi3): Make
+ work on AVRrc.
+ * config/avr/lib1funcs-fixed.S: Build 8-bit and 16-bit functions
+ on AVRrc, too.
+
+2025-04-05 Georg-Johann Lay <avr@gjlay.de>
+
+ * config/avr/lib1funcs.S (__umulhisi3) [Have MUL]: Reduce call
+ depth by 1.
+
2025-03-22 Georg-Johann Lay <avr@gjlay.de>
* config/avr/t-avr (LIB1ASMFUNCS, LIB2FUNCS_EXCLUDE):
diff --git a/libgcc/config/avr/lib1funcs-fixed.S b/libgcc/config/avr/lib1funcs-fixed.S
index 278ee1b..4115589 100644
--- a/libgcc/config/avr/lib1funcs-fixed.S
+++ b/libgcc/config/avr/lib1funcs-fixed.S
@@ -31,14 +31,6 @@
;; Fixed point library routines for AVR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-#if defined __AVR_TINY__
-#define __zero_reg__ r17
-#define __tmp_reg__ r16
-#else
-#define __zero_reg__ r1
-#define __tmp_reg__ r0
-#endif
-
.section .text.libgcc.fixed, "ax", @progbits
#ifndef __AVR_TINY__
@@ -251,6 +243,7 @@ DEFUN __fractsfusa
ENDF __fractsfusa
#endif /* L_fractsfusa */
+#endif /* ! AVR_TINY */
;; For multiplication the functions here are called directly from
;; avr-fixed.md instead of using the standard libcall mechanisms.
@@ -295,8 +288,14 @@ DEFUN __mulhq3
rol r25
brvs 1f
;; Round
+#ifndef __AVR_TINY__
sbrc r23, 7
adiw r24, 1
+#else
+ lsl r23
+ adc r24, __zero_reg__
+ adc r25, __zero_reg__
+#endif /* AVR_TINY? */
ret
1: ;; Overflow. TR 18037 requires (-1)^2 not to overflow
ldi r24, lo8 (0x7fff)
@@ -315,8 +314,14 @@ ENDF __mulhq3
DEFUN __muluhq3
XCALL __umulhisi3
;; Round
+#ifndef __AVR_TINY__
sbrc r23, 7
adiw r24, 1
+#else
+ lsl r23
+ adc r24, __zero_reg__
+ adc r25, __zero_reg__
+#endif /* AVR_TINY? */
ret
ENDF __muluhq3
#endif /* L_muluhq3 */
@@ -361,8 +366,14 @@ DEFUN __muluha3_round
mov r25, r24
mov r24, r23
;; Round
+#ifndef __AVR_TINY__
sbrc r22, 7
adiw r24, 1
+#else
+ lsl r22
+ adc r24, __zero_reg__
+ adc r25, __zero_reg__
+#endif /* AVR_TINY? */
ret
ENDF __muluha3_round
#endif /* L_muluha3_round */
@@ -372,6 +383,8 @@ ENDF __muluha3_round
Fixed Multiplication 16.16 x 16.16
*******************************************************/
+#ifndef __AVR_TINY__
+
;; Bits outside the result (below LSB), used in the signed version
#define GUARD __tmp_reg__
@@ -679,6 +692,8 @@ ENDF __mulusa3_round
#undef GUARD
+#endif /* ! AVR_TINY */
+
/***********************************************************
Fixed unsigned saturated Multiplication 8.8 x 8.8
***********************************************************/
@@ -762,8 +777,14 @@ DEFUN __ssmulha3
;; SS = 0 --> 0x7fff
ldi C3, 0x7f
ldi C2, 0xff
+#ifndef __AVR_TINY__
sbrc SS, 7
adiw C2, 1
+#else
+ lsl SS
+ adc C2, __zero_reg__
+ adc C3, __zero_reg__
+#endif /* AVR_TINY? */
ret
ENDF __ssmulha3
#endif /* L_ssmulha3 */
@@ -778,6 +799,8 @@ ENDF __ssmulha3
Fixed unsigned saturated Multiplication 16.16 x 16.16
***********************************************************/
+#ifndef __AVR_TINY__
+
#define C0 18
#define C1 C0+1
#define C2 C0+2
@@ -883,6 +906,8 @@ ENDF __ssmulsa3
#undef C7
#undef SS
+#endif /* ! AVR_TINY */
+
/*******************************************************
Fractional Division 8 / 8
*******************************************************/
@@ -962,8 +987,8 @@ ENDF __divqq_helper
#if defined (L_divhq3)
DEFUN __divhq3
- mov r0, r_divdH
- eor r0, r_divH
+ mov __tmp_reg__, r_divdH
+ eor __tmp_reg__, r_divH
sbrs r_divH, 7
rjmp 1f
NEG2 r_divL
@@ -1027,8 +1052,8 @@ ENDF __udivuha3_common
*******************************************************/
#if defined (L_divha3)
DEFUN __divha3
- mov r0, r_divdH
- eor r0, r_divH
+ mov __tmp_reg__, r_divdH
+ eor __tmp_reg__, r_divH
sbrs r_divH, 7
rjmp 1f
NEG2 r_divL
@@ -1040,7 +1065,7 @@ DEFUN __divha3
XCALL __udivuha3
lsr r_quoH ; adjust to 7 fractional bits
ror r_quoL
- sbrs r0, 7 ; negate result if needed
+ sbrs __tmp_reg__, 7 ; negate result if needed
ret
NEG2 r_quoL
ret
@@ -1069,6 +1094,8 @@ ENDF __udivuha3
Fixed Division 16.16 / 16.16
*******************************************************/
+#ifndef __AVR_TINY__
+
#define r_arg1L 24 /* arg1 gets passed already in place */
#define r_arg1H 25
#define r_arg1HL 26
@@ -1171,6 +1198,8 @@ ENDF __udivusa3
#undef r_divHH
#undef r_cnt
+#endif /* ! AVR_TINY */
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Saturation, 1 Byte
@@ -1206,7 +1235,7 @@ ENDF __ssabs_1
DEFUN __ssneg_2
NEG2 A0
brvc 0f
- sbiw A0, 1
+ wsubi A0, 1
0: ret
ENDF __ssneg_2
#endif /* L_ssneg_2 */
@@ -1228,6 +1257,8 @@ ENDF __ssabs_2
;; Saturation, 4 Bytes
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+#ifndef __AVR_TINY__
+
;; First Argument and Return Register
#define A0 22
#define A1 A0+1
@@ -1413,6 +1444,8 @@ ENDF __sssub_8
#undef B6
#undef B7
+#endif /* ! AVR_TINY */
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Rounding Helpers
@@ -1613,6 +1646,8 @@ ENDF __round_u2_const
;; Rounding, 4 Bytes
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+#ifndef __AVR_TINY__
+
#define A0 18
#define A1 A0 + 1
#define A2 A0 + 2
@@ -1915,6 +1950,7 @@ ENDF __round_x8
#undef RP
#undef FBITm1
+#endif /* ! AVR_TINY */
;; Supply implementations / symbols for the bit-banging functions
;; __builtin_avr_bitsfx and __builtin_avr_fxbits
@@ -1923,5 +1959,3 @@ DEFUN __ret
ret
ENDF __ret
#endif /* L_ret */
-
-#endif /* if not __AVR_TINY__ */
diff --git a/libgcc/config/avr/lib1funcs.S b/libgcc/config/avr/lib1funcs.S
index 96f20ca..dfe99b1 100644
--- a/libgcc/config/avr/lib1funcs.S
+++ b/libgcc/config/avr/lib1funcs.S
@@ -395,45 +395,57 @@ ENDF __mulhi3
#if defined (L_umulhisi3)
DEFUN __umulhisi3
+#ifdef __AVR_TINY__
+ ;; Save callee saved regs.
+ push B0
+ push B1
+#endif /* AVR_TINY */
wmov B0, 24
;; Zero-extend B
clr B2
clr B3
;; Zero-extend A
wmov A2, B2
+#ifdef __AVR_TINY__
+ ;; Clear hi16 of the result so we can use __mulsi3_helper.
+ wmov CC2, B2
+ XJMP __mulsi3_helper
+#else
XJMP __mulsi3
+#endif /* AVR_TINY? */
ENDF __umulhisi3
#endif /* L_umulhisi3 */
#if defined (L_mulhisi3)
DEFUN __mulhisi3
+#ifdef __AVR_TINY__
+ ;; Save callee saved regs.
+ push B0
+ push B1
+#endif /* AVR_TINY */
wmov B0, 24
;; Sign-extend B
lsl r25
sbc B2, B2
mov B3, B2
-#ifdef __AVR_ERRATA_SKIP_JMP_CALL__
- ;; Sign-extend A
- clr A2
- sbrc A1, 7
- com A2
- mov A3, A2
- XJMP __mulsi3
-#else /* no __AVR_ERRATA_SKIP_JMP_CALL__ */
;; Zero-extend A and __mulsi3 will run at least twice as fast
;; compared to a sign-extended A.
clr A2
clr A3
+ ;; Clear hi16 of the result so we can use __mulsi3_helper.
+ wmov CC2, A2
sbrs A1, 7
- XJMP __mulsi3
+#ifdef __AVR_ERRATA_SKIP_JMP_CALL__
+ rjmp 1f
+#else
+ XJMP __mulsi3_helper
+#endif /* ERRATA_SKIP */
;; If A < 0 then perform the B * 0xffff.... before the
;; very multiplication by initializing the high part of the
;; result CC with -B.
- wmov CC2, A2
sub CC2, B0
sbc CC3, B1
- XJMP __mulsi3_helper
-#endif /* __AVR_ERRATA_SKIP_JMP_CALL__ */
+1: XJMP __mulsi3_helper
ENDF __mulhisi3
#endif /* L_mulhisi3 */
@@ -581,19 +593,12 @@ DEFUN __umulhisi3
mul A1, B1
movw C2, r0
mul A0, B1
-#ifdef __AVR_HAVE_JMP_CALL__
- ;; This function is used by many other routines, often multiple times.
- ;; Therefore, if the flash size is not too limited, avoid the RCALL
- ;; and inverst 6 Bytes to speed things up.
add C1, r0
adc C2, r1
clr __zero_reg__
adc C3, __zero_reg__
-#else
- rcall 1f
-#endif
mul A1, B0
-1: add C1, r0
+ add C1, r0
adc C2, r1
clr __zero_reg__
adc C3, __zero_reg__
diff --git a/libgcc/config/avr/t-avr b/libgcc/config/avr/t-avr
index b10542c..d181784 100644
--- a/libgcc/config/avr/t-avr
+++ b/libgcc/config/avr/t-avr
@@ -4,6 +4,7 @@ LIB1ASMFUNCS = \
_mulhi3 \
_mulqihi3 _umulqihi3 \
_mulpsi3 \
+ _mulhisi3 _umulhisi3 \
_mulsi3 \
_udivmodqi4 \
_divmodqi4 \
@@ -33,12 +34,23 @@ LIB1ASMFUNCS = \
_popcountsi2 \
_popcountqi2 \
_bswapsi2 \
- _fmul _fmuls _fmulsu
+ _fmul _fmuls _fmulsu \
+ _mulqq3 \
+ _mulhq3 _muluhq3 \
+ _mulha3 _muluha3 _muluha3_round \
+ _usmuluha3 _ssmulha3 \
+ _divqq3 _udivuqq3 _divqq_helper \
+ _divhq3 _udivuhq3 \
+ _divha3 _udivuha3 \
+ _ssneg_2 \
+ _ssabs_1 _ssabs_2 \
+ _mask1 _ret \
+ _roundqq3 _rounduqq3 \
+ _round_s2 _round_u2 _round_2_const _addmask_2 \
# The below functions either use registers that are not present
# in tiny core, or use a different register convention (don't save
# callee saved regs, for example)
-# _mulhisi3 and variations - clobber R18, R19
# All *di funcs - use regs < R16 or expect args in regs < R20
# _prologue and _epilogue save registers < R16
# _load, __fload and _xload variations - expect lpm and elpm support
@@ -46,8 +58,6 @@ LIB1ASMFUNCS = \
FUNCS_notiny = \
_mulsqipsi3 \
- _mulhisi3 \
- _umulhisi3 \
_usmulhisi3 \
_muluhisi3 \
_mulshisi3 \
@@ -81,24 +91,14 @@ FUNCS_notiny += \
_fractsfqq _fractsfuqq \
_fractsfhq _fractsfuhq _fractsfha _fractsfuha \
_fractsfsq _fractsfusq _fractsfsa _fractsfusa \
- _mulqq3 \
- _mulhq3 _muluhq3 \
- _mulha3 _muluha3 _muluha3_round \
_mulsa3 _mulusa3 \
- _usmuluha3 _ssmulha3 \
_usmulusa3 _ssmulsa3 \
- _divqq3 _udivuqq3 _divqq_helper \
- _divhq3 _udivuhq3 \
- _divha3 _udivuha3 \
_divsa3 _udivusa3 \
_clr_8 \
- _ssneg_2 _ssneg_4 _ssneg_8 \
- _ssabs_1 _ssabs_2 _ssabs_4 _ssabs_8 \
+ _ssneg_4 _ssneg_8 \
+ _ssabs_4 _ssabs_8 \
_ssadd_8 _sssub_8 \
_usadd_8 _ussub_8 \
- _mask1 _ret \
- _roundqq3 _rounduqq3 \
- _round_s2 _round_u2 _round_2_const _addmask_2 \
_round_s4 _round_u4 _round_4_const _addmask_4 \
_round_x8 \
_rounddq3 _roundudq3 \
diff --git a/libgcc/config/gcn/unwind-gcn.c b/libgcc/config/gcn/unwind-gcn.c
index 44657ae..eae741c 100644
--- a/libgcc/config/gcn/unwind-gcn.c
+++ b/libgcc/config/gcn/unwind-gcn.c
@@ -25,6 +25,27 @@
#include "unwind.h"
_Unwind_Reason_Code
+_Unwind_RaiseException(struct _Unwind_Exception *exc __attribute__ ((__unused__)))
+{
+ __builtin_abort ();
+ return 0;
+}
+
+void
+_Unwind_DeleteException (struct _Unwind_Exception *exc)
+{
+ if (exc->exception_cleanup)
+ (*exc->exception_cleanup) (_URC_FOREIGN_EXCEPTION_CAUGHT, exc);
+}
+
+_Unwind_Reason_Code
+_Unwind_Resume_or_Rethrow (struct _Unwind_Exception *exc __attribute__ ((__unused__)))
+{
+ __builtin_abort ();
+ return 0;
+}
+
+_Unwind_Reason_Code
_Unwind_Backtrace(_Unwind_Trace_Fn trace, void * trace_argument)
{
return 0;
diff --git a/libgcc/config/nvptx/alloca.c b/libgcc/config/nvptx/alloca.c
new file mode 100644
index 0000000..09bdeb6
--- /dev/null
+++ b/libgcc/config/nvptx/alloca.c
@@ -0,0 +1,38 @@
+/* Fake 'alloca' implementation.
+
+ Copyright (C) 2025 Free Software Foundation, Inc.
+
+ This file is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 3, or (at your option) any
+ later version.
+
+ This file is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
+
+ You should have received a copy of the GNU General Public License and
+ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+ <http://www.gnu.org/licenses/>. */
+
+/* For '-mfake-ptx-alloca', in case real PTX 'alloca' is not available.
+ With this function defined, we don't get a link-time failure
+ (unresolved symbol '__GCC_nvptx__PTX_alloca_not_supported'), but rather:
+ successful execution, in case that 'alloca' is not attempted (if only used
+ in error code paths, for example), and a run-time failure only in case that
+ 'alloca' is actually attempted. */
+
+void *
+__GCC_nvptx__PTX_alloca_not_supported (__SIZE_TYPE__ size __attribute__ ((unused)))
+{
+ __builtin_printf ("GCC/nvptx: sorry, unimplemented:"
+ " dynamic stack allocation not supported\n");
+ __builtin_abort ();
+ return 0;
+}
diff --git a/libgcc/config/nvptx/t-nvptx b/libgcc/config/nvptx/t-nvptx
index f295898..5e2e278 100644
--- a/libgcc/config/nvptx/t-nvptx
+++ b/libgcc/config/nvptx/t-nvptx
@@ -1,7 +1,8 @@
LIB2ADD=$(srcdir)/config/nvptx/reduction.c \
$(srcdir)/config/nvptx/mgomp.c \
$(srcdir)/config/nvptx/atomic.c \
- $(srcdir)/config/nvptx/unwind-nvptx.c
+ $(srcdir)/config/nvptx/unwind-nvptx.c \
+ $(srcdir)/config/nvptx/alloca.c
LIB2ADDEH=
LIB2FUNCS_EXCLUDE=
diff --git a/libgcc/config/nvptx/unwind-nvptx.c b/libgcc/config/nvptx/unwind-nvptx.c
index 44657ae..eae741c 100644
--- a/libgcc/config/nvptx/unwind-nvptx.c
+++ b/libgcc/config/nvptx/unwind-nvptx.c
@@ -25,6 +25,27 @@
#include "unwind.h"
_Unwind_Reason_Code
+_Unwind_RaiseException(struct _Unwind_Exception *exc __attribute__ ((__unused__)))
+{
+ __builtin_abort ();
+ return 0;
+}
+
+void
+_Unwind_DeleteException (struct _Unwind_Exception *exc)
+{
+ if (exc->exception_cleanup)
+ (*exc->exception_cleanup) (_URC_FOREIGN_EXCEPTION_CAUGHT, exc);
+}
+
+_Unwind_Reason_Code
+_Unwind_Resume_or_Rethrow (struct _Unwind_Exception *exc __attribute__ ((__unused__)))
+{
+ __builtin_abort ();
+ return 0;
+}
+
+_Unwind_Reason_Code
_Unwind_Backtrace(_Unwind_Trace_Fn trace, void * trace_argument)
{
return 0;
diff --git a/libgcobol/ChangeLog b/libgcobol/ChangeLog
index e06ccbe..28cd912 100644
--- a/libgcobol/ChangeLog
+++ b/libgcobol/ChangeLog
@@ -1,3 +1,21 @@
+2025-04-05 Iain Sandoe <iain@sandoe.co.uk>
+
+ * Makefile.am: Add libgcobol.spec and dependency.
+ * Makefile.in: Regenerate.
+ * configure: Regenerate.
+ * configure.ac: Add libgcobol.spec handling.
+ * libgcobol.spec.in: New file.
+
+2025-04-05 Iain Sandoe <iain@sandoe.co.uk>
+
+ * aclocal.m4: Regenerate.
+ * config.h.in: Regenerate.
+ * Makefile.am: Use the configured LIBS and extra_ldflags.
+ * Makefile.in: Regenerate.
+ * configure: Regenerate.
+ * configure.ac: Shift configure to use c++. Order tests for tools
+ and environment before other tests.
+
2025-04-04 Iain Sandoe <iain@sandoe.co.uk>
* Makefile.am: Use $(LIBM) to add the math lib when
diff --git a/libgcobol/Makefile.am b/libgcobol/Makefile.am
index 4521742..89d0519 100644
--- a/libgcobol/Makefile.am
+++ b/libgcobol/Makefile.am
@@ -25,9 +25,10 @@ ACLOCAL_AMFLAGS = -I .. -I ../config
# May be used by various substitution variables.
gcc_version := $(shell @get_gcc_base_ver@ $(top_srcdir)/../gcc/BASE-VER)
+# Skip the whole process if we are not building libgcobol.
if BUILD_LIBGCOBOL
toolexeclib_LTLIBRARIES = libgcobol.la
-endif
+toolexeclib_DATA = libgcobol.spec
##
## 2.2.12 Automatic Dependency Tracking
@@ -43,22 +44,27 @@ libgcobol_la_SOURCES = \
libgcobol.cc \
valconv.cc
-libgcobol_la_LINK = $(LIBTOOL) --mode=link --tag=CXX $(CXX) \
- -o libgcobol$(libsuffix).la \
- -Wc,-shared-libgcc \
- -version-info $(LIBGCOBOL_VERSION) \
- -lstdc++ \
- $(LTLDFLAGS) $(LTLIBICONV) $(LIBM)
-
WARN_CFLAGS = -W -Wall -Wwrite-strings
-AM_CXXFLAGS = $(CXXFLAGS_FOR_TARGET)
+AM_CPPFLAGS = -I. -I$(srcdir)
+AM_CFLAGS = $(XCFLAGS)
+AM_CXXFLAGS = $(XCFLAGS)
+AM_CXXFLAGS += $(WARN_CFLAGS)
+AM_CXXFLAGS += -DIN_TARGET_LIBS
+AM_CXXFLAGS += -fno-strict-aliasing
+
+if ENABLE_DARWIN_AT_RPATH
+# Handle embedded rpaths for Darwin.
+extra_ldflags_libgcobol += -Wc,-nodefaultrpaths
+extra_ldflags_libgcobol += -Wl,-rpath,@loader_path
+endif
-# not defined: DEFS, MAX_ERRORS, LTLDFLAGS
-ALL_CXXFLAGS = -I. -I$(srcdir) $(AM_CPPFLAGS) $(DEFS) \
- $(XCFLAGS) $(AM_CXXFLAGS) $(WARN_CFLAGS) $(MAX_ERRORS) \
- -DIN_GCC -DIN_TARGET_LIBS -fno-strict-aliasing
+# We want to link with the c++ runtime.
+libgcobol_la_LINK = $(CXXLINK) $(libgcobol_la_LDFLAGS)
+version_arg = -version-info $(LIBGCOBOL_VERSION)
+libgcobol_la_LDFLAGS = $(LTLDFLAGS) $(LTLIBICONV) \
+ $(extra_ldflags_libgcobol) $(LIBS) \
+ $(version_arg)
+libgcobol_la_DEPENDENCIES = libgcobol.spec
-%.lo: %.cc
- $(LIBTOOL) --mode=compile --tag=CXX $(CXX) -c \
- -o $@ $(INCLUDES) $(ALL_CXXFLAGS) $<
+endif BUILD_LIBGCOBOL
diff --git a/libgcobol/Makefile.in b/libgcobol/Makefile.in
index 0f0d9b6..88158cb 100644
--- a/libgcobol/Makefile.in
+++ b/libgcobol/Makefile.in
@@ -35,6 +35,7 @@
# Written de novo for libgcobol.
+
VPATH = @srcdir@
am__is_gnu_make = { \
if test -z '$(MAKELEVEL)'; then \
@@ -110,6 +111,10 @@ POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
+
+# Handle embedded rpaths for Darwin.
+@BUILD_LIBGCOBOL_TRUE@@ENABLE_DARWIN_AT_RPATH_TRUE@am__append_1 = -Wc,-nodefaultrpaths \
+@BUILD_LIBGCOBOL_TRUE@@ENABLE_DARWIN_AT_RPATH_TRUE@ -Wl,-rpath,@loader_path
subdir = .
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/../config/depstand.m4 \
@@ -132,12 +137,12 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/depstand.m4 \
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
- $(am__configure_deps) $(am__DIST_COMMON)
+ $(am__configure_deps)
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
configure.lineno config.status.lineno
mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs
CONFIG_HEADER = config.h
-CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_FILES = libgcobol.spec
CONFIG_CLEAN_VPATH_FILES =
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
am__vpath_adj = case $$p in \
@@ -166,11 +171,14 @@ am__uninstall_files_from_dir = { \
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
$(am__cd) "$$dir" && rm -f $$files; }; \
}
-am__installdirs = "$(DESTDIR)$(toolexeclibdir)"
+am__installdirs = "$(DESTDIR)$(toolexeclibdir)" \
+ "$(DESTDIR)$(toolexeclibdir)"
LTLIBRARIES = $(toolexeclib_LTLIBRARIES)
libgcobol_la_LIBADD =
-am_libgcobol_la_OBJECTS = charmaps.lo constants.lo gfileio.lo gmath.lo \
- intrinsic.lo io.lo libgcobol.lo valconv.lo
+@BUILD_LIBGCOBOL_TRUE@am_libgcobol_la_OBJECTS = charmaps.lo \
+@BUILD_LIBGCOBOL_TRUE@ constants.lo gfileio.lo gmath.lo \
+@BUILD_LIBGCOBOL_TRUE@ intrinsic.lo io.lo libgcobol.lo \
+@BUILD_LIBGCOBOL_TRUE@ valconv.lo
libgcobol_la_OBJECTS = $(am_libgcobol_la_OBJECTS)
@BUILD_LIBGCOBOL_TRUE@am_libgcobol_la_rpath = -rpath $(toolexeclibdir)
AM_V_P = $(am__v_P_@AM_V@)
@@ -212,12 +220,12 @@ am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
am__v_CXXLD_0 = @echo " CXXLD " $@;
am__v_CXXLD_1 =
SOURCES = $(libgcobol_la_SOURCES)
-DIST_SOURCES = $(libgcobol_la_SOURCES)
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \
*) (install-info --version) >/dev/null 2>&1;; \
esac
+DATA = $(toolexeclib_DATA)
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
$(LISP)config.h.in
# Read a list of newline-separated strings from the standard input,
@@ -240,29 +248,6 @@ ETAGS = etags
CTAGS = ctags
CSCOPE = cscope
AM_RECURSIVE_TARGETS = cscope
-am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \
- $(top_srcdir)/../compile $(top_srcdir)/../config.guess \
- $(top_srcdir)/../config.sub $(top_srcdir)/../depcomp \
- $(top_srcdir)/../install-sh $(top_srcdir)/../ltmain.sh \
- $(top_srcdir)/../missing $(top_srcdir)/../mkinstalldirs \
- ChangeLog README
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-distdir = $(PACKAGE)-$(VERSION)
-top_distdir = $(distdir)
-am__remove_distdir = \
- if test -d "$(distdir)"; then \
- find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
- && rm -rf "$(distdir)" \
- || { sleep 5 && rm -rf "$(distdir)"; }; \
- else :; fi
-am__post_remove_distdir = $(am__remove_distdir)
-DIST_ARCHIVES = $(distdir).tar.gz
-GZIP_ENV = --best
-DIST_TARGETS = dist-gzip
-distuninstallcheck_listfiles = find . -type f -print
-am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
- | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
-distcleancheck_listfiles = find . -type f -print
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -272,11 +257,7 @@ AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
-CCAS = @CCAS@
-CCASDEPMODE = @CCASDEPMODE@
-CCASFLAGS = @CCASFLAGS@
CCDEPMODE = @CCDEPMODE@
-CC_FOR_BUILD = @CC_FOR_BUILD@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
@@ -337,7 +318,6 @@ SHELL = @SHELL@
SPEC_LIBGCOBOL_DEPS = @SPEC_LIBGCOBOL_DEPS@
STRIP = @STRIP@
VERSION = @VERSION@
-VERSION_SUFFIX = @VERSION_SUFFIX@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
@@ -354,9 +334,7 @@ bindir = @bindir@
build = @build@
build_alias = @build_alias@
build_cpu = @build_cpu@
-build_libsubdir = @build_libsubdir@
build_os = @build_os@
-build_subdir = @build_subdir@
build_vendor = @build_vendor@
builddir = @builddir@
datadir = @datadir@
@@ -366,14 +344,12 @@ dvidir = @dvidir@
enable_shared = @enable_shared@
enable_static = @enable_static@
exec_prefix = @exec_prefix@
-extra_darwin_ldflags_libgcobol = @extra_darwin_ldflags_libgcobol@
+extra_ldflags_libgcobol = @extra_ldflags_libgcobol@ $(am__append_1)
get_gcc_base_ver = @get_gcc_base_ver@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
-host_noncanonical = @host_noncanonical@
host_os = @host_os@
-host_subdir = @host_subdir@
host_vendor = @host_vendor@
htmldir = @htmldir@
includedir = @includedir@
@@ -393,7 +369,6 @@ program_transform_name = @program_transform_name@
psdir = @psdir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
-slibdir = @slibdir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target = @target@
@@ -401,7 +376,6 @@ target_alias = @target_alias@
target_cpu = @target_cpu@
target_noncanonical = @target_noncanonical@
target_os = @target_os@
-target_subdir = @target_subdir@
target_vendor = @target_vendor@
toolexecdir = @toolexecdir@
toolexeclibdir = @toolexeclibdir@
@@ -413,32 +387,34 @@ ACLOCAL_AMFLAGS = -I .. -I ../config
# May be used by various substitution variables.
gcc_version := $(shell @get_gcc_base_ver@ $(top_srcdir)/../gcc/BASE-VER)
-@BUILD_LIBGCOBOL_TRUE@toolexeclib_LTLIBRARIES = libgcobol.la
-libgcobol_la_SOURCES = \
- charmaps.cc \
- constants.cc \
- gfileio.cc \
- gmath.cc \
- intrinsic.cc \
- io.cc \
- libgcobol.cc \
- valconv.cc
-
-libgcobol_la_LINK = $(LIBTOOL) --mode=link --tag=CXX $(CXX) \
- -o libgcobol$(libsuffix).la \
- -Wc,-shared-libgcc \
- -version-info $(LIBGCOBOL_VERSION) \
- -lstdc++ \
- $(LTLDFLAGS) $(LTLIBICONV) $(LIBM)
-
-WARN_CFLAGS = -W -Wall -Wwrite-strings
-AM_CXXFLAGS = $(CXXFLAGS_FOR_TARGET)
-
-# not defined: DEFS, MAX_ERRORS, LTLDFLAGS
-ALL_CXXFLAGS = -I. -I$(srcdir) $(AM_CPPFLAGS) $(DEFS) \
- $(XCFLAGS) $(AM_CXXFLAGS) $(WARN_CFLAGS) $(MAX_ERRORS) \
- -DIN_GCC -DIN_TARGET_LIBS -fno-strict-aliasing
+# Skip the whole process if we are not building libgcobol.
+@BUILD_LIBGCOBOL_TRUE@toolexeclib_LTLIBRARIES = libgcobol.la
+@BUILD_LIBGCOBOL_TRUE@toolexeclib_DATA = libgcobol.spec
+@BUILD_LIBGCOBOL_TRUE@libgcobol_la_SOURCES = \
+@BUILD_LIBGCOBOL_TRUE@ charmaps.cc \
+@BUILD_LIBGCOBOL_TRUE@ constants.cc \
+@BUILD_LIBGCOBOL_TRUE@ gfileio.cc \
+@BUILD_LIBGCOBOL_TRUE@ gmath.cc \
+@BUILD_LIBGCOBOL_TRUE@ intrinsic.cc \
+@BUILD_LIBGCOBOL_TRUE@ io.cc \
+@BUILD_LIBGCOBOL_TRUE@ libgcobol.cc \
+@BUILD_LIBGCOBOL_TRUE@ valconv.cc
+
+@BUILD_LIBGCOBOL_TRUE@WARN_CFLAGS = -W -Wall -Wwrite-strings
+@BUILD_LIBGCOBOL_TRUE@AM_CPPFLAGS = -I. -I$(srcdir)
+@BUILD_LIBGCOBOL_TRUE@AM_CFLAGS = $(XCFLAGS)
+@BUILD_LIBGCOBOL_TRUE@AM_CXXFLAGS = $(XCFLAGS) $(WARN_CFLAGS) \
+@BUILD_LIBGCOBOL_TRUE@ -DIN_TARGET_LIBS -fno-strict-aliasing
+
+# We want to link with the c++ runtime.
+@BUILD_LIBGCOBOL_TRUE@libgcobol_la_LINK = $(CXXLINK) $(libgcobol_la_LDFLAGS)
+@BUILD_LIBGCOBOL_TRUE@version_arg = -version-info $(LIBGCOBOL_VERSION)
+@BUILD_LIBGCOBOL_TRUE@libgcobol_la_LDFLAGS = $(LTLDFLAGS) $(LTLIBICONV) \
+@BUILD_LIBGCOBOL_TRUE@ $(extra_ldflags_libgcobol) $(LIBS) \
+@BUILD_LIBGCOBOL_TRUE@ $(version_arg)
+
+@BUILD_LIBGCOBOL_TRUE@libgcobol_la_DEPENDENCIES = libgcobol.spec
all: config.h
$(MAKE) $(AM_MAKEFLAGS) all-am
@@ -492,6 +468,8 @@ $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
distclean-hdr:
-rm -f config.h stamp-h1
+libgcobol.spec: $(top_builddir)/config.status $(srcdir)/libgcobol.spec.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
install-toolexeclibLTLIBRARIES: $(toolexeclib_LTLIBRARIES)
@$(NORMAL_INSTALL)
@@ -575,6 +553,27 @@ clean-libtool:
distclean-libtool:
-rm -f libtool config.lt
+install-toolexeclibDATA: $(toolexeclib_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(toolexeclib_DATA)'; test -n "$(toolexeclibdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(toolexeclibdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibdir)" || exit $$?; \
+ done
+
+uninstall-toolexeclibDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(toolexeclib_DATA)'; test -n "$(toolexeclibdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(toolexeclibdir)'; $(am__uninstall_files_from_dir)
ID: $(am__tagged_files)
$(am__define_uniq_tagged_files); mkid -fID $$unique
@@ -634,175 +633,11 @@ cscopelist-am: $(am__tagged_files)
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
-
-distdir: $(DISTFILES)
- $(am__remove_distdir)
- test -d "$(distdir)" || mkdir "$(distdir)"
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
- -test -n "$(am__skip_mode_fix)" \
- || find "$(distdir)" -type d ! -perm -755 \
- -exec chmod u+rwx,go+rx {} \; -o \
- ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
- ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
- ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
- || chmod -R a+r "$(distdir)"
-dist-gzip: distdir
- tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
- $(am__post_remove_distdir)
-
-dist-bzip2: distdir
- tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
- $(am__post_remove_distdir)
-
-dist-lzip: distdir
- tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
- $(am__post_remove_distdir)
-
-dist-xz: distdir
- tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
- $(am__post_remove_distdir)
-
-dist-tarZ: distdir
- @echo WARNING: "Support for distribution archives compressed with" \
- "legacy program 'compress' is deprecated." >&2
- @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
- tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
- $(am__post_remove_distdir)
-
-dist-shar: distdir
- @echo WARNING: "Support for shar distribution archives is" \
- "deprecated." >&2
- @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
- shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
- $(am__post_remove_distdir)
-
-dist-zip: distdir
- -rm -f $(distdir).zip
- zip -rq $(distdir).zip $(distdir)
- $(am__post_remove_distdir)
-
-dist dist-all:
- $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
- $(am__post_remove_distdir)
-
-# This target untars the dist file and tries a VPATH configuration. Then
-# it guarantees that the distribution is self-contained by making another
-# tarfile.
-distcheck: dist
- case '$(DIST_ARCHIVES)' in \
- *.tar.gz*) \
- eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
- *.tar.bz2*) \
- bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
- *.tar.lz*) \
- lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
- *.tar.xz*) \
- xz -dc $(distdir).tar.xz | $(am__untar) ;;\
- *.tar.Z*) \
- uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
- *.shar.gz*) \
- eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
- *.zip*) \
- unzip $(distdir).zip ;;\
- esac
- chmod -R a-w $(distdir)
- chmod u+w $(distdir)
- mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
- chmod a-w $(distdir)
- test -d $(distdir)/_build || exit 0; \
- dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
- && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
- && am__cwd=`pwd` \
- && $(am__cd) $(distdir)/_build/sub \
- && ../../configure \
- $(AM_DISTCHECK_CONFIGURE_FLAGS) \
- $(DISTCHECK_CONFIGURE_FLAGS) \
- --srcdir=../.. --prefix="$$dc_install_base" \
- && $(MAKE) $(AM_MAKEFLAGS) \
- && $(MAKE) $(AM_MAKEFLAGS) dvi \
- && $(MAKE) $(AM_MAKEFLAGS) check \
- && $(MAKE) $(AM_MAKEFLAGS) install \
- && $(MAKE) $(AM_MAKEFLAGS) installcheck \
- && $(MAKE) $(AM_MAKEFLAGS) uninstall \
- && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
- distuninstallcheck \
- && chmod -R a-w "$$dc_install_base" \
- && ({ \
- (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
- && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
- && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
- && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
- distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
- } || { rm -rf "$$dc_destdir"; exit 1; }) \
- && rm -rf "$$dc_destdir" \
- && $(MAKE) $(AM_MAKEFLAGS) dist \
- && rm -rf $(DIST_ARCHIVES) \
- && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
- && cd "$$am__cwd" \
- || exit 1
- $(am__post_remove_distdir)
- @(echo "$(distdir) archives ready for distribution: "; \
- list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
- sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
-distuninstallcheck:
- @test -n '$(distuninstallcheck_dir)' || { \
- echo 'ERROR: trying to run $@ with an empty' \
- '$$(distuninstallcheck_dir)' >&2; \
- exit 1; \
- }; \
- $(am__cd) '$(distuninstallcheck_dir)' || { \
- echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
- exit 1; \
- }; \
- test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
- || { echo "ERROR: files left after uninstall:" ; \
- if test -n "$(DESTDIR)"; then \
- echo " (check DESTDIR support)"; \
- fi ; \
- $(distuninstallcheck_listfiles) ; \
- exit 1; } >&2
-distcleancheck: distclean
- @if test '$(srcdir)' = . ; then \
- echo "ERROR: distcleancheck can only run from a VPATH build" ; \
- exit 1 ; \
- fi
- @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
- || { echo "ERROR: files left in build directory after distclean:" ; \
- $(distcleancheck_listfiles) ; \
- exit 1; } >&2
check-am: all-am
check: check-am
-all-am: Makefile $(LTLIBRARIES) config.h
+all-am: Makefile $(LTLIBRARIES) $(DATA) config.h
installdirs:
- for dir in "$(DESTDIR)$(toolexeclibdir)"; do \
+ for dir in "$(DESTDIR)$(toolexeclibdir)" "$(DESTDIR)$(toolexeclibdir)"; do \
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
done
install: install-am
@@ -865,7 +700,8 @@ install-dvi: install-dvi-am
install-dvi-am:
-install-exec-am: install-toolexeclibLTLIBRARIES
+install-exec-am: install-toolexeclibDATA \
+ install-toolexeclibLTLIBRARIES
install-html: install-html-am
@@ -907,36 +743,31 @@ ps: ps-am
ps-am:
-uninstall-am: uninstall-toolexeclibLTLIBRARIES
+uninstall-am: uninstall-toolexeclibDATA \
+ uninstall-toolexeclibLTLIBRARIES
.MAKE: all install-am install-strip
.PHONY: CTAGS GTAGS TAGS all all-am am--refresh check check-am clean \
clean-cscope clean-generic clean-libtool \
clean-toolexeclibLTLIBRARIES cscope cscopelist-am ctags \
- ctags-am dist dist-all dist-bzip2 dist-gzip dist-lzip \
- dist-shar dist-tarZ dist-xz dist-zip distcheck distclean \
- distclean-compile distclean-generic distclean-hdr \
- distclean-libtool distclean-tags distcleancheck distdir \
- distuninstallcheck dvi dvi-am html html-am info info-am \
- install install-am install-data install-data-am install-dvi \
- install-dvi-am install-exec install-exec-am install-html \
- install-html-am install-info install-info-am install-man \
- install-pdf install-pdf-am install-ps install-ps-am \
- install-strip install-toolexeclibLTLIBRARIES installcheck \
- installcheck-am installdirs maintainer-clean \
- maintainer-clean-generic mostlyclean mostlyclean-compile \
- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags tags-am uninstall uninstall-am \
+ ctags-am distclean distclean-compile distclean-generic \
+ distclean-hdr distclean-libtool distclean-tags dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip install-toolexeclibDATA \
+ install-toolexeclibLTLIBRARIES installcheck installcheck-am \
+ installdirs maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
+ uninstall-am uninstall-toolexeclibDATA \
uninstall-toolexeclibLTLIBRARIES
.PRECIOUS: Makefile
-%.lo: %.cc
- $(LIBTOOL) --mode=compile --tag=CXX $(CXX) -c \
- -o $@ $(INCLUDES) $(ALL_CXXFLAGS) $<
-
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
diff --git a/libgcobol/aclocal.m4 b/libgcobol/aclocal.m4
index 25c8b71..c3c69e6 100644
--- a/libgcobol/aclocal.m4
+++ b/libgcobol/aclocal.m4
@@ -56,26 +56,6 @@ m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
-# Figure out how to run the assembler. -*- Autoconf -*-
-
-# Copyright (C) 2001-2017 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_AS
-# ----------
-AC_DEFUN([AM_PROG_AS],
-[# By default we simply use the C compiler to build assembly code.
-AC_REQUIRE([AC_PROG_CC])
-test "${CCAS+set}" = set || CCAS=$CC
-test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS
-AC_ARG_VAR([CCAS], [assembler compiler command (defaults to CC)])
-AC_ARG_VAR([CCASFLAGS], [assembler compiler flags (defaults to CFLAGS)])
-_AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl
-])
-
# AM_AUX_DIR_EXPAND -*- Autoconf -*-
# Copyright (C) 2001-2017 Free Software Foundation, Inc.
diff --git a/libgcobol/config.h.in b/libgcobol/config.h.in
index 5dd2b50..d61ff7a 100644
--- a/libgcobol/config.h.in
+++ b/libgcobol/config.h.in
@@ -64,9 +64,6 @@
*/
#undef LT_OBJDIR
-/* Name of package */
-#undef PACKAGE
-
/* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT
@@ -113,9 +110,6 @@
#endif
-/* Version number of package */
-#undef VERSION
-
/* Define to 1 if on MINIX. */
#undef _MINIX
diff --git a/libgcobol/configure b/libgcobol/configure
index e7b3b83..1715b98 100755
--- a/libgcobol/configure
+++ b/libgcobol/configure
@@ -630,24 +630,32 @@ ac_includes_default="\
#endif"
ac_func_list=
-ac_unique_file="Makefile.am"
ac_subst_vars='am__EXEEXT_FALSE
am__EXEEXT_TRUE
LTLIBOBJS
LIBOBJS
+SPEC_LIBGCOBOL_DEPS
+get_gcc_base_ver
+extra_ldflags_libgcobol
+LIBGCOBOL_VERSION
+BUILD_LIBGCOBOL_FALSE
+BUILD_LIBGCOBOL_TRUE
LTLIBICONV
LIBICONV
-extra_darwin_ldflags_libgcobol
-VERSION_SUFFIX
-LIBGCOBOL_VERSION
-SPEC_LIBGCOBOL_DEPS
-CC_FOR_BUILD
+toolexeclibdir
+toolexecdir
+CXXCPP
+am__fastdepCXX_FALSE
+am__fastdepCXX_TRUE
+CXXDEPMODE
+ac_ct_CXX
+CXXFLAGS
+CXX
enable_static
enable_shared
ENABLE_DARWIN_AT_RPATH_FALSE
ENABLE_DARWIN_AT_RPATH_TRUE
LIBM
-CXXCPP
OTOOL64
OTOOL
LIPO
@@ -664,36 +672,9 @@ LIBTOOL
RANLIB
NM
AR
-am__fastdepCCAS_FALSE
-am__fastdepCCAS_TRUE
-CCASDEPMODE
-CCASFLAGS
-CCAS
-am__fastdepCXX_FALSE
-am__fastdepCXX_TRUE
-CXXDEPMODE
-ac_ct_CXX
-CXXFLAGS
-CXX
-MAINTAINER_MODE_FALSE
-MAINTAINER_MODE_TRUE
-get_gcc_base_ver
-toolexeclibdir
-toolexecdir
-MAINT
-slibdir
-BUILD_LIBGCOBOL_FALSE
-BUILD_LIBGCOBOL_TRUE
-target_subdir
-host_subdir
-build_subdir
-build_libsubdir
-target_noncanonical
-host_noncanonical
-AM_BACKSLASH
-AM_DEFAULT_VERBOSITY
-AM_DEFAULT_V
-AM_V
+EGREP
+GREP
+CPP
am__fastdepCC_FALSE
am__fastdepCC_TRUE
CCDEPMODE
@@ -704,6 +685,17 @@ AMDEP_TRUE
am__quote
am__include
DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
am__untar
am__tar
AMTAR
@@ -727,6 +719,11 @@ am__isrc
INSTALL_DATA
INSTALL_SCRIPT
INSTALL_PROGRAM
+MAINT
+MAINTAINER_MODE_FALSE
+MAINTAINER_MODE_TRUE
+multi_basedir
+target_noncanonical
target_os
target_vendor
target_cpu
@@ -739,17 +736,6 @@ build_os
build_vendor
build_cpu
build
-EGREP
-GREP
-CPP
-OBJEXT
-EXEEXT
-ac_ct_CC
-CPPFLAGS
-LDFLAGS
-CFLAGS
-CC
-multi_basedir
target_alias
host_alias
build_alias
@@ -792,15 +778,10 @@ ac_subst_files=''
ac_user_opts='
enable_option_checking
enable_multilib
-enable_dependency_tracking
+enable_maintainer_mode
enable_silent_rules
-with_cross_host
-with_build_libsubdir
-with_toolexeclibdir
enable_version_specific_runtime_libs
-with_slibdir
-enable_maintainer_mode
-with_gcc_major_version_only
+enable_dependency_tracking
enable_shared
enable_static
with_pic
@@ -808,9 +789,11 @@ enable_fast_install
with_gnu_ld
enable_libtool_lock
enable_darwin_at_rpath
+with_toolexeclibdir
enable_rpath
with_libiconv_prefix
with_libiconv_type
+with_gcc_major_version_only
'
ac_precious_vars='build_alias
host_alias
@@ -820,8 +803,7 @@ CFLAGS
LDFLAGS
LIBS
CPPFLAGS
-CPP
-CXXCPP'
+CPP'
# Initialize some variables set by options.
@@ -1442,19 +1424,18 @@ Optional Features:
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
--enable-multilib build many library versions (default)
+ --enable-maintainer-mode
+ enable make rules and dependencies not useful (and
+ sometimes confusing) to the casual installer
+ --enable-silent-rules less verbose build output (undo: "make V=1")
+ --disable-silent-rules verbose build output (undo: "make V=0")
+ --enable-version-specific-runtime-libs
+ Specify that runtime libraries should be installed
+ in a compiler-specific directory
--enable-dependency-tracking
do not reject slow dependency extractors
--disable-dependency-tracking
speeds up one-time build
- --enable-silent-rules less verbose build output (undo: "make V=1")
- --disable-silent-rules verbose build output (undo: "make V=0")
- --enable-version-specific-runtime-libs Specify that runtime libraries should be installed in a compiler-specific directory
- --enable-maintainer-mode
- enable make rules and dependencies not useful (and
- sometimes confusing) to the casual installer
- --enable-maintainer-mode
- enable make rules and dependencies not useful (and
- sometimes confusing) to the casual installer
--enable-shared[=PKGS] build shared libraries [default=yes]
--enable-static[=PKGS] build static libraries [default=yes]
--enable-fast-install[=PKGS]
@@ -1468,21 +1449,18 @@ Optional Features:
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
- --with-cross-host=HOST Configuring with a cross compiler
- --with-build-libsubdir=DIR Directory where to find libraries for build system
- --with-toolexeclibdir=DIR
- install libraries built with a cross compiler within
- DIR
- --with-slibdir=DIR shared libraries in DIR LIBDIR
- --with-gcc-major-version-only
- use only GCC major number in filesystem paths
--with-pic try to use only PIC/non-PIC objects [default=use
both]
--with-gnu-ld assume the C compiler uses GNU ld [default=no]
+ --with-toolexeclibdir=DIR
+ install libraries built with a cross compiler within
+ DIR
--with-gnu-ld assume the C compiler uses GNU ld default=no
--with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib
--without-libiconv-prefix don't search for libiconv in includedir and libdir
--with-libiconv-type=TYPE type of library to search for (auto/static/shared)
+ --with-gcc-major-version-only
+ use only GCC major number in filesystem paths
Some influential environment variables:
CC C compiler command
@@ -1495,8 +1473,6 @@ Some influential environment variables:
CPP C preprocessor
CXX C++ compiler command
CXXFLAGS C++ compiler flags
- CCAS assembler compiler command (defaults to CC)
- CCASFLAGS assembler compiler flags (defaults to CFLAGS)
CXXCPP C++ preprocessor
Use these variables to override the choices made by `configure' or to help
@@ -1814,12 +1790,378 @@ $as_echo "$ac_res" >&6; }
} # ac_fn_c_check_header_compile
-# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
-# --------------------------------------------
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test x$gcc_no_link = xyes; then
+ as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
+fi
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $2 (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_cxx_try_compile LINENO
+# ----------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_compile
+
+# ac_fn_cxx_try_cpp LINENO
+# ------------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_cpp
+
+# ac_fn_cxx_try_link LINENO
+# -------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_link
+
+# ac_fn_cxx_try_run LINENO
+# ------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_cxx_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: program exited with status $ac_status" >&5
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_run
+
+# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES
+# ---------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_cxx_check_header_mongrel ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if eval \${$3+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_header_compiler=yes
+else
+ ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <$2>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+ ac_header_preproc=yes
+else
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #((
+ yes:no: )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+ ;;
+ no:yes:* )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+ ;;
+esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_cxx_check_header_mongrel
+
+# ac_fn_cxx_compute_int LINENO EXPR VAR INCLUDES
+# ----------------------------------------------
# Tries to find the compile-time value of EXPR in a program that includes
# INCLUDES, setting VAR accordingly. Returns whether the value could be
# computed
-ac_fn_c_compute_int ()
+ac_fn_cxx_compute_int ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
if test "$cross_compiling" = yes; then
@@ -1838,7 +2180,7 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"; then :
ac_lo=0 ac_mid=0
while :; do
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -1855,7 +2197,7 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"; then :
ac_hi=$ac_mid; break
else
as_fn_arith $ac_mid + 1 && ac_lo=$as_val
@@ -1882,7 +2224,7 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"; then :
ac_hi=-1 ac_mid=-1
while :; do
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -1899,7 +2241,7 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"; then :
ac_lo=$ac_mid; break
else
as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
@@ -1934,7 +2276,7 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"; then :
ac_hi=$ac_mid
else
as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
@@ -1982,7 +2324,7 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
+if ac_fn_cxx_try_run "$LINENO"; then :
echo >>conftest.val; read $3 <conftest.val; ac_retval=0
else
ac_retval=1
@@ -1995,96 +2337,12 @@ rm -f conftest.val
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
-} # ac_fn_c_compute_int
-
-# ac_fn_c_try_link LINENO
-# -----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_link ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext conftest$ac_exeext
- if { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && {
- test -z "$ac_c_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest$ac_exeext && {
- test "$cross_compiling" = yes ||
- test -x conftest$ac_exeext
- }; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
- # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
- # interfere with the next link command; also delete a directory that is
- # left behind by Apple's compiler. We do this before executing the actions.
- rm -rf conftest.dSYM conftest_ipa8_conftest.oo
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_link
-
-# ac_fn_cxx_try_compile LINENO
-# ----------------------------
-# Try to compile conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_compile ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext
- if { { ac_try="$ac_compile"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_compile") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && {
- test -z "$ac_cxx_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest.$ac_objext; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_try_compile
+} # ac_fn_cxx_compute_int
-# ac_fn_c_check_func LINENO FUNC VAR
-# ----------------------------------
+# ac_fn_cxx_check_func LINENO FUNC VAR
+# ------------------------------------
# Tests whether FUNC exists, setting the cache variable VAR accordingly
-ac_fn_c_check_func ()
+ac_fn_cxx_check_func ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
@@ -2136,7 +2394,7 @@ return $2 ();
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_cxx_try_link "$LINENO"; then :
eval "$3=yes"
else
eval "$3=no"
@@ -2149,90 +2407,7 @@ eval ac_res=\$$3
$as_echo "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-} # ac_fn_c_check_func
-
-# ac_fn_cxx_try_cpp LINENO
-# ------------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_cpp ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } > conftest.i && {
- test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
- test ! -s conftest.err
- }; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_try_cpp
-
-# ac_fn_cxx_try_link LINENO
-# -------------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_link ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext conftest$ac_exeext
- if { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && {
- test -z "$ac_cxx_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest$ac_exeext && {
- test "$cross_compiling" = yes ||
- test -x conftest$ac_exeext
- }; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
- # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
- # interfere with the next link command; also delete a directory that is
- # left behind by Apple's compiler. We do this before executing the actions.
- rm -rf conftest.dSYM conftest_ipa8_conftest.oo
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_try_link
+} # ac_fn_cxx_check_func
cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
@@ -2598,52 +2773,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
ac_config_headers="$ac_config_headers config.h"
-# Default to --enable-multilib
-# Check whether --enable-multilib was given.
-if test "${enable_multilib+set}" = set; then :
- enableval=$enable_multilib; case "$enableval" in
- yes) multilib=yes ;;
- no) multilib=no ;;
- *) as_fn_error $? "bad value $enableval for multilib option" "$LINENO" 5 ;;
- esac
-else
- multilib=yes
-fi
-
-
-# We may get other options which we leave undocumented:
-# --with-target-subdir, --with-multisrctop, --with-multisubdir
-# See config-ml.in if you want the gory details.
-
-if test "$srcdir" = "."; then
- if test "$with_target_subdir" != "."; then
- multi_basedir="$srcdir/$with_multisrctop../.."
- else
- multi_basedir="$srcdir/$with_multisrctop.."
- fi
-else
- multi_basedir="$srcdir/.."
-fi
-
-
-# Even if the default multilib is not a cross compilation,
-# it may be that some of the other multilibs are.
-if test $cross_compiling = no && test $multilib = yes \
- && test "x${with_multisubdir}" != x ; then
- cross_compiling=maybe
-fi
-
-ac_config_commands="$ac_config_commands default-1"
-
-
-# This works around the fact that libtool configuration may change LD
-# for this particular configuration, but some shells, instead of
-# keeping the changes in LD private, export them just because LD is
-# exported.
-ORIGINAL_LD_FOR_MULTILIBS=$LD
-
-
-
+# Do not delete or change the following two lines. For why, see
+# http://gcc.gnu.org/ml/libstdc++/2003-07/msg00451.html
ac_aux_dir=
for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
if test -f "$ac_dir/install-sh"; then
@@ -2673,1348 +2804,6 @@ ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
-# Expand $ac_aux_dir to an absolute path.
-am_aux_dir=`cd "$ac_aux_dir" && pwd`
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_CC="${ac_tool_prefix}gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_CC"; then
- ac_ct_CC=$CC
- # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_CC"; then
- ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_CC="gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_CC" = x; then
- CC=""
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- CC=$ac_ct_CC
- fi
-else
- CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_CC="${ac_tool_prefix}cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- fi
-fi
-if test -z "$CC"; then
- # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
- ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
- ac_prog_rejected=yes
- continue
- fi
- ac_cv_prog_CC="cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-if test $ac_prog_rejected = yes; then
- # We found a bogon in the path, so make sure we never use it.
- set dummy $ac_cv_prog_CC
- shift
- if test $# != 0; then
- # We chose a different compiler from the bogus one.
- # However, it has the same basename, so the bogon will be chosen
- # first if we set CC to just the basename; use the full file name.
- shift
- ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
- fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$CC"; then
- if test -n "$ac_tool_prefix"; then
- for ac_prog in cl.exe
- do
- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$CC" && break
- done
-fi
-if test -z "$CC"; then
- ac_ct_CC=$CC
- for ac_prog in cl.exe
-do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_CC"; then
- ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_CC="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$ac_ct_CC" && break
-done
-
- if test "x$ac_ct_CC" = x; then
- CC=""
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- CC=$ac_ct_CC
- fi
-fi
-
-fi
-
-
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "no acceptable C compiler found in \$PATH
-See \`config.log' for more details" "$LINENO" 5; }
-
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
- { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_compiler $ac_option >&5") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- sed '10a\
-... rest of stderr output deleted ...
- 10q' conftest.err >conftest.er1
- cat conftest.er1 >&5
- fi
- rm -f conftest.er1 conftest.err
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }
-done
-
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdio.h>
-int
-main ()
-{
-printf ("hello world\n");
- ;
- return 0;
-}
-_ACEOF
-# FIXME: Cleanup?
-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
- gcc_no_link=no
-else
- gcc_no_link=yes
-fi
-if test x$gcc_no_link = xyes; then
- # Setting cross_compile will disable run tests; it will
- # also disable AC_CHECK_FILE but that's generally
- # correct if we can't link.
- cross_compiling=yes
- EXEEXT=
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
-# Try to create an executable without -o first, disregard a.out.
-# It will help us diagnose broken compilers, and finding out an intuition
-# of exeext.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
-$as_echo_n "checking whether the C compiler works... " >&6; }
-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-
-# The possible output files:
-ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
-
-ac_rmfiles=
-for ac_file in $ac_files
-do
- case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
- * ) ac_rmfiles="$ac_rmfiles $ac_file";;
- esac
-done
-rm -f $ac_rmfiles
-
-if { { ac_try="$ac_link_default"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link_default") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
- # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
-# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
-# in a Makefile. We should not override ac_cv_exeext if it was cached,
-# so that the user can short-circuit this test for compilers unknown to
-# Autoconf.
-for ac_file in $ac_files ''
-do
- test -f "$ac_file" || continue
- case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
- ;;
- [ab].out )
- # We found the default executable, but exeext='' is most
- # certainly right.
- break;;
- *.* )
- if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
- then :; else
- ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
- fi
- # We set ac_cv_exeext here because the later test for it is not
- # safe: cross compilers may not add the suffix if given an `-o'
- # argument, so we may need to know it at that point already.
- # Even if this section looks crufty: it has the advantage of
- # actually working.
- break;;
- * )
- break;;
- esac
-done
-test "$ac_cv_exeext" = no && ac_cv_exeext=
-
-else
- ac_file=''
-fi
-if test -z "$ac_file"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "C compiler cannot create executables
-See \`config.log' for more details" "$LINENO" 5; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
-$as_echo_n "checking for C compiler default output file name... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
-$as_echo "$ac_file" >&6; }
-ac_exeext=$ac_cv_exeext
-
-rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
-ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
-$as_echo_n "checking for suffix of executables... " >&6; }
-if { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
- # If both `conftest.exe' and `conftest' are `present' (well, observable)
-# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
-# work properly (i.e., refer to `conftest.exe'), while it won't with
-# `rm'.
-for ac_file in conftest.exe conftest conftest.*; do
- test -f "$ac_file" || continue
- case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
- *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
- break;;
- * ) break;;
- esac
-done
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-rm -f conftest conftest$ac_cv_exeext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
-$as_echo "$ac_cv_exeext" >&6; }
-
-rm -f conftest.$ac_ext
-EXEEXT=$ac_cv_exeext
-ac_exeext=$EXEEXT
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdio.h>
-int
-main ()
-{
-FILE *f = fopen ("conftest.out", "w");
- return ferror (f) || fclose (f) != 0;
-
- ;
- return 0;
-}
-_ACEOF
-ac_clean_files="$ac_clean_files conftest.out"
-# Check that the compiler produces executables we can run. If not, either
-# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
-$as_echo_n "checking whether we are cross compiling... " >&6; }
-if test "$cross_compiling" != yes; then
- { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }
- if { ac_try='./conftest$ac_cv_exeext'
- { { case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_try") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; }; then
- cross_compiling=no
- else
- if test "$cross_compiling" = maybe; then
- cross_compiling=yes
- else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details" "$LINENO" 5; }
- fi
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
-$as_echo "$cross_compiling" >&6; }
-
-rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
-ac_clean_files=$ac_clean_files_save
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
-$as_echo_n "checking for suffix of object files... " >&6; }
-if ${ac_cv_objext+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.o conftest.obj
-if { { ac_try="$ac_compile"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_compile") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
- for ac_file in conftest.o conftest.obj conftest.*; do
- test -f "$ac_file" || continue;
- case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
- *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
- break;;
- esac
-done
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot compute suffix of object files: cannot compile
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-rm -f conftest.$ac_cv_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
-$as_echo "$ac_cv_objext" >&6; }
-OBJEXT=$ac_cv_objext
-ac_objext=$OBJEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if ${ac_cv_c_compiler_gnu+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-#ifndef __GNUC__
- choke me
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_compiler_gnu=yes
-else
- ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
- GCC=yes
-else
- GCC=
-fi
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if ${ac_cv_prog_cc_g+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_save_c_werror_flag=$ac_c_werror_flag
- ac_c_werror_flag=yes
- ac_cv_prog_cc_g=no
- CFLAGS="-g"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_g=yes
-else
- CFLAGS=""
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
- ac_c_werror_flag=$ac_save_c_werror_flag
- CFLAGS="-g"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- ac_c_werror_flag=$ac_save_c_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
- CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
- if test "$GCC" = yes; then
- CFLAGS="-g -O2"
- else
- CFLAGS="-g"
- fi
-else
- if test "$GCC" = yes; then
- CFLAGS="-O2"
- else
- CFLAGS=
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if ${ac_cv_prog_cc_c89+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_prog_cc_c89=no
-ac_save_CC=$CC
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdarg.h>
-#include <stdio.h>
-struct stat;
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
- char **p;
- int i;
-{
- return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
- char *s;
- va_list v;
- va_start (v,p);
- s = g (p, va_arg (v,int));
- va_end (v);
- return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
- function prototypes and stuff, but not '\xHH' hex character constants.
- These don't provoke an error unfortunately, instead are silently treated
- as 'x'. The following induces an error, until -std is added to get
- proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
- array size at least. It's necessary to write '\x00'==0 to get something
- that's true only with -std. */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
-
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
- inside strings and character constants. */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
-
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
- ;
- return 0;
-}
-_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
- -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
- CC="$ac_save_CC $ac_arg"
- if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_c89=$ac_arg
-fi
-rm -f core conftest.err conftest.$ac_objext
- test "x$ac_cv_prog_cc_c89" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
-fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
- x)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
- xno)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
- *)
- CC="$CC $ac_cv_prog_cc_c89"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
-
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
-$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
-if ${am_cv_prog_cc_c_o+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
- # Make sure it works both with $CC and with simple cc.
- # Following AC_PROG_CC_C_O, we do the test twice because some
- # compilers refuse to overwrite an existing .o file with -o,
- # though they will create one.
- am_cv_prog_cc_c_o=yes
- for am_i in 1 2; do
- if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
- ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } \
- && test -f conftest2.$ac_objext; then
- : OK
- else
- am_cv_prog_cc_c_o=no
- break
- fi
- done
- rm -f core conftest*
- unset am_i
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
-$as_echo "$am_cv_prog_cc_c_o" >&6; }
-if test "$am_cv_prog_cc_c_o" != yes; then
- # Losing compiler, so override with the script.
- # FIXME: It is wrong to rewrite CC.
- # But if we don't then we get into trouble of one sort or another.
- # A longer-term fix would be to have automake use am__CC in this case,
- # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
- CC="$am_aux_dir/compile $CC"
-fi
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
- CPP=
-fi
-if test -z "$CPP"; then
- if ${ac_cv_prog_CPP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- # Double quotes because CPP needs to be expanded
- for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
- do
- ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
- Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- # Broken: success on invalid input.
-continue
-else
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
- break
-fi
-
- done
- ac_cv_prog_CPP=$CPP
-
-fi
- CPP=$ac_cv_prog_CPP
-else
- ac_cv_prog_CPP=$CPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
- Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- # Broken: success on invalid input.
-continue
-else
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if ${ac_cv_path_GREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -z "$GREP"; then
- ac_path_GREP_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in grep ggrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
- as_fn_executable_p "$ac_path_GREP" || continue
-# Check for GNU ac_path_GREP and select it if it is found.
- # Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
-*GNU*)
- ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo 'GREP' >> "conftest.nl"
- "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_GREP_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_GREP="$ac_path_GREP"
- ac_path_GREP_max=$ac_count
- fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_GREP_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_GREP"; then
- as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
- fi
-else
- ac_cv_path_GREP=$GREP
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
- GREP="$ac_cv_path_GREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if ${ac_cv_path_EGREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
- then ac_cv_path_EGREP="$GREP -E"
- else
- if test -z "$EGREP"; then
- ac_path_EGREP_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in egrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
- as_fn_executable_p "$ac_path_EGREP" || continue
-# Check for GNU ac_path_EGREP and select it if it is found.
- # Check for GNU $ac_path_EGREP
-case `"$ac_path_EGREP" --version 2>&1` in
-*GNU*)
- ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo 'EGREP' >> "conftest.nl"
- "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_EGREP_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_EGREP="$ac_path_EGREP"
- ac_path_EGREP_max=$ac_count
- fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_EGREP_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_EGREP"; then
- as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
- fi
-else
- ac_cv_path_EGREP=$EGREP
-fi
-
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
- EGREP="$ac_cv_path_EGREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_header_stdc=yes
-else
- ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
- # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "free" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
- if test "$cross_compiling" = yes; then :
- :
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
- (('a' <= (c) && (c) <= 'i') \
- || ('j' <= (c) && (c) <= 'r') \
- || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
- int i;
- for (i = 0; i < 256; i++)
- if (XOR (islower (i), ISLOWER (i))
- || toupper (i) != TOUPPER (i))
- return 2;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
- inttypes.h stdint.h unistd.h
-do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-
- ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default"
-if test "x$ac_cv_header_minix_config_h" = xyes; then :
- MINIX=yes
-else
- MINIX=
-fi
-
-
- if test "$MINIX" = yes; then
-
-$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h
-
-
-$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h
-
-
-$as_echo "#define _MINIX 1" >>confdefs.h
-
- fi
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5
-$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; }
-if ${ac_cv_safe_to_define___extensions__+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-# define __EXTENSIONS__ 1
- $ac_includes_default
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_safe_to_define___extensions__=yes
-else
- ac_cv_safe_to_define___extensions__=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5
-$as_echo "$ac_cv_safe_to_define___extensions__" >&6; }
- test $ac_cv_safe_to_define___extensions__ = yes &&
- $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h
-
- $as_echo "#define _ALL_SOURCE 1" >>confdefs.h
-
- $as_echo "#define _GNU_SOURCE 1" >>confdefs.h
-
- $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h
-
- $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h
-
-
-
-# Do not delete or change the following two lines. For why, see
-# http://gcc.gnu.org/ml/libstdc++/2003-07/msg00451.html
# Make sure we can run config.sub.
$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
@@ -4126,9 +2915,89 @@ test -n "$target_alias" &&
NONENONEs,x,x, &&
program_prefix=${target_alias}-
+ case ${build_alias} in
+ "") build_noncanonical=${build} ;;
+ *) build_noncanonical=${build_alias} ;;
+esac
+
+ case ${host_alias} in
+ "") host_noncanonical=${build_noncanonical} ;;
+ *) host_noncanonical=${host_alias} ;;
+esac
+
+ case ${target_alias} in
+ "") target_noncanonical=${host_noncanonical} ;;
+ *) target_noncanonical=${target_alias} ;;
+esac
+
+
+
+
+# Default to --enable-multilib
+# Check whether --enable-multilib was given.
+if test "${enable_multilib+set}" = set; then :
+ enableval=$enable_multilib; case "$enableval" in
+ yes) multilib=yes ;;
+ no) multilib=no ;;
+ *) as_fn_error $? "bad value $enableval for multilib option" "$LINENO" 5 ;;
+ esac
+else
+ multilib=yes
+fi
+
+
+# We may get other options which we leave undocumented:
+# --with-target-subdir, --with-multisrctop, --with-multisubdir
+# See config-ml.in if you want the gory details.
+
+if test "$srcdir" = "."; then
+ if test "$with_target_subdir" != "."; then
+ multi_basedir="$srcdir/$with_multisrctop../.."
+ else
+ multi_basedir="$srcdir/$with_multisrctop.."
+ fi
+else
+ multi_basedir="$srcdir/.."
+fi
+
+
+# Even if the default multilib is not a cross compilation,
+# it may be that some of the other multilibs are.
+if test $cross_compiling = no && test $multilib = yes \
+ && test "x${with_multisubdir}" != x ; then
+ cross_compiling=maybe
+fi
+
+ac_config_commands="$ac_config_commands default-1"
+
+
target_alias=${target_alias-$host_alias}
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
+$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
+ # Check whether --enable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then :
+ enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
+else
+ USE_MAINTAINER_MODE=no
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
+$as_echo "$USE_MAINTAINER_MODE" >&6; }
+ if test $USE_MAINTAINER_MODE = yes; then
+ MAINTAINER_MODE_TRUE=
+ MAINTAINER_MODE_FALSE='#'
+else
+ MAINTAINER_MODE_TRUE='#'
+ MAINTAINER_MODE_FALSE=
+fi
+
+ MAINT=$MAINTAINER_MODE_TRUE
+
+
+
am__api_version='1.15'
# Find a good install program. We prefer a C program (faster),
@@ -4301,6 +3170,9 @@ test "$program_suffix" != NONE &&
ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+
if test x"${MISSING+set}" != xset; then
case $am_aux_dir in
*\ * | *\ *)
@@ -4551,69 +3423,6 @@ else
fi
rmdir .tst 2>/dev/null
-DEPDIR="${am__leading_dot}deps"
-
-ac_config_commands="$ac_config_commands depfiles"
-
-
-am_make=${MAKE-make}
-cat > confinc << 'END'
-am__doit:
- @echo this is the am__doit target
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
-$as_echo_n "checking for style of include used by $am_make... " >&6; }
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# Ignore all kinds of additional output from 'make'.
-case `$am_make -s -f confmf 2> /dev/null` in #(
-*the\ am__doit\ target*)
- am__include=include
- am__quote=
- _am_result=GNU
- ;;
-esac
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
- echo '.include "confinc"' > confmf
- case `$am_make -s -f confmf 2> /dev/null` in #(
- *the\ am__doit\ target*)
- am__include=.include
- am__quote="\""
- _am_result=BSD
- ;;
- esac
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
-$as_echo "$_am_result" >&6; }
-rm -f confinc confmf
-
-# Check whether --enable-dependency-tracking was given.
-if test "${enable_dependency_tracking+set}" = set; then :
- enableval=$enable_dependency_tracking;
-fi
-
-if test "x$enable_dependency_tracking" != xno; then
- am_depcomp="$ac_aux_dir/depcomp"
- AMDEPBACKSLASH='\'
- am__nodep='_no'
-fi
- if test "x$enable_dependency_tracking" != xno; then
- AMDEP_TRUE=
- AMDEP_FALSE='#'
-else
- AMDEP_TRUE='#'
- AMDEP_FALSE=
-fi
-
-
# Check whether --enable-silent-rules was given.
if test "${enable_silent_rules+set}" = set; then :
enableval=$enable_silent_rules;
@@ -4678,15 +3487,6 @@ fi
VERSION='version-unused'
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE "$PACKAGE"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define VERSION "$VERSION"
-_ACEOF
-
# Some tools Automake needs.
ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
@@ -4725,134 +3525,6 @@ am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
-depcc="$CC" am_compiler_list=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
-$as_echo_n "checking dependency style of $depcc... " >&6; }
-if ${am_cv_CC_dependencies_compiler_type+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
- # We make a subdir and do the tests there. Otherwise we can end up
- # making bogus files that we don't know about and never remove. For
- # instance it was reported that on HP-UX the gcc test will end up
- # making a dummy file named 'D' -- because '-MD' means "put the output
- # in D".
- rm -rf conftest.dir
- mkdir conftest.dir
- # Copy depcomp to subdir because otherwise we won't find it if we're
- # using a relative directory.
- cp "$am_depcomp" conftest.dir
- cd conftest.dir
- # We will build objects and dependencies in a subdirectory because
- # it helps to detect inapplicable dependency modes. For instance
- # both Tru64's cc and ICC support -MD to output dependencies as a
- # side effect of compilation, but ICC will put the dependencies in
- # the current directory while Tru64 will put them in the object
- # directory.
- mkdir sub
-
- am_cv_CC_dependencies_compiler_type=none
- if test "$am_compiler_list" = ""; then
- am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
- fi
- am__universal=false
- case " $depcc " in #(
- *\ -arch\ *\ -arch\ *) am__universal=true ;;
- esac
-
- for depmode in $am_compiler_list; do
- # Setup a source with many dependencies, because some compilers
- # like to wrap large dependency lists on column 80 (with \), and
- # we should not choose a depcomp mode which is confused by this.
- #
- # We need to recreate these files for each test, as the compiler may
- # overwrite some of them when testing with obscure command lines.
- # This happens at least with the AIX C compiler.
- : > sub/conftest.c
- for i in 1 2 3 4 5 6; do
- echo '#include "conftst'$i'.h"' >> sub/conftest.c
- # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
- # Solaris 10 /bin/sh.
- echo '/* dummy */' > sub/conftst$i.h
- done
- echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
- # We check with '-c' and '-o' for the sake of the "dashmstdout"
- # mode. It turns out that the SunPro C++ compiler does not properly
- # handle '-M -o', and we need to detect this. Also, some Intel
- # versions had trouble with output in subdirs.
- am__obj=sub/conftest.${OBJEXT-o}
- am__minus_obj="-o $am__obj"
- case $depmode in
- gcc)
- # This depmode causes a compiler race in universal mode.
- test "$am__universal" = false || continue
- ;;
- nosideeffect)
- # After this tag, mechanisms are not by side-effect, so they'll
- # only be used when explicitly requested.
- if test "x$enable_dependency_tracking" = xyes; then
- continue
- else
- break
- fi
- ;;
- msvc7 | msvc7msys | msvisualcpp | msvcmsys)
- # This compiler won't grok '-c -o', but also, the minuso test has
- # not run yet. These depmodes are late enough in the game, and
- # so weak that their functioning should not be impacted.
- am__obj=conftest.${OBJEXT-o}
- am__minus_obj=
- ;;
- none) break ;;
- esac
- if depmode=$depmode \
- source=sub/conftest.c object=$am__obj \
- depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
- $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
- >/dev/null 2>conftest.err &&
- grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
- grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
- grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
- ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
- # icc doesn't choke on unknown options, it will just issue warnings
- # or remarks (even with -Werror). So we grep stderr for any message
- # that says an option was ignored or not supported.
- # When given -MP, icc 7.0 and 7.1 complain thusly:
- # icc: Command line warning: ignoring option '-M'; no argument required
- # The diagnosis changed in icc 8.0:
- # icc: Command line remark: option '-MP' not supported
- if (grep 'ignoring option' conftest.err ||
- grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
- am_cv_CC_dependencies_compiler_type=$depmode
- break
- fi
- fi
- done
-
- cd ..
- rm -rf conftest.dir
-else
- am_cv_CC_dependencies_compiler_type=none
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
-CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
-
- if
- test "x$enable_dependency_tracking" != xno \
- && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
- am__fastdepCC_TRUE=
- am__fastdepCC_FALSE='#'
-else
- am__fastdepCC_TRUE='#'
- am__fastdepCC_FALSE=
-fi
-
-
# POSIX will say in a future version that running "rm -f" with no argument
# is OK; and we want to be able to make that assumption in our Makefile
@@ -4895,238 +3567,6 @@ END
as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
fi
fi
- # ([1.15.1 no-define foreign no-dist -Wall -Wno-portability])
-
-
-
-
-
-# Check whether --with-cross-host was given.
-if test "${with_cross_host+set}" = set; then :
- withval=$with_cross_host;
-fi
-
-
-# Checks for header files.
-for ac_header in malloc.h
-do :
- ac_fn_c_check_header_mongrel "$LINENO" "malloc.h" "ac_cv_header_malloc_h" "$ac_includes_default"
-if test "x$ac_cv_header_malloc_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_MALLOC_H 1
-_ACEOF
-
-fi
-
-done
-
-
-
- case ${build_alias} in
- "") build_noncanonical=${build} ;;
- *) build_noncanonical=${build_alias} ;;
-esac
-
- case ${host_alias} in
- "") host_noncanonical=${build_noncanonical} ;;
- *) host_noncanonical=${host_alias} ;;
-esac
-
-
-
- case ${target_alias} in
- "") target_noncanonical=${host_noncanonical} ;;
- *) target_noncanonical=${target_alias} ;;
-esac
-
-
-
-
-# post-stage1 host modules use a different CC_FOR_BUILD so, in order to
-# have matching libraries, they should use host libraries: Makefile.tpl
-# arranges to pass --with-build-libsubdir=$(HOST_SUBDIR).
-# However, they still use the build modules, because the corresponding
-# host modules (e.g. bison) are only built for the host when bootstrap
-# finishes. So:
-# - build_subdir is where we find build modules, and never changes.
-# - build_libsubdir is where we find build libraries, and can be overridden.
-
-# Prefix 'build-' so this never conflicts with target_subdir.
-build_subdir="build-${build_noncanonical}"
-
-# Check whether --with-build-libsubdir was given.
-if test "${with_build_libsubdir+set}" = set; then :
- withval=$with_build_libsubdir; build_libsubdir="$withval"
-else
- build_libsubdir="$build_subdir"
-fi
-
-# --srcdir=. covers the toplevel, while "test -d" covers the subdirectories
-if ( test $srcdir = . && test -d gcc ) \
- || test -d $srcdir/../host-${host_noncanonical}; then
- host_subdir="host-${host_noncanonical}"
-else
- host_subdir=.
-fi
-# No prefix.
-target_subdir=${target_noncanonical}
-
-
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
-$as_echo_n "checking size of void *... " >&6; }
-if ${ac_cv_sizeof_void_p+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then :
-
-else
- if test "$ac_cv_type_void_p" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (void *)
-See \`config.log' for more details" "$LINENO" 5; }
- else
- ac_cv_sizeof_void_p=0
- fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5
-$as_echo "$ac_cv_sizeof_void_p" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_VOID_P $ac_cv_sizeof_void_p
-_ACEOF
-
-
-
-# Get target configury.
-unset LIBGCOBOL_SUPPORTED
-. ${srcdir}/configure.tgt
-
-# -----------------
-# __int128 support
-# -----------------
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether __int128 is supported" >&5
-$as_echo_n "checking whether __int128 is supported... " >&6; }
-if ${libgcobol_cv_have_int128+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test x$gcc_no_link = xyes; then
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
- __int128 foo (__int128 )
- {
- __int128 aaa;
- return (__int128) aaa;
- }
-
- __int128 bar (__int128 )
- {
- __int128 aaa;
- return (__int128) aaa;
- }
-
-int
-main ()
-{
-
- foo (1);
- bar (1);
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
- libgcobol_cv_have_int128=yes
-
-else
-
- libgcobol_cv_have_int128=no
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-else
- if test x$gcc_no_link = xyes; then
- as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
-fi
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
- __int128 foo (__int128 )
- {
- __int128 aaa;
- return (__int128) aaa;
- }
-
- __int128 bar (__int128 )
- {
- __int128 aaa;
- return (__int128) aaa;
- }
-
-int
-main ()
-{
-
- foo (1);
- bar (1);
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
- libgcobol_cv_have_int128=yes
-
-else
-
- libgcobol_cv_have_int128=no
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgcobol_cv_have_int128" >&5
-$as_echo "$libgcobol_cv_have_int128" >&6; }
-# The following conditional is useful when this creates a Makefile.am file that
-# is subsequently processed into a Makefile.in file. At the present time,
-# however the libgcobol build uses a hardcoded Makefile.in file.
- if test "x$LIBGCOBOL_SUPPORTED" = xyes && test "x$libgcobol_cv_have_int128" = xyes; then
- BUILD_LIBGCOBOL_TRUE=
- BUILD_LIBGCOBOL_FALSE='#'
-else
- BUILD_LIBGCOBOL_TRUE='#'
- BUILD_LIBGCOBOL_FALSE=
-fi
-
-
-
-# Check whether --with-toolexeclibdir was given.
-if test "${with_toolexeclibdir+set}" = set; then :
- withval=$with_toolexeclibdir; case ${with_toolexeclibdir} in
- /)
- ;;
- */)
- with_toolexeclibdir=`echo $with_toolexeclibdir | sed 's,/$,,'`
- ;;
-esac
-else
- with_toolexeclibdir=no
-fi
-
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --enable-version-specific-runtime-libs" >&5
@@ -5145,120 +3585,76 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $version_specific_libs" >&5
$as_echo "$version_specific_libs" >&6; }
-
-# Check whether --with-slibdir was given.
-if test "${with_slibdir+set}" = set; then :
- withval=$with_slibdir; slibdir="$with_slibdir"
-else
- if test "${version_specific_libs}" = yes; then
- slibdir='$(libsubdir)'
-elif test -n "$with_cross_host" && test x"$with_cross_host" != x"no"; then
- slibdir='$(exec_prefix)/$(host_noncanonical)/lib'
-else
- slibdir='$(libdir)'
-fi
-fi
+# This works around the fact that libtool configuration may change LD
+# for this particular configuration, but some shells, instead of
+# keeping the changes in LD private, export them just because LD is
+# exported.
+ORIGINAL_LD_FOR_MULTILIBS=$LD
-# Command-line options.
-# Very limited version of AC_MAINTAINER_MODE.
-# Check whether --enable-maintainer-mode was given.
-if test "${enable_maintainer_mode+set}" = set; then :
- enableval=$enable_maintainer_mode; case ${enable_maintainer_mode} in
- yes) MAINT='' ;;
- no) MAINT='#' ;;
- *) as_fn_error $? "--enable-maintainer-mode must be yes or no" "$LINENO" 5 ;;
- esac
- maintainer_mode=${enableval}
-else
- MAINT='#'
-fi
+DEPDIR="${am__leading_dot}deps"
+ac_config_commands="$ac_config_commands depfiles"
-toolexecdir=no
-toolexeclibdir=no
-# Calculate toolexeclibdir
-# Also toolexecdir, though it's only used in toolexeclibdir
-case ${version_specific_libs} in
- yes)
- # Need the gcc compiler version to know where to install libraries
- # and header files if --enable-version-specific-runtime-libs option
- # is selected.
- toolexecdir='$(libdir)/gcc/$(target_noncanonical)'
- toolexeclibdir='$(toolexecdir)/$(gcc_version)$(MULTISUBDIR)'
- ;;
- no)
- if test -n "$with_cross_host" &&
- test x"$with_cross_host" != x"no"; then
- # Install a library built with a cross compiler in tooldir, not libdir.
- toolexecdir='$(exec_prefix)/$(target_noncanonical)'
- toolexeclibdir='$(toolexecdir)/lib'
- else
- toolexecdir='$(libdir)/gcc-lib/$(target_noncanonical)'
- toolexeclibdir='$(libdir)'
- fi
- multi_os_directory=`$CC -print-multi-os-directory`
- case $multi_os_directory in
- .) ;; # Avoid trailing /.
- *) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;;
- esac
- ;;
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from 'make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+ am__include=include
+ am__quote=
+ _am_result=GNU
+ ;;
esac
-
-
-
-
-# Determine what GCC version number to use in filesystem paths.
-
- get_gcc_base_ver="cat"
-
-# Check whether --with-gcc-major-version-only was given.
-if test "${with_gcc_major_version_only+set}" = set; then :
- withval=$with_gcc_major_version_only; if test x$with_gcc_major_version_only = xyes ; then
- get_gcc_base_ver="sed -e 's/^\([0-9]*\).*/\1/'"
- fi
-
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ case `$am_make -s -f confmf 2> /dev/null` in #(
+ *the\ am__doit\ target*)
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ ;;
+ esac
fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
-$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
- # Check whether --enable-maintainer-mode was given.
-if test "${enable_maintainer_mode+set}" = set; then :
- enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
-else
- USE_MAINTAINER_MODE=no
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+ enableval=$enable_dependency_tracking;
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
-$as_echo "$USE_MAINTAINER_MODE" >&6; }
- if test $USE_MAINTAINER_MODE = yes; then
- MAINTAINER_MODE_TRUE=
- MAINTAINER_MODE_FALSE='#'
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
else
- MAINTAINER_MODE_TRUE='#'
- MAINTAINER_MODE_FALSE=
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
fi
- MAINT=$MAINTAINER_MODE_TRUE
-
-
-
-# Check the compiler.
-# The same as in boehm-gc and libstdc++. Have to borrow it from there.
-# We must force CC to /not/ be precious variables; otherwise
-# the wrong, non-multilib-adjusted value will be used in multilibs.
-# As a side effect, we have to subst CFLAGS ourselves.
-
-
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
@@ -5588,6 +3984,285 @@ $as_echo "$ac_try_echo"; } >&5
test $ac_status = 0; }
done
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+printf ("hello world\n");
+ ;
+ return 0;
+}
+_ACEOF
+# FIXME: Cleanup?
+if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ gcc_no_link=no
+else
+ gcc_no_link=yes
+fi
+if test x$gcc_no_link = xyes; then
+ # Setting cross_compile will disable run tests; it will
+ # also disable AC_CHECK_FILE but that's generally
+ # correct if we can't link.
+ cross_compiling=yes
+ EXEEXT=
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+ esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile. We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+ then :; else
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ fi
+ # We set ac_cv_exeext here because the later test for it is not
+ # safe: cross compilers may not add the suffix if given an `-o'
+ # argument, so we may need to know it at that point already.
+ # Even if this section looks crufty: it has the advantage of
+ # actually working.
+ break;;
+ * )
+ break;;
+ esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+ ac_file=''
+fi
+if test -z "$ac_file"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+ { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if { ac_try='./conftest$ac_cv_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ for ac_file in conftest.o conftest.obj conftest.*; do
+ test -f "$ac_file" || continue;
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
if ${ac_cv_c_compiler_gnu+:} false; then :
@@ -5858,268 +4533,11 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $
ac_compiler_gnu=$ac_cv_c_compiler_gnu
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-if test -z "$CXX"; then
- if test -n "$CCC"; then
- CXX=$CCC
- else
- if test -n "$ac_tool_prefix"; then
- for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
- do
- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CXX"; then
- ac_cv_prog_CXX="$CXX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-CXX=$ac_cv_prog_CXX
-if test -n "$CXX"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
-$as_echo "$CXX" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$CXX" && break
- done
-fi
-if test -z "$CXX"; then
- ac_ct_CXX=$CXX
- for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
-do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_CXX"; then
- ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_CXX="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
-if test -n "$ac_ct_CXX"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
-$as_echo "$ac_ct_CXX" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$ac_ct_CXX" && break
-done
-
- if test "x$ac_ct_CXX" = x; then
- CXX="g++"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- CXX=$ac_ct_CXX
- fi
-fi
-
- fi
-fi
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
- { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_compiler $ac_option >&5") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- sed '10a\
-... rest of stderr output deleted ...
- 10q' conftest.err >conftest.er1
- cat conftest.er1 >&5
- fi
- rm -f conftest.er1 conftest.err
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
-$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
-if ${ac_cv_cxx_compiler_gnu+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-#ifndef __GNUC__
- choke me
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- ac_compiler_gnu=yes
-else
- ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
-$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
- GXX=yes
-else
- GXX=
-fi
-ac_test_CXXFLAGS=${CXXFLAGS+set}
-ac_save_CXXFLAGS=$CXXFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
-$as_echo_n "checking whether $CXX accepts -g... " >&6; }
-if ${ac_cv_prog_cxx_g+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_save_cxx_werror_flag=$ac_cxx_werror_flag
- ac_cxx_werror_flag=yes
- ac_cv_prog_cxx_g=no
- CXXFLAGS="-g"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- ac_cv_prog_cxx_g=yes
-else
- CXXFLAGS=""
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-
-else
- ac_cxx_werror_flag=$ac_save_cxx_werror_flag
- CXXFLAGS="-g"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- ac_cv_prog_cxx_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- ac_cxx_werror_flag=$ac_save_cxx_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
-$as_echo "$ac_cv_prog_cxx_g" >&6; }
-if test "$ac_test_CXXFLAGS" = set; then
- CXXFLAGS=$ac_save_CXXFLAGS
-elif test $ac_cv_prog_cxx_g = yes; then
- if test "$GXX" = yes; then
- CXXFLAGS="-g -O2"
- else
- CXXFLAGS="-g"
- fi
-else
- if test "$GXX" = yes; then
- CXXFLAGS="-O2"
- else
- CXXFLAGS=
- fi
-fi
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-depcc="$CXX" am_compiler_list=
+depcc="$CC" am_compiler_list=
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
$as_echo_n "checking dependency style of $depcc... " >&6; }
-if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
@@ -6142,7 +4560,7 @@ else
# directory.
mkdir sub
- am_cv_CXX_dependencies_compiler_type=none
+ am_cv_CC_dependencies_compiler_type=none
if test "$am_compiler_list" = ""; then
am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
fi
@@ -6215,7 +4633,7 @@ else
# icc: Command line remark: option '-MP' not supported
if (grep 'ignoring option' conftest.err ||
grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
- am_cv_CXX_dependencies_compiler_type=$depmode
+ am_cv_CC_dependencies_compiler_type=$depmode
break
fi
fi
@@ -6224,166 +4642,484 @@ else
cd ..
rm -rf conftest.dir
else
- am_cv_CXX_dependencies_compiler_type=none
+ am_cv_CC_dependencies_compiler_type=none
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
-CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
if
test "x$enable_dependency_tracking" != xno \
- && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
- am__fastdepCXX_TRUE=
- am__fastdepCXX_FALSE='#'
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+ am__fastdepCC_TRUE=
+ am__fastdepCC_FALSE='#'
else
- am__fastdepCXX_TRUE='#'
- am__fastdepCXX_FALSE=
+ am__fastdepCC_TRUE='#'
+ am__fastdepCC_FALSE=
+fi
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if ${ac_cv_prog_CPP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+ break
+fi
-# By default we simply use the C compiler to build assembly code.
+ done
+ ac_cv_prog_CPP=$CPP
-test "${CCAS+set}" = set || CCAS=$CC
-test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
-depcc="$CCAS" am_compiler_list=
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
-$as_echo_n "checking dependency style of $depcc... " >&6; }
-if ${am_cv_CCAS_dependencies_compiler_type+:} false; then :
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
$as_echo_n "(cached) " >&6
else
- if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
- # We make a subdir and do the tests there. Otherwise we can end up
- # making bogus files that we don't know about and never remove. For
- # instance it was reported that on HP-UX the gcc test will end up
- # making a dummy file named 'D' -- because '-MD' means "put the output
- # in D".
- rm -rf conftest.dir
- mkdir conftest.dir
- # Copy depcomp to subdir because otherwise we won't find it if we're
- # using a relative directory.
- cp "$am_depcomp" conftest.dir
- cd conftest.dir
- # We will build objects and dependencies in a subdirectory because
- # it helps to detect inapplicable dependency modes. For instance
- # both Tru64's cc and ICC support -MD to output dependencies as a
- # side effect of compilation, but ICC will put the dependencies in
- # the current directory while Tru64 will put them in the object
- # directory.
- mkdir sub
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in grep ggrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
- am_cv_CCAS_dependencies_compiler_type=none
- if test "$am_compiler_list" = ""; then
- am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ $ac_path_GREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
fi
- am__universal=false
+else
+ ac_cv_path_GREP=$GREP
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
- for depmode in $am_compiler_list; do
- # Setup a source with many dependencies, because some compilers
- # like to wrap large dependency lists on column 80 (with \), and
- # we should not choose a depcomp mode which is confused by this.
- #
- # We need to recreate these files for each test, as the compiler may
- # overwrite some of them when testing with obscure command lines.
- # This happens at least with the AIX C compiler.
- : > sub/conftest.c
- for i in 1 2 3 4 5 6; do
- echo '#include "conftst'$i'.h"' >> sub/conftest.c
- # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
- # Solaris 10 /bin/sh.
- echo '/* dummy */' > sub/conftst$i.h
- done
- echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
- # We check with '-c' and '-o' for the sake of the "dashmstdout"
- # mode. It turns out that the SunPro C++ compiler does not properly
- # handle '-M -o', and we need to detect this. Also, some Intel
- # versions had trouble with output in subdirs.
- am__obj=sub/conftest.${OBJEXT-o}
- am__minus_obj="-o $am__obj"
- case $depmode in
- gcc)
- # This depmode causes a compiler race in universal mode.
- test "$am__universal" = false || continue
- ;;
- nosideeffect)
- # After this tag, mechanisms are not by side-effect, so they'll
- # only be used when explicitly requested.
- if test "x$enable_dependency_tracking" = xyes; then
- continue
- else
- break
- fi
- ;;
- msvc7 | msvc7msys | msvisualcpp | msvcmsys)
- # This compiler won't grok '-c -o', but also, the minuso test has
- # not run yet. These depmodes are late enough in the game, and
- # so weak that their functioning should not be impacted.
- am__obj=conftest.${OBJEXT-o}
- am__minus_obj=
- ;;
- none) break ;;
- esac
- if depmode=$depmode \
- source=sub/conftest.c object=$am__obj \
- depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
- $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
- >/dev/null 2>conftest.err &&
- grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
- grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
- grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
- ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
- # icc doesn't choke on unknown options, it will just issue warnings
- # or remarks (even with -Werror). So we grep stderr for any message
- # that says an option was ignored or not supported.
- # When given -MP, icc 7.0 and 7.1 complain thusly:
- # icc: Command line warning: ignoring option '-M'; no argument required
- # The diagnosis changed in icc 8.0:
- # icc: Command line remark: option '-MP' not supported
- if (grep 'ignoring option' conftest.err ||
- grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
- am_cv_CCAS_dependencies_compiler_type=$depmode
- break
- fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in egrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
- cd ..
- rm -rf conftest.dir
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
else
- am_cv_CCAS_dependencies_compiler_type=none
+ ac_cv_path_EGREP=$EGREP
fi
+ fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CCAS_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CCAS_dependencies_compiler_type" >&6; }
-CCASDEPMODE=depmode=$am_cv_CCAS_dependencies_compiler_type
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_header_stdc=yes
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then :
+ :
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ return 2;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
- if
- test "x$enable_dependency_tracking" != xno \
- && test "$am_cv_CCAS_dependencies_compiler_type" = gcc3; then
- am__fastdepCCAS_TRUE=
- am__fastdepCCAS_FALSE='#'
else
- am__fastdepCCAS_TRUE='#'
- am__fastdepCCAS_FALSE=
+ ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+fi
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+ ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default"
+if test "x$ac_cv_header_minix_config_h" = xyes; then :
+ MINIX=yes
+else
+ MINIX=
+fi
+
+
+ if test "$MINIX" = yes; then
+
+$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h
+
+
+$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h
+
+
+$as_echo "#define _MINIX 1" >>confdefs.h
+
+ fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5
+$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; }
+if ${ac_cv_safe_to_define___extensions__+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# define __EXTENSIONS__ 1
+ $ac_includes_default
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_safe_to_define___extensions__=yes
+else
+ ac_cv_safe_to_define___extensions__=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5
+$as_echo "$ac_cv_safe_to_define___extensions__" >&6; }
+ test $ac_cv_safe_to_define___extensions__ = yes &&
+ $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h
+
+ $as_echo "#define _ALL_SOURCE 1" >>confdefs.h
+
+ $as_echo "#define _GNU_SOURCE 1" >>confdefs.h
+
+ $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h
+
+ $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h
-# In order to override CFLAGS_FOR_TARGET, all of our special flags go
-# in XCFLAGS. But we need them in CFLAGS during configury. So put them
-# in both places for now and restore CFLAGS at the end of config.
-save_CFLAGS="$CFLAGS"
# Find other programs we need.
if test -n "$ac_tool_prefix"; then
@@ -9346,7 +8082,6 @@ done
-
# Set options
@@ -12909,7 +11644,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 12912 "configure"
+#line 11647 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -13015,7 +11750,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 13018 "configure"
+#line 11753 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -13232,6 +11967,585 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
CC="$lt_save_CC"
+
+
+
+
+
+
+
+
+
+
+
+
+ ac_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+
+
+enable_dlopen=yes
+
+
+
+LIBM=
+case $host in
+*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
+ # These system don't have libm, or don't need it
+ ;;
+*-ncr-sysv4.3*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _mwvalidcheckl in -lmw" >&5
+$as_echo_n "checking for _mwvalidcheckl in -lmw... " >&6; }
+if ${ac_cv_lib_mw__mwvalidcheckl+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lmw $LIBS"
+if test x$gcc_no_link = xyes; then
+ as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
+fi
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char _mwvalidcheckl ();
+int
+main ()
+{
+return _mwvalidcheckl ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_mw__mwvalidcheckl=yes
+else
+ ac_cv_lib_mw__mwvalidcheckl=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mw__mwvalidcheckl" >&5
+$as_echo "$ac_cv_lib_mw__mwvalidcheckl" >&6; }
+if test "x$ac_cv_lib_mw__mwvalidcheckl" = xyes; then :
+ LIBM="-lmw"
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5
+$as_echo_n "checking for cos in -lm... " >&6; }
+if ${ac_cv_lib_m_cos+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
+fi
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char cos ();
+int
+main ()
+{
+return cos ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_m_cos=yes
+else
+ ac_cv_lib_m_cos=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5
+$as_echo "$ac_cv_lib_m_cos" >&6; }
+if test "x$ac_cv_lib_m_cos" = xyes; then :
+ LIBM="$LIBM -lm"
+fi
+
+ ;;
+*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5
+$as_echo_n "checking for cos in -lm... " >&6; }
+if ${ac_cv_lib_m_cos+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
+fi
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char cos ();
+int
+main ()
+{
+return cos ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_m_cos=yes
+else
+ ac_cv_lib_m_cos=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5
+$as_echo "$ac_cv_lib_m_cos" >&6; }
+if test "x$ac_cv_lib_m_cos" = xyes; then :
+ LIBM="-lm"
+fi
+
+ ;;
+esac
+
+
+
+ if test x$enable_darwin_at_rpath = xyes; then
+ ENABLE_DARWIN_AT_RPATH_TRUE=
+ ENABLE_DARWIN_AT_RPATH_FALSE='#'
+else
+ ENABLE_DARWIN_AT_RPATH_TRUE='#'
+ ENABLE_DARWIN_AT_RPATH_FALSE=
+fi
+
+
+
+
+
+# This library is written in C++ and needs to link with the C++ runtime.
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+# We must force CC/CXX to /not/ be precious variables; otherwise
+# the wrong, non-multilib-adjusted value will be used in multilibs.
+# As a side effect, we have to subst CFLAGS ourselves.
+
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+ if test -n "$CCC"; then
+ CXX=$CCC
+ else
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CXX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CXX"; then
+ ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+$as_echo "$CXX" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$CXX" && break
+ done
+fi
+if test -z "$CXX"; then
+ ac_ct_CXX=$CXX
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CXX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CXX"; then
+ ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CXX="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+$as_echo "$ac_ct_CXX" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CXX" && break
+done
+
+ if test "x$ac_ct_CXX" = x; then
+ CXX="g++"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CXX=$ac_ct_CXX
+ fi
+fi
+
+ fi
+fi
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
+$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
+if ${ac_cv_cxx_compiler_gnu+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_compiler_gnu=yes
+else
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+ GXX=yes
+else
+ GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+$as_echo_n "checking whether $CXX accepts -g... " >&6; }
+if ${ac_cv_prog_cxx_g+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+ ac_cxx_werror_flag=yes
+ ac_cv_prog_cxx_g=no
+ CXXFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_cv_prog_cxx_g=yes
+else
+ CXXFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+else
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+ CXXFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+$as_echo "$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+ CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+ if test "$GXX" = yes; then
+ CXXFLAGS="-g -O2"
+ else
+ CXXFLAGS="-g"
+ fi
+else
+ if test "$GXX" = yes; then
+ CXXFLAGS="-O2"
+ else
+ CXXFLAGS=
+ fi
+fi
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+depcc="$CXX" am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CXX_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CXX_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+ am__fastdepCXX_TRUE=
+ am__fastdepCXX_FALSE='#'
+else
+ am__fastdepCXX_TRUE='#'
+ am__fastdepCXX_FALSE=
+fi
+
+
if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
(test "X$CXX" != "Xg++"))) ; then
@@ -13362,11 +12676,11 @@ as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
See \`config.log' for more details" "$LINENO" 5; }
fi
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
else
_lt_caught_CXX_error=yes
@@ -16317,1064 +15631,63 @@ fi
lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
fi # test "$_lt_caught_CXX_error" != yes
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-
-
-
-
-
-
-
-
-
-
- ac_config_commands="$ac_config_commands libtool"
-
-
-
-
-# Only expand once:
-
-
-
-
-enable_dlopen=yes
-
-
-
-LIBM=
-case $host in
-*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
- # These system don't have libm, or don't need it
- ;;
-*-ncr-sysv4.3*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _mwvalidcheckl in -lmw" >&5
-$as_echo_n "checking for _mwvalidcheckl in -lmw... " >&6; }
-if ${ac_cv_lib_mw__mwvalidcheckl+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lmw $LIBS"
-if test x$gcc_no_link = xyes; then
- as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
-fi
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char _mwvalidcheckl ();
-int
-main ()
-{
-return _mwvalidcheckl ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_mw__mwvalidcheckl=yes
-else
- ac_cv_lib_mw__mwvalidcheckl=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mw__mwvalidcheckl" >&5
-$as_echo "$ac_cv_lib_mw__mwvalidcheckl" >&6; }
-if test "x$ac_cv_lib_mw__mwvalidcheckl" = xyes; then :
- LIBM="-lmw"
-fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5
-$as_echo_n "checking for cos in -lm... " >&6; }
-if ${ac_cv_lib_m_cos+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lm $LIBS"
-if test x$gcc_no_link = xyes; then
- as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
-fi
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char cos ();
-int
-main ()
-{
-return cos ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_m_cos=yes
-else
- ac_cv_lib_m_cos=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5
-$as_echo "$ac_cv_lib_m_cos" >&6; }
-if test "x$ac_cv_lib_m_cos" = xyes; then :
- LIBM="$LIBM -lm"
-fi
-
- ;;
-*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5
-$as_echo_n "checking for cos in -lm... " >&6; }
-if ${ac_cv_lib_m_cos+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lm $LIBS"
-if test x$gcc_no_link = xyes; then
- as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
-fi
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char cos ();
-int
-main ()
-{
-return cos ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_m_cos=yes
-else
- ac_cv_lib_m_cos=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5
-$as_echo "$ac_cv_lib_m_cos" >&6; }
-if test "x$ac_cv_lib_m_cos" = xyes; then :
- LIBM="-lm"
-fi
-
- ;;
-esac
-
-
-
- if test x$enable_darwin_at_rpath = xyes; then
- ENABLE_DARWIN_AT_RPATH_TRUE=
- ENABLE_DARWIN_AT_RPATH_FALSE='#'
-else
- ENABLE_DARWIN_AT_RPATH_TRUE='#'
- ENABLE_DARWIN_AT_RPATH_FALSE=
-fi
-
-
-
-
-
-# These are GLIBC
-
-
-
- for ac_func in $ac_func_list
-do :
- as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-
-
-
-
-
-
-
-
-
-
-# These are C23, and might not be available in libc.
-
-
-
-
-
-
-if test "${multilib}" = "yes"; then
- multilib_arg="--enable-multilib"
-else
- multilib_arg=
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-# Check the compiler.
-# The same as in boehm-gc and libstdc++. Have to borrow it from there.
-# We must force CC to /not/ be precious variables; otherwise
-# the wrong, non-multilib-adjusted value will be used in multilibs.
-# As a side effect, we have to subst CFLAGS ourselves.
-
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_CC="${ac_tool_prefix}gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_CC"; then
- ac_ct_CC=$CC
- # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_CC"; then
- ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_CC="gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_CC" = x; then
- CC=""
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- CC=$ac_ct_CC
- fi
-else
- CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_CC="${ac_tool_prefix}cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- fi
-fi
-if test -z "$CC"; then
- # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
- ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
- ac_prog_rejected=yes
- continue
- fi
- ac_cv_prog_CC="cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-if test $ac_prog_rejected = yes; then
- # We found a bogon in the path, so make sure we never use it.
- set dummy $ac_cv_prog_CC
- shift
- if test $# != 0; then
- # We chose a different compiler from the bogus one.
- # However, it has the same basename, so the bogon will be chosen
- # first if we set CC to just the basename; use the full file name.
- shift
- ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
- fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$CC"; then
- if test -n "$ac_tool_prefix"; then
- for ac_prog in cl.exe
- do
- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$CC" && break
- done
-fi
-if test -z "$CC"; then
- ac_ct_CC=$CC
- for ac_prog in cl.exe
-do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_CC"; then
- ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_CC="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
- test -n "$ac_ct_CC" && break
-done
- if test "x$ac_ct_CC" = x; then
- CC=""
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- CC=$ac_ct_CC
- fi
-fi
-fi
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "no acceptable C compiler found in \$PATH
-See \`config.log' for more details" "$LINENO" 5; }
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
- { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
+# Check whether --with-toolexeclibdir was given.
+if test "${with_toolexeclibdir+set}" = set; then :
+ withval=$with_toolexeclibdir; case ${with_toolexeclibdir} in
+ /)
+ ;;
+ */)
+ with_toolexeclibdir=`echo $with_toolexeclibdir | sed 's,/$,,'`
+ ;;
esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_compiler $ac_option >&5") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- sed '10a\
-... rest of stderr output deleted ...
- 10q' conftest.err >conftest.er1
- cat conftest.er1 >&5
- fi
- rm -f conftest.er1 conftest.err
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if ${ac_cv_c_compiler_gnu+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-#ifndef __GNUC__
- choke me
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_compiler_gnu=yes
-else
- ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
- GCC=yes
else
- GCC=
-fi
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if ${ac_cv_prog_cc_g+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_save_c_werror_flag=$ac_c_werror_flag
- ac_c_werror_flag=yes
- ac_cv_prog_cc_g=no
- CFLAGS="-g"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_g=yes
-else
- CFLAGS=""
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
- ac_c_werror_flag=$ac_save_c_werror_flag
- CFLAGS="-g"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- ac_c_werror_flag=$ac_save_c_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
- CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
- if test "$GCC" = yes; then
- CFLAGS="-g -O2"
- else
- CFLAGS="-g"
- fi
-else
- if test "$GCC" = yes; then
- CFLAGS="-O2"
- else
- CFLAGS=
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if ${ac_cv_prog_cc_c89+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_prog_cc_c89=no
-ac_save_CC=$CC
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdarg.h>
-#include <stdio.h>
-struct stat;
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
- char **p;
- int i;
-{
- return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
- char *s;
- va_list v;
- va_start (v,p);
- s = g (p, va_arg (v,int));
- va_end (v);
- return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
- function prototypes and stuff, but not '\xHH' hex character constants.
- These don't provoke an error unfortunately, instead are silently treated
- as 'x'. The following induces an error, until -std is added to get
- proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
- array size at least. It's necessary to write '\x00'==0 to get something
- that's true only with -std. */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
-
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
- inside strings and character constants. */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
-
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
- ;
- return 0;
-}
-_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
- -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
- CC="$ac_save_CC $ac_arg"
- if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_c89=$ac_arg
-fi
-rm -f core conftest.err conftest.$ac_objext
- test "x$ac_cv_prog_cc_c89" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
-fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
- x)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
- xno)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
- *)
- CC="$CC $ac_cv_prog_cc_c89"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
-
+ with_toolexeclibdir=no
fi
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
-$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
-if ${am_cv_prog_cc_c_o+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-int
-main ()
-{
- ;
- return 0;
-}
-_ACEOF
- # Make sure it works both with $CC and with simple cc.
- # Following AC_PROG_CC_C_O, we do the test twice because some
- # compilers refuse to overwrite an existing .o file with -o,
- # though they will create one.
- am_cv_prog_cc_c_o=yes
- for am_i in 1 2; do
- if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
- ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } \
- && test -f conftest2.$ac_objext; then
- : OK
+# Calculate toolexeclibdir
+# Also toolexecdir, though it's only used in toolexeclibdir
+case ${version_specific_libs} in
+ yes)
+ # Need the gcc compiler version to know where to install libraries
+ # and header files if --enable-version-specific-runtime-libs option
+ # is selected.
+ toolexecdir='$(libdir)/gcc/$(target_noncanonical)'
+ toolexeclibdir='$(toolexecdir)/$(gcc_version)$(MULTISUBDIR)'
+ ;;
+ no)
+ if test -n "$with_cross_host" &&
+ test x"$with_cross_host" != x"no"; then
+ # Install a library built with a cross compiler in tooldir, not libdir.
+ toolexecdir='$(exec_prefix)/$(target_noncanonical)'
+ toolexeclibdir='$(toolexecdir)/lib'
else
- am_cv_prog_cc_c_o=no
- break
+ toolexecdir='$(libdir)/gcc-lib/$(target_noncanonical)'
+ toolexeclibdir='$(libdir)'
fi
- done
- rm -f core conftest*
- unset am_i
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
-$as_echo "$am_cv_prog_cc_c_o" >&6; }
-if test "$am_cv_prog_cc_c_o" != yes; then
- # Losing compiler, so override with the script.
- # FIXME: It is wrong to rewrite CC.
- # But if we don't then we get into trouble of one sort or another.
- # A longer-term fix would be to have automake use am__CC in this case,
- # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
- CC="$am_aux_dir/compile $CC"
-fi
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-
-
-
-CC_FOR_BUILD=${CC_FOR_BUILD:-gcc}
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing malloc" >&5
-$as_echo_n "checking for library containing malloc... " >&6; }
-if ${ac_cv_search_malloc+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_func_search_save_LIBS=$LIBS
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char malloc ();
-int
-main ()
-{
-return malloc ();
- ;
- return 0;
-}
-_ACEOF
-for ac_lib in '' c; do
- if test -z "$ac_lib"; then
- ac_res="none required"
- else
- ac_res=-l$ac_lib
- LIBS="-l$ac_lib $ac_func_search_save_LIBS"
- fi
- if test x$gcc_no_link = xyes; then
- as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
-fi
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_search_malloc=$ac_res
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext
- if ${ac_cv_search_malloc+:} false; then :
- break
-fi
-done
-if ${ac_cv_search_malloc+:} false; then :
-
-else
- ac_cv_search_malloc=no
-fi
-rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_malloc" >&5
-$as_echo "$ac_cv_search_malloc" >&6; }
-ac_res=$ac_cv_search_malloc
-if test "$ac_res" != no; then :
- test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing cosf" >&5
-$as_echo_n "checking for library containing cosf... " >&6; }
-if ${ac_cv_search_cosf+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_func_search_save_LIBS=$LIBS
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char cosf ();
-int
-main ()
-{
-return cosf ();
- ;
- return 0;
-}
-_ACEOF
-for ac_lib in '' m; do
- if test -z "$ac_lib"; then
- ac_res="none required"
- else
- ac_res=-l$ac_lib
- LIBS="-l$ac_lib $ac_func_search_save_LIBS"
- fi
- if test x$gcc_no_link = xyes; then
- as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
-fi
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_search_cosf=$ac_res
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext
- if ${ac_cv_search_cosf+:} false; then :
- break
-fi
-done
-if ${ac_cv_search_cosf+:} false; then :
-
-else
- ac_cv_search_cosf=no
-fi
-rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_cosf" >&5
-$as_echo "$ac_cv_search_cosf" >&6; }
-ac_res=$ac_cv_search_cosf
-if test "$ac_res" != no; then :
- test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5
-$as_echo_n "checking for library containing clock_gettime... " >&6; }
-if ${ac_cv_search_clock_gettime+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_func_search_save_LIBS=$LIBS
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char clock_gettime ();
-int
-main ()
-{
-return clock_gettime ();
- ;
- return 0;
-}
-_ACEOF
-for ac_lib in '' rt; do
- if test -z "$ac_lib"; then
- ac_res="none required"
- else
- ac_res=-l$ac_lib
- LIBS="-l$ac_lib $ac_func_search_save_LIBS"
- fi
- if test x$gcc_no_link = xyes; then
- as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
-fi
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_search_clock_gettime=$ac_res
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext
- if ${ac_cv_search_clock_gettime+:} false; then :
- break
-fi
-done
-if ${ac_cv_search_clock_gettime+:} false; then :
-
-else
- ac_cv_search_clock_gettime=no
-fi
-rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5
-$as_echo "$ac_cv_search_clock_gettime" >&6; }
-ac_res=$ac_cv_search_clock_gettime
-if test "$ac_res" != no; then :
- test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
-
-fi
-
-
-# Add dependencies for libgcobol.spec file
-SPEC_LIBGCOBOL_DEPS="$LIBS"
-
-
-# libgcobol soname version
-LIBGCOBOL_VERSION=1:0:0
-
-
-## added
-VERSION_SUFFIX=$(echo $LIBGCOBOL_VERSION | tr ':' '.' )
-
-## end added
-
-# Determine what GCC version number to use in filesystem paths.
-
- get_gcc_base_ver="cat"
-
-# Check whether --with-gcc-major-version-only was given.
-if test "${with_gcc_major_version_only+set}" = set; then :
- withval=$with_gcc_major_version_only; if test x$with_gcc_major_version_only = xyes ; then
- get_gcc_base_ver="sed -e 's/^\([0-9]*\).*/\1/'"
- fi
-
-fi
-
-
-
-
-extra_darwin_ldflags_libgcobol=
-case $host in
- *-*-darwin*)
- extra_darwin_ldflags_libgcobol=-Wl,-U,___cobol_main ;;
- *) ;;
+ multi_os_directory=`$CC -print-multi-os-directory`
+ case $multi_os_directory in
+ .) ;; # Avoid trailing /.
+ *) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;;
+ esac
+ ;;
esac
+
# For iconv support.
if test "X$prefix" = "XNONE"; then
@@ -17989,7 +16302,7 @@ iconv_t cd = iconv_open("","");
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_cxx_try_link "$LINENO"; then :
am_cv_func_iconv=yes
fi
rm -f core conftest.err conftest.$ac_objext \
@@ -18016,7 +16329,7 @@ iconv_t cd = iconv_open("","");
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_cxx_try_link "$LINENO"; then :
am_cv_lib_iconv=yes
am_cv_func_iconv=yes
fi
@@ -18171,7 +16484,7 @@ int result = 0;
return 0;
}
_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
+if ac_fn_cxx_try_run "$LINENO"; then :
am_cv_func_iconv_works=yes
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
@@ -18235,7 +16548,7 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"; then :
gl_cv_iconv_nonconst=yes
else
gl_cv_iconv_nonconst=no
@@ -18275,10 +16588,417 @@ _ACEOF
fi
+# Checks for header files.
+
+for ac_header in malloc.h
+do :
+ ac_fn_cxx_check_header_mongrel "$LINENO" "malloc.h" "ac_cv_header_malloc_h" "$ac_includes_default"
+if test "x$ac_cv_header_malloc_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_MALLOC_H 1
+_ACEOF
+
+fi
+
+done
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
+$as_echo_n "checking size of void *... " >&6; }
+if ${ac_cv_sizeof_void_p+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then :
+
+else
+ if test "$ac_cv_type_void_p" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (void *)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_void_p=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5
+$as_echo "$ac_cv_sizeof_void_p" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_VOID_P $ac_cv_sizeof_void_p
+_ACEOF
+
+
+
+# Get target configury.
+unset LIBGCOBOL_SUPPORTED
+. ${srcdir}/configure.tgt
+
+# -----------------
+# __int128 support
+# -----------------
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether __int128 is supported" >&5
+$as_echo_n "checking whether __int128 is supported... " >&6; }
+if ${libgcobol_cv_have_int128+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test x$gcc_no_link = xyes; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ __int128 foo (__int128 )
+ {
+ __int128 aaa;
+ return (__int128) aaa;
+ }
+
+ __int128 bar (__int128 )
+ {
+ __int128 aaa;
+ return (__int128) aaa;
+ }
+
+int
+main ()
+{
+
+ foo (1);
+ bar (1);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+ libgcobol_cv_have_int128=yes
+
+else
+
+ libgcobol_cv_have_int128=no
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+ if test x$gcc_no_link = xyes; then
+ as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
+fi
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ __int128 foo (__int128 )
+ {
+ __int128 aaa;
+ return (__int128) aaa;
+ }
+
+ __int128 bar (__int128 )
+ {
+ __int128 aaa;
+ return (__int128) aaa;
+ }
+
+int
+main ()
+{
+
+ foo (1);
+ bar (1);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+
+ libgcobol_cv_have_int128=yes
+
+else
+
+ libgcobol_cv_have_int128=no
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgcobol_cv_have_int128" >&5
+$as_echo "$libgcobol_cv_have_int128" >&6; }
+
+ if test "x$LIBGCOBOL_SUPPORTED" = xyes && test "x$libgcobol_cv_have_int128" = xyes; then
+ BUILD_LIBGCOBOL_TRUE=
+ BUILD_LIBGCOBOL_FALSE='#'
+else
+ BUILD_LIBGCOBOL_TRUE='#'
+ BUILD_LIBGCOBOL_FALSE=
+fi
+
+
+# Check if functions are available in libc before adding extra libs.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing malloc" >&5
+$as_echo_n "checking for library containing malloc... " >&6; }
+if ${ac_cv_search_malloc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char malloc ();
+int
+main ()
+{
+return malloc ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' c; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if test x$gcc_no_link = xyes; then
+ as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
+fi
+if ac_fn_cxx_try_link "$LINENO"; then :
+ ac_cv_search_malloc=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_malloc+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_malloc+:} false; then :
+
+else
+ ac_cv_search_malloc=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_malloc" >&5
+$as_echo "$ac_cv_search_malloc" >&6; }
+ac_res=$ac_cv_search_malloc
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5
+$as_echo_n "checking for library containing clock_gettime... " >&6; }
+if ${ac_cv_search_clock_gettime+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char clock_gettime ();
+int
+main ()
+{
+return clock_gettime ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' c rt; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if test x$gcc_no_link = xyes; then
+ as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
+fi
+if ac_fn_cxx_try_link "$LINENO"; then :
+ ac_cv_search_clock_gettime=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_clock_gettime+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_clock_gettime+:} false; then :
+
+else
+ ac_cv_search_clock_gettime=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5
+$as_echo "$ac_cv_search_clock_gettime" >&6; }
+ac_res=$ac_cv_search_clock_gettime
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
-ac_config_files="$ac_config_files Makefile"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing cosf128" >&5
+$as_echo_n "checking for library containing cosf128... " >&6; }
+if ${ac_cv_search_cosf128+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char cosf128 ();
+int
+main ()
+{
+return cosf128 ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' c m; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if test x$gcc_no_link = xyes; then
+ as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
+fi
+if ac_fn_cxx_try_link "$LINENO"; then :
+ ac_cv_search_cosf128=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_cosf128+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_cosf128+:} false; then :
+
+else
+ ac_cv_search_cosf128=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_cosf128" >&5
+$as_echo "$ac_cv_search_cosf128" >&6; }
+ac_res=$ac_cv_search_cosf128
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+
+# libgcobol soname version
+LIBGCOBOL_VERSION=1:0:0
+
+
+## added, currently unused.
+# VERSION_SUFFIX=$(echo $LIBGCOBOL_VERSION | tr ':' '.' )
+# AC_SUBST(VERSION_SUFFIX)
+## end added
+
+extra_ldflags_libgcobol=
+case $host in
+ *-*-darwin*)
+ extra_ldflags_libgcobol=-Wl,-U,___cobol_main ;;
+ *) ;;
+esac
+
+
+# These are GLIBC
+
+
+
+ for ac_func in $ac_func_list
+do :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_cxx_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+
+
+
+
+
+
+
+
+
+# These are C23, and might not be available in libc.
+
+
+
+
+
+
+if test "${multilib}" = "yes"; then
+ multilib_arg="--enable-multilib"
+else
+ multilib_arg=
+fi
+
+# Determine what GCC version number to use in filesystem paths.
+
+ get_gcc_base_ver="cat"
+
+# Check whether --with-gcc-major-version-only was given.
+if test "${with_gcc_major_version_only+set}" = set; then :
+ withval=$with_gcc_major_version_only; if test x$with_gcc_major_version_only = xyes ; then
+ get_gcc_base_ver="sed -e 's/^\([0-9]*\).*/\1/'"
+ fi
+
+fi
+
+
+
+
+# Add dependencies for libgcobol.spec file, this might be excessive - since
+# the spec file might not use all of them.
+SPEC_LIBGCOBOL_DEPS="$LIBS"
+
+
+ac_config_files="$ac_config_files Makefile libgcobol.spec"
-####AC_CONFIG_FILES(libgcobol.spec)
{ $as_echo "$as_me:${as_lineno-$LINENO}: libgcobol has been configured." >&5
$as_echo "$as_me: libgcobol has been configured." >&6;}
@@ -18392,6 +17112,10 @@ LIBOBJS=$ac_libobjs
LTLIBOBJS=$ac_ltlibobjs
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+ as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
$as_echo_n "checking that generated files are newer than configure... " >&6; }
if test -n "$am_sleep_pid"; then
@@ -18400,14 +17124,6 @@ $as_echo_n "checking that generated files are newer than configure... " >&6; }
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
$as_echo "done" >&6; }
-if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
- as_fn_error $? "conditional \"AMDEP\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
- as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
if test -n "$EXEEXT"; then
am__EXEEXT_TRUE=
am__EXEEXT_FALSE='#'
@@ -18416,24 +17132,24 @@ else
am__EXEEXT_FALSE=
fi
-if test -z "${BUILD_LIBGCOBOL_TRUE}" && test -z "${BUILD_LIBGCOBOL_FALSE}"; then
- as_fn_error $? "conditional \"BUILD_LIBGCOBOL\" was never defined.
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ as_fn_error $? "conditional \"AMDEP\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
-if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
- as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
-if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
- as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
+if test -z "${ENABLE_DARWIN_AT_RPATH_TRUE}" && test -z "${ENABLE_DARWIN_AT_RPATH_FALSE}"; then
+ as_fn_error $? "conditional \"ENABLE_DARWIN_AT_RPATH\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
-if test -z "${am__fastdepCCAS_TRUE}" && test -z "${am__fastdepCCAS_FALSE}"; then
- as_fn_error $? "conditional \"am__fastdepCCAS\" was never defined.
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
-if test -z "${ENABLE_DARWIN_AT_RPATH_TRUE}" && test -z "${ENABLE_DARWIN_AT_RPATH_FALSE}"; then
- as_fn_error $? "conditional \"ENABLE_DARWIN_AT_RPATH\" was never defined.
+if test -z "${BUILD_LIBGCOBOL_TRUE}" && test -z "${BUILD_LIBGCOBOL_FALSE}"; then
+ as_fn_error $? "conditional \"BUILD_LIBGCOBOL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
@@ -19407,6 +18123,7 @@ do
"depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
"libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
"Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "libgcobol.spec") CONFIG_FILES="$CONFIG_FILES libgcobol.spec" ;;
*) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
esac
diff --git a/libgcobol/configure.ac b/libgcobol/configure.ac
index 6b287a1..ca56997 100644
--- a/libgcobol/configure.ac
+++ b/libgcobol/configure.ac
@@ -26,8 +26,32 @@ AC_INIT(package-unused, version-unused,,libgcobol)
AC_CONFIG_SRCDIR(Makefile.am)
AC_CONFIG_HEADER(config.h)
+# Do not delete or change the following two lines. For why, see
+# http://gcc.gnu.org/ml/libstdc++/2003-07/msg00451.html
+AC_CANONICAL_SYSTEM
+ACX_NONCANONICAL_TARGET
+
AM_ENABLE_MULTILIB(, ..)
+target_alias=${target_alias-$host_alias}
+AC_SUBST(target_alias)
+
+AM_MAINTAINER_MODE
+
+AM_INIT_AUTOMAKE([1.15.1 no-define foreign no-dist -Wall -Wno-portability])
+
+AC_MSG_CHECKING([for --enable-version-specific-runtime-libs])
+AC_ARG_ENABLE(version-specific-runtime-libs,
+AS_HELP_STRING([--enable-version-specific-runtime-libs],
+[Specify that runtime libraries should be installed in a compiler-specific directory]),
+[case "$enableval" in
+ yes) version_specific_libs=yes ;;
+ no) version_specific_libs=no ;;
+ *) AC_MSG_ERROR([Unknown argument to enable/disable version-specific libs]);;
+ esac],
+[version_specific_libs=no])
+AC_MSG_RESULT($version_specific_libs)
+
# This works around the fact that libtool configuration may change LD
# for this particular configuration, but some shells, instead of
# keeping the changes in LD private, export them just because LD is
@@ -38,107 +62,40 @@ GCC_NO_EXECUTABLES
AC_USE_SYSTEM_EXTENSIONS
-# Do not delete or change the following two lines. For why, see
-# http://gcc.gnu.org/ml/libstdc++/2003-07/msg00451.html
-AC_CANONICAL_SYSTEM
-target_alias=${target_alias-$host_alias}
-AC_SUBST(target_alias)
-
-AM_INIT_AUTOMAKE # ([1.15.1 no-define foreign no-dist -Wall -Wno-portability])
-
-AH_TEMPLATE(PACKAGE, [Name of package])
-AH_TEMPLATE(VERSION, [Version number of package])
+# Find other programs we need.
+AC_CHECK_TOOL(AR, ar)
+AC_CHECK_TOOL(NM, nm)
+AC_CHECK_TOOL(RANLIB, ranlib, ranlib-not-found-in-path-error)
+AC_PROG_MAKE_SET
+AC_PROG_INSTALL
-AC_ARG_WITH(cross-host,
-[ --with-cross-host=HOST Configuring with a cross compiler])
+AM_PROG_LIBTOOL
+LT_INIT
-# Checks for header files.
-AC_CHECK_HEADERS(malloc.h)
+AC_LIBTOOL_DLOPEN
+LT_LIB_M
-AC_CANONICAL_HOST
-ACX_NONCANONICAL_HOST
-ACX_NONCANONICAL_TARGET
-GCC_TOPLEV_SUBDIRS
+AM_CONDITIONAL([ENABLE_DARWIN_AT_RPATH], [test x$enable_darwin_at_rpath = xyes])
-AC_CHECK_SIZEOF([void *])
+AC_SUBST(enable_shared)
+AC_SUBST(enable_static)
-# Get target configury.
-unset LIBGCOBOL_SUPPORTED
-. ${srcdir}/configure.tgt
+# This library is written in C++ and needs to link with the C++ runtime.
+AC_LANG([C++])
-# -----------------
-# __int128 support
-# -----------------
+# We must force CC/CXX to /not/ be precious variables; otherwise
+# the wrong, non-multilib-adjusted value will be used in multilibs.
+# As a side effect, we have to subst CFLAGS ourselves.
-AC_CACHE_CHECK([whether __int128 is supported], [libgcobol_cv_have_int128],
- [GCC_TRY_COMPILE_OR_LINK([
- __int128 foo (__int128 )
- {
- __int128 aaa;
- return (__int128) aaa;
- }
+m4_rename([_AC_ARG_VAR_PRECIOUS],[real_PRECIOUS])
+m4_define([_AC_ARG_VAR_PRECIOUS],[])
+AC_PROG_CXX
+m4_rename_force([real_PRECIOUS],[_AC_ARG_VAR_PRECIOUS])
- __int128 bar (__int128 )
- {
- __int128 aaa;
- return (__int128) aaa;
- }
- ],[
- foo (1);
- bar (1);
- ],[
- libgcobol_cv_have_int128=yes
- ],[
- libgcobol_cv_have_int128=no
-])])
-# The following conditional is useful when this creates a Makefile.am file that
-# is subsequently processed into a Makefile.in file. At the present time,
-# however the libgcobol build uses a hardcoded Makefile.in file.
-AM_CONDITIONAL(BUILD_LIBGCOBOL, [test "x$LIBGCOBOL_SUPPORTED" = xyes && test "x$libgcobol_cv_have_int128" = xyes])
+AC_SUBST(CXXFLAGS)
GCC_WITH_TOOLEXECLIBDIR
-AC_MSG_CHECKING([for --enable-version-specific-runtime-libs])
-AC_ARG_ENABLE(version-specific-runtime-libs,
-[ --enable-version-specific-runtime-libs Specify that runtime libraries should be installed in a compiler-specific directory ],
-[case "$enableval" in
- yes) version_specific_libs=yes ;;
- no) version_specific_libs=no ;;
- *) AC_MSG_ERROR([Unknown argument to enable/disable version-specific libs]);;
- esac],
-[version_specific_libs=no])
-AC_MSG_RESULT($version_specific_libs)
-
-AC_ARG_WITH(slibdir,
-[ --with-slibdir=DIR shared libraries in DIR [LIBDIR]],
-slibdir="$with_slibdir",
-if test "${version_specific_libs}" = yes; then
- slibdir='$(libsubdir)'
-elif test -n "$with_cross_host" && test x"$with_cross_host" != x"no"; then
- slibdir='$(exec_prefix)/$(host_noncanonical)/lib'
-else
- slibdir='$(libdir)'
-fi)
-AC_SUBST(slibdir)
-
-# Command-line options.
-# Very limited version of AC_MAINTAINER_MODE.
-AC_ARG_ENABLE([maintainer-mode],
- [AC_HELP_STRING([--enable-maintainer-mode],
- [enable make rules and dependencies not useful (and
- sometimes confusing) to the casual installer])],
- [case ${enable_maintainer_mode} in
- yes) MAINT='' ;;
- no) MAINT='#' ;;
- *) AC_MSG_ERROR([--enable-maintainer-mode must be yes or no]) ;;
- esac
- maintainer_mode=${enableval}],
- [MAINT='#'])
-AC_SUBST([MAINT])dnl
-
-toolexecdir=no
-toolexeclibdir=no
-
# Calculate toolexeclibdir
# Also toolexecdir, though it's only used in toolexeclibdir
case ${version_specific_libs} in
@@ -166,55 +123,70 @@ case ${version_specific_libs} in
esac
;;
esac
-
AC_SUBST(toolexecdir)
AC_SUBST(toolexeclibdir)
-# Determine what GCC version number to use in filesystem paths.
-GCC_BASE_VER
+# For iconv support.
+AM_ICONV
-AH_TEMPLATE(PACKAGE, [Name of package])
-AH_TEMPLATE(VERSION, [Version number of package])
+# Checks for header files.
+AC_CHECK_HEADERS(malloc.h)
-AM_MAINTAINER_MODE
+AC_CHECK_SIZEOF([void *])
-# Check the compiler.
-# The same as in boehm-gc and libstdc++. Have to borrow it from there.
-# We must force CC to /not/ be precious variables; otherwise
-# the wrong, non-multilib-adjusted value will be used in multilibs.
-# As a side effect, we have to subst CFLAGS ourselves.
+# Get target configury.
+unset LIBGCOBOL_SUPPORTED
+. ${srcdir}/configure.tgt
-m4_rename([_AC_ARG_VAR_PRECIOUS],[real_PRECIOUS])
-m4_define([_AC_ARG_VAR_PRECIOUS],[])
-AC_PROG_CC
-AC_PROG_CXX
-AM_PROG_AS
-m4_rename_force([real_PRECIOUS],[_AC_ARG_VAR_PRECIOUS])
+# -----------------
+# __int128 support
+# -----------------
-AC_SUBST(CFLAGS)
+AC_CACHE_CHECK([whether __int128 is supported], [libgcobol_cv_have_int128],
+ [GCC_TRY_COMPILE_OR_LINK([
+ __int128 foo (__int128 )
+ {
+ __int128 aaa;
+ return (__int128) aaa;
+ }
-# In order to override CFLAGS_FOR_TARGET, all of our special flags go
-# in XCFLAGS. But we need them in CFLAGS during configury. So put them
-# in both places for now and restore CFLAGS at the end of config.
-save_CFLAGS="$CFLAGS"
+ __int128 bar (__int128 )
+ {
+ __int128 aaa;
+ return (__int128) aaa;
+ }
+ ],[
+ foo (1);
+ bar (1);
+ ],[
+ libgcobol_cv_have_int128=yes
+ ],[
+ libgcobol_cv_have_int128=no
+])])
-# Find other programs we need.
-AC_CHECK_TOOL(AR, ar)
-AC_CHECK_TOOL(NM, nm)
-AC_CHECK_TOOL(RANLIB, ranlib, ranlib-not-found-in-path-error)
-AC_PROG_MAKE_SET
-AC_PROG_INSTALL
+AM_CONDITIONAL(BUILD_LIBGCOBOL, [test "x$LIBGCOBOL_SUPPORTED" = xyes && test "x$libgcobol_cv_have_int128" = xyes])
-AM_PROG_LIBTOOL
-LT_INIT
+# Check if functions are available in libc before adding extra libs.
+AC_SEARCH_LIBS([malloc], [c])
+AC_SEARCH_LIBS([clock_gettime], [c rt])
+AC_SEARCH_LIBS([cosf128], [c m])
-AC_LIBTOOL_DLOPEN
-LT_LIB_M
+# libgcobol soname version
+LIBGCOBOL_VERSION=1:0:0
+AC_SUBST(LIBGCOBOL_VERSION)
-AM_CONDITIONAL([ENABLE_DARWIN_AT_RPATH], [test x$enable_darwin_at_rpath = xyes])
+## added, currently unused.
+# VERSION_SUFFIX=$(echo $LIBGCOBOL_VERSION | tr ':' '.' )
+# AC_SUBST(VERSION_SUFFIX)
+## end added
-AC_SUBST(enable_shared)
-AC_SUBST(enable_static)
+extra_ldflags_libgcobol=
+case $host in
+ *-*-darwin*)
+ extra_ldflags_libgcobol=-Wl,-U,___cobol_main ;;
+ *) ;;
+esac
+AC_SUBST(extra_ldflags_libgcobol)
# These are GLIBC
AC_CHECK_FUNCS_ONCE(random_r srandom_r initstate_r setstate_r)
@@ -228,57 +200,18 @@ else
multilib_arg=
fi
-AC_LANG_C
-# Check the compiler.
-# The same as in boehm-gc and libstdc++. Have to borrow it from there.
-# We must force CC to /not/ be precious variables; otherwise
-# the wrong, non-multilib-adjusted value will be used in multilibs.
-# As a side effect, we have to subst CFLAGS ourselves.
-
-m4_rename([_AC_ARG_VAR_PRECIOUS],[real_PRECIOUS])
-m4_define([_AC_ARG_VAR_PRECIOUS],[])
-AC_PROG_CC
-m4_rename_force([real_PRECIOUS],[_AC_ARG_VAR_PRECIOUS])
-
-AC_SUBST(CFLAGS)
-
-CC_FOR_BUILD=${CC_FOR_BUILD:-gcc}
-AC_SUBST(CC_FOR_BUILD)
-
-AC_SEARCH_LIBS([malloc], [c])
-AC_SEARCH_LIBS([cosf], [m])
-AC_SEARCH_LIBS([clock_gettime], [rt])
-
-# Add dependencies for libgcobol.spec file
-SPEC_LIBGCOBOL_DEPS="$LIBS"
-AC_SUBST(SPEC_LIBGCOBOL_DEPS)
-
-# libgcobol soname version
-LIBGCOBOL_VERSION=1:0:0
-AC_SUBST(LIBGCOBOL_VERSION)
-
-## added
-VERSION_SUFFIX=$(echo $LIBGCOBOL_VERSION | tr ':' '.' )
-AC_SUBST(VERSION_SUFFIX)
-## end added
-
# Determine what GCC version number to use in filesystem paths.
GCC_BASE_VER
-extra_darwin_ldflags_libgcobol=
-case $host in
- *-*-darwin*)
- extra_darwin_ldflags_libgcobol=-Wl,-U,___cobol_main ;;
- *) ;;
-esac
-AC_SUBST(extra_darwin_ldflags_libgcobol)
-
-# For iconv support.
-AM_ICONV
+# Add dependencies for libgcobol.spec file, this might be excessive - since
+# the spec file might not use all of them.
+SPEC_LIBGCOBOL_DEPS="$LIBS"
+AC_SUBST(SPEC_LIBGCOBOL_DEPS)
-AC_CONFIG_SRCDIR([Makefile.am])
-AC_CONFIG_FILES([Makefile])
-####AC_CONFIG_FILES(libgcobol.spec)
+AC_CONFIG_FILES([
+Makefile
+libgcobol.spec
+])
AC_MSG_NOTICE([libgcobol has been configured.])
diff --git a/libgcobol/libgcobol.spec.in b/libgcobol/libgcobol.spec.in
new file mode 100644
index 0000000..e8ccc0d
--- /dev/null
+++ b/libgcobol/libgcobol.spec.in
@@ -0,0 +1,8 @@
+#
+# This spec file is read by gcobol when linking.
+# It is used to specify the libraries we need to link in, in the right
+# order.
+#
+
+%rename lib liborig
+*lib: @LIBM@ %(liborig)
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 03eab2e..a9d8e93 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,10 @@
+2025-04-07 Lulu Cheng <chenglulu@loongson.cn>
+
+ PR target/119408
+ * acinclude.m4: When checking for __float128 support, determine
+ whether the current architecture is LoongArch. If so, return false.
+ * configure: Regenerate.
+
2025-03-22 Hans-Peter Nilsson <hp@axis.com>
* intrinsics/reduce.c (reduce_scalar_c): Correct type of parameter DIM.
diff --git a/libgfortran/acinclude.m4 b/libgfortran/acinclude.m4
index a73207e..23fd621 100644
--- a/libgfortran/acinclude.m4
+++ b/libgfortran/acinclude.m4
@@ -274,6 +274,10 @@ AC_DEFUN([LIBGFOR_CHECK_FLOAT128], [
AC_CACHE_CHECK([whether we have a usable _Float128 type],
libgfor_cv_have_float128, [
GCC_TRY_COMPILE_OR_LINK([
+ #ifdef __loongarch__
+ #error On LoongArch we should use long double instead; __float128 is only for porting existing code easier.
+ #endif
+
_Float128 foo (_Float128 x)
{
_Complex _Float128 z1, z2;
diff --git a/libgfortran/configure b/libgfortran/configure
index 11a1bc5..9898a94 100755
--- a/libgfortran/configure
+++ b/libgfortran/configure
@@ -30283,6 +30283,10 @@ else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
+ #ifdef __loongarch__
+ #error On LoongArch we should use long double instead; __float128 is only for porting existing code easier.
+ #endif
+
_Float128 foo (_Float128 x)
{
_Complex _Float128 z1, z2;
@@ -30336,6 +30340,10 @@ fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
+ #ifdef __loongarch__
+ #error On LoongArch we should use long double instead; __float128 is only for porting existing code easier.
+ #endif
+
_Float128 foo (_Float128 x)
{
_Complex _Float128 z1, z2;
diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog
index a60e51a..6592b0b 100644
--- a/libgomp/ChangeLog
+++ b/libgomp/ChangeLog
@@ -1,3 +1,33 @@
+2025-04-08 Tobias Burnus <tburnus@baylibre.com>
+
+ PR middle-end/119662
+ * testsuite/libgomp.c/append-args-fr-1.c: New test.
+ * testsuite/libgomp.c/append-args-fr.h: New test.
+
+2025-04-08 Tobias Burnus <tburnus@baylibre.com>
+
+ * Makefile.am (%.mod): Add -Wno-c-binding-type.
+ * Makefile.in: Regenerate.
+
+2025-04-08 Tejas Belagod <tejas.belagod@arm.com>
+
+ * testsuite/libgomp.c-target/aarch64/aarch64.exp: Test driver.
+ * testsuite/libgomp.c-target/aarch64/firstprivate.c: New test.
+ * testsuite/libgomp.c-target/aarch64/lastprivate.c: Likewise.
+ * testsuite/libgomp.c-target/aarch64/private.c: Likewise.
+ * testsuite/libgomp.c-target/aarch64/shared.c: Likewise.
+ * testsuite/libgomp.c-target/aarch64/simd-aligned.c: Likewise.
+ * testsuite/libgomp.c-target/aarch64/simd-nontemporal.c: Likewise.
+ * testsuite/libgomp.c-target/aarch64/threadprivate.c: Likewise.
+ * testsuite/libgomp.c-target/aarch64/udr-sve.c: Likewise.
+
+2025-04-07 Tobias Burnus <tburnus@baylibre.com>
+
+ * libgomp.texi (omp_target_memcpy_rect_async,
+ omp_target_memcpy_rect): Add @ref to 'Offload-Target Specifics'.
+ (AMD Radeon (GCN)): Document how memcpy_rect is implemented.
+ (nvptx): Move item about memcpy_rect item down; use present tense.
+
2025-03-26 Thomas Schwinge <thomas@codesourcery.com>
PR driver/101544
diff --git a/libgomp/Makefile.am b/libgomp/Makefile.am
index 855f0af..e3202ae 100644
--- a/libgomp/Makefile.am
+++ b/libgomp/Makefile.am
@@ -97,7 +97,7 @@ openacc_kinds.mod: openacc.mod
openacc.mod: openacc.lo
:
%.mod: %.f90
- $(FC) $(FCFLAGS) -cpp -fopenmp -fsyntax-only $<
+ $(FC) $(FCFLAGS) -cpp -fopenmp -fsyntax-only -Wno-c-binding-type $<
fortran.lo: libgomp_f.h
fortran.o: libgomp_f.h
env.lo: libgomp_f.h
diff --git a/libgomp/Makefile.in b/libgomp/Makefile.in
index 25cb6fc..2a0a842 100644
--- a/libgomp/Makefile.in
+++ b/libgomp/Makefile.in
@@ -1388,7 +1388,7 @@ openacc_kinds.mod: openacc.mod
openacc.mod: openacc.lo
:
%.mod: %.f90
- $(FC) $(FCFLAGS) -cpp -fopenmp -fsyntax-only $<
+ $(FC) $(FCFLAGS) -cpp -fopenmp -fsyntax-only -Wno-c-binding-type $<
fortran.lo: libgomp_f.h
fortran.o: libgomp_f.h
env.lo: libgomp_f.h
diff --git a/libgomp/libgomp.texi b/libgomp/libgomp.texi
index 4217c29..fed9d5e 100644
--- a/libgomp/libgomp.texi
+++ b/libgomp/libgomp.texi
@@ -2316,7 +2316,7 @@ the initial device.
@end multitable
@item @emph{See also}:
-@ref{omp_target_memcpy_rect_async}, @ref{omp_target_memcpy}
+@ref{omp_target_memcpy_rect_async}, @ref{omp_target_memcpy}, @ref{Offload-Target Specifics}
@item @emph{Reference}:
@uref{https://www.openmp.org, OpenMP specification v5.1}, Section 3.8.6
@@ -2391,7 +2391,7 @@ the initial device.
@end multitable
@item @emph{See also}:
-@ref{omp_target_memcpy_rect}, @ref{omp_target_memcpy_async}
+@ref{omp_target_memcpy_rect}, @ref{omp_target_memcpy_async}, @ref{Offload-Target Specifics}
@item @emph{Reference}:
@uref{https://www.openmp.org, OpenMP specification v5.1}, Section 3.8.8
@@ -6911,6 +6911,11 @@ The implementation remark:
@code{omp_thread_mem_alloc}, all use low-latency memory as first
preference, and fall back to main graphics memory when the low-latency
pool is exhausted.
+@item The OpenMP routines @code{omp_target_memcpy_rect} and
+ @code{omp_target_memcpy_rect_async} and the @code{target update}
+ directive for non-contiguous list items use the 3D memory-copy function
+ of the HSA library. Higher dimensions call this functions in a loop and
+ are therefore supported.
@item The unique identifier (UID), used with OpenMP's API UID routines, is the
value returned by the HSA runtime library for @code{HSA_AMD_AGENT_INFO_UUID}.
For GPUs, it is currently @samp{GPU-} followed by 16 lower-case hex digits,
@@ -7048,11 +7053,6 @@ The implementation remark:
devices (``host fallback'').
@item The default per-warp stack size is 128 kiB; see also @code{-msoft-stack}
in the GCC manual.
-@item The OpenMP routines @code{omp_target_memcpy_rect} and
- @code{omp_target_memcpy_rect_async} and the @code{target update}
- directive for non-contiguous list items will use the 2D and 3D
- memory-copy functions of the CUDA library. Higher dimensions will
- call those functions in a loop and are therefore supported.
@item Low-latency memory (@code{omp_low_lat_mem_space}) is supported when the
the @code{access} trait is set to @code{cgroup}, and libgomp has
been built for PTX ISA version 4.1 or higher (such as in GCC's
@@ -7070,6 +7070,11 @@ The implementation remark:
@code{omp_thread_mem_alloc}, all use low-latency memory as first
preference, and fall back to main graphics memory when the low-latency
pool is exhausted.
+@item The OpenMP routines @code{omp_target_memcpy_rect} and
+ @code{omp_target_memcpy_rect_async} and the @code{target update}
+ directive for non-contiguous list items use the 2D and 3D memory-copy
+ functions of the CUDA library. Higher dimensions call those functions
+ in a loop and are therefore supported.
@item The unique identifier (UID), used with OpenMP's API UID routines, consists
of the @samp{GPU-} prefix followed by the 16-bytes UUID as returned by
the CUDA runtime library. This UUID is output in grouped lower-case
diff --git a/libgomp/testsuite/libgomp.c-target/aarch64/aarch64.exp b/libgomp/testsuite/libgomp.c-target/aarch64/aarch64.exp
new file mode 100644
index 0000000..02d5503
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c-target/aarch64/aarch64.exp
@@ -0,0 +1,57 @@
+# Copyright (C) 2006-2025 Free Software Foundation, Inc.
+#
+# This file is part of GCC.
+#
+# GCC is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GCC is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# Load support procs.
+load_lib libgomp-dg.exp
+load_gcc_lib gcc-dg.exp
+
+# Exit immediately if this isn't an AArch64 target.
+if {![istarget aarch64*-*-*] } then {
+ return
+}
+
+lappend ALWAYS_CFLAGS "compiler=$GCC_UNDER_TEST"
+
+if { [check_effective_target_aarch64_sve] } {
+ set sve_flags ""
+} else {
+ set sve_flags "-march=armv8.2-a+sve"
+}
+
+# Initialize `dg'.
+dg-init
+
+#if ![check_effective_target_fopenmp] {
+# return
+#}
+
+# Turn on OpenMP.
+lappend ALWAYS_CFLAGS "additional_flags=-fopenmp"
+
+# Gather a list of all tests.
+set tests [lsort [find $srcdir/$subdir *.c]]
+
+set ld_library_path $always_ld_library_path
+append ld_library_path [gcc-set-multilib-library-path $GCC_UNDER_TEST]
+set_ld_library_path_env_vars
+
+# Main loop.
+dg-runtest $tests "" $sve_flags
+
+# All done.
+dg-finish
diff --git a/libgomp/testsuite/libgomp.c-target/aarch64/firstprivate.c b/libgomp/testsuite/libgomp.c-target/aarch64/firstprivate.c
new file mode 100644
index 0000000..930ca62
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c-target/aarch64/firstprivate.c
@@ -0,0 +1,127 @@
+/* { dg-do run { target aarch64_sve256_hw } } */
+/* { dg-options "-msve-vector-bits=256 -fopenmp -O2" } */
+
+#include <arm_sve.h>
+#include <omp.h>
+
+static void __attribute__ ((noipa))
+vec_compare (svint32_t *x, svint32_t y)
+{
+ svbool_t p = svnot_b_z (svptrue_b32 (), svcmpeq_s32 (svptrue_b32 (), *x, y));
+
+ if (svptest_any (svptrue_b32 (), p))
+ __builtin_abort ();
+}
+
+void __attribute__ ((noipa))
+firstprivate_sections ()
+{
+ int b[8], c[8];
+ svint32_t vb, vc;
+ int i;
+
+#pragma omp parallel for
+ for (i = 0; i < 8; i++)
+ {
+ b[i] = i;
+ c[i] = i + 1;
+ }
+
+ vb = svld1_s32 (svptrue_b32 (), b);
+ vc = svld1_s32 (svptrue_b32 (), c);
+
+#pragma omp parallel sections firstprivate (vb, vc)
+ {
+ #pragma omp section
+ vec_compare (&vb, svindex_s32 (0, 1));
+ vec_compare (&vc, svindex_s32 (1, 1));
+
+ #pragma omp section
+ vec_compare (&vb, svindex_s32 (0, 1));
+ vec_compare (&vc, svindex_s32 (1, 1));
+ }
+
+}
+
+void __attribute__ ((noipa))
+firstprivate_for ()
+{
+
+ int a[32], b[32], c[32];
+ svint32_t va, vb, vc;
+ int i;
+
+#pragma omp parallel for
+ for (i = 0; i < 32; i++)
+ {
+ b[i] = i;
+ c[i] = i + 1;
+ }
+
+ vb = svindex_s32 (1, 0);
+ vc = svindex_s32 (0, 1);
+
+#pragma omp parallel for firstprivate (vb, vc) private (va)
+ for (i = 0; i < 4; i++)
+ {
+ svint32_t tb, tc;
+ vec_compare (&vb, svindex_s32 (1, 0));
+ vec_compare (&vc, svindex_s32 (0, 1));
+ tb = svld1_s32 (svptrue_b32 (), b + i * 8);
+ tc = svld1_s32 (svptrue_b32 (), c + i * 8);
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ va = svadd_s32_z (svptrue_b32 (), va, tb);
+ va = svadd_s32_z (svptrue_b32 (), va, tc);
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ }
+
+ for (i = 0; i < 32; i++)
+ if (a[i] != b[i] + c[i] + vb[i % 8] + vc[i % 8])
+ __builtin_abort ();
+}
+
+void __attribute__ ((noipa))
+firstprivate_distribute ()
+{
+
+ int a[32], b[32], c[32];
+ svint32_t va, vb, vc;
+ int i;
+
+#pragma omp parallel for
+ for (i = 0; i < 32; i++)
+ {
+ b[i] = i;
+ c[i] = i + 1;
+ }
+
+ vb = svindex_s32 (1, 0);
+ vc = svindex_s32 (0, 1);
+
+#pragma omp teams
+#pragma omp distribute firstprivate (vb, vc) private (va)
+ for (i = 0; i < 4; i++)
+ {
+ svint32_t tb, tc;
+ vec_compare (&vb, svindex_s32 (1, 0));
+ vec_compare (&vc, svindex_s32 (0, 1));
+ tb = svld1_s32 (svptrue_b32 (), b + i * 8);
+ tc = svld1_s32 (svptrue_b32 (), c + i * 8);
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ va = svadd_s32_z (svptrue_b32 (), va, tb);
+ va = svadd_s32_z (svptrue_b32 (), va, tc);
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ }
+
+ for (i = 0; i < 32; i++)
+ if (a[i] != b[i] + c[i] + vb[i % 8] + vc[i % 8])
+ __builtin_abort ();
+}
+
+int
+main ()
+{
+ firstprivate_for ();
+ firstprivate_sections ();
+ firstprivate_distribute ();
+}
diff --git a/libgomp/testsuite/libgomp.c-target/aarch64/lastprivate.c b/libgomp/testsuite/libgomp.c-target/aarch64/lastprivate.c
new file mode 100644
index 0000000..be5a618
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c-target/aarch64/lastprivate.c
@@ -0,0 +1,169 @@
+/* { dg-do run { target aarch64_sve256_hw } } */
+/* { dg-options "-msve-vector-bits=256 -fopenmp -O2" } */
+
+#include <arm_sve.h>
+#include <omp.h>
+
+static svint32_t __attribute__ ((noipa))
+foo (svint32_t *vb, svint32_t *vc, int tn)
+{
+ svint32_t temp = svindex_s32 (tn, 0);
+ temp = svadd_s32_z (svptrue_b32 (), temp, *vb);
+ return svadd_s32_z (svptrue_b32 (), temp, *vc);
+}
+
+void __attribute__ ((noipa))
+lastprivate_sections ()
+{
+ int a[8], b[8], c[8];
+ svint32_t va, vb, vc;
+ int i;
+
+#pragma omp parallel for
+ for (i = 0; i < 8; i++)
+ {
+ b[i] = i;
+ c[i] = i + 1;
+ }
+
+#pragma omp parallel sections lastprivate (vb, vc) num_threads (2)
+ {
+ #pragma omp section
+ vb = svld1_s32 (svptrue_b32 (), b);
+ #pragma omp section
+ vb = svld1_s32 (svptrue_b32 (), b);
+ vc = svld1_s32 (svptrue_b32 (), c);
+ }
+
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ svst1_s32 (svptrue_b32 (), a, va);
+
+ for (i = 0; i < 8; i++)
+ if (a[i] != b[i] + c[i])
+ __builtin_abort ();
+}
+
+void __attribute__ ((noipa))
+lastprivate_for ()
+{
+ int a[32], b[32], c[32];
+ int aa[8], bb[8], cc[8];
+ svint32_t va, vb, vc;
+ int i, tn;
+
+#pragma omp parallel for
+ for (i = 0; i < 32; i++)
+ {
+ b[i] = i;
+ c[i] = i + 1;
+ }
+
+#pragma omp parallel for lastprivate (va, vb, vc, tn)
+ for (i = 0; i < 4; i++)
+ {
+ vb = svld1_s32 (svptrue_b32 (), b + i * 8);
+ vc = svld1_s32 (svptrue_b32 (), c + i * 8);
+ tn = i;
+ va = foo (&vb, &vc, tn);
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ }
+
+ svst1_s32 (svptrue_b32 (), aa, va);
+ svst1_s32 (svptrue_b32 (), bb, vb);
+ svst1_s32 (svptrue_b32 (), cc, vc);
+
+ for (i = 0; i < 8; i++)
+ if (aa[i] != bb[i] + cc[i] + tn)
+ __builtin_abort ();
+
+ for (i = 0; i < 32; i++)
+ if (a[i] != b[i] + c[i] + i / 8)
+ __builtin_abort ();
+}
+
+void __attribute__ ((noipa))
+lastprivate_simd ()
+{
+
+ int a[64], b[64], c[64];
+ int aa[8], bb[8], cc[8];
+ svint32_t va, vb, vc;
+ int i;
+
+#pragma omp parallel for
+ for (i = 0; i < 64; i++)
+ {
+ b[i] = i;
+ c[i] = i + 1;
+ }
+
+#pragma omp simd lastprivate (va, vb, vc)
+ for (i = 0; i < 8; i++)
+ {
+ vb = svld1_s32 (svptrue_b32 (), b + i * 8);
+ vc = svld1_s32 (svptrue_b32 (), c + i * 8);
+ va = svadd_s32_z (svptrue_b32 (), vb, vc);
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ }
+
+ svst1_s32 (svptrue_b32 (), aa, va);
+ svst1_s32 (svptrue_b32 (), bb, vb);
+ svst1_s32 (svptrue_b32 (), cc, vc);
+
+ for (i = 0; i < 8; i++)
+ if (aa[i] != bb[i] + cc[i])
+ __builtin_abort ();
+
+ for (i = 0; i < 64; i++)
+ if (a[i] != b[i] + c[i])
+ __builtin_abort ();
+}
+
+void __attribute__ ((noipa))
+lastprivate_distribute ()
+{
+
+ int a[32], b[32], c[32];
+ int aa[8], bb[8], cc[8];
+ svint32_t va, vb, vc;
+ int i, tn;
+
+#pragma omp parallel for
+ for (i = 0; i < 32; i++)
+ {
+ b[i] = i;
+ c[i] = i + 1;
+ }
+
+#pragma omp teams
+#pragma omp distribute lastprivate (va, vb, vc, tn)
+ for (i = 0; i < 4; i++)
+ {
+ vb = svld1_s32 (svptrue_b32 (), b + i * 8);
+ vc = svld1_s32 (svptrue_b32 (), c + i * 8);
+ tn = i;
+ va = foo (&vb, &vc, tn);
+ svst1_s32 (svptrue_b32 (), a + i * 8, va);
+ }
+
+ svst1_s32 (svptrue_b32 (), aa, va);
+ svst1_s32 (svptrue_b32 (), bb, vb);
+ svst1_s32 (svptrue_b32 (), cc, vc);
+
+ for (i = 0; i < 8; i++)
+ if (aa[i] != bb[i] + cc[i] + tn)
+ __builtin_abort ();
+
+ for (i = 0; i < 32; i++)
+ if (a[i] != b[i] + c[i] + i / 8)
+ __builtin_abort ();
+}
+
+int
+main ()
+{
+ lastprivate_for ();
+ lastprivate_sections ();
+ lastprivate_simd ();
+ lastprivate_distribute ();
+}
diff --git a/libgomp/testsuite/libgomp.c-target/aarch64/private.c b/libgomp/testsuite/libgomp.c-target/aarch64/private.c
new file mode 100644
index 0000000..0ca74fe
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c-target/aarch64/private.c
@@ -0,0 +1,105 @@
+/* { dg-do run { target aarch64_sve256_hw } } */
+/* { dg-options "-msve-vector-bits=256 -fopenmp -O2" } */
+
+#include <arm_sve.h>
+#include <omp.h>
+
+static void __attribute__ ((noipa))
+compare_vec (svint32_t *x, svint32_t y)
+{
+ svbool_t p = svnot_b_z (svptrue_b32 (), svcmpeq_s32 (svptrue_b32 (), *x, y));
+
+ if (svptest_any (svptrue_b32 (), p))
+ __builtin_abort ();
+}
+
+void __attribute__ ((noipa))
+private ()
+{
+ svint32_t a;
+#pragma omp parallel private (a) num_threads (10)
+ {
+ a = svindex_s32 (omp_get_thread_num (), 0);
+
+#pragma omp barrier
+ compare_vec (&a, svindex_s32 (omp_get_thread_num (), 0));
+ }
+}
+
+void __attribute__ ((noipa))
+firstprivate ()
+{
+ svint32_t a = svindex_s32 (1,1);
+ svint32_t b;
+
+#pragma omp parallel private (b) firstprivate (a) num_threads (12)
+ {
+ compare_vec (&a, svindex_s32 (1, 1));
+ b = svindex_s32 (omp_get_thread_num (), 0);
+
+#pragma omp barrier
+ compare_vec (&a, svindex_s32 (1, 1));
+ compare_vec (&b, svindex_s32 (omp_get_thread_num (), 0));
+ if (omp_get_thread_num () == 5)
+ {
+ a = svindex_s32 (1, 2);
+ b = svindex_s32 (10, 0);
+ }
+
+#pragma omp barrier
+ if (omp_get_thread_num () == 5)
+ {
+ compare_vec (&a, svindex_s32 (1, 2));
+ compare_vec (&b, svindex_s32 (10, 0));
+ }
+ else
+ {
+ compare_vec (&a, svindex_s32 (1, 1));
+ compare_vec (&b, svindex_s32 (omp_get_thread_num (), 0));
+ }
+ }
+}
+
+void __attribute__ ((noipa))
+lastprivate ()
+{
+ svint32_t a = svindex_s32 (1,1);
+ svint32_t b;
+ int i;
+
+#pragma omp parallel for private (a) lastprivate (b)
+ for (i = 0; i < 16; i++)
+ {
+ b = svindex_s32 (i, 0);
+
+ compare_vec (&b, svindex_s32 (i, 0));
+ if (i == 5)
+ {
+ a = svindex_s32 (1, 2);
+ b = svindex_s32 (10, 0);
+ }
+ else
+ a = svindex_s32 (1, 1);
+
+ if (i == 5)
+ {
+ compare_vec (&a, svindex_s32 (1, 2));
+ compare_vec (&b, svindex_s32 (10, 0));
+ }
+ else
+ {
+ compare_vec (&a, svindex_s32 (1, 1));
+ compare_vec (&b, svindex_s32 (i, 0));
+ }
+ }
+
+ compare_vec (&b, svindex_s32 (15, 0));
+}
+
+int
+main ()
+{
+ private ();
+ firstprivate ();
+ lastprivate ();
+}
diff --git a/libgomp/testsuite/libgomp.c-target/aarch64/shared.c b/libgomp/testsuite/libgomp.c-target/aarch64/shared.c
new file mode 100644
index 0000000..dec41b8
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c-target/aarch64/shared.c
@@ -0,0 +1,264 @@
+/* { dg-do run { target aarch64_sve256_hw } } */
+/* { dg-options "-msve-vector-bits=256 -fopenmp -O2" } */
+
+#include <arm_sve.h>
+#include <stdlib.h>
+#include <omp.h>
+
+static void __attribute__ ((noipa))
+compare_vec (svint32_t x, svint32_t y)
+{
+ svbool_t p = svnot_b_z (svptrue_b32 (), svcmpeq_s32 (svptrue_b32 (), x, y));
+
+ if (svptest_any (svptrue_b32 (), p))
+ __builtin_abort ();
+}
+
+static void __attribute__ ((noipa))
+compare_vecb (svbool_t x, svbool_t y)
+{
+ svbool_t p = sveor_b_z (svptrue_b32 (), x, y);
+
+ if (svptest_any (svptrue_b32 (), p))
+ __builtin_abort ();
+}
+
+void __attribute__ ((noipa))
+implicit_shared_default (svint32_t a, svint32_t b, svbool_t p)
+{
+
+#pragma omp parallel default (shared) num_threads (10)
+ {
+ /* 'a', 'b' and 'p' are implicitly shared. */
+ compare_vec (a, svindex_s32 (0, 1));
+ compare_vec (b, svindex_s32 (8, 1));
+ compare_vecb (p, svptrue_b32 ());
+
+#pragma omp barrier
+ if (omp_get_thread_num () == 2)
+ a = svadd_s32_z (p, a, b);
+
+#pragma omp barrier
+ if (omp_get_thread_num () == 0)
+ {
+ compare_vec (a, svindex_s32 (8, 2));
+ compare_vec (b, svindex_s32 (8, 1));
+ compare_vecb (p, svptrue_b32 ());
+ b = svadd_s32_z (p, a, b);
+ }
+
+#pragma omp barrier
+ compare_vec (a, svindex_s32 (8, 2));
+ compare_vec (b, svadd_s32_z (p, svindex_s32 (8, 2), svindex_s32 (8, 1)));
+
+#pragma omp barrier
+ if (omp_get_thread_num () == 0 || omp_get_thread_num () == 2)
+ {
+ compare_vec (a, svindex_s32 (8, 2));
+ compare_vec (b, svadd_s32_z (p, svindex_s32 (8, 2), svindex_s32 (8, 1)));
+ }
+ }
+}
+
+void __attribute__ ((noipa))
+explicit_shared (svint32_t a, svint32_t b, svbool_t p)
+{
+
+#pragma omp parallel shared (a, b, p) num_threads (12)
+ {
+ /* 'a', 'b' and 'p' are explicitly shared. */
+ compare_vec (a, svindex_s32 (0, 1));
+ compare_vec (b, svindex_s32 (8, 1));
+ compare_vecb (p, svptrue_b32 ());
+
+#pragma omp barrier
+ if (omp_get_thread_num () == 2)
+ a = svadd_s32_z (p, a, b);
+
+#pragma omp barrier
+ if (omp_get_thread_num () == 0)
+ {
+ compare_vec (a, svindex_s32 (8, 2));
+ compare_vec (b, svindex_s32 (8, 1));
+ compare_vecb (p, svptrue_b32 ());
+ b = svadd_s32_z (p, a, b);
+ }
+
+#pragma omp barrier
+ compare_vec (a, svindex_s32 (8, 2));
+ compare_vec (b, svadd_s32_z (p, svindex_s32 (8, 2), svindex_s32 (8, 1)));
+
+#pragma omp barrier
+ if (omp_get_thread_num () == 0 || omp_get_thread_num () == 2)
+ {
+ compare_vec (a, svindex_s32 (8, 2));
+ compare_vec (b, svadd_s32_z (p, svindex_s32 (8, 2), svindex_s32 (8, 1)));
+ }
+ }
+}
+
+void __attribute__ ((noipa))
+implicit_shared_no_default (svint32_t a, svint32_t b, svbool_t p)
+{
+
+#pragma omp parallel num_threads (16)
+ {
+ /* 'a', 'b' and 'p' are implicitly shared without default clause. */
+ compare_vec (a, svindex_s32 (0, 1));
+ compare_vec (b, svindex_s32 (8, 1));
+ compare_vecb (p, svptrue_b32 ());
+
+#pragma omp barrier
+ if (omp_get_thread_num () == 12)
+ a = svadd_s32_z (p, a, b);
+
+#pragma omp barrier
+ if (omp_get_thread_num () == 15)
+ {
+ compare_vec (a, svindex_s32 (8, 2));
+ compare_vec (b, svindex_s32 (8, 1));
+ compare_vecb (p, svptrue_b32 ());
+ b = svadd_s32_z (p, a, b);
+ }
+
+#pragma omp barrier
+ compare_vec (a, svindex_s32 (8, 2));
+ compare_vec (b, svadd_s32_z (p, svindex_s32 (8, 2), svindex_s32 (8, 1)));
+
+#pragma omp barrier
+ if (omp_get_thread_num () == 12 || omp_get_thread_num () == 15)
+ {
+ compare_vec (a, svindex_s32 (8, 2));
+ compare_vec (b, svadd_s32_z (p, svindex_s32 (8, 2), svindex_s32 (8, 1)));
+ }
+ }
+
+}
+
+void __attribute__ ((noipa))
+mix_shared (svint32_t b, svbool_t p)
+{
+
+ svint32_t a = svindex_s32 (0, 0);
+ int *m = (int *) malloc (8 * sizeof (int));
+ int i;
+
+#pragma omp parallel for
+ for (i = 0; i < 8; i++)
+ m[i] = i;
+
+#pragma omp parallel num_threads (16)
+ {
+ compare_vec (a, svindex_s32 (0, 0));
+ compare_vec (b, svindex_s32 (8, 1));
+
+#pragma omp barrier
+ /* 'm' is predetermined shared here. 'a' is implicitly shared here. */
+ if (omp_get_thread_num () == 10)
+ a = svld1_s32 (svptrue_b32 (), m);
+
+#pragma omp barrier
+ /* 'a', 'b' and 'p' are implicitly shared without default clause. */
+ compare_vec (a, svindex_s32 (0, 1));
+ compare_vec (b, svindex_s32 (8, 1));
+ compare_vecb (p, svptrue_b32 ());
+
+#pragma omp barrier
+ if (omp_get_thread_num () == 12)
+ a = svadd_s32_z (p, a, b);
+
+#pragma omp barrier
+ if (omp_get_thread_num () == 15)
+ {
+ compare_vec (a, svindex_s32 (8, 2));
+ compare_vec (b, svindex_s32 (8, 1));
+ compare_vecb (p, svptrue_b32 ());
+ b = svadd_s32_z (p, a, b);
+ }
+
+#pragma omp barrier
+ if (omp_get_thread_num () == 12 || omp_get_thread_num () == 15)
+ {
+ compare_vec (a, svindex_s32 (8, 2));
+ compare_vec (b, svadd_s32_z (p, svindex_s32 (8, 2), svindex_s32 (8, 1)));
+ }
+
+#pragma omp barrier
+ compare_vec (a, svindex_s32 (8, 2));
+ compare_vec (b, svadd_s32_z (p, svindex_s32 (8, 2), svindex_s32 (8, 1)));
+ }
+}
+
+#define N __ARM_FEATURE_SVE_BITS
+#define FIXED_ATTR __attribute__((arm_sve_vector_bits (N)))
+
+typedef svint32_t v8si FIXED_ATTR;
+
+void __attribute__ ((noipa))
+predetermined_shared_static (int n)
+{
+
+ int *m = (int *) malloc (8 * sizeof (int));
+ int i;
+
+#pragma omp parallel for
+ /* 'm' is predetermined shared here. */
+ for (i = 0; i < 8; i++)
+ m[i] = i;
+
+ static v8si a = { 0, 1, 2, 3, 4, 5, 6, 7 };
+
+#pragma omp parallel num_threads (16)
+ {
+ /* 'a' is implicit shared here. */
+ if (n == 0)
+ compare_vec (a, svindex_s32 (0, 1));
+
+ if (n == 1)
+ compare_vec (a, svindex_s32 (1, 1));
+
+#pragma omp barrier
+ if (omp_get_thread_num () == 12)
+ {
+ if (n == 0)
+ compare_vec (a, svindex_s32 (0, 1));
+
+ if (n == 1)
+ compare_vec (a, svindex_s32 (1, 1));
+
+ a = svadd_s32_z (svptrue_b32 (), a, svindex_s32 (1, 0));
+ }
+
+#pragma omp barrier
+ if (n == 0)
+ compare_vec (a, svindex_s32 (1, 1));
+
+ if (n == 1)
+ compare_vec (a, svindex_s32 (2, 1));
+ }
+}
+
+
+int
+main ()
+{
+ svint32_t x = svindex_s32 (0, 1);
+ svint32_t y = svindex_s32 (8, 1);
+ svbool_t p = svptrue_b32 ();
+
+ /* Implicit shared. */
+ implicit_shared_default (x, y, p);
+
+ /* Explicit shared. */
+ explicit_shared (x, y, p);
+
+ /* Implicit shared with no default clause. */
+ implicit_shared_no_default (x, y, p);
+
+ /* Mix shared. */
+ mix_shared (y, p);
+
+ /* Predetermined and static shared. */
+ predetermined_shared_static (0);
+ predetermined_shared_static (1);
+}
diff --git a/libgomp/testsuite/libgomp.c-target/aarch64/simd-aligned.c b/libgomp/testsuite/libgomp.c-target/aarch64/simd-aligned.c
new file mode 100644
index 0000000..cc41139
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c-target/aarch64/simd-aligned.c
@@ -0,0 +1,49 @@
+/* { dg-do run { target aarch64_sve256_hw } } */
+/* { dg-options "-msve-vector-bits=256 -fopenmp -O2" } */
+
+#include <arm_sve.h>
+#include <stdint.h>
+
+#define N 256
+
+int a[N] __attribute__ ((aligned (64)));
+int b[N] __attribute__ ((aligned (64)));
+
+void __attribute__ ((noipa))
+foo (int *p, int *q, svint32_t *onesp)
+{
+ svint32_t va, vc;
+ int i;
+ uint64_t sz = svcntw ();
+
+#pragma omp simd aligned(p, q : 64) aligned (onesp : 128) \
+ private (va, vc) nontemporal (va, vc)
+ for (i = 0; i < N; i++)
+ {
+ if (i % sz == 0)
+ {
+ va = svld1_s32 (svptrue_b32 (), p);
+ vc = svadd_s32_z (svptrue_b32 (), va, *onesp);
+ svst1_s32 (svptrue_b32 (), q, vc);
+ q += sz;
+ }
+ }
+}
+
+int
+main ()
+{
+ svint32_t ones __attribute__ ((aligned(128))) = svindex_s32 (1, 0);
+
+ for (int i = 0; i < N; i++)
+ {
+ a[i] = 1;
+ b[i] = 0;
+ }
+
+ foo (a, b, &ones);
+
+ for (int i = 0; i < N; i++)
+ if (b[i] != 2)
+ __builtin_abort ();
+}
diff --git a/libgomp/testsuite/libgomp.c-target/aarch64/simd-nontemporal.c b/libgomp/testsuite/libgomp.c-target/aarch64/simd-nontemporal.c
new file mode 100644
index 0000000..3385427
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c-target/aarch64/simd-nontemporal.c
@@ -0,0 +1,49 @@
+/* { dg-do run { target aarch64_sve256_hw } } */
+/* { dg-options "-msve-vector-bits=256 -fopenmp -O2" } */
+
+#include <arm_sve.h>
+#include <stdint.h>
+
+#define N 256
+
+int a[N] __attribute__ ((aligned (64)));
+int b[N] __attribute__ ((aligned (64)));
+
+void __attribute__ ((noipa))
+foo (int *p, int *q)
+{
+ svint32_t va, vb, vc;
+ int i;
+ uint64_t sz = svcntw ();
+
+#pragma omp simd aligned(p, q : 64) private (va, vb, vc) \
+ nontemporal (va, vb, vc)
+ for (i = 0; i < N; i++)
+ {
+ if (i % sz == 0)
+ {
+ va = svld1_s32 (svptrue_b32 (), p);
+ vb = svindex_s32 (1, 0);
+ vc = svadd_s32_z (svptrue_b32 (), va, vb);
+ svst1_s32 (svptrue_b32 (), q, vc);
+ q += sz;
+ }
+ }
+}
+
+int
+main ()
+{
+
+ for (int i = 0; i < N; i++)
+ {
+ a[i] = 1;
+ b[i] = 0;
+ }
+
+ foo (a, b);
+
+ for (int i = 0; i < N; i++)
+ if (b[i] != 2)
+ __builtin_abort ();
+}
diff --git a/libgomp/testsuite/libgomp.c-target/aarch64/threadprivate.c b/libgomp/testsuite/libgomp.c-target/aarch64/threadprivate.c
new file mode 100644
index 0000000..4a39312
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c-target/aarch64/threadprivate.c
@@ -0,0 +1,45 @@
+/* { dg-do run { target aarch64_sve256_hw } } */
+/* { dg-options "-msve-vector-bits=256 -fopenmp -O2" } */
+
+#include <arm_sve.h>
+#include <stdint.h>
+
+typedef __SVInt32_t v8si __attribute__ ((arm_sve_vector_bits(256)));
+
+v8si vec1;
+#pragma omp threadprivate (vec1)
+
+void __attribute__ ((noipa))
+foo ()
+{
+ int64_t res = 0;
+
+ vec1 = svindex_s32 (1, 0);
+
+#pragma omp parallel copyin (vec1) firstprivate (res) num_threads(10)
+ {
+ res = svaddv_s32 (svptrue_b32 (), vec1);
+
+#pragma omp barrier
+ if (res != 8LL)
+ __builtin_abort ();
+ }
+}
+
+int
+main ()
+{
+ int64_t res = 0;
+
+#pragma omp parallel firstprivate (res) num_threads(10)
+ {
+ vec1 = svindex_s32 (1, 0);
+ res = svaddv_s32 (svptrue_b32 (), vec1);
+
+#pragma omp barrier
+ if (res != 8LL)
+ __builtin_abort ();
+ }
+
+ foo ();
+}
diff --git a/libgomp/testsuite/libgomp.c-target/aarch64/udr-sve.c b/libgomp/testsuite/libgomp.c-target/aarch64/udr-sve.c
new file mode 100644
index 0000000..c79f4a9
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c-target/aarch64/udr-sve.c
@@ -0,0 +1,98 @@
+/* { dg-do run { target aarch64_sve256_hw } } */
+/* { dg-options "-msve-vector-bits=256 -fopenmp -O2" } */
+
+#include <arm_sve.h>
+
+#pragma omp declare reduction (+:svint32_t: omp_out = svadd_s32_z (svptrue_b32(), omp_in, omp_out)) \
+ initializer (omp_priv = svindex_s32 (0, 0))
+
+void __attribute__ ((noipa))
+parallel_reduction ()
+{
+ int a[8] = {1 ,1, 1, 1, 1, 1, 1, 1};
+ int b[8] = {0 ,0, 0, 0, 0, 0, 0, 0};
+ svint32_t va = svld1_s32 (svptrue_b32 (), b);
+ int i = 0;
+ int64_t res;
+
+ #pragma omp parallel reduction (+:va, i)
+ {
+ va = svld1_s32 (svptrue_b32 (), a);
+ i++;
+ }
+
+ res = svaddv_s32 (svptrue_b32 (), va);
+
+ if (res != i * 8)
+ __builtin_abort ();
+}
+
+void __attribute__ ((noipa))
+for_reduction ()
+{
+ int a[8] = {1 ,1, 1, 1, 1, 1, 1, 1};
+ int b[8] = {0 ,0, 0, 0, 0, 0, 0, 0};
+ svint32_t va = svld1_s32 (svptrue_b32 (), b);
+ int j;
+ int64_t res;
+
+ #pragma omp parallel for reduction (+:va)
+ for (j = 0; j < 8; j++)
+ va = svld1_s32 (svptrue_b32 (), a);
+
+ res = svaddv_s32 (svptrue_b32 (), va);
+
+ if (res != 64)
+ __builtin_abort ();
+}
+
+void __attribute__ ((noipa))
+simd_reduction ()
+{
+ int a[8];
+ svint32_t va = svindex_s32 (0, 0);
+ int i = 0;
+ int j;
+ int64_t res = 0;
+
+ for (j = 0; j < 8; j++)
+ a[j] = 1;
+
+ #pragma omp simd reduction (+:va, i)
+ for (j = 0; j < 16; j++)
+ va = svld1_s32 (svptrue_b32 (), a);
+
+ res = svaddv_s32 (svptrue_b32 (), va);
+
+ if (res != 8)
+ __builtin_abort ();
+}
+
+void __attribute__ ((noipa))
+inscan_reduction_incl ()
+{
+ svint32_t va = svindex_s32 (0, 0);
+ int j;
+ int64_t res = 0;
+
+ #pragma omp parallel
+ #pragma omp for reduction (inscan,+:va) firstprivate (res) lastprivate (res)
+ for (j = 0; j < 8; j++)
+ {
+ va = svindex_s32 (1, 0);
+ #pragma omp scan inclusive (va)
+ res += svaddv_s32 (svptrue_b32 (), va);
+ }
+
+ if (res != 64)
+ __builtin_abort ();
+}
+
+int
+main ()
+{
+ parallel_reduction ();
+ for_reduction ();
+ simd_reduction ();
+ inscan_reduction_incl ();
+}
diff --git a/libgomp/testsuite/libgomp.c/append-args-fr-1.c b/libgomp/testsuite/libgomp.c/append-args-fr-1.c
new file mode 100644
index 0000000..2fd7eda
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c/append-args-fr-1.c
@@ -0,0 +1,232 @@
+/* { dg-do run } */
+
+#include "append-args-fr.h"
+
+enum { host_device, nvptx_device, gcn_device } used_device_type, used_device_type2;
+static int used_device_num, used_device_num2;
+static omp_interop_fr_t expected_fr, expected_fr2;
+static _Bool is_targetsync, is_targetsync2;
+
+void
+check_interop (omp_interop_t obj)
+{
+ if (used_device_type == host_device)
+ check_host (obj);
+ else if (used_device_type == nvptx_device)
+ check_nvptx (obj, used_device_num, expected_fr, is_targetsync);
+ else if (used_device_type == gcn_device)
+ check_gcn (obj, used_device_num, expected_fr, is_targetsync);
+ else
+ __builtin_unreachable ();
+
+ #pragma omp interop use(obj)
+}
+
+void
+check_interop2 (omp_interop_t obj, omp_interop_t obj2)
+{
+ check_interop (obj);
+
+ #pragma omp interop use(obj2)
+
+ if (used_device_type2 == host_device)
+ check_host (obj2);
+ else if (used_device_type2 == nvptx_device)
+ check_nvptx (obj2, used_device_num2, expected_fr2, is_targetsync2);
+ else if (used_device_type2 == gcn_device)
+ check_gcn (obj2, used_device_num2, expected_fr2, is_targetsync2);
+ else
+ __builtin_unreachable ();
+}
+
+
+/* Check no args + one interop arg - and no prefer_type. */
+
+int f0_1_tg_ (omp_interop_t obj) { check_interop (obj); return 4242; }
+#pragma omp declare variant(f0_1_tg_) match(construct={dispatch}) append_args(interop(target))
+int f0_1_tg () { assert (false); return 42; }
+
+void f0_1_tgsy_ (omp_interop_t obj) { check_interop (obj); }
+#pragma omp declare variant(f0_1_tgsy_) match(construct={dispatch}) append_args(interop(targetsync))
+void f0_1_tgsy () { assert (false); }
+
+int f0_1_tgtgsy_ (omp_interop_t obj) { check_interop (obj); return 3333; }
+#pragma omp declare variant(f0_1_tgtgsy_) match(construct={dispatch}) append_args(interop(targetsync,target))
+int f0_1_tgtgsy () { assert (false); return 33; }
+
+
+/* And with PREFER_TYPE. */
+
+// nv: cuda, gcn: -, -, hip
+void f0_1_tgsy_c_cd_hi_hs_ (omp_interop_t obj) { check_interop (obj); }
+#pragma omp declare variant(f0_1_tgsy_c_cd_hi_hs_) match(construct={dispatch}) \
+ append_args(interop(targetsync, prefer_type("cuda","cuda_driver", "hip", "hsa")))
+void f0_1_tgsy_c_cd_hi_hs () { assert (false); }
+
+// nv: -, cuda_driver, gcn: hsa
+void f0_1_tgsy_hs_cd_c_hi_ (omp_interop_t obj) { check_interop (obj); }
+#pragma omp declare variant(f0_1_tgsy_hs_cd_c_hi_) match(construct={dispatch}) \
+ append_args(interop(targetsync, prefer_type({attr("ompx_foo")}, {fr("hsa")}, {attr("ompx_bar"), fr("cuda_driver"), attr("ompx_foobar")},{fr("cuda")}, {fr("hip")})))
+void f0_1_tgsy_hs_cd_c_hi () { assert (false); }
+
+// nv: -, hip, gcn: hsa
+void f0_1_tgsy_hs_hi_cd_c_ (omp_interop_t obj) { check_interop (obj); }
+#pragma omp declare variant(f0_1_tgsy_hs_hi_cd_c_) match(construct={dispatch}) \
+ append_args(interop(targetsync, prefer_type("hsa", "hip", "cuda_driver", "cuda")))
+void f0_1_tgsy_hs_hi_cd_c () { assert (false); }
+
+
+void
+check_f0 ()
+{
+ if (used_device_type == nvptx_device)
+ expected_fr = omp_ifr_cuda;
+ else if (used_device_type == gcn_device)
+ expected_fr = omp_ifr_hip;
+ else /* host; variable shall not be accessed */
+ expected_fr = omp_ifr_level_zero;
+
+ int i;
+ if (used_device_num == DEFAULT_DEVICE)
+ {
+ is_targetsync = 0;
+ #pragma omp dispatch
+ i = f0_1_tg ();
+ assert (i == 4242);
+
+ is_targetsync = 1;
+ #pragma omp dispatch
+ f0_1_tgsy ();
+
+ #pragma omp dispatch
+ i = f0_1_tgtgsy ();
+ assert (i == 3333);
+
+
+ if (used_device_type == nvptx_device)
+ expected_fr = omp_ifr_cuda;
+ else if (used_device_type == gcn_device)
+ expected_fr = omp_ifr_hip;
+ #pragma omp dispatch
+ f0_1_tgsy_c_cd_hi_hs ();
+
+ if (used_device_type == nvptx_device)
+ expected_fr = omp_ifr_cuda_driver;
+ else if (used_device_type == gcn_device)
+ expected_fr = omp_ifr_hsa;
+ #pragma omp dispatch
+ f0_1_tgsy_hs_cd_c_hi ();
+
+ if (used_device_type == nvptx_device)
+ expected_fr = omp_ifr_hip;
+ else if (used_device_type == gcn_device)
+ expected_fr = omp_ifr_hsa;
+ #pragma omp dispatch
+ f0_1_tgsy_hs_hi_cd_c ();
+ }
+ else
+ {
+ is_targetsync = 0;
+ #pragma omp dispatch device(used_device_num)
+ i = f0_1_tg ();
+ assert (i == 4242);
+
+ is_targetsync = 1;
+ #pragma omp dispatch device(used_device_num)
+ f0_1_tgsy ();
+
+ #pragma omp dispatch device(used_device_num)
+ i = f0_1_tgtgsy ();
+ assert (i == 3333);
+
+
+ if (used_device_type == nvptx_device)
+ expected_fr = omp_ifr_cuda;
+ else if (used_device_type == gcn_device)
+ expected_fr = omp_ifr_hip;
+ #pragma omp dispatch device(used_device_num)
+ f0_1_tgsy_c_cd_hi_hs ();
+
+ if (used_device_type == nvptx_device)
+ expected_fr = omp_ifr_cuda_driver;
+ else if (used_device_type == gcn_device)
+ expected_fr = omp_ifr_hsa;
+ #pragma omp dispatch device(used_device_num)
+ f0_1_tgsy_hs_cd_c_hi ();
+
+ if (used_device_type == nvptx_device)
+ expected_fr = omp_ifr_hip;
+ else if (used_device_type == gcn_device)
+ expected_fr = omp_ifr_hsa;
+ #pragma omp dispatch device(used_device_num)
+ f0_1_tgsy_hs_hi_cd_c ();
+ }
+}
+
+
+
+void
+do_check (int dev)
+{
+ int num_dev = omp_get_num_devices ();
+ const char *dev_type;
+ if (dev != DEFAULT_DEVICE)
+ omp_set_default_device (dev);
+ int is_nvptx = on_device_arch_nvptx ();
+ int is_gcn = on_device_arch_gcn ();
+ int is_host;
+
+ if (dev != DEFAULT_DEVICE)
+ is_host = dev == -1 || dev == num_dev;
+ else
+ {
+ int def_dev = omp_get_default_device ();
+ is_host = def_dev == -1 || def_dev == num_dev;
+ }
+
+ assert (is_nvptx + is_gcn + is_host == 1);
+
+ if (num_dev > 0 && dev != DEFAULT_DEVICE)
+ {
+ if (is_host)
+ omp_set_default_device (0);
+ else
+ omp_set_default_device (-1);
+ }
+
+ used_device_num = dev;
+ if (is_host)
+ {
+ dev_type = "host";
+ used_device_type = host_device;
+ }
+ else if (is_nvptx)
+ {
+ dev_type = "nvptx";
+ used_device_type = nvptx_device;
+ }
+ else if (is_gcn)
+ {
+ dev_type = "gcn";
+ used_device_type = gcn_device;
+ }
+
+ printf ("Running on the %s device (%d)\n", dev_type, dev);
+ check_f0 ();
+}
+
+
+
+int
+main ()
+{
+ do_check (DEFAULT_DEVICE);
+ int ndev = omp_get_num_devices ();
+ for (int dev = -1; dev < ndev; dev++)
+ do_check (dev);
+ for (int dev = -1; dev < ndev; dev++)
+ {
+ omp_set_default_device (dev);
+ do_check (DEFAULT_DEVICE);
+ }
+}
diff --git a/libgomp/testsuite/libgomp.c/append-args-fr.h b/libgomp/testsuite/libgomp.c/append-args-fr.h
new file mode 100644
index 0000000..9f6ca04
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c/append-args-fr.h
@@ -0,0 +1,305 @@
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <omp.h>
+#include "../libgomp.c-c++-common/on_device_arch.h"
+
+/* Provides: */
+
+#define DEFAULT_DEVICE -99
+
+void check_host (omp_interop_t obj);
+void check_nvptx (omp_interop_t obj, int dev, omp_interop_fr_t expected_fr, _Bool is_targetsync);
+void check_gcn (omp_interop_t obj, int dev, omp_interop_fr_t expected_fr, _Bool is_targetsync);
+
+
+/* The following assumes that when a nvptx device is available,
+ cuda/cuda_driver/hip are supported.
+ And that likewise when a gcn device is available that the
+ plugin also can not only the HSA but also the HIP library
+ such that hsa/hip are supported.
+ For the host, omp_interop_none is expected.
+
+ Otherwise, it only does some basic tests without checking
+ that the returned result really makes sense. */
+
+void check_type (omp_interop_t obj)
+{
+ const char *type;
+
+ type = omp_get_interop_type_desc (obj, omp_ipr_fr_id);
+ if (obj != omp_interop_none)
+ assert (strcmp (type, "omp_interop_t") == 0);
+ else
+ assert (type == NULL);
+
+ type = omp_get_interop_type_desc (obj, omp_ipr_fr_name);
+ if (obj != omp_interop_none)
+ assert (strcmp (type, "const char *") == 0);
+ else
+ assert (type == NULL);
+
+ type = omp_get_interop_type_desc (obj, omp_ipr_vendor);
+ if (obj != omp_interop_none)
+ assert (strcmp (type, "int") == 0);
+ else
+ assert (type == NULL);
+
+ type = omp_get_interop_type_desc (obj, omp_ipr_vendor_name);
+ if (obj != omp_interop_none)
+ assert (strcmp (type, "const char *") == 0);
+ else
+ assert (type == NULL);
+
+ type = omp_get_interop_type_desc (obj, omp_ipr_device_num);
+ if (obj != omp_interop_none)
+ assert (strcmp (type, "int") == 0);
+ else
+ assert (type == NULL);
+
+ if (obj != omp_interop_none)
+ return;
+ assert (omp_get_interop_type_desc (obj, omp_ipr_platform) == NULL);
+ assert (omp_get_interop_type_desc (obj, omp_ipr_device) == NULL);
+ assert (omp_get_interop_type_desc (obj, omp_ipr_device_context) == NULL);
+ assert (omp_get_interop_type_desc (obj, omp_ipr_targetsync) == NULL);
+}
+
+
+void
+check_host (omp_interop_t obj)
+{
+ assert (obj == omp_interop_none);
+ check_type (obj);
+}
+
+
+void
+check_nvptx (omp_interop_t obj, int dev, omp_interop_fr_t expected_fr, _Bool is_targetsync)
+{
+ assert (obj != omp_interop_none && obj != (omp_interop_t) -1L);
+
+ omp_interop_rc_t ret_code = omp_irc_no_value;
+ omp_interop_fr_t fr = (omp_interop_fr_t) omp_get_interop_int (obj, omp_ipr_fr_id, &ret_code);
+
+ assert (ret_code == omp_irc_success);
+ assert (fr == expected_fr);
+
+ ret_code = omp_irc_no_value;
+ const char *fr_name = omp_get_interop_str (obj, omp_ipr_fr_name, &ret_code);
+
+ assert (ret_code == omp_irc_success);
+ if (fr == omp_ifr_cuda)
+ assert (strcmp (fr_name, "cuda") == 0);
+ else if (fr == omp_ifr_cuda_driver)
+ assert (strcmp (fr_name, "cuda_driver") == 0);
+ else if (fr == omp_ifr_hip)
+ assert (strcmp (fr_name, "hip") == 0);
+ else
+ assert (0);
+
+ ret_code = omp_irc_no_value;
+ int vendor = (int) omp_get_interop_int (obj, omp_ipr_vendor, &ret_code);
+ assert (ret_code == omp_irc_success);
+ assert (vendor == 11); /* Nvidia */
+
+ ret_code = omp_irc_no_value;
+ const char *vendor_name = omp_get_interop_str (obj, omp_ipr_vendor_name, &ret_code);
+ assert (ret_code == omp_irc_success);
+ assert (strcmp (vendor_name, "nvidia") == 0);
+
+ ret_code = omp_irc_no_value;
+ int dev_num = (int) omp_get_interop_int (obj, omp_ipr_device_num, &ret_code);
+ assert (ret_code == omp_irc_success);
+ if (dev == DEFAULT_DEVICE)
+ assert (dev_num == omp_get_default_device ());
+ else
+ assert (dev_num == dev);
+
+ /* Platform: N/A. */
+ ret_code = omp_irc_success;
+ (void) omp_get_interop_int (obj, omp_ipr_platform, &ret_code);
+ assert (ret_code == omp_irc_no_value);
+ ret_code = omp_irc_success;
+ (void) omp_get_interop_ptr (obj, omp_ipr_platform, &ret_code);
+ assert (ret_code == omp_irc_no_value);
+ ret_code = omp_irc_success;
+ (void) omp_get_interop_str (obj, omp_ipr_platform, &ret_code);
+ assert (ret_code == omp_irc_no_value);
+
+ /* Device: int / CUdevice / hipDevice_t -- all internally an 'int'. */
+ ret_code = omp_irc_no_value;
+ int fr_device = (int) omp_get_interop_int (obj, omp_ipr_device, &ret_code);
+
+ /* CUDA also starts from 0 and goes to < n with cudaGetDeviceCount(&cn). */
+ assert (ret_code == omp_irc_success);
+ assert (fr_device >= 0 && fr_device < omp_get_num_devices ());
+
+ /* Device context: N/A / CUcontext / hipCtx_t -- a pointer. */
+ ret_code = omp_irc_out_of_range;
+ void *ctx = omp_get_interop_ptr (obj, omp_ipr_device_context, &ret_code);
+
+ if (fr == omp_ifr_cuda)
+ {
+ assert (ret_code == omp_irc_no_value);
+ assert (ctx == NULL);
+ }
+ else
+ {
+ assert (ret_code == omp_irc_success);
+ assert (ctx != NULL);
+ }
+
+ /* Stream/targetsync: cudaStream_t / CUstream / hipStream_t -- a pointer. */
+ ret_code = omp_irc_out_of_range;
+ void *stream = omp_get_interop_ptr (obj, omp_ipr_targetsync, &ret_code);
+
+ if (is_targetsync) /* no targetsync */
+ {
+ assert (ret_code == omp_irc_success);
+ assert (stream != NULL);
+ }
+ else
+ {
+ assert (ret_code == omp_irc_no_value);
+ assert (stream == NULL);
+ }
+
+ check_type (obj);
+ if (fr == omp_ifr_cuda)
+ {
+ assert (strcmp (omp_get_interop_type_desc (obj, omp_ipr_platform), "N/A") == 0);
+ assert (strcmp (omp_get_interop_type_desc (obj, omp_ipr_device), "int") == 0);
+ assert (strcmp (omp_get_interop_type_desc (obj, omp_ipr_device_context), "N/A") == 0);
+ assert (strcmp (omp_get_interop_type_desc (obj, omp_ipr_targetsync), "cudaStream_t") == 0);
+ }
+ else if (fr == omp_ifr_cuda_driver)
+ {
+ assert (strcmp (omp_get_interop_type_desc (obj, omp_ipr_platform), "N/A") == 0);
+ assert (strcmp (omp_get_interop_type_desc (obj, omp_ipr_device), "CUdevice") == 0);
+ assert (strcmp (omp_get_interop_type_desc (obj, omp_ipr_device_context), "CUcontext") == 0);
+ assert (strcmp (omp_get_interop_type_desc (obj, omp_ipr_targetsync), "CUstream") == 0);
+ }
+ else
+ {
+ assert (strcmp (omp_get_interop_type_desc (obj, omp_ipr_platform), "N/A") == 0);
+ assert (strcmp (omp_get_interop_type_desc (obj, omp_ipr_device), "hipDevice_t") == 0);
+ assert (strcmp (omp_get_interop_type_desc (obj, omp_ipr_device_context), "hipCtx_t") == 0);
+ assert (strcmp (omp_get_interop_type_desc (obj, omp_ipr_targetsync), "hipStream_t") == 0);
+ }
+}
+
+
+void
+check_gcn (omp_interop_t obj, int dev, omp_interop_fr_t expected_fr, _Bool is_targetsync)
+{
+ assert (obj != omp_interop_none && obj != (omp_interop_t) -1L);
+
+ omp_interop_rc_t ret_code = omp_irc_no_value;
+ omp_interop_fr_t fr = (omp_interop_fr_t) omp_get_interop_int (obj, omp_ipr_fr_id, &ret_code);
+
+ assert (ret_code == omp_irc_success);
+ assert (fr == expected_fr);
+
+ ret_code = omp_irc_no_value;
+ const char *fr_name = omp_get_interop_str (obj, omp_ipr_fr_name, &ret_code);
+
+ assert (ret_code == omp_irc_success);
+ if (fr == omp_ifr_hip)
+ assert (strcmp (fr_name, "hip") == 0);
+ else if (fr == omp_ifr_hsa)
+ assert (strcmp (fr_name, "hsa") == 0);
+ else
+ assert (0);
+
+ ret_code = omp_irc_no_value;
+ int vendor = (int) omp_get_interop_int (obj, omp_ipr_vendor, &ret_code);
+ assert (ret_code == omp_irc_success);
+ assert (vendor == 1); /* Amd */
+
+ ret_code = omp_irc_no_value;
+ const char *vendor_name = omp_get_interop_str (obj, omp_ipr_vendor_name, &ret_code);
+ assert (ret_code == omp_irc_success);
+ assert (strcmp (vendor_name, "amd") == 0);
+
+ ret_code = omp_irc_no_value;
+ int dev_num = (int) omp_get_interop_int (obj, omp_ipr_device_num, &ret_code);
+ assert (ret_code == omp_irc_success);
+ if (dev == DEFAULT_DEVICE)
+ assert (dev_num == omp_get_default_device ());
+ else
+ assert (dev_num == dev);
+
+ /* Platform: N/A. */
+ ret_code = omp_irc_success;
+ (void) omp_get_interop_int (obj, omp_ipr_platform, &ret_code);
+ assert (ret_code == omp_irc_no_value);
+ ret_code = omp_irc_success;
+ (void) omp_get_interop_ptr (obj, omp_ipr_platform, &ret_code);
+ assert (ret_code == omp_irc_no_value);
+ ret_code = omp_irc_success;
+ (void) omp_get_interop_str (obj, omp_ipr_platform, &ret_code);
+ assert (ret_code == omp_irc_no_value);
+
+ /* Device: hipDevice_t / hsa_agent_t* -- hip is internally an 'int'. */
+ ret_code = omp_irc_no_value;
+ if (fr == omp_ifr_hip)
+ {
+ /* HIP also starts from 0 and goes to < n as with cudaGetDeviceCount(&cn). */
+ int fr_device = (int) omp_get_interop_int (obj, omp_ipr_device, &ret_code);
+ assert (ret_code == omp_irc_success);
+ assert (fr_device >= 0 && fr_device < omp_get_num_devices ());
+ }
+ else
+ {
+ void *agent = omp_get_interop_ptr (obj, omp_ipr_device, &ret_code);
+ assert (ret_code == omp_irc_success);
+ assert (agent != NULL);
+ }
+
+ /* Device context: hipCtx_t / N/A -- a pointer. */
+ ret_code = omp_irc_out_of_range;
+ void *ctx = omp_get_interop_ptr (obj, omp_ipr_device_context, &ret_code);
+ if (fr == omp_ifr_hip)
+ {
+ assert (ret_code == omp_irc_success);
+ assert (ctx != NULL);
+ }
+ else
+ {
+ assert (ret_code == omp_irc_no_value);
+ assert (ctx == NULL);
+ }
+
+ /* Stream/targetsync: cudaStream_t / CUstream / hipStream_t -- a pointer. */
+ ret_code = omp_irc_out_of_range;
+ void *stream = omp_get_interop_ptr (obj, omp_ipr_targetsync, &ret_code);
+
+ if (is_targetsync)
+ {
+ assert (ret_code == omp_irc_success);
+ assert (stream != NULL);
+ }
+ else
+ {
+ assert (ret_code == omp_irc_no_value);
+ assert (stream == NULL);
+ }
+
+ check_type (obj);
+ if (fr == omp_ifr_hip)
+ {
+ assert (strcmp (omp_get_interop_type_desc (obj, omp_ipr_platform), "N/A") == 0);
+ assert (strcmp (omp_get_interop_type_desc (obj, omp_ipr_device), "hipDevice_t") == 0);
+ assert (strcmp (omp_get_interop_type_desc (obj, omp_ipr_device_context), "hipCtx_t") == 0);
+ assert (strcmp (omp_get_interop_type_desc (obj, omp_ipr_targetsync), "hipStream_t") == 0);
+ }
+ else
+ {
+ assert (strcmp (omp_get_interop_type_desc (obj, omp_ipr_platform), "N/A") == 0);
+ assert (strcmp (omp_get_interop_type_desc (obj, omp_ipr_device), "hsa_agent_t *") == 0);
+ assert (strcmp (omp_get_interop_type_desc (obj, omp_ipr_device_context), "N/A") == 0);
+ assert (strcmp (omp_get_interop_type_desc (obj, omp_ipr_targetsync), "hsa_queue_t *") == 0);
+ }
+}
diff --git a/libphobos/ChangeLog b/libphobos/ChangeLog
index e04bedd..6022d65 100644
--- a/libphobos/ChangeLog
+++ b/libphobos/ChangeLog
@@ -1,3 +1,10 @@
+2025-04-08 Iain Buclaw <ibuclaw@gdcproject.org>
+
+ * src/MERGE: Merge upstream phobos 35977c802.
+ * src/Makefile.am (PHOBOS_DSOURCES): Add
+ std/internal/windows/bcrypt.d.
+ * src/Makefile.in: Regenerate.
+
2025-03-31 Iain Buclaw <ibuclaw@gdcproject.org>
* libdruntime/MERGE: Merge upstream druntime c6863be720.
diff --git a/libphobos/src/MERGE b/libphobos/src/MERGE
index 3dfe008..d870a91 100644
--- a/libphobos/src/MERGE
+++ b/libphobos/src/MERGE
@@ -1,4 +1,4 @@
-60034b56e2a036a66fa78cbc0ec0290956423684
+35977c8029e7bb4dbe1b887688dabebe04ebea02
The first line of this file holds the git revision number of the last
merge done from the dlang/phobos repository.
diff --git a/libphobos/src/Makefile.am b/libphobos/src/Makefile.am
index 94e28f3..5d690dd 100644
--- a/libphobos/src/Makefile.am
+++ b/libphobos/src/Makefile.am
@@ -144,14 +144,15 @@ PHOBOS_DSOURCES = etc/c/curl.d etc/c/odbc/odbc32.d etc/c/odbc/odbc64.d \
std/internal/unicode_comp.d std/internal/unicode_decomp.d \
std/internal/unicode_grapheme.d std/internal/unicode_norm.d \
std/internal/unicode_tables.d std/internal/windows/advapi32.d \
- std/json.d std/logger/core.d std/logger/filelogger.d \
- std/logger/multilogger.d std/logger/nulllogger.d std/logger/package.d \
- std/math/algebraic.d std/math/constants.d std/math/exponential.d \
- std/math/hardware.d std/math/operations.d std/math/package.d \
- std/math/remainder.d std/math/rounding.d std/math/traits.d \
- std/math/trigonometry.d std/mathspecial.d std/meta.d std/mmfile.d \
- std/net/curl.d std/net/isemail.d std/numeric.d std/outbuffer.d \
- std/package.d std/parallelism.d std/path.d std/process.d std/random.d \
+ std/internal/windows/bcrypt.d std/json.d std/logger/core.d \
+ std/logger/filelogger.d std/logger/multilogger.d \
+ std/logger/nulllogger.d std/logger/package.d std/math/algebraic.d \
+ std/math/constants.d std/math/exponential.d std/math/hardware.d \
+ std/math/operations.d std/math/package.d std/math/remainder.d \
+ std/math/rounding.d std/math/traits.d std/math/trigonometry.d \
+ std/mathspecial.d std/meta.d std/mmfile.d std/net/curl.d \
+ std/net/isemail.d std/numeric.d std/outbuffer.d std/package.d \
+ std/parallelism.d std/path.d std/process.d std/random.d \
std/range/interfaces.d std/range/package.d std/range/primitives.d \
std/regex/internal/backtracking.d std/regex/internal/generator.d \
std/regex/internal/ir.d std/regex/internal/kickstart.d \
diff --git a/libphobos/src/Makefile.in b/libphobos/src/Makefile.in
index d052aa8..2bf7e3f 100644
--- a/libphobos/src/Makefile.in
+++ b/libphobos/src/Makefile.in
@@ -252,6 +252,7 @@ am__dirstamp = $(am__leading_dot)dirstamp
@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/internal/unicode_norm.lo \
@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/internal/unicode_tables.lo \
@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/internal/windows/advapi32.lo \
+@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/internal/windows/bcrypt.lo \
@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/json.lo std/logger/core.lo \
@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/logger/filelogger.lo \
@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/logger/multilogger.lo \
@@ -612,14 +613,15 @@ libgphobos_la_LINK = $(LIBTOOL) --tag=D $(libgphobos_la_LIBTOOLFLAGS) \
@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/internal/unicode_comp.d std/internal/unicode_decomp.d \
@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/internal/unicode_grapheme.d std/internal/unicode_norm.d \
@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/internal/unicode_tables.d std/internal/windows/advapi32.d \
-@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/json.d std/logger/core.d std/logger/filelogger.d \
-@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/logger/multilogger.d std/logger/nulllogger.d std/logger/package.d \
-@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/math/algebraic.d std/math/constants.d std/math/exponential.d \
-@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/math/hardware.d std/math/operations.d std/math/package.d \
-@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/math/remainder.d std/math/rounding.d std/math/traits.d \
-@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/math/trigonometry.d std/mathspecial.d std/meta.d std/mmfile.d \
-@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/net/curl.d std/net/isemail.d std/numeric.d std/outbuffer.d \
-@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/package.d std/parallelism.d std/path.d std/process.d std/random.d \
+@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/internal/windows/bcrypt.d std/json.d std/logger/core.d \
+@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/logger/filelogger.d std/logger/multilogger.d \
+@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/logger/nulllogger.d std/logger/package.d std/math/algebraic.d \
+@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/math/constants.d std/math/exponential.d std/math/hardware.d \
+@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/math/operations.d std/math/package.d std/math/remainder.d \
+@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/math/rounding.d std/math/traits.d std/math/trigonometry.d \
+@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/mathspecial.d std/meta.d std/mmfile.d std/net/curl.d \
+@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/net/isemail.d std/numeric.d std/outbuffer.d std/package.d \
+@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/parallelism.d std/path.d std/process.d std/random.d \
@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/range/interfaces.d std/range/package.d std/range/primitives.d \
@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/regex/internal/backtracking.d std/regex/internal/generator.d \
@ENABLE_LIBDRUNTIME_ONLY_FALSE@ std/regex/internal/ir.d std/regex/internal/kickstart.d \
@@ -901,6 +903,7 @@ std/internal/windows/$(am__dirstamp):
@: > std/internal/windows/$(am__dirstamp)
std/internal/windows/advapi32.lo: \
std/internal/windows/$(am__dirstamp)
+std/internal/windows/bcrypt.lo: std/internal/windows/$(am__dirstamp)
std/json.lo: std/$(am__dirstamp)
std/logger/$(am__dirstamp):
@$(MKDIR_P) std/logger
diff --git a/libphobos/src/std/file.d b/libphobos/src/std/file.d
index c3466ac..0b8da50 100644
--- a/libphobos/src/std/file.d
+++ b/libphobos/src/std/file.d
@@ -983,10 +983,10 @@ private void renameImpl(scope const(char)[] f, scope const(char)[] t,
import std.conv : to, text;
if (!f)
- f = to!(typeof(f))(fromz[0 .. wcslen(fromz)]);
+ f = fromz ? to!(typeof(f))(fromz[0 .. wcslen(fromz)]) : "(null)";
if (!t)
- t = to!(typeof(t))(toz[0 .. wcslen(toz)]);
+ t = toz ? to!(typeof(t))(toz[0 .. wcslen(toz)]) : "(null)";
enforce(false,
new FileException(
diff --git a/libphobos/src/std/internal/windows/bcrypt.d b/libphobos/src/std/internal/windows/bcrypt.d
new file mode 100644
index 0000000..239dcd5
--- /dev/null
+++ b/libphobos/src/std/internal/windows/bcrypt.d
@@ -0,0 +1,65 @@
+module std.internal.windows.bcrypt;
+
+version (Windows):
+
+import core.sys.windows.bcrypt : BCryptGenRandom, BCRYPT_USE_SYSTEM_PREFERRED_RNG;
+import core.sys.windows.windef : HMODULE, PUCHAR, ULONG;
+import core.sys.windows.ntdef : NT_SUCCESS;
+
+pragma(lib, "Bcrypt.lib");
+
+package(std) bool bcryptGenRandom(T)(out T result) @trusted
+{
+ loadBcrypt();
+
+ const gotRandom = ptrBCryptGenRandom(
+ null,
+ cast(PUCHAR) &result,
+ ULONG(T.sizeof),
+ BCRYPT_USE_SYSTEM_PREFERRED_RNG,
+ );
+
+ return NT_SUCCESS(gotRandom);
+}
+
+private
+{
+ HMODULE hBcrypt = null;
+ typeof(BCryptGenRandom)* ptrBCryptGenRandom;
+}
+
+private void loadBcrypt() @nogc nothrow
+{
+ import core.sys.windows.winbase : GetProcAddress, LoadLibraryA;
+
+ if (!hBcrypt)
+ {
+ hBcrypt = LoadLibraryA("Bcrypt.dll");
+ if (!hBcrypt)
+ assert(false, `LoadLibraryA("Bcrypt.dll") failed.`); // `@nogc`
+
+ ptrBCryptGenRandom = cast(typeof(ptrBCryptGenRandom)) GetProcAddress(hBcrypt , "BCryptGenRandom");
+ if (!ptrBCryptGenRandom)
+ assert(false, `GetProcAddress(hBcrypt , "BCryptGenRandom") failed.`); // `@nogc`
+ }
+}
+
+// Will free `Bcrypt.dll`.
+private void freeBcrypt() @nogc nothrow
+{
+ import core.sys.windows.winbase : FreeLibrary;
+
+ if (hBcrypt)
+ {
+ if (!FreeLibrary(hBcrypt))
+ assert(false, `FreeLibrary("Bcrypt.dll") failed.`); // `@nogc`
+
+ hBcrypt = null;
+ ptrBCryptGenRandom = null;
+ }
+}
+
+static ~this()
+{
+ freeBcrypt();
+}
diff --git a/libphobos/src/std/random.d b/libphobos/src/std/random.d
index fb4e546..dc1763c 100644
--- a/libphobos/src/std/random.d
+++ b/libphobos/src/std/random.d
@@ -1792,23 +1792,7 @@ version (linux)
version (Windows)
{
- pragma(lib, "Bcrypt.lib");
-
- private bool bcryptGenRandom(T)(out T result) @trusted
- {
- import core.sys.windows.windef : PUCHAR, ULONG;
- import core.sys.windows.ntdef : NT_SUCCESS;
- import core.sys.windows.bcrypt : BCryptGenRandom, BCRYPT_USE_SYSTEM_PREFERRED_RNG;
-
- const gotRandom = BCryptGenRandom(
- null,
- cast(PUCHAR) &result,
- ULONG(T.sizeof),
- BCRYPT_USE_SYSTEM_PREFERRED_RNG,
- );
-
- return NT_SUCCESS(gotRandom);
- }
+ import std.internal.windows.bcrypt : bcryptGenRandom;
}
/**
diff --git a/libquadmath/ChangeLog b/libquadmath/ChangeLog
index 5a6429b..5052fdc 100644
--- a/libquadmath/ChangeLog
+++ b/libquadmath/ChangeLog
@@ -1,3 +1,12 @@
+2025-04-07 Lulu Cheng <chenglulu@loongson.cn>
+
+ PR target/119408
+ * configure.ac: When checking for __float128 support, determine
+ whether the current architecture is LoongArch. If so, return false.
+ * configure: Regenerate.
+ Sigend-off-by: Xi Ruoyao <xry111@xry111.site>
+ Sigend-off-by: Jakub Jelinek <jakub@redhat.com>
+
2025-04-01 Jakub Jelinek <jakub@redhat.com>
* strtod/strtod_l.c (____STRTOF_INTERNAL): Avoid old-style function
diff --git a/libquadmath/configure b/libquadmath/configure
index 49d7080..f82dd3d 100755
--- a/libquadmath/configure
+++ b/libquadmath/configure
@@ -12843,6 +12843,10 @@ else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
+ #ifdef __loongarch__
+ #error On LoongArch we should use long double instead; __float128 is only for porting existing code easier.
+ #endif
+
#if (!defined(_ARCH_PPC)) || defined(__LONG_DOUBLE_IEEE128__)
typedef _Complex float __attribute__((mode(TC))) __complex128;
#else
@@ -12894,6 +12898,10 @@ fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
+ #ifdef __loongarch__
+ #error On LoongArch we should use long double instead; __float128 is only for porting existing code easier.
+ #endif
+
#if (!defined(_ARCH_PPC)) || defined(__LONG_DOUBLE_IEEE128__)
typedef _Complex float __attribute__((mode(TC))) __complex128;
#else
diff --git a/libquadmath/configure.ac b/libquadmath/configure.ac
index 349be26..c64a848 100644
--- a/libquadmath/configure.ac
+++ b/libquadmath/configure.ac
@@ -233,6 +233,10 @@ AM_CONDITIONAL(LIBQUAD_USE_SYMVER_SUN, [test "x$quadmath_use_symver" = xsun])
AC_CACHE_CHECK([whether __float128 is supported], [libquad_cv_have_float128],
[GCC_TRY_COMPILE_OR_LINK([
+ #ifdef __loongarch__
+ #error On LoongArch we should use long double instead; __float128 is only for porting existing code easier.
+ #endif
+
#if (!defined(_ARCH_PPC)) || defined(__LONG_DOUBLE_IEEE128__)
typedef _Complex float __attribute__((mode(TC))) __complex128;
#else
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 2b25237..c26a5b9 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,35 @@
+2025-04-08 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/119671
+ * include/std/format (__formatter_fp::format): Do not invalidate
+ __wstr unless _M_localized returns a valid string.
+ * testsuite/std/format/functions/format.cc: Check wide string
+ formatting of floating-point types with classic locale.
+
+2025-04-07 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/119642
+ * include/bits/formatfwd.h: Remove stray pragma.
+
+2025-04-07 Jonathan Wakely <jwakely@redhat.com>
+
+ * include/precompiled/stdc++.h: Include <stdbit.h> and
+ <stdckdint.h>. Include <stacktrace> unconditionally.
+
+2025-04-07 Jonathan Wakely <jwakely@redhat.com>
+
+ * doc/doxygen/user.cfg.in (INPUT): Add flat_map, flat_set,
+ text_encoding, stdbit.h and stdckdint.h.
+
+2025-04-07 Thomas Schwinge <tschwinge@baylibre.com>
+
+ PR target/119645
+ * acinclude.m4 (GLIBCXX_ENABLE_LOCK_POLICY) [GCN, nvptx]:
+ Hard-code results.
+ * configure: Regenerate.
+ * configure.host [GCN, nvptx] (atomicity_dir): Set to
+ 'cpu/generic/atomicity_builtins'.
+
2025-04-04 Patrick Palka <ppalka@redhat.com>
PR libstdc++/119620
diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
index 02fd349e..a0094c2 100644
--- a/libstdc++-v3/acinclude.m4
+++ b/libstdc++-v3/acinclude.m4
@@ -4023,10 +4023,11 @@ AC_DEFUN([GLIBCXX_ENABLE_LOCK_POLICY], [
dnl Why don't we check 8-byte CAS for sparc64, where _Atomic_word is long?!
dnl New targets should only check for CAS for the _Atomic_word type.
AC_TRY_COMPILE([
- #if defined __riscv
+ #if defined __AMDGCN__ || defined __nvptx__
+ /* Yes, please. */
+ #elif defined __riscv
# error "Defaulting to mutex-based locks for ABI compatibility"
- #endif
- #if ! defined __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2
+ #elif ! defined __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2
# error "No 2-byte compare-and-swap"
#elif ! defined __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
# error "No 4-byte compare-and-swap"
diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
index 56d0bcb..819a1d82 100755
--- a/libstdc++-v3/configure
+++ b/libstdc++-v3/configure
@@ -16394,10 +16394,11 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
- #if defined __riscv
+ #if defined __AMDGCN__ || defined __nvptx__
+ /* Yes, please. */
+ #elif defined __riscv
# error "Defaulting to mutex-based locks for ABI compatibility"
- #endif
- #if ! defined __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2
+ #elif ! defined __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2
# error "No 2-byte compare-and-swap"
#elif ! defined __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
# error "No 4-byte compare-and-swap"
@@ -16444,7 +16445,7 @@ $as_echo "mutex" >&6; }
# unnecessary for this test.
cat > conftest.$ac_ext << EOF
-#line 16447 "configure"
+#line 16448 "configure"
int main()
{
_Decimal32 d1;
@@ -16486,7 +16487,7 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
# unnecessary for this test.
cat > conftest.$ac_ext << EOF
-#line 16489 "configure"
+#line 16490 "configure"
template<typename T1, typename T2>
struct same
{ typedef T2 type; };
diff --git a/libstdc++-v3/configure.host b/libstdc++-v3/configure.host
index 8375764..253e5a9 100644
--- a/libstdc++-v3/configure.host
+++ b/libstdc++-v3/configure.host
@@ -370,10 +370,21 @@ case "${host}" in
;;
esac
;;
+ amdgcn-*-amdhsa)
+ # To avoid greater pain elsewhere, force use of '__atomic' builtins,
+ # regardless of the outcome of 'configure' checks; see PR119645
+ # "GCN, nvptx: libstdc++ 'checking for atomic builtins [...]... no'".
+ atomicity_dir=cpu/generic/atomicity_builtins
+ ;;
arm*-*-freebsd*)
port_specific_symbol_files="\$(srcdir)/../config/os/gnu-linux/arm-eabi-extra.ver"
;;
nvptx-*-none)
+ # To avoid greater pain elsewhere, force use of '__atomic' builtins,
+ # regardless of the outcome of 'configure' checks; see PR119645
+ # "GCN, nvptx: libstdc++ 'checking for atomic builtins [...]... no'".
+ atomicity_dir=cpu/generic/atomicity_builtins
+
# For 'make all-target-libstdc++-v3', re 'alloca'/VLA usage:
EXTRA_CFLAGS="${EXTRA_CFLAGS} -mfake-ptx-alloca"
OPTIMIZE_CXXFLAGS="${OPTIMIZE_CXXFLAGS} -mfake-ptx-alloca"
diff --git a/libstdc++-v3/doc/doxygen/user.cfg.in b/libstdc++-v3/doc/doxygen/user.cfg.in
index ae50f6d..19ae67a 100644
--- a/libstdc++-v3/doc/doxygen/user.cfg.in
+++ b/libstdc++-v3/doc/doxygen/user.cfg.in
@@ -861,6 +861,8 @@ INPUT = @srcdir@/doc/doxygen/doxygroups.cc \
include/deque \
include/expected \
include/filesystem \
+ include/flat_map \
+ include/flat_set \
include/forward_list \
include/format \
include/fstream \
@@ -906,6 +908,7 @@ INPUT = @srcdir@/doc/doxygen/doxygroups.cc \
include/string_view \
include/syncstream \
include/system_error \
+ include/text_encoding \
include/thread \
include/tuple \
include/typeindex \
@@ -942,6 +945,8 @@ INPUT = @srcdir@/doc/doxygen/doxygroups.cc \
include/cwchar \
include/cuchar \
include/cwctype \
+ include/stdbit.h \
+ include/stdckdint.h \
include/ \
include/bits \
include/@host_alias@/bits \
diff --git a/libstdc++-v3/include/bits/formatfwd.h b/libstdc++-v3/include/bits/formatfwd.h
index 44922cb..a6b5ac8 100644
--- a/libstdc++-v3/include/bits/formatfwd.h
+++ b/libstdc++-v3/include/bits/formatfwd.h
@@ -67,5 +67,4 @@ namespace __format
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace std
#endif // __glibcxx_format
-#pragma GCC diagnostic pop
#endif // _GLIBCXX_FORMAT_FWD_H
diff --git a/libstdc++-v3/include/precompiled/stdc++.h b/libstdc++-v3/include/precompiled/stdc++.h
index 1ffde3e..f4b312d 100644
--- a/libstdc++-v3/include/precompiled/stdc++.h
+++ b/libstdc++-v3/include/precompiled/stdc++.h
@@ -230,15 +230,15 @@
#include <generator>
#include <print>
#include <spanstream>
-#if __has_include(<stacktrace>)
-# include <stacktrace>
-#endif
+#include <stacktrace>
#include <stdatomic.h>
#include <stdfloat>
#endif
#if __cplusplus > 202302L
#include <text_encoding>
+#include <stdbit.h>
+#include <stdckdint.h>
#endif
#endif // HOSTED
diff --git a/libstdc++-v3/include/std/format b/libstdc++-v3/include/std/format
index 01a5314..2e9319c 100644
--- a/libstdc++-v3/include/std/format
+++ b/libstdc++-v3/include/std/format
@@ -1838,9 +1838,9 @@ namespace __format
if (_M_spec._M_localized && __builtin_isfinite(__v))
{
- __wstr = _M_localize(__str, __expc, __fc.locale());
- if (!__wstr.empty())
- __str = __wstr;
+ auto __s = _M_localize(__str, __expc, __fc.locale());
+ if (!__s.empty())
+ __str = __wstr = std::move(__s);
}
size_t __width = _M_spec._M_get_width(__fc);
diff --git a/libstdc++-v3/testsuite/std/format/functions/format.cc b/libstdc++-v3/testsuite/std/format/functions/format.cc
index 000f267..93c33b4 100644
--- a/libstdc++-v3/testsuite/std/format/functions/format.cc
+++ b/libstdc++-v3/testsuite/std/format/functions/format.cc
@@ -370,6 +370,18 @@ test_wchar()
// P2909R4 Fix formatting of code units as integers (Dude, where’s my char?)
s = std::format(L"{:d} {:d}", wchar_t(-1), char(-1));
VERIFY( s.find('-') == std::wstring::npos );
+
+ auto ws = std::format(L"{:L}", 0.5);
+ VERIFY( ws == L"0.5" );
+ // The default C locale.
+ std::locale cloc = std::locale::classic();
+ // PR libstdc++/119671 use-after-free formatting floating-point to wstring
+ ws = std::format(cloc, L"{:L}", 0.5);
+ VERIFY( ws == L"0.5" );
+ // A locale with no name, but with the same facets as the C locale.
+ std::locale locx(cloc, &std::use_facet<std::ctype<char>>(cloc));
+ ws = std::format(locx, L"{:L}", 0.5);
+ VERIFY( ws == L"0.5" );
}
void
diff --git a/maintainer-scripts/ChangeLog b/maintainer-scripts/ChangeLog
index 2322249..d08a03b 100644
--- a/maintainer-scripts/ChangeLog
+++ b/maintainer-scripts/ChangeLog
@@ -1,3 +1,10 @@
+2025-04-07 Jakub Jelinek <jakub@redhat.com>
+
+ PR web/119227
+ * update_web_docs_git: Rename mdoc2pdf_html to cobol_mdoc2pdf_html,
+ perform mkdir -p $DOCSDIR/gcobol gcobol, remove $d/ from pdf and in
+ html replace it with gcobol/; update uses of the renamed function.
+
2025-03-31 Jakub Jelinek <jakub@redhat.com>
PR other/119510
diff --git a/maintainer-scripts/update_web_docs_git b/maintainer-scripts/update_web_docs_git
index 574397c..4248088 100755
--- a/maintainer-scripts/update_web_docs_git
+++ b/maintainer-scripts/update_web_docs_git
@@ -205,11 +205,12 @@ done
#
# The COBOL FE maintains man pages. Convert them to HTML and PDF.
#
-mdoc2pdf_html() {
+cobol_mdoc2pdf_html() {
+ mkdir -p $DOCSDIR/gcobol gcobol
input="$1"
d="${input%/*}"
- pdf="$d/$2"
- html="$d/$3"
+ pdf="$2"
+ html="gcobol/$3"
groff -mdoc -T pdf "$input" > "${pdf}~"
mv "${pdf}~" "${pdf}"
mandoc -T html "$filename" > "${html}~"
@@ -221,10 +222,10 @@ find . -name gcobol.[13] |
do
case ${filename##*.} in
1)
- mdoc2pdf_html "$filename" gcobol.pdf gcobol.html
+ cobol_mdoc2pdf_html "$filename" gcobol.pdf gcobol.html
;;
3)
- mdoc2pdf_html "$filename" gcobol_io.pdf gcobol_io.html
+ cobol_mdoc2pdf_html "$filename" gcobol_io.pdf gcobol_io.html
;;
esac
done