mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-23 06:20:25 +08:00
cp-tree.h (ansi_null_node): New variable.
* cp-tree.h (ansi_null_node): New variable. * decl.c (ansi_null_node): New variable. (init_decl_processing): Initialize its type. * lex.c (init_parse): Initialize its value. Use ansi_null_node for null_node in non-ANSI mode. * typeck.c (build_binary_op_nodefault): Use ansi_null_node in place of null_node to avoid spurious errors. From-SVN: r21858
This commit is contained in:
parent
a255ef043c
commit
898600d5fa
@ -1,3 +1,13 @@
|
||||
1998-08-19 Mark Mitchell <mark@markmitchell.com>
|
||||
|
||||
* cp-tree.h (ansi_null_node): New variable.
|
||||
* decl.c (ansi_null_node): New variable.
|
||||
(init_decl_processing): Initialize its type.
|
||||
* lex.c (init_parse): Initialize its value. Use ansi_null_node
|
||||
for null_node in non-ANSI mode.
|
||||
* typeck.c (build_binary_op_nodefault): Use ansi_null_node in
|
||||
place of null_node to avoid spurious errors.
|
||||
|
||||
1998-08-17 Mark Mitchell <mark@markmitchell.com>
|
||||
|
||||
* cp-tree.h (enter_scope_of): New function.
|
||||
|
@ -1918,6 +1918,7 @@ extern tree long_long_integer_type_node, long_long_unsigned_type_node;
|
||||
extern tree integer_two_node, integer_three_node;
|
||||
extern tree boolean_type_node, boolean_true_node, boolean_false_node;
|
||||
|
||||
extern tree ansi_null_node;
|
||||
extern tree null_node;
|
||||
|
||||
/* in pt.c */
|
||||
|
@ -429,9 +429,13 @@ tree static_aggregates;
|
||||
tree integer_zero_node;
|
||||
tree null_pointer_node;
|
||||
|
||||
/* The value for __null (NULL), either of type `void *' or, with -ansi,
|
||||
an integer type of the same size. */
|
||||
/* The value for __null (NULL), when -ansi is specified. As per the
|
||||
standard, this is an implementation-defined null pointer constant. */
|
||||
tree ansi_null_node;
|
||||
|
||||
/* The value for __null (NULL). With -ansi, this is just
|
||||
ansi_null_node. Without -ansi, this is a zero-valued pointer
|
||||
constant of type `{unknown type}*'. */
|
||||
tree null_node;
|
||||
|
||||
/* A node for the integer constants 1, 2, and 3. */
|
||||
@ -6030,9 +6034,8 @@ init_decl_processing ()
|
||||
/* Indirecting an UNKNOWN_TYPE node yields an UNKNOWN_TYPE node. */
|
||||
TREE_TYPE (unknown_type_node) = unknown_type_node;
|
||||
|
||||
if (flag_ansi)
|
||||
TREE_TYPE (null_node) = type_for_size (POINTER_SIZE, 0);
|
||||
else
|
||||
TREE_TYPE (ansi_null_node) = type_for_size (POINTER_SIZE, 0);
|
||||
if (!flag_ansi)
|
||||
TREE_TYPE (null_node) = build_pointer_type (unknown_type_node);
|
||||
|
||||
/* Looking up TYPE_POINTER_TO and TYPE_REFERENCE_TO yield the same
|
||||
|
10
gcc/cp/lex.c
10
gcc/cp/lex.c
@ -777,7 +777,15 @@ init_parse (filename)
|
||||
TREE_TYPE (signature_type_node) = signature_type_node;
|
||||
ridpointers[(int) RID_SIGNATURE] = signature_type_node;
|
||||
|
||||
null_node = build_int_2 (0, 0);
|
||||
/* Create the built-in __null node. Note that we can't yet call for
|
||||
type_for_size here because integer_type_node and so forth are not
|
||||
set up. Therefore, we don't set the type of these nodes until
|
||||
init_decl_processing. */
|
||||
ansi_null_node = build_int_2 (0, 0);
|
||||
if (flag_ansi)
|
||||
null_node = ansi_null_node;
|
||||
else
|
||||
null_node = build_int_2 (0, 0);
|
||||
ridpointers[RID_NULL] = null_node;
|
||||
|
||||
opname_tab[(int) COMPONENT_REF] = "->";
|
||||
|
@ -3244,6 +3244,15 @@ build_binary_op_nodefault (code, orig_op0, orig_op1, error_code)
|
||||
/* Nonzero means set RESULT_TYPE to the common type of the args. */
|
||||
int common = 0;
|
||||
|
||||
/* Unless -ansi is specified, __null has pointer type. But, then,
|
||||
things like `7 != NULL' result in errors about comparisons
|
||||
between pointers and integers. So, here, we replace __null with
|
||||
an appropriate null pointer constant. */
|
||||
if (orig_op0 == null_node)
|
||||
orig_op0 = ansi_null_node;
|
||||
if (orig_op1 == null_node)
|
||||
orig_op1 = ansi_null_node;
|
||||
|
||||
/* Apply default conversions. */
|
||||
if (code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR
|
||||
|| code == TRUTH_OR_EXPR || code == TRUTH_ORIF_EXPR
|
||||
|
12
gcc/testsuite/g++.old-deja/g++.other/null1.C
Normal file
12
gcc/testsuite/g++.old-deja/g++.other/null1.C
Normal file
@ -0,0 +1,12 @@
|
||||
// Build don't link:
|
||||
|
||||
#include <cstddef>
|
||||
|
||||
void f()
|
||||
{
|
||||
int i;
|
||||
float f;
|
||||
|
||||
i != NULL;
|
||||
f != NULL;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user