From 8117c488e1abb823bfedf1f5c6aa73043a0458c8 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Thu, 10 Mar 2005 15:04:39 +0000 Subject: [PATCH] re PR target/20375 (C++ ICE in assign_parm_find_entry_rtl) PR c++/20375 * function.c (struct assign_parm_data_one): Remove last_named field. (assign_parm_find_data_types): Don't determine last_named. Reorder named_parm determination. (assign_parms): Only setup varargs on the last non-varadic parameter. testsuite: PR c++/20375 * g++.dg/other/stdarg3.C: New. From-SVN: r96237 --- gcc/ChangeLog | 10 +++++++++ gcc/function.c | 39 +++++++++--------------------------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/other/stdarg3.C | 16 +++++++++++++++ 4 files changed, 41 insertions(+), 29 deletions(-) create mode 100644 gcc/testsuite/g++.dg/other/stdarg3.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 948bf17..e6a7c4e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2005-03-10 Nathan Sidwell + + PR c++/20375 + * function.c (struct assign_parm_data_one): Remove last_named + field. + (assign_parm_find_data_types): Don't determine last_named. + Reorder named_parm determination. + (assign_parms): Only setup varargs on the last non-varadic + parameter. + 2005-03-10 Kazuhiro Inaoka * config/m32r/m32r.md (load_sda_base_32): New pattern. Loads diff --git a/gcc/function.c b/gcc/function.c index 9f51e92..49029a9 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -1992,7 +1992,6 @@ struct assign_parm_data_one struct locate_and_pad_arg_data locate; int partial; BOOL_BITFIELD named_arg : 1; - BOOL_BITFIELD last_named : 1; BOOL_BITFIELD passed_pointer : 1; BOOL_BITFIELD on_stack : 1; BOOL_BITFIELD loaded_in_reg : 1; @@ -2136,24 +2135,15 @@ assign_parm_find_data_types (struct assign_parm_data_all *all, tree parm, memset (data, 0, sizeof (*data)); - /* Set LAST_NAMED if this is last named arg before last anonymous args. */ - if (current_function_stdarg) - { - tree tem; - for (tem = TREE_CHAIN (parm); tem; tem = TREE_CHAIN (tem)) - if (DECL_NAME (tem)) - break; - if (tem == 0) - data->last_named = true; - } - - /* Set NAMED_ARG if this arg should be treated as a named arg. For - most machines, if this is a varargs/stdarg function, then we treat - the last named arg as if it were anonymous too. */ - if (targetm.calls.strict_argument_naming (&all->args_so_far)) - data->named_arg = 1; + /* NAMED_ARG is a mis-nomer. We really mean 'non-varadic'. */ + if (!current_function_stdarg) + data->named_arg = 1; /* No varadic parms. */ + else if (TREE_CHAIN (parm)) + data->named_arg = 1; /* Not the last non-varadic parm. */ + else if (targetm.calls.strict_argument_naming (&all->args_so_far)) + data->named_arg = 1; /* Only varadic ones are unnamed. */ else - data->named_arg = !data->last_named; + data->named_arg = 0; /* Treat as varadic. */ nominal_type = TREE_TYPE (parm); passed_type = DECL_ARG_TYPE (parm); @@ -3055,7 +3045,6 @@ assign_parms (tree fndecl) struct assign_parm_data_all all; tree fnargs, parm; rtx internal_arg_pointer; - int varargs_setup = 0; /* If the reg that the virtual arg pointer will be translated into is not a fixed reg or is the stack pointer, make a copy of the virtual @@ -3090,16 +3079,8 @@ assign_parms (tree fndecl) continue; } - /* Handle stdargs. LAST_NAMED is a slight mis-nomer; it's also true - for the unnamed dummy argument following the last named argument. - See ABI silliness wrt strict_argument_naming and NAMED_ARG. So - we only want to do this when we get to the actual last named - argument, which will be the first time LAST_NAMED gets set. */ - if (data.last_named && !varargs_setup) - { - varargs_setup = true; - assign_parms_setup_varargs (&all, &data, false); - } + if (current_function_stdarg && !TREE_CHAIN (parm)) + assign_parms_setup_varargs (&all, &data, false); /* Find out where the parameter arrives in this function. */ assign_parm_find_entry_rtl (&all, &data); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index be5388f..8454c08 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-03-10 Nathan Sidwell + + PR c++/20375 + * g++.dg/other/stdarg3.C: New. + 2005-03-10 Jakub Jelinek PR c++/18384, c++/18327 diff --git a/gcc/testsuite/g++.dg/other/stdarg3.C b/gcc/testsuite/g++.dg/other/stdarg3.C new file mode 100644 index 0000000..3d11dff --- /dev/null +++ b/gcc/testsuite/g++.dg/other/stdarg3.C @@ -0,0 +1,16 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 8 Mar 2005 + +// PR 20375: ICE +// Origin: Joseph S. Myers +// { dg-options "-mlp64" { target "ia64-*-*" } } + +union U +{ + void *m[7]; +}; + +struct C; + +void f(struct C *c, float f, union U, ...) +{ } -- 2.7.4