+2016-05-24 Martin Sebor <msebor@redhat.com>
+
+ PR c++/71147
+ * gcc/tree.h (complete_or_array_type_p): New inline function.
+
2016-05-24 Jakub Jelinek <jakub@redhat.com>
* config/i386/i386.h (TARGET_AVOID_4BYTE_PREFIXES): Define.
+2016-05-24 Martin Sebor <msebor@redhat.com>
+
+ PR c++/71147
+ * decl.c (layout_var_decl, grokdeclarator): Use complete_or_array_type_p.
+ * pt.c (instantiate_class_template_1): Try to complete the element
+ type of a flexible array member.
+ (can_complete_type_without_circularity): Handle arrays of unknown bound.
+ * typeck.c (complete_type): Also complete the type of the elements of
+ arrays with an unspecified bound.
+
2016-05-24 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/69872
complete_type (type);
if (!DECL_SIZE (decl)
&& TREE_TYPE (decl) != error_mark_node
- && (COMPLETE_TYPE_P (type)
- || (TREE_CODE (type) == ARRAY_TYPE
- && !TYPE_DOMAIN (type)
- && COMPLETE_TYPE_P (TREE_TYPE (type)))))
+ && complete_or_array_type_p (type))
layout_decl (decl, 0);
if (!DECL_EXTERNAL (decl) && DECL_SIZE (decl) == NULL_TREE)
}
else if (!staticp && !dependent_type_p (type)
&& !COMPLETE_TYPE_P (complete_type (type))
- && (TREE_CODE (type) != ARRAY_TYPE
- || !COMPLETE_TYPE_P (TREE_TYPE (type))
+ && (!complete_or_array_type_p (type)
|| initialized == 0))
{
if (TREE_CODE (type) != ARRAY_TYPE
return 0;
else if (COMPLETE_TYPE_P (type))
return 1;
- else if (TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type))
+ else if (TREE_CODE (type) == ARRAY_TYPE)
return can_complete_type_without_circularity (TREE_TYPE (type));
else if (CLASS_TYPE_P (type)
&& TYPE_BEING_DEFINED (TYPE_MAIN_VARIANT (type)))
if (can_complete_type_without_circularity (rtype))
complete_type (rtype);
- if (TREE_CODE (r) == FIELD_DECL
- && TREE_CODE (rtype) == ARRAY_TYPE
- && COMPLETE_TYPE_P (TREE_TYPE (rtype))
- && !COMPLETE_TYPE_P (rtype))
- {
- /* Flexible array mmembers of elements
- of complete type have an incomplete type
- and that's okay. */
- }
- else if (!COMPLETE_TYPE_P (rtype))
+ if (!complete_or_array_type_p (rtype))
{
+ /* If R's type couldn't be completed and
+ it isn't a flexible array member (whose
+ type is incomplete by definition) give
+ an error. */
cxx_incomplete_type_error (r, rtype);
TREE_TYPE (r) = error_mark_node;
}
if (type == error_mark_node || COMPLETE_TYPE_P (type))
;
- else if (TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type))
+ else if (TREE_CODE (type) == ARRAY_TYPE)
{
tree t = complete_type (TREE_TYPE (type));
unsigned int needs_constructing, has_nontrivial_dtor;
+2016-05-24 Martin Sebor <msebor@redhat.com>
+
+ PR c++/71147
+ * g++.dg/ext/flexary16.C: New test.
+
2016-05-24 Ilya Verbin <ilya.verbin@intel.com>
* gcc.target/i386/avx-ceil-sfix-2-vec.c: Define __NO_MATH_INLINES before
--- /dev/null
+// PR c++/71147 - [6 Regression] Flexible array member wrongly rejected
+// in template
+// { dg-do compile }
+
+template <typename>
+struct container
+{
+ struct elem {
+ unsigned u;
+ };
+
+ struct incomplete {
+ int x;
+ elem array[];
+ };
+};
+
+unsigned f (container<void>::incomplete* i)
+{
+ return i->array [0].u;
+}
+
+
+template <typename T>
+struct D: container<T>
+{
+ struct S {
+ int x;
+ typename container<T>::elem array[];
+ };
+};
+
+
+unsigned g (D<void>::S *s)
+{
+ return s->array [0].u;
+}
&& TYPE_UNSIGNED (type) == TYPE_UNSIGNED (sizetype));
}
+/* Return true if the argument is a complete type or an array
+ of unknown bound (whose type is incomplete but) whose elements
+ have complete type. */
+static inline bool
+complete_or_array_type_p (const_tree type)
+{
+ return COMPLETE_TYPE_P (type)
+ || (TREE_CODE (type) == ARRAY_TYPE
+ && COMPLETE_TYPE_P (TREE_TYPE (type)));
+}
+
extern tree strip_float_extensions (tree);
extern int really_constant_p (const_tree);
extern bool decl_address_invariant_p (const_tree);