aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTobias Burnus <tobias@codesourcery.com>2022-10-11 10:13:28 +0200
committerTobias Burnus <tobias@codesourcery.com>2022-10-11 10:13:28 +0200
commitb3f25511fb4bd4dbfc4068df665f4ea34f416b2d (patch)
treeed738ae3787111b4ca01fd1432e06c859cc4bacb /gcc
parentd8909f7d24216fcf6e734ddfd81fe3fda51d437a (diff)
parent97374f25e1ee7ea45293c244f29425c9f9abcf5a (diff)
downloadgcc-b3f25511fb4bd4dbfc4068df665f4ea34f416b2d.zip
gcc-b3f25511fb4bd4dbfc4068df665f4ea34f416b2d.tar.gz
gcc-b3f25511fb4bd4dbfc4068df665f4ea34f416b2d.tar.bz2
Merge branch 'releases/gcc-12' into devel/omp/gcc-12
Merge up to r12-8817-g97374f25e1ee7ea45293c244f29425c9f9abcf5a (11th Oct 2022)
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog30
-rw-r--r--gcc/DATESTAMP2
-rw-r--r--gcc/config/i386/predicates.md20
-rw-r--r--gcc/config/i386/sse.md4
-rw-r--r--gcc/config/i386/t-i3865
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/class.cc13
-rw-r--r--gcc/fortran/ChangeLog60
-rw-r--r--gcc/fortran/expr.cc3
-rw-r--r--gcc/fortran/simplify.cc13
-rw-r--r--gcc/fortran/trans-array.cc4
-rw-r--r--gcc/fortran/trans-decl.cc1
-rw-r--r--gcc/fortran/trans-expr.cc48
-rw-r--r--gcc/fortran/trans-types.cc15
-rw-r--r--gcc/po/ChangeLog4
-rw-r--r--gcc/po/sv.po36
-rw-r--r--gcc/testsuite/ChangeLog73
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/cond-triv3.C44
-rw-r--r--gcc/testsuite/gcc.target/i386/keylocker-encodekey128.c1
-rw-r--r--gcc/testsuite/gcc.target/i386/keylocker-encodekey256.c1
-rw-r--r--gcc/testsuite/gfortran.dg/PR100029.f9022
-rw-r--r--gcc/testsuite/gfortran.dg/PR100040.f9036
-rw-r--r--gcc/testsuite/gfortran.dg/PR100103.f9076
-rw-r--r--gcc/testsuite/gfortran.dg/PR100132.f9075
-rw-r--r--gcc/testsuite/gfortran.dg/associate_26a.f9015
-rw-r--r--gcc/testsuite/gfortran.dg/pr106985.f908
-rw-r--r--gcc/testsuite/gfortran.dg/pr107054.f9013
27 files changed, 563 insertions, 63 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cb12da9..d2b7bc1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,33 @@
+2022-10-03 Sergei Trofimovich <siarheit@google.com>
+
+ Backported from master:
+ 2022-10-03 Sergei Trofimovich <siarheit@google.com>
+
+ PR target/107064
+ * config/i386/t-i386: Add build-time dependencies against
+ i386-builtin-types.inc to i386-builtins.o, i386-expand.o,
+ i386-features.o.
+
+2022-09-29 H.J. Lu <hjl.tools@gmail.com>
+
+ Backported from master:
+ 2022-09-28 H.J. Lu <hjl.tools@gmail.com>
+
+ PR target/107061
+ * config/i386/predicates.md (encodekey128_operation): Check
+ XMM4-XMM6 as clobbered.
+ (encodekey256_operation): Likewise.
+ * config/i386/sse.md (encodekey128u32): Clobber XMM4-XMM6.
+ (encodekey256u32): Likewise.
+
+2022-09-29 Tobias Burnus <tobias@codesourcery.com>
+
+ Backported from master:
+ 2022-09-26 Tobias Burnus <tobias@codesourcery.com>
+
+ PR middle-end/106982
+ * omp-low.cc (lower_oacc_reductions): Add some unshare_expr.
+
2022-09-28 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
Backported from master:
diff --git a/gcc/DATESTAMP b/gcc/DATESTAMP
index ea4b4d1..ee52440 100644
--- a/gcc/DATESTAMP
+++ b/gcc/DATESTAMP
@@ -1 +1 @@
-20220929
+20221011
diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md
index a8cc17a..ac02c61 100644
--- a/gcc/config/i386/predicates.md
+++ b/gcc/config/i386/predicates.md
@@ -2019,11 +2019,11 @@
for(i = 4; i < 7; i++)
{
elt = XVECEXP (op, 0, i);
- if (GET_CODE (elt) != SET
- || GET_CODE (SET_DEST (elt)) != REG
- || GET_MODE (SET_DEST (elt)) != V2DImode
- || REGNO (SET_DEST (elt)) != GET_SSE_REGNO (i)
- || SET_SRC (elt) != CONST0_RTX (V2DImode))
+ if (GET_CODE (elt) != CLOBBER
+ || GET_MODE (elt) != VOIDmode
+ || GET_CODE (XEXP (elt, 0)) != REG
+ || GET_MODE (XEXP (elt, 0)) != V2DImode
+ || REGNO (XEXP (elt, 0)) != GET_SSE_REGNO (i))
return false;
}
@@ -2069,11 +2069,11 @@
for(i = 4; i < 7; i++)
{
elt = XVECEXP (op, 0, i + 1);
- if (GET_CODE (elt) != SET
- || GET_CODE (SET_DEST (elt)) != REG
- || GET_MODE (SET_DEST (elt)) != V2DImode
- || REGNO (SET_DEST (elt)) != GET_SSE_REGNO (i)
- || SET_SRC (elt) != CONST0_RTX (V2DImode))
+ if (GET_CODE (elt) != CLOBBER
+ || GET_MODE (elt) != VOIDmode
+ || GET_CODE (XEXP (elt, 0)) != REG
+ || GET_MODE (XEXP (elt, 0)) != V2DImode
+ || REGNO (XEXP (elt, 0)) != GET_SSE_REGNO (i))
return false;
}
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index 407bcd8..eb767e5 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -28404,7 +28404,7 @@
for (i = 4; i < 7; i++)
XVECEXP (operands[2], 0, i)
- = gen_rtx_SET (xmm_regs[i], CONST0_RTX (V2DImode));
+ = gen_rtx_CLOBBER (VOIDmode, xmm_regs[i]);
XVECEXP (operands[2], 0, 7)
= gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
@@ -28461,7 +28461,7 @@
for (i = 4; i < 7; i++)
XVECEXP (operands[2], 0, i + 1)
- = gen_rtx_SET (xmm_regs[i], CONST0_RTX (V2DImode));
+ = gen_rtx_CLOBBER (VOIDmode, xmm_regs[i]);
XVECEXP (operands[2], 0, 8)
= gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
diff --git a/gcc/config/i386/t-i386 b/gcc/config/i386/t-i386
index 4e2a0ef..ffdbbdf 100644
--- a/gcc/config/i386/t-i386
+++ b/gcc/config/i386/t-i386
@@ -62,7 +62,12 @@ i386-features.o: $(srcdir)/config/i386/i386-features.cc
$(COMPILE) $<
$(POSTCOMPILE)
+# i386-builtin-types.inc is included into i386-builtins.h.
+# Below are direct users of i386-builtins.h:
i386.o: i386-builtin-types.inc
+i386-builtins.o: i386-builtin-types.inc
+i386-expand.o: i386-builtin-types.inc
+i386-features.o: i386-builtin-types.inc
i386-builtin-types.inc: s-i386-bt ; @true
s-i386-bt: $(srcdir)/config/i386/i386-builtin-types.awk \
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 3a5e7f4..bc2465f 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,7 @@
+2022-09-29 Jason Merrill <jason@redhat.com>
+
+ * class.cc (check_methods): Call constraints_satisfied_p.
+
2022-09-12 Jason Merrill <jason@redhat.com>
PR c++/93259
diff --git a/gcc/cp/class.cc b/gcc/cp/class.cc
index bfda006..b9e0a77 100644
--- a/gcc/cp/class.cc
+++ b/gcc/cp/class.cc
@@ -4780,8 +4780,9 @@ check_methods (tree t)
/* Check whether the eligible special member functions (P0848) are
user-provided. add_method arranged that the CLASSTYPE_MEMBER_VEC only
- has the eligible ones; TYPE_FIELDS also contains ineligible overloads,
- which is why this needs to be separate from the loop above. */
+ has the eligible ones, unless none are eligible; TYPE_FIELDS also contains
+ ineligible overloads, which is why this needs to be separate from the loop
+ above. */
if (tree dtor = CLASSTYPE_DESTRUCTOR (t))
{
@@ -4804,6 +4805,10 @@ check_methods (tree t)
{
if (!user_provided_p (fn))
/* Might be trivial. */;
+ else if (TREE_CODE (fn) == TEMPLATE_DECL)
+ /* Templates are never special members. */;
+ else if (!constraints_satisfied_p (fn))
+ /* Not eligible. */;
else if (copy_fn_p (fn))
TYPE_HAS_COMPLEX_COPY_CTOR (t) = true;
else if (move_fn_p (fn))
@@ -4814,6 +4819,10 @@ check_methods (tree t)
{
if (!user_provided_p (fn))
/* Might be trivial. */;
+ else if (TREE_CODE (fn) == TEMPLATE_DECL)
+ /* Templates are never special members. */;
+ else if (!constraints_satisfied_p (fn))
+ /* Not eligible. */;
else if (copy_fn_p (fn))
TYPE_HAS_COMPLEX_COPY_ASSIGN (t) = true;
else if (move_fn_p (fn))
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 4d60fd3..ce03cb2 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,63 @@
+2022-10-08 José Rui Faustino de Sousa <jrfsousa@gmail.com>
+
+ Backported from master:
+ 2022-10-01 José Rui Faustino de Sousa <jrfsousa@gmail.com>
+
+ PR fortran/100040
+ PR fortran/100029
+ * trans-expr.cc (gfc_conv_class_to_class): Add code to have
+ assumed-rank arrays recognized as full arrays and fix the type
+ of the array assignment.
+ (gfc_conv_procedure_call): Change order of code blocks such that
+ the free of ALLOCATABLE dummy arguments with INTENT(OUT) occurs
+ first.
+
+2022-10-01 José Rui Faustino de Sousa <jrfsousa@gmail.com>
+
+ Backported from master:
+ 2022-09-22 José Rui Faustino de Sousa <jrfsousa@gmail.com>
+
+ PR fortran/100103
+ * trans-array.cc (gfc_is_reallocatable_lhs): Add select rank
+ temporary associate names as possible targets of automatic
+ reallocation.
+
+2022-10-01 José Rui Faustino de Sousa <jrfsousa@gmail.com>
+
+ Backported from master:
+ 2022-09-20 José Rui Faustino de Sousa <jrfsousa@gmail.com>
+
+ PR fortran/100132
+ * trans-types.cc (create_fn_spec): Fix function attributes when
+ passing polymorphic pointers.
+
+2022-09-29 Harald Anlauf <anlauf@gmx.de>
+
+ Backported from master:
+ 2022-09-27 Harald Anlauf <anlauf@gmx.de>
+
+ PR fortran/107054
+ * simplify.cc (gfc_simplify_unpack): Replace assert by condition
+ that terminates simplification when there are not enough elements
+ in the constructor of argument VECTOR.
+
+2022-09-29 Harald Anlauf <anlauf@gmx.de>
+
+ Backported from master:
+ 2022-09-22 Harald Anlauf <anlauf@gmx.de>
+
+ PR fortran/82868
+ * trans-decl.cc (generate_coarray_sym_init): Skip symbol
+ if attr.associate_var.
+
+2022-09-29 Harald Anlauf <anlauf@gmx.de>
+
+ Backported from master:
+ 2022-09-20 Harald Anlauf <anlauf@gmx.de>
+
+ PR fortran/106985
+ * expr.cc (gfc_simplify_expr): Avoid NULL pointer dereference.
+
2022-09-22 Harald Anlauf <anlauf@gmx.de>
Backported from master:
diff --git a/gcc/fortran/expr.cc b/gcc/fortran/expr.cc
index be94c18..290ddf3 100644
--- a/gcc/fortran/expr.cc
+++ b/gcc/fortran/expr.cc
@@ -2287,7 +2287,8 @@ gfc_simplify_expr (gfc_expr *p, int type)
initialization expression, or we want a subsection. */
if (p->symtree->n.sym->attr.flavor == FL_PARAMETER
&& (gfc_init_expr_flag || p->ref
- || p->symtree->n.sym->value->expr_type != EXPR_ARRAY))
+ || (p->symtree->n.sym->value
+ && p->symtree->n.sym->value->expr_type != EXPR_ARRAY)))
{
if (!simplify_parameter_variable (p, type))
return false;
diff --git a/gcc/fortran/simplify.cc b/gcc/fortran/simplify.cc
index a6a3e94..d48ae1a 100644
--- a/gcc/fortran/simplify.cc
+++ b/gcc/fortran/simplify.cc
@@ -8420,9 +8420,16 @@ gfc_simplify_unpack (gfc_expr *vector, gfc_expr *mask, gfc_expr *field)
{
if (mask_ctor->expr->value.logical)
{
- gcc_assert (vector_ctor);
- e = gfc_copy_expr (vector_ctor->expr);
- vector_ctor = gfc_constructor_next (vector_ctor);
+ if (vector_ctor)
+ {
+ e = gfc_copy_expr (vector_ctor->expr);
+ vector_ctor = gfc_constructor_next (vector_ctor);
+ }
+ else
+ {
+ gfc_free_expr (result);
+ return NULL;
+ }
}
else if (field->expr_type == EXPR_ARRAY)
e = gfc_copy_expr (field_ctor->expr);
diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index 9c4931d..bc2477e 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -10558,7 +10558,7 @@ gfc_is_reallocatable_lhs (gfc_expr *expr)
/* An allocatable class variable with no reference. */
if (sym->ts.type == BT_CLASS
- && !sym->attr.associate_var
+ && (!sym->attr.associate_var || sym->attr.select_rank_temporary)
&& CLASS_DATA (sym)->attr.allocatable
&& expr->ref
&& ((expr->ref->type == REF_ARRAY && expr->ref->u.ar.type == AR_FULL
@@ -10573,7 +10573,7 @@ gfc_is_reallocatable_lhs (gfc_expr *expr)
/* An allocatable variable. */
if (sym->attr.allocatable
- && !sym->attr.associate_var
+ && (!sym->attr.associate_var || sym->attr.select_rank_temporary)
&& expr->ref
&& expr->ref->type == REF_ARRAY
&& expr->ref->u.ar.type == AR_FULL)
diff --git a/gcc/fortran/trans-decl.cc b/gcc/fortran/trans-decl.cc
index 92cb0ec7..344df1a 100644
--- a/gcc/fortran/trans-decl.cc
+++ b/gcc/fortran/trans-decl.cc
@@ -5552,6 +5552,7 @@ generate_coarray_sym_init (gfc_symbol *sym)
if (sym->attr.dummy || sym->attr.allocatable || !sym->attr.codimension
|| sym->attr.use_assoc || !sym->attr.referenced
+ || sym->attr.associate_var
|| sym->attr.select_type_temporary)
return;
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index 34b0997..eb113d0 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -1183,8 +1183,10 @@ gfc_conv_class_to_class (gfc_se *parmse, gfc_expr *e, gfc_typespec class_ts,
return;
/* Test for FULL_ARRAY. */
- if (e->rank == 0 && gfc_expr_attr (e).codimension
- && gfc_expr_attr (e).dimension)
+ if (e->rank == 0
+ && ((gfc_expr_attr (e).codimension && gfc_expr_attr (e).dimension)
+ || (class_ts.u.derived->components->as
+ && class_ts.u.derived->components->as->type == AS_ASSUMED_RANK)))
full_array = true;
else
gfc_is_class_array_ref (e, &full_array);
@@ -1232,8 +1234,12 @@ gfc_conv_class_to_class (gfc_se *parmse, gfc_expr *e, gfc_typespec class_ts,
&& e->rank != class_ts.u.derived->components->as->rank)
{
if (e->rank == 0)
- gfc_add_modify (&parmse->post, gfc_class_data_get (parmse->expr),
- gfc_conv_descriptor_data_get (ctree));
+ {
+ tmp = gfc_class_data_get (parmse->expr);
+ gfc_add_modify (&parmse->post, tmp,
+ fold_convert (TREE_TYPE (tmp),
+ gfc_conv_descriptor_data_get (ctree)));
+ }
else
class_array_data_assign (&parmse->post, parmse->expr, ctree, true);
}
@@ -6531,23 +6537,6 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
base_object = build_fold_indirect_ref_loc (input_location,
parmse.expr);
- /* A class array element needs converting back to be a
- class object, if the formal argument is a class object. */
- if (fsym && fsym->ts.type == BT_CLASS
- && e->ts.type == BT_CLASS
- && ((CLASS_DATA (fsym)->as
- && CLASS_DATA (fsym)->as->type == AS_ASSUMED_RANK)
- || CLASS_DATA (e)->attr.dimension))
- gfc_conv_class_to_class (&parmse, e, fsym->ts, false,
- fsym->attr.intent != INTENT_IN
- && (CLASS_DATA (fsym)->attr.class_pointer
- || CLASS_DATA (fsym)->attr.allocatable),
- fsym->attr.optional
- && e->expr_type == EXPR_VARIABLE
- && e->symtree->n.sym->attr.optional,
- CLASS_DATA (fsym)->attr.class_pointer
- || CLASS_DATA (fsym)->attr.allocatable);
-
/* If an ALLOCATABLE dummy argument has INTENT(OUT) and is
allocated on entry, it must be deallocated. */
if (fsym && fsym->attr.intent == INTENT_OUT
@@ -6608,6 +6597,23 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
gfc_add_expr_to_block (&se->pre, tmp);
}
+ /* A class array element needs converting back to be a
+ class object, if the formal argument is a class object. */
+ if (fsym && fsym->ts.type == BT_CLASS
+ && e->ts.type == BT_CLASS
+ && ((CLASS_DATA (fsym)->as
+ && CLASS_DATA (fsym)->as->type == AS_ASSUMED_RANK)
+ || CLASS_DATA (e)->attr.dimension))
+ gfc_conv_class_to_class (&parmse, e, fsym->ts, false,
+ fsym->attr.intent != INTENT_IN
+ && (CLASS_DATA (fsym)->attr.class_pointer
+ || CLASS_DATA (fsym)->attr.allocatable),
+ fsym->attr.optional
+ && e->expr_type == EXPR_VARIABLE
+ && e->symtree->n.sym->attr.optional,
+ CLASS_DATA (fsym)->attr.class_pointer
+ || CLASS_DATA (fsym)->attr.allocatable);
+
if (fsym && (fsym->ts.type == BT_DERIVED
|| fsym->ts.type == BT_ASSUMED)
&& e->ts.type == BT_CLASS
diff --git a/gcc/fortran/trans-types.cc b/gcc/fortran/trans-types.cc
index 62935b1..c109c14 100644
--- a/gcc/fortran/trans-types.cc
+++ b/gcc/fortran/trans-types.cc
@@ -3061,12 +3061,23 @@ create_fn_spec (gfc_symbol *sym, tree fntype)
for (f = gfc_sym_get_dummy_args (sym); f; f = f->next)
if (spec_len < sizeof (spec))
{
- if (!f->sym || f->sym->attr.pointer || f->sym->attr.target
+ bool is_class = false;
+ bool is_pointer = false;
+
+ if (f->sym)
+ {
+ is_class = f->sym->ts.type == BT_CLASS && CLASS_DATA (f->sym)
+ && f->sym->attr.class_ok;
+ is_pointer = is_class ? CLASS_DATA (f->sym)->attr.class_pointer
+ : f->sym->attr.pointer;
+ }
+
+ if (f->sym == NULL || is_pointer || f->sym->attr.target
|| f->sym->attr.external || f->sym->attr.cray_pointer
|| (f->sym->ts.type == BT_DERIVED
&& (f->sym->ts.u.derived->attr.proc_pointer_comp
|| f->sym->ts.u.derived->attr.pointer_comp))
- || (f->sym->ts.type == BT_CLASS
+ || (is_class
&& (CLASS_DATA (f->sym)->ts.u.derived->attr.proc_pointer_comp
|| CLASS_DATA (f->sym)->ts.u.derived->attr.pointer_comp))
|| (f->sym->ts.type == BT_INTEGER && f->sym->ts.is_c_interop))
diff --git a/gcc/po/ChangeLog b/gcc/po/ChangeLog
index c443ef9..4971143 100644
--- a/gcc/po/ChangeLog
+++ b/gcc/po/ChangeLog
@@ -1,3 +1,7 @@
+2022-10-03 Joseph Myers <joseph@codesourcery.com>
+
+ * sv.po: Update.
+
2022-09-22 Joseph Myers <joseph@codesourcery.com>
* fr.po: Update.
diff --git a/gcc/po/sv.po b/gcc/po/sv.po
index d15c134..2b871e0 100644
--- a/gcc/po/sv.po
+++ b/gcc/po/sv.po
@@ -29,7 +29,7 @@ msgstr ""
"Project-Id-Version: gcc 12.2.0\n"
"Report-Msgid-Bugs-To: https://gcc.gnu.org/bugs/\n"
"POT-Creation-Date: 2022-08-17 22:17+0000\n"
-"PO-Revision-Date: 2022-08-26 22:47+0200\n"
+"PO-Revision-Date: 2022-10-02 11:19+0200\n"
"Last-Translator: Göran Uddeborg <goeran@uddeborg.se>\n"
"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
"Language: sv\n"
@@ -20975,7 +20975,7 @@ msgstr "argument till Offsetof implicerar indirektion till ett inbäddat fält"
#: go/gofrontend/expressions.cc:10587 go/gofrontend/expressions.cc:12740
#: go/gofrontend/expressions.cc:12757 go/gofrontend/expressions.cc:12773
msgid "not enough arguments"
-msgstr "inte tillräckligt med argument"
+msgstr "för få argument"
#: go/gofrontend/expressions.cc:8439 go/gofrontend/expressions.cc:8475
#: go/gofrontend/expressions.cc:10270 go/gofrontend/expressions.cc:10388
@@ -21168,7 +21168,7 @@ msgstr "avbildningsindex förväntades på högersidan"
#: go/gofrontend/statements.cc:3198 go/gofrontend/statements.cc:3228
msgid "not enough arguments to return"
-msgstr "inte tillräckligt med argument att returnera"
+msgstr "för få argument att returnera"
#: go/gofrontend/statements.cc:3206
msgid "return with value in function with no return type"
@@ -29655,6 +29655,7 @@ msgstr "statisk kedja med funktion som inte använder en"
msgid "%<__builtin_unreachable%> or %<__builtin_trap%> call with arguments"
msgstr "%<__builtin_unreachable%> eller %<__builtin_trap%> anropad med argument"
+# Misspelling reported as https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107121
#: tree-cfg.cc:3478
#, gcc-internal-format
msgid "%<DEFFERED_INIT%> calls should have same constant size for the first argument and LHS"
@@ -30551,7 +30552,7 @@ msgstr "längden beräknad här"
#: tree-ssa-strlen.cc:4253
#, gcc-internal-format
msgid "%qD of a string of length %wu or more and an array of size %wu evaluates to nonzero"
-msgstr "%qD av strängar med längden %wu eller mer och en vektor av storlek %wu evalueras till nollskilt"
+msgstr "%qD av en sträng med längden %wu eller mer och en vektor av storlek %wu evalueras till nollskilt"
#: tree-ssa-strlen.cc:4255
#, gcc-internal-format
@@ -32710,7 +32711,7 @@ msgstr "begärd minnesjustering %qE överskrider maximum %u"
#: c-family/c-common.cc:5679
#, gcc-internal-format
msgid "not enough variable arguments to fit a sentinel"
-msgstr "inte tillräckligt med variabla argument för att få plats med en vaktpost"
+msgstr "för få variabla argument för att få plats med en vaktpost"
#: c-family/c-common.cc:5693
#, gcc-internal-format
@@ -45221,7 +45222,7 @@ msgstr "iterationsdeklaration eller initiering förväntades"
#: c/c-parser.cc:19440
#, gcc-internal-format
msgid "not enough perfectly nested loops"
-msgstr "inte tillräckligt med perfekt nästade slingor"
+msgstr "för få perfekt nästade slingor"
#: c/c-parser.cc:19488 cp/parser.cc:42786
#, gcc-internal-format
@@ -48940,7 +48941,7 @@ msgstr "(en pekare på medlem kan bara skapas med %<&%E%>)"
#: cp/class.cc:8694 cp/class.cc:8736
#, gcc-internal-format
msgid "not enough type information"
-msgstr "inte tillräcklig typinformation"
+msgstr "för lite typinformation"
#: cp/class.cc:8714
#, gcc-internal-format
@@ -58202,7 +58203,7 @@ msgstr "iterationsvariabel %qD skall inte vara reduction"
#: cp/parser.cc:42723
#, gcc-internal-format
msgid "not enough for loops to collapse"
-msgstr "inte tillräckligt med for-slingor att kollapsa"
+msgstr "för få for-slingor att kollapsa"
#: cp/parser.cc:45065
#, gcc-internal-format
@@ -63455,7 +63456,7 @@ msgstr "%qs-argumentet till inbyggd %qs vid %L har en ogiltig permutation av dim
#: fortran/check.cc:4841
#, gcc-internal-format, gfc-internal-format
msgid "Without padding, there are not enough elements in the intrinsic RESHAPE source at %L to match the shape"
-msgstr "Utan utfyllnad finns det inte tillräckligt med element i inbyggda RESHAPE-källan vid %L för att stämma med formen"
+msgstr "Utan utfyllnad finns det för få element i inbyggda RESHAPE-källan vid %L för att stämma med formen"
#: fortran/check.cc:4858 fortran/check.cc:4877
#, gcc-internal-format
@@ -64498,7 +64499,7 @@ msgstr "Typparameterspecifikationslistan vid %C får inte innehålla både ASSUM
#: fortran/decl.cc:3833
#, gcc-internal-format, gfc-internal-format
msgid "The type parameter spec list at %C does not contain enough parameter expressions"
-msgstr "Typparameterspecifikationslistan vid %C innehåller inte tillräckligt med parameteruttryck"
+msgstr "Typparameterspecifikationslistan vid %C innehåller för få parameteruttryck"
#: fortran/decl.cc:3857
#, gcc-internal-format
@@ -64853,7 +64854,7 @@ msgstr "BIND(C)-sats vid %C"
#: fortran/decl.cc:6268
#, gcc-internal-format, gfc-internal-format
msgid "CLASS entity at %C cannot have the PARAMETER attribute"
-msgstr "CLASS-enheten vid %C får inte ha attributet PARAMETER"
+msgstr "CLASS-entiteten vid %C får inte ha attributet PARAMETER"
#: fortran/decl.cc:6300
#, gcc-internal-format, gfc-internal-format
@@ -65139,7 +65140,7 @@ msgstr "ENTRY-sats vid %L med BIND(C) är otillåten i en elementär procedur"
#: fortran/decl.cc:8060
#, gcc-internal-format, gfc-internal-format
msgid "Alternate return dummy argument cannot appear in a SUBROUTINE with the BIND(C) attribute at %L"
-msgstr "Alternativt returattrappgument får inte förekomma i en SUBROUTINE med attributet BIND(C) vid %L"
+msgstr "Alternativt returattrappargument får inte förekomma i en SUBROUTINE med attributet BIND(C) vid %L"
#: fortran/decl.cc:8123 fortran/decl.cc:8130
#, gcc-internal-format, gfc-internal-format
@@ -70507,6 +70508,7 @@ msgstr "Den implicit deklarerade subrutinen %s används i !$OMP DECLARE REDUCTIO
msgid "ORDERED clause parameter is less than COLLAPSE at %L"
msgstr "ORDERED-klausulparameter är mindre än COLLAPSE vid %L"
+# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107122
#: fortran/openmp.cc:6294
#, gcc-internal-format, gfc-internal-format
msgid "ORDER clause must not be used together ORDERED at %L"
@@ -70940,7 +70942,7 @@ msgstr "En skalär inbyggd variabel förväntades vid %L i atomär jämförelse"
#: fortran/openmp.cc:7885
#, gcc-internal-format, gfc-internal-format
msgid "Expected scalar intrinsic expression at %L in atomic comparison"
-msgstr "Ett skalärt inbyggt uttryck förväntades vid %L vid i atomär jämförelse"
+msgstr "Ett skalärt inbyggt uttryck förväntades vid %L i atomär jämförelse"
#: fortran/openmp.cc:7893
#, gcc-internal-format, gfc-internal-format
@@ -71110,7 +71112,7 @@ msgstr "kollapsade %s-slingor är inte perfekt nästade vid %L"
#: fortran/openmp.cc:8640 fortran/openmp.cc:8648
#, gcc-internal-format, gfc-internal-format
msgid "not enough DO loops for collapsed %s at %L"
-msgstr "inte tillräckligt med DO-slingor för kollapsad %s vid %L"
+msgstr "för få DO-slingor för kollapsad %s vid %L"
#: fortran/openmp.cc:8853 fortran/openmp.cc:8866
#, gcc-internal-format, gfc-internal-format
@@ -71145,7 +71147,7 @@ msgstr "%s !$ACC LOOP-slingor är inte perfekt nästade vid %L"
#: fortran/openmp.cc:8935 fortran/openmp.cc:8944
#, gcc-internal-format, gfc-internal-format
msgid "not enough DO loops for %s !$ACC LOOP at %L"
-msgstr "inte tillräckligt med DO-slingor för %s !$ACC LOOP vid %L"
+msgstr "för få DO-slingor för %s !$ACC LOOP vid %L"
#: fortran/openmp.cc:8960
#, gcc-internal-format, gfc-internal-format
@@ -72610,7 +72612,7 @@ msgstr "Gränssnittet stämmer inte för procedurpekarkomponenten %qs i postkons
#: fortran/resolve.cc:1484
#, gcc-internal-format
msgid "Bad array spec of component %qs referenced in structure constructor at %L"
-msgstr "Felaktig vektorcspecifikation av kompnenten %qs refererad i postkonstruerare vid %L"
+msgstr "Felaktig vektorspecifikation av komponenten %qs refererad i postkonstruerare vid %L"
#: fortran/resolve.cc:1497
#, gcc-internal-format
@@ -75897,7 +75899,7 @@ msgstr "ej konstant initieringsuttryck vid %L"
#: fortran/trans-decl.cc:761
#, gcc-internal-format
msgid "Array %qs at %L is larger than limit set by %<-fmax-stack-var-size=%>, moved from stack to static storage. This makes the procedure unsafe when called recursively, or concurrently from multiple threads. Consider increasing the %<-fmax-stack-var-size=%> limit (or use %<-frecursive%>, which implies unlimited %<-fmax-stack-var-size%>) - or change the code to use an ALLOCATABLE array. If the variable is never accessed concurrently, this warning can be ignored, and the variable could also be declared with the SAVE attribute."
-msgstr "Vektorn %qs vid %L är större än gränsen satt med %<-fmax-stack-var-size=%>, flyttad från stacken till statisk lagring. Detta gör proceduren osäker när den anropas rekursivt, eller samtidigt från flera trådar. Överväg att öka gränsen %<-fmax-stack-var-size=%> (eller anvånd %<-frecursive%>, som implicerad obegränsad %<-fmax-stack-var-size=%> – eller ändra koden till att använda en ALLOCATABLE vektor. Om variabeln aldrig används av flera samtidigt kan denna varning ignoreras och variabeln skulle också kunna deklareras med attributet SAVE."
+msgstr "Vektorn %qs vid %L är större än gränsen satt med %<-fmax-stack-var-size=%>, flyttad från stacken till statisk lagring. Detta gör proceduren osäker när den anropas rekursivt, eller samtidigt från flera trådar. Överväg att öka gränsen %<-fmax-stack-var-size=%> (eller använd %<-frecursive%>, som implicerad obegränsad %<-fmax-stack-var-size=%> – eller ändra koden till att använda en ALLOCATABLE vektor. Om variabeln aldrig används av flera samtidigt kan denna varning ignoreras och variabeln skulle också kunna deklareras med attributet SAVE."
#: fortran/trans-decl.cc:1790
#, gcc-internal-format
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e6738e1..8a09e5c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,76 @@
+2022-10-08 José Rui Faustino de Sousa <jrfsousa@gmail.com>
+
+ Backported from master:
+ 2022-10-01 José Rui Faustino de Sousa <jrfsousa@gmail.com>
+
+ PR fortran/100029
+ PR fortran/100040
+ * gfortran.dg/PR100029.f90: New test.
+ * gfortran.dg/PR100040.f90: New test.
+
+2022-10-01 José Rui Faustino de Sousa <jrfsousa@gmail.com>
+
+ Backported from master:
+ 2022-09-22 José Rui Faustino de Sousa <jrfsousa@gmail.com>
+
+ PR fortran/100103
+ * gfortran.dg/PR100103.f90: New test.
+
+2022-10-01 José Rui Faustino de Sousa <jrfsousa@gmail.com>
+
+ Backported from master:
+ 2022-09-20 José Rui Faustino de Sousa <jrfsousa@gmail.com>
+
+ PR fortran/100132
+ * gfortran.dg/PR100132.f90: New test.
+
+2022-09-29 Jason Merrill <jason@redhat.com>
+
+ * g++.dg/cpp2a/cond-triv3.C: New test.
+
+2022-09-29 Harald Anlauf <anlauf@gmx.de>
+
+ Backported from master:
+ 2022-09-27 Harald Anlauf <anlauf@gmx.de>
+
+ PR fortran/107054
+ * gfortran.dg/pr107054.f90: New test.
+
+2022-09-29 Harald Anlauf <anlauf@gmx.de>
+
+ Backported from master:
+ 2022-09-22 Harald Anlauf <anlauf@gmx.de>
+
+ PR fortran/82868
+ * gfortran.dg/associate_26a.f90: New test.
+
+2022-09-29 Harald Anlauf <anlauf@gmx.de>
+
+ Backported from master:
+ 2022-09-20 Harald Anlauf <anlauf@gmx.de>
+
+ PR fortran/106985
+ * gfortran.dg/pr106985.f90: New test.
+
+2022-09-29 H.J. Lu <hjl.tools@gmail.com>
+
+ Backported from master:
+ 2022-09-28 H.J. Lu <hjl.tools@gmail.com>
+
+ PR target/107061
+ * gcc.target/i386/keylocker-encodekey128.c: Don't check
+ XMM4-XMM6.
+ * gcc.target/i386/keylocker-encodekey256.c: Likewise.
+
+2022-09-29 Tobias Burnus <tobias@codesourcery.com>
+
+ Backported from master:
+ 2022-09-26 Tobias Burnus <tobias@codesourcery.com>
+
+ PR middle-end/106982
+ * c-c++-common/goacc/reduction-7.c: New test.
+ * c-c++-common/goacc/reduction-8.c: New test.
+
2022-09-22 Harald Anlauf <anlauf@gmx.de>
Backported from master:
diff --git a/gcc/testsuite/g++.dg/cpp2a/cond-triv3.C b/gcc/testsuite/g++.dg/cpp2a/cond-triv3.C
new file mode 100644
index 0000000..d0711cf
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/cond-triv3.C
@@ -0,0 +1,44 @@
+// { dg-do compile { target c++20 } }
+
+template<class T>
+struct X
+{
+ T first{};
+
+ X& operator=(const X&) = delete;
+ X& operator=(const X&) requires requires (T& t) { t = t; } { return *this; }
+};
+
+// C++20 std::pair<const int, int>:
+using cxx20_pair = X<const int>;
+static_assert( __is_trivially_constructible(cxx20_pair, const cxx20_pair&), "" );
+static_assert( !__is_assignable(cxx20_pair&, const cxx20_pair&), "" );
+static_assert( __is_trivially_copyable(cxx20_pair), "" );
+
+template<bool, typename, typename F> struct conditional { using type = F; };
+template<typename T, typename F> struct conditional<true, T, F> { using type = T; };
+
+struct base
+{
+ base() = default;
+ ~base() = default;
+ base(const base&) = default;
+ base& operator=(const base&) = delete;
+};
+
+struct nope;
+
+template<class T>
+struct Y : base
+{
+ T first{};
+
+ Y& operator=(typename conditional<__is_assignable(T&, const T&), const Y&, const nope&>::type)
+ { return *this; }
+};
+
+// C++17 std::pair<const int, int>:
+using cxx17_pair = Y<const int>;
+static_assert( __is_trivially_constructible(cxx17_pair, const cxx17_pair&), "" );
+static_assert( ! __is_assignable(cxx17_pair&, const cxx17_pair&), "" );
+static_assert( __is_trivially_copyable(cxx17_pair), "???" );
diff --git a/gcc/testsuite/gcc.target/i386/keylocker-encodekey128.c b/gcc/testsuite/gcc.target/i386/keylocker-encodekey128.c
index 805e062..57fa9bd 100644
--- a/gcc/testsuite/gcc.target/i386/keylocker-encodekey128.c
+++ b/gcc/testsuite/gcc.target/i386/keylocker-encodekey128.c
@@ -6,7 +6,6 @@
/* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\]*%xmm0,\[^\\n\\r\]*" } } */
/* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\]*%xmm1,\[^\\n\\r\]*16\[^\\n\\r\]*" } } */
/* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\]*%xmm2,\[^\\n\\r\]*32\[^\\n\\r\]*" } } */
-/* { dg-final { scan-assembler "(?:movdqa|movaps)\[ \\t\]+\[^\\n\]*%xmm\[4-6\],\[^\\n\\r\]*" } } */
#include <immintrin.h>
diff --git a/gcc/testsuite/gcc.target/i386/keylocker-encodekey256.c b/gcc/testsuite/gcc.target/i386/keylocker-encodekey256.c
index 26f04dc..a9398b4 100644
--- a/gcc/testsuite/gcc.target/i386/keylocker-encodekey256.c
+++ b/gcc/testsuite/gcc.target/i386/keylocker-encodekey256.c
@@ -8,7 +8,6 @@
/* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\]*%xmm1,\[^\\n\\r\]*16\[^\\n\\r\]*" } } */
/* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\]*%xmm2,\[^\\n\\r\]*32\[^\\n\\r\]*" } } */
/* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\]*%xmm3,\[^\\n\\r\]*48\[^\\n\\r\]*" } } */
-/* { dg-final { scan-assembler "(?:movdqa|movaps)\[ \\t\]+\[^\\n\]*%xmm\[4-6\],\[^\\n\\r\]*" } } */
#include <immintrin.h>
diff --git a/gcc/testsuite/gfortran.dg/PR100029.f90 b/gcc/testsuite/gfortran.dg/PR100029.f90
new file mode 100644
index 0000000..fd7e4c4
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/PR100029.f90
@@ -0,0 +1,22 @@
+! { dg-do run }
+!
+! Test the fix for PR100029
+!
+
+program foo_p
+ implicit none
+
+ type :: foo_t
+ end type foo_t
+
+ class(foo_t), allocatable :: pout
+
+ call foo_s(pout)
+
+contains
+
+ subroutine foo_s(that)
+ class(foo_t), allocatable, intent(out) :: that(..)
+ end subroutine foo_s
+
+end program foo_p
diff --git a/gcc/testsuite/gfortran.dg/PR100040.f90 b/gcc/testsuite/gfortran.dg/PR100040.f90
new file mode 100644
index 0000000..0a135ff
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/PR100040.f90
@@ -0,0 +1,36 @@
+! { dg-do run }
+!
+! Test the fix for PR100040
+!
+
+program foo_p
+ implicit none
+
+ integer, parameter :: n = 11
+
+ type :: foo_t
+ integer :: i
+ end type foo_t
+
+ type(foo_t), parameter :: a = foo_t(n)
+
+ class(foo_t), allocatable :: pout
+
+ call foo_s(pout)
+ if(.not.allocated(pout)) stop 1
+ if(pout%i/=n) stop 2
+
+contains
+
+ subroutine foo_s(that)
+ class(foo_t), allocatable, intent(out) :: that(..)
+
+ select rank(that)
+ rank(0)
+ that = a
+ rank default
+ stop 3
+ end select
+ end subroutine foo_s
+
+end program foo_p
diff --git a/gcc/testsuite/gfortran.dg/PR100103.f90 b/gcc/testsuite/gfortran.dg/PR100103.f90
new file mode 100644
index 0000000..2140561
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/PR100103.f90
@@ -0,0 +1,76 @@
+! { dg-do run }
+!
+! Test the fix for PR100103
+!
+
+program main_p
+ implicit none
+
+ integer :: i
+ integer, parameter :: n = 11
+
+ type :: foo_t
+ integer :: i
+ end type foo_t
+
+ type(foo_t), parameter :: a(*) = [(foo_t(i), i=1,n)]
+
+ type(foo_t), allocatable :: bar_d(:)
+ class(foo_t), allocatable :: bar_p(:)
+ class(*), allocatable :: bar_u(:)
+
+
+ call foo_d(bar_d)
+ if(.not.allocated(bar_d)) stop 1
+ if(any(bar_d%i/=a%i)) stop 2
+ deallocate(bar_d)
+ call foo_p(bar_p)
+ if(.not.allocated(bar_p)) stop 3
+ if(any(bar_p%i/=a%i)) stop 4
+ deallocate(bar_p)
+ call foo_u(bar_u)
+ if(.not.allocated(bar_u)) stop 5
+ select type(bar_u)
+ type is(foo_t)
+ if(any(bar_u%i/=a%i)) stop 6
+ class default
+ stop 7
+ end select
+ deallocate(bar_u)
+
+contains
+
+ subroutine foo_d(that)
+ type(foo_t), allocatable, intent(out) :: that(..)
+
+ select rank(that)
+ rank(1)
+ that = a
+ rank default
+ stop 8
+ end select
+ end subroutine foo_d
+
+ subroutine foo_p(that)
+ class(foo_t), allocatable, intent(out) :: that(..)
+
+ select rank(that)
+ rank(1)
+ that = a
+ rank default
+ stop 9
+ end select
+ end subroutine foo_p
+
+ subroutine foo_u(that)
+ class(*), allocatable, intent(out) :: that(..)
+
+ select rank(that)
+ rank(1)
+ that = a
+ rank default
+ stop 10
+ end select
+ end subroutine foo_u
+
+end program main_p
diff --git a/gcc/testsuite/gfortran.dg/PR100132.f90 b/gcc/testsuite/gfortran.dg/PR100132.f90
new file mode 100644
index 0000000..78ae670
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/PR100132.f90
@@ -0,0 +1,75 @@
+! { dg-do run }
+!
+! Test the fix for PR100132
+!
+
+module main_m
+ implicit none
+
+ private
+
+ public :: &
+ foo_t
+
+ public :: &
+ set, &
+ get
+
+ type :: foo_t
+ integer :: i
+ end type foo_t
+
+ type(foo_t), save, pointer :: data => null()
+
+contains
+
+ subroutine set(this)
+ class(foo_t), pointer, intent(in) :: this
+
+ if(associated(data)) stop 1
+ data => this
+ end subroutine set
+
+ subroutine get(this)
+ type(foo_t), pointer, intent(out) :: this
+
+ if(.not.associated(data)) stop 4
+ this => data
+ nullify(data)
+ end subroutine get
+
+end module main_m
+
+program main_p
+
+ use :: main_m, only: &
+ foo_t, set, get
+
+ implicit none
+
+ integer, parameter :: n = 1000
+
+ type(foo_t), pointer :: ps
+ type(foo_t), target :: s
+ integer :: i, j, yay, nay
+
+ yay = 0
+ nay = 0
+ do i = 1, n
+ s%i = i
+ call set(s)
+ call get(ps)
+ if(.not.associated(ps)) stop 13
+ j = ps%i
+ if(i/=j) stop 14
+ if(i/=s%i) stop 15
+ if(ps%i/=s%i) stop 16
+ if(associated(ps, s))then
+ yay = yay + 1
+ else
+ nay = nay + 1
+ end if
+ end do
+ if((yay/=n).or.(nay/=0)) stop 17
+
+end program main_p
diff --git a/gcc/testsuite/gfortran.dg/associate_26a.f90 b/gcc/testsuite/gfortran.dg/associate_26a.f90
new file mode 100644
index 0000000..85aebeb
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/associate_26a.f90
@@ -0,0 +1,15 @@
+! { dg-do compile }
+! { dg-options "-fcoarray=lib" }
+!
+! Test the fix for PR78152 and the followup in PR82868
+!
+! Contributed by <physiker@toast2.net>
+!
+program co_assoc
+ implicit none
+ integer, parameter :: p = 5
+ real, allocatable :: a(:,:)[:,:]
+ allocate (a(p,p)[2,*])
+ associate (i => a(1:p, 1:p))
+ end associate
+end program co_assoc
diff --git a/gcc/testsuite/gfortran.dg/pr106985.f90 b/gcc/testsuite/gfortran.dg/pr106985.f90
new file mode 100644
index 0000000..f4ed925
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr106985.f90
@@ -0,0 +1,8 @@
+! { dg-do compile }
+! PR fortran/106985 - ICE in gfc_simplify_expr
+! Contributed by G.Steinmetz
+
+program p
+ integer, parameter :: a(2) = 1
+ integer, parameter :: b = a(2) + b ! { dg-error "before its definition is complete" }
+end
diff --git a/gcc/testsuite/gfortran.dg/pr107054.f90 b/gcc/testsuite/gfortran.dg/pr107054.f90
new file mode 100644
index 0000000..bbfe646
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr107054.f90
@@ -0,0 +1,13 @@
+! { dg-do compile }
+! PR fortran/107054 - ICE in gfc_simplify_unpack
+! Contributed by G.Steinmetz
+
+program p
+ type t
+ integer :: n = 0
+ end type
+ type(t), parameter :: a(4) = t(2)
+ type(t), parameter :: b(4) = reshape(a,[2]) ! { dg-error "Different shape" }
+ type(t), parameter :: c(2) = pack(b,[.false.,.true.,.false.,.true.]) ! { dg-error "Different shape" }
+ type(t), parameter :: d(4) = unpack(c,[.false.,.true.,.false.,.true.],a)
+end