case PTRMEM_CST:
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:      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;}