diff options
| -rw-r--r-- | gcc/ChangeLog | 23 | ||||
| -rw-r--r-- | gcc/Makefile.in | 2 | ||||
| -rw-r--r-- | gcc/builtins.c | 6 | ||||
| -rw-r--r-- | gcc/c-common.c | 30 | ||||
| -rw-r--r-- | gcc/c-common.h | 1 | ||||
| -rw-r--r-- | gcc/c-decl.c | 8 | ||||
| -rw-r--r-- | gcc/c-format.c | 9 | ||||
| -rw-r--r-- | gcc/c-lang.c | 2 | ||||
| -rw-r--r-- | gcc/c-tree.h | 1 | ||||
| -rw-r--r-- | gcc/c-typeck.c | 26 | ||||
| -rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
| -rw-r--r-- | gcc/cp/call.c | 25 | ||||
| -rw-r--r-- | gcc/cp/cp-lang.c | 2 | ||||
| -rw-r--r-- | gcc/cp/cp-tree.h | 2 | ||||
| -rw-r--r-- | gcc/cp/decl.c | 2 | ||||
| -rw-r--r-- | gcc/langhooks-def.h | 3 | ||||
| -rw-r--r-- | gcc/langhooks.c | 8 | ||||
| -rw-r--r-- | gcc/langhooks.h | 6 | ||||
| -rw-r--r-- | gcc/objc/objc-lang.c | 2 | ||||
| -rw-r--r-- | gcc/tree.h | 5 | 
20 files changed, 101 insertions, 69 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dabbf94c453..097cf31ba5b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,26 @@ +2002-04-19  Neil Booth  <neil@daikokuya.demon.co.uk> + +	* builtins.c: Include langhooks.h. +	(lang_type_promotes_to): Remove. +	(expand_builtin_va_arg): Use new hook. +	* c-common.c (c_common_nodes_and_builtins): Don't set hook. +	(simple_type_promotes_to): Move to c-typeck.c. +	* c-common.h (simple_type_promotes_to): Remove. +	* c-decl.c (duplicate_decls, grokdeclarator): Update. +	* c-format.c: Include langhooks.h. +	(check_format_types): Update. +	* c-tree.h (c_type_promotes_to): New. +	* c-typeck.c (c_type_promotes_to): Move from c-common.c. +	(type_lists_compatible_p): Update. +	* langhooks-def.h (lhd_type_promotes_to): New. +	(LANG_HOOKS_TYPE_PROMOTES_TO): New. +	(LANG_HOOKS_FOR_TYPES_INITIALIZER): Update. +	* langhooks.c (lhd_type_promotes_to): New. +	* langhooks.h (struct lang_hooks_for_types): New hook. +	* tree.h (lang_type_promotes_to): Remove. +objc: +	* objc-lang.c (LANG_HOOKS_TYPE_PROMOTES_TO): Redefine. +  2002-04-18  Richard Henderson  <rth@redhat.com>  	* function.c: Revert patch for c/6358. diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 5a386eaad69..bb8e29ed032 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -1221,7 +1221,7 @@ attribs.o : attribs.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(OBSTACK_H) flags.h \  	toplev.h output.h c-pragma.h $(RTL_H) $(GGC_H) $(EXPR_H) $(TM_P_H) \  	builtin-types.def $(TARGET_H) langhooks.h -c-format.o : c-format.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) \ +c-format.o : c-format.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) langhooks.h \  	$(C_COMMON_H) flags.h toplev.h intl.h diagnostic.h  c-semantics.o : c-semantics.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(C_TREE_H) \ diff --git a/gcc/builtins.c b/gcc/builtins.c index dcbc6dab23e..a1ffe0a1d69 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -41,6 +41,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA  #include "predict.h"  #include "tm_p.h"  #include "target.h" +#include "langhooks.h"  #define CALLED_AS_BUILT_IN(NODE) \     (!strncmp (IDENTIFIER_POINTER (DECL_NAME (NODE)), "__builtin_", 10)) @@ -72,8 +73,6 @@ const char *const built_in_names[(int) END_BUILTINS] =     initialized to NULL_TREE.  */  tree built_in_decls[(int) END_BUILTINS]; -tree (*lang_type_promotes_to) PARAMS ((tree)); -  static int get_pointer_alignment	PARAMS ((tree, unsigned int));  static tree c_strlen			PARAMS ((tree));  static const char *c_getstr		PARAMS ((tree)); @@ -3083,7 +3082,8 @@ expand_builtin_va_arg (valist, type)    /* Generate a diagnostic for requesting data of a type that cannot       be passed through `...' due to type promotion at the call site.  */ -  else if ((promoted_type = (*lang_type_promotes_to) (type)) != NULL_TREE) +  else if ((promoted_type = (*lang_hooks.types.type_promotes_to) (type)) +	   != type)      {        const char *name = "<anonymous type>", *pname = 0;        static bool gave_help; diff --git a/gcc/c-common.c b/gcc/c-common.c index 1e7a0656c55..c1201cdbc54 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -2928,10 +2928,6 @@ c_common_nodes_and_builtins ()  		      0, NOT_BUILT_IN, 0, 0, 1);    main_identifier_node = get_identifier ("main"); - -  /* ??? Perhaps there's a better place to do this.  But it is related -     to __builtin_va_arg, so it isn't that off-the-wall.  */ -  lang_type_promotes_to = simple_type_promotes_to;  }  tree @@ -3075,32 +3071,6 @@ c_promoting_integer_type_p (t)      }  } -/* Given a type, apply default promotions wrt unnamed function arguments -   and return the new type.  Return NULL_TREE if no change.  */ -/* ??? There is a function of the same name in the C++ front end that -   does something similar, but is more thorough and does not return NULL -   if no change.  We could perhaps share code, but it would make the -   self_promoting_type property harder to identify.  */ - -tree -simple_type_promotes_to (type) -     tree type; -{ -  if (TYPE_MAIN_VARIANT (type) == float_type_node) -    return double_type_node; - -  if (c_promoting_integer_type_p (type)) -    { -      /* Preserve unsignedness if not really getting any wider.  */ -      if (TREE_UNSIGNED (type) -          && (TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node))) -        return unsigned_type_node; -      return integer_type_node; -    } - -  return NULL_TREE; -} -  /* Return 1 if PARMS specifies a fixed number of parameters     and none of their types is affected by default promotions.  */ diff --git a/gcc/c-common.h b/gcc/c-common.h index f0b92ed48dd..e3d00e92f0c 100644 --- a/gcc/c-common.h +++ b/gcc/c-common.h @@ -568,7 +568,6 @@ extern void c_common_parse_file			PARAMS ((void));  extern HOST_WIDE_INT c_common_get_alias_set	PARAMS ((tree));  extern bool c_promoting_integer_type_p		PARAMS ((tree));  extern int self_promoting_args_p		PARAMS ((tree)); -extern tree simple_type_promotes_to		PARAMS ((tree));  extern tree strip_array_types                   PARAMS ((tree));  /* These macros provide convenient access to the various _STMT nodes.  */ diff --git a/gcc/c-decl.c b/gcc/c-decl.c index 3487aef05d9..7db66d78db7 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -1550,7 +1550,7 @@ duplicate_decls (newdecl, olddecl, different_binding_level)  		  break;  		} -	      if (simple_type_promotes_to (type) != NULL_TREE) +	      if (c_type_promotes_to (type) != type)  		{  		  error ("an argument type that has a default promotion can't match an empty parameter name list declaration");  		  break; @@ -4793,11 +4793,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)  	if (type == error_mark_node)  	  promoted_type = type;  	else -	  { -	    promoted_type = simple_type_promotes_to (type); -	    if (! promoted_type) -	      promoted_type = type; -	  } +	  promoted_type = c_type_promotes_to (type);  	DECL_ARG_TYPE (decl) = promoted_type;  	DECL_ARG_TYPE_AS_WRITTEN (decl) = type_as_written; diff --git a/gcc/c-format.c b/gcc/c-format.c index c1211674cdc..e5be439c53f 100644 --- a/gcc/c-format.c +++ b/gcc/c-format.c @@ -27,7 +27,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA  #include "c-common.h"  #include "intl.h"  #include "diagnostic.h" - +#include "langhooks.h"  /* Command line options and their associated flags.  */ @@ -2258,7 +2258,6 @@ check_format_types (status, types)        tree cur_type;        tree orig_cur_type;        tree wanted_type; -      tree promoted_type;        int arg_num;        int i;        int char_type_flag; @@ -2277,11 +2276,7 @@ check_format_types (status, types)  	abort ();        if (types->pointer_count == 0) -	{ -	  promoted_type = simple_type_promotes_to (wanted_type); -	  if (promoted_type != NULL_TREE) -	    wanted_type = promoted_type; -	} +	wanted_type = (*lang_hooks.types.type_promotes_to) (wanted_type);        STRIP_NOPS (cur_param); diff --git a/gcc/c-lang.c b/gcc/c-lang.c index 741aa1d3670..ec1f1521867 100644 --- a/gcc/c-lang.c +++ b/gcc/c-lang.c @@ -102,6 +102,8 @@ static void c_post_options PARAMS ((void));  #define LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE c_common_signed_or_unsigned_type  #undef LANG_HOOKS_INCOMPLETE_TYPE_ERROR  #define LANG_HOOKS_INCOMPLETE_TYPE_ERROR c_incomplete_type_error +#undef LANG_HOOKS_TYPE_PROMOTES_TO +#define LANG_HOOKS_TYPE_PROMOTES_TO c_type_promotes_to  /* ### When changing hooks, consider if ObjC needs changing too!! ### */ diff --git a/gcc/c-tree.h b/gcc/c-tree.h index 3d152fb8320..21f1146ff56 100644 --- a/gcc/c-tree.h +++ b/gcc/c-tree.h @@ -251,6 +251,7 @@ extern tree c_sizeof_nowarn			PARAMS ((tree));  extern tree c_size_in_bytes                     PARAMS ((tree));  extern bool c_mark_addressable			PARAMS ((tree));  extern void c_incomplete_type_error		PARAMS ((tree, tree)); +extern tree c_type_promotes_to			PARAMS ((tree));  extern tree build_component_ref                 PARAMS ((tree, tree));  extern tree build_indirect_ref                  PARAMS ((tree, const char *));  extern tree build_array_ref                     PARAMS ((tree, tree)); diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 6b198f9310d..47fa1855ad3 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -173,6 +173,28 @@ c_incomplete_type_error (value, type)      }  } +/* Given a type, apply default promotions wrt unnamed function +   arguments and return the new type.  */ + +tree +c_type_promotes_to (type) +     tree type; +{ +  if (TYPE_MAIN_VARIANT (type) == float_type_node) +    return double_type_node; + +  if (c_promoting_integer_type_p (type)) +    { +      /* Preserve unsignedness if not really getting any wider.  */ +      if (TREE_UNSIGNED (type) +          && (TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node))) +        return unsigned_type_node; +      return integer_type_node; +    } + +  return type; +} +  /* Return a variant of TYPE which has all the type qualifiers of LIKE     as well as those of TYPE.  */ @@ -658,12 +680,12 @@ type_lists_compatible_p (args1, args2)  	 So match anything that self-promotes.  */        if (TREE_VALUE (args1) == 0)  	{ -	  if (simple_type_promotes_to (TREE_VALUE (args2)) != NULL_TREE) +	  if (c_type_promotes_to (TREE_VALUE (args2)) != TREE_VALUE (args2))  	    return 0;  	}        else if (TREE_VALUE (args2) == 0)  	{ -	  if (simple_type_promotes_to (TREE_VALUE (args1)) != NULL_TREE) +	  if (c_type_promotes_to (TREE_VALUE (args1)) != TREE_VALUE (args1))  	    return 0;  	}        else if (! (newval = comptypes (TYPE_MAIN_VARIANT (TREE_VALUE (args1)),  diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a9b6023b1c5..7a139f4d52d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2002-04-19  Neil Booth  <neil@daikokuya.demon.co.uk> + +	* call.c (convert_type_from_ellipsis): Rename, update. +	* cp-lang.c (LANG_HOOKS_TYPE_PROMOTES_TO): Redefine. +	* cp-tree.h (convert_type_from_ellipsis): Rename. +	* decl.c (cxx_init_decl_processing): Don't set hook. +  2002-04-18  Neil Booth  <neil@daikokuya.demon.co.uk>  	* call.c (build_new_method_call): Update. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index f9ca9a08f5f..233f98c21f8 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -4026,24 +4026,27 @@ build_x_va_arg (expr, type)    return build_va_arg (expr, type);  } -/* TYPE has been given to va_arg. Apply the default conversions which would -   have happened when passed via ellipsis. Return the promoted type, or -   NULL_TREE, if there is no change.  */ +/* TYPE has been given to va_arg.  Apply the default conversions which +   would have happened when passed via ellipsis.  Return the promoted +   type, or the passed type if there is no change.  */  tree -convert_type_from_ellipsis (type) +cxx_type_promotes_to (type)       tree type;  {    tree promote; -   +    if (TREE_CODE (type) == ARRAY_TYPE) -    promote = build_pointer_type (TREE_TYPE (type)); -  else if (TREE_CODE (type) == FUNCTION_TYPE) -    promote = build_pointer_type (type); -  else -    promote = type_promotes_to (type); +    return build_pointer_type (TREE_TYPE (type)); + +  if (TREE_CODE (type) == FUNCTION_TYPE) +    return build_pointer_type (type); + +  promote = type_promotes_to (type); +  if (same_type_p (type, promote)) +    promote = type; -  return same_type_p (type, promote) ? NULL_TREE : promote; +  return promote;  }  /* ARG is a default argument expression being passed to a parameter of diff --git a/gcc/cp/cp-lang.c b/gcc/cp/cp-lang.c index 1ac312222bb..d37cd111658 100644 --- a/gcc/cp/cp-lang.c +++ b/gcc/cp/cp-lang.c @@ -136,6 +136,8 @@ static bool cxx_warn_unused_global_decl PARAMS ((tree));  #define LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE c_common_signed_or_unsigned_type  #undef LANG_HOOKS_INCOMPLETE_TYPE_ERROR  #define LANG_HOOKS_INCOMPLETE_TYPE_ERROR cxx_incomplete_type_error +#undef LANG_HOOKS_TYPE_PROMOTES_TO +#define LANG_HOOKS_TYPE_PROMOTES_TO cxx_type_promotes_to  /* Each front end provides its own hooks, for toplev.c.  */  const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER; diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 41bde3813f1..5b56331f83b 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -3578,7 +3578,7 @@ extern int enforce_access                       PARAMS ((tree, tree));  extern tree convert_default_arg                 PARAMS ((tree, tree, tree, int));  extern tree convert_arg_to_ellipsis             PARAMS ((tree));  extern tree build_x_va_arg                      PARAMS ((tree, tree)); -extern tree convert_type_from_ellipsis          PARAMS ((tree)); +extern tree cxx_type_promotes_to		PARAMS ((tree));  extern int is_properly_derived_from             PARAMS ((tree, tree));  extern tree initialize_reference                PARAMS ((tree, tree));  extern tree strip_top_quals                     PARAMS ((tree)); diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 51efa3574ec..ec087983f70 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -6579,8 +6579,6 @@ cxx_init_decl_processing ()    vtable_index_type = ptrdiff_type_node;    vtt_parm_type = build_pointer_type (const_ptr_type_node); -  lang_type_promotes_to = convert_type_from_ellipsis; -    void_ftype = build_function_type (void_type_node, void_list_node);    void_ftype_ptr = build_function_type (void_type_node,  					tree_cons (NULL_TREE, diff --git a/gcc/langhooks-def.h b/gcc/langhooks-def.h index 0f08524a048..abbe734e057 100644 --- a/gcc/langhooks-def.h +++ b/gcc/langhooks-def.h @@ -58,6 +58,7 @@ extern void lhd_print_error_function PARAMS ((struct diagnostic_context *,  extern void lhd_set_decl_assembler_name PARAMS ((tree));  extern bool lhd_warn_unused_global_decl PARAMS ((tree));  extern void lhd_incomplete_type_error PARAMS ((tree, tree)); +extern tree lhd_type_promotes_to PARAMS ((tree));  /* Declarations of default tree inlining hooks.  */  tree lhd_tree_inlining_walk_subtrees		PARAMS ((tree *, int *, @@ -161,6 +162,7 @@ int lhd_tree_dump_type_quals			PARAMS ((tree));     so we create a compile-time error instead.  */  #define LANG_HOOKS_MAKE_TYPE make_node  #define LANG_HOOKS_INCOMPLETE_TYPE_ERROR lhd_incomplete_type_error +#define LANG_HOOKS_TYPE_PROMOTES_TO lhd_type_promotes_to  #define LANG_HOOKS_FOR_TYPES_INITIALIZER { \    LANG_HOOKS_MAKE_TYPE, \ @@ -169,6 +171,7 @@ int lhd_tree_dump_type_quals			PARAMS ((tree));    LANG_HOOKS_UNSIGNED_TYPE, \    LANG_HOOKS_SIGNED_TYPE, \    LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE, \ +  LANG_HOOKS_TYPE_PROMOTES_TO, \    LANG_HOOKS_INCOMPLETE_TYPE_ERROR \  } diff --git a/gcc/langhooks.c b/gcc/langhooks.c index c48ea2cba2b..cc08e465034 100644 --- a/gcc/langhooks.c +++ b/gcc/langhooks.c @@ -178,6 +178,14 @@ lhd_clear_binding_stack ()      poplevel (0, 0, 0);  } +/* Type promotion for variable arguments.  */ +tree +lhd_type_promotes_to (type) +     tree type ATTRIBUTE_UNUSED; +{ +  abort (); +} +  /* Invalid use of an incomplete type.  */  void  lhd_incomplete_type_error (value, type) diff --git a/gcc/langhooks.h b/gcc/langhooks.h index a2069d62ed5..5b128a7adaa 100644 --- a/gcc/langhooks.h +++ b/gcc/langhooks.h @@ -97,6 +97,12 @@ struct lang_hooks_for_types       according to UNSIGNEDP.  */    tree (*signed_or_unsigned_type) PARAMS ((int, tree)); +  /* Given a type, apply default promotions to unnamed function +     arguments and return the new type.  Return the same type if no +     change.  Required by any language that supports variadic +     arguments.  The default hook aborts.  */ +  tree (*type_promotes_to) PARAMS ((tree)); +    /* This routine is called in tree.c to print an error message for       invalid use of an incomplete type.  VALUE is the expression that       was used (or 0 if that isn't known) and TYPE is the type that was diff --git a/gcc/objc/objc-lang.c b/gcc/objc/objc-lang.c index 247280318a7..fef5196645f 100644 --- a/gcc/objc/objc-lang.c +++ b/gcc/objc/objc-lang.c @@ -99,6 +99,8 @@ static void objc_post_options                   PARAMS ((void));  #define LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE c_common_signed_or_unsigned_type  #undef LANG_HOOKS_INCOMPLETE_TYPE_ERROR  #define LANG_HOOKS_INCOMPLETE_TYPE_ERROR c_incomplete_type_error +#undef LANG_HOOKS_TYPE_PROMOTES_TO +#define LANG_HOOKS_TYPE_PROMOTES_TO c_type_promotes_to  /* Each front end provides its own hooks, for toplev.c.  */  const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER; diff --git a/gcc/tree.h b/gcc/tree.h index 58113ca9571..0eae44844a7 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -2799,11 +2799,6 @@ extern void rrotate_double	PARAMS ((unsigned HOST_WIDE_INT, HOST_WIDE_INT,  extern int operand_equal_p	PARAMS ((tree, tree, int));  extern tree invert_truthvalue	PARAMS ((tree)); -/* In builtins.c.  Given a type, apply default promotions wrt unnamed -   function arguments and return the new type.  Return NULL_TREE if no -   change.  Required by any language that supports variadic arguments.  */ - -extern tree (*lang_type_promotes_to)	PARAMS ((tree));  extern tree fold_builtin		PARAMS ((tree));  extern tree build_range_type PARAMS ((tree, tree, tree));  | 

