Variant gcc-13-14
Applies to 13.2.0, 14.2.0. Source flavors: linux, darwin_arm64.
+100 −2 2 files
gcc/c-family/c-ada-spec.cc
+65−2modified
| @@ -1327 +1327 @@separate_class_package (tree decl) | |||
| 1327 | 1327 | } | |
| 1328 | 1328 | | |
| 1329 | 1329 | static bool package_prefix = true; | |
| 1330 | Added line. static tree current_template = NULL_TREE; | ||
| 1331 | Added line. static tree current_template_instance = NULL_TREE; | ||
| 1330 | 1332 | | |
| 1331 | 1333 | /* Dump in BUFFER the name of an identifier NODE of type TYPE, following Ada | |
| 1332 | 1334 | syntax. LIMITED_ACCESS indicates whether NODE can be accessed through a | |
| @@ -1855 +1857 @@dump_template_types (pretty_printer *buffer, tree types, int spc) | |||
| 1855 | 1857 | } | |
| 1856 | 1858 | } | |
| 1857 | 1859 | | |
| 1860 | Added line. /* If NODE is a concrete template instance emitted in a nested package, | ||
| 1861 | Added line. dump the type name owned by that package. */ | ||
| 1862 | Added line. | ||
| 1863 | Added line. static bool | ||
| 1864 | Added line. dump_template_type_name (pretty_printer *buffer, tree node, int spc) | ||
| 1865 | Added line. { | ||
| 1866 | Added line. if (!package_prefix || !cpp_check) | ||
| 1867 | Added line. return false; | ||
| 1868 | Added line. | ||
| 1869 | Added line. if (current_template_instance | ||
| 1870 | Added line. && TYPE_MAIN_VARIANT (node) | ||
| 1871 | Added line. == TYPE_MAIN_VARIANT (current_template_instance)) | ||
| 1872 | Added line. { | ||
| 1873 | Added line. package_prefix = false; | ||
| 1874 | Added line. dump_ada_node (buffer, current_template_instance, current_template, | ||
| 1875 | Added line. spc, false, true); | ||
| 1876 | Added line. package_prefix = true; | ||
| 1877 | Added line. return true; | ||
| 1878 | Added line. } | ||
| 1879 | Added line. | ||
| 1880 | Added line. for (int i = 0; i < to_dump_count; i++) | ||
| 1881 | Added line. { | ||
| 1882 | Added line. tree tmpl = to_dump[i]; | ||
| 1883 | Added line. | ||
| 1884 | Added line. if (!cpp_check (tmpl, IS_TEMPLATE)) | ||
| 1885 | Added line. continue; | ||
| 1886 | Added line. | ||
| 1887 | Added line. /* DECL_SIZE_UNIT is DECL_TEMPLATE_INSTANTIATIONS in this context. */ | ||
| 1888 | Added line. for (tree inst = DECL_SIZE_UNIT (tmpl); | ||
| 1889 | Added line. inst && inst != error_mark_node; | ||
| 1890 | Added line. inst = TREE_CHAIN (inst)) | ||
| 1891 | Added line. { | ||
| 1892 | Added line. tree types = TREE_PURPOSE (inst); | ||
| 1893 | Added line. tree instance = TREE_VALUE (inst); | ||
| 1894 | Added line. | ||
| 1895 | Added line. if (!RECORD_OR_UNION_TYPE_P (instance) | ||
| 1896 | Added line. || TYPE_MAIN_VARIANT (instance) != TYPE_MAIN_VARIANT (node)) | ||
| 1897 | Added line. continue; | ||
| 1898 | Added line. | ||
| 1899 | Added line. package_prefix = false; | ||
| 1900 | Added line. dump_ada_node (buffer, TYPE_NAME (instance), tmpl, spc, false, true); | ||
| 1901 | Added line. dump_template_types (buffer, types, spc); | ||
| 1902 | Added line. pp_dot (buffer); | ||
| 1903 | Added line. dump_ada_node (buffer, TYPE_NAME (instance), tmpl, spc, false, true); | ||
| 1904 | Added line. package_prefix = true; | ||
| 1905 | Added line. return true; | ||
| 1906 | Added line. } | ||
| 1907 | Added line. } | ||
| 1908 | Added line. | ||
| 1909 | Added line. return false; | ||
| 1910 | Added line. } | ||
| 1911 | Added line. | ||
| 1858 | 1912 | /* Dump in BUFFER the contents of all class instantiations associated with | |
| 1859 | 1913 | a given template T. SPC is the indentation level. */ | |
| 1860 | 1914 | | |
| @@ -1906 +1960 @@dump_ada_template (pretty_printer *buffer, tree t, int spc) | |||
| 1906 | 1960 | spc += INDENT_INCR; | |
| 1907 | 1961 | newline_and_indent (buffer, spc); | |
| 1908 | 1962 | | |
| 1963 | Added line. tree previous_template = current_template; | ||
| 1964 | Added line. tree previous_template_instance = current_template_instance; | ||
| 1965 | Added line. current_template = t; | ||
| 1966 | Added line. current_template_instance = instance; | ||
| 1909 | 1967 | TREE_VISITED (get_underlying_decl (instance)) = 1; | |
| 1910 | 1968 | pp_string (buffer, "type "); | |
| 1911 | 1969 | dump_ada_node (buffer, instance, t, spc, false, true); | |
| @@ -1928 +1986 @@dump_ada_template (pretty_printer *buffer, tree t, int spc) | |||
| 1928 | 1986 | dump_ada_node (buffer, instance, t, spc, false, true); | |
| 1929 | 1987 | dump_template_types (buffer, types, spc); | |
| 1930 | 1988 | package_prefix = true; | |
| 1989 | Added line. current_template = previous_template; | ||
| 1990 | Added line. current_template_instance = previous_template_instance; | ||
| 1931 | 1991 | pp_semicolon (buffer); | |
| 1932 | 1992 | pp_newline (buffer); | |
| 1933 | 1993 | pp_newline (buffer); | |
| @@ -2390 +2450 @@dump_ada_node (pretty_printer *buffer, tree node, tree type, int spc, | |||
| 2390 | 2450 | case RECORD_TYPE: | |
| 2391 | 2451 | case UNION_TYPE: | |
| 2392 | 2452 | if (name_only) | |
| 2393 | Removed line. dump_ada_node (buffer, TYPE_NAME (node), node, spc, limited_access, | ||
| 2394 | Removed line. true); | ||
| 2453 | Added line. { | ||
| 2454 | Added line. if (!dump_template_type_name (buffer, node, spc)) | ||
| 2455 | Added line. dump_ada_node (buffer, TYPE_NAME (node), node, spc, limited_access, | ||
| 2456 | Added line. true); | ||
| 2457 | Added line. } | ||
| 2395 | 2458 | else | |
| 2396 | 2459 | dump_ada_structure (buffer, node, type, false, spc); | |
| 2397 | 2460 | break; | |
gcc/testsuite/g++.dg/ada-spec/template-instantiation-qualification.C
+35−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 template_instantiation_qualification_c.ads "subtype Int_Box is Box_int.Box;" } } */ | ||
| 4 | Added line. /* { dg-final { scan-file template_instantiation_qualification_c.ads "subtype Double_Box is Box_double.Box;" } } */ | ||
| 5 | Added line. /* { dg-final { scan-file template_instantiation_qualification_c.ads "item : aliased Box_int.Box;" } } */ | ||
| 6 | Added line. /* { dg-final { scan-file template_instantiation_qualification_c.ads "function identity \(value : Box_double.Box\) return Box_double.Box" } } */ | ||
| 7 | Added line. /* { dg-final { scan-file template_instantiation_qualification_c.ads "subtype Alias_Int_Box is Box_int.Box;" } } */ | ||
| 8 | Added line. | ||
| 9 | Added line. template <typename T> | ||
| 10 | Added line. class Box | ||
| 11 | Added line. { | ||
| 12 | Added line. public: | ||
| 13 | Added line. Box (); | ||
| 14 | Added line. T value () const; | ||
| 15 | Added line. | ||
| 16 | Added line. private: | ||
| 17 | Added line. T value_; | ||
| 18 | Added line. }; | ||
| 19 | Added line. | ||
| 20 | Added line. extern template class Box<int>; | ||
| 21 | Added line. extern template class Box<double>; | ||
| 22 | Added line. | ||
| 23 | Added line. using Int_Box = Box<int>; | ||
| 24 | Added line. using Double_Box = Box<double>; | ||
| 25 | Added line. template <typename T> using Alias_Box = Box<T>; | ||
| 26 | Added line. using Alias_Int_Box = Alias_Box<int>; | ||
| 27 | Added line. | ||
| 28 | Added line. struct Holder | ||
| 29 | Added line. { | ||
| 30 | Added line. Box<int> item; | ||
| 31 | Added line. }; | ||
| 32 | Added line. | ||
| 33 | Added line. Box<double> identity (Box<double> value); | ||
| 34 | Added line. | ||
| 35 | Added line. /* { dg-final { cleanup-ada-spec } } */ | ||
| 36 | | ||