From: Mark Mitchell Date: Sun, 1 Dec 2002 18:19:14 +0000 (+0000) Subject: re PR c++/8332 (strlen/template interaction causes ICE) X-Git-Tag: releases/gcc-3.2.2~235 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=97a8c5e422324fb1f30551ce5118d8214e595ba7;p=thirdparty%2Fgcc.git 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. * typeck.c (c_sizeof): Likewise. (c_sizeof_nowarn): 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_alignof): 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: r59692 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0c16f377eb79..d31f6cedd0b5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2002-12-01 Mark Mitchell + + * 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_alignof): 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-26 Neil Booth PR preprocessor/8524 diff --git a/gcc/builtin-types.def b/gcc/builtin-types.def index 6cefb322f204..c594bd2d1231 100644 --- a/gcc/builtin-types.def +++ b/gcc/builtin-types.def @@ -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. @@ -76,7 +76,7 @@ DEF_PRIMITIVE_TYPE (BT_CONST_PTR, const_ptr_type_node) DEF_PRIMITIVE_TYPE (BT_TRAD_PTR, traditional_ptr_type_node) DEF_PRIMITIVE_TYPE (BT_TRAD_CONST_PTR, traditional_cptr_type_node) DEF_PRIMITIVE_TYPE (BT_PTRMODE, 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_CONST_STRING, const_string_type_node) DEF_PRIMITIVE_TYPE (BT_LEN, traditional_len_type_node) diff --git a/gcc/builtins.c b/gcc/builtins.c index 7eb878f70386..d8874d6a1473 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -4068,8 +4068,13 @@ fold_builtin (exp) if (validate_arglist (arglist, POINTER_TYPE, VOID_TYPE)) { tree len = c_strlen (TREE_VALUE (arglist)); - if (len != 0) - return len; + if (len) + { + /* Convert from the internal "sizetype" type to "size_t". */ + if (size_type_node) + len = convert (size_type_node, len); + return len; + } } break; diff --git a/gcc/c-common.c b/gcc/c-common.c index 647b7b7b8a4b..3511f157d0e8 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -2425,7 +2425,7 @@ c_alignof (type) else t = size_int (TYPE_ALIGN (type) / BITS_PER_UNIT); - return fold (build1 (NOP_EXPR, c_size_type_node, t)); + return fold (build1 (NOP_EXPR, size_type_node, t)); } /* Implement the __alignof keyword: Return the minimum required @@ -2473,7 +2473,7 @@ c_alignof_expr (expr) else 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)); } /* Give the specifications for the format attributes, used by C and all @@ -2601,12 +2601,12 @@ c_common_nodes_and_builtins () /* `unsigned long' is the standard type for sizeof. Note that stddef.h uses `unsigned long', 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))); - signed_size_type_node = signed_type (c_size_type_node); + signed_size_type_node = signed_type (size_type_node); if (flag_traditional) - c_size_type_node = signed_size_type_node; - set_sizetype (c_size_type_node); + size_type_node = signed_size_type_node; + set_sizetype (size_type_node); build_common_tree_nodes_2 (flag_short_double); diff --git a/gcc/c-common.h b/gcc/c-common.h index 61a7f107f324..f5e46593b726 100644 --- a/gcc/c-common.h +++ b/gcc/c-common.h @@ -136,10 +136,6 @@ enum c_tree_index CTI_SIGNED_WCHAR_TYPE, CTI_UNSIGNED_WCHAR_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_UNSIGNED_PTRDIFF_TYPE, /* For format checking only. */ CTI_INTMAX_TYPE, @@ -193,7 +189,6 @@ struct c_common_identifier #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 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 unsigned_ptrdiff_type_node c_global_trees[CTI_UNSIGNED_PTRDIFF_TYPE] #define intmax_type_node c_global_trees[CTI_INTMAX_TYPE] diff --git a/gcc/c-format.c b/gcc/c-format.c index d52cfba7c70e..658ca30f29d2 100644 --- a/gcc/c-format.c +++ b/gcc/c-format.c @@ -750,7 +750,7 @@ static const format_flag_pair strfmon_flag_pairs[] = #define T_WI &wint_type_node #define T94_WI { STD_C94, "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 T_SST &signed_size_type_node #define T99_SST { STD_C99, "signed size_t", T_SST } diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 6020862f4101..8093135ef6cf 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -752,7 +752,7 @@ c_sizeof (type) TYPE_IS_SIZETYPE means that certain things (like overflow) will never happen. However, this node should really have type `size_t', which is just a typedef for an ordinary integer type. */ - return fold (build1 (NOP_EXPR, c_size_type_node, size)); + return fold (build1 (NOP_EXPR, size_type_node, size)); } tree @@ -776,7 +776,7 @@ c_sizeof_nowarn (type) TYPE_IS_SIZETYPE means that certain things (like overflow) will never happen. However, this node should really have type `size_t', which is just a typedef for an ordinary integer type. */ - return fold (build1 (NOP_EXPR, c_size_type_node, size)); + return fold (build1 (NOP_EXPR, size_type_node, size)); } /* Compute the size to increment a pointer by. */ diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0af12ca3b5f4..ea9463d584c1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,14 @@ +2002-12-01 Mark Mitchell + + 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. + * typeck.c (c_sizeof): Likewise. + (c_sizeof_nowarn): Likewise. + 2002-11-30 Mark Mitchell PR c++/8214 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 06b081c2831d..b1981c0e1ffd 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -6659,7 +6659,7 @@ cxx_init_decl_processing () ptr_ftype_sizetype = build_function_type (ptr_type_node, tree_cons (NULL_TREE, - c_size_type_node, + size_type_node, void_list_node)); newtype = build_exception_variant (ptr_ftype_sizetype, add_exception_specifier diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 730bbfb55f00..be72010125c0 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -2062,17 +2062,17 @@ coerce_new_type (type) e = 1, error ("`operator new' must return type `%T'", ptr_type_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; if (args && args != void_list_node) 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) { case 2: - args = tree_cons (NULL_TREE, c_size_type_node, args); + args = tree_cons (NULL_TREE, size_type_node, args); /* FALLTHROUGH */ case 1: type = build_exception_variant diff --git a/gcc/cp/except.c b/gcc/cp/except.c index 3f3cdcfd3be8..5de9f4c8956e 100644 --- a/gcc/cp/except.c +++ b/gcc/cp/except.c @@ -508,7 +508,7 @@ do_allocate_exception (type) else { /* 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)); } diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index a38305f29d1c..82867eba0b3b 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -1544,7 +1544,7 @@ c_sizeof (type) TYPE_IS_SIZETYPE means that certain things (like overflow) will never happen. However, this node should really have type `size_t', which is just a typedef for an ordinary integer type. */ - size = fold (build1 (NOP_EXPR, c_size_type_node, size)); + size = fold (build1 (NOP_EXPR, size_type_node, size)); my_friendly_assert (!TYPE_IS_SIZETYPE (TREE_TYPE (size)), 20001021); return size; @@ -1613,7 +1613,7 @@ c_sizeof_nowarn (type) TYPE_IS_SIZETYPE means that certain things (like overflow) will never happen. However, this node should really have type `size_t', which is just a typedef for an ordinary integer type. */ - size = fold (build1 (NOP_EXPR, c_size_type_node, size)); + size = fold (build1 (NOP_EXPR, size_type_node, size)); my_friendly_assert (!TYPE_IS_SIZETYPE (TREE_TYPE (size)), 20001021); return size; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3041068c9f32..554f55cd8a49 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2002-11-30 Mark Mitchell + + PR c++/8332 + PR c++/8493 + * g++.dg/template/strlen1.C: New test. + 2002-11-30 Mark Mitchell PR c++/8214 diff --git a/gcc/tree.h b/gcc/tree.h index 03724e1818a7..c59c53e75fe5 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -1915,6 +1915,7 @@ enum tree_index TI_VOID_TYPE, TI_PTR_TYPE, TI_CONST_PTR_TYPE, + TI_SIZE_TYPE, TI_PTRDIFF_TYPE, TI_VA_LIST_TYPE, @@ -1985,6 +1986,8 @@ extern tree global_trees[TI_MAX]; #define ptr_type_node global_trees[TI_PTR_TYPE] /* The C type `const void *'. */ #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 va_list_type_node global_trees[TI_VA_LIST_TYPE]