Variant gcc-13-14
Applies to 13.2.0, 14.2.0. Source flavors: linux, darwin_arm64.
+257 −12 2 files
gcc/c-family/c-ada-spec.cc
+197−12modified
| @@ -699 +699 @@compare_comment (const void *lp, const void *rp) | |||
| 699 | 699 | | |
| 700 | 700 | static tree *to_dump = NULL; | |
| 701 | 701 | static int to_dump_count = 0; | |
| 702 | Added line. static tree current_namespace = NULL_TREE; | ||
| 703 | Added line. | ||
| 704 | Added line. static void pp_ada_namespace_name (pretty_printer *, tree); | ||
| 705 | Added line. | ||
| 706 | Added line. /* Return the innermost named C++ namespace containing NODE. Anonymous | ||
| 707 | Added line. namespaces do not add an Ada package level. */ | ||
| 708 | Added line. | ||
| 709 | Added line. static tree | ||
| 710 | Added line. named_namespace_context (tree node) | ||
| 711 | Added line. { | ||
| 712 | Added line. tree context = NULL_TREE; | ||
| 713 | Added line. if (node && DECL_P (node)) | ||
| 714 | Added line. context = DECL_CONTEXT (node); | ||
| 715 | Added line. else if (node && TYPE_P (node)) | ||
| 716 | Added line. context = TYPE_CONTEXT (node); | ||
| 717 | Added line. | ||
| 718 | Added line. while (context) | ||
| 719 | Added line. { | ||
| 720 | Added line. if (TREE_CODE (context) == NAMESPACE_DECL | ||
| 721 | Added line. && DECL_NAME (context) | ||
| 722 | Added line. && strcmp (IDENTIFIER_POINTER (DECL_NAME (context)), "::")) | ||
| 723 | Added line. return context; | ||
| 724 | Added line. if (DECL_P (context)) | ||
| 725 | Added line. context = DECL_CONTEXT (context); | ||
| 726 | Added line. else if (TYPE_P (context)) | ||
| 727 | Added line. context = TYPE_CONTEXT (context); | ||
| 728 | Added line. else | ||
| 729 | Added line. break; | ||
| 730 | Added line. } | ||
| 731 | Added line. return NULL_TREE; | ||
| 732 | Added line. } | ||
| 733 | Added line. | ||
| 734 | Added line. /* Return the nearest named namespace containing NS. */ | ||
| 735 | Added line. | ||
| 736 | Added line. static tree | ||
| 737 | Added line. parent_named_namespace (tree ns) | ||
| 738 | Added line. { | ||
| 739 | Added line. return named_namespace_context (ns); | ||
| 740 | Added line. } | ||
| 741 | Added line. | ||
| 742 | Added line. /* Return the direct namespace package below SCOPE that contains DECL. */ | ||
| 743 | Added line. | ||
| 744 | Added line. static tree | ||
| 745 | Added line. direct_namespace_child (tree scope, tree decl) | ||
| 746 | Added line. { | ||
| 747 | Added line. tree ns = named_namespace_context (decl); | ||
| 748 | Added line. if (!ns || ns == scope) | ||
| 749 | Added line. return NULL_TREE; | ||
| 750 | Added line. | ||
| 751 | Added line. tree child = ns; | ||
| 752 | Added line. for (tree parent = parent_named_namespace (child); parent; | ||
| 753 | Added line. parent = parent_named_namespace (child)) | ||
| 754 | Added line. { | ||
| 755 | Added line. if (parent == scope) | ||
| 756 | Added line. return child; | ||
| 757 | Added line. child = parent; | ||
| 758 | Added line. } | ||
| 759 | Added line. | ||
| 760 | Added line. return scope ? NULL_TREE : child; | ||
| 761 | Added line. } | ||
| 762 | Added line. | ||
| 763 | Added line. /* Return true if CHILD was already encountered before LIMIT in SCOPE. */ | ||
| 764 | Added line. | ||
| 765 | Added line. static bool | ||
| 766 | Added line. namespace_child_seen (tree scope, tree child, int limit) | ||
| 767 | Added line. { | ||
| 768 | Added line. for (int i = 0; i < limit; ++i) | ||
| 769 | Added line. if (direct_namespace_child (scope, to_dump[i]) == child) | ||
| 770 | Added line. return true; | ||
| 771 | Added line. return false; | ||
| 772 | Added line. } | ||
| 773 | Added line. | ||
| 774 | Added line. /* Dump all declarations and nested namespace packages directly in SCOPE. */ | ||
| 775 | Added line. | ||
| 776 | Added line. static void | ||
| 777 | Added line. dump_ada_namespace_contents (pretty_printer *pp, tree scope, int spc) | ||
| 778 | Added line. { | ||
| 779 | Added line. tree saved_namespace = current_namespace; | ||
| 780 | Added line. current_namespace = scope; | ||
| 781 | Added line. | ||
| 782 | Added line. for (int i = 0; i < to_dump_count; ++i) | ||
| 783 | Added line. { | ||
| 784 | Added line. tree decl = to_dump[i]; | ||
| 785 | Added line. tree ns = named_namespace_context (decl); | ||
| 786 | Added line. if (ns == scope) | ||
| 787 | Added line. { | ||
| 788 | Added line. if (dump_ada_declaration (pp, decl, NULL_TREE, spc)) | ||
| 789 | Added line. { | ||
| 790 | Added line. pp_newline (pp); | ||
| 791 | Added line. pp_newline (pp); | ||
| 792 | Added line. } | ||
| 793 | Added line. } | ||
| 794 | Added line. else | ||
| 795 | Added line. { | ||
| 796 | Added line. tree child = direct_namespace_child (scope, decl); | ||
| 797 | Added line. if (!child || namespace_child_seen (scope, child, i)) | ||
| 798 | Added line. continue; | ||
| 799 | Added line. | ||
| 800 | Added line. for (int indent = 0; indent < spc; ++indent) | ||
| 801 | Added line. pp_space (pp); | ||
| 802 | Added line. pp_string (pp, "package "); | ||
| 803 | Added line. pp_ada_namespace_name (pp, child); | ||
| 804 | Added line. pp_string (pp, " is"); | ||
| 805 | Added line. pp_newline (pp); | ||
| 806 | Added line. pp_newline (pp); | ||
| 807 | Added line. dump_ada_namespace_contents (pp, child, spc + INDENT_INCR); | ||
| 808 | Added line. for (int indent = 0; indent < spc; ++indent) | ||
| 809 | Added line. pp_space (pp); | ||
| 810 | Added line. pp_string (pp, "end "); | ||
| 811 | Added line. pp_ada_namespace_name (pp, child); | ||
| 812 | Added line. pp_semicolon (pp); | ||
| 813 | Added line. pp_newline (pp); | ||
| 814 | Added line. pp_newline (pp); | ||
| 815 | Added line. } | ||
| 816 | Added line. } | ||
| 817 | Added line. | ||
| 818 | Added line. current_namespace = saved_namespace; | ||
| 819 | Added line. } | ||
| 702 | 820 | | |
| 703 | 821 | /* Collect a list of declarations from T relevant to SOURCE_FILE to be dumped | |
| 704 | 822 | by a subsequent call to dump_ada_nodes. */ | |
| @@ -709 +826 @@collect_ada_nodes (tree t, const char *source_file) | |||
| 709 | 826 | tree n; | |
| 710 | 827 | int i = to_dump_count; | |
| 711 | 828 | | |
| 712 | Removed line. /* Count the likely relevant nodes: do not dump builtins (they are irrelevant | ||
| 713 | Removed line. in the context of bindings) and namespaces (we do not handle them properly | ||
| 714 | Removed line. yet). */ | ||
| 829 | Added line. /* Count the likely relevant nodes. Namespace declarations themselves are | ||
| 830 | Added line. represented by packages around their collected children. */ | ||
| 715 | 831 | for (n = t; n; n = TREE_CHAIN (n)) | |
| 716 | 832 | if (!DECL_IS_UNDECLARED_BUILTIN (n) | |
| 717 | 833 | && TREE_CODE (n) != NAMESPACE_DECL | |
| @@ -823 +939 @@dump_ada_nodes (pretty_printer *pp, const char *source_file) | |||
| 823 | 939 | { | |
| 824 | 940 | current_source_file = source_file; | |
| 825 | 941 | | |
| 826 | Removed line. if (dump_ada_declaration (pp, to_dump[i++], NULL_TREE, | ||
| 827 | Removed line. INDENT_INCR)) | ||
| 942 | Added line. tree decl = to_dump[i++]; | ||
| 943 | Added line. tree child = direct_namespace_child (NULL_TREE, decl); | ||
| 944 | Added line. if (child) | ||
| 945 | Added line. { | ||
| 946 | Added line. if (!namespace_child_seen (NULL_TREE, child, i - 1)) | ||
| 947 | Added line. { | ||
| 948 | Added line. for (int indent = 0; indent < INDENT_INCR; ++indent) | ||
| 949 | Added line. pp_space (pp); | ||
| 950 | Added line. pp_string (pp, "package "); | ||
| 951 | Added line. pp_ada_namespace_name (pp, child); | ||
| 952 | Added line. pp_string (pp, " is"); | ||
| 953 | Added line. pp_newline (pp); | ||
| 954 | Added line. pp_newline (pp); | ||
| 955 | Added line. dump_ada_namespace_contents (pp, child, | ||
| 956 | Added line. INDENT_INCR * 2); | ||
| 957 | Added line. for (int indent = 0; indent < INDENT_INCR; ++indent) | ||
| 958 | Added line. pp_space (pp); | ||
| 959 | Added line. pp_string (pp, "end "); | ||
| 960 | Added line. pp_ada_namespace_name (pp, child); | ||
| 961 | Added line. pp_semicolon (pp); | ||
| 962 | Added line. pp_newline (pp); | ||
| 963 | Added line. pp_newline (pp); | ||
| 964 | Added line. } | ||
| 965 | Added line. } | ||
| 966 | Added line. else if (dump_ada_declaration (pp, decl, NULL_TREE, | ||
| 967 | Added line. INDENT_INCR)) | ||
| 828 | 968 | { | |
| 829 | 969 | pp_newline (pp); | |
| 830 | 970 | pp_newline (pp); | |
| @@ -1316 +1456 @@to_ada_name (const char *name, bool *space_found) | |||
| 1316 | 1456 | return s; | |
| 1317 | 1457 | } | |
| 1318 | 1458 | | |
| 1459 | Added line. /* Dump the Ada package name corresponding to named namespace NS. */ | ||
| 1460 | Added line. | ||
| 1461 | Added line. static void | ||
| 1462 | Added line. pp_ada_namespace_name (pretty_printer *pp, tree ns) | ||
| 1463 | Added line. { | ||
| 1464 | Added line. bool space_found = false; | ||
| 1465 | Added line. char *name = to_ada_name (IDENTIFIER_POINTER (DECL_NAME (ns)), | ||
| 1466 | Added line. &space_found); | ||
| 1467 | Added line. pp_string (pp, name); | ||
| 1468 | Added line. free (name); | ||
| 1469 | Added line. } | ||
| 1470 | Added line. | ||
| 1471 | Added line. /* Dump the complete nested Ada package path containing DECL, unless DECL is | ||
| 1472 | Added line. already in the namespace package currently being emitted. */ | ||
| 1473 | Added line. | ||
| 1474 | Added line. static void | ||
| 1475 | Added line. pp_ada_namespace_path (pretty_printer *pp, tree ns) | ||
| 1476 | Added line. { | ||
| 1477 | Added line. if (!ns) | ||
| 1478 | Added line. return; | ||
| 1479 | Added line. | ||
| 1480 | Added line. tree parent = parent_named_namespace (ns); | ||
| 1481 | Added line. if (parent) | ||
| 1482 | Added line. pp_ada_namespace_path (pp, parent); | ||
| 1483 | Added line. pp_ada_namespace_name (pp, ns); | ||
| 1484 | Added line. pp_dot (pp); | ||
| 1485 | Added line. } | ||
| 1486 | Added line. | ||
| 1487 | Added line. static void | ||
| 1488 | Added line. pp_ada_namespace_prefix (pretty_printer *pp, tree decl) | ||
| 1489 | Added line. { | ||
| 1490 | Added line. tree ns = named_namespace_context (decl); | ||
| 1491 | Added line. if (ns && ns != current_namespace) | ||
| 1492 | Added line. pp_ada_namespace_path (pp, ns); | ||
| 1493 | Added line. } | ||
| 1494 | Added line. | ||
| 1319 | 1495 | /* Return true if DECL refers to a C++ class type for which a | |
| 1320 | 1496 | separate enclosing package has been or should be generated. */ | |
| 1321 | 1497 | | |
| @@ -1343 +1519 @@pp_ada_tree_identifier (pretty_printer *buffer, tree node, tree type, | |||
| 1343 | 1519 | char *s = to_ada_name (name, &space_found); | |
| 1344 | 1520 | tree decl = get_underlying_decl (type); | |
| 1345 | 1521 | | |
| 1522 | Added line. bool external_decl = false; | ||
| 1346 | 1523 | if (decl) | |
| 1347 | 1524 | { | |
| 1348 | 1525 | /* If the entity comes from another file, generate a package prefix. */ | |
| @@ -1350 +1527 @@pp_ada_tree_identifier (pretty_printer *buffer, tree node, tree type, | |||
| 1350 | 1527 | | |
| 1351 | 1528 | if (xloc.line && xloc.file && xloc.file != current_source_file) | |
| 1352 | 1529 | { | |
| 1530 | Added line. external_decl = true; | ||
| 1353 | 1531 | switch (TREE_CODE (type)) | |
| 1354 | 1532 | { | |
| 1355 | 1533 | case ENUMERAL_TYPE: | |
| @@ -1376 +1554 @@pp_ada_tree_identifier (pretty_printer *buffer, tree node, tree type, | |||
| 1376 | 1554 | break; | |
| 1377 | 1555 | } | |
| 1378 | 1556 | | |
| 1379 | Removed line. /* Generate the additional package prefix for C++ classes. */ | ||
| 1380 | Removed line. if (separate_class_package (decl)) | ||
| 1381 | Removed line. { | ||
| 1382 | Removed line. pp_string (buffer, "Class_"); | ||
| 1383 | Removed line. pp_string (buffer, s); | ||
| 1384 | Removed line. pp_dot (buffer); | ||
| 1385 | Removed line. } | ||
| 1557 | Added line. } | ||
| 1558 | Added line. | ||
| 1559 | Added line. pp_ada_namespace_prefix (buffer, decl); | ||
| 1560 | Added line. | ||
| 1561 | Added line. /* Generate the additional package prefix for C++ classes when the | ||
| 1562 | Added line. declaration is outside the namespace package currently being emitted. */ | ||
| 1563 | Added line. if (separate_class_package (decl) | ||
| 1564 | Added line. && (external_decl | ||
| 1565 | Added line. || named_namespace_context (decl) != current_namespace)) | ||
| 1566 | Added line. { | ||
| 1567 | Added line. pp_string (buffer, "Class_"); | ||
| 1568 | Added line. pp_string (buffer, s); | ||
| 1569 | Added line. pp_dot (buffer); | ||
| 1386 | 1570 | } | |
| 1387 | 1571 | } | |
| 1388 | 1572 | | |
gcc/testsuite/g++.dg/ada-spec/namespace-identity.C
+60−0new file
| @@ -0 +1 @@ | |||
| 1 | Added line. /* { dg-do compile } */ | ||
| 2 | Added line. /* { dg-options "-fdump-ada-spec-slim" } */ | ||
| 3 | Added line. /* { dg-final { scan-file namespace_identity_c.ads "package first is" } } */ | ||
| 4 | Added line. /* { dg-final { scan-file namespace_identity_c.ads "package inner is" } } */ | ||
| 5 | Added line. /* { dg-final { scan-file namespace_identity_c.ads "function transform \(value : Item\) return Item" } } */ | ||
| 6 | Added line. /* { dg-final { scan-file namespace_identity_c.ads "package Class_Object is" } } */ | ||
| 7 | Added line. /* { dg-final { scan-file namespace_identity_c.ads "package a_b is" } } */ | ||
| 8 | Added line. /* { dg-final { scan-file namespace_identity_c.ads "package a is" } } */ | ||
| 9 | Added line. /* { dg-final { scan-file namespace_identity_c.ads "type Again is record" } } */ | ||
| 10 | Added line. /* { dg-final { scan-file-not namespace_identity_c.ads "package :: is" } } */ | ||
| 11 | Added line. | ||
| 12 | Added line. namespace first::inner | ||
| 13 | Added line. { | ||
| 14 | Added line. struct Item { int value; }; | ||
| 15 | Added line. Item transform (Item value) { value.value += 1; return value; } | ||
| 16 | Added line. | ||
| 17 | Added line. class Object | ||
| 18 | Added line. { | ||
| 19 | Added line. public: | ||
| 20 | Added line. int get () const; | ||
| 21 | Added line. private: | ||
| 22 | Added line. int value_; | ||
| 23 | Added line. }; | ||
| 24 | Added line. } | ||
| 25 | Added line. | ||
| 26 | Added line. namespace second::inner | ||
| 27 | Added line. { | ||
| 28 | Added line. struct Item { double value; }; | ||
| 29 | Added line. Item transform (Item value) { value.value += 2.0; return value; } | ||
| 30 | Added line. | ||
| 31 | Added line. class Object | ||
| 32 | Added line. { | ||
| 33 | Added line. public: | ||
| 34 | Added line. int get () const; | ||
| 35 | Added line. private: | ||
| 36 | Added line. double value_; | ||
| 37 | Added line. }; | ||
| 38 | Added line. } | ||
| 39 | Added line. | ||
| 40 | Added line. namespace a_b | ||
| 41 | Added line. { | ||
| 42 | Added line. struct Marker { int value; }; | ||
| 43 | Added line. } | ||
| 44 | Added line. | ||
| 45 | Added line. namespace a::b | ||
| 46 | Added line. { | ||
| 47 | Added line. struct Marker { double value; }; | ||
| 48 | Added line. } | ||
| 49 | Added line. | ||
| 50 | Added line. namespace first::inner | ||
| 51 | Added line. { | ||
| 52 | Added line. struct Again { long value; }; | ||
| 53 | Added line. } | ||
| 54 | Added line. | ||
| 55 | Added line. using First_Item = first::inner::Item; | ||
| 56 | Added line. using Second_Item = second::inner::Item; | ||
| 57 | Added line. | ||
| 58 | Added line. extern "C" int namespace_identity_oracle () { return 73; } | ||
| 59 | Added line. | ||
| 60 | Added line. /* { dg-final { cleanup-ada-spec } } */ | ||
| 61 | | ||