re PR c++/80534 (7.1 RC - internal compiler error: in finish_member_declaration, at cp/semantics.c:2963)

PR c++/80534
	* tree.c (type_cache_hasher::equal): Only compare
	TYPE_TYPELESS_STORAGE flag on non-aggregate element types.
	(build_array_type_1): Only hash TYPE_TYPELESS_STORAGE flag on
	non-aggregate element types.
	* tree.h (TYPE_TYPELESS_STORAGE): Fix comment typo, add more details
	about the flag on ARRAY_TYPEs in the comment, formatting fix.
c-family/
	* c-common.c (complete_array_type): Only hash TYPE_TYPELESS_STORAGE
	flag on non-aggregate element types.
testsuite/
	* g++.dg/other/pr80534-1.C: New test.
	* g++.dg/other/pr80534-2.C: New test.

From-SVN: r247337
This commit is contained in:
Jakub Jelinek 2017-04-27 15:47:54 +02:00 committed by Jakub Jelinek
parent e469603e97
commit a240da2d3a
8 changed files with 89 additions and 8 deletions

View File

@ -1,5 +1,13 @@
2017-04-27 Jakub Jelinek <jakub@redhat.com>
PR c++/80534
* tree.c (type_cache_hasher::equal): Only compare
TYPE_TYPELESS_STORAGE flag on non-aggregate element types.
(build_array_type_1): Only hash TYPE_TYPELESS_STORAGE flag on
non-aggregate element types.
* tree.h (TYPE_TYPELESS_STORAGE): Fix comment typo, add more details
about the flag on ARRAY_TYPEs in the comment, formatting fix.
PR target/79430
* reg-stack.c (emit_swap_insn): If i1src mentions the stack pointer,
punt if tmp contains autoinc of stack pointer.

View File

@ -1,3 +1,9 @@
2017-04-27 Jakub Jelinek <jakub@redhat.com>
PR c++/80534
* c-common.c (complete_array_type): Only hash TYPE_TYPELESS_STORAGE
flag on non-aggregate element types.
2017-04-20 Jakub Jelinek <jakub@redhat.com>
PR middle-end/80423

View File

@ -6486,7 +6486,8 @@ complete_array_type (tree *ptype, tree initial_value, bool do_default)
inchash::hash hstate;
hstate.add_object (TYPE_HASH (unqual_elt));
hstate.add_object (TYPE_HASH (TYPE_DOMAIN (main_type)));
hstate.add_flag (TYPE_TYPELESS_STORAGE (main_type));
if (!AGGREGATE_TYPE_P (unqual_elt))
hstate.add_flag (TYPE_TYPELESS_STORAGE (main_type));
main_type = type_hash_canon (hstate.end (), main_type);
/* Fix the canonical type. */

View File

@ -1,5 +1,9 @@
2017-04-27 Jakub Jelinek <jakub@redhat.com>
PR c++/80534
* g++.dg/other/pr80534-1.C: New test.
* g++.dg/other/pr80534-2.C: New test.
PR target/77728
* g++.dg/abi/pr77728-2.C: Don't expect -Wpsabi notes.

View File

@ -0,0 +1,21 @@
// PR c++/80534
// { dg-do compile { target c++11 } }
// { dg-options "" }
template <int> struct A {
struct type {
char __data[0];
};
};
template <typename _Tp, typename = _Tp> struct B;
template <typename _Tp, typename _Dp> struct B<_Tp[], _Dp> {
_Tp _M_t;
using pointer = int;
void m_fn1() {}
};
struct C {
using Storage = A<0>::type;
using StorageUniquePointer = B<Storage[]>;
void m_fn2() { storageUniquePointer_.m_fn1(); }
StorageUniquePointer storageUniquePointer_;
};

View File

@ -0,0 +1,27 @@
// PR c++/80534
// { dg-do compile { target c++11 } }
// { dg-options "" }
template <int, int> struct aligned_storage {
struct type {
char __data[0];
};
};
struct A {};
template <typename _Tp, typename = _Tp> struct unique_ptr;
template <typename _Tp, typename _Dp> struct unique_ptr<_Tp[], _Dp> {
int _M_t;
void get() { _M_t; }
};
struct B {
using Association = A;
using Storage = aligned_storage<sizeof(Association), alignof(Association)>::type;
using StorageUniquePointer = unique_ptr<Storage[]>;
void getAssociationsBegin() { storageUniquePointer_.get(); }
StorageUniquePointer storageUniquePointer_;
};
struct C {};
using MainThreadStaticSignalsReceiver = C;
aligned_storage<sizeof(MainThreadStaticSignalsReceiver),
alignof(MainThreadStaticSignalsReceiver)>::type
mainThreadStaticSignalsReceiverStorage;

View File

@ -7073,9 +7073,16 @@ type_cache_hasher::equal (type_hash *a, type_hash *b)
break;
return 0;
case ARRAY_TYPE:
return (TYPE_TYPELESS_STORAGE (a->type)
== TYPE_TYPELESS_STORAGE (b->type)
&& TYPE_DOMAIN (a->type) == TYPE_DOMAIN (b->type));
/* Don't compare TYPE_TYPELESS_STORAGE flag on aggregates,
where the flag should be inherited from the element type
and can change after ARRAY_TYPEs are created; on non-aggregates
compare it and hash it, scalars will never have that flag set
and we need to differentiate between arrays created by different
front-ends or middle-end created arrays. */
return (TYPE_DOMAIN (a->type) == TYPE_DOMAIN (b->type)
&& (AGGREGATE_TYPE_P (TREE_TYPE (a->type))
|| (TYPE_TYPELESS_STORAGE (a->type)
== TYPE_TYPELESS_STORAGE (b->type))));
case RECORD_TYPE:
case UNION_TYPE:
@ -8386,7 +8393,8 @@ build_array_type_1 (tree elt_type, tree index_type, bool typeless_storage,
hstate.add_object (TYPE_HASH (elt_type));
if (index_type)
hstate.add_object (TYPE_HASH (index_type));
hstate.add_flag (typeless_storage);
if (!AGGREGATE_TYPE_P (elt_type))
hstate.add_flag (TYPE_TYPELESS_STORAGE (t));
t = type_hash_canon (hstate.end (), t);
}

View File

@ -2037,10 +2037,16 @@ extern machine_mode element_mode (const_tree t);
/* For an ARRAY_TYPE, a RECORD_TYPE, a UNION_TYPE or a QUAL_UNION_TYPE
whether the array is typeless storage or the type contains a member
with this flag set. Such types are excempt from type-based alias
analysis. */
with this flag set. Such types are exempt from type-based alias
analysis. For ARRAY_TYPEs with AGGREGATE_TYPE_P element types
the flag should be inherited from the element type, can change
when type is finalized and because of that should not be used in
type hashing. For ARRAY_TYPEs with non-AGGREGATE_TYPE_P element types
the flag should not be changed after the array is created and should
be used in type hashing. */
#define TYPE_TYPELESS_STORAGE(NODE) \
(TREE_CHECK4 (NODE, RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE, ARRAY_TYPE)->type_common.typeless_storage)
(TREE_CHECK4 (NODE, RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE, \
ARRAY_TYPE)->type_common.typeless_storage)
/* Indicated that objects of this type should be laid out in as
compact a way as possible. */