| @@ -40 +40 @@static void dump_ada_structure (pretty_printer *, tree, tree, bool, int); |
| 40 | 40 | | static void dump_nested_types (pretty_printer *, tree, int); |
| 41 | 41 | | static char *to_ada_name (const char *, bool *); |
| 42 | 42 | | static bool needs_empty_class_layout (tree); |
| 43 | + | Added line. static bool maps_to_ada_tagged_type (tree); |
| 43 | 44 | | |
| 44 | 45 | | #define INDENT(SPACE) \ |
| 45 | 46 | | do { int i; for (i = 0; i<SPACE; i++) pp_space (buffer); } while (0) |
| @@ -1230 +1231 @@is_tagged_type (const_tree type) |
| 1230 | 1231 | | return false; |
| 1231 | 1232 | | } |
| 1232 | 1233 | | |
| 1234 | + | Added line. |
| 1235 | + | Added line. |
| 1236 | + | Added line. |
| 1237 | + | Added line. static bool |
| 1238 | + | Added line. is_ada_interface_type (tree type) |
| 1239 | + | Added line. { |
| 1240 | + | Added line. if (!cpp_check || !RECORD_OR_UNION_TYPE_P (type)) |
| 1241 | + | Added line. return false; |
| 1242 | + | Added line. |
| 1243 | + | Added line. bool has_fields = false; |
| 1244 | + | Added line. bool is_interface = false; |
| 1245 | + | Added line. for (tree fld = TYPE_FIELDS (type); fld; fld = TREE_CHAIN (fld)) |
| 1246 | + | Added line. { |
| 1247 | + | Added line. if (TREE_CODE (fld) == FIELD_DECL) |
| 1248 | + | Added line. { |
| 1249 | + | Added line. if (!has_fields && DECL_VIRTUAL_P (fld)) |
| 1250 | + | Added line. is_interface = true; |
| 1251 | + | Added line. else |
| 1252 | + | Added line. is_interface = false; |
| 1253 | + | Added line. has_fields = true; |
| 1254 | + | Added line. } |
| 1255 | + | Added line. else if (TREE_CODE (fld) == FUNCTION_DECL && !DECL_ARTIFICIAL (fld) |
| 1256 | + | Added line. && !cpp_check (fld, IS_ABSTRACT)) |
| 1257 | + | Added line. is_interface = false; |
| 1258 | + | Added line. } |
| 1259 | + | Added line. |
| 1260 | + | Added line. return is_interface; |
| 1261 | + | Added line. } |
| 1262 | + | Added line. |
| 1233 | 1263 | | |
| 1234 | 1264 | | |
| 1235 | 1265 | | |
| @@ -2084 +2114 @@dump_ada_function_declaration (pretty_printer *buffer, tree func, |
| 2084 | 2114 | | slot in the virtual table or is a constructor. */ |
| 2085 | 2115 | | if (TREE_TYPE (arg) |
| 2086 | 2116 | | && POINTER_TYPE_P (TREE_TYPE (arg)) |
| 2087 | | - | Removed line. && is_tagged_type (TREE_TYPE (TREE_TYPE (arg))) |
| 2117 | + | Added line. && maps_to_ada_tagged_type (TREE_TYPE (TREE_TYPE (arg))) |
| 2088 | 2118 | | && !(num == 1 && is_method && (DECL_VINDEX (func) || is_constructor))) |
| 2089 | 2119 | | pp_string (buffer, "'Class"); |
| 2090 | 2120 | | |
| @@ -2373 +2403 @@dump_ada_template (pretty_printer *buffer, tree t, int spc) |
| 2373 | 2403 | | dump_ada_node (buffer, instance, t, spc, false, true); |
| 2374 | 2404 | | package_prefix = true; |
| 2375 | 2405 | | |
| 2376 | | - | Removed line. if (is_tagged_type (instance)) |
| 2406 | + | Added line. if (maps_to_ada_tagged_type (instance)) |
| 2377 | 2407 | | pp_string (buffer, " is tagged limited "); |
| 2378 | 2408 | | else |
| 2379 | 2409 | | pp_string (buffer, " is limited "); |
| @@ -3010 +3040 @@dump_ada_node (pretty_printer *buffer, tree node, tree type, int spc, |
| 3010 | 3040 | | dump_ada_decl_name (buffer, node, limited_access); |
| 3011 | 3041 | | else |
| 3012 | 3042 | | { |
| 3013 | | - | Removed line. if (is_tagged_type (TREE_TYPE (node))) |
| 3043 | + | Added line. if (maps_to_ada_tagged_type (TREE_TYPE (node))) |
| 3014 | 3044 | | { |
| 3015 | 3045 | | int first = true; |
| 3046 | + | Added line. tree node_type = TREE_TYPE (node); |
| 3016 | 3047 | | |
| 3017 | | - | Removed line. |
| 3018 | | - | Removed line. for (tree fld = TYPE_FIELDS (TREE_TYPE (node)); |
| 3048 | + | Added line. |
| 3049 | + | Added line. |
| 3050 | + | Added line. for (tree fld = TYPE_FIELDS (node_type); |
| 3019 | 3051 | | fld; |
| 3020 | 3052 | | fld = TREE_CHAIN (fld)) |
| 3021 | | - | Removed line. { |
| 3022 | | - | Removed line. if (!DECL_NAME (fld) && is_tagged_type (TREE_TYPE (fld))) |
| 3023 | | - | Removed line. { |
| 3024 | | - | Removed line. if (first) |
| 3025 | | - | Removed line. { |
| 3026 | | - | Removed line. pp_string (buffer, "limited new "); |
| 3027 | | - | Removed line. first = false; |
| 3028 | | - | Removed line. } |
| 3029 | | - | Removed line. else |
| 3030 | | - | Removed line. pp_string (buffer, " and "); |
| 3053 | + | Added line. if (cpp_check (fld, IS_PRIMARY_BASE_FIELD) |
| 3054 | + | Added line. && is_tagged_type (TREE_TYPE (fld))) |
| 3055 | + | Added line. { |
| 3056 | + | Added line. pp_string (buffer, "limited new "); |
| 3057 | + | Added line. dump_ada_decl_name (buffer, TYPE_NAME (TREE_TYPE (fld)), false); |
| 3058 | + | Added line. first = false; |
| 3059 | + | Added line. break; |
| 3060 | + | Added line. } |
| 3031 | 3061 | | |
| 3032 | | - | Removed line. dump_ada_decl_name (buffer, TYPE_NAME (TREE_TYPE (fld)), |
| 3033 | | - | Removed line. false); |
| 3034 | | - | Removed line. } |
| 3035 | | - | Removed line. } |
| 3062 | + | Added line. |
| 3063 | + | Added line. for (tree fld = TYPE_FIELDS (node_type); |
| 3064 | + | Added line. fld; |
| 3065 | + | Added line. fld = TREE_CHAIN (fld)) |
| 3066 | + | Added line. if (cpp_check (fld, IS_BASE_FIELD) |
| 3067 | + | Added line. && !cpp_check (fld, IS_PRIMARY_BASE_FIELD) |
| 3068 | + | Added line. && is_ada_interface_type (TREE_TYPE (fld))) |
| 3069 | + | Added line. { |
| 3070 | + | Added line. pp_string (buffer, first ? "limited new " : " and "); |
| 3071 | + | Added line. dump_ada_decl_name (buffer, TYPE_NAME (TREE_TYPE (fld)), false); |
| 3072 | + | Added line. first = false; |
| 3073 | + | Added line. } |
| 3036 | 3074 | | |
| 3037 | 3075 | | pp_string (buffer, first ? "tagged limited " : " with "); |
| 3038 | 3076 | | } |
| @@ -3173 +3211 @@is_abi_ignored_empty_field (tree node, tree field) |
| 3173 | 3211 | | return false; |
| 3174 | 3212 | | } |
| 3175 | 3213 | | |
| 3176 | | - | Removed line. |
| 3177 | | - | Removed line. |
| 3214 | + | Added line. |
| 3215 | + | Added line. |
| 3216 | + | Added line. |
| 3217 | + | Added line. static bool |
| 3218 | + | Added line. primary_base_tail_reused (tree node, tree field) |
| 3219 | + | Added line. { |
| 3220 | + | Added line. const HOST_WIDE_INT object_size = int_size_in_bytes (TREE_TYPE (field)); |
| 3221 | + | Added line. if (object_size <= 0) |
| 3222 | + | Added line. return false; |
| 3223 | + | Added line. |
| 3224 | + | Added line. for (tree other = TYPE_FIELDS (node); other; other = TREE_CHAIN (other)) |
| 3225 | + | Added line. if (other != field && TREE_CODE (other) == FIELD_DECL |
| 3226 | + | Added line. && !DECL_VIRTUAL_P (other) && DECL_FIELD_OFFSET (other) |
| 3227 | + | Added line. && DECL_FIELD_BIT_OFFSET (other) |
| 3228 | + | Added line. && tree_fits_uhwi_p (DECL_FIELD_OFFSET (other)) |
| 3229 | + | Added line. && tree_fits_uhwi_p (DECL_FIELD_BIT_OFFSET (other))) |
| 3230 | + | Added line. { |
| 3231 | + | Added line. const unsigned HOST_WIDE_INT bitpos |
| 3232 | + | Added line. = tree_to_uhwi (DECL_FIELD_OFFSET (other)) * BITS_PER_UNIT |
| 3233 | + | Added line. + tree_to_uhwi (DECL_FIELD_BIT_OFFSET (other)); |
| 3234 | + | Added line. if (bitpos > 0 |
| 3235 | + | Added line. && bitpos < ((unsigned HOST_WIDE_INT) object_size |
| 3236 | + | Added line. * BITS_PER_UNIT)) |
| 3237 | + | Added line. return true; |
| 3238 | + | Added line. } |
| 3239 | + | Added line. |
| 3240 | + | Added line. return false; |
| 3241 | + | Added line. } |
| 3242 | + | Added line. |
| 3243 | + | Added line. |
| 3244 | + | Added line. |
| 3245 | + | Added line. |
| 3178 | 3246 | | |
| 3179 | 3247 | | static bool |
| 3180 | | - | Removed line. is_ada_record_field (tree node, tree field) |
| 3248 | + | Added line. is_concrete_nested_base_field (tree node, tree field) |
| 3249 | + | Added line. { |
| 3250 | + | Added line. return (cpp_check && TREE_CODE (field) == FIELD_DECL |
| 3251 | + | Added line. && cpp_check (field, IS_BASE_FIELD) |
| 3252 | + | Added line. && (!is_tagged_type (node) |
| 3253 | + | Added line. || !cpp_check (field, IS_PRIMARY_BASE_FIELD) |
| 3254 | + | Added line. || primary_base_tail_reused (node, field)) |
| 3255 | + | Added line. && !is_ada_interface_type (TREE_TYPE (field)) |
| 3256 | + | Added line. && is_tagged_type (TREE_TYPE (field))); |
| 3257 | + | Added line. } |
| 3258 | + | Added line. |
| 3259 | + | Added line. |
| 3260 | + | Added line. |
| 3261 | + | Added line. |
| 3262 | + | Added line. static bool |
| 3263 | + | Added line. maps_to_ada_tagged_type (tree node) |
| 3264 | + | Added line. { |
| 3265 | + | Added line. if (!is_tagged_type (node)) |
| 3266 | + | Added line. return false; |
| 3267 | + | Added line. |
| 3268 | + | Added line. for (tree field = TYPE_FIELDS (node); field; field = TREE_CHAIN (field)) |
| 3269 | + | Added line. if (cpp_check && cpp_check (field, IS_PRIMARY_BASE_FIELD) |
| 3270 | + | Added line. && is_concrete_nested_base_field (node, field)) |
| 3271 | + | Added line. return false; |
| 3272 | + | Added line. return true; |
| 3273 | + | Added line. } |
| 3274 | + | Added line. |
| 3275 | + | Added line. |
| 3276 | + | Added line. |
| 3277 | + | Added line. |
| 3278 | + | Added line. static bool |
| 3279 | + | Added line. has_tagged_primary_base (tree node) |
| 3280 | + | Added line. { |
| 3281 | + | Added line. if (!maps_to_ada_tagged_type (node)) |
| 3282 | + | Added line. return false; |
| 3283 | + | Added line. |
| 3284 | + | Added line. for (tree field = TYPE_FIELDS (node); field; field = TREE_CHAIN (field)) |
| 3285 | + | Added line. if (cpp_check && cpp_check (field, IS_PRIMARY_BASE_FIELD) |
| 3286 | + | Added line. && is_tagged_type (TREE_TYPE (field))) |
| 3287 | + | Added line. return true; |
| 3288 | + | Added line. return false; |
| 3289 | + | Added line. } |
| 3290 | + | Added line. |
| 3291 | + | Added line. |
| 3292 | + | Added line. |
| 3293 | + | Added line. static bool |
| 3294 | + | Added line. has_concrete_nested_base (tree node) |
| 3295 | + | Added line. { |
| 3296 | + | Added line. for (tree field = TYPE_FIELDS (node); field; field = TREE_CHAIN (field)) |
| 3297 | + | Added line. if (is_concrete_nested_base_field (node, field)) |
| 3298 | + | Added line. return true; |
| 3299 | + | Added line. return false; |
| 3300 | + | Added line. } |
| 3301 | + | Added line. |
| 3302 | + | Added line. |
| 3303 | + | Added line. |
| 3304 | + | Added line. |
| 3305 | + | Added line. static bool |
| 3306 | + | Added line. is_ada_record_field (tree node, tree field) |
| 3181 | 3307 | | { |
| 3182 | 3308 | | if (TREE_CODE (field) != FIELD_DECL |
| 3183 | 3309 | | || DECL_VIRTUAL_P (field) |
| 3184 | 3310 | | || is_abi_ignored_empty_field (node, field)) |
| 3185 | 3311 | | return false; |
| 3186 | 3312 | | |
| 3187 | | - | Removed line. return DECL_NAME (field) || !is_tagged_type (TREE_TYPE (field)); |
| 3313 | + | Added line. return (DECL_NAME (field) || !is_tagged_type (TREE_TYPE (field)) |
| 3314 | + | Added line. || is_concrete_nested_base_field (node, field)); |
| 3188 | 3315 | | } |
| 3189 | 3316 | | |
| 3190 | 3317 | | |
| 3191 | | - | Removed line. |
| 3192 | | - | Removed line. |
| 3318 | + | Added line. subobject. A class can exclude virtual bases or complete-object tail |
| 3319 | + | Added line. padding from its as-base size. */ |
| 3193 | 3320 | | |
| 3194 | 3321 | | static bool |
| 3195 | | - | Removed line. needs_virtual_as_base_type (tree node) |
| 3322 | + | Added line. needs_as_base_storage_type (tree node) |
| 3196 | 3323 | | { |
| 3197 | | - | Removed line. if (!cpp_check || !RECORD_OR_UNION_TYPE_P (node) || is_tagged_type (node) |
| 3198 | | - | Removed line. || !cpp_check (node, HAS_VIRTUAL_BASE)) |
| 3324 | + | Added line. if (!cpp_check || !RECORD_OR_UNION_TYPE_P (node)) |
| 3199 | 3325 | | return false; |
| 3200 | 3326 | | |
| 3201 | 3327 | | const int data_size = cpp_check (node, GET_AS_BASE_SIZE); |
| @@ -3174 +3300 @@needs_virtual_as_base_type (tree node) |
| 3174 | 3300 | | for this component. */ |
| 3175 | 3301 | | |
| 3176 | 3302 | | static bool |
| 3177 | | - | Removed line. is_shortened_virtual_base_field (tree field) |
| 3303 | + | Added line. is_shortened_base_field (tree field) |
| 3178 | 3304 | | { |
| 3179 | 3305 | | if (TREE_CODE (field) != FIELD_DECL || DECL_NAME (field) |
| 3180 | | - | Removed line. || !needs_virtual_as_base_type (TREE_TYPE (field)) |
| 3306 | + | Added line. || !needs_as_base_storage_type (TREE_TYPE (field)) |
| 3181 | 3307 | | || !DECL_SIZE (field) || !tree_fits_uhwi_p (DECL_SIZE (field))) |
| 3182 | 3308 | | return false; |
| 3183 | 3309 | | |
| @@ -3194 +3320 @@static void |
| 3194 | 3320 | | dump_ada_record_field_type (pretty_printer *buffer, tree field) |
| 3195 | 3321 | | { |
| 3196 | 3322 | | dump_ada_decl_name (buffer, TYPE_NAME (TREE_TYPE (field)), false); |
| 3197 | | - | Removed line. if (is_shortened_virtual_base_field (field)) |
| 3323 | + | Added line. if (is_shortened_base_field (field)) |
| 3198 | 3324 | | pp_string (buffer, "_As_Base"); |
| 3199 | 3325 | | } |
| 3200 | 3326 | | |
| @@ -3204 +3330 @@static bool |
| 3204 | 3330 | | field_fits_as_base (tree node, tree field) |
| 3205 | 3331 | | { |
| 3206 | 3332 | | const int data_size = cpp_check (node, GET_AS_BASE_SIZE); |
| 3207 | | - | Removed line. if (data_size < 0 || !is_ada_record_field (node, field) |
| 3333 | + | Added line. if (data_size < 0 || !is_ada_record_field (node, field) |
| 3208 | 3334 | | || !DECL_FIELD_OFFSET (field) || !DECL_FIELD_BIT_OFFSET (field) |
| 3209 | 3335 | | || !DECL_SIZE (field) |
| 3210 | 3336 | | || !tree_fits_uhwi_p (DECL_FIELD_OFFSET (field)) |
| @@ -3225 +3351 @@field_fits_as_base (tree node, tree field) |
| 3225 | 3351 | | padding is not part of a base subobject. */ |
| 3226 | 3352 | | |
| 3227 | 3353 | | static unsigned int |
| 3228 | | - | Removed line. virtual_as_base_alignment (tree node, unsigned int data_size) |
| 3354 | + | Added line. as_base_alignment (tree node, unsigned int data_size) |
| 3229 | 3355 | | { |
| 3230 | 3356 | | unsigned int alignment = TYPE_ALIGN (node) / BITS_PER_UNIT; |
| 3231 | 3357 | | while (alignment > 1 && data_size % alignment != 0) |
| @@ -3237 +3363 @@virtual_as_base_alignment (tree node, unsigned int data_size) |
| 3237 | 3363 | | keeps each direct field addressable while excluding shared virtual bases. */ |
| 3238 | 3364 | | |
| 3239 | 3365 | | static void |
| 3240 | | - | Removed line. dump_ada_virtual_as_base_type (pretty_printer *buffer, tree node, tree type, |
| 3241 | | - | Removed line. int spc) |
| 3366 | + | Added line. dump_ada_as_base_storage_type (pretty_printer *buffer, tree node, tree type, |
| 3367 | + | Added line. int spc) |
| 3242 | 3368 | | { |
| 3243 | 3369 | | const unsigned int data_size = cpp_check (node, GET_AS_BASE_SIZE); |
| 3244 | | - | Removed line. int field_num = 0; |
| 3370 | + | Added line. int field_num = has_tagged_primary_base (node) ? 1 : 0; |
| 3245 | 3371 | | |
| 3246 | 3372 | | pp_newline (buffer); |
| 3247 | 3373 | | newline_and_indent (buffer, spc); |
| @@ -3297 +3423 @@dump_ada_virtual_as_base_type (pretty_printer *buffer, tree node, tree type, |
| 3297 | 3423 | | newline_and_indent (buffer, spc); |
| 3298 | 3424 | | pp_string (buffer, "with Convention => C_Pass_By_Copy;"); |
| 3299 | 3425 | | |
| 3426 | + | Added line. if (as_base_alignment (node, data_size) |
| 3427 | + | Added line. < TYPE_ALIGN (node) / BITS_PER_UNIT) |
| 3428 | + | Added line. { |
| 3429 | + | Added line. newline_and_indent (buffer, spc); |
| 3430 | + | Added line. pp_string (buffer, "pragma Component_Alignment (Storage_Unit, "); |
| 3431 | + | Added line. dump_ada_node (buffer, TYPE_NAME (node), type, spc, false, true); |
| 3432 | + | Added line. pp_string (buffer, "_As_Base);"); |
| 3433 | + | Added line. } |
| 3434 | + | Added line. |
| 3300 | 3435 | | newline_and_indent (buffer, spc); |
| 3301 | 3436 | | pp_string (buffer, "for "); |
| 3302 | 3437 | | dump_ada_node (buffer, TYPE_NAME (node), type, spc, false, true); |
| @@ -3315 +3450 @@dump_ada_virtual_as_base_type (pretty_printer *buffer, tree node, tree type, |
| 3315 | 3450 | | pp_string (buffer, "for "); |
| 3316 | 3451 | | dump_ada_node (buffer, TYPE_NAME (node), type, spc, false, true); |
| 3317 | 3452 | | pp_string (buffer, "_As_Base'Alignment use "); |
| 3318 | | - | Removed line. pp_decimal_int (buffer, virtual_as_base_alignment (node, data_size)); |
| 3453 | + | Added line. pp_decimal_int (buffer, as_base_alignment (node, data_size)); |
| 3319 | 3454 | | pp_semicolon (buffer); |
| 3320 | 3455 | | |
| 3321 | 3456 | | newline_and_indent (buffer, spc); |
| @@ -3395 +3530 @@static bool |
| 3395 | 3530 | | has_constant_field_layout (tree node) |
| 3396 | 3531 | | { |
| 3397 | 3532 | | for (tree field = TYPE_FIELDS (node); field; field = TREE_CHAIN (field)) |
| 3398 | | - | Removed line. if (is_ada_record_field (node, field) |
| 3533 | + | Added line. if (is_ada_record_field (node, field) |
| 3399 | 3534 | | && (!DECL_FIELD_OFFSET (field) |
| 3400 | 3535 | | || !DECL_FIELD_BIT_OFFSET (field) |
| 3401 | 3536 | | || !DECL_SIZE (field) |
| @@ -3453 +3588 @@dump_ada_cpp_layout (pretty_printer *buffer, tree node, tree type, int spc, |
| 3453 | 3588 | | dump_ada_node (buffer, TYPE_NAME (node), type, spc, false, true); |
| 3454 | 3589 | | pp_string (buffer, " use record"); |
| 3455 | 3590 | | |
| 3456 | | - | Removed line. int field_num = 0; |
| 3591 | + | Added line. int field_num = has_tagged_primary_base (node) ? 1 : 0; |
| 3457 | 3592 | | for (tree field = TYPE_FIELDS (node); field; field = TREE_CHAIN (field)) |
| 3458 | | - | Removed line. if (is_ada_record_field (node, field)) |
| 3593 | + | Added line. if (is_ada_record_field (node, field)) |
| 3459 | 3594 | | { |
| 3460 | 3595 | | field_num++; |
| 3461 | 3596 | | const unsigned HOST_WIDE_INT bitpos |
| @@ -4389 +4524 @@dump_ada_structure (pretty_printer *buffer, tree node, tree type, bool nested, |
| 4389 | 4524 | | const bool is_union = (TREE_CODE (node) == UNION_TYPE); |
| 4390 | 4525 | | char buf[32]; |
| 4391 | 4526 | | int field_num = 0; |
| 4527 | + | Added line. int fields_emitted = 0; |
| 4392 | 4528 | | int field_spc = spc + INDENT_INCR; |
| 4393 | 4529 | | int need_semicolon; |
| 4394 | 4530 | | |
| @@ -4415 +4551 @@dump_ada_structure (pretty_printer *buffer, tree node, tree type, bool nested, |
| 4415 | 4551 | | |
| 4416 | 4552 | | if (!DECL_NAME (tmp)) |
| 4417 | 4553 | | { |
| 4418 | | - | Removed line. if (!is_tagged_type (TREE_TYPE (tmp))) |
| 4554 | + | Added line. if (maps_to_ada_tagged_type (node) && cpp_check |
| 4555 | + | Added line. && cpp_check (tmp, IS_PRIMARY_BASE_FIELD) |
| 4556 | + | Added line. && is_tagged_type (TREE_TYPE (tmp))) |
| 4557 | + | Added line. field_num++; |
| 4558 | + | Added line. else if (!is_tagged_type (TREE_TYPE (tmp)) |
| 4559 | + | Added line. || is_concrete_nested_base_field (node, tmp)) |
| 4419 | 4560 | | { |
| 4420 | 4561 | | if (!TYPE_NAME (TREE_TYPE (tmp))) |
| 4421 | 4562 | | dump_ada_declaration (buffer, tmp, type, field_spc); |
| @@ -4436 +4577 @@dump_ada_structure (pretty_printer *buffer, tree node, tree type, bool nested, |
| 4436 | 4577 | | |
| 4437 | 4578 | | pp_newline (buffer); |
| 4438 | 4579 | | field_num++; |
| 4580 | + | Added line. fields_emitted++; |
| 4439 | 4581 | | } |
| 4440 | 4582 | | } |
| 4441 | 4583 | | else if (TREE_CODE (tmp) == FIELD_DECL) |
| @@ -4461 +4603 @@dump_ada_structure (pretty_printer *buffer, tree node, tree type, bool nested, |
| 4461 | 4603 | | { |
| 4462 | 4604 | | pp_newline (buffer); |
| 4463 | 4605 | | field_num++; |
| 4606 | + | Added line. fields_emitted++; |
| 4464 | 4607 | | } |
| 4465 | 4608 | | } |
| 4466 | 4609 | | } |
| @@ -4473 +4616 @@dump_ada_structure (pretty_printer *buffer, tree node, tree type, bool nested, |
| 4473 | 4616 | | pp_newline (buffer); |
| 4474 | 4617 | | } |
| 4475 | 4618 | | |
| 4476 | | - | Removed line. if (field_num == 0) |
| 4619 | + | Added line. if (fields_emitted == 0) |
| 4477 | 4620 | | { |
| 4478 | 4621 | | INDENT (spc + INDENT_INCR); |
| 4479 | 4622 | | pp_string (buffer, "null;"); |
| @@ -4543 +4686 @@dump_ada_structure (pretty_printer *buffer, tree node, tree type, bool nested, |
| 4543 | 4686 | | dump_ada_empty_class_layout (buffer, node, type, spc); |
| 4544 | 4687 | | } |
| 4545 | 4688 | | else if ((needs_tail_padding_layout (node) |
| 4546 | | - | Removed line. || (cpp_check && cpp_check (node, HAS_VIRTUAL_BASE))) |
| 4689 | + | Added line. || (cpp_check && cpp_check (node, HAS_VIRTUAL_BASE)) |
| 4690 | + | Added line. || has_concrete_nested_base (node)) |
| 4547 | 4691 | | && has_constant_field_layout (node)) |
| 4548 | 4692 | | { |
| 4549 | 4693 | | if (need_semicolon) |
| @@ -4556 +4700 @@dump_ada_structure (pretty_printer *buffer, tree node, tree type, bool nested, |
| 4556 | 4700 | | dump_ada_cpp_layout (buffer, node, type, spc, |
| 4557 | 4701 | | cpp_check (node, HAS_VIRTUAL_BASE)); |
| 4558 | 4702 | | |
| 4559 | | - | Removed line. if (needs_virtual_as_base_type (node)) |
| 4560 | | - | Removed line. dump_ada_virtual_as_base_type (buffer, node, type, spc); |
| 4703 | + | Added line. if (needs_as_base_storage_type (node)) |
| 4704 | + | Added line. dump_ada_as_base_storage_type (buffer, node, type, spc); |
| 4561 | 4705 | | } |
| 4562 | 4706 | | |
| 4563 | 4707 | | |