diff options
Diffstat (limited to 'gcc/ada/decl.c')
-rw-r--r-- | gcc/ada/decl.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/gcc/ada/decl.c b/gcc/ada/decl.c index 702e348..a3a7000 100644 --- a/gcc/ada/decl.c +++ b/gcc/ada/decl.c @@ -922,11 +922,14 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) used_by_ref = true; const_flag = true; - /* Get the data part of GNU_EXPR in case this was a - aliased object whose nominal subtype is unconstrained. - In that case the pointer above will be a thin pointer and - build_allocator will automatically make the template and - constructor already made above. */ + /* In case this was a aliased object whose nominal subtype is + unconstrained, the pointer above will be a thin pointer and + build_allocator will automatically make the template. + + If we have a template initializer only (that we made above), + pretend there is none and rely on what build_allocator creates + again anyway. Otherwise (if we have a full initializer), get + the data part and feed that to build_allocator. */ if (definition) { @@ -937,11 +940,17 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) { gnu_alloc_type = TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_alloc_type))); - gnu_expr - = build_component_ref - (gnu_expr, NULL_TREE, - TREE_CHAIN (TYPE_FIELDS (TREE_TYPE (gnu_expr))), - false); + + if (TREE_CODE (gnu_expr) == CONSTRUCTOR + && + TREE_CHAIN (CONSTRUCTOR_ELTS (gnu_expr)) == NULL_TREE) + gnu_expr = 0; + else + gnu_expr + = build_component_ref + (gnu_expr, NULL_TREE, + TREE_CHAIN (TYPE_FIELDS (TREE_TYPE (gnu_expr))), + false); } if (TREE_CODE (TYPE_SIZE_UNIT (gnu_alloc_type)) == INTEGER_CST |