https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71625
Bernd Edlinger <bernd.edlinger at hotmail dot de> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |bernd.edlinger at hotmail dot de --- Comment #20 from Bernd Edlinger <bernd.edlinger at hotmail dot de> --- it is possible that the poly type returns now a different type class in __builtin_classify_type: @defmac __builtin_classify_type (@var{object}) Since each machine has its own conventions for which data types are passed in which kind of register, your implementation of @code{va_arg} has to embody these conventions. The easiest way to categorize the specified data type is to use @code{__builtin_classify_type} together with @code{sizeof} and @code{__alignof__}. @code{__builtin_classify_type} ignores the value of @var{object}, considering only its data type. It returns an integer describing what kind of type that is---integer, floating, pointer, structure, and so on. The file @file{typeclass.h} defines an enumeration that you can use to interpret the values of @code{__builtin_classify_type}. @end defmac builtins.c-/* Used by expand_builtin_classify_type and fold_builtin_classify_type. */ builtins.c- builtins.c-static enum type_class builtins.c-type_to_class (tree type) builtins.c-{ builtins.c- switch (TREE_CODE (type)) builtins.c- { builtins.c- case VOID_TYPE: return void_type_class; builtins.c- case INTEGER_TYPE: return integer_type_class; builtins.c- case ENUMERAL_TYPE: return enumeral_type_class; builtins.c- case BOOLEAN_TYPE: return boolean_type_class; builtins.c- case POINTER_TYPE: return pointer_type_class; builtins.c- case REFERENCE_TYPE: return reference_type_class; builtins.c- case OFFSET_TYPE: return offset_type_class; builtins.c- case REAL_TYPE: return real_type_class; builtins.c- case COMPLEX_TYPE: return complex_type_class; builtins.c- case FUNCTION_TYPE: return function_type_class; builtins.c- case METHOD_TYPE: return method_type_class; builtins.c- case RECORD_TYPE: return record_type_class; builtins.c- case UNION_TYPE: builtins.c- case QUAL_UNION_TYPE: return union_type_class; builtins.c: case ARRAY_TYPE: return (TYPE_STRING_FLAG (type) builtins.c- ? string_type_class : array_type_class); builtins.c- case LANG_TYPE: return lang_type_class; builtins.c- default: return no_type_class; builtins.c- } builtins.c-} builtins.c- builtins.c-/* Expand a call EXP to __builtin_classify_type. */ builtins.c- builtins.c-static rtx builtins.c-expand_builtin_classify_type (tree exp) builtins.c-{ builtins.c- if (call_expr_nargs (exp)) builtins.c- return GEN_INT (type_to_class (TREE_TYPE (CALL_EXPR_ARG (exp, 0)))); builtins.c- return GEN_INT (no_type_class); builtins.c-}