re PR c++/66270 (ICE: canonical types differ for identical types)

PR c++/66270
	* tree.c (build_pointer_type_for_mode): Canonical type does not
	inherit can_alias_all.
	(build_reference_type_for_mode): Likewise.

	PR c++/66270
	* g++.dg/ext/alias-canon3.C: New.

From-SVN: r223773
This commit is contained in:
Nathan Sidwell 2015-05-27 20:36:14 +00:00 committed by Nathan Sidwell
parent 73b4a60f5c
commit b6cb06b486
4 changed files with 28 additions and 2 deletions

View File

@ -1,3 +1,10 @@
2015-05-27 Nathan Sidwell <nathan@acm.org>
PR c++/66270
* tree.c (build_pointer_type_for_mode): Canonical type does not
inherit can_alias_all.
(build_reference_type_for_mode): Likewise.
2015-05-24 Nathan Sidwell <nathan@acm.org>
PR c++/66243

View File

@ -1,3 +1,8 @@
2015-05-27 Nathan Sidwell <nathan@acm.org>
PR c++/66270
* g++.dg/ext/alias-canon3.C: New.
2015-05-27 Richard Biener <rguenther@suse.de>
PR tree-optimization/66272

View File

@ -0,0 +1,12 @@
// { dg-do compile }
// PR c++/66270
typedef float __m256 __attribute__ (( __vector_size__(32), __may_alias__ ));
struct A {
__m256 ymm;
const float &f() const;
};
const float &A::f() const {
return ymm[1];
}

View File

@ -7719,6 +7719,7 @@ build_pointer_type_for_mode (tree to_type, machine_mode mode,
bool can_alias_all)
{
tree t;
bool could_alias = can_alias_all;
if (to_type == error_mark_node)
return error_mark_node;
@ -7756,7 +7757,7 @@ build_pointer_type_for_mode (tree to_type, machine_mode mode,
if (TYPE_STRUCTURAL_EQUALITY_P (to_type))
SET_TYPE_STRUCTURAL_EQUALITY (t);
else if (TYPE_CANONICAL (to_type) != to_type)
else if (TYPE_CANONICAL (to_type) != to_type || could_alias)
TYPE_CANONICAL (t)
= build_pointer_type_for_mode (TYPE_CANONICAL (to_type),
mode, false);
@ -7786,6 +7787,7 @@ build_reference_type_for_mode (tree to_type, machine_mode mode,
bool can_alias_all)
{
tree t;
bool could_alias = can_alias_all;
if (to_type == error_mark_node)
return error_mark_node;
@ -7823,7 +7825,7 @@ build_reference_type_for_mode (tree to_type, machine_mode mode,
if (TYPE_STRUCTURAL_EQUALITY_P (to_type))
SET_TYPE_STRUCTURAL_EQUALITY (t);
else if (TYPE_CANONICAL (to_type) != to_type)
else if (TYPE_CANONICAL (to_type) != to_type || could_alias)
TYPE_CANONICAL (t)
= build_reference_type_for_mode (TYPE_CANONICAL (to_type),
mode, false);