Mercurial > hg > CbC > CbC_gcc
diff gcc/cp/cvt.c @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children | 1830386684a0 |
line wrap: on
line diff
--- a/gcc/cp/cvt.c Fri Oct 27 22:46:09 2017 +0900 +++ b/gcc/cp/cvt.c Thu Oct 25 07:37:49 2018 +0900 @@ -1,5 +1,5 @@ /* Language-level data type conversion for GNU C++. - Copyright (C) 1987-2017 Free Software Foundation, Inc. + Copyright (C) 1987-2018 Free Software Foundation, Inc. Hacked by Michael Tiemann (tiemann@cygnus.com) This file is part of GCC. @@ -77,7 +77,7 @@ tree intype = TREE_TYPE (expr); enum tree_code form; tree rval; - location_t loc = EXPR_LOC_OR_LOC (expr, input_location); + location_t loc = cp_expr_loc_or_loc (expr, input_location); if (intype == error_mark_node) return error_mark_node; @@ -122,7 +122,7 @@ form = TREE_CODE (intype); - if (POINTER_TYPE_P (intype)) + if (INDIRECT_TYPE_P (intype)) { intype = TYPE_MAIN_VARIANT (intype); @@ -239,6 +239,11 @@ gcc_assert (GET_MODE_SIZE (SCALAR_INT_TYPE_MODE (TREE_TYPE (expr))) == GET_MODE_SIZE (SCALAR_INT_TYPE_MODE (type))); + /* FIXME needed because convert_to_pointer_maybe_fold still folds + conversion of constants. */ + if (!dofold) + return build1 (CONVERT_EXPR, type, expr); + return convert_to_pointer_maybe_fold (type, expr, dofold); } @@ -317,7 +322,7 @@ tree argtype = TREE_TYPE (arg); tree target_type = TREE_TYPE (type); - gcc_assert (TREE_CODE (type) == REFERENCE_TYPE); + gcc_assert (TYPE_REF_P (type)); if ((flags & DIRECT_BIND) && ! lvalue_p (arg)) { @@ -376,7 +381,8 @@ { tree ttl = TREE_TYPE (reftype); - if (!CP_TYPE_CONST_NON_VOLATILE_P (ttl)) + if (!TYPE_REF_IS_RVALUE (reftype) + && !CP_TYPE_CONST_NON_VOLATILE_P (ttl)) { const char *msg; @@ -413,7 +419,7 @@ tree rval = NULL_TREE; tree rval_as_conversion = NULL_TREE; bool can_convert_intype_to_type; - location_t loc = EXPR_LOC_OR_LOC (expr, input_location); + location_t loc = cp_expr_loc_or_loc (expr, input_location); if (TREE_CODE (type) == FUNCTION_TYPE && TREE_TYPE (expr) == unknown_type_node) @@ -424,8 +430,8 @@ intype = TREE_TYPE (expr); - gcc_assert (TREE_CODE (intype) != REFERENCE_TYPE); - gcc_assert (TREE_CODE (reftype) == REFERENCE_TYPE); + gcc_assert (!TYPE_REF_P (intype)); + gcc_assert (TYPE_REF_P (reftype)); intype = TYPE_MAIN_VARIANT (intype); @@ -528,7 +534,7 @@ convert_from_reference (tree val) { if (TREE_TYPE (val) - && TREE_CODE (TREE_TYPE (val)) == REFERENCE_TYPE) + && TYPE_REF_P (TREE_TYPE (val))) { tree t = TREE_TYPE (TREE_TYPE (val)); tree ref = build1 (INDIRECT_REF, t, val); @@ -596,12 +602,20 @@ tree conv; if (TREE_TYPE (expr) == type) conv = expr; - else if (TREE_CODE (expr) == PTRMEM_CST) + else if (TREE_CODE (expr) == PTRMEM_CST + && same_type_p (TYPE_PTRMEM_CLASS_TYPE (type), + PTRMEM_CST_CLASS (expr))) { /* Avoid wrapping a PTRMEM_CST in NOP_EXPR. */ conv = copy_node (expr); TREE_TYPE (conv) = type; } + else if (TYPE_PTRMEM_P (type)) + { + conv = convert_ptrmem (type, expr, true, false, + tf_warning_or_error); + conv = cp_fully_fold (conv); + } else { conv = fold_convert (type, expr); @@ -653,7 +667,7 @@ folded_result = fold_simple (folded_result); if (!TREE_OVERFLOW_P (folded) && folded_result != error_mark_node) - warnings_for_convert_and_check (EXPR_LOC_OR_LOC (expr, input_location), + warnings_for_convert_and_check (cp_expr_loc_or_loc (expr, input_location), type, folded, folded_result); } @@ -672,7 +686,7 @@ enum tree_code code = TREE_CODE (type); const char *invalid_conv_diag; tree e1; - location_t loc = EXPR_LOC_OR_LOC (expr, input_location); + location_t loc = cp_expr_loc_or_loc (expr, input_location); bool dofold = (convtype & CONV_FOLD); if (error_operand_p (e) || type == error_mark_node) @@ -691,10 +705,22 @@ /* FIXME remove when moving to c_fully_fold model. */ if (!CLASS_TYPE_P (type)) - e = scalar_constant_value (e); + { + e = mark_rvalue_use (e); + e = scalar_constant_value (e); + } if (error_operand_p (e)) return error_mark_node; + if (NULLPTR_TYPE_P (type) && null_ptr_cst_p (e)) + { + if (complain & tf_warning) + maybe_warn_zero_as_null_pointer_constant (e, loc); + + if (!TREE_SIDE_EFFECTS (e)) + return nullptr_node; + } + if (MAYBE_CLASS_TYPE_P (type) && (convtype & CONV_FORCE_TEMP)) /* We need a new temporary; don't take this shortcut. */; else if (same_type_ignoring_top_level_qualifiers_p (type, TREE_TYPE (e))) @@ -816,13 +842,7 @@ /* Ignore any integer overflow caused by the conversion. */ return ignore_overflows (converted, e); } - if (NULLPTR_TYPE_P (type) && e && null_ptr_cst_p (e)) - { - if (complain & tf_warning) - maybe_warn_zero_as_null_pointer_constant (e, loc); - return nullptr_node; - } - if (POINTER_TYPE_P (type) || TYPE_PTRMEM_P (type)) + if (INDIRECT_TYPE_P (type) || TYPE_PTRMEM_P (type)) return cp_convert_to_pointer (type, e, dofold, complain); if (code == VECTOR_TYPE) { @@ -933,7 +953,7 @@ if we can. */ tree -cp_get_fndecl_from_callee (tree fn) +cp_get_fndecl_from_callee (tree fn, bool fold /* = true */) { if (fn == NULL_TREE) return fn; @@ -942,8 +962,9 @@ tree type = TREE_TYPE (fn); if (type == unknown_type_node) return NULL_TREE; - gcc_assert (POINTER_TYPE_P (type)); - fn = maybe_constant_init (fn); + gcc_assert (INDIRECT_TYPE_P (type)); + if (fold) + fn = maybe_constant_init (fn); STRIP_NOPS (fn); if (TREE_CODE (fn) == ADDR_EXPR) { @@ -963,6 +984,14 @@ return cp_get_fndecl_from_callee (cp_get_callee (call)); } +/* As above, but not using the constexpr machinery. */ + +tree +cp_get_callee_fndecl_nofold (tree call) +{ + return cp_get_fndecl_from_callee (cp_get_callee (call), false); +} + /* Subroutine of convert_to_void. Warn if we're discarding something with attribute [[nodiscard]]. */ @@ -972,7 +1001,7 @@ tree call = expr; if (TREE_CODE (expr) == TARGET_EXPR) call = TARGET_EXPR_INITIAL (expr); - location_t loc = EXPR_LOC_OR_LOC (call, input_location); + location_t loc = cp_expr_loc_or_loc (call, input_location); tree callee = cp_get_callee (call); if (!callee) return; @@ -980,7 +1009,7 @@ tree type = TREE_TYPE (callee); if (TYPE_PTRMEMFUNC_P (type)) type = TYPE_PTRMEMFUNC_FN_TYPE (type); - if (POINTER_TYPE_P (type)) + if (INDIRECT_TYPE_P (type)) type = TREE_TYPE (type); tree rettype = TREE_TYPE (type); @@ -988,6 +1017,7 @@ if (implicit != ICV_CAST && fn && lookup_attribute ("nodiscard", DECL_ATTRIBUTES (fn))) { + auto_diagnostic_group d; if (warning_at (loc, OPT_Wunused_result, "ignoring return value of %qD, " "declared with attribute nodiscard", fn)) @@ -996,6 +1026,7 @@ else if (implicit != ICV_CAST && lookup_attribute ("nodiscard", TYPE_ATTRIBUTES (rettype))) { + auto_diagnostic_group d; if (warning_at (loc, OPT_Wunused_result, "ignoring returned value of type %qT, " "declared with attribute nodiscard", rettype)) @@ -1014,6 +1045,7 @@ result is used, so handle that case here. */ if (fn) { + auto_diagnostic_group d; if (warning_at (loc, OPT_Wunused_result, "ignoring return value of %qD, " "declared with attribute warn_unused_result", @@ -1049,12 +1081,14 @@ tree convert_to_void (tree expr, impl_conv_void implicit, tsubst_flags_t complain) { - location_t loc = EXPR_LOC_OR_LOC (expr, input_location); + location_t loc = cp_expr_loc_or_loc (expr, input_location); if (expr == error_mark_node || TREE_TYPE (expr) == error_mark_node) return error_mark_node; + expr = maybe_undo_parenthesized_ref (expr); + expr = mark_discarded_use (expr); if (implicit == ICV_CAST) /* An explicit cast to void avoids all -Wunused-but-set* warnings. */ @@ -1133,8 +1167,7 @@ case INDIRECT_REF: { tree type = TREE_TYPE (expr); - int is_reference = TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) - == REFERENCE_TYPE; + int is_reference = TYPE_REF_P (TREE_TYPE (TREE_OPERAND (expr, 0))); int is_volatile = TYPE_VOLATILE (type); int is_complete = COMPLETE_TYPE_P (complete_type (type)); @@ -1572,7 +1605,7 @@ intype = TREE_TYPE (expr); - if (POINTER_TYPE_P (type) && POINTER_TYPE_P (intype)) + if (INDIRECT_TYPE_P (type) && INDIRECT_TYPE_P (intype)) return build_nop (type, expr); return ocp_convert (type, expr, CONV_BACKEND_CONVERT, @@ -1642,7 +1675,7 @@ tree conv = NULL_TREE; tree winner = NULL_TREE; - if (expr == null_node + if (null_node_p (expr) && (desires & WANT_INT) && !(desires & WANT_NULL)) { @@ -1915,7 +1948,8 @@ /* Attempt to perform qualification conversions on EXPR to convert it to TYPE. Return the resulting expression, or error_mark_node if - the conversion was impossible. */ + the conversion was impossible. Since this is only used by + convert_nontype_argument, we fold the conversion. */ tree perform_qualification_conversions (tree type, tree expr) @@ -1927,7 +1961,7 @@ if (same_type_p (type, expr_type)) return expr; else if (can_convert_qual (type, expr)) - return build_nop (type, expr); + return cp_fold_convert (type, expr); else return error_mark_node; } @@ -1981,8 +2015,8 @@ t = TYPE_PTRMEMFUNC_FN_TYPE (t); f = TYPE_PTRMEMFUNC_FN_TYPE (f); } - if (TREE_CODE (t) == POINTER_TYPE - && TREE_CODE (f) == POINTER_TYPE) + if (TYPE_PTR_P (t) + && TYPE_PTR_P (f)) { t = TREE_TYPE (t); f = TREE_TYPE (f); @@ -2012,8 +2046,8 @@ t = TYPE_PTRMEMFUNC_FN_TYPE (t); f = TYPE_PTRMEMFUNC_FN_TYPE (f); } - if (TREE_CODE (t) == POINTER_TYPE - && TREE_CODE (f) == POINTER_TYPE) + if (TYPE_PTR_P (t) + && TYPE_PTR_P (f)) { t = TREE_TYPE (t); f = TREE_TYPE (f);