typeck2.c (initializer_constant_valid_p): Moved to c-common.c.
* typeck2.c (initializer_constant_valid_p): Moved to c-common.c. * cp-tree.h (initializer_constant_valid_p): Remove. From-SVN: r28350
This commit is contained in:
parent
7e8176d778
commit
aac3691da5
|
@ -1,3 +1,8 @@
|
||||||
|
1999-07-30 Richard Henderson <rth@cygnus.com>
|
||||||
|
|
||||||
|
* typeck2.c (initializer_constant_valid_p): Moved to c-common.c.
|
||||||
|
* cp-tree.h (initializer_constant_valid_p): Remove.
|
||||||
|
|
||||||
1999-07-28 Mark Mitchell <mark@codesourcery.com>
|
1999-07-28 Mark Mitchell <mark@codesourcery.com>
|
||||||
|
|
||||||
* call.c (conditional_conversion): Don't build BASE_CONVs for
|
* call.c (conditional_conversion): Don't build BASE_CONVs for
|
||||||
|
|
|
@ -3586,7 +3586,6 @@ extern tree build_functional_cast PROTO((tree, tree));
|
||||||
extern char *enum_name_string PROTO((tree, tree));
|
extern char *enum_name_string PROTO((tree, tree));
|
||||||
extern void report_case_error PROTO((int, tree, tree, tree));
|
extern void report_case_error PROTO((int, tree, tree, tree));
|
||||||
extern void check_for_new_type PROTO((const char *, flagged_type_tree));
|
extern void check_for_new_type PROTO((const char *, flagged_type_tree));
|
||||||
extern tree initializer_constant_valid_p PROTO((tree, tree));
|
|
||||||
|
|
||||||
/* in xref.c */
|
/* in xref.c */
|
||||||
extern void GNU_xref_begin PROTO((const char *));
|
extern void GNU_xref_begin PROTO((const char *));
|
||||||
|
|
140
gcc/cp/typeck2.c
140
gcc/cp/typeck2.c
|
@ -378,146 +378,6 @@ my_friendly_assert (cond, where)
|
||||||
my_friendly_abort (where);
|
my_friendly_abort (where);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return nonzero if VALUE is a valid constant-valued expression
|
|
||||||
for use in initializing a static variable; one that can be an
|
|
||||||
element of a "constant" initializer.
|
|
||||||
|
|
||||||
Return null_pointer_node if the value is absolute;
|
|
||||||
if it is relocatable, return the variable that determines the relocation.
|
|
||||||
We assume that VALUE has been folded as much as possible;
|
|
||||||
therefore, we do not need to check for such things as
|
|
||||||
arithmetic-combinations of integers. */
|
|
||||||
|
|
||||||
tree
|
|
||||||
initializer_constant_valid_p (value, endtype)
|
|
||||||
tree value;
|
|
||||||
tree endtype;
|
|
||||||
{
|
|
||||||
switch (TREE_CODE (value))
|
|
||||||
{
|
|
||||||
case CONSTRUCTOR:
|
|
||||||
if (TREE_CODE (TREE_TYPE (value)) == UNION_TYPE
|
|
||||||
&& TREE_CONSTANT (value))
|
|
||||||
return
|
|
||||||
initializer_constant_valid_p (TREE_VALUE (CONSTRUCTOR_ELTS (value)),
|
|
||||||
endtype);
|
|
||||||
|
|
||||||
return TREE_STATIC (value) ? null_pointer_node : 0;
|
|
||||||
|
|
||||||
case INTEGER_CST:
|
|
||||||
case REAL_CST:
|
|
||||||
case STRING_CST:
|
|
||||||
case COMPLEX_CST:
|
|
||||||
case PTRMEM_CST:
|
|
||||||
return null_pointer_node;
|
|
||||||
|
|
||||||
case ADDR_EXPR:
|
|
||||||
return TREE_OPERAND (value, 0);
|
|
||||||
|
|
||||||
case NON_LVALUE_EXPR:
|
|
||||||
return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
|
|
||||||
|
|
||||||
case CONVERT_EXPR:
|
|
||||||
case NOP_EXPR:
|
|
||||||
/* Allow conversions between pointer types. */
|
|
||||||
if (POINTER_TYPE_P (TREE_TYPE (value))
|
|
||||||
&& POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
|
|
||||||
return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
|
|
||||||
|
|
||||||
/* Allow conversions between real types. */
|
|
||||||
if (TREE_CODE (TREE_TYPE (value)) == REAL_TYPE
|
|
||||||
&& TREE_CODE (TREE_TYPE (TREE_OPERAND (value, 0))) == REAL_TYPE)
|
|
||||||
return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
|
|
||||||
|
|
||||||
/* Allow length-preserving conversions between integer types. */
|
|
||||||
if (TREE_CODE (TREE_TYPE (value)) == INTEGER_TYPE
|
|
||||||
&& TREE_CODE (TREE_TYPE (TREE_OPERAND (value, 0))) == INTEGER_TYPE
|
|
||||||
&& (TYPE_PRECISION (TREE_TYPE (value))
|
|
||||||
== TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value, 0)))))
|
|
||||||
return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
|
|
||||||
|
|
||||||
/* Allow conversions between other integer types only if
|
|
||||||
explicit value. */
|
|
||||||
if (TREE_CODE (TREE_TYPE (value)) == INTEGER_TYPE
|
|
||||||
&& TREE_CODE (TREE_TYPE (TREE_OPERAND (value, 0))) == INTEGER_TYPE)
|
|
||||||
{
|
|
||||||
tree inner = initializer_constant_valid_p (TREE_OPERAND (value, 0),
|
|
||||||
endtype);
|
|
||||||
if (inner == null_pointer_node)
|
|
||||||
return null_pointer_node;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Allow (int) &foo provided int is as wide as a pointer. */
|
|
||||||
if (TREE_CODE (TREE_TYPE (value)) == INTEGER_TYPE
|
|
||||||
&& TREE_CODE (TREE_TYPE (TREE_OPERAND (value, 0))) == POINTER_TYPE
|
|
||||||
&& (TYPE_PRECISION (TREE_TYPE (value))
|
|
||||||
>= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value, 0)))))
|
|
||||||
return initializer_constant_valid_p (TREE_OPERAND (value, 0),
|
|
||||||
endtype);
|
|
||||||
|
|
||||||
/* Likewise conversions from int to pointers, but also allow
|
|
||||||
conversions from 0. */
|
|
||||||
if (TREE_CODE (TREE_TYPE (value)) == POINTER_TYPE
|
|
||||||
&& TREE_CODE (TREE_TYPE (TREE_OPERAND (value, 0))) == INTEGER_TYPE)
|
|
||||||
{
|
|
||||||
if (integer_zerop (TREE_OPERAND (value, 0)))
|
|
||||||
return null_pointer_node;
|
|
||||||
else if (TYPE_PRECISION (TREE_TYPE (value))
|
|
||||||
<= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value, 0))))
|
|
||||||
return initializer_constant_valid_p (TREE_OPERAND (value, 0),
|
|
||||||
endtype);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Allow conversions to union types if the value inside is okay. */
|
|
||||||
if (TREE_CODE (TREE_TYPE (value)) == UNION_TYPE)
|
|
||||||
return initializer_constant_valid_p (TREE_OPERAND (value, 0),
|
|
||||||
endtype);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case PLUS_EXPR:
|
|
||||||
if ((TREE_CODE (endtype) == INTEGER_TYPE)
|
|
||||||
&& (TYPE_PRECISION (endtype) < POINTER_SIZE))
|
|
||||||
return 0;
|
|
||||||
{
|
|
||||||
tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0),
|
|
||||||
endtype);
|
|
||||||
tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1),
|
|
||||||
endtype);
|
|
||||||
/* If either term is absolute, use the other terms relocation. */
|
|
||||||
if (valid0 == null_pointer_node)
|
|
||||||
return valid1;
|
|
||||||
if (valid1 == null_pointer_node)
|
|
||||||
return valid0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
case MINUS_EXPR:
|
|
||||||
if ((TREE_CODE (endtype) == INTEGER_TYPE)
|
|
||||||
&& (TYPE_PRECISION (endtype) < POINTER_SIZE))
|
|
||||||
return 0;
|
|
||||||
{
|
|
||||||
tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0),
|
|
||||||
endtype);
|
|
||||||
tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1),
|
|
||||||
endtype);
|
|
||||||
/* Win if second argument is absolute. */
|
|
||||||
if (valid1 == null_pointer_node)
|
|
||||||
return valid0;
|
|
||||||
/* Win if both arguments have the same relocation.
|
|
||||||
Then the value is absolute. */
|
|
||||||
if (valid0 == valid1)
|
|
||||||
return null_pointer_node;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Perform appropriate conversions on the initial value of a variable,
|
/* Perform appropriate conversions on the initial value of a variable,
|
||||||
store it in the declaration DECL,
|
store it in the declaration DECL,
|
||||||
and print any error messages that are appropriate.
|
and print any error messages that are appropriate.
|
||||||
|
|
Loading…
Reference in New Issue