mirror of git://gcc.gnu.org/git/gcc.git
PR c++/71147 - [6 Regression] Flexible array member wrongly rejected in template
gcc/ChangeLog: 2016-05-24 Martin Sebor <msebor@redhat.com> PR c++/71147 * gcc/tree.h (complete_or_array_type_p): New inline function. gcc/testsuite/ChangeLog: 2016-05-24 Martin Sebor <msebor@redhat.com> PR c++/71147 * g++.dg/ext/flexary16.C: New test. gcc/cp/ChangeLog: 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. From-SVN: r236664
This commit is contained in:
parent
8e0dc0549a
commit
f65e97fd3d
|
|
@ -1,3 +1,8 @@
|
||||||
|
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>
|
2016-05-24 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
* config/i386/i386.h (TARGET_AVOID_4BYTE_PREFIXES): Define.
|
* config/i386/i386.h (TARGET_AVOID_4BYTE_PREFIXES): Define.
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,13 @@
|
||||||
|
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>
|
2016-05-24 Paolo Carlini <paolo.carlini@oracle.com>
|
||||||
|
|
||||||
PR c++/69872
|
PR c++/69872
|
||||||
|
|
|
||||||
|
|
@ -5305,10 +5305,7 @@ layout_var_decl (tree decl)
|
||||||
complete_type (type);
|
complete_type (type);
|
||||||
if (!DECL_SIZE (decl)
|
if (!DECL_SIZE (decl)
|
||||||
&& TREE_TYPE (decl) != error_mark_node
|
&& TREE_TYPE (decl) != error_mark_node
|
||||||
&& (COMPLETE_TYPE_P (type)
|
&& complete_or_array_type_p (type))
|
||||||
|| (TREE_CODE (type) == ARRAY_TYPE
|
|
||||||
&& !TYPE_DOMAIN (type)
|
|
||||||
&& COMPLETE_TYPE_P (TREE_TYPE (type)))))
|
|
||||||
layout_decl (decl, 0);
|
layout_decl (decl, 0);
|
||||||
|
|
||||||
if (!DECL_EXTERNAL (decl) && DECL_SIZE (decl) == NULL_TREE)
|
if (!DECL_EXTERNAL (decl) && DECL_SIZE (decl) == NULL_TREE)
|
||||||
|
|
@ -11165,8 +11162,7 @@ grokdeclarator (const cp_declarator *declarator,
|
||||||
}
|
}
|
||||||
else if (!staticp && !dependent_type_p (type)
|
else if (!staticp && !dependent_type_p (type)
|
||||||
&& !COMPLETE_TYPE_P (complete_type (type))
|
&& !COMPLETE_TYPE_P (complete_type (type))
|
||||||
&& (TREE_CODE (type) != ARRAY_TYPE
|
&& (!complete_or_array_type_p (type)
|
||||||
|| !COMPLETE_TYPE_P (TREE_TYPE (type))
|
|
||||||
|| initialized == 0))
|
|| initialized == 0))
|
||||||
{
|
{
|
||||||
if (TREE_CODE (type) != ARRAY_TYPE
|
if (TREE_CODE (type) != ARRAY_TYPE
|
||||||
|
|
|
||||||
17
gcc/cp/pt.c
17
gcc/cp/pt.c
|
|
@ -9555,7 +9555,7 @@ can_complete_type_without_circularity (tree type)
|
||||||
return 0;
|
return 0;
|
||||||
else if (COMPLETE_TYPE_P (type))
|
else if (COMPLETE_TYPE_P (type))
|
||||||
return 1;
|
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));
|
return can_complete_type_without_circularity (TREE_TYPE (type));
|
||||||
else if (CLASS_TYPE_P (type)
|
else if (CLASS_TYPE_P (type)
|
||||||
&& TYPE_BEING_DEFINED (TYPE_MAIN_VARIANT (type)))
|
&& TYPE_BEING_DEFINED (TYPE_MAIN_VARIANT (type)))
|
||||||
|
|
@ -10120,17 +10120,12 @@ instantiate_class_template_1 (tree type)
|
||||||
if (can_complete_type_without_circularity (rtype))
|
if (can_complete_type_without_circularity (rtype))
|
||||||
complete_type (rtype);
|
complete_type (rtype);
|
||||||
|
|
||||||
if (TREE_CODE (r) == FIELD_DECL
|
if (!complete_or_array_type_p (rtype))
|
||||||
&& 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 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);
|
cxx_incomplete_type_error (r, rtype);
|
||||||
TREE_TYPE (r) = error_mark_node;
|
TREE_TYPE (r) = error_mark_node;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -112,7 +112,7 @@ complete_type (tree type)
|
||||||
|
|
||||||
if (type == error_mark_node || COMPLETE_TYPE_P (type))
|
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));
|
tree t = complete_type (TREE_TYPE (type));
|
||||||
unsigned int needs_constructing, has_nontrivial_dtor;
|
unsigned int needs_constructing, has_nontrivial_dtor;
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,8 @@
|
||||||
|
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>
|
2016-05-24 Ilya Verbin <ilya.verbin@intel.com>
|
||||||
|
|
||||||
* gcc.target/i386/avx-ceil-sfix-2-vec.c: Define __NO_MATH_INLINES before
|
* gcc.target/i386/avx-ceil-sfix-2-vec.c: Define __NO_MATH_INLINES before
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
// 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;
|
||||||
|
}
|
||||||
11
gcc/tree.h
11
gcc/tree.h
|
|
@ -4753,6 +4753,17 @@ ptrofftype_p (tree type)
|
||||||
&& TYPE_UNSIGNED (type) == TYPE_UNSIGNED (sizetype));
|
&& 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 tree strip_float_extensions (tree);
|
||||||
extern int really_constant_p (const_tree);
|
extern int really_constant_p (const_tree);
|
||||||
extern bool decl_address_invariant_p (const_tree);
|
extern bool decl_address_invariant_p (const_tree);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue