mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-27 13:54:19 +08:00
re PR c++/34935 (ICE with attribute may_alias)
2008-01-31 Douglas Gregor <doug.gregor@gmail.com> Jakub Jelinek <jakub@redhat.com> PR c++/34935 PR c++/34936 * typeck.c (structural_comptypes): Handle comparisons of VOID_TYPE, BOOLEAN_TYPE, INTEGER_TYPE, FIXED_POINT_TYPE, and REAL_TYPE nodes. * mangle.c (write_builtin_type): Map down to the canonical type, which will be one of the predefined type nodes. 2008-01-31 Douglas Gregor <doug.gregor@gmail.com> Jakub Jelinek <jakub@redhat.com> PR c++/34935 PR c++/34936 * g++.dg/ext/alias-canon.C: New. * g++.dg/ext/alias-mangle.C: New. Co-Authored-By: Jakub Jelinek <jakub@redhat.com> From-SVN: r131984
This commit is contained in:
parent
5ca3d30cfb
commit
0451301c59
@ -1,3 +1,14 @@
|
||||
2008-01-31 Douglas Gregor <doug.gregor@gmail.com>
|
||||
Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/34935
|
||||
PR c++/34936
|
||||
* typeck.c (structural_comptypes): Handle comparisons of
|
||||
VOID_TYPE, BOOLEAN_TYPE, INTEGER_TYPE, FIXED_POINT_TYPE, and
|
||||
REAL_TYPE nodes.
|
||||
* mangle.c (write_builtin_type): Map down to the canonical type,
|
||||
which will be one of the predefined type nodes.
|
||||
|
||||
2008-01-29 Michael Meissner <michael.meissner@amd.com>
|
||||
|
||||
PR 35004
|
||||
|
@ -1768,6 +1768,9 @@ write_CV_qualifiers_for_type (const tree type)
|
||||
static void
|
||||
write_builtin_type (tree type)
|
||||
{
|
||||
if (TYPE_CANONICAL (type))
|
||||
type = TYPE_CANONICAL (type);
|
||||
|
||||
switch (TREE_CODE (type))
|
||||
{
|
||||
case VOID_TYPE:
|
||||
|
@ -977,6 +977,30 @@ structural_comptypes (tree t1, tree t2, int strict)
|
||||
/* Compare the types. Break out if they could be the same. */
|
||||
switch (TREE_CODE (t1))
|
||||
{
|
||||
case VOID_TYPE:
|
||||
case BOOLEAN_TYPE:
|
||||
/* All void and bool types are the same. */
|
||||
break;
|
||||
|
||||
case INTEGER_TYPE:
|
||||
case FIXED_POINT_TYPE:
|
||||
case REAL_TYPE:
|
||||
/* With these nodes, we can't determine type equivalence by
|
||||
looking at what is stored in the nodes themselves, because
|
||||
two nodes might have different TYPE_MAIN_VARIANTs but still
|
||||
represent the same type. For example, wchar_t and int could
|
||||
have the same properties (TYPE_PRECISION, TYPE_MIN_VALUE,
|
||||
TYPE_MAX_VALUE, etc.), but have different TYPE_MAIN_VARIANTs
|
||||
and are distinct types. On the other hand, int and the
|
||||
following typedef
|
||||
|
||||
typedef int INT __attribute((may_alias));
|
||||
|
||||
have identical properties, different TYPE_MAIN_VARIANTs, but
|
||||
represent the same type. The canonical type system keeps
|
||||
track of equivalence in this case, so we fall back on it. */
|
||||
return TYPE_CANONICAL (t1) == TYPE_CANONICAL (t2);
|
||||
|
||||
case TEMPLATE_TEMPLATE_PARM:
|
||||
case BOUND_TEMPLATE_TEMPLATE_PARM:
|
||||
if (TEMPLATE_TYPE_IDX (t1) != TEMPLATE_TYPE_IDX (t2)
|
||||
|
@ -1,3 +1,11 @@
|
||||
2008-01-31 Douglas Gregor <doug.gregor@gmail.com>
|
||||
Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/34935
|
||||
PR c++/34936
|
||||
* g++.dg/ext/alias-canon.C: New.
|
||||
* g++.dg/ext/alias-mangle.C: New.
|
||||
|
||||
2008-01-30 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
* gcc.c-torture/execute/pr34982.c: Add forgotten return 0.
|
||||
|
41
gcc/testsuite/g++.dg/ext/alias-canon.C
Normal file
41
gcc/testsuite/g++.dg/ext/alias-canon.C
Normal file
@ -0,0 +1,41 @@
|
||||
// PR c++/34935
|
||||
/* { dg-do compile } */
|
||||
/* { dg-final { scan-assembler "_Z1fi" } } */
|
||||
/* { dg-final { scan-assembler "_Z1fb" } } */
|
||||
/* { dg-final { scan-assembler "_Z1fd" } } */
|
||||
/* { dg-final { scan-assembler "_Z1ff" } } */
|
||||
/* { dg-final { scan-assembler "_Z1fw" } } */
|
||||
|
||||
typedef int INT __attribute((may_alias));
|
||||
|
||||
void f(int);
|
||||
void f(INT) { }
|
||||
|
||||
typedef bool BOOL __attribute((may_alias));
|
||||
|
||||
void f(bool);
|
||||
void f(BOOL) { }
|
||||
|
||||
typedef float FLOAT __attribute((may_alias));
|
||||
|
||||
void f(float);
|
||||
void f(FLOAT) { }
|
||||
|
||||
typedef double DOUBLE __attribute((may_alias));
|
||||
|
||||
void f(double);
|
||||
void f(DOUBLE) {}
|
||||
|
||||
typedef wchar_t WCHAR_T __attribute((may_alias));
|
||||
|
||||
void f(wchar_t);
|
||||
void f(WCHAR_T) {}
|
||||
|
||||
void test()
|
||||
{
|
||||
f(0);
|
||||
f(true);
|
||||
f(1.0f);
|
||||
f(1.0);
|
||||
f(L'f');
|
||||
}
|
11
gcc/testsuite/g++.dg/ext/alias-mangle.C
Normal file
11
gcc/testsuite/g++.dg/ext/alias-mangle.C
Normal file
@ -0,0 +1,11 @@
|
||||
// PR c++/34936
|
||||
// { dg-do compile }
|
||||
/* { dg-final { scan-assembler "_ZN1AIdEC1Ev" } } */
|
||||
typedef double X __attribute((may_alias)) ;
|
||||
|
||||
template<typename> struct A
|
||||
{
|
||||
A();
|
||||
};
|
||||
|
||||
A<X> a;
|
Loading…
Reference in New Issue
Block a user