+2018-10-11 Will Wray <wjwray@gmail.com>
+
+ PR c++/87364
+ * c-pretty-print.h (pp_c_type_cast): Prototype.
+ (pp_c_integer_constant): Likewise.
+ * c-pretty-print.c (pp_c_type_cast): No longer static.
+ (pp_c_integer_constant): Likewise.
+ (pp_c_enumeration_constant): Fix loop termination when finding
+ name of constant. No longer returns a value. Call
+ pp_c_integer_constant.
+ (c_pretty_printer::constant): Update for changes to
+ pp_c_enumeration_constant.
+
2018-10-11 Jakub Jelinek <jakub@redhat.com>
* c-lex.c (c_common_has_attribute): Return 201803 instead of 20180312
/* Pretty-print T using the type-cast notation '( type-name )'. */
-static void
+void
pp_c_type_cast (c_pretty_printer *pp, tree t)
{
pp_c_left_paren (pp);
/* Pretty-print an INTEGER literal. */
-static void
+void
pp_c_integer_constant (c_pretty_printer *pp, tree i)
{
if (tree_fits_shwi_p (i))
pp_unsupported_tree (pp, b);
}
-/* Attempt to print out an ENUMERATOR. Return true on success. Else return
- false; that means the value was obtained by a cast, in which case
- print out the type-id part of the cast-expression -- the casted value
- is then printed by pp_c_integer_literal. */
+/* Given a value e of ENUMERAL_TYPE:
+ Print out the first ENUMERATOR id with value e, if one is found,
+ else print out the value as a C-style cast (type-id)value. */
-static bool
+static void
pp_c_enumeration_constant (c_pretty_printer *pp, tree e)
{
- bool value_is_named = true;
tree type = TREE_TYPE (e);
tree value;
/* Find the name of this constant. */
for (value = TYPE_VALUES (type);
- value != NULL_TREE && !tree_int_cst_equal (TREE_VALUE (value), e);
+ value != NULL_TREE
+ && !tree_int_cst_equal (DECL_INITIAL (TREE_VALUE (value)), e);
value = TREE_CHAIN (value))
;
{
/* Value must have been cast. */
pp_c_type_cast (pp, type);
- value_is_named = false;
+ pp_c_integer_constant (pp, e);
}
-
- return value_is_named;
}
/* Print out a REAL value as a decimal-floating-constant. */
pp_c_bool_constant (this, e);
else if (type == char_type_node)
pp_c_character_constant (this, e);
- else if (TREE_CODE (type) == ENUMERAL_TYPE
- && pp_c_enumeration_constant (this, e))
- ;
+ else if (TREE_CODE (type) == ENUMERAL_TYPE)
+ pp_c_enumeration_constant (this, e))
else
pp_c_integer_constant (this, e);
}
void pp_c_expression_list (c_pretty_printer *, tree);
void pp_c_constructor_elts (c_pretty_printer *, vec<constructor_elt, va_gc> *);
void pp_c_call_argument_list (c_pretty_printer *, tree);
+void pp_c_type_cast (c_pretty_printer *, tree);
void pp_c_cast_expression (c_pretty_printer *, tree);
void pp_c_init_declarator (c_pretty_printer *, tree);
void pp_c_ws_string (c_pretty_printer *, const char *);
void pp_c_identifier (c_pretty_printer *, const char *);
void pp_c_string_literal (c_pretty_printer *, tree);
+void pp_c_integer_constant (c_pretty_printer *, tree);
void print_c_tree (FILE *file, tree t);
+2018-10-11 Will Wray <wjwray@gmail.com>
+
+ PR c++/87364
+ * cxx-pretty-print.c (pp_cxx_enumeration_constant): New function.
+ (cxx_pretty_printer::constant): Use it.
+
2018-10-11 David Malcolm <dmalcolm@redhat.com>
PR c++/84993
}
}
+/* Given a value e of ENUMERAL_TYPE:
+ Print out the first ENUMERATOR id with value e, if one is found,
+ (including nested names but excluding the enum name if unscoped)
+ else print out the value as a C-style cast (type-id)value. */
+
+static void
+pp_cxx_enumeration_constant (cxx_pretty_printer *pp, tree e)
+{
+ tree type = TREE_TYPE (e);
+ tree value;
+
+ /* Find the name of this constant. */
+ for (value = TYPE_VALUES (type);
+ value != NULL_TREE
+ && !tree_int_cst_equal (DECL_INITIAL (TREE_VALUE (value)), e);
+ value = TREE_CHAIN (value))
+ ;
+
+ if (value != NULL_TREE)
+ {
+ if (!ENUM_IS_SCOPED (type))
+ type = get_containing_scope (type);
+ pp_cxx_nested_name_specifier (pp, type);
+ pp->id_expression (TREE_PURPOSE (value));
+ }
+ else
+ {
+ /* Value must have been cast. */
+ pp_c_type_cast (pp, type);
+ pp_c_integer_constant (pp, e);
+ }
+}
+
void
cxx_pretty_printer::constant (tree t)
pp_string (this, "nullptr");
break;
}
+ else if (TREE_CODE (TREE_TYPE (t)) == ENUMERAL_TYPE)
+ {
+ pp_cxx_enumeration_constant (this, t);
+ break;
+ }
/* fall through. */
default: