commit: f6bd42a6cd7c3b5f94521de22765b50159531e8b Author: Sam James <sam <AT> gentoo <DOT> org> AuthorDate: Sun Jan 12 18:53:17 2025 +0000 Commit: Sam James <sam <AT> gentoo <DOT> org> CommitDate: Sun Jan 12 18:53:49 2025 +0000 URL: https://gitweb.gentoo.org/proj/gcc-patches.git/commit/?id=f6bd42a6
15.0.0: drop upstream 77_all_PR118112-c-c-UX-improvements-to-too-few-many-arguments-errors.patch Now upstream. Signed-off-by: Sam James <sam <AT> gentoo.org> ...ovements-to-too-few-many-arguments-errors.patch | 791 --------------------- 15.0.0/gentoo/README.history | 1 + 2 files changed, 1 insertion(+), 791 deletions(-) diff --git a/15.0.0/gentoo/77_all_PR118112-c-c-UX-improvements-to-too-few-many-arguments-errors.patch b/15.0.0/gentoo/77_all_PR118112-c-c-UX-improvements-to-too-few-many-arguments-errors.patch deleted file mode 100644 index b1e83b5..0000000 --- a/15.0.0/gentoo/77_all_PR118112-c-c-UX-improvements-to-too-few-many-arguments-errors.patch +++ /dev/null @@ -1,791 +0,0 @@ -https://inbox.sourceware.org/gcc-patches/f34fdf57159821af93c7da1643edfa4796a77ad4.ca...@redhat.com/#t - -From 595638c60e39f513301e34afdf14b04247634838 Mon Sep 17 00:00:00 2001 -Message-ID: <595638c60e39f513301e34afdf14b04247634838.1736599921.git....@gentoo.org> -From: David Malcolm <dmalc...@redhat.com> -Date: Fri, 10 Jan 2025 13:47:43 -0500 -Subject: [PATCH] c/c++: UX improvements to 'too {few,many} arguments' errors - [PR118112] -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -On Thu, 2025-01-09 at 22:28 -0500, David Malcolm wrote: -> On Thu, 2025-01-09 at 21:15 -0500, Jason Merrill wrote: -> > On 1/9/25 7:00 PM, David Malcolm wrote: -> > > On Thu, 2025-01-09 at 14:21 -0500, Jason Merrill wrote: -> > > -> > > Thanks for taking a look... -> > > -> > > > > On 1/9/25 2:11 PM, David Malcolm wrote: -> > > > > -> > > > > @@ -4743,7 +4769,38 @@ convert_arguments (tree typelist, -> > > > > vec<tree, -> > > > > va_gc> **values, tree fndecl, -> > > > > if (typetail && typetail != void_list_node) -> > > > > { -> > > > > if (complain & tf_error) -> > > > > - error_args_num (input_location, fndecl, -> > > > > /*too_many_p=*/false); -> > > > > + { -> > > > > + /* Not enough args. -> > > > > + Determine minimum number of arguments -> > > > > required. */ -> > > > > + int min_expected_num = 0; -> > > > > + bool at_least_p = false; -> > > > > + tree iter = typelist; -> > > > > + while (true) -> > > > > + { -> > > > > + if (!iter) -> > > > > + { -> > > > > + /* Variadic arguments; stop -> > > > > iterating. -> > > > > */ -> > > > > + at_least_p = true; -> > > > > + break; -> > > > > + } -> > > > > + if (iter == void_list_node) -> > > > > + /* End of arguments; stop iterating. */ -> > > > > + break; -> > > > > + if (fndecl && TREE_PURPOSE (iter) -> > > > > + && TREE_CODE (TREE_PURPOSE (iter)) != -> > > > > DEFERRED_PARSE) -> > > > > -> > > > -> > > > Why are you checking DEFERRED_PARSE? That indicates a default -> > > > argument, -> > > > even if it isn't parsed yet. For that case we should get the -> > > > error -> > > > in -> > > > convert_default_arg rather than pretend there's no default -> > > > argument. -> > > -> > > I confess that the check for DEFERRED_PARSE was a rather mindless -> > > copy -> > > and paste by me from the "See if there are default arguments that -> > > can be -> > > used" logic earlier in the function. -> > > -> > > I've removed it in the latest version of the patch. -> > > -> > > > > + { -> > > > > + /* Found a default argument; skip this -> > > > > one when -> > > > > + counting minimum required. */ -> > > > > + at_least_p = true; -> > > > > + iter = TREE_CHAIN (iter); -> > > > > + continue; -> > > > -> > > > We could break here, once you have a default arg the rest of -> > > > the -> > > > parms -> > > > need to have them as well. -> > > -> > > Indeed; I've updated this in the latest version of the patch, so -> > > we break out as soon as we see an arg with a non-null -> > > TREE_PURPOSE. -> > > -> > > > -> > > > > + } -> > > > > + ++min_expected_num; -> > > > > + iter = TREE_CHAIN (iter); -> > > > > + } -> > > > > + error_args_num (input_location, fndecl, -> > > > > + min_expected_num, actual_num, -> > > > > at_least_p); -> > > > > + } -> > > > > return -1; -> > > > > } -> > > -> > > Here's a v3 version of the patch, which is currently going -> > > through -> > > my tester. -> > > -> > > OK for trunk if it passes bootstrap®rtesting? -> > -> > OK. -> -> Thanks. However, it turns out that I may have misspoke, and the v2 -> patch might have been the correct approach: if we bail out on the -> first -> arg with a TREE_PURPOSE then in -> gcc/testsuite/g++.dg/cpp0x/variadic169.C -> -> 1 │ // DR 2233 -> 2 │ // { dg-do compile { target c++11 } } -> 3 │ -> 4 │ template<typename ...T> void f(int n = 0, T ...t); -> 5 │ -> 6 │ int main() -> 7 │ { -> 8 │ f<int>(); // { dg-error "too few arguments to -> function '\[^\n\r\]*'; expected at least 1, have 0" } -> 9 │ } -> -> we instead emit the nonsensical "expected at least 0, have 0": -> -> error: too few arguments to function ‘void f(int, T ...) [with T = -> {int}]’; expected at least 0, have 0 -> 8 | f<int>(); // { dg-error "too few -> arguments to function '\[^\n\r\]*'; expected at least 1, have 0" } -> | ~~~~~~^~ -> ../../src/gcc/testsuite/g++.dg/cpp0x/variadic169.C:4:30: note: -> declared -> here -> 4 | template<typename ...T> void f(int n = 0, T ...t); -> | ^ -> -> whereas with the v2 patch we count the trailing arg after the default -> arg, and we emit "expected at least 1, have 0", which seems correct -> to -> me. -> -> I'm testing a version of the patch that continues to iterate after a -> TREE_PURPOSE (as v2, but but dropping the check on DEFERRED_PARSE). -> -> Thanks -> Dave - -Hi Jason - -Here's an updated version of the patch which drops the check on -DEFERRED_PARSE, but continues to iterate on TREE_PURPOSE, for dealing -with the case of explicit template args where default args are followed -by missing mandatory args (the code above mentions DR777, so I -referenced that). - -Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu. - -Are the C++ parts OK for trunk? - -Thanks -Dave - -Consider this case of a bad call to a callback function (perhaps -due to C23 changing the meaning of () in function decls): - -struct p { - int (*bar)(); -}; - -void baz() { - struct p q; - q.bar(1); -} - -Before this patch the C frontend emits: - -t.c: In function 'baz': -t.c:7:5: error: too many arguments to function 'q.bar' - 7 | q.bar(1); - | ^ - -and the C++ frontend emits: - -t.c: In function 'void baz()': -t.c:7:10: error: too many arguments to function - 7 | q.bar(1); - | ~~~~~^~~ - -neither of which give the user much help in terms of knowing what -was expected, and where the relevant declaration is. - -With this patch the C frontend emits: - -t.c: In function 'baz': -t.c:7:5: error: too many arguments to function 'q.bar'; expected 0, have 1 - 7 | q.bar(1); - | ^ ~ -t.c:2:15: note: declared here - 2 | int (*bar)(); - | ^~~ - -(showing the expected vs actual counts, the pertinent field decl, and -underlining the first extraneous argument at the callsite) - -and the C++ frontend emits: - -t.c: In function 'void baz()': -t.c:7:10: error: too many arguments to function; expected 0, have 1 - 7 | q.bar(1); - | ~~~~~^~~ - -(showing the expected vs actual counts; the other data was not accessible -without a more invasive patch) - -Similarly, the patch also updates the "too few arguments" case to also -show expected vs actual counts. Doing so requires a tweak to the -wording to say "at least" for the case of variadic fns, and for C++ fns -with default args, where e.g. previously the C FE emitted: - -s.c: In function 'test': -s.c:5:3: error: too few arguments to function 'callee' - 5 | callee (); - | ^~~~~~ -s.c:1:6: note: declared here - 1 | void callee (const char *, ...); - | ^~~~~~ - -with this patch it emits: - -s.c: In function 'test': -s.c:5:3: error: too few arguments to function 'callee'; expected at least 1, have 0 - 5 | callee (); - | ^~~~~~ -s.c:1:6: note: declared here - 1 | void callee (const char *, ...); - | ^~~~~~ - -gcc/c/ChangeLog: - PR c/118112 - * c-typeck.cc (inform_declaration): Add "function_expr" param and - use it for cases where we couldn't show the function decl to show - field decls for callbacks. - (build_function_call_vec): Add missing auto_diagnostic_group. - Update for new param of inform_declaration. - (convert_arguments): Likewise. For the "too many arguments" case - add the expected vs actual counts to the message, and if we have - it, add the location_t of the first surplus param as a secondary - location within the diagnostic. For the "too few arguments" case, - determine the minimum number of arguments required and add the - expected vs actual counts to the message, tweaking it to "at least" - for variadic functions. - -gcc/cp/ChangeLog: - PR c/118112 - * typeck.cc (error_args_num): Add params "expected_num", - "actual_num", and "at_least_p". Compute "too_many_p" from these - rather than have it be a param. Add expected vs actual counts to - the messages and tweak them for the "at least" case. - (convert_arguments): Update calls to error_args_num to pass in - expected vs actual number, and the "at_least_p", determining this - for the "too few" case. - -gcc/testsuite/ChangeLog: - PR c/118112 - * c-c++-common/too-few-arguments.c: New test. - * c-c++-common/too-many-arguments.c: New test. - * g++.dg/cpp0x/variadic169.C: Verify the reported expected vs - actual argument counts. - * g++.dg/modules/macloc-1_c.C: Update regexp for addition of param - counts to error message. - * g++.dg/modules/macloc-1_d.C: Likewise. - -Signed-off-by: David Malcolm <dmalc...@redhat.com> ---- - gcc/c/c-typeck.cc | 77 +++++++++++-- - gcc/cp/typeck.cc | 104 ++++++++++++++---- - .../c-c++-common/too-few-arguments.c | 38 +++++++ - .../c-c++-common/too-many-arguments.c | 96 ++++++++++++++++ - gcc/testsuite/g++.dg/cpp0x/variadic169.C | 2 +- - gcc/testsuite/g++.dg/modules/macloc-1_c.C | 4 +- - gcc/testsuite/g++.dg/modules/macloc-1_d.C | 4 +- - 7 files changed, 287 insertions(+), 38 deletions(-) - create mode 100644 gcc/testsuite/c-c++-common/too-few-arguments.c - create mode 100644 gcc/testsuite/c-c++-common/too-many-arguments.c - -diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc -index 6e40f7edf02a..cd9290160d7a 100644 ---- a/gcc/c/c-typeck.cc -+++ b/gcc/c/c-typeck.cc -@@ -3737,14 +3737,30 @@ build_function_call (location_t loc, tree function, tree params) - return ret; - } - --/* Give a note about the location of the declaration of DECL. */ -+/* Give a note about the location of the declaration of DECL, -+ or, failing that, a pertinent declaration for FUNCTION_EXPR. */ - - static void --inform_declaration (tree decl) -+inform_declaration (tree decl, tree function_expr) - { - if (decl && (TREE_CODE (decl) != FUNCTION_DECL - || !DECL_IS_UNDECLARED_BUILTIN (decl))) - inform (DECL_SOURCE_LOCATION (decl), "declared here"); -+ else if (function_expr) -+ switch (TREE_CODE (function_expr)) -+ { -+ default: -+ break; -+ case COMPONENT_REF: -+ /* Show the decl of the pertinent field (e.g. for callback -+ fields in a struct. */ -+ { -+ tree field_decl = TREE_OPERAND (function_expr, 1); -+ if (location_t loc = DECL_SOURCE_LOCATION (field_decl)) -+ inform (loc, "declared here"); -+ } -+ break; -+ } - } - - /* C implementation of callback for use when checking param types. */ -@@ -3819,10 +3835,11 @@ build_function_call_vec (location_t loc, vec<location_t> arg_loc, - function); - else if (DECL_P (function)) - { -+ auto_diagnostic_group d; - error_at (loc, - "called object %qD is not a function or function pointer", - function); -- inform_declaration (function); -+ inform_declaration (function, NULL_TREE); - } - else - error_at (loc, -@@ -4276,25 +4293,37 @@ convert_arguments (location_t loc, vec<location_t> arg_loc, tree fntype, - - if (type == void_type_node) - { -+ auto_diagnostic_group d; -+ int num_expected = parmnum; -+ int num_actual = values->length (); -+ gcc_rich_location rich_loc (loc); -+ if (ploc != input_location) -+ rich_loc.add_range (ploc); - if (selector) -- error_at (loc, "too many arguments to method %qE", selector); -+ error_at (&rich_loc, -+ "too many arguments to method %qE; expected %i, have %i", -+ selector, num_expected, num_actual); - else -- error_at (loc, "too many arguments to function %qE", function); -- inform_declaration (fundecl); -+ error_at (&rich_loc, -+ "too many arguments to function %qE; expected %i, have %i", -+ function, num_expected, num_actual); -+ inform_declaration (fundecl, function); - return error_args ? -1 : (int) parmnum; - } - - if (builtin_type == void_type_node) - { -+ auto_diagnostic_group d; - if (warning_at (loc, OPT_Wbuiltin_declaration_mismatch, - "too many arguments to built-in function %qE " - "expecting %d", function, parmnum)) -- inform_declaration (fundecl); -+ inform_declaration (fundecl, function); - builtin_typetail = NULL_TREE; - } - - if (!typetail && parmnum == 0 && !TYPE_NO_NAMED_ARGS_STDARG_P (fntype)) - { -+ auto_diagnostic_group d; - bool warned; - if (selector) - warned = warning_at (loc, OPT_Wdeprecated_non_prototype, -@@ -4307,7 +4336,7 @@ convert_arguments (location_t loc, vec<location_t> arg_loc, tree fntype, - " for function %qE declared without parameters", - function); - if (warned) -- inform_declaration (fundecl); -+ inform_declaration (fundecl, function); - } - - if (selector && argnum > 2) -@@ -4437,8 +4466,33 @@ convert_arguments (location_t loc, vec<location_t> arg_loc, tree fntype, - - if (typetail != NULL_TREE && TREE_VALUE (typetail) != void_type_node) - { -- error_at (loc, "too few arguments to function %qE", function); -- inform_declaration (fundecl); -+ /* Not enough args. -+ Determine minimum number of arguments required. */ -+ int min_expected_num = 0; -+ bool at_least_p = false; -+ tree iter = typelist; -+ while (true) -+ { -+ if (!iter) -+ { -+ /* Variadic arguments; stop iterating. */ -+ at_least_p = true; -+ break; -+ } -+ if (iter == void_list_node) -+ /* End of arguments; stop iterating. */ -+ break; -+ ++min_expected_num; -+ iter = TREE_CHAIN (iter); -+ } -+ auto_diagnostic_group d; -+ int actual_num = vec_safe_length (values); -+ error_at (loc, -+ at_least_p -+ ? G_("too few arguments to function %qE; expected at least %i, have %i") -+ : G_("too few arguments to function %qE; expected %i, have %i"), -+ function, min_expected_num, actual_num); -+ inform_declaration (fundecl, function); - return -1; - } - -@@ -4448,10 +4502,11 @@ convert_arguments (location_t loc, vec<location_t> arg_loc, tree fntype, - for (tree t = builtin_typetail; t; t = TREE_CHAIN (t)) - ++nargs; - -+ auto_diagnostic_group d; - if (warning_at (loc, OPT_Wbuiltin_declaration_mismatch, - "too few arguments to built-in function %qE " - "expecting %u", function, nargs - 1)) -- inform_declaration (fundecl); -+ inform_declaration (fundecl, function); - } - - return error_args ? -1 : (int) parmnum; -diff --git a/gcc/cp/typeck.cc b/gcc/cp/typeck.cc -index 3e0d71102abd..a8580eddd397 100644 ---- a/gcc/cp/typeck.cc -+++ b/gcc/cp/typeck.cc -@@ -59,7 +59,7 @@ static tree get_delta_difference (tree, tree, bool, bool, tsubst_flags_t); - static void casts_away_constness_r (tree *, tree *, tsubst_flags_t); - static bool casts_away_constness (tree, tree, tsubst_flags_t); - static bool maybe_warn_about_returning_address_of_local (tree, location_t = UNKNOWN_LOCATION); --static void error_args_num (location_t, tree, bool); -+static void error_args_num (location_t, tree, int, int, bool); - static int convert_arguments (tree, vec<tree, va_gc> **, tree, int, - tsubst_flags_t); - static bool is_std_move_p (tree); -@@ -4535,11 +4535,19 @@ cp_build_function_call_vec (tree function, vec<tree, va_gc> **params, - } - - /* Subroutine of convert_arguments. -- Print an error message about a wrong number of arguments. */ -+ Print an error message about a wrong number of arguments. -+ If AT_LEAST_P is true, then EXPECTED_NUM is the minimum number -+ of expected arguments, otherwise EXPECTED_NUM is the exact number -+ of expected arguments. -+ ACTUAL_NUM is the actual number of arguments that were explicitly -+ passed at the callsite (i.e. not counting default arguments). */ - - static void --error_args_num (location_t loc, tree fndecl, bool too_many_p) -+error_args_num (location_t loc, tree fndecl, int expected_num, int actual_num, -+ bool at_least_p) - { -+ gcc_assert (expected_num != actual_num); -+ const bool too_many_p = actual_num > expected_num; - if (fndecl) - { - auto_diagnostic_group d; -@@ -4550,22 +4558,28 @@ error_args_num (location_t loc, tree fndecl, bool too_many_p) - == DECL_NAME (TYPE_NAME (DECL_CONTEXT (fndecl))))) - error_at (loc, - too_many_p -- ? G_("too many arguments to constructor %q#D") -- : G_("too few arguments to constructor %q#D"), -- fndecl); -+ ? G_("too many arguments to constructor %q#D; expected %i, have %i") -+ : (at_least_p -+ ? G_("too few arguments to constructor %q#D; expected at least %i, have %i") -+ : G_("too few arguments to constructor %q#D; expected %i, have %i")), -+ fndecl, expected_num, actual_num); - else - error_at (loc, - too_many_p -- ? G_("too many arguments to member function %q#D") -- : G_("too few arguments to member function %q#D"), -- fndecl); -+ ? G_("too many arguments to member function %q#D; expected %i, have %i") -+ : (at_least_p -+ ? G_("too few arguments to member function %q#D; expected at least %i, have %i") -+ : G_("too few arguments to member function %q#D; expected %i, have %i")), -+ fndecl, expected_num, actual_num); - } - else - error_at (loc, - too_many_p -- ? G_("too many arguments to function %q#D") -- : G_("too few arguments to function %q#D"), -- fndecl); -+ ? G_("too many arguments to function %q#D; expected %i, have %i") -+ : (at_least_p -+ ? G_("too few arguments to function %q#D; expected at least %i, have %i") -+ : G_("too few arguments to function %q#D; expected %i, have %i")), -+ fndecl, expected_num, actual_num); - if (!DECL_IS_UNDECLARED_BUILTIN (fndecl)) - inform (DECL_SOURCE_LOCATION (fndecl), "declared here"); - } -@@ -4574,12 +4588,19 @@ error_args_num (location_t loc, tree fndecl, bool too_many_p) - if (c_dialect_objc () && objc_message_selector ()) - error_at (loc, - too_many_p -- ? G_("too many arguments to method %q#D") -- : G_("too few arguments to method %q#D"), -- objc_message_selector ()); -+ ? G_("too many arguments to method %q#D; expected %i, have %i") -+ : (at_least_p -+ ? G_("too few arguments to method %q#D; expected at least %i, have %i") -+ : G_("too few arguments to method %q#D; expected %i, have %i")), -+ objc_message_selector (), expected_num, actual_num); - else -- error_at (loc, too_many_p ? G_("too many arguments to function") -- : G_("too few arguments to function")); -+ error_at (loc, -+ too_many_p -+ ? G_("too many arguments to function; expected %i, have %i") -+ : (at_least_p -+ ? G_("too few arguments to function; expected at least %i, have %i") -+ : G_("too few arguments to function; expected %i, have %i")), -+ expected_num, actual_num); - } - } - -@@ -4609,9 +4630,11 @@ convert_arguments (tree typelist, vec<tree, va_gc> **values, tree fndecl, - /* Argument passing is always copy-initialization. */ - flags |= LOOKUP_ONLYCONVERTING; - -- for (i = 0, typetail = typelist; -- i < vec_safe_length (*values); -- i++) -+ /* Preserve actual number of arguments passed (without counting default -+ args), in case we need to complain about too many/few. */ -+ const unsigned actual_num = vec_safe_length (*values); -+ -+ for (i = 0, typetail = typelist; i < actual_num; i++) - { - tree type = typetail ? TREE_VALUE (typetail) : 0; - tree val = (**values)[i]; -@@ -4623,7 +4646,10 @@ convert_arguments (tree typelist, vec<tree, va_gc> **values, tree fndecl, - { - if (complain & tf_error) - { -- error_args_num (input_location, fndecl, /*too_many_p=*/true); -+ /* Too many args. */ -+ error_args_num (input_location, fndecl, -+ /*expected_num=*/i, actual_num, -+ /*at_least_p=*/false); - return i; - } - else -@@ -4745,7 +4771,41 @@ convert_arguments (tree typelist, vec<tree, va_gc> **values, tree fndecl, - if (typetail && typetail != void_list_node) - { - if (complain & tf_error) -- error_args_num (input_location, fndecl, /*too_many_p=*/false); -+ { -+ /* Not enough args. -+ Determine minimum number of arguments required. */ -+ int min_expected_num = 0; -+ bool at_least_p = false; -+ tree iter = typelist; -+ while (true) -+ { -+ if (!iter) -+ { -+ /* Variadic arguments; stop iterating. */ -+ at_least_p = true; -+ break; -+ } -+ if (iter == void_list_node) -+ /* End of arguments; stop iterating. */ -+ break; -+ if (fndecl && TREE_PURPOSE (iter)) -+ { -+ /* Found a default argument; skip this one when -+ counting minimum required, but there might -+ be non-default arguments left to count: -+ after DR777, with explicit template args we can -+ end up with a default argument followed by -+ no default argument. */ -+ at_least_p = true; -+ iter = TREE_CHAIN (iter); -+ continue; -+ } -+ ++min_expected_num; -+ iter = TREE_CHAIN (iter); -+ } -+ error_args_num (input_location, fndecl, -+ min_expected_num, actual_num, at_least_p); -+ } - return -1; - } - } -diff --git a/gcc/testsuite/c-c++-common/too-few-arguments.c b/gcc/testsuite/c-c++-common/too-few-arguments.c -new file mode 100644 -index 000000000000..633dccfeaf24 ---- /dev/null -+++ b/gcc/testsuite/c-c++-common/too-few-arguments.c -@@ -0,0 +1,38 @@ -+extern void fn_a (void); -+extern void fn_b (int); /* { dg-message "declared here" } */ -+extern void fn_c (int, int); /* { dg-message "declared here" } */ -+#ifdef __cplusplus -+extern void fn_d (int, int=42); /* { dg-message "declared here" "" { target c++ } } */ -+extern void fn_e (int, int=42, int=1066); /* { dg-message "declared here" "" { target c++ } } */ -+#endif -+extern void fn_f (const char *, ...); /* { dg-message "declared here" } */ -+ -+void test_known_fn (void) -+{ -+ fn_a (); -+ fn_b (); /* { dg-error "too few arguments to function '\[^\n\r\]*'; expected 1, have 0" } */ -+ fn_c (42);/* { dg-error "too few arguments to function '\[^\n\r\]*'; expected 2, have 1" } */ -+#ifdef __cplusplus -+ fn_d (); /* { dg-error "too few arguments to function '\[^\n\r\]*'; expected at least 1, have 0" "" { target c++ } } */ -+ fn_e (); /* { dg-error "too few arguments to function '\[^\n\r\]*'; expected at least 1, have 0" "" { target c++ } } */ -+#endif -+ fn_f (); /* { dg-error "too few arguments to function '\[^\n\r\]*'; expected at least 1, have 0" } */ -+} -+ -+struct foo -+{ -+ void (*callback_a) (void); -+ void (*callback_b) (int); /* { dg-message "declared here" "" { target c } } */ -+ void (*callback_c) (int, int); /* { dg-message "declared here" "" { target c } } */ -+}; -+ -+void test_callback (struct foo *f) -+{ -+ f->callback_a (); -+ -+ f->callback_b (); /* { dg-error "too few arguments to function 'f->callback_b'; expected 1, have 0" "" { target c } } */ -+ /* { dg-error "too few arguments to function; expected 1, have 0" "" { target c++ } .-1 } */ -+ -+ f->callback_c (42); /* { dg-error "too few arguments to function 'f->callback_c'; expected 2, have 1" "" { target c } } */ -+ /* { dg-error "too few arguments to function; expected 2, have 1" "" { target c++ } .-1 } */ -+} -diff --git a/gcc/testsuite/c-c++-common/too-many-arguments.c b/gcc/testsuite/c-c++-common/too-many-arguments.c -new file mode 100644 -index 000000000000..7f9f8d4870bf ---- /dev/null -+++ b/gcc/testsuite/c-c++-common/too-many-arguments.c -@@ -0,0 +1,96 @@ -+/* For C, verify that the first excess param is underlined. -+ For C++ the calls location covers all the params, so we -+ can't underline individual params. */ -+/* { dg-additional-options "-fdiagnostics-show-caret" { target c } } */ -+ -+extern void fn_a (); /* { dg-message "declared here" } */ -+extern void fn_b (void); /* { dg-message "declared here" } */ -+extern void fn_c (int); /* { dg-message "declared here" } */ -+#ifdef __cplusplus -+extern void fn_d (int, int=42); /* { dg-message "declared here" "" { target c++ } } */ -+#endif -+ -+void test_known_fn (void) -+{ -+ fn_a (42); /* { dg-error "too many arguments to function 'fn_a'; expected 0, have 1" "" { target c } } */ -+ /* { dg-error "too many arguments to function 'void fn_a\\(\\)'; expected 0, have 1" "" { target c++ } .-1 } */ -+ /* { dg-begin-multiline-output "" } -+ fn_a (42); -+ ^~~~ ~~ -+ { dg-end-multiline-output "" { target c } } */ -+ /* { dg-begin-multiline-output "" } -+ extern void fn_a (); -+ ^~~~ -+ { dg-end-multiline-output "" { target c } } */ -+ -+ fn_b (1776); /* { dg-error "too many arguments to function 'fn_b'; expected 0, have 1" "" { target c } } */ -+ /* { dg-error "too many arguments to function 'void fn_b\\(\\)'; expected 0, have 1" "" { target c++ } .-1 } */ -+ /* { dg-begin-multiline-output "" } -+ fn_b (1776); -+ ^~~~ ~~~~ -+ { dg-end-multiline-output "" { target c } } */ -+ /* { dg-begin-multiline-output "" } -+ extern void fn_b (void); -+ ^~~~ -+ { dg-end-multiline-output "" { target c } } */ -+ -+ fn_c (1066, 1649); /* { dg-error "too many arguments to function 'fn_c'; expected 1, have 2" "" { target c } } */ -+ /* { dg-error "too many arguments to function 'void fn_c\\(int\\)'; expected 1, have 2" "" { target c++ } .-1 } */ -+ /* { dg-begin-multiline-output "" } -+ fn_c (1066, 1649); -+ ^~~~ ~~~~ -+ { dg-end-multiline-output "" { target c } } */ -+ /* { dg-begin-multiline-output "" } -+ extern void fn_c (int); -+ ^~~~ -+ { dg-end-multiline-output "" { target c } } */ -+ -+#ifdef __cplusplus -+ fn_d (1066); -+ fn_d (1066, 1649); -+ fn_d (1066, 1649, 1776); /* { dg-error "too many arguments to function '\[^\n\r\]*'; expected 2, have 3" "" { target c++ } } */ -+#endif -+} -+ -+struct foo -+{ -+ void (*callback_a)(); /* { dg-message "declared here" "" { target c } } */ -+ void (*callback_b)(void); /* { dg-message "declared here" "" { target c } } */ -+ void (*callback_c)(int); /* { dg-message "declared here" "" { target c } } */ -+}; -+ -+void test_callback (struct foo *f) -+{ -+ f->callback_a (42); /* { dg-error "too many arguments to function 'f->callback_a'; expected 0, have 1" "" { target c } } */ -+ /* { dg-error "too many arguments to function; expected 0, have 1" "" { target c++ } .-1 } */ -+ /* { dg-begin-multiline-output "" } -+ f->callback_a (42); -+ ^ ~~ -+ { dg-end-multiline-output "" { target c } } */ -+ /* { dg-begin-multiline-output "" } -+ void (*callback_a)(); -+ ^~~~~~~~~~ -+ { dg-end-multiline-output "" { target c } } */ -+ -+ f->callback_b (1776); /* { dg-error "too many arguments to function 'f->callback_b'; expected 0, have 1" "" { target c } } */ -+ /* { dg-error "too many arguments to function; expected 0, have 1" "" { target c++ } .-1 } */ -+ /* { dg-begin-multiline-output "" } -+ f->callback_b (1776); -+ ^ ~~~~ -+ { dg-end-multiline-output "" { target c } } */ -+ /* { dg-begin-multiline-output "" } -+ void (*callback_b)(void); -+ ^~~~~~~~~~ -+ { dg-end-multiline-output "" { target c } } */ -+ -+ f->callback_c (1066, 1649); /* { dg-error "too many arguments to function 'f->callback_c'; expected 1, have 2" "" { target c } } */ -+ /* { dg-error "too many arguments to function; expected 1, have 2" "" { target c++ } .-1 } */ -+ /* { dg-begin-multiline-output "" } -+ f->callback_c (1066, 1649); -+ ^ ~~~~ -+ { dg-end-multiline-output "" { target c } } */ -+ /* { dg-begin-multiline-output "" } -+ void (*callback_c)(int); -+ ^~~~~~~~~~ -+ { dg-end-multiline-output "" { target c } } */ -+} -diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic169.C b/gcc/testsuite/g++.dg/cpp0x/variadic169.C -index 6858973cd2eb..460bb3b8a193 100644 ---- a/gcc/testsuite/g++.dg/cpp0x/variadic169.C -+++ b/gcc/testsuite/g++.dg/cpp0x/variadic169.C -@@ -5,5 +5,5 @@ template<typename ...T> void f(int n = 0, T ...t); - - int main() - { -- f<int>(); // { dg-error "too few arguments" } -+ f<int>(); // { dg-error "too few arguments to function '\[^\n\r\]*'; expected at least 1, have 0" } - } -diff --git a/gcc/testsuite/g++.dg/modules/macloc-1_c.C b/gcc/testsuite/g++.dg/modules/macloc-1_c.C -index 5865a34687e7..3f980c213814 100644 ---- a/gcc/testsuite/g++.dg/modules/macloc-1_c.C -+++ b/gcc/testsuite/g++.dg/modules/macloc-1_c.C -@@ -8,6 +8,6 @@ void gru () - you (1); - } - --// { dg-regexp "\[^\n]*macloc-1_c.C:7:6: error: too many arguments to function 'int me@agnes\\(\\)'\nIn module agnes, imported at \[^\n]*macloc-1_b.C:8,\nof module edith, imported at \[^\n]*macloc-1_c.C:3:\n\[^\n]*macloc-1_a.C:11:12: note: declared here\n\[^\n]*macloc-1_a.C:8:20: note: in definition of macro 'BOB'\n" } -+// { dg-regexp "\[^\n]*macloc-1_c.C:7:6: error: too many arguments to function 'int me@agnes\\(\\)'; expected 0, have 1\nIn module agnes, imported at \[^\n]*macloc-1_b.C:8,\nof module edith, imported at \[^\n]*macloc-1_c.C:3:\n\[^\n]*macloc-1_a.C:11:12: note: declared here\n\[^\n]*macloc-1_a.C:8:20: note: in definition of macro 'BOB'\n" } - --// { dg-regexp "\[^\n]*macloc-1_c.C:8:7: error: too many arguments to function 'int you@agnes\\(\\)'\nIn module agnes, imported at \[^\n]*macloc-1_b.C:8,\nof module edith, imported at \[^\n]*macloc-1_c.C:3:\n\[^\n]*macloc-1_a.C:12:14: note: declared here\n\[^\n]*macloc-1_a.C:9:22: note: in definition of macro 'KEVIN'\n" } -+// { dg-regexp "\[^\n]*macloc-1_c.C:8:7: error: too many arguments to function 'int you@agnes\\(\\)'; expected 0, have 1\nIn module agnes, imported at \[^\n]*macloc-1_b.C:8,\nof module edith, imported at \[^\n]*macloc-1_c.C:3:\n\[^\n]*macloc-1_a.C:12:14: note: declared here\n\[^\n]*macloc-1_a.C:9:22: note: in definition of macro 'KEVIN'\n" } -diff --git a/gcc/testsuite/g++.dg/modules/macloc-1_d.C b/gcc/testsuite/g++.dg/modules/macloc-1_d.C -index 282a31c4a2d1..56c001fc3f83 100644 ---- a/gcc/testsuite/g++.dg/modules/macloc-1_d.C -+++ b/gcc/testsuite/g++.dg/modules/macloc-1_d.C -@@ -9,5 +9,5 @@ void margo () - gru (2); - } - --// { dg-regexp "\[^\n]*macloc-1_d.C:8:6: error: too many arguments to function 'int me@agnes\\(\\)'\nIn module agnes, imported at \[^\n]*macloc-1_d.C:4:\n\[^\n]*macloc-1_a.C:11:12: note: declared here\n\[^\n]*macloc-1_a.C:8:20: note: in definition of macro 'BOB'\n" } --// { dg-regexp "\[^\n]*macloc-1_d.C:9:7: error: too many arguments to function 'void gru@edith\\(\\)'\nIn module edith, imported at \[^\n]*macloc-1_d.C:3:\n\[^\n]*macloc-1_b.C:10:20: note: declared here\n\[^\n]*macloc-1_b.C:6:19: note: in definition of macro 'STUART'\n" } -+// { dg-regexp "\[^\n]*macloc-1_d.C:8:6: error: too many arguments to function 'int me@agnes\\(\\)'; expected 0, have 1\nIn module agnes, imported at \[^\n]*macloc-1_d.C:4:\n\[^\n]*macloc-1_a.C:11:12: note: declared here\n\[^\n]*macloc-1_a.C:8:20: note: in definition of macro 'BOB'\n" } -+// { dg-regexp "\[^\n]*macloc-1_d.C:9:7: error: too many arguments to function 'void gru@edith\\(\\)'; expected 0, have 1\nIn module edith, imported at \[^\n]*macloc-1_d.C:3:\n\[^\n]*macloc-1_b.C:10:20: note: declared here\n\[^\n]*macloc-1_b.C:6:19: note: in definition of macro 'STUART'\n" } - -base-commit: 65286465b94cba6ee3d59edbc771bef0088ac46e --- -2.48.0 - diff --git a/15.0.0/gentoo/README.history b/15.0.0/gentoo/README.history index 7b6d0a6..3b41aa8 100644 --- a/15.0.0/gentoo/README.history +++ b/15.0.0/gentoo/README.history @@ -1,5 +1,6 @@ 37 ???? + - 77_all_PR118112-c-c-UX-improvements-to-too-few-many-arguments-errors.patch - 78_all_PR118032-Revert-gimple-Add-limit-after-which-slower-switchlow.patch - 79_all_PR32491-fix-binutils-arm-check.patch + 80_all_PR81358-Enable-automatic-linking-of-libatomic.patch