diff options
-rw-r--r-- | gcc/c-family/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/c-family/c-ada-spec.c | 33 |
2 files changed, 32 insertions, 8 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 2ce3f59..642ff7d 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,10 @@ +2012-08-23 Arnaud Charlet <charlet@adacore.com> + + * c-ada-spec.c (dump_generic_ada_node): Fix handling of name_only + for pointers, and add missing Convention C pragma. + (print_ada_struct_decl): Add missing aliased keyword. + (dump_ads): Add pragma Ada_2005 and Style_Checks (Off). + 2012-08-17 Jakub Jelinek <jakub@redhat.com> * c-common.c (sizeof_pointer_memaccess_warning): New function. diff --git a/gcc/c-family/c-ada-spec.c b/gcc/c-family/c-ada-spec.c index 2a97c48..cc6f260 100644 --- a/gcc/c-family/c-ada-spec.c +++ b/gcc/c-family/c-ada-spec.c @@ -1947,7 +1947,12 @@ dump_generic_ada_node (pretty_printer *buffer, tree node, tree type, case POINTER_TYPE: case REFERENCE_TYPE: - if (TREE_CODE (TREE_TYPE (node)) == FUNCTION_TYPE) + if (name_only && TYPE_NAME (node)) + dump_generic_ada_node + (buffer, TYPE_NAME (node), node, cpp_check, + spc, limited_access, true); + + else if (TREE_CODE (TREE_TYPE (node)) == FUNCTION_TYPE) { tree fnode = TREE_TYPE (node); bool is_function; @@ -1975,17 +1980,25 @@ dump_generic_ada_node (pretty_printer *buffer, tree node, tree type, dump_generic_ada_node (buffer, TREE_TYPE (fnode), type, cpp_check, spc, 0, true); } + + /* If we are dumping the full type, it means we are part of a + type definition and need also a Convention C pragma. */ + if (!name_only) + { + pp_semicolon (buffer); + newline_and_indent (buffer, spc); + pp_string (buffer, "pragma Convention (C, "); + dump_generic_ada_node + (buffer, type, 0, cpp_check, spc, false, true); + pp_string (buffer, ")"); + } } else { int is_access = false; unsigned int quals = TYPE_QUALS (TREE_TYPE (node)); - if (name_only && TYPE_NAME (node)) - dump_generic_ada_node - (buffer, TYPE_NAME (node), node, cpp_check, - spc, limited_access, true); - else if (VOID_TYPE_P (TREE_TYPE (node))) + if (VOID_TYPE_P (TREE_TYPE (node))) { if (!name_only) pp_string (buffer, "new "); @@ -3087,10 +3100,10 @@ print_ada_struct_decl (pretty_printer *buffer, tree node, tree type, INDENT (field_spc); if (field_num == 0) - pp_string (buffer, "parent : "); + pp_string (buffer, "parent : aliased "); else { - sprintf (buf, "field_%d : ", field_num + 1); + sprintf (buf, "field_%d : aliased ", field_num + 1); pp_string (buffer, buf); } dump_ada_decl_name @@ -3262,6 +3275,10 @@ dump_ads (const char *source_file, /* Dump all references. */ dump_ada_nodes (&pp, source_file, cpp_check); + /* Requires Ada 2005 syntax, so generate corresponding pragma. + Also, disable style checks since this file is auto-generated. */ + fprintf (f, "pragma Ada_2005;\npragma Style_Checks (Off);\n\n"); + /* Dump withs. */ dump_ada_withs (f); |