re PR c++/51214 ([C++11] name lookup issue with c++11 enums)
gcc/testsuite/ChangeLog 2012-06-07 Fabien Chêne <fabien@gcc.gnu.org> PR c++/51214 * g++.dg/cpp0x/forw_enum11.C: New. gcc/cp/ChangeLog 2012-06-07 Fabien Chêne <fabien@gcc.gnu.org> PR c++/51214 * cp-tree.h (insert_late_enum_def_into_classtype_sorted_fields): Declare. * class.c (insert_into_classtype_sorted_fields): New. (add_enum_fields_to_record_type): New. (count_fields): Adjust the comment. (add_fields_to_record_type): Likewise. (finish_struct_1): Move the code that inserts the fields for the sorted case, into insert_into_classtype_sorted_fields, and call it. (insert_late_enum_def_into_classtype_sorted_fields): Define. * decl.c (finish_enum_value_list): Call insert_late_enum_def_into_classtype_sorted_fields if a late enum definition is encountered. From-SVN: r188294
This commit is contained in:
parent
0d7afaa749
commit
cba0366cac
6 changed files with 113 additions and 14 deletions
|
@ -1,3 +1,20 @@
|
|||
2012-06-07 Fabien Chêne <fabien@gcc.gnu.org>
|
||||
|
||||
PR c++/51214
|
||||
* cp-tree.h (insert_late_enum_def_into_classtype_sorted_fields):
|
||||
Declare.
|
||||
* class.c (insert_into_classtype_sorted_fields): New.
|
||||
(add_enum_fields_to_record_type): New.
|
||||
(count_fields): Adjust the comment.
|
||||
(add_fields_to_record_type): Likewise.
|
||||
(finish_struct_1): Move the code that inserts the fields for the
|
||||
sorted case, into insert_into_classtype_sorted_fields, and call
|
||||
it.
|
||||
(insert_late_enum_def_into_classtype_sorted_fields): Define.
|
||||
* decl.c (finish_enum_value_list): Call
|
||||
insert_late_enum_def_into_classtype_sorted_fields if a late enum
|
||||
definition is encountered.
|
||||
|
||||
2012-06-06 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
PR c++/53567
|
||||
|
|
|
@ -139,6 +139,7 @@ static void build_vtbl_initializer (tree, tree, tree, tree, int *,
|
|||
VEC(constructor_elt,gc) **);
|
||||
static int count_fields (tree);
|
||||
static int add_fields_to_record_type (tree, struct sorted_fields_type*, int);
|
||||
static void insert_into_classtype_sorted_fields (tree, tree, int);
|
||||
static bool check_bitfield_decl (tree);
|
||||
static void check_field_decl (tree, tree, int *, int *, int *);
|
||||
static void check_field_decls (tree, tree *, int *, int *);
|
||||
|
@ -2832,8 +2833,9 @@ add_implicitly_declared_members (tree t,
|
|||
declare_virt_assop_and_dtor (t);
|
||||
}
|
||||
|
||||
/* Subroutine of finish_struct_1. Recursively count the number of fields
|
||||
in TYPE, including anonymous union members. */
|
||||
/* Subroutine of insert_into_classtype_sorted_fields. Recursively
|
||||
count the number of fields in TYPE, including anonymous union
|
||||
members. */
|
||||
|
||||
static int
|
||||
count_fields (tree fields)
|
||||
|
@ -2850,8 +2852,9 @@ count_fields (tree fields)
|
|||
return n_fields;
|
||||
}
|
||||
|
||||
/* Subroutine of finish_struct_1. Recursively add all the fields in the
|
||||
TREE_LIST FIELDS to the SORTED_FIELDS_TYPE elts, starting at offset IDX. */
|
||||
/* Subroutine of insert_into_classtype_sorted_fields. Recursively add
|
||||
all the fields in the TREE_LIST FIELDS to the SORTED_FIELDS_TYPE
|
||||
elts, starting at offset IDX. */
|
||||
|
||||
static int
|
||||
add_fields_to_record_type (tree fields, struct sorted_fields_type *field_vec, int idx)
|
||||
|
@ -2867,6 +2870,20 @@ add_fields_to_record_type (tree fields, struct sorted_fields_type *field_vec, in
|
|||
return idx;
|
||||
}
|
||||
|
||||
/* Add all of the enum values of ENUMTYPE, to the FIELD_VEC elts,
|
||||
starting at offset IDX. */
|
||||
|
||||
static int
|
||||
add_enum_fields_to_record_type (tree enumtype,
|
||||
struct sorted_fields_type *field_vec,
|
||||
int idx)
|
||||
{
|
||||
tree values;
|
||||
for (values = TYPE_VALUES (enumtype); values; values = TREE_CHAIN (values))
|
||||
field_vec->elts[idx++] = TREE_VALUE (values);
|
||||
return idx;
|
||||
}
|
||||
|
||||
/* FIELD is a bit-field. We are finishing the processing for its
|
||||
enclosing type. Issue any appropriate messages and set appropriate
|
||||
flags. Returns false if an error has been diagnosed. */
|
||||
|
@ -5994,7 +6011,6 @@ finish_struct_1 (tree t)
|
|||
tree x;
|
||||
/* A TREE_LIST. The TREE_VALUE of each node is a FUNCTION_DECL. */
|
||||
tree virtuals = NULL_TREE;
|
||||
int n_fields = 0;
|
||||
|
||||
if (COMPLETE_TYPE_P (t))
|
||||
{
|
||||
|
@ -6112,15 +6128,7 @@ finish_struct_1 (tree t)
|
|||
ultimately as the search bores through the inheritance
|
||||
hierarchy), and we want this failure to occur quickly. */
|
||||
|
||||
n_fields = count_fields (TYPE_FIELDS (t));
|
||||
if (n_fields > 7)
|
||||
{
|
||||
struct sorted_fields_type *field_vec = sorted_fields_type_new (n_fields);
|
||||
add_fields_to_record_type (TYPE_FIELDS (t), field_vec, 0);
|
||||
qsort (field_vec->elts, n_fields, sizeof (tree),
|
||||
field_decl_cmp);
|
||||
CLASSTYPE_SORTED_FIELDS (t) = field_vec;
|
||||
}
|
||||
insert_into_classtype_sorted_fields (TYPE_FIELDS (t), t, 8);
|
||||
|
||||
/* Complain if one of the field types requires lower visibility. */
|
||||
constrain_class_visibility (t);
|
||||
|
@ -6193,6 +6201,45 @@ finish_struct_1 (tree t)
|
|||
}
|
||||
}
|
||||
|
||||
/* Insert FIELDS into T for the sorted case if the FIELDS count is
|
||||
equal to THRESHOLD or greater than THRESHOLD. */
|
||||
|
||||
static void
|
||||
insert_into_classtype_sorted_fields (tree fields, tree t, int threshold)
|
||||
{
|
||||
int n_fields = count_fields (fields);
|
||||
if (n_fields >= threshold)
|
||||
{
|
||||
struct sorted_fields_type *field_vec = sorted_fields_type_new (n_fields);
|
||||
add_fields_to_record_type (fields, field_vec, 0);
|
||||
qsort (field_vec->elts, n_fields, sizeof (tree), field_decl_cmp);
|
||||
CLASSTYPE_SORTED_FIELDS (t) = field_vec;
|
||||
}
|
||||
}
|
||||
|
||||
/* Insert lately defined enum ENUMTYPE into T for the sorted case. */
|
||||
|
||||
void
|
||||
insert_late_enum_def_into_classtype_sorted_fields (tree enumtype, tree t)
|
||||
{
|
||||
struct sorted_fields_type *sorted_fields = CLASSTYPE_SORTED_FIELDS (t);
|
||||
if (sorted_fields)
|
||||
{
|
||||
int i;
|
||||
int n_fields
|
||||
= list_length (TYPE_VALUES (enumtype)) + sorted_fields->len;
|
||||
struct sorted_fields_type *field_vec = sorted_fields_type_new (n_fields);
|
||||
|
||||
for (i = 0; i < sorted_fields->len; ++i)
|
||||
field_vec->elts[i] = sorted_fields->elts[i];
|
||||
|
||||
add_enum_fields_to_record_type (enumtype, field_vec,
|
||||
sorted_fields->len);
|
||||
qsort (field_vec->elts, n_fields, sizeof (tree), field_decl_cmp);
|
||||
CLASSTYPE_SORTED_FIELDS (t) = field_vec;
|
||||
}
|
||||
}
|
||||
|
||||
/* When T was built up, the member declarations were added in reverse
|
||||
order. Rearrange them to declaration order. */
|
||||
|
||||
|
|
|
@ -4998,6 +4998,7 @@ extern tree* decl_cloned_function_p (const_tree, bool);
|
|||
extern void clone_function_decl (tree, int);
|
||||
extern void adjust_clone_args (tree);
|
||||
extern void deduce_noexcept_on_destructor (tree);
|
||||
extern void insert_late_enum_def_into_classtype_sorted_fields (tree, tree);
|
||||
|
||||
/* in cvt.c */
|
||||
extern tree convert_to_reference (tree, tree, int, int, tree,
|
||||
|
|
|
@ -12384,6 +12384,12 @@ finish_enum_value_list (tree enumtype)
|
|||
for (t = TYPE_MAIN_VARIANT (enumtype); t; t = TYPE_NEXT_VARIANT (t))
|
||||
TYPE_VALUES (t) = TYPE_VALUES (enumtype);
|
||||
|
||||
if (current_class_type
|
||||
&& COMPLETE_TYPE_P (current_class_type)
|
||||
&& UNSCOPED_ENUM_P (enumtype))
|
||||
insert_late_enum_def_into_classtype_sorted_fields (enumtype,
|
||||
current_class_type);
|
||||
|
||||
/* Finish debugging output for this type. */
|
||||
rest_of_type_compilation (enumtype, namespace_bindings_p ());
|
||||
}
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2012-06-07 Fabien Chêne <fabien@gcc.gnu.org>
|
||||
|
||||
PR c++/51214
|
||||
* g++.dg/cpp0x/forw_enum11.C: New.
|
||||
|
||||
2012-06-06 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
PR c++/53567
|
||||
|
|
23
gcc/testsuite/g++.dg/cpp0x/forw_enum11.C
Normal file
23
gcc/testsuite/g++.dg/cpp0x/forw_enum11.C
Normal file
|
@ -0,0 +1,23 @@
|
|||
// { dg-do compile { target c++11 } }
|
||||
|
||||
enum { A = 1 };
|
||||
struct T
|
||||
{
|
||||
int i1, i2, i3, i4, i5, i6, i7;
|
||||
enum E2 : int;
|
||||
|
||||
void f();
|
||||
};
|
||||
|
||||
enum T::E2 : int { A1 = A, A2 = 23 };
|
||||
|
||||
static_assert(int(T::A1) == 1, "error");
|
||||
static_assert(int(T::A2) == 23, "error");
|
||||
|
||||
void T::f()
|
||||
{
|
||||
static_assert(int(T::A1) == 1, "error");
|
||||
static_assert(int(T::A2) == 23, "error");
|
||||
static_assert(int(A1) == 1, "error");
|
||||
static_assert(int(A2) == 23, "error");
|
||||
}
|
Loading…
Add table
Reference in a new issue