re PR c++/8332 (strlen/template interaction causes ICE)
PR c++/8332 PR c++/8493 * decl.c (cxx_init_decl_processing): Use size_type_node, not c_size_type_node. * decl2.c (coerce_new_type): Likewise. * except.c (do_allocate_exception): Likewise. * builtin-types.def (BT_SIZE): Use size_type_node. * builtins.c (fold_builtin): Make the builtin strlen returns a size_t, not a sizetype. * c-common.c (c_sizeof_or_alignof_type): Use size_type_node, not c_size_type_node. (c_alignof_expr): Likewise. (c_common_nodes_and_builtins): Likewise. * c-common.h (CTI_C_SIZE_TYPE): Remove. (c_size_type_node): Likewise. * c-format.c (T_ST): Use size_type_node, not c_size_type_node. * tree.h (TI_SIZE_TYPE): New enumeral. (size_type_node): Likewise. PR c++/8332 PR c++/8493 * g++.dg/template/strlen1.C: New test. From-SVN: r59689
This commit is contained in:
parent
335c9de73b
commit
c9f8536c5d
|
@ -1,3 +1,18 @@
|
||||||
|
2002-12-01 Mark Mitchell <mark@codesourcery.com>
|
||||||
|
|
||||||
|
* builtin-types.def (BT_SIZE): Use size_type_node.
|
||||||
|
* builtins.c (fold_builtin): Make the builtin strlen returns a
|
||||||
|
size_t, not a sizetype.
|
||||||
|
* c-common.c (c_sizeof_or_alignof_type): Use size_type_node, not
|
||||||
|
c_size_type_node.
|
||||||
|
(c_alignof_expr): Likewise.
|
||||||
|
(c_common_nodes_and_builtins): Likewise.
|
||||||
|
* c-common.h (CTI_C_SIZE_TYPE): Remove.
|
||||||
|
(c_size_type_node): Likewise.
|
||||||
|
* c-format.c (T_ST): Use size_type_node, not c_size_type_node.
|
||||||
|
* tree.h (TI_SIZE_TYPE): New enumeral.
|
||||||
|
(size_type_node): Likewise.
|
||||||
|
|
||||||
2002-11-30 John David Anglin <dave@hiauly1.hia.nrc.ca>
|
2002-11-30 John David Anglin <dave@hiauly1.hia.nrc.ca>
|
||||||
|
|
||||||
* cfg.c (dump_flow_info): Use max_reg_num () to determine the largest
|
* cfg.c (dump_flow_info): Use max_reg_num () to determine the largest
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (C) 2001 Free Software Foundation, Inc.
|
/* Copyright (C) 2001, 2002 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GCC.
|
This file is part of GCC.
|
||||||
|
|
||||||
|
@ -74,7 +74,7 @@ DEF_PRIMITIVE_TYPE (BT_COMPLEX_LONG_DOUBLE, complex_long_double_type_node)
|
||||||
DEF_PRIMITIVE_TYPE (BT_PTR, ptr_type_node)
|
DEF_PRIMITIVE_TYPE (BT_PTR, ptr_type_node)
|
||||||
DEF_PRIMITIVE_TYPE (BT_CONST_PTR, const_ptr_type_node)
|
DEF_PRIMITIVE_TYPE (BT_CONST_PTR, const_ptr_type_node)
|
||||||
DEF_PRIMITIVE_TYPE (BT_PTRMODE, (*lang_hooks.types.type_for_mode)(ptr_mode, 0))
|
DEF_PRIMITIVE_TYPE (BT_PTRMODE, (*lang_hooks.types.type_for_mode)(ptr_mode, 0))
|
||||||
DEF_PRIMITIVE_TYPE (BT_SIZE, c_size_type_node)
|
DEF_PRIMITIVE_TYPE (BT_SIZE, size_type_node)
|
||||||
DEF_PRIMITIVE_TYPE (BT_STRING, string_type_node)
|
DEF_PRIMITIVE_TYPE (BT_STRING, string_type_node)
|
||||||
DEF_PRIMITIVE_TYPE (BT_CONST_STRING, const_string_type_node)
|
DEF_PRIMITIVE_TYPE (BT_CONST_STRING, const_string_type_node)
|
||||||
|
|
||||||
|
|
|
@ -4198,9 +4198,14 @@ fold_builtin (exp)
|
||||||
if (validate_arglist (arglist, POINTER_TYPE, VOID_TYPE))
|
if (validate_arglist (arglist, POINTER_TYPE, VOID_TYPE))
|
||||||
{
|
{
|
||||||
tree len = c_strlen (TREE_VALUE (arglist));
|
tree len = c_strlen (TREE_VALUE (arglist));
|
||||||
if (len != 0)
|
if (len)
|
||||||
|
{
|
||||||
|
/* Convert from the internal "sizetype" type to "size_t". */
|
||||||
|
if (size_type_node)
|
||||||
|
len = convert (size_type_node, len);
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BUILT_IN_INF:
|
case BUILT_IN_INF:
|
||||||
|
|
|
@ -3090,7 +3090,7 @@ c_sizeof_or_alignof_type (type, op, complain)
|
||||||
TYPE_IS_SIZETYPE means that certain things (like overflow) will
|
TYPE_IS_SIZETYPE means that certain things (like overflow) will
|
||||||
never happen. However, this node should really have type
|
never happen. However, this node should really have type
|
||||||
`size_t', which is just a typedef for an ordinary integer type. */
|
`size_t', which is just a typedef for an ordinary integer type. */
|
||||||
value = fold (build1 (NOP_EXPR, c_size_type_node, value));
|
value = fold (build1 (NOP_EXPR, size_type_node, value));
|
||||||
my_friendly_assert (!TYPE_IS_SIZETYPE (TREE_TYPE (value)), 20001021);
|
my_friendly_assert (!TYPE_IS_SIZETYPE (TREE_TYPE (value)), 20001021);
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
|
@ -3141,7 +3141,7 @@ c_alignof_expr (expr)
|
||||||
else
|
else
|
||||||
return c_alignof (TREE_TYPE (expr));
|
return c_alignof (TREE_TYPE (expr));
|
||||||
|
|
||||||
return fold (build1 (NOP_EXPR, c_size_type_node, t));
|
return fold (build1 (NOP_EXPR, size_type_node, t));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Handle C and C++ default attributes. */
|
/* Handle C and C++ default attributes. */
|
||||||
|
@ -3284,10 +3284,10 @@ c_common_nodes_and_builtins ()
|
||||||
/* `unsigned long' is the standard type for sizeof.
|
/* `unsigned long' is the standard type for sizeof.
|
||||||
Note that stddef.h uses `unsigned long',
|
Note that stddef.h uses `unsigned long',
|
||||||
and this must agree, even if long and int are the same size. */
|
and this must agree, even if long and int are the same size. */
|
||||||
c_size_type_node =
|
size_type_node =
|
||||||
TREE_TYPE (identifier_global_value (get_identifier (SIZE_TYPE)));
|
TREE_TYPE (identifier_global_value (get_identifier (SIZE_TYPE)));
|
||||||
signed_size_type_node = c_common_signed_type (c_size_type_node);
|
signed_size_type_node = c_common_signed_type (size_type_node);
|
||||||
set_sizetype (c_size_type_node);
|
set_sizetype (size_type_node);
|
||||||
|
|
||||||
build_common_tree_nodes_2 (flag_short_double);
|
build_common_tree_nodes_2 (flag_short_double);
|
||||||
|
|
||||||
|
|
|
@ -131,10 +131,6 @@ enum c_tree_index
|
||||||
CTI_SIGNED_WCHAR_TYPE,
|
CTI_SIGNED_WCHAR_TYPE,
|
||||||
CTI_UNSIGNED_WCHAR_TYPE,
|
CTI_UNSIGNED_WCHAR_TYPE,
|
||||||
CTI_WINT_TYPE,
|
CTI_WINT_TYPE,
|
||||||
CTI_C_SIZE_TYPE, /* The type used for the size_t typedef and the
|
|
||||||
result type of sizeof (an ordinary type without
|
|
||||||
TYPE_IS_SIZETYPE set, unlike the internal
|
|
||||||
sizetype). */
|
|
||||||
CTI_SIGNED_SIZE_TYPE, /* For format checking only. */
|
CTI_SIGNED_SIZE_TYPE, /* For format checking only. */
|
||||||
CTI_UNSIGNED_PTRDIFF_TYPE, /* For format checking only. */
|
CTI_UNSIGNED_PTRDIFF_TYPE, /* For format checking only. */
|
||||||
CTI_INTMAX_TYPE,
|
CTI_INTMAX_TYPE,
|
||||||
|
@ -188,7 +184,6 @@ struct c_common_identifier GTY(())
|
||||||
#define signed_wchar_type_node c_global_trees[CTI_SIGNED_WCHAR_TYPE]
|
#define signed_wchar_type_node c_global_trees[CTI_SIGNED_WCHAR_TYPE]
|
||||||
#define unsigned_wchar_type_node c_global_trees[CTI_UNSIGNED_WCHAR_TYPE]
|
#define unsigned_wchar_type_node c_global_trees[CTI_UNSIGNED_WCHAR_TYPE]
|
||||||
#define wint_type_node c_global_trees[CTI_WINT_TYPE]
|
#define wint_type_node c_global_trees[CTI_WINT_TYPE]
|
||||||
#define c_size_type_node c_global_trees[CTI_C_SIZE_TYPE]
|
|
||||||
#define signed_size_type_node c_global_trees[CTI_SIGNED_SIZE_TYPE]
|
#define signed_size_type_node c_global_trees[CTI_SIGNED_SIZE_TYPE]
|
||||||
#define unsigned_ptrdiff_type_node c_global_trees[CTI_UNSIGNED_PTRDIFF_TYPE]
|
#define unsigned_ptrdiff_type_node c_global_trees[CTI_UNSIGNED_PTRDIFF_TYPE]
|
||||||
#define intmax_type_node c_global_trees[CTI_INTMAX_TYPE]
|
#define intmax_type_node c_global_trees[CTI_INTMAX_TYPE]
|
||||||
|
|
|
@ -729,7 +729,7 @@ static const format_flag_pair strfmon_flag_pairs[] =
|
||||||
#define T_WI &wint_type_node
|
#define T_WI &wint_type_node
|
||||||
#define T94_WI { STD_C94, "wint_t", T_WI }
|
#define T94_WI { STD_C94, "wint_t", T_WI }
|
||||||
#define TEX_WI { STD_EXT, "wint_t", T_WI }
|
#define TEX_WI { STD_EXT, "wint_t", T_WI }
|
||||||
#define T_ST &c_size_type_node
|
#define T_ST &size_type_node
|
||||||
#define T99_ST { STD_C99, "size_t", T_ST }
|
#define T99_ST { STD_C99, "size_t", T_ST }
|
||||||
#define T_SST &signed_size_type_node
|
#define T_SST &signed_size_type_node
|
||||||
#define T99_SST { STD_C99, "signed size_t", T_SST }
|
#define T99_SST { STD_C99, "signed size_t", T_SST }
|
||||||
|
|
|
@ -1,3 +1,12 @@
|
||||||
|
2002-12-01 Mark Mitchell <mark@codesourcery.com>
|
||||||
|
|
||||||
|
PR c++/8332
|
||||||
|
PR c++/8493
|
||||||
|
* decl.c (cxx_init_decl_processing): Use size_type_node, not
|
||||||
|
c_size_type_node.
|
||||||
|
* decl2.c (coerce_new_type): Likewise.
|
||||||
|
* except.c (do_allocate_exception): Likewise.
|
||||||
|
|
||||||
2002-11-30 Mark Mitchell <mark@codesourcery.com>
|
2002-11-30 Mark Mitchell <mark@codesourcery.com>
|
||||||
|
|
||||||
PR c++/8227
|
PR c++/8227
|
||||||
|
|
|
@ -6656,7 +6656,7 @@ cxx_init_decl_processing ()
|
||||||
ptr_ftype_sizetype
|
ptr_ftype_sizetype
|
||||||
= build_function_type (ptr_type_node,
|
= build_function_type (ptr_type_node,
|
||||||
tree_cons (NULL_TREE,
|
tree_cons (NULL_TREE,
|
||||||
c_size_type_node,
|
size_type_node,
|
||||||
void_list_node));
|
void_list_node));
|
||||||
newtype = build_exception_variant
|
newtype = build_exception_variant
|
||||||
(ptr_ftype_sizetype, add_exception_specifier
|
(ptr_ftype_sizetype, add_exception_specifier
|
||||||
|
|
|
@ -1468,17 +1468,17 @@ coerce_new_type (type)
|
||||||
e = 1, error ("`operator new' must return type `%T'", ptr_type_node);
|
e = 1, error ("`operator new' must return type `%T'", ptr_type_node);
|
||||||
|
|
||||||
if (!args || args == void_list_node
|
if (!args || args == void_list_node
|
||||||
|| !same_type_p (TREE_VALUE (args), c_size_type_node))
|
|| !same_type_p (TREE_VALUE (args), size_type_node))
|
||||||
{
|
{
|
||||||
e = 2;
|
e = 2;
|
||||||
if (args && args != void_list_node)
|
if (args && args != void_list_node)
|
||||||
args = TREE_CHAIN (args);
|
args = TREE_CHAIN (args);
|
||||||
pedwarn ("`operator new' takes type `size_t' (`%T') as first parameter", c_size_type_node);
|
pedwarn ("`operator new' takes type `size_t' (`%T') as first parameter", size_type_node);
|
||||||
}
|
}
|
||||||
switch (e)
|
switch (e)
|
||||||
{
|
{
|
||||||
case 2:
|
case 2:
|
||||||
args = tree_cons (NULL_TREE, c_size_type_node, args);
|
args = tree_cons (NULL_TREE, size_type_node, args);
|
||||||
/* FALLTHROUGH */
|
/* FALLTHROUGH */
|
||||||
case 1:
|
case 1:
|
||||||
type = build_exception_variant
|
type = build_exception_variant
|
||||||
|
|
|
@ -503,7 +503,7 @@ do_allocate_exception (type)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Declare void *__cxa_allocate_exception(size_t). */
|
/* Declare void *__cxa_allocate_exception(size_t). */
|
||||||
tree tmp = tree_cons (NULL_TREE, c_size_type_node, void_list_node);
|
tree tmp = tree_cons (NULL_TREE, size_type_node, void_list_node);
|
||||||
fn = push_library_fn (fn, build_function_type (ptr_type_node, tmp));
|
fn = push_library_fn (fn, build_function_type (ptr_type_node, tmp));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
2002-11-30 Mark Mitchell <mark@codesourcery.com>
|
2002-11-30 Mark Mitchell <mark@codesourcery.com>
|
||||||
|
|
||||||
|
PR c++/8332
|
||||||
|
PR c++/8493
|
||||||
|
* g++.dg/template/strlen1.C: New test.
|
||||||
|
|
||||||
PR c++/8227
|
PR c++/8227
|
||||||
* g++.dg/template/ctor2.C: New test.
|
* g++.dg/template/ctor2.C: New test.
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
template <typename A1>
|
||||||
|
void monk2 (A1) {}
|
||||||
|
|
||||||
|
unsigned int strlen (const char*);
|
||||||
|
|
||||||
|
void monk ()
|
||||||
|
{
|
||||||
|
monk2 (strlen (""));
|
||||||
|
}
|
|
@ -1971,6 +1971,7 @@ enum tree_index
|
||||||
TI_VOID_TYPE,
|
TI_VOID_TYPE,
|
||||||
TI_PTR_TYPE,
|
TI_PTR_TYPE,
|
||||||
TI_CONST_PTR_TYPE,
|
TI_CONST_PTR_TYPE,
|
||||||
|
TI_SIZE_TYPE,
|
||||||
TI_PTRDIFF_TYPE,
|
TI_PTRDIFF_TYPE,
|
||||||
TI_VA_LIST_TYPE,
|
TI_VA_LIST_TYPE,
|
||||||
|
|
||||||
|
@ -2048,6 +2049,8 @@ extern GTY(()) tree global_trees[TI_MAX];
|
||||||
#define ptr_type_node global_trees[TI_PTR_TYPE]
|
#define ptr_type_node global_trees[TI_PTR_TYPE]
|
||||||
/* The C type `const void *'. */
|
/* The C type `const void *'. */
|
||||||
#define const_ptr_type_node global_trees[TI_CONST_PTR_TYPE]
|
#define const_ptr_type_node global_trees[TI_CONST_PTR_TYPE]
|
||||||
|
/* The C type `size_t'. */
|
||||||
|
#define size_type_node global_trees[TI_SIZE_TYPE]
|
||||||
#define ptrdiff_type_node global_trees[TI_PTRDIFF_TYPE]
|
#define ptrdiff_type_node global_trees[TI_PTRDIFF_TYPE]
|
||||||
#define va_list_type_node global_trees[TI_VA_LIST_TYPE]
|
#define va_list_type_node global_trees[TI_VA_LIST_TYPE]
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue