aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog34
-rw-r--r--gcc/DATESTAMP2
-rw-r--r--gcc/c-family/ChangeLog4
-rw-r--r--gcc/c-family/c.opt4
-rw-r--r--gcc/c/ChangeLog19
-rw-r--r--gcc/c/c-decl.cc20
-rw-r--r--gcc/config/mips/mips.cc19
-rw-r--r--gcc/config/mips/mips.md28
-rw-r--r--gcc/cp/pt.cc8
-rw-r--r--gcc/doc/extend.texi25
-rw-r--r--gcc/doc/invoke.texi12
-rw-r--r--gcc/fortran/ChangeLog9
-rw-r--r--gcc/fortran/interface.cc19
-rw-r--r--gcc/testsuite/ChangeLog24
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/lambda-generic-this6.C8
-rw-r--r--gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda19.C15
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/concepts-conv4.C9
-rw-r--r--gcc/testsuite/gcc.dg/Wmultiple-parameter-fwd-decl-lists.c6
-rw-r--r--gcc/testsuite/gcc.target/mips/mips-msubf.c31
-rw-r--r--gcc/testsuite/gcc.target/mips/mips16e2-cache.c2
-rw-r--r--gcc/testsuite/gcc.target/mips/mips16e2-cmov.c2
-rw-r--r--gcc/testsuite/gcc.target/mips/mips16e2-gp.c2
-rw-r--r--gcc/testsuite/gcc.target/mips/mips16e2.c2
-rw-r--r--gcc/testsuite/gfortran.dg/pr87908.f9049
-rw-r--r--libstdc++-v3/ChangeLog76
25 files changed, 329 insertions, 100 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e0a7c64..97f1021 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,37 @@
+2025-09-26 Alejandro Colomar <alx@kernel.org>
+
+ * doc/extend.texi: Clarify documentation about lists of
+ parameter forward declarations, and mention that more than one
+ of them are unnecessary.
+ * doc/invoke.texi: Document the new
+ -Wmultiple-parameter-fwd-decl-lists.
+
+2025-09-26 Jan Hubicka <hubicka@ucw.cz>
+
+ * auto-profile.cc (afdo_propagate_edge): Fix handling of precize 0
+ counts.
+
+2025-09-26 Andrew Stubbs <ams@baylibre.com>
+
+ * config/gcn/gcn.cc
+ (gcn_vectorize_support_vector_misalignment): Allow any alignment, as
+ long as it's not packed.
+
+2025-09-26 Jan Hubicka <hubicka@ucw.cz>
+
+ * profile-count.h (profile_probability::operator/): Do not cap
+ twice.
+ (profile_probability::operator/=): Likewise.
+ (profile_probability::apply_scale): Do not watch for overflow.
+ (profile_count::probability_in): Watch overflow.
+
+2025-09-26 Lulu Cheng <chenglulu@loongson.cn>
+
+ PR target/121875
+ * config/loongarch/loongarch.cc
+ (loongarch_can_inline_p): New function.
+ (TARGET_CAN_INLINE_P): Define.
+
2025-09-25 Gerald Pfeifer <gerald@pfeifer.com>
* doc/invoke.texi (Warning Options): Use "bitwise" over
diff --git a/gcc/DATESTAMP b/gcc/DATESTAMP
index 021949a..edfad19 100644
--- a/gcc/DATESTAMP
+++ b/gcc/DATESTAMP
@@ -1 +1 @@
-20250926
+20250927
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index 803b07d..bf15d94 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,3 +1,7 @@
+2025-09-26 Alejandro Colomar <alx@kernel.org>
+
+ * c.opt: Add -Wmultiple-parameter-fwd-decl-lists
+
2025-09-23 Alfie Richards <alfie.richards@arm.com>
* c-attribs.cc: Add support for target_version and target_clone mixing.
diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt
index 3f5e2f0..4fd8770 100644
--- a/gcc/c-family/c.opt
+++ b/gcc/c-family/c.opt
@@ -1086,6 +1086,10 @@ Wmultiple-inheritance
C++ ObjC++ Var(warn_multiple_inheritance) Warning
Warn on direct multiple inheritance.
+Wmultiple-parameter-fwd-decl-lists
+C ObjC Var(warn_multiple_parameter_fwd_decl_lists) Warning EnabledBy(Wextra)
+Warn for multiple lists of forward declarations of function parameters.
+
Wmultistatement-macros
C ObjC C++ ObjC++ Var(warn_multistatement_macros) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall)
Warn about unsafe macros expanding to multiple statements used as a body of a clause such as if, else, while, switch, or for.
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index 4e78008..ef985ba 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -1,3 +1,22 @@
+2025-09-26 Alejandro Colomar <alx@kernel.org>
+
+ * c-decl.cc (c_scope): Rename {warned > had}_forward_parm_decls.
+ (mark_forward_parm_decls): Add
+ -Wmultiple-parameter-fwd-decl-lists.
+
+2025-09-26 Joseph Myers <josmyers@redhat.com>
+
+ PR c/88642
+ * c-typeck.cc (constructor_braced_scalar): New variable.
+ (struct constructor_stack): Add braced_scalar field.
+ (really_start_incremental_init): Handle constructor_braced_scalar
+ and braced_scalar field.
+ (push_init_level): Handle constructor_braced_scalar and
+ braced_scalar field. Give permerror rather than warning for
+ nested braces around scalar initializer.
+ (pop_init_level): Handle constructor_braced_scalar and
+ braced_scalar field.
+
2025-09-24 Joseph Myers <josmyers@redhat.com>
* c-typeck.cc (really_atomic_lvalue): For a COMPOUND_LITERAL_EXPR,
diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc
index b122e82..7e4c7c2 100644
--- a/gcc/c/c-decl.cc
+++ b/gcc/c/c-decl.cc
@@ -504,10 +504,8 @@ struct GTY((chain_next ("%h.outer"))) c_scope {
if these appears in a function definition. */
BOOL_BITFIELD had_vla_unspec : 1;
- /* True if we already complained about forward parameter decls
- in this scope. This prevents double warnings on
- foo (int a; int b; ...) */
- BOOL_BITFIELD warned_forward_parm_decls : 1;
+ /* True if we parsed a list of forward parameter decls in this scope. */
+ BOOL_BITFIELD had_forward_parm_decls : 1;
/* True if this is the outermost block scope of a function body.
This scope contains the parameters, the local variables declared
@@ -6269,12 +6267,14 @@ mark_forward_parm_decls (void)
{
struct c_binding *b;
- if (pedantic && !current_scope->warned_forward_parm_decls)
- {
- pedwarn (input_location, OPT_Wpedantic,
- "ISO C forbids forward parameter declarations");
- current_scope->warned_forward_parm_decls = true;
- }
+ if (current_scope->had_forward_parm_decls)
+ warning_at (input_location, OPT_Wmultiple_parameter_fwd_decl_lists,
+ "more than one list of forward declarations of parameters");
+ if (pedantic && !current_scope->had_forward_parm_decls)
+ pedwarn (input_location, OPT_Wpedantic,
+ "ISO C forbids forward parameter declarations");
+
+ current_scope->had_forward_parm_decls = true;
for (b = current_scope->bindings; b; b = b->prev)
if (TREE_CODE (b->decl) == PARM_DECL)
diff --git a/gcc/config/mips/mips.cc b/gcc/config/mips/mips.cc
index 81eaa3c..fa9ac07 100644
--- a/gcc/config/mips/mips.cc
+++ b/gcc/config/mips/mips.cc
@@ -20419,6 +20419,16 @@ mips_option_override (void)
if (TARGET_MICROMIPS && TARGET_MIPS16)
error ("unsupported combination: %s", "-mips16 -mmicromips");
+ /* Make -mmips16e2 imply -mips16 and forbid its coexistence with
+ -mmicromips as the ASE requires. */
+ if (TARGET_MIPS16E2)
+ {
+ if (TARGET_MICROMIPS)
+ error ("unsupported combination: %s", "-mmips16e2 -mmicromips");
+
+ target_flags |= MASK_MIPS16;
+ }
+
/* Prohibit Paired-Single and MSA combination. This is software restriction
rather than architectural. */
if (ISA_HAS_MSA && TARGET_PAIRED_SINGLE_FLOAT)
@@ -20671,6 +20681,15 @@ mips_option_override (void)
"-mcompact-branches=never");
}
+ /* MIPS16* ASE is forbidden in Release 6, so -mips16 is not available
+ for MIPS R6 onwards. */
+ if ((mips_base_compression_flags & MASK_MIPS16) && mips_isa_rev >= 6)
+ error ("MIPS16* ASE is forbidden in Release 6");
+
+ /* Make sure that the user use Release[2,5] when using -mmips16e2. */
+ if (TARGET_MIPS16E2 && mips_isa_rev < 2)
+ error ("%<-mmips16e2%> requires Release[2,5]");
+
/* Require explicit relocs for MIPS R6 onwards. This enables simplification
of the compact branch and jump support through the backend. */
if (!TARGET_EXPLICIT_RELOCS && mips_isa_rev >= 6)
diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md
index aadf4dd..99654cc 100644
--- a/gcc/config/mips/mips.md
+++ b/gcc/config/mips/mips.md
@@ -2617,7 +2617,8 @@
(fma:ANYF (match_operand:ANYF 1 "register_operand")
(match_operand:ANYF 2 "register_operand")
(neg:ANYF (match_operand:ANYF 3 "register_operand"))))]
- "(ISA_HAS_FUSED_MADD3 || ISA_HAS_FUSED_MADD4)")
+ "(ISA_HAS_FUSED_MADD3 || ISA_HAS_FUSED_MADD4)
+ || ISA_HAS_FUSED_MADDF")
(define_insn "*fms<mode>4_msub3"
[(set (match_operand:ANYF 0 "register_operand" "=f")
@@ -2639,6 +2640,16 @@
[(set_attr "type" "fmadd")
(set_attr "mode" "<UNITMODE>")])
+(define_insn "*fms<mode>4_msubf"
+ [(set (match_operand:ANYF 0 "register_operand" "=f")
+ (fma:ANYF (match_operand:ANYF 1 "register_operand" "f")
+ (match_operand:ANYF 2 "register_operand" "f")
+ (neg:ANYF (match_operand:ANYF 3 "register_operand" "0"))))]
+ "ISA_HAS_FUSED_MADDF"
+ "msubf.<fmt>\t%0,%1,%2"
+ [(set_attr "type" "fmadd")
+ (set_attr "mode" "<UNITMODE>")])
+
;; fnma is defined in GCC as (fma (neg op1) op2 op3)
;; (-op1 * op2) + op3 ==> -(op1 * op2) + op3 ==> -((op1 * op2) - op3)
;; The mips nmsub instructions implement -((op1 * op2) - op3)
@@ -2650,8 +2661,9 @@
(fma:ANYF (neg:ANYF (match_operand:ANYF 1 "register_operand"))
(match_operand:ANYF 2 "register_operand")
(match_operand:ANYF 3 "register_operand")))]
- "(ISA_HAS_FUSED_MADD3 || ISA_HAS_FUSED_MADD4)
- && !HONOR_SIGNED_ZEROS (<MODE>mode)")
+ "((ISA_HAS_FUSED_MADD3 || ISA_HAS_FUSED_MADD4)
+ && !HONOR_SIGNED_ZEROS (<MODE>mode))
+ || ISA_HAS_FUSED_MADDF")
(define_insn "*fnma<mode>4_nmsub3"
[(set (match_operand:ANYF 0 "register_operand" "=f")
@@ -2673,6 +2685,16 @@
[(set_attr "type" "fmadd")
(set_attr "mode" "<UNITMODE>")])
+(define_insn "*fnma<mode>4_msubf"
+ [(set (match_operand:ANYF 0 "register_operand" "=f")
+ (fma:ANYF (neg:ANYF (match_operand:ANYF 1 "register_operand" "f"))
+ (match_operand:ANYF 2 "register_operand" "f")
+ (match_operand:ANYF 3 "register_operand" "0")))]
+ "ISA_HAS_FUSED_MADDF"
+ "msubf.<fmt>\t%0,%1,%2"
+ [(set_attr "type" "fmadd")
+ (set_attr "mode" "<UNITMODE>")])
+
;; fnms is defined as: (fma (neg op1) op2 (neg op3))
;; ((-op1) * op2) - op3 ==> -(op1 * op2) - op3 ==> -((op1 * op2) + op3)
;; The mips nmadd instructions implement -((op1 * op2) + op3)
diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index 06287f0..bd60d51 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -8927,8 +8927,9 @@ convert_template_argument (tree parm,
&& same_type_p (TREE_TYPE (orig_arg), t))
orig_arg = TREE_OPERAND (orig_arg, 0);
- if (!type_dependent_expression_p (orig_arg)
- && !uses_template_parms (t))
+ if (!uses_template_parms (t)
+ && !(force_conv ? uses_template_parms (orig_arg)
+ : type_dependent_expression_p (orig_arg)))
/* We used to call digest_init here. However, digest_init
will report errors, which we don't want when complain
is zero. More importantly, digest_init will try too
@@ -22330,7 +22331,8 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl)
if (r == NULL_TREE && TREE_CODE (t) == PARM_DECL)
{
/* We get here for a use of 'this' in an NSDMI. */
- if (DECL_NAME (t) == this_identifier && current_class_ptr)
+ if (DECL_NAME (t) == this_identifier && current_class_ptr
+ && !LAMBDA_TYPE_P (TREE_TYPE (TREE_TYPE (current_class_ptr))))
RETURN (current_class_ptr);
/* Parameters of non-templates map to themselves (e.g. in
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index 7f01f2c..384211f 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -670,16 +670,21 @@ tester (int len; char data[len][len], int len)
@end smallexample
@cindex parameter forward declaration
-The @samp{int len} before the semicolon is a @dfn{parameter forward
-declaration}, and it serves the purpose of making the name @code{len}
-known when the declaration of @code{data} is parsed.
-
-You can write any number of such parameter forward declarations in the
-parameter list. They can be separated by commas or semicolons, but the
-last one must end with a semicolon, which is followed by the ``real''
-parameter declarations. Each forward declaration must match a ``real''
-declaration in parameter name and data type. ISO C99 does not support
-parameter forward declarations.
+The @samp{int len} before the semicolon
+is a @dfn{parameter forward declaration},
+and it serves the purpose of making the name @code{len} known
+when the declaration of @code{data} is parsed.
+
+Lists of parameter forward declarations are terminated by semicolons,
+and parameter forward declarations are separated within such lists by commas,
+just like in the regular list of parameter declarations.
+
+You can write any number of lists of parameter forward declaration,
+but using more than one is unnecessary.
+The last semicolon is followed by the list of parameter declarations.
+Each parameter forward declaration must match
+a parameter declaration in parameter name and data type.
+ISO C99 does not support parameter forward declarations.
@node Zero Length
@subsection Arrays of Length Zero
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index cea83f6..99607a0 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -540,7 +540,9 @@ Objective-C and Objective-C++ Dialects}.
@gccoptlist{-Wbad-function-cast -Wdeprecated-non-prototype -Wfree-labels
-Wmissing-declarations -Wmissing-parameter-name -Wmissing-parameter-type
-Wdeclaration-missing-parameter-type -Wmissing-prototypes
--Wmissing-variable-declarations -Wnested-externs -Wold-style-declaration
+-Wmissing-variable-declarations
+-Wmultiple-parameter-fwd-decl-lists
+-Wnested-externs -Wold-style-declaration
-Wold-style-definition -Wstrict-prototypes -Wtraditional
-Wtraditional-conversion -Wdeclaration-after-statement -Wpointer-sign}
@@ -6683,6 +6685,7 @@ name is still supported, but the newer name is more descriptive.)
-Wmissing-parameter-name @r{(C/ObjC only)}
-Wmissing-parameter-type @r{(C/ObjC only)}
-Wold-style-declaration @r{(C/ObjC only)}
+-Wmultiple-parameter-fwd-decl-lists @r{(C/ObjC only)}
-Woverride-init @r{(C/ObjC only)}
-Wredundant-move @r{(C++ and Objective-C++ only)}
-Wshift-negative-value @r{(in C++11 to C++17 and in C99 and newer)}
@@ -10536,6 +10539,13 @@ is not considered an old-style definition in C23 mode, because it is
equivalent to @samp{(void)} in that case, but is considered an
old-style definition for older standards.
+@opindex Wmultiple-parameter-fwd-decl-lists
+@opindex Wno-multiple-parameter-fwd-decl-lists
+@item -Wmultiple-parameter-fwd-decl-lists @r{(C and Objective-C only)}
+Warn if more than one list of forward declarations of parameters
+appears in a function prototype.
+This warning is also enabled by @option{-Wextra}.
+
@opindex Wdeprecated-non-prototype
@opindex Wno-deprecated-non-prototype
@item -Wdeprecated-non-prototype @r{(C and Objective-C only)}
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 68842d6..4427f6a 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,12 @@
+2025-09-26 Harald Anlauf <anlauf@gcc.gnu.org>
+
+ PR fortran/122002
+ * decl.cc (gfc_get_pdt_instance): Initialize 'instance' to NULL
+ and set 'kind_value' to zero before calling gfc_extract_int.
+ * primary.cc (gfc_match_rvalue): Intitialize 'ctr_arglist' to
+ NULL and test for default values if gfc_get_pdt_instance
+ returns NULL.
+
2025-09-25 Harald Anlauf <anlauf@gmx.de>
PR fortran/121939
diff --git a/gcc/fortran/interface.cc b/gcc/fortran/interface.cc
index 41c9417..ef5a17d 100644
--- a/gcc/fortran/interface.cc
+++ b/gcc/fortran/interface.cc
@@ -1968,25 +1968,6 @@ check_interface0 (gfc_interface *p, const char *interface_name)
psave = p;
for (; p; p = p->next)
{
- if (p->sym->attr.vtab)
- {
- bool found = false;
- gfc_component *c = p->sym->ts.u.derived->components;
- for (; c; c = c->next)
- {
- if (c->name[0] == '_')
- continue;
- /* This check seems to be as much as can sensibly be done here.
- If there is more than one proc_pointer components, resolution
- of the call will select the right one. */
- if (c->attr.proc_pointer && c->ts.interface
- && (c->attr.subroutine || c->attr.function))
- found = true;
- }
- if (found)
- continue;
- }
-
/* Make sure all symbols in the interface have been defined as
functions or subroutines. */
if (((!p->sym->attr.function && !p->sym->attr.subroutine)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 16403e2..0642410 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,27 @@
+2025-09-26 Alejandro Colomar <alx@kernel.org>
+
+ * gcc.dg/Wmultiple-parameter-fwd-decl-lists.c: New test.
+
+2025-09-26 Harald Anlauf <anlauf@gmx.de>
+
+ * gfortran.dg/pdt_48.f03:
+
+2025-09-26 Joseph Myers <josmyers@redhat.com>
+
+ PR c/88642
+ * gcc.dg/c2y-init-1.c: New test.
+
+2025-09-26 Lulu Cheng <chenglulu@loongson.cn>
+
+ PR target/121875
+ * gcc.target/loongarch/can_inline_1.c: New test.
+ * gcc.target/loongarch/can_inline_2.c: New test.
+ * gcc.target/loongarch/can_inline_3.c: New test.
+ * gcc.target/loongarch/can_inline_4.c: New test.
+ * gcc.target/loongarch/can_inline_5.c: New test.
+ * gcc.target/loongarch/can_inline_6.c: New test.
+ * gcc.target/loongarch/pr121875.c: New test.
+
2025-09-25 Harald Anlauf <anlauf@gmx.de>
PR fortran/121939
diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-this6.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-this6.C
new file mode 100644
index 0000000..8bbff1d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-this6.C
@@ -0,0 +1,8 @@
+// PR c++/122048
+// { dg-do compile { target c++14 } }
+
+class X {
+ void f();
+ int i;
+};
+void X::f() {[&](auto) {sizeof i;}(1);}
diff --git a/gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda19.C b/gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda19.C
new file mode 100644
index 0000000..bbf295c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda19.C
@@ -0,0 +1,15 @@
+// PR c++/121854
+// { dg-do compile { target c++23 } }
+
+struct S
+{
+ static void static_func(){}
+
+ void func()
+ {
+ auto lambda = [](this auto)
+ {
+ static_func();
+ };
+ }
+};
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-conv4.C b/gcc/testsuite/g++.dg/cpp2a/concepts-conv4.C
new file mode 100644
index 0000000..107a1bb
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts-conv4.C
@@ -0,0 +1,9 @@
+// PR c++/112632
+// { dg-do compile { target c++20 } }
+
+template<int N> concept A = N != 0;
+template<char C> concept B = A<C>;
+template<int N> concept C = B<N>;
+
+static_assert(A<256>);
+static_assert(!C<256>);
diff --git a/gcc/testsuite/gcc.dg/Wmultiple-parameter-fwd-decl-lists.c b/gcc/testsuite/gcc.dg/Wmultiple-parameter-fwd-decl-lists.c
new file mode 100644
index 0000000..c3edbf6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/Wmultiple-parameter-fwd-decl-lists.c
@@ -0,0 +1,6 @@
+/* { dg-do compile } */
+/* { dg-options "-Wmultiple-parameter-fwd-decl-lists" } */
+
+void f(int n, int m; int n, int m);
+void g(int n; int m; int n, int m); /* { dg-warning "more than one list of forward declarations" } */
+void h(int n; int n; int n); /* { dg-warning "more than one list of forward declarations" } */
diff --git a/gcc/testsuite/gcc.target/mips/mips-msubf.c b/gcc/testsuite/gcc.target/mips/mips-msubf.c
new file mode 100644
index 0000000..424ca21
--- /dev/null
+++ b/gcc/testsuite/gcc.target/mips/mips-msubf.c
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-options "-mhard-float -ffast-math -march=mips32r6" } */
+/* { dg-skip-if "code quality test" { *-*-* } { "-O0" "-O1" } { "" } } */
+/* { dg-final { scan-assembler-times "\tmsubf\\.s\t" 2 } } */
+/* { dg-final { scan-assembler-times "\tmsubf\\.d\t" 2 } } */
+
+NOMIPS16 float
+test01 (float x, float y, float z)
+{
+ return x - (y * z);
+}
+
+NOMIPS16 double
+test02 (double x, double y, double z)
+{
+ return x - (y * z);
+}
+
+NOMIPS16 float
+test03 (float x, float y, float z)
+{
+ return (y * z) - x;
+}
+
+NOMIPS16 double
+test04 (double x, double y, double z)
+{
+ return (y * z) - x;
+}
+
+
diff --git a/gcc/testsuite/gcc.target/mips/mips16e2-cache.c b/gcc/testsuite/gcc.target/mips/mips16e2-cache.c
index dcc39b5..8caacb1 100644
--- a/gcc/testsuite/gcc.target/mips/mips16e2-cache.c
+++ b/gcc/testsuite/gcc.target/mips/mips16e2-cache.c
@@ -1,4 +1,4 @@
-/* { dg-options "-mno-abicalls -mgpopt -G8 -mabi=32 -mips32r2 -mips16 -mmips16e2" } */
+/* { dg-options "-mno-abicalls -mgpopt -G8 -mabi=32 isa_rev>=2 -mmips16e2" } */
/* { dg-skip-if "naming registers makes this a code quality test" { *-*-* } { "-O0" } { "" } } */
/* Test cache. */
diff --git a/gcc/testsuite/gcc.target/mips/mips16e2-cmov.c b/gcc/testsuite/gcc.target/mips/mips16e2-cmov.c
index 129ea23..a8a28a4 100644
--- a/gcc/testsuite/gcc.target/mips/mips16e2-cmov.c
+++ b/gcc/testsuite/gcc.target/mips/mips16e2-cmov.c
@@ -1,4 +1,4 @@
-/* { dg-options "-mno-abicalls -mgpopt -G8 -mabi=32 -mips16 -mmips16e2 -mbranch-cost=2" } */
+/* { dg-options "-mno-abicalls -mgpopt -G8 -mabi=32 isa_rev>=2 -mmips16e2 -mbranch-cost=2" } */
/* { dg-skip-if "code quality test" { *-*-* } { "-O0" } { "" } } */
/* Test MOVN. */
diff --git a/gcc/testsuite/gcc.target/mips/mips16e2-gp.c b/gcc/testsuite/gcc.target/mips/mips16e2-gp.c
index 7955472..70d6230 100644
--- a/gcc/testsuite/gcc.target/mips/mips16e2-gp.c
+++ b/gcc/testsuite/gcc.target/mips/mips16e2-gp.c
@@ -1,4 +1,4 @@
-/* { dg-options "-mno-abicalls -mgpopt -G8 -mabi=32 -mips16 -mmips16e2" } */
+/* { dg-options "-mno-abicalls -mgpopt -G8 -mabi=32 isa_rev>=2 -mmips16e2" } */
/* { dg-skip-if "per-function expected output" { *-*-* } { "-flto" } { "" } } */
/* Generate GP-relative ADDIU. */
diff --git a/gcc/testsuite/gcc.target/mips/mips16e2.c b/gcc/testsuite/gcc.target/mips/mips16e2.c
index 166aa74..1b4b840 100644
--- a/gcc/testsuite/gcc.target/mips/mips16e2.c
+++ b/gcc/testsuite/gcc.target/mips/mips16e2.c
@@ -1,4 +1,4 @@
-/* { dg-options "-mno-abicalls -mgpopt -G8 -mabi=32 -mips16 -mmips16e2" } */
+/* { dg-options "-mno-abicalls -mgpopt -G8 -mabi=32 isa_rev>=2 -mmips16e2" } */
/* { dg-skip-if "per-function expected output" { *-*-* } { "-flto" } { "" } } */
/* ANDI is a two operand instruction. Hence, it won't be generated if src and
diff --git a/gcc/testsuite/gfortran.dg/pr87908.f90 b/gcc/testsuite/gfortran.dg/pr87908.f90
deleted file mode 100644
index 6fdc109..0000000
--- a/gcc/testsuite/gfortran.dg/pr87908.f90
+++ /dev/null
@@ -1,49 +0,0 @@
-! { dg-do run }
-!
-! Check the fix for pr87908, which used to fail with error:
-! Procedure ‘__vtab_m_T’ in generic interface '_dtio_formatted_read' at (1) is
-! neither function nor subroutine.
-!
-! Contributed by David Bolvansky <david.bolvansky@gmail.com>
-!
-module m
- type t
- character(34) :: c
- contains
- procedure :: g
- generic :: read(formatted) => g
- end type
- integer :: ctr = 0
-contains
- subroutine s (unit, x)
- integer, intent(in) :: unit
- integer, intent(in) :: x(:)
- interface read(formatted)
- procedure g
- end interface
- end
- subroutine g (dtv, unit, iotype, v_list, iostat, iomsg)
- class(t), intent(inout) :: dtv
- integer, intent(in) :: unit
- character(*), intent(in) :: iotype
- integer, intent(in) :: v_list(:)
- integer, intent(out) :: iostat
- character(*), intent(inout) :: iomsg
- read (unit, '(a)', iostat=iostat, iomsg=iomsg) dtv%c
- ctr = ctr + 1
- end
-end
-
- use m
- type(t) :: x
- open (10, status = 'scratch')
- write(10, fmt=*) "Mary had a little lamb "
- write(10, fmt=*) "whose fleece was as white as gold "
- rewind(10)
- read(10, fmt=*) x
- if (trim(x%c) /= "Mary had a little lamb") stop 1
- read(10, fmt=*) x
- if (trim(x%c) /= "whose fleece was as white as gold") stop 2
- close(10)
- if (ctr /= 2) stop 3
-end
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index a3ee448..b27c82c 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,79 @@
+2025-09-26 Jonathan Wakely <jwakely@redhat.com>
+
+ * include/bits/stl_algobase.h (__search, __is_permutation):
+ Reuse predicate instead of creating a new one each time.
+ * include/bits/stl_algo.h (__is_permutation): Likewise.
+
+2025-09-26 Jonathan Wakely <jwakely@redhat.com>
+
+ * include/std/deque (erase_if): Move predicate instead of
+ wrapping with std::ref.
+ (erase): Forward to erase_if.
+ * include/std/inplace_vector (erase_if, erase): Likewise.
+ * include/std/string (erase_if, erase): Likewise.
+ * include/std/vector (erase_if, erase): Likewise.
+
+2025-09-26 Jonathan Wakely <jwakely@redhat.com>
+
+ * include/bits/predefined_ops.h (equal_to, less): Define aliases
+ for std::equal_to<void> and std::less<void>.
+ (bind1st, bind2nd, not1, __equal_to): New object generator
+ functions for adapting predicates.
+ (__iter_less_iter, __iter_less_val, __iter_comp_val)
+ (__val_less_iter, __val_comp_iter, __iter_equal_to_iter)
+ (__iter_equal_to_val, __iter_comp_iter, __negate): Remove all
+ object generator functions and the class templates they return.
+ * include/bits/stl_algo.h (__move_median_to_first, __find_if_not)
+ (__find_if_not_n, __search_n_aux, find_end, find_if_not)
+ (__remove_copy_if, remove_copy, remove_copy_if, remove)
+ (remove_if, __adjacent_find, __unique, unique, __unique_copy)
+ (__unique_copy_1, __stable_partition_adaptive, stable_partition)
+ (__heap_select, __partial_sort_copy, partial_sort_copy)
+ (__unguarded_linear_insert, __insertion_sort)
+ (__unguarded_insertion_sort, __unguarded_partition)
+ (lower_bound, __upper_bound, upper_bound, __equal_range)
+ (equal_range, binary_search, __move_merge_adaptive)
+ (__move_merge_adaptive_backward, __merge_adaptive_resize)
+ (__merge_without_buffer, inplace_merge, __move_merge)
+ (__includes, includes, __next_permutation, next_permutation)
+ (__prev_permutation, prev_permutation, __replace_copy_if)
+ (replace_copy, replace_copy_if, __is_sorted_until)
+ (is_sorted_until, __minmax_element, minmax_element, minmax)
+ (is_permutation, __is_permutation, find, find_if, adjacent_find)
+ (count, count_if, search, search_n, unique_copy, partial_sort)
+ (nth_element, sort, __merge, merge, stable_sort, __set_union)
+ (set_union, __set_intersection, set_intersection)
+ (__set_difference, set_difference, __set_symmetric_difference)
+ (set_symmetric_difference, __min_element, min_element)
+ (__max_element, max_element, min, max): Use direct predicates
+ instead of __iter_equal_to_iter, __iter_comp_iter, and
+ __iter_less_iter, __negate etc. Dereference iterators when
+ invoking predicates.
+ * include/bits/stl_algobase.h (__lexicographical_compare_impl)
+ (__lexicographical_compare::__lc, __lower_bound, lower_bound)
+ (lexicographical_compare, __mismatch, mismatch, __find_if)
+ (__count_if, __remove_if, __search, __is_permutation)
+ (is_permutation, search): Likewise.
+ * include/bits/stl_function.h (equal_to<void>, less<void>):
+ Define transparent comparison functions for C++98 and C++11.
+ * include/bits/stl_heap.h (__is_heap_until, __is_heap)
+ (__push_heap, push_heap, __adjust_heap, pop_heap, make_heap)
+ (sort_heap, is_heap_until, is_heap): Likewise.
+ * include/std/deque (erase_if): Remove call to __pred_iter.
+ (erase): Replace __iter_equals_val with __equal_to.
+ * include/std/inplace_vector (erase_if, erase): Likewise.
+ * include/std/string (erase_if, erase): Likewise.
+ * include/std/vector (erase_if, erase): Likewise.
+
+2025-09-26 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/122062
+ * include/bits/random.tcc (__detail::__normalize): Use void cast
+ for operands of comma operator.
+ (piecewise_linear_distribution): Likewise.
+ * testsuite/26_numerics/random/piecewise_linear_distribution/cons/122062.cc:
+ New test.
+
2025-09-25 Luc Grosheintz <luc.grosheintz@gmail.com>
* include/std/mdspan (__static_quotient): New overload.