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