* tree.h (CONSTRUCTOR_NO_CLEARING): Define.
* tree-core.h (CONSTRUCTOR_NO_CLEARING): Document it.
* tree.def (CONSTRUCTOR): Likewise.
* doc/generic.texi (CONSTRUCTOR): Likewise. Update description.
* gimplify.c (gimplify_init_constructor): Do not clear the object when
the constructor is incomplete and CONSTRUCTOR_NO_CLEARING is set.
ada/
* gcc-interface/utils2.c (gnat_build_constructor): Also set the flag
CONSTRUCTOR_NO_CLEARING on the constructor.
From-SVN: r204677
+2013-11-11 Tristan Gingold <gingold@adacore.com>
+ Eric Botcazou <ebotcazou@adacore.com>
+
+ * tree.h (CONSTRUCTOR_NO_CLEARING): Define.
+ * tree-core.h (CONSTRUCTOR_NO_CLEARING): Document it.
+ * tree.def (CONSTRUCTOR): Likewise.
+ * doc/generic.texi (CONSTRUCTOR): Likewise. Update description.
+ * gimplify.c (gimplify_init_constructor): Do not clear the object when
+ the constructor is incomplete and CONSTRUCTOR_NO_CLEARING is set.
2013-11-11 Basile Starynkevitch <basile@starynkevitch.net>
- * toplev.c (toplev_main): Move PLUGIN_FINISH invocation before
- diagnostic_finish.
+ * toplev.c (toplev_main): Move PLUGIN_FINISH invocation before
+ diagnostic_finish.
2013-11-11 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
+2013-11-11 Tristan Gingold <gingold@adacore.com>
+ Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc-interface/utils2.c (gnat_build_constructor): Also set the flag
+ CONSTRUCTOR_NO_CLEARING on the constructor.
+
2013-10-30 Sharad Singhai <singhai@google.com>
* gnat_ugn.texi: Remove option description for PR middle-end/58134.
v->qsort (compare_elmt_bitpos);
result = build_constructor (type, v);
+ CONSTRUCTOR_NO_CLEARING (result) = 1;
TREE_CONSTANT (result) = TREE_STATIC (result) = allconstant;
TREE_SIDE_EFFECTS (result) = side_effects;
TREE_READONLY (result) = TYPE_READONLY (type) || allconstant;
performed immediately after the expression is evaluated.
@item CONSTRUCTOR
-These nodes represent the brace-enclosed initializers for a structure or
-array. The first operand is reserved for use by the back end. The
-second operand is a @code{TREE_LIST}. If the @code{TREE_TYPE} of the
-@code{CONSTRUCTOR} is a @code{RECORD_TYPE} or @code{UNION_TYPE}, then
-the @code{TREE_PURPOSE} of each node in the @code{TREE_LIST} will be a
-@code{FIELD_DECL} and the @code{TREE_VALUE} of each node will be the
-expression used to initialize that field.
-
-If the @code{TREE_TYPE} of the @code{CONSTRUCTOR} is an
-@code{ARRAY_TYPE}, then the @code{TREE_PURPOSE} of each element in the
-@code{TREE_LIST} will be an @code{INTEGER_CST} or a @code{RANGE_EXPR} of
-two @code{INTEGER_CST}s. A single @code{INTEGER_CST} indicates which
-element of the array (indexed from zero) is being assigned to. A
-@code{RANGE_EXPR} indicates an inclusive range of elements to
-initialize. In both cases the @code{TREE_VALUE} is the corresponding
+These nodes represent the brace-enclosed initializers for a structure or an
+array. They contain a sequence of component values made out of a vector of
+constructor_elt, which is a (@code{INDEX}, @code{VALUE}) pair.
+
+If the @code{TREE_TYPE} of the @code{CONSTRUCTOR} is a @code{RECORD_TYPE},
+@code{UNION_TYPE} or @code{QUAL_UNION_TYPE} then the @code{INDEX} of each
+node in the sequence will be a @code{FIELD_DECL} and the @code{VALUE} will
+be the expression used to initialize that field.
+
+If the @code{TREE_TYPE} of the @code{CONSTRUCTOR} is an @code{ARRAY_TYPE},
+then the @code{INDEX} of each node in the sequence will be an
+@code{INTEGER_CST} or a @code{RANGE_EXPR} of two @code{INTEGER_CST}s.
+A single @code{INTEGER_CST} indicates which element of the array is being
+assigned to. A @code{RANGE_EXPR} indicates an inclusive range of elements
+to initialize. In both cases the @code{VALUE} is the corresponding
initializer. It is re-evaluated for each element of a
-@code{RANGE_EXPR}. If the @code{TREE_PURPOSE} is @code{NULL_TREE}, then
+@code{RANGE_EXPR}. If the @code{INDEX} is @code{NULL_TREE}, then
the initializer is for the next available array element.
In the front end, you should not depend on the fields appearing in any
particular order. However, in the middle end, fields must appear in
declaration order. You should not assume that all fields will be
-represented. Unrepresented fields will be set to zero.
+represented. Unrepresented fields will be cleared (zeroed), unless the
+CONSTRUCTOR_NO_CLEARING flag is set, in which case their value becomes
+undefined.
@item COMPOUND_LITERAL_EXPR
@findex COMPOUND_LITERAL_EXPR_DECL_EXPR
VAR_DECL, FUNCTION_DECL
IDENTIFIER_NODE
+ CONSTRUCTOR_NO_CLEARING in
+ CONSTRUCTOR
+
ASM_VOLATILE_P in
ASM_EXPR
OBJ_TYPE_REF_TOKEN: An integer index to the virtual method table. */
DEFTREECODE (OBJ_TYPE_REF, "obj_type_ref", tcc_expression, 3)
-/* Constructor: return an aggregate value made from specified components.
- In C, this is used only for structure and array initializers.
- The operand is a sequence of component values made out of a VEC of
- struct constructor_elt.
+/* Used to represent the brace-enclosed initializers for a structure or an
+ array. It contains a sequence of component values made out of a VEC of
+ constructor_elt.
+
+ For RECORD_TYPE, UNION_TYPE, or QUAL_UNION_TYPE:
+ The field INDEX of each constructor_elt is a FIELD_DECL.
For ARRAY_TYPE:
The field INDEX of each constructor_elt is the corresponding index.
has side-effects, they are evaluated once for each element. Wrap the
value in a SAVE_EXPR if you want to evaluate side effects only once.)
- For RECORD_TYPE, UNION_TYPE, or QUAL_UNION_TYPE:
- The field INDEX of each node is a FIELD_DECL. */
+ Components that aren't present are cleared as per the C semantics,
+ unless the CONSTRUCTOR_NO_CLEARING flag is set, in which case their
+ value becomes undefined. */
DEFTREECODE (CONSTRUCTOR, "constructor", tcc_exceptional, 0)
/* The expression types are mostly straightforward, with the fourth argument
(&(*CONSTRUCTOR_ELTS (NODE))[IDX])
#define CONSTRUCTOR_NELTS(NODE) \
(vec_safe_length (CONSTRUCTOR_ELTS (NODE)))
+#define CONSTRUCTOR_NO_CLEARING(NODE) \
+ (CONSTRUCTOR_CHECK (NODE)->base.public_flag)
/* Iterate through the vector V of CONSTRUCTOR_ELT elements, yielding the
value of each element (stored within VAL). IX must be a scratch variable