Variant gcc-13-14
Applies to 13.2.0, 14.2.0. Source flavors: linux, darwin_arm64.
+108 −6 2 files
gcc/c-family/c-ada-spec.cc
+85−6modified
| @@ -2030 +2030 @@dump_ada_enum_type (pretty_printer *buffer, tree node, tree type, int spc) | |||
| 2030 | 2030 | } | |
| 2031 | 2031 | } | |
| 2032 | 2032 | | |
| 2033 | Added line. /* Dump in BUFFER the declaration of an anonymous enumeral NODE. Its | ||
| 2034 | Added line. enumerators are members of the enclosing C++ scope, so do not prefix | ||
| 2035 | Added line. non-sequential values with the synthetic Ada type name. */ | ||
| 2036 | Added line. | ||
| 2037 | Added line. static void | ||
| 2038 | Added line. dump_ada_anonymous_enum (pretty_printer *buffer, tree node, int spc) | ||
| 2039 | Added line. { | ||
| 2040 | Added line. INDENT (spc); | ||
| 2041 | Added line. pp_string (buffer, is_simple_enum (node) ? "type " : "subtype "); | ||
| 2042 | Added line. dump_anonymous_type_name (buffer, node); | ||
| 2043 | Added line. pp_string (buffer, " is "); | ||
| 2044 | Added line. | ||
| 2045 | Added line. if (is_simple_enum (node)) | ||
| 2046 | Added line. dump_ada_enum_type (buffer, node, NULL_TREE, spc); | ||
| 2047 | Added line. else | ||
| 2048 | Added line. { | ||
| 2049 | Added line. pp_string (buffer, TYPE_UNSIGNED (node) ? "unsigned" : "int"); | ||
| 2050 | Added line. | ||
| 2051 | Added line. for (tree value = TYPE_VALUES (node); value; value = TREE_CHAIN (value)) | ||
| 2052 | Added line. { | ||
| 2053 | Added line. tree int_val = TREE_VALUE (value); | ||
| 2054 | Added line. | ||
| 2055 | Added line. if (TREE_CODE (int_val) != INTEGER_CST) | ||
| 2056 | Added line. int_val = DECL_INITIAL (int_val); | ||
| 2057 | Added line. | ||
| 2058 | Added line. pp_semicolon (buffer); | ||
| 2059 | Added line. newline_and_indent (buffer, spc); | ||
| 2060 | Added line. pp_ada_tree_identifier (buffer, TREE_PURPOSE (value), node, false); | ||
| 2061 | Added line. pp_string (buffer, " : constant "); | ||
| 2062 | Added line. dump_anonymous_type_name (buffer, node); | ||
| 2063 | Added line. pp_string (buffer, " := "); | ||
| 2064 | Added line. dump_ada_node (buffer, int_val, node, spc, false, true); | ||
| 2065 | Added line. } | ||
| 2066 | Added line. } | ||
| 2067 | Added line. | ||
| 2068 | Added line. pp_semicolon (buffer); | ||
| 2069 | Added line. } | ||
| 2070 | Added line. | ||
| 2033 | 2071 | /* Return true if NODE is the _Float32/_Float32x type. */ | |
| 2034 | 2072 | | |
| 2035 | 2073 | static bool | |
| @@ -2160 +2198 @@dump_ada_node (pretty_printer *buffer, tree node, tree type, int spc, | |||
| 2160 | 2198 | | |
| 2161 | 2199 | case ENUMERAL_TYPE: | |
| 2162 | 2200 | if (name_only) | |
| 2163 | Removed line. dump_ada_node (buffer, TYPE_NAME (node), node, spc, false, true); | ||
| 2201 | Added line. { | ||
| 2202 | Added line. tree enum_name = TYPE_NAME (node); | ||
| 2203 | Added line. tree enum_id = (enum_name && TREE_CODE (enum_name) == TYPE_DECL | ||
| 2204 | Added line. ? DECL_NAME (enum_name) : enum_name); | ||
| 2205 | Added line. | ||
| 2206 | Added line. if (enum_id | ||
| 2207 | Added line. && (*IDENTIFIER_POINTER (enum_id) != '.' | ||
| 2208 | Added line. && *IDENTIFIER_POINTER (enum_id) != '$')) | ||
| 2209 | Added line. dump_ada_node (buffer, enum_name, node, spc, false, true); | ||
| 2210 | Added line. else | ||
| 2211 | Added line. dump_anonymous_type_name (buffer, node); | ||
| 2212 | Added line. } | ||
| 2164 | 2213 | else | |
| 2165 | 2214 | dump_ada_enum_type (buffer, node, type, spc); | |
| 2166 | 2215 | break; | |
| @@ -2850 +2899 @@dump_ada_declaration (pretty_printer *buffer, tree t, tree type, int spc) | |||
| 2850 | 2899 | if (cpp_check && cpp_check (t, IS_TEMPLATE)) | |
| 2851 | 2900 | return dump_ada_template (buffer, t, spc); | |
| 2852 | 2901 | | |
| 2853 | Removed line. /* Skip enumeral values: will be handled as part of the type itself. */ | ||
| 2902 | Added line. /* Named enumeral values are handled as part of the type itself. C++ does | ||
| 2903 | Added line. may not expose a TYPE_DECL for a top-level anonymous enum, so emit its | ||
| 2904 | Added line. synthetic type and all enumerators when the first CONST_DECL is seen. */ | ||
| 2854 | 2905 | if (TREE_CODE (t) == CONST_DECL && TREE_CODE (TREE_TYPE (t)) == ENUMERAL_TYPE) | |
| 2855 | Removed line. return 0; | ||
| 2906 | Added line. { | ||
| 2907 | Added line. tree enum_type = TREE_TYPE (t); | ||
| 2908 | Added line. | ||
| 2909 | Added line. if (TYPE_NAME (enum_type) | ||
| 2910 | Added line. || !bitmap_set_bit (dumped_anonymous_types, TYPE_UID (enum_type))) | ||
| 2911 | Added line. return 0; | ||
| 2912 | Added line. | ||
| 2913 | Added line. dump_ada_anonymous_enum (buffer, enum_type, spc); | ||
| 2914 | Added line. return 1; | ||
| 2915 | Added line. } | ||
| 2856 | 2916 | | |
| 2857 | 2917 | if (TREE_CODE (t) == TYPE_DECL) | |
| 2858 | 2918 | { | |
| @@ -2905 +2965 @@dump_ada_declaration (pretty_printer *buffer, tree t, tree type, int spc) | |||
| 2905 | 2965 | TREE_VISITED (stub) = 1; | |
| 2906 | 2966 | } | |
| 2907 | 2967 | | |
| 2908 | Removed line. /* Skip unnamed or anonymous structs/unions/enum types. */ | ||
| 2968 | Added line. /* Emit anonymous enums under a synthetic type name so their enumerators | ||
| 2969 | Added line. remain available in the enclosing Ada package. */ | ||
| 2909 | 2970 | if (!orig | |
| 2910 | Removed line. && (RECORD_OR_UNION_TYPE_P (TREE_TYPE (t)) | ||
| 2911 | Removed line. || TREE_CODE (TREE_TYPE (t)) == ENUMERAL_TYPE) | ||
| 2971 | Added line. && TREE_CODE (TREE_TYPE (t)) == ENUMERAL_TYPE | ||
| 2972 | Added line. && ((!decl_name && !name) | ||
| 2973 | Added line. || (decl_name | ||
| 2974 | Added line. && (*IDENTIFIER_POINTER (decl_name) == '.' | ||
| 2975 | Added line. || *IDENTIFIER_POINTER (decl_name) == '$') | ||
| 2976 | Added line. && TYPE_NAME (TREE_TYPE (t)) == t))) | ||
| 2977 | Added line. { | ||
| 2978 | Added line. tree enum_type = TREE_TYPE (t); | ||
| 2979 | Added line. | ||
| 2980 | Added line. if (!bitmap_set_bit (dumped_anonymous_types, TYPE_UID (enum_type))) | ||
| 2981 | Added line. return 0; | ||
| 2982 | Added line. | ||
| 2983 | Added line. dump_ada_anonymous_enum (buffer, enum_type, spc); | ||
| 2984 | Added line. TREE_VISITED (t) = 1; | ||
| 2985 | Added line. return 1; | ||
| 2986 | Added line. } | ||
| 2987 | Added line. | ||
| 2988 | Added line. /* Skip unnamed or anonymous structs/unions. */ | ||
| 2989 | Added line. if (!orig | ||
| 2990 | Added line. && RECORD_OR_UNION_TYPE_P (TREE_TYPE (t)) | ||
| 2912 | 2991 | && !decl_name | |
| 2913 | 2992 | && !name) | |
| 2914 | 2993 | return 0; | |
gcc/testsuite/g++.dg/ada-spec/anonymous-enums.C
+23−0new file
| @@ -0 +1 @@ | |||
| 1 | Added line. /* { dg-do compile } */ | ||
| 2 | Added line. /* { dg-options "-std=gnu++20 -fdump-ada-spec-slim" } */ | ||
| 3 | Added line. /* { dg-final { scan-file anonymous_enums_c.ads "Sequential_Zero" } } */ | ||
| 4 | Added line. /* { dg-final { scan-file anonymous_enums_c.ads "Sequential_One" } } */ | ||
| 5 | Added line. /* { dg-final { scan-file anonymous_enums_c.ads "Sparse_Minus : constant anon_enum[0-9]+ := -1;" } } */ | ||
| 6 | Added line. /* { dg-final { scan-file anonymous_enums_c.ads "Sparse_Five : constant anon_enum[0-9]+ := 5;" } } */ | ||
| 7 | Added line. | ||
| 8 | Added line. enum { Sequential_Zero, Sequential_One }; | ||
| 9 | Added line. enum { Sparse_Minus = -1, Sparse_Five = 5 }; | ||
| 10 | Added line. | ||
| 11 | Added line. extern "C" int | ||
| 12 | Added line. sequential_value (decltype (Sequential_Zero) value) | ||
| 13 | Added line. { | ||
| 14 | Added line. return value; | ||
| 15 | Added line. } | ||
| 16 | Added line. | ||
| 17 | Added line. extern "C" int | ||
| 18 | Added line. sparse_value (decltype (Sparse_Minus) value) | ||
| 19 | Added line. { | ||
| 20 | Added line. return value; | ||
| 21 | Added line. } | ||
| 22 | Added line. | ||
| 23 | Added line. /* { dg-final { cleanup-ada-spec } } */ | ||
| 24 | | ||