On 12/03/2015 11:42 PM, Martin Sebor wrote:
+ if (next && TREE_CODE (next) == FIELD_DECL)
This will break if there's a non-field between the array and the next field.
@@ -4114,7 +4115,10 @@ walk_subobject_offsets (tree type,
/* Avoid recursing into objects that are not interesting. */
if (!CLASS_TYPE_P (element_type)
- || !CLASSTYPE_CONTAINS_EMPTY_CLASS_P (element_type))
+ || !CLASSTYPE_CONTAINS_EMPTY_CLASS_P (element_type)
+ || !domain
+ /* Flexible array members have no upper bound. */
+ || !TYPE_MAX_VALUE (domain))
Why is this desirable? We do want to avoid empty bases at the same
address as a flexible array of the same type.
+ && (TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST
+ || !tree_int_cst_equal (size_zero_node, TYPE_SIZE (type)));
This can be integer_zerop.
+ *seen_field = *seen_field || field_nonempty_p (f), fld = next)
Please add parens around the || expression.
+ && !tree_int_cst_equal (size_max_node, TYPE_MAX_VALUE (dom)))
This can be integer_minus_onep or integer_all_onesp.
+ its fields. The recursive call to the function will
+ either return 0 or the flexible array member whose
Let's say NULL_TREE here rather than 0.
+ {
+ bool dummy = false;
+ check_flexarrays (t, TYPE_FIELDS (t), &dummy);
+ }
This should be called from check_bases_and_members, or even integrated
into check_field_decls.
- else if (name)
- pedwarn (input_location, OPT_Wpedantic, "ISO C++ forbids zero-size array
%qD", name);
Why?
@@ -10912,11 +10916,19 @@ grokdeclarator (const cp_declarator *declarator,
if (!staticp && TREE_CODE (type) == ARRAY_TYPE
&& TYPE_DOMAIN (type) == NULL_TREE)
{
- tree itype = compute_array_index_type (dname, integer_zero_node,
+ if (TREE_CODE (ctype) == UNION_TYPE
+ || TREE_CODE (ctype) == QUAL_UNION_TYPE)
+ {
+ error ("flexible array member in union");
+ type = error_mark_node;
+ }
+ else
+ {
+ tree itype = compute_array_index_type (dname, NULL_TREE,
tf_warning_or_error);
type = build_cplus_array_type (TREE_TYPE (type), itype);
}
Can we leave TYPE_DOMAIN null for flexible arrays so you don't need to
add special new handling all over the place?
- tree decl;
+ tree decl = NULL_TREE;
Why?
+++ b/gcc/testsuite/g++.dg/cpp0x/bad_array_new2.C
@@ -1,7 +1,16 @@
// Test for throwing bad_array_new_length on invalid array length
// { dg-do run { target c++11 } }
-#include <new>
+// #include <new>
+
+namespace std {
+struct exception {
+ virtual ~exception () { }
+};
+
+struct bad_alloc: exception { };
+struct bad_array_new_length { };
+}
Why?
Jason