bool cp_function_decl_explicit_p (tree decl) { return (decl && DECL_LANG_SPECIFIC (STRIP_TEMPLATE (decl)) && DECL_NONCONVERTING_P (decl)); }
bool cp_function_decl_explicit_p (tree decl) { return (decl && FUNCTION_FIRST_USER_PARMTYPE (decl) != void_list_node && DECL_LANG_SPECIFIC (STRIP_TEMPLATE (decl)) && DECL_NONCONVERTING_P (decl)); }
static void pp_cxx_function_specifier (cxx_pretty_printer *pp, tree t) { switch (TREE_CODE (t)) { case FUNCTION_DECL: if (DECL_VIRTUAL_P (t)) pp_cxx_identifier (pp, "virtual"); else if (DECL_CONSTRUCTOR_P (t) && DECL_NONCONVERTING_P (t)) pp_cxx_identifier (pp, "explicit"); else pp_c_function_specifier (pp_c_base (pp), t); default: break; } }
/* Return -1 if dwarf ATTR shouldn't be added for DECL, or the attribute value otherwise. */ int cp_decl_dwarf_attribute (const_tree decl, int attr) { if (decl == NULL_TREE) return -1; switch (attr) { case DW_AT_explicit: if (TREE_CODE (decl) == FUNCTION_DECL && DECL_LANG_SPECIFIC (STRIP_TEMPLATE (decl)) && DECL_NONCONVERTING_P (decl)) return 1; break; case DW_AT_deleted: if (TREE_CODE (decl) == FUNCTION_DECL && DECL_LANG_SPECIFIC (STRIP_TEMPLATE (decl)) && DECL_DELETED_FN (decl)) return 1; break; case DW_AT_defaulted: if (TREE_CODE (decl) == FUNCTION_DECL && DECL_LANG_SPECIFIC (STRIP_TEMPLATE (decl)) && DECL_DEFAULTED_FN (decl)) { if (DECL_DEFAULTED_IN_CLASS_P (decl)) return DW_DEFAULTED_in_class; if (DECL_DEFAULTED_OUTSIDE_CLASS_P (decl)) return DW_DEFAULTED_out_of_class; } break; case DW_AT_const_expr: if (VAR_OR_FUNCTION_DECL_P (decl) && DECL_DECLARED_CONSTEXPR_P (decl)) return 1; break; case DW_AT_reference: if (TREE_CODE (decl) == FUNCTION_DECL && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl) && FUNCTION_REF_QUALIFIED (TREE_TYPE (decl)) && !FUNCTION_RVALUE_QUALIFIED (TREE_TYPE (decl))) return 1; break; case DW_AT_rvalue_reference: if (TREE_CODE (decl) == FUNCTION_DECL && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl) && FUNCTION_REF_QUALIFIED (TREE_TYPE (decl)) && FUNCTION_RVALUE_QUALIFIED (TREE_TYPE (decl))) return 1; break; case DW_AT_inline: if (VAR_P (decl) && DECL_INLINE_VAR_P (decl)) { if (DECL_VAR_DECLARED_INLINE_P (decl)) return DW_INL_declared_inlined; else return DW_INL_inlined; } break; case DW_AT_export_symbols: if (TREE_CODE (decl) == NAMESPACE_DECL && (DECL_NAMESPACE_INLINE_P (decl) || (DECL_NAME (decl) == NULL_TREE && dwarf_version >= 5))) return 1; break; default: break; } return -1; }
tree build_expr_type_conversion (int desires, tree expr, bool complain) { tree basetype = TREE_TYPE (expr); tree conv = NULL_TREE; tree winner = NULL_TREE; if (expr == null_node && (desires & WANT_INT) && !(desires & WANT_NULL)) warning_at (input_location, OPT_Wconversion_null, "converting NULL to non-pointer type"); basetype = TREE_TYPE (expr); if (basetype == error_mark_node) return error_mark_node; if (! MAYBE_CLASS_TYPE_P (basetype)) switch (TREE_CODE (basetype)) { case INTEGER_TYPE: if ((desires & WANT_NULL) && null_ptr_cst_p (expr)) return expr; /* else fall through... */ case BOOLEAN_TYPE: return (desires & WANT_INT) ? expr : NULL_TREE; case ENUMERAL_TYPE: return (desires & WANT_ENUM) ? expr : NULL_TREE; case REAL_TYPE: return (desires & WANT_FLOAT) ? expr : NULL_TREE; case POINTER_TYPE: return (desires & WANT_POINTER) ? expr : NULL_TREE; case FUNCTION_TYPE: case ARRAY_TYPE: return (desires & WANT_POINTER) ? decay_conversion (expr) : NULL_TREE; case COMPLEX_TYPE: case VECTOR_TYPE: if ((desires & WANT_VECTOR_OR_COMPLEX) == 0) return NULL_TREE; switch (TREE_CODE (TREE_TYPE (basetype))) { case INTEGER_TYPE: case BOOLEAN_TYPE: return (desires & WANT_INT) ? expr : NULL_TREE; case ENUMERAL_TYPE: return (desires & WANT_ENUM) ? expr : NULL_TREE; case REAL_TYPE: return (desires & WANT_FLOAT) ? expr : NULL_TREE; default: return NULL_TREE; } default: return NULL_TREE; } /* The code for conversions from class type is currently only used for delete expressions. Other expressions are handled by build_new_op. */ if (!complete_type_or_else (basetype, expr)) return error_mark_node; if (!TYPE_HAS_CONVERSION (basetype)) return NULL_TREE; for (conv = lookup_conversions (basetype, /*lookup_template_convs_p=*/true); conv; conv = TREE_CHAIN (conv)) { int win = 0; tree candidate; tree cand = TREE_VALUE (conv); cand = OVL_CURRENT (cand); if (winner && winner == cand) continue; if (DECL_NONCONVERTING_P (cand)) continue; candidate = non_reference (TREE_TYPE (TREE_TYPE (cand))); switch (TREE_CODE (candidate)) { case BOOLEAN_TYPE: case INTEGER_TYPE: win = (desires & WANT_INT); break; case ENUMERAL_TYPE: win = (desires & WANT_ENUM); break; case REAL_TYPE: win = (desires & WANT_FLOAT); break; case POINTER_TYPE: win = (desires & WANT_POINTER); break; case COMPLEX_TYPE: case VECTOR_TYPE: if ((desires & WANT_VECTOR_OR_COMPLEX) == 0) break; switch (TREE_CODE (TREE_TYPE (candidate))) { case BOOLEAN_TYPE: case INTEGER_TYPE: win = (desires & WANT_INT); break; case ENUMERAL_TYPE: win = (desires & WANT_ENUM); break; case REAL_TYPE: win = (desires & WANT_FLOAT); break; default: break; } break; default: break; } if (win) { if (winner) { if (complain) { error ("ambiguous default type conversion from %qT", basetype); error (" candidate conversions include %qD and %qD", winner, cand); } return error_mark_node; } else winner = cand; } } if (winner) { tree type = non_reference (TREE_TYPE (TREE_TYPE (winner))); return build_user_type_conversion (type, expr, LOOKUP_NORMAL); } return NULL_TREE; }