aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/c-family/ChangeLog6
-rw-r--r--gcc/c-family/c-pretty-print.c42
-rw-r--r--gcc/c-family/c-pretty-print.h1
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/cxx-pretty-print.c2
-rw-r--r--gcc/cp/error.c2
6 files changed, 57 insertions, 0 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index ad2da89..5ac5792 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,6 +1,12 @@
2011-03-17 Kai Tietz
PR target/12171
+ * c-pretty-print.c (pp_c_specifier_qualifier_list):
+ Display allowed attributes for function pointer types.
+ (pp_c_attributes_display): New function to display
+ attributes having affects_type_identity flag set to true.
+ * c-pretty-print.h (pp_c_attributes_display): New prototype.
+
* c-common.c (c_common_attribute_table):
Add new element.
(c_common_format_attribute_table): Likewise.
diff --git a/gcc/c-family/c-pretty-print.c b/gcc/c-family/c-pretty-print.c
index 843e7a4..e418903 100644
--- a/gcc/c-family/c-pretty-print.c
+++ b/gcc/c-family/c-pretty-print.c
@@ -460,6 +460,7 @@ pp_c_specifier_qualifier_list (c_pretty_printer *pp, tree t)
{
pp_c_whitespace (pp);
pp_c_left_paren (pp);
+ pp_c_attributes_display (pp, TYPE_ATTRIBUTES (pointee));
}
else if (!c_dialect_cxx ())
pp_c_whitespace (pp);
@@ -790,6 +791,47 @@ pp_c_attributes (c_pretty_printer *pp, tree attributes)
pp_c_right_paren (pp);
}
+/* Pretty-print ATTRIBUTES using GNU C extension syntax for attributes
+ marked to be displayed on disgnostic. */
+
+void
+pp_c_attributes_display (c_pretty_printer *pp, tree a)
+{
+ bool is_first = true;
+
+ if (a == NULL_TREE)
+ return;
+
+ for (; a != NULL_TREE; a = TREE_CHAIN (a))
+ {
+ const struct attribute_spec *as;
+ as = lookup_attribute_spec (TREE_PURPOSE (a));
+ if (!as || as->affects_type_identity == false)
+ continue;
+ if (is_first)
+ {
+ pp_c_ws_string (pp, "__attribute__");
+ pp_c_left_paren (pp);
+ pp_c_left_paren (pp);
+ is_first = false;
+ }
+ else
+ {
+ pp_separate_with (pp, ',');
+ }
+ pp_tree_identifier (pp, TREE_PURPOSE (a));
+ if (TREE_VALUE (a))
+ pp_c_call_argument_list (pp, TREE_VALUE (a));
+ }
+
+ if (!is_first)
+ {
+ pp_c_right_paren (pp);
+ pp_c_right_paren (pp);
+ pp_c_whitespace (pp);
+ }
+}
+
/* function-definition:
declaration-specifiers declarator compound-statement */
diff --git a/gcc/c-family/c-pretty-print.h b/gcc/c-family/c-pretty-print.h
index f0daa4a..b41e8ed 100644
--- a/gcc/c-family/c-pretty-print.h
+++ b/gcc/c-family/c-pretty-print.h
@@ -177,6 +177,7 @@ void pp_c_space_for_pointer_operator (c_pretty_printer *, tree);
void pp_c_tree_decl_identifier (c_pretty_printer *, tree);
void pp_c_function_definition (c_pretty_printer *, tree);
void pp_c_attributes (c_pretty_printer *, tree);
+void pp_c_attributes_display (c_pretty_printer *, tree);
void pp_c_cv_qualifiers (c_pretty_printer *pp, int qualifiers, bool func_type);
void pp_c_type_qualifier_list (c_pretty_printer *, tree);
void pp_c_parameter_type_list (c_pretty_printer *, tree);
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 37124b4..b8069a8 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,6 +1,10 @@
2011-03-21 Kai Tietz <ktietz@redhat.com>
PR target/12171
+ * cxx-pretty-print.c (pp_cxx_ptr_operator):
+ Display allowed attributes for function pointer types.
+ * error.c (dump_type_prefix): Likewise.
+
* tree.c (cxx_attribute_table): Adjust table.
2011-03-18 Jason Merrill <jason@redhat.com>
diff --git a/gcc/cp/cxx-pretty-print.c b/gcc/cp/cxx-pretty-print.c
index a3e9146..d8bf912 100644
--- a/gcc/cp/cxx-pretty-print.c
+++ b/gcc/cp/cxx-pretty-print.c
@@ -1323,6 +1323,8 @@ pp_cxx_ptr_operator (cxx_pretty_printer *pp, tree t)
if (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE
|| TYPE_PTR_TO_MEMBER_P (TREE_TYPE (t)))
pp_cxx_ptr_operator (pp, TREE_TYPE (t));
+ pp_c_attributes_display (pp_c_base (pp),
+ TYPE_ATTRIBUTES (TREE_TYPE (t)));
if (TREE_CODE (t) == POINTER_TYPE)
{
pp_star (pp);
diff --git a/gcc/cp/error.c b/gcc/cp/error.c
index 28305d2..ec9b9fe 100644
--- a/gcc/cp/error.c
+++ b/gcc/cp/error.c
@@ -661,6 +661,8 @@ dump_type_prefix (tree t, int flags)
{
pp_cxx_whitespace (cxx_pp);
pp_cxx_left_paren (cxx_pp);
+ pp_c_attributes_display (pp_c_base (cxx_pp),
+ TYPE_ATTRIBUTES (sub));
}
if (TREE_CODE (t) == POINTER_TYPE)
pp_character(cxx_pp, '*');