aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog15
-rw-r--r--gcc/builtin-types.def4
-rw-r--r--gcc/builtins.c9
-rw-r--r--gcc/c-common.c10
-rw-r--r--gcc/c-common.h5
-rw-r--r--gcc/c-format.c2
-rw-r--r--gcc/cp/ChangeLog9
-rw-r--r--gcc/cp/decl.c2
-rw-r--r--gcc/cp/decl2.c6
-rw-r--r--gcc/cp/except.c2
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/template/strlen1.C9
-rw-r--r--gcc/tree.h3
13 files changed, 60 insertions, 20 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9fdba44..5717dea 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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>
* cfg.c (dump_flow_info): Use max_reg_num () to determine the largest
diff --git a/gcc/builtin-types.def b/gcc/builtin-types.def
index be52392..23b4336 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.
@@ -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_CONST_PTR, const_ptr_type_node)
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_CONST_STRING, const_string_type_node)
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 7eea036..aa0cfaf 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -4198,8 +4198,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 f32456d..35adf76 100644
--- a/gcc/c-common.c
+++ b/gcc/c-common.c
@@ -3090,7 +3090,7 @@ c_sizeof_or_alignof_type (type, op, complain)
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. */
- 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);
return value;
@@ -3141,7 +3141,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));
}
/* Handle C and C++ default attributes. */
@@ -3284,10 +3284,10 @@ 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 = c_common_signed_type (c_size_type_node);
- set_sizetype (c_size_type_node);
+ signed_size_type_node = c_common_signed_type (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 ef04ca8..1f59ebd 100644
--- a/gcc/c-common.h
+++ b/gcc/c-common.h
@@ -131,10 +131,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,
@@ -188,7 +184,6 @@ struct c_common_identifier GTY(())
#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 a8066df..083e912 100644
--- a/gcc/c-format.c
+++ b/gcc/c-format.c
@@ -729,7 +729,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/cp/ChangeLog b/gcc/cp/ChangeLog
index aee593f..f00d0fb 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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>
PR c++/8227
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index dbb96eb..f3ffbf1 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -6656,7 +6656,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 209a15b..61efb58 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -1468,17 +1468,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 5e2ae89..848ef51 100644
--- a/gcc/cp/except.c
+++ b/gcc/cp/except.c
@@ -503,7 +503,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/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5574e17..bad7921 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,9 @@
2002-11-30 Mark Mitchell <mark@codesourcery.com>
+ PR c++/8332
+ PR c++/8493
+ * g++.dg/template/strlen1.C: New test.
+
PR c++/8227
* g++.dg/template/ctor2.C: New test.
diff --git a/gcc/testsuite/g++.dg/template/strlen1.C b/gcc/testsuite/g++.dg/template/strlen1.C
new file mode 100644
index 0000000..ddec51d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/strlen1.C
@@ -0,0 +1,9 @@
+template <typename A1>
+void monk2 (A1) {}
+
+unsigned int strlen (const char*);
+
+void monk ()
+{
+ monk2 (strlen (""));
+}
diff --git a/gcc/tree.h b/gcc/tree.h
index abe0703..a675851 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -1971,6 +1971,7 @@ enum tree_index
TI_VOID_TYPE,
TI_PTR_TYPE,
TI_CONST_PTR_TYPE,
+ TI_SIZE_TYPE,
TI_PTRDIFF_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]
/* 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]